我的自学故事

个人介绍

  • 章琦
  • 1995年生
  • GitHub: @qinix
  • 北航统计学学士
  • 开源贡献者,Rails Contributor, Elixir Contributor
  • 10+ 年编程自学者
  • 前由你单车后端架构师
  • 前 Yunbi、BigONE、Peatio 技术专家
    • BigONE & Peatio 高性能交易撮合引擎作者,高峰期日成交量十亿美元
    • Venezia 区块链资产管理系统作者,安全管理交易所上百亿数字资产
    • Mariana 内部量化交易系统负责人
  • 海洛创意签约摄影师
  • 古典吉他和指弹吉他演奏爱好者

兴趣的源头

我是在小学五年级时候第一次接触到了编程,并且幸运的对编程这件事产生了极大的兴趣。回想起来,当时对这件事一直保持着兴趣的想法很简单:

学会了这个技能我就可以用它去做很牛逼很酷炫的事情,想想就很有成就感

相比于在学校里学数学、学历史,学编程带来的反馈很直接,直抵神经。

像很多人一样,我一开始学了 C 语言。很不巧,C 语言显然不是一个学一学就能做出很牛逼很酷炫的事情的语言。到目前为止(2019 年),市面上的所有 C 语言书籍都只能教你语法和在黑底白字的终端下面做一些习题。任何一个刚学编程的人看完了这样的书都是一脸懵逼,完全不知道学了这样的编程能有什么用。

由于当时还对计算机硬件感兴趣,我顺势接触到了 51 单片机。单片机第一次让我看到了编程能怎么用在现实生活中。我可以用 C 语言控制 LED 小灯的亮灭、蜂鸣器的响声、电机的转动。甚至想到了用单片机实现远程控制开关家里的电灯——也就是后来的智能家居,当时是 2008 年。

随着由单片机对我带来的编程世界观的改变,我找到了更多工程中直接使用的编程语言和框架,例如:Ruby、Ruby on Rails、Python。使用这些语言,我能更快的完成我想做的事,给我更直接的刺激感和愉悦感,产生正向反馈

一万小时有多久

格拉德威尔在《异类》一书中指出:

人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。

那么,一万小时有多久呢?

  • 如果平均每天学习和刻意练习 4 个小时,一共需要 2500 天,也就是 6.85 年;
  • 假如一个人从 18 岁开始知道自己该干什么,到 65 岁退休,中间一共有 47 年;
  • 假如一个人从 18 岁开始可以学习和练习一个技能,并且每天投入 4 个小时,那么只需要到 25 岁就可以成为这个领域的专家;

总有人问我是怎么自己学会编程的,我想了一下,可能最重要的点就是:

花时间,花很多时间

上初中和高中的时候,由于学校使用电脑不太方便,我会坚持每天睡前在手机上阅读技术文档至少两小时,并且通过手机远程 ssh 连接到租用的 Linux 云主机上实践编程。由于手机没有实体键盘,并且虚拟键盘没有方便的上下左右键,我还因此顺便学会并且熟练使用 vim 键位。

后来上了大学的常态就是,每天起床后往电脑前一坐就是一天,看书、看文档、看源码、写代码。往往每天都能学习十个小时以上。

工作之后,我会尽量避免去做那些已经非常熟悉的事,尽可能把工作也变成一种学习。

这样想来,可能不需要 6.85 年就能达到 10000 小时了呢?

去做一些事

将刚学的技能用起来

几乎所有事情都是这样:

「你以为你学会了」和「你真的学会了」是完全不同的两码事

你以为你看完了一本编程书,已经学会了书中的知识。但真的在工作中用的时候,才发现还是不得不再拿出书放在旁边,一边看一边做。

实际上,这并不是什么坏事,其实所有人都是这样。只有在做过大量练习之后,才是真正学会了这个知识,抛弃书本,灵活使用。

而在做编程练习时,有一个很讨巧的办法:

用你刚学的技能去接个活儿

高中时候,我第一次接触到了 Ruby 和 Ruby on Rails,作为一个 Web 快速开发框架,市面上到处都是对口的外包项目。我在学习完全部基本概念之后顺势接了个外包项目,用 Rails 开发,第一次做出了一个完整的产品,练习了技能的同时还得到了经济收益。

这个方式去练习编程有几个好处:

  1. 强迫你完成这件事,毕竟已经承诺了别人
  2. 通过做出完整的作品,可以学习到很多教程中没有提到的细节
  3. 顺便还能产生经济收益

目标导向

如果始终无法下定决心来学一个东西的话,那就先把学会它之后用它做个什么东西想好。

刚上大学时候,我想尝试一下学习 iOS 编程。但,拖延症嘛,始终觉得暂时用不到,就没有开始学。

后来,总觉得不能闲着,该干些什么事。于是决定写一个学生课程表查询、成绩查询的 app。恰好北航是一个保密性比较强的学校,外边的超级课程表、课程格子都没有接入北航内部数据,学校里面也没有人在做这个事,这个事在当时是一个很大的缺口。

确定下来要做什么之后,我才开始一边学一边做。一旦学起来之后,一切都变得容易了。一个人一边学一边做,最终只用了不到两周就完成了第一版的上线。遇到不会的东西怎么办?自己 Google 呗…反正要做出来东西。

后来,这个 app 用户面甚至覆盖了超过一半的本科生...

对于编程来说,一个人自己学着做还是会有一个致命的缺点——限制了学习的角度和深度。因此,我为了更加深入学习 iOS,加入了美团的 iOS 基础架构组。在那里学习了大型应用是如何组织起来的,并且为了实现应用热更新还重头实现了一个面向对象语言运行时。

不要害怕

要深入学习一个编程语言或框架,其实方式很简单:

  1. 通读文档或对应论文
  2. 精读源码

通常,一个成熟的项目从文档就可以学到大部分细节。

不过,大部分人对于直接阅读项目文档和源码都存在着恐惧心理,感觉那是「搞科研」的人干的事。

有的人是觉得语言不通,其中包括自然语言(英语)和符号语言(数学)。其实语言这种东西,不要被吓住,习惯就好了...

在深入学习 Rails 的时候,我一字不差的通读了 Rails 的文档,并且仔细阅读了路由系统、ORM 底层实现的源码,甚至还自己从头实现了一个简单的 Ruby 编译器和 Rails-like Web 框架。都做完了之后发现,根本没有那么难嘛,都是外面人骗你和自己吓唬自己。

后来进入了区块链领域,由于工作需要重新实现很多链的交易构造和签名逻辑,仔细阅读了《比特币白皮书》和《以太坊黄皮书》,逼着自己读完之后发现其实根本也没有看起来那么难嘛。明明比网络上流传的大部分文章讲得清晰又简洁,却因为标题和一些数学符号拦住了很多人,其实数学符号和学英语一样嘛——遇到不会的就是了。

值得一提的是:

  • 《比特币白皮书》除去附录只有 8 页,带来的比特币市值一度超过了 3200 亿美元;
  • 《以太坊黄皮书》除去附录只有 15 页,用优雅的符号语言描述了以太坊的所有细节:传说当年找了几个不同编程语言的团队互相隔离,都对着这个黄皮书来做实现,实现出来的东西竟然是互相兼容的。

你可能感兴趣的:(我的自学故事)