什么是”第二个系统“?
这是一个有趣的概念,简单描述下:
“
当在开发第一个系统时,程序员倾向于精炼和简洁。因为他知道自己对正在进行的任务不够了解,所以他会谨慎仔细地工作。
在开发第一个项目时,他会面对不断产生的装饰和润色功能,这些功能当时都被搁置在了一边,作为“下一个”项目的内容。
第一个项目迟早会结束,而此时的程序员,对这类系统充满了十足的信心,熟练掌握了相应的知识,并且时刻准备开发第二个系统。
第二个系统是程序员所实践的最危险的系统。原因是 一种普遍倾向是过分地设计第二个系统,曾在第一个系统中被小心谨慎地推迟的修饰功能和想法终于得以用武之地了。
而当他着手第三个或第四个系统时,先前的经验会相互验证,得到此类系统通用特性的判断,而且系统之间的差异会帮助他识别出经验中不够通用的部分,开发起来也会更游刃有余。
我自己的一点感受
在近期Go语言编程的学习过程中,我一直在构思我的最终目标:做一个自己的随笔APP。
1)每学习掌握一部分后我就会做一个练习的Demo,功能虽然简单,重在练习
2)在此过程中,我产生了各种各样的idea,这个功能可以这样用,还可以和这个一起用。甚至想好了以后哪些场景会用到,哪些功能应该设计在哪些模块下面。
3)直到我正式动工,发现好多页面最终没有多大作用,甚至有些鸡肋,在此过程中我总考虑如何去做减法。
4)于是开始了第二版,最终证明就我之前构思的功能点,有些是没有必要的,面对一团糟的代码,我选择了删除重来。
5)后来,甚至到了第三版,才真正搞定...
第二个系统效应(second-system effect)
与纯粹的功能修饰和增强明显不同,也就是说存在对某些技术进行细化、精炼的趋势。
在完成一个小型、优雅而成功的系统之后,人们倾向于对下一个计划有过度的期待,可能因此建造出一个巨大、有各种特色的怪兽系统。第二系统效应可能造成软件专案计划过度设计,产生太多变数,过度复杂,无法达成期待,并因而失败。
第二个系统效应
有趣的,有创意的不一定是好的。过多的功能反而会使一个系统过于臃肿,那反而是对于时间和人力的一种浪费。
如何解决?
关于第二个系统效应(second-system effect) 如何解决,这个问题换个说法,就是程序员如何避免画蛇添足?
- 需要承认我们都无法跳过第二个系统这个过程。
- 运用有意识的自我约束,来避免那些功能上的无谓修饰;根据系统基本理念及目的,舍弃一些累赘的功能设计方案。
- 至少拥有两个系统以上开发经验的架构师指导,保持对过度设计诱惑的警觉,他们可以不断提出正确的问题, 确保原则上的概念和目标在详细设计中得到完整的体现。