你不是全面的專家
對于軟件開發,干的時間越長,就越感覺自己懂的知識少,似乎要學習的知識還有很多很多。最近恰在DZone上看到一篇小文,作者談到是否有必要成為全面的專家。道理其實很淺顯,大家也都懂,我只是隨手翻譯一下罷了。(2013.06.30最后更新)編程不僅僅是寫代碼--而是要處理一大堆抽象。從0和1開始,到處理器,內存地址,底層的網絡協議,數據結構,再上升到網絡服務,組件框架和用戶界面。這一過程,就是從乏味的底層抽象,到更有趣的可用且可維護的抽象。
我們被歸為"高級開發者"。對于某些人來說,這就意味著我們在所有的抽象層面都是專家。如果不是這樣,那么我們就不夠好。我不傾向于贊同這種觀點,而這并不只是為了證明我并不是在所有抽象層面上都是專家。
這基本上就是一種折衷--要么你專注于某些層面,然后變得對它們十分精通,要么,你這也學學,那也干干,然后對哪一樣也不精通。接下來你會爭辯到,在多數領域的某些方面你應該達到專家級。但隨著時間的推移,這些專業知識將會變得冗余。如果我今天把應用設計與框架方面的知識丟到一邊,而去鉆研算法或TCP編程,那么由于技術更新,三年后我可能就不再精通之前的那些領域了。
存在抽象的原因之一就是防止你陷入底層細節的深淵。如果沒有這些抽象,我們就不可能寫出合格的軟件。而我們可能需要做的就是專注于更高層,因為低層已經被處理好了。將底層編程當作某種深奧藝術可能只是為了顯擺,但事實上它并非什么深奧藝術,只是有對底層編程的需求罷了。
當然,這就不是說通過學習JQuery,Rails和Spring就能使你變成最好,而不需要知道其它東西了。你要盡可能地熟悉你所專長層面之下和之上層面的工作原理。一般地,因為所有抽象都會"泄露",所以你不能忽略應用程序所消耗的內存,當需要快速訪問時,你最好使用Hashtable,TCP連接可能被防火墻阻隔,盡管你不需要編寫析構函數,不需要實現Hashtable,或者了解TCP。但了解其它層面的工作原理并不會使你成為那方面的專家,其實你也不必成為那種專家。
為什么我要寫這些呢?因為很多公司(包括大公司)中的人們傾向于認為專家就應該在所有層面上都達到專家級,尤其是在底層方面。在面試時會問你很多底層的細節問題,好像你一生都在從事數據結構和網絡編程方面的工作,你當然不是那樣,但這并不意味著你不是一名專家。
不做全方位的專家是一件很好的事情,只需要在若干層上達到專家級就行了。但你必須了解更低層和更高層領域的工作原理,這樣當有需要時,你也可以成為那一層的專家。