阅读代码,是最真实的收获;
阅读文章,是自我意识的不断提升;
持续学习,才是程序员的人间正道!
这是一篇英语好文翻译。原文链接《How to quickly and effectively read other people’s code》

如何快速有效的阅读别人的代码

作者:Alex Coleman | Learning, Web Development


就在前几天,一个STCer(自学成才的程序员)朋友问了我下面这个问题:

你会如何去理解别人的代码?我在阅读自己的代码的时候感觉非常舒服,但是无论何时当我尝试看别人写的东西的时候,我就会感觉非常迷茫。我知道这是不可避免的,尤其是在文档很少(或者根本没有),但是我现在没有任何策略。有什么可以立即见效的的小提示吗?

我喜欢这个问题,有以下几个原因:

  1. 我将介绍理解别人代码的方法将会帮助你:
    1)更好的理解自己的代码
    2)帮助您提高速度和轻松地理解您所接近的所有新代码块
  2. 它阐明了学习一项新技能的一个最重要的方面,比如编程:接触高数量、高质量的专业例子

这里有很多值得学习的地方,让我们开始吧。

什么是最好的方法去阅读别人的代码

我发现的最好的阅读别人代码的方式是以下几点:

找一个你知道这个代码在做的事情,并且从最后开始跟踪这个动作。

举例来说,你知道这段你正在看的代码,最后会生成一个带有一系列电影名称的文件。找到产生这个文件的具体的几行代码。

然后,倒退一步,并且找出它是如何在文件中放置信息的。

然后,再倒退一步,并且找到这个信息从哪里获取。

等等…

让我们称这些连接的代码片段为一个“动作链”

毫无疑问,使用这种方法将会导致你将不同位置的代码想成一个整体。这会给你带来对事物很强的洞察力,例如:

  • 代码体是如何被组织的(变量被定位在哪里?不同类型的方法被定位在哪里?等)
  • 这个人的编码风格
  • 写代码的人是如何思考编码和解决问题的(这是很难被描述的,但是找个比你去看例子更加直观)

[一个大的代码文件,很多你都不理解]

你应该看成:

[仍然是一个大的代码文件,但是你现在理解少数特定的部分]

就好像你待在一个漆黑的房间,然后,一次打开一盏灯,不同的灯在这个房间被打开,让这个房间的样貌的更多细节揭露。

冲洗并且重复

重复那个过程多次,你将会快速的增加越来越多的整个代码块的片段的你的理解。

随着你理解代码如何发挥他的功能,就像漆黑房间逐渐明亮,代码也会逐渐“明亮”。

这个工作的原因是,在所有情况下,代码的主体被设计是为了处理一个(或者更多)复杂的问题。所以你应该总是有这些“动作链”思想。

并且,你越能理解代码的不同部分是如何连接的,你就越能理解整个代码库,作为一个整体。

你看的(好)代码越多,阅读和理解所有的代码就会变得越容易,同样也会越快。

这也直接导致我喜欢这个问题的第二个原因:它强调了接触高数量、高质量的专业知识实例的重要性。

用编程的语言来说,“高质量的专业知识实例”=其他程序员写出来的好代码。

接触高数量、高质量的专业知识实例的重要性

Kathy Sierra,在她令人难以置信的深刻的新书,《Badass: Making Users Awesome》,中写道,接触高数量、高质量的专业知识实例是人们如果快速高效的学会新技能的两个重要的因素之一。(另一个是刻意练习)

你看(或者听)专业案例越多,你就会变得越好。你接触到的专家或专家工作的结果越少,你发展专业技能的可能性就越小。

让我们来看看第一个例子,很清楚地出现在每个人的脑海里:鸡性别鉴定。开玩笑。但事实上,它是这个概念的一个很好的展示。

从鸡的性别鉴定中学习(是的,你没有读错)

什么是鸡的性别鉴定?什么是在接触高数量、高质量的专业知识实例的过程中不得不做的?Kathy解释道:

