渴望成长的工程师-你了解一万小时定律吗

前戏

一个月前, 我在和团队的一位前端同学One On One中, 得知他目前对自己的成长非常困惑, 工作中大量重复的页面制作, 没有太高的技术含量, 业余时间的学习, 一方面感觉比较零散, 另一方面感觉学来学去, 好像就是那么点东西.

这位同学刚毕业半年, 自身的主动性是很不错的, 我就问他平时都学哪些东西. 他提到了ES6, Javascript设计模式, 以及一些时髦的框架. 以前的聊天中, 我了解他阅读过Javascript高级程序设计, 我就问他在这本书上花了多少时间, 他告诉我花了大概10个小时左右.

我给他列了一份大概的学习计划, 第一条就是希望他尝试在Javascript高级程序设计这本书上花费掉500-600小时.(如果掌握好基础, 那些花哨的技术, 可以很低成本的学习到; 如果不掌握好基础, 那些花哨的技术, 也只能学习到表面)

前两天, 我又和他进行了一次One On One, 他仍然很困惑, 花了4周左右时间, 读到了Javascript高级程序设计的第5章, 但是感觉仍然没有获取到什么新的知识. 我问了下面几个问题:

  • Javascript中的Number最大值是多少? 为什么?
  • Javascript中Number主要有哪些方法?
  • 为什么Number要有toString()方法?
  • toString()方法怎么实现?

回答大概如下:
* 最大值好像是个14位左右的数字
* Number的方法列举了一些, 基本完整
* 因为Javascript中所有对象都是继承自Object.
* 这个真没有想过.

我跟他讲了Number是一个double, double应该取找对应的规范取了解它的设计, 计算机中存储的只有二进制数据, 类型是我们理解数据的依据, 不同的场景需要不同的理解方式, 所以才要有类型转换. 但并不是存储在计算机中的一个int, 当做字符串读取, 就能得到它的字符串形式. 涉及到字符串, 我跟他提了字符编码的一些基础, UTF-8编码规范的一些东西.

他似乎有一些懂我的意图了.

于是, 我问了最后一个问题, “你是不是在读书的过程中, 其实是有碰到一些挑战, 只是把它们给忽略掉了”. 他肯定了我的猜测.

构思

16年年底, 我写过一篇文章-工程师成长之路:工作1-3年工程师如何突破瓶颈期? 文中, 我主要从软性素质角度, 分析工程师成长前期, 可能会面临的一些问题, 以及一些解决的思路.

在碰到上面这个问题之后, 我回想了过去自己的经历, 以及周围的同事. 其实, 从事工程师这个职业的同学, 大部分都是有很高的学习热情的, 尤其在刚工作的那两三年. 只不过, 后来他们的热情被逐渐的消磨, 才有了”三十五岁危机”, 才有了我在那篇文章中提到的”可能很多人终生都停留在成熟期”.

是什么消磨掉了他们的热情呢? 我觉得至少其中有一部分原因, 和前面这位同学的Case是吻合的. 他们以为自己努力了, 但是甚至都没有得到自己的认可.(这位同学努力的花费大量精力去阅读Javascript高级程序设计, 但4周后自己觉得没有进步)

所以, 我想写这篇文章, 分享自己在自学提升这条路上的一些经验心得.

正文

总结我的自学经历, 我认为有五点是比较重要的:

  • 一万小时定律;
  • 离开舒适区;
  • 逐层深入;
  • 成体系学习;
  • 有效反馈.

一万小时定律

一万小时定律, 是<异类>中提到的, “1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。”.

这是一个现成的理论基础, 但是, 并没有看到哪个领域因此而量产大师.

因为, 一万小时意味着, 每天付出3小时专门的训练, 我们需要坚持10年时间.

正常本科毕业是22岁, 28岁左右就需要考虑成家, 30岁左右该有孩子了. 留给我们的时间非常有限. 所以, 如果你期望在工程技术领域, 有所成, 就应该趁年轻的时候, 最好从大学就开始实践一万小时定律.

因为, 越年轻的时候, 能够自主支配的时间越多.

