最近一部名為“學校不會教的東西”的短片甚囂塵上,引起了福士的關注。短片的中心思想就是“人人都能編程”,而且其中還有幾位知名富豪宣傳這一論點。(順便提一句,這些富豪的錢是通過僱傭別人編程而賺取的,並非靠自己編程。)
前幾天我弟弟來了,他是一個做夢都想發財的主。他對我說:“我想和你一樣,我要編程”。毫無疑問,他看過了那部短片。
我想說的是,這一切根本不靠譜。不是人人都適合編程(簡單的入門除外),更重要的是,並非人人都能把編程作為職業。
短片一開頭是 Bill Gates 和 Mark Zuckerberg 等知名富豪在宣傳“我還是小孩子的時候就開始編程了”,然後顯示一下他們最早的啟蒙作品,例如小遊戲之類的。之後,Dropbox 的創始人 Drew Houston 出現了,稱“編程和玩樂器、做運動差不多”,然後大學期間學過編程的 NBA 全明星 Chris Bosh 會介紹他在編程方面遇到的困難和苦惱,但實際上卻並沒有指出有多困難。
他們說的這些並不假。一個有好奇心的小孩學習編程就像學習其它任何無關緊要的事情一樣(例如樂器、運動、雜耍、針線等)。但後面的內容就開始誤導了。
Facebook 早期工程師 Makinde Adeagbo 出來說很多編程都是很簡單的。從某種意義上說,這是對的。但我同樣可以說打籃球時很多動作也是很簡單的,比如橫穿球場或是投球。橫穿球場是打籃球中的基本要素,但並不是會橫穿球場就表示籃球打得好。實際上,你可能每次都能漂亮地橫穿球場,卻根本打不好籃球。
然後我最喜歡的片段來了:Bill Gates 在那說:“加,減,這就是編程”。就是這些,這些就是你學會編程所需的唯一前提。
這話只有一半是對的。你確實無需太多數學知識就可以編程。但問題是,隨著你對編程瞭解得越多,就會發現數學必不可少。我要說,想當一名成功的程式員,必須要有良好的代數基礎,若你想達到更高的層次,你還需要學得更多。且不說這條前提,我認為他傳達了一個錯誤的資訊,那就是將最低門檻描述為成功的方法。更準確的說法是:“你只需要知道加和減。但你最好多學一點數學,因為除了《 7 天學會Java》之類的入門讀物以外,當你閱讀更有內容的編程書籍時,就需要用到數學。”
短片的最後開始介紹程式員的生活。奢華的辦公室、免費的食物、優美的景色,當然,還有大把的鈔票。
我被短片中的一家公司錄取了:Facebook。但我代表其他的程式員說,這些看著很難受。
這些條件確實存在,但對於程式員而言,它們是特例,並非常態。大多數辦公室僅配備咖啡機和冰箱,供你存放自己的食物,通常都被別人的食物塞得滿滿的,且一放就是一個星期。程式員們坐在大樓的一個個灰色小隔間裡,還要遵守嚴格的規章制度。
我要做的就是被 Facebook 錄取。他們告訴我這很簡單。他們錄取了成百上千的人,編程很簡單。 事實並非如此。Facebook 的面試可不只是“加和減”,他們給你的問題也絕不是有趣的小遊戲。其中一道面試題需要瞭解微積分,另一道題需要說明高度遞迴函式的時空複雜性,還有一道需要掌握程式員使用的抽象工具,例如正規語言和自動操作。
我弟弟想幹我這一行,他認為能比在 FedEx 當個工人賺得錢多得多,過上小奢侈的生活。短片裡也是這樣宣傳的。但我想他並沒有看清現實。
這個周末我坐在這裡,給一個我完全不瞭解的程式碼程式庫寫代碼。我覺得如果不按時完成,我這份工作就危險了。我編寫的不是有趣的遊戲或其它具體的東西,實際上,如果一個外行問我在編寫什麼,我根本沒法說清楚。我或許會說:“我在編寫一種東西,它能夠讀取代碼,根據代碼推匯出資訊,其他人就可以在他們的工具裡使用這些資訊”。我想這不是我弟弟或其他任何人預想中要做的事情。
我能夠早上 10 點上班,晚上 7 點回家嗎?不行。編程不是按時上下班的工作,它總是需要更多的時間來完成任務。而且永無休止,因為任務源源不斷。總是有新功能要加,有新 bug 要除。你總是有理由再留下一兩個小時。就我個人而言,我感覺時間如此不夠用,我必須加班到淩晨 12 點到 1 點才能平衡我的工作和個人生活。這可不僅僅是我的狀態,很多程式員都是如此。
我並不想打擊剛開始學編程的新人,它確實是一件能增強能力的事情。但對於我而言,編程不是一兩個周末或 52 個周末就能搞定的事情,而是我付出了艱辛的努力,且放棄了生活中許多其它的事情才學會的。我很難告訴我弟弟或是其他任何人,學會一點編程的成果(不是名譽和財富)就能改變他們思考的方式,而且我也不認為這件簡單的事情對大多數人是一種好的推動。
簡而言之,不是人人都適合編程。它不是這部短片或電影“社交網路”裡所描述的有趣好玩的工作。它也不是一項令人精神爽朗的社會活動。你要花費大量的時間坐在電腦螢幕前,盯著那些五顏六色的文字文件,思考,思考,打字,生氣,並奇怪自己為什麼會選擇這種死坐著不動的生活。