分类: 杂志

1. 制定公司的前端代码规范标准

可以借鉴腾讯前端和百度前端代码规范

  • html规范
  • js规范(书写、换行、缩进、标点)
  • css规范
  • 图片规范(格式、大小、质量、引入方式)
  • 命名规范(目录、文件名、className、JS变量)
  • 注释规范
  • 模块化规范(CJS/ESM)
  • 成功和错误提示规范
  • 框架代码规范(VUE\REACT文档中的规范)
  • 代码整洁(eslint):《代码整洁之道》

2. 开发流程规范化

  1. 需求分析,编写需求文档
  2. 开需求评审会议
  3. 确定需求以及UI图的拍板(这个找UI的沟通就行,如一些与需求又出入的地方或者奇葩样式,直接找产品)
  4. 前端dev部署
  5. 前端根据UI图开始开发静态页面
  6. 后端和前端的接口联调(找后端拿api文档)
  7. 代码review
  8. 提测阶段
  9. 测试验收阶段(前端这个时候缺陷是最多的,这个不用怕,正常的)
  10. 预发环境提测
  11. 提测阶段结束(项目封板,这个时候是不允许提交其他任何代码到master上的)
  12. 生产阶段(上线一般定在周四,如果出现问题,周五可以回滚代码)

3. 质量问题分析

需求理解错误

客户描述、项目经理理解、产品经理理解、技术负责人设计、开发交互实施、测试人员测试,顾问的诠释之间的差异

程序编写失误(BUG)

一些隐含的BUG没有充分被测试出来。

适配和兼容性

比如屏幕设备的视频,浏览器的兼容性等等

特殊状态

比如在上线后程序崩溃,宕机

4. 质量保障措施

需求理解错误

  • 预调研(梳理核对需求,调研关联代码,编写原型和伪代码)
  • 需求、方案、设计评审会议(方案设计:流程图、时序图、外部依赖、适配和兼容性)
  • 验收标准制定
  • 需求复用(需求点尽可能规范化、通用化,提升需求的可复用性,预备多种方案可供选择)

程序编写失误(BUG)

  • 静态、编译检查(使用工具:husky等git hooks工具,使用pre-commit钩子 (.git/hooks/pre-commit) 配合eslint、tslint)
  • 代码走查、审查(个人桌面代码检查)
  • 代码评审会议(多个人可能会发现不同问题)
  • 测试

适配和兼容性

  • 方案、设计评审会议中提前制定
  • 测试

特殊状态

  • 高强度压力测试
  • 大规模Beta测试
  • 监控机制(性能监控)
  • 回滚机制

5. 代码review清单

预测试

  • 明确任务需求和实现效果(需要产品和UI协同)
  • 单元测试、集成测试通过
  • 本地开发环境中,eslint 代码规范检查,无报错无警告

本地自测

  • 基本功能正常;
  • 界面样式正常;
  • 浏览器兼容性和系统兼容性尽量满足
  • 极端情况正常:错误输入(数据类型不对等)、数据量巨大(1000行数据)、请求异常处理(403-404-500)
  • 代码兼容性:是否兼容老代码和老数据结构(如果不能兼容,至少界面不报错)

代码走查

  • 多余的空行注释删除
  • 命名规范:函数名变量名不规范、代码可读性(避免生僻Hook)
  • 性能优化:减少时间空间复杂度;减少全局变量;React 中,减少 render 次数(减少不必要的state,生命周期函数优化等)
  • 代码安全:代码是否存在 XSS,CSRF 攻击

6. 质量保障建设

根据以上一些列措施,建设公司的质量保障体系,规范化项目开发流程。

1.普通Web开发

前端、后端是Web开发的两个端,其实统称Web开发,在很多国外公司没前后端这个说法,都叫做『软件工程师』或者Webdeveloper。其实,要转换一个思想:前后端并不是对立的,所以在你保持前端高水平的情况下,学习一些后端技术是必要的,但是要分清主次,前端为主。

2.数据方向

在Web开发的基础上用数据附能,属于Web开发的拓展方向。我认为像大数据可视化、数据资产管理,数据图形化管理也是前端的一个分支。

3.大前端方向

前端在数据驱动框架的和SPA单页应用引领下,可以做到读写数据、切换视图、用户交互,这意味着,前端开发也是应用程序的开发,而不是静态信息的纯展示。2010年后,前端工程师从开发页面(切模板),逐渐变成了开发“前端应用”。

很多公司开始实践RN和Weex,由于安卓/ios式微,一定程度上,前端把ios和安卓收编了,再加上NodeJS(比如Nodejs做中间层)的多方面应用,统称大前端。慢慢的,很多公司大前端人数与后端持平,可以想象大前端的leader更有话语权了。

另外,跨平台桌面应用也是一大发展趋势。

4.图形学方向

图形学的集大成者无疑是游戏行业,前端自然是与图形学有千丝万缕的联系,除了上面提到了可视化,还有相关2D和3D引擎的开发工作。比如,cocos2D和3D引擎,可以使用JS/TS以及一些其他语言等进行开发,支持小游戏和一些中型游戏,还可以打包为H5和小程序端。支付宝内部的蚂蚁森林,就是前端开发的。用的正是Canvas/Webgl相关的技术。相关的框架还有Threejs,可以开发3D建模类的图形化应用。当然做这一行要求也非常高了,要懂一些图形学相关的算法,3d引擎的开发也需要懂一些建模、相机、以及一些物理算法。

5.前端架构师

当然这时一个职业发展的方向。说功利点儿,这个方向既兼顾了工作的单纯性、又能够减少实际Coding的工作量能腾出更多时间钻研技术。

在国内,WEB前端工程师遇到较多的情 况是总是反复编写着同样的代码,总是面对着同样的技术和产品,容易感觉枯燥。

由于我们拥有最为广泛的WEB相关知识沉淀,使得我们更加容易成为一名架构师。但作为一名架构师不得不学习,后端相关知识,而这种学习通常需要实际操刀做项目。架构需要一个大局观好、悟性好、知识面广的前端工程师。除了设计模式的精通、手撸框架这些基本技能之外,还应该具备的就是丰富的多人协作码业务的经验,以及深刻的业务理解、拆解业务模块和梳理关联关系的能力(把业务推进落地转化为代码的能力)。

前端的更新迭代很快,很多知识来不及学就已经有新的内容出来了,让你猝不及防。从过去的Jquery和Bootstrap时代到现在的React、Vue、Angular时代,PC端、移动端、小程序,npm、webpack、git,浏览器、http等等内容。这么多概念,去了解就需要花很多时间。

前端的内容分为基础和实践两块,基础部分包括了HTML(语言、元素)、CSS(语言、功能)、JavaScript(运行时、文法、语义)、浏览器和API(实现原理、API),实践部分包含了性能、工具链、持续集成、搭建系统、架构与基础库。

明白什么是真正重要的

知道什么是重要的不容易,人太容易走神了,注意力太容易分散,人的感官依据外界刺激的强烈程度而反馈,刺激越多越新鲜越强烈,人的反应就大。在这些刺激之中,我们用在思考什么是重要的这个问题上的时间变得越来越少,我们独立判断的能力一天天被磨损。

年龄越大,学习的能力确实会越弱。一方面是因为身体的原因,因为年龄增长,大脑功能的衰退,思维能力相较于年轻人就已经发生了退化。还有知识的难度很高,也很难学习进去。日常的琐事太多,刚才也说了,注意力会被越来越多的事情分散掉,已经没有办法,如同学生一样专心学习,所以学习能力才会下降。

前端开发里真正重要的东西,很多年来都没有变过,也不会变(至少是很长时间内)。

一是语言本身,HTML, CSS, Javascript,前两者因为简单所以常被人忽视,但深究也有不少学问。Javascript最值得说,大家都知道前端的核心是Javascript,我们写来写去都是Javascript,runtime跑的是Javascript。但真正投入到语言的学习中的可能不多,很多时候我们都是被开发任务带着走,需要的时候学两下字,学习也就是搜索一下,很多时间被工具的熟悉消耗掉了。工具当然是需要熟悉的,只不过如果没有对语言核心的掌握,配置工具的时候就“配不进去”,只能让我们拷贝黏贴,使用过Gulp,webpack的应该都有这些体会。

