经历了网络互联的 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://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 tokensopenid
▌消息传递
学习消息传递机制,理解为何、何时要使用消息传递。也有多种选择,但主流就是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/tech-tajawal/modern-frontend-developer-in-2018-4c2072fa2b9c
原文:https://medium/tech-tajawal/modern-backend-developer-in-2018-6b3f7b5f8b9作者:adnan ahmed,tajawal 的首席工程师,喜欢 web 开发、新技术,崇尚简单,开源的忠实粉丝。译者:弯月,责编:屠敏