编程技术一览,程序员练级攻略

问题一:前端领域研究的对象是什么?有哪些研究方向?有哪些常用术语?

  1. 研究对象是页面和人的相互,更好地服务于人
  2. 研究方向:WebGL、Canvas、VR、3D 等
  3. 常用术语:继承、变量提升、闭包

问题二:前端领域存在的作用是什么?为了解决什么问题?现在进展到哪里?

  1. 页面设计逐渐发展壮大、人的审美需求的不断提高,由此产生的专门领域
  2. 与后端的协调,与数据库的沟通
  3. Web3.0;低代码;区块链

问题三:这个领域的主要方法是什么?有哪些技术是被广泛承认和应用的?

  1. 不知道
  2. JS,HTML,CSS,Vue,React 等

学习方法

  • 先对要学习的技术,有大概认知(建立索引):

    • 索引建立成功的标志:遇到问题能够立刻想到运用哪部分知识解决
    • 建立索引的方法: 了解该技能(软件、工具)每一处知识点(功能)的用处是什么、它能解决什么问题
  • 一定要动手做一遍,问自己是否理解代码中的每一处细节;做出小项目来
  • 阅读经典书
  • 浏览历史
  • 一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。

学习方法的话,就是确定一个要研究的主题,然后大量阅读该主题相关的文章,尽量保证每篇文章都能理解,如果不能理解,第二天再看一遍,直到看懂为止,如果可以的话,再写写文章,将学到的知识梳理出来,与大家分享。

目标

  1. 打牢计算机基础
  2. 熟悉前端所需知识
  3. 能够用代码表达想法

技术领域/工具

浏览器

  • 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

开发工具

SEO

代码组织

安全

  • CSRF / XSS
  • CSP
  • Same-orgin policy
  • AD safe / Caja / Sandbox

编程知识储备

  • 数据结构
  • OOP / AOP
  • Prototype / Scope
  • Closure
  • Programming paradigm(常见的编程范型有:函数式编程、指令式编程、过程式编程、面向对象编程等等。)
  • Design Patterns(Learning JavaScript Design Patterns)

计算机知识储备

  • 编译原理
  • 计算机网络
  • 操作系统
  • 算法原理
  • 软件工程/软件测试原理
  • Unicode

软技能

  • 知识管理/总结分享
  • 沟通技巧/团队协作
  • 需求管理/PM
  • 交互设计/可用性/可访问性知识

可视化

服务器

数据库

  • MySQL / PostgreSQL / IBM Db2 / Oracle Database
  • MariaDB
  • SQLite
  • MongoDB / CouchDB

数据缓存

文件缓存/代理

Linux DE(desktop environment)

跨平开发工具组件

程序员练级攻略

第一步:零基础启蒙

什么是编程

第一步:《与孩子一起学编程》

第二步:在 CodeAbbey 做一些在线编程的练习

第三步:做个网页 Getting started with the Web

编程入门

一、入门语言 Python

第一步:《Python 编程快速上手》

第二步:《Python 编程:从入门到实践》

二、入门语言 JavaScript

第一步:JavaScript - MDN

第二步:JavaScript Tutorial - W3 schools

第三步:廖雪峰的 JavaScript 教程

三、操作系统入门 Linux

第一步:Linux 教程

四、编程工具 Visual Studio Code

第一步:VS Code 中文文档

五、Web 编程入门

1, 前端基础

学习 CSSHTML,还有前面学习过的 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, 学习目的

感受编程,只是为了入门,不必特别精通,做到:

  1. 知道 JS 和 Python 的不同即可
  2. 知道相关文档和知识在哪里
实践项目:简单 Blog 系统或 BBS 系统

项目功能:

  1. 用户登录和注册(不需密码找回)
  2. 用户发布博客/帖子(纯文本即可,不需支持富文本)
  3. 用户评论博客/帖子(纯文本即可,不需支持富文本)

