最近人品爆發(fā),圖靈社區(qū),InfoQ,51CTO相繼對(duì)我做了采訪,前兩天我把InfoQ對(duì)我的采訪張貼了出來(lái),今天,圖靈社區(qū)和51CTO對(duì)我的采訪發(fā)布了(圖靈的訪談 ,51CTO的訪談),我是一個(gè)有技術(shù)焦慮癥的人,我的經(jīng)歷比較特殊,對(duì)大家來(lái)說(shuō)可能也沒(méi)有什么意思,這兩個(gè)采都有一些重疊的部分,不過(guò)有些觀點(diǎn)我想再加強(qiáng)一些,并放在這里和大家一起分享一下。
遇到新技術(shù)我會(huì)去了解,但不會(huì)把很大的精力放在這些技術(shù)(如:NoSQL,Node.js,等)。這些技術(shù)尚不成熟,只需要跟得住就可以了。技術(shù)十年以上可能是一個(gè)門檻。有人說(shuō)技術(shù)更新?lián)Q代很快,我一點(diǎn)兒都不覺(jué)得是這樣想。雖然有不成熟的技術(shù)不斷地涌出,但是成熟的技術(shù),比如Unix,40多年,C,40多年,C++,30多年,TCP/IP,20多年,Java也有將近20年了……,所以,如果你著眼成熟的技術(shù),其實(shí)并不多。
我的觀點(diǎn)是——要了解技術(shù)就一定需要了解整個(gè)計(jì)算機(jī)的技術(shù)歷史發(fā)展和進(jìn)化路線。(這個(gè)觀點(diǎn),我在《程序員練級(jí)攻略》和《C++的坑多嗎?》中提到過(guò)多次了。)因?yàn)椋?strong>你要朝著球運(yùn)動(dòng)的軌跡去,而不是朝著球的位置去,要知道球的運(yùn)動(dòng)軌跡,你就需要知道它歷史上是怎么跑的。
如果要捋一個(gè)技術(shù)的脈絡(luò),70年代Unix的出現(xiàn),是軟件發(fā)展方面的一個(gè)里程碑,那個(gè)時(shí)期的C語(yǔ)言,也是語(yǔ)言方面的里程碑。(當(dāng)時(shí))所有的項(xiàng)目都在Unix/C上,全世界人都在用這兩樣?xùn)|西寫軟件。Linux跟隨的是Unix, Windows下的開(kāi)發(fā)也是 C/C++。這時(shí)候出現(xiàn)的C++很自然就被大家接受了,企業(yè)級(jí)的系統(tǒng)很自然就會(huì)遷移到這上面,C++雖然接過(guò)了C的接力棒,但是它的問(wèn)題是它沒(méi)有一個(gè)企業(yè)方面的架構(gòu),而且太隨意了,否則也不會(huì)有今天的Java。C++和C非常接近,它只不過(guò)是C的一個(gè)擴(kuò)展,長(zhǎng)年沒(méi)有一個(gè)企業(yè)架構(gòu)的框架。而Java在被發(fā)明后,被IBM把企業(yè)架構(gòu)這部分的需求接了過(guò)來(lái),J2EE的出現(xiàn)讓C/C++捉襟見(jiàn)肘了,在語(yǔ)言進(jìn)化上,還有Python/Ruby,后面還有了.NET,但可惜的是這只局限在Windows平臺(tái)上。這些就是企業(yè)級(jí)軟件方面語(yǔ)言層面就是C -> C++ -> Java這條主干,操作系統(tǒng)是Unix -> Linux/Windows這條主干,軟件開(kāi)發(fā)中需要了解的網(wǎng)絡(luò)知識(shí)就是Ethernet -> IP -> TCP/UDP 這條主干。另外一條脈絡(luò)就是互聯(lián)網(wǎng)方面的(HTML/CSS/JS/LAMP…)。我是一個(gè)有技術(shù)憂慮癥的人,這幾條軟件開(kāi)發(fā)的主線一定不能放棄。
另外,從架構(gòu)上來(lái)說(shuō),我們可以看到,
另外,我聽(tīng)到有很多人說(shuō),一些技術(shù)不適用,一些技術(shù)太學(xué)院派,但對(duì)我來(lái)說(shuō),無(wú)論是應(yīng)用還是學(xué)術(shù),我都會(huì)看,知識(shí)不愁多。何必搞應(yīng)用的和搞學(xué)術(shù)的分開(kāi)陣營(yíng),都是知識(shí),學(xué)就好了。
技術(shù)的發(fā)展要根植于歷史,而不是未來(lái)。不要和我描述這個(gè)技術(shù)的未來(lái)會(huì)多么美好(InfoQ 的 ArchSummit大會(huì)上有一個(gè)微軟來(lái)的人把Node.js說(shuō)得跟仙女一樣,然后給了一個(gè)Hello World),我承認(rèn)你用一些新的技術(shù)可以實(shí)現(xiàn)很多花哨的東西。但是,我認(rèn)為技術(shù)都是承前的,只有承前的才會(huì)常青。所以說(shuō)“某某(技術(shù))要火”這樣的話是沒(méi)有意義的,等它火了、應(yīng)用多了,規(guī)模大了,再說(shuō)。有些人說(shuō):“不學(xué)C/C++也是沒(méi)有問(wèn)題的”,我對(duì)此的回應(yīng)是:如果連技術(shù)主干都可以不學(xué)的話,還有什么其他的好學(xué)呢?這些是計(jì)算機(jī)發(fā)展的根、脈絡(luò)、祖師爺,這樣的東西怎么可以不學(xué)呢?
另外,我們要去了解整個(gè)計(jì)算機(jī)文化,我覺(jué)得計(jì)算機(jī)文化源起于Unix/C這條線上(注意,我說(shuō)的是文化不是技術(shù))。我也寫過(guò)很多與Unix文化相關(guān)的文章,大家可以看看我寫的“Unix傳奇(尤其是下篇)”。
學(xué)校教的大部分都是知識(shí)密集型的技術(shù),但是社會(huì)上的企業(yè)大部分都是勞動(dòng)密集型的。什么是勞動(dòng)密集型的企業(yè)呢?麥當(dāng)勞炸薯?xiàng)l就是勞動(dòng)密集型的工作,用不到學(xué)校教授的那些知識(shí)。如果有一天你不炸薯?xiàng)l了,而要去做更大更專業(yè)的東西,學(xué)校里的知識(shí)就會(huì)派上用場(chǎng)。有人說(shuō)一個(gè)語(yǔ)言、一個(gè)技術(shù),能解決問(wèn)題能用就行了,我不這樣認(rèn)為。我覺(jué)得你應(yīng)該至少要知道這些演變和進(jìn)化的過(guò)程。而如果你要解決一些業(yè)務(wù)和技術(shù)難題,就需要抓住某種技術(shù)很深入地學(xué)習(xí),當(dāng)成藝術(shù)一樣來(lái)學(xué)習(xí)。
我在“軟件開(kāi)發(fā)‘三重門’”里說(shuō)過(guò),第一重門是業(yè)務(wù)功能,在這重門里,的確是會(huì)編程就可以了;第二重門是業(yè)務(wù)性能,在這一重門里,技術(shù)的基礎(chǔ)就很管用了,比如:操作系統(tǒng)的文件管理,進(jìn)程調(diào)度,內(nèi)存管理,網(wǎng)絡(luò)的七層模型,TCP/UCPUDP的協(xié)議,語(yǔ)言用法、編譯和類庫(kù)的實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu),算法等等就非常關(guān)鍵了;第三重門是業(yè)務(wù)智能,在這一重門里,你會(huì)發(fā)現(xiàn)很多東西都很學(xué)院派了,比如,搜索算法,推薦算法,預(yù)測(cè),統(tǒng)計(jì),機(jī)器學(xué)習(xí),圖像識(shí)別,分布式架構(gòu)和算法,等等,你需要讀很多計(jì)算機(jī)學(xué)院派的論文。
總之,這主要看你職業(yè)生涯的背景了,如果你整天被當(dāng)作勞動(dòng)力來(lái)使用,你用到的技術(shù)就比較淺,比較實(shí)用,但是如果你做一些知識(shí)密集型的工作,你就需要用心來(lái)搞搞研究,就會(huì)發(fā)現(xiàn)你需要理論上的知識(shí)。比如說(shuō),我之前做過(guò)的跨國(guó)庫(kù)存調(diào)配,需要知道最短路徑的算法,而我現(xiàn)在在亞馬遜做的庫(kù)存預(yù)測(cè)系統(tǒng),數(shù)據(jù)挖掘的那些東西都需要很強(qiáng)的數(shù)學(xué)建模、算法、數(shù)據(jù)挖掘的功底。
我覺(jué)得真正的高手都來(lái)自知識(shí)密集型的學(xué)院派。他們更強(qiáng)的是,可以把那些理論的基礎(chǔ)知識(shí)應(yīng)用到現(xiàn)在的業(yè)務(wù)上來(lái)。但很可惜,我們國(guó)內(nèi)今天的教育并沒(méi)有很好地把那些學(xué)院派的理論知識(shí)和現(xiàn)實(shí)的業(yè)務(wù)問(wèn)題很好地接合起來(lái)。比如說(shuō)一些哈希表或二叉樹(shù)的數(shù)據(jù)結(jié)構(gòu),如果我們的學(xué)校在講述這些知識(shí)的時(shí)候能夠接合實(shí)際的業(yè)務(wù)問(wèn)題,效果會(huì)非常不錯(cuò),如:設(shè)計(jì)一個(gè)IP地址和地理位置的查詢系統(tǒng),設(shè)計(jì)一個(gè)分布式的NoSQL的數(shù)據(jù)庫(kù),或是設(shè)計(jì)一個(gè)地理位置的檢索應(yīng)用等等。在學(xué)習(xí)操作系統(tǒng)的時(shí)候,如果老師可以帶學(xué)生做一個(gè)手機(jī)或嵌入式操作系統(tǒng),或是研究一下Unix System V或是Linux的源碼的話,會(huì)更有意思。在學(xué)習(xí)網(wǎng)絡(luò)知識(shí)的時(shí)候,能帶學(xué)生重點(diǎn)學(xué)一下以太網(wǎng)和TCP/IP的特性,并調(diào)優(yōu),如果能做一個(gè)網(wǎng)絡(luò)上的pub/sub的消息系統(tǒng)或是做一個(gè)像Nginx一樣的web server,那會(huì)更好。如果在學(xué)圖形學(xué)的過(guò)程中能帶領(lǐng)學(xué)生實(shí)踐一個(gè)作圖工具或是一個(gè)游戲引擎,那會(huì)更有意思。
總之,我們的教育和現(xiàn)實(shí)脫節(jié)太嚴(yán)重了,教的東西無(wú)論是在技術(shù)還是在實(shí)踐上都嚴(yán)重落后和脫節(jié),沒(méi)有通過(guò)實(shí)際的業(yè)務(wù)或技術(shù)問(wèn)題來(lái)教學(xué)生那些理論知識(shí),這是一個(gè)失敗。
我覺(jué)得倒不是。做一個(gè)軟件開(kāi)發(fā)者更簡(jiǎn)單了。因?yàn)楝F(xiàn)在互聯(lián)網(wǎng)很發(fā)達(dá),你可以找到很多共享的知識(shí)——相對(duì)于我那個(gè)時(shí)候。第一,知識(shí)你容易查到,然后社區(qū)很多,文章、分享的人也越來(lái)越多。我們那個(gè)時(shí)候沒(méi)有的。上網(wǎng)一查,什么都沒(méi)有。都得去自己琢磨,自己去調(diào)查。所以我覺(jué)得相比我們那個(gè)時(shí)候更容易了。第二,工具變多了?,F(xiàn)在的工具比那個(gè)時(shí)候好用多了。我們那個(gè)時(shí)候就是一天到晚在vi里面,連個(gè)自動(dòng)提示都沒(méi)有,連個(gè)版本庫(kù)管理都沒(méi)有。不光工具變多,框架也多了,各種各樣的編程框架。我們那時(shí)候都是生寫。寫JavaScript,生寫,連個(gè)jQuery都沒(méi)有。沒(méi)有這些輔助性的、讓你提高生產(chǎn)力的東西。J2EE那時(shí)候也沒(méi)有。而且整個(gè)(開(kāi)發(fā)環(huán)境)都很不成熟。一個(gè)服務(wù)器的最高配置就1GB的情況下,一個(gè)WebSphere起來(lái)就占了900多MB——這還能跑什么應(yīng)用?所以只能去用最基礎(chǔ)的系統(tǒng)。所以我覺(jué)得現(xiàn)在,無(wú)論是環(huán)境,還是開(kāi)發(fā)的過(guò)程,都更規(guī)范了。以前我做開(kāi)發(fā)的時(shí)候就是,什么都不懂就上了,瞎搞,沒(méi)有什么開(kāi)發(fā)規(guī)范,沒(méi)有人理你,反正你搞得好就搞好,搞不好就搞不好了,全靠自己,包括做測(cè)試維護(hù)等等。我覺(jué)得現(xiàn)在的軟件開(kāi)發(fā)就很好,你一上去,就有好的工具,有好的知識(shí)庫(kù),有好的社區(qū),有好的開(kāi)發(fā)框架,還有好的流程,方法,甚至還有人幫你做測(cè)試,還有人告訴你應(yīng)該怎么做。幸福得很?,F(xiàn)在好多人還說(shuō)這個(gè)不好那個(gè)不好,開(kāi)發(fā)難什么的。其實(shí)容易多了。
但是,有個(gè)東西我覺(jué)得是現(xiàn)在的軟件開(kāi)發(fā)者比我們那時(shí)候變得更難的。就是,你享福了以后,人就變懶,變嬌氣了。對(duì)很多東西的抱怨就開(kāi)始多了。我們那個(gè)時(shí)候哪有什么好抱怨的?沒(méi)啥好抱怨的,有活就干,有東西學(xué)就趕快學(xué)。現(xiàn)在呢,學(xué)個(gè)什么東西還挑挑揀揀的,抱怨這個(gè)語(yǔ)言太扯,那個(gè)IDE不好,這個(gè)框架太差,版本管理工具太扯,等等。這就好像以前我沒(méi)東西吃,只有個(gè)糠吃,要是有面包有饅頭,我就覺(jué)得非常非常好了?,F(xiàn)在是,好吃的東西多了我們還學(xué)會(huì)挑食了,這也不好用,那也不好用。
根本就不是技術(shù)變難了,環(huán)境變差了,是程序員變嬌氣了。所以軟件開(kāi)發(fā)變難,歸根結(jié)底還是程序員們自己變嬌氣了。
中國(guó)人中庸的思想,入世和出世,每天的工作就是入世。舉個(gè)例子,我十年前在上海的時(shí)候,給交通銀行做項(xiàng)目的時(shí)候,每周休息一天,早九點(diǎn)到晚十點(diǎn),每天工作12個(gè)小時(shí),這樣的工作持續(xù)了一整年,沒(méi)有節(jié)假日,項(xiàng)目上的技術(shù)也沒(méi)什么意思。當(dāng)時(shí)我晚上十點(diǎn)回到住處,還想學(xué)一些C++/Java和Unix/Windows的技術(shù),于是就看書(shū)到晚上11:30,每天如此,一年下來(lái)學(xué)到很多東西,時(shí)間沒(méi)有荒廢,心里就很開(kāi)心。我覺(jué)得當(dāng)時(shí)是快樂(lè)的,因?yàn)橛谐砷L(zhǎng)的感覺(jué)是快樂(lè)的。
現(xiàn)在的我,工作、寫博客、養(yǎng)孩子,事情其實(shí)更多。我早上7:30起床,會(huì)瀏覽一下國(guó)外的新聞,hacker news, tech church, reddit, highavailability之類的站點(diǎn),9點(diǎn)上班。晚上6、7點(diǎn)鐘下班,開(kāi)始帶孩子。十點(diǎn)鐘孩子睡了覺(jué),我會(huì)開(kāi)始重新細(xì)讀一下這一天都發(fā)生了些什么事情。這個(gè)時(shí)間也有可能會(huì)用來(lái)看書(shū)。學(xué)習(xí)的過(guò)程(我)是不喜歡被打斷的,所以從十點(diǎn)到十二點(diǎn),家人都睡了,這正是我連續(xù)學(xué)習(xí)的好時(shí)間??赡軓耐砩?1:30開(kāi)始,我會(huì)做點(diǎn)筆記或者寫博客。我現(xiàn)在對(duì)酷殼文章的質(zhì)量要求比較高一些,所以大概積累一個(gè)星期的時(shí)間才可以生成一篇文章。每天我大概都在一兩點(diǎn)鐘才會(huì)睡覺(jué)。沒(méi)辦法,我有技術(shù)焦慮癥。但是覺(jué)得這樣的生活很充實(shí),也很踏實(shí)。
另外,任何一門技術(shù)玩深了,都是很有意思的。有些人形成了一個(gè)價(jià)值取向,“我只做什么,絕不做什么”。前段時(shí)間有一個(gè)剛來(lái)亞馬遜的工程師,他原來(lái)做的是數(shù)據(jù)挖掘推薦系統(tǒng),原來(lái)的公司重組要讓他做前端,他不肯就離職了,他說(shuō)他不想做前端。我覺(jué)得,前端后端都是編程,Javascript是編程,C++也是編程。編程不在于你用什么語(yǔ)言去coding,而是你組織程序、設(shè)計(jì)軟件的能力,只要你上升到腦力勞動(dòng)上來(lái),用什么都一樣,技術(shù)無(wú)貴賤。你可以不喜歡那個(gè)技術(shù),但是還是要了解了解,也沒(méi)有必要完全不用,完全拋棄。Javascript啊——只要能被Javascript實(shí)現(xiàn)的,未來(lái)總有一天會(huì)被Javascript所取代。
回到問(wèn)題,怎么才能享受到快樂(lè)呢?
總之一句話——如果你沒(méi)有興趣,什么都是借口,如果你有興趣了,什么都是好玩的。
聯(lián)系客服