我们对这几个阶段进行分析:

  1. 大学时代, 平均每天应该就3节大课-6小时, 通勤时间-1.5小时, 吃饭时间1.5小时, 睡眠时间8-10小时. 工作日你每天拥有5-7小时可自由支配时间, 周末为11-13小时. 每年可利用时间为2444 - 3172小时. 刨去正常的社交娱乐, 1500-2000小时非常轻松.
  2. 婚前时代, 朝九晚九是正常节奏, 早晨时间太过碎片化, 只有晚上时间可以大块的自由利用, 凌晨00:00休息是正常节奏. 工作日每天拥有2小时左右可自由支配时间, 周末为12小时左右. 每年可利用时间约为1768小时. 然而你有硬性的社交需求(不然难道和空气结婚?). 所以, 真正能够有效利用的时间很难超过1000小时.
  3. 婚后育前时代, 柴米油盐酱醋茶, 修电修水修马桶(不然难道让老王来修?), 无尽的琐事侵占你更多的时间, 这个时代, 能够有效利用到学习的时间, 可能很难超过500小时了.
  4. 育后时代, 有了孩子之后, 你能够投入到学习提升的时间, 就真的非常非常有限了, 可能每天专注1小时都很难, 尤其是孩子3岁之后, 他需要你的直接陪伴. 周末的大片时间也不用想了, 只要在家, 你就属于家庭.

做个总账吧, 大学四年, 你可以轻松的拥有8000小时的时间去提高自己, 婚前6年, 可以有6000小时提高自己, 育前2年左右, 大概有1000小时, 育后, 每年应该就只有一两百小时的样子了.

所以, 如果你希望有所成, 如果你还年轻, 请慎重的规划好自己的这15000小时, 这是你最重要最有价值的资本.

离开舒适区

一万小时定律, 其实也有质疑者.

“家庭主妇每天在做饭上, 投入约为1-2小时. 婚后生活约为40-50年. 所以, 家庭主妇在做饭上投入的时间大概有小两万小时. 但是, 他们并没有成为大师.”

所以, 一万小时定律也有额外的限定条件, 其中一条, 就是”长期处于学习区学习”.

“学习区”是一个美国人提出的概念, 人们要学习的事物, 可以分为三个等级:

  • 舒适区: 没有学习难度, 习以为常, 自己可以处于心理舒适状态;
  • 学习区: 对于自己有一定挑战, 因而心理感到不适, 但不至于太难受;
  • 恐慌区: 超出自己能力范畴太多, 因而心理严重不适, 导致崩溃并放弃学习.

家庭主妇的例子, 只是在重复相同的工作(舒适区), 所以不能成为美食领域的专家. 而在文首提到的例子中, 那位同学最后也认可我的猜测, 他在看书的过程中, 其实原本是有挑战的, 只是被忽略掉了.

其实, 这很常见, 当我们碰到有挑战的问题时, 总是希望用最短路径解决它. 这是人类的本能. 当碰到有挑战的问题时, 伴随着心理的不适, 我们本能的就希望尽快的摆脱这种状态.

而对于学习来说, 那个小的挑战带来的收益是很难评估的, 而忽略掉它其实并没有什么成本. 自然而然的, 我们就会选择放弃了. 当一个又一个小的挑战被放弃之后, 逐渐形成了习惯, 以至于, 每次学习, 好像并不能获得新的知识.

所以, 在学习的过程中, 我们需要刻意的训练自己, 让自己的潜意识, 就能够克服放弃挑战的本能.

逐层深入

这一点, 与”离开舒适区”息息相关. 我们的目的, 其实是进入”学习区”, “离开舒适区”只是一个步骤.

下一步, 就是要避免进入恐慌区.

前面提到我在正则表达式的学习上, 花费过超过200小时, 这200小时是怎么花费的呢?

  • 2008年学习J2SE时, 碰到正则表达式, 第一次学习, 理解它是一个和通配符类似, 但是更牛逼的东西
  • 2009年, 学习中, 经常碰到正则表达式, 就又专门通过Java的正则表达式文档学习了一遍.
  • 2010年, 学习javascript/python分别碰到正则表达式, 两次学习, python的正则表达式文档进行了系统的学习, 对正则表达式中的一些高级特性有了比较清晰的认知.
  • 这个阶段, 有一个问题一直困扰我, “如何用正则表达式完成Html标签的匹配识别, 允许属性单引号或双引号, 允许引号内有转义字符”.
  • 2011年, 翻译php的pcre模块文档时, 进行了更深入的学习, 大概半年后, 我终于写出了上面困惑自己两年的正则表达式. (当时还写过博客分享)
  • 2013年, 阅读<代码之美>第一章, 理解了正则表达式匹配引擎的实现原理.
    后来, 零零散散的阅读了<精通正则表达式>一书.
  • 2014年, 阅读了Nginx中配置文件解析的过程.
  • 2016年, 阅读了php代码的解释执行过程.

再后来, 就是现在了, 在这个方向上, 我仍然有想要解决的问题, “学习编译原理, 能够掌握一种编译工具, 可以让自己更自由的描述规则”.

这是一个循序渐进的过程, 我认为这不单纯的是正则表达式的学习, 而是在逐步加深对字符串处理的理解. 从最开始只能粗浅的使用正则, 到后来理解它的原理, 再逐步涉及到到编译体系的边缘.

