You are on page 1of 87

本电子书内容由大辉整理自李笑来博客。如有疑问请关注公众号:行为设计学

(actiondesign),或加个人微信 16279731

目录  

目录
十分钟后开始使用英语……
1. 学会音标
2. 学会查词典
3. 学会查语法书
4. 学会正确提问
5. 养成最基本语言学习习惯
6. 阅读先行是很自然的
7. 刻意练习永远是必须的
人人都是工程师前言
1. 为什么选择程序设计作为这本书的主题?
2. 这本书可能涉及的话题
3. 如何自学才能真正有效?
3.1. 自学其实是一种社交活动
3.2. 刻意练习是必须自己完成的核心
3.3. 即便环境足够好也依然要靠自己
4. 概念与方法论:最少必要知识
4.1 只使用 Google
4.2 在中国,你最好买一个 VPN 服务
4.3 只读英文文档
5. 天天给自己洗脑
任务
你学你的,用不着别人批准
开始之前……
1. 本书中使用的系统为 Mac OSX
2. 大屏幕很重要、双屏幕更重要
3. 注册一个 Github 帐号
4. 每天都要有一整块的思考时间
5. 功夫在行外
任务
基本开发环境设置
小心你的中文输入法
命令行工具(Terminal/iTerm)的基本设置
命令行的使用
安装必要开发环境
XCode Command Line Tool
安装 Homebrew
安装 Git
安装 rvm 与 Ruby 2.3.1
安装 nvm 和 node 4.4.5
安装 Atom
安装
阅读 Atom 官方网站
Atom Cheatsheets
安装 Dash
总结
Atom 编辑器进阶
1. 两个共同的目标
2. Atom Snippets
任务
使用 Hexo 为自己在 Github 上建一个静态 Blog 站点
1. 初步搭建
1.1. 在 Github 上创建一个 Repo
1.2. 确认本地已经安装好 git 和 npm
1.3. 安装 hexo
1.4. 创建本地工作目录
1.5. 初始化你的本地站点
1.7. 阶段性成果
2. 继续折腾
2.1 给 Atom 安装一个命令行面板
2.2 为 Atom 安装 markdown 相关 Packages
2.3 学习使用 markdown 书写文章并发布
2.4 一旦发现需要重复的工作……
快速学习 HTML 和 CSS
1. HTML/CSS 都是了解一句话之后就可以开始写的
2. 快速体验
3. 系统了解 HTML 和 CSS
4. 读不止一个教程
5. 先学范儿,某种意义上也是对的
总结
工程师的时光穿梭机 —— git
随学随用实例:Stylish —— 浏览器插件
正则表达式极简“入门”
最简单直接的 Javascript 开发环境
如何写个好教程(附送一个好教程)
1. 服务器端
2. 客户端
3. 电视端
4. 路由器端
使用 Go 语言打造区块链(一)
第一部分:基础原型
简介
区块(Block)
区块链(Blockchain)
结论

十分钟后开始使用英语……  

阅读这一篇文章,最多需要十分钟而已,之后你就可以开始使用英语了。
学习英语的最少必要知识是什么呢?

学会音标
学会查词典
学会查语法书
学会正确地提问
养成最基本语言学习习惯

1. 学会音标  
音标只是一个符号系统。首先,任何人花上一下午就都可以学会。其次,千万别信那种胡说
八道:“外国人都不用音标的”。先说说我们自己的母语,你什么时候见过一个受过教育的
人不会用拼音的?遇到生词生字的时候,连拼音都不会的话,就算查到了,也不知道那字或
词如何读。英语世界更是如此,要知道英语是目前地球上词汇量最多的语言,也就是说,在
英语世界里,任何人遇到生词的概率都要大出许多许多倍 —— 只要是个正常受过教育的人,
怎么可能不去查词典?怎么可能甘心于查了词典之后竟然不懂如何发音?

学习音标真的很简单。

从任何一本有文本的有声书中截取一段大约三五分钟的录音,然后把电子书
的文本拷贝出来,粘贴复制到这个网站提供的工具里:
http://upodn.com/phon.php ,然后你就会得到一个英语与音标对应的文
本。(我是如何知道这个网站的?Google 呗 —— ‘Phonetic 
Transcription’……)三五分钟的语音中(大约三五百个词)一定包含了所
有的音素(辅音、元音)……
一边看音标文本文件,一边反复跟读这段文本……

一个下午,任何一个正常成年人都能搞定。

2. 学会查词典  
查词典,是学习语言的必需习惯 —— 正如学习是生活的必需习惯一样,也正如翻阅文档是开
发者必需习惯一样,其实,哪个领域都是一样的。
遇到生词就查。对,每一个。查着查着就越查越少了 —— 这是一定的。那些告诉你,“遇到
生词(先)不(用)查,先猜”的人,让他们去屎。望文生义的笨蛋说的就是他们。

一句话里感觉没有生词,可就是看不懂,原因可能是某个单词有另外的词义,而你却只知道
最常用的词义。比如,“down”这个单词,竟然还可以做名词使用,意思是“小鸟小鸡身上
的软毛”……

那可能是有“你全都认识的词构成的你完全猜不到的词义”造成的,比如“purple
passage”,“purple”你认识,“紫色的”,“passage”你也认识,“文章”,但“purple
passage”是“辞藻过分华丽,金玉其外败絮其中的文章” —— 你可能就不知道了。

还有一种情况是,语法结构弄不明白…… 比如,“as” 有很多用法,到底是哪一个呢?那就
走下一步:查语法书。

3. 学会查语法书  
语法书是用来查的,不是用来背的 —— 你啥时候见过人们背地图?

一张地图拿过来,知道“上北下南左西右东”,以及“少量标记符号”(比如,公交线长什
么样,地铁线长什么样)这两个最少必要知识之后,就可以开始查地图了,不是吗?

语法书也一样,除了你在初中的时候已经学过的一些基础语法概念,比如“名词”、“动
词”、“形容词”、“副词”什么的之外,你还需要知道另外一个概念:“功能词”。什么
叫功能词呢?就是那些在语法书的附录里,带着页码编号的词……

你应该找个时间,比如一下午,大概翻翻那些功能词都有哪些,有个印象就好。

然后,在遇到“没有生词、没有不了解的词义、没有不认识的词组,但就是读不懂的句
子”的时候,仔细看看那句子里有没有功能词存在?有的话,去查查语法书,在附录里找到
对应的页码(可能不止一个),按图索骥地查下去,一定能找到答案……

你以为你遇到过的英语老师啥都懂吗?不是的!他们就是比学生多一个技能:
遇到问题的时候,他们懂得如何查词典,如何查语法书…… 哪个领域都是一样
的 —— 你以为“高级程序员”什么都懂吗?某种意义上,他们只比那些“低级
程序员”多一个技能:遇到问题的时候,他们懂得如何检索文档,如何问
Google……
4. 学会正确提问  
能问 Google 的,都不要去问别人,这是礼貌。

别问人家这个单词什么意思,别问人家这句话什么意思 —— 自己动手去查!一个词典查不
到,再换一个,换一个还查不到,还有 Gooogle 呢!

实在查不明白,还有个办法,去 Google 那句原文,然后加上一个汉字“的”或
者“了”(这两个字是中文中使用频率最高的词),这个搜索组合很可能让你找到已经有人
在网上提问过……

自己折腾过了,还搞不明白,再去问可能帮你的人 —— 他们也搞不定,也有可能,那就记在
本子里。很神奇的事情是,大量的问题,都会在某一天自动出现解决方案的 —— 前提是,你
还记得那个问题!

不会正确提问,其实只不过是懒惰的表现,懒人是没救的,所以千万不能做懒人。

5. 养成最基本语言学习习惯  
朗读。天天朗读。每天朗读半小时,坚持两百天,才 100 小时…… 每天朗读一小时,坚持
100 天,也就是三个月多一点点 —— 你已经把 90% 的人甩在身后了,真的!

6. 阅读先行是很自然的  
口语难练,这是很正常的,因为在大多数情况下,我们读书、看电影的时候,由于面对的并
不是真实的人,所以我们大脑中的“镜像神经元”很难被激发,于是学习能力处于“冬眠状
态”。其实每个人都很有语言天赋的,顶多是一点点的好坏差异而已。你看,几乎任何一个
人在一个新的城市里住上一周以上,口音就会发生一些微妙的变化,并且根本不是故意的
(都没有刻意练习) —— 只是因为镜像神经元被激发了。

可是阅读这东西,用不着镜像神经元过分活跃 —— 只是在小时候启动的时候可能需要(家长
喜欢看书,孩子通常更容易喜欢看书)。所以,你要相信你的阅读能力可以很快提高的,事
实上,确实如此 —— 只需要啃上一本原版书,基本上就过关了。
选择原版书的时候,一定要选择自己感兴趣的领域 —— 英语教科书在这方面几乎是最差的。
现在对你来说,这是个很好的机会,你不是对编程感兴趣吗?不是对成为计算机工程师感兴
趣吗?那就读这个领域的原版书好了。这样的时候,你的焦点并不在于英语本,而是在于那
语言文字背后的思想,这样的时候,你的大脑会很厉害,它自己会想办法穿透那层“毛玻
璃”(英语),看到那玻璃背后的意义…… 不知不觉之间,那“毛玻璃”就会变成“透明玻
璃” —— 就这么简单。

7. 刻意练习永远是必须的  
每天都要挤出一点时间,把今天遇到过的生词复习几遍 —— 上学的时候不懂如何复习的人学
习都不好,现在在成年阶段重新学习的时候,可别再吃这个亏了!而且,这个习惯是会“遗
传”的:你的孩子若是看到你总是通过重复获得进步,他们也会自然而然地习惯于重复获得
进步,这是真理。

没!有!别!的!了!

任何正常人都可以上路了。如果还想让自己更心安一点,那就去读一本书《人人都能用英
语》,其实只有一个字和一个感叹号:“用!”

用吧用吧,不是罪。

大多数人的平庸和愚蠢,其实都是当初自己选的 —— 这真是一个残酷的事实。

任务

1. 今天就彻底学会音标。
2. 从明天早上就开始坚持朗读。
3. 配置好自己的计算机以便随时查词典,请 Google Mac Dictionary 添加词
典。
4. 请 Google 新编英语阅读手册。
5. 请 Google 人人都能用英语。
6. 请 Google how to ask questions,第一个就是 Eric Steven Raymond 
写的 How to ask questions the smart way,必须精读。另外,还有一篇 HBR 
的文章,也要细看。

 
人人都是工程师前言  

1. 为什么选择程序设计作为这本书的主题?  
也许是因为我必然不由自主地暗藏私货,因为我一直固执地认为,不管有多少人相信:

(0) 在中国,对绝大多数人来说,English + Computer Skills = Freedom

不过,以下理由可能更为充分:

(1) 程序设计也许是目前地球上最容易变现、最被高估、可事实上却实际上并不
难以获得的技能。

从趋势上来看,不仅目前如此,将来还会如此,并且变现容易程度与高估的幅度都会被进一
步拉升 —— 不信咱就找个代驾开车坐在后座看唱本走着瞧。

还有个理由是,

(2) 程序设计的学习难度被有意无意地过分高估了。

人们向来有把学不会的技能神秘化的倾向,也许是因为只有这样心里才舒服,觉得自己学不
会正常一点。但,程序设计这个领域,实在是被过份高估了(其程度比第二语言习得领域还
要高出许多许多),乃至于很多人只是因为被误导了才望而却步,根本不是做不了做不好的
原因。这个领域里的每一项技能,都会让习得者有这样的慨叹,“这样简单的东西竟然这么
有用!” 或者 “连这么简单的东西我都没学会的话,实在是太可惜了!”

最后一个理由是,

(3) 这是个最能全方面养成、锻炼、提升个人学习能力的学习项目。
在计算机这个领域的顶尖范围里,集聚着人类的精英,他们设计了一个又一个的方法论去优
化自己的工作环境,优化自己的工作流程,优化自己的产品,没完没了地改善,没完没了地
更迭…… 也就是说,在计算机这个领域里,有大量的概念与方法论都是走在最前沿的。学习
程序设计,并不是肤浅地学一门编程语言,设计一些函数,更重要、更本质的是学习计算机
科学家们用来改变世界的思考方式、行为模式。

2. 这本书可能涉及的话题  
这真是个神奇的时代。跟过去不一样了,现在很可能已经是“一门语言打天下”的时代了,
学一门 javascript,就有可能什么都做了…… 这在哪怕仅仅是三五年前都是不可能的事情。不
过,我们涉及的话题可能很多很多 —— 总而言之,前面有一条路通往“全栈工程师”的方
向……

HTML, CSS, JAVASCRIPT
PUG, LESS, COFFEESCRIPT
MONGODB, RETHINKDB
NODEJS, EXPRESSJS
REACT, VUE, ANGULAR
RELUX
ELECTRON
TDD…

反正没有什么是不能学的……

3. 如何自学才能真正有效?  
学习是一种生活方式,是少数人的生活方式 —— 虽然它原本是每一个人最初的生活方式。哪
儿有小朋友不学习的?他们每天都在学习(不要把学习狭隘地理解为上学、读书),可基于
种种原因,绝大多数人从某一时刻开始就厌倦了学习(很可能是把学习与上学等同起来造成
的),甚至干脆放弃了学习(以为离开学校就再也不用学习了)……

另外一些人,不太一样,尽管他们是少数。他们甚至不认为学习只是生活内容之一,而干脆
是生活方式。因为不学习的生活只能是停滞不前的,所以缺少了新鲜,缺少了刺激,由此也
缺少了许许多多的乐趣。生活方式决定了生活质量,这是最基本的逻辑。
再进一步,既然学习是一种他们已经选择了的生活方式,所谓的“终生学习”只是必然的结
果,对他们来说并不需要“大力提倡”,他们也不需要“努力”、“坚持”、“不屈不
挠”、“头悬梁锥刺股”…… 他们只是那样活着,每天进步一点点地活着,没有最好,只有
更好,不需要成功,只需要不断成长。

3.1. 自学其实是一种社交活动  
很多人错误地认为所谓的“自学”,就是“自己一个人(默默地)学” —— 这恰恰是绝大多
数人一生学习失败的最根本原因。很多人从来没反应过来:

学习从来都不是单独孤立的行为,而是社交行为。

生活中,你遇到过这样的现象没有:“看见别人打针,自己先疼得受不了……” 这是因为我
们的大脑中有一种神经元,叫做“镜像神经元”(Mirror Neuron),它会让我们“感同身
受”,当我们看到另外一个人正在做什么的时候,镜像神经元会尽力给我们足够的刺激,让
我们“体验”那个人的感受。以前人们不知道为什么喷嚏竟然会“传染”,现在科学家们很
清楚了 —— 那就是镜像神经元在起作用。

镜像神经元的存在,使得我们有模仿能力、有通感能力、有同情心、有同理心…… 这也是为
什么人类天然有社交需求的重要原因,因为我们的大脑皮层上都有很多的镜像神经元。

一般来说,物品、书籍之类非人的东西,都不大可能激活镜像神经元。只有看到人的时候,
镜像神经元才会被激发。所以,你送给小朋友一把吉他,他不会有什么兴趣的。可若是你在
弹琴的时候被他看见,他的镜像神经元就会因为你的行为而被出发,进而对弹奏吉他感兴趣
—— 注意,不是对吉他本身感兴趣。若是你在弹琴的时候,带着某种能够打动他的情绪,那
他更容易被影响,因为情绪更能激发镜像神经元。也就是说,一切的学习起初都基于模仿,
一切的模仿,都源自于看到真人的行为 —— 哪怕是在电影里看到,虽然其实只不过是影相而
已,并非真人,但毕竟是真人的影相。

所以,无论学什么技能,都要找到用那种技能的人,这样我们的镜像神经元才可能更容易被
激发,学习效果才会好。若是能找到热爱那项技能,乃至于一使用那项技能就很开心(最好
的情绪之一)的人,那就更好了。激情这东西,是少数幸运儿才长期持有的东西,大多数人
小时候挺多,过了十五六岁之后就开始有意无意磨灭了激情,且并不自知。

之前提到,
当我们看到另外一个人正在做什么的时候,镜像神经元会尽力给我们足够的刺
激,让我们“体验”那个人的感受。

