如何提高对烂代码的理解速度?
本文是「参与大项目的酸甜苦辣」成长系列的一部分。
大项目之 吐槽架构
大项目之 如何提高对烂代码理解速度?
大项目之 如何应对无力感?
去年的一个场景
我和 Vincent 在一起看别人写的糟糕代码,他的思维在各种 Context 中跳来跳去,很快理解了各种垃圾方法的意图,宛如预先加载了所有的代码到大脑中。
我和他结对的时候,压根跟不上他的节奏。当时我全职做 Ruby 不到一年,把原因归结为「经验不足」。
今年的又一个场景
今年我和吴坚结对去理解别人代码(这次不算太烂),他看了10分钟的代码,就在各个文件的 Context 跳转自如。今年我也算是个中级程序员了,经验比较丰富了,依然不具备这种能力。
这种现象已经严重的影响到我的工作效率,所以有必要深刻的反思。
如何提高对优质代码的理解速度?
优秀的代码总有通用的模式,如果我一直遵循 Ruby / Rails Best Practice,当看到别人严格的遵守 Best Practice 的代码时,心领神会。
假如工作中需要我写一个 Redis List 的封装类,在定义方法时肯定会使用 shift/unshift/pop/push 等数组常用的方法。当我看到别人已经写好的源码时,作者和我设计意图的重合让我先天的具备了在源码不同文件的 context 中跳转的能力。
不断的学习和训练各种优秀设计(优秀的经验),会显著的加快对优质代码的理解速度,这一点我没有疑问。
如何提高对烂代码的理解速度?
我在这方面做的很差,有以下几个原因:
-
对烂代码的厌恶感。
有时候花了几个小时看别人的烂代码,就会越看越生气,特别想把作者拖过来暴打一顿,甚至把他枪毙了。
看到一个200行的 controller#action 时第一反应是「你把这个 action 当做万能方法吗?」;
看到一坨 sql 语句时的第一反应「你是个 PHP 程序员吗?」这种厌恶感极其消耗心理能量。可厌恶有什么用呢,东家付工钱是为了让我干活,而不是来吐槽,问题终究还是需要人来解决。
既不想改变自己,又要摆脱这种负面情绪,如何做到呢?暂且的方案「每天只花2个小时的时间吃屎」。
-
业务逻辑无用论。
若一件事情对于我没有意义,就很难投入其中。去年对接电商的 CRM 时一开始十分烦躁,但是把看问题的角度提高到「这是我第一次写 API Wrapper Gem 」时,就看到其中的意义,然后愿意付出大量的时间和热忱。
在接手一个项目时,潜意识里会把它分为:
-
General Knowledge,比如项目中有趣的 Gem、设计方式、权限管理、Elasticsearch、Newrelic、MySQL 索引等等。这些知识既有趣又可提高自己的实力,所以我会刻意去花时间记忆。
-
Project specific information,比如表的结构,字段含义,表之间的关系,订单处理流程。
对于 General Knowledge,我愿意花费大量的时间去训练,变成自己的长时记忆。对于 Project specific information,我则顺其自然,每次做任务时都重新 load 到短时记忆中。
在小项目中,这种方法游刃有余;但是在大项目中就完全不灵光了。项目太大,大脑无法完全 load 整个代码库,看代码时只能频繁的 IO 读取相应的模块。所以我觉得有必要把大项目部分 Project specific information 内化成自己的长时记忆,以便降低自己大脑的 IO 次数,加快完成任务的速度,处理垃圾代码时也更游刃有余?
举个例子,如果 UML 熟烂于心,就不要频繁的查看各个 Model 了。
-
假如以上个人问题都得到纠正,我对烂代码的理解力依然低于 Vincent 和 吴坚,只能归因给工作记忆的差异吗?
半年之后,我再来回答这个问题。
下一步计划
- 摆正心态,每天仅花2个小时阅读虐心代码
- 提高 Project specific information 的重视程度,至少要背过 UML,而不是每次去查。
updated_at 2015-12-29 09:39:54
写下从事代码行数 200,000+ 大项目8个月后的一些感触,算是对当初的自答。
-
Be patient. 一点点的啃,把自己工作职责范围内的活干好,为未来的重大决策积累资本。
-
现在对整个项目的理解依然是管中窥豹,永远无法了然于胸。但是已经可以在部分代码之间灵活的切换上下文了。Vincent Xie/Gene 能够在各个 context 之间娴熟的切换,主要原因可能并非他们强大的工作记忆,而是因为长久从事该项目所积累的长时记忆。
-
谋定后动,是编程的好习惯,也是参与大项目最大的心理阻碍。花时间梳理模型,通读代码,然后开工。这种策略在大项目上完全走不通。
-
停止抱怨。抱怨无用,且给人留下眼高手低的坏印象。