傷不起的全棧程序員

這裏有更好的閱讀體驗:傷不起的全棧程序員javascript

前段時間據說一個新名詞:"全棧程序員",google了一下,被引導到了知乎的一個討論上: http://www.zhihu.com/question/22420900 。樓主提出了一個問題:怎樣成爲全棧程工程師,本人也在上面不由自主地回覆了一下。回頭想來彷佛還有話要說。因爲這個話題很容易跑偏,本文只把範圍限定在全棧Web軟件工程師,簡稱FSD(Full Stack Developer)css

 

把技術當成生活,本身逼本身的結果

其實在任何公司工做,光憑工做的內容,很難成爲FSD。有朋友可能不一樣意了,說在創業公司有不少機會作不一樣的工做啊,我想說的是,即使是創業公司,公司老是有主營的業務和方向的,就算能從前到後一我的作一個網站,那又怎樣,從技術上說,無非也就是掌握了一種或幾種數據庫,一門或幾門後臺語言,掌握了html,js,css...大公司呢?更難了,大公司雖然方向不少,可是越是大的公司,我的的螺絲釘效應越明顯,你可能成爲領域專家,但很難有機會成爲完整的機器的。那麼全棧程序員的磨練靠的是什麼?靠的是一種打心底裏的執着和毅力,把技術當成生活,本身逼本身不斷的獵取知識。html

 

難以界定,每一個人都有不一樣的理解

剛纔其實沒有鄙視可以完整作網站的人,相反,非常欽佩。至少本人如今在css上還不能算能徹底獨立。不過每一個人對FSD的定義其實不同,這跟我的的閱歷有必定的關係。只想說,既不要對本身過度自信,也不要過度貶低。一方面,人外有人,天外有天,每一個人覆蓋到技術領域是有差別的;另外一方面,FSD其實挺不容易的,不只不容易達到,並且不容易得到存在感。正由於見的多,因此就越以爲本身眇小,咱們常常說的,真正的大牛歷來就是低調和謙虛的。而FSD在任何領域都不是那種呼風喚雨的專家,別人在討論的時候可能永遠都沒有你插話的機會,其實你內心知道,本身還很膚淺。我的自認爲是比較接近這麼一個性質的程序猿,能夠從個人博客的文章內容略窺一二。可是正如我不敢斬釘截鐵地將本身定性到這麼個層次,恐怕不少全棧程序員也不能將本身明確在這個定位上,由於總有人能站出來給你一個"反例"。前端

 

何去何從

從知乎上的回答來看,FSD彷佛並不吃香。縱觀人類發展歷程,更細緻的社會分工造就了生產力的提升。就程序員行業而言,愈來愈趨於細分話,彷佛也是正常的趨勢。做爲FSD,實際上挺難的,主要是由於精力的限制,沒法在廣度和深度上兼顧。儘管如此,我的以爲FSD仍是有很明顯的優點的:java

  1. 見多識廣,解決問題的手段比較多,並且每每可以舉一反三的思考;
  2. 不容易被某種技術的新衰而左右,很容易轉型;
  3. 合格的FSD每每具備超強的毅力和極客精神,這在某些狀況下是頗有用的;
  4. 因爲能力普遍,又吃苦耐勞,適合創業;

 

我的理解

針對Web開發的話,稍稍談一談我的對全棧程序員能力的界定,大牛們輕拍:mysql

  1. 用戶體驗層面,html45javascriptcss23,各類前端的框架...
  2. 後臺業務邏輯層面,各類編程語言,如今主流的有JavaC#PythonRubyPHPNode.js...,以及配套的各類開發框架...
  3. 輔助層面可能會涉及到CC++等較爲古老的編程語言,須要必定程度上熟悉掌握...
  4. 數據庫,會設計和使用幾種經常使用的數據庫,mssqlmysqloracle...,數據庫分析和優化
  5. 架構層面,可以設計靈活可靠,易擴展的軟件架構和硬件架構。這個層面上要掌握的東西就不少了,網絡、存儲、操做系統、web服務器、web架構,安全等等...
  6. 一些基礎理論層面的東西,算法數據結構、編譯原理、網絡基礎...
  7. 數據分析,數據挖掘
  8. 管理層面,衆人拾柴火焰高,一我的再牛b,精力是有限的,若是可以彙集並領導更多的人,那就更全面了。這包括項目管理,持續集成,敏捷開發,版本控制...
  9. 移動開發

若是你是FSD,有什麼想說的呢?歡迎全棧程序員們留言交流程序員

 

程序員能力矩陣

一個挺有意思的程序員能力界定,從程序員能力矩陣轉載:web

