對待技術的態度

轉載於酷殼coolshell.cn


最近人品爆發,圖靈社區,InfoQ,51CTO相繼對我做了採訪,前兩天我把InfoQ對我的採訪張貼了出來,今天,圖靈社區和51CTO對我的採訪發佈了(圖靈的訪談51CTO的訪談),我是一個有技術焦慮症的人,我的經歷比較特殊,對大家來說可能也沒有什麼意思,這兩個採都有一些重疊的部分,不過有些觀點我想再加強一些,並放在這裏和大家一起分享一下。

對於日新月異的新技術,你是什麼態度?

遇到新技術我會去了解,但不會把很大的精力放在這些技術(如:NoSQL,Node.js,等)。這些技術尚不成熟,只需要跟得住就可以了。技術十年以上可能是一個門檻。有人說技術更新換代很快,我一點兒都不覺得是這樣想。雖然有不成熟的技術不斷地涌出,但是成熟的技術,比如Unix,40多年,C,40多年,C++,30多年,TCP/IP,20多年,Java也有將近20年了……,所以,如果你着眼成熟的技術,其實並不多。

我的觀點是——要了解技術就一定需要了解整個計算機的技術歷史發展和進化路線。(這個觀點,我在《程序員練級攻略》和《C++的坑多嗎?》中提到過多次了。)因爲,你要朝着球運動的軌跡去,而不是朝着球的位置去,要知道球的運動軌跡,你就需要知道它歷史上是怎麼跑的

如果要捋一個技術的脈絡,70年代Unix的出現,是軟件發展方面的一個里程碑,那個時期的C語言,也是語言方面的里程碑。(當時)所有的項目都在Unix/C上,全世界人都在用這兩樣東西寫軟件。Linux跟隨的是Unix, Windows下的開發也是 C/C++。這時候出現的C++很自然就被大家接受了,企業級的系統很自然就會遷移到這上面,C++雖然接過了C的接力棒,但是它的問題是它沒有一個企業方面的架構,而且太隨意了,否則也不會有今天的Java。C++和C非常接近,它只不過是C的一個擴展,長年沒有一個企業架構的框架。而Java在被髮明後,被IBM把企業架構這部分的需求接了過來,J2EE的出現讓C/C++捉襟見肘了,在語言進化上,還有Python/Ruby,後面還有了.NET,但可惜的是這隻侷限在Windows平臺上。這些就是企業級軟件方面語言層面就是C -> C++ -> Java這條主幹,操作系統是Unix -> Linux/Windows這條主幹,軟件開發中需要了解的網絡知識就是Ethernet -> IP -> TCP/UDP 這條主幹。另外一條脈絡就是互聯網方面的(HTML/CSS/JS/LAMP…)。我是一個有技術憂慮症的人,這幾條軟件開發的主線一定不能放棄。

另外,從架構上來說,我們可以看到,

  • 從單機的年代,到C/S架構(界面,業務邏輯,數據SQL都在Client上,只有數據庫服庫在S上)

  • 再到B/S結構(用瀏覽器來充當Client,但是傳統的ASP/PHP/JSP/Perl/CGI這樣的編程也都把界面,業務邏輯,和SQL都放在一起),但是B/S已經把這些東西放到了Web Server上,

  • 再到後來的中間件,把業務邏輯再抽出一層,放到一個叫App Server上,經典的三層結構。

  • 然後再到分佈式結構,業務層分佈式,數據層分佈式。

  • 再到今天的雲架構——全部移到服務器。

我們可以看到技術的變遷都一直再把東西往後端移,前端只剩一個瀏覽器或是一個手機。通過這個你可以看到整個技術發展的趨勢。所以,如果你瞭解了這些變遷,瞭解了這些變遷過程“不斷填坑”的過程,你將會對技術有很強的把握。

另外,我聽到有很多人說,一些技術不適用,一些技術太學院派,但對我來說,無論是應用還是學術,我都會看,知識不愁多。何必搞應用的和搞學術的分開陣營,都是知識,學就好了。

技術的發展要根植於歷史,而不是未來。不要和我描述這個技術的未來會多麼美好(InfoQ 的 ArchSummit大會上有一個微軟來的人把Node.js說得跟仙女一樣,然後給了一個Hello World),我承認你用一些新的技術可以實現很多花哨的東西。但是,我認爲技術都是承前的,只有承前的纔會常青。所以說“某某(技術)要火”這樣的話是沒有意義的,等它火了、應用多了,規模大了,再說。有些人說:“不學C/C++也是沒有問題的”,我對此的迴應是:如果連技術主幹都可以不學的話,還有什麼其他的好學呢?這些是計算機發展的根、脈絡、祖師爺,這樣的東西怎麼可以不學呢?

