品質來自對細節的講究

“品質來自對細節的講究”是我一直以來的信念,對於軟體開發上的種種細節我都不放過,盡量不讓自己處於模糊地帶,這樣才能在下次遇到相同或類似問題時得以迅速理解並解決,除了可以縮短處理問題的時間外,最重要的是可以提升軟體品質,以及在撰寫程式初期能就避免細節中潛藏的瑕疵。

我目前在公司裡最主要的工作是帶領一群軟體工程師開發軟體專案,時常帶大家一起寫 Code、看 Code,有時間的時候還會替他們做 Code Review 並點出一些程式撰寫的問題或提供更好的寫法,對他們的要求不曾少過。

曾經有位工程師問我:「保哥,我以前都一直認為寫程式不就是 "解決問題" 而已嗎?而且以前的主管也從來不會問我為什麼要這麼寫或哪裡寫不好要改,為什麼你還要花時間看我們寫的 Code,有時還會要求我們將寫好沒問題的 Code 進行重構(Refactoring)或整個打掉重練?」

我回答他:「我們是個軟體團隊,每個人都需要自律,並且負起一位工程師應付的責任,每個人的技術知識都應該不斷精進,你不應該滿足於 "解決問題" 這個層級,而應該進而 "理解原理" 與 "探究細節",從這個角度出發所寫的東西不但有成就感,也更踏實。」

我還說:「我們彼此都應能互相支援,任何時刻都可以輕易的接起另一位工程師寫的程式並讓軟體繼續發展下去,沒有怨言,只要架構清楚、程式碼撰寫習慣一致就比較不會有問題。像我們公司有些四、五年前做的專案到現在還在維護,如果當初沒要求程式寫法,我想現在維護起來一定非常辛苦,想想你過兩年後如何維護你現在寫的程式吧。」

我是個熱愛程式設計的人,對我來說寫程式很有趣、很有新鮮感,但有趣的地方絕不止於 "解決問題" 而已,我曾經也這麼想過,但後來我理解到,問題總會有解決的一天,但當同樣的問題不斷出現時,你會知道問題可以解決,但慢慢的你就會失去新鮮感、失去成就感,寫程式就會變成例行公事,就不好玩了。

軟體不像建築工程般做不好會危及人的性命,我們不見得需要先規劃好所有細部藍圖才開始施工,我們只要有個架構、瞭解大致的需求就可以開始動工了,做錯了就是 "",責無旁貸的"",寫軟體一定要預留 "修改" 的空間,這就是我盡力要求 "可維護性" 的關係。我們公司一年可以接數十件大大小小的軟體專案,如果每個專案都只能由開發的人來維護,那人力配置一定會極度不平衡,相對的軟體品質遲早出問題。

再者,你應該也知道客戶講的東西經常 "昨是今非",越大的案子越是這樣,連簽了名的文件都還能不算數,對於一些小範圍的更動軟體來說本來就應該是合理的,但我看到有些朋友對於客戶修改規格的舉動經常忿忿不平,還有一些經常接案的外包人員來說,也經常在為一些很小幅度的規格變更堅持己見,但是光花在不願意修改所溝通的時間我想軟體早就不知道修完幾遍了,一切都出在對軟體專案錯誤的認知,或是自己的寫的軟體不容易修改所做出的 "合理反應"。

客戶心情好或是內心極度愧對我們時,有時還會好心的主動提出願意付錢請我們修改程式,我們為了繼續經營客戶,這種案子當然要繼續接下去。所以無論如何只要是我們開發出來的軟體,一定要盡量預留軟體修改的空間,以免每個客戶都只做一次生意,那很累。若是客戶不要求,且案子真的確定完成後需求不可能會變更情況下,那也真的沒什麼好要求的了。

隆重聲明一下,我當然不可能認同客戶狂亂的規格變更,凡事總有個界線在,我只是想強調做軟體專案應該與客戶站在同一陣線,以客戶滿意度為依歸。但若遇到超級沒 sense 又很愛凹你做東做西且打死不追加預算的客戶時,你可以有兩個選擇:(1) 直接退錢說不做了 (2) 硬著頭皮改到底。

我幾年前曾經花了幾萬塊去上超強記憶力的課程,印象最深的只有一句話:「人的 "記憶" 幾乎是無限的,人之所以會忘記是因為 "回憶" 的方式有問題。」

技術的細節如此的多,有人會問我:「我怎麼可能把所有細節都記得,有需要再查 Google 就有了啊。」首先,Google 查到的東西不見得是對的,你不瞭解細節自然也無法判斷對錯。當然,我也不例外,我會忘事情,技術細節也會忘,但那不是忘記,只是回憶不起而已,有些知識被消化了,已經進入潛意識,寫程式時你會很自然的會將你曾經學過、認真研究過的東西都給用上,只是你不知道而已。