二是web平台的工作原理,DOM,HTTP,浏览器装载渲染这些,细节有很多,这些东西不因为我们用的库和框架的不同而改变,而是库和框架在它们的基础上建立起自己的封装实现。要真正理解库和框架,往往核心就是理解它们的底层是什么,很多时候就是平台的API,平台提供的基础设施,比如NG用的zoneJS实现了change detection,如果理解了它背后的原理是对于浏览器异步API的patching,NG也就不神秘了。

还有一个是程序设计的能力。我可以不知道怎么在“框架A组件化”,但我知道怎么“组件化”,后者比前者更有适应能力和长期价值,万变不离其踪。JS程序设计,无论你用什么框架,真正需要注意力的是一些通用的问题,比如如何合理地实现App的模块化,如何让这些模块通信,什么是合适的通信机制,什么模式可以帮我架构等等。理解这些,任何框架我拿起来都可以和原有概念体系接上,并不需要特别地学习,用就是了。

基础和框架都重要,也都不重要,就算你js、浏览器、http原理、css新特性玩得飞起,要你设计一个UI框架你可能还是需要查文档或借鉴别人的东西,不信你试试看。就算你个人做出来看有几个人follow你的框架。术业有专攻,别歧视框架,也别抬高底层,这些所谓的底层能有多高的技术含量呢?重要的是你现在做的是什么,APP?企业应用?游戏?这些业务层面才是离用户或者客户最近,最能体现技术价值所在的地方。因为技术永远都是工具,是实现功能需求的工具而已

明白了什么重要,我们就在它们身上投入更多,不那么重要的那些,就少投入一点;对待的心态也有所区别,核心的东西追求完整透彻,辅助的东西我们可以拿来主义。对待工具就用对待应有工具的态度,拿出来用,用好放回去,不用请它们吃饭。

我也不喜欢面试官问的一些很原理性的东西,就比如我同事面试会问,说一下你理解的原型链...这时有些面试者会说不上来,然后我就会问,那你说下你什么时候用到过prototype,实例化的对象怎么指向的prototypetypeof nulltypeof undefined一样吗等等。这些很原理吗,不是吧。照样好多人说不对,你说这样的人再“会”那些新框架又如何。不过你要从企业管理上看,基础好不好无所谓,能按时干活就行。我遇到一些拿着20多k的人写的代码垃圾的一比,一点抽象解耦意识都没有,后期维护相当困难。我并不是说能解释清原型链闭包就能写好程序一样,我只是说必须要掌握基础,其次有编程思想

工程师

抛开前端,我们也是属于工程师,那也意味着需要具备工程师的一些能力。一个前端工程师需要具备三大底层能力,编程能力-去解决难的问题,架构能力-去解决大的问题,工程能力-去解决人的问题。难的问题,大概就是偏向逻辑的复杂,那我们可以通过逻辑拆分一些方式和刻意练习进行强化,所以你现在知道为什么面试造飞机,工作拧螺丝了吧,面试官就是要考察出你的潜力和编程能力是怎样的。大的问题,就是去解决复杂系统分析、多个协同管理,你也许一个大的系统里的每一块内容都可以做的不错,但是你无法把他们整理成一起,架构能力就能在其体现。人的问题,更多的是代码的规范、如何减少成本沟通,写出clean code,当然还有其他部分,目前阶段还不是很好的理解。

团队

前端需要和四个岗位线进行协作,设计、产品、后端、测试,而在其两两之间少不了沟通和交流,而如何让这些成本降到最低,也是对你能力的考察。其中你审美情况是怎样的,交互做的怎么样,对产品逻辑的理解有多少,为后端逻辑的考虑有多少,缺陷的产生是否比较少,对用户体验的感知又是一个什么样的程度,都是不可或缺的,效率也往往在其体现,这些能力就脱离具体的专业技术能力了,但也会起着比较关键的作用。

没人有选择的“智慧”,区别只是勇气

对待那些很不重要的东西,我们需要有做选择的勇气,这对嘈杂的技术圈里的不少人,是一个不小的挑战,所以需要自我训练:不用就是不用,不喜欢就是不喜欢,大大方方地怀疑,大大方方地恨。

每个人都做过nice guy,觉得所有新技术都是机会,所以一一请吃饭 —— 结果被强奸一百遍。

“大大”,“巨巨”说得天花乱缀,招聘启示写得再殷切,但决定是你自己的,你的精力在你有限的时间里是极其有限的,所以要把技术当成主动投资,投资就是选择这个,不选择那个,是有意识地自我控制的行为,投资不是把一万块分成100份,每份都压100块。三个框架你可以都做点功课,但你得决定投资那个,决定了就投入。

现在的技术,今天一个花样,明天又一个花样。每次都有承诺,每个承诺都很可疑:如果你这样这样这样再那样那样那样,问题就解决了,你看,很简单吧!比如大家都热爱的React,我个人就十分讨厌,不管他们怎么说,对我来说这就是一个缺乏品味的技术栈。今天Flux,明天Redux,后天MobX,破坏了一致性,反而回过来鼓吹JSX的表现力。Redux这样的承诺,化成“直观”的图形,多数人类却看不懂,却说它好用。

放屁。

我个人的看法是FB的技术团队只懂Hack,不懂设计,只不过有时候厂子大了Hack做得像模像样,让人误以为是好设计。很多人把自己的项目当FB。

Not me. 我决定不投资React,这是我的选择。因为这是我的选择,所以你也没有必要给我留言和我争论。我做了一个选择,我心安理得,我承担潜在风险,我愿意。

你也应该这样。

你可能有不同的选择,选择什么的结果都不会很差。但是如果你没勇气选择东搞搞西搞搞什么都搞,被坑了,你得先怪你自己。项目是你的,代码是你来维护的,搞好搞坏是你的。所以你得负起责任来,对自己诚实一点,做点接地气的决定。

不要害怕和别人不同,需要和别人不同的时候,就结结实实的决定。你受的教育不教独立和勇气,所以你得自己训练自己。

有时候靠谱的事只有一件,就是“顺其自然”

工具的开发者真想坑人的很少,但他们也是人,有时候一激动就把我们坑了。

把我们坑了不意味着工具不再提供价值了,我们应该把注意力放在它们提供的价值上,善加利用之,它升级你就升,他说同志们下一版本咱不兼容了,请大家把app重新搞一下,那你就搞,早点搞,不要想东想西耽误了时辰。多数时候也不过是npm update,不需要花太多力气。

在有价值的东西上投入一点时间来维护,这就像你投资了基金要交点年费一样,是正常的。你上了贼船,没太多选择,你不得不尊重这种选择,继续搞下去。

有时候该换的时候就换,工具只是工具,不是结婚对象,策略灵活务实一点,大多数情况下,做一个pros/cons分析并不难。

同样,不该换就不换,工具服务于更大的产品和商业的目标,如果这些目标是达成的,谁在乎你用的那个东西是不是最新版本呢,不是最新版本又怎么样呢,团队用了几年熟悉了,能当裤子穿了,就是自己的东西,版本也就没那么重要了。

搞清楚收益与成本,该干嘛干嘛。

一、前端发展阶段

1. 静态页面阶段

互联网发展的早期,网站的前后端开发是一体的,即前端代码是后端代码的一部分。

  1. 后端收到浏览器的请求
  2. 生成静态页面
  3. 发送到浏览器

那时的前端页面都是静态的,所有前端代码和前端数据都是后端生成的。前端只是纯粹的展示功能,脚本的作用只是增加一些特殊效果,比如那时很流行用脚本控制页面上飞来飞去的广告。

那时的网站开发,采用的是后端 MVC 模式。

  • Model(模型层):提供/保存数据
  • Controller(控制层):数据处理,实现业务逻辑
  • View(视图层):展示数据,提供用户界面

前端只是后端 MVC 的 V。

2. AJAX 阶段

