全棧修煉之路,很漫長…

雖然目前並沒有對全棧工程師有一個具體的定義,不知道自己是否合格。

大勢所趨的全棧開發。首先你能夠配置全站開發的環境和工作流程,操作數據庫,建立後端服務API,獨立開發前端,從而開發一個包含前後端的完整應用,再進行測試和部署,直至產品正式上線。

全棧開發是所有Web開發者的終極夢想,無論你現在是前端開發還是後端開發。並且隨着大量開發者的湧入,前端和後端崗位都面臨者激烈的競爭,全棧已經不是加分項,越來越成爲必須項。

終極指南

全棧 Web 開發人員是能夠工作在應用程序的前端和後端的開發人員。前端通常是指應用程序中用戶將看到或交互的部分,後端是應用程序中處理邏輯、數據庫交互、用戶認證、服務器配置的部分。全棧開發並不意味着你已經掌握了前端和後端工作所需的一切,而是意味着你可以在雙端工作並理解構建應用程序時發生的情況。

在Web與軟件開發的世界中有3個基本的關注點:前端、後端與全棧。我們先來看一下他們的含義。

何爲全棧工程師?

前端工程師:

在打開一個網站時,屏幕上的一切都屬於前端。前端工程師負責創建用戶界面背後的代碼。這些工程師不僅要熟悉HTML、Java與CSS,還要掌握很多框架。這些框架有Foundation、Angular JS、Ember JS、Backbone及Bootstrap等等。前端工程師要與設計師和其他專家協同工作,從而將網站從模型轉換爲可使用的模式。

後端工程師:

在你每天所訪問的網站背後有服務器網絡、數據庫以及各種應用,他們相互協作將你所請求的網頁與數據傳遞給你。後端工程師負責構建這些組件。

他們要擅長各種編程語言,如Python、.Net、Ruby、Java及PHP等等,從而通過這些語言來編寫程序。他們還需要使用各種數據庫程序如MySQL、SQL Server及Oracle等來操縱信息並將其傳遞給最終用戶。後端工程師需要與組織中的各種經理及其他成員通力配合來完成工作。

全棧工程師:

全棧工程師既要了解後端開發,也要了解前端開發。他們是“全方位”的工程師,熟悉服務端的同時又懂客戶端用戶體驗。全棧工程師理解Web開發進程的每一個方面,同時又會就整體策略與最佳實踐對相關干係人提出建議與指導。

角色演變

在早期的桌面計算時代,我們常常會看到一個人就完成了整個應用的開發工作。隨着程序變得越來越複雜,以及越來越多的技術湧現了出來,一個人很難再完全掌控應用開發的各個方面。

在21世紀初期,一些擁有專業化技能的專家開始出現。由於複雜性的持續攀升,當Web 2.0站點開始出現時,很多程序員又回到了更簡單的方式上來。相比於構建複雜的數據庫和企業計算網絡,開發者開始部署穩定的LAMP棧(Linux、Apache、MySQL與PHP),並創建出了靈活的面嚮對象語言,如Django與Ruby on Rails。在這種環境下,全棧工程師的價值變得越來越大,因爲他們熟悉大多數現代框架與語言。

運維複雜性的迴歸

不過,由於移動計算與iOS和Android平臺的興起,我們又回到了複雜性的新時代:低成本的雲服務器如Amazon Web Services和微軟的Azure、MongoDB等數據庫、Node.js與Angular.js等前端技術、Docker等容器技術。這些平臺、服務與框架都擁有自身的特性。因此,一個人幾乎無法成爲能夠掌握所有技術的全棧工程師。

通才與專才

在當前的環境下,成爲全棧工程師的好處在於沒多少人擁有足夠的知識、經驗與溝通能力來整體把控使用了各種平臺與框架的項目,如HTML5、機器學習及Scala等。因此,高水準的全棧工程師總是供不應求的。

不過,壞處則在於對於全棧工程師來說,他需要能夠熟練掌握這些組件,但這是非常困難的事情,況且未來還會有新的技術湧現出來。你可能很聰明,但這些組件本身卻是非常複雜的,每幾個月都會出現新的語言和平臺。要想時刻保持技術上的領先是一件極其困難的事情。出於這個原因,專才擁有自己獨特的優勢。組織傾向於僱傭專門的角色,因此相比於其他開發者來說,專才在深層次的知識以及某個狹窄領域的經驗上會更勝一籌。

