Ken Delong解释了他认为软件开发“超级困难”的原因:
每个人都知道编写软件很难,但是我想探讨一下为什么软件开发这么难。
软件开发受本身四个特性之困,而这些特性也将其推到了“复杂的自适应系统”之境地,并且更将其逼入混乱之困局(至少足够接近)。这些特性是:
以上并不是什么新鲜的发现,而且我们很多人都已经对其习以为常。也许有些人虽然听说过,但却不能理解背后的真正含义。这也使得Ken的博客文章有了用武之地:
在高峰期时,公路上车流密集,也许大家的行驶速度都还不慢。突然,某个人想看看车外的风景,将时速降至30英里,而且只维持了几秒钟。这会带来什么后果?交通大堵塞。曾经经历过堵得一辆接一辆的路况吧,却没想到突然可以时速70英里前进?之前的状况,是因为出现了变化——有人想游车河,非线性因素掺杂在一起,造成堵车。很多类似复杂系统都是可以自我维系的,交通堵塞正是其中一例。最后还是畅通了,但是其恢复速度却远低于任何人的直觉。
一个人减速——这并非偶然事件——却造成全线大塞车!问题的关键在哪里?软件既难而又危险,最微小的事情也有可能导致全盘皆输。难道就这样束手就擒么?
要想在流量有限的高速公路上避免严重塞车,就得让大家都把尾灯打开,这样可以让整个交通系统的利用率保持在安全的水平,一些正常的变化也就不会被无限放大、造成问题。我们在处理生产系统服务器的CPU占用率问题时,采用了同样的方式。我们会让CPU的占用率不超过30%,这样就可以防止峰值流量对服务器造成过大冲击。
因此,系统中必须提供反馈机制,使得它可以应对变化,不至于因此而崩溃:
在敏捷中,可以调整一个sprint接受的故事点数,以使sprint中的所有任务都能在sprint之内抵达“完成”状态。这就是“尾灯效应”。
Jurgen Appelo在《敏捷项目时间管理10原则》一文中提出的十项原则,可以视作敏捷软件开发的调整和“尾灯”:
-
定义“完成”条件
-
使用时间盒管理工作
-
不要为任务估算添加松懈时间
-
推迟决策
-
减少周期时间
-
让处理管道短小而狭窄
-
保持纪律
-
减少任务切换
-
防止长时间连续加班
- 分离“严重程度”和“紧急程度”
Jurgen详细阐述了这十条原则,并提供了各自深入阅读的参考资料。软件开发之难,很大程度上因为其过程类似于复杂的自适应系统。敏捷,如果可以正确实施,将会提供稳定的反馈。
查看英文原文:Software Developer:A Traffic Jam Waiting To Happen
在英文站文后的评论中,读者Karl Scotland指出:利用“看版”系统限制在制品,可以“让整个系统的利用率保持在安全的水平,一些正常的变化也就不会被无限放大、造成问题。”
读者Jim Leonardo在名为“避免拥塞,保持距离”的评论中说到:
若想使用拥塞作为比喻,我建议先定义其真正含义。拥塞等同于瓶颈。团队构成上的问题,可能会造成有些人在忙着解决难题的时候,其他人却处于空闲状态。如果有这些情况发生,你应该考虑一下因素:
1) 团队中人员的职责是不是划分得太明确了?如果有瓶颈产生,是不是因为在跨职能方面做得不够?赶紧多做点培训,多进行知识分享吧。
2) 有多少任务需要其他任务作为前置条件?如果因为前置任务没有完成,导致有些人的工作限于停滞,是否有其他的任务可供这些人上手开始工作?对于团队和项目来说,功能特性切分成任务的方式合理么?是不是可以用另外的方式进行划分、组织开发?
3) 简单之极……为任务的开发准备足够的时间了么?现实一点,如果总是发现瓶颈(拥塞),也许是因为过于低估了某些类型的任务的完成时间,或者在做规划时没有考虑到不同的开发速度(要注意,“速度慢”的开发者之所以慢,可能是因为他们对代码质量的要求比较高,所以要全面考虑问题)
最后一点,也是我最想在infoq上反复强调的……
4) 团队的工作时间是不是太长了?有人陷入停滞,是不是因为他们觉得自己应该每周工作70个小时?相反地,总是成为瓶颈的程序员,是不是也是把所有时间都投入工作的那位?倘若果真如此,这个人就像一个正在形成的火药桶。如果它现在还没有爆发,将来一定会(强制对他的代码进行复查绝对不可取!)。
作者Amr Elssamadisy引用了Flemming Funch的博客,对于complex和complicated之间的不同进行了分析:
我们每天都会用“complicated”和“complex”,不相区分。要讨论复杂性(complexity)就变得困难了,比如说探讨自然界中的复杂性。
可以说我们需要复杂性的科学定义,可是科学却给出了至少32种不同的诠释,每种都不一样。要是我们能摆脱迷惑的困扰,就可以发现下面这种可行的说法:
构成上的复杂性(complicated),是指某项事物包含了很多错综关联在一起的组成部分,很难搞清楚各个部分之间的关系。即使能搞清楚,也不能保证这些部分是以合理的方式组合在一起的。
系统上的复杂性(complex),是指某项事物作为一个系统出现,它所展示的系统属性并不明显。这与一些部分的简单叠加之和有所不同,更难以理解。构成的部分不一定很多,但是组合在一起之后的结果却难以搞得很明白,在某些方面以一个整体的方式呈现。
一架空客380具有构成上的复杂性(complicated)。一条水母具有系统上的复杂性(complex)。巴黎地铁网络具备构成上的复杂性(complicated),人们使用它的方式具有系统上的复杂性(complex)。你的骨骼框架具备构成上的复杂性(complicated),作为人的你具有系统上的复杂性(complex)。一栋建筑物是具有构成上的复杂性(complicated),而一个城市具有系统上的复杂性(complex)。
分享到:
相关推荐
标题中的“基于差分方程和元胞自动机的交通阻塞模型”是一个交通流模拟的方法,它结合了数学建模的两种重要工具——差分方程和元胞自动机。这种模型通常用于研究城市交通拥堵现象,预测交通流量变化,并优化交通管理...
在IT领域,交通灯程序通常是指一种...交通灯程序的开发不仅涉及到编程技术,还涵盖了交通工程学和计算机科学的交叉领域,是理论与实践相结合的典型示例。理解和分析这样的程序有助于提升我们的系统设计和问题解决能力。
在本文中,作者探讨了基于现场可编程门阵列(FPGA)技术实现交通控制灯逻辑电路的设计过程。FPGA是一种可编程逻辑设备,能够在不更改硬件的情况...设计的成功经验为未来更复杂交通控制系统的开发提供了技术基础和参考。
这与PC系统中BIOS的工作方式相似,具有自动化程度高、软件代码较小以及响应速度较快等诸多特点,尤其适合于对实时及多任务要求较高的体系。 嵌入式系统的特点主要包括:嵌入式系统主要面向特定领域,具有比较严格的...
该系统采用了以8051为内核的单片机芯片AT89s51作为核心控制器,以嵌入式操作系统RTX51为软件开发平台,通过控制城市十字路口的交通信号灯来指挥交通。该系统具有制作简单、成本低、功能实用等特点。 关键词:单片机...
2. **减少交通拥堵**:向驾驶员提供实时的车位信息,避免其在停车场内盲目寻找车位而引起的交通堵塞。 3. **降低运营成本**:减少对人工引导的依赖,降低人员配置成本。 4. **提升用户体验**:通过各种渠道(如路标...
车牌识别技术是现代智能交通系统中的重要组成部分,它在安全监控、交通管理、停车场出入等领域有着广泛应用。在Android平台上实现车牌识别,涉及到图像处理、计算机视觉以及机器学习等多个领域的技术。下面将详细...
- 实时性要求,系统需要快速响应,避免造成交通堵塞。 这个毕业设计项目不仅展示了OpenCV在实际应用中的强大功能,也为学生提供了实践经验,理解并掌握图像处理、计算机视觉和软件工程的基本概念。
在这个车次查询系统中,C#作为主要的开发工具,实现了火车车次的查询功能,包括直达车和中转车次的查询,为用户提供方便快捷的交通信息。 一、系统架构 1. 数据库设计:车次查询系统的核心是数据存储与检索,通常...
【标题】"simtp1:TrabajoPráctico1 de Simulación(2021)" 是一个关于模拟(Simulation)实践项目的第一部分,可能是...通过完成这个项目,参与者可以掌握一系列编程和工程技能,为未来的软件开发工作打下坚实基础。
- **解析**:在大多数编程语言中,switch语句可以被替换为一系列if...else if...else语句,实现相同的功能。这种方式通常用于处理有限数量的离散情况。 #### 知识点26:C语言程序 - **题目描述**:给出了一段C语言...