1.关于银弹
我个人倾向于认为是不存在银弹的。正如Brooks所说:“The complexity of software is an essential property, not an accidental one.[1]”,科学研究中可以通过降低复杂性来探寻本质的前提是本质是简洁的,不复杂的,而偏偏软件的本质之一就是复杂。由复杂性衍生出的沟通成本,可扩展性问题也是深有体会。我所在的烫烫烫烫烫团队并没有遇到这些问题,这要归功于我们有一个尽职尽责的PM。准时制定好接口标准,经常沟通技术细节,确保不产生误会。开发icourse课程平台的过程中遇到的可扩展性的问题也不是很严重,也许是我们的软件规模不算大吧。软件其他的一些本质特征conformity, changeablity和invisiblity也都十分棘手。至于Cox的文章中提到的所谓银弹——面向对象[2],感觉像是在鼓吹面向对象,和面向过程相比,面向对象确实有很大的优势,但同样并没有解决Brooks所说的软件本质难题。
2.关于大泥球
我们的项目没有大泥球,这可能和我们的开发人员良好的编程习惯以及使用了django框架有关系,保证代码质量,降低代码量,避免了大泥球的产生。我倒是遇到过一次大泥球,假期和安万贺同学一起开发一个需支持访存任意延时的cpu,为此特意将计组的五级流水改成了七级流水,又添加了一大堆机制来确保指令执行顺序正确,因为添加的时候比较随意,没有遵循一个固定的标准,功能测试到最后就陷入了解决一个bug,紧跟着产生了好几个bug,感觉陷进去了出不来,一度十分绝望,后来调整思路,不对某个点某种错误情况做处理,而是理清这个点的处理逻辑并简化,解决了大泥球的问题。
3.关于大教堂和集市
我们开发的模式属于“集市”模式,每次更新都会push到github上。因为我们开发的是一个网站,用户不必下载,因此免去了安装时各种依赖的一系列风险,但是我在测试过程中确实遇到了这个问题。功能测试一开始选用的是selenium,对每一种浏览器,都有一个单独的webdriver,每个webdriver的系统配置也不一样,更致命的是,firefox浏览器保持着极快的更新速度,火狐浏览器插件selenium IDE永远不兼容最新版本的firefox浏览器,这就导致了在alpha阶段初期我在配置自动化测试环境的时候举步维艰,最后只好采用旧版firefox,才满足了兼容性。
4.关于worse is better
很遗憾,第一篇文章加载不出来,于是我只好阅读第二篇文章。我认为这应该是一个辩证的问题,Richard P. Gabriel指出worse-is-better可以加快开发速度,对程序员能力要求不高,让编程人员聚焦于软件的performance[3]。我认为这可以最大限度地保证软件满足可使用的最低要求,但是遵循这个理论产生的软件性能上不会很好。所以我认为worse-is-better在满足用户基本需求方面是有优势的,但在性能方面与the-right-thing相比是有劣势的。
5.关于瀑布模型
特点:为软件开发提供了一个模板,指导每一个过程的进行,每一个过程都为前一过程提供反馈,当软件开发走过 Winston W. Royce所讲的五步后,水到渠成的就产生了一个软件产品。
第二篇youtube链接指向的文章无法加载……
6.关于敏捷开发
我们团队在开发之前将阶段目标切分成以天为单位可实现的小目标,冲刺阶段每天进行scrumMeeting,团队成员及时沟通,确保网站每天都可以build,根据当天进度和效果调整第二天规划,完成一个功能,测试一个功能,遇到困难较大的地方果断绕过,确保如期完成开发。
我认为敏捷没死,Dave Thomas声称的敏捷已死是源于他对敏捷精神的狭义定义,而文章[4]认为敏捷未死的原因是敏捷的精神仍然有价值,只是没必要拘泥于宗教般的形式。我认为不应该接受变化,只要这个模式能创造出价值,就是可以接受的,没必要追求这个模式才产生价值的过程中一点都不改变,黑猫白猫,能抓到耗子就是好猫。
7.关于软件工程的方法论
文章[5]和下面的第一条评论都认为方法论只不过是达到目的的一种手段,证明方法论是有效的是十分困难的,很难下定论一种方法一定比另一种方法好。我也认为所谓方法的价值在于结果的价值,能做出成功的产品的方法理应得到肯定,盲目坚持固定的方法是无意义的。我感觉多学习一些方法是有必要的,如果尝试的方法work,那没问题,对软件开发有好处,如果不work,就果断放弃,有一个错误的方法不如没有。
8.感想
这一学期学到了不少,因为我在团队项目中做的是测试工作,在测试这方面感受尤其之深。从前不了解测试,不觉得测试有多重要,后来读了《构建之法》,发现测试好多啊,这么多种类的测试,每一种都有它的道理,也产生了一种误解,就是不做完林林总总的测试就不能保证软件的质量,不过随着项目推进,alpha和beta两个阶段之后,我发现测试其实是很灵活的,一切测试的目的都是为了保证软件的质量,林林总总的测试也不是同等重要的,像功能测试,负载/压力测试就比较重要,一个确保软件的正确性,一个用来测试软件的效能。这一学期的学习带给了我一次宝贵的经历,希望以后能够在软件团队中最大地发挥自己的作用。
参考链接
[1]http://www.cs.umd.edu/class/spring2003/cmsc838p/General/NoSilverBullet.html
[2]http://www.drdobbs.com/there-is-a-silver-bullet/184407534/
[3]http://dreamsongs.com/Files/IsWorseReallyBetter.pdf
[4]http://nic.ferrier.me.uk/blog/2014_11/responding-to-anti-agile
[5]https://dzone.com/articles/jez-humble-why-software