软件工程师的发明家—从发明家的视角分析软件
明年就大四了,同学要去参加实习生面试,却又不知如何推销自己,他在校也做过不少项目,索性我就想让他以项目为主,围绕项目展现自己。所以如何让面试官最快的了解自己的项目成了最大的问题, 我也就做了下类比,把向远古人介绍自行车和向对项目一无所知的面试官介绍项目做了类比。
软件工程师就像就发明家一样,每个软件都是其发明创造的产物。软件工程属于工程学,很早就有人把软件工程和建筑学相对比,并因此产生了一本创造性的书籍《设计模式》。既然都是工程学科,那么将软件的创造和自行车的创造进行类比自然是不无道理的。
人认识事物的方式是从抽象到具体,借鉴这种认识方式,我们用一句话去描述系统的概念。
一句话描述
首先我们需要一个概念性的认识,并用一句话去描述这个概念。对自行车来说,“便于人们骑行的2轮路上交通工具”足以描述自行车的概念。而对于一个系统或一个软件来说,如何用一句话来描述它的概念呢?我们以blog为例,百度百科给出的定义是“是一种通常由个人管理、不定期张贴新的文章的网站”。我来分析下这个的定义,首先bolg是一个网站,这里定义了blog的性质,与自行车是交通工具一样。其次“个人管理和不定期张贴新文章”给出的是其主要功能,这又与自行车的“骑行”一样。
在概括描述了整个系统之后,需要进一步的对系统进行分析解说,一般一个系统都是由很多个模块组成。
介绍系统组成模块


左边是一幅自行车的结构图,右边是其对应的树形分解图。有没有发现这个树形分解图和WBS很像呢?没错,自行车的制造者也是按照模块化进行分解的。制造商将一个自行车分成多个子系统(模块),如果一个子系统(模块)过于复杂,则继续进行分解,直到这个部件可以被直接生产制造为止。从宏观来看,自行车由龙头、车架、车轮、脚踏板、链条等构成。从职责来看,龙头负责掌控方向、车架负责支撑、车轮负责行驶、踏板负责提供动力、链条负责连接踏板和车轮。每一个部件都是一个模块,把这些类比到一款软件里面,如果我们按责任去发现模块,那么一个blog系统将进行如下分解:个人信息管理模块、文章发布管理模块、评论管理模块、好友管理模块、文章分类模块。当然,这只是我个人进行的粗略的分解,但是却并不影响我所要表达观点。在这一步中,只是阐明系统的组成部分,阐明模块的细节放在下一步中。
分别介绍各个模块的细节
还是以自行车为例,我们从车轮入手,对车轮进行分析。在这一步中,我们可以阐述对车轮具体的设计:比如车轮为什么是圆的,而不是方的?如何设计车轮才能使其更经久耐用?如何设计设计使其能够减少摩擦,行驶的更快。诸如此类的问题。
虽然系统可以被分为多个模块,但模块之间并不是简单的组装就能成为一个系统,还少不了重要的一步
模块之间的协作
模块之间的边界都该尽可能的被设计为接口。车轮和链条如何衔接,他们又是如何和脚踏板一起协作来完成行驶功能的,这也就是部件的协作问题。可以把每个部件之间的连接点理解成接口,模块之间通过接口调用函数来完成协作。当然,如果要考虑到模块之间的协作的话,可能需要对上一步中所分析出来的模块进行修改,比如说车轮出需要打个洞,来安装和链条衔接的部件。软件设计也是一个不断迭代的过程,不断的去修改之前的设计,又在不断的设计中发现新的修改。
这是一个自顶向下的分析过程,在系统视角里,我们从责任出发,去发现模块。然后降低视角,在模块视角中从责任出发去发现对象,通过对象协作完成模块内部的责任。再提高视角,通过模块之间的协作完成模块的责任,并不断的重复上面的操作去完善我们的设计。总结起来就是“责任、对象、协作”。
软件工程师就像就发明家一样,每个软件都是其发明创造的产物。软件工程属于工程学,很早就有人把软件工程和建筑学相对比,并因此产生了一本创造性的书籍《设计模式》。既然都是工程学科,那么将软件的创造和自行车的创造进行类比自然是不无道理的。
人认识事物的方式是从抽象到具体,借鉴这种认识方式,我们用一句话去描述系统的概念。
一句话描述
首先我们需要一个概念性的认识,并用一句话去描述这个概念。对自行车来说,“便于人们骑行的2轮路上交通工具”足以描述自行车的概念。而对于一个系统或一个软件来说,如何用一句话来描述它的概念呢?我们以blog为例,百度百科给出的定义是“是一种通常由个人管理、不定期张贴新的文章的网站”。我来分析下这个的定义,首先bolg是一个网站,这里定义了blog的性质,与自行车是交通工具一样。其次“个人管理和不定期张贴新文章”给出的是其主要功能,这又与自行车的“骑行”一样。
在概括描述了整个系统之后,需要进一步的对系统进行分析解说,一般一个系统都是由很多个模块组成。
介绍系统组成模块
左边是一幅自行车的结构图,右边是其对应的树形分解图。有没有发现这个树形分解图和WBS很像呢?没错,自行车的制造者也是按照模块化进行分解的。制造商将一个自行车分成多个子系统(模块),如果一个子系统(模块)过于复杂,则继续进行分解,直到这个部件可以被直接生产制造为止。从宏观来看,自行车由龙头、车架、车轮、脚踏板、链条等构成。从职责来看,龙头负责掌控方向、车架负责支撑、车轮负责行驶、踏板负责提供动力、链条负责连接踏板和车轮。每一个部件都是一个模块,把这些类比到一款软件里面,如果我们按责任去发现模块,那么一个blog系统将进行如下分解:个人信息管理模块、文章发布管理模块、评论管理模块、好友管理模块、文章分类模块。当然,这只是我个人进行的粗略的分解,但是却并不影响我所要表达观点。在这一步中,只是阐明系统的组成部分,阐明模块的细节放在下一步中。
分别介绍各个模块的细节
还是以自行车为例,我们从车轮入手,对车轮进行分析。在这一步中,我们可以阐述对车轮具体的设计:比如车轮为什么是圆的,而不是方的?如何设计车轮才能使其更经久耐用?如何设计设计使其能够减少摩擦,行驶的更快。诸如此类的问题。
虽然系统可以被分为多个模块,但模块之间并不是简单的组装就能成为一个系统,还少不了重要的一步
模块之间的协作
模块之间的边界都该尽可能的被设计为接口。车轮和链条如何衔接,他们又是如何和脚踏板一起协作来完成行驶功能的,这也就是部件的协作问题。可以把每个部件之间的连接点理解成接口,模块之间通过接口调用函数来完成协作。当然,如果要考虑到模块之间的协作的话,可能需要对上一步中所分析出来的模块进行修改,比如说车轮出需要打个洞,来安装和链条衔接的部件。软件设计也是一个不断迭代的过程,不断的去修改之前的设计,又在不断的设计中发现新的修改。
这是一个自顶向下的分析过程,在系统视角里,我们从责任出发,去发现模块。然后降低视角,在模块视角中从责任出发去发现对象,通过对象协作完成模块内部的责任。再提高视角,通过模块之间的协作完成模块的责任,并不断的重复上面的操作去完善我们的设计。总结起来就是“责任、对象、协作”。