前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单代码的秘诀

简单代码的秘诀

作者头像
一只图雀
发布2020-11-04 14:27:32
5700
发布2020-11-04 14:27:32
举报
文章被收录于专栏:图雀社区

原文链接: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·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图雀社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象是简单代码的关键
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档