經歷了網絡互聯的 Web 1.0 時代、社交的 Web 2.0 時代、基於移動的 Web 3.0 時代,如今的我們正逐步邁向知識分配的 Web 4.0 時代。與此同時,隨著人工智能的興起,聊天機器人和會話式 UI 也開始滲透 Web 領域,所以說,現在的 Web 開發已經和幾年前完全不一樣了。
當面對日新月異的技術、錯綜複雜的網站時,新入行的開發者很容迷失方向。以下這篇指南,展示了後端開發的全景、運維的趨勢,希望給從事 Web 開發的程序員們一個清晰的概念,去其糟粕取其精華。
以前,後端的路線圖只是一些平鋪的技術介紹,而無法給出任何有關趨勢的方向。而在這篇文章中,有詳細的後端學習路線圖,可助前行路上的開發者一臂之力。廢話不多說,現在就開始吧。
接下來,我們將一步步來解釋一下這張圖。
開始之前要說明一點,雖然我們在圖中沒有列出 HTML/CSS 的知識,但建議你至少懂得一點,並會寫一些基本的 HTML/CSS。
▌學一門語言
選擇語言時總是會遇到無數種選擇。我把語言按照類別分開,以便你作出決定。對於剛剛進入後端開發的初學者,我建議選任何一種腳本語言,它們的市場需求都很大,因此你可以迅速進步。如果你有前端知識,Node.js 會很容易,而且工作機會也很多。
如果你已經在從事後端開發,並且會某種腳本語言,我建議你不要再選另一種腳本語言,而是從“函數式”(Functional)或“多重編程”(Multiparadigm)中選擇一種。例如,如果你會 PHP 或 Node.js,那就別再學 Python 或 Ruby,而是嘗試下 Erlang 或 Golang。這樣能開闊你的思維和視野。
▌練習學到的知識
學習知識的最佳途徑就是練習。選好語言並瞭解一些基本概念之後,就應該學以致用,用它多做一些小應用。下面是一些建議:
- 實現一些常用的 bash 命令,例如實現 ls 的功能;
- 寫個命令從 reddit 的 /r/programming 上以 JSON 格式獲取並保存文章;
- 寫個命令以 JSON 格式返回目錄結構,例如 jsonify dir-name,返回一個 JSON 文件,內容是 dir-name 下的目錄結構;
- 寫個命令讀取上一條的 JSON 文件並創建目錄結構;
- 想一想每天要做的任務,並嘗試自動化。
▌學習包管理器
理解語言的基礎知識並做了一些簡單的應用後,可以學一下那門語言的包管理器如何使用。包管理器可以幫你在應用中使用第三方庫,還可以把你的庫發佈給其他人使用。
- 如果你選了 PHP,可以學一學 Composer;
- 選了 Node.js 可以學習 NPM 或 Yarn;
- 選了 Python 可以學一學 Pip;
- 選了 Ruby 可以學一學 RubyGems。
不論你選和種語言,都應該去學學相應的包管理器。
▌標準做法和最佳實踐
每種語言都有標準做法和最佳實踐。學一學你選擇的語言的這些知識。例如, PHP 有 PHP-FIG 和 PSR。Node.js 和其他語言都有許多社區主導的規範。
▌安全性
務必要讀一讀有關安全性的最佳實踐。閱讀OWASP(https://www.owasp.org/index.php/Main_Page)的規範,理解各種安全問題,以及如何在所選語言中避免這些問題。
▌練習
現在你已經瞭解了語言的基本知識、標準做法和最佳實踐、安全信息,以及如何使用包管理器。現在可以去創建一個包,並把它發佈給其他人使用了。在這個過程中要時刻遵循你學到的標準和最佳實踐。例如,如果你選了 PHP,你就應當在 Packagist 上發佈。選擇了 Node.js,就應該在 Npm 上發佈等。
完成這一步之後,可以在 Github 上找一些項目,然後試著建一些 pull request。一些建議:
- 重構代碼,實現你學到的最佳實踐;
- 尋找 Bug 並試圖解決;
- 增加新功能。
▌學習測試
測試有好幾種類型。要理解這幾種類型的測試,以及每種測試的目的。不過,可以從給你的應用編寫單元測試和集成測試開始。同時,還要理解各種測試的術語,如 mock、stub 等。
▌實踐
作為練習,可以為你之前的項目寫一些單元測試,特別是給第 6 步做好的那些項目。
還要學習並計算你寫的測試用例的覆蓋率。
▌學習關係型數據庫
學習如何在關係型數據庫中永久保存數據。在選擇要學習的數據庫之前,要先理解各種數據庫術語,如鍵、索引、正規化、元組等。
學習數據庫有好幾種選擇。不過,學完其中一個數據庫後,再學其他的就會很容易。可以學習 MySQL、MariaDB(是 MySQL 的一個分支,與 MySQL 幾乎完全相同)或 PostgreSQL。建議先從 MySQL 開始。
▌練習時間
現在可以把所有學到的知識放到一起了。
用學到的所有知識做一個簡單的應用。選一個點子,比如建立一個簡單的博客應用,並實現以下的功能:
- 用戶賬號 - 註冊和登錄
- 註冊用戶可以創建博文
- 用戶可以查看他創建的所有博文
- 用戶可以刪除博文
- 用戶只能看到他自己的博文,看不到其他人的
- 給應用寫單元測試和集成測試
- 數據庫查詢要使用索引。分析查詢,確保索引被用到了。
▌學習一個框架
根據項目和語言不同,你可能需要框架,也可能不需要。每種語言都有多個框架供選擇,應當去看看你選擇的語言都有哪些框架,然後選一個關聯最大的。
如果你選的是 PHP,我建議學習 Laravel 或 Symfony,如果需要微型框架的話,可以選擇 Lumen 或 Slim。如果選擇 Node.js,也有多種框架可以選擇,但最流行的就是 Express.js。
▌練習時間
這一步的練習,可以將你之前在第 10 步創建的應用改成用框架實現。同時要保證移植一切功能,包括測試用例。
▌學習一種NoSQL數據庫
首先要理解 NoSQL 是什麼,它們與關係型數據庫有何區別,以及為什麼需要 NoSQL。NoSQL 數據庫也有許多種,做一點研究,比較它們的功能和區別。常見的選擇有 MongoDB、Cassandra、RethinkDB 和 Couchbase。如果必須選擇其一,可以用 MongoDB。
▌緩存
學習如何在應用級別實現緩存。理解如何使用 Redis 或 Memcached,並在第 12 步創建的應用中應用緩存。
▌創建 RESTful API
理解 REST 並學習 RESTful API。一定要讀一讀 Roy Fielding 的論文中有關 REST 的那部分。確保有人說 REST 只能用於 HTTP API 時你能夠反駁。
▌學習不同的認證方式
學習各種認證和授權方式。你應該知道它們的含義,它們之間的區別,以及何時該用哪個。
- OAuth - 開放認證
- Basic認證
- Token認證
- JWT - JSON Web Tokens
- OpenID
▌消息傳遞
學習消息傳遞機制,理解為何、何時要使用消息傳遞。也有多種選擇,但主流就是RabbitMQ和Kafka。如果只能選擇其一,可以先學習RabbitMQ。
▌搜索引擎
隨著應用程序變得越來越大,在關係型數據庫或 NoSQL 上的簡單查詢將無法滿足需求,這就必須使用搜索引擎。搜索引擎也有多種選擇,每種都有自己的優缺點。
▌學習使用 Docker
Docker 可以大幅度降低開發的難度,它能複製與生產環境完全相同的環境,能保證操作系統乾淨,還能讓編碼、測試和部署更快捷。讀者可以自己搜索“Docker 有哪些好處”的答案。在這一步,只需要去學習如何使用 Docker。
▌Web 服務器的知識
如果你已學到這裡,那麼在前面的步驟中你一定已經接觸過了服務器。這一步主要是要找出不同 Web 服務器之間的區別,瞭解其限制和不同的配置選項,並理解怎樣編寫應用才能更好地利用這些限制。
▌學習如何使用 WebSocket
儘管這一步不是必須,但掌握 WebSocket 總會有好處。學習如何利用 WebSocket 編寫實時 Web 應用程序,並用它寫個示例應用。可以在前面完成的博客應用中使用 WebSocket 實現實時更新博文列表。
▌學習 GraphQL
學習如何用 GraphQL 編寫 API。理解它與 REST 的區別,理解為何它被稱為 REST 2.0。
▌看看圖數據庫
圖模型能靈活地表示並處理數據之間的關係,而圖數據庫提供了快速、有效的方式來存儲、讀取並查詢圖。學學如何使用 Neo4j 或 OrientDB。
▌繼續探索
一旦開始學習並練習後,你一定會遇到很多我們沒有覆蓋到的東西。保持開放的心態和健康好學的態度,去學習新東西吧。
記住,關鍵就是要多練習。剛開始可能有些不使用,但很快就會習以為常,時間長了還會覺得越來越好。
- 在此也推薦作者之前寫的一篇前端開發技術全景文章:https://medium.com/tech-tajawal/modern-frontend-developer-in-2018-4c2072fa2b9c
原文:https://medium.com/tech-tajawal/modern-backend-developer-in-2018-6b3f7b5f8b9
作者:Adnan Ahmed,tajawal 的首席工程師,喜歡 Web 開發、新技術,崇尚簡單,開源的忠實粉絲。
閱讀更多 CSDN 的文章