也談談全棧工程師

raychase發表於2014-07-16

  縱使目標再大,人的精力有限,於我來說,早些時候遠大目標隱約是“成功的軟體工程師”這個樣子,但是目標是需要逐漸細化的。這些年我漸漸對自己的定位和未來有了一個清晰一點的認識。確實我有很強的觀點,覺得軟體工程師需要有足夠的全面性,在《我眼中的工程師文化》中我也說“工程師文化,不是隻有權力的一面,它對工程師的要求,是每個人都要足夠能幹,都要做許多的事”……

  但是,全面性不代表沒有專精、沒有方向。深度和廣度統一的問題已經有許許多多過往的人和我說過了,不存在一個在某一領域精深的牛人但是知識卻很窄,也不存在一個博學大師但是卻沒有一個自己擅長的領域;而方向更是不可迴避的問題,以前和朋友開玩笑總結了幾類工程師的發展方向,就像打怪升級一樣,有資料庫專精、有前端專精、有語言設計專精、有機器學習領域專精,甚至還有企業流程諮詢專精、敏捷實踐專精的……領域劃分實在是太寬闊了,就看技能點數如何分配。

  我當然也給自己尋找了方向。在這個網站的右上角我放上了三個關鍵詞,大概是對當前的我一個側面最粗略的描述:

  • #Web#是我一直以來感興趣的領域,早有人說網際網路軟體的技術和發展甩傳統軟體好幾條大街,尤其在見到很多朋友、牛人投身網際網路領域,我更對它充滿憧憬;
  • #JavaEE#算是我相對熟悉的領域,雖說這幾年接觸的東西稍微多一些;
  • #全棧工程師#是我的方向之一,粗略地說我現在也已經符合這樣的標準,但是仁者見仁智者見智,這是以我的觀點而言的,每個人對它有不同的理解,在這裡我會說說我的看法。

  其他人的理解

  關於這個話題,當前頗有爭議,雖說大部分工程師表示認可。在Google搜尋“Full Stack Developer”的第一條記錄,是Laurence Gellert(前湯森路透的工程師)寫的一篇名為《What is a Full Stack developer》的文章,這篇文章的觀點其實還是非常切合主線的:

To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.

  並且羅列了滿足“full stack”應當掌握的各層技術,包括伺服器、網路、主機環境,資料建模,業務邏輯,API層/Action層/MVC,介面,使用者體驗和理解使用者、業務所需。

  在國內,知乎這個帖子應該算是熱帖了,每個人都有自己的看法,比如第一條回覆就提到了思維方式和學習能力,但是其中有很多觀點偏離了“全棧”這個主線,變成了“我心目中的理想工程師”這樣的討論,就不符合初衷了。

  全棧工程師的發展

  在系統、全面的大公司,全棧工程師並沒有一個穩定的發展職位。我無比贊同知乎那個帖子裡面這樣的一句話:

一個真正的全棧工程師,目標只有一個:創業。

  聽起來有些悲涼,但事實就是如此。任何一個方向頗具深度的工程師,都有希望為自己在那個特定的領域贏得自己的一席之地,是權威,也是技藝精深的專家。但是對於所謂的“全棧”而言,很多情況下根本就稱不上優勢,你會寫數門程式語言,會設計API,會寫前端程式碼,會做手機APP,甚至會切圖,會和使用者溝通,但是倘若在這些方向都難說有哪一項足夠強大,那全面性又能在大公司的晉升線路上謀得什麼?

  但是創業的小公司就完全不是這樣了,你不能指望有DBA、技服、產品經理、美工、前端設計師、伺服器工程師、作業系統管理員……無數角色,你只能有那麼少得可憐的幾個人,每個人都必須是全才,搞得定各種事情,經驗豐富、視野廣闊。出了問題,一個人就可以搞定,而每個人,都可以彼此備份。

  這也是“學習能力”在全棧工程師中扮演無比重要角色的原因。畢竟,在全面的工程師,也不可避免地涉足自己不熟悉的領域,快速學習並且把問題搞定,在這樣的過程中體現自己的價值。

  全棧工程師擁有更廣闊的視野和更廣泛的學識。全棧工程師可以從更高的角度去看待問題,這比某個領域的專家,更不容易做出錯誤的決策。

  事實上,軟體工程本來就是一個複雜的事情,需要工程師掌握和學習的知識很多。在我前一家公司,有這樣一個故事,好幾年前,公司嘗試給軟體工程師分檔,甚至依此使用不同的僱傭實體:讓來自子公司A的最優秀的工程師設計了程式,再讓來自子公司B的平庸工程師去實現。最後這個方案徹底失敗了,兩家子公司的工程師被迫合併,這也證明了,軟體工程是一項複雜的腦力勞動,想像流水線工人那樣,把整個環境簡單地切分成若干個過程,然後通過簡單勞動完成,是不可能的。你可以舉出很多外包、內包公司中上述的例子,但是在我看來,這只是對勞動力的壓榨而已,別指望這樣的形式能做出什麼偉大的產品來。

  “全棧”不等於“全面”

  “Full Stack”,這個詞其實在英文中使用很普遍,可以直譯為所謂“全面的技術棧”(軟體工程中,每個領域都擁有相應的數種不同技術,這就是這個領域的技術棧),現在人們加入了自己的理解,但無論如何,它絕不等於“comprehensive”。換言之,一個全棧工程師,絕不等於一個全面的工程師。接觸多點領域當然有好處,但是淺嘗輒止、僅僅停留在入門級別,那這個領域內,給別人、給專案造成的危害,甚至大過那些一竅不通的人。舉例來說,你是願意去給一坨屎一樣的設計和程式碼修修補補呢,還是願意幹脆重新弄一個呢?當然,也不要走極端,有一些領域的知識,可以透明,那就透明吧,比如,使用雲服務的時候,你可以對硬體知之甚少,這對工作並無礙。僅僅為了全棧的名號,追求這樣的知識儲備並無必要。

  “全棧”不等於“全端”

  全棧工程師的劃分,絕不止以“網際網路應用”的維度,更特別地,絕不止以“網際網路網站”的維度。微博上很多人說到全棧,就提“全端”,我認為,這實在是莫大的誤解,二者是嚴重不等同的。前端+後端,這只是其中一種粗暴的劃分方式而已。就像同事中,有對作業系統熟悉的,有對機器學習熟悉的,把他們粗暴地歸結為“後端”工程師,是毫無意義的。即便說到創業,也遠遠不止網際網路領域啊。事實上,要能比較熟悉其中幾個領域,就已經是非常難得的人才了。我想不出還有什麼其他行業,會像軟體行業這樣需要不斷地擴充自己。

  最後,我想用一個無比簡單的詞來描述全棧工程師,肯定不夠準確,但也足夠直接——

視野

相關文章