首页 > 其他分享 >重读《人月神话》(18)-再论《没有银弹》(“No Silver Bullet“ Refired)

重读《人月神话》(18)-再论《没有银弹》(“No Silver Bullet“ Refired)

时间:2024-12-14 11:30:47浏览次数:6  
标签:次要 Bullet 软件开发 No 复杂性 本质 生产力 银弹

重读《人月神话》(17)-没有银弹-软件工程中的根本和次要问题

《没有银弹》("No Silver Bullet")在这篇文章中,Brooks探讨了为什么在当时看来并没有一个单一的方法或技术(即所谓的“银弹”)可以解决所有软件开发中的问题,并且他预测在未来十年内也不会出现这样的方法。

再论《没有银弹》提醒我们,面对软件开发中的难题时应保持谨慎乐观的态度,认识到没有任何一种解决方案能适用于所有情况。相反,我们应该继续探索多方面的小幅改进,并结合具体场景选择最合适的方法来应对挑战。

图片

存在着银弹-就在这里?

《人月神话》一文因其深刻的见解而广受认可,几乎无人质疑其核心论点。然而,《没有银弹》却激发了广泛的讨论和争议,辩论至今未息。大部分观点,但对“不存在绝对解决方案”的核心论点持有异议,并且坚信他们已经发现了能够解决软件开发难题的“银弹”。

回顾1986年至1987年间收到的一些早期反馈,可以发现那些当时被热烈推崇为灵丹妙药的方法和技术,并未能如预期般带来革命性的变化。这提醒我们,在评价新技术或方法的有效性时,应当谨慎行事,尤其是当涉及到声称能大幅提升效率或生产力的时候。

对于任何宣称找到了“银弹”的说法,作者持开放态度,前提是这种方案必须经过实践验证。就像购买计算机软硬件时依赖真实用户的正面反馈一样,如果有一种方法、工具或产品确实能使某位中立客户的软件生产率提升了十倍,那么这样的见证将极具说服力。

本质(essence)和次要(accident)

软件开发中两个关键方面:本质(essence)和次要(accident)。这里“accident”并不意味着偶然或不幸,而是指那些附带的、从属的实现细节。而“essence”指的是软件概念结构的本质部分,即那些必须被构思和设计的核心思想。

在软件开发过程中,人们往往容易将注意力集中在所谓的“次要”的实现细节上,比如编写代码的具体方式、工具的选择等。然而,这些并不是他所认为的软件开发的主要挑战所在。真正重要的挑战在于如何解决软件开发的本质问题——即如何构思软件的概念性结构。这些问题包括但不限于复杂性、一致性、可变性和不可见性,它们是固有的,并且不会因为技术的进步而消失。

关于术语“accidental”,作者并没有贬低这部分工作的重要性,而是试图区分出哪些工作是对最终产品有直接贡献的核心任务,哪些是为实现这些核心任务而必需但本身不是核心的任务。例如,选择编程语言或编译器、管理内存分配等都是实现上的问题,属于次要部分;而定义系统的架构、设计用户界面、规划数据流等则是本质性的任务。

随着技术和实践的发展,我们已经在减少处理次要问题的时间投入。当次要部分只占据开发工作的小部分时(例如少于90%),即便我们能够通过某种方式将这一小部分的时间减少到零,这并不会对整体项目进度产生数量级上的改善。这是因为大部分时间实际上是花费在解决本质问题上,而不是在处理次要问题。

环境和次要因素只能降低生产率,而不能增加它。这意味着,要真正提高软件开发的效率,我们必须关注于解决那些与概念性结构相关的本质问题,而不是仅仅优化实现过程中的次要问题。尽管存在固有的复杂性,但这并不意味着没有希望改善现状。通过采用更高级的方法和技术,如模块化设计、重用现有组件等,我们可以更好地应对复杂性,从而在现实中取得有意义的进步。

探索新的理论框架来理解和简化系统复杂性,并强调了层次化和增量化的开发策略对于管理复杂性的价值。

生产力增长与需求增长之间的差距

生产力增长与需求增长之间的差距是一个关键话题。这个差距反映了软件开发能力(即生产力)和市场或业务对软件产品和服务的需求之间存在的不匹配。

生产力增长

生产力增长指的是单位时间内生产出的有用输出量的增加。对于软件工程来说,这通常意味着开发者能够更快、更高效地编写代码,创建功能丰富且可靠的软件系统。影响生产力的因素包括但不限于:

  • 技术进步:新的编程语言、框架、库和工具可以简化开发过程,提高效率。
  • 自动化:通过CI/CD流水线、测试自动化等手段减少人工干预,加快交付速度。
  • 方法论改进:敏捷开发、DevOps等现代软件开发实践有助于团队更好地协作并响应变化。

然而,尽管这些因素促进了生产力的增长,但它们往往跟不上市场需求的步伐。

需求增长

随着信息技术的快速发展,社会各行业对软件解决方案的需求急剧膨胀。这种需求不仅体现在数量上的增多,还表现在复杂度和定制化程度上:

  • 数字化转型:企业为了保持竞争力,纷纷启动数字化项目,需要大量的软件支持。
  • 用户体验要求:用户期望更高的交互性和个性化服务,促使应用更加复杂。
  • 安全性和合规性:随着网络安全威胁的加剧以及法律法规的变化,软件必须满足严格的安全标准。

