Malcolm Gladwell在《离群索居》(Outliers)一书中说,要真正掌握某件事情,需要10000小时的练习。其实,10000只是一个粗略的数字,而且这句话的含义也被过度简化了。我已经断断续续进行了40多年的编程。可能已经写了10000个小时的代码,但我甚至还未能成为一个优秀的程序员,更别提成为大师级的程序员了。
  我认为有以下几个原因。首先,在这10000小时中,我主要学习了4种不同的编程语言,以及其他一些辅助语言。我从一种语言换到另一种语言时,发现它们有的概念可以互通,有的完全不同。而有趣的是,在这种语言中没有意义的概念可能用来构建它。
  例如,JavaScript没有本地链接列表实现,但如果在V8 GitHub库的src目录下搜索“链表”,会发现有76个commit提到了它。即使它们在语言本身中没有用C的链接列表,但会在引擎下使用C的链接列表。
  每种语言都有自己的语法和特殊的实现方式,这些是必须要学习的,而不仅仅只是学习其概念。一种语言的最佳实践方式对于另一种语言来说可能不是最好的。在编译语言上我从来没有花过很多时间,几乎总是使用解释型语言,如BASIC、PHP、JavaScript、Python。我学习过C#和Java,用Rust做过Hello World,但在Linux中从源码编译对我来说十分困难,所以我通常只是下载源码,按照教程中的指示操作,然后祈祷代码能够运行。
  其他的技能:
  除了学习这些语言,我还学习了服务器技术和系统架构的基本概念,不是从编程的角度,而是从网络管理员或者说系统管理员的角度。而且无论是建立一个大型网站,在Flash中创建矢量图并将其渲染成位图,还是学习通过AWS解决方案架构师助理认证,我都已经做了很多次。但是很多东西我已经忘记了。我已经学会了这些语言的框架和库,如JavaScript的React和JQuery以及PHP的Laravel…然后也忘记了许多,因为我为完成一个项目学习了它们,然后就没有再使用它们。
  遗忘是常态
  即使写了10000小时的代码,也不意味着你能够轻易地在不同语言之间转换。当你真的进行转换的时候,你会发现10000小时没有那样神奇的魔力,因为另一个不可避免的原因:记忆衰退。正如我所说的,如果我停止使用一种语言,甚至只是停止使用它的一个功能一段时间,我就会像忘记“高中西班牙语”一样忘记它。我在高中时读完了西班牙语3级,在大学时考过了西班牙语4级,并获得了A。而现在,我可能只记得不到10%的内容。
  例如,我几乎完全忘记了怎样使用常规动词连接过去式,更不用说不规则动词了。但是因为我以前练习的足够多,我知道自己的不足之处,所以我可能比刚开始学习的人更快地恢复以前的知识,但可能需要几个月的强化练习才能全部恢复。
  十年前,我精通PHP,在一个定制的MVC框架中工作(由其他人创建),使用Doxygen来映射类的继承层次,并使用JQuery来构建前端的交互性。但我在7年前没用过PHP了,转而使用Node。现在,我需要花5分钟并且改正了一些语法错误,才在刚才提到的PHP副本中正确地写出一个Hello World。

去年12月时,我为freeCodeCamp的前端库认证建立了五个React项目,但在那之后,我就没有再编码React项目了。过去了两个月,当我开始准备面试的时候,我觉得我就像是React新手。如果我看到自己写的代码,能够很快理解。但是因为很多东西都只是我准备的辅助工具,很多我都忘光了,所以我需要回到文档中去开始一个新的React项目再开始工作。和新手相比,我只是走得更快。
  这就是新手和已经入门了的区别。一万个小时可以让你成为一个小提琴大师。但是如果你每隔500小时就换一次乐器,并想要成为整个交响乐团的主角,那你不一定能够更胜一筹。所以为了强化和拓展你的技能,练习不仅要广泛,而且要持续
  逻辑上的矛盾:
  10000小时是什么样的概念?是5年每周工作40小时,两年休息1周(假期、病假和休假都在这2周内)。你会发现有的工作招聘时要求在一个3年的框架内有5年的经验。5年似乎是成为专家所需的标准时间。因为对框架的无知和这种简化的标准,就会产生逻辑上的矛盾,一言以蔽之。
  工作中的一万个小时≠一万个小时的实践
  一个专业的开发人员,有多少的工作时间是花在电子邮件和会议上的?又有多少时间在真正编码和思考编码问题?当我在微软写文档的时候,我的经理说,不管怎么算,你一天中大概只有一半的时间花在实际的生产工作上。其余的时间会花在一些琐事上,比如回复电子邮件、开会、进度/状态报告、在IM上回答随机问题或者和别人闲聊…
  所以我只有20%的时间是在写代码,因为其他80%的时间是在写文档和教程,这意味着我平均每天只写了一个小时的代码。在使用浏览器中的开发工具进行调试方面,我曾经是个天才,因为我在这方面经验丰富,还经常为新版本进行更新。但是,虽然当时所有的开发控制台的快捷键,我都烂熟于心,但在我离开微软的7年后,我基本上已经把它们忘得一干二净了。
  事实上,自从我进入开发人员关系部后,我每天花了10-20%的时间写代码,其余的时间写教程,为会议讲座和网络研讨会制作文件,制定建立和培养开发人员社区的战略,制定展示新功能的最佳方法,以及处理各种人——产品经理、内部工程师、外部开发人员、产品营销经理、需求生成和社交媒体经理、律师、公关和公司政策执行者的问题。
  一万小时不都用来学习新事物
  最后要记住的是,你不会花整整一万个小时学习新东西。如果你在学习小提琴,你可能会花上几百个小时来学习一些初级的作品。在你学习新东西之前,你已经掌握了一些初级的东西,并且在反复练习直至完美的过程中,
  学到很多,并且将你学到的这些用于学习新事物。所以这一万个小时中的大部分时间都是强化的。
  在编程中,这就像多次编写相同的To Do单页应用程序。前几次你可以参考教程,但最终你必须能够在没有任何参考的情况下写出它。这就像一边看着乐谱一边慢慢演奏《欢乐颂》,然后记住如何演奏,然后准备在演奏会上演奏。
  但是,当你需要在截止日期前交付一个项目时,你有多长时间来进行强化练习?在许多公司,不会给你提供扩展技能和强化编码的时间,需要你利用额外的时间来完成。一些公司会给你10%的时间或20%的时间来做独立的项目,但很少有公司希望你把这些时间花在单纯的练习上。
  新的框架、新的最佳实践方法、新的语言、新的模式产生的速度不断加快,在这种情况下,仅仅是在新的方面取得合格的成绩,都会像和职业选手一样演奏《欢乐颂》的困难。
  总结:
  你需要平衡强化和探索的时间,特别是当你每天编码的时间少于50%的时候。你必须不断地通过练习来进行强化,建立心理肌肉记忆,直到你能在睡梦中解决它们。小提琴几百年来都没有实质性的变化,但编程却在不断变化。成为一个特定语言的大师级程序员意味着要坚持更长的时间。你不得不在非工作时间进行强化练习,完成任务,努力成为一个优秀的程序员,或者跳槽到另一个能够给你充足时间练习的公司。
  哪怕你5年或者10年后都没有成为大师级的程序员,也没有关系,因为好好地做一万个小时比看起来更难完成。