项目技术点注意:

  1. 用户登录的密码不应保存为明文,应用 MD5+Salt 来保存
  2. 用户登录后,对于自己的博客/帖子可以有「重新编辑」或「删除」功能,但无权编辑和删除其他用户的博客/帖子
  3. 数据库的设计,需要三张表:用户表、文章表和评论表,它们之间是怎么关联的(如何建表

可以再进一步研究的功能:

  • 图片验证码
  • 上传图片
  • 阻止用户在发文章或评论时输入带有 HTML 或 JS 的东西
  • 防范 SQL 注入。参见文档 PHP

第二步:正式入门

无论我做什么事,我都会面对各式各样的困难,这对每个人来说都是一样的,而只有兴趣、热情和成就感才能让我不畏惧这些困难。

编程技能

The Key To Accelerating Your Coding Skills:

  1. 找到自己的 inflection point of coding,不再别人手把手教我
  2. 对于初学者来说,最重要的就是对细节的关注度,代码的每个错误都会反映在输出结果的错误消息上
  3. 调试错误消息非常重要。事实上,经验不足或丰富的开发者都面对同样的错误消息。区别在于,(处理错误消息)经验丰富的开发者能够更快速地定位错误并解决
  4. 教程只能教给我很有限的知识,真正的自信来自于,苦苦思考一个没有答案的问题,最终凭借自己的思考解决
  5. 我永远不会知道,所有能帮助我解决问题的内容(You will never know everything you need to know to solve all your problems.)。假设自己已经学完需要的任何内容是不符合实际的
  6. 有经验的开发者,为还未解决的问题寻找答案,因为这给他们学习更多内容的机会

一、编程技巧《代码大全》

二、编程语言

第一步,Head First Java

第二步,Java 核心技术·卷 I

第三步,Spring in Action

第四步,Spring Boot in Action,能看懂多少就看多少

三、操作系统 《鸟哥的 Linux 私房菜》 简体第四版

四、网络协议 HTTP - MDN

要点:

  1. HTTP 头
  2. HTTP 请求方法
  3. HTTP 返回码
  4. HTTP 的 Cookie、缓存、会话;链接管理

五、数据库设计

第一步,数据库设计那些事儿

第二步,MySQL 官方文档或《MySQL 必知必会》

六、前端方面

第一步,JS 库 jQuery

第二步,CSS 库 Bootstrap

在这过程中的重点:

  1. 使用 JS Ajax 请求后端的 API 接口
  2. JS 的 Promise 模式(参考资料:ECMAScript 6 入门 by 阮一峰

七、字符编码

参考资料:

编程工具
实践项目:投票系统

业务需求:

  • 用户只有登陆后才可生成投票表单
  • 投票项可单选,或多选
  • 其他用户投票后显示当前投票结果(但是不能刷票)
  • 投票页面需要倒计时提示
  • 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数

技术需求:

  • Java Spring Boot 实现,后端不返回 HTML,只返回 JSON 数据给前端
  • 由前端的 jQuery 来处理并操作相关的 HTML 动态生成在前端显示的页面
  • 前端的页面是响应式的,用 完成

进阶功能:

  • 在微信中,通过微信授权后记录用户信息,以防止刷票
  • 不用刷新页面,动态看到投票结果
  • 使用一些图表库,把图表画得更好看一些

第二步:程序员修养

What are some of the most basic things every programmer should know?:

  1. 没有经过测试,就不起作用
  2. 版本控制是你的朋友——确定使用它
  3. 你写出的代码并不属于你——同事改动你的代码不要生气
  4. 不要重复发明轮子,库会帮助你
  5. The fastest code is code that's never executed — look for early outs.(看了翻译也不理解)
  6. 不是你写的,不代表是垃圾
  7. 源代码只是给编译器的一个提示,告诉它你想让它做什么,它不一定会做
  8. 难以理解的代码同样很难维护
  9. 难以维护的代码是没有用的
  10. "Whilst I'm editing this file I'll just…" is a great way to introduce feature creep and bugs.(看了翻译也不理解)
  11. 你的代码布局越简洁,就越容易阅读。越容易阅读,就越容易理解和维护
  12. 代码不会自己写文档。通过添加评论来引导阅读代码的人。现在你理解这段代码,五年之后呢
  13. 糟糕的代码总是让我们困扰
  14. 没有 5 分钟能完成的工作,最少半天
  15. Magic numbers are bad.(看了翻译也不理解)
  16. Constants don't take up storage, they're compile time text substitutions.(看了翻译也不理解)
  17. Project management will always want you to do twice as much in half the time.
  18. 如果有 Bug,用户能够发现
  19. 代码审查不是批评
  20. 重要的不是数量,而是质量。任何白痴都能敲出 40kloc(lines of code)毫无用处的代码
  21. 写出糟糕代码的成本在于,维护
  22. Eat your own dog food——修复自己代码中 Bug,能帮助我更好地编程,改善理解能力
  23. 代码会随着时间的推移而腐烂
  24. 如果用户没有要求提供一个新特性,不要添加它
  25. 没有经过测试,就不起作用(很重要,所以提醒两次)

97 Things Every Programmer Should Know

问问题的能力
写代码的修养

书籍推荐:

  1. 代码大全
  2. 重构:改善既有代码的设计
  3. 修改代码的艺术 Working Effectively with Legacy Code
  4. 代码整洁之道
  5. 程序员的职业素养

Code Review:

  1. Code Review Best Practic
  2. How Google Does Code Review
  3. LinkedIn's Tips for Highly Effective Code Review

Unit Test:

  1. JUnit 5 User Guide
  2. You Still Don't Know How to Do Unit Testing
  3. Unit Testing Best Practices: JUnit Reference Guide
  4. JUnit Best Practices
安全防范

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++ 语言
Go 语言

入门:Go by ExampleGo 101The Go Programming LanguageGO 语言简介(上)- 语法GO 语言简介(下)- 特性

设计模式

书籍推荐:

  • 设计模式
  • Head First 设计模式

学习面向对象的设计模式时,不要执着于 23 个设计模式,明白两个原理:

  • Program to an 'interface', not an 'implementation'

    • 使用者不需要知道数据类型、结构、算法的细节
    • 使用者不需要知道实现细节,只需要知道提供的接口
    • 利于抽象、封装,动态绑定,多态。符合面向对象的特质和理念
  • Favor 'object composition' over 'class inheritance'

    • 继承需要给子类暴露一些父类的设计和实现细节
    • 父类实现的改变会造成子类也需要改变
    • 我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法
    • 继承更多的应该是为了多态

第四步:理论学科

算法& 数据结构
其他理论知识

书籍:

  • 数据结构与算法分析
  • 数据库系统概念
  • 现代操作系统
  • 计算机网络
  • 计算机程序的构造和解释
  • 编译原理

第五步:系统知识

系统知识是理论知识的工程实践。

  • Unix/Linux
  • TCP/IP
  • C10k

书籍:

  • 深入理解计算机系统 Computer Systems A Programmer's Perspective
  • UNIX 环境高级编程
  • Unix 网络编程

    • 第 1 卷 套接口 API
    • 第 2 卷 进程间通信
  • TCP/IP 详解 卷 1:协议

比上述更容易读的书:

网络协议实践:

  • Wireshark 数据包分析实战

看完《Unix 高级环境编程》后,你可以趁热打铁看看《Linux/Unix 系统编程手册》或是罗伯特·拉姆(Robert Love)的 Linux System Programming 英文电子版 。其中文翻译版 Linux 系统编程 也值得一读,虽然和《Unix 高级环境编程》很像,不过其主要突出的是 Linux 的一些关键技术和相关的系统调用。

关于 TCP 的东西,你还可以看看下面这一系列的文章:

系统知识的学习要点
  • 用这些系统知识操作一下文件系统,实现一个可以拷贝目录树的小程序
  • 用 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 语言会在泛型编程、多态等方面有局限性
有关软件设计的读物

之后就是术业专攻了

  • 底层方向:操作系统、文件系统、数据库、网络……
  • 架构方向:分布式系统架构、微服务、DevOps、Cloud Native……
  • 数据方向:大数据、机器学习、人工智能……
  • 前端方向:用户体验、交互……
  • 其它方向:比如,安全开发、运维开发、嵌入式开发……

这些方向你要仔细选择,因为一旦选好,就要勇往直前地走下去,当然,你要回头转别的方向也没什么问题,因为你有前面的这些基础知识在身,所以,不用害怕。 只是不同的方向上会有不同的经验积累,经验积累是看书看不来的,这个是转方向的成本。

前端

前端基础
  • HTML5、CSS3(Canvas、SVG、WebGL、CSS 图形变换)、ES6
  • JavaScript 核心原理
  • 浏览器工作原理
  • 网络协议 HTTP
  • 前端性能调优
  • 框架学习
  • UI 设计

一、HTML5

二、Canvas - MDN

三、SVG - MDN

四、WebGL - MDN

五、CSS3

几个公司的 CSS 实践:

读物:

  • 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

读物:

前端框架

框架比较:

一、React.js 框架

1)入门

2)提高