全棧工程師的前景

無論選擇在前端還是後端進行深入學習,抑或是將自己定位成一個全棧的通才,從工作前景上來看都是好的。以北京爲例,2017年北京全棧工程師的平均收入爲20K,但是仍有75%的用戶覺得此數據偏低。

從簡單的雛形到完美的成品,全棧工程師通常被認爲是萬能多面手,那全棧工程師到底做什麼呢?

全棧工程師需要哪些技能

爲了在激烈的市場競爭中佔據一席之地,全棧工程師需要不斷學習各方面技能,主要包含以下方面:

服務器管理/DevOps

程序員必須具備基本的服務器管理能力,包括並不限於以下知識:

1.在非GUI環境中,通過終端連接遠程服務器2.會寫Shell腳本編程3.服務器上的用戶和羣組管理4.管理Apache和Nginx等服務器程序來提供應用5.管理防火牆和權限6.安裝及更新軟件

除了這些基本功,程序員還需要懂得如何通過Docker或虛擬機來創建完善的、運行良好的獨立開發環境;以及熟練操作版本控制系統,以便可靠地生成備份和可共享的協作代碼庫,來根據時間追蹤代碼變化。

雲端/Cloud

除了物理服務器與虛擬服務器外,全棧工程師還需要了解雲端,例如Google Cloud、Azure、AWS等。

雖然很多工具或平臺可能不會立即應用,但長遠看來,熟悉每個人都在討論的服務可能會派上大用途,客戶可能隨時要求更換服務端,所以需要早做準備。

(未來可能出現Serverless無服務器端,直接租用計算和函數即可實現各種應用)

後端/Back-end

除了需懂得選擇哪種語言,還應該熟悉:

1.與運維緊密相關的Web服務器,如Nginx和Apache2.NodeJS會將Java,CSS編譯爲靜態文件,用PHP可以避免NodeJS的問題3.依賴管理工具的使用,比如PHP中的Composer4.良好的API設計,當前大多數網站是基於API的,很少有獨立的前端交互5.對性能提高非常重要的搜索引擎使用6.用Gearman類工具,Crunz等庫進行Cronjobs及後臺作業7.緩存技術非常重要,使用Varnish,Redis或其他工具分片存儲數據

後端語言比較

後端語言是前端跨向全棧最大的一個障礙,也是必須拿下的障礙。不像前端Javascript獨霸天下,後端語言是百家爭鳴:PHP、Python、Ruby on rails、Node.js等腳本型語言,也有Java、C#(.net)等重量級語言,也有的Go、Erlang等。語言無所謂好壞,有各自的風格和適用範圍。

沒有哪種語言絕對的好或者差,具體要看公司的業務和自己的偏好,最重要的在於你怎麼運用它。正所謂弱水三千,只取一瓢飲,後端語言千千萬,選擇一門先學好,比那個都懂一點要強很多——貪多嚼不爛。

數據庫/Database

除了需掌握架構穩定的關係型數據庫,如MySQL , PostgreSQL,一個全棧工程師還應該對非關係型數據庫熟練應用,如MongoDB, Redis, Cassandra,更不用說Neo4j這樣的圖形數據庫了。

數據庫是在服務器上的,需要全棧工程師的控制,同時也存在遠程解決方案,比如Mongo類的RestDB或Google的Firebase等。

前端/Front-end

說到前端,技術棧可能比較混亂。作爲一個全棧工程師,你需要了解:

1.NodeJS和 NPM2.Yarn3.預處理器和編譯器(如Babel),用來編譯 Type, ES6, LESS, SCSS, SaSS4.構建和任務執行工具,如 Grunt和 Gulp5.框架,如 VueJS、React、Angular6.模塊打包工具,如 Webpack、Browserify、Rollup

設計/Design/UI/Web交互

開發者需要知道產品在轉爲可用的HTML、CSS代碼前應如何畫原型,然後用Java進行交互,在後端用虛擬數據做模擬測試,只有當原型圖完成,用戶體驗和交互界面設計完成,產品纔可以開始真正的開發。所以設計本身就是非常巨大的挑戰,需要使用一套特殊工具:

