2008/09/11

Code是寫給誰看的?-4/4關於「程式原理」

這篇文章是要回應網友MaoYang的文章《讓程式碼像閱讀故事一樣容易》。

我在上一篇《Code是寫給誰看的?-3/4關於「團隊合作」》中,提到「團隊合作」是不可見、或大家根本沒有發現的重要東西。

如果某些Programer不懂團隊合作的重要性了,那至少也應該寫出正確、可讀性高、易維護的Code吧?但從和我配合的軟體部門主管口中知道,那並非事實。這也是我個人認為MaoYang的文章中背後所隱藏的最主要問題。

學校不重視程式原理


MaoYang說學校的教授不教Coding,我認為其實不是老師不教Coding,而是老師並不重視Coding後面所需要知道的程式原理,而學生也不知道應該在學寫程式前先學程式原理。

程式原理的比喻


但程式原理有這麼重要嗎?我舉一個簡單的例子大家比較容易了解。

我先問一個很簡單的問題:請問一般人能在不接受支援的情況下,隨時寫出一篇新聞報導嗎?

我想,這件事對大多數的人而言難度並不低,因為要寫出一篇報導前,首先要面對的就是文字表達能力的問題:
  • 用字必須夠精準,才不會讓人混淆;
  • 熟稔各種敘事的技巧,以免寫出言不及意。

也就是說,他的中文能力至少要先達到有能力寫作文的程度。但對大多數人而言,光是達到這點就有些困難了。

寫作文的程度


我再繼續問:一個人要學多久的中文,才有能力寫出能達到以下程度的作文呢?
  • 前後順序清楚、沒有錯字的程度?
  • 敘述清楚、用字精準的程度?
  • 深入淺出、條理分明的程度?
  • 精采絕倫、拍案叫絕的程度?
我認為上面的程度對每個人所需要的時間不一,但要寫出最簡單的流水帳作文,至少也要達到「敘述清楚、用字精準」的程度。

但你可以想想看自己:看了多少的文章?寫了幾篇作文?到了幾歲?才達到這個程度的,你就可以想見要達到能寫出一篇作文的難度了。

即使當一個人能寫出「敘述清楚、用字精準」程度的作文後,接下來就是要學習更進階的敘述新聞事件的專門邏輯。

因為撰寫新聞事件有特定的敘事邏輯:先講結論、正反意見。我們必須先學會了這個敘事邏輯,並經過實際的練習,才有辦法寫出讓一般的讀者很容易了解的新聞報導。

新聞報導和寫程式的關係


那新聞報導和寫程式有什麼關係呢?如果你將前面新聞事件比喻中的:
  • 寫作的對象由人改成電腦;
  • 使用的中文改成電腦語言;
  • 新聞事件改成所欲的程式功能;
  • 新聞敘事邏輯改成程式撰寫邏輯。
你就會發現,撰寫一篇精湛的新聞報導的過程其實還真像撰寫程式。

所以,一些資深的Programmer會發現外國的程式原文書,常會用Art(藝術)這個字來稱呼所寫出來的程式。當撰寫程式達到這個境界,Code本身自然也就提昇成一種藝術。

以英文為First Language


因為,對這些撰寫書籍、以英文為First Language的資深Programmer而言,他們認為寫程式就和寫文章非常接近:當心中的感動足夠了,自然能用程式語言寫出文筆行雲流水、耐人尋味的Code,也自然能達到MaoYang所謂「讓程式碼像閱讀故事一樣容易」的境界。

也因為對他們而言,寫程式就像是用母語在寫一種不同表達方式的故事。所以,每一個人的code,就像是文章的寫作風格。文筆好的人,寫出來的文章行雲流水。文筆不好的人,寫出來的文章拗口難讀。

以英文為Second Language


但對像我們這些英語是Second Language的學生而言,寫程式卻是一種必須經過「學習」的過程。

我們必須先將以First Language為主體的邏輯,轉換成以英語為母語所設計出的程式語言來表達。這個過程對我們而言其實並不人性,就像我們一開始學習英文時,我們會先將自己的意思先用中文思考,再轉換成英文是一樣的。

First Language的差異


