我自己的寫Code美學_Part1

一些新技術像是深度學習或是BigData,
一堆公司就跟青少年在宣稱他們的性經驗一樣,
每個人都在談,每個人都宣稱自己做了。

要成為一個專家要花一萬個小時,
但要沈浸進入心流的才算,頻繁中斷的時間要在這一萬個小時的範圍中剔除。
魔術數字,一萬個小時。
每天8小時是
10000/8
Ans = 1250
Ans/365
Ans = 3.424657534
快4年,而且是專注且有效的練習。
是"自己"練習。而不是丟給前輩叫他們解。
不只重覆一遍又一遍,還要嘗試做出超出當前能力的任務,
事後分析自己的表達,並修正錯誤。
練習不單是做擅長的事,還有做自己不擅長的事。

程式碼的壞味道,寫到一定程度就會有這感覺。
壞掉的程式碼是有異味的。

過度複雜與高度耦合的區段,都是一個個骯髒的程式碼炸彈。
炸開後,犧牲品就是時程。
當意外遇見骯髒的程式碼要估出合理的時程將會變的異常困難。
而超出時程付出的代價是信譽。
公司輕視信譽,哀哉,這是台灣軟體業的通痛。

刪code是不是寫程式的一種?
寫的少,維護的也就少,出現bug的地方也就少。
多寫出來的東西,別人都要花時間讀,應該要刪除。
留住能夠剛好把工作完成的code。
額外多出的變數要刪除
刪掉那些用不著的全域變數。
簡單是因為刪簡。

是誰把糟糕的程式設計師找進來?
良好的程式碼並不會憑空冒出來。
差強人意的程式設計師與偉大的設計師之間的差異是:態度。
與心態有關。
假如你不關心同事,也就懶的在程式碼中寫下清楚的註解。
同事是看你的code來決定對你的看法。
不在乎別人對你的看法?
原來是讀了阿德勒被討厭的勇氣,而打算實作啊!

不要寫只看似能運作的程式碼
但若要趕時程就都是那種code的型態。

無論何時,接觸到一塊code,
要盡所能在離開這區段時,讓它變得比當初發現它時還要來的更好。
更好的結構,更好的命名,更好理解。

寫出code那些省下來的時間,
是為了讓我可以更多時間陪孩子,
或做我自己想做的事。
結果…又在休息時間寫code。
假鬼假怪的自己。

奮力解決一個難題,以為別人應該要連讀程式碼時也該這麼難理解與難維護。
甚至是讀的人是六個月後的自己。
不是這東西困難。
而是寫的人沒有在替後來讀碼的人想。
所花費心思所寫的每一行程式碼,都代表給一封將來給其它人看的訊息。
解釋給另一個聰明的人聽,說明是怎樣解決這棘手的問題。
在未來,有人看見這段code說,太棒了,我完全可以理解這code所完成的事情,
它是設計是如此優雅,充滿了解題的美感。

如果連簡單的事情都做不好,拼字錯誤,按鈕設計錯誤。
人家還信賴這軟體嗎?

如果code需要註解來解釋,請考慮重構到它不需要註解。
註解只註高階意圖。

單位上的錯誤。
1999年火星氣候衛星,軟體錯誤。
基地的軟體以磅為單位,但太空船使用牛頓。

限定user輸入範圍,以及預設值,避免錯誤。

有時候,解決問題的方法是放下滑鼠出去走走

要加強程式設計能力,實在用不著多讀一本書,而是去讀source code。

從中"犯錯",從錯誤中吸取經驗,得到比閱讀技術書籍所無法傳遞的體會。

看完航海相關電影不代表你就會航海了

有些程式碼留住的話,
會導致那些細小怪異的程式碼缺乏清楚的目標。

不能用一個按鈕評估事件複雜度。
google首頁只有一個按鈕。

手中的工作完成度有90%,但無盡的卡在10%的除錯。擁有的進度並不是90%,而是沒有完成。
除錯可以學習,但整個專案沒有進度。
修bug沒有進度,提升只有你自己。
沒有"能見度"的進度,等於沒有進度
我曾遇到開發報表不填的。
故意不填開發進度,讓它不可見。
隱藏自己的能力不足,避免被人知道超時了。
不填時間管理,就可以不讓別人or自己,知道逾時了。

每次Code Review時,一定讓它比之前好一點。
每次把檔案開啟來,多少要改善程式碼
或許只是改變數名稱,或是將過長的方法拆成兩個。
只是像上完廁所要洗手,垃圾要丟垃圾筒一樣的好習慣而已。

不要拿自己的時間去證明 , svn會出錯,編譯器會出錯,
不如好好找出自己程式上的錯誤
去除那些不可能發生的,剩下的即使再不尋常,那也是真相。
曾遇見一個菜鳥,三不五時就在擔心svn會出錯。
其它人已經開始動作寫程式了,他還在把專案另外複製出一份來,
只敢寫在另外複製出來的那一份,等自己覺得沒問題時,再合併程式碼…
我制止他這種浪費時間的開發方式,他回說:他這是謹慎。
…你弄出的bug遠遠還比svn多。
公司不是有筆試有面試嗎?誰面試這傢伙且又讓他進來的?

花在讀code的時間比寫code的時間多
要花時間取好命名,因為它才能清楚表達出它的行為。
上一個花括號{與下一個},要在一個螢幕的距離內,
腦海裡可以保存更少的狀態。
程式碼方法,行數的上限是一個螢幕的距離。
這與人的認知能力有關。

