找到最优解:详解软件工程师的开发决策方法论

B站影视 2024-12-17 11:09 9

摘要:在一名软件工程师的职业生涯中,总要在技术问题上面对做决策的艰难时刻。而有的开发者会因为经验不足,或者在紧迫的时间限制下,用拍脑门的方式来做决定,结果往往是差强人意。

在一名软件工程师的职业生涯中,总要在技术问题上面对做决策的艰难时刻。而有的开发者会因为经验不足,或者在紧迫的时间限制下,用拍脑门的方式来做决定,结果往往是差强人意。

我们来看一下程序员需要决策的典型场景:

要不要写测试代码:项目周期紧,要是写测试代码就赶不上发布,不写测试代码,项目质量又没保证。架构:是单体,分布式,还是微服务;是用开源软件做二次开发还是纯自研;是用 SQL 数据库还是 NoSQL 数据库。技术选型:后端开发是用 Node.js,Java 还是 Python;是面向对象编程,函数式编程,还是响应式编程;又出来个新技术框架,要不要赶紧用上……

诚然,如果工期充裕、人员到位、资源齐全,那决策环境就太理想了。可现实从来不是这样,你总要在老板的催促与完美的代码之间做出取舍。而拍脑门其实就是在向看起来更易达成的方向妥协,最后却造成工期延误、用户体验差、代码难以维护等问题。

既然拍脑门不靠谱,那程序员们只能认命了吗?

不用!有两位技术大神对自己多年工作经验进行总结提炼,将遇到的典型技术问题以及决策过程写在了《软件开发中的决策:权衡与取舍》这本书中,帮助程序员在困境中做出最优选择。

我们先来看一下,这两位技术大神在踩坑后是怎么做的。

本书两位作者是托马斯·莱莱克(Tomasz Lelek)与乔恩·斯基特(Jon Skeet),他们当然不是第一天出来工作写代码,就知道怎么做出正确决策。他们也会掉坑,但他们从坑里爬出来后进行了积极地反思与总结,并将经验和教训和记录下来。

托马斯就展开了个人对软件设计决策日志的编写,记录下当时做出某个决策时的来龙去脉,如软件设计决策的背景是什么,有哪些替代方案,如何评估某个特殊方案,最终采用了什么样的解决方案。

日积月累,这份详细的经验教训清单,涵盖了许多软件工程师需要解决的问题、需要面临的取舍场景。这里面包含了单体系统、微服务、大数据处理、库、代码设计、API等的设计经验与教训。

这不仅是两位作者的宝贵技术财富,分享出来可以成为更多程序员的技术决策指南。两位技术大神在书中表达了这样一个观点:任何一个取舍结果都是特定条件的产物。

众所周知,软件工程领域没有“银弹”,在面对技术难题的时候,也没有“一招鲜,吃遍天”的解决方案。程序员们应当意识到,脱离问题的实际场景讨论如何决策都是不现实的。

所以,程序员们在学习这本书的时候切忌生搬硬套,要立足于自己的问题本身,学会作者分析问题、解决问题的思路,掌握决策的精髓。书中也说明了,对于有挑战性的问题不会给出明确的答案,在经过学习之后,读者需要自己判断到底哪一种最适用于实际情况。

两位大神技术过硬,参与了多个重大项目的开发,我们来认识一下他们。

Tomasz Lelek

托马斯·莱莱克 现就职于 Dremio,负责创建现代大数据处理的数据湖解决方案。他设计并开发过各种各样的生产服务、软件架构,他精通多种编程语言(大多数基于 JVM )。他设计的工具帮助成千上万的开发者设计出性能优异、用户友好的 API,发挥了重要作用。他为 Java-Driver、Cassandra Quarkus、Cassandra-Kafka Connector 以及 Stargate 都贡献过代码。

Jon Skeet

乔恩·斯基特 曾被IT World 评为“世界上15位最伟大的程序员”之一,是Stack Overflow 总排名第一的大神。他是谷歌公司资深开发工程师,目前的工作方向是谷歌云的 .NET 客户端库。他向开源社区贡献了 .NET 版本的 Noda 时间库,乔恩的代表作是C# in Depth。

