為什麼你該開始學習程式設計了?

張砷鎵發表於2017-02-06

有一家飯店的大廚,燒得一手好菜,經過口碑相傳,客人從五湖四海聞名而來。然而這對飯店的老闆來說,並不單純是一個好訊息。因為客人不是奔著飯店,而是奔著大廚的手藝來的。老闆必須想辦法留住這位大廚,否則他一旦被別人挖走,飯店的生意就會一落千丈了。然而即便老闆不惜血本保證了大廚的忠誠度,風險也依然存在:

大廚休息或請假的時候,菜品的口味就無法讓顧客滿意;

大廚只有一個,如果想在多個地方開分店,那口味也就不能保證了;

大廚再厲害,同時也只能炒一個菜,而顧客越來越多,輸出總是供不應求;

大廚年紀大了總是要退休的,如果收徒的話,怎麼繼續保證徒弟的忠誠度呢?

有一天,老闆突然悟到,決定菜品口味的是大廚燒菜的過程,而不是大廚本人。如果大廚願意把自己每個菜的菜譜都寫出來,那不就可以請別的廚師來操作了嗎?雖然別人按照菜譜燒出來可能達不到原味的100分,但90分總是能達到的,而這樣的差距是一般的食客無法分辨的。這樣只要菜譜在,飯店菜品的質量就能得到保證,擴張店面、開分店什麼的就都不成問題了。

於是老闆和大廚談了一個晚上,說服了他用菜譜技術入股。幾年後,飯店生意越來越好,開了無數家分店,老闆賺了很多錢,大廚也得到豐厚的分成,不用再天天靠手藝吃飯了。

什麼是程式設計?

在洗衣機出現之前,人們只能用手來洗衣服,需要經過浸泡、揉搓、漂洗、擰乾的一系列流程。而全自動洗衣機的發明使洗衣服的工作人人都可以輕鬆完成,從而可以將原本用來洗衣服的時間解放出來去做其他事情。隨著洗衣機的不斷迭代升級,洗衣服的整個流程最終會被人們遺忘,只有設計洗衣機的工程師們瞭解流程,因為他們負責對其進行優化和改進。

所謂程式,就是為了實現一個需求而設計的邏輯流程。大廚的菜譜和洗衣機的工作流程都是程式,只不過前者由人來執行,後者由機器來執行。正是因為有程式作為媒介,我們才可以分離設計者、呼叫者和執行者的角色。雖然程式的執行效果未必能讓其設計者滿意,但它已經可以脫離設計者的時間和空間侷限而存在,可以被其他人執行、驗證和改進。

所謂程式設計,就是指編寫程式。將燒菜的過程寫成菜譜,本質上就是在程式設計。通過程式設計,我們更加透徹地理解並闡述了事物的本質,讓曾經專屬於某個人、某個團體、某個地方甚至某個時刻的東西,得以獨立的存在和發展。從這個角度來講,說程式設計是在創造生命也不為過。

程式設計可以說是一種標準化的寫作。標準化保證了服務和產品的質量,也使大規模複製和擴張成為可能。KFC正是依賴其詳盡到炸薯條的油溫秒數的食品加工手冊,才將分店開滿世界各地的。陶華碧如果不能將她的豆瓣醬配方和製作過程清楚地描述出來,交由標準化生產線去製造的話,那麼今天“老乾媽”最多隻是一個小鄉村裡的作坊級產品,不可能走上我們的餐桌。

我們每天的生活,都在和各種技術產品和服務打交道,比如導航、搜尋引擎、聊天軟體……你可曾想過,這些產品和服務背後的原理是什麼?相信除了程式設計師群體之外,絕大多數人不會去想這些問題,因為:

這跟我沒有關係啊!我又不去幹這行……

應該只有專業人士才能搞懂吧,我可不行!

能用就行了,想那麼多幹啥,多累呀!

他們這麼想並沒有錯,因為程式設計的本質就是:設計一個邏輯流程來實現指定的需求,使呼叫者無需瞭解實現細節即可達到目的。

由於程式和程式設計的廣義概念太過籠統,為不導致概念混淆,下文中提到的“程式”和“程式設計”,特指使用計算機程式語言編寫,由機器來執行的程式。