注意:每一個層次的知識都是漸增的,位於層次 n,也蘊涵了你需瞭解全部低於層次 n的知識。
計算機科學 Computer Science
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
數據結構 不知道數組和鏈表的差別 可以解釋和使用數組,鏈表,字典等,而且可以用於實際的編程任務。 瞭解基本數據結構時間和空間的折中,好比數組vs 鏈表,可以解釋如何實現哈希表和處理衝突,瞭解優先隊列及其實現。 高等的數據結構的知識,好比B-樹、二項堆、斐波那契堆、AVL樹、紅黑樹、伸展樹、跳躍表以及前綴樹等。
算法 不可以找出一個數組各數的平均值(這使人難以置信,可是個人確在應聘者中遇到過) 基本的排序,搜索和數據的遍歷和檢索算法。 樹,圖,簡單的貪婪算法和分而治之算法,可以適度瞭解矩陣該層的含義。 可以辨識和編寫動態規劃方案,良好的圖算法知識,良好的數值估算的知識,可以辨別NP問題等。
編程體系 不知道何爲編譯器、連接器和解釋器。 對編譯器、連接器、解釋器有基本的瞭解。知道什麼是彙編代碼以及在硬件層如何工做。有一些虛擬內存和分頁知識。 瞭解內核模式vs用戶模式,多線程,同步原語以及它們如何實現,可以閱讀彙編代碼。瞭解網絡如何工做,瞭解網絡協議和socket級別編程。 瞭解整個程序堆棧、硬件(CPU+內存+中斷+微碼)、二進制代碼、彙編、靜態和動態連接、編碼、解釋、JIT(just-in-time)編譯、內存碎片回收、堆、棧、存儲器編址…
軟件工程 Software Engineering
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
源碼版本控制 經過日期備份文件夾 VSS和初級的CVS/SVN用戶 熟練地使用CVS和SVN特性。知道如何分支和歸併,使用程序庫補丁安裝特性等 有分佈式VCS系統的知識。嘗試過Bzr/Mercurial/Darcs/Git
自動化編譯 只知道在IDE下編譯 知道如何編譯在命令行下編譯系統 可以安裝一個腳本構建基本的系統 可以安裝一個腳原本構建系統而且歸檔,安裝程序,生成發佈記錄和給源碼控制中的代碼分配標籤。
自動化測試 認爲全部的測試都是測試員的工做。 可以編寫自動化的單元測試,可以爲正在編寫的代碼提出良好的測試用例。 按照TDD (Test Driven Development)方式編寫代碼。 瞭解而且可以有效自動化安裝,載入/性能和UI測試
程序設計 Programming
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
問題分解 只有直線式的代碼,經過複製粘貼來複用 可以把問題分散到多個函數中 可以想出可複用的函數/對象來解決大題的問題 使用適宜的數據結構和算法,寫出通用的/面向對象的代碼來封裝問題的易改變的層面。
系統分解 N想不出比單一的文件/類更好的層面 若是不在同一平臺或沒采用相同的技術,可以把問題空間和設計方案分解。 可以設計跨技術/平臺的系統。 可以在多個產品線和與外部體系一體化中虛擬化和設計複製的系統。同時也可以設計支持系統監視、報告、故障恢復等。
交流 不能向同伴表達想法/主意。匱乏拼寫和語法的能力。 同伴能瞭解你在說什麼。有良好的拼寫和語法能力。 可以和同伴進行高效的交流 可以使用清晰的方式瞭解和交流想法/設計/主意/細則,能適應每種環境的交流
同一文件中代碼組織 同一文件中組織沒有依據 按照邏輯性或者易接近的方法 代碼分塊和對於其餘源文件來講是易因而釋,引用其餘源文件時有良好的註釋 文檔頭部有許可聲明,總結,良好的註釋,一致的空格縮進。文檔外觀美觀。
跨文件代碼組織 沒夠想過給代碼跨文件組織 相關文件按文件夾分組 每一個物理文件都有獨立的目的,好比一個類的定義,一個特性的實現等。 代碼在物理層組織緊密,在文件名上與設計和外觀相匹配,能夠經過文件分佈方式洞察設計理念。
源碼樹組織 一切都放在一個文件夾內 初步地將代碼分散進對應邏輯的文件夾。 沒有循環依賴,二進制文件,庫,文檔,構建,第三方的代碼都組織進合適的文件夾內。 源碼樹的物理佈局與邏輯層次、組織方式相匹配。能夠經過目錄名稱和組織方式洞察設計理念。
代碼可讀性 單音節的名稱(在國內應該是那些相似用漢語拼音命名的習慣) 對文件、變量、類、方法等,有良好的命名。 沒有長函數、註釋解釋不常規的代碼,bug修復,代碼假設。 代碼假設驗證使用斷言,天然的代碼流,沒有深層嵌套的條件和方法
防護性編碼 不知道這個概念 檢查代碼中全部的參數,對關鍵的假設進行斷言 確保檢查了返回值和使代碼失敗的異常。 有本身的庫來幫助防護性編程、編寫單元測試模擬故障
錯誤處理 只給樂觀的情形編碼 基本的代碼錯誤處理,拋出異常/生成錯誤 確保錯誤/異常留在程序中有良好的狀態,資源,鏈接,內存都有被合適的清理。 在編碼以前察覺可能出現的異常,在代碼的全部層次中維持一致性的異常處理策略,提出整個系統的錯誤處理準則。
IDE IDE大部分用來進行文本編輯 瞭解其周圍的接口,可以高效地經過菜單來使用IDE 瞭解最常操做的鍵盤快捷鍵 編寫自定義宏
API 須要頻繁地查閱文檔 把最頻繁使用的API記在腦子裏 廣闊且深刻的API知識。 爲了使實際任務中經常使用API使用更加便捷,編寫過API的上層庫,填補API之間的缺口。
框架 沒有使用過主平臺外的任何框架 聽過但沒用過平臺下流行的可用框架 在專業的職位中使用過一個以上的框架,通曉各框架的特點。 某框架的做者
需求分析 接受給定的需求和代碼規格 能對規格的遺漏提出疑問 瞭解全面狀況,提出須要被規格化的總體範圍。 可以提出更好的可選方案,根據經驗的浮現給出需求
腳本 不具有腳本工具的知識 批處理文件/shell腳本 Perl/Python/Ruby/VBScript/Powershell 寫過而且發表過可重用的代碼
數據庫 認爲Excel就是數據庫 知道基本的數據庫概念,規範化、ACID(原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durability)、事務化,可以寫簡單的select語句 可以牢記在運行時必要查詢中設計良好的規範化數據庫模式, 精通用戶視圖,存儲過程,觸發器和用戶定義類型。知道彙集與非彙集索引之間的差別。精通使用ORM(Object Relational Mapping對象關係映射)工具 能作基本的數據庫管理,性能優化,索引優化,編寫高級的select查詢,可以使用相關sql來替換遊標,理解數據內部的存儲,瞭解如何鏡像、複製數據庫。知道兩段數據提交如何工做
經驗 Experience
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
專業語言經驗 命令式語言和麪向對象語言 命令式語言,面嚮對象語言和說明型語言(SQL),若是瞭解靜態類型vs動態類型,弱類型vs強類型則有加分 函數式語言,若是瞭解延緩求值,局部套用函數,延續則有加分 併發語言(Erlang, Oz) 邏輯語言(Prolog)
專業平臺經驗 1 2-3 4-5 6+
專業經驗年齡 1 2-5 6-9 10+
領域知識 沒有該領域的知識 在該領域中曾經至少爲一個產品工做過 在同一領域中爲多個產品工做過 領域專家。在該領域設計和實現數種產品/方案。精通該領域使用的標準條款和協議
學識 Knowledge
  2n (Level 0) n2 (Level 1) n (Level 2) log(n) (Level 3)
