《左耳听风》学习笔记-程序员练级攻略

Posted by Zhb on April 1, 2022

程序员练级攻略

零基础启蒙

Teach Yourself Programming in Ten Years》( 中英对照版

程序员的荒谬之言还是至理名言?》。

第一份入门教程,主要是让你体会到编程是什么。

然后,你可以到 CodeAbbey 上去做一些在线编程的小练习。

第二份入门教程,主要是让你做点实际有用的东西。

  • MDN的 Web开发入门 ,这个教程会带着你建立一个网站。然后,你可以把你的网页发布在GitHub上。

编程入门

入门语言Python

入门语言JavaScript

操作系统入门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),再到数据库。这其中需要你查阅很多的知识。

这里有几个技术点你需要关注一下。

  1. 用户登录时的密码不应该保存为明文,应该用MD5+Salt来保存。
  2. 用户登录后,对于用户自己的贴子可以有“重新编辑”或 “删除”的功能,但是无权编辑或删除其它用户的贴子。
  3. 数据库的设计,你需要三张表:用户表、文章表和评论表,它们之间是怎么关联的,你需要学习一下。这里有个PHP的blog教你怎么建表,你可以 前往一读

如果你有兴趣,你可以顺着这个小项目,研究一下下面这几个事。

  • 图片验证码。
  • 上传图片。
  • 阻止用户在发文章或评论时输入带HTML或JavaScript的内容。
  • 防范SQL注入。参看 PHP官方文档微软官方文档,或者你自己Google一下。

正式入门

编程技能

在系统地学习编程技能之前,我希望你能先看一下” The Key To Accelerating Your Coding Skills“, 这篇文章会告诉你如何有效地快速提高自己的编程能力。

编程工具

实践项目

设计一个投票系统的项目。

业务上的需求如下:

  • 用户只有在登录后,才可以生成投票表单。
  • 投票项可以单选,可以多选。
  • 其它用户投票后显示当前投票结果(但是不能刷票)。
  • 投票有相应的时间,页面上需要出现倒计时。
  • 投票结果需要用不同颜色不同长度的横条,并显示百分比和人数。

技术上的需求如下:

  • 这回要用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个非常不错的编程方面的建议。

英文能力

  1. 坚持Google英文关键词,而不是在Google里搜中文。

  2. 在GitHub上只用英文。用英文写代码注释,写Code Commit信息,用英文写Issue和Pull Request,以及用英文写Wiki。

  3. 坚持到YouTube上每天看5分钟的视频。YouTube上有相关的机器字幕,实在不行就打开字幕。

  4. 坚持用英文词典而不是中文的。比如: 剑桥英语词典 或是 Dictionary.com 。你可以安装一个Chrome插件 Google Dictionary

  5. 坚持用英文的教材而不是中文的。比如: BBC 的 Learning English ,或是到一些ESL网站上看看,如 ESL: English as a Second Language 上有一些课程。

  6. 花钱参加一些线上的英文课程,用视频和老外练习。

问问题的能力

提问的智慧( How To Ask Questions The Smart Way简体中文翻译版

另外,还有一个经典的问题叫 X-Y Problem。对我来说,这是一个很容易犯的错误,所以,你也要小心避免(我曾经在我的Coolshell上写过这个事《 X-Y问题》)。

你可以到StackOverflow上看看如何问问题的一些提示– “ FAQ for StackExchange Site”。

写代码的修养

除了《代码大全》外,你还需要补充一些如何写好代码的知识,有以下几本书推荐。

Code Review

除了Code Review之外,Unit Test也是程序员的一个很重要的修养。写Unit Test的框架一般来说都是从JUnit衍生出来的,比如CppUnit之类的。学习JUnit使用的最好方式就是到其官网上看 JUnit User Guide中文版)。然后,有几篇文章你可以看看(也可以自行Google):

安全防范

在代码中没有最基本的安全漏洞问题,也是我们程序员必须要保证的重要大事,尤其是对外暴露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,它是为了保证对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。防御式编程主要用于可能被滥用,恶作剧或无意地造成灾难性影响的程序上。下面是一些文章。

软件工程和上线

编程语言相关

Java语言

JavaScript语言

还有一些其它相对比较简单的JavaScript编程规范。

Python语言

Shell语言

Mozilla的编程规范

前端开发相关

