《没有银弹》软件开发中时间耗损的可以被分为 2 个范畴:必要耗损和意外耗损。
其中必要耗损:
软件复杂度带来的学习成本
软件作为人类思维的产物,不直观
意外耗损:
产品设计随意性带来的实现成本(不考虑基础架构能力,随即给出设计,只能给出一些临时解决方案)
需求变更
对于软件生产活动中的必要耗损似乎没有什么特别好的解决方案,但 30 年前作者就提到了一点,让我非常吃惊:
产品复杂的配置、开发环境搭建已经成为了很多人的痛点,以我目前的公司为例:
rails 相关的项目有 4 个,其中涉及不同版本的 ruby(ree & ruby 2),这些项目直接存在业务上的耦合,以及 url 之间的复杂跳转
还涉及一些非 ruby(java 等)语言开发的模块(3 个)
这样的产品结构对技术人员,尤其是新入职的技术人员提出了非常高的挑战。
从团队整体效率来看,搭建一个完整环境变得那么的奢侈,但又不得不承认:完整的开发环境对于 debug、开发、开发后自测,甚至质量保证人员都具有很大的价值
从大项目的角度看,要求每个人对产品业务及实现都了如指掌可能是个伪命题,通常来讲大家都只能关注与产品的一些点,每次开发也都只涉及一些子模块
从而一个标准化的开发环境变得至关重要,它应该满足以下条件:
稳定:稳定是第一位的,当开发一个模块的时候,整体环境的其他部分应该能够正确运行
灵活:同一个程序员的工作有时候会涉及多个子模块,应该要做到“想开发谁,就能够迅速搭建起来相应的环境”
成本:成本要可控:标准化开发环境的好处在于能保证较好的机动性,人力成本也随之降低,降低的人力成本也减少了代码混乱的风险
我们采用 vagrant 封装了一些统一的工具,并用 docker 来运行相应的代码