2004年,AJAX 技术诞生,改变了前端开发。Gmail 和 Google 地图这样革命性的产品出现,使得开发者发现,前端的作用不仅仅是展示页面,还可以管理数据并与用户互动。

AJAX 技术指的是脚本独立向服务器请求数据,拿到数据以后,进行处理并更新网页。整个过程中,后端只是负责提供数据,其他事情都由前端处理。前端不再是后端的模板,而是实现了从“获取数据 --》 处理数据 --》展示数据”的完整业务逻辑。

就是从这个阶段开始,前端脚本开始变得复杂,不再仅仅是一些玩具性的功能。

3. 前端 MVC 阶段

前端代码有了读写数据、处理数据、生成视图等功能,因此迫切需要辅助工具,方便开发者组织代码。这导致了前端 MVC 框架的诞生。

2010年,第一个前端 MVC 框架 Backbone.js 诞生。它基本上是把 MVC 模式搬到了前端,但是只有 M (读写数据)和 V(展示数据),没有 C(处理数据)。因为,Backbone 认为前端 Controller 与后端不同,不需要、也不应该处理业务逻辑,只需要处理 UI 逻辑,响应用户的一举一动。所以,数据处理都放在后端,前端只用事件响应处理 UI 逻辑(用户操作)。

后来,更多的前端 MVC 框架出现。另一些框架提出 MVVM 模式,用 View Model 代替 Controller。MVVM 模式也将前端应用分成三个部分。

  • Model:读写数据
  • View:展示数据
  • View-Model:数据处理

View Model 是简化的 Controller,所有的数据逻辑都放在这个部分。它的唯一作用就是为 View 提供处理好的数据,不含其他逻辑。也就是说,Model 拿到数据以后,View Model 将数据处理成视图层(View)需要的格式,在视图层展示出来。

这个模型的特点是 View 绑定 View Model。如果 View Model 的数据变了,View(视图层)也跟着变了;反之亦然,如果用户在视图层修改了数据,也立刻反映在 View Model。整个过程完全不需要手工处理。

4. SPA 阶段

前端可以做到读写数据、切换视图、用户交互,这意味着,网页其实是一个应用程序,而不是信息的纯展示。这种单张网页的应用程序称为 SPA(single-page application)。

SPA是指在一张网页(single page)上,通过良好的体验,模拟出多页面应用程序(application)。用户的浏览器只需要将网页载入一次,然后所有操作都可以在这张页面上完成,带有迅速的响应和虚拟的页面切换。

随着 SPA 的兴起,2010年后,前端工程师从开发页面(切模板),逐渐变成了开发“前端应用”(跑在浏览器里面的应用程序)。

前端领域风起云涌,框架层出不穷。目前,前端三大马车 Vue、Angular、React ,都属于 SPA 开发框架。

同时我们也注意到在众多前端框架中,由 Rich Harris (Ractive, Rollup 和 Bubble 的作者) 开发的 Svelte 有较于 React 更小的体积、更高的开发效率和性能,有望成为一批黑马,在前端框架中脱颖而出。

二、前端新标准

2014年,W3C正式发布HTML5.0标准让前端技术蓬勃发展。HTML6.0目前处于提案阶段。

Web1.0到2.0的转变,由静态互联网过渡到Web应用程序,极大地改变了前端技术。

Web3.0时代,可能是去中心化,可能是物联网,可能是人工智能,值得每个前端开发去关注。

三、框架选择

1、视图框架

React,Vue,Angular 是前端强势铁三角。由于新版本推出如Vue3.x和React18,占有率会变得更高。

2、UI 框架

由于模块化CSS、摇树、MVVM 的流行,UI 框架的选择其实没有那么重要了。适合的UI才是好的UI。

四、新工具的诞生和发展

1. 构建工具

随着nodejs和Babel的成功,构建工具也有了很多的突破。打包器大概可以分为传统编译和 ESM 混合编译,从 webpack 到 vite ,说明原生 ES 模块的接纳一直在继续。

Vite: “快”是它的核心,它主要解决的痛点就是项目开发启动缓慢。

ESM 混合编译:在开发环境编译时,使用 Server 动态编译 + 浏览器的 ESM,基本上实现了“开发环境 0 编译”的功能。而生产环境编译时,则会调用其他编译工具来完成(如 Vite 使用 Rollup)。

另一方面,出于对性能的考虑,越来越多的前端工具开始用其他语言 (Rust、Go) 来构建。

2. 混合式开发工具

将JavaScriptCore引擎当做虚拟机的方案,代表框架React Native;

另一种是使用非JavaScriptCore虚拟机的方案,代表框架是Flutter。相比于 React Native框架, Flutter的优势最主要体现在性能、开发效率和体验这两大方面。但从编程语言角度来说,JavaScript的历史和流行程度都远超Dart,生态也更加完善,开发者也远多于Dart程序 员。所以,从编程语言的角度来看,虽然Dart语言入门简单,但从长远考虑,还是选择 React Native会更好一些。

另外为了使用H5开发移动端应用,使得相应出现了一些混合式开发(Hybrid App)的构建工具,如uniapp、Taro等。

3. 桌面应用

  • Electron: 我们的老熟人,Chromium + Nodejs,深受大家喜爱
  • Tauri: 异军突起的新星,Webview + Rust (可替换)。对比 Electron 因为不用打包 Chromium 和 Nodejs 运行时,产物体积小,内存占用小,运行性能好

4. 类型化语言

TypeScript 使用率近年来稳健增长,目前已经是前端项目的标配了,可以预计未来将会有更多强大的配套工具提高生产力还有提升使用体验。

5. 包管理工具

从 yarn 再到现在的 pnpm,解决了很多npm存在的诟病。

pnpm 可以说是 npm 的超级加强版,或者 yarn 的加强版。其独特的软连接和硬链接的设计,使得装依赖很快(Yarn 从缓存中复制文件,而 pnpm 只是从全局存储中链接它们),解决了多个项目依赖包缓存问题,避免了重复下载。

但是这类 npm 代替工具,也不是非用不可,因为 npm 自身也在不断地优化。比如早期 npm 不支持 package-lock.json 的时候,大家都说 “Yarn 简直太有用了!”,但是后来 npm 支持了 package-lock.json 文件后,二者的差距就很小了。

什么是pnpm以及pnpm的安装与使用

五、智能平台

1. 低代码平台

低代码发展初期,厂商的类型多样化,传统软件厂商、互联网大厂均涉及低代码领域,通用型厂商相对垂直型厂商应用场景更加广泛,因此厂商数量更多。但随着市场成熟,通用类型厂商竞争加剧,垂直型厂商在细分的领域将会呈现优势明显趋势,可以进一步挖掘用户场景,提升产品能力和用户满意度。

及早布局低代码产业生态,多维度拓展厂商优势,才能在未来占据高地。

2. AI 与图形化的探索

人工智能作为跨时代技术在各个领域大放异彩,近些年 AI 能力在前端领域的尝试与应用带来新一轮的技术革命。

游戏引擎和3D技术的不断发展,给前端注入了新的活力。

阿里的 Imgcook 可以通过识别设计稿(Sketch / PSD /图片)智能生成 React、Vue、Flutter、小程序等不同种类的前端代码,目前可以生成 70% 以上的代码,智能生成代码不再只是一个线下实验产品,而是真正产生了价值。但这个只能说是减轻静态页面的工作量而已,无法取代前端。

六、跨平台技术

随着从 PC 时代向移动互联网时代演进,原生客户端因为自身天花板的原因也在逐渐向跨平台方案倾斜,当然这得益于跨平台方案的明显优势。对于开发者而言,可以做到一次开发多端复用,这在很大程度上能够降低研发成本,提高产品效能。但是,移动端的跨平台技术并不是仅仅考虑一套代码能够运行在不同场景即可,还需要解决性能、动态性、研发效率以及一致性的问题。

1. React Native 和 Flutter

React Native 是以 Web 技术开发原生移动应用的典型框架。但是与众多基于 Html 的跨平台框架相比,Flutter 绝对是体验最好,性能与构建思路几乎最接近原生开发的框架。

