🦄 2024 独立开发者训练营,一起创业!查看介绍 / 立即报名(剩余10个优惠名额) →

迄今为止最完整的应用开发学习路线

图: Alex Pasquarella

最近为大家规划了一条可以真正从零开始的,迄今为止也最完整的应用开发学习路线,它有个可爱的名字叫《小白兔的开发之路》。这条路线会为你提供足够的工具,思路,概念与技巧。无论你是什么背景,这条路线都可以让你成为一名开发者。

设计这条路线至今我已经用了 500 多个小时,每个景点都是用心设计过的。途中涉及到了很多技术,从开发工具,到开发语言,应用框架,数据仓库,自动化测试,再到搭建云服务器与部署应用。全部都是精华,绝对不讲废话。

以往的学习路线都是把一些不同的课程拼凑到一起,这么做的最大的问题就是不连贯,你很难找出课程与课程之间的连接点。《小白兔的开发之路》是一条非常连贯的学习路线。比如在介绍数据仓库的时候,搭建好数据仓库服务,练习了基本的数据查询方法之后,马上就会到应用中去实践,做出一个功能。

《小白兔的开发之路》的文字部分其实在今年 1 月中旬就已经写完了,不过后来我几乎又重新写了一次,让内容的结构和应用的结构更加清晰。

现在订阅宁皓网,就可以立即开始学习这条开发路线了(现在订阅 →)。如果您需要额外的向导辅助你学习,可以参加今年 6 月份的《小白兔的开发之路 — 自由行》,我会针对你在学习中遇到的问题,为你提供向导服务,帮你顺利地完成这条学习路线(立即报名 →)。

准备开发

命令行界面
任务<Windows>:准备命令行界面<Cmder>
任务<macOS>:准备命令行界面<Terminal>
任务:熟悉基本的命令
理解环境变量目录
知道命令来自哪里
命令行工具的帮助信息
命令行界面的配置文件<macOS>
代码编辑器
任务:准备代码编辑器<VSCode>
任务:安装扩展<简体中文语言包>
打开项目
定制编辑器
本地开发环境
任务:准备本地开发环境<Node.js>
创建应用<Node.js>
任务:创建一个服务端应用项目<Node.js>
任务:运行应用

管理代码

准备源代码管理工具<Git>
任务<macOS>:准备 Git
任务<Windows>:准备 Git
任务:配置 Git
创建一个仓库<Repository>
任务:初始化仓库
保存项目的状态<Commit>
任务:做一次提交
带图形界面的 Git 工具<Source Tree>
任务:把文件恢复到上一次提交时的样子
实验想法的好地方<Branch>
任务:创建与切换分支<develop>
任务:创建分支<greeting>
任务:再做一次提交
任务:重做最后一次提交
任务:理解分支
任务:合并分支
合作与备份中心<Remote>
任务:注册远程仓库服务商帐号<Github>
任务:配置使用 SSH 密钥验证身份
任务:创建远程仓库<Github>
任务:添加远程仓库
任务:把远程仓库复制到本地
任务:推送(上传)与拉取(下载)
任务:添加 README.md 说明文档
任务:忽略不需要做源代码管理的东西<.gitignore>

熟悉语言

语言训练场地
控制台:Console
数据:Data
常量:Constant
变量:Variable
字符串:String
数字:Number
数组:Array
对象:Object
布尔值:Boolean
字符模板:Template strings
函数:Function
创建函数
箭头函数
执行函数
函数参数
多个参数
返回结果
方法:Method
解构:Destructuring
展开:Spread
流程控制:Control flow
if
switch
throw
try...catch
类:Class
创建类
实例化
属性
方法
构造方法
this
继承
天生就有的东西
结语

提供服务

准备
任务:准备项目<web-server>
语法
require()
Web 服务器
任务:创建 Web 服务器
请求与响应
任务:理解请求(Request)
任务:理解响应(Response)
任务:根据请求的地址作出响应
JSON
任务:响应 JSON 格式的数据

网络基础

传输协议(HTTP)
网络地址(IP)
任务<MacOS>:知道电脑的 IP 地址
任务<Windows>:知道电脑的 IP 地址
任务:知道终端设备上网用的公网 IP 地址
内网 / 局域网
主机名,域名,DNS
任务:知道主机名指向的 IP 地址
localhost,127.0.0.1,hosts 文件
任务:理解主机名配置文件<hosts>
任务:自定义本地主机名
交流通道(Port)
任务:理解端口的作用

管理包裹

包(Package)
依赖关系
包管理
版本号
npm
安装源
安装包
依赖(dependencies)
node_modules
版本号里的 ^ 与 ~
package-lock.json
开发依赖(devDendencies)
命令行工具
总结

