Java的世界

並不是一見鍾情的Java

雖然我很喜歡喝咖啡,但是有個用咖啡取名的程式語言,並沒有引起我太大的興趣。(順道一提,雖然Java因為是傳統咖啡產地,所以成為咖啡的代名詞,但是其實很多好的Java咖啡園早已不存在。現在要找好的Java咖啡其實很困難。)其中一個原因是,有很多網頁常常會用太過多的Java Applet或是Java Script,讓網頁瀏覽很困難,更不要說很多相容性的問題。(當然,後來我們知道,這問題有很多其實不是Java本身的錯,而是某些喜歡自己弄一套東西的公司的問題。)

Java的跨平台本來也沒引起我太大的興趣。很多東西在各個平台上都有,你只要download什麼viewer之類的,就可以在別的地方看看。

不過,最近,我忽然覺得,Java是挺有意思的東西。

這個起源居然是我想要在Palm上寫程式。我忘了為什麼後來覺得用Java寫可能不錯(大概是看錯了什麼東西)。不過呢,真正引起我注意的是(非常後知後覺),是Java的Applet。

等等,Java可以寫applet,也就是在網頁上執行的小程式,這是連不懂Java的人都可能很清楚的,這有什麼特別?在回答這個之前呢,我先要說一下,寫網頁程式的必要性。有時有些東西就是沒辦法只用HTML,CSS等等去完成。比方說要有點互動的感覺。這時,我們就要寫個程式。最常用的就是用cgi這樣的方式。cgi並不是某種程式語言,這只是一種協定。你可以用你高興的語言去寫cgi。問題是,cgi是要在server上跑的,所以呢,你的server要肯讓你在上面跑程式,還要支援你用的語言。通常免費的server都不會讓你跑cgi程式,一方面是為了安全,一方面是這樣會用掉很多資源。

我以前一直誤會Java Script是在用戶端那邊跑的程式,而Java applet是在主機上跑的,像是cgi。事實上,applet也是在使用者的電腦上跑的。我們只像是放一個程式,讓人家download回去,然後在他們機器上跑。所以,不用支援cgi的server,也是可以放Java applet,讓你的網站更生動!

再加上,現在幾乎大家都有Java支援的電腦,不用再去download什麼viewer。這樣有一些不能自己安裝程式的電腦上,比方說學校裡的電腦,用Java applet就方便了。

Java的語言本身,也得到許多程式設計師非常正面的評價。很多人認為Java其實不但功能強大,效率也相當好。其實是挺適合去開發一些計算需求高的程式。

.Net 和 Java

現在好像說到Java,就要談一下Microsoft的.Net。我也不能免俗的吹牛幾句。

基本上,我覺得目前的情況來說,這兩個東西還是扮演者不同的角色。我們常常會把.Net和Java放在一起談,是因為.Net的構想就是和Java一樣,以後程式不是翻譯成不同系統就不同的機械碼,而是翻成.Net可以懂的東西。每一個平台,只要像裝上Java虛擬主機一樣裝上.Net虛擬主機,就可以跑.Net規格的程式。

.Net的優點是引用了一些所謂比較先進的技術,另一方面,是.Net不一定要用某種語言,可以是Basic,可以是C,當然也可以是Java。理論上是,只要發展公司願意,就可以寫符合.Net規格的編譯器,所以你也不一定是非用Microsoft Visual Studio不可。

問題是,.Net現在還不是真正的跨平台。要寫Windows下的程式,選用.Net當然挺合理的,也許以後還「有可能」很容易轉去別的平台。但是我們不能確定Microsoft能不能做到。不說別的,在麥金塔上,我們已經很久沒看到Microsoft出過像樣的程式發展工具(我是用保守的語句,雖然我心裡想是好像重來沒有)。Microsoft會不會順利推出Linux版的.Net,也是個問題。再加上,是不是有很多自由軟體界的人,會熱情擁抱.Net,更是個大問題。沒有的話,你可能很難像Java那樣,想要用些免費的工具,是隨手可得的。

