每逢读书笔记上交作业时刻,班级blog页面上总能看到《人月神话》相关的读书笔记,本次软工课邓老师推荐的第一篇读书笔记也是写的《人月神话》,算是对它“耳濡目染”了。本周,我终于抽空读了这本书,感觉确实名不虚传。以下,我将从几方面谈谈我的感想。
一、焦油坑与银弹
书中将大型项目形象地比作焦油坑,开发者往往在巨大的项目里遇到纷繁复杂的问题,并在其中越陷越深,难以掌握全貌和本质。在我看来,软件的开发确实存在其固有问题,在一个开发团队开始挖坑时,由于思路的些许偏差、交流和认知水平的些许欠缺或分歧,都会为将来项目的混杂、纠结埋下伏笔。在本次结对作业和单人作业中,我仅仅写了数百行代码,就已经面临这样的“焦油坑”问题:陷于细节,难以掌握整体开发思路。在写某个具体功能的函数时,我时常需要上下拉动滑条,阅读之前写的更高层次或更低层次的函数,以尽量保证其功能符合预期。有时一疏忽,就会把已经在其他函数中实现的某功能在这一函数中添加,导致多次处理、结果血崩。而大型项目的开发中,代码量是我的简单工程的数千数万倍,通过浏览相关函数来保证不出bug显然是非常困难的,加上不同开发人员之间理解、思路的差异,隐含的问题就会越来越多,最终形成“焦油坑”。避免这样的焦油坑的办法,据我所知有单元测试以保障代码层面正确性、每日立会以保障成员交流协调等,总而言之,防患于未然,时刻警惕才能避免项目变成一团乱麻。
而银弹,则出自于另一个比喻:软件开发如同狼人,银弹便是解决狼人的杀手锏,能大大提高软件的开发效率。作者认为这样的银弹并不存在且未来一段时间内不会出现。而在我看来,作者在书中已经提供了很多种“弹”,虽然没有“银弹”那么行之有效,但也能极大地降低“狼人”的威胁。比如勤于交流、统一设计、编码规范等等。在结对作业中,我们定下的编码规范是默认VS自带的缩进风格与编码风格,大括号不换行,算是非常粗糙简陋的规范,但总比没有要好。交流方面,我们几乎每次编程都约在一起,保证相互之间都能清晰掌握整体思路和每个函数的功能。通过这些方式,我们在小小的范围内还算顺利地避免了作者提到的诸多大坑。而对于需要多人协作的团队项目,这样的沟通交流需要的时间成本会几何倍数增加,效果也会变差,如何平衡效率与团队交流、团队规范,是一门永恒的课题。总而言之,虽然“包治百病”的银弹短期内难以实现,但“铅弹”“铁弹”之流已经普及开来,用好子弹对抗“狼人”,是每个团队必须做好的工作。
二、人的作用与时间进度
书中反复强调了人在软件工程中的作用。人,包括队伍结构、人手安排等。作者着力推荐了“外科手术团队”和“贵族式系统设计”,简单来说就是对于小项目,团队应当“小型、精干”;对于大项目,团队应该设定“小型、精干”的总设计组。这是因为精英程序员的效率远高于一般程序员,在他们的引领下才能有效率地实现项目。在我看来,这样的举措是比较科学的,在我们的团队作业开发中,比较有经验、知识面广的同学负责团队整体的设计和引领,具体功能实现交给其他同学完成,“小而精”的统一开发设计可以减少很多不必要的讨论和交流时间,更高效地完成任务。同时,我们保底每周开会一次,确保任务的推进顺利和组员之间的交流,避免闭门造车、自成一派等不和谐现象。
时间进度则直接关系到项目的完成度和对组员的推动力。好的时间进度安排能让项目顺利进行、如期交货,也能不断push团队成员完成任务;不够好的时间进度安排轻则导致项目延期、成员消极怠工或揭竿起义,重则导致项目流产、团队分崩离析。在结对作业中,我们没有设置非常明确的时间进度,常常走一步看一步,好在项目工程量很小,这样做也没有出大BUG,最终还是如期完成了,但较大项目里若缺乏总体时间规划,往往只能走向失败。需要指出的是,此次作业老师险些安排同学们重写测评,给了同学们过大的push力,结果同学们纷纷反对,最终改为比较适当的收获总结作业。我认为合适的时间安排非常必要,不但要考虑工程进度,还要联系团队成员的实际情况,进行人性化调配。倘若只顾push,甚至要求成员顶着学业、考试压力仍然“出货”,往往只能适得其反。
总而言之,《人月神话》一书包含了软件开发中可能遇到的种种情况,蕴含着许多令人称道的精髓思想,读之受益匪浅。