“判断刚出生的小鸡的性别是总所周知的难,但是对于大量商业养鸡农村,越早将雌鸡从雄鸡中区分,就可以越早让这些雌鸡享受到为了生蛋的饲养方法。在1990年早期,日本人发明了一种特殊的方法来辨别鸡的性别和一些专家(可靠,准确的鸡的性别辨别者)。
好的,我们让这些专家教别人,可以吗?只有一个问题:当被问到,这个鸡的性别辨别专家不能准确地知道他们是怎么做的,’我就是知道这个鸡的性别‘”

所以他们是如何训练的呢?好的,假设你一个新的鸡的性别辨别者,你被放在一个装满小鸡的箱子前面。问题是:他们看起来确实一模一样,但是你仅仅被告知去抓一起起来,猜他的性别。就你而言,你的猜测完全是随机的。但是塞Sierra继续说道:

“在每个疯狂的、随机的、完全编造的猜测之后,鸡性别鉴定师会给你反馈。对,错,错,对。你仍然没有任何相关,专家是如何‘知道的’,但是你只是坚持下去,一遍又一遍。
最后,一些事情发生了。你开始得到比随机更好的分数。你变强了。随着时间的推移,强了更多。但是你不知道为什么。你所知道的所有,就是猜,但是现在一些‘神秘’的力量直到你的手去正确的箱子”

所有这些“魔法”是如何发挥作用的?Sierra把它带回家:

“ 在解除了足够多的反馈后,你的大脑(开始)探测模式和潜在结构,而你没有意识到。接触越多,你的大脑就会对感知进行微调,最终弄明白什么才是真正重要的。即使你无法解释,你的大脑也能更精细地区分并从噪音中分类信号。
知觉知识包括我们所认为的专家直觉。能够立即知道下一步棋该怎么走。或者这幅画是赝品。或者这房子会着火。或者代码有问题,即使你不能总是清楚地说明你是如何知道的。”

这在编程中如何发挥

最重要的是,要知道编程的时间越长——因此看到的各种不同类型的代码示例越多——就越容易理解其他人的代码,做得就越快。

这是一个奇妙的自我循环:你读了更多的代码;你将获得更快更有效地理解它的能力;所以你可以读更多的代码;等等。

而且它还不止于此:你还将在自己的编码中看到巨大的积极收获。何以见得?

  1. 您将能够更快地理解在您自己的编程过程中不可避免地引用的代码示例和示例(例如:来自网络课程的东西;或来自StackOverflow帖子的片段)
  2. 你可以一眼就看懂你以前写的代码。(而且,不可避免的是,您将同时处理许多不同的代码片段,因此这种能力将带来巨大的回报。)

最终,这将转化为:

  1. 少停顿
  2. 多进步

这=更有趣,更令人愉快。赢了!
你最好相信…

后面就是广告了,就不翻译了。

参考文献

10 Techniques That Will Make You Understand Other People’s Code Better

