我和劉未鵬文章的共同想法: 不想在 c++ 語言細節/特性的地方打轉, 一直注意語言細節/特性, 很容易鑽進去這個地方, 不容易逃出來, 我前陣子就鑽進 template, 好不容易才逃出。或是 overloaded function 怎麼決定採用哪個 function, c++ primer 寫的很清楚, 那些規則很煩人, 但你需要去看這些嗎? 不, 一開始不會有這需要, 一開始的你絕對不會寫成這麼複雜, 讓自己踩到陷阱, 頂多是 print(int), print(char) 這種簡單的用法。
我想用 c++ 寫點有趣的東西, 例如 os kernel, 還沒完成, 目前只建好目錄 (這可容易多了), simple_os 是用 c 實作, 不能用 c++ 實作一直是我的遺憾; 用 c++ 寫的實作品有作業系統之前的 scheme, 和作業系統之前的 c++ library, simple_gui。我覺得這些都比去學習 c++ 語言細節有趣多了。而且用到的 c++ 特性/語言細節很少, 這也是我受害之後才有的想法。
我也不想再看什麼條款的書, 好像一個不注意, 又要落到 c++ 陷阱中了。不是書籍內容不好, 相反的, table 1. 介紹的書本本都是大作, 但我想把注意力集中在用 c++ 寫出我想寫的程式。
從 C 到 C++ 物件導向革命 - 抄襲的作品
學習 c++ 一定要這麼辛苦嗎? table 1 提到的書單我幾乎都有 (中文版本)。我反而推薦《Essential C++》, 不過這是給有程式經驗的人看的, 並不是給程式語言初學者, 薄薄一本, 也不會提到完整的 c++ 特性, 看完就可以使用 c++ 來寫程式了。
而到了 2016 年, 至少又要加上幾本書了。第四版的 the c++ programming language, 第五版的 c++ primer, 這兩本這麼厚, 吃的下的人不多, 到不是因為看不完, 而是會排擠學習其他知識的時間。真要挑一本看, 當然是看 Bjarne 的書, 因為我實在想不出不看 c++ 發明者寫的書而非要去看其他人寫的理由。
Effective C++, More Effective C++, 看著手邊的 effective modern c++, 未來再看到 more effective modern c++ 我應該也不會意外。拿到書後沒有急著看 effective modern c++, 我的心境已經和之前不同了, 當初 Effective C++, More Effective C++ 看的津津樂道, 不過對於 c++ 的掌握沒什麼幫助, 不是書不好, 而是我忘光了書中內容了, 而這 3 本薄薄的, 不會花上太多時間。
你不想在語言上花太多時間吧! 只有 c++ 本身並不能寫出什麼有趣的程式, 我好像打自己臉了, fig 1 就是用 cout 畫出整個畫面, 但其實也沒那麼簡單, 如果只有 c++ 本身的知識, 也是做不到的。fig 1 是一個很有趣的程式。
再來本《c++ 標準庫》, 我知道有免費的英文網站可以查, 但中文是這本書的最大價值, 你懂的, 如果你要靠免費的英文網站學英文又學 c++, 那你挑錯教材了, 很有可能落得兩頭空, 既沒有學好 c++ 標準程式庫, 英文也沒有進步, 一心二用是很困難的, 連 Don Knuth 一次都只做一件事情, 我們平凡人就更無法同時做兩件事情了。
接著該讀哪本呢? the c++ programming language the 4th 中文本, 現在的我會選這 3 本書來學習 c++, c++ primer 就不讀了, the c++ programming language 應該可以覆蓋 c++ primer 內容, 我會讀 c++ primer, 完全是因為侯捷的翻譯, 如果不是侯捷翻的, 我只會去看 the c++ programming language, 看聖經版就夠了。但這本不是馬上看, 而是用 c++ 寫了不少程式後, 再來翻閱, 所以實際上只要讀 2 本, 甚至也不一定要讀 c++ 標準庫, 那更是只要讀一本, 到了這時候應該不會滿足《C++ 程式設計原理與實務》裡頭的東西, 會想要再知道多一點, 就靠它了。
我認為這樣就足夠當個 c++ 使用者, 其他的就隨緣了。如果還要讀書呢? 那就再把 1, 3 拿出來讀, 正常的人應該把讀過的內容都忘光了。再來的話你應該有能力選要看的 c++ 書籍, 可以從各地的推薦書單找到自己要的。
若你要像我一樣把 c++ 用在作業系統之前的程式上, 那所需要的知識大部份就和 c++ 無關了, 可以從我的 blog 文章得知個大概。這是《系統底層開發人員》的領域, 不是《c++ 底層開發人員》, 也許有人會同時有這兩種屬性 (ex: Bjarne Stroustrup), 不過這兩樣是不同的, 我用 c 或其他語言也可以辦到這件事情, 和 c++ 無關, 用 c++ 做這件事情只是因為我喜歡 c++。
那你說沒學到的其他 c++ 特性怎麼辦, 沒怎麼辦, 不會那些不會嚴重影響到寫不出程式來。c 沒有 lambda, closure, 沒有物件導向, 沒有 template, 沒有很多語言有的豐富特性, 但我需要為你證明 c 的能耐嗎? 但若有些特性不重要, 那麼 linux 裡頭為什麼又用上那麼多的 gnu extension 呢?
語言特性真的令人又愛又恨, 怎麼選擇是智慧的表現。
c++ 最令人注目的 OO, 就是 class 的運用, 以 c++ 使用者來說, 只要使用別人寫好的 class 就足以, 這個層級的學習就簡單很多, 大多是一些 class 語法, 你不需要學習如何寫好一個 class 的 ctor/dtor/assign operator, 只要有概念即可, 大概也不會有機會去寫這些。但是 c++ 底層開發人員就不同了, 他們得知道如何撰寫這些, 除了功能正常, 還得有效率。這部份的學習就辛苦一點, 然後在加上繼承/多型又會再辛苦一點; 再來個 template class, 又再辛苦一些。
但學習 c++11 raw string, 和 range base for loop 語法, 一點也不難, 撿起他們來吧! 如果不想學也沒關係, 使用原本的 for loop 語法也不會讓自己看來像笨蛋, 同樣的, 用 range base for loop 也不會讓自己看來很高竿。move semantic 就不用勉強自己了, 我覺得這個特性不是很容易理解, 我花了不少時間才弄懂, 就當個單純 c++ 使用者。
沒有這些之前, 你 c++ 程式也寫的好好的, 這不會造成程式寫不出來的後遺症, 不是一定要學習的關鍵。用 c++ 98 也不糟糕, 很多人也只用 c++ compiler 而不寫 c++ style 程式。我不是說不學 c++11, c++14, c++17, 而是沒那麼急迫的需要學習他, 當然你若是把自己定義為 c++ 底層開發人員, 那就一定要會的。