顯示具有 Pro Book 標籤的文章。 顯示所有文章
顯示具有 Pro Book 標籤的文章。 顯示所有文章

2008年2月16日 星期六

Java Puzzlers

書藉基本資料: Java Puzzler中文版-陷阱、錯誤與死角

《Effective Java》類似,這本在講Java的特性。不同的是,這本著重在以易犯的錯誤例子來說明正確的準則,而《Effective Java》是直述守則。本書在說明錯誤時,常引用別處文獻說明進一步資訊上那找,其中大部份的參考文獻出自《Effective Java》。另外不同的一點,本書的述說語氣比較風趣,偶而還有有趣的爛解答。哦,還有附一堆相當傷眼的錯覺圖,我時常用手遮住它們,以方便我能舒服地閱讀文字。然而兩本相較之一下,《Effective Java》較值得看。

不過相較於《Effective Java》直接說怎麼做較好,這本書到是相當成功地說服讀者,為什麼不要那麼做,例子舉得相當漂亮,帶來不少衝擊。本書不宜長時間連續閱讀,讀起來相當傷腦,一堆看似正常的程式碼,卻常發生不可思議的結果,或是不知所云的編譯錯誤訊息。或許,當Java寫到一定程度時,看這本書可以協助除錯。以下簡單直述部份心得,若對解謎有興趣的話,就別看下面的心得,自己慢慢翻書也是種樂趣。

  1. final對於method和field的含意不同,field的final是指只能設值一次,所以
    final int a;
    a = 3;

    是合法的。但也因這個特性,會有些潛在問題,例如:物件因為初始化順序不同,而讀到未初始化的final field。解法:lazy initialization。

  2. 除非之前有執行 System.exit(),finally一定會被執行到,這意味著在finally之前的return和throws exception會被finally給蓋過!
  3. constructor內不要呼叫被覆寫的method,有可能因物件初始順序而讀到未初始化的欄位。可用lazy initialization解決。
  4. 一些計算機組織的知識,像是 IEEE 754對浮點數的定義,使得太小的小數無法加進去,例如:

    float a = 2.0E20f;
    a += 1.0; // 結果仍是2.0E20f

    還有因為負數用二補數表示,負的MIN_VALUE不存在對應的正數,abs(MIN_VALUE)結果仍是負的MIN_VALUE。

  5. 要分清楚overriding、overloading、hiding、shadowing、obscuring。Java 5.0後,override時記得加 @override 避免 method 寫錯宣告時變成 overloading。還有別用參數數同一樣且有父子關係的 overloading,例如下面是個不好的 overloading,由於 JVM 會找最接近型態的,而可能呼叫到非你想要的:

    public boolean equals(Object o) {return true; }
    public boolean equals(String o) {return true; }

  6. method的覆寫 (override)不能變得更限制(例如public不能變protected),但field可以,此時稱為 hiding(亦有其它情況會發生 hiding),例如下面的例子是合法的:

    class A { public static String s = “A”; }
    class B extends A { private static String s = “B”; }
    A o = new B();
    System.out.println(o.s); // 結果為:A

  7. 用class method時,使用class名稱呼叫,避免呼叫錯誤。注意:((Math)null).PI 是合法的,JVM不會理會object,而會直接找它的class。
  8. Java 5.0支援泛型後,盡量不要使用原始類型(例如 List),那是向下相容的必要之惡;改使用參數化類型(例如 List<T>)。千萬不要混用原始類型和參數化類型,#88會給你滿意的理由,為何不要這麼做。
  9. 不要在一個運算式裡改變一個變數多次,這牽涉到實作細節,比方 x^=y^=x^=y 這個有名的例子,在 Java 裡不會成功的 swap。
  10. 不要在一個運算式裡將型態自動向上向下轉型(例如 int 變 long或反過來),這之間有很多潛在問題,詳情參閱前面的puzzles。
  11. char是無號型態,其它byte、int等都是有號的;16進位沒有正負號,它直接以二補數解讀;< <、>>等只看最低的5 bits數,a < < 31和a << 63意思一樣(小心負數的情況)。

2007年8月22日 星期三

Introduction to Data Mining

書藉基本資料: Introduction to Data Mining

