反思一次效能提升

6a31fbde638cba412852debaaf04fe92.jpeg

前天与一个大佬交流。想起自己在6年多前在团队里做的一次小小的效能提升。

改进前

在同一个产品团队,同时有前端工程师和后端工程师。他们经常需要共同协作完成features。

前端是一个传统的多页应用。前端渲染是由后端的velocity模板引擎实现的。

打包后,最终执行就是一个jar包:![[hellojar.png]] vm文件后缀名是velocity模板文件。它们内容大概是这样的:

<html>
  <body>
    Hello $customer.Name!
    <table>
    #foreach( $mud in $mudsOnSpecial )
      #if ( $customer.hasPurchased($mud) )
        <tr>
          <td>
            $flogger.getPromo( $mud )
          </td>
        </tr>
      #end
    #end
    </table>
  </body>
</html>

其中一些非html代码就是Velocity Template Language。

默认情况下,一个前端工程师是不懂这门模板语言的。而且,这种模板语言对浏览器不友好,不像Thymeleaf。同时,按前端的开发习惯,他们是不可能先启动你一个Java进程后,再对前端页面进行调试。

总的来说,这样的技术栈是不利于前端本地开发的。

所以,在改进前,前后端的协作的方式是:

  1. 1. 前后端同时进行开发;

  2. 2. 后端负责在Java工程中实现后端的逻辑;

  3. 3. 前端负责在另一个独立的前端工程中开发HTML和CSS;

  4. 4. 前端完成页面的开发后,他会把前端页面html文件名和页面的逻辑告诉后端;

  5. 5. 后端再把html页面里内容与Java工程中的vm进行对比,然后将不同的部分转换到Java工程的vm模板页面中。

这样的协作方式下,经常出现以下问题:

  1. 1. 在将html转换到vm模板的过程中,后端有时会转换漏内容;

  2. 2. 转换后,前端调试前端问题会很麻烦。前端需要占用一个后端和他一起调试。因为前端不懂如何启动复杂的后端工程;

  3. 3. 命名上经常出现不一致,进而导致前端bug。对于同一个概念的情况下,前端命名叫item,后端叫project;

效能提升措施与效果

经分析,以上问题均由“技术之间的转换”导致,即人工的将html页面从一个前端工程转换到一个后端工程的vm模板语言。

所以,解决以上问题的思路就是:最好能消除html和vm的转换,又或者能减少这个转换过程的失误。

思路有了以后,解决方案有以下几个:

  1. 1. 更换前端技术栈,不再使用Java+vm模板;

  2. 2. 让前端学习vm模板语言,转换过程由前端完成;

  3. 3. 优化后端开发在本地启动的流程,方便前端也能在本地启动;

  4. 4. 减小测试环境的部署难度。让任何人都可以部署,方便前端进行调试。

方案1短时间无法做到,而且改动巨大,收益也未知。所以,最终是同时做了2、3、4。

虽然当时没有进行度量,但实际效果就是前文提到的所有问题都得到了减轻。

原因就是方案2、3、4,减少了前端需要向后端传递的信息。很多事情,前端一个人就可以解决了。

关于方案2、3,可能有人会好奇:前端去学习一门新的模板语言,成本大吗?前端在本地启动一个后端的工程去调试前端代码,成本高吗?

首先,vm模板并不是一门难的语言,只要有类C语言的基础(比如Java、JavaScript、C#等),都不难学。无非就是if-else判断、变量定义、循环等。

其次,在后端优化本地开发环境后,前端启动一个Java工程并不是一件难事。

反思

整个事件下来,本质上是前端本地开发习惯与现有技术栈的冲突。这次效能的提升需要前端开发做一些工作习惯上妥协。

而这只是表面上的问题,我们需要去思考更深层的问题:

  1. 1. 团队成员在改进前为什么一直没有考虑如何改进呢?又或者不知道该如何改进?

  2. 2. 对于这次效能改进,感观上是提升了,但是该如何度量呢?

思考问题1是为了让团队的所有的人有意识和思路地提升效能。思考问题2是为了让实践有数据支撑。

答案是什么呢?留给读者朋友思考。

Meta的降本增效三大招:

  • Meta降本增效大招之:自动删除数据

  • Meta降本增效大招之:自动清理死代码

  • Meta降本增效大招之:弃用产品

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/188236.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

“不得了·放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开

“不得了放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开 为了更好地推动四川省健身健美运动的普及和发展&#xff0c;结合《四川全民健身实施计划》的现状&#xff0c;适应新时代健身私教服务产业的发展需求&#xff0c;由中国健美协会指导&#xff0c;四川省健美健美…

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

如何通过ShardingJDBC进行读写分离

背景信息&#xff1a; 面对日益增加的系统访问量&#xff0c;数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说&#xff0c;将数据库拆分为主库和从库。其中主库负责处理事务性的增删改操作&#xff0c;从库负责处理查询操作&#…

【Qt绘制仪表盘】

目的 使用Qt的绘制事件绘制一个仪表盘 思路 需要创建一个带绘制事件的控件重写绘制事件显示 实现 以下是实现代码&#xff0c;可复制到程序到&#xff0c;直接运行。 .h // GaugeWidget.h #ifndef GAUGEWIDGET_H #define GAUGEWIDGET_H#include <QWidget>class Ga…

Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/3)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

