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


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

软件工程师的发明家—从发明家的视角分析软件相关推荐

  1. php工程师的前景,为何说做PHP软件工程师前景非常好

    每个人的历程不同,即使是同样的职业,各人的发展空间也是有很大的差别.PHP软件工程师也是如此,大大小小软件工程师各有千秋,随着年龄的增加,有些软件工程师为自己的前途而感到迷茫,其实有事实数据考证,做P ...

  2. 如何成为一名有效的软件工程师

    by Luis Santiago 路易斯·圣地亚哥(Luis Santiago) 如何成为一名有效的软件工程师 (How to become an effective software enginee ...

  3. 写给软件工程师的 30 条建议

    经验都是在生活中不断积累中获得的......本文作者将回顾人生的历程,并将软件工程师的工作和生活公之于众. 作者 | Periklis Gkolias 译者 | 弯月,责编 | Elle 出品 | C ...

  4. 转:高级软件工程师成长秘诀(文末有笔者自己的小评论)

    作者:Neil Kakkar 译者 | 张健欣 身为软件工程师,你要如何进一步成长? 2018 年的时候,我开始在彭博社(Bloomberg)工作.从那之后,事情发生了很大变化.我不再是公司里最初级的 ...

  5. 2018年7月北航举办软件工程师师资培训札记

    2018年7月北航举办软件工程师师资培训札记 2018年7月9日-11日,参加了由北航计算机学院联合微软邹欣老师.<构建之法>出版团队举办的为期三天的软件工程师师资培训会. 1. 培训背景 ...

  6. 软件工程师职业道德规范_看一下三个职业道德规范的最新更新

    软件工程师职业道德规范 It is common for professional societies and membership organizations to have a Code of E ...

  7. 每个软件工程师都应该知道的有关实时数据的统一概念

    转自:炼数成金 每个软件工程师都应该知道的有关实时数据的统一概念 我在六年前的一个令人兴奋的时刻加入到LinkedIn公司.从那个时候开始我们就破解单一的.集中式数据库的限制,并且启动到特殊的分布式系 ...

  8. 精读文章:高级软件工程师成长秘诀

    作者 | Neil Kakkar 译者 | 张健欣 策划 | 陈思 身为软件工程师,你要如何进一步成长? 2018 年的时候,我开始在彭博社(Bloomberg)工作.从那之后,事情发生了很大变化.我 ...

  9. 《这就是软件工程师》里的推荐书单

    这本书是访谈了四位一线软件工程师,个个都是大牛: 郄(qiè)小虎,腾讯公司副总裁.用吴军老师的话说,"谷歌中国历史上最好的工程师,没有之一,当属郄小虎." 陈皓老师,是软件工程师 ...

最新文章

  1. Oracle 表空间 创建参数 说明
  2. 文字居中 qt_Qt编写自定义控件11-设备防区按钮控件
  3. LVS:三种负载均衡方式比较+另三种负载均衡方式
  4. mysql 存储 事务_MYSQL 可以在存储过程里实现事务控制吗
  5. 666表情包的c语言程序设计教程课后答案,C语言设计题
  6. Windows 下安装 Scala
  7. C语言累加函数代码,ARM汇编程序---通过ARM汇编调用C语言函数实现累加
  8. 云画质助手iApp源码
  9. linux安全擦除ssd命令,如何在不破坏SSD的情况下安全擦除SSD | MOS86
  10. 自学c语言买谭浩强,C语言自学最强版本(谭浩强).pdf
  11. 在IT呆了好久了,给大家科普下这个行业的行话
  12. (附源码)springboot工作计划管理软件 毕业设计 181638
  13. QGC地面站配置PX4Flow光流传感器
  14. monkeyrunner 使用
  15. 覆盖Laracon:在线会议会向内倾吗?
  16. 来测试下 2019 你一共写了多少行代码?
  17. 白羊狮子:爱在烈火中永生
  18. 高速版的股票数据源增加复权功能,股票量化分析工具QTYX-V2.3.3
  19. 别等到使用电化学工作站时才来了解这些
  20. 【SOLIDWORKS学习笔记】草图绘制基础操作

热门文章

  1. matlab画扇区,NFCDemo NFC读写测试 ,自动读取每个扇区 块的值 matlab 238万源代码下载- www.pudn.com...
  2. VMware ESXI虚拟化安装win10系统
  3. Java设计模式(七):适配器设计模式
  4. anaconda tensorflow 2.3_安装anaconda amp;源码安装lightgbm,xgboost
  5. cobbler安装和基本配置
  6. apache服务出现Forbidden 403问题的解决方法总结
  7. 关联tomcat源代码
  8. 解决jquey中当事件嵌套时,内层事件会执行多次的问题
  9. apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
  10. (转载)彻底理解浏览器的缓存机制