对于软件开发哲学的经验谈
"确认你已经理解问题, 由小型的有才干的团队来实现解决方案, 并且让你的客户告诉你如何改进它. 这就是全部; 其他的都是注解."(软件开发哲学,摘自<<Clouds to Code中文版>>)
做了这麽久的开发,看到这个开发哲学,真是很贴切,软件开发的几大要点概括的淋漓尽致.
"确认你已经理解问题" 即需求问题,宏观上为软件的商业目的,微观上为每个功能需求的理解与分析,根据我的开发经验,就是要获取需求并且正确的理解它,我们往往对需求的问题不能够达到全面的理解,大多数情况都是处在一知半解的状态,各种情况导致获取的需求并非真实有效,分析其原因主要有3点:
1.客户对需求也不能完全解释的清楚
2.业务逻辑确实很复杂,相关联系繁多,造成理解上会达到理解问题的限制(5~7个关联复杂性,超过就不易理解)
3.需求的获取,设计到实现的各个阶段出现了偏差,更严重的情况是无法追溯到原来提出的真实需求而造成的缺陷.
4.需求在软件开发过程中,客户实际情况已经变更,或是客户改变了原先的想法而造成的需求变更
解决这些矛盾的方法很多,主要在于需求开发的经验,设计开发的经验,团队的合做,有效全面及规范的需求记录与追踪,以及各阶段追溯到需求的评审等来保证我们对需求的理解.
"由小型的有才干的团队来实现解决方案" 即团队合做与开发技能的问题.
高品质的团队一直是成功的软件开发的保证.否则软件开发很容易陷入绝境.
至于团队,以我的经验主要提出几点看法.
1.保证的团队稳定性
团队的核心成员要稳定,例如一个团队一定要确认哪几个是团队的核心,在软件的开发周期内一定要保证这些核心人员的稳定性,最好是不只是在一个项目周期,而是在组织面上也保证此团队核心成员的稳定性,这样才能够使得团队不断进步,积累经验,更重要的是合作的有效性,要知道一个人员更新频繁,或是刚刚组建的团队效率与合作性都是非常差的,需要很长时间的磨合与锻炼,但往往会导致软件开发的失败,因为在你为建立新团队的有效合作与开发过程的同时,软件的开发已经错误百出,种下了失败的种子,后面再想补救的代价就太高了.所以建立稳定的开发团队是软件开发的有效保证.
2.合理有效的团队发展规划.
1).明确有效的团队目标.为团队设立一个明确有效的目标,让团队中的核心成员都能够一致的认同这个目标,并且将此目标与其自身的发展相互联系,给每个人前进的动力与希望.这也是团队稳定性的重要保证,没有一个一致目标和奋斗方向的团队,很难有凝聚力,也更不会成为一个高品质的团队.
2).团队成员合理的互补性.
我们要设定团队成员各方面能力的基准线,每个成员不能低于这基准,否则会影响团队的整体实力.
在此基准线上我们并不要求每个成员在各方面都优秀(这也是很难做到的),但一定会要求每个成员在某一个方面能力高于基准线,这样才能根据特殊能力来建立互补性的团队.
例如:开发团队管理者要达到分析,设计,编码,等工作能力的一个基准线, 在此之上他的管理能力一定是高于基准线之上,具备优秀管理能力的人.而不是让一个各方面平庸或是其他能力(如他的编码能力优秀)的人来充当管理者的角色. 这样让在各个方面的工作,都能够找到在此方面优秀的人来执行,以达到建立互补性的团队的目的.
同时团队成员在此基础上又能够在各方面得到向他人学习提高的机会,以提高团队能力的基准线,达到团队发展的目的.
3).其他辅助性的策略与制度也不容忽视.
首先,团队内部要有一个公平,公正的氛围,每个人的能力,业绩与其获得的回报和在团队中的位置要相互一致,形成一个良好的团队发展环境.
第二,在保证核心成员稳定的同时,合理的团队流动性也是必要的,因为不能保证团队每个成员都能够达到团队的发展要求,所以将不适合的人员替换出去,再吸收新的成员,发展优秀的成员成为核心人员,以发展壮大团队,并形成良好的团队新陈代谢的模式.
第三,获得管理层对此团队的认同,鼓励团队的变革,鼓励创新,愿意承担相应的风险,也是关系到团队是否能够发展的一个非常重要的因素,这也要求团队要不断的获得成功,创造业绩,及良好的沟通来获得管理层的支持.
"并且让你的客户告诉你如何改进它" 这里我的理解不仅仅是客户,而且也包括市场
开发好的软件,最重要的目的是达到客户的需要,以及市场的需要.让客户与市场来引导我们软件的开发方向是软件获得丰厚收益的重要保证,也是软件开发的重要目标.当然这也是建立在我们能够正确的理解客户的需求与市场的需求的基础之上的.
"这就是全部; 其他的都是注解." 这里我的理解是软件开发要以上面所提到的需求,团队,客户与市场为主要关注点,而对于其他辅助性的方面,如过程改进,检查与监测等都是实现主要关注点的有效工具与过程,要分清主次,不要一味的盯在这些辅助性的工作方面,而忽视了软件开发成功的真正关键. 根据经验,如果软件开发时在还未理解需求,又没有良好的开发团队,客户与市场也模糊不清时,而相反却去注重文件表单规范,过程改进,ISO或CMMI等等相关的事务,这样试问就算这些做的再好,我们的软件开发能够成功吗.要分的清主次,合理应用其他辅助性事务,才是正道.
综上所述,我对软件开发的经验之总结, 软件开发需要以客户与市场为导向理解软件真正的需求,利用高品质优秀的团队进行开发,以达到获取最大商业利益的目的.