学习如何理解代码以成为更优秀的程序员
为什么一些程序员似乎有某种神奇的能力在眨眼之间从代码中提取其意义?
为了尝试回答这个问题,我深入到了科学所认知的我们如何理解代码的方式中去。
事实证明,我们对代码理解心理学 有了很多的认识,我们可以用这些知识来改善程序员的程度。它允许你拓展在理解过程中的所有方面,因此你不会在编程技巧上遇到瓶颈。
在这篇文章中,我将看看我们对于程序理解的了解,并讨论了三种可使用的知识,以成为更好的程序员。
为了理解代码你就必须构建一个心理模型
编程的第一步是构建问题的 心理模型 ,以便你可以完成该任务。你的心理模型是理解问题或程序的驱动力。
从屏幕上的代码到头脑中的模型的旅程遵循完全理解的进程。我们对流程的理解绝非完整,但我们所知道的知识可以被用于识别要重点改进的区域。
我们来看看我们如何理解代码。
- 你的心理模型是由通用知识和专业知识之间的配对所构成的
- 你用于理解代码的知识或是通用的编程知识或是软件特定知识。
通用知识包括关于计算机科学概念、编程语言、框架和编程准则的知识。大多数教程将侧重于这种类型的知识 - 例如设计模式、高效 web 堆栈、已认证的企业架构、通常适用于各种解决方案的任意其他内容。专业的知识是你正在从事的特定程序或问题的知识。
形成心理模型包括将你正在阅读的代码与你现有的通用和专业知识关联起来。“这是一个类,这是一个循环,这个函数是按价格过滤发票。”
这些类型的知识都可以是新的或现有的。有时你需要学习新的通用知识来解决问题。例如,轮巡调度程序的工作原理。专业知识往往比现有的更新,但是有时你将,通过与特定代码库的历史记录相关的方法,获得您目前正在开发的程序的现有知识。
你的心理模型包含与此问题相关的通用和专业知识之间的一系列链接。
这些配对是通过制定、验证和修改假设形成的
我们形成配对的方式是给出假设。
- 假设你发现你在代码中识别的一些东西。一个提醒你一些更高层次概念的指引。“ 那个循环看起来像是一个排序 。”
- 然后,你将寻找方法来验证这一假设。 “ 让我们看看是否在循环中交换了这两个项。 ”
- 之后,我们会修改假设或接受它,并开始寻找新的假设,建立在我们刚才所做的假设之上。
你可以预测某些东西究竟是什么,找到方法来证明或反证该预测,根据结果进行修改,并重复这个过程。
那么这如何有助于我们成为更好的程序员呢?
有三种方法可以使能成为更好的程序员:
你要知道理解代码的能力取决于三件事情:
- 知识 - 解决问题的基石。
- 链接 - 基石之间的胶合剂。
- 假设 - 形成链接的工具。
很明显,更善于编程方面需要一个整体的方法。
1. 你可以获得更多的通用知识
由于你理解代码的能力取决于你在现有知识和您想要解决的问题之间进行的匹配的次数,因此如此认为貌似是合理的:你用于自己工作中用到的知识越多,你就越可能获得成功。
作为程序员,我们将自己很大一部分时间来用于获取新知识。如果你想保持在技术世界中的同步,这是必要的。为了充分利用你的研究, 聚焦在原则而不是技术上 是很重要的。
考虑到这一点,我们来看看你可以添加到你的知识包中的知识类型:
语言相关知识
语言相关知识是许多开发人员所关注的领域。
这是关于学习你所选择的语言或框架的细节。了解API和语言构造,找到语言中怪异行为,并明确知道其中后台是如何工作的。
这类知识通常很容易找到好的课程和信息。
这类知识是至关重要的,每个开发人员都需要知道他的工具集内外细节。
这类知识的问题是总是有更多的知识。一个新的框架出来了。该语言的下一个版本发布了。你知道这个知识的时间越长,就变得越有价值(知道如何读取打卡不再是一个热门技巧了)。
编程概念
这类知识具有更长的生命期。在20年的时间里,排序算法依然是一种排序。
计算机科学学位要在这些主题上耗费大量的时间。你也将学习这些概念作为学习语言和框架的附属品。从语言或框架中学习这些概念的问题是,有时难以将基础概念与其在语法中的表达方式分开。
一些语言在表达某些概念时也会很好或者很糟糕。了解一些不同的框架和语言在此是有一些帮助的。另一种选择是先学习概念,然后学习如何应用于不同的语言。找到采用这种方法的信息和课程要难得多。这些概念包括模式、算法、数据结构等等。
领域知识
了解你正在从事的行业为你提供了一套额外的用于心理建模的非编程概念。例如,了解投资工具的工作原理有助于你理解处理投资工具的代码。
2. 你可以更善于将代码与通用知识做匹配
一旦你有足够的通用知识,你可以专注于更好地形成匹配规则。如果你知道在代码和实践中找到特定线索来识别他们,你将很快从代码中提取意义。
学会识别代码中的信标
代码信标是你的代码中的模式,暗含了一个基本概念。这些模式可以跨越不同程度的复杂性。它们是代码的代码片段,用于照亮更高层次概念之路。
例如,当你看到遵循此模式的代码时:
在数组中迭代元素。基于此条件在新数组中添加元素。
你知道你正在处理一个过滤器。
将这段代码视为“一个过滤器”,而不是“一个循环,其中包含一个 if 条件,然后将一些旧数组中的元素项放到新数组中”,这使得你可以同时在头脑中保存更多的想法。你把一些小小的想法合并为一个更大的想法。
在传统的软件开发中,“模式”是指闻名的四人帮一书—— 设计模式:可重用的面向对象的软件元素 。虽然代码信标和设计模式是相关的,但它们并不是一个概念。例如,设计模式中也有代码信标。
学习 Discourse 规则
discourse 规则是在框架或语言中使用的惯用法和编码风格。就像谈话中的对话规则一样,他们在程序员的心中设定了期望。你在 Ruby 和 C# 中的对方法的名称是不同的。Rails 充分利用了 MVC 模式,其他框架并不这样(例如 Meteor.js )。
编写遵循期望的 discourse 规则的代码使代码更容易理解。即使对专家要求亦如此。
这一点来的非常自然,你从阅读示例代码或你的同事那里获得这些规则。有时候迁移到新的语言或框架时,这是值得特别留意的。这是一种在新语言中感觉更舒适的快速方式。
3. 你可以更善于建立和修改假设
最后一个难题在于更善于建立和修改假设。你构建的一个可能是正确的假设越好,你就能越快建立心理模型。
使用系统方法
建立心理模型的系统方法涉及阅读每一行代码,并随着代码的阅读,建立你的认识。它通常产生最好的结果,但是对于较大的代码库来说很快就变得不可行。这最适合于具有可控大小的非常关键的代码。我发现这在现实世界中相当少见。通常,你会与多年来已发展壮大的、庞大的代码库打交道。
使用机会主义方法
通过机会主义的方法,你可以查找有趣的代码片段,形成关于它的功能的假设,然后开始深入进去,看看你是否处于正确的轨道上。在语法层面和较高级别的抽象层面上,擅长识别标识真的有助于你形成更好的假设。
相对于完全理解,这种方法并不是很好,但是你可以更快地获得相对较好的理解。 这也很容易导致快速修复,然后破坏一些你不明白的系统的其他部分,所以要小心。
要成为世界级的程序员,你需要全部掌握以上三点
我们都想成为我们可以成为的最好程序员。在当今技术世界中,事情一直发生变化,紧跟所有最新的框架和方法论可能非常具有挑战性。幸运的是,相比于其他程序员,你可以从本文中获得优势。如果你知道要寻找什么,并且可以认识到你的弱点,你可以在相同的努力付出前提下获得更进一步和更快速的进步。