Flutter 目前虽然有着跨端最好的性能和体验但是关注人数和 React Native 不相上下。React Native 由于先出优势加上 React 的影响力和 Flutter 的学习成本(Dart语言)导致目前很多 APP 都已经进入存量阶段,少有新的 APP 出现,所以在没有足够的收益情况下,大部分 APP 是不会进行技术变更的。

2. 小程序

目前主流小程序平台有很多,包括:

  • 腾讯的微信小程序、QQ 小程序;
  • 阿里的支付宝小程序、淘宝轻店铺;
  • 字节跳动的头条小程序、抖音小程序;
  • 百度小程序等;

不同平台的实现标准各不相同,开发者需要学习不同平台的开发规范做定制化开发。所以在 2019 年 9 月阿里巴巴主导发起并联合 W3C 中国及国内外厂商起草了 MiniApp 标准化白皮书(MiniApp Standardization White Paper),旨在制定共同标准减少平台差异,并成立了相关工作组。

但从目前来看各平台对这些标准的实现度还很低,并未实现统一,所以这么来看标准化的路看着还很长。在当下,解决跨平台开发问题最有效的手段是使用转换框架进行转换

随着一些跨端框架(Uniapp、Taro)的出现部分跨端转换器基本已经定型。另外还有其他一些跨端转换器相关的内容:

  • wept: 微信小程序实时运行工具,目前支持 Web、iOS 两端的运行环境;
  • hera-cli: 用小程序方式来写跨平台应用的开发框架,可以打包成 Android 、 iOS 应用,以及 H5;
  • weweb-cli: 兼容小程序语法的前端框架,可以用小程序的写法来写 web 应用

跨端这项技术并非为了完全替代原生开发,针对每个场景我们都可以用原生写出性能最佳的代码。但是这样做工作量太大,实际项目开发中需要掌握效率与优化之间的平衡。跨端的优势在于能让我们在尽可能保障性能的前提下书写更有效率的代码

七、泛前端方向

“前端开发”的发展历史像是一直在找寻自己的定位;从切图仔、写 HTML 模板的“石器时代”,到前后端分离、大前端的“工业时代”,再到现在跨端技术、低代码的“电气时代”。前端研发的职责一直在改变,同时前端研发需要掌握的技术也在迭代更新。

1. 全栈

“全栈开发者”是指“同时掌握前端、后端以及其他网站开发相关技能的开发者”。全栈开发者能够胜任产品开发的全流程,从前端到后端,从架构设计到代码落地,从自动化测试到运维等。对于公司来说,全栈工程师可以减小公司的用人成本,减少项目沟通成本;对于个人来说,拥有全链路技术有益于技术的闭环,扩展全局思维,提升个人能力和价值。

2. DevOps

DevOps(Development 和 Operations 的组合词)是一种重视“软件开发人员(Dev)”和“IT 运维技术人员(OPS)”之间沟通合作的模式。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。可以把 DevOps 理解为一个过程、方法与系统的总称。

在Docker自动化部署和流水线发版工具的发展下,DevOps越来越被开发人员所重视。

八、5G场景带来的新趋势

5G 的到来对于技术研发工作者的我们而言意味深远。它的出现是数据传输速度、响应速度和连接性的一次巨大飞跃。

5G 将与超高清视频、VR、AR、消费级云计算、智能家居、智慧城市、车联网、物联网、智能制造等产生深度融合,这些都将为前端技术的发展带来新的增长和机遇。

1. WebAR & WebVR

元宇宙概念火爆全球,目前的 WebAR 和 WebVR 技术距离实现元宇宙的愿景似乎还很遥远,但借助于以 URL 的格式进行传播的优势,通过社交媒体分享形式进行推广,WebAR 和 WebVR 无疑是用户接触到元宇宙门槛的最便捷的方式,不需要购买昂贵的 VR 设备,不需要安装 APP,通过手机网页就可以进行体验。在 5G 技术逐渐普及的当今,现有的一些体验问题,例如:3D 模型体积较大,初次资源加载耗时长之类的问题也能够得到一些缓解。

那么,问题来了:前端人在这块能够做些什么?从技术上来讲,需要我们通过机器学习算法,实时地将虚拟图像覆盖到用户屏幕,并且和真实世界中的位置进行对齐,结合 WebRTC 技术实现网页浏览器实时获取和展示视频流,再利用 WebGL 的能力,进行 3D 人物模型加载,渲染和播放动画。

2. Web 3D

随着 5G 技术发展,视频加载速度会非常快,简单的实时渲染会被视频直接替代。复杂的可以通过服务器渲染,将画面传回网页中,只要传输够快,手机的性能就不再是问题。

降低 web 3D 研发成本应该是将来的一个重要发展路线,随着技术门槛的降低,会吸引更多感兴趣的人加入促使其正向发展。所以 Web 3D 可能会朝着平台化的方向发展,能提供简单高效的工具将成为核心竞争力。

3. WebRTC

WebRTC 是一项实时通讯技术,它为前端打开了信息传递的新世界大门,对于绝大多数前端开发者来说,对于信息的传递还局限于 XMLHttpRequest,升级到全双工大家会用到 WebSocket ,对于能力闭塞的前端来说,WebRTC 无疑拓宽了前端的技术门路。

九、前端未来展望

未来是留给下一代的,我们已然老了。干不动了。

1. 桌面应用 - 前端开发的下一个战场

自 2014 年 Github 推出 Electron 开源框架开始,前端跳出 Web 客户端局限,开发桌面应用的能力成为了可能,近年来,依托 Electron、React Native、Flutter 等应用框架,前端跨端开发桌面应用的概念持续升温。尽管这些方案和传统的 QT、Xaramrin 等技术栈相比,性能未必最优,但它意味着一些极具性价比的可选方案出现,大大降低了开发桌面应用的门槛。

搭上 Rust 的东风的 Tauri 受到非常多的关注,对标 Electron,主要有以下 4 点优势:

  • 包体积大小更小
  • 运行时内存占用更小
  • 安全摆在第一位
  • 真正的开源

但是理性思考,对于前端开发来说,有三个致命的缺点:

  • Tauri 使用系统 webview,会有兼容性问题,这也是 Electron 重点解决的问题
  • 抛弃了 nodejs,生态圈目前来说还是很难比得上 Electron 的
  • 底层开发要用 Rust,有一定的上手成本

但是随着 Rust 的生态起来,浏览器兼容性渐小之后,胜负犹未可知。

2. 低代码将持续成为热点话题

自从 2020 技术趋势中谈及 “低代码” 之后,低代码领域一直在持续升温。

低代码引擎的核心目标,是提供一套基础标准、设施,帮助上层平台更有效地建设。而其思路的关键,在于引擎模型及能力的完备性、以及针对不同场景下的可扩展性。

腾讯内部的低代码 Oteam 也在 21 年开始组织起来,主要的目标也是底层核心的共建。从整个行业看,低代码引擎已经开始崭露头角,且可预见到趋势还将上升。只是这个细分赛道更多可能只是大厂参与,因为其需要大量的场景支撑验证,而这是小厂或独立开发者不具备的。

之前我曾发过一篇文章,详细探讨了低代码的崛起和程序员之间的关系,有兴趣的朋友可以看个乐子:

软件吃软件,在机器学习和低代码框架的崛起中,程序员会变少吗?

3. Rust - 前端人员是时候掌握一门新语言了

随着前端生态工具的逐渐完善,大家除了探索前端的新领域之外,同时还在思考如何提高工具的性能,众所周知,JavaScript 的性能一直是被大家所诟病的点,但是前端的基础设施却是十分要求性能的,比如构建等,所以大家开始考虑是否能够用别的语言来编写前端工具,于是 Rust 吸引了大家的眼球,Rust 语言自诞生以来,就以它的安全性、性能、现代化的语法吸引了大批的开发者,在 stackoverflow 最受喜爱的编程和语言中连续多年获得榜首的位置,并且已经有众多领域都出现了 Rust 重写的项目,Linux 项目也表示正在使用 Rust 重写一部分功能,可以说 Rust 进入前端领域也是一种必然的趋势。