最近在做clustering的研究,仔細讀了這本書的ch8, 9,愈讀愈覺得該學的東西愈多,作者們真是太強大了,怎麼能懂這麼多東西,又能這麼有條理地分析整理出來,並配合許多直接易懂的例子說明。如果有時間的話,真想把這本書好好地讀一遍,但真的要讀完一遍,半年的時間都不夠吧,特別是需要數學較深的方法不是三兩下就能體會的。

讀的過程裡,漸漸產生懷疑,目前做clustering相關研究的人,有多少人真的將related work分析好,並選出他們心中最滿意的方法,再針對此方法做必要的修改?沒辦法,我尚來是人性本惡的觀點,容易做此聯想。至於自己,則是愈讀愈汗顏,沒想到單一領域的發展如此深廣,以前真是太小看clustering了。真的要做學術研究的話,也是可以達到很理想的境界,看到這樣的好書,讓我對學界的興趣提高了些。

只是理想抱持太高的話,永遠踏不出第一步吧。忽然對以前看過一堆給研究生建議的文章有所體會,幾乎每一篇都強調不要好高鶩遠,不然只會自挫銳氣。讓我想起和大中聊研究時,大中也提出做研究像是小步前進的觀點,勸我標準別定大苛反而失去興趣。但反向來看,有勇於挑戰的氣魄,才有機會大步邁進,試了不見得會成功,但不試是不可能成功的。

原本只是想讚賞這本書寫得太棒了,後半變得有點嘴炮。btw,有些人認為學界有許多人像是自己圈一塊地方出來自己玩自己的,我也如此認為。但是,有玩得差勁的業餘玩家,也有玩得令人讚賞的大師級玩家。能看到大師的行事風格,總是能激起一些對學界的熱情,只是維持不了多久就是了。

2007年2月22日 星期四

Programming Ruby

書藉基本資料:Programming Ruby

如果曾經學過其它程式語言,這本書就是最佳選擇。

作者開頭指出他很想寫本倒著寫的書,我們已學過很多東西,沒必要讓讀者耐著性子從基礎語法慢慢看。這真是太對我胃口了,但作者嘗試以後,發現沒有語法什麼也講不了,top down approach根本無法開始,於是作者決定仍用top down approach,但一邊帶出需要用到的基本語法。

全書分5部份,我目前讀完Part I — Facets of Ruby,Ruby的快速入門。一路讀下來充滿驚喜,馬上就能看到Ruby特別之處,也能立即試寫一番,省下讀重覆概念的時間。說明清楚、例子舉得好、文筆幽默,真是不可多得的好書。The Pragmatic Programmers這家公司很有趣,出版的書是名付其實的”實務”,也會提供線上觀看版本,《Programming Ruby》 1/e已免費放出,網路上有不少人做中文化的工作。我讀的是2/e,讀得過程有太多心得想寫,轉念一想,反而覺得大家自己讀較有效率,就不一一提出。

看完Part I後,Ruby給我的感覺很好,內建Profiler、Debugger、Unit Test,加上Ruby強悍的架構,讓Unit Test寫起來很輕鬆,初期引入的抵抗很小,以Java的Unit Test來說,要先找JUnit用的Jar檔,再import Jar檔,Java寫小東西很瑣碎,而Unit Test本質上就是一堆小class、小method,用Java寫起來很煩。我沒用過C的Unit Test,但沒Reflection的語言,Unit Test勢必要更多設定,連試的念頭都沒有。

這裡挑書裡幾段和技術無關的有趣內容分享:

Test::Unit comes with a number of fancy GUI test runners. As real programmers use the command line, however, these aren’t described here. Again, see the documentation for details.
Programming Ruby 2/e, ch12 

Sad to say, it is possible to write buggy programs using Ruby. Sorry about that.
Programming Ruby 2/e, ch13 

A subprocess changes an environment variable, and this change is inherited by a process that it then starts. However, the change is not visible to the original parent. (This just goes to prove that parents never really know what their children are doing.)
Programming Ruby 2/e, ch14 

2007年2月17日 星期六

Ruby on Rails:建置與執行

書藉基本資料:Ruby on Rails:建置與執行(Ruby on Rails:up and running)

skylight很喜歡買技術的書,找他聊天時偶而可以借個幾本,《Beyond Java》和這本就是這麼看來的。他說看中文書有個好處,技術關鍵字會用英文表示,更容易找到,這麼說也有道理。