如果快速有效的读懂别人的代码?相关推荐

  1. 如何快速读懂别人的项目

    作为入行未深的初级程序员,因为工作需要接手了别人的项目做优化,才发现已入苦海,因为可能原作者比较清楚程序的架构以及每行代码的含义所以很多地方没有进行注释.程序中一些变量以及定义都是使用的缩写,所以弄懂 ...

  2. 如何快速看懂别人的代码

    我们在写程式时,有不少时间都是在看别人的代码.  例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,  就会"噜看噜苦(台语) " 不管是参考也好,从开源抓下来研究也好,为 ...

  3. 怎样高速读懂别人的项目

    作为入行未深的0基础程序猿.由于工作须要接手了别人的项目做优化.才发现已入苦海,由于可能原作者比較清楚程序的架构以及每行代码的含义所以非常多地方没有进行凝视.程序中一些变量以及定义都是使用的缩写.所以 ...

  4. 看懂别人的代码,和自己能写代码是两回事

    看懂别人的代码,和自己能写代码是两回事--在理解了别人代码中功能后,自己还是要多动手实现 -- 往往这个时候才能有更大的收获. 转载于:https://www.cnblogs.com/lazyboy1 ...

  5. 看懂别人的代码,只是成为高效程序员的第一步!

    作者 | SeattleDataGuy 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 在为面试做准备的时候,很多软件工程师都花费了大量时间做编程题和完善简历. 最终在找 ...

  6. 快速完成和读懂测试计划

    每个项目测试计划都会不一样,但是一般情况下,每个公司都会有相应的模板,尤其是项目很频繁的公司,相对应的模板应该就更全面,并且更容易修改,更能适应新项目. 并且,经常接触测试计划的人可能会察觉到,实际上 ...

  7. 诸葛亮如何通过谈话读懂别人

    诸葛亮作为我国古代著名的政治家,就十分强调作为领导者要善于知人.他在一篇文章中写道,不同的人,"美恶悬殊,情貌不一","有温良而伪诈者,有外恭而内欺者,有外勇而内怯者&q ...

  8. 初学者怎样看懂python代码_Python零基础入门-(如何让人读懂你的代码)文档注释

    目标注释的作用 单行注释(行注释) 多行注释(块注释) 01. 注释的作用使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性 02. 单行注释(行注释)以 # 开头,# 右边的所有 ...

  9. devc中文注释显示问号_Python零基础入门-(如何让人读懂你的代码)文档注释

    目标 注释的作用 单行注释(行注释) 多行注释(块注释) 01. 注释的作用 使用用自己熟悉的语言,在程序中对某些代码进行标注说明,增强程序的可读性 02. 单行注释(行注释) 以 # 开头,# 右边 ...

最新文章

  1. 【渝粤教育】 国家开放大学2020年春季 1167环境水利学 参考试题
  2. asp.net使用include包含文件中文乱码_C++: 编写自己的头文件
  3. 大数据如何改变企业的业务
  4. Data Warehouse
  5. 修改mysql字段长度
  6. C语言判断完数(完整版)
  7. 163设置邮件服务器,网易邮箱设置Exchange服务教程
  8. 软件测试优秀员工发言稿,2018软件测试国赛获奖感言|2018年优秀员工获奖感言
  9. 原生开发什么意思_原生app开发是什么意思?
  10. 文档计算机无法分页,word文档总是重新分页 word文档老是分页显示怎么解决
  11. android 免root 安装xposed,xposed框架免root安装|VAExposed(xposed框架免root版本)1.97最新版 - 维维软件园...
  12. 命令行帮助文档语法格式详解
  13. 戴尔服务器重装系统识别不到硬盘,戴尔台式机重装系统(戴尔台式机重装系统找不到硬盘)...
  14. python多次登录教务系统_python3模拟登录正方教务系统
  15. 戴尔笔记本,快捷键无法调节屏幕亮度,有图标显示,就是没有调节效果
  16. rtk手簿Android代码,基于Android平台的GPS-RTK手簿系统
  17. arpspoof实现内网欺骗
  18. 短音频识别(一句话识别)接口设计方案
  19. 计算机编程国际赛事,中小学生学习C++编程可以参加的赛事
  20. FLASH学习资料整理

热门文章

  1. 语雀导出html,博客搭建
  2. 不染计算机演奏教程,Keyshot渲染教程(上集):夏天快到了,不请你的电脑喝一杯冰可乐吗...
  3. 什么是GoogleNet?什么是Inception?GoogleNet结构详解(2014年)
  4. 硬件工程师c语言编程,硬件工程师:单片机编程,我用C语言
  5. 瞎聊机器学习——LR(Logistic Regression)逻辑斯蒂回归(一)
  6. python装饰器特性iy雾_扣丁学堂简述Python 装饰器装饰类中的方法
  7. js获得form表单的值$('#form1').serializeObject()/serialize()/serializeArray对比及判断表单中是否有输入框未输入值
  8. 给排水计算机应用电子版,给排水规范大全
  9. MLX90640 红外热成像仪测温传感器模块开发笔记(十) 成果展示-红眼睛相机
  10. Qt中关于delete的应用