【WSA】无法打开 适用于 Android™ 的 Windows 子系统,因为它处于脱机状态。可能缺少存储设备,或者存储设备已断开连接。

问题描述 之前可以正常使用适用于 Android™ 的 Windows 子系统&#xff08;WSA&#xff09;&#xff0c;但突然间无法启动了。 当尝试启动WSA中的软件时&#xff0c;都会出现以下错误提示&#xff1a; 无法打开 适用于 Android™ 的 Windows 子系统&#xff0c;因为它处于脱…

《微信小程序开发从入门到实战》学习三十

3.4 开发参与投票页面 3.3.7 获取用户信息 如果投票是实名投票&#xff0c;那么用户点击完成确认投票时&#xff0c;需要将用户投票信息和用户昵称一起提交&#xff0c;可以在JS文件中使用API接口wx.getuserInfo获取用户的信息。 使用wx.getUserInfo接口前需要对获取 用户信…

C语言—二维数组

一、二维数组的创建 int arr[3][4];char arr[3][5];double arr[2][4]; 数组创建&#xff1a;“[ ]”中要给一个常量&#xff0c;不能使用变量 二、二维数组的初始化 int arr[3][4]{1,2,3,4};int arr[3][4]{{1,2},{4,5}};int arr[][4]{{2,3},{4,5}}; 前面的为行&#xff0c…

ethernet II 的故事

以太帧有很多种类型。不同类型的帧具有不同的格式和MTU值。但在同种物理媒体上都可同时存在。 以太网第二版或者称之为Ethernet II 帧&#xff0c;DIX帧&#xff0c;是最常见的帧类型。并通常直接被IP协议使用。 格式 当数据帧到达网卡时&#xff0c;网卡要先去掉前导码&#…

leetcode刷题详解四

25. K 个一组翻转链表 这道题本质上还是用的反转前n个链表的思想。 具体细节如下&#xff1a; 先调用一次函数&#xff0c;使用一个newHead接受返回值&#xff0c;这个是为了方便最后函数的返回。 调用reverseN这个函数的时候&#xff0c;要标记反转这段链表的前置节点和后置节…

用户与组管理:如何在服务器系统中管理用户和权限

你是否想过&#xff0c;当你登录到一个服务器系统时&#xff0c;你是如何被识别和授权的&#xff1f;你是否知道&#xff0c;你可以通过创建和管理用户和组来简化和优化你的系统管理工作&#xff1f;你是否想了解一些常用的用户和组管理命令和技巧&#xff1f;如果你的答案是肯…

接口测试场景:怎么实现登录之后,需要进行昵称修改?

在接口测试中有一个这样的场景&#xff1a;登录之后&#xff0c;需要进行昵称修改&#xff0c;怎么实现&#xff1f; 首先我们分别看下登录、昵称修改的接口说明&#xff1a; 以上业务中补充一点&#xff0c;昵称修改&#xff0c;还需要添加请求头Authorization传登录获取的to…

03_MySQL基本SQL语句讲解

#课程目标 能够创建、删除数据表能够对表里的数据记录进行增加、删除、修改、查询操作能够创建、删除用户能够给用户授权并回收权限了解delete和truncate语句的区别 #一、数据库基本操作 ##1、查看数据库相关信息 mysql> show databases; 查看所有数据库 mysql>…

js逆向-某敏感网站登录参数分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 前言 目标网站&#xff1a;aHR0cHM6Ly9tZGZnaGcuNXhwb2lqaHRm…

字符串转换成十进制整数

编程要求 输入一个以#结束的字符串&#xff0c;本题要求滤去所有的非十六进制字符&#xff08;不分大小写&#xff09;&#xff0c;组成一个新的表示十六进制数字的字符串&#xff0c;然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#xff0c;则…

【阿里云】图像识别 智能分类识别 增加网络控制功能点(三)

一、增加网络控制功能 实现需求TCP 心跳机制解决Soket异常断开问题 二、Linux内核提供了通过sysctl命令查看和配置TCP KeepAlive参数的方法。 查看当前系统的TCP KeepAlive参数修改TCP KeepAlive参数 三、C语言实现TCP KeepAlive功能 四、setsockopt用于设置套接字选项的系…

王者荣耀——Java

代码如下&#xff1a; sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\Desk…

linux账户管理实例二

要求&#xff1a;我的 用户pro1&#xff0c;pro2&#xff0c;pro3是同一个项目开发人员&#xff0c;想让这三个人用户在同一个目录下工作&#xff0c;但这三个人拥有自己的主文件夹和基本的私有用户组&#xff0c;工作目录为/srv/projecta&#xff0c;如何实现&#xff1f; 分…

吴恩达《机器学习》10-1-10-3:决定下一步做什么、评估一个假设、模型选择和交叉验证集

一、决定下一步做什么 在机器学习的学习过程中&#xff0c;我们已经接触了许多不同的学习算法&#xff0c;逐渐深入了解了先进的机器学习技术。然而&#xff0c;即使在了解了这些算法的情况下&#xff0c;仍然存在一些差距&#xff0c;有些人能够高效而有力地运用这些算法&…