二、Vue.js 框架

1)入门

2) 其他文章

UI/UX 设计

一、原子设计(Atomic Design)

二、设计语言和设计系统

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

2)Material Design

3)其他公司

三、动画效果设计

四、相关资源

1)文章资源

2)设计收集

编程规范

有编程规范的好处:

  • 代码易阅读,进而易理解易维护
  • 提升开发效率
  • 提高代码质量,减少 Bug
  • 团队高效协作

编程语言

C++ 语言
Go 语言
JavaScript 语言

较简单的 JS 编程规范

PHP 语言
Python 语言
Scala 语言
Shell 语言

Mozilla 的编程规范

API 相关

Linux 系统、内存和网络

内存相关

计算机网络

网络学习
网络协议

想要学习网络协议最好的方式就是学习通讯相关的 RFC。读 RFC 有几个好处,一方面可以学习技术,另一方面,可以通过 RFC 学习到一个好的技术文档是怎么写的,还能看到各种解决问题的方案和思路。

对于第 2 层链路层,需要了解 ARP:

Tunnel 相关的协议:

对于第 4 层,最需要了解的是 TCP/IP 了。和 TCP 相关的 RFC 相当多,这里给一系列经典的 RFC。这些 RFC 都引用在了 CoolShell 上的《TCP 的那些事儿(上)》和《TCP 的那些事儿(下)》两篇文章中。如果看不懂 RFC,也可以去看上述的文章。

