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