这句话里有个词很重要,“尽力”。因为镜像神经元只能调用我们大脑里已有的信息去模拟
对方的感受,所以,它最多也就是“尽力”,无法做到“确保正确”。今天的糖尿病患者使
用的皮下注射针头,已经可以做到很细,细到让使用者“无感”的地步,所以,当一个糖尿
病患者给自己注射胰岛素的时候,他自己并不觉得疼,可是看的人却能“疼”到紧皱眉头的
地步,为什么?因为旁观者的大脑力没有实际用那么细的针头注射胰岛素的经验,所以镜像
神经元在旁观者“感同身受”时所调用的,其实是过往旁观者自己打针的体验 —— 被很粗的
针头做静脉注射的痛苦体验。

所以,很多人误以为他们眼里的成功者靠的是“坚持”、靠的是“毅力”,这完全是自己的
镜像神经元“尽力”的结果,是“调用自己过往经验去‘感同身受’的结果”…… 事实上
呢?那些“成功者”其实并不在意成功,因为到死之前成长不应该也不可能结束,因为那是
他们的生活方式,学习、进步、探索、迂回,甚至折腾、挫败和迷茫,都是他们生活中必不
可少的内容,这是最初不自觉的选择,谈不上什么“坚持”,谈不上什么“毅力”…… 说实
话,对他们来说,不让折腾才真痛苦呢,不学习才需要坚持和毅力呢!

再进一步,这也是为什么要选择朋友的原因。人与人之间有很大的差异,最大的差异来自于
性格养成,大多数人会沦为表现型人格,只有少数人才会在不断调整中保持、呵护、进一步
培养“进取型”人格。他们自然而然地更为乐观,更有耐心,更有承受力,更有战斗力,更
能生产与体验学习与进步的乐趣。与这样的人在一起,学习会更容易 —— 只因为镜像神经元
会更容易地被正确激发。说清楚了,道理其实挺简单的。

3.2. 刻意练习是必须自己完成的核心  
有个很简单的诀窍:

重复才能练就技艺。

但不知道为什么,绝大多数人就是不信这事儿,尽管大多数人小时候一定读过那个寓意深刻
的教育故事:《卖油翁》—— 每个人都记得那里面的金句:

无它,手熟尔。
这时间绝大多数的“精湛技艺”,到最后跟那个神秘的概念“智商”没有任何关系。智商是
存在的,但它不是与生俱来一成不变的,所谓的智商,其实是一个人最终积累出来的知识经
验的总和 —— 若是这样理解的话,就不难理解为什么到最后人与人之间的聪明程度相差天
壤。因为有一些人天天往前走啊,另外一些人早就不动了啊!

所谓的刻意练习,说来也很简单,就是把那些现在做起来生疏的技能通过反复使用最终做到
不假思索就可以做完且做好 —— 这与智商高低全无关系。

现在大多数人都会开车。谁在刚开车的时候不生疏呢?一个方向盘都弄不明白,这会儿转多
了,那会儿转少了…… 可是,没有多久(绝对用不着一万小时,一百小时都用不上)之后,
那方向盘就好像已经是自己身体的一部分一样,就好像已经长在自己的手上了一样,听话起
来,不假思索的情况下就可以做到转动的幅度刚刚好…… 车上油门,刹车,也是一样,没多
久,就好像长在脚上一样,就好像是自己身体的一部分一样,随心所欲地被我们控制(其实
是“随脑所欲”)。

我们的大脑就是这样的,有强大的能力把我们常用的物体、技能“吸收”进来,就好像那些
东西是我们身体的一部分一样,进而随心所欲地控制。厨艺大师手中的刀子,MBA 明星手中
的篮球,都是这样的,虽然看起来是“身外之物”,实际上,对他们的大脑来说,那些东西
都是他们身体的一部分,是他们可以随心所欲地控制的 —— 当然,外人看来那实在是太神奇
了!

每个人都有过这样的体验。你见过小朋友刚开始拿笔写字有多么笨拙吧?你自己最初的时候
也那样,这是跑不了的。可仅仅是几天之后,你就已经可以自如地控制那“身外之物”了,
不说写得好看不好看,起码已经能一笔一划地写了。这一代人从小就使用键盘,要知道在上
一代人身上,键盘可是“神奇的计算机”的一部分,是“高档电器”的组成部分,学起来可
费劲了,要专门上一个“打字培训班”…… 也不一定学的会。甚至最终相当数量的人放弃
了,或者连试都不愿意试,更有甚者干脆“理直气壮”声称“用那玩意写字没感觉!”,这
还不够,要写文章发表在报纸上,理论只用笔而绝对不用键盘的必要 —— 真的没感觉吗?没
感觉真的那么重要吗?他们有的明显是错误的感觉啊!等那些人都死光了,那些“感觉”就
再也没有人提起了。这一代人最明显的变化就是,互联网已经长在自己身上了,互联网不再
是一个只有坐在桌上的台式机面前才有的一个存在。天天用天天用的结果是什么?绝大多数
动作都已经化作大脑皮层表面的沟回,不再需要通过思考、检索才能产生正确的行动,而是
下意识中已经做完,已经做好…… 这一代的孩子们不仅随脑所欲地使用键盘,甚至可以随脑
所欲地使用虚拟键盘,哼。
所以,一切看起来复杂的技艺,其实都并不难,很多人最终学不会,其实只是练不成,就是
说,他们并不是不理解那道理、那原理;可理解本身并无太大用处,因为真正需要做的是通
过大量的重复与实践,把那道理、那原理转化为大脑皮层表面的沟回…… 缺少了刻意训练的
环节,学什么都是白搭。

关键来了:

刻意练习,必须自己完成。

没有人帮你完成,更为重要的是,没有人有义务监督你完成 —— 除非你付钱给人家监督你。
但现实中出钱请人监督自己的做法总是不太成功,因为 a) 钱出的不够高,所以请不来真正负
责的人;b) 钱出的足够高,吸引来的只能是唯唯诺诺的人,不敢下手太狠…… 你看,不是没
有人试过,只是试过之后发现没用而已。

3.3. 即便环境足够好也依然要靠自己  
很多事情只能靠自己。学习就是吃饭,正如饭这东西没办法让别人替自己吃了一样,学习只
能自己学,刻意练习只能自己练,谁都帮不上,谁都指望不上。这就是绝大多数人自学失败
的最根本原因。

然而,在一个恰当的环境里,在一个恰当的社交圈里,情况可能非常不同。若是你在一个表
现型人格占大多数的圈子里生存,你做得好会招致嫉妒甚至陷害,你做得差会被嘲弄甚至捉
弄;反过来,你若是在一个进去型人格占大多数的圈子里生存,情况会反过来,你做得好,
大家会佩服你,然后模仿你,向你学习,或直接向你请教,或默默揣摩;要是你做的不好,
没有人会鄙视你,没有人会捉弄你,相反会鼓励你,告诉你说大家刚开始都是这样的,看到
你做的不恰当的地方,他们会告诉你,若是如此这般你也许就可能好起来…… 然而,即便是
在进取型人格占大多数的社交圈里,一切的改变也都来自于自己的刻意练习,用时间浇灌的
践行,才能引发真正的改变与进步。

这与有一部分健身者选择去健身房锻炼也是一样的道理。

难道就不能在家、在操场健身吗?能啊。去健身房锻炼就能自动长出一身腱子肉,自动甩掉
一肚子肥膘吗?明显不能啊!你交了四千八百块的年费,到年底一算,单次消费八百元,因
为一年下来你只去了六次…… 你会找健身房退款吗?不会的 —— 至于为什么,你可能没细想
过:因为从另外一个角度来看,一年交四千八百元,是你和健身房的约定;至于去多少次,
实际上是你自己与自己的约定,违约者是你自己,被约为者还是你自己,非要退费的话,你
得找你自己退费……

但你若是去了健身房,并且还能持续频繁地去健身房锻炼,你的身材就是会变的,而且变化
还会非常大,那可是一整年啊!事实上,三个月下来,总计一百小时左右,就会发生巨大的
无法忽视的变化。对,仅仅一百小时,在绝大多数领域里,就足矣把绝大多数人甩在身后
—— 对一些人来说这个事实可能是解脱;对更多另人来说,这个事实其实非常残酷,因为仅
仅一百个小时,他们就已经败下阵来,别说一辈子了,别说七年就是一辈子了,他们在生生
世世中,第一百个小时之前就已经死去。

4. 概念与方法论:最少必要知识  
无论学什么,都要想尽一切办法(读书、搜索)尽快获得“最少必要知识”。什么是“最少
必要知识”呢?所谓“最少必要知识”,指的是为了能够实践某项技能,最起码要学会的那
一点知识。

我为了这个概念还专门杜撰了一个英文缩写,MAKE —— Minimal Actionable Knoweldge
& Experience。注意这里的一个词:Actionable,“可行动的/可执行的”。

比如,开车的最少必要知识是什么呢?

学会如何启动
学会如何制动
再加上一个字:慢

但,开车开得不好可能会影响别人的生命安全,所以得先去考个驾照…… 可大多数知识与技
能并不会直接危及他人的生命安全,不是吗?你英语发音不漂亮,人家并不会因为这个就直
接死掉;你写字写得不够帅气,但这并不意味着说你没有写字的权利;你 PPT 做得不好看,
但这并不意味着说你不可能逻辑严谨地论证你的观点…… 有一本书特别好,好到什么程度
呢?仅仅看书名就已经热血沸腾了,这本书叫:Without Permission.

学习编程的最少必要知识是什么呢?

你得习得几个程序员都应该有的起步方法论。
…… 然后呢?然后你就可以开始边学习,边实践,在学习中实践,在实践中学习更多,虽然
有时掉进陷阱,有时误入歧途,但,请你放心,肯定不会死人的。是谓不断进步,是谓 “路
漫漫其修远兮,吾将上下而求索”。

4.1 只使用 Google  
不论你遇到什么困难,都可以去问 Google,这是目前地球上最大的“人工智能”项目。它聪
明到什么程度呢?聪明到你甚至可以问它:

How to use google effectively?

这是第一个小任务:

了解一下在 Google 搜索的时候,+、-、*、”、~ 这些符号的用法……

只要花上一小点时间,了解了这些符号的用法,那么,

1. 你已经比地球上的 90% 以上的人更善于使用这个最伟大的人工智能项目
了;(甚至,90% 这个数字都有点保守?)
2. 你已经入门了,最起码你已经知道跟计算机打交道的时候,其实就是综合
使用用
3. 各种各样的符号而已…… 哪怕一个字符错了,可能结果都很不一样 —— 其
实好像小学数学也是如此罢?

既然你准备当工程师,那么,在使用 Google 的时候,除了那些常用的符号之外,还需要常
用以下几个关键字:

tutorial
example
tricks
cheatsheet
cookbook
awesome

以后在你想学任何语言或者专题的时候,比如 javascript,那你就 Google 这个这些组合:

javascript cheatsheet
javascript cookbook
javascript awesome

放心,你自己一定会上瘾的,用不着别人督促你……

4.2 在中国,你最好买一个 VPN 服务  
别问我 VPN 是什么,我们有个原则:

一切能问 Google 的,都不要去问人。

这个习惯最初的时候看起来麻烦,可一旦养成,就知道它会帮你节省多少时间,它会让你有
多大进步…… 甚至,这个原则还会让你识别哪些人真的值得交流 —— 神奇吗?

别浪费时间去寻找免费资源,能买就抓紧时间买 —— 我的意思是你必须马上买一个。这是另
外一个原则:一切能节省时间的服务都值得购买,因为时间才是最宝贵、最稀缺,压根无法
再生的资源,跟时间比,钱算个屁。

4.3 只读英文文档  
这又是很重要很重要的原则:

在计算机方面,只读英文文档。

你可能已经打退堂鼓了…… 别怕。我有办法让你最多三个月就彻底解脱 —— 详见《十分钟后
开始使用英语》。当然,你要是连这三个月都抗不过去,你就认了罢,选择平庸的生活去罢
—— 这个世界正在变得越来越好,在一个更好的世界里,最明显的好处就是,哪怕是笨蛋,
哪怕是不进步的笨蛋,也不至于饿死。

在硅谷,印度人很多很多。为什么呢?他们虽然口音浓重,但英语对他们来说基本上是母
语。中国人相对吃亏一点,为什么?英语相对较差。

在国内,一个程序员的水平怎么样,基本只取决于一件事儿:

英语水平
也许你会因此惊讶,但若是你有机会去问任何一个 IT 公司的 CTO,无论是哪一个,都一定会
百分之百认同这个观点 —— 这干脆就是事实。外界并不清楚这事儿而已。我总是开玩笑说
(其实只不过是事实陈述),“那些在国内学英语专业的人本科毕业去当老师或者靠研究
生,真不如脱产学一年计算机呢,拿着这个优势,一下子就干掉国内 90% 的所谓程序员,年
薪 60 万人民币,其实指日可待…… 尤其是那些英语系的女生,一脚踏进码农的世界,瞬间就
是女神中的女神。”

提高英语的最直接、最有效方式,就是从此在某个领域坚决只使用英语 —— 平时,一般人还
真的很难有这个环境呢!现在机会来了,你想学习,你想学习计算机,你想成为一个工程
师,你就要从今天开始在计算机领域里,只读英文文档。

说实话,我恨不得将这本书直接写成英文版…… 可是为了普度众生,只能委屈
自己,也只能委屈各位,还在写中文。不过,我真心希望这是你读的与计算机
相关的最后一本中文书!

这个原则要恪守,要执拗地恪守,要不屈不挠地恪守。给你看个例子,这个例子很重要,乃
至于我们一提到学习、一提到进步,一定反复会提及这个例子(最早这是我在《人人都能用
英语》里提到的例子,其后一直反复使用):

请读者猜猜下图中,这个正在美国 UAB 康复中心治疗的小女孩受伤的是左臂还
是右臂?

其实她的左臂没有受伤,而之所以把左臂固定起来就是因为那是一条没有受伤
的手臂,而右臂才是受伤、需要通过训练恢复的……咦?这是怎么回事儿?可是
从生理上来看,大脑受损的部分是没办法恢复的,她又怎么能通过训练来让已
经受伤的右臂恢复正常呢?
大脑的神奇之处在于它可以利用其它未受损的部分重新习得受损部分的功能
(学术上叫做“ remap ”、“ reroute ”、或者“ rewire ”)。之所以要把
行动自如的左臂绑起来,是因为如果不这么做的话,面对任何需求,大脑中负
责控制左臂的部分(或称为“左臂脑图”)都会“优先启动”;因为这部分是
未受损的,而原本控制右臂的部分已经受损了。换言之,这时,大脑中尚不存
在一个能够控制右臂的部分。而把左臂固定住之后,尽管负责控制左臂的大脑
部分依然“优先启动”,但实际上却无法自如操纵左臂。而在这种情况下,就
可以通过让大脑的其他部分慢慢专注于右臂,进而习得控制右臂的方法——
即,可以通过这样的训练,慢慢使大脑未受损的某个区域“习得”原本只有那
个已经受损的区域所负责的功能。没有多久,这个女孩子的右臂就恢复了,活
动起来与原来没什么两样。可是她的大脑不再是原来的样子了,尽管某一部分
受损且不可恢复,但她大脑的另外一个区域已经被开发,能够别无二致地完成
受损区域曾经可以完成的功能。

仅仅在 2004 年之前,这种疗法是完全不可想象的。这种最初看起来匪夷所思
的疗法叫做“ CI 活动疗法”(Constraint-Induced Movement Therapy,简
称“ CI ”或者“ CIMT ”)的发明者是 Edward Taub 教授。今天,这种疗法
渐渐开始在全世界范围内普及,帮助无数偏瘫患者找回原来的自我和生活。可
是 Taub 教授的研究经历却一波三折。为了找到偏瘫的治疗方案,他需要人为
地使猴子偏瘫(故意破坏猴子大脑的某个区域),而后再想办法通过训练令那
些猴子从偏瘫状态中恢复过来……上个世纪八十年代初,他被一个动物权益保护
组织告上法庭,导致实验室被关闭,经费被冻结,最后甚至失去了工作,几乎
所有的人都对他避之唯恐不及。接下来的六年时间里,Taub 教授的所有时间精
力都被耗费在为自己辩护上——巨大的社会压力使得他甚至找不到愿意为他辩
护的律师,所以他只好自己做自己的律师。案发之前,Taub 教授总计有大约
10 万美元的存款,到他最终胜诉洗清所有罪名之时,他只剩下了大约四千美元
的积蓄。当然,时至今日,基于他的理论及其实践为人类创造的巨大价值,
Taub教授被公认为当今全球最杰出的科学家之一。

http://zhibimo.com/read/xiaolai/everyone-can-use-
english/chapter1.html
触类旁通地想想吧,如果不把你的中文使用能力锁起来,那么在这个领域里,你的英文使用
能力就一定不能发展起来 —— 就犹如上面那个小女孩的左臂没有被绑起来一样,直接导致右
臂永远没有办法恢复 —— 因为大脑会走捷径,于是那一部分功能永远不可能被大脑的另外一
部分学会。所以啊,还是那句话:“都已经给你说清楚了,你自己选。”

