與 metavige 和 alexchen 對話 Java 語言
所以當然這個 Java 老語言來說,自然沒得比了~
目前的開發方式或者是環境變遷,強調的是快速開發,以往那種慢工出細活的方式已經有點不合時宜了
metavige
有趣的是,Java一點都不老。我在 從中介編程與反射能力來談 Java 語言 列出十年世代的程式語言列表,Java 名列其中。它比Python 年輕3歲,跟Ruby, PHP, JavaScript 同年發佈。單純看語言的特性,Smalltalk這個40歲的程式語言都比 Java 靈活,這才是 Java 令我們老輩程序員驚奇的事。
我現在還記得 Java 十年前剛出現時的宣傳詞中包含「簡單易學」,那當然是跟 C 語言比。然而現在來看,似乎愈來愈不像那麼一回事了。我不認為 Java 讓我們「慢工出細活」,我覺得它帶來的是「冗餘的複雜性」。就算以 C++ 的觀點來看 Java 程式碼,我仍覺得 Java 程式碼有許多不必要的複雜度。Java 把類別變成施加在程序員身上的束縛,而是不是幫助我們進行抽象化資料處理的工具。
其實我重頭看你的作法,我直覺就會想到用 Strategy Pattern 的方式做 用繼承的方式,而不是委託。
不一樣的語言,就會有不同的概念。因為 Generic Type 本來就不是在做 Template 的 是以 OO 的觀點來做到不 DRY ~ 這是我自己的理解。
metavige
Java 專家對泛型的理解是這樣的:
專家一致同意 Java 實踐泛型並不足取。這種說法往往讓聽眾大吃一驚。
Java 泛型規格導入許多語法以解決小問題,卻沒有對 JVM 做出對等的改變。泛型的語法是新的,實踐此語法的方式更是糟糕。越來越多專家宣稱動態分型(dynamic typing)可以讓應用更簡單、編程更有效率, Java 的編程員卻得走回頭路,學習使用更強化的靜態型態。
超越Java(Beyond Java),Bruce A. Tate
我個人認為,所謂「更強化的靜態型態」是跟 C++ 樣板相比, Java 泛型比起 C++ 樣板是在走回頭路。就我到目前為止的 Java 使用經驗來看,我幾乎以為泛型只是 Java 專門用來重新設計容器類別的特殊語法。在那以外的場所,你大概不會想用泛型來重構你的程式碼。
metavige 就說會想用 Strategy Pattern 來重構我在 從 C++ Template 到 Java Generic,一步一步來 舉的例子,而不會用泛型。但是泛型難道不是用來處理這個問題的直覺想法嗎? Java 沒有足夠理由說服我們不要用泛型來做,但是用泛型來做... 呃,似乎更困難。
老闆也不一定願意去使用其他的語言在新系統的開發,因為當我用了一個新的語言即使是在同一個JVM的平台上run,會造成這個系統後續的人維護不是那麼容易,對於接手的人而言,勢必他也要會我新使用的語言,所以老闆就打回票了
遺憾的在這樣子的環境下,我與其不斷的抱怨這個語言不好寫,我就只能好好考量該有什麼方式把這個東西寫好瞜,並且把我的心思"暫時"的全部都放在JAVA上面以求在這圈子不被淘汰,不知道石頭大是根本沒這個煩惱,還是有很好的方式可以克服這樣子的問題?
alexchen
多學幾種程式語言之後,再回頭去寫 Java ,自然就會寫的好。因為你的眼界開了,思想靈活了,會從更抽象的觀點來編程。
當你習慣動態語言靈活的反射、抽象的型別與中介編程能力時,你也會像我一樣,不自覺地在 Java 中也想這麼做。然而,你可能也會像我一樣失望。
很多人都說用新的語言會造成接手的人維護困難。但就我觀察圍繞著 Java 的編程環境,這說法就跟拔獅子的毛可以找回失去的頭髮一樣,沒有事實根據。
找兩個 Java 程度一樣的大學畢業生,同樣都沒學過任何 J2EE 框架,連 servlet 是啥都不知道 (我想這不太難找,因為大學課程通常都不會教特定的框架)。然後一個去學 spring + hibernate + xxx(一堆框架),一個去學 Ruby on Rails 或 PHP 。再要他們開發同樣的 web 應用。我敢打賭在相同的客戶要求品質下,採用 Ruby on Rails 或 PHP 的那個人會更快完工。
因為 Java 語言不是維護的門檻,那一堆框架才是。愈來愈多的框架,把 Java 程式的維護門檻抬到天上去了。我不認為任何一個會 Java 但不會那些框架的大學畢業生接手維護前人留下的 J2EE 開發的軟體會比接手 Ruby on Rails 或 PHP 開發的軟體快。
我以前待的公司接一件案子,因為客戶用 IBM 的機器,而且對 WebSphere 有興趣。所以中間跟 IBM 接洽過,我問 IBM 的人員,培養一組會 Java 但不懂 WebSphere 的程序員到他們有開發能力的時間大概要多久? IBM 的人回答我: 至少半年才合格 (其實我每年都參加 IBM developerWorks Live ,對這個時程心裡早就有底了)。
哇,半年耶。台灣哪間軟體公司會花時間去培養一組只會 Java 的畢業生搞懂這麼多框架? 同樣讓這些人去學 Ruby on Rails 或 PHP,半年下來都變老手了。
國外早在三、五年前就開始改弦易轍了,連 Spring 也早早導入 Groovy & Grails 。其實我們一直都是在多語言的環境下做事,例如傳統的 Java 編程人員也會用 SQL , HQL 查詢資料庫 (我幾乎沒看過 Java 程式使用像 DBM, GDBM 這類的雜湊表式資料庫,這類資料庫連 SQL 都不提供,真正是用程式語言在處理資料);用 Ant 語法處理軟體自動化建置。unix文化的編程人員還會用 shell script 將雜七雜八的例行工作自動化。
我還在一個 J2EE 的 Web 應用專案中,用 Ruby on Rails 去維護資料庫遷移(db migration)、寫 web 應用的測試案例。 Java 已經夠令我惱火了,連測試案例也用 Java 去寫就太自虐了。
如果哪天有人突發奇想,用 Ruby 寫了一整套 Java 程式碼轉譯器,可以用 Ruby 寫程式產出一整個 Java 專案的 code (Hibernate 都可以包起整個 SQL 的產出工作了),然後編譯測試後部署給客戶。客戶也只會覺得「這間公司的 Java 專案做得真快」。客戶只關心你的軟體是不是在 JVM 上跑,更準確地說,他們只要看到一堆 .jar, .war 檔就滿意了,並不關心你在開發過程中用了哪些語言與工具。
我建議你像我一樣,在不必交付給客戶的地方,儘可能用適當的語言來解決問題。 Ford 對此有一個很好的說法。
Groovy 讓你可輕易替 Java 程式碼撰寫單元測試,這是將 Groovy 偷偷帶進保守機構的好藉口 (畢竟,對程式碼進行測試是基礎架構的一部份,並沒有要部署至成品環境中,所以,誰會在乎你使用什麼開源碼程式庫,對吧?) 事實上,我極力倡導,有非開發人員在旁邊時,不要直接稱呼 Groovy 其名。我寧願稱其為 Enterprise Business Exceution Language (使用縮寫 ebXl,因為經理人覺得有大寫字母 X 的縮寫都很迷人)。
《程式設計師提升生產力秘笈》,Ford
我不煩惱寫不好 Java 程式,我只煩惱 Java 沒有能力實現我想表達的設計。碰到這種時候,可以找些事情發洩壓力、緩解情緒。像我在 blog 上發文痛批,就是一種舒壓手段。提供給你參考。
樂多舊回應