去年的這個(gè)時(shí)候我從公司離職變成一個(gè)留學(xué)生,一晃已經(jīng)一年過去了。不過從業(yè)兩年半學(xué)到的東西,一年之后也不過時(shí)。
當(dāng)然這不只是在技術(shù)方面,更多的是在公司的技術(shù)管理上的問題。
我在大學(xué)里屬于那種比較叛逆的人,喜歡與眾不同。大家都在用Windows的時(shí)候,我偏用Linux;大家都在用C++(我們學(xué)校選擇C++為入門語言)寫作業(yè)的時(shí)候,我偏用Java;后來大家都開始用Java寫了,我就轉(zhuǎn)用Python甚至是Node.js。到了大學(xué)最后一學(xué)期的Web開發(fā)課,我就在微博上講,我要用Node.js,HTML5,CSS3,MongoDB寫作業(yè)(我當(dāng)時(shí)的技術(shù)選型現(xiàn)在有個(gè)標(biāo)準(zhǔn)的稱謂叫MEAN Stack),讓那些腐朽的老師看看什么是新技術(shù)。
我這份對(duì)于新技術(shù)的追求一直保留到了工作,以至于我們團(tuán)隊(duì)大多數(shù)適配新技術(shù),或者糾正舊的問題,都是我來主導(dǎo)的。比如適配iPhone5,正確使用Autoresizing Mask(那時(shí)候還沒有Auto layout),適配ARC等等。除了這些比較正常的技術(shù)升級(jí)之外,我還喜歡搞一些cutting edge的東西。后來漸漸發(fā)現(xiàn),在大公司,并且技術(shù)氛圍不是很濃厚的大公司,搞cutting edge的技術(shù)很難成功,從公司的角度來說,增加了維護(hù)成本。
比如做股吧的時(shí)候,我選擇把股吧正文部分做成hybrid的形式。也就是正文渲染使用Web技術(shù),而正文圖片加載部分由于有十分復(fù)雜的緩存邏輯,需要調(diào)用native的代碼,并且正文的一些鏈接點(diǎn)進(jìn)去需要進(jìn)入別的view controller。為此,我做了一個(gè)簡單的bridge來讓兩邊的代碼互相調(diào)用。實(shí)際上這個(gè)bridge的主要目的是讓JavaScript來調(diào)用Native的代碼。我堅(jiān)信Web技術(shù)是未來,所以我刻意將代碼的重頭放在了JavaScript部分,而Native的部分,只提供必要的接口。而且我還嫌JavaScript的語法太二了,使用了CoffeeScript開發(fā),然后在Xcode的build phases里加入了將CoffeeScript隨Xcode的編譯而編譯成JavaScript的腳本。這樣一來我很開心,因?yàn)槲矣X得用的技術(shù)挺優(yōu)雅的。
然而不久之后,隨著我即將離職,我將代碼轉(zhuǎn)交給同事之后,問題就來了。其實(shí)在iOS開發(fā)組里面,有Web前端背景的只有我一個(gè)。其他的同事連JavaScript都不怎么懂,更別說CoffeeScript了。所以我眼看著我的代碼一點(diǎn)一點(diǎn)地被改掉。首先停用CoffeeScript幾乎是立即的事。然后因?yàn)橥聜兏恿?xí)慣于objc而不是JavaScript,代碼邏輯的重頭漸漸地向objc轉(zhuǎn)移,原來我的設(shè)計(jì)被倒轉(zhuǎn),Web部分成了純粹的View,對(duì)于Web部分的控制,完全由objc來完成。于是我的那個(gè)JSBridge的用處就很少了,因?yàn)槭褂?code>stringByEvaluatingJavaScriptFromString就能完成objc調(diào)用js的功能。最終還沒等我離職,那個(gè)模塊就已經(jīng)被傳統(tǒng)技術(shù)取代。
我從這件事學(xué)到的就是在技術(shù)選型時(shí),不能光顧著自己的信念和方便,還得從公司的角度考慮。首先我們需要接受一個(gè)事實(shí),那就是大多數(shù)人并不是技術(shù)狂熱者。不到萬不得已的時(shí)候,很多人都不愿意去學(xué)新技術(shù)。所以對(duì)于新技術(shù)我們需要對(duì)此分級(jí),到底它是必要的還是可選的。所謂必要的,就是說不使用它就會(huì)被淘汰,或者是在不高的學(xué)習(xí)曲線情況下大幅度降低bug率(比如ARC)。所謂可選的,是指那些很fancy的概念,并不能大幅度提高編碼效率,學(xué)習(xí)曲線很高,當(dāng)前技術(shù)能完全代替的新技術(shù)。比如現(xiàn)在很熱的reactive概念,我認(rèn)為是optional的。因?yàn)閞eactive并沒有大幅度提高代碼質(zhì)量,而且有相當(dāng)?shù)膶W(xué)習(xí)曲線(沒有受過專門的函數(shù)式編程訓(xùn)練,如Haskell,是很難正確使用FRP的,很多人用reactive cocoa其實(shí)是在當(dāng)promise用的,可以說大材小用了)。這些optional的新技術(shù),對(duì)于很多高手來說可能確實(shí)提高了效率,但對(duì)很多普通程序員來說,不見得是這樣。所以在選型時(shí)必須考慮公司平均的技術(shù)水平。
我之前在thoughtworks看到他們的技術(shù)雷達(dá)圖,雖然我不知道他們實(shí)際是怎么弄的,但明顯他們在嘗試新技術(shù)上有循序漸進(jìn)地嘗試,這我覺得是很好的。
有人覺得,可以在招人的時(shí)候都招頂尖人才,這樣就能搞最新技術(shù)了。但事實(shí)卻是招人很難。我的上家有很長一段時(shí)間招不到靠譜的人,要招到技術(shù)狂熱者就更不可能了。作為一家中型上市公司尚且如此,別說小公司了。所以很多時(shí)候愿望很美好,現(xiàn)實(shí)卻也很無情。