在前端构建领域,2021 年出现了一个十分突出的项目 —— swc,它是由 Rust 编写的构建工具,可以用来编译、压缩、打包,目前它已经被一些知名项目使用,比如 Next.js、Parcel、Deno 等,Next.js 12 直接使用了 swc 替代 babel,并在他们的官网博客表示说使用了 swc 之后,热更新速度提升到了原来的三倍,构建速度提升到了 5 倍,由此可见,Rust 性能的强大。

除了构建方面,在前端的其他领域也是有着 Rust 的身影,比如 Deno 的运行时引擎也是用的 Rust 编写的 V8 引擎;前端的下一代工具全家桶 Rome 宣布使用 Rust 重写;Node.js 可以通过 napi-rs 来调用 Rust 模块,实现高性能扩展;使用 Rust 编写的 dprint 规范代码器,要比 Prettier 快 30 倍;Rust 也可以编译成 WASM,并且出现了像 yew、percy 这样的 WASM 前端框架。

推特上,Redux 作者 Dan Abramov 在某个提问 “未来三年最值得学习的语言是什么” 下回答了 “Rust”,这或许是对前端人员的一个启发,我们也是时候学习一门新语言来让前端生态圈再次焕发活力了。

例子:现在很多的前端构建工具和项目使用Rust语言。

  • Deno(新一代的JS运行时)底层是Rust
  • Next.js(React服务端渲染框架)使用Rust编译器,能实现更快速的构建
  • Swc是一个基于rust语言开发的js编译器,利用了rust的安全无gc以及系统级语言的特性,保证了性能是接近原生开发,并且可以充分利用多核cpu。swc 对比 babel有至少 10 倍以上的性能优势

语法:

在语法上 Rust 也是极具现代化语言的特点,借鉴了函数式编程、结构化语言的特点,并且在它们的基础上也创造了许多更为先进的语法。在函数式编程的地方,也有着不少 JavaScript 的身影,比如 JS 的箭头函数对应了 Rust 的闭合函数;Rust 的数组同样也有着 map、reduce、filter 等方法;Rust 的函数也可以赋值给一个变量

在Deno的诞生发展以及于Nodejs的角逐下,Rust 可能会是 JS 基础设施的未来。

前端框架火了已经有些年头了。像React、Vue、Angular等,都是视图层数据驱动框架

当然现在最火的两大框架就是React和Vue。而React又出了v16.8版本的Hooks新特性,Vue出了3.x版本。

争论React和Vue哪个更好没有意义。每个框架各有优势,但他们没有本质的区别。

  • Vue更注重视图的自动同步(双向数据绑定),且封装性更好(比如框架封装了完善的事件机制、绑定规范、指令操作等)。使用习惯更偏向前端人员。
  • React更注重组件及其状态的管理(单向数据绑定),更加侧重于逻辑(JS优先)。习惯更偏向于程序人员(比如原先是做PHP的更易上手)。React更加透明,没有封装过多的隐含逻辑(比如指令、事件、数据监听等),便于程序员了解程序的执行过程,但也较Vue使用更复杂。

抛开框架具体本身,宏观上来谈近年来前端框架的发展,我认为前端的发展思路永远是:在保证性能的基础上,提升程序员的开发效率为先。

如果一个框架本身的学习成本和使用成本过高,给开发过程带来很大的心智负担,让程序员对于语言或框架本身使用的关注度超过了对业务逻辑及数据的关注度,那么这个框架一定不是一个好的框架。

简便易用

像React、Vue等,在使用方面有一个最大的特点就是:简便易用!(相对于不使用框架)

以前有人问我说,原来是用原生的,用JQuery的,现在学React,学Vue难不难,复不复杂。

其实新的框架要比老的框架要更加简便易用,这个其实是一个很容易理解的问题。他如果比原来的那玩意还难用,那我们为啥要用他呢?

使用这些框架后,我们可以把精力都放到业务逻辑和数据关系上,对于程序员来说,精力是很有限的。如果让你过多的去处理那些coding层面的细枝末节的东西,那么大的结构,整体的流程方面就会关注不足,很容易拉低效率,延误工时。

视图自动更新

框架最大的优势实际上就是帮我们维护我们的视图层。视图说白了就是页面上的元素。

如果你数据发生了变化,框架会自动将视图进行更新,那么我们的思路就得以解放,精力就不用过多的放到视图上,从而有更多的时间去关注业务逻辑。而业务逻辑、数据等才是决定一个程序根本表现的东西。

虚拟DOM

这个技术实际上老生常谈了。在这里我也不去谈那些没用的什么原理上的东西。无非就是把DOM元素用JS对象的形式进行处理。在视图更新时,通过一系列的diff对比算法对其更新,只更新对应的元素,不会重绘整个页面。

1. 简化操作

虚拟DOM的方式可以帮助我们进行简化操作,使得我们摆脱元素的创建、选取和操作的噩梦。比如React的jsx语法和Vue的模板语法,最终会创建虚拟DOM节点。

在不使用框架前,我们的HTML和JS是分开的。而在虚拟DOM使得我们的HTML标签和JS合二为一(JS优先)。使得我们无需去获取元素。如有需要,可以直接操作标签本身。所见即所得。

2. 提升性能

DOM操作是JS操作中很慢且性能很差的操作。实测一次的DOM操作足够进行成百上千次的其他JS运算。所以在DOM操作非常频繁的,比如带有大的动画特效的页面会非常卡,很吃性能。

而使用视图框架,他不会直接操作真实DOM,而是操作一套虚拟的DOM。以最小化更新真实DOM,从而减小不必要的性能损耗。

基于组件的开发

在开发过程中,实际上存在许多需要多次复用的单元。框架的发展,越来越倾向于使用组件化的开发去把大的视图单元和逻辑分离开来,变成一个个的小功能。

在组件化的开发模式下,只要把一个个的小东西做好了,就可以用组件拼凑出一个大型的应用。

1. 便于大型应用开发

一个大型应用往往比较复杂,往往一眼看去无法直接入手。

大型应用工作任务所需人员众多,如果像原来一样,一大块一个整体,是很难去细化任务的。

如果使用组件,便于页面开发的细化,分工也会更加方便和明确。便于降低整个程序的复杂度。

一个组件可能很简单,但是多个组件组合在一起,那么功能就可能非常强大,威力无穷。

2. 便于功能的复用

一个应用其实是有很多重复的内容和单元的。如果按照原始的开发流程,除了一些业务逻辑,视图结构是不方便复用的。

而组件化的开发就解决了这一难题。

3. 便于使用第三方的组件和开发自己的组件库

你不仅可以组装自己开发的组件,而且还能够使用大量第三方开源的组件库。这也是使用框架的优势之一。

而且你也可以开发自己的组件库,便于后期相关项目视图的统一性。比如我们公司是做法律相关的应用,那么我们可以开发相应的组件库,使得后期所有应用得以统一标准

甚至你可以把自己的组件库开源,为社区做点贡献也是很不错的。

JS优先的设计原则

理论上来说,Vue和React等这些视图层数据驱动框架有一个设计原则就是JS优先。这是与一些古典的模板引擎相对比而言的。

我们知道,视图框架涵盖了模板引擎的功能,但这个功能与模板引擎还有所不同。

模板引擎

模板为主,JS为辅。因为在模板引擎(如EJS、Handlebars等)诞生的年代,JS相对还比较简单,只是浏览器的一个小的脚本语言。像做个小东西如轮播图、请求个数据、做个简单的表单校验。

所以模板为主,优先保障的是静态HTML的结构。js是附加的,是额外的,是添头。

模板引擎更适合于传统开发,偏向于一些比较简单的、静态的、逻辑很少的页面,不利于扩展。比如做个企业站首页,没什么交互功能,只用于展示。

视图框架

JS为主,模板为辅。模板作为JS的一种数据类型。这点在React上尤为明显。

逻辑优先,模板是js逻辑的一部分,可以任意扩展。因为js的灵活程度比HTML强太多了。

适用于现代开发,尤其是大型、复杂的逻辑。

丰富的应用场景

视图框架有非常丰富的应用场景,不仅仅用于开发Web。

