重读《人月神话》(17)-没有银弹-软件工程中的根本和次要问题
《没有银弹》("No Silver Bullet")在这篇文章中,Brooks探讨了为什么在当时看来并没有一个单一的方法或技术(即所谓的“银弹”)可以解决所有软件开发中的问题,并且他预测在未来十年内也不会出现这样的方法。
再论《没有银弹》提醒我们,面对软件开发中的难题时应保持谨慎乐观的态度,认识到没有任何一种解决方案能适用于所有情况。相反,我们应该继续探索多方面的小幅改进,并结合具体场景选择最合适的方法来应对挑战。
存在着银弹-就在这里?
《人月神话》一文因其深刻的见解而广受认可,几乎无人质疑其核心论点。然而,《没有银弹》却激发了广泛的讨论和争议,辩论至今未息。大部分观点,但对“不存在绝对解决方案”的核心论点持有异议,并且坚信他们已经发现了能够解决软件开发难题的“银弹”。
回顾1986年至1987年间收到的一些早期反馈,可以发现那些当时被热烈推崇为灵丹妙药的方法和技术,并未能如预期般带来革命性的变化。这提醒我们,在评价新技术或方法的有效性时,应当谨慎行事,尤其是当涉及到声称能大幅提升效率或生产力的时候。
对于任何宣称找到了“银弹”的说法,作者持开放态度,前提是这种方案必须经过实践验证。就像购买计算机软硬件时依赖真实用户的正面反馈一样,如果有一种方法、工具或产品确实能使某位中立客户的软件生产率提升了十倍,那么这样的见证将极具说服力。
本质(essence)和次要(accident)
软件开发中两个关键方面:本质(essence)和次要(accident)。这里“accident”并不意味着偶然或不幸,而是指那些附带的、从属的实现细节。而“essence”指的是软件概念结构的本质部分,即那些必须被构思和设计的核心思想。
在软件开发过程中,人们往往容易将注意力集中在所谓的“次要”的实现细节上,比如编写代码的具体方式、工具的选择等。然而,这些并不是他所认为的软件开发的主要挑战所在。真正重要的挑战在于如何解决软件开发的本质问题——即如何构思软件的概念性结构。这些问题包括但不限于复杂性、一致性、可变性和不可见性,它们是固有的,并且不会因为技术的进步而消失。
关于术语“accidental”,作者并没有贬低这部分工作的重要性,而是试图区分出哪些工作是对最终产品有直接贡献的核心任务,哪些是为实现这些核心任务而必需但本身不是核心的任务。例如,选择编程语言或编译器、管理内存分配等都是实现上的问题,属于次要部分;而定义系统的架构、设计用户界面、规划数据流等则是本质性的任务。
随着技术和实践的发展,我们已经在减少处理次要问题的时间投入。当次要部分只占据开发工作的小部分时(例如少于90%),即便我们能够通过某种方式将这一小部分的时间减少到零,这并不会对整体项目进度产生数量级上的改善。这是因为大部分时间实际上是花费在解决本质问题上,而不是在处理次要问题。
环境和次要因素只能降低生产率,而不能增加它。这意味着,要真正提高软件开发的效率,我们必须关注于解决那些与概念性结构相关的本质问题,而不是仅仅优化实现过程中的次要问题。尽管存在固有的复杂性,但这并不意味着没有希望改善现状。通过采用更高级的方法和技术,如模块化设计、重用现有组件等,我们可以更好地应对复杂性,从而在现实中取得有意义的进步。
探索新的理论框架来理解和简化系统复杂性,并强调了层次化和增量化的开发策略对于管理复杂性的价值。
生产力增长与需求增长之间的差距
生产力增长与需求增长之间的差距是一个关键话题。这个差距反映了软件开发能力(即生产力)和市场或业务对软件产品和服务的需求之间存在的不匹配。
生产力增长
生产力增长指的是单位时间内生产出的有用输出量的增加。对于软件工程来说,这通常意味着开发者能够更快、更高效地编写代码,创建功能丰富且可靠的软件系统。影响生产力的因素包括但不限于:
- 技术进步:新的编程语言、框架、库和工具可以简化开发过程,提高效率。
- 自动化:通过CI/CD流水线、测试自动化等手段减少人工干预,加快交付速度。
- 方法论改进:敏捷开发、DevOps等现代软件开发实践有助于团队更好地协作并响应变化。
然而,尽管这些因素促进了生产力的增长,但它们往往跟不上市场需求的步伐。
需求增长
随着信息技术的快速发展,社会各行业对软件解决方案的需求急剧膨胀。这种需求不仅体现在数量上的增多,还表现在复杂度和定制化程度上:
- 数字化转型:企业为了保持竞争力,纷纷启动数字化项目,需要大量的软件支持。
- 用户体验要求:用户期望更高的交互性和个性化服务,促使应用更加复杂。
- 安全性和合规性:随着网络安全威胁的加剧以及法律法规的变化,软件必须满足严格的安全标准。
因此,虽然生产力确实在逐步提升,但由于需求侧的快速扩张,两者之间的差距仍然存在,并且可能还在扩大。
为什么会有差距?
-
本质特性:软件本质上是复杂的、无形的产品,其开发涉及到多方面的考量,如功能性、性能、可维护性等。任何试图大幅提高生产力的努力都不可避免地会遇到这些固有特性的限制。
-
非线性增长:当一个系统的规模变得足够大时,管理复杂性、协调团队成员、确保质量等方面的问题都会呈指数级增长,使得进一步提升生产力变得更加困难。
-
需求的不确定性:特别是在互联网时代,市场需求变化莫测,很难准确预测未来的具体需求。这就导致即使提高了当前的生产力,也可能无法满足未来可能出现的新需求。
-
资源分配:有限的人才和技术资源被分散到多个项目中,难以集中力量解决最核心的问题,从而限制了整体生产力的跃升。
不存在“银弹”
没有一种单独的技术或管理策略能够显著提高软件开发的效率,从而彻底解决软件危机。换句话说,“银弹”并不存在。任何改进都必须依赖于多个方面的渐进式改进,包括但不限于更好的编程语言、更先进的设计方法、改进的过程管理和组织结构等。
标签:次要,Bullet,软件开发,No,复杂性,本质,生产力,银弹 From: https://blog.csdn.net/2404_87526689/article/details/144468419