解放時間和注意力

假設你已經在某崗位工作了一段時間,根據經驗總結出來每天下班前有下面三件事需要做:

A、在公司內網系統查詢某業務當天的資料(約10分鐘)

B、整理成日報表並存檔(約15分鐘)

C、把幾個核心資料用電子郵件傳送給領導(約5分鐘)

你可以在認真梳理過之後,將這個流程寫下來,貼在辦公桌前,或者記在腦子裡。這自然比那些不知道流程的人要強得多,你可以確保每個步驟都不被遺漏地執行到(然而這並不能完全保證)。雖然你已經花了時間認真思考過,但每天這樣枯燥乏味的流程都需要自己執行一遍……等等,這活我不可以找個祕書來幹嗎?

當然可以,僱傭他人是一種用金錢換時間的解決方案。但是這同時又引入了許多新的問題:

你需要花錢(廢話)

你需要把要做的事解釋給祕書聽,並確保他能聽懂(溝通成本)

祕書下班或休假時,這些事你還得自己做(有時間限制)

你要為祕書犯的錯誤承擔責任(質量得不到保證)

每次祕書犯了錯誤,你都需要進行教育(培訓成本)

祕書會直接接觸業務資料和資訊,難保有洩密的可能(安全隱患)

換一個祕書,以上的事情都得再來一遍……

這不是把事情搞複雜了嗎?人的成本太高,提供的服務又不可靠。而如果你會程式設計的話,也許你可以:

編一個小程式來完成查資料、做報表、發郵件的流程,再配置一個定時任務每天自動執行;

謹慎一點的話,可以讓程式先發到自己的郵箱,檢查沒有問題後再轉發給領導;

必要的話,還可以讓程式在執行出現意外時給你的郵箱或手機發報警通知;

如果你願意,甚至可以給內網辦公系統直接加上郵件報表這個功能……

假設你原本手工做完ABC流程需要30分鐘,那麼你的程式每執行一次,就為你節省了30分鐘的時間。假如你寫程式用了三個小時,那麼一週就能收回成本,以後全部都是淨賺的。如果程式執行的時間足夠長,那麼單次執行的均攤成本將趨近於零。可以看出,程式設計是一種用時間換時間的解決方案。

當然,你需要將要做的流程寫成機器能讀懂的程式;如果需求發生變化,你需要對應地修改程式;如果執行時出了BUG,你需要除錯修復……但更重要的是:程式不拿工資,不可能辭職,不需要休息,不會鬧情緒,不可能犯錯,只要你的流程正確,依賴的資源不出問題,它就可以7*24小時一直運轉下去。

每當我們寫程式實現了一個需求,就好比造出了一把錘子。今後你遇到類似的問題,都可以拿這個錘子來解決。當然有時會遇到錘子不稱手的情況,需要持續地升級和優化。但在大多數情況下,這個錘子都是可以直接拿來用的。也就是說:完全相同的問題,你只需要解決一次就好,不會浪費時間在重複的工作上。

通過程式設計,你可以將那些枯燥無味的重複性工作中的部分甚至全部,交由機器來接管,這樣就可以將你的時間和注意力從具體的事務中解放出來,去做更有價值的事情。比如研究和優化工作流程,或者陪伴家人,又或者去讀一本書……

體驗“開掛”的人生

喜歡網遊的朋友可能都知道外掛這東西,這是指和遊戲一起執行、為了提升遊戲體驗的小程式。外掛一般分為兩類:一是在遊戲系統框架內簡化玩家操作的輔助性外掛,提供如自動拾取、自動打怪、改鍵之類的功能;二是利用遊戲漏洞營造不平等的作弊性外掛,提供如開圖、加速、無敵之類的功能。

隨著遊戲行業的迅猛發展,現今很多網遊都已經配備了原本由輔助性外掛提供的功能,輔助性外掛正在逐漸消亡,只剩下作弊性外掛和衍生的一系列黑色產業鏈,你懂得。

