2013年10月12日 星期六

談程式學習…初學與教學 — 學習篇(三)

(發現自己習慣的分段寫法,好像不適合 blogger 的顯示,試式改變排版試試。)

底下分享自己經歷過,或是看過一些新手常進入的誤區…

誤區一︰程式只不是寫給「現在的自己」看的…

在指導新人的時候,偶而會聽到「這個程式能跑就好,你不要管我用什麼變數、函數名稱」的回應。如果今天只是一個用來展示,未來將會重寫的程式,換言之就是用完即丢的程式,的確沒有必要要求這些。但是在撰寫程式的過程中,修改、擴充既有的程式,實際上佔絕大多數的時間。既使是常常接外包,作新案子的公司也一樣,總是希望能夠留下一些重複功能的程式片斷,能夠作為函數庫引用,或至少好讓人剪剪貼貼。

面對別人或是幾個月前自己寫程式碼是無法迴避的問題,所以程式碼的可讀性,必要註解的撰寫是重要的。並不是要求剛入門就必須要寫出多優良的程式,而是「替未來看這段程式的人著想的心」,必須一開始養成。否則工作之中除了抱怨別人的程式碼很亂很糟之餘,也在不斷產出「傷害別人的程式」,不論是腦細胞,還是感情。

怎麼寫出優良的程式,這是需要許多經驗累積才能學會的。雖然有這類的專書,但是沒有經歷過那些讓人不愉快的經驗,那些原則很難被讀到心裡。常常思考,這段程式在幾週後的自己,能不能看得懂,慢慢的改進,才能寫出更好的程式。

誤區二︰撰寫程式不是在考驗記憶力的活動

早期的程式人員會炫燿自己每天產出多少行的程式,這種現象雖然如今變得比較少了,但是在一些地方還是能看得到。程式碼行數的讓人在無形之中有種錯覺,認為好的撰碼員,每天產出比別人更多的程式,與此同時的腦袋記得住非常多東西,無論是變數、函數、常數定義,以至於引用到類別、框架規則……,覺得「好記性」就是程式人員的價值所在。

「好的程式是讓讓開發者少記一點東西」,這是我從物件導向的程式設計概念中得到的心得。穩定的程式需要的是清醒的大腦和明確的邏輯規則組成,將腦子中寶貴的記憶體都拿去用來記憶變數用途而非思考,實在是一件浪費事情。不會說這個世界上沒有博學強記的天才,但畢竟不是人人都都這種能力。所以讓程式能夠將問題分解,一次一個好好的解決問題,讓自己不用總是擔心的之前寫出的程式片斷,就能夠暫時忘記它們,讓當下能夠更專注。也只有這種方式,有穩定「基礎」程式才能漸漸累積起來,變得更大更複雜而又保持其穩定。

誤區三︰撰寫程式與使用軟體是不同的

雖然程式開發工具也是「軟體」的一種,但是在撰寫程式的當下,要注意到自己的角色已經改變為「創造程式的人」,所以許多軟體會替我們考慮、解決的問題,都必須由寫程式的人負起來。所以不能抱怨為什麼電腦很笨,為什麼程式這麼寫「不會自動改正」,或甚至要求電腦自行解決不正確甚至是衝突的邏輯問題,在程式世界中,這些都是不成熟的想法。

使用軟體可以要求軟體聰明,但軟體之所以聰明,就是在於程式在撰寫當下,許多的例外及可能發生的問題都已經事前被考慮、解決掉了。開發程式的工具,實際上只是協助,而不能代替人們作決定。一個程式之所以語法會發展成這個樣子,都是許多考量、平衡衝突之下的結果,應該要尊重並由其中學習設計者心中的想法,而不是總是抱怨程式不夠聰明想掩蓋自己的不成熟,造成程式的錯誤。

誤區四︰「專業導向?」程式不是只有唯一答案

記得有一次和人討論程式,好心分享自己在物件導向的心得,結果確被回了一句「你不懂  MVC 」讓我當場接不下話。只是一個程式經驗不夠,還不熟悉分析問題,找出解決問題的最佳路徑的人,認為比我了解物件導向其中一個重要概念「MVC」讓人哭笑不得。不是我的自大,而是我才剛使用這個概念建構了一套軟體的基礎架構,被一個用得亂七八糟的人說教,只能說感覺真奇妙。後來知道對方沒有惡意,只是這樣事情的發生,讓我有了一個借鏡,不能犯同樣的錯誤。

不是喊出某某導向,或是某某方法的名字,自己的程式功力就爆增了一甲子。也不是照著某名家的流程教課,每個人都是好老師。我所遇到的人,就是認為照著他書上「MVC」的原則作,所以他的程式已經達到「最高品質」,比起我這個喊不出專有名詞的人,更加了解這個程式概念的精髓。不過事情剛好相反,程式的許多概念都是如此,讀通了才知道設定的目的為何,有什麼限制或是擅長之處,在不同的狀況下去調整才是正道,能發現書上沒提到的定義,用自己的話去解釋,這個概念才算得上是自己的東西。

我並不是說自己有能夠發明新的想法,在學習/思考的案例越多,發覺自己講出來的不同概念,只是書本上沒寫,或是不易表達,容易讓人誤會的概念。我並非創新者,只不過發掘到更多,能更接近概念本質一點而已。所以會鼓勵別人多思考,不要把概念當作教條來背,那是考試用途,而不是用程式來改變世界的作法。

誤區五︰框架不是萬靈單,用錯會傷身

在論壇中,有時候會看到一些「公式化」的言論,像是架網站用 OO + XX ,連接資料庫用什麼,版型用什麼都有定數,似乎一招就能夠打天下,或是在某種案例中就只有這個「唯一最佳解」。換一種角度,說這種話的人本身已經被那些框架、技術綁住,一旦有一天框架不能用,就什麼事也作不了的。

框架的發展是為了能夠減少程式開發中重複操作的功能,或是作為介面協助程式開發者操作其它的裝置、服務。但框架並非全部都是「無可取代」,理解框架的設計緣由、運作原理。才能夠把框架的優勢發揮出來,而不是像前一點一樣認為自己用了框架就多了一甲子的功力。甚至在某些時候,像是設備等級不高,可能跑不動肥大的框架,這個時候還堅持使用,不單造成殺雞用牛刀,框架也成為程式執行上的負擔。

學習程式不能偷懶,也沒有太多近路可以走。不是背了幾個原則,用用幾個框架,用疊床架屋的方式作出一個能動的作品就算得上是「會寫程式」。那不過是一些假象,最後維護問題,會一直累積到爆出來的那一天,不會消失。有些可能不再有人會遇到,但大多數的問題會一直跟著自己,在工作中持續的影響。所以多用點心,多思考原則背後的想法,這樣學到的東西才會真正成為自己的「骨肉」,真正發揮寫程式的價值。

沒有留言:

張貼留言