目前只有兩本Rails的中文書,另一本是博碩出的《Ruby on Rails網路應用程式開發與建置》,健文說有兩個人和他推這本,而說O’Reilly的這本不好;我沒看過博碩這本,有機會來看看。我和skylight討論後也覺得O’Reilly這本不好,但這本幫了我一個大忙。

如果只能挑一本書學Ruby、挑一本書學Rails,Pragmatic出版的《Programming Ruby》《Agile Web Development with Rails》無疑是最佳選擇,但這適合有時間的人看。之前在趕case時,看了《Agile Web Development with Rails》三分之一,沒時間看下去,寫寫又一堆問題,這本書不太適合查閱,或著說,沒有先對Rails有一定的概觀,很難知道要找什麼keyword。

在這種寫了一些Rails、有破碎不全的Rails觀念的前提下,看O’Reilly的《Ruby on Rails:up and running》正好,這本書強調沒有廢話,讓有經驗的programmer能快速上手用Rails,不過它廢話真是太少了,連帶前幾章例子也少了點,沒有一點Rails的概念會看不懂。但以我的情況來說,卻是最佳入門手冊,花個半天看完,寫起Rails順手多了。

《Ruby on Rails:up and running》用的例子是網路相簿,有照片可多重分類、目錄有樹狀楷層,又有slideshow - slide - photo之間的複雜relation,例子舉得好,像我想先看relational schema要怎麼用Rails操作,這個例子能清楚解釋。ch6、ch7教AJAX和Test Suit,對AJAX和Test Driven Devlopment來說,是不錯的入門,但整本書好像沒提到session。反觀《Agile Web Development with Rails》用購物網站當例子,很早就提到session,但購物網站的例子沒網路相簿好,無法先說明最重要的relatinoal schema轉換,兩本有些互補。《Ruby on Rails:up and running》以說明Rails功能為主來編排內容,可以先看到想看的功能;《Agile Web Development with Rails》以說明完整專案的流程,引入如何使用Rails,需要較多時間閱讀,但讀完是值得的。

《Ruby on Rails:up and running》Appendix B Quick Reference滿有用的,書上說可從官網下載電子版,卻沒看到下載點,反而在別的地方看到線上試看版,只好抓些資訊放這 (source):

O’Reilly 套書開嘜拉

活動訊息O’reilly 套書開嘜拉

  • 活動時間:2007/2/1 ~ 2007/3/15
  • 活動對象:天瓏門市、天瓏網路書店

有些書還不錯,像是《超越 Java:探討程式語言的未來 (Beyond Java)》,《C# 精要 (C# Essentials)》,前年學C#時在圖書館挑了一下書,這本薄、重點多、不難懂,對已寫過一些PL的人來說,是不錯的快速入門書,只要99元啊...,Java相關書也一堆,不過我現在的興致鎖定在Ruby上,沒想買的書。

2007年1月26日 星期五

超越Java(Beyond Java)

書藉基本資料:超越Java(Beyond Java)

讀完全書後,回頭來補寫這是什麼樣的書。

這本書穿插資深programmer的訪談,融合作者的經驗,從實務和理論層面分析好的語言該有的特性,再說明各個語言的情況。我對語言的實務能力較理論能力好,讀起來感覺作者的介紹以實務層面居多(不懂的東西自然略過...),可能有些偏頗。

作者本身是 Java 長期支持者,並寫了幾本暢銷書,在本書裡用大量篇幅說明為什麼 Java 不行了,為什麼 Ruby 是他最看好的接班人。另外有一章介紹「延續伺服器」(continuation server),說明在 stateless server 上開發 web 的瓶頸,該用什麼樣新的 server 和 framework 來改善。

對學語言有興趣的人、 Java 的愛好者或寫網站的工程師可以看看這本書。我的背景則是七年前學會C,認真寫了三年,四年前學會Java,這四年內以寫Java和C居多,這七年來有寫些 PHP,用 C# 寫大學專題,和一點點的C++、Perl 、Scheme、Python。既對學語言有興趣,也喜歡寫Java,並且以寫網站賺生活費 XD

看這本書時,我的心態挺爽快的,沒任何抵抗就想試別的語言,我一直都覺得不同場合要用不同語言,沒有萬能的語言。

超越Java(Beyond Java) - 4 (Java以外的語言)

書藉基本資料:超越Java(Beyond Java)

