学习一项技能要花多少时间?

By Rei on 12 Dec 2013

前不久,一个技术 party 上有人问我:“我学习 Rails 已经2个月了,但还是对整个开发流程缺乏清晰的了解,我应该怎么学呢?”这不是个别现象,在 ruby-china.org 上也经常有人发帖,说自己学习了 1个月、2个月、半年了,还是不太清楚 Rails 的很多细节,不知道应该怎么学。

看到这样的提问,我第一反应是他/她们对自己的要求是不是太高了?

我学得很慢

我从没有什么 Web 基础开始直接学 Rails 框架,到找到一份 Ruby 程序员的工作用了2年半。此后在正职工作上编程1年半,自由职业编程9个月。现在我考虑开发什么的时间已经比要怎么开发多了,这个过程用了4年半。

如果平均每天有效利用时间是3小时,至今已经接近了5000小时的量,按照10000小时到专家的理论,我还有另一个4年半要学习,我感觉这个估算还是比较准确的。

我当然不是只学习一个工具,同时也学习前端、UI 设计、运维……但不会前3年学开发,后3年学设计分得这么清楚。有时我又会看看跟已有知识完全重合的工具,比如 Python 和 Nodejs,以免错过什么。总的来说,到现在的程度用了4年半,觉得自己学得慢的朋友,可以以此作为参照。

不是天才

大学毕业以后最让我失望的一件事,就是发现自己不是天才。我身上没有特殊才能,跟大部分人一样,这多么令我沮丧!

世界上确实有些天才,像是 26 岁获得 Best Hacker 称号然后去开赛车,或是 21 岁环游世界同时成为 O'Reilly 的作者。而我只能坐在小房间里面做一些不知道有没有人需要的软件,看来“奇迹”是不会发生在我身上的了。

我经常犯低级错误,例如花一个下午发现一个拼写错误引起的 bug,或者花一两天时间搞明白一个问题,兴奋过后又沮丧,为什么花了这么多时间在这些浅显的问题上。

那么,既然我不是天才,就不要用天才标准要求自己了。花多少时间都好,解决一个问题就是一个收获。不再只看着那些天才,而是把昨天的自己作为竞争对手,今天比昨天有进步,那么这一天就是有意义的。笨人有笨办法,一步一个脚印往上爬。

能解决问题不是因为天资聪颖,而是因为已经花时间实践过了。如果有什么问题还解决不了,那是因为实践得还不够。

学习效率指数上升

万事开头难,对于技能学习也适用。起步的时候,不懂的地方太多,每解决一个问题都会引出很多新问题。随着知识面的增大,接触到的新知识也会随之增多,你会感觉自己永远学不完。

但随着知识积累的增多,吸收知识的速度也会加快,你会逐渐成为“花一个下午看文档了解基本用法”俱乐部的一员。这不需要什么魔法,你只要遇到一个问题,解决一个问题,效率自然会提升。我现在每半年学到的新知识的价值都等于过去学到的知识价值总和。

所以在入门阶段感到焦虑时,请从容的接受它,并且坚持下去,每个人都有这个阶段。如果你之前已经有1、2年的编程经验还是感到焦虑,那是因为之前的视野太小,现在就是踏入新天地的好时机,不要原地踏步。

当你拿出几个月前的代码,发现自己写得超烂的时候,那么恭喜你,你进步了!

最后

课时观念在真实世界不适用,在学校里之所以可以一个学期学习好几门课,是因为只需要学到应付考试的程度,这种知识是不可靠的。真正掌握一项技能,需要长时间的实践,或者说,需要终生学习。

没有人告诉你要走什么路线,什么时候前进,什么时候停止,一切都取决于你自己,志向决定高度。但也正是这么多的未知和可能性,产生了这么多的乐趣。