這是一系列高贊文章,詳細介紹了前端、后端、DevOps 的路線圖,在 Github 上也是一個高星項目。
現(xiàn)在的 Web 開發(fā)與幾年前完全不同。有很多新東西讓剛進入 Web 領域的開發(fā)人員感到很困惑。這也是我決定逐步制作這個直觀的指南來展示 Web 概況的原因之一,可以讓任何人都清楚他在 Web 開發(fā)中所處的角色和必備的條件。
大約一周前,我發(fā)布了一篇文章:如何成為一名前端工程師,我在里面承諾會發(fā)布 Backend 和 DevOps 相關的路線圖,這篇文章將實現(xiàn)這個諾言,是關于現(xiàn)代后端開發(fā)人員的。
在這之前,后端路線圖只是對技術的全面介紹、推薦,沒有遵循明確的順序,類似于之前的前端路線圖,提供了分步指南,讓你對此有一個更好的了解。
我們還在寫 DevOps 相關的路線圖,希望下周能夠發(fā)布,同時會發(fā)布相關文章,這里是我們存放這些項目的倉庫。

事不宜遲,讓我們開始吧。你可以在下圖中找到詳細的路線圖,但我也會在下文中解釋說明相關步驟。

我們將對其進行分解,并對每個步驟做詳細說明。
在此之前,盡管上圖中沒有列出 html/css 相關的知識,還是建議你至少了解一些相關知識并懂得如何編寫一些基本的 HTML/CSS。
Step 1:學習一門語言
語言有很多種選擇,這里我將它們分為幾類,以方便你做選擇,對于剛開始進行后端開發(fā)的初學者,我建議你選擇任何一種腳本語言,因為有很多需求需要用到它們,而且腳本語言容易快速入門。如果你有一些前端知識,則可能發(fā)現(xiàn) Node.js 更加容易,且有巨大的就業(yè)市場。
如果你使用某種腳本語言做后端,則建議你不要選擇其他的腳本語言了,而是選擇其他函數(shù)式或多范式語言。例如,你已經在使用 php 或 Node.js,不要再使用 Python 或 Ruby,而應該嘗試使用 Erlang 或 Golang。這樣能夠幫你拓寬思路和視野。
Step 2:練習你所學的東西
沒有比練習更好的學習方法了,一旦你對所選的語言有一定的概念和基礎了解,就可以開始使用了,盡可能多地寫一些小型程序,這里有一些建議供你參考:
- 實現(xiàn)一些自己用過的 Bash 命令,比如 ls 功能
- 編寫一個命令,獲取 Reddit 上有關 r/programming 的帖子,并以 JSON 格式保存
- 編寫一個命令,將目錄結構以 JSON 格式進行保存,比如: 執(zhí)行 jsonify dir-name 可以保存 dir-name 文件目錄結構
- 編寫一個命令,讀取上面保存的 JSON 目錄結構,并新建一個類似的文件目錄
- 考慮你每天要做的一些任務,并嘗試用代碼進行自動化
Step 3:學習使用軟件包管理
在了解該語言的基礎知識,編寫一些示例程序之后,接下來應該學習如何使用這門語言的包管理軟件。包管理可以讓你使用外部代碼庫,或者分發(fā)你的庫文件給其他人使用。
如果你選擇 PHP,則必須學習 Composer,Node.js 則需要學習 npm 或 yarn,Python 則是 pip,Ruby 則是 RubyGems,無論你選擇哪種語言,都需要學習相關的包管理軟件。
Step 4:相關標準和最佳實踐
每種語言都有自己的標準和最佳實踐,根據(jù)你選擇的語言學習這些標準和實踐。例如,PHP 的 PHP-FIG 和 PSR,Node.js 的社區(qū)指南,其他語言也是如此。
Step 5:安全
確保你閱讀了安全相關的最佳實踐,建議你閱讀 OWASP(Open Web Application Security Project) 指南,了解不同的安全問題,以及你選擇的語言如何解決這些問題。
Step 6:練習
在你了解了語言、標準、最佳實踐、包管理和安全相關的基礎知識之后,開始創(chuàng)建一個軟件包,并將其分發(fā)出去(確保你遵循了相關標準和最佳實踐)。例如,如果選擇了 PHP,則將其發(fā)布到 Packagist 上,如果選擇了 Node.js 則發(fā)布到 npm 倉庫中,以此類推。
在你完成這些步驟之后,可以在 Github 上搜索一些項目,嘗試發(fā)一個 PR(pull request):
- 用你所學的最佳實踐重構一部分代碼
- 看看項目中的 open issues,嘗試解決
- 為項目添加一個拓展功能
Step 7:學習如何進行測試
有幾種不同的測試模式,了解這些模式的目的是什么。從現(xiàn)在開始就了解如何在應用程序中編寫單元測試和集成測試。另外,你需要了解一些測試術語,比如 mocks、stubs。
Step 8:實踐
為目前已完成的任務編寫單元測試,尤其是 Step 6 中的任務。
學習如何計算代碼的測試覆蓋率。
Step 9:學習關系型數(shù)據(jù)庫
了解如何將數(shù)據(jù)持久化到關系型數(shù)據(jù)庫中,在繼續(xù)學習之前,先了解相關數(shù)據(jù)庫術語,例如:鍵、索引、規(guī)范化、元組(tuples)等。
這里有幾種數(shù)據(jù)庫供選擇,不過你學會了一個,學習其他數(shù)據(jù)庫應該很容易。如果你想學的 MySQL、MariaDB(Mysql 一個分支)、PostgreSQL,可以先從 Mysql 入手。
Step 10:練習時間
是時候實際應用你所學的知識了。
用目前所學的內容創(chuàng)建一個簡單的應用程序。隨便挑一個 idea 進行實現(xiàn),比如創(chuàng)建一個簡單的博客,實現(xiàn)如下功能:
- 用戶賬號:登陸和注冊
- 注冊者可以發(fā)布一個帖子
- 用戶可以查看他所發(fā)布的所有帖子
- 他們可以刪除自己的帖子
- 確保用戶只能看到自己發(fā)布的帖子,不能看到其他人的
- 為這個應用編寫單元測試和集成測試
- 為這些查詢服務做索引,分析這些查詢索引,確保已經使用了索引優(yōu)化
Step 11:學習一個框架
根據(jù)項目和所選的語言,你可能需要一個框架,不同語言有不同的選擇,請根據(jù)所選語言和適用范圍進行選擇。
如果你選擇 PHP,我建議你使用 Laravel 或者 Symfony,對于微框架,建議你使用 Luman 或者 Slim。如果你選擇 Node.js,則有不同的選擇,不過最主要的是 Express.js。
Step 12:練習時間
為了完成這個步驟,你必須確保完成了步驟 10 的內容,以及選擇了特定框架,實現(xiàn)相關測試。
Step 13:學習一個 NoSQL 數(shù)據(jù)庫
首先了解 NoSQL 數(shù)據(jù)庫是什么,和關系型數(shù)據(jù)庫有什么不同,以及為什么需要它們。有幾種不同的數(shù)據(jù)庫可供選擇,先稍微研究一下,對比它們之間功能和差異。常見的 NoSQLogic 數(shù)據(jù)庫有:MongoDB、Cassandra、RethinkDB 和 Couchbase。如果你想選一個,可以先從 MongoDB 入手。
Step 14:緩存
了解如何在程序中實現(xiàn)應用級的緩存。了解如何使用 redis 或 Memcached,以及如何在 Step 12 中構建的應用程序內實現(xiàn)緩存。
Step 15:創(chuàng)建 RESTful API
閱讀 Roy Fielding 的論文中有關 REST 的部分,了解 REST 概念,并學習如何開發(fā) RESTful API,如果別人說 REST 只適用于 HTTP API,你要能與之辯論。
Step 16:學會不同的授權方法(Auth Methods)
你應該了解身份驗證和授權方法,它們是什么,有何不同以及何時應該優(yōu)先選擇哪種?
- OAuth - Open Authentication
- Basic Authentication
- Token Authentication
- JWT - JSON Web Tokens
- OpenID
Step 17:消息中間件
了解消息中間件,以及何時如何使用它們,這里有多個選擇,不過比較突出的就是 RabbitMQ 和 Kafka。如果你想選擇一個,可以從 RabbitMQ 入手。
Step 18:搜索引擎
隨著應用增長,關系型數(shù)據(jù)庫和 NoSQL 數(shù)據(jù)庫的簡單查詢功能以及不能滿足應用需求,你不得不使用搜索引擎,上圖有幾個選項,每個選項都有自己的差異。
Step 19:學習使用 Docker
無論是生產環(huán)境還是鏡像環(huán)境,保持一致的操作系統(tǒng)(類型、版本)可以加快編碼、測試或部署速度,Docker 可以幫你實現(xiàn)這部分工作,極大提高開發(fā)效率,在這個步驟中你需要學習如何使用 Docker。
Step 20:Web 服務器相關知識
如果你已經到了這一步,之前的步驟中你可能就需要 Web Server 相關的知識了。這個步驟主要是了解不同 Web 服務器直接的差異、限制和不同的可選配置選項,以及如何利用這些限制來優(yōu)化編碼。
Step 21:學會如何使用 Web Sockets
雖然這部分不是必須的,但在學會相關的知識是有益的。了解如何使用 Web Socket 實現(xiàn)實時 Web 服務,并實現(xiàn)一個簡單的程序。你可以在上面的博客應用程序中使用 Web Socket 來實時更新文章列表。
Step 22:學習 GraphQL
學習如何使用 GraphQL 開發(fā) API,了解它和 REST的差異,以及為什么 GraphQL 被稱為 REST 2.0
Step 23:學習圖數(shù)據(jù)庫(Graph Databases)
圖模型可以以一種非常靈活的方式來處理數(shù)據(jù)中的關系,圖數(shù)據(jù)庫提供了快速、有效的存儲、檢索、數(shù)據(jù)查詢的方式,了解如何使用 Neo4j 或 OrientDB。
Step 24:保持探索精神
在你學習和練習的過程中肯定會遇到本文路線圖中未涵蓋的內容,保持開放的心態(tài)學習新事物。
記住關鍵是盡可能多地練習,一開始可能比較困難,你覺得自己什么都沒有掌握,但這是正常現(xiàn)象,隨著時間流逝,你會覺得自己越來越好。