应用框架

准备
任务:准备项目<express>
语言
filter():过滤数据项目
Express.js
任务:安装 Express 应用框架
任务:创建 Web 服务器
应用接口 / 路由
任务:定义应用接口(路由)
任务:准备演示数据
任务:定义响应 JSON 数据的应用接口
地址参数
任务:定义带参数的应用接口
总结
任务:整理项目

交换数据

准备
任务:准备项目<http>
HTTP 客户端
任务:准备一个 HTTP 客户端软件<Insomnia>
Insomnia 的基本用法
工作区:Workspace
环境:Environment
请求:Request
HTTP 方法
发布资源
更新资源
删除资源
资源列表
单个资源
创建内容用的应用接口
任务:在应用全局使用 JSON 中间件
任务:定义创建内容资源用的接口<POST>
任务:测试创建内容资源用的接口
状态码:Status Code
任务:设置服务端响应的状态码
头部数据:Headers
任务:在客户端的请求里设置头部数据
任务:在服务端设置响应的头部数据
总结
任务:整理项目

工作流程

准备
任务:准备项目<workflow>
TypeScript
任务:在项目中使用 TypeScript 开发
任务:编译应用(tsc)
任务:理解类型定义(.d.ts)
任务:使用 JavaScript 标准模块系统
任务:安装 Express 框架的类型定义
任务:设置处理器与中间件参数的类型
任务:处理 TypeScript 检查出来的问题
智能提示:IntelliSense
自动化
任务:自动编译与重启
任务:自动排版代码
总结
任务:整理项目

设计架构

准备
准备项目<structure>
概念
接口(API)
路由(Router)
控制器(Controller)
中间件(Middleware)
模块(Module)
语法
模块:Module
应用
任务:创建应用与 Web 服务器
配置
环境变量:Environment Variables
设置环境变量的方法
任务:把应用的配置放在环境变量里
控制器:Controller
任务:创建内容资源的控制器
路由:Router
任务:创建内容资源的路由(接口)
服务:Service
任务:创建内容资源的服务
中间件:Middleware
任务:理解中间件
处理异常
任务:创建默认的异常处理器
任务:测试使用异常处理器
总结
任务:整理项目

数据仓库

数据仓库服务<MySQL>
任务<macOS>:安装 MySQL 数据仓库系统
任务<Windows>:安装 MySQL 数据仓库系统
数据库客户端
任务<macOS>:准备 mysql 命令行工具
任务:用 mysql 命令行工具管理数据仓库
任务<Windows>:准备 mysql 命令行工具
任务:准备一个图形界面的数据库客户端软件<TablePlus>
数据仓库
任务:创建数据仓库
任务:使用数据仓库
数据表格
任务:创建数据表<user>
任务:创建数据表<post>
处理数据
任务:插入数据记录
任务:调取(查询)数据记录
任务:更新数据记录
任务:删除数据记录
数据关系
任务:定义数据关系<一对多 | 多对一>
任务:利用数据关系
总结

存取数据

准备
任务:准备项目<database>
语法
Callback
Promise
async 函数
连接数据仓库服务
任务:安装驱动连接数据仓库
任务:测试连接数据仓库
调取内容
任务:调取数据仓库里的数据
任务:利用数据之间的关系
任务:处理使用数据服务时遇到的异常情况
存储内容
任务:定义创建内容用的接口
任务:测试创建内容接口
更新内容
任务:定义更新内容用的接口
任务:测试更新内容接口
任务:使用帮手<Lodash>
删除内容
任务:定义删除内容用的接口
任务:测试删除内容接口
总结与整理
任务:整理项目

注册用户

准备
任务:准备项目<register>
用户模块
任务:创建用户模块<user>
注册用户
任务:定义创建用户接口
任务:测试创建用户接口
任务:验证用户数据
任务:处理创建用户的错误
任务:定义按用户名查找用户的服务
任务:注册时检查用户名是否存在
存储密码
任务:Hash 用户密码<Bcrypt>
总结与整理
任务:整理项目

用户登录

准备
任务:准备项目<login>
身份验证模块
任务:创建身份验证模块<auth>
用户登录
任务:定义用户登录接口
任务:测试用户登录接口
任务:验证用户登录数据
任务:重构按用户名查找用户
任务:验证用户密码是否匹配
总结与整理
任务:整理项目

验证身份