當我們說某個人“開掛”時,其實是在說他的表現(數量、速度、精確度……)明顯超出正常的範疇。當原始土著人碰到使用著各種科技產品的現代人時,大概就是一種“**,這哥們開掛了吧?”的感覺。

要知道,身體並不強壯的人類之所以能征服地球,就是因為我們會創造並使用工具來突破生理的侷限,做到原本不可能做到的事情。在即將到來的全資訊時代,程式設計將是創造工具,甚至使用工具的主要方法。我們天天都在使用的軟體和APP,不管是文書處理,K歌軟體還是搜尋引擎,都已經和我們的生活融為一體,成為我們生命的延伸。通過使用這些軟體,我們可以不斷突破自己經驗和能力上的侷限,我們隨時都在給自己“開掛”。

然而大多數人都是在被動地等待別人來滿足自己的需求。他們會使用通過朋友推薦、廣告宣傳等各種渠道推送給自己的軟體,然後感慨一下:“哇,居然還可以這樣!”他們只會使用已有軟體提供的標準功能,而一些個性化的特殊需求就只能因為軟體不支援放棄掉了。這就和穿衣服一樣,大多數人只會買標準尺寸穿,如果這裡緊那裡鬆,這裡長那裡短,也就只能忍了。

還有少部分人會主動考慮如何去滿足自己的特殊需求。他們會想:“如果有XXX功能就好了……”他們會主動去尋找能滿足自己需求的軟體,研究軟體的個性化配置,或者給軟體的開發者提功能建議。同樣,追求個性的人可能會找裁縫為自己量身訂做或者修改衣服,使其儘可能地適合自己。

只有極少數的人有能力自己去實現那些別人不能滿足的需求。他們能在原有軟體的基礎上開發外掛,對軟體進行二次開發,甚至寫出一個全新的軟體。同樣,追求完美的人可能會親自設計衣服,並把一件衣服不停地改來改去,直到自己徹底滿意為止。

如果說學好英語能為你的世界開啟一扇門,讓你擁有更多的選擇的話;那麼學好程式設計就能讓你有機會以“上帝視角”來認識和改造這個世界,並擁有幾乎無限的可能性。因為在現實中的一切最終都會被資訊化,而你可以通過程式設計來對資訊做任何形式的加工和處理,只要你想得到,就能做得到。

你想體驗“開掛”的人生嗎?那就趕緊開始學程式設計吧。

培養深入的思維方式

每個人都應該學習程式設計,因為它將教會你如何思考。——蘋果創始人 賈伯斯 [1]

思考,是人之所以為人的行為,而程式設計是一種對人的思考進行再思考的行為。我們不需要把每件事情想清楚,就可以在現實社會中生存。對某些從事機械性操作的職業來說,甚至完全不需要進行思考。然而在程式設計時,我們只有在想清楚之後,才能把程式寫出來。在編寫正確、高效、優雅的程式的同時,我們也在塑造自己的大腦,讓它能思考得更清楚、運轉得更高效。

程式設計要求我們客觀地去思考事物的本質,將注意力放在事物本身,而不是事物與我們的關係上。當古代的婦女在河邊洗髒衣服時,她可能在想:“河水好冷啊……這衣服顏色真漂亮……我家孩子為啥這麼調皮……”而當我們在為洗衣機設計程式時,只會想:“哦,這有一堆髒衣服需要洗”。其實很多原本困擾你許久的問題,只要跳出“我”的範疇,進行“忘我”的思考,就變得特別簡單和容易解決。

程式設計是將人的想法“實體化”的過程,這要求我們進行更深入、更細緻、更全面地思考。為了實現一個需求,你必須對其原理和運轉流程瞭解得十分透徹,否則就無法用程式語言精確地描述出來讓機器去執行。在實體化的過程中,想法的結構缺陷和邏輯漏洞會自然凸顯出來,你總會發現存在沒有考慮到的可能性,以及需要進一步思考的細節。