ch9討論其它語言,決定一個語言是否成為主流(或著說,取代Java),可分成話題性、時機、語言特性、殺手級應用來看,比方Smalltalk一直被認為是很美的語言,但30年過去仍未能成為主流,它的時機已過,未來也難以流行。Ruby興起很快,話題性夠、時機也對,語言特性好,近年來的Rails更是Web開發的殺手級應用,所以作者在本書花了大幅篇幅說明Ruby、說明Ruby on Rails,我經驗不足,看不懂Ruby更強的功能,不過寫個一陣子後會有所體會吧。

對語言有興趣的人,可以直接翻ch9看幾位專家的看法,很有意思。除了語言外,平台也需要討論,Ruby只是語言,不是平台,降低它的推廣力。提及Java時,或多或少在指JVM、J2EE、J2SE、J2ME,提及C#時也多少涉及.NET Framework、.NET Compact Framework。換句話說,我們說Java好時,其實同時指語言特性好(OOP、安全、規範多)和平台好(write once, run everywhere),JVM成功和重要的原因,可以參閱之前寫的”談JVM跨平台,卻不談scripting language跨平台的原因”

這代表其它語言也有機會參與這些優秀的平台,Microsoft一直積極(?)強調CLR(Common Language Runtime),Java也有些案例,但都不太成功,像是JythonJRuby,如果有組織積極推廣語言和Java平台、.NET平台整合,對這些語言是一大優勢。

下面節錄ch9一些有趣的內容:

Lisp

這是一個不簡單的傢伙。Lisp是世界級僅存的古老技術,人們不斷地重新發明或重新發現它,但是Lisp也是一大群家族,許多彼此不相容的設計和實踐,沒有任何一個看起來像是我們的家。當然,Common Lisp需要大修,但是由委員會來重新計計 Common Lisp 在此刻來說相當不恰當。Lisp需要一個仁慈的獨裁者,具有好的偉大的執行力,以及偉大行銷,才可能成功。
p168, by Steve Yegge 

作者另在p172提到 Lisp 的社群總由聰明的programmer組成,校園內也很流行,像MIT就強調用Lisp學習可以讓學生快地抽象思考。也許最後的語言都會回歸 Lisp,但Lisp太與眾不同,需要很多時間和精力學習。

PHP

2005 年最不可思議的一件事之一是,IBM 宣稱要支援 PHP,此舉無疑是針對意圖擁抱 PHP 的中小企業而來。
...
就和 Visual Basic 一樣,隨著開發者在錯誤的地方尋找簡單性,PHP 將會被利用在某些不適合的地方。
p170, by Bruce A.Tate (book author) 

相信許多人深有體會,我懷疑在資工學生裡,課餘寫PHP的機會搞不好比其它語言多,寫PHP是賺外快的最好機會。

Perl

某些 Perl 編程員寧願斷掉手指也不願意多打四個字元,才不管這些字元是否可以提升可讀性,畢竟難寫的程式應該也會難讀。
...
而 Perl 具有相當多火星文般的語法捷徑,簡直是神祕的溝通方式 (secret handshake )
...
說來有趣,但是對照起 Java 則是截然不同,還是別去用 Perl 吧 !
p170, by Bruce A.Tate (book author) 

這裡應該是比較開發大型多人專案的情況,有用過Perl的人都很享受快速用Perl解決瑣碎雜小事吧。

Smalltalk

早在 Java 尚未在 James Gosling (Java之父) 的眼中閃爍時,聰明的開發者就已經使用 Smalltalk建立成功的物件導向應用了。而「不是很聰明」的開發者用 Smalltalk 建立某些有史以來最醜的物件導向程式。
p171, by Bruce A.Tate (book author) 

作者認為Java的成功造成Smalltalk元氣大殺,它們都是良好的OOPL,Smalltalk語法特殊,主流的C++不願嘗試,選擇改良C++的Java則成為贏家。

Functional Language

用Haskell寫費氏數列(Fibonacci series):

fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib(n-2)

Java

我沒說 Java 已死,或著 Ruby 即將接班,或著延續伺服器將會支配一切。我只知道:

  • 我現在很受傷,我的顧客也是。我愈來愈難叫我的顧客要滿意 Java 的一切。
  • ...

p174, by Bruce A.Tate (book author) 

讀了「Beyond Java」後,我覺得我又想學Common Lisp,但之前挑戰多次(包含Scheme在內)失敗,我真不懂為什麼Lisp要用這麼多括號,讀寫都很麻煩,最近會先玩Ruby和Haskell吧,哦,還有Python,別忘了Google內部喜歡用Python寫system management。

