關於程序設計的體會

週日早晨陪2歲的孩子玩,他想畫畫,於是找了一本英語單詞的書。書上面有很多插圖,找了一個waiter的插圖準備要畫。看着這個圖片還真有點無從下手,雖然也沒學過畫畫,但是瞭解過程序設計,想着畫圖其實也是一種設計,於是把畫畫的過程類比到程序設計上。

畫畫流程對比程序設計流程

下面是我畫畫的流程:

  1. 我要畫的對象是什麼,仔細看看,能大致描述這個物體。這次就是一個託着托盤的服務員
  2. 對象能大致分解成幾部分。頭、軀幹、下肢、一些裝飾性物體。
  3. 圖片上這幾部分之間是直接連接上的還是有特殊物品來裝飾。頭和軀幹之間由脖子連接,脖子上有一個蝴蝶結。
  4. 在圖紙上勾勒出整體的輪廓,進而勾勒出每一部分的大致輪廓。
  5. 針對每一部分進行設計,再適當勾勒輪廓。例如頭部上的髮型、五官,此時還只是勾勒輪廓的過程,還沒具體畫。
  6. 整體的再過一遍,看看已經勾好的輪廓是否比例合適,針對性的修改一下。
  7. 開始畫,把每個輪廓都畫上內容。
  8. 整體再潤色一下。
  9. 給孩子看看,好在孩子小,看似效果還可以。
  10. 針對他指的地方再看一下是不是可以再改改。

針對畫畫的步驟,我做軟件開發的時候也有對應的步驟:

  1. what?瞭解清楚要開發的程序是用來做什麼的,它大致是由什麼樣的人使用。
  2. decomposition。在全面瞭解對象之後把系統進行細化,拆分。大系統拆成小系統,大模塊拆成小模塊,大class拆成子class組合的形式。然後用包圖進行描述關係。
  3. relation and communication。每個小模塊之間的關係和通信方式,爲打通通信做好設計,可以是本地函數調用、http、tpc、rpc等,梳理一個簡單的時序圖。
  4. architecture。選一下合適的管理、通信框架,腳手架。可以考慮爲每個模塊可以創建好對應的包,寫一個demo包,爲後面的開發做模板。
  5. detail。詳細設計,針對每個子模塊甚至於類進行抽象、設計,畫一下對應的類圖。歸置一下文檔,比如,概要設計、詳細設計之類的。
  6. implement。實現邏輯。這裏雖然只是單純開發,但是也有熟練和生疏,直接和囉嗦。
  7. polish。針對單個模塊的代碼走讀。
  8. check & accept。測試並交付。
  9. maintain。維護。

經過對比,我發現一個共同點:先彆着急做,先做好準備工作,準備好了再動手

什麼樣的事情需要設計?

目前看來,那些複雜的事情,沒有經驗的嘗試,不堪忍受多次失敗的,都應該考慮先設計後動手。

程序設計的核心思想

  1. 有針對性的設計,在概要設計的時候不要摻雜詳細設計的內容。
  2. 簡單就是美,能簡單實現的東西絕不囉嗦。
  3. 富有創造性,不拘一格,儘量不受固有思想束縛。
  4. 程序和人一樣,它也需要查漏補缺,給它一定的延展性。

設計的弊端

上面說到,針對特定的情況才適合進行慢慢設計,經過設計的開發一般不會有重大的問題,質量相對有保證。但是設計也有它消極的一面:

  1. 過度設計。在剛剛接觸設計之後,恨不得幹什麼事都要設計一番再動手,實際上根本不需要,比如讓你寫一個文件導出的類,用一次就作廢了,你還要耗費幾個小時進行設計,就得不償失了。
  2. 時間成本。設計是非常消耗時間和精力的。
  3. 架構維度複雜。這針對於系統拆分子系統最爲明顯,現在微服務很熱,有的公司恨不得把每個controller都拆成一個微服務。
  4. 維護難度增加。

經驗原則

在做一些極爲簡單的任務時,往往靠經驗就能完成,甚至一些比較複雜的事情,由老師傅去做也是一會兒就做好了,這就依賴他們豐富的經驗,看似沒有設計,實際上在他們心中已經設計上百次了。

程序員和工程師的界定

之前有人說:少壯不努力,老來學IT。這雖然是一句笑談,但是不難看出,現在碼農的門檻越來越低了,一個完全不懂計算機的人(甚至不知道怎麼開機和關機)找到一個培訓學校學三個月,出來就是“中級軟件工程師”了,而且還帶着一大堆的證書(什麼軟件工程師證、數據庫工程師證、測試證。。。),當然不是說培訓機構不好,它能讓你迅速掌握最實用的編程技術,以最快的速度找到一份薪水還說的過去的offer。然而這種教育模式出來的學生,往往都有一些通病,比如:看不起除了自己掌握了的其它編程語言;只想寫代碼,習慣於在別人畫好的路上行走,很少去考慮設計方面的事;比較閉塞,思路窄,如果自己學的編程語言解決不了的事情就認定是不可能完成的任務了。

代碼的發展規律就是隨着遇到問題無法解決,於是創造了一種臨時解決方案,雖然這種方案有各種弊端,但是它確實是work的,之後有閒暇對這個方案進行完善,就讓它從複雜(使用複雜、實現複雜)變得簡單化(實現更復雜,使用變簡單),進而名聲大噪。在接觸新鮮技術的時候,肯定是先學一些最基本的使用方式,能滿足現有需求,之後一定要再深入學習一下,否則使用過程中出了問題,或者有需求變更都很難適應。

個人認爲,程序員這個詞和打字員差不多,都是力氣活。就像打字員打了很厚的一本書,很累,即使他沒有刻意的去欣賞文章的內容,在一個字一個子敲的過程中也會受到一些薰陶。程序員同理,即使一直在做機械性的操作,是不是也應該去體會一下代碼本身呢?但是如果你是一個作家,就要善於抓住日常生活中的一些靈感,把它們記錄下來,並深入思考,展開,列出大綱,最後成書、校正。這是一個創造的過程,就如同從程序員昇華成一個工程師一樣,也是需要有一定的代碼量,更需要自身的一點靈氣、好奇心、恆心,通過不斷的努力成爲行業精英。

如果非要把程序員和工程師劃分清楚的話,我覺得從工作內容上劃分最明瞭。以上面程序設計的流程看的話,1-5條都是工程師應該考慮的事情,第6/7/9條是程序員該仔細考慮的事情,至於測試工作最好還是交給專業的測試人員,畢竟這樣產品質量才能更有保障。

彩蛋

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章