【误打误撞】

都不知道怎么碰到这本书,大一就在图书馆瞄过,后来很多书都提到这本神秘的著作。在kindle上读这本书,算得上是茶余饭后的消遣之物。如果说这时软件工程的一本经典之作,那么它还是适合那些产品经理以及项目负责人,当然对于一般的想要自己开发项目的同学也可以看看,算是了解一些基本的软件工程概念。

读人月神话_人月神话

【人月神话】

本书的译名容易让人浮想连篇到奇幻小说,其实这里的“人月”是指软件开发中人力与时间的关系,他们并不是简单的对等的,而是一个更加复杂的函数。当项目进行到时间不够的时候,简单的加派人手只会让情况更糟糕,因为项目在于沟通,在于构建整体的系统。

而本书,不仅仅是人月之间的关系,而且有一般软件工程应该注意的问题,比如团队组织,空间、银弹——开发技术,时间日程表等等。而且时代是一直在进步的,技术和概念上的更新需要付出更多的努力追赶前进方向。往往所做的第一个原型,是要被丢弃的,因为它太难用或者性能很低下,而设计又要随着时间而改变,故而一个真正的软件其工程量远远超乎我们想象的若干人年,它的任务会一直延续到它完成所有的使命,直到有新的软件新的设计去替代它。


【我关心的东西】

  • 数据的表现形式是编程的根本

 

记得pascal之父Niklaus wirth说过 "程序 = 算法 + 数据结构",这是有道理的,我们编程就是为了将数据表现成我们想要的形式,而最终的形式是和数据结构有关系的,而这个表现结果就是算法的最终产物。《编程珠玑》里有单独一章介绍数据的表示,就是简简单单的数组都非常有用——高效地解决了很多冗余或者适合线性迭代的问题。而编程高手们一直告诫我们编程之间先多思考,多思考,多想想采用怎样的数据结构来表现数据会比较适合后面的处理以及结果的表示。编程之前多花点时间去做抽象、归纳、发散会减少编写代码的时间。稍后我们也会讲到布鲁克斯书中经典的项目时间安排(编码只占很小一部分)。

让我们来举几个例子,排序是程序员的看家本领,而编程是为了让数据最后以有序的方法表现出来,故而怎样表现就是排序的核心所在,于是有非常多的算法用不同的思想:归并,堆(这个更加符合 niklaus的等式),插入,基数等等。 再如,我们编写一个从数据库查询信息然后生成报表,最后的报表就是数据的表现形式。编程,是将机器里面的数据表达成我们人类容易理解的形式;程序员也就是翻译人员。

虽然这句话有一定的道理,但是貌似有点忽略了算法的重要性,表现形式虽然是根本,但是其中隐藏的实现和实现过程也是不容忽视的。

  • 时间的重要性

时间是工程中相当重要的因素,一个大型的软件要能在它规定的时间范围内开发出来,这样才能发挥作用,要不然到时候发现不适合了,太陈旧了,不能用了。故而开发之前就要有很好的时间日程表,按照日程表达到相应的里程碑。各种各样的原因会造成项目的拖延,虽然每次只拖延一天,但是久而久之就可能把项目拖黄。我们应该有足够的远见预料到麻烦所在,以及分配时间去解决那些关键路径上的问题。

时间的分配也十分有趣,三分之一用于设计,六分之一用于编码,四分之一用于模块测试,四分之一用于系统测试。

  • 文档的力量

遇到问题记下来,有记录,分歧才会明朗,矛盾才会突出。

的的确确是这样的,书写能够帮助我们更好地思考,而且能够帮我们保持一致。而文档更加是跟踪整个项目的利器,有许多规格性的东西需要加以详细的描述,比如需求,技术要求,日程等等。文档是项目经理的法宝,项目经理的任务是促进软件开发团队的交流,而交流会减少我们之间的分歧以及误解。如果大家脑袋里的概念都是不同的,做出来东西也必定是不三不四。虽然可以保证设计人员很少,以保持文档的纯粹性,但是为了让编码人员最后实现的东西也和设计保持一致,文档是重要的,我们可以看到很多开源的项目都有自己的博客页面,以及很多的邮件列表。文档是为了更好地“交流”。

  • 各种编程技术的使用——银弹在哪里?

银弹——杀死软件怪兽的武器在哪里?编程的技术一直在发展,新技术的发明使得软件生产率不断提高,不过少有工具能够将软件开发的生产率提高一个数量级。我们熟悉的高级语言、结构化程序设计、OOP、以及各种各样的框架都很大地提高了我们的软件生产率。而对于软件的最主要的矛盾——复杂度 来说,没有银弹可以杀死它,因为软件工程不能被可视化成我们能够体会到的三维表示,而且它对于人类来说的确太过于复杂了,必须要花费许许多多的人力和时间来完成。其中设计就是最困难的,我们不可能保证设计的每一处都能保持一致,因为很多时候封装抽象使得它被分配到很多人的手上,就算是在一个人的手上,也会有各种各样的差异。差的设计容易带来一堆的bug,而好的设计能够让程序良好地运行。就银弹而言,好像没有一种工具能够解决软件复杂度的问题,只是靠各种工具不断改善这一处境。但是我们在hack news 里面看到一个很神奇的开发工具居然可以实时调试,而且可视化,对于程序员来说更加方便有趣忘记叫什么名字了,毫无疑问,前途是光明的,我们天生就很乐观 :)

【after passage】

软件工程是个大范围的东西,也许现在不到时候去深入了解这些东西,不过拿来读读还是不错的。毕竟我们还是以提升技术为主,没有技术根本无需去谈这些太大的概念。接下来就好好磨砺算法和数据结构,然后多编码练练手,等有一天能够用上人月的知识的时候,我会翻出这本书再看一遍。如果你也对这本书感兴趣,那么不妨到豆瓣这里去看看其他人写的书评。

by bibodeng  April,27th,2012   Friday  原载于 http://bibodeng.web-149.com/