編程的未來
最近在看一本書,加來道雄(Michio Kaku)的《物理學的未來》,第一、第二章是程序員更加關心的,對於下一個100年計算機和人工智能未來的預測。想想計算機發展短暫的曆史,這些發生了的翻天覆地的變化,似乎都在彈指一揮間。誰的大膽預測可以那麼準確?無論如何,書中對其這樣幾個猜想令我記憶深刻:
- 因特網眼鏡和隱形鏡片
- 無人駕駛汽車
- 摩爾定律結束
- 通用翻譯器
- 全息攝影和三維影像
- 意識識別
- 有意識情感的機器人
- 模擬大腦
這是物理學家眼中的世界(另外推薦他的另一本書《平行宇宙》),激動人心;另一方麵,我回想起小時候無比癡迷的機器貓,小小四維空間袋,寄托了孩子多少純真的夢想,有多少神奇的道具已經成為現實……
但是程序員要說的看法,尤其在自己熟知的領域,我們不談語言的發展和趨勢,這些留給專家去做吧——不妨把目光放長遠一點,100年後的程序員,他們都在做怎樣的事情?100年後的編程,會是怎樣的一種勞動?
人人都會編程
微博上,有朋友對於HTML5實現的web操作係統評論道“斷網就是廢物一個”,但是他並沒有意識到,很快網絡就將如同現在的水、電這樣一樣,是人正常生活不可缺少的基礎設施。
類似的,編程,也將是未來人們日常生活的必備技能,如同寫字、閱讀一樣。編程並不非得指寫那些非程序員看不懂的奇形怪狀的代碼。你把衣服放到洗衣機裏,設定好水量中等,浸泡20分鍾,洗滌20分鍾,漂洗3次共15分鍾,再甩幹3分鍾——這,就是編程,你做的僅僅是按幾個按鍵,把這幾項工作組合起來。
再如ifttt這樣的網站,你都可以實現編程的分支功能了——如果明天天晴的話,就發給你一條短信,去爬山。完成這樣的功能,你根本不需要是程序員,你隻要會操作電腦,會上網就可以了。
互聯網的資源,將被得到更好地組織和獲取,以YQL(Yahoo! Query Language)為例,你可以體會到這一點:
- select * from html
- where url='https://www.dangdang.com/'
- and xpath='//ul[@]/li/p[@]/a'
它做了這樣一件事:從當當網的頁麵去獲取數據,而數據的路徑通過XPath表達式給出。如此一來,你可以感受到,整個互聯網就變成了一個超級大型的數據庫。當然,這樣的語法還是不夠簡單,希望能看到類似ifttt的應用出現,目的卻是讓不會編程的人也可以輕鬆從互聯網這個大型數據庫中查詢自己需要的東西。
另外,未來需要普通人掌握的編程技能也不盡相同,就如同現在年輕人和老人的閱讀技能大不相同一樣。但是可以確定的是,生活中會充滿編程的行為,讓機器替代自己做更多的事。
所見即所得
好吧,在這裏我談這個話題也和我的啟蒙編程語言是VB有關。你也許和我一樣,談到所見即所得的時候,想到很多編程語言、IDE,甚至包括 FCKeditor這樣的富文本編輯組件。Google已經做了這樣的嚐試,App Inventor就是這樣的東西,它是為手機端準備的編程軟件,你可以看看這樣的宣傳視頻:
上麵這則視頻似乎隻是針對非專業程序員的傻瓜式工具,那麼再來看看這個在網上已經廣為流傳的Bret Victor的神一般的演講,題為《Inventing on Principle》,第一次看的時候,你一定會像我一樣驚訝地合不攏嘴:
所見即所得使得編程的過程更貼近人最自然的思維,而一張豐富畫麵所傳遞的內容遠遠大過枯燥的代碼行語義和數值。
編程範型的進化
相較於硬件的摩爾定律,軟件的發展似乎真的是“太慢了”,相較於硬件淘汰的速率,幾十年曆史的編程語言卻可以長盛不衰地存活下去。好在軟件的發展也是有驅動力的,軟件的複雜性就是直接驅動力之一。想想現在做一個普通網站的代價,和十五年前比較,我們能省做多少功。
很多時候程序員會覺得,算法還是不容易轉變成代碼,即便是簡單的算法,思路簡單的紙上實現,變成代碼卻比較冗長。我覺得大部分情況下這不是你編碼技巧的問題,而是編程語言的問題——換句話說,如果你使用一種合適範型的編程語言,興許就可以輕鬆解決這個問題——即便這樣的語言並不一定好找,並不一定容易設計。
我們都知道從過程式編程到麵向對象編程的進化,可是如今常用的編程範型已經遠遠超出這兩者了,例如聲明式編程、麵向方麵編程、基於規則的編程等等,我們的固有思維模式一次有一次遭到挑戰。
以Prolog語言為例,它是由事實和規則組成的,我們先告知程序這些已知的事實和規則,再去詢問程序一個需要推斷的問題,讓它給出推斷的結果。比如:
- love(you, dog).
- love(he, dog).
- love(she, cat).
- friend(PA, PB) :- \+(PA=PB), love(PA,Animal), love(PB,Animal).
我來解釋一下:
- 給定了三個事實:你愛狗,他愛狗,她愛貓;
- 給定一條規則:對於人物A(PA)和人物B(PB),如果人物A和人物B不是同一個人(“\+”表示取反),人物A愛動物Animal,並且人物B也愛同一種動物Animal,那麼人物A和人物B就是朋友(friend)。
好,現在來詢問程序一個問題:
- | ?- friend(you, he).
你和他是朋友嗎?程序判斷你愛狗,他也愛狗,就給出結論:
- yes
這隻是基於規則的編程範型的一個例子,不同範型的語言適用於解決特定的問題。我們在未來能看到更多範型的語言,目的就是讓對特定問題的表述和解決更見簡單和易於理解。
創造性的工作在哪
既然編程會成為一件幾乎人人都能夠做的事情,那麼程序員,你的價值在哪?
好,先來看看為什麼越來越多的人可以編程呢?因為編程的門檻更低了。即便是現在,編程的門檻已經比二十年前低得多了:不明白網絡協議?好,已經有現成的類庫可以使用;不懂平台差異?好,你隻需要在無差別的虛擬機上寫程序;不理解內存管理?好,讓程序來自動幫你完成這件事情……
所以,如果你還在為了解語言的不良設計、曆史原因等等遺留下來的陷阱,或者為知道某個提高語言表達的語法糖而沾沾自喜的時候,你想過沒有,這樣的優勢很可能太不值錢了。
程序員最有價值的部分不應在“翻譯”上,即不應在將思考的結果翻譯到代碼這一層麵上。編程的未來一定是讓編程工作越發貼近人本質的思考,這樣的“翻譯”工作導致的歧義、錯誤、陷阱會越來越少,把清晰的思考變成代碼是一件越來越簡單的工作,以至於某天可以讓能夠讀懂人腦的計算機來完成。
另一方麵,很多公司的老大們卻都不懂程序員,在他們心目中,“程序員”隻是高成本的勞動力,隻會在一台搞不懂的機器上幹一些更搞不懂的事情。
看到這裏,你是不是也發現,程序員本質上應該和音樂家、畫家類似,往往也讓許多人無法理解,而且藝術的價值,常常也都來源於思考?
音樂家有了更先進的樂器,畫家有了更豐富的畫筆,情感的抒發都可以更加自由。甚至有一天,拿掉樂器和畫筆這些傳統物理實體,給大腦接上兩根線,思考之後的樂譜和畫冊就誕生在電腦裏了。
可是,即便計算機可以幫助人思考,它卻不能全麵代替人思考,尤其對於藝術的創作。即便到了100年以後,程序員創造性的工作,還是無從替代的。
最後,放開枷鎖去想象吧,100年以後,編程會是什麼樣子,程序員又會是什麼樣子,我期待你的答案。
最後更新:2017-04-03 21:30:13