1.Photoshop ,Illustrator或一些開源工具如 Gimp , Inkscape等。2.好用、快速的編輯器,比如 Atom或 Sublime Text3.背景選擇器,如Subtlepatterns和匹配顏色的顏色選擇器4.CSS的柵格系統5.用於Java模擬的相關知識6.把原型圖放到網上供用戶查看和反饋的方式,比如Ngrok

日誌

爲了有效的監控應用的健康度,開發者需要追蹤錯誤,找到這些日誌並找出其中有價值的信息,還需要預測一些趨勢,比如需要注意CPU及I/O佔用率的上漲,以防服務器突然崩潰。這些和運維有一定聯繫,也需要掌握更多專門的技能

移動端

最後說到移動端,隨着 iOS和安卓的webview變得越來越高效,以及PWA(漸進式web應用)的到來,原本的應用逐漸不再流行,因爲他們開發起來過於複雜。所以一個全棧工程師必須瞭解 PWA或 React Native,或Native、Tabris、Cordova、Phonegap等好技術開發出基於API的客戶端。

DevOps 和部署

當你學會了後端語言和數據庫,你可以開發一個完整的系統了。但是離正式向公衆發佈你的產品還差一個非常重要的環節——測試和部署,主要要注意幾個方面:

選擇後端平臺:國內較爲知名的服務商有阿里雲、騰訊雲、百度雲、七牛雲、網易蜂巢等;

選擇部署平臺:Nginx、Apache、Linux、SSH、Git,不同的後臺服務器系統適應不同的情況,配製方法也不同;

測試和修改Bug :包括單元測試、集成測試、函數式測試、系統測試,必要時進行內測,以便在正式發佈前發現系統的問題。

可能要用到的還有可視化配置方面:Docker, Vagrant;

其他設置:CDN加速等。

全棧工程師修煉手冊

全棧並不是毫無章法的遍地開花,好的學習計劃與方法可以事半功倍,以下是筆者總結的幾點經驗:

一到多再到一

從編程入門開始,先花一至兩年時間熟練掌握一門主流的編程語言。這個階段的目標就是一個紮實的基本功,包括程序中的基本概念,例如值與引用,變量的作用域,對象與類,常用數據結構與算法等等。一旦基礎紮實了,接下去的三年左右時間就要從一到多,迅速擴衝你的技能池。要做到快速學習,第一項要領就是讀技術資料時要學會跳讀。因爲很多的技術有相通之處,學習一項新技術,只需學習它與你已掌握的技術之間的 diff 就行了。當你有了一定的技術儲備之後,一到兩天內學會一門新的語言與框架其實並不難。這個階段的另一個要領是 20/80 原則,也就是用 20% 的時間來了解一項技術中 80% 的基礎內容,將剩下最難啃的 20% 留在將來需要深挖時再研究。

那爲什麼最後還要再回到一呢?當你有了足夠的技術廣度之後,你對技術的洞察力與理解力都會提升一個層次,這使你能更準確地發現適合自己且有前途的技術領域。與初入行時的隨大流不同,你此時的選擇是經過深思熟慮,爲自己量身定製的。在接下去的時間裏重點深挖一個或少數幾個領域,這樣在俱備了技術廣度的同時,你也擁有了自己的殺手鐗,個人價值會再次大幅提升。

任務導向

所謂任務導向就是一切學習都應該以輸出爲目的。僅憑興趣學習,往往是低效的。比如你的公司要做一款移動應用,初期的流程是開發 -> 上線 -> 運營,對應的技術能力就是前後端開發,自動化運維,數據平臺與用戶分析。當用戶數到達一定體量以後,就需要高可用架構,推薦算法等技術。你技術學習的脈絡應該順應業務的發展,這樣纔有機會學以致用。

那如果你身在大公司,又該怎麼做呢?有些大公司提供輪崗的機會,比如我之前在Google,公司每18個月提供一次換崗機會。可以藉此擴展你的技能池,要好好利用。在選擇下一個崗位時,應保持一種連續性,比如從前端開發轉後端開發,從開發部門轉運維或是數據部門等。

不過總體來說,全棧工程師與創業公司或是發展期公司纔是最佳組合。

移花接木