若真的要回憶起舊時記憶的最佳方式,就是不斷的在腦中建立索引!像我自己寫部落格文章,腦子裡記得的只有關鍵字而已,這些關鍵字就是我的索引資料,因為都是自己寫的東西,關鍵字自己最清楚,所以我隨時可以找到想要找的資料,找不到才會去翻 Google 的資料。

我前幾天就有個有趣的經歷,我在看別人寫的程式,他寫的資料統計程式一直有數據不正確的情況,我看了好幾個小時竟看不出問題所在,最後無意間發現原來他寫的類別定義了一堆類別層級(Class)的欄位變數(Field),並且共用於多個方法,他以為這些變數只要宣告一遍然後所有方法(Method)都可以直接使用很方便,卻完全沒有想到這會造成極大的副作用(Side Effect)。我最早一開始寫程式時很喜歡使用「全域變數」,當時是我在寫 Perl、PHP 的時代,但就因為吃過很多 Debug 的虧,老早就不用這種開發技巧了,但在看別人的 Code 時卻不會直覺的想到,只有自己寫 Code 時才會避開這個問題,而這就是對技術細節內化的最佳證據。

有一句話說得很好:「時間花在哪裡,成就就在哪裡」想要做好軟體工程師的角色,就應該多花時間專研技術細節,這並非是一條不歸路,做軟體的人,不滿意隨時可以轉換跑道,但你走這條路的時候不認真就是浪費時間,你只要有付出努力就一定會獲得有價值的東西,畢竟寫程式是腦內革命,不是每個人都走的下去的,但要長期走下去就必須要有源源不絕的熱情、對新知的無限渴望與用不完的新鮮感。

以上是我的個人觀點,歡迎切磋討論。

  

此文章由 will 發表於 2009/5/27 下午 09:02:29

永久連結 | 評論 (8) | 此文章的RSSRSS comment feed |

分類: 團隊合作 | 心得分享

標籤: ,

收藏:

C# 編碼規範(Coding Standard)參考文件

我長久一來一直苦惱於不知道如何訂定 C# 編碼規範(Coding Standard),雖然很久以前我就有看到微軟的開發類別庫的設計方針文件,不過內容過於嚴謹,況且我們的工程師大多是開發 ASP.NET 居多,並不常開發類別庫(Class Libray),所以我若用 MSDN 的開發類別庫的設計方針要求工程師們可能會有點不切實際。

所以我自己與其他工程師之間,其實並沒有什麼特別明訂的 Coding Standard,反而我們十分倚賴 Visual Studio 的預設命名規則來開發,一來工程師不用特別記憶有哪些規則,二來透過工具產生名稱其實是蠻方便的。即便沒什麼規定,不過我在開發 ASP.NET 的時候的確有幾個最基本的原則:

  1. 如果同一類型的物件很多(例如在 DetailsView 中有很多欄位),會將變數的型別簡稱(如:btn)訂在後面。

    例如:在套用某個資料庫欄位 Name 並使用 TextBox 控制項時,我會將 ID 命名成  Name_btn

    當在寫 Code Behind 程式時,透過 Intelli-sense 打欄位前幾碼就可以馬上找到物件,不用選擇太多,如果 btn 寫在前面,在 Intelli-sense 時就會選一推物件,反而造成困擾!
  2. 如果那一頁的物件數量少且型別也不一樣,我才會將型別簡稱打在前面。

總之,唯一目的就是讓 Coding 的工作比較有效率的進行。不過,這樣的開發模式在很多情況下卻不是真的有那麼方便,例如說專案大、人多的案子,程式碼也就會跟著多了起來,整個專案程式碼就真的很容易亂掉。另外,有些小型的 Console Program 因為程式過於獨立,所以不同的工程師所寫的程式碼南轅北轍。因為我時常在 Review 我們公司工程師所寫的程式碼,有時後真的 Review 的很痛苦,我想我應該要好好的訂定出一個編碼規範了。

