[Engineering] 工程趣闻(四):不要制造问题

XY问题

[Engineering] 工程趣闻(四):不要制造问题_第1张图片

这个问题,最早是在酷壳:X-Y Problem中看到的。
对于X-Y Problem的意思如下:
1)有人想解决问题X
2)他觉得Y可能是解决X问题的方法
3)但是他不知道Y应该怎么做
4)于是他去问别人Y应该怎么做?
简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。

于是乎:
1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。
2)在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的问题X是怎么一回事。
3)于是大家都发现,Y根本就不是用来解决X的合适的方案。

X-Y Problem最大的严重的问题就是:在一个根本错误的方向上浪费他人大量的时间和精力!

Accidental complexity

Neal Ford指出,Essential complexity指的是问题与生俱来的,无法避免的困难。
Accidental complexity,是人们解决Essential complexity的过程中衍生的。
系统设计的初衷是解决Essential complexity,但是解决方案本身带来了新的问题。

许多软件框架和厂商提供的“解决方案”都表现出Accidental complexity的症状。
解决特定问题的框架很管用,但设计过度的框架增加的复杂性反而超过了它应该缓解的复杂性。
在大型软件项目中,关注Essential complexity,消除Accidental complexity,抽丝剥茧制订解决方案,才是真正的挑战。

It's the duty of the architect to solve the problems inherent in essential complexity without introducing accidental complexity.

注:
就英语:accidental的这个字眼而言,并不是指偶然发生的意思,也不是意外不幸的意思,
而是比较接近伴随的或次要的意思。

关注难点

[Engineering] 工程趣闻(四):不要制造问题_第2张图片

Frederick P. Brooks在论文No Silver Bullet中将软件开发的困难分为两类:
(1)Essential Difficulties:打造由抽象软件实体构成的复杂概念结构
(2)Accidental Difficulties:使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言

软件开发真正的困难,是在于这种概念构造的规格制定、设计和测试。而并非在孜孜矻矻于它的呈现方式,以及测试该呈现方式的精确程度。Accidental Difficulties会随着工具的改善而逐渐淡化,反而是Essential Difficulties最难以解决,因为大部分的活动是发生在人们的脑海里,缺乏有效的辅助工具。

Brooks认为现在是关注软件任务中的必要活动的时候了,也就是那些和构造异常复杂的抽象概念结构有关的部分。
他提出了几个建议:
(1)仔细地进行市场调研,避免开发已上市的产品,构建软件最可能的彻底解决方案是不开发任何软件。
(2)在获取和制订软件需求时,将快速原型开发作为迭代计划的一部分。因为,开发软件系统的过程中,最困难的部分是确切地决定搭建什么样的系统。
(3)增量开发——增长,而非搭建系统。有机地更新软件,随着系统的运行、使用和测试,逐渐添加越来越多的功能。
(4)不断挑选和培养杰出的概念设计人员,软件行业的核心,一如既往的是人员。

Good programmers spend much of the other 90% thinking, researching, and experimenting to find the best design. Bad programmers spend much of that 90% debugging code by randomly making changes and seeing if they work.

参考

The XY Problem
软件架构师应该知道的97件事
人月神话
没有银弹
Some lesser known truths about programming

你可能感兴趣的:([Engineering] 工程趣闻(四):不要制造问题)