资讯专栏INFORMATION COLUMN

我们一直谈论“写代码”,但你会“读代码”吗?

2i18ns / 626人阅读

摘要:只有能看懂代码,你才能快速准确地定位代码中的问题。要写出很的代码,少不了阅读优秀的源码。我们的论坛和答疑群里,有一些同学会查看并解答其他人的代码问题。实际上,我觉得就是没看懂你只是看懂了每一行代码的意思,但并没有理解整个代码的设计。

编程,又被称作“ 写代码 ”。这个说法有可能会带来一点点误解,让人觉得如何“写”是学习编程要解决的主要问题。但事实并非如此。尽管最终代码要在键盘上敲出来,但这个过程在开发中的实际时间占比可能要远远小于你的预期。编写之前的 设计 ,编写之后的 调试 ,以及 阅读 他人的代码,这些会花费比“写”更多的时间。

关于调试 debug,我们在上一篇文章 开发5分钟,调试2小时 - 该如何debug? 里已经有所介绍。今天说说另一个事情: 读代码

为什么要读代码

读代码通常有两种原因:一是 开发过程中不得不去读 ,二是 为了学习和提升编程能力

真实的开发中,很少有独自开发的项目,大多数项目都是 多人合作开发 ,或多或少都需要阅读别人的代码,了解接口和具体实现等。在软件公司里,你也极有可能 接手其他同事的代码 ,这通常不是个令人愉快的事情,但也得硬着头皮去读。哪怕你跟同事分工明确,耦合度极低,也没有接手“祖传代码”,那也免不了 使用一些第三方库和框架 。当使用中遇到问题而文档和搜索都无法解决的时候,读其源码是必须的。

开发中读代码大多数被动的。出于学习和提升的目的,主动读代码也很有必要。这也是我们今天讨论的重点:

1. 提高编程能力 。学习都要从模仿开始做起,不管是入门时候阅读教程里的示例代码,还是进阶阶段阅读优秀项目源码,都是很好的学习方式。否则没有标杆,仅凭自己闷头写,往往事倍功半。

2. 提高 debug 能力 。对代码的阅读,本身就是一种能力,是需要练习积累的。只有能看懂代码,你才能快速准确地定位代码中的问题。

3. 良好的代码风格 。Python 是一门优美的语言, Readability counts (可读性很重要)是写在 Python 之禅 里的。“开发”不仅要写可以执行的代码,更是 要写别人读得懂的代码 ,这对代码的维护和扩展大有好处。要写出很 pythonic 的代码,少不了阅读优秀的源码。

4. 交流学习的机会 。阅读别人代码的同时,一定也伴随着和其他开发者的交流讨论,这对一个开发者的成长是很重要的。我们的论坛和答疑群里,有一些同学会查看并解答其他人的代码问题。这个操作不仅是单纯地帮助别人,对自己也是一种的提高。更进一步,你甚至可以通过阅读代码参与到一些 开源项目 ,与高手交流。

如何读代码

既然读代码是有益且必要的,那么该如何读代码呢?这里给几点建议:

1. 有目的的阅读 。对于想通过阅读源码提升能力的同学,首先要明确自己的目标是什么。虽然读源码好处多多,但也不是人人都适合。在学习初期,还是应当 以系统学习为主 。否则连基本的语法、数据结构、函数、模块都还不够熟悉,直接看代码只能是一脸懵逼。等到了可以读源码的程度,也要选择 适合难度的代码 ,以及 自己熟悉或感兴趣的方向 开始阅读, 在精不在多

2. 自上而下,由表及里 。如果你想阅读一个外部库的代码,首先你应当去读下它的文档,了解它解决了什么问题,有哪些功能;然后再看看它的示例代码,如何被使用;最后才是开始看源码。阅读的时候,先看项目的文件结构,有哪些功能模块;再看类、函数的组织;最后再深入实现的细节。

3. 了解基本的设计模式 。设计模式不是具体的编程技术,却普遍存在于开发之中。找本设计模式的教程学一学(推荐《Head First Design Pattern》),再阅读代码,你会更容易理解别人为什么这么设计。

4. 选个趁手的编辑器 。你不可能用记事本或者自带的 IDLE 来阅读源码。熟练 跳转函数定义、跳转函数调用、查找、断点 等操作,你才能愉快地阅读源码。另外说句, 折叠代码 是个好功能,会让你更清晰地观察代码结构。这些 PyCharm 都可以给你,相关介绍可在 公众号对话里回复关键字 pycharm

5. 尝试动手修改 。看代码是单向的,更好的方式是边看边改,那怕仅仅是一些简单的输出也好。脑中设想下某段代码的作用,通过修改运行验证你的想法,这样的交互可以锻炼你对代码的理解。譬如我们的教程里有个 pygame 做的打飞机游戏 ,有些同学看了就会想,我能不能把子弹改成三排,能不能把敌机改成会左右移动等等。这样就会比你简单地看一遍再照抄一遍好很多。

6. 默写,对比 。当你认为自己理解代码之后,把它关掉,自己实现一遍,完成后再与原代码进行对比。很多同学跟我说过,代码能看懂,就是自己写不出来。实际上,我觉得就是没看懂:你只是看懂了每一行代码的意思,但并没有 理解整个代码的设计 。从简单的代码做起,重复这样的过程。

读哪些代码

说了那么多,到底该读哪些代码?

1. 教程里的代码 。新手不要急于求成,想一口吃成个大胖子。市面上评分较高的教程书籍,里面的代码都不会太差。认定一本后, 从头到尾的示例代码都认真地阅读、理解、运行(要手打不要复制) 。这是最简单最有效的方式,然而却并不是人人都能做到。依然有不少人宁愿相信只看几期在线视频就能学会。

