像建築設計師一樣去寫程式
寫程式碼和寫文章,從某種程度上是相通的,需要邏輯、構架,也要儘可能的簡練。我們之前說過,創作者的時間表和管理者的時間表是不一樣的,編程式碼和寫文章,都是一個孤獨而不能受到干擾的過程,面對螢幕,就是一場自己與自己的戰爭。
同樣,如果說建築師最後的成品是建築的話,那麼程式設計師和軟體工程師最終的成品就是軟體。在實際動工之前,建築師將會將建築的每一個細節,都在藍圖上加以呈現。只是程式設計師和軟體工程師並不會這麼做。或許,這就是為什麼房子很少倒塌,而軟體卻經常崩潰的原因?
設計藍圖會幫助建築師確定他們的設計是可行的。“可行”並非只是保證不倒塌,它同時還意味著,建築能夠達到預定的服務於人的目標。客戶或者開發商,也是通過藍圖去了解一個設計師的想法和他正打算去做的事情。
相較之下,很少有程式設計師會在他們開始寫程式碼之前,連一個粗略的框架都沒有。
大部分的程式設計師都認為:所有不能直接產出程式碼的事情都是沒有意義的。思考並不能直接轉換成程式碼,但是倘若在沒有一個整體框架之前,就開始匆忙碼字,這也是沒有意義的。在程式設計師開始寫程式碼之前,他們應該先充分理解這些程式碼最終所要實現的功能。理解的過程,自然需要去思考,而將思考過程寫下來,對於程式設計師來說又是件很耗時的事兒。
但漫畫家Dick Guindon曾經所過:
寫作是發現你想法有多糟糕最好的方式。
藍圖幫助我們理解建築的構架,同樣,在我們開始噼裡啪啦寫程式碼之前,我們也需要一個類似的“藍圖”,也就是“註釋”(specification)。
“註釋”不能直接產出程式碼,所以被很多程式設計師忽視。但沒有“註釋”,直接開寫,就好像讓建築承包商沒有設計師的圖紙就直接上陣一樣。
也有人會說,將程式設計師和建築師類比,並不合理。因為拆牆重建困難,但刪掉重寫則相對容易,所以,程式設計師可以先寫著,不滿意再改。
這種想法是錯的。為什麼呢?因為Debug的過程也非常耗時。
我最近也完善了一些程式,這個過程需要對程式構架本身有個非常清晰的瞭解。我花了接近一天的時間去了解整個程式的運作機制,而倘若有註釋的話,這可能只需要5分鐘的時間。
為了避免引入bug,我需要理解任何小的調整可能帶來的結果。而沒有註釋,使得我必須花很長時間瞭解每條程式碼的含義和作用。尤其對於上千行的程式碼來說,首先讀懂它就很耗時,想要改掉其中的某行,我必須瞭解小的調整可能對整體架構和前後邏輯造成的影響。最終,在超過一個星期的時間裡我只改了180行程式碼,而這對一個動輒千行的程式來說,改變算是很小的了。
Debug只是寫程式碼一個小的組成部分。這數千行的程式碼很多我10年前寫的,儘管我對它們仍有些許殘存的記憶,但如果有註釋的話,修改程式碼的過程會更加順暢,我不僅能在最短的時間裡讀懂整個框架,還可以準確定位我所要修改的部分。
改別人的程式碼就更加困難了,每個人的思維方式都不一樣,如果沒有註釋,我通常要花費兩倍以上的時間,只是為了修改一些細小的錯誤。
那麼,我所謂的“註釋”又是指什麼呢?“註釋”是指附在程式碼之後的,一段形式化規範說明的文字。但需要區分開的是,如果只是去打造一個工具室,我們是不需要一整套摩天大樓藍圖的,同樣,對於小的演算法來說,我們也不需要給每條程式碼加上註解。
我最近要編寫的程式,最多稱得上是“平房”,而非摩天大樓。我會為我的每個演算法附上註釋,有些非常簡單的演算法,我通常只會插上一兩句註解。我有一個非常簡單的法則來幫助我和其他人瞭解我的程式:註釋應該儘可能有效地去幫助任何一個人理解和使用我的程式碼。
一旦我知道一行特定程式碼要做的事情後,寫的過程其實是非常簡單而直接的。也有些程式需要用到非常規演算法,這時我會寫下我演算法的主要思路,來試探其可行性,同時也幫助我更高效的Debug。
除了那些特別重要的程式碼,通常我的註釋都是非正式的。在過去的十年裡,需要我寫準確並正式註釋的次數並不多。但對於一個非常複雜的系統來說,註釋的重要性不言自明。很少有工程師會在構建一個複雜系統時,花時間去寫好註釋。有些學校也會教你怎麼寫註釋,但更多時候都是教你如何寫好程式碼。這需要實踐,如果你沒有畫過搭建一座平房的圖紙,你很難直接畫出摩天大樓的藍圖。
寫好註釋也沒有一個簡單的準則,但有一點你要儘量避免,那就是用程式碼去解釋程式碼。就好像你不能用兩個人們都不理解的東西,用其中一個去解釋另外一個。建築師也不能直接用磚塊來告訴你,他想搭建一個什麼樣的房子。
瞭解一個複雜的系統,最好的辦法就是將其核心用簡單的概念,抽象的概括出來。初中數學的一些基本概念可以用來幫助你寫好註釋,比如你可以用一些集合、方程和簡單的邏輯來解釋你的程式碼。對於一些複雜的演算法,你也可以引入數學裡沒有過的概念來加以解釋。總的來說,如果你的註釋偏離一些抽象的數學基本概念越遠,理解起來也就越困難。
思考並不能保證我們不犯錯,但不思考,犯錯是無法避免的。 註釋能幫助我們將錯誤最小化,同時它還能提高我們改錯的效率,節省我們的時間。
英文來源:Wried
相關文章
- 像程式設計師那樣去求婚程式設計師
- 為什麼使用者體驗設計師需要像建築師一樣思考?
- 像談戀愛那樣去招頂級程式設計師吧程式設計師
- 8月書訊 | 像大師級程式設計師一樣思考程式設計師
- 程式設計師築基之路——如何寫好一個單例程式設計師單例
- 程式設計師這樣寫程式碼程式設計師
- 像程式設計師一樣思考——提高解決問題的能力程式設計師
- 趣文:如果像招聘程式設計師那樣租車程式設計師
- 像招程式設計師那樣招司機,結果……程式設計師
- 像bootstrap一樣的去做web程式設計bootWeb程式設計
- 趣文:如果像招聘程式設計師那樣招聘木匠程式設計師
- 在遊戲裡設計房屋的建築師們遊戲
- 像鳥一樣思考更好的並行程式設計並行行程程式設計
- 寫給未來程式設計師的建議程式設計師
- 怎樣尊重一個程式設計師程式設計師
- 1024 寫給程式設計師的一些建議程式設計師
- SnippetsLab - 像納博科夫寫小說一樣寫程式碼
- 手寫一個抖音視訊去水印工具,千萬別剛一個程式設計師程式設計師
- 如何像Python高手(Pythonista)一樣程式設計Python程式設計
- [書呆子]像Unix那樣去生活——《LInux/Unix設計思想》Linux
- 遠見卓識 像CEO一樣編寫程式碼!
- 如何像程式設計師一樣思考 - 解決問題的經驗與教訓程式設計師
- 某程式設計師去相親程式設計師
- 故事樣設計——怎樣像使用者一樣思考?
- 我給程式設計師新手寫簡歷的一些建議程式設計師
- 程式設計師如何寫好簡歷 && 一份優秀的程式設計師簡歷是什麼樣的?程式設計師
- 一個老程式設計師的程式設計之路,寫給年輕的程式設計師們程式設計師
- 一個老程式設計師的建議程式設計師
- PHPer面試指南-結語:寫給程式設計師的一些建議PHP面試程式設計師
- 你可以去當程式設計師了程式設計師
- 程式設計師的樣子程式設計師
- 學會怎樣尊重一個程式設計師程式設計師
- 一枚程式設計師的寫書計劃程式設計師
- 程式設計師畫像,十年沉浮程式設計師
- 建築設計行業怎樣實現資訊全面整合和共享行業
- 菜鳥程式設計師都是怎樣寫程式碼的?你也可以學一手程式設計師
- 招一個寫程式碼的女生:國外女程式設計師是什麼樣的程式設計師
- 建築裝修設計軟體