論軟體設計中的哲學觀
阿新 • • 發佈:2018-11-23
所謂哲學,即透過事物的表面現象,通過客觀理性的分析,找出更接近事物本質的通用解。從而以一種大宇宙的視角,來觀察和解讀這個世界的種種現象。如道家所謂的“一”,佛家所云的“眾生平等”。 軟體設計中的哲學觀,即以一種“一”的視角,來評價和反思我們的設計,來指導和改進我們的工作。從而達到一種雖手中無劍胸中卻有劍的境界,當如庖丁解牛,遊刃有餘。 第一次有人告訴我這個概念,是大約10年前,工作後的第一個導師,一個聰明偏執但讓人敬佩的華工怪才。當然那時初生牛犢,沒有什麼概念,憑藉與生俱來的一些小聰明和天生喜歡專研的精神,碰到再難的問題,腦海裡總會閃出各種idea。還曾以大學期間就有數萬行程式碼量而自大。因此多年在同學和同事中,也有一些還算過得去的小名聲。 那時候,我固執的認為,只要能圓滿解決工程中遇到的問題,用怎樣的方法根本不重要。所以總沉浸在有過多少多少程式碼量,解決過多少多少難題這樣的表面成就裡。 後來漸漸有了些經歷,就不得不開始對做過的一些事情加以總結和反思。雖然期間也做過一些自認為在業界都還算拿得出手的小創造,但似乎也總沒能跳出那一畝三分地,技術上也很難再有所突破。 後來就不斷的追問自己,當初為什麼選擇這個行業,需要的究竟是什麼? 這個行業說來戲劇,養活著世界上大多數最聰明的人,擁有一個巨龐大巨勤奮 同時“英年早逝”概率最高
//普通版本,m_pHead,m_pTail被初始化成NULL
void Slist:PushBack(Node* pNewNode){
if(m_pTail != NULL){
m_pTail->next = pNewNode; m_pTail = pNewNode;
}else{
m_pTail= pNewNode;
}
}
//強化版本,m_pHead,m_pTail被初始化成DummyNode 。大師們為寫出乾淨清爽的程式碼,可謂煞費苦心。
void Slist:PushBack(Node* pNewNode){
m_pTail->next = pNewNode; m_pTail= pNewNode;
}
用軟體設計中的哲學觀,來指導和評價我們的設計,需要遵循哪些原則呢? 1.解放人——讓他們做自己最擅長的事。 2.解放機器——也讓它們做自己最擅長的事。 3.解放生產力——讓人和機器0成本溝通。 人在軟體設計過程中所扮演的角色和承擔的任務: 讀懂別人的程式碼,正確實現功能需求,長期維護功能程式碼以應對各種需求變更。 人的特點是:情緒化動物,喜歡每天嘗試新的東西,厭惡重複繁瑣的工作,會經常開小差犯錯誤,每天都需要多人合作,人員流動常態化,最擅長的是為各種千奇百怪的實際問題提出解決方案。 機器的特點是:最忠實的執行者,孜孜不倦最能勝任長時間不用休息的機械性重複勞動,沒有思想,不能用已有的經驗為新問題提出解決辦法,沒有決策能力,可以多機合作但也只是被動聽從指揮,就算明知道是錯誤的指令也會堅決執行。 所以,“計算機哲學”要解決的難題就是,讓人和機器這兩種性格迥異的參與者,愉快的合作,高效高質量完成千差萬別的日常實際需求。 那麼,符合怎樣條件的設計才能達到這樣的目的呢? 1.大道至簡—— KISS(Keep it simple and stupid)。 軟體產品最終是給機器去執行的,但更重要的還是,要給別人去讀懂的。沒有一個複雜的系統是能給所有人讀懂的,也沒有人願意去維護一個極度複雜的系統。 人是一種經常會開小差犯錯誤的動物,如何才能減少他們犯錯誤的機會呢,那就是程式碼量越少越好,修改起來越簡單越好。 2.高度模組化——高內聚低耦合。 軟體研發是要團隊合作才能完成的作品,那麼,團隊的每個人最終都只能分到系統中的一個小功能。那麼,怎樣才能讓每個人專心做好自己的工作,而不要停留在被別人打斷和不斷的打斷別人這樣的低效模式裡面呢?答案就是高度模組化的設計,事先只需要由架構師約定要模組之間的必要依賴,具體的實現交由各模組獨立實現,外部不做介面約定之外的任何約束。 3. 眾生平等—— 可 線性 擴充套件,跟if-else say goodbye。 世界是五顏六色的,每個人眼中的世界也是萬紫千紅的。這種現實對於人來說也許還有一定的吸引力,但對於只擅長做重複性工作的計算機來說簡直就是個噩夢。計算機希望的世界原型是所有人都是兩隻眼睛一個鼻子,至於有的人大眼睛高鼻樑這種個性化元素是不希望去care的,而事實上這種個性化差異卻是客觀存在的,因此我們有了OOP,有了繼承,有了多型。讓計算機只看到所有人都是兩隻眼睛一個鼻子這樣的“一”,而允許不同的人去具體描繪出大眼睛高鼻樑這樣的“三”。從而從設計上達到“一”和“三”的和諧統一。 4.三生萬物——需求變更是每天都在發生的。 所有軟體的最終需求都不是一開始就完全定下來的,而是經過長期不停的變更改出來的。那麼,在最初設計系統的時候,都還不知道這些千奇百怪的新需求的時候,我們又該如何應對呢?從哲學的角度講,如果當初系統是在哲學原理框架下 設計出來的,萬變不離其中,猴子他再怎麼能折騰,也是難跳出這五指山。 侯捷老師曾戲稱,在STL面前,99.99%的人寫出來的資料結構演算法都是三流水準。那麼,在哲學原理視角下,我們每天寫出來的產品,也多半算三流水準。 軟體設計中的哲學觀,不能教會我們怎樣去設計一個一流系統,卻能指導我們如何設計出一個更合格的三流產品。