2007年1月14日 星期日

超越Java(Beyond Java) - 3 (用code來看)

書藉基本資料:超越Java(Beyond Java)

作者提到Strong Typing、Dynamic Typing的比較,背景知識可以參閱這裡

Static Typing的優點是給compiler許多資訊,可在編譯期抓出錯誤,比執行時發現來得省時,也方便IDE做Code Completion(ex:列出class下的所有method)和Refactoring。缺點是programmer要打一堆冗長的資訊給compiler,這正是Java的情況。Static/Dynamic Typing都可以具有Strong Typing,像本書作者提倡的Ruby,作者認為它是Dynamic Typing and Strong Typing。Dynamic Typing適合快速開發,讓programmer更能專注在抽象思考,把想法轉為程式碼。比方取出陣列裡的每一元素做些事,Java裡常見的笨重程式如下:

ArrayList list = ...; ... for (i=0; i<list.size(); i++0) { MyNumber n = (MyNumber)list.get(i); int x += n.number; ... }

Java 1.5引入了泛型(generic type),可以省掉中間轉型(cast)那行,但使得宣告可讀性降低,並且不能存兩種以上的型別,比方同時存MyNumber和HisNumber。更大的問題是泛型是語言層級的實踐,不是JVM層級的實踐,破壞許多Java固有的優點。

前面提及Static Typing的優點,是否能在Dynamic Typing裡做補救呢?Code Completion和Refactoring目前仍有難度,但編譯期抓出錯誤的影響較小,作者認為Unit Test才是最重要的,目前Test Driven Development的概念已漸漸普及,有良好的Unit Test,測試成本很低,編譯期抓不出錯誤也無妨。

這裡引用修改書上的例子,以寫費氏數列為例,進一步指出Java笨重之處。

Java Version:

class Fib { public static void main(String args[]) { int x1 = 0; int x2 = 1; int total = 1; for (int i=0; i<10; i++) { System.out.println(total); total = x1 + x2; x1 = x2; x2 = total; } } }

Ruby Version:

x1 = 0 x2 = 1 10.times do puts x2 x1, x2 = x2, x1+x2 end

for loop的index variable有時是不必要的,foreach是不錯的替代方案,但有時不夠直接,不恰當的for loop寫起來有點冗,會降底可讀性( ex:for loop的 i 到底用處為何?)。

簡單的例子容易懂,但突顯的現象可能不夠強,冗長的程式碼降低可讀性和撰寫速度,程式碼的字數不是絕對的指標,但不可忽視它和思維之間的關聯,就像數學總是如此精簡。

Java為了安全性、擴充性、可讀性做了許多規範,像是static typing和exception,浪費太多時間在刀口之外,有時沒必要寫exception,乾脆草草了事:

try { ... } catch (Exception e) { e.printStackTrace(); }

相較於C++,Java做得不錯,但要小心這也許是錯誤前提下的最佳解法,是該換個起跑點了。

延伸閱讀:Omega

從大中那看來的,類似Haskell的language,大中寫了篇介紹Omega的文章:”Switch between static and dynamic type checking”,看不懂但看起來很神。

超越Java(Beyond Java) - 2

書藉基本資料:超越Java(Beyond Java)

我的眼界不廣,心得可能有錯,還請大家指正。ch3、4分析Java的成功原因和隱憂,作者一邊寫自己的看法,一邊引用數位資深Java Progarmmer的訪談做為引證,這本書的宣傳手法真的很高明,如果不是名為Beyond Java,很難吸引一堆Java支持者來看,並扭轉他們的看法,了解這世界上還有很多可能。


Java成功的一大原因是和Open Source族群合作良好,Open Source帶來大量使用者和library
,比方IDE eclipse、Ant、Tomcat。做為下世代的語言霸者,作者認為非政治性是語言的必要性,比方Ruby,反之C#具政治性,會阻礙和Open Source族群的合作。不過就算Java淡出市場,JVM仍會存活許久,JVM已建立良好平台和大量library,適合其它語言使用。

