軟件行業的技術更新換代比較快,從事軟件相關工作的人要時刻關注新技術的誕生和發展,以求緊跟技術潮流。那么究竟我們應該怎樣對待這種現狀呢?本文給出了一些見解。

       對于日新月異的新技術,你是什么態度?

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

       我的觀點是——要了解技術就一定需要了解整個計算機的技術歷史發展和進化路線。因為,你要朝著球運動的軌跡去,而不是朝著球的位置去,要知道球的運動軌跡,你就需要知道它歷史上是怎么跑的。

       如果要捋一個技術的脈絡,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這條線上(注意,我說的是文化不是技術)。

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

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

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

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

       我覺得真正的高手都來自知識密集型的學院派。他們更強的是,可以把那些理論的基礎知識應用到現在的業務上來。但很可惜,我們國內今天的教育并沒有很好地把那些學院派的理論知識和現實的業務問題很好地接合起來。比如說一些哈希表或二叉樹的數據結構,如果我們的學校在講述這些知識的時候能夠接合實際的業務問題,效果會非常不錯,如:設計一個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所取代。

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

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

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

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

本文轉自:http://coolshell.cn/articles/8088.html

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.cpbsu.com/software/227.html
2012年8月25日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:9