另外,我們要去了解整個計算機文化,我覺得計算機文化源起於Unix/C這條線上(注意,我說的是文化不是技術)。我也寫過很多與Unix文化相關的文章,大家可以看看我寫的“Unix傳奇尤其是下篇)”。

可是在應用環境中,對新技術的需求是很高的,你覺得在教育領域計算機科學的側重應該是什麼樣的?

學校教的大部分都是知識密集型的技術,但是社會上的企業大部分都是勞動密集型的。什麼是勞動密集型的企業呢?麥當勞炸薯條就是勞動密集型的工作,用不到學校教授的那些知識。如果有一天你不炸薯條了,而要去做更大更專業的東西,學校裏的知識就會派上用場。有人說一個語言、一個技術,能解決問題能用就行了,我不這樣認爲。我覺得你應該至少要知道這些演變和進化的過程。而如果你要解決一些業務和技術難題,就需要抓住某種技術很深入地學習,當成藝術一樣來學習。

我在“軟件開發‘三重門’”裏說過,第一重門是業務功能,在這重門裏,的確是會編程就可以了;第二重門是業務性能,在這一重門裏,技術的基礎就很管用了,比如:操作系統的文件管理,進程調度,內存管理,網絡的七層模型,TCP/UCPUDP的協議,語言用法、編譯和類庫的實現,數據結構,算法等等就非常關鍵了;第三重門是業務智能,在這一重門裏,你會發現很多東西都很學院派了,比如,搜索算法,推薦算法,預測,統計,機器學習,圖像識別,分佈式架構和算法,等等,你需要讀很多計算機學院派的論文。

總之,這主要看你職業生涯的背景了,如果你整天被當作勞動力來使用,你用到的技術就比較淺,比較實用,但是如果你做一些知識密集型的工作,你就需要用心來搞搞研究,就會發現你需要理論上的知識。比如說,我之前做過的跨國庫存調配,需要知道最短路徑的算法,而我現在在亞馬遜做的庫存預測系統,數據挖掘的那些東西都需要很強的數學建模、算法、數據挖掘的功底。

我覺得真正的高手都來自知識密集型的學院派。他們更強的是,可以把那些理論的基礎知識應用到現在的業務上來。但很可惜,我們國內今天的教育並沒有很好地把那些學院派的理論知識和現實的業務問題很好地接合起來。比如說一些哈希表或二叉樹的數據結構,如果我們的學校在講述這些知識的時候能夠接合實際的業務問題,效果會非常不錯,如:設計一個IP地址和地理位置的查詢系統,設計一個分佈式的NoSQL的數據庫,或是設計一個地理位置的檢索應用等等。在學習操作系統的時候,如果老師可以帶學生做一個手機或嵌入式操作系統,或是研究一下Unix System V或是Linux的源碼的話,會更有意思。在學習網絡知識的時候,能帶學生重點學一下以太網和TCP/IP的特性,並調優,如果能做一個網絡上的pub/sub的消息系統或是做一個像Nginx一樣的web server,那會更好。如果在學圖形學的過程中能帶領學生實踐一個作圖工具或是一個遊戲引擎,那會更有意思。

總之,我們的教育和現實脫節太嚴重了,教的東西無論是在技術還是在實踐上都嚴重落後和脫節,沒有通過實際的業務或技術問題來教學生那些理論知識,這是一個失敗。

那麼,現在做一個軟件開發者是否更加困難了?

我覺得倒不是。做一個軟件開發者更簡單了。因爲現在互聯網很發達,你可以找到很多共享的知識——相對於我那個時候。第一,知識你容易查到,然後社區很多,文章、分享的人也越來越多。我們那個時候沒有的。上網一查,什麼都沒有。都得去自己琢磨,自己去調查。所以我覺得相比我們那個時候更容易了。第二,工具變多了。現在的工具比那個時候好用多了。我們那個時候就是一天到晚在vi裏面,連個自動提示都沒有,連個版本庫管理都沒有。不光工具變多,框架也多了,各種各樣的編程框架。我們那時候都是生寫。寫JavaScript,生寫,連個jQuery都沒有。沒有這些輔助性的、讓你提高生產力的東西。J2EE那時候也沒有。而且整個(開發環境)都很不成熟。一個服務器的最高配置就1GB的情況下,一個WebSphere起來就佔了900多MB——這還能跑什麼應用?所以只能去用最基礎的系統。所以我覺得現在,無論是環境,還是開發的過程,都更規範了。以前我做開發的時候就是,什麼都不懂就上了,瞎搞,沒有什麼開發規範,沒有人理你,反正你搞得好就搞好,搞不好就搞不好了,全靠自己,包括做測試維護等等。我覺得現在的軟件開發就很好,你一上去,就有好的工具,有好的知識庫,有好的社區,有好的開發框架,還有好的流程,方法,甚至還有人幫你做測試,還有人告訴你應該怎麼做。幸福得很。現在好多人還說這個不好那個不好,開發難什麼的。其實容易多了。