现在,跟随两位技术大神,来学习软件开发决策之道吧。

本书的核心在于帮助读者理解软件开发中的复杂性,如何在不同的设计方案之间权衡并做出选择。书中详细讨论了代码重复、异常处理、API设计、性能优化、数据处理、第三方库使用、分布式系统设计等多个方面的决策,并提供了实际的解决方案和权衡策略。

我们来具体学习各个部分。

决策分析方法 本书开篇介绍了软件决策分析的方法论,为读者提供了一个框架,用于评估软件开发中的不同选择和潜在后果。从软件架构、代码以及质量保证等方面,举例说明如何进行权衡与取舍。

代码与架构设计 这部分深入探讨了代码重复的影响、异常处理模式、以及如何在代码和 API 设计中平衡灵活性和复杂性。讨论了代码重复与系统耦合的关系,并分析了异常处理的最佳实践和反模式。

性能优化 讨论了性能优化的时机和方法,是否要在早期进行优化,并介绍了如何识别和优化代码中的热路径。还演示了如何利用帕累托法则,帮助定位系统中适合进行优化的部分。

API设计与用户体验 专注于如何设计对用户体验友好的 API,探讨了为了获得良好的用户体验,我们需要付出的维护成本,并分析了不同设计方案的权衡。

时间与数据处理 这部分涉及了日期和时间数据的处理,以及数据本地性在大数据处理中的重要性。书中详细讨论了日期和时间信息的处理,还探讨了数据分区和流量分配的策略。

第三方库与依赖管理 说明了将第三方库导入代码库时需要考虑的因素、可能引发的问题及权衡与取舍。讨论是否应该导入一个库还是重新实现它的一小部分的问题。

分布式系统设计 这部分深入探讨了分布式系统中一致性与原子性之间的权衡,以及如何处理分布式系统中的传输语义。分析了分布式系统中可能发生的竞争条件,帮助读者理解分布式系统中的不同传输语义。

版本控制与兼容性 讨论了软件、API 以及存储数据是如何随时间发展、演进的,并介绍了它们如何在保持与其他系统的兼容性的同时做到这些。

技术趋势与代码维护 讨论了紧跟 IT 行业的最新技术趋势可能并不总是明智的选择,分析了一些广泛使用的模式和框架,并讨论了这些技术在特定场景的适用性。

至此,读者在实际工作中能够识别陷阱并采取合适的编程决策,从而构建更高效、更稳定和更易于维护的软件系统。

本书英文原书名是《Software Mistakes and Tradeoffs》,Mistakes 可以理解为软件中的那些陷阱,也就是作者们曾经掉过的坑;而 Tradeoffs 就是权衡,需要全面考察才能做出合理决策。这本书是来自作者一线开发的教训与经验,可以指导程序员们在开发工作中避免走弯路,直接找到最优的选择。

本书一大特点是内容全面,深入探讨了代码重复、异常处理、API设计、性能优化等关键领域,还涵盖了分布式系统设计、数据处理、第三方库管理等高级话题。每一章节都独立而深入,提供了丰富的技术细节和实践建议,使读者能够快速将书中的知识应用到自己的项目中。

精彩书摘

另一大特点是实战性强,每一部分都以实际问题开篇,逐步引导读者理解问题的复杂性,并提供解决方案。书中的代码示例和案例分析,不仅增强了理论与实践的结合,也为读者提供了实际操作的模板。(书中提供了示例代码下载地址)

对于书中大量的的示例代码,作者们进行了精心的编排与设计,根据谷歌代码指南,使用自动化插件进行了格式化。许多代码清单都附有代码注释,对重要的概念进行强调。本书使用的所有代码都有大量的单元测试和集成测试,确保了代码的质量。

代码示例

本书适合的读者人群包括中高级开发人员、架构师、以及对软件设计和开发感兴趣的自学者。无论是刚刚步入职场的新手,还是经验丰富的老手,都能从本书中获得新的洞见和启发。

不要再拍脑门做决策了,学透《软件开发中的决策:权衡与取舍》,就能轻松做出最优佳选择!

来源:数学小课堂

相关推荐