去年的一个场景
我和 Vincent 在一起看别人写的非常烂的代码,他的思维在各种 Context 中跳来跳去,居然能很快理解各种垃圾方法的意图。宛如预先加载了所有的代码到大脑中。
我和他结对的时候,压根跟不上他的节奏。当时我全职做 Ruby 不到一年,把原因归结为「经验不足」。
今年的又一个场景
今年我和吴坚结对去理解别人代码(这次不算烂),他看了 10 分钟的代码,就在各个文件的 Context 跳转自如。今年我也算是个中级程序员了,经验比较丰富了,依然不具备这种能力。
所以这篇文章是一篇自言自语的反思,也特别期待你们的分享。
优秀的代码总有通用的模式,如果我一直遵循 Ruby / Rails Best Practice,当看到别人严格的遵守 Best Practice 的代码时,心领神会。
假如工作中需要我写一个 Redis List 的封装类,在定义方法时肯定会使用 shift/unshift/pop/push 等数组常用的方法。当我看到别人已经写好的源码时,作者和我设计意图的重合让我先天的具备了在源码不同文件的 context 中跳转的能力。
不断的学习和训练各种优秀设计,会显著的加快对优质代码的理解速度,这一点我没有疑问。
我在这方面做的很差,有以下几个原因:
有时候花了几个小时看别人的烂代码,就会越看越生气,特别想把作者拖过来暴打一顿。
看到一个 200 行的 controller#action 时第一反应是「你把这个 action 当做万能方法吗?」;
看到一坨 sql 语句时的第一反应「你是个 Wordpress 程序员吗?」
这种厌恶感极其消耗心理能量。可厌恶有什么用呢,东家付工钱是为了让我干活,而不是来吐槽,问题终究还是需要人来解决。
既不想改变自己,又要摆脱这种负面情绪,如何做到呢?暂且的方案「通过看优质代码汲取能量,每天只花 2 个小时的时间看烂代码」。
若一件事情对于我没有意义,就很难投入其中。去年对接电商的 CRM 时一开始十分烦躁,但是把看问题的角度提高到「这是我第一次写 API Wrapper Gem」时,就看到其中的意义,然后愿意付出大量的时间和热忱。
在接触一个项目时,潜意识里会把它分为:
1. General Knowledge,比如项目中有趣的 Gem、设计方式、权限管理、Elasticsearch、Newrelic、MySQL 索引等等。这些知识既有趣又可提高自己的实力,所以我会刻意去花时间记忆。
2. Project specific information,比如表的结构,字段含义,表之间的关系,订单处理流程。
对于 General Knowledge,我愿意花费大量的时间去训练,变成自己的长时记忆。对于 Project specific information,我则顺其自然,每次做任务时都重新 load 到短时记忆中。
在小项目中,这种方法游刃有余;但是在大项目中就完全不灵光了。项目太大,大脑无法完全 load 整个代码库,看代码时只能频繁的 IO 读取相应的模块,效率特别慢。所以我觉得有必要把大项目部分 Project specific information 内化成自己的长时记忆,以便降低自己大脑的 IO 次数,加快完成任务的速度,处理垃圾代码时也更游刃有余。
举个例子,如果 UML 熟烂于心,就不要频繁的查看各个 Model 了。
我的问题:假如以上个人问题都得到纠正,我对烂代码的理解力依然低于 Vincent 和 吴坚,只能归因给短时记忆差吗?
2015-07-17 14:15:14 update 请大家把讨论的焦点集中在:「如何提高自己阅读代码的速度」 :simley: