前言
软件交付工作充满了各种各样的取舍,这是参与其中的每个人都无法回避的挑战。我们经常面对有限的项目周期、“捉襟见肘”的预算、陌生的领域。因此,我们当下做出的任何一个软件设计决策都会对软件的未来产生影响,譬如系统维护的过大开销、软件需要变更时才暴露的僵化设计、软件需要扩展时才发现的性能瓶颈,诸如此类林林总总的问题。我们必须认识到一点,即任何一个取舍结果都是特定条件的产物。我们很容易评判之前的软件设计在设计之初缺乏对上下文的充分了解。显然,设计时我们了解得越多,分析得越深入,我们对所做决策的利弊得失就越了然于心。
我们亲自主持和参与了许多软件设计决策,对这些决策背后所隐含的权衡与取舍逐渐熟稔于心。在此过程中,托马斯开始撰写个人对软件设计决策日志,记录下我们当时做出某个决策时的来龙去脉,如软件设计决策的背景是什么,有哪些替代方案,我们是如何评估某个特殊方案的,我们最终采用了什么样的解决方案,对某个解决方案我们是否成功预测了所有可能的利弊,我们对某些情况是否也感到惊讶,等等。事实证明,这份个人经验教训清单所涵盖的内容包含许多软件工程师需要解决的问题、需要面临的取舍。托马斯认为现在是一个与世界分享这些知识的绝佳时机。这就是本书的写作初衷。
通过本书,我们想分享我们从各种软件设计中收获的经验与教训,如单体系统、微服务、大数据处理、库等的设计经验与教训。本书深入分析现实软件设计中的决策、权衡和教训。通过分享这些设计模式、错误决策以及惨痛教训,我们希望能帮助你拓宽视野,升级你的工具箱,帮助你在日常工作中做出更好的决策。提前发现软件设计中潜在的问题以及局限,可以在未来帮你节省大量的时间和金钱。我们不会试图给你明确的答案。对于很复杂的问题,解决方案往往不是唯一的。我们将分享一些具有挑战性的问题,并提出一些没有明确答案的问题。关于这些问题的每种解决方案都有其优缺点,我们会做针对性的分析。每选择一种解决方案都意味着需要做出取舍,你需要判断到底哪一种最适用于实际情况。