第三章:工作代码是不够的(战略与战术编程)

好的软件设计中最重要的元素之一是您在执行编程任务时所采用的思维方式。

从长远来看,战略方法可以产生更好的设计,且实际上比战术方法便宜。

在重构中提到过对于价值有两个层面,业务价值和系统价值。
业务价值表明了其在市场环境中能产生的价值,给用户带来的价值
系统价值则有一部体现在复杂度上,是否方便开发理解。未来扩展性等。好的系统价值能为开发加速。更像是战略层面关注的价值。

战术编程

大多数程序员以我称为战术编程的心态来进行软件开发。但是,战术编程几乎不可能产出良好的系统设计。

战术编程的问题是它是短视的....有一个艰难的期限。因此,为未来做计划不是优先事项。不会花费太多时间来寻找最佳设计。

这就是系统变得复杂的方式....复杂度是递增的。不是使系统复杂的特定事物,而是数十或数百个小事物的积累....复杂性迅速积累,尤其是如果每个人都是在战术上进行编程的时候。

某种程度上技术方案的评审上需要区分出这个方案是战术编程还是战略编程。
如果是战术编程,则需要在后面抽出一部分时间进行补漏,防止此次遗留问题导致后续系统开发不下去了。

几乎每个软件开发组织都有至少一个将战术编程发挥到极致的开发人员:战术龙卷风。
战术龙卷风是一位多产的程序员,他抽出代码的速度比其他人快得多,但是完全以战术方式工作。
在某些组织中,管理层将战术龙卷风视为英雄。但是,战术龙卷风留下了毁灭的痕迹。
通常,其他工程师必须清理战术龙卷风留下的混乱局面,这使得那些工程师(他们是真正的英雄)的进步似乎比战术龙卷风慢

回顾自己的开发经历,发现自己之前都是战术编程,为了完成当期的工作需要,虽然会增加一些自认为扩展的东西,但是基本都是战术龙卷风式的开发。快速完成战斗任务。而且在早期开发经历中如果其他同事发现不了,基本成为了遗留的坑。但是从产出上看,效率非常高。这对于公司对于这一块的宣传和执行是非常大的考验

成为一名优秀的软件设计师的第一步是要意识到仅工作代码是不够的。引入不必要的复杂性以更快地完成当前任务是不可接受的。最重要的是系统的长期结构。
任何系统中的多数代码都是通过扩展现有代码库编写的,因此,作为开发人员,最重要的工作就是促进这些将来的扩展。

战略规划

战略性编程需要一种投资心态。您需要花费时间来改进系统的设计,而不是采取最快的方式来完成当期的项目。

一些投资将是积极的。

  • 花一些时间为每个新类找到一个简单的设计。不是实施想到的第一个想法,尝试集中替代设计并选择最简洁的设计
  • 试想一下将来可能需要更改系统的几种方式,并确保设计容易
  • 编写好文档是主动投资的另一个例子。
    思考
第二点在平衡未来系统更改的方式,并遗留扩展点上,极其困难,这需要基于对于系统的理解和对业务的理解。有时会碰到系统上留了扩展的口子,发现业务上并不会需要,导致白白增加了系统的复杂度。

发现设计问题时,不要只是忽略它或对其进行修补。花一些额外的时间来修复它。如果您进行战略性编程,则将不断对系统进行小幅改进。

修补和修复是两个词语。需要严肃的区分它们俩的差别。

投资多少?

随着您对系统的了解,理想的设计趋于零碎出现。因此,最好的方法是连续进行大量小额投资。
建议您将总开发时间的10%到20%用于投资。该金额足够小,不会对您的日程安排产生重大影响,但又足够大,可以随着时间的推移产生重大收益。

您过去的投资的收益将节省足够的时间来支付未来投资的费用。

仅用于定性说明

之前遗留开发时间,是为了方式需求变动导致项目延期的。但是以后需要考虑增加开发时间用于设计和分析现有的系统和改造的。为未来投资

创业与投资

在某些环境中,强大的力量与战略方法背道而驰。
早期的初创公司感到巨大的压力,需要尽快发布其早期版本....甚至10%到20%的投资似乎也负担不起....采用了战术性的方法,在设计上花费了很少的精力,而在问题发生时则花费更少的精力进行清理....如果成功,他们将有足够的钱聘请额外的工程师来清理问题,从而使其合理化。
一旦代码库变成了意大利面条,几乎不可能修复。您可能会为产品的使用寿命,付出高昂的开发成本。此外,好的(或坏的)设计的回报很快就会到来,因此战术方法很有可能甚至不会加快您的首个产品发布的速度。

要考虑的另一件事是,公司成功的最重要因素之一就是工程师的素质。降低开发成本的最佳方法是聘请优秀的工程师:他们的成本不会比普通工程师高很多,但是生产率却高得多。但是,最好的工程师对良好的设计感兴趣.....结果,您最终可能会遇到普通的工程师。这将增加您未来的成本,并可能导致系统结构进一步退化。

良好的系统设计才能吸引和留下优秀的工程师。糟糕的系统设计只会带来难以扭转的负向循环。

Facebook是一个鼓励战术编程的创业公司的例子。多年来,公司的座右铭是“快速行动并打破困境”......最终,Facebook改变了座右铭,即“以坚实的基础架构快速移动”,以鼓励其工程师在良好的设计上进行更多的投资。

幸运的是,通过战略方法也有可能在硅谷取得成功。Google和VMware.....都采用了更具战略意义的方法。

一家公司可以成功使用任何方法。但是在一家关系那软件设计并拥有清晰代码基础的公司中工作会有趣得多。

总结

好的设计不是免费的。它必须是您不断年投资的东西,这样小问题才不会累积成大问题。幸运的是,好的设计最终会收回成本,而且比您想想的要早

好的设计与过度设计如何把握