生物的适应性
适应可以指生物族群经过演化而得到的为了在环境生存的特征,或个体长时间曝露后经由性状的可塑性提高其适应度。
在英语里,前者称adaptation,后者称acclimatization。adaptation是指生物个体的生理或行为特征,经过了长时间的天择作用之后,在某个环境下能够顺利的繁衍,并增加数量,发生在族群的层次。acclimatization发生在个体内。例如,平地人到高山住一段时间后,红血球数会提高。养鱼的人帮鱼换水时会一次换一部分,就是为了配合鱼适应不同水质的所需的时间。
在编写软件时,几乎每增加一个功能,都会降低它的应变性,让它以后更难被修改。因此,以怎样的方式给既有软件添加功能,变成了一件需要仔细考虑的事情。程序员的设计决策,严重影响了维持特定软件规模所需的心智复杂度。我们不妨进行这样的类比,把软件看做在其生命周期内的一个活的生命体。在成长过程中,它经历了各种环境变更,但必须想办法活下来。而编写软件,就好像在持续培植一个这样的生命。
这样思考给我们带来很多启发,我们应该怎样设计软件才能使它更具有适应性呢?我们应该以怎样的开发模式,才能更快的响应环境的变更呢?
柔性和敏捷
Steve Yegge在讨论Google平台时,将Google+与Facebook进行了对比。他认为Google+团队错误的以为Facebook之所以成功是因为人家做了一个好产品,而实际上是因为Facebook通过让其他人参与进来的方式,搭建起一整套各异的产品。Facebook上有成百上千种消磨时间的好去处,所以才能满足所有人。而Google+团队看到这个后说:“天哪,看来我们也需要游戏。我们去找人来帮我们写游戏吧。”问题就在于Google+在试图预测人们想要什么,然后再实现它。
或许我们真的不该去预测需求将如何变更,或许我们该思考,怎样设计可以让软件更容易应对变更,怎样设计便于让其他开发者参与进来。这并不是一个新的想法,为了使项目能够随着开发工作的进行加速前进,而不会由于它自己的老化停滞不前,设计必须要让人们乐于使用,而且易于做出修改,这就是柔性设计(supple design)。
早期设计版本通常达不到柔性设计的要求,由于项目的时间限制和预算的缘故,很多设计一直就是僵化的。但是,当复杂性阻碍了项目的前进时,就需要仔细修改最关键、最复杂的地方,使之变成柔性设计,这样才能突破复杂性带给我们的限制,而不会陷入遗留代码维护的麻烦中。
为了应对快速变化的需求,从1990年代开始逐渐引起广泛关注的一些新型软件开发方法——敏捷开发。相对于“非敏捷”,它更强调程序员团队与业务专家之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发过程中人的作用。
锻炼设计能力
和其他行业一样,软件工程师的水平也是参差不齐,有些人可能还不胜任软件的设计工作。于是,很多团队进行了这样的划分,让一些专家程序员去开发可复用的组件或框架,然后让那些暂不胜任的程序员们“傻瓜式”的使用它们。
不幸的是,这种态度可能会导致失败,因为严重低估了应用程序开发的难度,开发软件是一个处处需要设计的工作。Eric Evans指出,如果这些人在设计方面不够聪明,就不应该让他们来开发软件。如果他们足够聪明,那么用“傻瓜式”的框架来应付他们只会为他们造成障碍,使他们得不到所需的工具。
因此,我们应该把精力放在设计上面。如果还不胜任设计的工作,最紧急的应该是去学习如何进行设计。毕竟,在一条错误的路上走的越远,以后纠正起来就越困难。
Mark Zuckerberg:对于招聘,我创立公司的时候只有19岁,所以我不可能觉得经验是个非常重要的事情,不然我就会怀疑自己了。所以,我们在那些我们认为有天分的人身上做投资,哪怕他们毫无经验。我觉得最重要的是,不要觉得只有有过经验的人才能把某件事情做好。
参考
适应
敏捷软件开发
领域驱动设计 - 不要编写“傻瓜式”的框架 - P344
程序员的呐喊 - 吐槽Google平台 - P184