可用于移动端开发。比如 React Native 可以开发移动原生应用,比普通混合式应用性能更高。

也可用于开发服务端渲染(SSR静态web应用)的应用。比如React衍生框架Next、Vue衍生框架Nuxt。前后台渲染可以使用同一框架相互结合。

甚至可以用于开发跨平台桌面应用和多端小程序,比如Taro、Electron、Tauri。

Deno 是一个旨在改进甚至替代 Node 的 JavaScript / TypeScript 运行时。它拥有众多的功能和广泛的关注度,截止目前在 Github 上已经有 68k 个 Star(译者注:2021-04 月底已 75k star):

image

在如此多强大功能的加持下,有个很重要的问题值得反思:

为什么 Deno 在 1.0 正式版本发布之后没有众望所归,得到广泛使用?

本文将尝试探讨该问题…

所以,Deno 是什么?

Deno 是一个安全的 JavaScript 和 TypeScript 运行时,作者是 Ryan Dahl(也是 Node.js 的原作者)。Deno 的诞生之初是为了解决 2009 年首次设计 Node.js 时的一些疏忽。我认为这种改造动机很有道理,因为我相信每个程序员都希望有机会能重写他们已有 10 年历史的代码。

基于此,Deno 在 Node.js 已经发展至今的情况下,引入了很多新功能:

  • Deno 有默认安全的机制。访问文件系统,网络或运行环境需要被授权;
  • Deno 对 TypeScript 的支持度是开箱即用的;
  • 外部文件由 URL 明确引用。没有 package.json。
  • import 语句需要包括文件后缀(.ts,.tsx,.js,.json)
  • 内置依赖检查器和文件格式化工具库
  • 以及更多...

凭借这些功能以及大量开发者的积极推进,Deno 于 2020 年 5 月正式发布了 1.0 版本。

然后…

为什么 Deno 没有众望所归?

Deno 看起来拥有成功的所有要素:大量的关注者、诸多的功能、经验丰富的创始人和开发者等等,但并没有真正实现所有人期望的增长。这是为什么?

我认为最好从业务的角度来分析。我们大多数人可能都忘记了,构建开源软件与为用户构建软件确实没有什么不同。供需关系的标准经济原则仍然发挥着重要的作用。

当创建一个新的开源项目时,他们通常会与已经存在的东西“竞争”。考虑到这一点的话,你不仅需要考虑你的新项目是否足够出色,还需要考虑与现有项目相比有什么真正的优势。

定律来到 Deno 下时,需要关注到的就是已经存在的 Node.js。尽管 Node.js 可能有其缺陷,但它仍然有能力完成好自己的本分工作。如果 Deno 真的推出了 Node.js 无法复制的强大功能,就可能会改变游戏规则——但事实并未发生。

从用户的角度来看,Deno 仅真正具有一些“次要功能”:一个更简洁的代码库、一个更新的最佳实践方案、一个更好的安全性支持,但是这些东西实际上对用户来说仅仅是“功能特性”而非一个成熟的产品。你可以开发一个像 Gmail 一样的电子邮件客户端,拥有更好的安全性和 50% 的速度改进,即使收藏你的客户端到一个新书签只需要很少的时间,但也不会有太多用户愿意切换过来的。

因此,这是 Deno 需要招架的第一招:Deno 具有许多不错的功能,但是没有什么能激发用户从 Node.js 切换过来的杰出之处。

Deno 需要招架的第二大地方在于其不支持 NPM 软件包。如果 Deno 能够支持 NPM 包,那么也能改变游戏规则。Deno 支持 NPM 包的话,将会让其更像一个针对已有的邮件客户端的更好的容器,而不是一个“独立的邮件客户端”。

支持 NPM 软件包将大大减少进入门槛。这会成为用户将其项目和库迁移到 Deno 时的一个很好的垫脚石。

可以将 Deno 对 NPM 支持的重要意义同比于 TypeScript 的“严格模式”。对于拥有大量 JavaScript 代码库的用户,直接进行纯 TypeScript 改造,将使你在解决各种错误消息时的工作效率降低数周。但由于 TypeScript 具有禁用严格模式的支持,可以让其成为用户缓慢迁移到纯 TypeScript 的垫脚石。这为用户提供了更低的进入门槛,并且反过来又帮助 TypeScript 近年来夺走很多 JavaScript 的市场份额

那么,代价是什么呢?

我认为这是一个能印证业务方法的有趣案例。重点在于,如果你需要像市场发布一个新产品,你必须确保它的优势很大,以至于能克服人们从现状转变到新方式的阻力。

对于 Deno 来说,最初有很多独特的魅力,但回首总结 Deno 时,会发现 Deno 实际上是以失去 Node.js 下的整个 NPM 生态系统为代价的情况下的一些小“修复”。

Deno 将会去往何方?

Deno 团队有一个决定需要做。他们可以努力添加对 Node.js 的向后兼容性,或者增加更多能诱使用户迁移过来的更多吸引力。我个人认为对 Node.js 的向后兼容是接下来要走的路,如果增加了更多的兼容性,也会极大地改变项目的未来。

无论如何,以最好的祝福送给 Deno 团队,我也希望更好的技术能最终更有市场。希望你喜欢这篇文章,感谢阅读。

原文地址:Here’s Why Deno Didn’t Take Off: And what Deno needs to do to overtake Node.js. 7
原文作者:Spencer, Founder of Skiwise 5 and NotionIntegrations 1

1、

最近,国外有一篇文章,标题很有趣,叫做《软件吃掉软件》

作者认为,大型软件和通用软件越来越强大,将会取代小软件和专门软件,相当于把后者都吃掉了。

他以自己的经历举例,云服务就取代了很多小软件。

"我亲眼目睹了这种情况发生的速度。我的第一份工作是在一家小型创业公司,我们拥有大量的物理服务器。现在,很难想象有任何一家 Web 创业公司会直接管理服务器,人们都是在亚马逊 AWS 控制台上点击几个按钮和链接。"

框架的发展,也使得从头编写代码的需求越来越少。

"程序员曾经需要从头开始构建东西,但是软件库的发展速度超过了我们的使用速度,甚至软件可以自己生成新的软件,这也是为什么你看到如此之多的"无代码"或"低代码"解决方案突然出现的原因。现在,自己编写代码的理由越来越少,你要做的只是将不同的产品集成在一起。"

他的结论就是,软件自动化技术的发展,可能将会减少对软件工程师的需求,未来的程序员可能会比现在少。

2、

我对这个话题很感兴趣,因为这是在预测未来的重大变化,而且跟就业趋势直接相关。如果未来软件的规模化和自动化,会抑制对程序员的需求,那么就不应该鼓励年轻人都来当程序员。

Hacker News 论坛对这篇文章进行了热烈的讨论。大部分人(都是职业程序员)的看法是, 这种观点已经说了几十年了,根本是杞人忧天,实际情况恰恰相反,程序员变得越来越多。

"10岁时,我开始用 Qbasic 编码。我告诉爸爸,长大后想成为一名程序员。他告诉我,计算机可能很快就会实现自动化,就像他的工程行业一样,那时我会不得不找另一份工作。

但是,23年过去了,市场对程序员的需求不断上升,并且似乎仍在上升。

我想说,我们离软件自动解决大部分需求的这种抽象水平,还很遥远。正如文章所说,k8s、docker、kafka、databricks、redshift 这些新工具,取代了很多程序员。但是,它们其实引发了更多对程序员的需求。

那些必须由程序员解决的问题,只是转移到了新的地方。"

就像上面引文所说,现实情况是需要编程解决的问题不是越来越少,而是越来越多,导致了程序员的增加。原文提出的两个论据,都站不住脚。

首先,云服务确实使得企业免去了服务器管理,但是你仍然需要有了解 docker、kubernetes、数据库分片和索引、故障转移、备份、消息队列等等技术的人员。即使这些东西现在更加集成,更易于组合,但要弄清楚它们如何相互作用,如何设置,仍然是很复杂的一件事。

其次,"无代码开发"只能解决一些通用的软件问题,迟早会出现需要定制的情况。那时,就需要有程序员来修改代码,用户才能继续使用。

