简单代码的秘诀

2020-11-04 14:27:32 浏览数 (1)

原文链接:https://medium.com/javascript-scene/the-secret-of-simple-code-a2cacd8004dd

成为10倍开发人员有捷径可走吗? 是否有这样一个神奇的秘密,可以帮助我们打开一个全新的软件开发精通和生产力世界?怀疑者们通常会说:“当然没有捷径可走! 每个人都需要不断的练习才能变得更好!”

的确如此,但是软件生产力实践的专家是什么?有没有一件可以产生巨大变化的关键事情?答案是有的!但是,即使我现在拿出来分享,一字一句讲给你听,可能你还是需要要花10年才能有足够多的经验来领悟它极致的简单性。

是的,这就是发生在我身上的事情。 我上学时候的程序设计老师用通俗易懂的话给我讲过一遍,并且用一些示例代码一步步教我如何去运用它。 然而直到10年后,我才真正理解。 但是现在,凭借过往的经验,我深深地体会到了这堂课的意义,我现在就分享给你。

这个秘密是平均生产率和10倍生产率之间的关键区别,如同杠杆一般,可以让我们把效率提高几个数量级。

生产率提高10倍的秘诀是学会如何抽象(Abstraction)。 许多开发人员将“抽象”视为一个脏话。 也许你会经常听到这样的建议,例如“不要过早抽象”或 Python 之禅中著名的“显式胜于隐式”,这意味着具体(Concrete)要胜于抽象。 这些建议都是很有价值的,不过也得看问题的上下文。

现代应用程序的代码量普遍很大。 如果我们把现代十大应用程序的源代码打印出来,那么这些纸叠起来的高度将可以比得上一座摩天大楼,由此可以想象软件的维护成本有多高。 也就是说,写的代码越多,成本就越高。

抽象是简单代码的关键

正确的抽象可以隐藏对当前上下文不重要的细节,并减少执行相同工作所需的代码量(通常减少几个数量级),从而使代码更具可读性,适应性和可维护性。

简单就是去掉显而易见的,加上有意义的。——John Maeda《简单的法则》

抽象并不是一条单向路。 它实际上是由两个互补的概念构成的:

  • 泛化(Generalization)——删除重复的部分(显而易见的部分)并将其隐藏在抽象后面。
  • 特化(Specialization)——将抽象应用于特定用例,仅添加需要不同的内容(有意义的内容)。

考虑以下代码:

代码语言:javascript复制
const doubleList = (list) => {
  const newList = [];
  for (var i = 0; i < list.length; i  ) {
    newList[i] = list[i] * 2;
  }
  return newList;
};

这些代码本质上没有错,但其中包含许多琐碎的细节,对于特定应用而言可能并不重要。

  • 它包含正在使用的容器/数据结构(数组)的详细信息,这意味着它仅适用于数组。 它包含状态形状依赖性。
  • 它包含迭代逻辑,这意味着如果其他操作也需要访问数据结构中的每个元素,则还需要在该代码中重复非常相似的迭代逻辑,这就可能违反 DRY(Do not Repeat Yourself)原则。
  • 它包括一个显式赋值,而不是以声明方式描述要执行的操作,太冗长了。

这些都没有必要。所有这些都可以隐藏在抽象后面。在这种情况下,这种非常通用的抽象方法改变了现代应用程序的构建方式,并减少了我们需要编写的显式for循环的数量。

当你带着深刻的觉知触及了一个事物, 你就触及到了一切。——释一行

通过使用 map 操作,我们可以通过删除明显的代码(我们可能会在相似的代码中重复的部分)并将代码集中在有意义的代码上(只是需要与我们使用的代码有所不同的代码),从而简化成一行代码:

代码语言:javascript复制
const doubleList = list => list.map(x => x * 2);

初级程序员认为他们必须编写大量代码才能产生很多价值。而高级程序员了解无需编写任何代码的价值。

想象一下,作为一名程序员,他在像JavaScript这样的编程语言中广泛使用了map操作。Map 操作抽象了被操作的数据节点的类型,包含该数据的数据结构的类型以及每个数据节点的迭代逻辑。过去十年来,它提高了我开发的每个应用程序的效率。

Jeremy Ashkenas 使这些操作在 JavaScript 中变得很流行,并且通过开创性的 CoffeeScript,为目前 JavaScript 中理所当然的许多重要的快捷语法奠定了基础。 他开发了 Underscore 和 Backbone,Underscore 产生了 Lodash(至今仍然是 JavaScript 中最受欢迎的工具库之一),Backbone 则使 JavaScript 中的 MVC 架构得以普及,并为 Angular 和 React 奠定了基础。

John Resig 开发了流行和有影响力的 jQuery,它形成了可重用的,封装的 JavaScript 模块(jQuery插件)的最大集合,直到几年后标准的 Node 模块和 ES6 模块出现。jQuery 的选择器 API 影响深远,它构成了当今 DOM Selection API 的基础。当我对 React 组件进行单元测试时,我仍然几乎每天都会从 jQuery 的选择 API 中受益。

正确的抽象是可以极大地影响生产力的强大杠杆。抽象不是一个脏话。模块,函数,变量,类——所有这些都是抽象形式,它们存在的全部原因就是为了简化抽象和抽象的构成。

没有抽象就无法构建复杂的软件,甚至汇编语言也使用抽象——指令的名称,内存地址的变量,子例程(例如函数调用)跳转到的代码点等。现代软件是有用的抽象的多层蛋糕,这些层为您提供了杠杆作用。

给我一根足够长的杠杆和支撑它的支点,我将翘起整个地球。——阿基米德

简单的关键就是:如何减少我们正在生产的代码的数量,如何用更少的钱做更多的事情。掌握了这一点之后,您将成为10倍的程序员,我保证。

代码语言:javascript复制
● 你不知道的 WebIDE:5000字,剖析实现细节● UmiJS 中后台项目实践● 【读懂源码】React 架构的演变 - 从同步到异步

·END·

0 人点赞