是不是最终会感觉这岂不是“所有人都应该使用的方法论吗?” 是啊,早就说过了:

本来人人都是工程师,只不过很多人明里暗里自己放弃了而已。

5. 天天给自己洗脑  
我们天天刷牙、洗手、洗脚、洗澡…… 我们却从来不洗脑,这岂不是咄咄怪事?

在我看来,不给自己洗脑是最差的个人卫生习惯。更要命的是,很多人其实也洗脑 —— 只不
过,从来不是自己给自己洗脑,而是永生永世被别人洗脑…… 这是最可怜的生活状态。

晚上睡觉前,你洗澡、洗脚;早上起来,你洗脸、刷牙,然后出门。外面有风,所以有风
尘,外面可能下雨,所以有泥浆,你可能要上厕所,所以想来有很多细菌,你自己做很多事
情,弄不好也大汗淋漓…… 你就会觉得各种不干净,然后你怎么办?洗。不仅要洗,还要搭
配各种工具,香皂、洗发露、沐浴液……

一旦你开始学什么东西,你一定饱受各种打击 —— 那些不愿意学习的人,其实不仅害怕自己
学不会,他们更怕的是别人竟然学得会,所以他们会提前出手,打击一切可能让自己收到打
击的人或事。他们会嘲笑你(越差的人越鄙视别人),他们会泼冷水(恨不得泼的是开
水),他们会鄙视你(不是靠资格,是靠自以为是),他们会疏远你(以为这样可以让你害
怕)…… 更可恨的是,他们人数众多,比例上占据一定的优势。

于是,你的脑子就不干净了,被他们污染了…… 怎么办?自己给自己洗干净 —— 对,就这么
简单。

2009 年,有一个小女孩,名字叫高雅,背着个包从大连坐火车来北京找我,说要学
TOEFL,要到国外读大学。我就给她安排了课程,她很努力,几次下来,从最初的 62 分,考
到了最终的 102 分(满分 120 分)。去美国之前,她问我到了美国该学什么专业,我告诉
他,本科就是学基础学科的,比如数学。她当时脱口而出:“我从小就数学不好……” 我颇
不耐烦,因为我向来讨厌 “我从小 …… 就不好” 这个句型(有一类句型,是脑子被污染了的
人才频繁使用的),于是就直接厉声顶了回去:“谁说的!” 我本来说的是感叹号,她却理
解成了问号,声音低了好几度,头也不由自主地低了下来:“我们学校老师说的,好几个老
师都这么说……” 我愣了一下,却没有软了语气,直接回了过去:“让他们都去屎!” ——
我故意用了卷舌音。

后来呢?后来她去了美国,在华盛顿大学读本科,她本科读的是什么专业呢?数学。再后来
在卡耐基梅隆读研究生,研究生读的是什么专业呢?设计。现在在硅谷工作。

我想,我当时那一句斩钉截铁的 “让他们都去屎!”,也许是她第一次被洗脑,被洗干净,
从那个脏兮兮的状态下清爽地走出来……

我知道如果你告诉身边的人,你要学计算机了,你要把自己当作工程师了,那他们的反应几
乎是我可以栩栩如生地想象出来的。虽然你没必要说出来那句话(“让他们去屎!”),但
你自己要知道,他们的反应就跟屋外的灰尘细菌一样,是必然存在的,无法回避的,只不
过,你应该回家跟洗手洗澡一样,给自己洗洗脑 —— 请务必注意个人卫生!

我们每天都要给自己洗脑。可这并不是我发明的习惯啊!孔老夫子说,“吾日三省吾身”,
你看看他老人家个人卫生习惯多好,不仅洗,还要天天洗,而且还是每天要给自己洗脑至少
三次……

以下这几句话,天天都要读给自己听,天天都要把它们当作香皂用来给自己洗脑,一遍不够
就洗好几遍:

1. 学习其实是一种生活方式,学习本身就是最好的洗脑方式。
2. 只要我投入时间精力,长期来看,没有什么是我学不会的。
3. 我学会的东西越多,我再学新的东西就只能越来越快。
4. 学习不是目的,用起来才是真的,因为价值只能通过创造去实现。
5. 我知道我现在看起来很笨拙,但刚开始谁都是这样的,实践多了,就自然了,就自然地
好起来了。
6. 在学习这件事儿上,他们不理解我是正常的,这方面我也不需要理解,因为我是一个独
立的人。
7. 我不应该与他们争辩,因为我不想伤害他们;我也不应该被他们影响,因为我不想伤害
自己。
8. 刻意练习永远是必要的,虽然它通常并不舒适,但它的复利效应确实巨大的。
9. 哪怕是为了下一代,我也要通过现在的努力成为学习专家,这样才有资格与我的孩子共
同成长……
10. 我的路还很长,我要健康,我要干净,尤其是我的脑子更要干净。
其实,这完全是“进取型人格宣言”,不是吗?

在接下来的过程中,我们会不停地建立更多的原则。所谓的原则,就是一定要恪守的形式准
则,如果不能恪守,就不能称之为原则。做个有原则的人,是很重要的原则。另外,有一本
好书,就叫《原则》,一定要找时间研读。

任务  
1. 真正学会如何使用 Google
2. 用 Google 找到一个可购买的稳定的 VPN
3. 把“进取型人格宣言”背下来

你学你的,用不着别人批准  

有一句话是这么说的:

人类一思考,上帝就发笑。

我从来没搞懂这句话什么意思,什么目的,什么意义…… 也觉得并不重要。

我倒是清楚地知道另外一件事儿:

你一说要学什么东西,人们就发笑……

说实话,我花了很多年才琢磨清楚他们为什么要笑,他们的思路,他们的结论,他们的未来
和结局。琢磨清楚了之后,才觉得,这事儿的合理解释意义对我并不大,因为我不是他们,
他们和我也没什么关系 —— 只不过是各自的道路有过一次交叉而已,现在各自早就身处不一
样的世界了。

有一件事绝大多数人搞错了,导致了不一样的思路,不一样的结论,不一样的未来和结局:

学习这东西,不是一定要学到大师的程度才可以拿出来开始用的。
“学成归来”,是人们对大多数学习者的刻板印象,好像学不成就不要回来了似的。

真实的学习过程是,学会一点最少必要知识(就是那些知道了之后就可以马上开始行动了的
最少知识),然后就要马上开始实际操练…… 最终,大量的细节都是在实际操作过程中进一
步学会的 —— 甚至,还有大量的细节如果不进行实际操练的话,就根本没机会学得到。

在中国,每个会开车的人其实早就应该意识到这种学习方式的神奇。在中国,驾校的培训实
在是太粗糙、太简单、太粗暴了…… 交了钱,进了驾校,其实前前后后在练习场上实际操作
的时间少得可怜 —— 然后就冲出来上路了,虽然各自进度有些差异,但总体上来看,真正的
驾驶技能几乎 100% 都来自于在真实世界里实际操作,而非驾校培训,不是吗?

明明曾经靠着自己的勇气曾经学会过至少一项技能的人们,最终不知道为什么变成了另外一
种人…… 真不明白为什么那么多小时候什么都学、什么都做不好却也根本没怕过的人们,长
大了之后终究都成了怂货。而且怂到什么程度呢?怂到害怕别人不怂的地步……

于是,绝大多数人的眼里,学习成了一条“漫长不归路” —— 听起来多可怕啊,学不成就别
出来得瑟,学不成,就别回来见人!天呐。

这还不算,既然在脑子里把学习这事儿类比为一条“漫长不归路”,那么“它一定是一步一
步走过去的……”,于是,无论做什么事情,他们都感觉必须循序渐进,甚至,若是看到别人
不循序渐进,就很生气。

可是吧……

循序渐进坑了一代又一代的人……

其实,最有效的学习方式,真的不是从零开始,一路走到大师境地 —— 那条路上遍地尸骨訇
然兽出。

仔细观察一下我们的真实生活,我们从来都是这样的:

横空出世,向后钻研,向前突击……

这才是真实的世界。

我们的教育体系,好像特别痴迷于把我们带到循序渐进的道路上去,父母们也觉得只有这样
才放心(其实他们自己也是被弄脏了脑子自己不给自己洗脑的产物)…… 99% 的人循序渐进
地从 ABCD 开始学,学英语 16 年,开口说不了,拿笔写不出…… 真不知道图个啥。
最简单的编程,被抬高成“工程师”的境界 —— 可另外一个事实又明显地摆在那里:

很多自称工程师的人,其实看到十四五岁的小黑客做的事情,也不得不心服口
服 —— 若是必须、只能循序渐进才行的话,那些小黑客是不可能存在的,不是
吗?

小黑客们都不是靠循序渐进习得技能的。都是“横空出世”的,他们最开始做的事情,不是
打基础,而是“突然有个问题要解决”,于是不管三七二十一只好“向前突破”,用尽各种
方法(通常是很土的办法)先把问题解决掉…… 在这个过程中,能补的补(向后钻研),补
不上的就先放在那里,留给以后…… 然后反复迂回前进。

前些日子,我发了这样一条 Tweet:

算了一下,一个普通人只要不笨,一年是可以成长为全栈工程师的。用不着一
万小时。

其实我不用猜就知道,一定会有大量的人明里暗里向我吐口水了 —— 事实上,我今年 45
岁,一路就是这么过来的,我一想学点什么,人们就发笑…… 他们的口水从来没能淹死我。

我一个学会计专业的怕什么啊?我大学毕业出来搞的是销售,而不是会计,不也得现学现卖
吗?做了那么久批发生意,后来跑去新东方教英语,不也是跌跌撞撞先去考托福吗?离开新
东方之后开留学咨询公司,也得现学如何指导申请文书;再后来结果竟然闲着没事儿跑去学
习 Ruby on Rails、后来搞出来个 KnewOne;在这过程中还闲着没事儿研究比特币,再后来
还要学如何做创投;现在又没啥事儿干了,就准备认真研究一下计算机领域,从一个基础的
地方开始,去搞定全栈技能(时代不一样了,十年前是没戏的)…… 我学我的,他们为啥那
么看不惯?好奇怪…… 其实我倒也不奇怪,我知道他们的思路。

这么多年来,在学习这事儿上,除了我的父母之外,真的从来没有其他人鼓励过我。我最感
激我父母的方面,就是这么一条:

只要我说买书、只要我说报班,我要多少钱,他们就给我多少钱 —— 虽然总是
补上一句,“反正钱就这么一点点,你花在那里就不能花在别的地方了……”

他们就是这样在我小时候用行动支持我的…… 再后来我自己能赚钱了,就成了我自己用行动
支持我自己。
来自于亲戚、朋友的鼓励呢?说实话,真的没有,完全没有 —— 当然,我的情况特殊,我并
不需要别人鼓励 —— 我自我鼓励的能力超强。风凉话呢?那就太多了,认识的不认识的都想
上来泼一瓢冷水 —— 现在回头看这些年,最幸福的事情就是我也不知道为啥竟然没有被他们
恶心到,也没被他们吓倒,好像完全没事儿似的……

所以,我这一辈子都有个好习惯:

鼓励身边的所有人…… 只因为,我实在是太清楚“鼓励”这东西有多么稀缺
了。

老罗当年跟后来的老婆处对象的时候,据他说几乎所有人都反对,只有我一个人说,“多好
啊!你那么开心……” 西乔准备考雅思的时候,我天天说的只有一句话:“没那么难的,你
就弄罢……” —— 我真的没有教她什么,反正她从零基础开始一年之后考了雅思四个七分而
后留学霍炬陪读最终全家移民成功。当年高雅说,“我们老师都说我数学不行……” 我只不
过回了一句“让他们都去屎” —— 她到美国本科就选了数学专业,研究生选了设计…… 还有
另外一个小朋友叫魏天天,第一次托福,才 82 分,当时我正在上海出差,她给我打电话,电
话通了之后嚎啕大哭,我说的只不过是“哭个屁,都这样的 —— 接着考!” 后来,她考了
108 分。

如果你自己是个上进的人,那你就像我一样,天天鼓励那些同道中人罢 —— 我相信这绝对是
善事。

还有另外一个事实是很多人曲解的:

谁说学过之后用的不够熟练,就不能用了?!

我说了个全栈工程师一年差不多了,很多人就愤怒了…… 对不起,我不是故意的。我用一两
个月时间学会了,但用的不够好,部署到网上没多久就被人攻击了,甚至被“脱裤”了……
这确实可以算作技艺不佳,可这碍着谁了呢?—— 哈哈,大家可能不知道,这事儿真的出现
过,我当年学 ROR,用它写了个博客程序,然后就被“黑客”攻击了,删除了第一篇文章,
然后留下几句话…… 他一定是觉得“这下我狠狠羞辱了李笑来一番”…… 偶尔挺想他的,不
知道五年过去了,他现在怎么样?

哦,对了,还有另外一个事儿:

谁说没天分的人就不应该学东西了,谁说没天分的人学得不足够好就丢人了?
我学过的几乎所有东西里,都没有“我有天分”的因素…… 这一方面是破令人沮丧的事实,
另一方面又是勇气的来源。我最没天分的事情,可能就是唱歌。据说小时候唱歌很好听,后
来有一次出去滑冰,重摔,然后脑震荡,然后就脑残了(这可是真的脑残),应该是负责辨
音的部分受伤,直接的结果就是变得五音不全,没办法准确地分辨别人的音高,无法自如地
控制自己的声音…… 上初中的时候,我爹给我买了一把吉他,说,“你唱歌都跑调,将来怎
么学英语呀?” —— 一副“老爹只能帮到你这里了”的表情。许多年后,我弹琴自娱自乐,
偶尔唱首“山丘”让同事们开心一下…… 他们很羡慕,却不知道那吉他对我来说,这么多年
来,其实一直是“脑残治疗仪”…… 我做销售,也不是因为我擅长,而是当年会计没学好,
所以找不到会计的工作(也有别的原因);我去新东方教书,你真以为我英语有多好啊?只
不过是考试成绩不错而已,发音那个烂啊…… 但发音烂就要被剥夺讲英语的权利吗?我不
信。后来搞投资,你真以为我能点石成金啊?投了很多烂项目、死项目,花很多钱买了很多
教训之后才开始慢慢摸到一点门道……

而且,我心粗,没有生气恼火的基本素质。更邪门的是,我认识很多被骂得比我惨的人……
比如王垠,比如罗永浩,比如和菜头,比如霍炬,并且,他们之间还可能对骂呢…… 偶尔好
像来气了的时候,不小心不厚道地想到他们,我就又乐了…… 唉,咋整?

有一天,我在朋友圈里发过这么一句话:

我找到了捷径,可惜早已身不在起点。

真的有很多捷径…… 比如,现在这篇文章里很多话都是“捷径”,因为你想通了,这些“捷
径”就会帮你节省很多很多时间,节省很多很多精力,了却很多很多烦恼,甚至抄很多很多
近路…… 捷径,不就是用来节省时间、提高效率的吗?

说这么多,其实就是想说这么个事儿:

我就是想带着一群人(当然总体上其实肯定是少数人),大幅度降低对学习的
恐惧,大幅度压缩学而不用的时间,大幅度地跨界 —— 跨越那些貌似无法跨越
的界限 —— 因为我们能活很多辈子,七年就是一辈子,你自己算算看?。

这一定让一些人感觉不舒服,但相信我,我们真的不是故意的…… 我们没想到会是这种情
况…… 我们本来只是想自己过得更开心一点而已。大家尽量相互谅解罢。

另外,这事儿需要补充:
我所说的、我所理解的全栈,究竟是什么没必要在语义上争论,但,在真正工
程师的生活中,coding 应该基本上只占 20% —— 因为最终代码是用来表达思
想的,用来解决问题的;所以,全栈工程师是那种有真正的问题需要解决,有
真正有价值的想法需要实现,有品位的设计者、创造者。就好像我们都识字,
都能写字,能写漂亮钢笔字的人也很多很多,可最终写好文章、写好教程、写
好小说、写好诗歌的人才是“文字工程师”,剩下的都只是“识字而已”。

开始之前……  

1. 本书中使用的系统为 Mac OSX  
在接下来的过程中,我们默认提到的都是 Mac OSX 操作系统,而 Ubuntu 版本的说明,只
能等到有志愿者原意帮忙的时候才可能有……

