出走硅谷估值最高數(shù)據(jù)公司的技術(shù)大牛:編程很美好,直到……
Evelyn Shen | 2016-08-11 10:53
【數(shù)據(jù)猿導(dǎo)讀】 發(fā)現(xiàn)編程很好玩,可以用來寫一個簡單的程序,可以給朋友炫耀,自己也體會到了動手的快樂。直到你想深入學(xué)習(xí),才發(fā)現(xiàn)踩了大坑,你開始去學(xué)習(xí)文件系統(tǒng),學(xué)習(xí)內(nèi)存管理,學(xué)習(xí)好的編程習(xí)慣,學(xué)習(xí)數(shù)據(jù)管理和數(shù)據(jù)庫,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),學(xué)習(xí)離散數(shù)學(xué),學(xué)習(xí)編譯器,你才發(fā)現(xiàn)這些東西原來都聯(lián)系在一起...

今天我們的前端工程師告訴我說,postcss的一個小 bug/feature 花了他很多時間才搞清楚。
Postcss 是我們用的一個處理 CSS 的前端框架,和我們目前也在用的webpack可以一起使用。后者負(fù)責(zé)把各種 JavaScript,CSS 以及圖片等資源進行打包,而前者的主要工作就是在此之前把 CSS 代碼進行一遍預(yù)處理。
比如 Webpack 的配置文件里面可能有這么一段:
// webpack.config.js
module.exports = {
// 省略
postcss: [
require('autoprefixer'),
require('precss'),
],
// 省略
};
其中的postcss部分是一個數(shù)組(array),里面的每一個元素都是一個 postcss 的插件。Postcss 自己做的非常模塊化,大部分任務(wù)都交給各式各樣的插件來完成,通過組合不同的插件來實現(xiàn)多種功能?!窪o one thing and do one thing well」,多么 UNIX 的哲學(xué)。
但我們的前端工程師遇到問題是,他之前不知道這個定義的順序是有意義的,還以為只要把所需的功能模塊放上去就好了。我說,其實這個和 UNIX 的 pipe 是一樣的,或者你如果用過gulp也更能清楚這種流式處理(Streamline/Pipeline)系統(tǒng)的工作原理:順序其實非常重要。他總結(jié)說是自己只用過 webpack 的原因。但是我仔細一想,其實這種情形我自己倒是反復(fù)遇到過。
「總會有漏洞的抽象層」
記得本科的時候讀過 Joel Spolsky 的文章The Law of Leaky Abstractions,大體講的是,所有的抽象層都會有漏洞,總會出現(xiàn)一個情況下,你必須繞過抽象層去了解背后的細節(jié)。文中舉了 TCP 作例子,說很多程序都依賴 TCP 協(xié)議,把易錯的 IP 層協(xié)議封裝好,讓你發(fā)送的數(shù)據(jù)總是有序、完整和沒有冗余的。但是總會出現(xiàn)一些情況,比如老鼠咬斷了網(wǎng)線,那時候你還是會觀察到抽象層的破碎(TCP 不再正常工作),不得不處理那些意想不到的情況。
抽象是一個超級強大的工具,事實上有句很有名的話就是說:「計算機科學(xué)里面,沒有什么問題是多加一層抽象不可以解決的」。比如上面 webpack 的配置文件其實就是對流式代碼的一種封裝和抽象。而且抽象其實不只是計算機科學(xué)里面的概念。它是一種人類最最基本的思維工具,可以幫助人腦減少同時要處理的信息量,把不重要的、可重復(fù)的細節(jié)濾掉,而著眼于目前最重要的東西。抽象大部分情況下都是思維的利器,也是每一個程序員必須掌握的本領(lǐng)。
一切都很美好——直到你第一次碰壁。
「編程很簡單」
最近有個好朋友在做零基礎(chǔ)編程培訓(xùn),課程設(shè)計的緊湊但很有含金量:他會教所有學(xué)員在三周時間內(nèi),先學(xué)會用 HTML 搭建一個靜態(tài)網(wǎng)頁,然后學(xué)習(xí)基本的 CSS 知識,用 Twitter Bootstrap 美化頁面,最后學(xué)習(xí) JavaScript 給頁面加上一些動態(tài)的元素。
和許多其他給零基礎(chǔ)的人群做的培訓(xùn)一樣,他希望在很短時間內(nèi)讓大家了解什么是編程,什么是編程思維,也順便學(xué)會如何和程序員同事、朋友溝通共事。我覺得這個目標(biāo)非常的實際和靠譜——當(dāng)然,與之相對應(yīng)的就是許多夸大宣傳的所謂程序員培訓(xùn),希望在短期內(nèi)讓人速成,可以學(xué)會數(shù)據(jù)挖掘,AR/VR,和人機交互等「酷炫」的技能——說到底,最多可以讓你走馬觀花看看而已(雖然這個本身也是好事)。
的確,現(xiàn)在的很多程序語言(比如 Python,JavaScript,Swift)已經(jīng)比以前(比如 C,C++)好學(xué)太多了,不用手動管理內(nèi)存,不用學(xué)習(xí)文件系統(tǒng),甚至可以拖拽式的操作,完成一個基本的「編程」。我個人非常喜歡這些「user friendly」的編程語言,而且無論是 http:// code.org
還是code academy都是非常有價值的存在——因為他們都旨在激發(fā)大家對編程的興趣,而編程幾乎肯定是未來的必備技能(最多是換一種形式罷了,編程思維才是核心);他們無一例外的都要告訴受眾:編程很容易,開始學(xué)習(xí)吧!
但,其實這不是故事的全部: 其實編程很難 ;它一開始比較容易,之后就會變得比較難;但等你熬過去,它又會變得比較容易。而這個過程下來,你會真正的感覺到受益匪淺。而我認(rèn)為,這一切背后的原因,很大一部分就是來自于這個無所不在的、總會有漏洞的抽象層。
比如,我的那個朋友在備課的時候,和我探討過以下幾個問題:
為了保證學(xué)員在最短時間內(nèi)接觸最有意思的東西,編程語言用相對好入手的 JavaScript,因為網(wǎng)頁編程是最「所見即所得」的編程方法。但是每個人用的瀏覽器可能不同,所以最好用 Twitter Bootstrap 這樣的 CSS 框架,至少整體頁面的 look and feel 不會因為瀏覽器不同而不同——但是,但是,我和你打賭肯定會有人用 IE 6 的,oops!
編程環(huán)境也必須得統(tǒng)一,否則就光去解決每個人的配置問題了(想想幾種不同的換行符,想想文件編碼,想想至少四種不同的 npm 版本)。我提議用Vagrant,讓每個人都用同一個虛擬機鏡像,但是這個方案因為中國的網(wǎng)速最后作罷。(不過好在他最后直接找到了codepen這一個終極的受控的環(huán)境。)
為了讓大家不受網(wǎng)絡(luò)連接的問題影響,需要找到靠譜的代理或者 VPN,否則一些 CDN 可能會受影響,也會出現(xiàn)比如 CSS 無法加載的問題,而如何教會大家使用網(wǎng)絡(luò)工具本身又是一個挑戰(zhàn)。
你看,雖然已經(jīng)是一個及其簡化的配置(所見即所得,不需要編譯),一個極其容錯的編程平臺(瀏覽器),也還是到處都是「有漏洞的抽象」。如果一個人因此認(rèn)為自己掌握了前端編程而信心滿滿的時候,他下次換個機器,換個瀏覽器,甚至哪怕忘記打里面的/的時候,就會感覺到受挫和沮喪。
什么時候變得容易?
在過去的編程經(jīng)歷里,我自己也無數(shù)次遇到過這樣的「有漏洞的抽象」,而以往的經(jīng)歷往往是這樣的:
發(fā)現(xiàn)一個很好的框架/抽象/編程語言特性,玩起來發(fā)現(xiàn)很有意思,可以提高效率,做到以前不能或者不容易做的事情。
直到你用它來做一些更重要的事情,用到更重要的項目里面,才發(fā)現(xiàn)原來里面這么多的「坑」,于是你不得不開始研究它背后的原理,讀文檔,搜 StackOverflow 的問題,讀源代碼,用不同的配置方法去調(diào)試,直到你搞清楚了它的原理,它究竟解決什么問題,解決這個問題的思路是什么,具體做法是什么。
這個時候再回過頭來看,原來它這層抽象是有這么一個意義,而且比它取而代之的之前方法更簡潔、高效,只是唯一的弊端是你之前踩過的那些坑,并且你知道了如何避免,甚至改進它。
從這個角度看,其實學(xué)習(xí)編程的過程也許也可以類比:
發(fā)現(xiàn)編程很好玩,可以用來寫一個簡單的程序,可以給朋友炫耀,自己也體會到了動手的快樂。
直到你想深入學(xué)習(xí),才發(fā)現(xiàn)踩了大坑,你開始去學(xué)習(xí)文件系統(tǒng),學(xué)習(xí)內(nèi)存管理,學(xué)習(xí)好的編程習(xí)慣,學(xué)習(xí)數(shù)據(jù)管理和數(shù)據(jù)庫,學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),學(xué)習(xí)離散數(shù)學(xué),學(xué)習(xí)編譯器,你才發(fā)現(xiàn)這些東西原來都聯(lián)系在一起,才發(fā)現(xiàn)那個「找不到對象」的錯誤提示背后指的是數(shù)據(jù)庫沒有啟動,而不是一個悲傷的故事。
這個時候再回過頭來看,原來編程和編程思維是這樣的,和想象中有那么多的不一樣。原來 DeepMind 下圍棋贏了人類和強人工智能的到來之間沒有那么強的因果關(guān)系,也不再會被新聞媒體隨隨便便的忽悠了;最關(guān)鍵的,是你掌握了一整套分析和解決問題的思維框架。
不難發(fā)現(xiàn)以上都是2.最長,這也的確是最漫長的一個過程,甚至還意味著很多次在 123 之間的反復(fù)循環(huán)。
但是結(jié)論也許也是這樣的: 一切都很美好——直到你第一次碰壁,然后你摸索著沿著墻壁走,逐漸的,找到了門。
來源:論碼農(nóng)的自我修養(yǎng)
刷新相關(guān)文章
我要評論
活動推薦more >
- 2018 上海國際大數(shù)據(jù)產(chǎn)業(yè)高2018-12-03
- 2018上海國際計算機網(wǎng)絡(luò)及信2018-12-03
- 中國國際信息通信展覽會將于2018-09-26
- 第五屆FEA消費金融國際峰會62018-06-21
- 第五屆FEA消費金融國際峰會2018-06-21
- “無界區(qū)塊鏈技術(shù)峰會2018”2018-06-14
不容錯過的資訊
-
1#后疫情時代的新思考#疫情之下,關(guān)于醫(yī)
-
2數(shù)據(jù)軟件產(chǎn)品和服務(wù)商DataHunter完成B輪
-
3眾盟科技獲ADMIC 2020金粲獎“年度汽車
-
4數(shù)據(jù)智能 無限未來—2020世界人工智能大
-
5#2020非凡大賞:數(shù)字化風(fēng)起云涌時,共尋
-
6#榜樣的力量#天璣數(shù)據(jù)大腦疫情風(fēng)險感知
-
7#榜樣的力量#內(nèi)蒙古自治區(qū)互聯(lián)網(wǎng)醫(yī)療服
-
8#榜樣的力量#實時新型肺炎疫情數(shù)據(jù)小程
-
9#榜樣的力量#華佗疫情防控平臺丨數(shù)據(jù)猿
-
10#后疫情時代的新思考#構(gòu)建工業(yè)互聯(lián)網(wǎng)新