总之,世界正在变得越来越自动化,而自动化的本质是软件,所以对程序员的需求只可能越来越多,不可能越来越少。

3、

不过,论坛上面也有少部分人赞同原作者的观点,认为程序员越来越多只是过去的情况,未来未必如此。现在可能是软件开发"突变"的一个时间点,未来的发展可能不同于此前的情况。

市场需要更多了解 docker 和 kubernetes 这样新工具的人,这个是没错。但是,主要是大公司才需要这样的人,小公司用不到 kubernetes。小公司面对的复杂性是有限的,只要使用大公司提供的简单解决方案即可,需要自己开发的部分几乎没有。

而且,如果公司的业务重点不在技术方面(你要知道大部分公司都不是互联网公司),使用"无代码方案"是最有效的。因为无需在软件工程上花费很多钱,就可以快速应用。

历史上,每当一个领域出现大量需要编程解决的问题,就会诞生一个通用的解决方案,解决掉90%的场景。然后,这个领域对程序员的需求就会快速减少。

"30年前,开发图形界面 GUI 很困难,Visual Basic 改变了这一点。

20年前,制作一个 Web 应用很困难,PHP 改变了这一点。

10年前,写一个复杂的网页布局很困难,Bootstrap 改变了这一点。

现在,机器学习很困难,PyTorch 正在改变了这一点。

每个棘手的问题最终都会产生一个有效解决方案,解决掉90%的场景。对于大多数公司而言,这个解决方案已经足够了。剩下的10%场景,其中一部分由某些公司付钱给程序员来解决,另一部分永远不会解决。"

所以,如果新的领域层出不穷,那么就会需要更多的程序员。但是,这些领域对程序员的需求都不会持久,一旦产生了解决方案,需求就会迅速降低。

4、

看完了上面的讨论,我的想法是,市场对程序员的需求,未来怎么变化,不能简单地回答增加或减少,而是取决于两个因素。

(1)人们需求增加的速度,能否超过软件自动化的进化速度。

现有的场景最终都会有通用的解决方案,需要雇佣程序员的情况,确实将越来越少。程序员的就业,主要依靠新出现的场景。而且,新场景的增加速度,必须超过软件自动化的进化速度,否则旧的解决方案也许会自己升级成新场景的解决方案。

(2)软件开发的难度,必须超过机器学习的进化速度。

程序员的数量,还跟软件开发的难度有关。难度越低,就会有越多的人从事这项工作。以前,你必须懂得计算机的底层硬件和汇编语言,才能开发软件,所以程序员很少。现在,软件开发越来越容易,已经不需要了解底层,只需要懂得某个框架即可,所以越来越多普通人变成程序员。

未来的编程肯定会变得越来越容易,但是,越来越容易的编程,也意味着机器可以轻而易举地代替人,来完成这些工作。所以,软件开发的难度必须超过机器学习的水平,否则需求的增加只会导致更多的机器自动编程,而不会导致更多的程序员雇佣。

转自:阮一峰

最具挑战的项目

虽然这些年做过很多很多项目,有公司的也有自己做的一些小项目。但让我印象最深的,也是让我快速成长的一个项目就是一个青少年近视防控的一个项目。

行业:这个项目是属于眼科医疗行业,人工智能、物联网、大数据方向,涵盖B端和C端的一个项目。

简介:利用物联网、人脸识别与云技术实现的集智能体检、眼健康教育、监测预警、综合干预、跟踪管理于一体的长效近视防控平台,专为“儿童青少年视力监测计划”而生。医院-学校-家长-政府一体化,打通多种眼科医疗设备,服务于多家眼科医院,最终实现体检-数据分析-智能诊断-政府报告等核心功能。刚开始只是垂直于眼科,后期改版为了智能体检方向。

产品端:整个产品线包括了PC端、微信小程序端、移动PAD端、桌面应用端。其中PC端又包含了不同的用户角色,有面向医院、面向政府疾控中心(大数据报告)、面向学校(体检报告)等。微信小程序端是面向学生和家长使用的,PAD和桌面端是面向体检工作人员使用的。PAD和桌面端又通过物联网技术与设备(如验光仪、生物测量设备、眼底相机、扫码枪、串口服务器)进行通信。

架构:系统架构的话,后端采用JAVA微服务架构,前端PC采用Vue+elementUi配合webpack工程化开发,微信小程序使用原生开发。PAD端使用的也是Vue+elementUi刚开始是直接用浏览器,后期使用的Uniapp重构。桌面端采用了Electron打包开发。

前端框架刚开始是准备使用angular的。但当时Vue很火,很多公司都在用,就选了Vue。我也是在18年下半年的时候接触的Vue,也算是直接就能上手。

整个产品从立项,到调研,去眼科医院以及参与学校的体检进行需求考察与评审,再到最终开发、调试、现场实测、再到迭代、UI设计优化都有全程参与。大概参与时间一年多,到离开的时候,第一版已经卖给了山西的爱尔眼科医院整个山西十几家医院吧,还有临汾的眼科医院。在谈的也有几家医院,包括外省的医院。当然后期还有一些功能和需求没有实现,需要慢慢完善和迭代,但是核心功能已经完成。后期又添加了很多新的体检科目,不仅是眼科。

整个小组除了技术经理是前端出身之外,前端刚开始就我一个人,因为刚开始做这个项目的时候没想到后面有那么多需求。做到后面又加了2个。后端有3个人。

个人职责:

所有的前端架构搭建,满足多端需求。像PC端面向不同的用户角色,使用的一套项目架构,因为UI风格是一致的,功能点有重合有不重合的,还有一些个别的定制服务(比如某个医院想添加付费的验光配镜服务,但另一家不需要)。所以我们最后给不同用户角色用的不是一个系统,他们互相没有关系,但一些数据是共享的。比如给某个医院我们打包成一套系统,给另一个医院又是另一套。给疾控中心的又是另一套。他们各自购置各自的服务器。学校和医院是在一个系统的。只是不同的用户角色。医院也可以开启权限,将数据共享给政府,这是后端做的事了。

我参与开发的功能,基本上都有参与,列举几个:

  1. 小程序端的家长登陆,信息录入,人脸识别登陆。体检报告生成,每次体检的数据对比可视化。家长提醒服务,发送公众号消息提醒家长孩子眼睛问题,什么时候该体检了。还有配镜的推荐。核心功能是体检报告。针对不同的数据给出合理建议。
  2. PC端:面向学校的班级人员信息录入。包括单个录入和批量excel导入和导出。学生个人报告和班级报告生成。体检结果给出建议。
  3. PC端:面向医院,有不同学校的数据检索功能、数据手动录入、数据可视化、班级整体体检报告生成。
  4. Pad端:标准对数视力表视力录入(工作人员),验光仪物联网自动录入,姓名、手机、身份证检索;数据实时更新(web-soket)。连接扫码枪和验光仪。

优化、性能

优化方面,就是一些Vue相关的优化。主要是首屏白屏和加载慢的问题。

用户体验

这个在实测中发现问题不断优化。当时做过的优化有很多,比如:

  • 在体检时候,左右眼视力最初是做的下拉选项,后面操作时候,效率跟不上,经过商议改为了直接将所有的视力数字从3.几到5.几一次性用按钮方式排列,直接点击就能录入。
  • 在操作时为提高效率,将按钮放到最适合的位置。

个人成长

  • 首先是技术方面的经验得到了提高。比如前端架构、Vue框架,比如物联网的经验、串口服务器与设备接入。
  • 提高了发现问题和解决问题的能力。有实测,有调研,有使用反馈。解决问题有独立思考、有团队协作、有会议探讨。
  • 拓展了项目及产品研发的整体的把控能力。比如如何将调研转变为需求,如何将需求落地,不同的需求要用什么功能实现,由于成本和效率问题,有没有必要满足这个需求或者哪些需求是重要的,优先级最高的。

项目中的难点及解决方式

1、为什么要用条形码

因为在体检过程中,学生开始体检时需要在系统中检索到他,然后录入后数据才能与之关联。功能和现在的核酸检测差不多。