准备
任务:准备项目<authentication>
语法
interface
基于令牌的身份验证<JWT>
签发令牌时用的加密方法
密钥与公钥
任务:制作密钥与公钥
任务:准备密钥与公钥配置
签发令牌
任务:定义签发 JWT 令牌的服务
任务:签发 JWT 令牌
理解 JWT 令牌
验证令牌
任务:定义验证用户身份中间件
任务:测试验证用户登录状态
当前用户
任务:在请求里添加当前用户
任务:创建内容时记录内容的作者
总结与整理
任务:整理项目

访问控制

准备
任务:准备项目<access-control>
资源拥有权
任务:定义检查用户是否拥有指定资源的功能
访问控制
任务:定义访问控制中间件
任务:配置接口的访问控制
任务:测试访问控制
总结与整理
任务:整理项目

上传文件

准备
任务:准备项目<files>
语法
some()
概念
地址查询符
工具
代码片断
文件模块
任务:创建文件模块<file>
上传文件
任务:定义上传文件的功能
任务:定义上传文件接口
任务:测试上传文件接口
存储文件信息
任务:创建存储文件信息数据表
任务:定义存储文件信息功能
任务:存储上传文件信息
文件服务
任务:定义文件服务接口
任务:测试文件服务接口
总结与整理
任务:整理项目

处理文件

准备
任务:准备项目<file-process>
图像信息
任务:读取图像文件附加信息
任务:存储图像的附加信息
任务:定义调取图像信息的接口
任务:测试图像信息的接口
处理文件
任务:调整图像文件的大小
任务:提供不同尺寸的图像文件
总结与整理
任务:整理项目

内容标签

准备
任务:准备项目<tags>
标签模块
任务:创建标签模块<tag>
创建标签
任务:创建标签数据表
任务:定义存储标签数据的功能
任务:定义按标签名称查找标签的功能
任务:定义创建标签用的接口
任务:测试创建标签接口
内容的标签
任务:创建保存内容与标签关系用的数据表
保存内容的标签
任务:定义保存内容标签服务
任务:定义检查内容标签服务
任务:定义添加内容标签接口
任务:测试使用添加内容标签接口
删除内容的标签
任务:定义移除内容标签服务
任务:定义移除内容标签接口
任务:测试使用移除内容标签接口
总结与整理
任务:整理项目

发表评论

任务:准备项目<comments>
评论模块
任务:创建评论模块<comment>
发表评论
任务:创建评论数据表
任务:定义存储评论数据的功能
任务:定义发表评论用的接口
任务:测试发表评论接口
回复评论
任务:定义检查评论是否为回复评论的功能
任务:定义回复评论接口
任务:测试使用回复评论接口
修改评论
任务:定义修改评论内容用的功能
任务:定义修改评论接口
任务:测试使用修改评论接口
删除评论
任务:定义删除评论用的功能
任务:定义删除评论接口
任务:测试使用删除评论接口
总结与整理
任务:整理项目

资源关系

准备
任务:准备工具
内容,用户
任务:找出内容的作者
任务:找出某个用户发布的内容列表
任务:在查询结果中组织 JSON 数据(JSON_OBJECT)
内容,文件,用户
任务:在内容列表里包含相关的文件
任务:解决重复出现的内容项目(GROUP BY,JSON_ARRAYAGG)
任务:在查询中判断条件(IF)
任务:在内容列表里包含内容作者还有相关文件
内容,评论,用户
任务:找出某个内容的评论列表
任务:找出某个用户的评论列表
内容,标签
任务:找出包含某个标签的内容列表
任务:找出某个内容与这个内容的标签

内容列表

准备
任务:准备项目<lists>
SQL 查询片断
任务:定义 SQL 查询片断
评论总数
任务:添加一条评论
任务<SQL>:拼接评论数据表后统计评论总数
任务<SQL>:直接用子查询统计内容评论总数
任务:在内容列表中包含内容的评论数量
内容文件
任务<SQL>:拼接文件数据表获取内容相关文件列表
任务<SQL>:解决多表拼接时出现的重复问题
任务<SQL>:拼接文件数据表时限制内容相关文件的数量
任务<SQL>:用 CAST 转换数据的类型
任务:在内容列表中包含内容的相关文件
内容标签
任务:在内容项目里添加标签列表
排序
任务:改造调取内容列表用的功能(排序)
任务:创建排序方式中间件
过滤
任务<SQL>:按用户过滤内容列表
任务<SQL>:按标签名过滤内容列表
任务:改造调取内容列表用的功能(过滤)
任务:创建过滤列表中间件
总结与整理
任务:整理项目

内容分页

准备
任务:准备项目<pagination>
基本原理
限定数量<LIMIT>
偏移数量<OFFSET>
偏移数量计算公式
统计结果数量<COUNT>
内容分页
任务:改造调取内容列表功能(分页)
任务:添加分页配置
任务:创建内容分页中间件
统计数量
任务:定义统计内容数量的功能
总结与整理
任务:整理项目