2. 大屏幕很重要、双屏幕更重要  
衣服简谱一点没关系,食物清淡一点没关系,工具不够精良绝对不行。千万不要在工具上舍
不得花钱,否则你注定落魄一生。

大尺寸屏幕 —— 甚至两块屏幕 —— 真的非常重要,这不仅仅是对程序员重要,其实对每
个人都是一样的。美国犹他大学的研究者在 2008 年经过统计调查发现,大屏幕一天能帮人
节省两个半小时 —— 请注意,这是干活做事过程中的两个半小时!别说程序员了,哪怕是那
些每天书写文档,编辑表格的人,使用 24 吋屏幕的人要比使用 17 吋屏幕的人快 52%!这
几乎是十年前,现在已经是 2016 年,iMac 的显示器已经是 27 吋了,分辨率已经是 4096 x
2304,几乎相当于十年前四块显示器的显示区域……

现在很多 IT 公司都不给员工配备电脑了(也许是因为笔记本电脑的降价与普及),但,少数
开明的公司,基本上都会给员工配备外接的大面积显示器 —— 其实是很便宜的投入,却很实
实在在提高很多效率。事实上,爱惜自己是一种生活态度,即便公司不给买,也要自己给自
己买,反正现在显示器很便宜。
3. 注册一个 Github 帐号  
很少有计算机书籍会把这件事儿单独拿出来说。可实际上,这确实很重要 —— 因为从骨子里
来看,习得任何技能的最根本技巧,就是一句话而已:

马上开始像那些已经精通这个技能的人一样生活。

因为从本质上来看,一切的学习与创造,都是学习者与创造者的生活方式、生活内容。去目
标技能拥有者最活跃的地方生活,像他们一样生活,直至真的就那么生活 —— 这就是学习与
创造的另外一个更为生动、更为本质的描述。所谓近朱者赤近墨者黑,讲的也是一样的道理
—— 因为激活大脑里的“镜像神经元”是学习与创造的最初起点。

Github 其实是目前地球上最先进、最高级、最高质量的社交网站,对,它就是个社交网站
—— 虽然貌似现在的人们普遍认为“社交网站”指的是另外一类东西。在那里,工程师们用
他们固有的最高效的方式相互交流。他们写好代码就传到 Github 上去,用 Github 做开发中
必须的重要事情:

备份自己的代码
文档与代码的版本管理
相互最高效地交流与协作
通过展现有效活动而获得更高信用
更方便地展示自己与自己的成果

在 Github 出现之前,工程师们在命令行下最常使用的命令式 cd 和 ls,现在,他们最常用的
命令早已经是 git 了…… Github 是个崭新的世界,先开门进去罢 —— 注册个帐号就行了,
多简单!

一个零人沮丧的事实是,在中国有很多所谓的程序员,真的不用 Github,还有很多为了求职
跑到 Github上提交假项目…… 三叹。

4. 每天都要有一整块的思考时间  
这才是最重要的一条。工程师不是每天每时每刻都写代码的,他们用更多的时间思考。这有
点像什么呢?你看大家从小上学,挺辛苦地学会了识字、写字,可大多数人一辈子都不会写
文章,就算写出来了,也传播不出去 —— 其实只是是因为确实没价值,因为在传播自由的时
代里,真有价值的东西总是会被发现。为什么呢?因为他们不思考,也不会思考,所以,等
于没有什么东西值得表达 —— 尽管已经掌握了一定的表达技能。

又因为不会写东西,没什么东西可写,所以,他们的表达技能永远停留在初级阶段,因为他
们没有机会用这个技能与真实的世界交流(与读者沟通,无论是单向或者双向,或者与其他
作者比较,无论是更好还是更差),于是,他们永远不可能获得真正的高级技能(那些技能
也有人写书出来,可纸上得来终觉浅)。

工程师其实跟写书写文章的作者一样,无非是用他们特有的表达技巧去表达他们的思想,作
者用自然语言文字,工程师用特定字符构成的代码…… 可关键在于,首先要有表达的标的,
之后才有表达好坏的判断。工程师表达什么?他们发现问题之后解决问题,提高效率(通过
大量的自动化任务)…… 那么他们天天要思考的事情多的去了,什么值得解决?要解决的话
如何解决?我的解决方案是不是比别人的都更好、更优雅?为了搞定这个任务,我需要学会
什么?我需要和人么样的人以什么养的方式合作?我能否持续地维护我的解决方案?我如何
才能让更多的人支持我?

与大家认为的“码农”并不一样,真正的工程师,时间分配大抵上是这样的,80% 的时间用
来思考,20% 的时间把思考结果用代码表达出来(也许是通过带领团队)。这个思考的过程
包括反复搜索(search 多了,就叫 research),深入阅读各种文档(因为今天的工程师必定要
用到大量别人写好的模块),还要思考自己写出来的代码如何写好文档才能让更多的人使
用……

而刚入门的时候,可能是反过来的,80% 的时间用来写代码,没有思想可以表达,就去模仿
表达别人的思想…… 但,一定要有 20% 的时间花在真正的思考上,像工程师一样思考。很多
人进步慢的根本原因在于,每天都在“学”,但从来不花大块的时间深入“想”。

从一开始就要养成习惯,每天要有起码一小时的时间专心思考:

我将要解决的问题是什么?
最重要的问题是什么?
它的核心关键在哪里?
已有的解决方案都有哪些?
我如何才能给出一个更好的方案?
我的方案应该如何拆解,如何逐个实施?
给自己买一个小本子,里面夹上一根笔,随身带着。 你学的东西越多,你越离不开这种小本
子,遇到什么事儿就记下来,因为你是拼命使用你的大脑的人 ,你要记住的东西太多了,平
时必须依赖这种随身携带的小本子减轻你的记忆负担。虽然现在移动设备上的记事本也挺方
便,但你用过一段时间就知道了,弄不好还是纸笔写写画画对大脑的帮助更大 —— 其实成本
也很低很低。

用整块时间思考,其实并不容易,因为刚开始的时候会很快走神。其实有很简单的解决方案
的:

一边思考,一边写写画画,一小时不知不觉就会过去。

集中精力思考的时候,我喜欢在电脑上,而不是纸质的笔记本上,因为我的打字速度非常
快,能跟得上我的思考速度 —— 手写实在是太慢了,并且太难看了哈。

5. 功夫在行外  
以后请你随时留意这种情况:

事情的关键往往在另外一个领域中。

在中国想要成为工程师,竟然有很大的一个关键并不在于技术本身,而是在于英语阅读能
力;再比如说,即便成为了一个入门级的工程师,驻足不前的根本原因并不在于技术难关无
法攻克,而是在于平时的思考习惯不良,或者干脆没有真正深入思考的习惯……

这可能会另很多人惊讶。可这种情况是普遍存在的。当年我教英语的时候,写了本书,
《TOEFL 核心词汇 21 天突破》,其核心关键在于通过统计结果筛选必背词汇,你看,这就
是“英语专业”、“师范专业”毕业的职业英语教师肯定不会的东西,于是,他们一下子被
我打败了,那本书在市场上卖了两辈子之后(2003 年第一版),还在继续畅销……

小时候,我父亲怕我唱歌跑调,将来会因此学外语产生困难,给我买了一把吉他。五音不全
的我,竟然摸索着学,虽然弹得一般般,但也自得其乐。因为听音差,也因为无法像好歌手
那样自如地控制自己的声音,所以,无论哪一个曲子都是一个小节一个小节地反复练,甚至
有些小节都一下子顺不过来,以至于需要再细分成若干个环节分别练,每个都练熟了之后,
还有再反复串起来练,最终才算过了及格线……

成年之后,我拥有比大多数人更为强大的学习能力,无非是在这个过程中养成了几个习惯:
我不怕麻烦,因为再麻烦的事儿,都可以拆分成无数个可处理的小块,于是
就不麻烦了;
即便是天赋不好,通过一定量的练习,也可以做到比大部分人好,哪怕滥竽
充数也充得更像;
经验告诉我,经过一段时间之后,一定会越来越有能力解决更大的麻烦…

你看,我什么都敢学,什么都能学 —— 只要有时间 —— 竟然只是因为小时候唱歌跑调,老
爸给买了一把吉他…… 除了我自己,谁会觉得这事儿有这么重要呢?而上面这三条所提及
的“解决麻烦方法论”,其实不也恰恰是工程师们用代码解决现实生活问题的方法论吗?

对,功夫常常就是在行外。

任务  
1. 也许应该换台电脑
2. 给自己再加一个显示器
3. 里里外外翻翻 Github,随便逛逛
4. 买一个小本子随身带着。

基本开发环境设置  

小心你的中文输入法  
在与计算机打交道的时候,中日韩国家的人因为输入的并非英文半角字符而造成的错误非常
普遍,因为他们的输入法使用的是 CJKV “全角字符”,而非计算机编程语言可识别的“半
角字符”(至于这两个词究竟是什么意思,来龙去脉是什么,自己 Google 一下就好)……
因此新手有必要在使用编辑器书写代码的时候事先关闭非英文输入法。以后熟悉了之后,当
然不再会因此浪费太多时间。
也需要因此做一些特定的配置。比如,应该在 System Preference > Language &
Region > Preferred Languages 里将系统的首选语言设置成英文,这会在将来节省很
多时间,

如果你使用中文输入法的话,那么,Spotlight 的快捷键与更换输入法的快捷键最好都重新设
置一下,*总之就是不要占用 Control 键 ⌃。请在 System Preferences > Keyboard >
Shortcuts 里设置。

我的习惯是把 Spotlight 设置为 ⌥Space,把更换输入法设置为 ⌘Space;而 Spotlight
中,Show Finder Search Window 不使用快捷键;Input Sources 中,Select next source
in Input menu 不使用快捷键。

命令行工具(Terminal/iTerm)的基本设置  
用 Spotlight 呼出 Terminal,无论是谁,都得从熟悉它的使用开始。

打开 Terminal 之后,可以试试以下两个命令:

 cd /

ls

现在需要知道的就是,每一行命令都必须做到每个字符都不能错,输入正确之后,按回车键
 执行命令。

接下来要做的事情,按步骤完成,但你肯定完全不知道自己在做什么,照着做就行了(为了
保证不出错,请逐次拷贝粘贴以下命令行,而后再按回车键执行):

(1)

 cd~

(2)

 curl ­O https://raw.githubusercontent.com/donnemartin/dev­setup/master/.bash_profile

(3)
 curl ­O https://raw.githubusercontent.com/donnemartin/dev­setup/master/.bash_prompt

(4)

 curl ­O https://raw.githubusercontent.com/donnemartin/dev­setup/master/.aliases

全部完成之后,重启 Terminal(就是关掉退出之后,再重新打开)。刚才的命令完成了很多
事情,只不过现在你搞不懂,你能看到的就是命令行提示变得花花绿绿了,各种颜色有不同
的意义 —— 但以后再说。

接下来,要为 Terminal 换个皮肤 —— 天天要用的东西,不好看太难受了。我个人喜欢这两
个:

Solarized
Spacegray

去 Google 一下,找到你选的那个,使用说明都非常清楚的 —— 花点时间阅读就可以了。

要为所有与写代码相关的程序设置特定的字体,以便很容易识别出那些不小心输入的“全角
字符”。我个人选择的是 Courier New 这个字体,因为这个字体的亚洲文字也挺好看,对我
来说也更容易识别 —— 反正你要选择一个“等宽字体”。欧美的程序员偏爱 Menlo 之类的
—— 也许更多是因为他们没有亚洲输入法使用者的苦恼罢。

在 iMac 大屏幕上,我会把 Terminal 的字体设置为 20px …… 可问题是,你打开 Terminal
的 Preferences > Profiles > Solarized Dark > Text > Font,点 Change 按钮,跳出来的
对话框里,你会发现你无法将字体设置为 20,下拉框里,18 之后就是 24 了…… 苹果的这个
设计糊弄了很多人 —— 你这样:拖住对话框右下角横着拉,将对话框拉长到一定程度,你就
发现那个字体选择框变成了“输入框”与“下拉选择框”的组合…… 你就可以在里面输入 20
了。

还有,Mac OSX 其实还有很多快捷键可以设置,其中一个比较重要的是 New Terminal at
Folder,在System Preferences > Keyboard > Shortcuts > Services > Files and Folders
里可以找到。我把它设置成了 ⌃⌥⌘T,以后在 Finder 里,用鼠标选中某个文件夹(或称“目
录”),然后按 ⌃⌥⌘T,就可以呼出 Terminal 并且将工作目录转至这个文件夹内…… 很方
便。
好了,Terminal 的基本设置算是完成了。

另外,有三个 Mac OSX 系统自带的东西,工程师们会觉得不够用,进而造出更好的东西来
替代,它们分别是:

Terminal → iTerm
Finder → TotalFinder / Path Finder
Spotlight → QuickSilver / Alfred

我个人的选择是:

iTerm & TotalFinder & Alfred

建议你立刻硬选一组,别在这里浪费时间,往前走,要做的事情还很多很多。

下载 iTerm 之后,你要做的就是为它更换皮肤,更换字体,设置字体大小…… 其实你已经做
过一遍了,和设置 Terminal 没什么太大差别。

命令行的使用  
使用命令行工具,可以对系统下的文件(file)和目录(folder/dirctory/dir,这三个词在大
多数情况下是一回事儿)进行罗列、创建、复制、移动、删除、修改等操作。

