關於編程,你得到的一個最好的建議是什麼?

扎克伯格11歲開始學習編程,創辦Facebook;比爾·蓋茨13歲學習編程,創辦微軟……喬布斯說:「每一個人都應該學習電腦編程,因為它會教你如何思考。"


這是一個有關於我得到的一些專業性編程建議的故事以及它如何影響了我的職業生涯。我真心覺得此建議真可謂是字字珠璣,所以我想分享給大家。

還是在1996年,我剛得到我的第一份全職工作。公司:微軟。產品:Windows 2000。老闆是一個叫Terry Lahman的傢伙,滿臉的絡腮鬍子,卻非常慈祥,打心眼裡關心產品和他的員工。那個時候我才剛畢業,非常惶恐,都不知道自己應該做什麼,只能竭盡全力做好Terry所吩咐的每一件事情,小心翼翼,不敢越雷池一步。

有一天,他走進我的辦公室,然後,他說:「Eric,我希望我每次走進來問你,『你在幹什麼我不知道的事情?』的時候,你總是能夠說出點什麼來。」

我依然記得聽到這句話的時候我有多麼的驚訝。我以為,如果我將時間「浪費」在項目以外的事情上,他會生氣會斥責我。但是萬萬沒想到,他竟然鼓勵我去這麼做。

結果從那之後,我開始搞一些小型的兼職項目。我學得很快。對Perl的討厭和對C++的喜歡促使我寫出了一個稱之為GRETA 的C++正則表達式引擎。那段時間為了它我幾乎就沒怎麼做我自己的本職工作。但是沒關係,Terry對我的項目非常感興趣,並且從來沒有干涉過我的工作。我對代碼的熱情迅猛增長。

同時幸運的是,我那個可愛的正則表達式引擎開始在微軟內部走紅,不少團隊開始使用它。在那個時候,C++的世界充斥著TR1——一系列預先規劃好的標準庫擴展,非常需要C++的正則表達式引擎,所以我參與了C++標準化工作(一直持續到今天)。

通過與標準化成員之間的互動,我遇到了很多既有才華又非常聰明的人。我第一次聽說了Boost——一個開源C++庫的集合。最後,我遇見了Dave Abrahams,Boost的聯合創始人之一,他和我成了朋友。以至於後來當我終於下定決心離開微軟,Dave請我擔任了BoostPro Computering的分包商。

言歸正傳,在那段時間,無論Terry什麼時間到我的辦公室,總能發現我在搞自己的兼職項目。我寫了一個新的正則表達式引擎,稱為Boost.Xpressive。作為這項工作的一部分,我寫了一個名為Boost.Proto的庫,用於構建嵌入式領域的特定編程語言。人們開始使用我寫的代碼,並且在項目過程中會來尋求我的幫助。

現在,我為自己工作。但是,我永遠不會忘記那一天Terry鼓勵我的話,是他的建議讓我選擇了正確的道路,有了今天的成功。

如果要做一個總結的話,Terry的建議其主旨就是要有主動性和激情。不要等著別人來告訴你該怎麼做。Just do it。在do的過程中,你會發現自己的激情在燃燒,我相信,你的成就會讓你的上司,你的客戶,甚至是你自己都大吃一驚。



我在上學之初也是看書流,找個什麼「21天XXX」的看完以為自己就OK了,或者是裝B的跟大家討論A書好還是B書壞。重心還是在傳統的 看書 考試 得高分 的2B青年模式。

我們學院在當年還是比較開明的,作為試點的軟體學院,一直強調「Learning By Doing」的學習模式,這一點上我一直很感謝我們學院。這個口號雖然很虛,但後續對我影響很大。雖然不是一些直接的建議,但影響我接觸到了很多視野之外的東西:

1. TopCoder: 我們學校有很好的TopCoder傳統,雖說有「萬刀戶」這樣具有功利色彩的口號。但進入TopCoder以後,可以看別人的代碼,可以看每期的講解,在編程基本功和工程方面都有足夠的信息,這段經歷對於編程基本功和如何編程都有很大的提升,在工程方面也接觸到了Unittest這些概念,我的第一個帶有unittest的工程代碼就是在TopCoder的指導下完成的。

2. 車東:我對於搜索引擎的興趣很早就有了,但一直不得入門。感謝互聯網,車東當年的Blog可能是中文互聯網界最全面充實的搜索引擎信息,我就是一篇一篇爬完了他的Blog,起了很多掃盲和啟蒙的作用。順著車東的Blog,讀完了Google 98的論文,摸到了北大天網的Tiny Search Engine,照貓畫虎自己寫出了一個帶爬蟲的搜索引擎,雖然很挫,但這個可以Run的小玩意帶給了很多樂趣和收穫。



我無意中接觸了一個瘋狂的skunkworks項目,這個項目使用的是他們叫做Smalltalk的另類程序語言。「面向對象」作為一個「熱門」項目才剛剛起步。作為「面向對象」的顧問,報酬非常可觀。很多人自以為這就是新的對象派別的全部內容。用這種奇怪的編程語言不久之後,我依然對實例變數、類變數、類實例變數之間的差別感到困惑。這是需要用時間去考究的。

希望不要使用『er』結尾的對象(Don』t make objects that end with 『er』.)

面向對象編程(OOP)的模式在我們稱之為「程序化編程」的文化當中活力十足。現在我們沒有過多地談論這兩種模式之間的對比。也許一部分是因為面向對象語言現在俯拾即是。

假如我有一個建議想轉告給一群有志成為面向對象程序員的人,那應該是Russ提供的一句金玉良言:「不要使用『er』結尾的對象。」

程序是由行為和數據構成。在典型的結構化程序設計之中,我們將精力集中在行為(動詞)上,然後弄清楚我們需要哪些數據(名詞)才能執行。總而言之,我們將數據綁定在行為上。但在面向對象程序設計之中,我們將程序的中心用名詞和數據表示。

總之,我有理由相信,完美最終使用的工具,更類似於面向對象編程創始人心中設想的模樣。我們想要創造可以描述的對象,然後將某些行為綁定在它上面,而不是將焦點集中在它的行為上,然後弄清楚他們的行為需要哪些數據。



推薦閱讀:

阻擋你學會Haskell最大的兩個問題是什麼?
偽·從零開始學Python - 1.1 認識Python
求余和取模
如何實現feed流
要獲得「機器學習或數據科學」的工作,到底選哪種編程語言更好?

TAG:編程 | 程序員 | 編程語言 | 計算機 |