程式設計要求我們能夠對事物和流程進行拆分,並在不同的抽象層次上進行完整自洽的思考,這使我們有可能去解決那些規模無比龐大的問題。在實現一個稍具規模的需求時,我們不太可能同時考慮主體流程和操作細節,也不太可能同時從多個角度進行思考。經過合理拆分後的需求細粒度需求簡單明瞭,實現難度大大降低的同時,還可以分配給多人來共同進行。在一個成熟的軟體或網際網路公司,上千名工程師一起開發同一款產品是很常見的,而你能想象這麼多人一起去寫一本書麼?

程式設計是不斷解決問題的過程,也是不斷完善解決問題的方法論的過程。一個優秀的程式設計師總是解決問題的高手。在程式設計的各個階段(需求定義、方案設計、編碼實現、除錯糾錯……)中,都將面臨無窮無盡的問題。這個問題要不要解決?什麼時候解決?其根源是什麼?需要考慮哪些方面?如何做取捨?有哪些方案可供選擇?選擇的原則是什麼?……解決問題的方法論展開來講可以寫一本書了,且容我有時間另撰一文來表。

在未來更好地生存

半個世紀以前,美國有70%的人口在農場工作;隨著自動化耕種的大面積普及,現在只剩下不到1%。 ——凱文.凱利《必然》

從登入月球到生產奈米機器人,我們已經通過設計並使用各種機器完成了人類原本不可能親手做到的各種事情。迄今為止,人類從事的簡單重複性的工作(如洗衣、耕種、製造等)已經幾乎完全被機器接管,人類的工作方向已經轉向對機器的研發和維護。而那些需要複雜知識和精密操作的工作(比如駕駛汽車、外科手術等)也正在被機器逐步接管。

洗衣機解放了家庭主婦們的雙手,全自動流水線則解僱了工廠裡的大部分工人。只有在一些正享受人口紅利的發展中國家(比如中國和印度),由於技術引入成本比人工成本高,目前體力勞動者還有一些生存的空間。但技術的成本會不可阻擋地快速持續下降,而人口紅利的視窗期將快速消失,拐點很快就會到來。

資本是具有意志的,且不為人性所改變。當產出的質量不變,而技術的成本顯著低於人工成本時,幾乎所有的體力勞動者都會失業。機器不知疲倦,不會抱怨,幹得比人又快又好又省錢,人類怎麼可能和機器競爭?

與此同時,人工智慧正在將逐漸接管人類的簡單重複性思考活動(如尋路、翻譯等),人類只需要下達命令、制定原則和做出選擇即可。人工智慧甚至已經進入了那些被人們認為是“人之所以為人”的領域:寫作、編曲、繪畫……

Google的AlphaGo戰勝李世石是一個里程碑式的事件,它證明了人工智慧已經可以在人類最擅長的思考領域超越人類。現在最優秀的棋手都在向AI學習下棋,職業棋手和AI進行日常訓練成了常態。純機比純人強,人機比純機強,這早已是棋界的共識。

當人工智慧在某個思考領域的能力接近或超過人類(這在很多領域已經做到了 )時,而其成本極其低廉(這是早晚的事)時,在資本意志的作用下,這個領域就會將不可逆地被人工智慧迅速佔領。我們今天已經習慣了使用計算器來取代大腦進行數字計算,在不遠的將來,我們也會習慣將原本需要自己思考的許多問題交給由無數程式組成的人工智慧來處理。在可以預見的未來,所有構建在經驗和技能基礎上的非創造性工作崗位都會消失,人類的工作方向會轉變成對人工智慧的研發和維護。

人工智慧全面普及的時代正在以光一樣的速度向我們飛奔,可能下一秒就將我們遠遠地甩在身後,連車尾燈都看不到。屆時,幾乎所有的工作都將和人工智慧密不可分。只有那些理解人工智慧,能夠很好地和人工智慧合作,並幫助改進人工智慧的人,才能在那個時代更好地生存下去。

每個人都應該儘早開始學習程式設計,我的孩子起步太晚了,我覺得應該在教他們ABC和顏色的時候就開始。——美國第44任總統 奧巴馬 [2]

在《未來我們該學什麼語言?》一文中,我曾暢想過未來可能出現的腦介面技術,以及與之配套的人機共用結構化語言。屆時我們的大腦將直接接入網際網路和人工智慧,可以瞬間將需要的知識和資訊下載到大腦中……我們將成為神一樣的存在。但前提是你必須具備程式設計基礎,才能享用這一革命性技術帶來的成果。

