这是一系列高赞文章,详细介绍了前端、后端、DevOps 的路线图,在 Github 上也是一个高星项目。
现在的 Web 开发与几年前完全不同。有很多新东西让刚进入 Web 领域的开发人员感到很困惑。这也是我决定逐步制作这个直观的指南来展示 Web 概况的原因之一,可以让任何人都清楚他在 Web 开发中所处的角色和必备的条件。
大约一周前,我发布了一篇文章:如何成为一名前端工程师,我在里面承诺会发布 Backend 和 DevOps 相关的路线图,这篇文章将实现这个诺言,是关于现代后端开发人员的。
在这之前,后端路线图只是对技术的全面介绍、推荐,没有遵循明确的顺序,类似于之前的前端路线图,提供了分步指南,让你对此有一个更好的了解。
我们还在写 DevOps 相关的路线图,希望下周能够发布,同时会发布相关文章,这里是我们存放这些项目的仓库。
事不宜迟,让我们开始吧。你可以在下图中找到详细的路线图,但我也会在下文中解释说明相关步骤。
我们将对其进行分解,并对每个步骤做详细说明。
在此之前,尽管上图中没有列出 html/css 相关的知识,还是建议你至少了解一些相关知识并懂得如何编写一些基本的 HTML/CSS。
语言有很多种选择,这里我将它们分为几类,以方便你做选择,对于刚开始进行后端开发的初学者,我建议你选择任何一种脚本语言,因为有很多需求需要用到它们,而且脚本语言容易快速入门。如果你有一些前端知识,则可能发现 Node.js 更加容易,且有巨大的就业市场。
如果你使用某种脚本语言做后端,则建议你不要选择其他的脚本语言了,而是选择其他函数式或多范式语言。例如,你已经在使用 php 或 Node.js,不要再使用 Python 或 Ruby,而应该尝试使用 Erlang 或 Golang。这样能够帮你拓宽思路和视野。
没有比练习更好的学习方法了,一旦你对所选的语言有一定的概念和基础了解,就可以开始使用了,尽可能多地写一些小型程序,这里有一些建议供你参考:
在了解该语言的基础知识,编写一些示例程序之后,接下来应该学习如何使用这门语言的包管理软件。包管理可以让你使用外部代码库,或者分发你的库文件给其他人使用。
如果你选择 PHP,则必须学习 Composer,Node.js 则需要学习 npm 或 yarn,Python 则是 pip,Ruby 则是 RubyGems,无论你选择哪种语言,都需要学习相关的包管理软件。
每种语言都有自己的标准和最佳实践,根据你选择的语言学习这些标准和实践。例如,PHP 的 PHP-FIG 和 PSR,Node.js 的社区指南,其他语言也是如此。
确保你阅读了安全相关的最佳实践,建议你阅读 OWASP(Open Web Application Security Project) 指南,了解不同的安全问题,以及你选择的语言如何解决这些问题。
在你了解了语言、标准、最佳实践、包管理和安全相关的基础知识之后,开始创建一个软件包,并将其分发出去(确保你遵循了相关标准和最佳实践)。例如,如果选择了 PHP,则将其发布到 Packagist 上,如果选择了 Node.js 则发布到 npm 仓库中,以此类推。
在你完成这些步骤之后,可以在 Github 上搜索一些项目,尝试发一个 PR(pull request):
有几种不同的测试模式,了解这些模式的目的是什么。从现在开始就了解如何在应用程序中编写单元测试和集成测试。另外,你需要了解一些测试术语,比如 mocks、stubs。
为目前已完成的任务编写单元测试,尤其是 Step 6 中的任务。
学习如何计算代码的测试覆盖率。
了解如何将数据持久化到关系型数据库中,在继续学习之前,先了解相关数据库术语,例如:键、索引、规范化、元组(tuples)等。
这里有几种数据库供选择,不过你学会了一个,学习其他数据库应该很容易。如果你想学的 MySQL、MariaDB(Mysql 一个分支)、PostgreSQL,可以先从 Mysql 入手。
是时候实际应用你所学的知识了。
用目前所学的内容创建一个简单的应用程序。随便挑一个 idea 进行实现,比如创建一个简单的博客,实现如下功能:
根据项目和所选的语言,你可能需要一个框架,不同语言有不同的选择,请根据所选语言和适用范围进行选择。
如果你选择 PHP,我建议你使用 Laravel 或者 Symfony,对于微框架,建议你使用 Luman 或者 Slim。如果你选择 Node.js,则有不同的选择,不过最主要的是 Express.js。
为了完成这个步骤,你必须确保完成了步骤 10 的内容,以及选择了特定框架,实现相关测试。
首先了解 NoSQL 数据库是什么,和关系型数据库有什么不同,以及为什么需要它们。有几种不同的数据库可供选择,先稍微研究一下,对比它们之间功能和差异。常见的 NoSQLogic 数据库有:MongoDB、Cassandra、RethinkDB 和 Couchbase。如果你想选一个,可以先从 MongoDB 入手。
了解如何在程序中实现应用级的缓存。了解如何使用 redis 或 Memcached,以及如何在 Step 12 中构建的应用程序内实现缓存。
阅读 Roy Fielding 的论文中有关 REST 的部分,了解 REST 概念,并学习如何开发 RESTful API,如果别人说 REST 只适用于 HTTP API,你要能与之辩论。
你应该了解身份验证和授权方法,它们是什么,有何不同以及何时应该优先选择哪种?
了解消息中间件,以及何时如何使用它们,这里有多个选择,不过比较突出的就是 RabbitMQ 和 Kafka。如果你想选择一个,可以从 RabbitMQ 入手。
随着应用增长,关系型数据库和 NoSQL 数据库的简单查询功能以及不能满足应用需求,你不得不使用搜索引擎,上图有几个选项,每个选项都有自己的差异。
无论是生产环境还是镜像环境,保持一致的操作系统(类型、版本)可以加快编码、测试或部署速度,Docker 可以帮你实现这部分工作,极大提高开发效率,在这个步骤中你需要学习如何使用 Docker。
如果你已经到了这一步,之前的步骤中你可能就需要 Web Server 相关的知识了。这个步骤主要是了解不同 Web 服务器直接的差异、限制和不同的可选配置选项,以及如何利用这些限制来优化编码。
虽然这部分不是必须的,但在学会相关的知识是有益的。了解如何使用 Web Socket 实现实时 Web 服务,并实现一个简单的程序。你可以在上面的博客应用程序中使用 Web Socket 来实时更新文章列表。
学习如何使用 GraphQL 开发 API,了解它和 REST的差异,以及为什么 GraphQL 被称为 REST 2.0
图模型可以以一种非常灵活的方式来处理数据中的关系,图数据库提供了快速、有效的存储、检索、数据查询的方式,了解如何使用 Neo4j 或 OrientDB。
在你学习和练习的过程中肯定会遇到本文路线图中未涵盖的内容,保持开放的心态学习新事物。
记住关键是尽可能多地练习,一开始可能比较困难,你觉得自己什么都没有掌握,但这是正常现象,随着时间流逝,你会觉得自己越来越好。