前兩天同事接了一通電話,然後在部門群裡提出一個在電話裡對方問他的問題。
有10瓶無標籤試劑,其中9瓶是鹽,1瓶是化學品,該化學品放入水中10分鐘後會變色。且無論是否與鹽放在一起都會變色。問,最少用多少瓶水可以在10分鐘內找出該化學品。也就是一次相溶就需要找到化學品。
在半小時內,大家給出了不同的答案,按照軟體開發的方式,我將其分類如下。
敏捷之道:9瓶水,這是最容易想出來也是速度最快的辦法。如果其中有一瓶變色,則是該化學品,如9瓶水均無變色,則沒放水裡的是該化學品。這是最快速解決該問題的辦法,但卻不是最優的,水資源浪費較大,屬於排除法。
迭代之道:6瓶水,這是比較中庸的辦法,在速度和數量之間取一個平衡。計算方法是
將10瓶編號,剔除第10瓶。123,456,789,147,258,369。各混成一瓶,取交集的方式考察出化學品,如123和147變色,則1號必然為化學品,以此類推。該方法在提問10分鐘後提出
瀑布方法:4瓶水,這是最節省資源的辦法,但是論證過程是最慢的,用二進位制將各瓶水編號0001-1010,然後取二進位制不同位的排列組合。該方法提出是最慢的,在20分鐘後提出。
可能有人不太明白這個的計算,我把這個計算方法畫成圖就明白了。
試劑按0-9的二進位制編號,0000 – 1001

0 | 0 | 0 | 0 —> 0
0 | 0 | 0 | 1 —> 1
0 | 0 | 1 | 0 —> 2
0 | 0 | 1 | 1 —> 3
0 | 1 | 0 | 0 —> 4
0 | 1 | 0 | 1 —> 5
0 | 1 | 1 | 0 —> 6
0 | 1 | 1 | 1 —> 7
1 | 0 | 0 | 0 —> 8
1 | 0 | 0 | 1 —> 9

將各個位上為1 的試劑加入1瓶水中
9,8 –>
7,6,5,4 –>
7,6,3,2 –>
9,7,5,3,1 –>
共4瓶,可檢驗出

歪門邪道:9滴水,將9滴水分別滴入9個試劑瓶,以破壞試劑的方法找出那個是化學品。這其實是最節省資源的辦法,但是產生的效果是破壞性的。所以,其實這是個辦法,但是不是最好的辦法。不過不能說其是錯的,目標是找出化學品而不是保留化學品。當然,能儲存當然是更好。
這種問題,用什麼辦法解決都是對的,但是在成本考量,需要實驗者通盤考量,按照我個人的理解,敏捷的方法是最能快速響應機會的。但是目前我們對機會的理解過於焦躁了,某一種產品,誰先推出就是誰的這種概念似乎已經深入人心。但是很多案例也能看出,有很多外在環境影響,並不都是這樣。舉個例子,京東的模式在我看來其實是在重複當年E國的方式。但當時物流業並不如現在這般發達,導致E國的物流成本超出了企業可承受範圍。所以,如果想做一個半年一年生存期的產品,敏捷開發就足夠了,如果畫成波形圖,從波峰到波谷的角度可能會是非常陡峭的。瞬間成功,瞬間失敗,因為這種辦法是最不用動腦子的,而且資源浪費是較大的。
而迭代辦法,看上去是比較中庸的,雖不是最節省的,也不是最快速的,但是相比最節省的和最快速的,其成本在可控範圍內,且開發時間介於敏捷和瀑布之間。不過相比敏捷,對開發人員的要求就高了一些,需要掌握一定的技巧。所以,看上去,迭代的辦法是比較合理的。因為其速度可以達到比較快速的響應,且執行速度和演算法是比敏捷要優化。
作為一個程式設計師,我覺得瀑布方法是最好的,最節省資源,但是我不是老闆,我說了不算。如果碰上一個只要求上線速度不要求軟體質量的,千萬不要用瀑布方法。其論證過程也就是前期準備過於複雜繁瑣,雖然軟體質量是最高的,但是很有可能讓人錯過這個機會。但是我個人覺得,其開發出來的軟體生存週期應該是最長的,大多數情況。不過也要求開發人員具備的基本素質和技巧是最高的,對於軟體管理者來說也是要求最高。
逆向思維是個解決問題的辦法,卻不是軟體開發的管理方法。逆向思維往往是一個問題的很好的解決方案,作為領導看來,只要能解決問題,比什麼都重要。我不管你用什麼辦法,只要你能解決就可以了。前提是,不能破壞別的東西。
—————————————-
對於程式設計師來說,數學的能力真的很重要。
程式碼工:9瓶水,不考慮太多的情況,只要解決問題即可。
程式設計師:6瓶水,這就是程式設計師比程式碼工拿工資多的地方,程式設計師會思考一個比較優化的辦法,由於經驗或者知識面還不夠寬的緣故,暫時考量不到更高階的演算法。
架構師:4瓶水,架構師拿到問題,總會想到最優的解決辦法,開發速度有可能慢於程式設計師和程式碼工,但是其工程質量是最高的,執行速度也是最快的。且從大局看是最節省公司的資源,雖然有時候架構師也會選擇程式設計師的辦法。
專案經理:瓶子管理員,程式設計師提出需求,專案經理協調水龍頭資源。
簡單的類比,供參考。