最后是一个前端开发的各种注意事项列表,非常有用。

  • Front-End Checklist ,一个前端开发的Checklist,其中包括HTML、CSS和JavaScript,还和图片、字体、SEO、性能相关,还包括关一些和安全相关的事项,这个列表真的是太好了。

API相关

开发工具相关

Markdown相关

JSON

Git相关

正则表达式相关

数据库

关系型数据库

玩Oracle,我这里只推荐一本书《 Oracle Database 9i/10g/11g编程艺术

下面还有一些不错的和MySQL相关的文章。

最后,还有一个MySQL的资源列表 Awesome MySQL,这个列表中有很多的工具和开发资源,可以帮助你做很多事。

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

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

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

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

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

NoSQL数据库

数据结构数据库 Data structure Database - Redis

微服务

你需要看一下,Martin Fowler的这篇关于微服务架构的文档 - Microservice Architecture中译版),这篇文章说明了微服务的架构与传统架构的不同之处在于,微服务的每个服务与其数据库都是独立的,可以无依赖地进行部署。你也可以看看Martin Fowler老人家现身说法的 视频

另外,你还可以简单地浏览一下,各家对微服务的理解。

微服务架构

接下来,你可以看一下 IBM红皮书:Microservices Best Practices for Java ,这本书非常好,不但有通过把Spring Boot和 Dropwizard来架建Java的微服务,而且还谈到了一些标准的架构模型,如服务注册、服务发现、API网关、服务通讯、数据处理、应用安全、测试、部署、运维等,是相当不错的一本书。

当然,有一本书你也可以读一下—— 微服务设计。这本书全面介绍了微服务的建模、集成、测试、部署和监控,通过一个虚构的公司讲解了如何建立微服务架构。主要内容包括认识微服务在保证系统设计与组织目标统一上的重要性,学会把服务集成到已有系统中,采用递增手段拆分单块大型应用,通过持续集成部署微服务,等等。

与此相似的,也有其它的一系列文章,值得一读。

下面是Nginx上的一组微服务架构的系列文章。

下面这是 Auto0 Blog 上一系列的微服务的介绍,有代码演示。

还有Dzone的这个Spring Boot的教程。

当然,如果你要玩得时髦一些的话,我推荐你使用下面的这套架构。

  • 前端React.jsVue.js

  • 后端Go语言 + 微服务工具集 Go kit ,因为是微服务了,所以,每个服务的代码就简单了。既然简单了,也就可以用任何语言了,所以,我推荐Go语言。

  • 通讯gRPC,这是Google远程调用的一个框架,它比Restful的调用要快20倍到50倍的样子。

  • APISwagger ,Swagger是一种Restful API的简单但强大的表示方式,标准的,语言无关,这种表示方式不但人可读,而且机器可读。可以作为Restful API的交互式文档,也可以作为Restful API形式化的接口描述,生成客户端和服务端的代码。今天,所有的API应该都通过Swagger来完成。

  • 网关Envoy 其包含了服务发现、负载均衡和熔断等这些特性,也是一个很有潜力的网关。当然,Kubernetes也是很好的,而且它也是高扩展的,所以,完全可以把Envoy通过Ingress集成进Kubernetes。这里有一个开源项目就是干这个事的 - contour

  • 日志监控fluentd + ELK

  • 指标监控Prometheus

  • 调用跟踪Jaeger 或是 Zipkin,当然,后者比较传统一些,前者比较时髦,最重要的是,其可以和Prometheus和Envory集成。

  • 自动化运维Docker + Kubernetes

微服务和SOA

在对微服务有了一定的认识以后,一定有很多同学分不清楚微服务和SOA架构,对此,你可以看一下这本电子书 - 《 Microservices vs. Service-Oriented Architecture》。通过这本书,你可以学到,服务化架构的一些事实,还有基础的SOA和微服务的架构知识,以及两种架构的不同。这本书的作者马克·理查兹(Mark Richards)同学拥有十年以上的SOA和微服务架构的设计和实现的经验。

另外,还有几篇其它对比SOA和微服务的文章你也可以看看。

除此之外,我们还需要知道微服务和其它架构的一些不同和比较,这样我们就可以了解微服务架构的优缺点。下面几篇文章将帮助获得这些知识。

设计模式和最佳实践

然后,你可以看一下微服务的一些设计模式。

相关资源

容器化和自动化运维

Docker

