经历了网络互联的 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