精华内容
下载资源
问答
  • 因为我不是用自己电脑开发,所以每次都会被还原。所以每次都得重新配置好。 但是如果是用自己电脑开发或者你用的电脑不会被还原掉,只要第一次配置好就够了,以后直接对源代码修改好,到浏览器里就可以了。 步骤...

    因为我不是用自己电脑开发,所以每次都会被还原。所以每次都得重新配置好。

    但是如果是用自己电脑开发或者你用的电脑不会被还原掉,只要第一次配置好就够了,以后直接对源代码修改好,到浏览器里就可以了。

    步骤如下

    本机登录phpmyadmin,需要在Appserv/www/phpmyadmin目录下找到config.ini.php文件将密码修改为123.

    成功后进入phpmyadmin,先建立一个phpshe数据库,

    再新建用户phpshe

    完成后,新建phpshe文件夹,将phpshe压缩包解压至Appserv/www/phpshe下。

    然后在到浏览器中输入localhost:8081/phpshe/install进入到安装页面,点击同意协议并点击下一步

    然后点击管理后台,帐号admin,密码admin进入管理后台。

    访问路径及其意思

    上图对应的是放置在appserv下www文件夹内的os系统中的Game模块下MatchControl控制器中的match方法,并且传递了一个值为1的参数userId给match方法

    对应的文件夹目录和方法内容如下:

    注意大小写,特别是想控制器Controller这一类强制的大小写。

     

    展开全文
  • 宋宝华- KVM最初的2小时(KVM从入门到入不了门)

    万次阅读 多人点赞 2017-02-23 04:39:44
    接着《Docker最初的2小时(Docker从入门到入门)》继续聊,再花10个小时写出《KVM最初的2小时(KVM从入门到入不了门)》。坦白讲,由于KVM远远比Docker要复杂,还是要2小时爱上KVM,这绝非难事,所以很可能入不了门...

    接着《Docker最初的2小时(Docker从入门到入门)》继续聊,再花10个小时写出《KVM最初的2小时(KVM从入门到入不了门)》。坦白讲,由于KVM远远比Docker要复杂,还是要2小时爱上KVM,这绝非难事,所以很可能入不了门。原则上,我们继续迭代学习,这篇文章建立你对KVM的最好初印象,但是绝不深入细节。


    虚拟化的诉求和历史的痛苦

    那些不能铭记过去的人注定要重蹈覆辙。你还记得当年用Windows隐藏文件夹藏片吗?
    作为一个屌丝,虚拟化技术确实意义非常重大。这个最显著的作用显然就是藏片,作为一个程序员,如果还用Windows文件隐藏功能来藏片,这实在是污辱自己和女朋友的智商,让广大码农抬不起头来做人。最早可以帮你实质藏片的手段来自VMware。
    VMware这个名字就是一种牛逼,VM就是virtual machine,ware是取自Software中的ware,1999年VMware发布了它的第一款产品VMware Workstation,在那个赛扬333和白衣飘飘的时代。

    这里写图片描述

    上面一幅图看起来比较嗨皮,但是技术含量确实不低。你想在一个电脑上面,虚拟出来一个“假”电脑,但是一定要“假”到什么程序呢?就是苍老师在跑的时候,她意识不到这是个“假”电脑。造假从来都不是那么容易的事情。会面临来自CPU、内存、I/O的全方位障碍。

    先说CPU方面,为了避免应用弄死整个系统,除了一些裸奔的RTOS(实时操作系统)以外,现代操作系统一般借助CPU的不同模式来将操作系统内运行的软件切割为用户态和内核态。用户态只能执行常规的CPU指令如运算,但凡涉及到访问特定的硬件,如MMU、I/O等,用户态的应用就需要陷入内核态,调用内核的系统服务来完成。

    比如下面最简单一段程序:

    int main(int argc, char **argv)
    {
    int i;

    for(i=0;i<10000;i++);
    write(1, “hello\n”, 6);
    for(i=0;i<10000;i++);

    return 0;
    }

    其中for(i=0;i<10000;i++);这样的语句是在用户态执行的,而write(1, “hello\n”, 6);则通过系统调用陷入到内核态。
    这个陷入,不仅是软件的一种变化,也是硬件模式的一种跨越。X86的处理器模式也从ring3非特权模式切换到了ring0特权模式了。非特权这样的模式,可以保证用户空间想干坏事也干不了,干了坏事就现场被抓。

    ring

    那么问题就来了,没有虚拟机guest的情况下,ring0只有主机操作系统一个人玩,这个是丝毫没有什么问题的。有多个guest OS的情况下,guest OS的内核也想在ring0玩(至少它要觉得自己在ring0玩),但是事实上是它不能占据ring0,否则就变成了宋哲,控制了不该控制的资源。这个时候,我们必须给guest OS做“特权解除”,比如把guest OS的kernel放入权限更低的ring1。但是,我们必须给它模拟出还是在ring3和ring0跑的样子,因为OS原本是这样理解的,全虚拟化的本质让它感知不到被虚拟化了,就是追求这个等价性。既然苍老师喜欢看到guest OS的内核在ring0建设社会主义的样子,我们就要把苍老师给蒙骗过去。

    模拟出还是ring0和3的样子,这个事情还真的是不简单。现在guest OS用户态和内核态分别运行在CPU的ring3和ring1,然后苍老师在的Windows的内核想读CPU的一个寄存器知道CPU现在在什么状态,假设这个指令叫做ABC,由于现在虽然苍老师Windows在内核态,但是CPU实际处于ring1,所以她读到的是ring1,这显然不符合应有的期待,虚拟化后苍老师应该读到ring0才对!

    ABC这样的指令关乎到系统全局资源的状态读取或者设置,我们一般称呼这样的指令为敏感指令(Sensitive instruction)。假设ABC这条敏感指令同时也是一条特权指令(Privilege instruction,在非特权模式执行的时候会引发硬件陷入特权模式的ring0),那么苍老师读CPU的状态的时候,陷入ring0,我们在ring0的VMM(virtual machine monitor)代码里面伪造一个ring0值给苍老师就万事大吉了,这就是典型的“陷入-模拟”。只要能陷入,咱们就能模拟,就能制造幻觉。

    如果所有的敏感指令都是特权指令,我们显然是可以完美通过这种“陷入-模拟”的方法来实现虚拟化的。实际上,大部分敏感指令确实是特权指令。但是,无论是早期的X86,还是ARM,都有些敏感指令不是可以陷入的特权指令,我们称呼它们为临界指令(critical instruction)。不陷入就无法模拟,又关乎系统资源的读取和设置,系统资源就像全局变量,主机看虚拟机也看,这个虚拟机看,那个虚拟机也看,你看我也看,那么显然是无法实现逻辑上的隔离了。我们显然需要把跨机器的全局变量变成虚拟机内的模块级变量才靠谱。

    指令

    早期为了解决上述问题,人们一般采用2种办法:

    • 半虚拟化(para-virtualization)

    直接在guest OS里面把无法虚拟化的部分代码改掉,把ABC指令替换成一个陷入ring0的系统调用,既然你不陷入,哥就强行拉你下水。这显然就不是全部的虚拟化了,这种叫做半虚拟化(para-virtualization)。

    • 二进制翻译( binary translation )

    不改代码,比如看到ABC这样的指令,提前插入断点来截获之,交由 VMM 解释执行,我们就把它强行翻译为别的东西。其实这个也有那么一点类似半虚拟化,你可以认为半虚拟化的改代码在编译前,而二进制翻译的改代码在运行时。

    通常我们认为运行时候改,会比编译前改,逼格要高那么一点点。

    由于半虚拟化需要系统内核的深度修改,在生产环境中,半虚拟化在技术支持和维护上会有很大的问题,早期的Xen就是用的这种方法。而早期的VMware用的手段则是进行二进制翻译( binary translation ),把这些指令翻译执行,不让它的实际指令执行。翻译的意思,就是类似明明我干的就是ABC,它替换为xxxx,yyyy,zzzz,然后欺骗苍老师现在是ring0:

    BT

    这是虚拟化的诉求,也是历史的痛苦。当然现在已经不是苍老师的时代了,遥想公谨当年,苍天有井独自空,星落天川遥映瞳。小溪流泉映花彩,松江孤岛一叶枫。哎,时代的车轮滚滚向前,碾压着每一个屌丝。房子永远越来越贵,家庭成本越来越高,码农越来越老,外企个个在跑,每每念及此处,心里孤单又寂寞。

    现在无论是X86还是ARM,都通过修改CPU架构,解决了上述问题。Intel Virtualization Technology (VT-x) 和AMD’s AMD-V这样的硬件虚拟化技术,在CPU引入一个新的模式VMX Root Mode。

    root non-root

    Guest OS运行于non-root下的ring0(只不过这个时候由于没有root,也改不了系统的资源),Guest OS上面的应用运行于non-root模式下的ring3,而host OS的内核和VMM则运行于root模式下的ring0。Guest OS下面的敏感指令,会陷入到root模式下的ring0内的VMM,进行“陷入模拟”。 运行环境之间相互转化,也得到了比较高端的名字,从root环境到non-root环境叫VMEntry(进虚拟机了);碰到敏感指令后,从non-root到root环境叫VMExit(从虚拟机出来了)。

    root

    除了CPU以外,内存也是一个大问题,主机OS在跑的时候,它通过CPU的MMU完成虚拟地址到物理地址的转化。对于主机而言,它看到的物理内存是整个内存条。但是对于主机上面运行的虚拟机里面的guest OS而言,它显然不能直接看到物理的内存条。因为虚拟化的核心是把物理的东西逻辑化。所以苍老师看到的物理地址,在她的眼里依然是连续的,但是它显然不能是内存条最终真正的物理地址。现代CPU一般通过提供第2级转换来完成,一级是guest OS里面虚拟地址(VA)到guest OS的物理地址(PA),另外一级是guest OS里面的物理地址到真实内存条的地址(MA)。第2级的PA->MA的转化由VMM来维护。对guest OS里面运行的app而言,VA是连续的,实际上PA是非连续;对于guest OS里面运行的kernel而言,PA是连续的,实际上MA是非连续的。总之,不在乎是否真的连续,只在乎你觉得是连续的就行!前面我已经反复强调,虚拟化本质上是一种幻觉。在没有内存虚拟化支持的时代,VMM一般是通过给guest OS的进程再维护一个guest OS虚拟地址到最终机器物理地址的影子页表来完成地址转换的。

    2-stage page

    CPU、内存以外,接下来的大问题就是I/O外设的一系列模拟。大家玩过VMware、Virtualbox的话,都知道我们可以在guest OS里面加假硬盘、假光驱、假网卡。

    hardware

    这些假的东西怎么造呢?需要进行硬件的行为模拟。比如虚拟机guest OS里面有一个网卡X,它有如下寄存器序列来发包:

    write(reg1, 0xFF)
    write(reg2, 0xF0)
    write(reg3, 0x1)

    为了模拟这个网卡,我们也需要捕获上述的IO操作并进行模拟,由于所有的IO操作都会引发异常,最终陷入VMM,而VMM可以借由host OS之上运行的一个应用进行行为级模拟并最终调用Host OS的系统调用来完成最后的操作。在VMware workstation中,这一步骤就由VMdriver、VMM和VMApp来协同完成。

    vmware

    一个典型的guest里面的网络发包流程如下,显然VMM上下文给了VMDriver,之后VMApp获得I/O请求,VMApp弄清楚情况后,最终通过syscall调主机的服务把包通过主机的网卡发出去:

    vmnet

    相似的,KVM 在 IO 虚拟化方面,就是使用 QEMU 这个应用软件的方式来模拟 IO 设备。

    KVM是个什么鬼?

    KVM(Kernel-based Virtual Machine)最初是由一个以色列的创业公司Qumranet开发的,KVM的开发人员并没有选择从底层开始新写一个Hypervisor,而是选择了基于Linux kernel,通过加载新的模块从而使Linux Kernel本身变成一个Hypervisor。从Linux kernel 2.6.20开始就包含在Linux内核代码之中,可以重用Linux kernel的生态链和现有基础设施。
    KVM运行于带硬件虚拟化支持的处理器,所以我们假定硬件里面的CPU虚拟化扩展、内存虚拟化扩展等都是存在的。
    KVM架构中涉及到3个重要组件:

    • Guest:客户机系统,运行在虚拟的CPU(vCPU)、内存、虚拟的IO设备(Console、网卡、I/O 设备驱动等)。
    • KVM:运行在Linux内核空间,成为内核模块,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被KVM 拦截后,交给 QEMU 处理。KVM驱动给用户空间的QEMU提供了/dev/kvm字符设备。
    • QEMU:修改过的为 KVM虚拟机使用的 QEMU 代码(称为qemu-kvm),运行在用户空间,除了提供硬件 I/O 设备的模拟,还通过对/dev/kvm设备执行IOCTL来和 KVM 交互执行创建虚拟机、vCPU等对guest的控制操作。

    如果要把VMware Workstation与KVM进行一个对比的话,VMdriver、VMM有点类似KVM内核模块,而VMApp有点类似QEMU。

    kvm

    QEMU通过ioctl发出KVM_CREATE_VM、KVM_CREATE_VCPU等这种虚拟机、vCPU的创建指令,让guest投入运行。之后QEMU执行KVM_RUN这样的IOCTL,如果这个IOCTL返回,意味着VMexit。qemu根据返回的情况,确定是否是guest OS发生IO的动作,如果是,则进行IO模拟以及执行主机的系统调用来完成IO动作,伪代码类似:

    open("/dev/kvm")
    ioctl(KVM_CREATE_VM)
    ioctl(KVM_CREATE_VCPU)

    for (;? {
    exit _reason = ioctl(KVM_RUN)
    switch (exit_reason) {
    case KVM_EXIT_IO: /* … /
    case KVM_EXIT_HLT: /
    … */
    }
    }

    kvm io

    Guest OS对设备寄存器的读写的地址、size和数据都可以传递给QEMU里面的设备驱动,QEMU再进行行为级模拟即可,比如Guest OS想读addr位置的一个寄存器:

    static int xche_ioport_read(struct kvm_io_device *this, gpa_t addr, int len, void *data)
    {
    /根据不同的地址执行不同的操作/
    switch (addr) {
    case:
    break;

    }
    /*将数据拷贝到读取的数据地址/
    memcpy(data, (char *)&ret, len);
    return 0;
    }

    第一次的运行

    我们把KVM以及一些相关的管理工具都安装了:
    sudo apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils virt-manager
    然后跑一个最小的Linux- Tinycore。从http://tinycorelinux.net/downloads.html下载这个最小Linux,或者直接在Ubuntu中
    wget http://tinycorelinux.net/7.x/x86/release/TinyCore-current.iso
    运行之:
    qemu-system-x86_64 -smp 2 --enable-kvm --cdrom /mnt/hgfs/Downloads/TinyCore-current.iso
    这样我们会发现Tinycore Linux跑起来了:

    tinycore

    在模拟的qemu窗口中按下ctrl+alt 2,运行info kvm,发现KVM已经启动:

    info kvm

    这个时候我们会在host OS里面看到一个qemu的进程:

    baohua@ubuntu:~$ ps -ef | grep qemu
    baohua 101655 42512 14 10:34 pts/3 00:00:05 qemu-system-x86_64 -smp 2 --enable-kvm --cdrom /mnt/hgfs/Downloads/TinyCore-current.iso

    由此可见,每个虚拟机在主机里面就是一个普通的Linux进程。

    工具和易用性的解决

    用qemu-system-x86_64 -smp 2 --enable-kvm --cdrom /mnt/hgfs/Downloads/TinyCore-current.iso这样的原始命令来运行KVM毕竟有些naive,我们需要一套强大的工具来方便KVM的部署。

    这个时候,我们就不得不提libvirt,libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库。其旨在为包括Xen、KVM、Virtualbox、VMware等在内的各种虚拟化工具提供一套方便、可靠的编程接口。所以libvirt可以认为是管理工具和具体虚拟机之间的一个纽带。

    Libvirtd是一个daemon进程,virsh、virt-manager等工具呼叫libvirtd,而Libvirtd则调用qemu-kvm操作虚拟机。

    libvirt

    前面的Tinycore Linux,我们同样可以在virt-manager里面进行创建、启动和停止。一路如下:

    这里写图片描述

    这里写图片描述

    这里写图片描述

    创建好后,启动Tinycore:

    这里写图片描述

    我们用virsh工具来观察一下这个虚拟机:

    baohua@ubuntu:~$ virsh list --all
    Id Name State
    3 linux running

    我们现在强行用”virsh destroy linux”这个命令销毁这个虚拟机:

    这里写图片描述

    用virsh start再次启动它:

    这里写图片描述


    少年不管,流光如箭,因循不觉韶光换。至如今,始惜月满、花满、酒满。扁舟欲解垂杨岸,尚同欢宴。日斜歌阕将分散。倚兰桡,望水远、天远、人远。

    想念那个《仙剑奇侠传98柔情》的时代,虚拟化启蒙的年代。
    更多精华文章请扫描下方二维码关注Linux阅码场

    在这里插入图片描述

    展开全文
  • 挖矿节点计算机在挖矿时要两个任务: 第一个任务是把比特币网络中未确认的交易按梅克尔树组装成候选区块,未被纳入的交易则往下顺延。 在创建候选区块时,除了普通的交易之外,矿工在其中增加一个特殊的交易:币基...

    挖矿节点计算机在挖矿时要做两个任务:

    第一个任务是把比特币网络中未确认的交易按梅克尔树组装成候选区块,未被纳入的交易则往下顺延。
    在创建候选区块时,除了普通的交易之外,矿工在其中增加一个特殊的交易:币基交易(coinbase transaction)。如果挖矿成功,则币基交易会凭空转出新区块的奖励比特币到矿工的钱包地址中,从而发行这些比特币出来。这个特殊交易也被叫作“创币交易”,新的比特币是在这一交易中被创造出来的。

    挖矿节点计算机的第二个任务是真正的挖矿,即进行加密哈希计算,解决一个计算难题,进行算力竞争。在众多争夺记账权的节点中,谁最先完成这个计算,它打包的区块就被加到了区块链的最后,成为最新的区块。率先完成计算的矿工会赢得新区块的挖矿奖励。最初,成功挖出一个区块,矿工可以获得 50 个比特币的奖励,按规则,这个挖矿奖励每四年减半一次,分别为 25 个、12.5 个,以此类推。

    我们再讨论两个问题,以深入了解比特币的工作量证明共识机制与它的挖矿机制。

    第一,先向内看,比特币矿工挖矿是在做什么?
    在候选区块的头部有一个 32 位的随机数区域,矿工需要反复调整随机数并计算,目标是让整个区块的哈希值小于一个“目标值”。如果试过所有的 32 位随机数可能性后,计算仍未能成功,那么就要改变币基(coinbase)的一个随机数,接着进行反复计算。

    这个计算是加密哈希计算(对比特币来说是 SHA-256),除了反复计算别无他法。这个计算量非常大,比如在 2015 年年底,在大约 2 的 68 次方个随机数中,只有一个可以成功,这个数字比全球总人口的平方还要大。

    有意思的是,这种挖矿计算是非对称的,你挖矿需要经过 2 的 68 次方个哈希计算,而我要验证你的确找到有效的随机数,只需要一次就可以。

    第一个完成这个计算难题的节点所打包的区块就成为有效区块,它向全网广播告知自己已经完成,由其他节点确认后(即有别的挖矿节点在这个区块的基础上进行下一个区块的挖矿,生成新的区块)。在等待 6 个区块后,该挖矿节点就可以获得这次比特币奖励。

    比特币的去中心网络能够长期运行下来,现在有 1 万多个全节点,正是因为有这样的挖矿奖励机制。出于对自己的利益考虑的矿工运维着这个不属于任何人、完全去中心化的网络。

    第二,再向外看,比特币的挖矿机制在加入挖矿的计算机的算力不断增加的情况下,这个挖矿机制是如何保持稳定的?
    比特币挖矿的芯片已经经过几轮演变,其计算能力越来越强:从 CPU 演变到 GPU(显卡),再到现场可编程门阵列(FPGA),再到现在的专用集成电路技术(ASIC),即只能进行比特币挖矿所需的哈希计算的专用芯片中。并且随着矿机的升级迭代和数量增多,接入比特币区块链网络、参与挖矿竞争的计算算力越来越大。

    相应地,比特币系统有这样一个对应的机制设计:随着算力的增长,调整目标值的难度使得挖出一个区块的时间始终是 10 分钟左右。

    这形成了一种动态的平衡,维持区块链网络经济激励的有效与稳定。这个决定难度的公式非常简单明了,每挖出 2016 个区块,也就是经过约两个星期,挖矿难度会进行一次调整,该公式是:

    下一个难度 = 上一个难度 × 2016 × 10分钟 / 产生2016个区块所需的时间

    如果算力突然大幅度上升,产生上一组 2016 个区块所需的时间变短,那么难度就会上升。在某些特殊情况下,如果产生上一组 2016 个区块所需的时间变长,那么难度也会下降,但这样的情况并不多见。

    因此,比特币矿工节点的挖矿是它在运行分布式账本与去中心网络。同样重要的是,它也是比特币的发行机制和整个社区的激励机制。

    比特币的挖矿是比特币的唯一发行机制,从中本聪挖出第一个区块获得 50 枚比特币开始,比特币这个加密数字货币就以这样的去中心化方式不断地发行了出来。

    比特币区块链网络是由众多节点组成的去中心网络,而这些计算机节点加入这个网络,维护分布式账本,是因为中本聪在设计系统时巧妙地加入了经济激励:众多比特币矿工(即挖矿节点)在竞争获得记账的权利,矿工每增加一个新的区块能获得对应的记账奖励。

    比特币的经济系统是以“竞争-记账-奖励”循环为核心的(见图1),其中“竞争”非常重要,即挖矿节点进行的算力竞争。在比特币系统这样一个去中心网络中,节点参与是出于获得经济奖励的自利动机,而记账权利和对应的奖励需要通过竞争来获得。

    在区块链的相关探讨中,有把“挖矿”一词的含义扩大的倾向,在这里我们认为,只有生成区块的计算行为,即运维分布式账本与去中心网络的行为,才是真正意义上的挖矿。简单地说,只有生产区块,才是挖矿。即便放宽要求,不再强求只有计算机节点生产区块才是挖矿,我们也仍想强调,竞争获得对应的权利和奖励,仍是必须的。没有竞争的奖励,是很难真实有效的。

    在这里插入图片描述

    图1:比特币的“竞争-记账-奖励”循环

    通过讨论比特币区块链的五个技术性细节,我们再一次看到,比特币系统在发行和交易层面都实现了完全的去中心化:

    一个交易的确认,被写入分布式账本记录下来,是由去中心网络中互不信任的节点为了自己的利益相互以算力进行竞争而确认的。
    在竞争挖矿的过程中,比特币的发行是“凭空发行货币”,它的货币发行也是靠这个去中心网络的算力竞争来完成的,是去中心化的。

    比特币作为区块链 1.0 的典型,完成了价值表示和价值转移的概念验证(见图2)。

    比特币区块链是非常精妙的设计,它无须任何人的居中协调与领导就能持续发展。比特币可能是迄今为止最成功的加密数字货币,比特币区块链在加密数字货币的应用上堪称完美。

    比特币区块链即“区块链1.0”是专为去中心化的电子现金设计的,而要在各个领域中广泛应用,我们需要有更通用、性能更好的区块链系统。

    在这里插入图片描述

    在比特币系统之后出现了常被认为是“区块链 2.0”代表的以太坊。现在,更多项目在竞争成为“区块链 3.0”。

    展开全文
  • 做自己的系统分析师

    千次阅读 热门讨论 2006-06-14 14:07:00
    由于自己没有受到过真正的计算机方面的理论教育,所以最初,在进行软件开发的时候心里面特别没有底,在写代码的时候,我都特别小心,生怕写出来的程序在结构上不合理,执行效率低下。工作了一段时间,开始自己设计...

            这几天我在看软考的《系统分析师教程》,六百多页的书看了两百多页,现在感觉心里很复杂。再加上前几天和以前几个要好同事聚会,谈到软件系统的设计时有些争论,让我不得不写些什么。希望此文能以此文同中国从事软件开发的同行共勉。

    前言

    说来很不巧,我毕业于四川外语学院,没有受到过大学里面正规计算机课程的教育,在软件设计上的所有技能,基本上都是学习人家的代码,和看微软网站上的那些TechNotes。当时之所以选择英语院校,希望读懂人家的技术文档,是其中的一个原因。毕竟从现在很流行的Windows到Unix,他们的技术文档大都是英文写的。扯远了,其实开发一个好的系统,看懂有价值的技术资料是一个因素,更重要的因素在于对系统的分析和设计。

    由于自己没有受到过真正的计算机方面的理论教育,所以最初,在进行软件开发的时候心里面特别没有底,在写代码的时候,我都特别小心,生怕写出来的程序在结构上不合理,执行效率低下。工作了一段时间,开始自己设计软件的系统的一部分,当时又怕自己设计出来的系统在结构上不合理,使后期开发无法进行。所以,我一都在思考软件的设计方法,不断的总结。

    一直以来,我把系统设计、分析看成是一件很神圣的工作,虽然自己很早听说过有这样的考试认证,但是还是没有去报名,甚至没有去买考试用书。其原因就是我认为自己应该先多写代码,多接触工程实践,多积累一些经验,然后再来接受系统分析的工程方法。而现在,我在这行干了五年,我想我的经历应该可以让我来接受正规的系统分析方法了吧! 所以,我要把我学习的过程和我以前在工作中对系统分析的一些经验写出来,希望大家批评、指教!

    第一篇 系统分析到底分析些什么

    一句话,系统分析就是“分析软件系统在它的生存周期与生存环境中,各个对象与它的关系 ”,记住是关系,这是我这几天看书,然后结合自己的开发经历所得出的结论。

    一个大型的软件系统,它所涉及的关系多,所以这个系统做起来就复杂;一个小的软件,它所涉及的关系少,所以这个软件做起来就简单。但是在通常的情况下,这些关系需要系统分析人员去发现,通过各种手段:翻阅资料、采访相关人员等等。如果越多的关系被系统分析人员发现,那么系统分析员对系统的设计可能就越全面,系统结构对未来的不确定因素的适应能力可能会更强。

    在这里,我一直在强调“可能”。在我开始思考系统设计之前,我就觉得只要我掌握了正确的系统分析方法,那么我设计出来的系统在结构上是最合理的,在性能上是最稳定的,这个系统近乎是一个完美的系统。现在看来,这种想法很幼稚,作为对关系的分析,本身就和个人的经验、价值观有直接的、非常紧密的联系。所以我们要正确的对待系统分析师这个职业,他不是神,他只是一个将系统的开发风险尽可能降低到最低的人。

    第二篇 如何分析

    并不是每个公司都有自己专门的系统分析师,但是每个公司都有自己的系统分析工作,我想这是中国大多数软件公司所面临的现状吧。我们不能够因为没有系统分析师的存在,而把那些客观存在,需要我们去分析的东西丢在一边,最后只能是搬起石头扎自己的脚。

    看了《系统分析教程》之后,让我对如何做系统分析有了新的认识,但是里面提到的各种方法,动不动就要小组支持,安排会议,这些活动档次太高,咱们平时做的那些系统玩不起,那是不是因此我们就放弃系统分析呢?答案是否定的。我认为,软件系统的规模有大小,系统分析的规模也有大小,不同规模的系统,它的分析方法也应该不一样,下面我把我分析的方法写出来,希望大家批评指教。

    1. 接到一个工程后,脑子里对这个工程大致有个数,然后就把开发工具打开,开始干了(这种方法很土,和软件工程方法是背道而驰的)。 但是,当代码写道一定程度的时候一定要停下来,你要对以做的开发做记录。记录什么呢?比如:重要的处理过程,窗体的名称以及它的功能描述以及你当时认为有用的东西。然后继续写代码。在后来的开发过程中,当你回复前一段时间写的代码而不能马上理解它的意思的时候,你就得马上记录。当软件快开发到一半的时候,这时你对软件的整体构架比较清晰了,你就得分析出软件的基础模块,回顾以前的记录文档,看是否有其它模块也拥有你分析出来的基础模块的功能,如果有,那么就得对程序进行调整。调整完成之后,你就可以继续后面的开发了,系统做到这个地步,一般成功的把握就有90%了。这种方法只适合于做规模比较小的系统,例如一般的进销存系统,功能比较单一的小软件。
      后来我把这种分析方法命名为攀岩式分析,作为一个攀登者,需要的是力气和勇气来面对面前的大山,然后迈出第一步,攀登一截就打下一个钉子固定好,然后继续攀登,就算不小心失足,由于有前面的钉子固定,也不至于掉下万丈深渊。
      在没有系统分析团队支持的情况下,这种方法可以在一定程度上降低软件系统的开发和维护风险
    2. 当拿到一个系统开发任务的时候,先整理出开发任务中的数据对象,然后然后分析他们之间的关系,通过关系的分析,找出隐藏的数据对象;确定软件的功能框架,根据功能框架,画出数据流图和控制流图;分析基本的功能框架,然后做出一个基本的系统,然后拿给“领导 ”看。
      以上的描述是我碰到的真是情况后的处理办法,这个办法结合了结构化分析和原型开发中容易操作部分。
      在很多时候,我们可能接到一个比较大的开发任务,而拿到手里的却是一页草草几十字的“需求分析”,并且可能是有问题的需求分析。因为那页纸上写的内容实际上也是系统分析范畴中的资料,但是里面却杂糅模块功能描述、数据实体描述、数据存储描述等等信息。而我们该怎么办,撒手不干了?
      这时,首先要做的就是挑出里面的名词,将其做成矩阵,对有关系的名词打上标记,并注明是什么关系。在这个分析中,肯定会遇到问题,而我们要做的就是先把这些问题记录下来,这些问题最好不要立即去问“领导”们,因为他们可能也不清楚。
      接下来要做的是根据那份“需求分析”,指定出系统的功能框架,分析出最基本的框架,然后从最基本的框架着手,对框架的功能作进一步分解,然后再绘制的数据流图和控制流图,在绘制数据流图的时候,提取数据实体,建立基本的数据库(如果需要使用数据库的话),当然这个做法和《系统分析师教程》中的提到的方法也是大相径庭的,但是没有办法,因为我们连对象之间的关系都没有弄清楚,哪里来的逻辑分析严密的数据实体分析呀,为了工作,硬着头皮也要上啊。
      接下来就是按照上面的设计,把系统做出来,然后叫领导看,让领导多提意见,称领导在看程序的机会,顺便把押在手里面的问题拿出来,问题能解决多少算多少吧,然后继续开发,然后继续让领导审查,领导越高兴,问题解决的周期就越短,反之则越长。
      这些都是我的土方法,是没有办法的办法呀,工作还要继续干,并且还要干好呢!

    第三篇 是系统分析师还是程序员?

    我本来打算把这篇的标题定为“系统分析师和程序员的关系”,在我看了两个网友的留言后,我决定放弃这个标题,一个网友评论说,系统分析师应该消失,因为现在的原型化开发已经让系统分析师失去了价值;一位网友评论说,他在一个七八十人的小公司里面工作,认为系统分析师存在的必要性很大,并且说如果没有系统分析师的队伍,可能会失去竞争力。我认为这两种看法都过于偏激,因为他们都没有考虑到,不论是系统分析师和程序员还是其它搞开发的人员,他们都是软件公司的一部分。

    作为一个软件公司,作为一个企业,都有自己的生存法则,大公司有大公司的活法,小公司有小公司的活法。大公司实力大,人数多,能够接到大的项目,那么他必然要有自己专门的系统分析师团队来维护公司正常的业务运营;而小公司,通常接到的项目都比较小,人数又有限,要想支持一个专业的系统分析师团队是不可能的。我现在就在一个小公司里面工作,接到任务后,直接就和客户打交道,直接从客户那里获取他的需求信息,然后自己整理资料,分析系统的结构,然后编码,然后测试,这些事情是没有人来为我完成的。

    所以我认为,系统分析师可以有两种定义:一种从职务的角度来定义:这个人是我们公司的系统分析师;一种是从专业的角度来定义:这个人具备系统分析的专业知识。但不管从哪种角度来定义,它们都具备同一个特点:他们都要完成系统分析的工作。

    分析本身就是一项复杂的活动,它的复杂不仅体现在它所涉及对象本身,还涉及到指导分析的方法论。而这些都是通用的哲学,他同样可以知道我们在其它领域更好的开展活动。所以对于系统分析这项活动,作为一个程序员,也要去学习它,实践它,这对我们是有好处的。

    所以,不管我们所处的环境如何,是大公司还是小公司,至少我们都应该做自己的系统分析师。

     到此,有关我对系统分析师的感慨写完了,这篇文章只是我个人对系统分析师的看法,局限性很大,还希望大家多多指教。

    展开全文
  • 在大公司凤尾,还是在小公司鸡头?

    万次阅读 多人点赞 2019-08-18 21:40:01
    所谓初生牛犊不怕虎,大概也就是这个意思吧,无知可怕,但一直无知就很可怕了,后来有一个契机,让我再次接触到了编程。 500人左右的公司 大三的时候交换了一段时间,学习了几门编程语言,像Java、前端、...
  • JavaScript是什么意思

    千次阅读 2020-09-10 14:20:48
    JavaScript是一种非常着名的编程语言,最初是在二十年前开始的,其动机是使网页生动。它也是Web开发人员技能组的重要组成部分。简单来说,Web开发人员需要三种主要语言,它们是: ● HTML:允许您向网页添加内容 ●...
  • 机器翻译:现在机器翻译已经很多了,但是还很难达到最佳,比如我们把中文翻译成英文,再翻译成中文,再翻译成英文,来回10轮,发现和最初差别还是非常大的。 人机对话:这也是我们想做到的最终目标,这里有一个...
  • CRT是什么意思?LCD又是什么意思

    千次阅读 2008-11-20 17:41:00
    CRT是什么意思?LCD又是什么意思 CRT(Cathode Ray Tube)是阴极射线管。是应用较为广泛的一种显示技术。CRT投影机把输入的信号源分解到R(红)、G(绿)B(蓝)三个CRT管的荧光屏上,在高压作用下发光信号放大、...
  • 基于nodeJS的前端开发到底啥意思

    万次阅读 2017-06-29 09:40:17
    这个长久以来困扰着自己的问题,一直在寻找的答案,也许我现在的理解也不见得就十分准确,但是可以肯定的是,对于现阶段的我自己来说是有帮助的,现在记录如下:上个周末去了上海书城去看了下关于node的书籍,在深入...
  • 内容介绍 ...可贵的是,本书并不止步于解释“为什么”,还清晰呈现了“怎么”。 本书风格活泼、图文并茂,其对话式内容既引人入胜,又引人深思,适合于所有立志打造产品的人。想在自己的专业...
  • 百度快照劫持是什么意思?怎么解决

    千次阅读 2019-04-26 09:08:34
    百度快照劫持就是搜索引擎抓取正常网站的快照,但用户通过搜索关键词点击进入网站后展现的却是另一种内容,如黄赌毒等违法内容。...最初在刚开始的时候搜索关键词结果页显示的还是原本的标题和描述。 ...
  • walled garden是什么意思

    千次阅读 2010-03-14 14:29:00
    据称,“Walled Garden”一词最初来自John Malone(google一下,就知道他的背景了),一般译作“带围墙的花园”或“围墙花园”,是与“完全开放”的互联网(Garden)相对而言的,指的是一个控制用户对网页内容或相关服务...
  • RPC是什么意思

    万次阅读 2017-02-04 16:19:53
    工作中总是会遇到RPC这个词,每次都忘记是啥意思,现在将这个词的解释搬到自己的博客中,希望下次遇到不会忘记,^_^ 释义: RPC(Remote Procedure Call Protocol)—— 远程过程调用 协议 , 它是一种...
  • OpenCV调用TensorFlow是什么意思

    千次阅读 2019-02-21 21:38:30
    Gary Bradski是Arraiy.ai的CTO,曾在多个创业公司任职,并在斯坦福大学AI实验室的计算机科学部门consulting professor,他是OpenCV库的创立者,在开源方面有很多贡献,在开源社区享有极高声誉。   深度学习...
  • ukey证书是什么意思_什么是证书?

    千次阅读 2020-07-12 15:45:19
    ukey证书是什么意思 事实证明,证书很重要。 过期的证书可能会给您带来巨大的问题-这就是新闻中的故事在告诉我们。 但是什么是证书,为什么它们会过期,又为什么会产生如此大的影响? 要回答这些问题,让我们退后...
  • 常用的SPAM是什么意思

    千次阅读 2009-09-13 18:34:00
    SPAM,最初是一个罐装肉的牌子。对于这个牌子名字的来源有很多解释,官方版本说,它是“Specially Processed Assorted Meat”特殊加工过的混和肉。这种SPAM肉有段时间非常普及,到了无处不在,令人讨厌的程度。后来...
  • 黎曼猜想到底是什么意思

    千次阅读 2019-04-02 10:04:58
     :那么素数定理成立,这已经被证明了,历史上素数定理最初也是据此证明出来的 如果  :这其实就是黎曼猜想的另外一种描述。如果黎曼猜想成立的,那就可以证出: 也就是知道素数定理中的  到底与真正...
  • 中途还有2次因为自己错过,所以抓不到。所以对于人来说人真正才会有三次机会,人的一生真正只有三次,只有称为能改变自己命运的机会才可以称作是机会。其实人生的机会很快就会过去。能真正抓住机会的人,首先靠的是...
  • 《iOS移动开发从入门到精通》连载一: iOS移动...由于最初是设计给iPhone使用的,所以该系统原名为iPhone OS,即"iPhone运行OS X”,该系统使用了和macOS一样的Unix内核。 iPhone OS系统后来被陆续应用到iPodtouch、i
  • widget是什么意思?

    千次阅读 2010-12-14 15:08:00
    鱼鱼桌面是国内第一款widget软件,最初由作者唐承予开发,鱼鱼桌面秀在爱好者的支持下开始从最初1.0版本到2.0,但是鱼鱼的Widget基本是由个人爱好者开发后上传到官网,尽管种类丰富,但技术水平比较有限,属于基础开发,...
  • RS232 RTS和CTS是什么意思

    千次阅读 2011-03-26 19:01:00
    34RTS和CTS是什么意思? 解释一:RTS:终端我准备发数据给你,快用CTS应答,准备好没? CTS:好了,来吧 解释二:CTS:主机,我有数据,请求接收 RTS:我是主机,就绪,请求发送。 ...
  • i386和X86_64各是什么意思

    千次阅读 2013-05-28 12:03:30
    i386和X86各是什么意思 IA32 : 32 bits Intel Architecture (32位带宽Intel构架) IA64 : 64 bits Intel Architecture (64位带宽Intel构架) i386 : Intel 386 ( 老的386机器,也泛指IA32体系的CPU) i486 : ...
  • 最初做这个项目时,还没找到合适的 Vue3 组件库,所以我就根据自己的需求,封装了 message 、dialog 、input 、button 、popover 这样五个组件,其中重点讲一下 message 和 dialog 吧,另外还有这个项目的亮点:...
  • 给技术人提升自己的几点建议

    千次阅读 2018-09-24 23:47:57
    订阅公众号(**ID:ITBigFly**)第一时间收到推送 作为一个技术人,我们不仅要不断地学习来提升自己不被淘汰,另外也要不断总结自己的经验和教训,踩过的坑、走过的...我们经历着互联网飞速发展的时代,从最初的 ...
  • 本文所描述的内容均基于我自己对此问题的理解,其中定然存在偏差及不当之处,因此,千万别将此文中所描述的内容作为“标准”,如果你一旦发现其中存在的问题,非常欢迎您及时与我联系,我也会在纯 C 论坛上( ...
  • DevOps到底是什么意思?看完这篇不要再问我了

    千次阅读 多人点赞 2019-12-21 17:44:31
    最初,程序比较简单,工作量不大,程序员一个人可以完成所有阶段的工作。 随着软件产业的日益发展壮大,软件的规模也在逐渐变得庞大。软件的复杂度不断攀升。一个人已经hold不住了,就开始出现了精细化分工。 码农的...
  • DCD DSR DTR RTS CTS表示什么意思

    万次阅读 2011-10-31 16:22:52
    RTS/CTS最初是设计为电传打字机和调制解调器半双工协作通信的,每次它只能一方调制解调器发送数据。终端必须发送请求发送信号然后等到调制解调器回应清除发送信号。尽管RTS/CTS是通过硬件达到握手,但它有自己的优势...
  • RTS和CTS是什么意思?[转贴]

    千次阅读 2008-09-02 10:58:00
    RTS和CTS是什么意思?以前挺明白的,今天一下子觉得以前的理解都不对了,以下三种解释哪个对呢?解释一:RTS:终端我已经准备就绪,有数据就发过来吧CTS:来了,接招解释二:RTS:终端我准备发数据给你,快用CTS应答...
  • GNU/Linux的GNU是什么意思

    千次阅读 2009-06-23 09:36:00
    GNU本来向开发自己的操作系统——HURD,但是因为种种原因进度非常慢。这时候,一个荷兰黑客制作出了Linux,并宣布:遵循GPL版权可协议。 Linux的发展非常快,他本身遵循GPL版权可协议,同时又把GNU的很多软件集成了...
  • 最初,人们用物品交换物品,形成了物物交换。然而,物物交换的效率十分低下,因为很难找到两个碰巧具有匹配物品的人。 对一个需要鞋子的渔夫和一个需要粮食的鞋匠来说,他们之间很难达成协议。即使需求匹配,也很难...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,197
精华内容 31,678
关键字:

做最初的自己的意思