如果一开始, 我面临的就是”解析HTML标签”这样的问题, 那估计我早就被干迷惑了. 而这种循序渐进, 逐层深入的方式, 在不断让我进步的同时, 一次又一次激励让我产生更高的兴趣.

所以, 当你进行一项技术学习的时候, 也请仔细的拿捏, 到底哪里才是自己的学习区, 离开舒适区, 也不要进入恐慌区.

成体系学习

前面算过了, 从大学时代开始, 到你没有精力可用之前, 你一共有大约15000小时的资本.

这15000小时的使用, 应该需要你慎重的考虑, 当做一种投资去做这件事.

我到现在为止, 花在编程这件事上的时间, 应该在7000小时左右. 时间分配大致如下:

  • 最初学习的是Java体系的东西, J2SE, J2EE, 三大框架等等这些东西, 我大概花费了3000小时
  • 花费在学习其他语言上的时间, 总计大概有2000小时左右(python, javascript, html/css, php及其内核, c, bash, golang, erlang等).
  • 学习操作系统相关知识, 大概耗费了500小时
  • 学习计算机网络大概耗费了500小时
  • 阅读开源软件源代码, 大概花费了500小时(jQuery/jQueryUI, Memcached, PHP, Nginx等).
  • 学习数据结构与算法, 大概耗费了200小时
  • 学习正则表达式, 大概花费了200小时

按照我投入的7000小时来看, 应该至少接近大师了吧, 然并卵.

我觉得这是我的投资失误. 我在Java体系和其他语言的学习上, 花费了5000小时. 但是, 在操作系统/网络/体系结构/数据结构与算法等核心基础方面, 投入的精力太少. 这些基础的相对薄弱, 就导致我现在做一些事情心有余力不足.

所以, 在你下定决心, 在学习区度过10000小时时, 请一定规划并经常Review自己学习的体系.

如果能够从头再来, 我会这么做这份投资:

  • 2000小时, 精通一门语言, 理清这门语言生态下周边技术的脉络.
  • 500小时, 基础的数据结构与算法.
  • 1000小时, 理解计算机体系结构.
  • 1000小时, 理解操作系统的运转.
  • 1000小时, 理解计算机网络.
  • 2000小时, 阅读开源软件源代码.
  • 2000小时, 架构领域的学习与实践.
  • 500小时, 涉猎其他语言或领域, 扩展知识面.

当然, 青春一去不返, 空悲切.

有效反馈

关于一万小时定律, 有两个限定条件, 其一是上面提到的”长期处于学习区学习”, 另外一条, 就是”有效反馈”.

有效反馈的意义, 我觉得主要有三点: 1) 激励并培养更高的兴趣; 2) 修正不足; 3) 调整学习区.

第一点, 其实是建立对自己的心理暗示, 让自己持续的保持对所做事情的高度兴趣. 这一点, 不仅可以通过学习过程的正向结果来激励, 也可以通过其他方式来培养. 比如, 刻意的培养, 让自己更多的在兴奋状态下写代码, 身体形成习惯之后, 你就更容易在写代码时处于兴奋状态, 有更加积极的思考.

第二点, 以学习正则表达式为例, 学习了正则表达式的一条规则之后, 应该尝试用大量的实例去测试, 验证自己的理解是否正确, 每一个无法通过的case, 可能正好能为你带来新的知识.

第三点, 前面提到处于学习区非常重要, 有效反馈是调整学习区一个非常重要的途径. 当你在目前的学习中, 已经无法得到负向的有效反馈, 那就代表当前已经处于舒适区了, 应该尽快调整.

不过, 当你判断自己在某个方向已经处于舒适区时, 可能很难直接找到这个方向的下一个学习区. 此时, 建议换一个明确自己处于学习区的方向进行学习. 在你整体学习体系之下, 不同方向的知识应该是相辅相成的. 这就像盘山公路的S形设计一样, 即可以看到每个方向的风景, 缓解视觉(心理)疲劳, 又在不知不觉间, 用一种省力的方式, 攀至高峰.

总结

本文的核心观点, 就是一句话: 有效规划自己的时间, 通过有效反馈, 让自己持续一万小时处于学习区学习成长.

我是几乎从零基础自学成长的, 成长过程中, 受到无数散布在网络上, 由陌生人发布的信息的帮助. 虽然最终没有大成, 但我也渴望能够帮助别人成长, 成为开源共享传承中的一个节点.

所以, 如果你认为这篇文章对你身边的朋友, 能够有所帮助, 请转发给需要的人.

广告

nice是一家很酷的移动互联网公司,我们正在招聘后端工程师、Android工程师、iOS工程师、高级运维工程师、高级算法工程师、大数据高级工程师,相中nice可以发简历到([email protected])。

你可能感兴趣的:(程序人生)