以下是一些最常用的命令(’#‘ 之后的文字是注释,输入命令的时候不能有它们):

 ls #罗列当前目录下的内容
cd #更换工作目录
pwd #现实当前完整工作目录
touch #创建一个文件
mv #移动/更名文件或目录
rm #删除文件活目录
nano #使用 nano 编辑纯文本文件
open #打开一个文件,就好像你在 Finder 里双击那个文件图标一样
clear #清空屏幕
sudo #用管理员身份去执行一个命令

这些命令现在倒没必要马上深入研究,因为你早晚会不得不深入研究他们的。现在更必要的
是学习 Terminal/iTerm2 的使用,有哪些快捷键等等…… 倒有个好去处,在 Github 上:
https://github.com/0nn0/terminal-mac-cheatsheet

还有个 Cheatsheet 值得打印出来,反复看,用的时候随时参考,直到所有视觉记忆全部变
成肌肉记忆为止……

…… 或者说是,“直到把一般记忆变成脊椎记忆为止”,或者说是,“直到大
脑皮层表面形成了专门的沟回为止”…… 反正都是一个意思:就是熟练到可以
用潜意识即可完美完成的地步。

倒是 Cheatsheet 这个词应该记住,以后不管学什么,都到网上搜索一下 xxx
cheatsheet,多翻几个,一定有收获。

注意:“通读”是做工程师必须的能力。你不一定要全部能够理解(对任何人来说,最初都
不可能做到),但你必须对整个文档有一个整体的认识。这就好像读书的时候,你能做到虽
然不能完全读懂,但确实能够完整读完 —— 之后再多读几遍么!古人说的是对的:读书千遍
其义自见。还有就是,若是从一开始就没有“通读”的意识,后面不知道会吃多大的亏,而
且吃了多少亏自己都完全不知道…… 这很可怕。

举个简单的例子罢:

很多工程师,用了好多年 Terminal,竟然都不知道竟然还有个快捷键能把光标
前的两个词调换一下位置:按一下 esc 键,然后再按一下 t (通常标记为: -
t)…… 你想想看他们在过去的那么多年里,浪费了多少次键盘敲击?—— 虽然
说起来、听起来没什么,可若是真的严肃起来去想,有什么比时间更重要的
呢?浪费了大量的时间、浪费宝贵的生命,只不过是因为最初的时候没有养
成“只要是重要的文档,必须通读至少一遍的习惯”而已。

所以说,“优秀是一种习惯”真的并不是空话,是放之四海皆准的道理。随后的过程中,我
们会建立很多很多的好习惯,甚至这句话本身也会在各个地方重复 —— 生活质量就是这样一
点一点提高的,放在哪个领域里其实都一样。

安装必要开发环境  

XCode Command Line Tool  
过去安装这个东西费劲死了,在需要翻山越岭的情况下下载两个多 G 的东西,唉…… Mac
OSX EI Capitan 之后,终于可以在命令行工具(Terminal)下这样安装了:

 xcode­select ­­install

安装 Homebrew  
还是在命令行工具中拷贝粘贴以下代码,而后按回车键  ……

 ruby ­e "$(curl ­fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

随后再次在命令行工具中拷贝粘贴以下代码,而后按回车键  ……

 echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile

安装 Git  
 brew install git

安装 rvm 与 Ruby 2.3.1  
注意,以下是三行命令,要分别输入,每行都要按接回车键( )执行。以后为了书写方便,
经常会把一系列命令放到一个代码块中……

 \curl ­sSL https://get.rvm.io | bash ­s stable

rvm install 2.3.1
rvm use 2.3.1

rvm 是 Ruby 的版本管理工具,其作用是在系统中安装若干个不同版本的 Ruby,且不让它
们之间发生冲突。你可以安装很多个版本的 Ruby,比如,刚刚安装了 2.3.1,随后你还可
以安装 1.9.2:

 rvm install 1.9.2
需要使用 1.9.2 版本的 Ruby 的时候,就可以用这个命令:

 rvm use 1.9.2

也可以随时用这个命令切换回 2.3.1

你也随时可以用这个命令查看自己都安装过哪些版本:

想要卸载哪个版本的 Ruby,你就用这样的命令:

 rvm uninstall 1.9.2

下面要接着安装的 nvm,跟 rvm 一个原理,只不过 nvm 是 nodejs 的版本管理器。

安装 nvm 和 node 4.4.5  
brew install nvm nvm install 4.4.5 nvm use 4.4.5

为什么要安装 4.4.5 这个版本呢?nodejs 有两个版本,一个叫 LTS(Long Term Support,
提供长期支持的稳定版),一个叫 Current(提供最新功能的当下版,通常也不够稳定,尚
需改进)。很多软件系统都采用这种方式,比如著名的 Ubuntu …… 所以,当我们需要安装
什么软件的时候,必须到官方网站上看一看,看看当前的稳定版本是什么,然后选择它就是
了。将来你成了高手,啥都敢于、且确实有能力尝鲜的时候,就随便你喽。(更新:2017 年
3 月,LTS 版本已经升级到 6.10.0……)

如此这般,最基础的开发环境算是完成了 —— 理论上来讲,还有更多的事儿要做,不过,反
正也一下子做不过来,就先到这里为止罢。

关于更详细的开发环境设置,请参阅这两个 Github 项目:

nicolashery/mac-dev-setup
donnemartin/dev-setup

未来你肯定会反复去看的 —— 因为就是用得着。

安装 Atom  
工程师们对编辑器有各种各样的偏好,vi/vim, emacs, TextMate, Sublimetext… 这些不过
是免费的,还有很多收费的…… 问他们用哪个最好,基本上不可能有统一的答案。在这里,
我们就不讨论不探究了,就直接开用一个 Github 出品的编辑器罢:Atom.

建议

永远不要参与编程语言之间或编辑器之间的比较争论 —— 在工程师世界里,那
是永无宁日的争论,但价值并不大,事实上,一切争论的价值都不大:平息争
论的能力才是更有价值的能力,若是不能平息争论,就不要参与争论了,因为
参与无法平息的争论,本质上就是,耗费了时间耗费了生命却没有任何结果
—— 这是一个很重要的价值观,它会帮你节省无数未来的时间精力,它也有可
能让你成为那个最终能够平息争论的人。

安装  
打开 iTerm,用以下命令安装 Atom:

 brew cask install atom

关于 brew cask 命令的说明,请参阅其官方网站:https://caskroom.github.io…… 学任何
工具,第一件事情就是去把官方网站翻个遍,是必须的习惯。

当然,也可以使用传统的安装方法,到 https://atom.io 去下载 dmg 文件,打开之后,将应
用程序拖到 Application 目录中去……

阅读 Atom 官方网站  
Atom 的官方网站是,https://atom.io ,Documentation 栏目里,他们放了一个 Atom
Flight Manual —— 这就是第一步要读的东西。

对于新手来说,至少应该先认真阅读第一章:

Chapter 1: Getting Started

Atom Cheatsheets  
拿来任何一个软件工具,快速熟悉并掌握各种快捷键,是一个好习惯 —— 基本上就是耗费半
小时而后用一辈子的事情。随便搜索一下 Atom Cheatsheet 就有一个 Cheatsheet 不错:

http://d2wy8f7a9ursnm.cloudfront.net/atom-editor-cheat-sheet.pdf

而 Atom 本身是个工具,所以它的 Cheatsheet 可以做得更为方便,有两个 Package 可以安
装试一下:

atom-shortcuts package
keybinding-cheatsheet package for Atom

熟悉到一定程度之后,就可以卸载它们了。

还有个程序值得试试:CheatSheet,无论什么时候,只要有它在,按住 ⌘ 一会儿,就会跳
出一个面板,让你看到所有可用的快捷键。

 brew cask install cheatsheet

安装 Dash  
Dash 是个神奇的个人作品,现在几乎每一个在 Mac 上开发的人都会用到 Dash,估计你也
不例外,装上吧,该付费就马上付费…… 想想真的不算贵。

总结  
除了各种安装配置之外,你重点要看的是这俩文档:

命令行文档 —— 先熟记那个 Cheatsheet……(另外,苹果有个官方的文
档:Command Line Primer)
Atom 官方教程的前两章。

肯定无法一下子全读懂,但“即便读不懂也要读完”,是一个特别神奇的能力,古人都知
道“读书千遍其义自见” —— 说的就是这事儿。你必须积累这种能力,切记。

到此为止,你做了很多事情,翻了很多网页,敲了不少字符…… 可还不知道干了什么。别着
急,耐心,耐心是唯一的法宝……
 

Atom 编辑器进阶  

1. 两个共同的目标  
以下的内容,假定你已经读完 Atom 官方教程 Atom Flight Manual 的第一章:

Chapter 1: Getting Started

否则不要看下去了,回去先把那一章读完再说……

工程师们使用的编辑器,有两个最基本的设计目标:

1. 尽量少敲键盘、少出错、多做事
2. 一定要可扩展、可定制、可积累

Mac 上的编辑器,工程师们最喜欢用的曾经是 TextMate,后来是 Sublimetext 和 Atom……
它们都是这样的编辑器。

新手在 Atom 里敲键盘的时候,可能会“惊讶”地发现,括号、引号等等,都是成对出现
的…… 比如,你按一下单引号,‘,实际出现的是一对单引号,而光标则闪烁在两个引号之
间: '|' …… 圆括号、方括号、尖括号、大括号,等等,也都是这样的 —— 这就是工程师
们不断给自己提高效率的一种方式,他们会想尽一切办法让自己可以少敲键盘、少出错,当
然,为的是做更多的事。

现在问题来了,按一下引号 ‘,出来的是两个引号,然后光标在中间,于是你就可以在两个
引号之间输入了…… 引号之间的内容输入完毕之后,你还得按一下右方向键→,右手移动的
距离很大,因为右方向键在最右下角…… 很烦人是吧?
在 Atom 编辑器中,用 ⇧⌘P 呼出 Command Palette,在里面输入 init script,由于
这个输入框里使用的是 Fuzy matching, 你输入到 s 的时候,估计 Application: Open
Your Init Script 已经排在第一位了,当它是第一位的时候,直接回车键   就可以
了…… 在 init script 文件里拷贝粘贴以下代码:

 # move cursor across the ending symbols...
EndingSymbolRegex = /\s*[)}>\]/'";:=­]/
atom.commands.add 'atom­text­editor', 'custom:jump­over­symbol': (event) ­>
  editor = atom.workspace.getActiveTextEditor()
  cursorMoved = false
  for cursor in editor.getCursors()
    range = cursor.getCurrentWordBufferRange(wordRegex: EndingSymbolRegex)
    unless range.isEmpty()
      cursor.setBufferPosition(range.end)
      cursorMoved = true
  event.abortKeyBinding() unless cursorMoved

然后用 ⇧⌘P 呼出 Command Palette,在里面输入 keymap,你应该能看到
Application: Open Your keymap 已经排在第一位了,当它是第一位的时候,直接回车
键  …… 在 Keymap 文件里拷贝粘贴以下代码:

 "atom­text­editor:not([mini])":
  "enter": "custom:jump­over­symbol"

其中这个 enter,你可以换成你自己喜欢的、习惯的,比如 tab,或者 shift-enter。

现在,用 ⇧⌘P 呼出 Command Palette,在里面输入 reload,你应该能看到 Window:
Reload 已经排在第一位了,当它是第一位的时候,直接回车键   就可以了…… 你也能看到
这个命令其实有个快捷键: ⌃⌥⌘L,但 Command Palette 太好用了,以后你就知道了,记
忆过多的快捷键实在是负担,虽然一些基础快捷键(比如命令行工具里的一系列与 control
键 ⌃ 组合的快捷键)必须通过大量使用变成脊髓记忆……

Window: Reload 完成之后,你刚刚设定的快捷键就生效了。
整个 Atom 程序就是一个大的 HTML 文件,你刚刚的 Reload,就好像是在浏
览器里刷新了一下一样。也由于整个 Atom 就是个 HTML 文件,所以,理论上
来讲,它里面的任何一个地方都是可以随心所欲地定制的 —— 只要你懂
HTML/CSS/JAVASCRIPT…… 虽然你现在搞不懂之前拷贝粘贴的代码,早晚你
会懂的,放心吧。

现在你再按顺序依次敲以下键盘序列试试……

( ‘ t h i s   

最终的显示应该是这样的(其中最后的 | 表示的是闪动的光标):

(‘this’)|

你看,Atom 和所有现代文本编辑器一样,就是一个可高度定制的编辑器,它在 Github 上的
标题就是这么写的:

atom: The hackable text editor

处处都可以定制…… 可是,虽然这当然是好事儿,但,警告要来了:

只关注最重要的定制,不要在无关紧要的细节上浪费生命。

最重要的定制,是接下来要讲的 Snippets,无关紧要的细节指的是皮肤啊、配色啊之类的东
西 —— 这种无关紧要的东西,快速做出选择,而后就再也不碰了,比如,Theme 我直个人
就接选了一个 spacegray-dark-neue-ui,而 Syntax Highlight Color,我也选了同门的
spacegray-dark-neue-syntax,就完事儿了,在这上面多一秒时间都不要浪费……

2. Atom Snippets  
先创建一个尾缀为 .html 的新文件,比如名称为 test.html,随便保存在那里,比如保存
在桌面上(以便一会儿想删除的时候可以很快找到哈)…… 尾缀很重要,不要搞错。

然后在这个文件里按顺序敲以下键盘,其中最后一个 ⇥ 是神奇的 TAB 键:

html⇥
在按 ⇥ 之前,你可以看到一个列表,先别管它,直接按 ⇥ …… 你会看到编辑器里突然多了一
大堆东西:

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="utf­8">
    <title>|</title>
  </head>
  <body>
 
  </body>
</html>

随便再输入点什么,比如,test html title,而后再按一下 ⇥,光标就挪到 <body> 之后、
</body> 之前了。

能这么做,归功于 Atom 内建了 Html Language 的插件,其中设定了所有 HTML5 的标
签“自动展开代码”(即,Snippets),该插件的项目代码托管在 Github 上:

https://github.com/atom/language-html

上面提到的这个 Snippets,代码如下:

 'HTML':

    'prefix': 'html'
    'body': '<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset="utf­
8">\n\t\t<title>$1</title>\n\t</head>\n\t<body>\n\t\t$2\n\t</body>\n</html>'

你可以大概理解一下,其中:

\n 表示的是纯文本中默认并不显示的“换行符号”;
\t 表示的是 tab(不是 tab 键,而是文本中显示的“缩进” —— 通常相当
于两个空格,或者四个空格);
$1 是展开后光标所在的位置;
$2 是再次按 ⇥ 键的时候,光标应该所在的下一个位置……

你看,工程师们想了多少办法让自己少敲多少键盘…… 他们做事、干活,累的不是手啊,用
的是脑!有脑子不用就等于没有脑子…… 不是吗?
在 Atom 编辑器中,用 ⇧⌘P 呼出 Command Palette,在里面输入 Open Your Snippets,
你会看到里面有这样一段被注释掉(即,不被执行)的代码:

 # Your snippets
#
# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
# expand the prefix into a larger code block with templated values.
#
# You can create a new snippet in this file by typing "snip" and then hitting
# tab.
#
# An example CoffeeScript snippet to expand log to console.log:
#
# '.source.coffee':
#   'Console log':
#     'prefix': 'log'
#     'body': 'console.log $1'
#
# Each scope (e.g. '.source.coffee' above) can only be declared once.
#
# This file uses CoffeeScript Object Notation (CSON).
# If you are unfamiliar with CSON, you can read more about it in the
# Atom Flight Manual:
# https://atom.io/docs/latest/using­atom­basic­customization#cson

以后你就可以把自己写的 Snippets 放在这里(当然以后还有更高级的方法)……

在 Comman Palette 里,输入 Available,可以找到 Snippets: Available,不妨逐
个玩一玩…… 给自己定个 Timer,玩上半小时之后一定要停下来。

现在可以回去再仔细看看 Atom 官方教程 Atom Flight Manual 的第二章了,尤其是
Snippets 那一节。

读完之后再回来。

Atom 的 Snippets 有个概念,叫 Scope,也就是说,根据文件类型确定究竟有哪些“自动
展开”可以使用的。所以,你若是在一个 .md 的文件里敲击 html⇥,就不可能被展开成上面
那个例子那样。

写 Snippets 的时候,如何确定 Scope 呢?请认真阅读这段话:
If it’s difficult to determine the package handling the file type in
question (for example, for .md-documents), you can also proceed as
following. Put your cursor in a file in which you want the snippet to be
available, open the Command Palette (cmd+shift+p), and run the Editor:
Log Cursor Scope command. This will trigger a notification which will
contain a list of scopes. The first scope that’s listed is the scope for
that language. Here are some examples: source.coffee, text.plain,
text.html.basic.

摘自于:https://atom.io/packages/snippets

你现在看不懂无所谓,大致留个印象就好,反正以后都是通过反复用,反复研究产生真正理
解的。

这里有个重要的建议:

尽量不要直接使用别人写好的 Snippets,要自己写、自己敲;而别人写好的,
尽量只用来参考。

无论你学什么语言(或者框架),就一定要在学习的过程中不断添加积累自己关于那个语言
(或者框架)的 Snippets,这是一个自己给自己“添麻烦”的过程,但这种所谓的“麻
烦”,其实是一种刻意训练,不做其实是偷懒,偷懒这东西,真心不划算的。

我在参考别人写好的 Snippets 的时候,有个习惯,把那些他们定义的“缩写”全部换成自然
语言。比如,人家原来写的是这样的:

 "if/else statement":
  prefix: "ies"
  body: """
  if (${1:condition}) {
  \t${2://statements here};
  } else {
  \t${3://statements here};
  };${4}
  """

我会改成这样(注意 prefix 那一行):
 "if/else statement":
  prefix: "if/else statement"
  body: """
  if (${1:condition}) {
  \t${2://statements here};
  } else {
  \t${3://statements here};
  };${4}
  """

这是因为我觉得花时间记忆那么多缩写没必要,尽管他们编制的缩写也有一定的规律…… 因
为在 Atom 编辑器里,无所不在的有一个叫 Fuzy Matching 的东西(也是工程师们设计好用
来提升自己效率的东西)—— 它会不分字母前后顺序地帮你寻找你可能要输入的内容…… 在
Fuzy Matching 无所不在的情况下,缩写的意义其实并不大。

哪怕是把别人写好的 Snippets 如此修改一下的过程中(其实本质上好像完全没干什么),也
有机会读一遍,也有机会留个印象,甚至因为在修改中可能出现错误而不得不反复读了很多
遍 —— 那更好,因为那就加深了印象……

学会了 Snippets 的使用与编写,感觉上已经很工程师了,哈!早晚有一天你会为 Atom 写
Package 的 —— 到时候你就觉得没多难了。

任务  
去 Google 这些词组:
favorite atom packages
most popular atom packages
must have packages for developer

原则上,你没必要一下子装太多的 Packages,逐个试试,玩玩即可。玩过之后,可以将目前
还用不上的 Packages 停用掉(disable)—— 因为有的时候会出现 Packages 之间快捷键
冲突啊什么的,又由于你并不熟悉,可能会因此手足无措,进而浪费时间精力。

 
使用 Hexo 为自己在 Github 上建一个  
静态 Blog 站点

在开始之前就说过,必须去注册一个 Github 帐号…… 以下假定你已经注册好了。

想学什么,可以先假装已经会了什么…… 听起来很没道理,但你试试就知道了……

习得任何技能的最根本技巧,就是一句话而已:马上开始像那些已经精通这个
技能的人一样生活。

这是很重要的方法论,它会让你无视很多障碍,跨越很多障碍,甚至那些障碍对你来说就好
像完全不存在一样。心理学家告诉我们,当你不开心的时候,假装开心,做出笑脸,过一会
儿就没那么不开心了,甚至真的开心起来…… 这个原理其实可以用在很多地方,比如,某项
技能你不会,但你想会,那就从假装会了这个技能开始,然后当真去做、去学,没多久就真
的会了…… 我小时候学吉他也是这样,买来吉他其实是不会的啊,但也不知道为什么就是有
欲望坐在那里乱弹一气,就好像会了一样 —— 可真的没多一会儿就开始渐渐调整自己,让手
的拨动多少有点节奏…… 竟然比之前好听多了!

我们只不过注册了一个 Github 帐号而已,还装得不够像…… 让我们费一点周折,装得更像一
点罢。

我从来都是这样的,装就装得真像 —— 这样后来就真的是了。你看,我有个网站:
xiaolai.github.io,你不妨打开看一看。接下来,你就跟着我一步一步地给自己搭建一个跟工
程师们用的一样的个人网站。

这个过程其实不太费劲的,甚至很简单,相信我。但在这个过程中你也一定会七七八八学很
多东西…… 你会感觉时间一晃就过去了 —— 因为你会在这个过程中一不小心就进入所谓的
“flow”(心流)。学习从来不是杀时间的方式,恰恰相反,学习是“时间加速器”,它会
让时间一晃而过,却又与此同时增加了时间质量与密度 —— 你不可能没有感受的!

在这个过程中,我们会熟悉起来的东西包括

命令行工具的使用
Atom 的使用
如何书写 Markdown 文档

开始罢。

1. 初步搭建  

1.1. 在 Github 上创建一个 Repo  
在浏览器中登录 Github,创建一个 Repo,名称格式为 yourname.github.io。比如,我个
人的 Github 账户用户名是 xiaolai,所以,我的这个 Repo 的名称就是
xiaolai.github.io。这个特殊的 Repo 有个审核过程,所以,创建完了之后,直接干下
一步去……

1.2. 确认本地已经安装好 git 和 npm  
在 Terminal 里(或者 iTerm 里)输入以下命令确认 git 与 npm 已经安装妥当(第一章完成
了的话,这些已经安装好了,若是没完成,请退回完成再回来重新继续……)

 git ­­version
npm ­­version

1.3. 安装 hexo  
在 Terminal 中继续输入

 npm install hexo ­g
npm install hexo­cli ­g

1.4. 创建本地工作目录  
去 Github 把你的 Repo 的 git 地址拷贝出来。

我的是 https://github.com/xiaolai/xiaolai.github.io.git
你的是 https://github.com/yourname/yourname.github.io.git (其中,
yourname 应该换乘你的 Github 用户名)。

然后在 Terminal 面板里输入

 cd ~/Public
git clone https://github.com/yourname/yourname.github.io.git

1.5. 初始化你的本地站点  
 hexo init yourname.github.io
cd yourname.github.io
npm install hexo­deployer­git ­­save
hexo generate
hexo server

这些完成之后,你就可以打开浏览器,在地址栏里输入: localhost:4000,在本地先看看
网站是什么样子了。

1.6. 部署到 Github 上

回到命令行下,输入

 atom .

Atom 就会打开 yourname.github.io 这个文件夹…… 在计算机世界里,. 是个特殊字符,
代表“所有的”(以后你会越来越了解的),所以,atom . 的意思相当于“用 Atom 这个程
序打开当前目录内的所有文件”……

在 Atom 的左侧面板中,选择 _config.yml 文件,找到 deploy 哪一部分,改成:

 deploy:
  type: git
  repo: https://github.com/yourname/yourname.github.io.git

注意,把 yourname 改成你的 Github 用户名。
现在是最后一步了,在 Terminal 里依次输入:

 hexo deploy
open yourname.github.io

1.7. 阶段性成果  
稍等一下,你就可以看到默认浏览器被打开,且已经浏览到 yourname.github.io 这个网址
了……(嗯…… 工程师们打开浏览流程的姿势都不太一样…… 对了,试试 open . 会发生什
么?)

简单吧?!

不一定很简单 —— 对新手因为上面的过程中,每一个尽管相当简单的步骤,都可能出现各种
莫名其妙的错误(比如,不小心使用了中文输入法的点字符“。”等等)…… 保持耐心,反
复来过就好。

不妨再说一遍,因为这是工程师必备的素质(其实是任何人在任何领域都应该必备的素
质):

保持耐心,反复来过,直至成功。

2. 继续折腾  
没完事儿呢…… 这才刚刚开始,你现在有了个个性化域名,有了个所有人都可通过它访问的
站点,然后就要做起码两件事儿了:

学会在本地使用 Markdown 书写文章,而后发布到网上;
把站点装扮得更好看一些。

当然,这之前,我们还要学会做更多的事情,包括很多非常细琐的东西。反正我们不着急。

2.1 给 Atom 安装一个命令行面板  
有一个 Atom Package,可以在 Atom 里调用 Terminal 面板,叫 platformio-ide-terminal
不妨装上玩玩。我是怎么想到找这个东西的呢?很简单,经常需要从 Atom 切换到 Terminal
/ iTerm …… 工程师们肯定也一样觉得麻烦,所以,估计他们已经有了解决方案…… 于是,到
Google 里搜索了一下:

terminal in Atom

果然有这种东西…… 希望你现在已经对命令行有一定了解了,没有的话,回去第一章再看看
你找到的那个 Cheatsheet 罢,边看边练。

这是学习过程中必须学会的思考模式(Mindset)和行为模式(Action Pattern):

1. 随时准备深入了解某个小领域
2. 借助地球上最强大的人工智能(Google)找到学习资源
3. 给自己一小段时间刻意练习
4. 不怕死记硬背,更要善于死记硬背,通过短时间内的大量重复,把那些别
人看起来枯燥的东西迅速变成自己“内建的技能” —— 通过刻意练习将其
熟练到“想都不用想就能用的地步”……
5. 给自己定个“最后期限”,比如一小时之内一定做到把这些命令谙熟于
心…… 绝对不能“过些天就想不起来了”,否则,那就是思考监管的“只
因为学习习惯不好造成的永久性愚蠢”。

再提醒一遍,别忘了给自己洗脑:“只搜索、只阅读英文文档”,有中文的也不能看,就是
不能看……

还有就是,每次脑子里闪出“呀,好麻烦!”这个念头的时候,就要知道自己脑子脏了,该
洗了。 无论干什么都挺麻烦的,怕麻烦的人什么都做不成,躲避麻烦的唯一正确方式就
是“不怕麻烦,逐一完成”,否则就会反复麻烦一辈子又一辈子(甚至会遗传,不耐心的父
母必然养出不耐心的孩子)。凡事道理都是一样的,我有一句口头禅:“偷懒的唯一方式就
是不偷懒……” 也还是一样的道理。

2.2 为 Atom 安装 markdown 相关 Packages  
Markdown 是程序员们最喜欢用的书写工具,是一种简化版的文字标记方式,你的
yourname.github.io 站点上的文章,就得用这种方式书写。怎么用、怎么写?Google
github markdown 就知道了,别忘了在搜索一遍 github markdown cheatsheet,嗯,这
个基本上用不着刻意练习 —— 因为它太简单,另外也因为反正你以后天天用。

点击 Preference 的左侧倒数第二项 + install,在搜索框中输入 markdown,依次安装一
下几个 Package:

markdown-scroll-sync
linter-markdown
markdown-writer
markdown-toc
markdown-pdf
markdown-preview

设置一遍 markdown-writer,你就知道应该如何设置其它的 Package 了。还是进入
Preference,在左侧选择 Packages,在右侧找到 markdown-writer,点击 Settings
按钮…… 然后在里面上下翻一翻。在 Site Engine 里,竟然直接有个 Hexo 选项…… 真
好!勾选罢!

另外,如果快捷键 ⌘b、⌘i 之类的不起作用,那么可以把以下代码拷贝粘贴到
keymap.cson 文件中(在 Preference 中点击左侧第二项 Keybindings,即可打开这个
文件),随后用 ⌘s 保存之后重新启动 Atom 即可(或者在 Command Palette 里使用
Windows: Reload 命令)。

# for markdown­writer 
".platform­darwin atom­text­editor:not([mini])": 
  "shift­cmd­K": "markdown­writer:insert­link" 
  "shift­cmd­I": "markdown­writer:insert­image" 
  "cmd­i":       "markdown­writer:toggle­italic­text" 
  "cmd­b":       "markdown­writer:toggle­bold­text" 
  "cmd­'":       "markdown­writer:toggle­code­text" 
  "cmd­k":       "markdown­writer:toggle­keystroke­text" 
  "cmd­h":       "markdown­writer:toggle­strikethrough­text" 
  'cmd­>':       "markdown­writer:toggle­blockquote" 
  'cmd­"':       "markdown­writer:toggle­codeblock­text" 
  "ctrl­alt­1":  "markdown­writer:toggle­h1" 
  "ctrl­alt­2":  "markdown­writer:toggle­h2" 
  "ctrl­alt­3":  "markdown­writer:toggle­h3" 
  "ctrl­alt­4":  "markdown­writer:toggle­h4" 
  "ctrl­alt­5":  "markdown­writer:toggle­h5" 
  "shift­cmd­O": "markdown­writer:toggle­ol" 
  "shift­cmd­U": "markdown­writer:toggle­ul" 
  "cmd­j cmd­p": "markdown­writer:jump­to­previous­heading" 
  "cmd­j cmd­n": "markdown­writer:jump­to­next­heading" 
  "cmd­j cmd­d": "markdown­writer:jump­to­reference­definition" 
  "cmd­j cmd­t": "markdown­writer:jump­to­next­table­cell" 

注意

在 Atom 里,⌘k 默认被设置成了一些双组合键的第一个,比如,你按过一次 ⌘k 之后再按
右方向键 → 的话,你当前的输入区域就会在一个新生成的右侧面板(Right Pance)上打开
一份…… 所以,你想输入这样的文字之时:

你的按键顺序是这样的(最后一个   是键盘最左上角的 esc 键盘)

k,⇧←,⌘k,

2.3 学习使用 markdown 书写文章并发布  
这次我们走另外一个路径。关掉所有程序,重新来过。用 Spotlight 打开 Terminal,输入

cd ~/Public/yourname.github.io 

输入方法是这样的:输入 cd ~/Pu 之后,就按一下 ⇥(Tab 键),应该能自动补全为cd
~/Public/,接着再输入 yourname…… 其实可能输入前两个字符的时候已经可以用 ⇥ 完
成自动补全了。补全之后,就可以直接按   (回车键)进入你的目标目录了。

然后再输入命令:

atom . 

进而用 Atom 打开当前目录中的所有文件。
在右侧的面板里展开 source 目录,进一步再展开 _posts 目录,点击 hello-world.md
文件,正文编辑器里所显示的就是你现在能在网站上看得到的 hello-world 的源文件了。

随便在那里面写任何内容,用一下你已经习得的 markdown 标记,玩玩。由于已经安装了
markdown-preview,所以在书写 Markdown 文档的时候,随时可以用 ⇧⌃m 呼出预览,甚
至可以实时更新预览。(不过,预览的时候和最终发布的时候看起来稍微不一样,自己体会
一下……)

然后就可以在 Terminal 面板中用 hexo generate生成静态 html 文件,用 hexo server本
地查看(在浏览器中用这个地址:localhost:4000),或用 hexo deploy 发布到
yourname.github.io 上去……

以后你想发表博客文章的时候,无非就是在 source 目录中创建新的 .md 文件,而后 hexo
generate,之后再 hexo deploy.

2.4 一旦发现需要重复的工作……  
—— 就要马上想办法要么 1)自动化,要么 2) 减少工作量。这是工程师的思考行动方式,在
工程师的世界里,懒惰有另外一种用处,是积极的用处:它是用来刺激寻找提高效率的手
段。普通人懒起来就什么都不干了;工程师懒起来就使劲琢磨:

“怎么做才能将来不用做或者起码少做却可以实际上干更多呢?”

注意:“实际上干更多”才是重点!

反复地敲 hexo generate、hexo server、hexo deploy 好累啊!怎么办?我们可以给
命令行里反复输入的命令编制缩写……

命令行下输入,其实就是用 Atom 打开 ~/.aliases 文件:

atom ~/.aliases 

在该文件下输入以下内容:

alias hgs="hexo g&&hexo s" 
alias hgd="hexo g&&hexo d" 
重新启动 Terminal 之后,只要输入 hgs 就是生成内容之后在 localhost:4000 里预览,
输入 hgd 就是部署到服务器上……

能这么做的原因在于之前在配置开发环境的时候输入过这么三个命令:

https://raw.githubusercontent.com/donnemartin/dev­setup/master/.bash_profile 
curl ­O https://raw.githubusercontent.com/donnemartin/dev­setup/master/.bash_prompt 
curl ­O https://raw.githubusercontent.com/donnemartin/dev­setup/master/.aliases 

.bash_profile 文件里引用了 .bash_prompt 和 .aliases,每次启动 Terminal 的时
候,它都会引用 .bash_profile 里的设置,所以,以后你就可以把所有你需要的缩写都放
到 .aliases 文件里去。

比如我这个懒蛋就用来好几个这样的缩写:

alias ­="cd ­" 
alias ~="cd ~" 
alias ..="cd .." 
alias ...="cd ../.." 
alias ....="cd ../../.." 
alias bp="atom ~/.bash_profile" 
alias bpr="source ~/.bash_profile" 

所以,我需要修改 ~/.bash_profile 文件的时候,就在 Terminal 里输入 bp,修改完了
之后,保存好,然后在 Terminal 里输入 bpr 就行了,不用为了更改生效而重启 Terminal。

任务

接下来你要做的是,以后经常写文章发表在网上 —— 衡量标准倒是有一个:

尽量只写对别人有用的文章……

毕竟这是发表在网上的基本意义之一。

在接下来的时间里,若是有空,就给自己的 Blog 换个模板;加上评论,加上搜索,加上统
计,加上…… 反正,在 Google 上随便一搜,每个任务都有很多教程 —— 自力更生好了。

等将来弄明白了 html/jade、css/less/sass/ 之类的东西之后,也可以自己不断深入定制……
现在就先在使用中把 (github flavored) Markdown 彻底熟悉了罢。
 

快速学习 HTML 和 CSS  

无论什么东西,快速了解都是有可能的,之后就要通过反复使用、反复操作获得并磨炼熟练
程度。很多人被误导,总是以为“一定要学到一定程度才算学会,才可以拿出手……” 这是
肤浅的。要尽快掌握“最少必要知识”(MAKE),然后就开始行动、开始践行…… 真正的熟
练,只能在践行之中通过试错、改进、总结、纠正等必要的环节才能获得。

1. HTML/CSS 都是了解一句话之后就可以开始写的  
HTML 是什么东西呢?一句话就够了 —— 真用不着非得读完一本书才能开始行动。

HTML 是用来在纯文本内添加各种标记(用尖括号括起来的标记,叫做“TAG”),以便让
浏览器能以正确的格式显示那些内容的“语言”。

所以,假设你在 HTML 里写的是这样的:

<p> This is the first paragraph.</p> 
<p> This is the second paragraph.</p> 
<p> This is a <strong>word</strong> marked as strong.</p> 
<p> This is a <em>word</em> marked as emphasized.</p> 

然后浏览器会将其显示成这样子:

This is the first paragraph. This is the second paragraph. This is a word
marked as strong. This is a word marked as emphasized.

格式(Format),通常很简陋,只包括字体大小、字体加重、倾斜、删除线、下划线等等;
另外一个词叫样式(Style),除了最基本的格式之外,还可以包括更多的细节,行间距、字
间距、背景色等等……

那么,CSS 是什么呢?
CSS 就是用来批量指定标签内容样式的方法。

你只要在 HTML 文件里加上这么一句:

<style>strong {color: blue;}</style> 

那么整个文档里的所有被标记为“加重”的文字(<strong>)就都显示为蓝色(blue)
了…… 当然你还可以为所有加重的文字加上更多的样式:

<style> 
  strong { 
    font­family: "Courier New"; 
    font­size: 20px; 
    border: yellow solid 1px; 
    padding: 3px; 
    margin: 5px; 
  } 
</style> 

其实很直观的,不是吗?

2. 快速体验  
打开 Safari,输入以下网址(将来还是推荐使用 Firefox 或者 Chrome 的,只不过,现在先
用 Safari 玩玩……):

http://www.catb.org/esr/faqs/smart-questions.html

这是篇工程师必须熟读、牢记的文章 —— 事实上,你读过之后就知道了,无论是谁,不管哪
一个行业,其实都应该深入了解这篇文章的。

网页打开之后,打开之后,你会看到一个相对格式、样式都极端朴素的文档。

基本上,任意一个浏览器,无论是 Safari, 还是 Chrome, Firefox, Opera, 它们的一些基础快
捷键都是一样的,比如,都可以用 ⌥-⌘-I 呼出一个“Developer Tools Pane”…… 即便在
Atom 里,也一样可以用这个快捷键 —— 因为 Atom 本身也是个基于 Chromium 的浏览
器。
如果你没有安装 Safari 以外的浏览器,建议你把几个常用的浏览器全都安装好,反正以后都
用得着……

brew cask install chrome 
brew cask install firefox 
brew cask install opera 

以下我们先用 Safari 体验一下 HTML 和 CSS 的基本功能…… 请注意:在这个过程中不要刷
新浏览器,否则你刚刚做过的改动就都不见了…… 当然,若是你想重新来过,就刷新一下浏
览器好了。

在 Safari 上按下快捷键 ⌥-⌘-I 之后,底部会出现一个工具台,工具台左侧,是当前文档的
HTML 源码,右侧是样式编辑器…… 上面还有一些标签,等你以后再熟悉。

工具台最低部的左侧,> 标记右边,其实是个命令行输入框,在那里可以输入一些 javascript
命令,比如,你可以输入以下代码试试:

alert('hello'); 

在工具台的左侧,你可以看到 HTML 源码,随时可以点击鼠标右键,再点击 Edit as
Html 之后做任意的修改 —— 别怕,你玩不坏它的。随便搞,胡搞瞎搞才好玩……

在工具台最低部的右侧,有一个 + —— 那是个按钮…… 边上还有个输入框,在里面输入
body,于是,样式编辑器里面就聚焦于 body 这个元素了;这时候,再点一下那个 + 按
钮……

你会看到多了一个 body 的字样,在这一行的下方输入:

font­family: 'Courier New'; 
font­size: large; 
max­width: 1024px; 
margin: auto 100px; 
background­color: #eee; 

当然,冒号后面的值,你都可以(也应该)随便写写多试试…… 比如,max-width:
1024px; 你可以试试 max-width: 768px; …… 在输入的过程中,你会发现 Safari 提供了列
表选择功能和自动补全功能 —— 非常方便 —— 甚至,行末的分号是不用输入的……
好玩吧?你刚刚是重新定义了 body 这个元素里的内容的显示样式。

文章开头,有一个 Revision History 部分,里面是作者多次修改更新过的记录。在那个暗色
的边框上点鼠标右键,选择 Inspect Element ……

你可以看到,这里面的所有内容都被包在一个

的区块里。在右下角的输入框里输入 revhistory,你会看到这个 class 并没有被定义样
式。在输入框里已经输入了 revhistory 的情况下,再点一下那个 + 按钮…… 输入:

display: none; 

…… 那一整块内容“不见了”!是呀,你刚刚要求的麽!

当我们用浏览器打开一个网页的时候,看到的那些内容是浏览器将从服务器那里获得的
HTML、CSS、JAVASCRIPT 等文件的内容,组合起来解析之后,“渲染”(Render)出来
的…… 由于这个原理,Firefox 有一个插件,Greasemonkey,可以编制一些 JAVASCRIPT
脚本,用来改变任意网站的显示样式…… 在以下网站上,可以找到很多别人写好的用户脚
本:

https://openuserjs.org/
https://greasyfork.org/en/scripts
http://userscripts-mirror.org/

注意:去看看体验一下就好,千万别玩过头了…… 给自己定个闹钟,15 分钟之后要回来干正
事儿! 很多人都是这样,一不小心就被各种东西分散了注意力。

3. 系统了解 HTML 和 CSS  
行了!尝鲜之后,就需要快速系统了解 HTML 和 CSS 了。先去这个地方:

**HTML** http://www.w3schools.com/html/default.asp
**CSS** http://www.w3schools.com/css/default.asp

天了个噜,这个全球访问量最大的网页开发教程网站竟然是用微软的 asp 写的…… 可这背后
有个特别重要的道理:
用的技术是否时髦或者是否过时,在另外一个因素面前完全没有意义:做的事
情有没有价值。w3schools 做的事情明显价值很大…… 所以说,在很多的时
候,“做对的事情”(do right things),远“比把事情做对”(do things
right)重要得多…… 再进一步,技术是用来实现思想的…… 所以,思想更重
要。只钻研技术,没有思想,其实很可怜的…… 当然,有丰富的思想却没有技
术,那更可怜。

把 w3schools 上的这两个教程反复看个两三遍,对不止一遍 —— 当然,光看完不够,要每
个要素都要逐一实验过。别觉得自己记不住,记不住的原因只有一个,就是用的次数不够多
而已。

4. 读不止一个教程  
一般来说,Documentation,只要看 Official Documentation 一个就够了,把一个 OD 读
透就行。很多的时候,所谓的读透,只不过是把结构弄清楚,以便将来随便查询…… 真的不
难。

可若是读教程,那有个好建议就是:

读一个以上的教程。同一个话题的书,可以读很多本 —— 这绝对是最好的学习
习惯之一。

除了 w3schools 之外,有关 HTML/CSS 的教程,其实很多,你不妨搜索一下:

Google Web Fundamentals
MDN Learning web Developement

也一定有所收获。

5. 先学范儿,某种意义上也是对的  
第一遍读完 w3schools 上的 HTML Tutorial 之后,要看的是这个:

HTML(5) Style Guide and Coding Conventions
凡事儿都需要做得有模有样…… 我一直认为所谓真正的专家,其实是那些真正用专家的标准
要求自己的人,而不一定是那些被别人称为专家的人。

不管学什么,先认真观察那些专家的“范儿”,是有益处的,虽然有很多细节目前做不到,
但目标就是将来要做到,所以要提前观察,提前模仿,提前准备…… 以后学各种语言的时
候,都要这样,先去看看 Style Guide 和 Coding Conventions……

##6. 学会就能用一辈子:总结、整理、提炼重点

HTML5 的学习难度,确实比之前的 HTML3 高了一些,因为标签的数量明显增加了很多,并
且还有各种浏览器不完全兼容的情况需要注意……

然而,最终,有些人跨越不过去的原因很简单:

基本的总结概括能力差而导致的任务量过大……

上学的时候,学习能力强的同学,经常做各种总结整理,并分享出来…… 殊不知,那些喜欢
等别人整理好了再用的人,常常因为缺失了自己动脑总结整理的过程而使得这方面能力逐步
下降直至退化为零…… 观察一下生活吧,学习能力差的人,其实说穿了都有统一的局限:

1. 总结整理能力差
2. 提炼重点能力差

其中的第二条,基本上与第一条是互为因果的关系。

所以,总结、整理、提炼重点,这类事情一定要自己动手做。别嫌麻烦,这种事情不是麻
烦,是修炼。怕麻烦的人,就是这样在每一个重要的环节上都吃亏却觉得自己占了便宜,乃
至于有一天发现自己吃了亏,却完全不知道哪儿吃了亏…… 而上一章中提到的 “Atom 的
Snippets 最好自己动手写” 其实也是一样的道理。

在 w3schools 上把 HTML Tutorial 反复看两三遍的过程中,要不断地想:

我有什么办法把这些 Tag 分类,以便在脑子里形成一个清晰的框架呢?重点究
竟是什么呢?

分类的一个基本技巧,虽然简单,很多人却并不知道:
总是有一些元素最终无法精确分类…… 于是只好放到“其它”这么个无奈而必
须的类别中去。

说实话,“其它”这个无奈的类别,也是很多人总结整理的功夫总也练不成的主要原因,因
为他们不知道那个“其它”是最终对谁来说都是因无奈而必要的类别,所以总是觉得自己做
得不够好,或者干脆不会做…… 于是因为只好等别人的所以自己的能力不断退化;又由于他
们确实不知道这个事实,所以,当他们在别人的分类中看到“其它”类别的时候,竟然反应
不过来“那是最终对谁来说都是因无奈而必要的类别”…… 听起来有点绕,但仔细琢磨一下
吧,看看是不是这么回事儿?

如果自己没把握,不妨还是“故技重演”,去网上搜索一下 HTML5 CheatSheet,看看别
人是怎么总结、怎么整理、如何分类、如何提炼重点的…… 然后自己再试试。

甚至为了锻炼自己的总结整理、提炼重点的能力,可以尝试很多种分类方法,比如,随便举
个分类方法的例子:

隐含的:像 <head>、<link>、<meta> 标签所标记的内容,是不会在浏览
器上直接显示的……
显示的:大多数 Tag 都是标记内容格式的,所以当然是属于“显示的”……

“显示的标签中”,也可以继续分类:

事关布局的(比如 <header>、<section>、<aside>、<footer> 等
等)
事关内容的(比如 <p>、<table>、<blockquote> 等等)
事关提交的(比如 <form>、<input> 等等)

这种看起来耗时费力的事情,都不要偷懒不去做,因为这是一种虽然简单,但必然有积累效
应的能力获取,以后你的总结整理能力会越来越强的,然后基本上最终就是遇到这种情
况,“随手一做”就比别人弄得好 —— 当然,显然会学得更快、应用得更好…… 就好像你真
的像他们说的那样“更聪明似的”…… 说实话,最终也确实是的。

可这么简单的东西居然是很大的窍门,那些笨蛋们怎么可能相信呢?

总结  
HTML 和 CSS 其实都不难,但以后你会知道,真的要足够深入,确实还是挺难的 —— 可之
所以难,只不过是因为深入了解需要时间,而大多数人总是舍不得花自己的时间在正地方而
已,他们一方面舍不得自己的时间花在正地儿,却又在另一方面把大量的时间浪费在自己都
不知道是哪儿的地方 —— 说来也怪。

HTML 和 CSS 肯定是未来你一定会反复回来研究的东西。到了 2016 年,有一个趋势越来越
明显:

未来一切都是 Web Application……

现在,无论是网站,还是 APP,还是 PC/Mac 上程序,都可以用 HTML 写了(Github 为了
打造一个 Atom 编辑器,甚至之前先写了一个跨平台程序开发框架:Electron…… 早晚你也
要学会的)。

另外,还有一个刻意练习 —— 就是自己动手写 HTML 和 CSS 的

Atom Snippets…… 对自己认真一点的话,就边练边写罢。

顺带给大家看个在学习上“洁身自好”的实例:

http://ricostacruz.com/cheatsheets/

看看人家这些年写了多少个 Cheatsheets 给自己……

…… 另外,细心如我 —— 我特意请王渊源同学把这篇长文朗读了一遍,给大家练听力和口语
用,接近 70 分钟的音频,请认真收听、跟读、朗读很多遍。这篇文章会洁净你的心灵,给你
一双慧眼,分辨出身边哪些是自力更生的人,哪些是伸手党,这对你的生活品质提高有很大
的帮助,因为一切的品质,都来自于选择。

https://pan.baidu.com/s/1i4QUp1r

工程师的时光穿梭机 —— git  
工程师们整天与各种文件打交道,而且处理的都还是那种“弄错了哪怕一个字符都不行的文
件”。

比如,文件弄丢了就很可怕,所以在过去存储不稳定的时代,“备份”一直是工程师们最小
心也最头疼的工作内容之一,因为存储不稳定意味着说,有些文件“突然之间就读不出来
了”…… 这太可怕了。

更可怕的是另外一种“坏掉的文件” —— 就是那种被自己搞乱了的文件,一会儿改改这里,
一会儿改改那里,到最后出了问题之后完全搞不清楚究竟是哪儿出了问题……

经过多年的努力,工程师们终于给自己造出了非常好用的“时空穿梭机” —— git,一种所
谓的“版本管理工具”。也就是说,有了这种工具之后,工程师们可以随时穿越到某个时间
点上,查看当时的文件状态…… 或者,就像下棋的时候可以“悔棋”一样,把刚刚做出的改
动撤销掉…… 等等。

学会了之后呢,git 就显得特别简单 —— 也能深深体会到这东西是生命中不可或缺的工具
(其中的工作流及其背后的方法论,甚至可以应用到自己的生活里)。可最初的学习很难,
因为

1. 这几乎是个没有之前类似经验对应的全新知识
2. 大量的工作对初学者来说实际上没有视觉反馈

所以,在这里,我没准备上来就讲解 git 是什么,它的原理是什么,它的命令都有哪些,使
用的时候需要注意什么…… 事实上,这种教程几乎遍地都是 —— 因为它太重要了么,所以网
上随便一搜,就有一大堆经典教程(当然,教程那么多,并没有降低初学者的难度)……

以下就是一个实际工作过程,你要做的就是“一步一步跟下来”,做完之后,还要再重复跟
很多很多次…… 其中涉及到的 git 命令,就算不理解也没关系,反正要让你的手指头熟悉他
们,反复敲 —— 就好像我们小时候抄课文一样(那时候我们也其实常常并不真的理解课文内
容)—— 直到我们居然可以做到“死记硬背”为止。

这些操作的目标是把一本免费公开在网上的编程书,Think Python 2ed —— 非常经典的一
本书,很多重要的基础概念,可以说它讲的是最好的 —— 把这本书的样式重新组织一下,以
便阅读的时候“赏心悦目”;下图左边是它原本的显示样式,右边是重新设计过后的显示样
式:
这算是“热身运动”,这个热身运动做完之后,你再去读读网上的那些经典教程,就会发
现,嗯,还真的不是很难……

在这个过程中,很多的命令,你完全不知道怎么回事儿 —— 这并不重要,你就照做就好(而
且刚刚说过,还要照做很多很多遍)。甚至,在这篇教程里,你要用的编辑器不是之前你费
劲熟悉过的 Atom,而是 Sublimetext,这即意味着说,你可能还要事先把玩一下这个新的
编辑器。再比如,你可能中间要用到“正则表达式”(事实上,你都不知道那些表达式在哪
里),所以,在 Find/Replace 的过程中,也许会因为你并没有按下那个小按钮而得不到正确
的结果……

反正是够折腾的,但,大家都是这样折腾过来的,所以,你其实也没什么可烦恼的。

等你把这个教程折腾完了,顺带抽空也仔细读一下 Think Python,用这本书,把一些基础
的编程概念谙熟于心:

变量
值(整数、分数、字符串、布林值)
运算符(优先级)
控制流(分支、循环)
数组
函数
保留关键字

这点东西,是所有编程语言的核心,是你未来可以很快地学会任何一门编程语言的基础。

具体的实操过程我放在 github 上了:

https://github.com/xiaolai/git-basics-tutorial

你反复折腾若干遍之后,可以直接读这个教程了:

Pro Git book, by Scott Chacon and Ben Straub

试试看罢。

随学随用实例:Stylish —— 浏览器插  

其实你已经学了不少东西了…… Atom 编辑器、HTML、CSS、git…… 学到的东西得用起来,
不然不划算,是不是?

先给浏览器安装一个插件:Stylish,它支持各种浏览器,Safari, Chrome, Firefox 等等。

用它来做什么呢?它可以让你“粗暴地”定制你所浏览的网站的样式…… 比如,这些天我在
翻 vuejs —— 一个特别有趣的前端框架;可问题在于,它的页面字体设置得太小(尤其是在
iMac 的大屏幕上看的时候),乃至于读起来很费劲…… 那怎么办?用 Stylish 呗。

以下示例中,我是用的是 Google Chrome,其它的浏览器可能有细节上的不
同……

安装 Stylish 之后,浏览器上地址栏边上应该有个小按钮:
打开需要定制的网页之后,点那个按钮,可以开始定制此处的样式:

1. 在左侧顶部的输入框里给设定的样式随便取个名字: Vue_Readable;

2. 在其下面勾选Enabled;

3. 右侧底部,“Applies to” 添加了两条:
URLs on the domain: vuejs.org
URLs on the domain: vuejs.org.cn

4. 然后在代码框里输入以下代码即可:

body { 
  font­size: 20px; 
  font­family: 'Open Sans'; 

当然你还可以定制其它的部分。粗暴的方式就是,不管什么元素,发现改了不管用的话就加
上 !important……

我打赌你一定会忍不住不停地给你常去的网站写 Stylish 定制 CSS…… 别太上瘾
了,别浪费太多时间。

动动脑子,你会发现你甚至可以修改 Stylish 自身的编辑页面 —— 比如,我还是同样嫌它字
体太小,代码输入区域显示的行数太少……

1. 在浏览器显示 Stylish 编辑器的时候,再点击 Stylish 按钮,

2. 在左侧顶部的输入框里给设定的样式随便取个名字,比如:Stylish;

3. 在其下面勾选Enabled;

4. 右侧底部,“Applies to” 添加一条:
URLs matching the regexp: chrome-
extension.*edit\.html.*

5. 然后在代码框里输入以下代码即可:

.CodeMirror { 
  font­family: 'Courier New'; 
  font­size: 18px; 
  height: 600px !important; 

等等,“你怎么知道要改的是 .CodeMirror 元素?” —— 之前的教程里用过的啊, 用组合
键 ⌥⌘I 能在浏览器中呼出 Inspector, 自己找呗……

然后,你的 Stylish 编辑页面大抵上就是这样的了:
总之就是,学会哪怕一点点东西,你就可以做很多你自己以前完全没办法做的事情,若是不
停地学呢?

人们各自就是活在同一个世界的不同版本之中,各自相距天壤。

哪怕是昨天的你和现在的你,也可能如此。

另外,这才折腾几下啊?这才学了多点东西啊?可你就是能明显地、深刻滴感觉到一个事
实:

你和那些没折腾过的人在这方面完全无法沟通了…… 因为你们已经不在一个频
道上了。

更残酷一点的说法是:

今天的你 和 一个月前的你 若是两个人的话,那么你们俩就是完全无法沟通
的……

你明白学习的作用了吧?学习的好处和不学习的坏处,实在是太明显太残酷了。按照脑科学
家们的说法,经过接二连三的折腾,你的大脑结构都已经发生了不可逆的变化……
哦,对了,你已经第二次看到正则表达式了(chrome-extension.*edit\.html.*),估
计挺好奇的罢?自己找教程去看,Regular Expression…… 先撞撞墙,也不是什么坏事
儿。

正则表达式极简“入门”  

正则表达式(Regular Expression)这个东西,之所以感觉难学,是因为几乎所有关于它的
教程都很不友好,不是对初学者不友好,是对所有人不友好 —— 也许是因为绝大多数人即便
是掌握了这个东西,也觉得实在它没办法对初学者友好罢。

瞬间提高自学能力的诀窍在于两个字:

别怕。

如果非要用四个字的话,就是:

啥都别怕。

不就是学个东西嘛,学不会也不会死人的,学得会是早晚的事情。

正则表达式,其实你之前已经用过,虽然当时你可能完全不明白自己再做什么。

通俗点讲,

正则表达式是用来匹配、捕获特定字符串的工具;之后,我们还可以对匹配
到、捕获到的对象进行处理,比如替换。

OK,就这样了罢。这里请注意三个概念:

匹配(Match)
捕获(Capture)
替换(Replace)
这两个概念掌握了,可以开始运用了,就算是入门了。入门之后就好办了,边用边学,边犯
错边改进,最终达到精通的地步 —— 无论学什么不都是这样吗?

想象一下,我们有这么一串电话号码:

07700 900166 07700 900202 07700 900911 07700 900284 07700
900847 07700 900009 07700 900754 07700 900396 07700 900248
07700 900408 07700 900724 07700 900773

现在我们想把它们变成这样的格式显示:

(077)0090-0166 (077)0090-0202 (077)0090-0911 (077)0090-0284
(077)0090-0847 (077)0090-0009 (077)0090-0754 (077)0090-0396
(077)0090-0248 (077)0090-0408 (077)0090-0724 (077)0090-0773

那我们要怎么做才行呢?显然,手动一行一行地弄很麻烦啊!每行都要添加括号,删除空
格,在加上减号作为四位分隔符……

在支持正则表达式的编辑器里(Atom 这方面真的很差,Sublimetext 真的强太多了),搜
索(\d\d\d)(\d\d) (\d\d)(\d\d\d\d),替换为($1)$2$3-$4…… 好神奇,一下子就
搞定了!

仔细看看每一个字符:\d 指的的任意数字,所以,07700 900773,其实就可以用
\d\d\d\d\d \d\d\d\d\d\d 搜索到(空格前面五位数字,空格后面六位数字)。

现在我们想要让它被替换为 (077)0090-0773 这样的格式…… 那么:

我们要想办法“捕获”前三位,然后在其前后加上括号;
捕获接下来的两位数字,以及空格之后的两位数字,要把他们拼起来(即,
相当于把空格去掉);
捕获最后四位数字,然后在此之前加上一个减号……

所以,我们在搜索的时候加上了括号() —— 括号就是用来捕获的……

(\d\d\d)(\d\d) (\d\d)(\d\d\d\d)

翻译成自然语言:
1. 用 \d\d\d\d\d \d\d\d\d\d\d 匹配这些电话号码,以便我们能在文档
中搜索到所有能够匹配这个正则表达式的字符串;
2. 为了后面能够处理(即,替换),我们分别捕获了四段字符串: 
(\d\d\d)(\d\d) (\d\d)(\d\d\d\d);
3. 然后,我们用 $1 … $4 来表示我们捕获到的字符串,然后用我们想要的拼
接方式去替换匹配到的字符串:($1)$2$3-$4……

差不多了,这就是“入门”,后面你要接着研究:

各种为了精确匹配所需要的“符号”;
匹配同一个类型的字符串可能有很多种方法;
避免错误匹配其实并不容易……

而后你就反应过来了,上面用的正则表达式,实在是太愚蠢了!那你就想办法用更聪明的
呗…… 谁也拦不住你。

还是那句话:反复使用,反复试错,没多久你就真的精通了。

至于深入一步的教程么,Google 喽……

最简单直接的 Javascript 开发环境  

无论学习哪一种编程语言,“搭建开发环境”都是第一步 —— 通常都还比较繁琐。学习
Javascript 就稍微不大一样:

只要你的电脑上有浏览器,你就已经有了一个最简的开发环境。

在这里,我们拿 Google Chrome 作为示例(微软的 IE 就算了罢)。

1. 打开 Google Chrome;
2. 用快捷键 Option + Command + i 呼出 Developer’s Panel;
3. 选择 Source 标签;
4. 在左侧边栏选择 Snippets 标签;
5. 创建 .js 文件,比如,test.js;
6. 在中间的代码书写区域编写代码;
7. 使用 Command + Enter 执行代码……

很简单吧?

有了这样的运行环境,就可以开始学习了……

学什么?怎么学?先从最经典的教材开始呗,

1. 硬着头皮一章一章地读完,
2. 每个代码示例都要自己动手敲,直到获得正确结果;
3. 读不懂的地方先放下,接着读下去;
4. 反复回头重新阅读读不懂的地方,实在搞不定再放在一边;
5. 把这本书反复阅读很多遍……
6. 不断整理其中的重要概念,以及重要概念之间的必要联系……

教材的地址在这里:

http://eloquentjavascript.net/
当然,更为完整的开发环境,你早就搭建过,不是吗?

如何写个好教程(附送一个好教程)  

前些天为了即将要发布的纸牌屋第五季做准备,给自己搭了个 Linode 服务器,在 Linode 上
翻了翻,之前写的 StackScript 已经是六七年前发布的了…… 时间真快。

弄好了之后,朋友们听说了都想要…… 我重新写个彻头彻尾的小白也能弄明白的教程好了。
Linode 的节点,现在都改成“按需付费了”,每小时美元七厘五或者每月五美元,每月限 1
TB 的流量,基本都足够两个家庭用的了。

顺带说,linode.com 推荐注册有返点的,我的推荐码是:

90e830ad0f9cccf433cbae2b24228d6c544a5b18

1. 服务器端  
首先当然是去 linode.com 注册账户绑定信用卡了……

而后按步骤来就是了:

添加一个新的 linode (就是一个远程虚拟机)……
选择第一个配置(其实就是最便宜的那个)…… 然后注意,在底部的下拉菜单,最好选择一
个美国区域的节点(前四个都是)—— 因为你看 Netflix 需要美国区 IP 地址。

创建完成后,上图右侧会告诉你你的虚拟机 IP 地址,点击左侧的链接……
进入你的虚拟机管理页面(Dashboard)之后,点击“Rebuild” 链接……

不用填这个表单,而是点击右上角的那个“Deploying using StackScripts”链接……

在随后的页面里,搜索“xiaolai”……
…… 就能找到我已经写好的 StackScript,点击那个链接!
然后就是填写若干个字符串(都是各种密码),其实可以随便使用简单密码,反正你也不公
开这个服务器地址…… 填好之后,按“Rebuild” 按钮。
你会返回虚拟机管理页面(Dashboard)管理页面,点击那个 “Boot” 按钮,就是启动你
的虚拟机……

在虚拟机管理页面(Dashboard)管理页面上方的标签里,选择“Remote Access”……
在页面底部,有个链接,“Launch Lish Console”,点它,会跳出一个小的浏览器窗口,你
可以看到服务器在“紧张”地安装这个安装那个……
等一会儿,看到如下页面的时候,就是安装完毕了:

其实你没啥必要再登录这个服务器的,直接开始用以上信息把这个 linode 服务器当作自己
的“微屁恩”就可以了……
2. 客户端  
服务器端的设置,网上有很多很多教程,随便搜索一下 “L2TP” 或者 “Shadowsocks”
就能找到很多详细的教程,依葫芦画瓢就好了。

3. 电视端  
到最后,发现小米电视还真的不错,可以很方便地使用小米电视的遥控器 APP 为它安装各种
应用,包括影梭,Netflix,Youtube 之类的东西。

4. 路由器端  
路由器端最好不要折腾了,因为最终会折腾死的 —— 局域网内有很多设备,弄不好会在各自
的设置上产生奇怪的冲突,却又难以排查。各个设备设置各自的就好了。

另,有个朋友推荐了一个 APP,Cinema Box,试了一下,也是个神器。

说来惭愧,前两天其实发了个简短的“教程”,后来我自己删了,不是因为有人投诉我,而
是因为我自己写错了一些内容,导致人们按那个教程做,服务器会报错…… 也就是说,我写
了个“失败的教程”。

如何写一个好的教程呢?说来简单,只需要满足以下一些条件:

1. 对小白有用
2. 详细清楚(甚至不惜啰嗦)
3. 实证有效(微信这种发出去就不能改的机制真是有一些副作用啊!)
4. 最好图文并茂
5. 偶尔夹杂一些其他干货……

另外, http://lifehacker.com 上就有很多好教程,都是可以当作“如何写一个好教程”的范
本……
使用 Go 语言打造区块链(一)  

作者:Ivan Kuznetsov
中文翻译:李笑来
原文链接:https://jeiwan.cc/posts/building-blockchain-in-go-part-1/

第一部分:基础原型  

简介  
区块链是二十一世纪最具革命性的技术之一,它正在不断成熟,它的诸多潜力正在逐步实现
中。本质上来看,区块链只不过是一个分布式的数据库。之所以区块链独特,是因为它并不
是一个私有数据库,而是一个公开的数据库,即,每一个使用它的人拥有这个数据库的全部
或者至少一部分。任何一个新的数据记录,只能在多数数据库持有者(维护者)的多数同意
之后被加入数据库。正因如此,区块链使得加密货币以及智能合约成为可能。

在这个系列文章中,我们将打造一个简化版本的加密货币,它将基于一个简化版本的区块链
实现。

区块(Block)  
让我们先从区块开始。在区块链里,价值信息存储在区块之中。比如,比特币的区块存储交
易记录,而交易记录是任何加密货币的核心。除此之外,区块里还包含有技术信息,比如它
的版本号,当前的时间戳,以及上一个区块的哈希(Hash)。

在这篇文章中,我们所实现的并不是像比特币那样完整的区块链,而是一个简化版本的区块
链,它只含有最基本的核心信息。差不多是这样:
type Block struct { 
  Timestamp   int64 
  Data      []byte 
  PrevBlockHash []byte 
  Hash      []byte 

在这里,Timestamp是当前的时间戳(即,区块被创建的时间),Data是区块中包含的价值
信息,PrevBlockHash 存储的是上一个区块的哈希,而Hash 保存的是当前区块的哈希。在
比特币的标配中,Timestamp、PrevBlockHash、Hash是区块的头部数据(Block
headers),构成一个单独的数据结构;而交易记录(Transactions,在我们这个版本中
就是 Data),是另外一个单独的数据结构。而我们在这里为了简化,把数据结构混在了一
起。

那我们如何计算哈希呢?计算哈希的方式是区块链的重要特征之一,也正是这个特性使得区
块链如此安全。关键在于,计算哈希是一个计算起来很困难的工作,它需要时间,哪怕是在
很快的计算机上(这就是为什么人们要买比 CPU 计算能力更强悍 GPU 甚至专门的 ASIC 芯
片做矿机的 原因)。这是故意如此设计的,这么做的结果是,往区块链(数据库)里添加新
的区块(数据)有一定的困难,以此保证一旦新的数据被加入,往后很难篡改。以后的文章
里会进一步讨论并实现这个机制。

现在呢,我们只需要罢区块里的各个字段关联起来,并在此基础上计算出一个 SHA-256 哈
希。让我们调用一下 SetHash这个方法:

func (b *Block) SetHash() { 
  timestamp := []byte(strconv.FormatInt(b.Timestamp, 10)) 
  headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{}) 
  hash := sha256.Sum256(headers) 
 
  b.Hash = hash[:] 

接下来,依据 Golang 的常用方式,我们将实现一个函数,以便更简单地创建区块:
func NewBlock(data string, prevBlockHash []byte) *Block { 
  block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}} 
  block.SetHash() 
  return block 

就这么简单。

区块链(Blockchain)  
现在,让我们来实现区块链。本质上来看,区块链只不过是一个特定结构的数据库,它是一
个有序的,反向链接的列表(back-linked list)。这就意味着说,区块是按照插入的顺序排
列的,每个区块都链接到上一个区块。这样的结构,使得使用者可以很快地在区块链中获得
最新的区块,也可以很有效率地通过区块的哈希获得某个区块。

在 Golang 中,这种结构可以用数组(Array)与数图(Map) 实现:数组用来维护有序哈
希(在 Go 语言中,数组是有序的);数图(Map) 用来维护 hash → block 对。不过,
在我们的区块链原型中,我们只需要数组就可以了,因为我们暂时不需要通过哈希获取区
块。

type Blockchain struct { 
  blocks []*Block 

这就是我们的第一个区块链!我从来没想到竟然会这么简单!

现在,我们要想办法往区块链里添加区块了:

func (bc *Blockchain) AddBlock(data string) { 
  prevBlock := bc.blocks[len(bc.blocks)­1] 
  newBlock := NewBlock(data, prevBlock.Hash) 
  bc.blocks = append(bc.blocks, newBlock) 

这就完事儿了?或者……?
为了添加新的区块,我们需要一个已经存在的区块,可现在我们的区块链里面没有任何区
块!于是,在任何区块链中,应该至少有一个区块,这第一个区块,被称为“创始
块”(Genesis Block)。来,让我们实现一个方法去创建这个“创始块”:

func NewGenesisBlock() *Block { 
  return NewBlock("Genesis Block", []byte{}) 

现在我们就可以创建一个函数,用来创建一个已含有“创始块”的区块链了:

func NewBlockchain() *Blockchain { 
  return &Blockchain{[]*Block{NewGenesisBlock()}} 

让我们来看看这区块链是否能用?

func main() { 
  bc := NewBlockchain() 
 
  bc.AddBlock("Send 1 BTC to Ivan") 
  bc.AddBlock("Send 2 more BTC to Ivan") 
 
  for _, block := range bc.blocks { 
    fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash) 
    fmt.Printf("Data: %s\n", block.Data) 
    fmt.Printf("Hash: %x\n", block.Hash) 
    fmt.Println() 
  } 

输出结果是:
Prev. hash: 
Data: Genesis Block 
Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168 
 
Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168 
Data: Send 1 BTC to Ivan 
Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1 
 
Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1 
Data: Send 2 more BTC to Ivan 
Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1 

(竟然)完工!

结论  
我们创建了一个极简的区块链原型:它只不过是一个由区块构成的数组,每个区快链接指向
上一个区块。当然,真正的区块链远比这个复杂的多。在我们的区块链里,添加一个新区块
非常快,非常容易;但是在真正的区块链中添加一个新的区块需要更多的工作:在获得添加
区块的允许之前要做很繁重的计算才行(这个过程被称为工“作证明机制”,即,“Proof-
of-Work”,POW)。并且,区块链是一个没有主权的分布式的数据库。因此,任何一个新
的区块在被加入之前,必须经过网络中其它参与者的确认与允许(这个机制被称为“共识机
制”,“Consensus”)…… 还有,我们的区块链里,还没有任何交易记录呢!

未来的文章里,我们将进一步实现这些特性。

链接:

1. Full source codes: 
https://github.com/Jeiwan/blockchain_go/tree/part_1
2. Block hashing algorithm: 
https://en.bitcoin.it/wiki/Block_hashing_algorithm

You might also like