盡量避免全域變數。
方法的參數的上限是4個,多的話,盡量整合成一個物件。
傳遞資訊越少,需要推論的也越少

避免先叫getter,再做物件工作。
物件應該本身自己判斷。
直接要求物件工作,而不是先幫物件判斷。

程式碼,應該是對下一個接手的程式設計師表達它自己。
可以把很難的東西簡化才是高手。
把難的東西寫的很醜,不是高手,這是在假冒高手。
這行因平庸的居多,為了不想承認自己的平庸,
面試時只會出了一些怪題目想考倒別人。
寫程式時,連註解也不寫。
面試官啊!誰又是你當時的面試官?

何時不寫註解也是技巧
程式碼已經說出的,用自然語言再說一遍不會增加事情的正確性與真實感。
註解掉的程式碼也不能執行,為何還要放在其上
應該把註解當程式碼,每段註解,都要給閱讀者價值,
沒有價值,就是浪費,應該刪除or重寫
註解應該說出程式碼表達不了的
與其為糟糕的class or方法註解,不如直接更名。
與其為一個函數中的大區段註解,不如抽出成獨立的方法。

如果方法中有And要注意。
因為你合併了兩個事。
這應該要拆開。

有些例外是客戶端設計師的錯,破壞了方法的合約,
是呼叫者自己要檢查的,合理的回應,就是拋出例外。

對於自己的東西,不要怕弄壞。
別人的東西,則要小心別弄壞 。最好別去重構別人的東西。
不要自大到認為你比他厲害。
若這人還在公司,就別重構他的東西。
你可以做的事絕對很多,因畢竟那已穩定運行了。
只能改自己的程式,
不然弄壞了還要想辦法救回別人的程式。

懶惰,但是是聰明的懶惰,不寫垃圾。

從遠處看任何事都很簡單。
沒有開發經驗的經理會認為程式設計師的工作很簡單
沒有管理經驗的程式設計師也會認為經理做的事很簡單
沒有積極參與開發的事,你就會以為事情很簡單。
像魔法一般的完成,且魔法持續在發生。
不要低估別人要做的事。
也不要低估程式的困難度。

寫程式最困難的部份是"思考",最難被人看見。
思考看起來與發呆同表情。

DRY。Don’t repeat yourself。
DRY若是在DB的話,就是正規化
開發人員辨別出有程式碼在重複用,這就是經驗了。
清除重覆的程式碼,可以讓你得到經驗。
重覆就是在浪費,因為每一行都需要維護,
重覆只是毫無必要的膨脹了程式碼,當未來有bug時,每個都要修一次。
增加了複雜度。

只給User少數選擇。
開出來的選擇與功能,都是將來要去維護的。

靠魔法coding的程式設計師,怎麼壞的不知道,壞了也不會修,
有遇見過有程式設計師連何謂好,什麼叫有執行正確也不知道。

大量的if then else
之所以會大量產生是因為封裝被破壞了!

浮點數不是實數!
實數是連續不斷、沒有縫隙,而浮點數"精度有限",所以浮點數不是實數
浮點數彼此間的分佈也不是均勻的
浮點數會有捨入誤差
浮點數是用在科學運算,不是在用金融運算。
金融c#要用decimal
二進位沒有辦法精確表示小數,所以才會有"不同精度"的浮點數型別

當API暴露自己,違反了封裝原則,重構就也痛苦。
API若讓User能繼承就會很麻煩,有些物件不能由外部建立物件。

菜鳥亂問問題,提問題時也不說自己的測試路徑與當時的使用情境,
期待一個魔法師出現。

高手是多年來專注於學習與"精煉思維"的過程。
高手其實就是擁有無窮好奇心的聰明人
跟比你聰明的人共事的時候,做好打雜的工作,提供充份的"情境脈絡",
讓他有效率的發揮技巧。
但要庸材承認另一個人比他聰明是困難的,庸材反倒有著更多的驕傲。

在程式領域,有些人努力加班,僅是欺騙自己與同事,
讓人相信花了很長時間在辦公室,就代表為專案做了許多貢獻。
事實上,少做一點貢獻度可能更高,不可能坐滿8小時後,還能思考複雜的東西。
與其3個小時的加班,說不定早點回家,休息一下,明天早上可能只花1小時就解決了。
八小時之後已經沒有什麼生產力了。
努力過頭反而是成效不彰。
寫code不是短期衝剌。
但老板卻認為加班才是認真。
腦外科醫生每周60小時都在開刀,飛行員每週飛六十小時?
工作前的準備與教育還是他們職業的核心。
尋找聰明的工作方法。超過每周60小時,代表你沒生產力。
但在台灣?既然被叫鬼島是名符其實的。

除非是開發嵌入式,不然我自己認為學vim,
真的是蠻假鬼假怪的一種行為。
用vi耶!啊不就好棒棒。

你是程式設計師,不是使用者,不要假裝你是使用者

先懷疑client端的設定

在自己寫的範圍中別怕弄壞東西,別人已寫好,正常運作的,
不要自大的想替他重構。

下班不開機

在做好與快速做完之間選擇,一堆擱置下來的問題,就成了技術債
儘快償還技術債,否則將因"草率的行為"嘗到苦果。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s