我个人觉得 TCP 最牛的不是不丢包,而是拥塞控制。对此,如果你感兴趣,可以读一下经典论文《Congestion Avoidance and Control》。

关于 Linux 下的 TCP 参数,仔仔细细地读一下 TCP 的 man page

对于第 7 层协议,HTTP 协议是重点要学习的。

  • (重点推荐)HTTP 权威指南

HTTP 1.1 的原始 RFC 是 1999 年 6 月的 RFC 2616,但其在 2014 后很快被下面这些 RFC 给取代了。

关于 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 的实现和设计方式:

基本上来说,异步 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 algorithmRead-copy-updateSeqlock

接下来,读一下以下两篇论文。

博客订阅:

一些编程相关的一些 C/C++ 的类库,这样你就不用从头再造轮子了(对于 Java 的,请参看 JDK 里的 Concurrent 开头的一系列的类):

其他:

相关论文

  • 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 字节码相关

三个操控字节码的库:

  • AsmTools - 用于生产环境的 Java .class 文件开发工具
  • Byte Buddy - 代码生成库:运行时创建 Class 文件而不需要编译器帮助
  • Jitescript - 和 BiteScript 类似的字节码生成库

数据库

对于数据库方向,重点就是两种数据库,一种是以 SQL 为代表的关系型数据库,另一种是以非 SQL 为代表的 NoSQL 数据库。关系型数据库主要有三个:Oracle、MySQL 和 Postgres。