”簡單就是美”、”多個解決方法裡,最簡單的最好”,如果我們相信這樣的原則,那漸漸變笨重的Java,看來不適合開發application / web application,雖然以一個承接C++的角色來說,Java已盡善盡美了,Java確實展現許多優點,但錯誤 前提/架構 下的最佳解法沒有意義。例如Design Pattern,繼Paul Graham後,第二次看到書裡質疑Design Pattern的正確性,這可能是語言本身的缺陷,而使programmer要在實作層面用特定技巧彌補,增加維護的複雜度。我滿喜歡Design Pattern的思維,但一直覺得很難上手,進而懷疑學Design Pattern的方向是否有誤,問題可能在更根本的地方。

Java是很好學的語言,但要用Java真的做番事,要用許多framework和工具,但每個東西的熟悉時間都是以年為單位,我喜歡寫Java,但一直都很排斥學如J2EE、Structs這類framework,天知道真的投入開發時,這些東西是否還是最佳選擇,學習的代價太高了。兩年前還不少補習班廣告三個月十萬元學J2EE,現在卻愈來愈多人質疑它的必要性。

下篇引用一些書上的實例,說明Java language本身的不足。

2007年1月12日 星期五

超越Java(Beyond Java)

書藉基本資料:超越Java(Beyond Java)

目前看到ch2,但是好書就是能讓讀者的靈感源源不絕,不用等到看完再寫想法。前面清楚的說明多學語言的好處,不同場合各有適合的語言,C/C++位在system level,拿來寫application不太恰當,很多時候我們並不在意記憶體用得有無效率,也許開發到極致時會,但用C/C++可能寫不到那個時刻就因過於複雜而結束開發。

粗略的分為system level、application、web application來看,Java適當的扮演一個有別於C/C++,又頗接近它們的好角色,libaray和framework日漸增長,各大廠持續推行,不愁找不到人材。但這些架構太複雜而不適合寫中小規模的application/web application,培訓人才學會寫Java不難,但對framework上手卻是曠日費時。用過scripting language的人可以體會快速開發的喜悅,熱門的Perl/Python/Ruby各有千秋,而《超越Java》是作者自身團隊用Java開發web application,並參用Ruby on Rail開發得來的心得,名為超越Java,介紹Ruby的意味深些。

受限於語言天生的能力,framework再怎麼強化,也會有限度,就像技巧高超的programmer可以用C寫出很OO的程式,但那只是費力成效又差的工作,也許是時候考慮看看不同語言,現在投入Ruby的時機正好,既不會太早而缺乏資源,也不會太晚而失去競爭優勢。別忘了Paul Graham所言,好的語言具有數十倍以上的競爭優勢,對他1995開創的網路公司來說,LISP就是祕密武器。

現今的application/web application,需要的是更高階、更彈性的語言,這正是PHP興起的主因,只是PHP有點髒,沒太大興趣學好PHP。作者相信Java仍是目前的霸者,但五年後就很難說,至少就我們的認知來說,Java對於更高階的開發需求,可能和C/C++對於system level以上的開發需求一樣地不適宜。Java的strong typing和許多保護措施使我相信用它來組合大程式,會愈組愈順,而不像在不穩的地基上蓋歪斜的高塔。雖然有不少實證表示Perl/Python/Ruby也能開發大型專案,但在試用寫較具規模的程式前,還是先保留看法。

相關閱讀:

2007年1月7日 星期日

旋文佑文法

旋文佑文法

一個半月前看到herbage在讀這本,似乎是大家都推上天的文法書,就和herbage借來看,可惜絕版買不到了。這本是寫給有一定文法基礎的人,我想有學到關係代名詞就算有文法基礎吧,我的學習背景一直以語感為主,不太想理文法,但讀得又不夠多,在重大危機時有小惡補一些文法,可說文法基礎薄弱。

作者融合多年的經驗和自己思考的結果,用他的方式重新統整一套文法系統,配合大量正反例子詳細說明,並偶而提及他的文法和傳統文法差在那,我大多跳過文法差異的段落,我不懂傳統文法,也不想看有點怨念的碎碎唸 XD

這本書真的如作者強調的,大部份內容都容易理解,要記的東西不多,又寫得很精簡,讀來很有效率。序提到作者學英文的過程,強調廣讀是不錯的方法,至少符合興趣學起來較能持續,很合我的想法。前幾章修正一些文法用詞,仔細說明補語為何。整本的例句超清楚的,章節又條理分明,掌握到文法大意後,後面章節我大多直接看例句對照,比方 A 句怎麼改成 B 句, C 句錯在那裡,需要讀的內文又更少了。