但是,有個東西我覺得是現在的軟件開發者比我們那時候變得更難的。就是,你享福了以後,人就變懶,變嬌氣了。對很多東西的抱怨就開始多了。我們那個時候哪有什麼好抱怨的?沒啥好抱怨的,有活就幹,有東西學就趕快學。現在呢,學個什麼東西還挑挑揀揀的,抱怨這個語言太扯,那個IDE不好,這個框架太差,版本管理工具太扯,等等。這就好像以前我沒東西吃,只有個糠吃,要是有面包有饅頭,我就覺得非常非常好了。現在是,好吃的東西多了我們還學會挑食了,這也不好用,那也不好用

根本就不是技術變難了,環境變差了,是程序員變嬌氣了。所以軟件開發變難,歸根結底還是程序員們自己變嬌氣了。

你如何在進度壓力下,享受技術帶來的快樂?

中國人中庸的思想,入世和出世,每天的工作就是入世。舉個例子,我十年前在上海的時候,給交通銀行做項目的時候,每週休息一天,早九點到晚十點,每天工作12個小時,這樣的工作持續了一整年,沒有節假日,項目上的技術也沒什麼意思。當時我晚上十點回到住處,還想學一些C++/Java和Unix/Windows的技術,於是就看書到晚上11:30,每天如此,一年下來學到很多東西,時間沒有荒廢,心裏就很開心。我覺得當時是快樂的,因爲有成長的感覺是快樂的。

現在的我,工作、寫博客、養孩子,事情其實更多。我早上7:30起牀,會瀏覽一下國外的新聞,hacker news, tech church, reddit, highavailability之類的站點,9點上班。晚上6、7點鐘下班,開始帶孩子。十點鐘孩子睡了覺,我會開始重新細讀一下這一天都發生了些什麼事情。這個時間也有可能會用來看書。學習的過程(我)是不喜歡被打斷的,所以從十點到十二點,家人都睡了,這正是我連續學習的好時間。可能從晚上11:30開始,我會做點筆記或者寫博客。我現在對酷殼文章的質量要求比較高一些,所以大概積累一個星期的時間纔可以生成一篇文章。每天我大概都在一兩點鐘纔會睡覺。沒辦法,我有技術焦慮症。但是覺得這樣的生活很充實,也很踏實。

另外,任何一門技術玩深了,都是很有意思的。有些人形成了一個價值取向,“我只做什麼,絕不做什麼”。前段時間有一個剛來亞馬遜的工程師,他原來做的是數據挖掘推薦系統,原來的公司重組要讓他做前端,他不肯就離職了,他說他不想做前端。我覺得,前端後端都是編程,Javascript是編程,C++也是編程。編程不在於你用什麼語言去coding,而是你組織程序、設計軟件的能力,只要你上升到腦力勞動上來,用什麼都一樣,技術無貴賤。你可以不喜歡那個技術,但是還是要了解了解,也沒有必要完全不用,完全拋棄。Javascript啊——只要能被Javascript實現的,未來總有一天會被Javascript所取代。

回到問題,怎麼才能享受到快樂呢?

  • 第一,入世和出世要分開,不要讓世俗的東西打擾到你的內心世界,你的情緒不應該爲別人所控,也不應該被世俗所污染,活得真實,活得真實你纔會快樂。

  • 第二,就是要有熱情,有了熱情,你的心情就會很好,加班都可以是快樂的,想一想我們整個通宵用來打遊戲的時光,雖然很累,但是你也很開心,這都是因爲有了熱情的緣故。

總之一句話——如果你沒有興趣,什麼都是藉口,如果你有興趣了,什麼都是好玩的

(全文完)


原文請訪問:coolshell.cn


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章