想起毕业后的第一份程序员工作,导师给我丢过来一堆代码,这是一份系统级的代码,里面包含接近100个代码文件,他要求我读懂并找出这份代码里面写得不好的部分。
我当场懵圈,亚历山大。
首先要解决的问题是,我从哪开始读呢,程序入口在哪呢?
折腾半天,找到了入口,一行接着一行读了起来。
连程序入口都找不到,想读却不知道从那开始;又不好意思问,怎么说自己是个研究生,这么初级的问题都不会,太尴尬了!
半个月之后,导师摇了摇头。
拿到一份别人写的代码,有的时候这份代码还没有说明文档,如何读懂这份代码?
**肯定不能一行一行地读,正如我们看一栋房子,不可能一块砖头一块砖头地看一样。**
那如何读呢?
> 先整体再局部,先粗读再精度
### 先粗读
这一遍读明白作者写了什么,这份代码的大致逻辑是什么。
具体如何操作?以昨天会议代码为例,代码在文末。
**1.先读结构**
有四个部分:
- 先导入了两个模块;
- 再定义了两个全局变量;
- 再写了一个`for`循环,`for`循环里面还有个`while`循环;
- 最后还有个`if`判断
**2.不深入细节地读**
`for`循环里面:
- 先产生了四个随机数,不用管这4个变量的英文单词的意思;
- 再后面是一个`while`循环,`while`循环的条件是`player_life`和`enemy_life`这两个变量同时大于零才进入循环,也就是说当任意一个变量小于0就会跳出这个`while`循环;`while`循环里面就是两个变量相减,`player_life`和`enemy_life`的值每一次循环都在变化;
- 接下来是一个`if`判断块,这里面`player_victory`和`enemy_victory`是前面定义好的全局变量,这里还有`+1`的操作
`for`循环结束之后,根据`player_victory`和`enemy_victory`的大小比较,执行了不同的打印。
**3.梳理整段代码的逻辑**
这段代码通过比较`player_victory`和`enemy_victory`的大小,来判断玩家赢了还是敌人赢了。那`player_victory`和`enemy_victory`这两个变量又是如何计算的?
> 是通过`player_life`(玩家的生命值)和`enemy_life`(敌人的生命值)的大小进行计算的
那`player_life`和`enemy_life`又是如计算的?
> 玩家的生命值 = 玩家现有生命值 - 敌人的攻击值
>
> 敌人的生命值 = 敌人现有生命值 - 玩家的供给值
大致逻辑如下:
- 玩家和敌人一人攻击一次,每攻击一次,生命值就会降一点,直到其中一方降为0以下,即挂了;
- 谁没挂,谁就赢了一局;
- 总共三局,最后谁赢的局数多,谁就是最后的胜利者。
有个小诀窍:只读**有效代码**。
何谓有效代码?那些能真正表述核心逻辑的代码。
为什么这样做?因为对刚起步的我们来说,每行代码都是挑战,无效代码给我们带来很大的干扰和压力。
不过,对于小白同学来说,最开始可能没办法判断哪些有效,哪些无效?
> 我好像确实也是按经验判断。例如:
>
> `print`和`time.sleep`直接就被我忽略了,我知道一个是打印,一个是休眠,只是起辅助作用。
>
> 至于`print`是怎么写的,`time.sleep`是怎么调用的,我先不管。
这种判断能力,时间久了自然就有了。
### 再精读
这一遍读明白作者是怎么写的,具体使用了什么语法和技术手段。
弄明白作者的逻辑之后,再去精读每一行代码,看人家用了什么样的语法。到这一步,我才会去查阅`time.sleep`和`random.randint`的详细用法,然后才能真正弄明白作者为什么要写这句代码,更进一步才能真正体会到高手写代码手法的精妙高超之处。
### 总结
最后,我们要明白,读代码的目的不只是为了读懂,更是为了提升自己:
- 别人用了什么样的设计架构
- 别人用了什么我以前不会的语法
- 别人代码风格哪些地方值得我学习
写作需要积累素材,写代码同样需要积累。积累好用的库、好用的函数。这些积累最终会成为你现成的武器,要用的时候直接拿出来用就好了,不再需要重新造轮子。
> 对于程序员来说,这样的武器库尤其必要。优秀的程序员不但有武器库,而且人家的武器还在不断地更新优化。这也是为啥别人的代码写得比你快甚至还可能比你好的秘密。
如何快速吸收别人优秀的地方?
> 模仿别人的代码
这是快速提升自己代码实力的绝佳方式。
我读昨天的那段代码,整体感受是轻松和顺畅。可,这并不意味着我可以很轻松地读懂任何代码,正如我们读完大学之后再去读小学语文课文肯定非常轻松,但是读完大学的我们仍旧还有非常多的文章读得很吃力。不过,**我可以肯定是,读得越多写得越多阻碍越小。**
实习两个月之后,导师对我的评价是:你的能力达不到我们预期。再之后,就有了我申请调换岗位的故事。
