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