學技術要了解其思想,而不要留於表面形式。優秀的技術思想會從它的發源地流向其他領域。例如,

  • 前端的MVC結構在後端一樣適用。
  • 當你理解了 Java 的 Annotation 以後,再看 Python 的 Decorator 就會覺得非常熟悉(儘管兩者的實現方式完全不同)
  • 當編譯語言用類型推斷(Type Inference)去除類型聲明的同時,腳本語言卻在用類型提示(Type Hint)添加類型聲明。
  • 不可變(Immutable)的思想始於函數式編程,但可以用於運維(Immutable Infrastructure),也可以用於大數據管理(Functional Data Engineering)。
  • 運維的核心是對各類服務器數據的監控與報警,同樣的理念也可以用於產品與運營數據。

技術之間的聯繫,有些是顯而易見的,有些需要你沉澱思考。真正的全棧工程師可以用一個技術領域的思想,去解決另一個技術領域的問題。再舉一個我公司的例子,在學習用 Ansible 做運維時,發現它的 playbook 不是用腳本語言而是用 YAML 來寫的,這讓我意識到原來 YAML 不僅可以用來描述數據,也可以用來描述邏輯關係。這個思想後來被用在我們很多的項目中,比如在設計數據產品的報表時,各種指標的計算,包括指標之間的依賴與派生關係都是直接在 YAML 中定義的,主體程序不涉及任何業務邏輯,僅僅是解析與執行這些 YAML 文件。

所以我建議在學習技術時,多做一些交叉領域的思考,這會使你在提升技術廣度的同時,加強你的技術思維。

層次切換

記得以前剛進 Google 時,聽的第一個內部講座就是 Life of a Search Request,講從用戶輸入一個搜索關鍵詞到得到結果的整個過程,這個過程涉及瀏覽器,TCP/IP的網絡傳輸,後臺的 Web 服務集羣,索引數據庫羣等等。對於你公司的業務,你是否能清楚地描述從用戶輸入到產生結果的整個週期?對於每一個環節,你又能深入細節到什麼程度?

有次和公司的CEO聊天,他說他衡量一個產品經理的能力時,會看這個人能否從產品細節到長期戰略之間的各個層次來回切換。我覺得衡量一個全棧工程師能力也是類似的,看他是否在瞭解系統的全貌的同時,又能深入到單個模塊的細節。當系統遇到真正棘手的難題時,就非常考驗技術人員在各層次之間切換的能力。就如同玩競技類遊戲,只有同時擁有良好大局觀與精湛微操作的選手,才能成爲頂尖高手。

在學習全棧的路上,不但要試着橫向地切換層次(前臺,後臺,運維),也要嘗縱向地切換層次,除了寫業務代碼之外,向下瞭解一些框架的底層運行機制,讀一讀它們的源碼。向上學習一下系統設計與分佈式架構。你可能會覺得什麼都學會不會精力太分散?我覺得並不會,只要你順着一條合理的脈絡去學(任務導向),花三到五年的時間迅速延展你的技術廣度是非常值得的。這會使你比同齡人更具競爭優勢。目標要定得高,實踐時量力而爲。

全棧修煉入門級套餐

每個人的技術學習路線可能都不太一樣,這也是爲什麼這篇文章着重講的是方法而不是具體的學習內容。不過對於剛進入移動互職網開發的新人,我可以推薦一個全棧學習的新手包。編程語言方面,可以優先去學習以下語言

  • Java
  • JavaScript
  • Python
  • SQL
  • Swift (如果不做 iOS 開發,可以不學,不過現在都是多端一體)

Java 不但可以寫 Android 應用,也是目前大部分國內公司的後端主力語言,在分佈式系統與大數據平臺方面的生態圈非常完整,所以即使你公司不用 Java 也應該學。

寫前端,JavaScript 是必備技能,要掌握一個主流前端框架,建議學 React。這是一個非常出色的框架,生態圈成熟,適用性廣,在有了 ReactNative 加持之後還可以做移動應用開發。另外,在熟悉了 JS 之後,也可以用 NodeJS 來寫後端。

Python 也是個全能型語言,如果之後要做自動化運維,大數據分析與機器學習,Python 在這些方面優勢明顯。國外有很多公司用 Python 寫後端,國內相對少些,但對創業公司而言,用 Python 做大後端的主力語言(業務後端 + 運維 + 數據分析)其實是個不錯的選擇。

