结束语 JavaScript的未来之路:源于一个以终为始的初心 你好,我是石川。

今年,是不太寻常的一年。这一年,我们的思想都是比较割裂的,可能大家很难对某件事情有很强烈的共识。但是,我觉得有一点,大家的感触都差不多,就是如果我们给今年一个关键词叫做“不确定性”的话,很少会有人否认。

每个人都有认知这个世界的方式,我觉得对于我而言,JavaScript 作为一门语言就是我用来认知这个世界、去适应不确定性的方式。我们从这个专栏一开始的时候,就提到说 JavaScript 是一个本身不太严谨的语言,甚至有很多缺陷,但是这不妨碍人们围绕着 JavaScript 创建出不同的框架和库来克服这些问题。我觉得它的这种特质就很像我们自己,我们每个人都不是完美的,我们周围的环境也充满变化,但是这反而造就了我们的多样性,形成了一个多元的世界。

在今年教师节的时候,我收到了极客时间寄来的一本好书,叫做《把自己作为方法》。这本书是与社会学家项飙的对话。我最早了解项飙老师,是从他的《跨越边界的社区:北京“浙江村”的生活史》论文和《全球猎身》这本书开始的。之所以会提到他的作品,是因为项飙老师能打动我的地方在于他所提出的每一个观点都产生于个人经验。我们今天的世界太过于中心化,我们可能更愿意相信基于中心意见领袖的人云亦云,或者一些假大空的概念,而忽略了我们自身的体验。

而对于我而言,从 JavaScript 作为一个锚点,就可以延伸出对世界的理解。因为它是一门我在很长一段时间内每天在用的语言,它是真实的,不需要我从其他人的思想中去抽象理解。而它的很多底层逻辑又是与很多事情相通的。换句话说,我认为我们越是能就身边的不起眼的小事着手,把它吃透、做精、做细,一竿子通到底,反而更容易触类旁通,去了解一些离我们很远的事情。

那怎么能吃透一件事情呢?就拿 JavaScript 来说,我认为首先需要做的是发现它的核心问题;再者是如何来解决这些问题。这两者的分量各占一半。换句话说,我们如果能清楚地定义问题本身,就等于解决了一半的问题。如果我们还能在这个基础上,想清楚它的解决方案,那么,我们就等于真正地掌握了它。

JavaScript 面临的不确定性

首先,我们看到 JavaScript 作为一种语言,从它的设计到实现,所用的时间非常短。这里面缺少非常严谨的思考,也就导致了我们在开发中,在处理各种异常的时候,会遇到很多的不可控因素

其次,是它运行的环境也是充满着不确定性。当我们写好一段代码后,并不知道这段代码会在什么样的环境下运行,因为用户所使用的操作系统不同,浏览器的厂商也不同,JS 引擎的版本、屏幕的大小、移动还是桌面,这些都是不同的因素,叠加在一起,可能会产生成千上万种的组合方式。而且用户访问我们 Web 应用的网络、带宽和所在的地区,也都是不可控的。而我们所开发出来的程序,却要满足大多数环境下可以运行的需求,这本身就是一个面对巨大不确定性下的挑战。

同时,JavaScript 的不确定性还不仅源于环境,另外一种不确定性是来自我们的用户。很多时候,我们不可能控制用户的行为方式,我们不知道用户会先使用我们应用的哪个功能,后使用哪个功能,甚至有些功能是用户从未使用过的。而且,我们也无法完全控制用户的行为轨迹,就拿一个购票的应用来说,有些用户可能是通过搜索找到产品购买的,而有的用户可能是通过筛选条件找到产品购买的,有些用户可能是先加入购物车,而有的用户可能又选择直接购买。这些不同的行为轨迹都需要对应的系统流程来支持并且处理。

第四点是非功能性的,比如流量上的不可控。我们并不知道用户的数量和访问规模,我们只能通过预估和事后的分析来判断我们的系统访问量。而通常,访问量的不同又会直接影响我们系统的性能,反应在客户端,就是给用户带来的体验以及功能上的影响。

第五点就是业务需求上的不可控。因为我们的应用程序是直接面客的,这也就导致了我们的程序需要不断且快速地迭代来适应业务的需求。而越是复杂的业务场景,在激烈的竞争中,对变化的要求也就越快。

JavaScript 问题的解决方案

所以作为一个前端开发者来说,每天都要和大量的不确定性打交道。但是这并没有妨碍很多非常成熟的、可靠的系统在这种不确定的环境下被开发出来。那这些系统都有着什么样的特点呢?

第一是我们说的响应式编程思想。响应式编程的特点是要我们不断的感知和反应,比如面对用户行为的变化,我们就需要不断地基于事件来处理。同时,我们知道,越是面对复杂的未知的场景,我们就应该尽可能地确保我们对副作用的控制。我们需要知道在输入相同的情况下,应该如何保证在相同的函数操作下,结果也是相同的。同时,为了保证状态不可变,我们应当如何尽量在复制的数据或对象上进行操作,而不会改变状态本身。