我自己認為對以英語為First Language的學生和非以英語為First Language的學生而言,學習Coding的難度是不同的,而且後者的學習者難度更高。 因為學習的難度不同,結果是台灣的學生如果想學寫得更好的程式,卻都只能靠土法鍊鋼的方式:自己找書看、或看別人寫的Code,從中臨摹、體會經過原作者文筆與表達方式轉換後的內容,從中學習到程式背後創作時的抽象原理。

這個過程就像是要求一個母語為中文,且已學英文單字、片語、文法的人不先學新聞撰寫原理,就要求學生只看別人的英文報導,就期望學生能寫出一篇「敘述清楚、用字精準」的英文報導是一樣的道理。

而我所謂的「抽象原理」是什麼呢?在新聞報導中是「新聞報導的撰寫原理」,在電腦語言中是「程式原理」。

當然也許有些人(如:MaoYang)可能才智出眾,能很快的從別人的程式中學到程式背後的抽象程式原理。但我自己大膽地認為:絕大多數的學生、和Programmer並不一定都能從這個土法鍊鋼的方法中,理解到這些程式背後因為思維差異所表現出的原理與及其差異。

First Language的明顯差異


大家可能會對我的觀察,感覺起來好像很不可思議。但你可以直接觀察我們常使用程式的演進過程中:
  • 設計出一個新的語言(如:Java)、
  • 設計新的軟體開發架構(如:Frame)、
  • 制定程式開發規範(如:UML、CMMI)
發現,幾乎所有的參與成員都是以英文為First Language的資深Programmer,但難道非英文為主的Programmer就不夠優秀?

對此,我個人認為學習Coding的過程與方式,才是決定能否在這個領域創新的關鍵。

因為,我們目前所看到的絕大多數的程式語言都是以英文的思維去設計的,因此,是否真的能否掌握程式語言後面的口述語言,可能才是最重要的關鍵。

所謂的程式原理


以前一個教計算機概論的老師說的好:使用什麼程式語言不是重點,重點是能否了解程式語言的本質。

他說,在外國有一堂基礎的程式原理的課。授課老師會在這堂課中,穿插各種程式語言,藉由使用不同的程式語言,來說明實際Coding的簡單範例,讓學生學會程式原理。

因為在這堂課中,使用什麼語言將不是重點,所以交的作業也沒規定非得用那種程式語言寫,重點是讓學生學會眾多程式中都具備的程式原理,進而以這個原理去操作眾多語言,並發現眾多程式中相異的部份,進而讓學生有興趣去探索設計一個程式更深層的設計原理或觀念。

而且,更重要的是這堂課不一定要資訊相關的學生才能上,任何一個系所的學生都可以選修這門課。因為,這門課的目的就是要藉由「口述語言」來教學生學「程式語言」,讓大家能駕輕就熟的學習使用程式語言。 我看過一些學校的課表,只有資工系有開這門課,而且是必修,但未開放外系學生選修,這個其實就和外國的教學理念有很大的差異。

Code到底寫給誰看的?


我認為有很多的Programmer都有前面三個主題的情況,因為他們都沒有學習到一個更容易被忽略的錯誤觀念:Code是寫給自己看的。我認為這是他們會有前述三個情況的主要原因。

但這個絕對是個錯誤的觀念,因為事實上「程式語言」設計出來就是要給人看的,寫出的Code自然也是給別人看的。

你如果將「Code是寫給別人看的」套到我寫的這三個主題:
  • 在團隊合作上,如果Code是寫給別人看的,Member就能很快地看懂你的Code;
  • 在課程安排上,如果Code是寫給別人看的,那就需要重新檢討目前的課程安排方式,並安排一些和Coding沒有直接關係(不是撰寫程式所需的必要課程)、卻很重要的課程;
  • 在程式原理中,如果Code是寫給別人看的,那大家會認真地去學程式語言背後的抽象原理,寫出內容更流暢、別人也更容易看懂的Code。

因為,他們必須要學習到:Code是寫給別人看的。

結論


我認為作不到「讓程式碼像閱讀故事一樣容易」的原因,絕非僅如MaoYang所言:「Coding的工作在目前國內並不太被重視...基本功沒有練好, 再好的流程都沒有用」這個單純的因素,而至少是三個不同面向的問題。

只是大部份的時候,可以提出對策的人都亡羊補牢地解決表面看得到的問題,卻鮮少有人真正去研究過這些隱藏在背後的差異、進而在前期就提出一個系統面的更好對策。
  1. 台大資工系課程

沒有留言:

張貼留言