AICon 深圳站聚焦 Agent 技术、应用与生态,大咖分享实战干货 了解详情
写点什么

增进编程技能的万全之计

  • 2016-12-26
  • 本文字数:2595 字

    阅读完需:约 9 分钟

编者按:本文最初是在 2010 年 5 月为 Fuel Your Coding 撰写的,然而该网站现已关闭,为了能让更多人读到,我重新发布了本文。我曾想过针对技术的最新发展对本文进行更新,但原有内容其实已经很棒了。有些内容由于过时显得有些好笑,不过总的来说还行。请慢用!

增进编程能力最明显的方式就是尽可能编写更多代码,这一点大家都清楚。然而我保证还可以通过另一种与写代码完全“背道而驰”的方式增进你的编程能力。下文将尽可能清楚地介绍这种方法:

如果希望大幅增进自己的编程技能,你还需要阅读别人写的代码。

信不信在你。其实你应该相信。如果愿意一试,我相信你会觉得这么做所付出的宝贵时间是非常值得的。

本文将帮你选择可供阅读的代码,并介绍最佳阅读“姿势”。如果已经习惯于阅读别人的代码,你可能已经总结出其他更适合自己的方法。但如果还没这么做过,那就抓紧时间开始阅读吧。

读什么

这个问题很重要,也很难给出具体建议。我并不会按照自己的想法直接给出建议你去阅读的代码,因为这完全取决于你的具体情况。我会提供一些指导,帮你选择适合自己阅读的内容。

阅读你所依赖的代码

首先可以读一读你目前正在使用的任何插件或库的代码,例如:

  • 某个你非常喜欢的 WordPress 插件的代码
  • 某个你觉得很有用的 Ruby gem 的代码
  • 某个你经常用到的 jQuery 插件的代码

这些东西都很适合阅读。你已经非常熟悉它们的公开 API,因此理解其内部工作原理的障碍会显得小很多。此外作为这些代码的用户,你还可以借机为其贡献文档,实现新的功能,或通过其他某种方式回报相关的项目。

阅读让你印象深刻的代码

还记得当我第一次看到 280 Slides 后产生的想法:“这真是让人印象深刻。”很快我发现驱动这个网站的代码来自一个开源的 Cappuccino 项目。我将这一发现深藏在脑海中,最后当我开始参与使用 Cappuccino 构建的另一个让人印象深刻的应用时,我知道这个项目可以从中获益匪浅。最近有什么东西让你印象深刻吗?是否是开源的?如果是,那么也许很值得一读,因为代码本身可能会像应用程序一样让你留下深刻的印象。

阅读你所敬重的人写的代码

如果从事开源软件的开发有一段时间了,你也许已经有了几个自己敬重的程序员。我脑海中就时常浮现着几个程序员,他们写的代码堪称惊艳。

就算暂时想不到这样的人,其实这样的人也很好找。例如上文提到的两类代码(你所依赖的代码,让你印象深刻的代码)的作者就是不错的候选人。

阅读你可以完全领会的代码

如果是那种有冒险精神的人,你可能会考虑读读诸如 Ruby on Rails、Drupal,或 jQuery 等大型项目的代码。我个人建议一开始尽量别选择这种项目,除非你本身已经是非常有经验的代码阅读者。

大型项目往往包含很多组件,最终你可能会过度地纠结于从各种现成的成果中学到知识这一概念本身。困惑往往会导致挫折,大型项目通常更容易让人困惑,进而让你的阅读积极性受挫。选择一个小型项目来阅读,这种做法的优势在于你可以在自己的脑海中全盘掌握整个项目的逻辑,进而只需要发现各种细节并从中学习就行了。

如何读

选好要阅读的代码后,最佳阅读方式是什么?我平时阅读过很多代码,可以提供几个能帮你获得最大化收益的方法。

从大局着眼

假设你至少已经能在宏观层面了解自己要阅读的代码所实现的功能。如果还不了解,建议阅读项目的网站、教程、文档,以及除了代码本身之外,其他任何能让你对整个项目获得更深入了解的东西。

厘清这件事之后,建议首先全局了解整个项目的结构。取决于所选项目代码基的规模,具体的工作量可能各异,但任何超过一个文件的项目可能都需要花费略多一些的时间。

首先需要注意文件结构,为此可以选择可以体现文件夹层次结构的编辑器,如 TextMate。例如 Twitter Ruby gem 的结构是这样的。

这一步的目标在于熟悉源代码本身。确定哪些文件包含 / 需要 / 加载了其他文件,大部分代码在哪个文件中,是否使用了任何名称空间,以及其他一些本质特征。获得了宏观的了解后,可以开始深入细节了。

记录你的发现和结论

代码的阅读不应该是一种被动行为。建议你能在阅读的同时添加自己的备注,随着对程序流程的理解逐渐深入,记录你的猜测和结论。一开始你的备注可能是类似这样的:

  1. # 我觉得这个函数需要在'initialize'之后调用
  2. # 这个公式是做什么用的?
  3. # 可以确定在 17 行之后这个函数失去范围了

随着理解的深入,也许可以陆续删除一开始留下的浅显的备注,并开始写一些更有意义、更权威,甚至能对整个项目产生真正回报的备注。

一定要测试

希望你所选择的项目提供了测试套件。如果没有,那么本节内容可以全部跳过(或者找个提供测试套件的项目)。