工具知識 僅限於主要的IDE(VS.Net, Eclipse等) 知道一些流行和標準工具的備選方案 對編輯器、調試器、IDE、開源的備選方案有很好的瞭解。好比某人瞭解大多數Scott Hanselman的威力工具列表中的工具,使用過ORM工具。 實際地編寫過工具和腳本,若是這些被髮布則有加分
語言接觸 命令式語言和麪向對象語言 命令式語言、面嚮對象語言和說明型語言(SQL),若是瞭解靜態類型vs動態類型、弱類型vs強類型則有加分 函數式語言,若是瞭解延緩求值、局部套用函數、continuations (源於scheme中的一種高級控制結構)則有加分 併發語言(Erlang, Oz) 邏輯語言(Prolog)
代碼庫知識 歷來沒有查詢過代碼庫 基本的代碼層知識,瞭解若是構建系統 良好的代碼庫工做知識,實現過幾回bug修復或者完成了一些細小的特性 實現了代碼庫中多個大型特性,可以輕鬆地將多數特性的需求變動具體化,從容地處理bug修復。
下一代技術知識 歷來沒據說過即將到來的技術 據說過某領域即將到來的技術 下載過alpha preview/CTP/beta版本,而且讀過一些文章和手冊 試用過預覽版並且實際地構建過某物,若是共享給其餘人的話則有加分
平臺內部 對平臺內部毫無所知 有平臺基本的內部工做的知識 深度的平臺內部知識,可以設想平臺如何將程序轉換成可執行代碼。 編寫過加強平臺或者爲其平臺內部提供信息的工具。好比,反彙編工具,反編譯工具,調試工具等。
書籍 菜鳥系列,21天系列,24小時系列,蠢貨系列... 《代碼大全》,《別讓我思考》, 《精通正則表達式》 《設計模式》,《人件》,《代碼珠璣》,《算法設計手冊》,《程序員修煉之道》,《人月神話》 《計算機程序設計與解釋》,《事務處理:概念與技術》,《計算機程序設計模型》,《計算機程序設計藝術》,《數據庫系統導論》 C.J Date版,《Thinking Forth》 ,《Little Schemer》(沒找到其中譯本)
博客 聽過可是歷來抽不出空去接觸 閱讀一些科技/編程/軟件工程的博客,而且常常的收聽一些播客 維護一些博客的連接,收集博主分享的有用的文章和工具 維護一個在編程方面,分享有我的看法和思考的博客
相關文章
相關標籤/搜索