在这里,我们只讨论越来越主流的 MySQL 数据库。首先,我们要了解数据库的一些实现原理和内存的一些细节,然后我们要知道数据的高可用和数据复制这些比较重要的话题,了解一下关系型数据库的一些实践和难点。然后,我们会进入到 NoSQL 数据库的学习。

NoSQL 数据库千奇百怪,其主要是解决了关系型数据库中的各种问题。第一个大问题就是数据的 Schema 非常多,用关系型数据库来表示不同的 Data Schema 是非常笨拙的,所以要有不同的数据库(如时序型、键值对型、搜索型、文档型、图结构型等)。另一个大问题是,关系型数据库的 ACID 是一件很讨厌的事,这极大地影响了数据库的性能和扩展性,所以 NoSQL 在这上面做了相应的妥协以解决大规模伸缩的问题。

对于一个程序员,你可能觉得数据库的事都是 DBA 的事,然而我想告诉你你错了,这些事才真正是程序员的事。因为程序是需要和数据打交道的,所以程序员或架构师不仅需要设计数据模型,还要保证整体系统的稳定性和可用性,数据是整个系统中关键中的关键。所以,作为一个架构师或程序员,你必须了解最重要的数据存储——数据库。

关系型数据库

关系型数据库最主要的两个代表是闭源的 Oracle 和开源的 MySQL。

MySQL 有两个比较有名的分支,一个是 Percona,另一个是 MariaDB,其官网上的 Resources 页面中有很多不错的资源和文档,可以经常看看。Percona ResourcesMariaDB Resources,以及它们的开发博客中也有很多不错的文章,分别为 Percona BlogMariaDB Blog

然后是关于 MySQL 的一些相关经验型的文章。

关于 MySQL 的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。

对于 MySQL 的数据分区来说,还有下面几篇文章你可以看看。

然后,再看看各个公司做 MySQL Sharding 的一些经验分享。

NoSQL 数据库

关于 NoSQL 数据库,其最初目的就是解决大数据的问题。然而,也有人把其直接用来替换掉关系型数据库。所以在学习这个技术之前,我们需要对这个技术的一些概念和初衷有一定的了解。下面是一些推荐资料。

选 SQL 还是 NoSQL,这里有两篇文章,值得你看看。

各种 NoSQL 数据库

学习使用 NoSQL 数据库其实并不是一件很难的事,只要你把官方的文档仔细地读一下,是很容易上手的,而且大多数 NoSQL 数据库都是开源的,所以,也可以通过代码自己解决问题。下面我主要给出一些典型的 NoSQL 数据库的一些经验型的文章,供你参考。

列数据库 Column Database

针对于 HBase 有两本书你可以考虑一下。

图数据库 - Graph Platform
搜索数据库 - ElasticSearch

容器化和自动化运维

Docker

Docker 底层技术:

还有一些不错的与 Docker 网络有关的文章你需要阅读及实践一下:

Docker 有下面几种网络解决方案:CalicoFlannelWeave,你需要学习一下。另外,还需要学习一下 netshoot,这是一个很不错的用来诊断 Docker 网络问题的工具集。

关于这几个容器网络解决方案的性能对比,你可以看一下下面这几篇文章或报告。

如果你对 Docker 的性能有什么问题的话,你可以看一下下面这些文章。

下面是一些和存储相关的文章。

然后是跟运维相关的文章。

最佳实践

下面分享一些与 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 前世今生的一篇论文。

学习 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,你只需要读一下,下面这个 Kubernetes 101 系列的文章。

CI/CD 相关的文章

最佳实践

Docker 和 Kubernetes 资源汇总

GitHub 上和 Docker & Kubernetes 相关的 Awesome 系列:Awesome DockerAwesome Kubernetes

虽然上面的这些系列非常全的罗列了很多资源,但是我觉得很不系统。对于系统的说明 Docker 和 Kubernetes 生态圈,我非常推荐大家看一下 The New Stack 为 Kubernetes 出的一系列的电子书或报告。

The New Stack eBook Series,非常完整和详实的 Docker 和 Kubernetes 生态圈的所有东西。

Layout of comment panels