十年經(jīng)歷:軟件開(kāi)發(fā)的“三重門(mén)”
自從上次寫(xiě)了“程序員技術(shù)練級(jí)攻略” 以來(lái),就覺(jué)得似乎還有很多東西沒(méi)有談到,但當(dāng)時(shí)沒(méi)有繼續(xù)思考了。而春節(jié)前有人問(wèn)我,是做底層技術(shù),還是做業(yè)務(wù)。這問(wèn)題讓我思考了很多,不由自主地回顧了一 下我這十多年的軟件開(kāi)發(fā)經(jīng)歷,并順著整理分類(lèi)了一下自己解決過(guò)的若干問(wèn)題,還發(fā)散想了很多,經(jīng)過(guò)了一個(gè)春節(jié)假期的發(fā)酵,產(chǎn)生了下面這篇文章。
前言
這篇文章必然是通過(guò)我的個(gè)人經(jīng)歷來(lái)寫(xiě)的。所以,我先說(shuō)說(shuō)個(gè)人經(jīng)歷吧。我的經(jīng)歷基本分成三個(gè)階段。
***階段:我剛畢業(yè)時(shí)在家鄉(xiāng)的某銀行工作,做些銀行的業(yè)務(wù)系統(tǒng),還搞些網(wǎng)絡(luò),電子郵件系統(tǒng),OA什么的,因?yàn)榇笏牡臅r(shí)候在老師的公司里實(shí)習(xí),銀行里的人際關(guān)系太復(fù)雜, 而且技術(shù)都包給了廠商,所以在銀行的每一天都覺(jué)得不能適應(yīng)里面的工作環(huán)境。兩年后離職,單位分的房也不要了,直接去了上海,在上海呆了兩年,本來(lái)想做互聯(lián)網(wǎng)的,但是泡沫來(lái)了,最終去了一家做系統(tǒng)集成的國(guó)企公司還是繼續(xù)做銀行業(yè)務(wù)。這四年來(lái),主要解決的都是一些業(yè)務(wù)上的問(wèn)題,銀行里的會(huì)計(jì)業(yè)務(wù),OA業(yè)務(wù),國(guó) 際業(yè)務(wù),中間對(duì)公業(yè)務(wù)都非常地復(fù)雜,而且因?yàn)楫?dāng)時(shí)的軟件開(kāi)發(fā)相當(dāng)?shù)牟灰?guī)范,所以基本上是在一種比較混亂的狀態(tài)下度過(guò)的,而銀行方面又很強(qiáng)勢(shì),所以,這段時(shí) 間主要是做業(yè)務(wù)。所以,技術(shù)上主要是積累了如何使用那些技術(shù)。C+/Java, Windows編程,Unix編程,網(wǎng)絡(luò)編程主要是這段時(shí)間學(xué)的,看了太多的書(shū)(我大學(xué)課程里沒(méi)有C++和Java,也沒(méi)有Windows/Unix和網(wǎng)絡(luò)編程,所以,只能拼命地看書(shū)和自學(xué))。
第二階段:然后,我來(lái)了北京,到了一家做分布式計(jì)算系統(tǒng)的公司,整天和一個(gè)高性能技術(shù)高可用性的企業(yè)級(jí)的集群式的軟件產(chǎn)品打交道(這家公司去年被IBM收購(gòu)了),在這家公司把Windows/Unix和網(wǎng)絡(luò)編程有 了更深入的了解,對(duì)我長(zhǎng)進(jìn)比較大的是明白了怎么做一個(gè)性能高,可用性高的集群式的系統(tǒng),天天和底層打交道,干了4年多。然后去了一家金融信息公司,這家金 融公司主要做全球的金融信息數(shù)據(jù)處理,而我主要還是做核心數(shù)據(jù)發(fā)布系統(tǒng)的性能調(diào)優(yōu)的項(xiàng)目,金融數(shù)據(jù)的實(shí)時(shí)性要求的高,數(shù)據(jù)量非常地大,高可用性要求得高, 得想盡一切辦法省網(wǎng)絡(luò)帶寬,增加系統(tǒng)性能,還要保持高的可用性,不當(dāng)機(jī),不丟包。又干了4年多,入職的時(shí)候從國(guó)外接過(guò)來(lái)兩個(gè)系統(tǒng),其性能單機(jī)每秒可處理 120K message,我走的時(shí)候,我和團(tuán)隊(duì)把其優(yōu)化到了每秒1.4M messages 的吞吐,另一個(gè)系統(tǒng),從接手時(shí)的100k message/s優(yōu)化到了500k message/s。這八年多的時(shí)候,全是在和這些高計(jì)算高性能的項(xiàng)目打交量,幾乎沒(méi)有什么業(yè)務(wù),都是純技術(shù),積累到了很多和性能有關(guān)的高并發(fā)高計(jì)算系統(tǒng) 架構(gòu)級(jí)的知識(shí)。
第三階段:兩 年前來(lái)到了現(xiàn)在的做電子商務(wù)的互聯(lián)網(wǎng)公司,還是在做一個(gè)數(shù)據(jù)處理量很大的業(yè)務(wù)系統(tǒng),因?yàn)橐傻氖且央娮由虅?wù)全球化的東西。但是,因?yàn)殡娮由? 務(wù)的特殊性,必需要去兼顧業(yè)務(wù)的特點(diǎn),而且在這家電商公司,耳讀目染了很多有趣的業(yè)務(wù)難題,比如,庫(kù)存計(jì)劃,配送優(yōu)化,等等。雖然很多東西還不明白,但發(fā) 現(xiàn),用技術(shù)來(lái)解決業(yè)務(wù)難題真是太有意思了。
我的這三個(gè)階段,***個(gè)階段花了4年,第二個(gè)階段花了8年,第三階段剛剛開(kāi)始2年不到,有時(shí)候我也去別的公司講課,所以,我很有幸經(jīng)歷了中國(guó)軟件開(kāi)發(fā)的進(jìn)化過(guò)程。我的經(jīng)歷可以說(shuō)是中國(guó)軟件行業(yè)進(jìn)程的一個(gè)縮影,而我把這三個(gè)階段稱(chēng)為——軟件開(kāi)發(fā)的三重門(mén)。它們分別是:
- 業(yè)務(wù)功能 – 粗放地開(kāi)墾
- 業(yè)務(wù)性能 – 擴(kuò)大化生產(chǎn)
- 業(yè)務(wù)智能 – 精耕細(xì)作
之所以加上“業(yè)務(wù)”二字,是因?yàn)槲乙詾橛?jì)算機(jī)是一個(gè)工具,其用來(lái)解決實(shí)際問(wèn)題,所以,什么都離不開(kāi)業(yè)務(wù),就算是性能優(yōu)化也一樣,通過(guò)之前那篇“12306.cn的性能優(yōu)化”中的“業(yè)務(wù)分析”段落,我們可以知道業(yè)務(wù)的不同,系統(tǒng)的難度和解決方法就可以不同。所以,我們總是用技術(shù)在解決業(yè)務(wù)問(wèn)題。業(yè)務(wù)的形態(tài)對(duì)軟件的開(kāi)發(fā)有決定性的作用。
下面讓我具體描述一下。
一重門(mén):業(yè)務(wù)功能
這 是軟件開(kāi)發(fā)的***重門(mén),也就是掌握可以實(shí)現(xiàn)業(yè)務(wù)功能的技術(shù)。通常分成三塊:語(yǔ)言+系統(tǒng)+數(shù)據(jù)處理。在這個(gè)階段,主要是能掌握各種技術(shù),比如:開(kāi)發(fā)用的各種 工具(如:IDE,XUnit,Debugger,等),各種代碼庫(kù)和框架(如:C++的STL,ACE,Boost,等,Java的 Spring,Hibernate等),各種系統(tǒng)知識(shí)(如:Windows API,Unix/Linux API,TCP/IP,Socket,多線程多進(jìn)程間的同步、互斥,并發(fā)安全,還包括Web平臺(tái),移動(dòng)平臺(tái),等等),還需要掌握數(shù)據(jù)處理的知識(shí)(如:數(shù)據(jù) 結(jié)構(gòu),基本算法,數(shù)據(jù)庫(kù)設(shè)計(jì),數(shù)據(jù)庫(kù)引擎 ,SQL等),等等……
這個(gè)階段主要是把這些不同的技術(shù)組織成可以實(shí)現(xiàn)業(yè)務(wù)功能的解決方案。重點(diǎn)是能掌握和使用技術(shù)。很多流程和方法論的東西基本上就在這一重門(mén)里。這重門(mén)主要解決的是業(yè)務(wù)實(shí)現(xiàn)問(wèn)題。
二重門(mén):業(yè)務(wù)性能
業(yè)務(wù)的功能搞定了以后,就是業(yè)務(wù)的性能問(wèn)題了。搞定功能并不難,搞定性能是有點(diǎn)技術(shù)含量的事。有句話不是那么說(shuō)的嗎——每個(gè)人都可以搞一個(gè)網(wǎng)站出來(lái),但不是每個(gè)人都能搞出能支持***訪問(wèn)量的網(wǎng)站。但是,我看到很多技術(shù)團(tuán)隊(duì)或是工程師脫離了業(yè)務(wù),只單純地搞性能,比如:?jiǎn)闻_(tái)服務(wù)器支持10萬(wàn)個(gè)TCP鏈接的并發(fā),等等。這些東西雖然在技術(shù)上有點(diǎn)意思,但是沒(méi)有業(yè)務(wù)的環(huán)境,也只能是自?shī)首詷?lè)了。
我們可以看到一些企業(yè)開(kāi)始注重這個(gè)問(wèn)題了,性能問(wèn)題也是最近被大家討論得最多的問(wèn)題,京東商場(chǎng)的性能問(wèn)題,12306的性能問(wèn)題,等等。
當(dāng)然,所謂性能不并單單指系統(tǒng)的吞吐力,還指系統(tǒng)運(yùn)行時(shí)的總體性能,比如,系統(tǒng)安全性能,易用性能,系統(tǒng)的Accessbility的性能,系統(tǒng)的擴(kuò)展性性能,等等,就像是前段時(shí)間“Web開(kāi)發(fā)中需要注意的問(wèn)題”一文中談到的那些事一樣。這表明著你對(duì)系統(tǒng)的全面和深入的了解。
在 這個(gè)階段,需要對(duì)業(yè)務(wù)模型,數(shù)據(jù)流,業(yè)務(wù)流,系統(tǒng)架構(gòu),算法,和各種技術(shù)有深入的了解,要了解到本質(zhì)上來(lái)。比如,在***重門(mén)中,我們只需同要知 道,Java有同步關(guān)鍵字,在這一重門(mén)中,我們還要知道同步或互斥對(duì)性能的巨大傷害性,在***重門(mén)中,我們只需要知道STL中的智能指針或是STL的用 法,這一重門(mén)中,我們還要知道智能指針中的refcnt的同步加鎖對(duì)性能的損害,還需要知道STL中容器的size()方法在某些時(shí)候是性能很差的。在***重門(mén)中,我們需要知道hash表的效率,在這一重門(mén)中,我們還需要知道hash表的碰撞問(wèn)題。
最重要的是,在這重門(mén)重點(diǎn)是軟件的設(shè)計(jì)問(wèn)題。你需要有足夠多的經(jīng)驗(yàn)?zāi)鼙容^不同設(shè)計(jì)方案的優(yōu)缺點(diǎn),比如TCP和UDP,同步和異步,epoll和select,push和pull,水平擴(kuò)展的各種方案…… 還記得本站的那篇“程序員的謊謬之言還是至理名言”,廣度是你深度的副產(chǎn)品。所以,這重門(mén)是看你的技術(shù)視野有多深有多廣。
三重門(mén):業(yè)務(wù)智能
這 重門(mén)可能是最難的一重門(mén)了,如果你能進(jìn)到這重門(mén)里,你應(yīng)該是科學(xué)家級(jí)的程序員了。讓你有智能的業(yè)務(wù),這個(gè)事可能是***的技術(shù)難題了。***和第二重門(mén)都不算 難,這重門(mén)是最難的。參看Amazon的個(gè)性化推薦系統(tǒng),或是Google搜索引擎的結(jié)果個(gè)性化推薦等等(比如我輸入“黑天鵝”關(guān)鍵字,你怎么知道我要找 的是動(dòng)物,電影,音樂(lè),還是本書(shū)?怎么讓搜索出來(lái)的結(jié)果排名即公正又可個(gè)性?),你就知道,用技術(shù)來(lái)解決這種類(lèi)似的問(wèn)題難度可想而知,不然就不會(huì)出現(xiàn)如 Hadoop之類(lèi)的技術(shù)了。
我再舉兩個(gè)這重門(mén)里的業(yè)務(wù)方面的例子。
- 一個(gè)例子是關(guān)于庫(kù)存計(jì)劃的,需要像天氣預(yù)報(bào)一樣 預(yù)測(cè)未來(lái)的銷(xiāo)售量從而決定庫(kù)存,所以,最簡(jiǎn)單的做法是,監(jiān)測(cè)各個(gè)商品的銷(xiāo)售統(tǒng)計(jì),然后看一下最近的銷(xiāo)售趨勢(shì),還要看一下往年的銷(xiāo)售趨勢(shì)(因?yàn)槟承┕?jié)假日會(huì) 是一個(gè)高峰期),還要分析一下大眾的喜好變化,比如,在某影評(píng)網(wǎng)站上的某電影的熱度其會(huì)告訴我哪個(gè)電影的DVD要滯銷(xiāo)了,得打折賣(mài),哪個(gè)電影的DVD要暢 銷(xiāo)了,得多進(jìn)貨了。還可能需要監(jiān)控新聞評(píng)論,比如某權(quán)威人士推薦了某個(gè)商品,那么我得趕快進(jìn)貨了。等等。這完全就是一門(mén)科學(xué)。
- 還有一個(gè)例子是配送問(wèn)題。我有一輛卡車(chē)要處理我倉(cāng)庫(kù)和配送站間的物流問(wèn)題,我需要找到一條最經(jīng)濟(jì)的路線來(lái)在有限的時(shí)間內(nèi)處理最多的物流。這個(gè)不是最短路徑問(wèn)題,這是個(gè)計(jì)劃統(tǒng)籌學(xué)的東西。也是一門(mén)科學(xué)。
還有近期“方韓之爭(zhēng)”里有很多人來(lái)分析文章相似度的技術(shù),這些東西都屬于三重門(mén)里的東西。
到了這重門(mén)里,可能技術(shù)反而不是重要的了,而是數(shù)學(xué)模型。這重門(mén)里主要是業(yè)務(wù)模型,數(shù)據(jù)模型和算法問(wèn)題。這些東西和你的業(yè)務(wù)模型密切相關(guān)。能解決這樣的問(wèn)題,是真正的大牛。對(duì)于我來(lái)說(shuō),可能是高山仰止了。
后記
通過(guò)上面的說(shuō)明,我們可以看到下面這些東西,
- 我的那篇“程序員技術(shù)練級(jí)攻略”里的東西只能讓我們最多達(dá)到1.1 到 1.2重門(mén)。
- 一重門(mén)像是開(kāi)墾荒地,二重門(mén)像是擴(kuò)大生產(chǎn),三重門(mén)像是精耕細(xì)作。
- 一重門(mén)(業(yè)務(wù)實(shí)現(xiàn))里聚集著大量的勞動(dòng)密集型的企業(yè),勞動(dòng)密集型的企業(yè)通常都需要流程和方法論。敏捷過(guò)程改進(jìn)這類(lèi)的東西只在一重門(mén)里。
- 二重門(mén)和三重門(mén)里只有少數(shù)不多的技術(shù)型的公司。這類(lèi)的公司通常非常注重技術(shù),并且是企業(yè)文化是工程師的文化。
- 三重門(mén)里可以產(chǎn)生的創(chuàng)新和那些可以用來(lái)改變世界的技術(shù)。
- 國(guó)內(nèi)現(xiàn)在的情況是,一重門(mén)優(yōu)化階段 + 二重門(mén)的學(xué)習(xí)階段。三重門(mén)里似乎還沒(méi)有什么見(jiàn)術(shù)。不過(guò),我看到一些公司已在嘗試三重門(mén)的東西了。
- 作為技術(shù)人員的你,如果你想跟上時(shí)代,讓自己有價(jià)值的話,你至少要達(dá)到二重門(mén)。
- 因 為國(guó)內(nèi)的技術(shù)環(huán)境等不良因素,導(dǎo)致大量的程序員在一重門(mén)的時(shí)候就已經(jīng)失去信心,或被大浪淘沙淘掉了,所以,二重門(mén)里的程序員比較少了,但是隨著年輕的一代 和技術(shù)的日趨成熟,也會(huì)慢慢多起來(lái)的,我現(xiàn)在已經(jīng)看到這個(gè)趨勢(shì)了。而三重門(mén)里的程序員成了稀缺的大熊貓。因?yàn)榇罅康亩亻T(mén)程序員干到那個(gè)時(shí)候都轉(zhuǎn)管理了。
我的這些言論不一定對(duì),但希望能讓大家有啟發(fā),有所思考。
注:本來(lái)這篇文章的標(biāo)題想取成“程序員要解決的三種問(wèn)題”, 但是因?yàn)檫^(guò)年都在關(guān)注 “方韓之爭(zhēng)”,所以,干脆取成了這個(gè)名字。你可以認(rèn)為我比較調(diào)皮,也可以認(rèn)為我愛(ài)ZB,還可以認(rèn)為我標(biāo)題黨,反正,請(qǐng)隨意理解。(這篇文章是我的自己寫(xiě) 的,沒(méi)有代筆,因?yàn)槟阋欢〞?huì)在這篇文章中看到屬于我的用五筆打出來(lái)的錯(cuò)別字,當(dāng)然,我無(wú)法自證,哈哈)