一年前,InfoQ的编辑约请我对前端技术做了些回顾总结,说了三个方面的话题:其一,前端过去的15年大致可以怎样划分;其二,前端的现状以及面临的挑战;其三,前端会有怎样的未来。后来刊发成综述,是《技术15年》。缘于文体变动,访谈的味道十不存一,所以这里再次整理成文,是为《告前端同学书》。
周爱民/aimingoo
各位前端同学,就我的所知来看,每一个具体的技术,在其方向上都有着不同的标志事件,也因此有着不同的阶段划分。但是我想,如果从我们这个领域对“前端”的认识来观察这件事,大概会对不同的前端阶段能有更清晰的认识。
早期前端的从业人员大多来自后端开发者、应用软件开发者,或者网页设计师,而并没有专职的前端开发。例如说阿里巴巴在2010年之前都把前端归在产品部门,可见前端工程师的来源和定位一直都很模糊。这个时代,ECMAScript还陷在Ed4的泥坑中没有走出来,IE浏览器带来的标准分裂还没有得到全面的修补,源于对这个领域的漠视,大厂优势也没有体现出来,前端开发者们基本上各自为战,框架和中间件层出不穷而又良莠难分,开发工具和环境却荒草凄凄以至于乏善可陈。但是也正是在这个时代,ES6、CSS3、HTML5等等都在筑基、渗透与蓄势。
随着专用工具链和开发流程的成熟,前后端分离的运动从项目内部开始蔓延到整个领域,出现了专门的前端开发工程师、团队,以及随之而来的角色细分,很多独立的技术社区就是在这个时代出现的。前后端分离不仅仅是一种技术表现,更是一种行业协作的模式与规范,并且反过来推动了工具和框架的大发展。信心满满的前端不拘于一城一地,一方面向前、向专业领域推进,从而影响到交互与接触层,因此更丰富的界面表现,以及从移动设备到人机交互界面等领域都成了前端的研究方向,是所谓“大前端”;而另一方面则向后、向系统领域渗透,有了所谓工程师“全栈化”运动。这个时候的“全栈”,在工程上正好符合敏捷团队的需求,在实践上正好又叠加上DevOPS、云端开发和小应用的几阵助力,前端因此一片繁华景象。
所以2008年左右开始的前后端分离是整个前端第二阶段的起点,这场运动改变了软件开发的体系与格局,为随后十年的前端成熟期拓开了局面。那一年的SD2C我谈了《VCL已死、RAD已死》,而十年后阿里的圆心在GMTC上讲了《前端路上的思考》,可算作对这个时代的预言和反思。
相对于之前所说的第一、第二阶段,我认为如今我们正行进在一个全新阶段中。这个阶段初起的主要表现是:前端分离为独立领域并向前、后两个方向并进之举已然势微。其关键在于,前端这个领域中的内容已经逐渐复杂,而其应用的体量也将愈加庞大,因此再向任何方向发展都难尽全力、难得全功。
摊子铺得大了,就需要再分家。所以下一个阶段中,将再次发生横向的领域分层,一些弥合层间差异的技术、方法与工具也将出现,类似于Bable这样的“嵌缝膏”产品将会再次成为一时热门。但长期来说,领域分层带来的是更专精的职业与技能,跨域协作是规约性的、流程化的,以及工具适配的。从ECMAScript的实践来看,规范的快速更新和迭代已经成为现实,因此围绕规范与接口的新的开发技术与工程模型,将会在这个阶段中成为主要力量,并成为维持系统稳定性的主要手段。
这是在一个新阶段的前夜。故此,有很多信息并不那么明朗,比如说像前后端分离这样的标志性事件并没有出现,亦或者出现了也还没有形成典型影响。我倾向于认为引领新时代的,或者说开启下一个阶段的运动将会发生在交互领域,也就是说新的交互方式决定了前端的未来。之前行业里在讲的VR和AR(虚拟现实和增强实境)是在这个方向上的典型技术,但不唯于此。几乎所有在交互方式上的变革,都会成为人们认识与改变这个世界的全新动力,像语音识别、视觉捕捉、脑机接口等等,这些半成熟的或者实验性的技术都在影响着我们对“交互”的理解,从而也重新定义了前端。
行业生态也会重构,如同今天的前端大会已经从“XX技术大会”中分离出来一样,不久之后“交互”也会从前端分化出来,设计、组件化、框架与平台等等也会成体系地分化出来。前端会变得比后端更复杂、更多元,以及更加的生机勃勃。这样的生态起来了,一个新的时代也就来临了。简单地说,1、要注重领域与规范,2、要跟进交互与体验,3、要在生态中看到机会。
然而,前端的同学们,我们也不要忘记在这背景中回望自身,正视我们前端自己的问题。
其一,底子还是薄,前端在技术团队与社区的积累上仍然不够。看起来摊子是铺开了,但是每每只在“如何应用”上下功夫,真正在网络、系统、语言、编译、机器学习等等方面有深入研究的并不多。一直以来,真正有创建性或预见性的思想、方法与理论鲜见于前端,根底薄是首要原因。
其二,思维转换慢,有些技术与思想抛弃得不够快,不够彻底。不能总是把核心放在“三大件(JS+CSS+HTML)”上面,核心要是不变,前端的革命也就不会真正开始。要把“Web前端”前面的“Web”去掉,就现实来说,很多人连“观望”都没有开始。
其三,还没有找到跟“交互”结合起来的有效方法与机制。前端过去十年,在IoT、机器学习、云平台等等每一次潮流都卡上了点儿,但是如果前端的下一次转型起于“交互”,那么我们目前还没有能力适应这样的变化。当然,契机也可能不在于“交互”,但如果这样,我们的准备就更不充分了。
其四,向更多的应用领域渗透的动机与动力不明确。长期以来,前端在各个领域上都只是陪跑,缺乏真正推动这些领域的动机与动力。往将来看,这些因素在前端也将持续缺乏。寻求让前端持续发展,甚至领跑某些领域的内驱力量,任重而道远。
同学们,我想我们必须有一种共同的、清醒的认识与认知:浏览器是未来。去操作系统和云化是两个大的方向,当它们达成目标时,浏览器将成为与用户接触的唯一渠道。研究浏览器,其本质就是研究交互和表现,是前端的“终极私活”。但不要局限于“Web浏览器”,它必将成为历史,如同操作系统的“文件浏览器”一样。 要极其关注JavaScript的类型化,弱类型是这门语言在先天条件上的劣势,是它在大型化和系统化应用中的明显短板。这个问题一旦改善,JavaScript将有力量从其它各种语言中汲取营养,并得以面向更多的开发领域,这是JavaScript的未来。 AI和WASM在前端可以成为齐头并进的技术,一个算法,一个实现。对于前端来说,性能问题一直是核心问题,而交互与表现必将“大型与复杂化”,例如虚拟现实交互,以及模拟反馈等等,而WASM是应对这些问题的有效手段。 所谓交互与表现,本质上都是“空间问题”。亦即是说,前端表现中的所谓布局、块、位置、流等等传统模式与技术,与将来的交互技术在问题上是同源的。就像“盒模型”确定了CSS在前端的核心地位一样,新的空间定位技术,以及与之匹配的表现与交互方法是值得关注和跟进的。 前端要有更强的组织力,才能应付更大规模的系统。这里的组织力主要是针对工程化而言,所有工程化工具,其最终的落脚点都在快速、可靠,并以体系化的方式来组织工程项目。这包括人、资源、信息、时间、能力与关系等等工程因素,每个方面都有问题,都值得投入技术力量。
相较于新入行的前端的同学们,我能从没有前端走到如今前端的大发展,何其幸也。以我一路之所见,前端真正让我钦佩的是持久的活力。前端开发者几乎总是一个团队中“新鲜血液”的代名词,因此前端在业界的每个阶段都走在时代的前列。如今看C语言的老迈,操作系统的封闭,后台的保守,以及业务应用、产品市场等等各个领域都在筑城自守,再看前端种种,便总觉得开放与探索的信念犹在。
曾经与我一道的那些早期的前端开发者们,如今有做了主管的,有搞了标准的,有带了团队的,有转了后端的,有做架构做产品做运维等等一肩担之,也有开了公司做了顾问从商入政的,但也仍然还有在前端一线上做着努力,仍看好于这一个方向并在具体事务上勉力前行的。我曾经说,“任何事情做个十年,总会有所成绩的”,如今看来,这个时间还是说少了,得说是:几个十年地做下去,前端总能做到第一。
惟只提醒大家,领域分层的潮流之下,层间技术的核心不是功能(functional),而是能力(capabilities)。向应用者交付能力,需要有体系性的思维,要看向系统的全貌。我们专精于细节没错,专注于一城一地也没错,然而眼光高远而脚踏实地,是前端朋友们当有之势。
亦是这个时代予我们的当为之事!
周爱民/aimingoo
初稿于2022.06
此稿于2023.10