你不是全面的專家
對(duì)于軟件開(kāi)發(fā),干的時(shí)間越長(zhǎng),就越感覺(jué)自己懂的知識(shí)少,似乎要學(xué)習(xí)的知識(shí)還有很多很多。最近恰在DZone上看到一篇小文,作者談到是否有必要成為全面的專家。道理其實(shí)很淺顯,大家也都懂,我只是隨手翻譯一下罷了。(2013.06.30最后更新)編程不僅僅是寫(xiě)代碼--而是要處理一大堆抽象。從0和1開(kāi)始,到處理器,內(nèi)存地址,底層的網(wǎng)絡(luò)協(xié)議,數(shù)據(jù)結(jié)構(gòu),再上升到網(wǎng)絡(luò)服務(wù),組件框架和用戶界面。這一過(guò)程,就是從乏味的底層抽象,到更有趣的可用且可維護(hù)的抽象。
我們被歸為"高級(jí)開(kāi)發(fā)者"。對(duì)于某些人來(lái)說(shuō),這就意味著我們?cè)谒械某橄髮用娑际菍<摇H绻皇沁@樣,那么我們就不夠好。我不傾向于贊同這種觀點(diǎn),而這并不只是為了證明我并不是在所有抽象層面上都是專家。
這基本上就是一種折衷--要么你專注于某些層面,然后變得對(duì)它們十分精通,要么,你這也學(xué)學(xué),那也干干,然后對(duì)哪一樣也不精通。接下來(lái)你會(huì)爭(zhēng)辯到,在多數(shù)領(lǐng)域的某些方面你應(yīng)該達(dá)到專家級(jí)。但隨著時(shí)間的推移,這些專業(yè)知識(shí)將會(huì)變得冗余。如果我今天把應(yīng)用設(shè)計(jì)與框架方面的知識(shí)丟到一邊,而去鉆研算法或TCP編程,那么由于技術(shù)更新,三年后我可能就不再精通之前的那些領(lǐng)域了。
存在抽象的原因之一就是防止你陷入底層細(xì)節(jié)的深淵。如果沒(méi)有這些抽象,我們就不可能寫(xiě)出合格的軟件。而我們可能需要做的就是專注于更高層,因?yàn)榈蛯右呀?jīng)被處理好了。將底層編程當(dāng)作某種深?yuàn)W藝術(shù)可能只是為了顯擺,但事實(shí)上它并非什么深?yuàn)W藝術(shù),只是有對(duì)底層編程的需求罷了。
當(dāng)然,這就不是說(shuō)通過(guò)學(xué)習(xí)JQuery,Rails和Spring就能使你變成最好,而不需要知道其它東西了。你要盡可能地熟悉你所專長(zhǎng)層面之下和之上層面的工作原理。一般地,因?yàn)樗谐橄蠖紩?huì)"泄露",所以你不能忽略應(yīng)用程序所消耗的內(nèi)存,當(dāng)需要快速訪問(wèn)時(shí),你最好使用Hashtable,TCP連接可能被防火墻阻隔,盡管你不需要編寫(xiě)析構(gòu)函數(shù),不需要實(shí)現(xiàn)Hashtable,或者了解TCP。但了解其它層面的工作原理并不會(huì)使你成為那方面的專家,其實(shí)你也不必成為那種專家。
為什么我要寫(xiě)這些呢?因?yàn)楹芏喙?包括大公司)中的人們傾向于認(rèn)為專家就應(yīng)該在所有層面上都達(dá)到專家級(jí),尤其是在底層方面。在面試時(shí)會(huì)問(wèn)你很多底層的細(xì)節(jié)問(wèn)題,好像你一生都在從事數(shù)據(jù)結(jié)構(gòu)和網(wǎng)絡(luò)編程方面的工作,你當(dāng)然不是那樣,但這并不意味著你不是一名專家。
不做全方位的專家是一件很好的事情,只需要在若干層上達(dá)到專家級(jí)就行了。但你必須了解更低層和更高層領(lǐng)域的工作原理,這樣當(dāng)有需要時(shí),你也可以成為那一層的專家。