问题一:前端领域研究的对象是什么?有哪些研究方向?有哪些常用术语?
- 研究对象是页面和人的相互,更好地服务于人
- 研究方向:WebGL、Canvas、VR、3D 等
- 常用术语:继承、变量提升、闭包
问题二:前端领域存在的作用是什么?为了解决什么问题?现在进展到哪里?
- 页面设计逐渐发展壮大、人的审美需求的不断提高,由此产生的专门领域
- 与后端的协调,与数据库的沟通
- Web3.0;低代码;区块链
问题三:这个领域的主要方法是什么?有哪些技术是被广泛承认和应用的?
- 不知道
- JS,HTML,CSS,Vue,React 等
学习方法
-
先对要学习的技术,有大概认知(建立索引):
- 索引建立成功的标志:遇到问题能够立刻想到运用哪部分知识解决
- 建立索引的方法: 了解该技能(软件、工具)每一处知识点(功能)的用处是什么、它能解决什么问题
- 一定要动手做一遍,问自己是否理解代码中的每一处细节;做出小项目来
- 阅读经典书
- 浏览历史
- 一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。
学习方法的话,就是确定一个要研究的主题,然后大量阅读该主题相关的文章,尽量保证每篇文章都能理解,如果不能理解,第二天再看一遍,直到看懂为止,如果可以的话,再写写文章,将学到的知识梳理出来,与大家分享。
目标
- 打牢计算机基础
- 熟悉前端所需知识
- 能够用代码表达想法
技术领域/工具
浏览器
- Edge(based on Chromium)
- Chrome / Chromium(Blink(browser engine), V8(JavaScript engine))
- Firefox(Gecko(browser engine), SpiderMonkey(JavaScript engine))
- Safari(WebKit)
- Opera(based on Chromium)
编程语言
- JavaScript
- TypeScript
- CoffeeScript
- Python,Ruby,PHP
- Java
- Perl
HTML,CSS
- HTML / HTML5
- CSS / CSS3
- Sass / Less / Stylus / PostCSS
开发工具
-
编辑器和 IDE
- Nano
- Vim(Neovim)
- VS Code
- Emacs(Emacs Wiki;Spacemacs,Doom Emacs)
- IDEA
- Eclipse
- Visual Studio
-
调试工具
-
网页调试
-
网络调试
- Charles
- Whistle
-
-
版本管理
- Git
- GitHub / GitLab
- Gitea
代码质量
-
Coding Style
- ESLint / JSLint / JSHint
- CSSLint
- Markup Validation Service
-
测试
前端库/框架
General purpose
MV*
- TodoMVC
- Backbone
- Ember
- Knockout
- AngularJS,Angular
- Meteor Software: A Platform to Build, Host, Deploy and Scale Full-Stack Javascript Applications
- Spice.js
- Cappuccino
- Riot.js — Simple and elegant component-based UI library
- CanJS — Build CRUD apps in fewer lines of code.
- Handlebars
- Dust.js by LinkedIn
-
CSS Reset
- normalize.css
- miniRest.css
- sanitize.css
- unstyle.css
- Bootstrap by Twitter
- Semantic UI
- Bulma
- Foundation
- DhtmlX
- qooxdoo
- React
- Vue
Animation
- GSAP - GreenSock
- Velocity.js
- bounce.js
- TweenJS | A JavaScript library for tweening and animating HTML5 and JavaScript properties.
- Move.js - CSS3 animation framework for JavaScript
- Snap.svg
- Rekapi - A JavaScript Keyframe Library
- Textillate.js
- favico.js
- Motio
- anime.js • JavaScript animation engine
Game engines
- melonJS
- Impact - HTML5 Canvas & JavaScript Game Engine
- Phaser - A fast, fun and free open source HTML5 game framework
- Quintus
- Goo Engine
- https://github.com/WhitestormJS/whs.js
- https://www.panda2.io/
AI-Assisted Isomorphic Application Engine
技术标准/规范
性能
- Best Practices for Speeding Up Your Web Site
- PageSpeed
- HttpWatch
- High Performance JavaScript
-
代码压缩 (HTML,JS,CSS)
SEO
部署流程
-
压缩合并
-
文档输出
-
项目构件工具
-
ES6 + 转换器
代码组织
-
类库模块化
- 业务逻辑模块化
-
文件加载
-
模块化预处理器
安全
- CSRF / XSS
- CSP
- Same-orgin policy
- AD safe / Caja / Sandbox
移动 Web
- H5 / CSS3
- Response Web Design
- Zepto
- Monaca
- Cordova
- Mobile Web Best Practices
- OMA SpecWorks
- Ionic
- React Native
- Flutter
技术社区/会议/新闻
- upcoming CSS, JavaScript and front-end conferences in 2022
- JSconf
- WHATWG
- JavaScript.com
- Echo JS - JavaScript News
- The Treehouse Show (2012 - 2015)
- 𝚓𝚊𝚟𝚊𝚜𝚌𝚛𝚒𝚙𝚝 - reddit
- All topics - Web Platform News
- Badass JavaScript
- JavaScript Weekly: The JavaScript Email Newsletter
- Node Weekly
- Archive - A Drip of JavaScript
- Latest Headlines | Ember Weekly
- Frontend Focus Archives
- https://developers.google.com/web
- https://developer.chrome.com/
- https://web.dev/
- https://classpert.com/ 寻找付费或者免费学习资源
编程知识储备
- 数据结构
- OOP / AOP
- Prototype / Scope
- Closure
- Programming paradigm(常见的编程范型有:函数式编程、指令式编程、过程式编程、面向对象编程等等。)
- Design Patterns(Learning JavaScript Design Patterns)
计算机知识储备
- 编译原理
- 计算机网络
- 操作系统
- 算法原理
- 软件工程/软件测试原理
- Unicode
软技能
- 知识管理/总结分享
- 沟通技巧/团队协作
- 需求管理/PM
- 交互设计/可用性/可访问性知识
服务器
- Nginx
- Apache
- Lighttpd
数据库
文件缓存/代理
Linux DE(desktop environment)
跨平开发工具组件
程序员练级攻略
- On The Value Of Fundamentals In Software Development
- The Greatest Developer Fallacy Or The Wisest Words You'll Ever Hear?
第一步:零基础启蒙
什么是编程
编程入门
一、入门语言 Python
第一步:《Python 编程快速上手》
第二步:《Python 编程:从入门到实践》
二、入门语言 JavaScript
第一步:JavaScript - MDN
第二步:JavaScript Tutorial - W3 schools
三、操作系统入门 Linux
第一步:Linux 教程
四、编程工具 Visual Studio Code
第一步:VS Code 中文文档
五、Web 编程入门
1, 前端基础
学习 CSS 和 HTML,还有前面学习过的 JavaScript。
注意 :不需要学习文档中的所有内容,重点了解 CSS 和 HTML 是怎么相互作用展示数据的 ;不用记忆,这两个文档(CSS,HTML)是用来查找知识的。
简单学习使用 JS 操纵 HTML,理解 DOM 和动态网页,W3Schools 的 JavaScript HTML DOM 的教程。
2, 后端基础
第一步:学习 PHP
第二步:以 PHP 官方文档 作为学习和查资料的手册
3, 学习要点
第一步,学习 HTML 基本语法
第二步,学习 CSS 如何选中 HTML 元素并应用一些基本样式
第三步,学会是用浏览器(Edge,Firefox),对好看的网页进行动态修改
第四步,在一台 Linux 机器上,配置 LNMP - Ubuntu/Nginx/PHP/MySQL(LAMP - Ubuntu/Apache/PHP/MySQL)
第五步,让后台 PHP 和前台 HTML 进行数据交互,对服务器响应浏览器请求形成初步认识,并实现一个表单提交和反显的功能
第六步,链接 PHP 和 MySQL
4, 学习目的
感受编程,只是为了入门,不必特别精通,做到:
- 知道 JS 和 Python 的不同即可
- 知道相关文档和知识在哪里
实践项目:简单 Blog 系统或 BBS 系统
第二步:正式入门
无论我做什么事,我都会面对各式各样的困难,这对每个人来说都是一样的,而只有兴趣、热情和成就感才能让我不畏惧这些困难。
编程技能
The Key To Accelerating Your Coding Skills:
- 找到自己的 inflection point of coding,不再别人手把手教我
- 对于初学者来说,最重要的就是对细节的关注度,代码的每个错误都会反映在输出结果的错误消息上
- 调试错误消息非常重要。事实上,经验不足或丰富的开发者都面对同样的错误消息。区别在于,(处理错误消息)经验丰富的开发者能够更快速地定位错误并解决
- 教程只能教给我很有限的知识,真正的自信来自于,苦苦思考一个没有答案的问题,最终凭借自己的思考解决
- 我永远不会知道,所有能帮助我解决问题的内容(You will never know everything you need to know to solve all your problems.)。假设自己已经学完需要的任何内容是不符合实际的
- 有经验的开发者,为还未解决的问题寻找答案,因为这给他们学习更多内容的机会
一、编程技巧《代码大全》
二、编程语言
第一步,Head First Java
第二步,Java 核心技术·卷 I
第三步,Spring in Action
第四步,Spring Boot in Action,能看懂多少就看多少
三、操作系统 《鸟哥的 Linux 私房菜》 简体第四版
四、网络协议 HTTP - MDN
要点:
- HTTP 头
- HTTP 请求方法
- HTTP 返回码
- HTTP 的 Cookie、缓存、会话;链接管理
五、数据库设计
第一步,数据库设计那些事儿
第二步,MySQL 官方文档或《MySQL 必知必会》
六、前端方面
第一步,JS 库 jQuery
第二步,CSS 库 Bootstrap
在这过程中的重点:
- 使用 JS Ajax 请求后端的 API 接口
- JS 的 Promise 模式(参考资料:ECMAScript 6 入门 by 阮一峰)
七、字符编码
参考资料:
编程工具
- 编程 IDE:IDEA
-
版本控制 Git
- 调试前端程序:各浏览器的 DevTools,Chromium & Chrome、Edge、FireFox
- 数据库设计工具:MySQL WorkBench
实践项目:投票系统
业务需求:
- 用户只有登陆后才可生成投票表单
- 投票项可单选,或多选
- 其他用户投票后显示当前投票结果(但是不能刷票)
- 投票页面需要倒计时提示
- 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数
技术需求:
- Java Spring Boot 实现,后端不返回 HTML,只返回 JSON 数据给前端
- 由前端的 jQuery 来处理并操作相关的 HTML 动态生成在前端显示的页面
- 前端的页面是响应式的,用 完成
进阶功能:
- 在微信中,通过微信授权后记录用户信息,以防止刷票
- 不用刷新页面,动态看到投票结果
- 使用一些图表库,把图表画得更好看一些
第二步:程序员修养
What are some of the most basic things every programmer should know?:
- 没有经过测试,就不起作用
- 版本控制是你的朋友——确定使用它
- 你写出的代码并不属于你——同事改动你的代码不要生气
- 不要重复发明轮子,库会帮助你
- The fastest code is code that's never executed — look for early outs.(看了翻译也不理解)
- 不是你写的,不代表是垃圾
- 源代码只是给编译器的一个提示,告诉它你想让它做什么,它不一定会做
- 难以理解的代码同样很难维护
- 难以维护的代码是没有用的
- "Whilst I'm editing this file I'll just…" is a great way to introduce feature creep and bugs.(看了翻译也不理解)
- 你的代码布局越简洁,就越容易阅读。越容易阅读,就越容易理解和维护
- 代码不会自己写文档。通过添加评论来引导阅读代码的人。现在你理解这段代码,五年之后呢
- 糟糕的代码总是让我们困扰
- 没有 5 分钟能完成的工作,最少半天
- Magic numbers are bad.(看了翻译也不理解)
- Constants don't take up storage, they're compile time text substitutions.(看了翻译也不理解)
- Project management will always want you to do twice as much in half the time.
- 如果有 Bug,用户能够发现
- 代码审查不是批评
- 重要的不是数量,而是质量。任何白痴都能敲出 40kloc(lines of code)毫无用处的代码
- 写出糟糕代码的成本在于,维护
- Eat your own dog food——修复自己代码中 Bug,能帮助我更好地编程,改善理解能力
- 代码会随着时间的推移而腐烂
- 如果用户没有要求提供一个新特性,不要添加它
- 没有经过测试,就不起作用(很重要,所以提醒两次)
97 Things Every Programmer Should Know
问问题的能力
- How To Ask Questions The Smart Way STFW(Search the fxxking web)以及 RTFM(Read the fxxking manual)
- X-Y PROBLEM,X-Y 问题
- 在 StackOverflow 上如何问问题:FAQ for Stack Exchange sites
写代码的修养
书籍推荐:
- 代码大全
- 重构:改善既有代码的设计
- 修改代码的艺术 Working Effectively with Legacy Code
- 代码整洁之道
- 程序员的职业素养
Code Review:
- Code Review Best Practic
- How Google Does Code Review
- LinkedIn's Tips for Highly Effective Code Review
Unit Test:
安全防范
Open Web Application Security Project® (OWASP):OWASP 是一个开源的、非盈利的全球性安全组织,致力于应用软件的安全研究。其被视为 Web 应用安全领域的权威参考。2009 年,国际信用卡数据安全技术 PCI 标准将其列为必要组件,美国国防信息系统局、欧洲网络与信息安全局、美国国家安全局等政府机构所发布的美国国家和国际立法、标准、准则和行业实务守则参考引用了 OWASP。
系统上线
关于测试:
- 《完美软件:对软件测试的各种幻想》
- 《Google 软件测试之道》
上线检查 Checklist:
运维(监控线上运行软件):Monitoring 101: Collecting the right data
第三步:编程语言
值得学习 C、C++、Java。它们是工业级编程语言。原因在于,C 和 C++ 语言规范都由 ISO 标准化过,而且都有工业界厂商组成的标准化委员会来制定工业标准;而且,它们已经在业界应用于许多重要的生产环境中。
- C 是操作系统、网络、硬件驱动的主要编程语言
- 由 C++ 编写的浏览器、数据库、Microsoft Office、主流图形界面、游戏引擎等已经深刻改变人类生活。很多公司用 C++ 开发核心架构
- 金融电商公司广泛使用 Java。它代码的稳定性超过 C 和 C++,生产力远超 C 和 C++。通过 JVM 可以跨平台开发
还有,Go 语言是未来。云计算的标准语言,在 Docker/Kubernetes 尤其体现。
Java 语言
入门书:
- Java 核心技术·卷 I
- Spring 实战
- Spring Boot 实战
进阶书:
- Effective Java 3rd(如何编写高效的代码) Guava: Google Core Libraries for Java(这个库不但是 JDK 的升级库,其中有如:集合(collections)、缓存(caching)、原生类型支持(primitives support)、并发库(concurrency libraries)、通用注解(common annotations)、字符串处理(string processing)、I/O 等库,其还是 Effective Java 这本书中的那些经验的实践代表)
- Java 并发编程实战
- Java 性能权威指南(进一步钻研,阅读《深入理解 Java 虚拟机》)
- Java 编程思想
- 精通 Spring 4.x
C/C++ 语言
- 👍👍The C Programming Language
- C 语言程序设计现代方法
- C 陷阱与缺陷 C Traps and Pitfalls,by Andrew Koenig
- C++ Primer 中文版
- Effective C++,More Effective C++
- 了解编译器:深度探索 C++ 对象模型
- C++ FAQ
- Linux C 编程一站式学习
- Pointers on C,By Kenneth A. Reek(1998)
- Expert C Programming: Deep C Secrets,by Peter van der Linden
- Thinking in C++,by Bruce Eckel
- A Tour of C++
- The C++ Programming Language
- The C++ Standard Library - A Tutorial and Reference
- Overview of the New C++
Go 语言
入门:Go by Example、Go 101、The Go Programming Language(GO 语言简介(上)- 语法、GO 语言简介(下)- 特性)
- Effective Go
-
Go 语言最突出之处是并发编程,Unix 老牌黑客罗勃·派克(Rob Pike)在 Google I/O 上的两个分享,可以让你学习到一些并发编程的模式
- Go 精华文章列表
- Go 相关博客列表
- Go Talks
- Awesome Go
设计模式
书籍推荐:
- 设计模式
- Head First 设计模式
学习面向对象的设计模式时,不要执着于 23 个设计模式,明白两个原理:
-
Program to an 'interface', not an 'implementation'
- 使用者不需要知道数据类型、结构、算法的细节
- 使用者不需要知道实现细节,只需要知道提供的接口
- 利于抽象、封装,动态绑定,多态。符合面向对象的特质和理念
-
Favor 'object composition' over 'class inheritance'
- 继承需要给子类暴露一些父类的设计和实现细节
- 父类实现的改变会造成子类也需要改变
- 我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法
- 继承更多的应该是为了多态
第四步:理论学科
算法& 数据结构
-
书籍
- 算法/算法图解
- 算法导论
- 编程珠玑
-
实践
- LeetCode
-
其他
其他理论知识
书籍:
- 数据结构与算法分析
- 数据库系统概念
- 现代操作系统
- 计算机网络
- 计算机程序的构造和解释
- 编译原理
第五步:系统知识
系统知识是理论知识的工程实践。
- Unix/Linux
- TCP/IP
- C10k
书籍:
- 深入理解计算机系统 Computer Systems A Programmer's Perspective
- UNIX 环境高级编程
-
Unix 网络编程
- 第 1 卷 套接口 API
- 第 2 卷 进程间通信
- TCP/IP 详解 卷 1:协议
比上述更容易读的书:
- Linux C 编程一站式学习
- TCP/IP 网络编程
- 图解 TCP/IP
- The TCP/IP Guide
网络协议实践:
- Wireshark 数据包分析实战
看完《Unix 高级环境编程》后,你可以趁热打铁看看《Linux/Unix 系统编程手册》或是罗伯特·拉姆(Robert Love)的 Linux System Programming 英文电子版 。其中文翻译版 Linux 系统编程 也值得一读,虽然和《Unix 高级环境编程》很像,不过其主要突出的是 Linux 的一些关键技术和相关的系统调用。
关于 TCP 的东西,你还可以看看下面这一系列的文章:
- Let's code a TCP/IP stack, 1: Ethernet & ARP
- Let's code a TCP/IP stack, 2: IPv4 & ICMPv4
- Let's code a TCP/IP stack, 3: TCP Basics & Handshake
- Let's code a TCP/IP stack, 4: TCP Data Flow & Socket API
- Let's code a TCP/IP stack, 5: TCP Retransmission
系统知识的学习要点
- 用这些系统知识操作一下文件系统,实现一个可以拷贝目录树的小程序
- 用 fork / wait / waitpid 写一个多进程的程序,用 pthread 写一个多线程带同步或互斥的程序。比如,多进程购票的程序
- 用 signal / kill / raise / alarm / pause / sigprocmask 实现一个多进程间的信号量通信的程序
- 学会使用 gcc 和 gdb 来编程和调试程序(参看我的《用 gdb 调试程序》一、二、三、四、五、六、七)
- 学会使用 makefile 来编译程序(参看我的《跟我一起写 makefile》一、二、三、四、五、六、七、八、九、十、十一、十二、十三、十四)
- Socket 的进程间通信。用 C 语言写一个 1 对 1 的聊天小程序,或是一个简单的 HTTP 服务器。
C10K 问题
然后,当你读完《Unix 网络编程》后,千万要去读一下 "C10K Problem (中文翻译版)"。提出这个问题的人叫丹·凯格尔(Dan Kegel),目前在 Google 任职。
C10K 问题本质上是 操作系统处理大并发请求的问题 。对于 Web 时代的操作系统而言,对于客户端过来的大量的并发请求,需要创建相应的服务进程或线程。这些进程或线程多了,导致数据拷贝频繁(缓存 I/O、内核将数据拷贝到用户进程空间、阻塞), 进程 / 线程上下文切换消耗大,从而导致资源被耗尽而崩溃。这就是 C10K 问题的本质。
了解这个问题,并了解操作系统是如何通过多路复用的技术来解决这个问题的,有助于你了解各种 I/O 和异步模型,这对于你未来的编程和架构能力是相当重要的。
另外,现在,整个世界都在解决 C10M 问题,推荐看看 The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution 一文。
实践项目
实现语言可以用 C、C++ 或 Java。
1)一个 telnet 版本的聊天服务器:
- 每个客户端可以用使用 telnet ip:port 的方式连接到服务器上
- 新连接需要用用户名和密码登录,如果没有,则需要注册一个
- 然后可以选择一个聊天室加入聊天
- 管理员有权创建或删除聊天室,普通人员只有加入、退出、查询聊天室的权力
- 聊天室需要有人数限制,每个人发出来的话,其它所有的人都要能看得到
2)一个简单的 HTTP 服务器:
- 解释浏览器传来的 HTTP 协议,只需要处理 URL path
- 然后把所代理的目录列出来
- 在浏览器上可以浏览目录里的文件和下级目录
- 如果点击文件,则把文件打开传给浏览器(浏览器能够自动显示图片、PDF,或 HTML、CSS、JavaScript 以及文本文件)
- 如果点击子目录,则进入到子目录中,并把子目录中的文件列出来
3)一个生产者 / 消费者消息队列服务:
- 消息队列采用一个 Ring-buffer 的数据结构
- 可以有多个 topic 供生产者写入消息及消费者取出消息
- 需要支持多个生产者并发写
- 需要支持多个消费者消费消息(只要有一个消费者成功处理消息就可以删除消息)
- 消息队列要做到不丢数据(要把消息持久化下来)
- 能做到性能很高
系统知识小结
- 编程语言:C/C++、Java、Go
- 算法和数据结构
- 计算机相关系统:操作系统、网络系统、数据库系统。它们代表计算机基础构成的三大件——计算、存储、网络。
如果你能够走到这里,把前面的那些知识都了解了(不用精通,因为精通是需要时间和实践来慢慢锤炼出来的,所以,你也不用着急),那么你已经是一个合格的程序员了,而且你的潜力和可能性是非常非常高的。
如果经历过这些比较枯燥的理论知识,而且你还能有热情和成就感,那么我要恭喜你了。因为你已经超过了绝大多数人,而且还是排在上游的比较抢手的程序员了。我相信你至少可以找到年薪 50 万以上的工作了。但是,你还需要很多的经验或是一些实践,以及一些大系统大项目的实际动手的经验。
第六步:软件设计
编程范式
左耳听风-编程范式部分:
其他内容:
- Programming paradigm
- Six programming paradigms that will change how you think about coding,这篇文章讲了默认支持并发(Concurrent by default)、依赖类型(Dependent types)、连接性语言(Concatenative languages)、声明式编程(Declarative programming)、符号式编程(Symbolic programming)、基于知识的编程(Knowledge-based programming)等六种不太常见的编程范式
- Programming Paradigms for Dummies: What Every Programmer Should Know,这篇文章的作者彼得·范·罗伊(Peter Van Roy)是比利时鲁汶大学的计算机科学教师。他在这篇文章里分析了编程语言在历史上的演进,有哪些典型的、值得研究的案例,里面体现了哪些值得学习的范式
- 斯坦福大学公开课:编程范式,这是一门比较基础且很详细的课程,适合学习编程语言的初学者。它通过讲述 C、C++、并发编程、Scheme、Python 这 5 门语言,介绍了它们各自不同的编程范式。以 C 语言为例,它解释了 C 语言的基本要素,如指针、内存分配、堆、C 风格的字符串等,并解释了为什么 C 语言会在泛型编程、多态等方面有局限性
一些软件设计的相关原则
- Don't repeat yourself(DRY)
- KISS principle(KISS)
- Program to an interface, not an implementation
- You aren't gonna need it(YAGNI)
- Law of Demeter(LoD)
-
- SRP(Single Responsibility Principle)- 职责单一原则
- OCP(Open/Closed Principle)- 开闭原则
- LSP(Liskov substitution principle)- 里氏代换原则
- ISP(Interface Segregation Principle)- 接口隔离原则
- DIP(Dependency Inversion Principle)- 依赖倒置原则
- Common Closure Principle(CCP) - 共同封闭原则
- Common Reuse Principle(CRP) - 共同重用原则
- Inversion of Control (IoC),Inversion of Control Containers and the Dependency Injection pattern
- Low Coupling, High Cohesion,Cohesion and Coupling
- Convention over configuration - 惯例优于配置原则
- Separation of Concerns(SoC) - 关注点分离
- Design by contract (DbC) - 契约式设计
- Acyclic Dependencies Principle(ADP) - 无环依赖原则
有关软件设计的读物
- 领域驱动设计
- UNIX 编程艺术
- Clean Architecture
- The Twelve-Factor App 中文版
- Avoid Over Engineering
- Instagram Engineering's 3 rules to a scalable cloud application architecture
- How to Design a Good API & Why it Matters
-
关于 Restful API 的设计,你可以学习并借鉴一下下面这些文章
- The Problem With Logging,一篇关于程序打日志的短文,可以让你知道一些可能以往不知道的打日志需要注意的问题
- Concurrent Programming for Scalable Web Architectures,这是一本在线的免费书,教你如何架构一个可扩展的高性能的网站。其中谈到了一些不错的设计方法和知识
之后就是术业专攻了
- 底层方向:操作系统、文件系统、数据库、网络……
- 架构方向:分布式系统架构、微服务、DevOps、Cloud Native……
- 数据方向:大数据、机器学习、人工智能……
- 前端方向:用户体验、交互……
- 其它方向:比如,安全开发、运维开发、嵌入式开发……
这些方向你要仔细选择,因为一旦选好,就要勇往直前地走下去,当然,你要回头转别的方向也没什么问题,因为你有前面的这些基础知识在身,所以,不用害怕。 只是不同的方向上会有不同的经验积累,经验积累是看书看不来的,这个是转方向的成本。
前端
前端基础
- HTML5、CSS3(Canvas、SVG、WebGL、CSS 图形变换)、ES6
- JavaScript 核心原理
- 浏览器工作原理
- 网络协议 HTTP
- 前端性能调优
- 框架学习
- UI 设计
一、HTML5
- HTML 5 权威指南
- HTML5 Canvas 核心技术
- Awesome HTML5
五、CSS3
- CSS - MDN
- Sass 和 Less 预处理工具
- Awesome CSS Frameworks
几个公司的 CSS 实践:
- CodePen's CSS
- GitHub's CSS
- Medium's CSS is actually pretty f***ing good.
- CSS at BBC Sport
- Refining The Way We Structure Our CSS At Trello
读物:
- A Scalable CSS Reading List
- More Eric Meyer on CSS,by Eric A. Meyer
- CSS: The Definitive Guide,by Eric A. Meyer
- HTML and CSS: Design and Build Websites,by Jon Duckett
- CSS Mastery: Advanced Web Standards Solutions,by Simon Collison, Andy Budd, Cameron Moll
六、JS
读物:
- JavaScript 语言精粹 JavaScript: The Good Parts
- Secrets of the JavaScript Ninja,中文翻译版为《JavaScript 忍者秘籍》
- Effective JavaScript
-
学习 ES6
- You Don't Know JS Yet
-
编程范式相关
-
德米特里·索什尼科夫(Dmitry Soshnikov)个人网站上三篇讲 JavaScript 内在的文章
- Alexander Zlatkov
- Addy Osmani
-
其他相关文章
底层原理
七、浏览器原理
- How browsers work
- How Browsers Work: Behind the scenes of modern web browsers
-
Virtual DOM
- How to write your own Virtual DOM
- Write your Virtual DOM 2: Props & Events
- How Virtual-DOM and diffing works in React
- The Inner Workings Of Virtual DOM
- 深度剖析:如何实现一个 Virtual DOM 算法
-
以及两个 Vitual-DOM 实现,供参考
- A Virtual DOM and diffing algorithm
- Maquette,Pure and simple virtual DOM library
八、网络协议
- Web 性能权威指南,High Performance Browser Networking
-
- http2 explained http2 explained 中文版
- HTTP/2 for a Faster Web
- Nginx HTTP/2 白皮书
-
HTTP/2 的两个 RFC
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2),HTTP/2 的协议本身
- RFC 7541 - HPACK: Header Compression for HTTP/2,HTTP/2 的压缩算法
-
新的 HTML5 支持 WebSocket
- HTML5 WebSocket: A Quantum Leap in Scalability for the Web,这篇文章比较了 HTTP 的几种链接方式,Polling、Long Polling 和 Streaming,并引入了终级解决方案 WebSocket
- Stack Overflow: My Understanding of HTTP Polling, Long Polling, HTTP Streaming and WebSockets
- WebSocket Basics: An Introduction,一个 WebSocket 的简单教程
- Awesome WebSockets
-
一些和 WebSocket 相关的想法
性能优化
- Web Performance in Action
- Designing for Performance
- High Performance JavaScript
- High Performance Web Sites: Essential Knowledge for Front-End Engineers
- Why does speed matter?
- 前端权威性能指南(中文版)
- PageSpeed Insights Rules
- Best Practices for Speeding Up Your Web Site
- 重点推荐一个性能优化的案例学习网站 WPO Stats,WPO 是 Web Performance Optimization 的缩写,这个网站上有很多很不错的性能优化的案例分享
文章案例:
- A Simple Performance Comparison of HTTPS, SPDY and HTTP/2
- 7 Tips for Faster HTTP/2 Performance
- Reducing Slack's memory footprint
- Driving user growth with performance improvements
- 10 Javascript Performance Boosting Tips from Nicholas Zakas
- 17 Statistics to Sell Web Performance Optimization
- Native Responsive Images
- Getting started with the Picture element
- Improve Page Load Times With DNS Prefetching
- Jank Busting for Better Rendering Performance
- How to Use the Allocation Profiler Tool,谷歌官方教你如何使用 Chrome 的开发工具来分析 JavaScript 内存问题
常用性能工具:
- PageSpeed
- GTmetrix,是一个将 PageSpeed 和 YSlow 合并起来的一个网页分析工具
- 更多的性能优化工具和资源
其他:
前端框架
框架比较:
- Angular vs. React vs. Vue: A 2017 comparison
- React or Vue: Which Javascript UI Library Should You Be Using?
- React vs Angular vs Vue.js — What to choose in 2021? (updated in 2021)
一、React.js 框架
1)入门
- 官方教程
- All the fundamental React.js concepts, jammed into this one article
- Learn React Fundamentals 🆓 and Advanced Patterns ⚛️ 🎁
- Thinking in React
2)提高
-
状态
- Common React.js mistakes: Unneeded state,React.js 编程的常见错误——不必要的状态
- State is an antipattern,关于如何做一个不错的组件的思考
- Thinking Statefully
- Tips to learn React + Redux in 2019
-
"State Architecture Patterns in React" 系列文章
- State Architecture Patterns in React: A Review
- Part 2: The Top-Heavy Architecture, Flux and Performance
- Part 3: Articulation Points, zine and An Overall Strategy
- Part 4: Purity, Flux-duality and Dataflow
-
函数式编程
- Professor Frisby's Mostly Adequate Guide to Functional Programming 中文版
- Master the JavaScript Interview: What is Functional Programming?
- The Rise and Fall and Rise of Functional Programming (Composing Software)
- Functional UI and Components as Higher Order Functions
- Functional JavaScript Reverse-engineering the Hype
- Some Thoughts on Function Components in React
-
设计相关
- React Patterns
- React Higher Order Components in depth
- Presentational and Container Components
- Controlled and uncontrolled form inputs in React don't have to be complicated
- Function as Child Components
- Writing Scalable React Apps with the Component Folder Pattern
- Reusable Web Application Strategies: three patterns for running the same app in multiple spots
- Characteristics of an Ideal React Architecture
-
实践和经验
-
资源列表
二、Vue.js 框架
- Why 43% of Front-End Developers want to learn Vue.js
- Replacing jQuery With Vue.js: No Build Step Necessary
- 10 things I love about Vue
- Vue on 2018 — Interview with Evan You, author of the Vue.js framework
1)入门
- Vue3 Guide
- 新手向:Vue 2.0 的建议学习顺序 by 尤雨溪
2) 其他文章
UI/UX 设计
- 7 steps to become a UI/UX designer
- Don't Make Me Think
- Simple and Usable Web,Mobile,and Interaction Design
- Designing with the Mind in Mind: Simple Guide to Understanding User Interface Design Rules
- Designing Interfaces: Patterns for Effective Interaction Design
- The Psychology Principles Every UI/UX Designer Needs to Know
- 18 designers predict UI/UX trends for 2018
- The Evolution of UI/UX Designers Into Product Designers
一、原子设计(Atomic Design)
- Atomic Design 原子设计 ┃ 构建科学规范的设计系统
-
[[https://medium.com/uxeastmeetswest/%E7%B6%B2%E9%A0%81%E8%A8%AD%E8%A8%88-atomic-design%E7%B0%A1%E4%BB%8B%E5%8F%8A%E5%B7%A5%E4%BD%9C%E5%AF%A6%E4%BE%8B-42e666358d52][網頁設計
Atomic Design 簡介及工作實例]]
- Atomic Design by Brad Frost
- atomic design
- Create atomic design systems with Pattern Lab
- Atomic Design with React
二、设计语言和设计系统
1)Fluent Design System
Fluent Design System 中文翻译为流畅设计体系,是微软于 2017 年开发的设计语言。
微软于 2017 年 5 月 11 日的 Microsoft Build 2017 开发者大会上公开了该设计体系。
- What's new and coming for Windows UI: XAML and composition,从概念上讲了一下 Fluent Design System 的各个部分
- Introducing Fluent Design,介绍了 Fluent Design System 的各个部分
还有 Build 2018 上的一些微软的 YouTube 分享。
- Fluent Design: Evolving our Design System : Build 2018
- Microsoft Build 2018 - Fluent Design System Demo
- Microsoft Build 2018 - Fluent Design System Evolution
- Fluent Design System inside of Microsoft: Office : Build 2018
- Material Design 于 2014 年的 Google I/O 大会 上发布
- Comparison of Material Design implementations
-
可供使用的 Material UI 的工程实现
3)其他公司
三、动画效果设计
- Codepen
- 动画效果设计方法:Twelve basic principles of animation 对该法则的解读
-
动画设计指南和相关文章
- 6 Animation Guidelines for UX Design
- Designing Interface Animation
- Animation principles in motion design
- Creating Usability with Motion: The UX in Motion Manifesto
- Integrating Animation into a Design System
- Great UI/UX Animations 是设计师丹尼尔(Daniel)收集的一些很不错的动画
四、相关资源
1)文章资源
- Smashing Magazine
- Designer News
- Web Designer News
- r/web_design
- Marvel Blog
- Medium.design
- Design & UX
- ALL ARTICLES FOR Creative by the Next Web 新闻
2)设计收集
论文
如何读
计算机论文集散地
- Two Minute Papers
- Best Paper Awards in Computer Science (since 1996)
- Engineering & Computer Science - Google Scholar Metrics
- Google Publication
- Microsoft Publication
- MIT AI Working Papers (1971 - 1995)
- MIT Distributed Systems
- arxiv,arXiv 是一个收集物理学、数学、计算机科学与生物学的论文预印本的网站
- Top arXiv papers,arXiv 上的论文太多,所以,SciRate 索引了 arXiv 上的一些好评的论文,并供大家评论和打分(SciRate)
- Document archive
- Usenix: Best Papers
- the morning paper
- lobste
- Papers We Love
编程规范
有编程规范的好处:
- 代码易阅读,进而易理解易维护
- 提升开发效率
- 提高代码质量,减少 Bug
- 团队高效协作
编程语言
C 语言
C++ 语言
- C++ Core Guidelines,这个文档是各种 C++ 的大拿包括原作者在内在持续讨论更新的和 C++ 语言相关的各种最佳实践
- Google C++ Style Guide
Go 语言
Java 语言
JavaScript 语言
- JavaScript The Right Way,一个相对比较容读的 JavaScript 编程规范,其中不但有代码规范,还有设计模式,测试工具,编程框架,游戏引擎……
- Google JavaScript Style Guide
- Airbnb JavaScript Style Guide() {
- JavaScript Style Guide,jQuery 的代码规范
- clean-code-javascript,《代码整洁之道》一书中的 JavaScript 的实践
较简单的 JS 编程规范
PHP 语言
- PHP Standards Recommendations,PHP 编码规范及标准推荐
- PHP The Right Way,除了编码规范之外的各种 PHP 的最佳实践,还包括一些设计模式,安全问题,以及服务部署,Docker 虚拟化以及各种资源
- Clean Code PHP,《代码整洁之道》的 PHP 实践
Python 语言
- PEP 8 – Style Guide for Python Code,Python 官方的编程规范
- Google Python Style Guide
- The Hitchhiker's Guide to Python!,这不只是 Python 的编程规范,还是 Python 资源的集散地
Scala 语言
- Scala Style Guide,Scala 官方的编程规范
- Databricks Scala Guide
- Scala Best Practices
Shell 语言
Mozilla 的编程规范
- Mozilla Coding Style Guide,其中包括 C、C++、Java、Python、JavaScript、Makefile 和 SVG 等编程规范
前端开发相关
- CSS Guidelines
- Scalable and Modular Architecture for CSS
- Some HTML, CSS and JS best practices
- Sass Guidelines
- CSS / Sass Styleguide
- LESS Coding Guidelines
- LESS coding guidelines
- Less coding standard
- HTML Style Guide
- HTML,CSS
- CoffeeScript Style Guide
- Principles of writing consistent, idiomatic CSS
- Opinionated CSS styleguide for scalable applications
- Google HTML/CSS Style Guide
- Responsive Web Design
- A design system for the federal government
- Front-End Checklist
移动端相关
Kotlin
Objective-C 语言
API 相关
- Microsoft REST API Guidelines
- API Design Guide
- RESTful API Designing guidelines
- JSON:API — Recommendations,JSON 相关的 API 的一些推荐实践
- API Security Checklist,API 的安全问题的检查列表
开发工具相关
Markdown 相关
正则表达式相关
Linux 系统、内存和网络
Linux 系统相关
内存相关
- What Every Programmer Should Know About Memory
-
几篇和内存相关的论文
-
内存管理方面的 lib 库
- ptmalloc 是 glibc 的内存分配管理
- gperftools 是 Google 的内存分配管理模块,全称是 Thread-Caching malloc,基本上来说比 glibc 的 ptmalloc 快两倍以上
- jemalloc 是 BSD 提供的内存分配管理。其论文为 A Scalable Concurrent malloc(3) Implementation for FreeBSD,这是一个可以并行处理的内存分配管理器
- 关于 C 的这些内存分配器
-
上面那三种内存分配器的一些比较和工程实践
计算机网络
网络学习
- Computer Networks, 5th Edition,Andrew S. Tanenbaum / David J. Wetherall
- 渥汰华大学的一个课程讲义
- Computer Network Tutorials
网络调优
网络协议
想要学习网络协议最好的方式就是学习通讯相关的 RFC。读 RFC 有几个好处,一方面可以学习技术,另一方面,可以通过 RFC 学习到一个好的技术文档是怎么写的,还能看到各种解决问题的方案和思路。
对于第 2 层链路层,需要了解 ARP:
Tunnel 相关的协议:
- RFC1853 - IP in IP Tunneling
- RFC2784 - Generic Routing Encapsulation (GRE)
- RFC2661 - Layer Two Tunneling Protocol "L2TP"
- RFC2637 - Point-to-Point Tunneling Protocol (PPTP)
对于第 4 层,最需要了解的是 TCP/IP 了。和 TCP 相关的 RFC 相当多,这里给一系列经典的 RFC。这些 RFC 都引用在了 CoolShell 上的《TCP 的那些事儿(上)》和《TCP 的那些事儿(下)》两篇文章中。如果看不懂 RFC,也可以去看上述的文章。
- RFC 793 - Transmission Control Protocol - 最初的 TCP 标准定义,但不包括 TCP 相关细节
- RFC 813 - Window and Acknowledgement Strategy in TCP - TCP 窗口与确认策略,并讨论了在使用该机制时可能遇到的问题及解决方法
- RFC 879 - The TCP Maximum Segment Size and Related Topics - 讨论 MSS 参数对控制 TCP 分组大小的重要性,以及该参数与 IP 分段大小的关系等
- RFC 896 - Congestion Control in IP/TCP Internetworks - 讨论拥塞问题和 TCP 如何控制拥塞
- RFC 2581 - TCP Congestion Control- 描述用于拥塞控制的四种机制:慢启动、拥塞防御、快重传和快恢复。后面这个 RFC 被 RFC 5681 所更新。还有 RFC 6582 - The NewReno Modification to TCP's Fast Recovery Algorithm 中一个改进的快速恢复算法
- RFC 2018 - TCP Selective Acknowledgment Options - TCP 的选择确认
- RFC 2883 - An Extension to the Selective Acknowledgement (SACK) Option for TCP - 对于 RFC 2018 的改进
- RFC 2988 - Computing TCP's Retransmission Timer - 讨论与 TCP 重传计时器设置相关的话题,重传计时器控制报文在重传前应等待多长时间。也就是经典的 TCP Karn/Partridge 重传算法
- RFC 6298 - Computing TCP's Retransmission Timer - TCP Jacobson/Karels Algorithm 重传算法
我个人觉得 TCP 最牛的不是不丢包,而是拥塞控制。对此,如果你感兴趣,可以读一下经典论文《Congestion Avoidance and Control》。
关于 Linux 下的 TCP 参数,仔仔细细地读一下 TCP 的 man page。
对于第 7 层协议,HTTP 协议是重点要学习的。
- (重点推荐)HTTP 权威指南
HTTP 1.1 的原始 RFC 是 1999 年 6 月的 RFC 2616,但其在 2014 后很快被下面这些 RFC 给取代了。
- RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
- RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
- RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests
- RFC 7233 - Hypertext Transfer Protocol (HTTP/1.1): Range Requests
- RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching
- RFC 7235 - Hypertext Transfer Protocol (HTTP/1.1): Authentication
关于 HTTP/2:
- http2 explained http2 explained 中文版
- HTTP/2 for a Faster Web
- Nginx HTTP/2 白皮书
-
HTTP/2 的两个 RFC
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2),HTTP/2 的协议本身
- RFC 7541 - HPACK: Header Compression for HTTP/2,HTTP/2 的压缩算法
上 Wikipedia 的 Internet Protocol Suite 上看看,这是一个很不错的网络协议的词条汇集地。顺着这些协议,可以找到很多有用的东西。
异步 I/O 模型和 Lock-Free 编程
异步 I/O 模型
史蒂文斯(Stevens)在《UNIX 网络编程》一书 6.2 I/O Models 中介绍了五种 I/O 模型。
- 阻塞 I/O
- 非阻塞 I/O
- I/O 的多路复用(select 和 poll)
- 信号驱动的 I/O(SIGIO)
- 异步 I/O(POSIX 的 aio_functions)
Java 相关的 I/O 模型的文章:Thousands of Threads and Blocking I/O
道格·莱亚(Doug Lea)的 Scalable IO in Java
了解一下各种异步 I/O 的实现和设计方式:
- Boost application performance using asynchronous I/O
- Lazy Asynchronous I/O For Event-Driven Servers
- 异步 I/O 模型中的 Windows I/O Completion Ports
- Windows Internals, Part 1(这本书中的一章 I/O Processing)
- 接下来是 Libevent。你可以看一下其主要维护人员尼克·马修森(Nick Mathewson)写的 Libevent 2.0 book。还有一本国人写的电子书《Libevent 深入浅出》。
- 再接下来是 Libuv。你可以看一下其官网的 Libuv Design Overview 了解一下。
基本上来说,异步 I/O 模型的发展技术是:select -> poll -> epoll -> aio -> libevent -> libuv。Unix/Linux 用了好几十年走过这些技术的变迁,然而,都不如 Windows I/O Completion Port 设计得好。
看过这些各种异步 I/O 模式的实现以后,相信你会看到一个编程模式——Reactor 模式。下面是这个模式的相关文章:
Lock-Free 编程
Lock-Free - 无锁技术越来越被开发人员重视,因为锁对于性能的影响实在是太大了,所以如果想开发出一个高性能的程序,你就非常有必要学习 Lock-Free 的编程方式。
关于无锁的数据结构,有几篇教程你可以看一下:
然后强烈推荐一本免费的电子书:Is Parallel Programming Hard, And, If So, What Can You Do About It?,这是大牛 保罗·麦肯尼(Paul E. McKenney) 写的书。这本书堪称并行编程的经典书,必看。
此时,Wikipedia 上有三个词条你要看一下,以此了解并发编程中的一些概念:Non-blocking algorithm、Read-copy-update 和 Seqlock。
接下来,读一下以下两篇论文。
- Implementing Lock-Free Queues 无锁队列的实现
- Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms,这篇论文给出了一个无阻塞和阻塞的并发队列算法
博客订阅:
- 1024cores - 德米特里·伐由科夫(Dmitry Vyukov)的和 lock-free 编程相关的网站
- Paul E. McKenney's Journal - 保罗(Paul)的个人网站
- Preshing on Programming
- Concurrency Freaks
- https://herbsutter.com/
- Mechanical Sympathy
一些编程相关的一些 C/C++ 的类库,这样你就不用从头再造轮子了(对于 Java 的,请参看 JDK 里的 Concurrent 开头的一系列的类):
其他:
- All about 64-bit programming in one place
- What Scalable Programs Need from Transactional Memory
- Improving OpenSSL Performance
-
关于压缩的内容
- How eBay's Shopping Cart used compression techniques to solve network I/O bottlenecks
- Boosting Site Speed Using Brotli Compression,LinkedIn 在 2017 年早些时候开始使用 Brotli 来替换 gzip,以此带来更快的访问,这篇文章讲述了什么是 Brotli 以及与其它压缩程序的比较和所带来的性能提升
- 有两篇关于 SSD 硬盘性能测试的文章。Performance Testing with SSDs, Part 1 和 Performance Testing with SSDs Part 2,这两篇文章介绍了测试 SSD 硬盘性能以及相关的操作系统调优方法。
- Secure Programming HOWTO - Creating Secure Software
相关论文
- Hints for Computer System Design,计算机设计的忠告,这是 ACM 图灵奖得主 Butler Lampson 在 Xerox PARC 工作时的一篇论文。这篇论文简明扼要地总结了他在做系统设计时的一些想法,非常值得一读。(用他的话来说,“Studying the design and implementation of a number of computer has led to some general hints for system design. They are described here and illustrated by many examples, ranging from hardware such as the Alto and the Dorado to application programs such as Bravo and Star“。)
- The 5 minute rule for trading memory for disc accesses and the 5 byte rule for trading memory for CPU time,根据文章名称也可以看出,5 分钟法则是用来衡量内存与磁盘的,而 5 字节法则则是在内存和 CPU 之间的权衡。这两个法则是 Jim Gray 和 Franco Putzolu 在 1986 年的文章。 在该论文发表 10 年后的 1997 年,Jim Gray 和 Goetz Graefe 又在 The Five-Minute Rule Ten Years Later and Other Computer Storage Rules of Thumb 中对该法则进行了重新审视。2007 年,也就是该论文发表 20 年后,这年的 1 月 28 日,Jim Gray 驾驶一艘 40 英尺长的船从旧金山港出海,目的是航行到附近的费拉隆岛,在那里撒下母亲的骨灰。出海之后,他就同朋友和亲属失去了联系。为了纪念和向大师致敬,时隔 10 多年后的 2009 年 Goetz Graefe 又发表了 The Five-Minute Rule 20 Years Later (and How Falsh Memory Changes the Rules)。 注明一下,Jim Gray 是关系型数据库领域的大师。因在数据库和事务处理研究和实现方面的开创性贡献而获得 1998 年图灵奖。美国科学院、工程院两院院士,ACM 和 IEEE 两会会士。他 25 岁成为加州大学伯克利分校计算机科学学院第一位博士。在 IBM 工作期间参与和主持了 IMS、System R、SQL/DS、DB2 等项目的开发。后任职于微软研究院,主要关注应用数据库技术来处理各学科的海量信息。
Java 底层知识
Java 字节码相关
- Introduction to Java Bytecode
- Java Bytecode and JVMTI Examples,这是一些使用 JVM Tool Interface 操作字节码的比较实用的例子。包括方法调用统计、静态字节码修改、Heap Taggin 和 Heap Walking
三个操控字节码的库:
- AsmTools - 用于生产环境的 Java .class 文件开发工具
- Byte Buddy - 代码生成库:运行时创建 Class 文件而不需要编译器帮助
- Jitescript - 和 BiteScript 类似的字节码生成库
JVM 相关
- 阅读说明书:The Java® Virtual Machine Specification Java SE 8 Edition
- The Java® Virtual Machine Specification.《Java 虚拟机规范(第 11 版)》中文翻译及示例
- JVM Anatomy Quarks
- Java 的内存模型
- The Java Memory Model
对于内存方面,道格·利(Doug Lea)有两篇文章也是很有价值的:
垃圾回收机制:
-《The Garbage Collection Handbook》
其他:
数据库
对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。关系型数据库主要有三个:Oracle、MySQL 和 Postgres。
在这里,我们只讨论越来越主流的 MySQL 数据库。首先,我们要了解数据库的一些实现原理和内存的一些细节,然后我们要知道数据的高可用和数据复制这些比较重要的话题,了解一下关系型数据库的一些实践和难点。然后,我们会进入到 NoSQL 数据库的学习。
NoSQL 数据库千奇百怪,其主要是解决了关系型数据库中的各种问题。第一个大问题就是数据的 Schema 非常多,用关系型数据库来表示不同的 Data Schema 是非常笨拙的,所以要有不同的数据库(如时序型、键值对型、搜索型、文档型、图结构型等)。另一个大问题是,关系型数据库的 ACID 是一件很讨厌的事,这极大地影响了数据库的性能和扩展性,所以 NoSQL 在这上面做了相应的妥协以解决大规模伸缩的问题。
对于一个程序员,你可能觉得数据库的事都是 DBA 的事,然而我想告诉你你错了,这些事才真正是程序员的事。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。所以,作为一个架构师或程序员,你必须了解最重要的数据存储——数据库。
关系型数据库
关系型数据库最主要的两个代表是闭源的 Oracle 和开源的 MySQL。
- 学习 Oracle:《Oracle Database 9i/10g/11g 编程艺术》
-
学习 MySQL:
- 第一步:MySQL Documentation
-
第二步:
- 《高性能 MySQL》
- 《MySQL 技术内幕:InnoDB 存储引擎》
- MySQL Internals Manual
- 数据库的索引设计和优化:《数据库的索引设计与优化》
- MySQL 索引背后的数据结构及算法原理
- Some study on database storage internals
- Sharding Pinterest: How we scaled our MySQL fleet
- Guide to MySQL High Availability
- Choosing MySQL High Availability Solutions
- MARIADB ENTERPRISE: HIGH AVAILABILITY GUIDE
- Awesome MySQL
MySQL 有两个比较有名的分支,一个是 Percona,另一个是 MariaDB,其官网上的 Resources 页面中有很多不错的资源和文档,可以经常看看。Percona Resources、MariaDB Resources,以及它们的开发博客中也有很多不错的文章,分别为 Percona Blog 和 MariaDB Blog。
然后是关于 MySQL 的一些相关经验型的文章。
- Booking.com: Evolution of MySQL System Design,Booking.com 的 MySQL 数据库使用的演化,其中有很多不错的经验分享,我相信也是很多公司会遇到的的问题
- Tracking the Money - Scaling Financial Reporting at Airbnb,Airbnb 的数据库扩展的经验分享
- Why Uber Engineering Switched from Postgres to MySQL,无意比较两个数据库谁好谁不好,推荐这篇 Uber 的长文,主要是想让你从中学习到一些经验和技术细节,这是一篇很不错的文章
关于 MySQL 的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。
- Monitoring Delayed Replication, With A Focus On MySQL
- Mitigating replication lag and reducing read load with freno
-
另外,Booking.com 给了一系列的文章,你可以看看:
- Better Parallel Replication for MySQL
- Evaluating MySQL Parallel Replication Part 2: Slave Group Commit
- Evaluating MySQL Parallel Replication Part 3: Benchmarks in Production
- Evaluating MySQL Parallel Replication Part 4: More Benchmarks in Production
- Evaluating MySQL Parallel Replication Part 4, Annex: Under the Hood
对于 MySQL 的数据分区来说,还有下面几篇文章你可以看看。
- StackOverflow: MySQL sharding approaches?
- Why you don't want to shard
- How to Scale Big Data Applications
- MySQL Sharding with ProxySQL
然后,再看看各个公司做 MySQL Sharding 的一些经验分享。
- MailChimp: Using Shards to Accommodate Millions of Users
- Uber: Code Migration in Production: Rewriting the Sharding Layer of Uber's Schemaless Datastore
- Sharding & IDs at Instagram
- Airbnb: How We Partitioned Airbnb's Main Database in Two Weeks
NoSQL 数据库
关于 NoSQL 数据库,其最初目的就是解决大数据的问题。然而,也有人把其直接用来替换掉关系型数据库。所以在学习这个技术之前,我们需要对这个技术的一些概念和初衷有一定的了解。下面是一些推荐资料。
- Martin Fowler 在 YouTube 上分享的 NoSQL 介绍 Introduction To NoSQL, 以及他参与编写的 NoSQL Distilled - NoSQL 精粹,这本书才 100 多页,是本难得的关于 NoSQL 的书,很不错,非常易读。
- NoSQL Databases: a Survey and Decision Guidance,这篇文章可以带你自上而下地从 CAP 原理到开始了解 NoSQL 的种种技术,是一篇非常不错的文章。
- Distribution, Data, Deployment: Software Architecture Convergence in Big Data Systems,这是卡内基·梅隆大学的一篇讲分布式大数据系统的论文。其中主要讨论了在大数据时代下的软件工程中的一些关键点,也说到了 NoSQL 数据库。
- No Relation: The Mixed Blessings of Non-Relational Databases,这篇论文虽然有点年代久远。但这篇论文是 HBase 的基础,你花上一点时间来读读,就可以了解到,对各种非关系型数据存储优缺点的一个很好的比较。
-
NoSQL Data Modeling Techniques,NoSQL 建模技术。
- MongoDB - Data Modeling Introduction,虽然这是 MongoDB 的数据建模介绍,但是其很多观点可以用于其它的 NoSQL 数据库。
- Firebase - Structure Your Database,Google 的 Firebase 数据库使用 JSON 建模的一些最佳实践。
- 因为 CAP 原理,所以当你需要选择一个 NoSQL 数据库的时候,你应该看看这篇文档 Visual Guide to NoSQL Systems。
选 SQL 还是 NoSQL,这里有两篇文章,值得你看看。
各种 NoSQL 数据库
学习使用 NoSQL 数据库其实并不是一件很难的事,只要你把官方的文档仔细地读一下,是很容易上手的,而且大多数 NoSQL 数据库都是开源的,所以,也可以通过代码自己解决问题。下面我主要给出一些典型的 NoSQL 数据库的一些经验型的文章,供你参考。
列数据库 Column Database
-
Cassandra 相关
-
沃尔玛实验室有两篇文章值得一读。
- Yelp: How We Scaled Our Ad Analytics with Apache Cassandra,Yelp 的这篇博客也有一些相关的经验和教训。
- Discord: How Discord Stores Billions of Messages,Discord 公司分享的一个如何存储十亿级消息的技术文章。
- Cassandra at Instagram,Instagram 的一个 PPT,其中介绍了 Instagram 中是怎么使用 Cassandra 的。
- Netflix: Benchmarking Cassandra Scalability on AWS — Over a million writes per second,Netflix 公司在 AWS 上给 Cassandra 做的一个 Benchmark。
-
-
HBase 相关
针对于 HBase 有两本书你可以考虑一下。
- 首先,先推荐两本书,一本是偏实践的《HBase 实战》,另一本是偏大而全的手册型的《HBase 权威指南》。
- 当然,你也可以看看官方的 The Apache HBase™ Reference Guide
-
另外两个列数据库:
文档数据库 Document Database - MongoDB, SimpleDB, CouchDB
- Data Points - What the Heck Are Document Databases?
- eBay: Building Mission-Critical Multi-Data Center Applications with MongoDB
- The AWS and MongoDB Infrastructure of Parse: Lessons Learned
- Migrating Mountains of Mongo Data
- Couchbase Ecosystem at LinkedIn
- Resurrecting Amazon SimpleDB
- Github: Awesome MongoDB
数据结构数据库 Data structure Database - Redis
- Learn Redis the hard way (in production) at Trivago
- Twitter: How Twitter Uses Redis To Scale - 105TB RAM, 39MM QPS, 10,000+ Instances
- Slack: Scaling Slack's Job Queue - Robustly Handling Billions of Tasks in Milliseconds Using Kafka and Redis
- GitHub: Moving persistent data out of Redis at GitHub
- Instagram: Storing Hundreds of Millions of Simple Key-Value Pairs in Redis
- Redis in Chat Architecture of Twitch (from 27:22)
- Deliveroo: Optimizing Session Key Storage in Redis
- Deliveroo: Optimising Redis storage, part two
- GitHub: Awesome Redis
时序数据库 Time-Series Database
- What is Time-Series Data & Why We Need a Time-Series Database
- Time Series Data: Why and How to Use a Relational Database instead of NoSQL
- Beringei: High-performance Time Series Storage Engine [cite/t:@Facebook]
- Introducing Atlas: Netflix's Primary Telemetry Platform [cite/t:@Netflix]
- Building a Scalable Time Series Database on PostgreSQL
- Scaling Time Series Data Storage - Part I [cite/t:@Netflix]
- Design of a Cost Efficient Time Series Store for Big Data
- GitHub: Awesome Time-Series Database
图数据库 - Graph Platform
-
首先是 IBM Devloperworks 上的两个简介性的 PPT。
- Intro to graph databases, Part 1, Graph databases and the CRUD operations
- Intro to graph databases, Part 2, Building a recommendation engine with a graph database
- 然后是一本免费的电子书《Graph Database》。
-
接下来是一些图数据库的介绍文章。
搜索数据库 - ElasticSearch
- Elasticsearch: The Definitive Guide 这是官网方的 ElasticSearch 的学习资料,基本上来说,看这个就够了。
-
接下来是 4 篇和性能调优相关的工程实践。
- 最后是 GitHub 上的资源列表 GitHub: Awesome ElasticSearch。
容器化和自动化运维
Docker
Docker 底层技术:
- Docker 基础技术:Linux Namespace(上)
- Docker 基础技术:Linux Namespace(下)
- Docker 基础技术:Linux Cgroup
- Docker 基础技术:AUFS
- Docker 基础技术:DeviceMapper
还有一些不错的与 Docker 网络有关的文章你需要阅读及实践一下:
- A container networking overview
- Docker networking 101 - User defined networks
- Understanding CNI (Container Networking Interface)
- Using CNI with Docker
Docker 有下面几种网络解决方案:Calico、Flannel 和 Weave,你需要学习一下。另外,还需要学习一下 netshoot,这是一个很不错的用来诊断 Docker 网络问题的工具集。
关于这几个容器网络解决方案的性能对比,你可以看一下下面这几篇文章或报告。
- Battlefield: Calico, Flannel, Weave and Docker Overlay Network
- Comparison of Networking Solutions for Kubernetes
- Docker Overlay Networks: Performance analysis in high-latency enviroments
如果你对 Docker 的性能有什么问题的话,你可以看一下下面这些文章。
下面是一些和存储相关的文章。
- Storage Concepts in Docker: Network and Cloud Storage
- Storage Concepts in Docker: Persistent Storage
- Storage Concepts in Docker: Shared Storage and the VOLUME directive
然后是跟运维相关的文章。
最佳实践
下面分享一些与 Docker 相关的最佳实践。
- Best Practices for Dockerfile,Docker 官方文档里的 Dockerfile 的最佳实践。
- Docker Best Practices,这里收集汇总了存在于各个地方的使用 Docker 的建议和实践。
- Container Best Practices,来自 Atomic 项目,是一个介绍容器化应用程序的架构、创建和管理的协作型文档项目。
- Eight Docker Development Patterns,八个 Docker 的开发模式:共享基础容器、共享同一个卷的多个开发容器、开发工具专用容器、测试环境容器、编译构建容器、防手误的安装容器、默认服务容器、胶黏容器(如英文链接不能访问,可阅读 中文版本)。
Kubernetes
Kubernetes 是 Google 开源的容器集群管理系统,是 Google 多年大规模容器管理技术 Borg 的开源版本,也是 CNCF 最重要的项目之一,主要功能包括:
- 基于容器的应用部署、维护和滚动升级;
- 负载均衡和服务发现;
- 跨机器和跨地区的集群调度;
- 自动伸缩;
- 无状态服务和有状态服务;
- 广泛的 Volume 支持;
- 插件机制保证扩展性。
Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。
首先,我推荐你阅读 Kubernetes 前世今生的一篇论文。
- Borg, Omega, and Kubernetes,看看 Google 这十几年来从这三个容器管理系统中得到的经验教训。
学习 Kubernetes,有两个免费的开源电子书。
- 《Kubernetes Handbook》,这本书记录了作者从零开始学习和使用 Kubernetes 的心路历程,着重于经验分享和总结,同时也会有相关的概念解析。希望能够帮助你少踩坑,少走弯路,还会指引你关注 kubernetes 生态周边,如微服务构建、DevOps、大数据应用、Service Mesh、Cloud Native 等领域。
- 《Kubernetes 指南》,这本书旨在整理平时在开发和使用 Kubernetes 时的参考指南和实践总结,形成一个系统化的参考指南以方便查阅。
这两本电子书都不错,前者更像是一本学习教程,而且面明显广一些,还包括 Cloud Natvie、Service Mesh 以及微服务相关的东西。而后者聚焦于 Kubernetes 本身,更像一本参考书。
另外,我这两天也读完了《Kubernetes in Action》一书,感觉写的非常好,一本很完美的教科书,抽丝剥茧,图文并茂。如果你只想读一本有关 Kubernetes 的书来学习 Kubernetes,那么我推荐你就选这本。
但是也别忘了 Kubernetes 的官方网站:Kubernetes.io,上面不但有 全面的文档,也包括一个很不错的 官方教程。
此外,还有一些交互式教程,帮助你理解掌握,以及一些很不错的文章推荐你阅读。
一些交互式教程
一些文章
这里还有一些不错的文档,你应该去读一下。
- Kubernetes tips & tricks
- Achieving CI/CD with Kubernetes
- How to Set Up Scalable Jenkins on Top of a Kubernetes Cluster
- 10 Most Common Reasons Kubernetes Deployments Fail Part I 和 Part II
- How to Monitor Kubernetes,一共有 4 个篇章
- Logging in Kubernetes with Fluentd and Elasticsearch
- Kubernetes Monitoring: Best Practices, Methods, and Existing Solutions
网络相关的文章
要学习 Kubernetes,你只需要读一下,下面这个 Kubernetes 101 系列的文章。
- Kubernetes 101 - Networking
- Kubernetes networking 101 - Pods
- Kubernetes networking 101 - Services
- Kubernetes networking 101 - (Basic) External access into the cluster
- Kubernetes Networking 101 - Ingress resources
- Getting started with Calico on Kubernetes
CI/CD 相关的文章
- Automated Image Builds with Jenkins, Packer, and Kubernetes
- Jenkins setups for Kubernetes and Docker Workflow
- Lab: Build a Continuous Deployment Pipeline with Jenkins and Kubernetes
最佳实践
- Kubernetes Best Practices by Sachin Arote,AWS 工程师总结的最佳实践。
- Kubernetes Best Practices by Sandeep Dinesh,Google 云平台工程师总结的最佳实践。
Docker 和 Kubernetes 资源汇总
GitHub 上和 Docker & Kubernetes 相关的 Awesome 系列:Awesome Docker,Awesome Kubernetes
虽然上面的这些系列非常全的罗列了很多资源,但是我觉得很不系统。对于系统的说明 Docker 和 Kubernetes 生态圈,我非常推荐大家看一下 The New Stack 为 Kubernetes 出的一系列的电子书或报告。
The New Stack eBook Series,非常完整和详实的 Docker 和 Kubernetes 生态圈的所有东西。
- Book 01: The Docker Container Ecosystem
- Book 02: Applications & Microservices with Docker & Containers
- Book 03: Automation & Orchestration with Docker & Containers
- Book 04: Network, Security & Storage with Docker & Containers
- Book 05: Monitoring & Management with Docker & Containers
- Book 06: Use Cases for Kubernetes
- Book 07: State of the Kubernetes Ecosystem
- Book 08: Kubernetes Deployment & Security Patterns
- Book 09: CI/CD with Kubernetes
- Book 10: Kubernetes solutions Directory
- Book 11: Guide to Cloud-Native Microservices
参考资料
技术领域
- https://github.com/JacksonTian/fks
- https://github.com/KieSun/all-of-frontend
- https://web.qianguyihao.com/
- https://github.com/spring2go/cs_study_plan
- Github 搜过关键词:前端、front-end、web development
- 计算机科学的主要领域
- w3resource
- https://github.com/tnfe/TNT-Weekly
- https://github.com/ascoders/weekly
- https://github.com/tianheg/tianheg/issues/27