刚开始用的是直接输入模糊搜索,可以输入姓名、或者身份证、手机号,但是有很多问题,比如重名,手机号重复或者没有,而身份证又太长,总之就是搜索还需要打字,而且模糊查询查出来的有多个人,需要2次操作,效率太低。所以当时考虑使用条形码或者二维码。(现在核酸检测用的身份证扫描,但是学生年纪小没有身份证,也记不住号码),最后选择条形码搭配扫码枪进行检索。还有个问题就是,条形码必须打印出来放到学生手中,因为如果是扫描手机上的条形码的话,学生又不让带手机。

所以最终的解决方案就是使用学生ID生成条形码,将其批量打印出来,下发给对应的学生。

2、多页面条形码打印问题

首先,学校的班级很多,学生很多,所以需要打印的条形码很多,刚开始是后台生成条形码图片,然后返回前台,然后前台通过排版为HTML,再打印,后台生成很慢,返回前台再打印效率很低。而且需要等待所有条形码图片都加载完成才能通过window.print()去打印。而且小的图片效果不好,容易失真不清晰。大的图片生成又慢。

后来了解到前台也有条形码生成工具JsBarcode,可以生成svg格式的图片,矢量图比较清晰,但在使用后发现,条形码生成效率虽然提高了,但是由于是打印的A4纸,排版后的页面太多,有一百多页,导致window.print()执行后会特别卡,需要很久才能显示预览的界面。而且打印出来底部的条形码和名字有的被一分为二到第二页上面了,而且打印的每页右侧空白过大,条形码也变形了。

为解决变形和空白的问题,多次查阅才发现是页面宽高产生的问题,用的是A4纸,所以经过不断调试宽高,让每个条形码和名字以合适的宽高均匀排版到打印的纸上,一行排几个,一列几个。

另外为解决页数过多的卡顿问题,可以将条形码尺寸改的小一点,让一页尽可能多的排列,让页数变少,但是这样的话页数还是很多,而且条形码的尺寸小不方便扫描。

经过思考,想的办法是,能不能把数据分成多份去打印,但当时用的是window.open()的方法打开新的空白页,但不论是使用window.open()还是模拟a标签点击事件打开多个新标签都会被浏览器拦截。多次尝试下,最终解决办法是:在一个标签解决多次打印问题,将数据分为多份,将第一份数据排版之后,赋值给body进行打印,监听打印事件onafterprint,等到一份打印完成,再次将页面body赋值为新的数据,再次执行window.print()(这里需要设一个setTimeout延迟,否则无法弹出打印预览窗口)进行打印。

3、某生物测量仪器的数据实时上传问题

在处理物联网问题时,遇到最大的问题就是不同品牌的设备数据导出的方式不同,而且数据传输的协议也不同。比如有些是通过蓝牙实时传输,有些可以通过wifi实时传输,大部分是有一个RS232串口的串口。通过串口连接到串口服务器,在将数据实时传输到服务器接口。然后根据不同牌子厂家提供的数据协议、密码等进行解码。这其中遇到几个很难解码的数据格式,甚至于乱码根本解不了。

最后通过长期与厂家和经销商技术员沟通,才知道他的数据连接线需要定制,而他没有提供配套的连接线。最后联系做数据线的供应商才解决这个问题。

这其中有一台设备,没有数据线导出口,他的数据是在电脑软件上实时生成一个xml文件到硬盘中。这就需要写一个脚本,监控文件变动,实时解析xml文件然后将数据传回后台。

最初公司后端他们用java写的脚本,但是编译后软件比较大。当初我正好是在研究Go语言,因为Go语言编译打包后的可执行包很小,所以我直接用Go写了一个脚本。当时也算是小小练手,但最终测试没问题后,被领导采纳了。

4、PAD端uniapp打包

刚开始时候,在PAD端直接使用浏览器,但浏览器还需要输入域名,且需要手动去全屏界面,且无法与安卓的蓝牙进行交互,监控不到蓝牙设备。后来选型使用uniapp,因为uniapp也是用的Vue。但是当初在使用uniapp的时候,还不成熟,遇到过很多问题,文档写的也不太好,有很多问题。所以解决这些问题也用了不少时间。

5、可视化报告快速生成平台

当初公司在做供应链运营的项目,有很多的功能点需要数据可视化分析报告。而且这些报告需要不同的模板,有的需要实时数据,且需要导出PDF、以及线上页面。而且在未来公司开发相关系统也会有这样的需求。为了节省时间,提高开发效率,我向领导提出开发一个数据可视化页面快速开发平台。通过组件拖拽及简单配置,配合导入的数据或接口可快速生成可视化报表页面,可进行导出 PDF、Word 及 Html,也可生成链接嵌入到其他系统,提高公司业务的可视化报表快速开发效率。这里用到的技术是Vue+echarts。

前期的组件封装和模块开发问题不是很大,难点就是公共组件很多,需要封装很多,比如配置项,不同的图表有很多重复的配置项,所用的输入表单太多,如果一个图表就要写一堆表单,太费力。

所以解决方法是封装很多公共的组件,将输入框、下拉框、单选多选等进行二次封装。而界面上的图层也是不同的图表封装不同的组件,如果有相同的配置提取出来,给出默认值。然后在展示的时候使用动态组件形式。

另外拖拽功能、图层叠加、图层缩放、视图界面缩放也花费了不少时间。这里我全部都是用原生写的。使用了很多鼠标事件。也做了节流操作。

最终存到数据库的数据是一个大的json对象,其中包含了报表的信息和图层数据。

最大的问题就是,初期测试,图层过多的话,内存会吃不消。在配置和拖拽操作时会有一点轻微的卡顿。在不断的测试和与同时沟通过程中,发现内存占用过多的就是一些配置项数据等。因为之前是只要创建一个图层,图层相关的数据就一直在内存中,当时是考虑激活的时候配置栏能够响应快一些。

这块解决办法是全部能使用懒加载的操作就使用懒加载。在图层点击激活的时候再加载相关的数据和组件,如果加载较慢就添加loading。在切换图层之后,将不需要的数据进行及时销毁(只保留当前状态,其余如默认值、图层配置项全部置为null)(原先是切换图层之后,由于图层所在组件并没有销毁,所以组件内的数据包括静态的和响应式的全部都在)。

关于职业规划,分几个期限吧。

近期规划

我近期1年的职业规划,是把咱们公司的项目做好。

尽快融入公司,融入团队,熟悉产品和项目的业务和所用的技术。按时完成所需要我完成的工作。争取能够为咱们项目有所贡献。

另外,在工作中,能够提升自己各方面的能力,包括技术和沟通管理能力,比如时间管理、团队协作、带团队能力。

中期规划

在未来2-3年,如果有需要,我打算再研究一门语言,能够更好的为咱们公司服务。

比如Rust,因为Rust对于未来的前端是有必要的。现在很多的前端构建工具和项目使用Rust语言。比如:

  • Deno(新一代的JS运行时)底层是Rust
  • Next.js(React服务端渲染框架)使用Rust编译器,能实现更快速的构建
  • Swc是一个基于rust语言开发的js编译器,利用了rust的安全无gc以及系统级语言的特性,保证了性能是接近原生开发,并且可以充分利用多核cpu。swc 对比 babel有至少 10 倍以上的性能优势

长期规划

长远规划的话,我想着是做技术经理或项目经理。

另外如果咱们公司有合适的晋升机会或人才培养机会,我也会努力争取。

据腾讯微博官方消息,由于业务调整,腾讯微博将于2020年9月28日晚23时59分停止服务和运营,届时将无法登录。

以下为公告全文:

亲爱的用户:

感谢您使用腾讯微博。由于业务调整,腾讯微博将于2020年9目28日晚23时59分停止服务和运营,届时您将无法登录。

如有需要,您可在停止服务前,备份您的相关信息。对此给您带来的不便,我们深表歉意。

感谢您多年来的陪伴、理解与支持!您如有任何疑问,请通过页面下方“意见反馈”问询,我们将尽快反馈,谢谢!

腾讯微博团队

2020年9月4日