Java的缺點是你大概就是用Java(其實也不一定,我們可以用很多其他程式語言寫Java applet)。不過,這也是優點。比方說在學術界,或是自由軟體界,你有個想法,你想大家一起來。你用Java,就不太需要擔心不同使用者用不同機器的問題。再加上,會在Java發展東西的人,也大都會用Java語言。所以要相互理解對方在寫什麼,就容易得多。不會像是在.Net上(假設有一天,.Net真的跨平台),每個人各用自己的語言。同樣的想法,要一起發展,一個人說C,一個人說BASIC,另一個又用不一樣的。溝通起來還是有點困難。

在某一個陣營裡,可以去瞭解對方在做什麼。不過,也不用太過焦慮的想,我倒底要去哪一邊。有人老在說有一方會打敗另一方,這在短期內其實還看不出來。再加上,你要用什麼東西開發程式,有時不是你決定的,而是你去的公司用什麼在開發程式。另一方面來說,有些人會說現在不學某某,就太晚了!這種理論,我不能接受。如果一個程式開發系統,複雜到一個專業程式設計師很難進入,那我個人覺得是個失敗的系統。你在某一個語言很強,其實要轉到其他系統,是要花些時間,但是絕對是比一些老在各程式語言,開發環境跳來跳去的人容易進入狀況。

不用太擔心什麼,選擇你自己喜歡的路,好好的走。

我的Java應用

我對Java的興趣,主要是教學和學術上的應用。在教學方面,Java可以提供非常好的互動性的程式,也不用因為顧慮學生用不同的電腦,就要出不同的版本。事實上,要分別寫給所有平台用的程式,在時間和精力上,也是不太可能的。

在學術上的應用,就像前面說的,Java可以在各個機器上跑,不用擔心你的機器能不能跑的問題。再加上,大部份發展Java平台程式的人,也都用Java語言寫程式,所以交流非常方便。

目前我的主要興趣是在符號式的計算。尤其是代數幾何上的應用。

Java的入門

要學Java這個語言,我強力推薦 "How to Think Like a Computer Scientist: Java Version"這本免費的電子書:

http://greenteapress.com/thinkapjava/

這本書適合初學者,對於有點程式經驗,想學Java的人,更是能夠快速上手。這本書作者教學的功力,可以從很多地方看出來。電腦書常常有一個毛病(也許也不是毛病,因為可能有人就是喜歡),就是常常很想把東西都先交待得清清楚楚,深怕漏了什麼。尤其是物件導向語言的書。常常是在那裡先解說什麼是物件導向,偏偏常常解釋得讓初學者昏頭轉向,還是弄不清到底什麼是物件導向。又比如說到資料型態,就非把所有的資料型態都說出來,還要先仔細的提醒你,什麼可以做,什麼不可以做,什麼資料型態的上限是什麼等等等。

這些在邏輯上來說都對,在教學的立場,也很容易覺得要這樣去做。問題就是,這樣做常常只是嚇壞了初學者,老手也會覺得太囉嗦。我就看過一本某某物件語言的經典,過了一百頁,你還不會寫第一個程式!

這本書的特色,就是一開始,根本不告訴你什麼是public static void,根本還沒正式告訴你什麼是物件導向,就來個 "Hello, World!" 的程式。他真的沒有解釋public static void,但是你不會覺得很不安,因為作者一再告訴你後面會提到。反正現在什麼程式都給他放上去就是了。他也沒有告訴你Java到底有幾個變數的型式,只是自然而然就教你用int, double, String等等。你每讀一段,就會覺得學了些東西,而且馬上可以自己去試試的。

這種能掌握什麼是重要的,還可以恰到好處的解說,讓你不會覺得好像不太懂的感覺,這是相當好的功力。這本書做得很成功。而且不要錢。

(我後來發現作者Allen Downey是電腦教授。他的書真的是反映了他的教學經驗。)