為什么你該開始學習編程了?
有一家飯店的大廚,燒得一手好菜,經過口碑相傳,客人從五湖四海聞名而來。然而這對飯店的老板來說,并不單純是一個好消息。因為客人不是奔著飯店,而是奔著大廚的手藝來的。老板必須想辦法留住這位大廚,否則他一旦被別人挖走,飯店的生意就會一落千丈了。然而即便老板不惜血本保證了大廚的忠誠度,風險也依然存在:
大廚休息或請假的時候,菜品的口味就無法讓顧客滿意;
大廚只有一個,如果想在多個地方開分店,那口味也就不能保證了;
大廚再厲害,同時也只能炒一個菜,而顧客越來越多,輸出總是供不應求;
大廚年紀大了總是要退休的,如果收徒的話,怎么繼續保證徒弟的忠誠度呢?
有一天,老板突然悟到,決定菜品口味的是大廚燒菜的過程,而不是大廚本人。如果大廚愿意把自己每個菜的菜譜都寫出來,那不就可以請別的廚師來操作了嗎?雖然別人按照菜譜燒出來可能達不到原味的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通過社交網絡可能瞬間火遍全國……有了樹莓派這樣超便宜的卡片電腦,再加上現在各種家電都在向智能化發展,想通過編程在實現自己的一些小創意,真是不要太簡單。
我們正身處一個只要愿意思考,就能改變世界的時代。那么你是愿意去改變世界,還是等待被世界改變呢?