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