2016年5月12日 星期四

要成為一個能與 Google 工程師比肩的程式師應該要會哪些東西?

 




隨便亂翻的翻譯稿 😁 。原文在此: https://goo.gl/gU0Dwb

由於有不少網友常常問我「要成為一個『傑出』的程式設計師,該學哪些東西?」最近剛好看到網路上流傳這篇。就順手隨便翻翻。

這篇的翻譯準則並沒有很嚴謹,也就是並非逐字翻譯。翻譯的目的是服務一些英文苦手的讀者,所以若有語句不順、與原文有出入的地方,就請大家見諒、並以原文為準囉!

原文的超連結我盡量保持。但某些書籍推薦的超連結,如果我知道有中譯版,我就會加上中譯版連結,或者是乾脆把英文版連結換掉。希望各位會喜歡我這小小的雞婆。

那麼,正文開始!



這篇文章建議想成為 Google 獵才對象的工程師、或者比該目標更好的工程師基本上要會哪些東西:

一、一般技能

  • 至少要非常熟悉下列程式語言中的兩者:C++JavaPython(上面三種語言 Google 內部都有在用。我個人以及很多同事則是喜歡 C 語言多過於 C++)。
  • 瞭解你學習過的每個語言,它們個別的強項與弱點。以及與該語言相關的平台函式庫、或 API (Application Programming Interface)
  • 紮實地瞭解程式設計的一些核心知識。如:演算法(Algorithms,排序、搜尋...等等)、資料結構(Data Structure,鏈結串列、樹狀結構...等等)。
  • 對於作業系統、以及它的操作有紮實的瞭解與認識(尤其是 Unix 家族的作業系統。如 Linux 等)。
  • 多看「Google 面試問題集」一類的文章,讓自己知道 Google 對一個程式師有哪些期待。

二、書籍推薦

  • 「電腦程式的構造與解讀(Structure and Interpretation of Computer Programs)」(線上全文閱讀:英文版
  • 「C 語言程式設計(The C Programming Language)」。C 語言的爸爸丹尼斯・里奇(Dennis Ritchie)寫的。至今仍被奉為 C 語言最高經典。(紙本書購買:中文版英文版
  • 「程序員修煉之道︰從小工到專家(The Pragmatic Programmer)」(線上電子版購買:英文版、中國網友愛心版:簡中版
  • 「Code Complete」。教你怎麼寫乾淨清爽的程式。(英文版購買簡中版下載
  • 「C++ Primer」。這本書很容易跟另一本「C++ Primer Plus」弄混。真正出名的是「C++ Primer」,英文版目前出到第五版。(英文版購買簡中版下載繁中版購買
  • 「Effective C++」系列書籍(作者官網清單&購買(英)繁中最新版購買簡中第三版下載
  • 「Design Patterns」。有名的「四人幫」設計模式著作。「設計模式(Design Pattern)」就是一些程式師常用、好用的招數,把它們命名寫成書。需要的時候不用從頭苦苦思考,直接套用就是了。可以想像成電玩的連續技。(英文版購買繁中版購買
  • The UNIX Programming Environment」學習 Unix 書籍。私心以為,這本書已經太老太久(1983 年出的耶!),想學 Unix 應該有更好的選擇。我個人推薦「鳥哥的 Linux 私房菜」可能會好一點。
  • The Art of Computer Programming」。這套是資訊界大老「唐諾・克努斯(Donald E. Knuth,他還有個正式的中文名字叫「高德納」)」發心要寫一套縱貫古今、無所不包的演算法九陰真經,而產生的大作。從 1962 年開始有這個計畫,打算出七大冊,從演算法基礎、搜尋、排序、圖論、編譯器...無所不包。1968、1969、1973 分別出了第一~三冊,結果第四冊卻遙遙無期。本來以為要跟冨堅義博的 Hunter x Hunter 一樣、得請子孫燒給自己了,沒想到 2011 年出了一本「第 4A 冊」。據作者本人說,第四冊可能分成 4A, 4B, 4C, 4D 四小冊,小弟我只能保佑這位 1938 年出生的 Knuth 教授長命百歲了。對七大冊大綱有興趣的,可以查閱英文維基百科。該位老兄還在 1977 年嫌出版社的排版軟體數學式排得不好看,自己寫了一套排版軟體叫 TeX,專門來排他這部大作(TeX 與 Knuth 教授的故事)。這套書非~~常營養!但不建議體質虛弱的初學者啃。很擔心初學者啃了會「虛不受補」。(點進去後英文版、簡中版都有,自己翻翻看囉)

三、線上課程

作者本人很推崇麻省理工學院(MIT)的「開放式課程(Open Courseware)」。底下是他認為大家應該去註冊的線上課程:

四、部落格

以下是作者個人認為他推薦的部落格:

五、社群

以下是作者推薦的社群:
  • Hacker News(譯註:這個社群我追過,垃圾文蠻多的,不過還是偶有佳作)
  • Stack Overflow(譯註:程式師的 Q&A 百科全書。據說 Stack Overflow 搜尋高手可以靠 Ctrl-C 與 Ctrl-V 就能領薪水? 😆)
  • Programming @ Reddit(譯註:Reddit = 台灣的 PTT,國外鄉民集散地。這裡是 Reddit 的程式版。很讚!每天都有水準很高的文章出現!)

結語

想成為中上水準的程式師,您要不就得是知名大學的資訊相關科系畢業,要不就得是自學 + 3 年以上業界專案的參與經驗,才能成為 Google 獵才的候選名單。

學了上述建議的書籍或課程後,您應該有能力輕鬆自學像 JavaScript 這樣的語言。或許有人建議您學習「函數式程式設計(Functional Programming)」,如:LispErlangHaskellScheme 等語言。這些語言都能提高您的眼界,讓您瞭解除了結構化程式設計、物件導向程式設計以外,另一種解決問題的思維與方法(您不用把它們學得很透徹,但至少知道它們是什麼、以及它們是怎麼運作的)。

沒有什麼東西比擁有解決複雜問題的實務經驗更珍貴的了!找個開放原始碼(Open Source)來研究、或者自己起個專案(譯註:GitHub 這類開源專案很多),然後開始弄髒雙手、搞搞弄弄吧!

成為程式師最要記得的是:你的學習旅程可能沒有終止的一天!電腦科學(Computer Science)這門學科跟傳統科學比起來,或許年輕了許多。但它的相關領域既深且廣!找個你感興趣的領域,學習該領域的基礎知識後,然後就縱身往下鑽吧!

譯註:
  1. 程式設計常見的領域有:桌機程式設計(如:進銷存、金融軟體)、網頁程式設計、手機程式設計、遊戲程式設計...等。
  2. 我是否該找個時間來寫一篇適合台灣讀者「成為優秀工程師需要學習的東西有哪些?」的文章呢? 😏