有了上述的一些感性体会之后,你就可以阅读Docker官方文档 Docker Documentation 了,这是学习Docker最好的方式。

如果你想了解一下Docker的底层技术细节,你可以参看我的文章。

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

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

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

如果你对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前世今生的一篇论文。

学习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系列。

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

前端基础和底层原理

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洁癖告诉你,这是不对的。所以,你需要学会使用 LESSSaSS 这两个CSS预处理工具,其可以帮你提高很多效率。

然后,你需要学习一下CSS的书写规范

如果你需要更有效率,那么你还需要使用一些CSS Framework,其中最著名的就是Twitter公司的 Bootstrap,除此之外,还有,主打清新UI的 Semantic UI 、主打响应式界面的 Foundation 和基于Flexbox的 Bulma

当然,在使用CSS之前,你需要把你浏览器中的一些HTML标签给标准化掉。所以,推荐几个Reset或标准化的CSS库: NormalizeMiniRest.csssanitize.cssunstyle.css

关于更多的CSS框架,你可以参看 Awesome CSS Frameworks 上的列表。

接下来,是几个公司的CSS相关实践,供你参考。

最后是一个可以写出可扩展的CSS的阅读列表 A Scalable CSS Reading List

JavaScript

下面是学习JavaScript的一些图书和文章。

浏览器原理

你需要了解一下浏览器是怎么工作的,所以,你必需要看《 How browsers work》。这篇文章受众之大,后来被人重新整理并发布为《 How Browsers Work: Behind the scenes of modern web browsers》,其中还包括中文版。这篇文章非常非常长,所以,你要有耐心看完。如果你想看个精简版的,可以看我在Coolshell上发的《 浏览器的渲染原理简介》或是看一下 这个幻灯片

然后,是对Virtual DOM的学习。Virtual DOM是React的一个非常核心的技术细节,它也是前端渲染和性能的关键技术。所以,你有必要要好好学习一下这个技术的实现原理和算法。当然,前提条件是你需要学习过前面我所推荐过的浏览器的工作原理。下面是一些不错的文章可以帮你学习这一技术。

网络协议

前端性能优化和框架

前端性能优化

首先是推荐几本前端性能优化方面的图书。

  • 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 这一章节也有很多非常不错的知识和经验。

接下来是一些最佳实践性的文档。

接下来,重点推荐一个性能优化的案例学习网站 WPO Stats 。WPO是Web Performance Optimization的缩写,这个网站上有很多很不错的性能优化的案例分享,一定可以帮助你很多。

然后是一些文章和案例。

接下来是一些性能工具。在线性能测试分析工具太多,这里只推荐比较权威的。

  • 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

前端框架

React.js框架

入门

React学起来并不复杂,就看 React 官方教程 和其文档就好了( React 的中文教程 )。

然后,下面的文章会带你了解一下React.js的基本原理。

提高

学习一个技术最重要的是要学到其中的思想和方法。下面是一些我觉得学习React中最重要的东西。

还有一些不错的实践和经验。

资源列表

最后就是React的资源列表。

  • Awesome React ,这是一些React相关资源的列表,很大很全。

  • React/Redux Links ,这也是React相关的资源列表,与上面不一样的是,这个列表主要收集了大量的文章,其中讲述了很多React知识和技术,比上面的列表好很多。

  • React Rocks ,这个网站主要收集各种React的组件示例,可以让你大开眼界。

Vue.js框架

Vue on 2018 - Interview with Evan You” ( Vue是完全由其支持者和用户资助的,这意味着它更接近社区而不受大公司的控制。

要学习Vue并不难,我认为上官网看文档( Vue 官方文档中文版)),照着搞一搞就可以很快上手了。 Vue.js screencasts 是一个很不错的英文视频教程。

另外,推荐 新手向:Vue 2.0的建议学习顺序 ,这是Vue作者写的,所以有特殊意义。

Vue的确比较简单,有Web开发经验的人上手也比较快,所以这里也不会像React那样给出很多的资料。下面是一些我觉得还不错的内容,推荐给你。

当然,最后一定还有 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(数学)

各大公司技术博客

论文

如何读论文

论文集散地

  • 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

这篇文章的内容:

  1. 要获得一份好工作,学生需要知道什么?
  2. 为了一辈子都有工作干,学生需要知道什么?
  3. 学生需要知道什么,才能进入研究生院?
  4. 学生需要知道什么,才能对社会有益?

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