这也许是和候红老师的最后的几节课了吧,侯老师是一个很有思想深度,很关心同学的好老师。

一开学就布置了阅读《人月神话》的作业,说实话,我没有看,以我的速度可能2、3个小时就看完了,但是我觉得没有什么意义,在网上找了一个洗的很好的总结,大概看了看,并加入了一些自己的看法,因为目前才大三,没有什么项目开发经验,所以只能从平时的编程中遇到的问题来看待《人与神话》这本书。

参考:

《人月神话》读书笔记——陈浩要安静(http://www.jianshu.com/p/da8a68354caa

人月神话读书笔记

  开头的话:第一次听到《人月神话》是在陈晓江老师的新生导读上,当时对这个专业充满了好奇与期待,于是便立马买了这本书来看,但是当时的我对编程都是一窍不通,更是不能理解这本书的内容了。而如今已步入大三,我再次读了这本书,首先有了一定的编程经验以及小的项目开发经验,其次学习了《软件工程》和《项目管理》,便是对这本书有了初步的理解。不过,我始终相信每次一的读书都会带来新的收获,等我工作了以后再次读这本书的时候肯定会有新的感触吧。

  人是程序员,月是时间,如果1人干10个月如果等同10人干1个月,那就成神话。

  第一章的标题便是很吸引人“焦油坑”。程序员,就像诗人一样,几乎仅仅工作在单纯的思考中。程序员凭空运用自己的想象,来建造自己的“城堡”。很少有这样的介质——创造的方式如此灵活,如此得益于精炼和重建,如此得容易实现概念上的设想。没错,程序员就像创作者一样,每一次指尖的敲下,便是有一串字符诞生,而这串字符便是蕴含着创作者自己独特的思维,就如同作家、画家等一样,程序员所做的也是智力创造,不断地推翻以前自己的所想就成为常态。一开始设计上的不完善,再加上后来不断地推翻修改,若是没有在更高的高度上的对整体的把控,就会使得软件架构越来越复杂,冗余的内容越来越多,还不敢随意删除,这就成为了一个焦油坑,越是挣扎,编越是深陷其中。“Adding mapower to a late software project makes it later.”向进度落后的项目中增加人手,只会使进度更加落后。这是书中提到的Brooks法则,人月神话一文的核心观点。用人月这一观念来衡量项目进度带有欺骗性。因为他使得项目看上去好像人力和时间是可交换的。如果时间不够,那么增加人手就可以加快进度。但是这个衡量方式忽略了新增加人手的培训时间、队员之间的沟通时间等等因素,结果就是,盲目的增加人手只会导致项目落后。所以问题是,如何使得项目进度不落后;要想使得项目进度不落后,就要制定出合理的项目进度。所以,问题是,如何制定出合理的项目进度。

外科手术队伍是指有经验的程序员决定了项目的绝大部分内容,而其他人只完成一些细节的工作,但是这里我认为作者只是从如何高效的完成项目来考虑了,没有从一个公司管理者的角度来考虑。

  画蛇添足,我觉得这里的翻译有一些奇怪,其实作者是想表达,系统设计师应该足够小心并关注第二个系统,因为第一个系统在设计时是毫无经验的,是一次大胆的尝试,而第二次应该尝试全集与第一次设计的差集,而这种尝试必然是十分危险的。以后的设计中则可参考前两次的设计经验。

为什么巴比伦塔会失败?书中列举了一个项目想要成功的一些必要因素。清晰地目标、人力、材料、时间、技术,这些条件全部都达到了要求,但是为什么还是会失败呢?这就像圣经中的巴比伦塔故事一样。当时人类联合起来兴建希望能通往天堂的高塔,为了阻止人类的计划,上帝让人类说不同的语言,使人类相互之间不能沟通,计划因此失败,人类自此各散东西。所以他们还缺乏什么?那就是交流和组织。他们无法相互交谈,从而无法合作。当合作无法进行时,工作陷入了停顿。通过史书的字里行间,我们推测交流的缺乏导致了争辩、沮丧和群体猜忌。很快,部落开始分裂——大家选择了孤立,而不是互相争吵。

  胸有成竹。这章讨论一个程序员的生产效率究竟有多高?书中说“对规模平均为3200指令的程序...大约单个的程序员所需要的编码和调试时间为178个小时,由此可以外推得到每年35800语句的生产率。而规模只有一半的程序花费时间大约仅为前者的四分之一,相应推断出的生产率几乎是每年80,000代码行1。计划、编制文档、测试、系统集成和培训的时间必须被考虑在内。因此,上述小型项目数据的外推是没有意义的。就好像把100码短跑记录外推,得出人类可以在3分钟之内跑完1英里的结论一样。”工作量和代码行数不是线性关系,而是指数型关系:工作量 = (常数)×(指令的数量)^1.5。

  祸起萧墙。项目是怎样被延迟的?就像高中英语老师所说的,你每天比别人早来20min,早点来读读单词、背背课文;每次课间多做两三道单选;每天晚上做一道阅读理解,那么你半年比别人进步多少?虽然当时觉得很有道理,但一直也没这样做......反向分析一下项目进度也是极其相似的,因为种种事情而推迟的计划在最后累积到一起,导致整个项目延期到难以想象的地步。虽然我们都很不想让进度落后,但是一天一天的进度落后是难以识别的、不容易防范和难以弥补的。某个关键人员生病了、公司停电、下暴雪、紧急任务、私人问题——这个列表可以无限被扩展,每件事都会使项目延期半天、一天,虽然都是小的时间碎片,但是整个项目进度开始落后了,尽管每次都只有一点点。

  另外一面。这一章主要阐述了文档在项目开发中起到的作用是多么重要。但是什么样的文档才是好的文档呢?文中给出了一些参考内容:1. 目的。主要的功能是什么?开发程序的原因是什么?2. 环境。程序运行在什么样的机器、硬件配置和操作系统上?3.范围。输入的有效范围是什么?允许显示的合法范围是什么?4.实现功能和使用的算法。精确地阐述它做了什么。5.输入——输入格式。必须是确切和完整的。6.操作指令。包括控制台及输出内容中正常和异常结束的行为。7.选项。用户的功能选项有哪些?如何在选项之间进行挑选?8.运行时间。在指定的配置下,解决特定规模问题所需要的时间?9.精度和校验。期望结果的精确程度?如何进行精度的检测?

  没有银弹。There is no single development, in either technology or management technique, which by itself promises even one order-of-magnitude improvement within a decade in productivity, in reliability, in simplicity.Fred Brooks提出的注明论断。在民俗传说里,所有能让我们充满梦靥的怪物之中,没有比狼人更可怕的了,因为它们会突然地从一般人变身为恐怖的怪兽,因此人们尝试着查找能够奇迹似地将狼人一枪毙命的银弹。我们熟悉的软件专案也有类似的特质(以一个不懂技术的管理者角度来看),平常看似单纯而率直,但很可能一转眼就变成一只时程延误、预算超支、产品充满瑕疵的怪兽,所以,我们听到了绝望的呼唤,渴望有一种银弹,能够有效降低软件开发的成本,就跟电脑硬件成本能快速下降一样。第一次看到这个标题的时候,感觉很奇怪查了一下才明白其中的寓意。比如面向对象编程,只能解决一些非本质的困难,对于软件工程的根本问题无事于补,即复杂性、一致性、可变性、不可见性、遗留问题。因此,现在的技术中最有希望的,并且解决了软件的根本而非次要问题的技术,是开发作为迭代需求过程的一部分——快速原型化系统的方法和工具。快速原型之所以可以解决根本问题,是因为快速原型有助于澄清软件工程的概念结构,从而降低了后期变更的幅度。基于快速原型进行增量开发,目前已经成为实际开发的标准流程。我觉得这是作者首次明确地做出肯定。

  软件重用。作者提出“重用是一件说起来容易,做起来难的事情。它同时需要良好的设计和文档。即使我们看到了并不十分常见的优秀设计,但如果没有好的文档,我们也不会看到能重用的构件”。这一点我算是体会深刻,在Python中模块(包)的概念可谓深入人心从,一开始接触的Django,Web.py,到requests,bs4,unittest,coverage,以及他们的管理工具pip等等还有很多。这些优秀的模块抛开它们本身优秀的设计思路,以及强大的功能。你会发现这些优秀的模块都有一个共同点——文档写得十分优秀。好的文档能极大的提高开发效率,例如Django的官方文档,体系十分庞大,而且对于每个版本都有对应的文档,每次更新的内容也会在首页展示,只不过纯英文看的我有点头痛,因为很多术语即使翻译了也感觉怪怪的,大部分都是专业词汇。再说一个依赖模块而诞生的强大工具Atom,这个是github推出的一款编辑器,他的强大之处在于它的可扩展性,比较知名的有elemet,minimap等等,这些下载量惊人的扩展或是主题抛去本身十分好用不谈即使没有像Django的官网,去看他们的gihub的README,写的十分清楚,什么快捷键,快速入门,写的明明白白,因为atom的开发者是参差不齐,不想pypi那种有严格的审核,导致一些明明十分好用的扩展和主题,因为烂的一比的文档(这里我不得不说一些很粗俗的话,我当时下载了一个主题的扩展包,可以使用透明的自定义背景,十分好看,但是我怎么都不知道在哪里改,甚至去他的源码里替换了一些我也不知道是什么的.jpg文件,弄了有两天,都没有弄好,后来在特别偏僻的论坛里发现了一条,有一个快捷键‘ctrl+shift+e’这你不说谁能想到啊,真的很生气)导致根本没人用,甚至被骂。所以在软件重用这里,顺便说一下文档的重要性。

  20年后的人月神话。作者说“今天,我比以往更加确信。概念完整性是产品质量的核心。拥有一位结构式是迈向概念完整性的最重要一步。这个原理不仅限于软件系统,它适用于所有的复杂事物” 20年后的人月神话有些结论得到验证,有些情况已经变化,下面是这些情况的简单概括:1.第二系统定律得到验证:开发第二个系统总是因为盲目的功能导致易用性、甚至是可用性的灾难。图形界面的成功2.瀑布模型被证明是错的了,因为没有构建舍弃原型。事实上增量开发与快速迭代才是理想的开发方式。3.增量开发和快速原型,渐进地精华,让软件像生物进化那样逐渐演化成更为复杂的结构,演化出更多的功能。4.信息隐藏:Parnas是正确的,我是错误的。20年前关于信息隐藏的两大观念,其一是Brooks主张的,所有的程序员应该了解所有的材料。而Parnas则认为代码模块应该采用定义良好的接口来封装,这些模块内部结构应该是程序员的私有财产。Brooks承认,Parnas所主张的方案确实更符合实际。5.对人月神话实际研究发现,向进度落后的项目中添加人手会增加项目的成本,但是不一定会使项目更加落后。如果在项目早期添加额外的人比在后期添加额外的人更安全些。6.人就是一切。这一点可以从《人件:高生产率的项目和团队》可以见出。7.放弃权利的力量——公司通过将权利下放到具体的团队,事实上使得组织机构变得更加“融洽和繁荣”。8.最令人惊讶的新事物——数百万的计算机。9.使用塑料包装的成品软件包作为构建:成熟的模块和对象组合提升了软件复用的层次。

  软件工程的未来。作者说“软件工程的焦油坑在将来很长一段时间内会继续地使人们举步维艰,无法自拔。软件系统可能是人类创造中最错综复杂的事物,只能期待人们在力所能及的或者刚刚超越力所能及的范围内进行探索和尝试。这个复杂的行业需要:进行持续的发展;学习使用更大的要素来开发;新工具的最佳使用;经论证的管理方法的最佳应用;良好判断的自由发挥;以及能够使我们认识到自己不足和容易犯错的——上帝所赐予的谦卑”。

IT项目管理——《人月神话》读后感的更多相关文章

  1. 《The Mythical Man-Month(人月神话)》读后感(1)

    临近考试周,这里我通过平时阅读的<人月神话>十九个章节和知乎.简书等网页中网友们对<人月神话>的读后感,对书中各个章节进行简单的总结,以下均为个人手打观点的思考与整合,仅供大家 ...

  2. 《The Mythical Man-Month(人月神话)》读后感(2)

    第10章 未雨绸缪 在化学领域中,在实验室可以进行的反应过程,并不能在工厂中一步实现.一个被称为“ 实验性工厂(pilot planet)”的中间步骤是非常必要的,它会为提高产量和在缺乏保护的环境下运 ...

  3. 软件项目发展历史<人月神话>这本书好

    几乎是计算机软件开发的发展历史     人月神话,增加人手并不一定能提高开发速度. 原因在于,有些任务是无法分解的,存在先后顺序.无法同步进行. 增加人手,增加的是沟通成本,相互牵制.可以分解的任务就 ...

  4. <<人月神话>>阅读体会(一)

    第一次听说人月神话还是在大一上学期的导论课那会儿,那会儿好像就已经确定了自己要学软件,于是就去问王建民老师能不能给我推荐几本软件工程方面的书,我想要提前自己学学,以为老师会给我推荐一些某种语言类的学习 ...

  5. Java课程寒假之《人月神话》有感之一

    一.焦油坑 以前上课的时候,老师讲过早期的程序由于工作量不大,大多只需要几个人完成,随着软件规模的不断扩大,代码量直线上升,仅仅一两个人可能没有办法完成这样的任务,多以开始形成了团队的规模,焦油坑说的 ...

  6. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  7. 读书笔记第三周 人月神话 刘鼎乾 PB16070837

    读书笔记第三周:人月神话   这本书主要讲述了如何管理一个软件开发团队的问题,其中如何提高团队的效率可以说是本书的重点之一了.感觉这本书地中文版翻译得比较晦涩,很多表达比较模糊,看起来有些吃力,因此下 ...

  8. 《人月神话》读书笔记 PB16110698 第七周(~4.19)

    每逢读书笔记上交作业时刻,班级blog页面上总能看到<人月神话>相关的读书笔记,本次软工课邓老师推荐的第一篇读书笔记也是写的<人月神话>,算是对它“耳濡目染”了.本周,我终于抽 ...

  9. 《人月神话》读书笔记(2)-week3

    为了确保团队中的每个人都能保持系统概念上的完整性,关于项目的书面规格说明是必不可少的.手册要描绘用户可见的一切,但不应支配实现的过程.光有规格说明也是不够的,会议也是必要的.书中提到的周例会会迅捷地给 ...

随机推荐

  1. Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制

    1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...

  2. Vue向后端请求课程展示

    1.Vue结构 App.vue <template> <div id="app"> <router-link to="/index" ...

  3. 使用Vue自己做一个简单的MarkDown在线编辑器

    1.首先要下载mark组件. npm install marked --save 2.在Vcontent.vue中简单写一些样式. <template> <div class=&qu ...

  4. 【kindle笔记】之 《鬼吹灯》-9-20

    [kindle笔记]读书记录-总 9-20 日常吐槽 连着几天,基本是一口气读完了鬼吹灯. 想来,也算是阴差阳错了.本来是想看盗墓的,读了几页开头,心想坏了,拷贝错了,这是鬼吹灯-- 讲真的,每每读小 ...

  5. Linux 典型应用之服务管理

    crontab 定时任务 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minut ...

  6. IdentityServer4【Topic】之StartUp中的配置

    Startup 身份服务器是中间件和服务的组合.所有的配置都是在启动类中完成的. Configuring services 通过调用如下代码在DI(dependency inject,依赖注入)中添加 ...

  7. [转帖]学习关于TTL

    自己简单试了一下在家里与在公司里面服务器的连接: C:\Users\Administrator>tracert oms.inspur.com 通过最多 个跃点跟踪 到 oms.inspur.co ...

  8. 通用模块设计UMD

    https://leohxj.gitbooks.io/front-end-database/content/javascript-modules/about-umd.html UMD(universa ...

  9. idea的pom.xml中提示dependency‘’not found

    今天下午在更新svn上的项目到本地,发现pom文件中的如下依赖的version一直标红,鼠标放上去显示“dependency not found.” 同时检查了Maven Projects中该项目引入 ...

  10. matlab——sparse函数和full函数

    转载:http://www.cnblogs.com/lihuidashen/p/3435883.html matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)   函数功能:生成 ...