XY問題
這個(gè)問題,最早是在酷殼:X-Y Problem中看到的。
對(duì)于X-Y Problem的意思如下:
1)有人想解決問題X
2)他覺得Y可能是解決X問題的方法
3)但是他不知道Y應(yīng)該怎么做
4)于是他去問別人Y應(yīng)該怎么做?
簡(jiǎn)而言之,沒有去問怎么解決問題X,而是去問解決方案Y應(yīng)該怎么去實(shí)現(xiàn)和操作。
于是乎:
1)熱心的人們幫助并告訴這個(gè)人Y應(yīng)該怎么搞,但是大家都覺得Y這個(gè)方案有點(diǎn)怪異。
2)在經(jīng)過大量地討論和浪費(fèi)了大量的時(shí)間后,熱心的人終于明白了原始的問題X是怎么一回事。
3)于是大家都發(fā)現(xiàn),Y根本就不是用來解決X的合適的方案。
X-Y Problem最大的嚴(yán)重的問題就是:在一個(gè)根本錯(cuò)誤的方向上浪費(fèi)他人大量的時(shí)間和精力!
Accidental complexity
Neal Ford指出,Essential complexity指的是問題與生俱來的,無法避免的困難。
Accidental complexity,是人們解決Essential complexity的過程中衍生的。
系統(tǒng)設(shè)計(jì)的初衷是解決Essential complexity,但是解決方案本身帶來了新的問題。
許多軟件框架和廠商提供的“解決方案”都表現(xiàn)出Accidental complexity的癥狀。
解決特定問題的框架很管用,但設(shè)計(jì)過度的框架增加的復(fù)雜性反而超過了它應(yīng)該緩解的復(fù)雜性。
在大型軟件項(xiàng)目中,關(guān)注Essential complexity,消除Accidental complexity,抽絲剝繭制訂解決方案,才是真正的挑戰(zhàn)。
It's the duty of the architect to solve the problems inherent in essential complexity without introducing accidental complexity.
注:
就英語:accidental的這個(gè)字眼而言,并不是指偶然發(fā)生的意思,也不是意外不幸的意思,
而是比較接近伴隨的或次要的意思。
關(guān)注難點(diǎn)
Frederick P. Brooks在論文No Silver Bullet中將軟件開發(fā)的困難分為兩類:
(1)Essential Difficulties:打造由抽象軟件實(shí)體構(gòu)成的復(fù)雜概念結(jié)構(gòu)
(2)Accidental Difficulties:使用編程語言表達(dá)這些抽象實(shí)體,在空間和時(shí)間限制內(nèi)將它們映射成機(jī)器語言
軟件開發(fā)真正的困難,是在于這種概念構(gòu)造的規(guī)格制定、設(shè)計(jì)和測(cè)試。而并非在孜孜矻矻于它的呈現(xiàn)方式,以及測(cè)試該呈現(xiàn)方式的精確程度。Accidental Difficulties會(huì)隨著工具的改善而逐漸淡化,反而是Essential Difficulties最難以解決,因?yàn)榇蟛糠值幕顒?dòng)是發(fā)生在人們的腦海里,缺乏有效的輔助工具。
Brooks認(rèn)為現(xiàn)在是關(guān)注軟件任務(wù)中的必要活動(dòng)的時(shí)候了,也就是那些和構(gòu)造異常復(fù)雜的抽象概念結(jié)構(gòu)有關(guān)的部分。
他提出了幾個(gè)建議:
(1)仔細(xì)地進(jìn)行市場(chǎng)調(diào)研,避免開發(fā)已上市的產(chǎn)品,構(gòu)建軟件最可能的徹底解決方案是不開發(fā)任何軟件。
(2)在獲取和制訂軟件需求時(shí),將快速原型開發(fā)作為迭代計(jì)劃的一部分。因?yàn)椋_發(fā)軟件系統(tǒng)的過程中,最困難的部分是確切地決定搭建什么樣的系統(tǒng)。
(3)增量開發(fā)——增長,而非搭建系統(tǒng)。有機(jī)地更新軟件,隨著系統(tǒng)的運(yùn)行、使用和測(cè)試,逐漸添加越來越多的功能。
(4)不斷挑選和培養(yǎng)杰出的概念設(shè)計(jì)人員,軟件行業(yè)的核心,一如既往的是人員。
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
軟件架構(gòu)師應(yīng)該知道的97件事
人月神話
沒有銀彈
Some lesser known truths about programming