學 SQL 前期是爲了研發與上線時的數據庫查詢與管理,後期是爲了數據分析與商業智能。即使目前各數 NoSQL 百花齊放,但傳統的關係型數據庫,如 MySQL 或是 PostgreSQL,勢頭依然強勁 。而在大數據端,各類的數據倉庫與數據計算框架都會提供類 SQL 的接口。在較小的公司裏,開發人員還經常兼做數據分析師。所以我認爲熟練掌握 SQL 是對全棧工程師一項基本要求。

除了這些編程語言外,另一部分就是了解運維的基礎知識,包括 Linux 命令行,Docker,以及各類常用的基礎服務與數據庫,如 Nginx,MySQL,Redis,MongoDB 等。

有了這些技術基礎之後,你對於一個移動應用的系統全貌,就有了大致的瞭解。可以再根據公司實際的業務情況,選擇進一步學習的內容。

看完上述技能要求,全棧工程師是否仍然吸引着你?

需要注意的是其實大多數全棧工程師並不是精通所有技術,也會在某些方面有所偏重,畢竟每個人的時間與精力都是有限的。全棧開發工作可能無法使人成爲某一領域的專家,但卻能讓人很好的瞭解整個產品流程、項目需要的全部技術、以及對項目有更高層面的理解。

如果想要向着全棧工程師的方向邁進,你應該掌握很多知識與技能,並且熟悉上面提到的各種組件。此外,還要提升自己的個人溝通技能,這樣才能管理並與前端與後端開發者實現較好的協作。

好消息是未來對於每一類Web開發者來說都是光明的,無論是前端、後端,還是全棧。要堅持學習一切有價值的東西;掌握新的框架、語言與平臺;並且與開發者同事及最終用戶保持高效的溝通。在這種情況下,無論世界發生什麼變化,你都會始終立於不敗之地。

全棧適合你嗎?

在開始之前,這是你該問自己的第一個問題。因爲全棧只是一種選擇,你也可以選擇朝垂直領域專家的方向努力。如果你已經有自己的答案,那就跟隨你的意願去做。如果你在猶豫,那麼讓我來問你幾個問題

第一個問題,你現在在大公司還是創業公司?將來又想去哪兒呢?雖然沒有絕對,但在創業公司,你可以迅速鍛鍊全棧的能力。而大公司有更多的機會深入研究某個領域的問題。特別是對於運維和大數據方面,大公司有得天獨厚的優勢,許多挑戰與經驗是創業公司無法提供的。

第二個問題,你將來是否想成爲一個管理者?現在很多公司提供了 dual-stack,就是說管理線與技術線是並行的,要走哪條路你自己選。我的建議是,如果你希望將來轉管理,在做技術的時候,廣度比深度更重要,也就是說你更應該往全棧方向發展。管理者到一定層次都需要對項目負責,而任何一個典型的互聯網項目,前後端開發、線上部署、數據分析,這些部分都缺一不可。擁有全棧的知識,你就可以對項目與團隊有更好的把控力。

第三個問題,首席科學家與首席架構師,哪個更吸引你?如果你不走管理線,繼續走技術線,那前面兩個選擇基本就是你發展的目標。如果你選架構師,那你就更適合往全棧發展。其實架構師也是一個管理者,只是他管的不是人,而是一個個技術模塊。架構師的功力體現在如何選取最適合的模塊,並讓它們之間無縫連接。所以你的技術知識面越寬廣,你可設計的版圖就越大。

最後一個問題,你在學生時代是否偏科?開半個玩笑,我想說的是人要學會從自己的過去總結經驗。偏科可能預示着你更適合鑽研一項技術而不適合全面發展,或許有一天你就能成爲某個領域的大牛,不也是好事一樁?

除去個人的偏好外,你也要關注時代的趨勢。這是個開了變速齒輪的時代,短短几年間,技術的熱點一直在變化,從移動開發,到大數據、雲計算、人工智能、VR,再到深度學習,區塊鏈。身上不多背幾項技能,可能沒幾天就被淘汰了。但到最後“能否快速掌握一項新技術”或許纔是唯一不會被淘汰的技能。而在成爲全棧工程師的道路上,你可以很好地鍛鍊這項終極技能。

小結

全棧的路很慢長,也很有趣,祝大家成功!今天的分享就到這裏,歡迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章