程序员练级攻略
零基础启蒙
《 Teach Yourself Programming in Ten Years》( 中英对照版)
《 程序员的荒谬之言还是至理名言?》。
第一份入门教程,主要是让你体会到编程是什么。
- 《与孩子一起学编程》
- 两个在线编程入门的网站: Codecademy: Learn Python 和 People Can Program
然后,你可以到 CodeAbbey 上去做一些在线编程的小练习。
第二份入门教程,主要是让你做点实际有用的东西。
- MDN的 Web开发入门 ,这个教程会带着你建立一个网站。然后,你可以把你的网页发布在GitHub上。
编程入门
入门语言Python
入门语言JavaScript
- MDN JavaScript教程,你可以认为这是最权威的JavaScript官方教程了,从初级到中级再到高级。
- W3School JavaScript教程,这个教程比较偏Web方面的编程。
- JavaScript全栈教程(廖雪峰),这是廖雪峰的一个比较偏应用的教程,也是偏Web方面的编程,同时包括涉及后端的Node.js方面的教程。
操作系统入门Linux
编程工具Visual Studio Code
-
前端基础。要系统地学习一下前端的知识,也就是CSS、HTML和JavaScript这三个东西。这里还是给出MDN的相关的技术文档页面 CSS文档 和 HTML文档 。 文档很大,你要学习的并不是所有的东西,而是了解CSS和HTML是怎么相互作用来展示数据的,然后,不用记忆文档中的内容,这两个文档是用来查找知识的。 另外,你可以简单地学习使用JavaScript操纵HTML。理解DOM和动态网页(可以参看 W3Schools的JavaScript HTML DOM的教程)。
-
后端基础。如果你想省点事,不想再学一门新的语言了,那么你可以直接用Python或者Node.js,这两个技术在前面提到的廖雪峰的那个教程里提到过。当然,如果你想试试另外一种脚本型的也是比较主流的编程语言,那么可以搞搞PHP,它也是很快就可以上手的语言。学习PHP语言,你可以先跟着 W3School的PHP教程 玩玩(其中有连接数据库的MySQL的教程)。然后,以 PHP的官网文档 作为更全的文档来学习或查找相关的技术细节。
下面是一些学习要点:
- 学习HTML基本语法。
- 学习CSS如何选中HTML元素并应用一些基本样式。
- 学会用 Firefox + Firebug 或 Chrome 查看你觉得很炫的网页结构,并动态修改。
- 在一台Linux机器上配置LEMP - Ubuntu/Nginx/PHP/MySQL这个环境。
- 学习PHP,让后台PHP和前台HTML进行数据交互,对服务器响应浏览器请求形成初步认识,并实现一个表单提交和反显的功能。
- 把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)。
实践项目
无论你用Python,还是Node.js,还是PHP,我希望你能做一个非常简单的Blog系统,或是BBS系统,需要支持如下功能:
- 用户登录和注册(不需密码找回)。
- 用户发贴(不需要支持富文本,只需要支持纯文本)。
- 用户评论(不需要支持富文本,只需要支持纯文本)。
你需要从前端一直做到后端,也就是说,从HTML/CSS/JavaScript,到后面的PHP(Python/Node.js),再到数据库。这其中需要你查阅很多的知识。
这里有几个技术点你需要关注一下。
- 用户登录时的密码不应该保存为明文,应该用MD5+Salt来保存。
- 用户登录后,对于用户自己的贴子可以有“重新编辑”或 “删除”的功能,但是无权编辑或删除其它用户的贴子。
- 数据库的设计,你需要三张表:用户表、文章表和评论表,它们之间是怎么关联的,你需要学习一下。这里有个PHP的blog教你怎么建表,你可以 前往一读。
如果你有兴趣,你可以顺着这个小项目,研究一下下面这几个事。
正式入门
编程技能
在系统地学习编程技能之前,我希望你能先看一下” The Key To Accelerating Your Coding Skills“, 这篇文章会告诉你如何有效地快速提高自己的编程能力。
-
编程技巧方面 《 代码大全》
-
编程语言方面 《 Java核心技术(卷1)》《 Head First Java》《 Spring in Action》《 Spring Boot 实战》。
-
操作系统 《 鸟哥的Linux私房菜》《Linux命令行与shell脚本编程大全.第3版》
-
网络协议请到 MDN 阅读一下其官方的 HTTP的文档。你需要知道HTTP协议的几个关键点:1)HTTP头,2)HTTP的请求方法,3)HTTP的返回码。还有,HTTP的Cookie、缓存、会话,以及链接管理,等等
-
数据库设计 《 MySQL必知必会》。
-
前端方面 - 前端的东西不算复杂,你需要学习几个东西。一个是和JavaScript相关的 jQuery,另一个是和CSS相关的 Bootstrap,学习这两个东西都不复杂,直接上其官网看文档就好了。最重要的是,你要学习一下如何使用JavaScript Ajax请求后端的API接口,而不是再像前面那样用后端来向前端返回HTML页面的形式了。这里,你需要学习一下,JavaScript的Promise模式。 阮一峰翻译的ES6的教程中有相关的内容。当然,你Google一下,也可以找到一堆学习资料。
-
字符编码方面 - 在你处理中文时有时会发现有乱码出现,此时需要了解ASCII和Unicode这样的字符编码。这里推荐一篇文章 - “ 关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)” 或是英文文章 “ The history of Character Encoding” 以及 Wikipedia - Character encoding。还有GitHub上的这两个Awesome仓库: Awesome Unicode 和 Awesome Code Points。
进阶级别的书:
-
《 Java并发编程实战》
-
《 Java性能权威指南》《 深入理解Java虚拟机》。
-
《 Java编程思想》
-
《 精通Spring 4.x》
-
《 设计模式》《 Head First设计模式》
如果你把上面的这些知识都融汇贯通的话,那么,你已是一个高级的Java程序员了。
编程工具
- 编程的IDE。Intellij IDEA,Visual Studio Code
- 版本管理工具。Git,推荐非常系统的 Pro Git 第二版 (备选 猴子都能懂的Git入门),然后你要学会使用GitHub(比如: GitHub and Git 图文教程 或 Git图文教程及详解)。
- 调试前端程序。你需要学会使用Chrome调试前端程序,你可以看看 超完整的Chrome浏览器客户端调试大全。
- 数据库设计工具。你需要学会使用MySQL WorkBench, 官方文档。
实践项目
设计一个投票系统的项目。
业务上的需求如下:
- 用户只有在登录后,才可以生成投票表单。
- 投票项可以单选,可以多选。
- 其它用户投票后显示当前投票结果(但是不能刷票)。
- 投票有相应的时间,页面上需要出现倒计时。
- 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。
技术上的需求如下:
- 这回要用Java Spring Boot来实现了,然后,后端不返回任何的HTML,只返回JSON数据给前端。
- 由前端的JQuery来处理并操作相关的HTML动态生成在前端展示的页面。
- 前端的页面还要是响应式的,也就是可以在手机端和电脑端有不同的呈现。 这个可以用Bootstrap来完成。
如果你有兴趣,还可以挑战以下这些功能。
- 在微信中,通过微信授权后记录用户信息,以防止刷票。
- 可以不用刷页面,就可以动态地看到投票结果的变化。
- Google一些画图表的JavaScript库,然后把图表画得漂亮一些。
上面那些书和知识你要看完,还要能理解并掌握,我估计你最少也要花1-2年左右的时间。
程序员修养
要了解程序员的修养,你可以先从Quora上的这个贴子开始 “ What are some of the most basic things every programmer should know?”,我摘录一些在这里供你参考。
- Bad architecture causes more problems than bad code.
- You will spend more time thinking than coding.
- The best programmers are always building things.
- There’s always a better way.
- Code reviews by your peers will make all of you better.
- Fewer features for better code is always the right answer in the end.
- If it’s not tested, it doesn’t work.
- Don’t reinvent the wheel, library code is there to help.
- Code that’s hard to understand is hard to maintain.
- Code that’s hard to maintain is next to useless.
- Always know how your business makes money, that determines who gets paid what.
- If you want to feel important as a software developer, work at a tech company.
然后是 《 97 Things Every Programmer Should Know》,其中有97个非常不错的编程方面的建议。
英文能力
-
坚持Google英文关键词,而不是在Google里搜中文。
-
在GitHub上只用英文。用英文写代码注释,写Code Commit信息,用英文写Issue和Pull Request,以及用英文写Wiki。
-
坚持到YouTube上每天看5分钟的视频。YouTube上有相关的机器字幕,实在不行就打开字幕。
-
坚持用英文词典而不是中文的。比如: 剑桥英语词典 或是 Dictionary.com 。你可以安装一个Chrome插件 Google Dictionary。
-
坚持用英文的教材而不是中文的。比如: BBC 的 Learning English ,或是到一些ESL网站上看看,如 ESL: English as a Second Language 上有一些课程。
-
花钱参加一些线上的英文课程,用视频和老外练习。
问问题的能力
提问的智慧( How To Ask Questions The Smart Way)简体中文翻译版
另外,还有一个经典的问题叫 X-Y Problem。对我来说,这是一个很容易犯的错误,所以,你也要小心避免(我曾经在我的Coolshell上写过这个事《 X-Y问题》)。
你可以到StackOverflow上看看如何问问题的一些提示– “ FAQ for StackExchange Site”。
写代码的修养
除了《代码大全》外,你还需要补充一些如何写好代码的知识,有以下几本书推荐。
-
《 重构:改善既有代码的设计》
-
《 修改代码的艺术》
-
《 代码整洁之道》
-
《 程序员的职业素养》
Code Review
- Code Review Best Practices
- How Google Does Code Review
- LinkedIn’s Tips for Highly Effective Code Review
除了Code Review之外,Unit Test也是程序员的一个很重要的修养。写Unit Test的框架一般来说都是从JUnit衍生出来的,比如CppUnit之类的。学习JUnit使用的最好方式就是到其官网上看 JUnit User Guide( 中文版)。然后,有几篇文章你可以看看(也可以自行Google):
- You Still Don’t Know How to Do Unit Testing
- Unit Testing Best Practices: JUnit Reference Guide
- JUnit Best Practices
安全防范
在代码中没有最基本的安全漏洞问题,也是我们程序员必须要保证的重要大事,尤其是对外暴露Web服务的软件,其安全性就更为重要了。对于在Web上经常出现的安全问题,有必要介绍一下 OWASP - Open Web Application Security Project。
美国联邦贸易委员会(FTC)强烈建议所有企业需遵循OWASP十大Web弱点防护守则,中文版《 OWASP Top 10 2017 PDF 中文版》。
下面是安全编程方面的一些Guideline。
此外,有一篇和HTTP相关的安全文章也是每个程序员必须要读的——《 Hardening Your HTTP Security Headers》。
最后想说的是”防御性编程”,英文叫 Defensive Programming,它是为了保证对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。下面是一些文章。
- The Art of Defensive Programming。
- 当然,也别太过渡了,这篇文章可以看看, Overly defensive programming。
软件工程和上线
- 关于测试,推荐两本书。
-
《 Google软件测试之道》
- 当你的系统要上线时,你是不是已经做好上线的准备了?这里有两个Checklist供你做上线前的一些检查。
- 《 Monitoring 101》这是一篇运维方面的入门文章,告诉你最基本的监控线上运行软件的方法和实践。
编程语言相关
Java语言
- Code Conventions for the Java™ Programming Language ,Java官方的编程规范。
- Google Java Style Guide,Google的Java编码规范。
JavaScript语言
- JavaScript The Right Way ,一个相对比较容读的JavaScript编程规范,其中不但有代码规范,还有设计模式,测试工具,编程框架,游戏引擎……
- Google JavaScript Style Guide,Google公司的JavaScript的编码规范,一个非常大而全的编程规范。
- Airbnb JavaScript Style Guide,Airbnb的JavaScript编程规范。没Google的这么大而全,但是也很丰富了。
- jQuery Core Style Guide,jQuery的代码规范。
- JavaScript Clean Code,前面推荐过的《代码整洁之道》一书中的JavaScript的实践 。
还有一些其它相对比较简单的JavaScript编程规范。
- JavaScript Style Guides And Beautifiers ,这是一篇推荐JavaScript编程规范的文章,你可以看看。
- JavaScript Style Guide and Coding Conventions,这是W3Schools的JavaScript。
- Code Conventions for the JavaScript。
Python语言
- Style Guide for Python Code,Python官方的编程码规范。
- Google Python Style Guide,Google公司的Python编码规范。
- The Hitchhiker’s Guide to Python,这不只是Python的编程规范,还是Python资源的集散地,强烈推荐。
Shell语言
- Google Shell Style Guide,Google的Shell脚本编程规范。
Mozilla的编程规范
- Mozilla Coding Style Guide,其中包括C、C++、Java、Python、JavaScript、Makefile和SVG等编程规范。
前端开发相关
-
CSS Guidelines,CSS容易学,但是不好写,这篇规范会教你如何写出一个健全的、可管理的,并可以扩展的CSS。
-
Scalable and Modular Architecture for CSS,这是一本教你如何写出可扩展和模块化的CSS的电子书,非常不错。
-
Frontend Guidelines,一些和HTML、CSS、JavaScript相关的最佳实践。
-
Sass Guidelines,Sass作为CSS的补充,其要让CSS变得更容易扩展。然而,也变得更灵活,这意味着可以被更容易滥用。这里这篇”富有主见”的规范值得你一读。
-
Airbnb CSS / Sass Styleguide, Airbnb的CSS/Sass规范。
-
说了Sass就不得不说LESS,这里有几篇和LESS相关的: LESS Coding Guidelines、 LESS Coding Guidelines、 LESS coding standard。
-
HTML Style Guide,一个教你如何写出性能更高,结构更好,容易编程和扩展的HTML的规范。
-
HTML + CSS Code Guide,如何写出比较灵活、耐用、可持续改进的HTML和CSS的规范。
-
CoffeeScript Style Guide,CoffeeScript的最佳实践和编程规范。
-
Google HTML/CSS Style Guide,Google的HTML/CSS的编程规范。
-
Guidelines for Responsive Web Design ,响应式Web设计的规范和最佳实践。
-
U.S. Web Design Standards,这是美国政府网端要求的一些UI交互可视化的一些规范。
最后是一个前端开发的各种注意事项列表,非常有用。
- Front-End Checklist ,一个前端开发的Checklist,其中包括HTML、CSS和JavaScript,还和图片、字体、SEO、性能相关,还包括关一些和安全相关的事项,这个列表真的是太好了。
API相关
- HAL,一个简单的API规范教程。
- Microsoft REST API Guidelines,微软的Rest API规范。
- API Design Guide。
- RESTful API Designing guidelines - The best practices。
- JSON API - Recommendations,JSON相关的API的一些推荐实践。
- API Security Checklist ,API的安全问题的检查列表。
开发工具相关
Markdown相关
JSON
Git相关
正则表达式相关
数据库
关系型数据库
玩Oracle,我这里只推荐一本书《 Oracle Database 9i/10g/11g编程艺术》
-
学习MySQL,首先一定是要看 MySQL 官方手册。
-
然后,官方还有几个PPT也要学习一下。
-
然后推荐《 高性能MySQL》
-
如果你对MySQL的内部原理有兴趣的话,可以看一下这本书《 MySQL技术内幕:InnoDB存储引擎》。
还有官网的 MySQL Internals Manual 。
-
数据库的索引设计和优化也是非常关键的《 数据库的索引设计与优化》
下面还有一些不错的和MySQL相关的文章。
最后,还有一个MySQL的资源列表 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的集群复制,下面有这些文章供你学习一下,都是很不错的实践性比较强的文章。
-
Mitigating replication lag and reducing read load with freno
-
另外,Booking.com给了一系列的文章,你可以看看:
对于MySQL的数据分区来说,还有下面几篇文章你可以看看。
然后,再看看各个公司做MySQL Sharding的一些经验分享。
-
Uber: Code Migration in Production: Rewriting the Sharding Layer of Uber’s Schemaless Datastore
-
Airbnb: How We Partitioned Airbnb’s Main Database in Two Weeks
NoSQL数据库
数据结构数据库 Data structure Database - Redis
-
Twitter: How Twitter Uses Redis To Scale - 105TB RAM, 39MM QPS, 10,000+ Instances
-
Instagram: Storing Hundreds of Millions of Simple Key-Value Pairs in Redis
微服务
你需要看一下,Martin Fowler的这篇关于微服务架构的文档 - Microservice Architecture ( 中译版),这篇文章说明了微服务的架构与传统架构的不同之处在于,微服务的每个服务与其数据库都是独立的,可以无依赖地进行部署。你也可以看看Martin Fowler老人家现身说法的 视频。
另外,你还可以简单地浏览一下,各家对微服务的理解。
- AWS的理解 - What are Microservices?。
- Microsoft的理解 - Microservices architecture style。
- Pivotal的理解 - Microservices。
微服务架构
接下来,你可以看一下 IBM红皮书:Microservices Best Practices for Java ,这本书非常好,不但有通过把Spring Boot和 Dropwizard来架建Java的微服务,而且还谈到了一些标准的架构模型,如服务注册、服务发现、API网关、服务通讯、数据处理、应用安全、测试、部署、运维等,是相当不错的一本书。
当然,有一本书你也可以读一下—— 微服务设计。这本书全面介绍了微服务的建模、集成、测试、部署和监控,通过一个虚构的公司讲解了如何建立微服务架构。主要内容包括认识微服务在保证系统设计与组织目标统一上的重要性,学会把服务集成到已有系统中,采用递增手段拆分单块大型应用,通过持续集成部署微服务,等等。
与此相似的,也有其它的一系列文章,值得一读。
下面是Nginx上的一组微服务架构的系列文章。
- Introduction to Microservices
- Building Microservices: Using an API Gateway
- Building Microservices: Inter-Process Communication in a Microservices Architecture
- Service Discovery in a Microservices Architecture
- Event-Driven Data Management for Microservices
- Choosing a Microservices Deployment Strategy
- Refactoring a Monolith into Microservices
下面这是 Auto0 Blog 上一系列的微服务的介绍,有代码演示。
- An Introduction to Microservices, Part 1
- API Gateway. An Introduction to Microservices, Part 2
- An Introduction to Microservices, Part 3: The Service Registry
- Intro to Microservices, Part 4: Dependencies and Data Sharing
- API Gateway: the Microservices Superglue
还有Dzone的这个Spring Boot的教程。
- Microservices With Spring Boot - Part 1 - Getting Started
- Microservices With Spring Boot - Part 2 - Creating a Forex Microservice
- Microservices With Spring Boot - Part 3 - Creating Currency Conversion Microservice
- Microservices With Spring Boot - Part 4 - Using Ribbon for Load Balancing
- Microservices With Spring Boot - Part 5 - Using Eureka Naming Server
当然,如果你要玩得时髦一些的话,我推荐你使用下面的这套架构。
-
后端: Go语言 + 微服务工具集 Go kit ,因为是微服务了,所以,每个服务的代码就简单了。既然简单了,也就可以用任何语言了,所以,我推荐Go语言。
-
通讯: gRPC,这是Google远程调用的一个框架,它比Restful的调用要快20倍到50倍的样子。
-
API: Swagger ,Swagger是一种Restful API的简单但强大的表示方式,标准的,语言无关,这种表示方式不但人可读,而且机器可读。可以作为Restful API的交互式文档,也可以作为Restful API形式化的接口描述,生成客户端和服务端的代码。今天,所有的API应该都通过Swagger来完成。
-
网关: Envoy 其包含了服务发现、负载均衡和熔断等这些特性,也是一个很有潜力的网关。当然,Kubernetes也是很好的,而且它也是高扩展的,所以,完全可以把Envoy通过Ingress集成进Kubernetes。这里有一个开源项目就是干这个事的 - contour。
-
指标监控: Prometheus 。
-
调用跟踪: Jaeger 或是 Zipkin,当然,后者比较传统一些,前者比较时髦,最重要的是,其可以和Prometheus和Envory集成。
-
自动化运维: Docker + Kubernetes 。
微服务和SOA
在对微服务有了一定的认识以后,一定有很多同学分不清楚微服务和SOA架构,对此,你可以看一下这本电子书 - 《 Microservices vs. Service-Oriented Architecture》。通过这本书,你可以学到,服务化架构的一些事实,还有基础的SOA和微服务的架构知识,以及两种架构的不同。这本书的作者马克·理查兹(Mark Richards)同学拥有十年以上的SOA和微服务架构的设计和实现的经验。
另外,还有几篇其它对比SOA和微服务的文章你也可以看看。
- DZone: Microservices vs. SOA
- DZone: Microservices vs. SOA - Is There Any Difference at All?
- Microservices, SOA, and APIs: Friends or enemies?
除此之外,我们还需要知道微服务和其它架构的一些不同和比较,这样我们就可以了解微服务架构的优缺点。下面几篇文章将帮助获得这些知识。
- PaaS vs. IaaS for Microservices Architectures: Top 6 Differences
- Microservices vs. Monolithic Architectures: Pros, Cons, and How Cloud Foundry (PaaS) Can Help
- Microservices - Not A Free Lunch!
- The Hidden Costs Of Microservices
设计模式和最佳实践
然后,你可以看一下微服务的一些设计模式。
-
Microservice Patterns,微服务架构的设计模式和最佳实践。
-
Microservice Antipatterns and Pitfalls,微服务架构的一些已知的反模式和陷阱。
-
Microservice Architecture: All The Best Practices You Need To Know,这是一篇长文,里面讲述了什么是微服务、微服务架构的优缺点、微服务最大的挑战和解决方案是什么、如何避免出错,以及构建微服务架构的最佳实践等多方面的内容。推荐阅读。
-
Best Practices for Building a Microservice Architecture ,这篇文章分享了构建微服务架构的最佳实践。
-
Simplicity by Distributing Complexity,这是一篇讲如何使用事件驱动构建微服务架构的文章,其中有很多不错的设计上的基本原则。
相关资源
-
Microservices Resource Guide ,这个网页上是Martin Fowler为我们挑选的和微服务相关的文章、视频、书或是podcast。
-
Awesome Microservices ,一个各种微服务资源和相关项目的集中地。
容器化和自动化运维
Docker
-
你可以先看一下Docker的官方介绍 Docker Overview 。
-
然后再去一个Web在线的Playground上体验一下, Katacoda Docker Playground 或者是 Play With Docker 。
-
接下来,跟着 Learn Docker 这个文档中的教程自己安装一个Docker的环境,实操一把。
-
然后跟着 Docker Curriculum 这个超详细的教程玩一下Docker。
有了上述的一些感性体会之后,你就可以阅读Docker官方文档 Docker Documentation 了,这是学习Docker最好的方式。
如果你想了解一下Docker的底层技术细节,你可以参看我的文章。
- Docker 基础技术:Linux Namespace(上)
- Docker 基础技术:Linux Namespace(下)
- Docker 基础技术: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
-
Docker Overlay Networks: Performance analysis in high-latency enviroments
如果你对Docker的性能有什么问题的话,你可以看一下下面这些文章。
下面是一些和存储相关的文章。
然后是跟运维相关的文章。
最后,推荐看看 Valuable Docker Links ,其中收集并罗列了一系列非常不错的 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前世今生的一篇论文。
- 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系列。
虽然上面的这些系列非常全的罗列了很多资源,但是我觉得很不系统。对于系统的说明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: Guid to Cloud-Native Microservices
前端基础和底层原理
HTML 5
- HTML 5权威指南 ,本书面向初学者和中等水平Web开发人员,是牢固掌握HTML 5、CSS 3和JavaScript的必读之作。
Awesome HTML5 。GitHub上的Awesome HTML5,其中有大量的资源和技术文章。
CSS
MDN Web Doc - CSS 。我个人觉得只要你仔细读一下文档,CSS并不难学。绝大多数觉得难的,一方面是文档没读透,另一方面是浏览器支持的标准不一致。所以,学好CSS最关键的还是要仔细地读文档。
之后,在写CSS的时候,你会发现,你的CSS中有很多看起来相似的东西。你的DRY - Don’t Repeat Yourself洁癖告诉你,这是不对的。所以,你需要学会使用 LESS 和 SaSS 这两个CSS预处理工具,其可以帮你提高很多效率。
然后,你需要学习一下CSS的书写规范
- Principles of writing consistent, idiomatic CSS
- Opinionated CSS styleguide for scalable applications
- Google HTML/CSS Style Guide
如果你需要更有效率,那么你还需要使用一些CSS Framework,其中最著名的就是Twitter公司的 Bootstrap,除此之外,还有,主打清新UI的 Semantic UI 、主打响应式界面的 Foundation 和基于Flexbox的 Bulma。
当然,在使用CSS之前,你需要把你浏览器中的一些HTML标签给标准化掉。所以,推荐几个Reset或标准化的CSS库: Normalize、 MiniRest.css、 sanitize.css 和 unstyle.css。
关于更多的CSS框架,你可以参看 Awesome CSS Frameworks 上的列表。
接下来,是几个公司的CSS相关实践,供你参考。
- CodePen’s CSS
- Github 的 CSS
- Medium’s CSS is actually pretty f***ing good
- CSS at BBC Sport
- Refining The Way We Structure Our CSS At Trello
最后是一个可以写出可扩展的CSS的阅读列表 A Scalable CSS Reading List 。
JavaScript
下面是学习JavaScript的一些图书和文章。
-
JavaScript: The Good Parts ,中文翻译版为《JavaScript语言精粹》。这是一本介绍JavaScript语言本质的权威图书,值得任何正在或准备从事JavaScript开发的人阅读,并且需要反复阅读。学习、理解、实践大师的思想,我们才可能站在巨人的肩上,才有机会超越大师,这本书就是开始。
-
Secrets of the JavaScript Ninja ,中文翻译版为《JavaScript忍者秘籍》,本书是jQuery库创始人编写的一本深入剖析JavaScript语言的书。适合具备一定JavaScript基础知识的读者阅读,也适合从事程序设计工作并想要深入探索JavaScript语言的读者阅读。这本书有很多晦涩难懂的地方,需要仔细阅读,反复琢磨。
-
Effective JavaScript ,Ecma的JavaScript标准化委员会著名专家撰写,作者凭借多年标准化委员会工作和实践经验,深刻辨析JavaScript的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的68条精华建议。
- 接下来是ES6的学习,这里给三个学习手册源。
-
ES6 in Depth,InfoQ上有相关的中文版 - ES6 深入浅出。还可以看看 A simple interactive ES6 Feature list ,或是看一下 阮一峰翻译的ES6的教程 。
-
ECMAScript 6 Tools ,这是一堆ES6工具的列表,可以帮助你提高开发效率。
-
Modern JS Cheatsheet ,这个Cheatsheet在GitHub上有1万6千颗星,你就可见其影响力了。
-
- 然后,还有一组很不错的《 You Don’t Know JS 系列》 的书。
- 接下来是一些和编程范式相关的文章。
-
Glossary of Modern JavaScript Concepts: Part 1 ,首先推荐这篇文章,其中收集了一些编程范式方面的内容,比如纯函数、状态、可变性和不可变性、指令型语言和声明式语言、函数式编程、响应式编程、函数式响应编程。
-
Glossary of Modern JavaScript Concepts: Part 2 ,在第二部分中主要讨论了作用域和闭包,数据流,变更检测,组件化……
-
- 下面三篇文章是德米特里·索什尼科夫(Dmitry Soshnikov)个人网站上三篇讲JavaScript内在的文章。
- “ How JavaScript Works” 是一组非常不错的文章(可能还没有写完),强烈推荐。这一系列的文章是SessionStake的CEO写的,现在有13篇,我感觉可能还没有写完。这个叫 亚历山大·兹拉特科夫(Alexander Zlatkov) 的CEO太猛了。
-
Inside the V8 engine + 5 tips on how to write optimized code ,了解V8引擎。这里,也推荐 Understanding V8’s Bytecode 这篇文章可以让你了解V8引擎的底层字节码。
-
Memory management + how to handle 4 common memory leaks ,内存管理和4种常见的内存泄露问题。
-
Event loop and the rise of Async programming + 5 ways to better coding with async/await ,Event Loop和异步编程。
-
Deep dive into WebSockets and HTTP/2 with SSE + how to pick the right path ,WebSocket和HTTP/2。
-
A comparison with WebAssembly + why in certain cases it’s better to use it over JavaScript ,JavaScript内在原理。
-
The building blocks of Web Workers + 5 cases when you should use them ,Web Workers技术。
-
Service Workers, their lifecycle and use cases ,Service Worker技术。
-
The mechanics of Web Push Notifications ,Web端Push通知技术。
-
Tracking changes in the DOM using MutationObserver ,Mutation Observer技术。
-
The rendering engine and tips to optimize its performance ,渲染引擎和性能优化。
-
Inside the Networking Layer + How to Optimize Its Performance and Security ,网络性能和安全相关。
-
Under the hood of CSS and JS animations + how to optimize their performance ,CSS和JavaScript动画性能优化。
- 接下来是Google Chrome工程经理 阿迪·奥斯马尼(Addy Osmani) 的几篇JavaScript性能相关的文章,也是非常好的。
- 其它与JavaScript相关的资源。
-
JavScript has Unicode Problem ,这是一篇很有价值的JavaScript处理Unicode的文章。
-
JavaScript Algorithms ,用JavaScript实现的各种基础算法库。
-
JavaScript 30 秒代码 ,一堆你可以在30秒内看懂各种有用的JavaScript的代码,在GitHub上有2万颗星了。
-
What the f*ck JavaScript ,一堆JavaScript搞笑和比较tricky的样例。
-
Airbnb JavaScript Style Guide ,Airbnb的JavaScript的代码规范,GitHub上有7万多颗星。
-
JavaScript Patterns for 2017 ,YouTube上的一个JavaScript模式分享,值得一看。
-
浏览器原理
你需要了解一下浏览器是怎么工作的,所以,你必需要看《 How browsers work》。这篇文章受众之大,后来被人重新整理并发布为《 How Browsers Work: Behind the scenes of modern web browsers》,其中还包括中文版。这篇文章非常非常长,所以,你要有耐心看完。如果你想看个精简版的,可以看我在Coolshell上发的《 浏览器的渲染原理简介》或是看一下 这个幻灯片。
然后,是对Virtual DOM的学习。Virtual DOM是React的一个非常核心的技术细节,它也是前端渲染和性能的关键技术。所以,你有必要要好好学习一下这个技术的实现原理和算法。当然,前提条件是你需要学习过前面我所推荐过的浏览器的工作原理。下面是一些不错的文章可以帮你学习这一技术。
- 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实现供你参考:
网络协议
-
High Performance Browser Networking ,本书是谷歌公司高性能团队核心成员的权威之作,堪称实战经验与规范解读完美结合的产物。本书目标是涵盖Web开发者技术体系中应该掌握的所有网络及性能优化知识。
全书以性能优化为主线,从TCP、UDP 和TLS协议讲起,解释了如何针对这几种协议和基础设施来优化应用。然后深入探讨了无线和移动网络的工作机制。最后,揭示了HTTP协议的底层细节,同时详细介绍了HTTP 2.0、 XHR、SSE、WebSocket、WebRTC和DataChannel等现代浏览器新增的能力。
-
另外, HTTP/2 也是HTTP的一个新的协议,于2015年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。所以,你有必要学习一下这个协议。下面相关的学习资源。
- Gitbook - HTTP/2详解
- 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。你知道的,了解一个技术的缘由是非常重要的。
-
StackOverflow: My Understanding of HTTP Polling, Long Polling, HTTP Streaming and WebSockets ,这是StackOverflow上的一个HTTP各种链接方式的比较,也可以让你有所认识。
-
An introduction to Websockets ,一个WebSocket的简单教程。
-
Awesome Websockets ,GitHub的Awesome资源列表。
-
一些和WebSocket相关的想法,可以开阔你的思路:
-
前端性能优化和框架
前端性能优化
首先是推荐几本前端性能优化方面的图书。
-
Web Performance in Action ,这本书目前国内没有卖的。你可以看电子版本,我觉得是一本很不错的书,其中有CSS、图片、字体、JavaScript性能调优等。
-
Designing for Performance ,这本在线的电子书很不错,其中讲了很多网页优化的技术和相关的工具,可以让你对整体网页性能优化有所了解。
-
High Performance JavaScript ,这本书在国内可以买到,能让你了解如何提升各方面的性能,包括代码的加载、运行、DOM交互、页面生存周期等。雅虎的前端工程师尼古拉斯·扎卡斯(Nicholas C. Zakas)和其他五位JavaScript专家介绍了页面代码加载的最佳方法和编程技巧,来帮助你编写更为高效和快速的代码。你还会了解到构建和部署文件到生产环境的最佳实践,以及有助于定位线上问题的工具。
-
High Performance Web Sites: Essential Knowledge for Front-End Engineers ,这本书国内也有卖,翻译版为《高性能网站建设指南:前端工程师技能精髓》。作者给出了14条具体的优化原则,每一条原则都配以范例佐证,并提供了在线支持。
全书内容丰富,主要包括减少HTTP请求、Edge Computing技术、Expires Header技术、gzip组件、CSS和JavaScript最佳实践、主页内联、Domain最小化、JavaScript优化、避免重定向的技巧、删除重复JavaScript的技巧、关闭ETags的技巧、Ajax缓存技术和最小化技术等。
-
除了上面这几本书之外,Google的 Web Fundamentals 里的 Performance 这一章节也有很多非常不错的知识和经验。
接下来是一些最佳实践性的文档。
-
Browser Diet ,前端权威性能指南(中文版)。这是一群为大型站点工作的专家们建立的一份前端性能的工作指南。
-
PageSpeed Insights Rules ,谷歌给的一份性能指南和最佳实践。
-
Best Practices for Speeding Up Your Web Site ,雅虎公司给的一份7个分类共35个最佳实践的文档。
接下来,重点推荐一个性能优化的案例学习网站 WPO Stats 。WPO是Web Performance Optimization的缩写,这个网站上有很多很不错的性能优化的案例分享,一定可以帮助你很多。
然后是一些文章和案例。
-
A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 ,这是一篇比较浏览器的HTTPS、SPDY和HTTP/2性能的文章,除了比较之外,还可以让你了解一些技术细节。
-
7 Tips for Faster HTTP/2 Performance ,对于HTTP/2来说,Nginx公司给出的7个增加其性能的小提示。
-
Reducing Slack’s memory footprint ,Slack团队减少内存使用量的实践。
-
Pinterest: Driving user growth with performance improvements ,Pinterest关于性能调优的一些分享,其中包括了前后端的一些性能调优实践。其实也是一些比较通用的玩法,这篇文章主要是想让前端的同学了解一下如何做整体的性能调优。
-
10 JavaScript Performance Boosting Tips ,10个提高JavaScript运行效率的小提示,挺有用的。
-
17 Statistics to Sell Web Performance Optimization ,这个网页上收集了好些公司的Web性能优化的工程分享,都是非常有价值的。
-
Getting started with the Picture Element ,这篇文章讲述了Responsive布局所带来的一些负面的问题。主要是图像适配的问题,其中引出了一篇文章” Native Responsive Images” ,值得一读。
-
Improve Page Load Times With DNS Prefetching ,这篇文章教了你一个如何降低DNS解析时间的小技术——DNS prefetching。
-
Jank Busting for Better Rendering Performance ,这是一篇Google I/O上的分享,关于前端动画渲染性能提升。
-
JavaScript Memory Profiling ,这是一篇谷歌官方教你如何使用Chrome的开发工具来分析JavaScript内存问题的文章。
接下来是一些性能工具。在线性能测试分析工具太多,这里只推荐比较权威的。
-
PageSpeed ,谷歌有一组PageSpeed工具来帮助你分析和优化网站的性能。Google出品的,质量相当有保证。
-
YSlow ,雅虎的一个网页分析工具。
-
GTmetrix ,是一个将PageSpeed和YSlow合并起来的一个网页分析工具,并且加上一些Page load或是其它的一些分析。也是一个很不错的分析工具。
-
Awesome WPO ,在GitHub上的这个Awesome中,你可以找到更多的性能优化工具和资源。
另外,中国的网络有各种问题(你懂的),所以,你不能使用Google共享的JavaScript链接来提速,你得用中国自己的。你可以到这里看看中国的共享库资源, Forget Google and Use These Hosted JavaScript Libraries in China 。
前端框架
- Angular vs. React vs. Vue: A 2017 comparison
- React or Vue: Which JavaScript UI Library Should You Be Using?
- ReactJS vs Angular5 vs Vue.js - What to choose in 2018?
React.js框架
入门
React学起来并不复杂,就看 React 官方教程 和其文档就好了( React 的中文教程 )。
然后,下面的文章会带你了解一下React.js的基本原理。
-
All the fundamental React.js concepts ,这篇文章讲了所有的React.js的基本原理。
-
Learn React Fundamentals and Advanced Patterns ,这篇文章中有几个短视频,每个视频不超过5分钟,是学习React的一个很不错的地方。
-
Thinking in React,这篇文章将引导你完成使用React构建可搜索产品数据表的思考过程。
提高
学习一个技术最重要的是要学到其中的思想和方法。下面是一些我觉得学习React中最重要的东西。
-
状态,对于富客户端来说是非常麻烦也是坑最多的地方,这里有几篇文章你可以一读。
-
Common React.js mistakes: Unneeded state ,React.js编程的常见错误——不必要的状态。
-
State is an Anti-Pattern ,关于如何做一个不错的组件的思考,很有帮助。
-
Why Local Component State is a Trap ,一些关于 “Single state tree” 的想法。
-
Thinking Statefully ,几个很不错的例子让你对声明式有状态的技术有更好的理解。
-
传统上,解决React的状态问题一般用Redux。在这里推荐 Tips to learn React + Redux in 2018 。Redux是一个状态粘合组件,一般来说,我们会用Redux来做一些数据状态和其上层Component上的同步。这篇教程很不错。
-
最后是 “State Architecture Patterns in React “ 系列文章,非常值得一读。
-
-
函数式编程。从jQuery过来的同学一定非常不习惯React,而从Java等后端过来的程序员就会很习惯了。所以,我觉得React就是后端人员开发的,或者说是做函数式编程的人开发的。对此,你需要学习一下JavaScript函数式编程的东西。
这里推荐一本免费的电子书 《 Professor Frisby’s Mostly Adequate Guide to Functional Programming》,其中译版为《 JS函数式编程指南中文版》。
下面有几篇文章非常不错。前两篇和函数式编程有关的文章非常值得一读。后三篇是一些比较实用的函数式编程和React结合的文章。
-
设计相关。接下来是学习一些React的设计模式。 React Pattern 是一个不错的学习React模式的地方。除此之外,还有如下的一些不错的文章也会对你很有帮助的。
- 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
- Characteristics of an Ideal React Architecture
-
实践和经验
还有一些不错的实践和经验。
- 9 things every React.js beginner should know
- Best practices for building large React applications
- Clean Code vs. Dirty Code: React Best Practices
- How to become a more productive React Developer
- 8 Key React Component Decisions
资源列表
最后就是React的资源列表。
-
Awesome React ,这是一些React相关资源的列表,很大很全。
-
React/Redux Links ,这也是React相关的资源列表,与上面不一样的是,这个列表主要收集了大量的文章,其中讲述了很多React知识和技术,比上面的列表好很多。
-
React Rocks ,这个网站主要收集各种React的组件示例,可以让你大开眼界。
Vue.js框架
-
通过文章 “ Why 43% of Front-End Developers want to learn Vue.js” ,你可以看出其编程方式和React是大相径庭的,符合传统的前端开发的思维方式。
-
通过文章 Replacing jQuery With Vue.js: No Build Step Necessary ,我们可以看到,从jQuery是可以平滑过渡到Vue的。
-
另外,我们可以通过 “ 10 things I love about Vue” ,了解Vue的一些比较优秀的特性。
“ Vue on 2018 - Interview with Evan You” ( Vue是完全由其支持者和用户资助的,这意味着它更接近社区而不受大公司的控制。)
要学习Vue并不难,我认为上官网看文档( Vue 官方文档( 中文版)),照着搞一搞就可以很快上手了。 Vue.js screencasts 是一个很不错的英文视频教程。
另外,推荐 新手向:Vue 2.0的建议学习顺序 ,这是Vue作者写的,所以有特殊意义。
Vue的确比较简单,有Web开发经验的人上手也比较快,所以这里也不会像React那样给出很多的资料。下面是一些我觉得还不错的内容,推荐给你。
-
How not to Vue ,任何技术都有坑,了解Vue的短板,你就能扬长避短,就能用得更好。
当然,最后一定还有 Awesome Vue ,Vue.js里最为巨大最为优秀的资源列表。
个人技术博客
- Coding Horror ,这是杰夫·阿特伍德(Jeff Atwood)于2004年创办的博客,记录其在软件开发经历中的所思所想、点点滴滴。时至今日,该博客每天都有近10万人次的访问量,读者纷纷参与评论,各种观点与智慧在这里不断地激情碰撞。其博文选集在中国被翻译成《 高效能程序员的修练》,在豆瓣上有8.3的高分。2008年,他和Joel Spolsky联合创办了 StackOverflow 问答网站,为程序员在开发软件时节省了非常多的时间,并开启了“StackOverflow Copy + Paste 式编程”。
- Joel on Software ,Joel Spolsky的这个博客在全世界都有很多的读者和粉丝,其博文选集在中国被翻译成《 软件随想录》在豆瓣上有8.7的高分。这是一本关于软件技术、人才、创业和企业管理的随想文集,作者以诙谐幽默的笔触将自己在软件行业的亲身感悟娓娓道来,观点新颖独特,简洁实用。
- Clean Coder Blog ,这是编程大师“Bob 大叔”的博客,其真名叫Robert C. Martin,世界级软件开发大师,设计模式和敏捷开发先驱,敏捷联盟首任主席,C++ Report前主编,被后辈程序员尊称为“Bob大叔”。其博文选集在中国被翻译成《 程序员的职业素养》,在豆瓣上有8.8的高分。
- Martin Fowler ,这是另外一个程序员大师,Martin主要专注于面向对象分析与设计、统一建模语言、领域建模,以及敏捷软件开发方法,包括极限编程。他的《 重构》、《 分析模式》、《 企业应用架构模式》、《 领域特定语言》和《 NoSQL精粹》都是非常不错的书。在他的博客上有很多很多的编程和架构模式方法可以学习。
- Paul Graham Essays ,美国著名程序员、风险投资家、博客和技术作家。《 黑客与画家》是他的著作之一。2005年他与人共同创建了科技创业孵化器Y Combinator,孵化了Airbnb、Dropbox、Stripe等知名互联网公司。他有几篇创业方面的文章都很经典,如果你想创业,可以读一读这几篇:《 How to Get Startup Ideas》、《 Do Things that Don’t Scale》、《 Startup = Growth》。Paul Graham的文章以清新自然,思想深刻见长。不仅可以跟Paul Graham学创业,学思考,学技术,更可以学习写作。
- Steve Yegge ,Steve Yegge这个人算是一个知名的程序员了,在Amazon呆过,现在在Google,他的文章都是长篇大论,最知名的文章就是 对Amazon和Google平台的吐槽,这篇文章引发了大家的讨论和议论。
- Bruce Eckel’s Programming Blog ,《Thinking in Java》作者的博客,他之前的博客在artima - Computing Thoughts 。
- Peter Krumins’ blog ,这位老哥从2007年开始写博客,他博客里好玩的东西太多了。
- Programming is Terrible ,这个博客有很多强观点的文章,主要是软件开发中的一些教训。
- Accidentally Quadratic ,姑且翻译成事故二次方,这里有好些非常有趣的文章。
- Hacker Noon ,这是一个一堆人在写的博客,里面有很多质量很高的文章。
现在国外不错的博客都在一个叫 Medium 的网站
YouTube 技术频道
下面是我订阅的一些我认为还不错的和编程相关的频道,推荐给你。
- Google Developer ,Google公司的官方频道,其中包括Google I/O 大会、教程、新闻、最佳实践、技巧分享……
- Spring Developer ,Spring的官方频道。
- Prof. Dr. Jens Dittrich ,一个德国教授开的一个关于数据库相关的频道,里面有很不错的数据库内在原理的内容。
- Java ,Java相关的各种分享。
- Computerphile ,这个频道是布雷迪·哈伦(Brady Haran)运作的几个频道中的一个,这个频道是关于计算机技术的。除此之外,他还运作 Numberphile(数学)
各大公司技术博客
论文
如何读论文
- How to read an academic article
- Advice on reading academic papers
- How to read and understand a scientific paper
- Should I Read Papers?
- The Refreshingly Rewarding Realm of Research Papers
论文集散地
- 2 Minute Papers ,这是一个YouTube的频道,其会给出一些非常不错的和计算机相关的论文介绍,让你了解目前最有意思的一些科学突破,每次两分钟左右。
- Best Paper Awards in Computer Science ,从1996年以来,获奖的计算机科学方面的论文收集。
- Google Scholar ,Google学术搜索(英语:Google Scholar)是一个可以免费搜索学术文章的网络搜索引擎,由计算机专家阿努拉格·阿查里雅(Anurag Acharya)开发。2004年11月,Google第一次发布了Google学术搜索的试用版。该项索引包括了世界上绝大部分出版的学术期刊。
- Research at Google ,Google发布一些论文。
- Microsoft Research ,微软发布的论文。
- arXiv Paper Repository ,arXiv是一个收集物理学、数学、计算机科学与生物学的论文预印本的网站
- SciRate ,arXiv上的论文太多,所以,SciRate索引了arXiv上的一些好评的论文,并供大家评论和打分。( 开源代码。)
- cat-v.org ,这个网站,不只有论文,还有技术手册或是一些有意思的文章,包括一些历史资料什么的。
- Usenix: Best Papers ,Usenix上推荐的最佳论文。
- The Morning Paper ,该博客会每天推送一篇论文,特别棒。
- Lobste.rs tagged as PDF ,Lobsters是一个聚焦于技术的社区,主要是链接聚合和对话题进行讨论。其中的PDF分类可以认为也是一个论文的集散地。
- Papers We Love ,GitHub上的一个近3万颗星的计算机科学方面的论文社区。
如何拥有技术领导力?
怎样才算是拥有“技术领导力”呢?
-
能够发现问题。能够发现现有方案的问题。
-
能够提供解决问题的思路和方案,并能比较这些方案的优缺点。
-
能够做出正确的技术决定。用什么样的技术、什么解决方案、怎样实现来完成一个项目。
-
能够用更优雅,更简单,更容易的方式来解决问题。
-
能够提高代码或软件的扩展性、重用性和可维护性。
-
能够用正确的方式管理团队。所谓正确的方式,一方面是,让正确的人做正确的事,并发挥每个人的潜力;另一方面是,可以提高团队的生产力和人效,找到最有价值的需求,用最少的成本实现之。并且,可以不断地提高自身和团队的标准。
-
创新能力。能够使用新的方法新的方式解决问题,追逐新的工具和技术。
在任何一个团队中,大多数人都是在提问题,而只有少数人在回答这些人的问题,或是在提供解决问题的思路和方案,总是在提供解决问题的思路和方案的人才是有技术领导力的人。
怎么让自己拥有技术领导力呢?
第一,你要吃透基础技术。基础技术是各种上层技术共同的基础。
编程部分
-
C语言:《C程序设计语言(第2版)》,同时,肯定也要多写程序,多读一些优秀开源项目的源代码。
-
编程范式:
学好编程范式,有助于培养你的抽象思维,同时也可以提高编程效率,提高程序的结构合理性、可读性和可维护性,降低代码的冗余度,进而提高代码的运行效率。
-
算法和数据结构:算法(及其相应的数据结构)是程序设计的有力支撑。适当地应用算法,可以有效地抽象问题,提高程序的合理性和执行效率。算法是编程中最最重要的东西,也是计算机科学中最重要的基础。
系统部分
-
计算机系统原理:《深入理解计算机系统》(Randal E. Bryant)。
-
操作系统原理和基础:
一是要仔细观察和探索当前使用的操作系统,二是要阅读操作系统原理相关的图书,三是要阅读API文档(如man pages和MSDN Library),并编写调用操作系统功能的程序。《UNIX环境高级编程》《UNIX网络编程》和《Windows核心编程》。
-
网络基础:《TCP/IP详解》
-
数据库原理:
学习了数据库原理之后便能了解数据库访问性能调优的要点,以及保证并发情况下数据操作原子性的方法。要学习数据库,你可以阅读各类数据库图书,并多做数据库操作以及数据库编程,多观察分析数据库在运行时的性能。
-
分布式技术架构:学习分布式技术架构的有效途径是参与到分布式项目的开发中去,并阅读相关论文。
第二,提高学习能力。所谓学习能力,就是能够很快地学习新技术,又能在关键技术上深入的能力。 只有在掌握了上述的基础原理之上,你才能拥有好的学习能力。
下面是让你提升学习能力的一些做法。
-
学习的信息源。信息源很重要,有好的信息源就可以更快速地获取有价值的信息,并提升学习效率。常见的信息源有Google等搜索引擎,Stack Overflow、Quora等社区,图书,API文档,论文和博客等。
-
与高手交流。程序员可以通过技术社区以及参加技术会议与高手交流,也可以通过参加开源项目来和高手切磋。常闻“听君一席话,胜读十年书”便是如此。与高手交流对程序员的学习和成长很有益处,不仅有助于了解热门的技术方向及关键的技术点,更可以通过观察和学习高手的技术思维及解决问题的方式,提高自己的技术前瞻性和技术决策力。
-
举一反三的思考。比如,了解了操作系统的缓存和网页缓存以后,你要思考其相同点和不同点。了解了C++语言的面向对象特性以后,思考Java面向对象的相同点和不同点。遇到故障的时候,举一反三,把同类问题一次性地处理掉。
-
不怕困难的态度。遇到难点,有时不花一番力气,是不可能突破的。此时如果没有不怕困难的态度,你就容易打退堂鼓。但如果能坚持住,多思考,多下功夫,往往就能找到出路。绝大多数人是害怕困难的,所以,如果你能够不怕困难,并可以找到解决困难的方法和路径,时间一长,你就能拥有别人所不能拥有的能力。
-
开放的心态。实现一个目的通常有多种办法。带有开放的心态,不拘泥于一个平台、一种语言,往往能带来更多思考,也能得到更好的结果。而且,能在不同的方法和方案间做比较,比较它们的优缺点,那么你会知道在什么样的场景下用什么样的方案,你就会比一般人能够有更全面和更完整的思路。
第三,坚持做正确的事。做正确的事,比用正确的方式做事更重要,因为这样才始终会向目的地靠拢。哪些是正确的事呢?下面是我的观点:
-
提高效率的事。你要学习和掌握良好的时间管理方式,管理好自己的时间,能显著提高自己的效率。
-
自动化的事。程序员要充分利用自己的职业特质,当看见有可以自动化的步骤时,编写程序来自动化操作,可以显著提高效率。
-
掌握前沿技术的事。掌握前沿的技术,有利于拓展自己的眼界,也有利于找到更好的工作。需要注意的是,有些技术虽然当下很火,但未必前沿,而是因为它比较易学易用,或者性价比高。由于学习一门技术需要花费不少时间,你应该选择自己最感兴趣的,有的放矢地去学习。
-
知识密集型的事。知识密集型是相对于劳动密集型来说的。基本上,劳动密集型的事都能通过程序和机器来完成,而知识密集型的事却仍需要人来完成,所以人的价值此时就显现出来了。虽然现在人工智能似乎能做一些知识密集型的事(包括下围棋的AlphaGo),但是在开放领域中相对于人的智能来说还是相去甚远。掌握了领域知识的人的价值依然很高。
-
技术驱动的事。不仅是指用程序驱动的事,而且还包括一切技术改变生活的事。比如自动驾驶、火星登陆等。就算自己一时用不着,你也要了解这些,以便将来这些技术来临时能适应它们。
第四,高标准要求自己。只有不断地提高标准 ,你才可能越走越高,所以,要以高标准要求自己,不断地反思、总结和审视自己,才能够提升自己。
-
Google的自我评分卡。Google的评分卡是在面试Google时,要求应聘人对自己的技能做出评估的工具,它可以看出应聘人在各个领域的技术水平。我们可以参考Google的这个评分卡来给自己做评估,并通过它来不断地提高对自己的要求。(该评分卡见文末附录)。
-
敏锐的技术嗅觉。这是一个相对综合的能力,你需要充分利用信息源,GET到新的技术动态,并通过参与技术社区的讨论,丰富自己了解技术的角度。思考一下是否是自己感兴趣的,能解决哪些实际问题,以及其背后的原因,新技术也好,旧技术的重大版本变化也罢。
-
强调实践,学以致用。学习知识,一定要实际用一用,可以是工作中的项目,也可以是自己的项目,不仅有利于吸收理解,更有利于深入到技术的本质。并可以与现有技术对比一下,同样的问题,用新技术解决有什么不同,带来了哪些优势,还有哪些有待改进的地方。
-
Lead by Example。永远在编程。不写代码,你就对技术细节不敏感,你无法做出可以实践的技术决策和方案。
吃透基础技术、提高学习能力、坚持做正确的事、高标准要求自己,不仅会让你全面提升技术技能,还能很好地锻炼自己的技术思维,培养技术前瞻性和决策力,进而形成技术领导力。
作为一名合格的技术领导者,还需要有解决问题的各种软技能。比如,良好的沟通能力、组织能力、驱动力、团队协作能力等等。《技术领导之路》《卓有成效的管理者》
Google评分卡
0 - you are unfamiliar with the subject area.
1 - you can read / understand the most fundamental aspects of the subject area.
2 - ability to implement small changes, understand basic principles and able to figure out additional details with minimal help.
3 - basic proficiency in a subject area without relying on help.
4 - you are comfortable with the subject area and all routine work on it:
For software areas - ability to develop medium programs using all basic language features w/o book, awareness of more esoteric features (with book).
For systems areas - understanding of many fundamentals of networking and systems administration, ability to run a small network of systems including recovery, debugging and nontrivial troubleshooting that relies on the knowledge of internals.
5 - an even lower degree of reliance on reference materials. Deeper skills in a field or specific technology in the subject area.
6 - ability to develop large programs and systems from scratch. Understanding of low level details and internals. Ability to design / deploy most large, distributed systems from scratch.
7 - you understand and make use of most lesser known language features, technologies, and associated internals. Ability to automate significant amounts of systems administration.
8 - deep understanding of corner cases, esoteric features, protocols and systems including “theory of operation”. Demonstrated ability to design, deploy and own very critical or large infrastructure, build accompanying automation.
9 - could have written the book about the subject area but didn’t; works with standards committees on defining new standards and methodologies.
10 - wrote the book on the subject area (there actually has to be a book). Recognized industry expert in the field, might have invented it.
Subject Areas:
- TCP/IP Networking (OSI stack, DNS etc)
- Unix/Linux internals
- Unix/Linux Systems administration
- Algorithms and Data Structures
- C
- C++
- Python
- Java
- Perl
- Go
- Shell Scripting (sh, Bash, ksh, csh)
- SQL and/or Database Admin
- Scripting language of your choice (not already mentioned)
- People Management
- Project Management
每个程序员都应该要读的书
-
《代码大全》 虽然这本书有点过时了,而且厚到可以垫显示器,但是这绝对是一本经典的书。
-
《程序员修练之道》 这本书也是相当经典,我觉得就是你的指路明灯。
-
《计算机的构造和解释》 经典中的经典,必读。
-
《算法导论》 美国的本科生教材,这本书应该也是中国计算机学生的教材。
-
《设计模式》 这本书是面向对象设计的经典书籍。
-
《重构》 代码坏味道和相应代码的最佳实践。
-
《人月神话》 这本书可能也有点过时了,但还是经典书。
-
《代码整洁之道》 细节之处的效率,完美和简单。
-
《Effective Java》。
-
《Unix编程艺术》《Unix高级环境编程》 也是相关的经典。
每个搞计算机专业的学生应有的知识
What every computer science major should know
这篇文章的内容:
- 要获得一份好工作,学生需要知道什么?
- 为了一辈子都有工作干,学生需要知道什么?
- 学生需要知道什么,才能进入研究生院?
- 学生需要知道什么,才能对社会有益?
LinkedIn高效的代码复查技巧
LinkedIn’s Tips for Highly Effective Code Review,LinkedIn的高效代码复查技巧。
《 从Code Review谈如何做技术》,讲述了为什么Code Review是一件很重要事情。今天推荐的这篇文章是LinkedIn的相关实践。
编程语言和代码质量的研究报告
A Large-Scale Study of Programming Languages and Code Quality in GitHub