因此,虽然生产力确实在逐步提升,但由于需求侧的快速扩张,两者之间的差距仍然存在,并且可能还在扩大。

为什么会有差距?

  1. 本质特性:软件本质上是复杂的、无形的产品,其开发涉及到多方面的考量,如功能性、性能、可维护性等。任何试图大幅提高生产力的努力都不可避免地会遇到这些固有特性的限制。

  2. 非线性增长:当一个系统的规模变得足够大时,管理复杂性、协调团队成员、确保质量等方面的问题都会呈指数级增长,使得进一步提升生产力变得更加困难。

  3. 需求的不确定性:特别是在互联网时代,市场需求变化莫测,很难准确预测未来的具体需求。这就导致即使提高了当前的生产力,也可能无法满足未来可能出现的新需求。

  4. 资源分配:有限的人才和技术资源被分散到多个项目中,难以集中力量解决最核心的问题,从而限制了整体生产力的跃升。

不存在“银弹”

没有一种单独的技术或管理策略能够显著提高软件开发的效率,从而彻底解决软件危机。换句话说,“银弹”并不存在。任何改进都必须依赖于多个方面的渐进式改进,包括但不限于更好的编程语言、更先进的设计方法、改进的过程管理和组织结构等。

标签:次要,Bullet,软件开发,No,复杂性,本质,生产力,银弹
From: https://blog.csdn.net/2404_87526689/article/details/144468419

相关文章

  • NKOJ 1209 并查集【NOI2001 Day1 T3】食物链
    NKOJ1209并查集【NOI2001Day1T3】食物链思路:带权/种类并查集方法一实现方法用带权并查集带的权值是边权,不是点权,用来表示两点间的关系,但为了方便记录还是用点权,每个点记录到根节点的权值。在getf函数中注意更新是到根节点之间的权值,用\(val_x=(val_x+val_{fa_x})\bm......
  • NKOJ 1206 【NOI2002 Day1 T1】银河英雄传说
    NKOJ1206【NOI2002Day1T1】银河英雄传说思路:和NKOJ2281一样实现方法移动操作完全一样。计算操作的区别在于,一个是直接输出到根节点的距离,另一个实际上是前缀和思想,用\(x\)到根的距离减去\(y-1\)到根的距离,就是\(x\simy\)之间的距离。代码#include<cstdio>#in......
  • (免费源码)计算机毕业设计必学必看 万套实战教程 java、python、php、node.js、c#、APP
    摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采SSM技术和mysql数据库来完成对系统的设计。整个开发过程首先对医药销售管理系统进行需求分析......
  • iOS app 自动化测试,appium inspector 启动会话报错:Failed to create session. An unkn
    报错内容:Failedtocreatesession.Anunknownserver-sideerroroccurredwhileprocessingthecommand.Originalerror:'12.5.5'doesnotexistinthelistofsimctlSDKs.OnlythefollowingSimulatorSDKversionsareavailableonyoursystem:15.2,......
  • creating chat agent with langchain and openai getting no attribute error
    题意:使用Langchain和OpenAI创建聊天代理时遇到没有属性错误。问题背景:I'mtryingtotestachatagentusingthepythoncodebelow.I'musinglangchainagentandtoolfromlangchain.I'mdefiningacoupleofsimplefunctionsfortheLLMtouseastoolsw......
  • zenoh rest plugin 简单使用说明
    zenohrestplugin提供了restapi能力,包含了管理adminspace以及通过get,put,delete操作key的能力配置包含了独立模式以及plugin模式,可以解决实际场景使用,基于plugin模式是一个不错的选择参考配置{"mode":"router","plugins":{"mqtt":{"port":1883......
  • node.js入门第二天
    1.复习第一天的内容基本概念:复习Node.js的特点和用途,了解其非阻塞I/O模型。环境搭建:确保你已经成功安装Node.js,并能够在命令行中运行node和npm。2.理解模块系统CommonJS模块:学习如何使用require和module.exports。创建一个模块(例如math.js)://math.jsfun......
  • node.js入门第三天
    第三天学习内容安排1.复习第二天的内容基本模块:复习Node.js的核心模块(如fs、http、path等)的基本用法。异步编程:回顾回调函数、Promise和async/await的基本概念。2.学习Express框架安装Express:npminstallexpress创建基本的Express应用:constexpress=......
  • node.js入门第四天
    第四天学习内容安排1.复习第三天的内容基本模块:复习Node.js的核心模块,如fs(文件系统)、http(HTTP服务器)等。异步编程:回顾回调函数和Promise的基本用法。2.深入了解异步编程回调函数:理解回调函数的概念及其在异步编程中的应用。constfs=require('fs');fs.readFi......
  • noip2024 游记
    day-inf前情提要由于csp的超常发挥,喜提SC-0001。day0浮躁。浮躁。浮躁。但这并不是那么严重,因为其实csp前我也挺浮躁的(不过和csp不一样的是入睡前非常兴奋。由于害怕被叠失眠debuff,来了半粒安眠药(人生第一次吃安眠药qwq),神奇的是吃了以后一下就睡着了。day1这天......