阅读其他人写的代码时,测试是一种很好的起点,因为其中记录了不同代码本应实现的功能。一些测试可能包含更翔实的信息,但无论测试写得多好通常你都会发现,从测试中了解到的程序员的意图往往要比你自己从具体实现中的判断简单很多。在阅读的同时,可以试着让测试套件成功运行,这样可以确保你的开发环境已正确配置,进而让自己进行各种改动的时候更自信。

执行,修改,执行

谁说读代码就只是“读”代码?如果能将一切拆解又重新组装起来,才能获得真正的理解。还记得做过的各种测试吗?让测试失败几次,增加一些内容,或在不产生破坏作用的情况下试着更改具体实现。试着增添一些你觉得酷的小功能,或者配置项目级的日志并将不同阶段的代码打印输出。这也算“读”?当然!不过此时更像是自己身临其境的历险,而不仅仅是阅读别人写好的推理小说。这是一种很棒的做法!

周而复始的重复

读完一个代码基后,挑选一个新的再次开始这一串过程吧。读的代码越多,阅读的收获就越多,获得这些收获所需付出的时间则会越少。我认为你会发现自己在时间方面的投资回报会飞速增加,并且整个学习过程会编程更愉悦的体验。

从何处着手

我阅读的代码大部分都来自 GitHub 。通过这个网站可以很轻松地找到各种新项目和高水平的程序员,如果不能充分利用,那绝对是你自己的损失。我建议从 GitHub 着手,阅读各种代码,直到找到能给自己带来收获的项目。然后git clone,开始阅读吧!

你呢?你是否将阅读代码作为一种学习方式?你是否有什么项目推荐给大家?最近有读到什么很棒的代码吗?

作者 Jerod Santo 阅读英文原文 One Sure-Fire Way to Improve Your Coding


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-12-26 16:302299
用户头像

发布了 283 篇内容, 共 118.5 次阅读, 收获喜欢 63 次。

关注

评论

发布
暂无评论
发现更多内容

家装工业软件的云挑战

三维家

c++ 云原生 webassembly 云计算, 开源工业软件

Linux 环境-TiDB组件进程维度的监控实现

TiDB 社区干货传送门

监控

【容器篇】Docker怎么限制资源使用

技术小生

Docker 7月月更

leetcode 605. Can Place Flowers 种花问题 (简单)

okokabcd

数据结构与算法 贪心算法

送你的代码上太空,与华为云一起开发"最伟大的作品"

华为云开发者联盟

云计算 代码

分布式数据库技术前瞻

TiDB 社区干货传送门

数据库架构选型 数据库架构设计

PD-Server GRPC 接口图解

TiDB 社区干货传送门

TiKV 源码解读

TiKV & TiFlash 加速复杂业务查询

TiDB 社区干货传送门

实践案例

活动预告|Apache Doris x Apache SeaTunnel 联合 Meetup 开启报名!

SelectDB

数据库 数据仓库 数据湖 Doris Seatunnel

盘点波卡生态潜力项目 | 跨链特性促进多赛道繁荣

One Block Community

区块链 科技

波卡创始人 Gavin Wood:波卡治理 v2 会有哪些变化?

One Block Community

区块链 科技

知乎高赞:数据中台——风起阿里,成于DaaS

雨果

阿里云 DaaS数据即服务

昇腾AI创新大赛两大赛道怎么选?拿好这篇攻略就够了!

科技热闻

福昕软件亮相2022年全国化工企业数智化转型发展论坛

联营汇聚

埃森哲22年《技术展望》报告:数字化转型将迎来下一个十年

雨果

数字化转型

中国人力资源数字化生态图谱-灵活用工市场

易观分析

人力资源产业

Spring Cloud之配置管理

Damon

7月月更

想成为精英级开发者?请逼自己养成这10个习惯

雨果

程序员 开发者 精英

IM即时通讯如何让企业远程办公更简单高效?

BeeWorks

【直播回顾】OpenHarmony知识赋能六期第三课—OpenHarmony智能家居项目之控制面板功能实现

OpenHarmony开发者

OpenHarmony

剧说职场:资深HR告诉你职场强人都有什么特征

雨果

职场

C# 使用ToolTip控件实现气泡提示

IC00

C# WPF 上位机 7月月更

让企业数字化砸锅和IT主管背锅的软件供应链安全风险指北

FinClip

「开源摘星计划」Harbor高可用集群设计及部署(实操+视频),基于离线安装方式

腾源会

Harbor 腾源会 开源摘星计划

西山居如何用 ONES 打造游戏工业流水线?|ONES 行业实践

万事ONES

在 Polkadot 中进行创建的三种方式 —— 平行链、平行线程、智能合约

One Block Community

区块链 科技

基于eTS高效开发HarmonyOS课程类应用

HarmonyOS开发者

HarmonyOS

AI简报-模型集成 SAM 和SWA

AIWeker

深度学习 7月月更

什么是主动元数据?为什么Gartner预测它是元数据管理的新方向

雨果

元数据 DaaS数据即服务

什么?你还不知道Symbol?

是乃德也是Ned

JavaScript 7月月更

腾讯大咖分享 | 腾讯Alluxio(DOP)在金融场景的落地与优化实践

Alluxio

腾讯 OLAP 金融 Alluxio 大数据 开源

增进编程技能的万全之计_语言 & 开发_Jerod Santo_InfoQ精选文章