小時(shí)候,老師問(wèn)我,你的理想是什么?我不假思索說(shuō)是工程師,于是長(zhǎng)大之后果然成了工程師。
工作這么多年,一直在思考工程師這三個(gè)字的意義,終于有一天恍然大悟,原來(lái)就是:用技術(shù)手段改進(jìn)世界。
那么,在軟件方面,目前的世界有哪些問(wèn)題需要解決呢?有這么一些問(wèn)題可以思考:
現(xiàn)在整個(gè)世界的信息化程度是偏高還是偏低?
程序員的人數(shù)夠用嗎?
軟件行業(yè)的生產(chǎn)力是偏高還是偏低?
大部分軟件系統(tǒng)都可靠嗎?
我想說(shuō)說(shuō)自己對(duì)這幾個(gè)問(wèn)題的理解。
雖然現(xiàn)在我們的生活與十年前相比,已經(jīng)發(fā)生了巨大變化,比如智能手持設(shè)備已經(jīng)非常普及,可穿戴設(shè)備也在蓬勃發(fā)展。十年前我們用手機(jī)收發(fā)短信或者郵件,瀏覽非常簡(jiǎn)單而老土的wap頁(yè)面,但現(xiàn)在,絕大部分人的手機(jī)已經(jīng)取代了電腦,成為日常生活中不可缺少的工具。
我們用手機(jī)交流,購(gòu)物,欣賞影視,閱讀書(shū)籍,玩各類游戲,尤其是飛速發(fā)展的移動(dòng)購(gòu)物和支付體系,使得我們能在任意場(chǎng)合購(gòu)買(mǎi)心儀的物品,訂購(gòu)旅游服務(wù)和賓館,叫快餐,打車(chē)等等,生活非常美好,那么,整個(gè)世界的信息化程度處于什么級(jí)別呢?
我覺(jué)得,才剛剛相當(dāng)于小學(xué)二年級(jí),整個(gè)世界的信息化程度仍然嚴(yán)重偏低。從現(xiàn)在算起,往前10年,往后10年,這20年時(shí)間中,面向個(gè)人的信息化服務(wù)處于高速發(fā)展期,這個(gè)領(lǐng)域非常吸引眼球,因?yàn)樗c每個(gè)人的生活息息相關(guān)??墒?,另外有一些領(lǐng)域,卻非常需要發(fā)展,那就是傳統(tǒng)行業(yè)的信息化。
之前有不少傳統(tǒng)行業(yè),進(jìn)行了一定程度的信息化,但這個(gè)信息化僅僅能滿足自身運(yùn)作的基本要求,當(dāng)它與整個(gè)社會(huì)的潮流相對(duì)接的時(shí)候,就顯得非常落后,遲緩。比如說(shuō)在網(wǎng)購(gòu)這個(gè)大體系中,普通用戶所能看到的是商品展示,比價(jià),下單的過(guò)程,但背后的核心環(huán)節(jié)卻是配貨與物流。
我還在上學(xué)的時(shí)候,有老師這么說(shuō)過(guò),現(xiàn)在計(jì)算機(jī)行業(yè)非?;馃?,很可能要飽和了,你們不一定非要從事這方面的工作。現(xiàn)在回頭看這句話,覺(jué)得很有趣,人真的很難有眼光看到未來(lái)。去年我入職蘇寧培訓(xùn)的時(shí)候,孫為民副總講了當(dāng)年一個(gè)決策失誤的例子。90年代末,公司統(tǒng)計(jì)發(fā)現(xiàn)全國(guó)空調(diào)的年銷售量達(dá)到數(shù)百萬(wàn)臺(tái),覺(jué)得很可怕,這個(gè)行業(yè)可能要飽和,估計(jì)要再想辦法拓展別的商品經(jīng)營(yíng)了,但現(xiàn)在,全國(guó)空調(diào)的保有量為七億臺(tái),即使完全沒(méi)有新增,十年換一輪,每年也賣(mài)得出去七千萬(wàn)臺(tái),當(dāng)年憑什么說(shuō)這就飽和了?
所以我現(xiàn)在看程序員的狀況,仍然是供不應(yīng)求,尤其是高端程序員,十分搶手。這個(gè)問(wèn)題的背景就是全社會(huì)的信息化進(jìn)程在加速,之前的程序員人數(shù)遠(yuǎn)遠(yuǎn)跟不上需求量。
那么,如何解決這個(gè)問(wèn)題呢?一方面是繼續(xù)培訓(xùn),促使更多新人來(lái)到這個(gè)行業(yè),并且認(rèn)真做下去,另外還有一些別的手段需要考慮。
我想追問(wèn)一個(gè)問(wèn)題:世界上懂業(yè)務(wù)的人多,還是懂技術(shù)的人多?很明顯,懂業(yè)務(wù)的人要多很多,什么叫業(yè)務(wù)?其實(shí)就是行業(yè)常識(shí),生活經(jīng)驗(yàn)。
比如說(shuō),一個(gè)有經(jīng)驗(yàn)的倉(cāng)庫(kù)保管員,可能文化程度不高,理解不了軟件的運(yùn)行原理之類,但一定對(duì)產(chǎn)品出庫(kù)入庫(kù)的流程非常熟悉,包括各種審批過(guò)程和異常狀況,但這些,程序員是不懂的。那如果要促進(jìn)這個(gè)領(lǐng)域的信息化,必然要在兩者之間尋找一個(gè)結(jié)合點(diǎn),程序員可以學(xué)業(yè)務(wù),業(yè)務(wù)人員也可以嘗試參與軟件研發(fā)過(guò)程,目前來(lái)說(shuō),都是前者比較多,因?yàn)槌绦騿T相對(duì)來(lái)說(shuō)還是比較年輕,學(xué)東西快些。但從整體社會(huì)效益來(lái)說(shuō),這其實(shí)是不利的,因?yàn)槌绦騿T是更稀缺資源,而傳統(tǒng)業(yè)務(wù)人員非常多。
之前見(jiàn)過(guò)一個(gè)問(wèn)題:如何讓業(yè)務(wù)人員更好地參與軟件研發(fā)過(guò)程。這個(gè)問(wèn)題的根本解決方法是DSL(Domain Specific Language),核心解決方案是二次開(kāi)發(fā)平臺(tái)。
什么是DSL和二次開(kāi)發(fā)平臺(tái)呢,這兩個(gè)詞聽(tīng)上去很高端,但其實(shí)大家有很常用的東西就屬于這個(gè)范疇,比如Excel,它提供了各種各樣的公式,還有VBA,使用這些東西的人絕大部分不是軟件行業(yè)的,Excel就是一種很成功的二次開(kāi)發(fā)平臺(tái),公式和VBA就可以算DSL了。
很多時(shí)候這些東西還不夠直觀,我們可以看到一些圖形化的編程語(yǔ)言,比如Scratch,現(xiàn)在很多小學(xué)生的興趣班就會(huì)學(xué),這些東西相對(duì)學(xué)起來(lái)就比較容易了,我們也可以做一些類似的抽象,以圖形化的方式讓業(yè)務(wù)人員能夠參與,比如流程配置等等。圖形化的東西,是最適合非技術(shù)人員理解的。
所以,要促進(jìn)社會(huì)的信息化程度,最好是能夠想辦法把各行業(yè)的業(yè)務(wù)人員都拖進(jìn)來(lái)一起搞。具體的分工大致是:技術(shù)人員和業(yè)務(wù)人員一起定義DSL,技術(shù)人員負(fù)責(zé)DSL的底層平臺(tái)實(shí)現(xiàn),業(yè)務(wù)人員負(fù)責(zé)使用它來(lái)構(gòu)建業(yè)務(wù)模型和業(yè)務(wù)流程,甚至業(yè)務(wù)界面。
那么,軟件行業(yè)的生產(chǎn)力是偏高還是偏低呢?我認(rèn)為嚴(yán)重偏低。什么叫嚴(yán)重偏低?如果以機(jī)械力量的變革來(lái)對(duì)比,軟件行業(yè)目前的生產(chǎn)力水平處于蒸汽機(jī)發(fā)明之前。也就是說(shuō),生產(chǎn)力遠(yuǎn)遠(yuǎn)沒(méi)有被解放,大家做的大部分東西將來(lái)是會(huì)被機(jī)械化的,不再需要這么多人來(lái)做這么重復(fù)的勞動(dòng)。可能很多人會(huì)對(duì)這段話不滿,怎么就重復(fù)勞動(dòng)了,你說(shuō)說(shuō)我做的什么是可以被機(jī)器替代的?
換個(gè)角度看,為什么幾乎所有外行都覺(jué)得軟件貴呢?因?yàn)槿肆Τ杀咎吡耍麄冇X(jué)得,做出這么多東西,應(yīng)該是不需要這么多時(shí)間。為什么雙方的反差這么大呢?
我覺(jué)得其中的關(guān)鍵點(diǎn)在于絕大部分工作的抽象程度嚴(yán)重不足,另外有很大一部分效率損失在編程平臺(tái)或編程語(yǔ)言的不完善,比如Web前端。
從第一代到第四代編程語(yǔ)言,每一代都是損失一定運(yùn)行效率,而大幅提升編寫(xiě)效率。隨著硬件技術(shù)的發(fā)展,軟件編程必然越來(lái)越粗放,大的趨勢(shì)是不特別重視細(xì)節(jié)效率,只要沒(méi)有數(shù)量級(jí)的性能損耗。
所以我們可以預(yù)期,會(huì)有越來(lái)越多的人使用一些運(yùn)行效率相對(duì)不怎么高的語(yǔ)言或框架,只是為了提高單位時(shí)間的生產(chǎn)力。從老板們角度想,也會(huì)明白,提升運(yùn)行機(jī)器的性能,要比多雇幾個(gè)程序員便宜多了。因此,從整體趨勢(shì)看,追求細(xì)節(jié)性能的程序員們恐怕會(huì)離自己的理想越來(lái)越遠(yuǎn)了,除非是在某些特定領(lǐng)域。
那么,絕大部分軟件系統(tǒng)都可靠嗎?我換一句話來(lái)問(wèn):各位程序員朋友,如果你們住的房子質(zhì)量跟你們正在做的軟件一樣,你敢住嗎?感覺(jué)大家都在笑,笑是什么意思,我們都懂的。
那為什么軟件系統(tǒng)的質(zhì)量不容易高呢?我覺(jué)得主要原因是流程不完善。那為什么不完善?需求容易變。為什么容易變?是因?yàn)椴徽摮绦騿T自己,還是需求方,其實(shí)潛意識(shí)都認(rèn)為自己做的東西是變更成本較低的。
試想一下,為什么沒(méi)人在蓋高樓蓋一半變更需求?為什么沒(méi)人修大橋修一半變更需求?甚至做衣服做一半的時(shí)候變更需求,理發(fā)到一半變更需求,都會(huì)被人認(rèn)為是不講理。但是在軟件領(lǐng)域,好像這倒成了普遍現(xiàn)象。
因?yàn)檎麄€(gè)軟件系統(tǒng)的實(shí)現(xiàn),都是虛擬的,看不見(jiàn)摸不著,并不消耗什么物料,所以從這個(gè)角度想,變起來(lái)當(dāng)然是容易的。但軟件系統(tǒng)的架構(gòu),其實(shí)也跟實(shí)體的沒(méi)本質(zhì)區(qū)別,變更時(shí)候要考慮很多關(guān)聯(lián)因素,并不是就那么孤立的看一小塊地方,當(dāng)然,也會(huì)有一些不影響全局的變更。打個(gè)比方說(shuō),如果你在蓋房子蓋到一半,那變更外墻顏色肯定是要比變更窗戶大小容易的。要是想變得太多,估計(jì)只好拆了重來(lái)。
我見(jiàn)過(guò)不少公司是通過(guò)加強(qiáng)測(cè)試的方式來(lái)試圖控制質(zhì)量,但個(gè)人覺(jué)得這種方式不劃算,而且收效不高。要想很好地應(yīng)對(duì)需求變更,很重要的一點(diǎn)就是不要有這個(gè)軟件一定不會(huì)改的想法,然后,從架構(gòu)上做拆分,隔離,組件化等等,力爭(zhēng)做到即使要改,也只改某一塊的內(nèi)部,不影響別的地方。
很多軟件公司,一方面不注重架構(gòu)的設(shè)計(jì)與宣貫,導(dǎo)致變更的時(shí)候問(wèn)題多多,程序員也不能很好領(lǐng)會(huì)架構(gòu)意圖,一方面忽視整個(gè)過(guò)程中對(duì)架構(gòu)的管控,認(rèn)為架構(gòu)只是最初那張靜態(tài)圖。
任何一種架構(gòu)方案,都需要一個(gè)良好的管控機(jī)制。沒(méi)有哪個(gè)蓋大樓的只認(rèn)真管設(shè)計(jì)圖紙,不控制施工過(guò)程。架構(gòu)其實(shí)是跟施工過(guò)程嚴(yán)格相關(guān)的,架構(gòu)并不是一張扁平的圖,而是一個(gè)立體的東西,作為整個(gè)系統(tǒng)工程的骨架。如果能在開(kāi)發(fā)的時(shí)候看到這個(gè)骨架逐漸建立,血肉充盈的過(guò)程,對(duì)整個(gè)系統(tǒng)的成功把握一定會(huì)大
得多,這也就是開(kāi)發(fā)過(guò)程中架構(gòu)管控的理念,具體實(shí)現(xiàn)要依賴于不同場(chǎng)景。
所以,將來(lái)的軟件開(kāi)發(fā)方案,一定是會(huì)朝著幾個(gè)方向發(fā)展:
高生產(chǎn)力,單位時(shí)間生產(chǎn)效率更高,普通人員也可以參與
高可控性,整個(gè)生產(chǎn)過(guò)程更加完備可靠
有時(shí)候看現(xiàn)在的小孩子,會(huì)覺(jué)得他們很幸福,因?yàn)榈人麄冞@代長(zhǎng)大,就不需要像我們現(xiàn)在這樣編寫(xiě)程序了,那時(shí)候,編程已經(jīng)成了一種令人習(xí)以為常的通用技能,就像現(xiàn)在的人用Office軟件一樣,所謂的編程,很可能已經(jīng)不需要敲代碼了,而是圖形化,設(shè)置幾個(gè)參數(shù)就完事了。