2. 看官方示例的代码 。大多数优秀项目都提供了详尽的文档,包含 Quick Start、Tutorial 之类的新手引导 。在学习初期,这些代码就是很好的例子。比如我们之前文章这个男人让你的爬虫开发效率提升8倍 里介绍过的 requests 库,它的文档就很清晰,还是中文的。

3. 看 Python 的内置代码 。如果你用 PyCharm 之类的 IDE,很方便跳转或直接查看 Python 自身的代码。比如前文截图中就是我们常用的 random.py 的代码。可以从此类单文件代码看起。

4. 优秀的第三方库 。这类有很多,不过难度对初学者来说可能有一点高,可在进阶时考虑。依然是推荐下大神 Kenneth Reitz 的项目,不仅仅是 requests ,例如他的 records、envoy 等小项目也是值得一读的。另外有个经典项目叫做 500 line or less ,都是不超过 500 http://aosabook.org/blog/

5. 关于 代码风格 ,先读一读这份指南:

https://pythonguidecn.readthedocs.io/zh/latest/writing/style.html#code-style

-

上次我们的送书活动,征集了大家的许多代码。在此列出一些还不错的学生作品,有兴趣的同学可自行关注交流:

小说阅读微信小程序:https://github.com/moxier/BookApplet

工程师执业证书查询(桌面版):https://paste.ubuntu.com/p/rV3sTfVJdp/

EOS的桌面版辅助工具:https://github.com/oraclechain/eosdevhelper

Python3.x+Fiddler抓取APP数据(blog里还有其他很多不错的文章):https://segmentfault.com/a/1190000015571256

Maya绑定工具集:https://github.com/TDChina/Rigging-Tool

TensorFlow练习:https://github.com/difanyi/DeepLearning

恭喜被选中的 10 位同学。也感谢其他提交代码同学的积极参与,这里不一一列出。没有被选中也不用遗憾,项目本身就是你们给自己最好的奖励。之后我们还会有类似的活动。希望可能在下次看到你们的进步。

下课!

════

其他文章及回答:

如何自学Python | 新手引导 | 精选Python问答 | 如何debug? | Python单词表 | 知乎下载器 | 人工智能 | 嘻哈 | 爬虫 | 我用Python | 高考 | requests | AI平台

欢迎搜索及关注: Crossin的编程教室

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42533.html

相关文章

  • 如何保持学习编程的动力

    摘要:上次翻过一篇我是如何在自学编程个月后找到工作的,是一个编程自学者的经验之谈。如果你想通过学习编程来改善你的生活,你不该总想着这些快速成功的案例。 有人问我, Reddit 是什么网站,我想了下说: 美国贴吧 。 但话说回来,关注了一阵子我发现,Reddit 上的讨论真要比贴吧不知道高到哪里去了,甚至比不少知乎回答要有价值。而且感觉下面的讨论氛围也更好些。 我在上面关注了 learnpr...

    lastSeries 评论0 收藏0
  • 云计算未来是什么样子?

    摘要:年是云计算落地元年评判标准有两个至顶网各位网友大家好,这里是第七届中国云计算大会的现场,我们请来了青云黄允松接受采访。你认为云计算发展这几年是一个什么样的变化黄允松我特别喜欢谈论这种话题,我觉得其实到年一切都在预期中,但眼不见为虚。 在不久前在京举办的第七届中国云计算大会上,连续三次参加大会的青云QingCloud CEO黄允松接受了ZD至顶网的视频专访,分享了他眼中的云计算市场、互联...

    tulayang 评论0 收藏0
  • 数据工程师妹子养成手记——数据库篇

    摘要:是什么呀是一个和不太一样的数据库。怀疑是同时联了四个集合的数据造成的。这本书的定位是和的应用,所以有意弱化了数据库的搭建维护和底层优化。所以本书可能不适合数据库工程师。 这篇文章没有代码,请放心阅读。 程序员最宝贵的东西是生命,生命属于程序员只有一次。一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为搭建环境浪费时间而悔恨,也不会因为集群无法运行而羞耻。这样,在她开发的时候,...

    yexiaobai 评论0 收藏0
  • 数据工程师妹子养成手记——数据库篇

    摘要:是什么呀是一个和不太一样的数据库。怀疑是同时联了四个集合的数据造成的。这本书的定位是和的应用,所以有意弱化了数据库的搭建维护和底层优化。所以本书可能不适合数据库工程师。 这篇文章没有代码,请放心阅读。 程序员最宝贵的东西是生命,生命属于程序员只有一次。一个程序员的一生应该这样度过:当她回首往事的时候,她不会因为搭建环境浪费时间而悔恨,也不会因为集群无法运行而羞耻。这样,在她开发的时候,...

    atinosun 评论0 收藏0
  • 浅谈点感想(通篇废话),由学习方法想到的ML

    摘要:我认为深度学习是被过度炒作了。作为认知科学家,我也会从人类认知的角度去思考深度学习常用机制背后的原理,这些机制的好处我认为有很大一部分是让人感到困惑的。事实上,我们可以系统地看待深度学习效用的问题。 机器比人的最大优势可能是,不需要给自己打鸡血,他们就直接开算了。但是我们是人,我们是写机器学习的人,还是得给自己打鸡血。(这是什么意思,且听下文分析)SweetPoint Much lik...

    _Suqin 评论0 收藏0

发表评论

0条评论

2i18ns

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<