likes
comments
collection
share

小册上新 | 函数式编程,前端工程师的进阶必修课

作者站长头像
站长
· 阅读数 39

即使是在瞬息万变的前端领域,也存在一些具备“一次学习,终生受用”特性的知识。

在遥远的过去,函数式编程对于切图仔来说,或许还只是一门“有点意思”的选修课。但在2022年的今天,在前端应用复杂度呈指数级增长的现在,函数式编程无疑已经成为前端工程师进阶的必修课。这是因为,前端世界,乃至整个软件行业,都在越来越全面、越来越深入地拥抱函数式编程。

前端工程师,站在函数式编程的肩膀上

JS 是多范式的编程语言,它同时包罗了命令式、面向对象和函数式这 3 种编程范式。出于一些历史原因,在实际的工作中,不少前端同学可能会更倾向于写命令式/面向对象的代码,而且在我们接手过的存量代码中,命令式/面向对象代码在比例上也大都占据了绝对的上峰。但最近几年,这个形势发生了一些微妙的变化。

我们发现,越来越多的前端工程师开始使用函数式编程。这其中不仅仅包括早期那批由数学理论切入函数式编程的初代发烧友,更包括了一大票从未系统学习过函数式编程的开发者。

比如说,不管一个前端程序员懂不懂函数式编程,只要他基于 React 的生态去构建应用程序,那就很难不用到函数式编程。

因为 React 框架已经从语法/最佳实践的层面约束了用户的代码风格,确保不管什么背景的开发者,都能写出函数式的代码、构建出声明式的数据流。

也就是说,在自己完全不知情的情况下,你可能早已站在了函数式编程的肩膀上

函数式思想正在以越来越快的速度渗透前端生态,你是否思考过以下问题:

  • 为什么 React 选择逐步告别 Class 组件,拥抱“函数组件”?

  • 为什么 Redux 的 Reducer 必须是“纯函数”?

  • 为什么各路前端框架、小程序框架总在强调“不可变值”?

  • 为什么各厂的前端面试中,无论是问答题目还是 coding-test,都开始越来越频繁地考察高阶函数、柯里化、偏函数、compose/pipe 等函数式能力?

事实上,不管你有没有冲过函数式,这些轮子们已经先冲了,包括但不限于:

  • React
  • Redux
  • Ramda.js
  • Lodash/fp
  • Immutable.js
  • Immer.js
  • Rx.js(ReactiveX)
  • Webpack

......

在这些现代前端框架/库中,有的借助函数式思想实现了部分功能,有的则整个基于函数式思想来设计自身的软件架构。

基于此,畅销小册作者修言研制了一份接地气的编程“套路学”,借助海量图解+工程实践,带你深入函数式编程的“道”与“术”,提升编码硬实力!

修言,某外企前端 Leader,前阿里巴巴/滴滴出行/创业团队前端工程师。始终战斗在前端工程、研发质量和性能优化的第一线,拥有丰富的研发经验、面试经验和业务架构经验。深耕技术写作 5 年,专治各种疑难杂症,是《JavaScript 设计模式核心原理与应用实践》、《前端性能优化原理与实践》、《前端算法面试》等多本畅销小册作者。

编程“套路”学

真正的知识是本质的,它是从基础开始构建的。举一个数学例子,不先理解算术和几何是无法理解三角学的。基本上,如果有人使用很多复杂的词汇和很多大概念,他们很有可能不知道他们自己在谈论什么。我认为最聪明的人能把事情向小孩子讲明白。如果你无法向小孩子讲明白,那么你并不是真的知道。 ——纳瓦尔

从设计模式到函数式编程

既然函数式编程是“写代码”的学问,那么它和我们之前学过的设计模式一样,都属于是编程的“套路”。

事实上,两者之间也确实有许多互通的地方:

  • 它们都致力于解决软件设计的复杂度的问题;
  • 它们的着力点都在于“如何应对变化”;
  • 它们都引导我们用健壮的代码解决具体的问题用抽象的思维应对复杂的系统;
  • ……

然而,同为“套路”,函数式编程的学习曲线却比设计模式陡峭得多,在面试场景下也具备更高的区分度。但也正因为都是“套路”,我们曾经用来对付设计模式的那些学习方法,在函数式编程这里仍不过时。

在内容表达上,我们仍然会借助大量的图解+编码案例+现实生活中的体验类比,从具体的实践/感知去推导抽象的原理。在知识结构上,我们仍然会将大的知识体系拆解为“道”与“术”两个分支,知其然,更知其所以然。

整本小册的知识体系与格局,用思维导图展示如下:

小册上新 | 函数式编程,前端工程师的进阶必修课

从范式特征来认识函数式编程

在小册的开篇,我们首先会从范式的特征来认识函数式编程,解决“函数式编程是什么”的问题。与“特征”相对的,是“定义”。

如果你查询以“全面、详尽”而著称的 Wikipedia,大概率会得到一个令人费解的定义:

函数式编程(英语:Functional programming)或称函数程序设计、泛函编程,是一种编程范式。它将电脑运算视为函数运算,并且避免使用程序状态以及易变对象。其中,λ演算为该语言最重要的基础。而且,λ演算的函数可以接受函数作为输入参数和输出返回值。 ——Wikipedia

这条定义虽然信息量很大,但是数学浓度太高,我们土狗前端实在很难消化。这咋整呢?其实,对于编程范式来说,我们可以认为“特征即定义” 。就 JS 函数式编程而言,以下三个特征可以说是没跑了:

  • 隔离副作用,拥抱纯函数
  • 函数是“一等公民”
  • 避免对状态的改变(不可变值)

这三个特征,将会是我们探讨函数式编程之“道”的重要线索,也是我们后续实践函数式编程之“术”的基本依据。

数学不是玄学

不可否认,函数式编程始终是前端领域科普率较低的一块知识。造成这个局面的原因有很多,这其中,“晦涩的数学概念”可能是所有劝退因素中最首当其冲的一个。在本册中,修言希望能够站在实践的角度,引导大家重新去看待数学与代码之间的关系。

数学之于函数式编程,正如化学之于厨师。

厨师做菜,表面上靠厨艺,原理上靠科技。

这个“科技”不是说他往菜里加了多少添加剂,而是说烹饪这个过程,本身就伴随了许多的化学反应。比如烤肉那股香味,就来自高温加热蛋白质和碳水触发的美拉德反应;而米饭从生到熟的过程中,会发生糊化反应等等。

成为一个高级厨师,可能需要一些必要的化学常识作为背景,但未必需要精通化学反应原理。我们程序员写代码,也是如此。本着“以己之长学人之长”的原则,修言建议大家在学习面向编程的数学时 ,不必太拘泥于“由数学去推导数学”这个过程,而应该试着“用代码去推导数学”。

厨师在做菜的过程中,自然会通过现象去理解食物分子的变化。

而我们在编码的过程中,自然也能够通过代码的行为来理解数学的奥义。

这一点,随着学习的深入,相信大家会有越来越强烈的共鸣。

现在购买,享超值优惠

🔥12 月 12 日-12 月 21 日,上新 6 折特惠,仅需¥23.94

赶紧点击下方图片或者扫描海报二维码,和修言一提升编码硬实力,收获这份接地气的编程“套路学”吧!

小册上新 | 函数式编程,前端工程师的进阶必修课

转载自:https://juejin.cn/post/7176926070636019769
评论
请登录