第二是面向对象的编程思想和设计模式。只有当我们按照业务对象和领域来设计我们的系统和程序的时候,才能更好地应对业务的改变所带来的挑战,所以一个好的软件开发者,肯定同时也是一个很好的业务分析师,因为只有当我们掌握了深层次的业务逻辑后,才能更好地写出对应的程序。否则,我们就很容易陷入重复的开发、返工以及及大量的重构来满足业务变化。

第三是我们在开发中所运用的算法思想。在我们的程序所消耗的内存量、访问量、处理的数据量和访问的频率不高的情况下,也许算法并不会体现出它的价值。但是当我们的业务量、数据量增长,或者需要渲染的内容增加的时候,就会遇到各种性能瓶颈,这时,就是我们需要用算法思维来解决一些问题的时候了。而且往往越是复杂的问题,越是考验基本功。

第四是我们在开发的过程中所用到的工具,比如 Flow 就从很大程度上帮助我们解决了 JavaScript 自身的很多短板,让一个很随意的、缺乏严谨的类型系统的语言,也可以使用类型系统来做相关的类型检查。

第五是我们在 JavaScript 之势中介绍的域驱动的设计理念以及大前端,本质上都是强调业务驱动开发的重要性。这种设计理念,从某种角度来看,就是要求我们在开发中以终为始,不断地思考我们开发的目的。

为什么说知识可以触类旁通

我认为在解决 JavaScript 的不确定性的过程中,我所学到的东西,完全可以应用在生活的方方面面。举几个简单的例子,比如我们说响应式的设计,在生活中也是同样的,我们需要面对不确定性的解决方案。在面对未知的时候,我们几乎就可以把先行动、后感知、再反应作为一个模版。

再比如提到算法,我们就不能不提到动态规划,同样,在面对生活上的问题时,我们很多时候都应该时刻考虑全局的最优解,而不是局部的最优解。否则,我们很多时候可能都会因小失大。因为过分贪心,导致没有在大的问题上真正得到最优的解决方案。

再比如在开发的过程中,如果我们真的想达到事半功倍的效果,就必须要时刻了解业务的需求,细化深入地理解业务的流程,同时,为了提高开发的效率,我们也要思考如何能够优化开发流水线。这里,就又和软件工程有着密不可分的关系,所以开发到了最后,不仅是简单的开发问题,它延展出的是业务系统分析和项目管理的能力。

JavaScript 界的大佬道格拉斯·克拉特福德今年提出了一个非常具有争议的概念,就是 JavaScript 已死。虽然这样的观点看上去比较偏激,但是我认为 JavaScript 并不是完全不可以被取代的。不过,即使有一天,JavaScript 成为了历史,它在编程语言历史上的地位也是不会动摇的,它的很多思想也还会延续到任何一个要取代它的语言中。

其实,有很长一段时间,我很羡慕后端开发,他们就像“三好学生”一样。而且我认为更适合用来作为第一门计算机语言来学习的还是像 C++ 或 Java 这样的语言,因为它们有更加严谨的语法,一个好的基本功和扎实的基础是解决任何复杂问题的关键。

JavaScript 虽然很好用,但也正是因为它太容易上手了,所以导致了很多人没有能把它用好。而且在前端开发中,需要考虑的种种问题真是非常多。但是随着时间的推移,我渐渐接受了 JavaScript,因为正是它的种种问题和带来的不确定性,让我们在开发中锻炼了深度思考的能力,并且在克服这些问题的同时,也让我们自身变成了更有韧性的人。同时,相比后端的“一刀切”,前端对很多问题的“容忍”也造就了开发环境的包容。正是在不断的变化和不可控中,我们不断调整,优化系统稳定性,这个过程我们更加会注意如何减少副作用,提高在混乱中建立秩序的能力。

正好,这个结束语也写在了辞旧迎新的新年之际,在此,我也希望此时此刻读到这篇文章的你,也能够在新的一年,通过 JavaScript 这门语言更好地拥抱不确定性。

最后,我还给你准备了一份毕业问卷,希望你能花两三分钟填写一下,非常期待能听到你对这门课的反馈。

图片

参考资料

https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/JavaScript%20%e8%bf%9b%e9%98%b6%e5%ae%9e%e6%88%98%e8%af%be/%e7%bb%93%e6%9d%9f%e8%af%ad%20JavaScript%e7%9a%84%e6%9c%aa%e6%9d%a5%e4%b9%8b%e8%b7%af%ef%bc%9a%e6%ba%90%e4%ba%8e%e4%b8%80%e4%b8%aa%e4%bb%a5%e7%bb%88%e4%b8%ba%e5%a7%8b%e7%9a%84%e5%88%9d%e5%bf%83.md