題記:最近看了《 java 夜未眠》這本書,感覺很不錯,里面將當時(包括現在)的一些現狀,以及一些知識點分析的很清楚、很透徹,而且淺顯易懂,寫作風格幽默風趣,讀起來也不費力;雖然有些地方比較偏激,但那是不可否認的事實,確實感同身受啊,如果大家沒有看過,推薦大家有時間也看一下;下面是書中一些不錯的片段,當然,整本書都是不錯的,這些只不過是我更感興趣的。
培養興趣
把程序設計當成興趣可以讓你學得更快樂,學習效果自然會更好。在我到一個單位面試時,主管看了我的履歷之后問我:「你怎么有這么多時間學會這么多東西、做這么多事?」 我的回答是:「把工作、學習、和娛樂結合在一起,時間就會是別人的三倍。」
我承認我很幸運,可以把程序設計當作賺錢的工作,學習的題材,以及茶余飯后的休閑活動。不是每個人都像我這般幸運,但是我相信至少大家都可以把它當成興趣。相信我, 調整你的心境,把它當成是興趣,而非苦差事,你非發現你的「程序功力」與日俱增。
慎選程序語言
慎選程序語言很重要,一開始就學太難的程序語言很容易讓你遭遇到挫折而放棄。你可以挑比較容易且有趣的語言下手,建議您可以從下面的語言中擇一:
VB :簡單,好用,書籍多。
Java :比 VB 稍難,比 C/C++ 簡單,書籍多,用途非常廣,相當有前途。可以當作學習 C++ 的跳板。
Python :簡單,好用,各個平臺都支持(包括 Windows , Linux , MacOS , BeOS , ... )。國外很紅,國內較少人用。原文書不少, 但中文書目前只有一本(歐萊禮出版)。我預期 Python 會是下一個熱門的程序語言。
這三個語言只是我給各位的建議,你也可以多聽聽別人的意見。在選定一個程序語言之后,就要執著,不可以很快放棄,又改學另一個程序語言,否則永遠都只懂皮毛。有句諺語是 這么說的:「 A jack of all trades is master of none 」。如果你號稱會 C++ 、 Java 、 … 等十種程序語言,只不過每種程序語言都停留在 Say Hello 的階段,相信面談主管很快就會 對你 Say Goodbye 。
當你學精某程序語言,然后想再學另一個程序語言,你會發現有了前一個程序語言札實的根基,學任何新的程序語言都很快。
程序與香雞排片段
在臺灣的軟件公司內部,有許多非科班出身的程序員,他們的薪資低廉,通常又很努力。軟件公司就算聘到了這種便宜又努力的程序員,也不要太高興,因為這樣的程序員,通常都只是把目前的公司當一個學習的過渡階段,等到學得差不多,拍拍屁股就走人了,才沒打算一輩子接受這樣的低薪。但可悲的是,大部分的公司都沒有良好的程序員生涯規劃制度,反正大家互相利用。所以這些程序員很可能在做計畫的過程中,學不到東西又磨得身心俱疲。 所以,何苦來哉!不如我們通通去賣香雞排吧!但是你們只能到通化街夜市和士林夜市賣,不可以到我屬意的饒河街夜市和我搶生意(我打聽過,饒河街的攤位租金是三者中最便宜的)。我的攤位名稱要取做什么呢? ... 嗯!就叫做 “Java 雞排 ” 好了,以紀念我曾有過的 Java 程序員身份。我打算把雞排分成三種大小,最大到最小分別叫做 J2EE 、 J2SE 以及 J2ME 。哪天你到饒河街夜市,發現了一個乾乾瘦瘦、看起來營養不良的少年頭家用著生硬的臺語在吆喝著: “ 來呦!來呦!好呷的香雞排, J2EE 一塊 50 , J2SE 一塊 40 , J2ME 一塊 30......” 請你也來光顧一下吧! ... 看在 Java 的份上。
關于職業生涯
生涯規劃會隨著年紀增長和生活經驗的累積,以及人生觀的改變而有階段性的差異,所以生涯規劃不宜過于長期。生涯規劃應該以漸進的、多樣的方式來進行。漸進的,才不會好高鶩遠;多樣的,才可以分散風險。而且,生涯規劃要及早,因為有越充分的時間準備,越有可能實現。即使你想瀟灑地背著吉他到異鄉旅行彈唱,你也得好好地練吉他吧!
把握時間朝著你所規劃的生涯邁進!時間過得很快的,浪費不得。你不會希望有一天你在床上醒來,睜開眼后盯著天花板,你發現你已經五十歲了,昨晚五十大壽 birthday party 的宿醉使得你現在頭痛欲裂。你發現這些年來你依舊是渾渾噩噩的度過,生涯規劃依舊只是「規劃」,沒一個實現。你在床上抱頭痛哭,就在你五十歲生日當天。
信息應用領域變動快速,許多軟件人員欠缺判斷能力,不能及早學習妥相關的技術以為因應。特別是在這幾年的光景,許多新應用領域的竄起,相當程度地撼動了原有的軟件霸主,以往那些唯唯諾諾、以微軟技術馬首是瞻的人難得壓錯了寶,這次也算是讓他們學到了教訓,這何嘗不是一種領悟。啊!多么痛的領悟,你(微軟)曾是我的全部。
許多軟件人員缺乏自我學習的能力。軟件人員應該問問自己:這半年來技術能力精進了多少?技術飛快地在進步,如果你沒跟著進步,在相對坐標看來就是退步。我以前很變態,只要一天沒看技術書籍就會覺得今天真是白活了,然后有一股沖動想要「做傻事」;現在我雖然比較沒這么逼迫自己了,但看書還是看得很勤快。
軟件人才培養不易,折損率高。一些我認識的優秀軟件人才,最近常 forward 一些「過勞死」、「人生的意義」之類的文章給我,顯示了他們工作上的厭倦感。他們在電話中告訴我,他們忙得沒時間接觸新技術,技術已經跟不上別人了。這廂大嘆人才難尋,那廂努力折損人才。
關于知識的等級
專業知識是一種無形的資產,不容易評估其價值。但是大致上,專業知識可以分成四個層次,價值由低而高分述如下。
Know-What
受過訓練,通過認證,而精通某領域的基本知識,這類的知識就稱為 know-what ,也稱為認知性的知識( cognitive knowledge )。 know-what 是一切知識的根基,但是有了 know-what ,并不表示有能力可以活用這些知識。許多軟件人員在通過專業認證之后,就開始學會獅子大開口了,其實他們的知識可能還停留在 know-what 的階段,而 know-what 階段的知識對公司來說是沒有太多生產力的。此階段的軟件人員應該努力地提升自己,以進入下一個階段,也就是 know-how 。
Know-How
know-how 階段的知識也稱為進階技能( advanced skills ),指的是可以活用書本上學來的知識、理論,以解決實際的問題。 know-what 的知識或許可以透過「填鴨」方式生硬地吞下去,但是 know-how 的培養一定要透過實務經驗的累積與體會。如果有一個好老師或 leader 的引導, know-what 可以很快地提升成 know-how ,靠自我的培養則通常會比較辛苦。不過,當我要引導學生由 know-what 到 know-how 時,往往會有許多「不識貨」的學生嫌我啰唆。
Know-Why
know-why 階段的知識指的是對整個系統的掌握度( system understanding ),也就是了解各種知識背后復雜交錯的因果關系。有了 know-why 的知識,軟件人員除了能順利地進行軟件計劃之外,還能進一步解決更大、更復雜的問題,因為一切的知識都是有條理的。具有 know-why 的軟件人員對整個計劃具有強烈的「第六感」,可以直覺地做出正確的判斷,預先知道可能會遇到的問題。計劃的 leader 必須具備 know-why ,才能全盤掌握計劃。
Care-Why
care-why 指的是自發性的創意( self-motivated creativity )。有了源源不絕的創意,才能保持高度的競爭力。軟件產品相當需要創意和洞燭先機的能力,在大家一窩蜂搶做某軟件或某服務之前,就已經先完成深度的耕耘,技術自然比別人來得扎實,也能迅速地迎合市場需求,為公司創造最大的利益。
關于買書讀書
如果你最近是個大忙人,有一堆事情要做,就先別急著買計算機書籍。計算機書籍更新的速度很快,可不比四書五經,可以祖傳父、父傳子, 代代受用不盡。以前我也常沖動之下買了好書回家,然后忙得沒空讀它,等到空閑下來時,新版本也已經出現了,懊悔不已!如果不急著用的書, 千萬別急著買,不然可能還沒來得及看這本書,新版本又出來了,信息界不流行考古的。
Java 學習之道
認識 Java 的原理
* 學會 Java 語言
* 對象導向的思維
* API
* 開發工具的用法
下面分別就這幾點詳細闡述。
學習 Java 的原理
了解 Java 的原理,才有可能真正體會 Java 的一切,學習任何事情,只要能掌握原理,就會比較順利。我發現許多人使用 Java 已經逾年,卻連 Java 最基本的特質都不清楚。
一般來說,信息系畢業的學生,對于信息的新事物學習的速度,會比其它科系來得快,就是因為四年的教育為他們奠定了學習新事物的基礎,這也是信息系課程的價值所在。
除非你受過的基礎訓練夠扎實,否則在學習或使用 Java 的過程中,你一定會需要參考到這些信息系學科的知識。我建議各位可以在閑暇之余,把信息系課本的書拿來讀一讀。這是治本之道,絕非立竿見影的特效藥,必須要有耐心。
學習 Java 語言
學習 Java 語言很簡單,畢竟 Java 語言也只包含五十多個關鍵詞( keyword )與幾十個算符( operator ),再加上 Java 語法( syntax )也很簡單,所以一般人可以很快就學會 Java 語言。危險的是,很多人認為已經完全掌控 Java 語言,但其實對于內部的運作機制仍不能掌握,這些盲點有時候會讓你無法完全掌控 Java 語言。克服這些盲點的方式是看「 The Java Language Specification, 2nd Ed. 」(沒有中文版)來徹底弄懂 Java 程序語言,并看「 Inside the Java Virtual Machine, 2nd Ed. 」(有中文版,但翻譯得@#%$)來徹底掌握 Java 虛擬機器的運作方式。
學習對象導向的思維
學會了語言,并不代表就可以設計出好的對象導向系統架構。想要成為對象導向的專家,往往需要:
* 多看相關的書,特別是 Design Pattern 和 Refactoring 的書。
* 多觀摩別人的程序(例如 Java API 的 design 與 implementation )
* 多寫程序
學習 API
學會 Java 語言之后,還需要學會一些 API 才能寫出有用的程序。 Java 的 API 非常多,必須規劃好一個學習路徑,才不會在浩瀚的 API 大海中迷失。必備的 API 包括了: IO 、 New IO 、 Collection Framework 、 Network 、 RMI 、 JAXP... 等。至于其它的 API ,就看你的需求而定,大致上分成:
* GUI 類: JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ...
* Enterprise 類: JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS...
* J2ME 類(這一類不是我的專長,無法提供學習順序建議)
學習開發工具的用法
只用 JDK ,是很難寫出大型程序的,所以通常程序員會使用 JBuilder/VisualAge/ VisualCafe 等工具,這些軟件賣這么貴,一定有它的價值,值得花一些時間好好學習這些開發工具的使用方式,你將會發現開發工具所提供的許多功能,可以讓你在開發過程中生產力大增。
Static 的意義與實作方式
Class(static) field :共用一塊記憶體
class(static) method :共用一塊記憶體
instance( 非 static) field :隨著每個 instance 各有一塊記憶體
instance ( 非 static) method :共用一塊記憶體
instance method 為什么不是隨著每個 instance 占有一塊記憶體,反倒是共用一塊記憶體?其實,讓每個 instance method 如同 instance field 一樣,隨著每個 instance 占有一塊記憶體,這么做當然是可以的,只是 Java 編譯器和 JVM 都不這么做,因為太浪費記憶體空間了。一個 field 少則占用一個 byte ,多則占用數百 Byte ,但是 method 少則數個 byte ,多則數百 Kilo Byte 。 Mehtod 耗費的記憶體是 field 的數百倍,甚至數千倍,當然是能共用就盡量共用,比較不會消耗記憶體。既然 JVM 讓一個 class 的所有 instance 共用相同的 instance method ,下面兩行程式碼在 instanceMethod() 內部時,如何區分是 instance1 或 instance2 ?
instance1.instanceMethod();
instance2.instanceMethod();
因為編譯器會幫我們在把 instance1 和 instance2 個別傳入 instanceMethod() 中當作第一個參數。也就是說,任何 instance method 參數的實際個數都會比表面上多一個,這個多出來的參數是由 Java 編譯器幫我們加上去的,用來代表對應的 instance 。此參數的變數名稱為 this ,也是 Java 的一個關鍵字( keyword )。
當調用某個 instance method 或使用某個 instance field 時,你必須在前面加上該 instance 的名稱,如果該 instance method/field 相關的 instance 和當時程式碼所在的 instance method 的 instance 指的是同一個 instance 時,該 instance 的名稱就是 this ,這種情況下,你也可以選擇不在前面加上「 this. 」。
然而,在某些狀況下,非得在前面加上「 this. 」不可。例如,當 method 中的參數或區域變數和 instance field 名稱完全相同時,如果不在前面冠上「 this. 」,那么指的是參數或區域變數;如果在前面冠上「 this. 」,那么指的才是 instance field 。
未知 2010-07-15 08:32:44