昨天在 Lance Hunt 的部落格發現有一份精簡版的編碼規範( C# Coding Standards document ),看完後覺得還蠻不賴的。這份文件內容不多,連封面、版權宣告、目錄、包括所有內容全部加起來才 22 頁而已,內容包括了有 命名方針(Naming Conventions), 編碼樣式(Coding Style), C# 語言用法(Language Usage), 以及物件模型與API設計(Object Model Design)等主題,最後還有列出一些參考連結。

此文件中所有的內容都是以清單與表格的方式呈現,並包括一些錯誤範例與正確範例的對照,文件架構十分清楚,英文單字的使用我覺得都應該是大家容易瞭解且常看到的單字,且用字也十分精簡,所以閱讀起來並不會很吃力。

Lance Hunt 撰寫這份文件的目標如下(譯自 C# Coding Standards document 網頁):

  • 涵蓋所有在 C# 中主要的語言特性
  • 提供編碼樣式與語言用法等指導方針(並非提供 "撰寫語法" 的規範)
  • 大多編碼規範都有提供程式碼範例
  • 有結構的描述規範,方便閱讀與使用
  • 定義清楚、明瞭的規範
  • 使用一致的詞彙與規範樣式
  • 僅提供在實務上清楚且明確定義的規範
  • 讓開發人員透過這份文件的規範避開一些常見的程式撰寫問題
    原文: Lead developers to a "pit of success" and avoid common "pits of failure"
    譯註: 引領開發人員跳入「成功的圈套」以及避開常見的「失敗陷阱」

相關連結

  

此文章由 will 發表於 2008/10/12 下午 04:02:38

永久連結 | 評論 (7) | 此文章的RSSRSS comment feed |

分類: .Net | C# | 團隊合作

標籤:

收藏:

簡報:Subversion 版本管理與協同作業

這是我去年在公司內部教育訓練時教授 Subversion 時所做的簡報檔,有興趣的可以看看:

 

若您想全銀幕觀看可以點選以下網址:

http://docs.google.com/TeamPresent?docid=dfj7hts2_6g4g5zsdv&skipauth=true

 

  

此文章由 will 發表於 2008/3/1 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 團隊合作

標籤: , ,

收藏:

保哥的軟體哲學

我本身帶領軟體開發團隊一段時間了,且近幾個月也在微軟技術社群討論區參與社群討論,偶爾會看到有人詢問一些軟體開發的觀念與學習的方法,我個人大致整理了一下這幾年來的心得,大略列出幾點跟大家分享:

保哥的軟體哲學(1)

在團隊中不一定要做老大,但有機會的話不要做老二,培養領導能力,學習如何建立團隊,這經驗不是每個人都有機會能得到的。 

保哥的軟體哲學(2)

培養負責任的態度,如果真的不適合寫軟體,也可以做一段時間再轉行,因為寫軟體可以培養你的邏輯思考能力。

保哥的軟體哲學(3)

有時間就多想:軟體只要規劃的好,可以節省10倍以上的開發時間。

沒時間就多做:連想的時間都沒有的話,就從寫 Code 的手感中尋找下一個靈感。

保哥的軟體哲學(4)

沒觀念就多看書,但有觀念者還是要多寫Code累積自信,寫軟體的自信是一行一行的 Code 累積起來的!

保哥的軟體哲學(5)

沒經驗就多做事、少抱怨,但有經驗者要少寫 Code 多思考 (但還是不能常抱怨)

// 做事 = 寫 Code

保哥的軟體哲學(6)

寫程式是很「個人」的事,寫程式的品質直接影響你的個人品牌,別讓負面情緒(抱怨,失望,討厭,灰心,逃避,拖延,...)影響你程式的品質。

保哥的軟體哲學(7)

寫程式是很「團隊」的事,團隊的紀律與規範非常重要,團隊成員有一致的流程與共通的習慣可以讓你避免陷入泥沼,也可以提升效率。

 

  

此文章由 will 發表於 2008/2/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 心得分享 | 團隊合作

標籤: , , ,

收藏:

請勿將某些檔案類型的檔案簽入到 Subversion 版本庫

我們在用 Visual Studio 開發專案的時候,常常都會有人將一些個人的設定檔也簽入到 Subversion 版本庫,例如說:*.suo, *.user 等。導致每次開啟 Visual Studio 的時候都會變更這些檔案的內容,造成每次簽入變更到資料庫時都會將這些檔案也都簽入,當其他團隊成員在做 SVN Update 時,會造成檔案衝突的問題,對大家來說也是個困擾。

我這裡整理出一些常見的檔案類型,請不要將以下檔案簽入(commit)到 Subversion 版本庫:

如果你已經簽入(commit)到 SVN 版本庫的話,必須用以下步驟將檔案從版本庫中移出,並從下次起忽略這些檔案:

  1. 先備份這些檔案,然後刪除這些檔案
  2. 簽入這些刪除的變更
  3. 將步驟 1 備份的檔案還原
  4. 重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list ( 如下圖示 )

    重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員:

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員

 

  

此文章由 will 發表於 2008/2/20 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 團隊合作 | 專案管理

標籤: , ,

收藏: