Everybody Can be Engineer

人人都是工程师

李笑来《人人都是工程师》前言

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

程序设计也许是目前地球上最容易变现、最被高估、可事实上却实际上并不难以获得的技能。程序设计的学习难度被有意无意地过分高估了。

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

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

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

HTML, CSS, JAVASCRIPT
PUG, LESS, COFFEESCRIPT
MONGODB, RETHINKDB
NODEJS, EXPRESSJS
REACT, VUE, ANGULAR
RELUX
ELECTRON
TDD…
反正没有什么是不能学的……

学习是一种生活方式,是少数人的生活方式
生活方式决定了生活质量,这是最基本的逻辑。

既然学习是一种他们已经选择了的生活方式,所谓的“终生学习”只是必然的结果
每天进步一点点地活着,没有最好,只有更好,不需要成功,只需要不断成长。

自学其实是一种社交活动

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

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

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

一切的学习起初都基于模仿,一切的模仿,都源自于看到真人的行为 —— 哪怕是在电影里看到,虽然其实只不过是影相而已,并非真人,但毕竟是真人的影相。

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

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

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

刻意练习是必须自己完成的核心

重复才能练就技艺。
刻意练习,必须自己完成。
即便是在进取型人格占大多数的社交圈里,一切的改变也都来自于自己的刻意练习,用时间浇灌的践行,才能引发真正的改变与进步。

所谓的智商,其实是一个人最终积累出来的知识经验的总和 —— 若是这样理解的话,就不难理解为什么到最后人与人之间的聪明程度相差天壤。因为有一些人天天往前走啊,另外一些人早就不动了啊!
所谓的刻意练习,说来也很简单,就是把那些现在做起来生疏的技能通过反复使用最终做到不假思索就可以做完且做好 —— 这与智商高低全无关系。

一切看起来复杂的技艺,其实都并不难,很多人最终学不会,其实只是练不成,就是说,他们并不是不理解那道理、那原理;可理解本身并无太大用处,因为真正需要做的是通过大量的重复与实践,把那道理、那原理转化为大脑皮层表面的沟回…… 缺少了刻意训练的环节,学什么都是白搭。

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

概念与方法论:最少必要知识

什么是“最少必要知识”呢?所谓“最少必要知识”,指的是为了能够实践某项技能,最起码要学会的那一点知识。

MAKE —— Minimal Actionable Knoweldge & Experience。注意这里的一个词:Actionable,“可行动的/可执行的”。
比如,开车的最少必要知识是什么呢?
学会如何启动
学会如何制动
再加上一个字:慢

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

你得习得几个程序员都应该有的起步方法论。

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

只使用 Google

不论你遇到什么困难,都可以去问 Google,这是目前地球上最大的“人工智能”项目。
一切能问 Google 的,都不要去问人。

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

  • tutorial
  • example
  • tricks
  • cheatsheet
  • cookbook
  • awesome

在中国,你最好买一个 VPN 服务
一切能节省时间的服务都值得购买,因为时间才是最宝贵、最稀缺,压根无法再生的资源,跟时间比,钱算个屁。

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

那些在国内学英语专业的人本科毕业去当老师或者靠研究生,真不如脱产学一年计算机呢,拿着这个优势,一下子就干掉国内 90% 的所谓程序员,年薪 60 万人民币,其实指日可待…… 尤其是那些英语系的女生,一脚踏进码农的世界,瞬间就是女神中的女神。

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

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

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

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

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

所谓的原则,就是一定要恪守的形式准则,如果不能恪守,就不能称之为原则。做个有原则的人,是很重要的原则。

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

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

学习这东西,不是一定要学到大师的程度才可以拿出来开始用的。

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

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

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

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

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

仔细观察一下我们的真实生活,我们从来都是这样的:横空出世,向后钻研,向前突击……这才是真实的世界。

我们的教育体系,好像特别痴迷于把我们带到循序渐进的道路上去,父母们也觉得只有这样才放心(其实他们自己也是被弄脏了脑子自己不给自己洗脑的产物)…… 99% 的人循序渐进地从 ABCD 开始学,学英语 16 年,开口说不了,拿笔写不出…… 真不知道图个啥。

最简单的编程,被抬高成“工程师”的境界 —— 可另外一个事实又明显地摆在那里:

很多自称工程师的人,其实看到十四五岁的小黑客做的事情,也不得不心服口服 —— 若是必须、只能循序渐进才行的话,那些小黑客是不可能存在的,不是吗?
小黑客们都不是靠循序渐进习得技能的。都是“横空出世”的,他们最开始做的事情,不是打基础,而是“突然有个问题要解决”,于是不管三七二十一只好“向前突破”,用尽各种方法(通常是很土的办法)先把问题解决掉…… 在这个过程中,能补的补(向后钻研),补不上的就先放在那里,留给以后…… 然后反复迂回前进。

鼓励身边的所有人…… 只因为,我实在是太清楚“鼓励”这东西有多么稀缺了。
如果你自己是个上进的人,那你就像我一样,天天鼓励那些同道中人罢 —— 我相信这绝对是善事。

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

谁说没天分的人就不应该学东西了,谁说没天分的人学得不足够好就丢人了?

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

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

开始之前……

注册一个 Github 帐号

从骨子里来看,习得任何技能的最根本技巧,就是一句话而已:

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

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

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

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

每天都要有一整块的思考时间
在传播自由的时代里,真有价值的东西总是会被发现。

工程师不是每天每时每刻都写代码的,他们用更多的时间思考。
大家从小上学,挺辛苦地学会了识字、写字,可大多数人一辈子都不会写文章,就算写出来了,也传播不出去 —— 其实只是是因为确实没价值
为什么呢?因为他们不思考,也不会思考,所以,等于没有什么东西值得表达 —— 尽管已经掌握了一定的表达技能。

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

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

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

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

  1. 我将要解决的问题是什么?
  2. 最重要的问题是什么?
  3. 它的核心关键在哪里?
  4. 已有的解决方案都有哪些?
  5. 我如何才能给出一个更好的方案?
  6. 我的方案应该如何拆解,如何逐个实施?

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

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

成年之后,我拥有比大多数人更为强大的学习能力,无非是在这个过程中养成了几个习惯:

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

基本开发环境设置

一些最常用的命令(’#‘ 之后的文字是注释,输入命令的时候不能有它们):
ls #罗列当前目录下的内容
cd #更换工作目录
pwd #显示当前完整工作目录
touch #创建一个文件
mv #移动/更名文件或目录
rm #删除文件活目录
nano #使用 nano 编辑纯文本文件
open #打开一个文件,就好像你在 Finder 里双击那个文件图标一样
clear #清空屏幕
sudo #用管理员身份去执行一个命令

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

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

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

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

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

学任何工具,第一件事情就是去把官方网站翻个遍,是必须的习惯。

拿来任何一个软件工具,快速熟悉并掌握各种快捷键,是一个好习惯 —— 基本上就是耗费半小时而后用一辈子的事情。

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