用户头像

任务:准备项目<avatar>
头像模块
任务:创建头像模块<avatar>
上传头像
任务:定义文件过滤器
任务:创建上传头像中间件
任务:定义上传头像接口
任务:测试上传头像接口
处理头像
任务:调整头像的尺寸
头像数据
任务:创建头像数据表<avatar>
任务:定义保存头像数据的功能
任务:保存头像数据
头像服务
任务:定义按用户 ID 查找头像的功能
任务:定义头像服务接口
任务:测试头像服务接口
任务:在内容中标记用户是否上传过头像
总结与整理
任务:整理项目

用户点赞

任务:准备项目<likes>
点赞模块
任务:创建点赞模块<like>
点赞内容
任务:创建用户点赞内容的数据表
任务:定义保存点赞内容的功能
任务:定义点赞内容接口
任务:测试点赞内容接口
取消点赞
任务:定义取消点赞内容功能
任务:定义取消点赞内容接口
任务:测试使用取消点赞内容接口
点赞数量
任务:在内容项目中包含点赞数量
点赞列表
任务<SQL>:查询出某个用户点过赞的内容列表
任务:用户赞过的内容列表
总结与整理
任务:整理项目

资源接口

准备
任务:准备项目<resources>
内容
任务:定义按 ID 调取内容的功能
任务:定义单个内容接口
任务:测试单个内容接口
评论
任务:准备评论数据
任务<SQL>:调取评论列表
任务<SQL>:统计评论的回复数量
任务:定义评论相关的查询片断
任务:创建评论列表过滤器中间件
任务:定义获取评论列表功能
任务:定义评论列表接口
任务:获取用户发表的评论列表
任务:在评论列表中包含评论的回复数量
任务:定义评论回复列表接口
用户
任务:定义用户帐户接口
任务:定义更新用户接口
任务:使用更新用户接口

自动测试

任务:准备项目<testing>
测试工具
不同类型的测试
测试需要的工具
任务:安装与配置测试工具<Jest>
创建测试
任务:创建与执行测试
像真实用户一样测试应用(E2E)
测试创建用户接口
测试用户帐户接口
测试更新用户接口
任务:E2E 测试准备
任务:测试创建用户时必须提供用户名与密码
任务:测试成功创建用户以后,响应状态码应该是 201
测试用户帐户接口
任务:测试请求用户帐户接口,响应里应该包含指定的属性
任务:测试请求用户帐户接口,当用户不存在时,响应的状态码是 404
测试更新用户接口
任务:测试更新用户时需要验证用户身份
任务:测试更新用户的名字
任务:测试更新用户的密码

云服务器

任务:准备一台云服务器
域名
任务:申请一个域名
云服务器的初始配置
任务:远程连接云服务器
任务:添加新用户
任务:为用户生成密钥对
任务:用密钥的方式验证登录
任务:禁用密码与 root 身份登录
云服务器的磁盘
任务:格式化数据盘

生产环境

操作系统的包管理工具
查看仓库列表
搜索软件包
安装软件包
移除软件包
Node.js:应用引擎
任务:安装 Node.js
MySQL:数据仓库
任务:安装与启动 MySQL
任务:MySQL 安全配置
任务:创建新用户与数据仓库
Nginx:Web 服务器
任务:安装与启动 Nginx
理解 Nginx 的配置文件
用户
Worker
错误日志
HTTP
访问日志
文件类型
自定义配置
服务器
创建一个 Nginx 服务器
任务:创建一个简单的网站
任务:创建一个 Nginx 服务器
HTTPS
任务:安装 Certbot
任务:获取 Let's Encrypt 颁发的 SSL 证书
更新证书
Certbot 都做了什么
如果卡在正在安装 Python 包
HTTPS 服务器配置
反向代理
任务:为应用创建反向代理服务
PM2
任务:安装 PM2 管理 Node.js 应用进程
任务:用 PM2 管理运行 Node.js 应用

部署应用

任务:准备项目<depoly>
编译
任务:定义编译命令
迁移数据
任务:迁移数据仓库到生产环境
部署应用
任务:把本地的 master 分支推送到远程仓库
任务:在应用的远程仓库添加部署密钥
任务:部署应用
🎉 🎈

 

现在订阅宁皓网,就可以立即开始学习这条开发路线了(现在订阅 →)。如果您需要额外的向导辅助你学习,可以参加今年 6 月份的《小白兔的开发之路 — 自由行》,我会针对你在学习中遇到的问题,为你提供向导服务,帮你顺利地完成这条学习路线(立即报名 →)优惠中 ...

微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

15260
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点