在一名软件工程师的职业生涯中,总要在技术问题上面对做决策的艰难时刻。而有的开发者会因为经验不足,或者在紧迫的时间限制下,用拍脑门的方式来做决定,结果往往是差强人意。要不要写测试代码:项目周期紧,要是写测试代码就赶不上发布,不写测试代码,项目质量又没保证。
架构:是单体、分布式,还是微服务;是用开源软件做二次开发还是纯自研;是用 SQL 数据库还是 NoSQL 数据库。
技术选型:后端开发是用 Node.js、Java 还是 Python;是面向对象编程、函数式编程,还是响应式编程;又出来个新技术框架,要不要赶紧用上……
诚然,如果工期充裕、人员到位、资源齐全,那决策环境就太理想了。可现实从来不是这样,你总要在老板的催促与完美的代码之间做出取舍。而拍脑门其实就是在向看起来更易达成的方向妥协,最后却造成工期延误、用户体验差、代码难以维护等问题。不用!有两位技术大神对自己多年工作经验进行总结提炼,将遇到的典型技术问题以及决策过程写在了《软件开发中的决策:权衡与取舍》这本书中,帮助程序员在困境中做出最优选择。我们先来看一下,这两位技术大神在踩坑后是怎么做的。本书两位作者是托马斯·莱莱克(Tomasz Lelek)与乔恩·斯基特(Jon Skeet),他们当然不是第一天出来工作写代码,就知道怎么做出正确决策。他们也会掉坑,但他们从坑里爬出来后进行了积极地反思与总结,并将经验和教训记录下来。托马斯就展开了个人对软件设计决策日志的编写,记录当时做出某个决策时的来龙去脉,如软件设计决策的背景是什么,有哪些替代方案,如何评估某个特殊方案,最终采用了什么样的解决方案。日积月累,这份详细的经验教训清单,涵盖了许多软件工程师需要解决的问题、需要面临的取舍场景。这里面包含了单体系统、微服务、大数据处理、库、代码设计、API等的设计经验与教训。这不仅是两位作者的宝贵技术财富,分享出来可以成为更多程序员的技术决策指南。两位技术大神在书中表达了这样一个观点:任何一个取舍结果都是特定条件的产物。众所周知,软件工程领域没有“银弹”,在面对技术难题的时候,也没有“一招鲜,吃遍天”的解决方案。程序员应当意识到,脱离问题的实际场景讨论如何决策都是不现实的。所以,程序员在学习这本书的时候切忌生搬硬套,要立足于自己的问题本身,学会作者分析问题、解决问题的思路,掌握决策的精髓。书中也说明了,对于有挑战性的问题不会给出明确的答案,在经过学习之后,读者需要自己判断到底哪一种最适用于实际情况。两位大神技术过硬,参与了多个重大项目的开发,我们来认识一下他们。托马斯·莱莱克 现就职于 Dremio,负责创建现代大数据处理的数据湖解决方案。他精通多种编程语言(大多数基于 JVM ),设计并开发过各种各样的生产服务、软件架构。他设计的工具帮助成千上万的开发者设计出性能优异、用户友好的 API,发挥了重要作用。他为 Java-Driver、Cassandra Quarkus、Cassandra-Kafka Connector 以及 Stargate 都贡献过代码。乔恩·斯基特 曾被IT World 评为“世界上15位最伟大的程序员”之一,是Stack Overflow 总排名第一的大神。他是谷歌公司资深开发工程师,目前的工作方向是谷歌云的 .NET 客户端库。他向开源社区贡献了 .NET 版本的 Noda 时间库,乔恩的代表作是C# in Depth。现在,跟随两位技术大神来学习软件开发决策之道吧。
本书的核心在于帮助读者理解软件开发中的复杂性,以及如何在不同的设计方案之间权衡并做出选择。书中详细讨论了代码重复、异常处理、API设计、性能优化、数据处理、第三方库使用、分布式系统设计等多个方面的决策,并提供了实际的解决方案和权衡策略。本书开篇介绍了软件决策分析的方法论,为读者提供了一个框架,用于评估软件开发中的不同选择和潜在后果。
从软件架构、代码以及质量保证等方面,举例说明如何进行权衡与取舍。
这部分深入探讨了代码重复的影响、异常处理模式,以及如何在代码和 API 设计中平衡灵活性和复杂性。讨论了代码重复与系统耦合的关系,并分析了异常处理的最佳实践和反模式。
讨论了性能优化的时机和方法,以及是否要在早期进行优化,并介绍了如何识别和优化代码中的热路径。还演示了如何利用帕累托法则帮助定位系统中适合进行优化的部分。
专注于如何设计对用户体验友好的 API,探讨了为了获得良好的用户体验而需要付出的维护成本,并分析了不同设计方案的权衡。
这部分介绍了日期和时间数据的处理,以及数据本地性在大数据处理中的重要性。书中详细讨论了日期和时间信息的处理,还探讨了数据分区和流量分配的策略。
说明了将第三方库导入代码库时需要考虑的因素、可能引发的问题及权衡与取舍。讨论是应该导入一个库还是重新实现它的一小部分的问题。
这部分深入探讨了分布式系统中一致性与原子性之间的权衡,以及如何处理分布式系统中的传输语义。分析了分布式系统中可能发生的竞争条件,帮助读者理解分布式系统中不同的传输语义。
讨论了软件、API 以及存储数据是如何随时间发展、演进的,并介绍了它们如何在保持与其他系统的兼容性的同时做到这些。
讨论了紧跟 IT 行业的最新技术趋势可能并不总是明智的选择,分析了一些广泛使用的模式和框架,并讨论了这些技术在特定场景的适用性。
至此,读者在实际工作中能够识别陷阱并采取合适的编程决策,从而构建更高效、更稳定和更易于维护的软件系统。
本书英文原书名是Software Mistakes and Tradeoffs,Mistakes 可以理解为软件中的那些陷阱,也就是作者们曾经掉过的坑;而 Tradeoffs 就是权衡,需要全面考察才能做出合理决策。这本书来自作者一线开发的教训与经验,可以指导程序员在开发工作中避免走弯路,直接找到最优的选择。本书一大特点是内容全面,深入探讨了代码重复、异常处理、API设计、性能优化等关键领域,还涵盖了分布式系统设计、数据处理、第三方库管理等高级话题。每一章都独立而深入,提供了丰富的技术细节和实践建议,使读者能够快速将书中的知识应用到项目中。另一大特点是实战性强,每一部分都以实际问题开篇,逐步引导读者理解问题的复杂性,并提供解决方案。书中的代码示例和案例分析不仅增强了理论与实践的结合,也为读者提供了实际操作的模板(书中提供了示例代码下载地址)。对于书中大量的的示例代码,作者们进行了精心的编排与设计,根据谷歌代码指南,使用自动化插件进行了格式化。许多代码清单都附有代码注释,对重要的概念进行强调。本书使用的所有代码都有大量的单元测试和集成测试,确保了代码的质量。本书适合的读者人群包括中高级开发人员、架构师,以及对软件设计和开发感兴趣的自学者。无论是刚刚步入职场的新手,还是经验丰富的老手,都能从本书中获得新的洞见和启发。不要再拍脑门做决策了,学透《软件开发中的决策:权衡与取舍》,就能轻松做出最优佳选择!在留言区留下你想解答的问题,并点击在看和转发活动到朋友圈,我们将选1名读者获得e读版电子书1本,截止时间11月30日。