什麼,那時候你還沒學會程式設計?可以洗洗睡了。

我知道你會問……

可是我又不準備當程式設計師啊,有必要學程式設計嗎?

你可能會開車,還是個老司機,很會享受駕駛的樂趣,但你未必願意去當一名計程車司機吧?同理,學習程式設計不一定非要做程式設計師,但卻能使你擁有全新的視角、深入的思維方式和效率優化的思維,這都將成為你重要的軟實力。在不久的將來,程式設計將會變成像英語、駕駛一樣人人必備的技能。到那時,你希望自己是一名老司機,還是搭車族呢?

“學這個有用嗎?”其實是一個很可怕的想法。由於很多東西現在看起來並沒有什麼用,大多數人就放棄了學習,而只有少數人會抱著“學學看能有什麼用”的念頭去嘗試。在之後的某一天,真正需要這項技能和知識時,那些選擇放棄的人只能感慨“要是當時……就好了!”,而選擇學習的人則會驚喜地發現“哇,原來還能用在這裡!”……所謂的“驚喜”和“運氣”其實就是這樣一回事:在不知不覺間,已經提前做好了準備。

那我能不能現在努力賺錢,然後僱一個專業的程式設計師呢?

不錯,你是可以找一個程式設計師來實現你的想法,但我們之前請祕書時遇到的諸多問題又會接踵而來。更重要的是,如果你不會程式設計,你可能連個靠譜沾邊的想法都提不出來。就好比沒有見過汽車的人,只會想著讓別人為他造一輛更快的馬車。只有在理解了某個事物的原理之後,這個事物的概念才能在你的腦中清晰起來,才能真正融入你的認知結構中。

有了清晰的概念,你才能對其進行思考,判斷它能夠用來做什麼,不能做什麼。如果概念不清晰,你甚至都無法講清楚自己的需求,更難和程式設計師進行溝通和合作。每一位程式設計師在面對“給我做一個淘寶”這樣的需求時,都會崩潰的。

我的英語很爛,能學會程式設計嗎?

英語不是學習程式設計的瓶頸,關鍵在於理解其概念和原理,以及改變思維方式。雖然幾乎所有程式語言的關鍵字都是英語,但常用的關鍵字也就那麼幾個,熱門語言的相關書籍也都有譯版。如果你願意的話,甚至可以用中文來給程式裡的變數、函式和命名。正如只要你認得start / save / load / quit這幾個單詞,就能去玩英文遊戲;只要會說sorry和how much,就能去國外旅遊一樣。

我已經工作好多年了,現在開始學還來得及嗎?該從什麼地方開始?

任何時候開始都不晚,當然越早越好。中國第一款防毒軟體KV300的作者王江民,就是38歲才開始學習程式設計的。至於應該怎麼學,從哪裡開始,這將是我今年的主要思考方向,敬請期待我的後續系列文章。也許你可以先試試這些網站:

http://www.codecombat.com :通過玩遊戲來啟蒙,有中文版,適合初學者

http://www.khanacademy.org :純英文視訊講解教學,適合學霸和筆記黨

http://www.codecademy.com :互動式實戰,效果最佳,但需有一定基礎

後話

曾經何時,想要建立一個網站服務,需要購買動轍數萬元的專業伺服器,支付昂貴的機房託管和頻寬租賃費用,聘請專業的開發人才或團隊來研發,再通過廣告和運營活動去拉攏使用者……門檻如此之高,使絕大多數人望而卻步,只有企業才能負擔得起。

而現如今,雲伺服器甚至比家裡的寬頻都便宜了,各種開源技術唾手可得,各種開放平臺提供了免費的使用者和渠道,一個APP通過社交網路可能瞬間火遍全國……有了樹莓派這樣超便宜的卡片電腦,再加上現在各種家電都在向智慧化發展,想通過程式設計在實現自己的一些小創意,真是不要太簡單。

我們正身處一個只要願意思考,就能改變世界的時代。那麼你是願意去改變世界,還是等待被世界改變呢?

相關文章