大型程序是如何开发的_大型小程序如何研发提效

d74be5d18e6a06647291502527be2c1a.png

作者:王梦君

微信公众号:滴滴顺风车技术

出处:https://mp.weixin.qq.com/s/M1VArJ_ORY-eXSKzD6ysQw

导读:

自2016年小程序诞生以来,小程序以其“用完即走”的设计理念,以及简单易上手的开发模式,吸引了大批的小程序使用者以及开发者,随着小程序市场越来越大,相应的小程序开发者也越来越多,与此同时出现的各类小程序开发第三方框架也层出不穷。

一、小程序开发模式

小程序开发模式整体来说有两种,一种是原生小程序开发,一种是第三方框架开发。

e3375b18dde18dd9b0a842b0f1a5023e.png

整体来看小程序原生开发只能适配在对应的单独App中运行,不能提供比较全面的可以跨多端的开发能力,在有多端小程序应用需求的情况下,比较浪费人力

另外一种方案则是利用跨端框架,这种方案开发的应用一般可以达到“一套代码,多端运行”的基本目标,可以大量的节省人力,提高效率。

跨端框架开发小程序固然有很多优点,但是这种开发模式也会有一些问题,比如核心问题就是编译耗时长、开发体验差、前后端耦合等

本篇文章主要分享使用 Chameleon 框架在开发业务小程序应用过程中遇到的痛点问题,以及如何解决的心路历程。

同时也欢迎大家多多关注我们 ,Github地址:https://github.com/didi/chameleon

二、业务开发面临的痛点问题

1.业务开发面临的痛点问题

我们在小程序开发中遇到的痛点问题主要包括两方面

  • 场景构造难:强依赖后端接口和手动操作流程
  • 编译耗时长:第三方框架编译和开发者工具编译耗时极长
8a634cc8a99482a9cabb7f27200cdefb.png

【场景构造难】

我们的业务开发中很多场景,包括发单场景、收到邀请场景、等待车主邀请场景、被多个车主邀请场景、各种管控策略场景等,都强依赖后端接口以及强依赖人工操作某些流程,从乘客发单到被车主接单,需要乘客账号、车主账号(某些场景下需要多个手机多个账号)进行协助构造某些场景,甚至很多情况下, 构造场景耗时间占用开发50%的时间,严重影响开发流程和开发效率 。

814557e33e96639e142b265c99360b11.png

极端情况下,可能几十行代码的增减,就需要耗费一天的时间,大量的人力浪费在构造场景、多个手机发单接单等等本不应该有的流程上,令人痛苦不堪。

【编译耗时长】

从开发者第一次启动项目开发,到编码之后保存热更新编译,Chameleon框架编译的源码在小程序开发者工具会再次消耗编译耗时。

小程序原生开发过程中,编译耗时主要集中在 小程序开发者工具 这一个过程。

而第三方框架开发,编译耗时则主要集中在 框架编译 + 小程序开发者工具 这两个过程。

同时 第三方框架编译的源码的大小 也会直接的影响 小程序开发者工具编译耗时

42b76fdf398b7f23cfeb77c05078afa4.png

对于编译耗时长的问题,特别是前端开发而言,需要实时查看代码变更到UI的效果,多次保存就会多次构建,即使仅仅写了一行代码,甚至一个空格的变更,保存之后都会引起重新编译

这个编译是让很容易让人抓狂和崩溃的,最宝贵的开发时间都浪费在了等待上,项目再紧急也要等着这些令人难以忍受的编译过程一直转圈圈, 严重影响开发效率,严重浪费人力成本,严重影响项目进度。

2.如何解决业务上的痛点问题?

针对场景构造难的问题,核心原因是

  • 前后端强耦合,各种场景强依赖开发人员人工操作复现
  • 前端缺少基本的数据体系建设,对于各种场景的后端数据结构缺少基本的收集规整

针对编译耗时长的问题,核心原因是

  • 从代码开发到小程序开发者工具展示要经历框架编译和小程序开发者工具编译两个过程
  • 对于业务代码量大的情况下,编译的文件个数和文件体积会更多更大,同时会进一步影响这两个构建编译的耗时

那么如何解决上述核心痛点问题呢?

我们团队采用了 "微型前端应用" 这样的思路进行单点突破,化解面临的棘手问题,逐个击破,成功的解决了开发效率极低,人力成本极为浪费,开发体验极差的情况。

3.解决方案

  • 服务层:构建本地数据体系,规整各种状态数据结构,建设开发规范,梳理开发文档
  • 应用层+业务层:将应用层的代码和业务层的抽象进行对应,支持路由和分包的自动化配置,支持按需构建要开发的单页面,这样从源头上解决了要构建编译大量代码而引起的编译耗时长的问题

同时团队进行了历史问题梳理,文档建设,数据体系梳理等,将以往阻塞开发的问题一一扫除,最终开发效率得以提升 50% ~ 80%

4507fae2b27122a87e778185f69d23c0.png

三、解决场景构造难

95d6cf53540d6aeda6053d75c899de48.png

对于小程序开发中很多页面强依赖人工操作和严重缺失前端数据体系这样的问题,我们通过

  • 建立本地数据体系,前后端分离
  • 区分开发环境和生产环境请求域名
    • 开发环境下支持配置请求的域名,请求转发,支持切换请求环境
    • 生产环境下则请求线上环境
3a9666e82b0c3230c40c8e7620495f1c.png

我们可以看下改造前后的前后端交互和开发模式上的一些不同点

前后端分离,彻底解决原来前后端强耦合情况

9261698ee3a7828bea8083e4c4cd9df6.png

自建前端数据体系中心, 开发页面直达 ,免除诸多人工操作进行场景复现等繁琐流程

6240b76bf32e8f9ed53b5394cdc03fec.png
3008552cec21a0bcb9bdaf7c1d9c8401.png

参考:

https://github.com/chameleon-team/cml-best-practice/tree/master/mock

4ca3be227fa9b9253151db5d3dbe6a3e.png

四、解决编译耗时长

802bc07825218c02b0019fd3043cc261.png

【编译层适配优化】

编译耗时长的根源是【框架编译】+【开发者工具编译耗时】

a64507a698b0548b69178e38a29301e6.png

编译层的优化,并不能大幅度提升开发效率

【业务层适配优化】

那么业务层是否能够有优化手段呢?

189ae772923b1da9a6b47cc9c0bfadd0.png

根据上面的分析可以看到,当我们所有的业务代码全部参与构建的时候,会严重影响框架编译的速度和开发者工具二次编译的速度,能否从业务层,对各个模块进行拆分,独立构建呢?

业务层原来的构建模式:

所有的业务代码都参与构建,各个模块之间强耦合,前后端强耦合,每次构建极为耗时,严重影响开发效率、开发体验,甚至影响开发进度。

e0d6e00505ae7216ab2e7bbbbe959d23.png

业务层优化后的构建模式:

依赖于自建前端数据中心,前后端分离,使得前端页面可以以“微型前端应用”的思想进行单独构建,大大减少了要编译构建的内容,大幅度提高了开发效率。

d1b78d0c70a4abaa4243d6c516bc525f.png

参考

https://github.com/chameleon-team/cml-best-practice/blob/master/dev-optimize.js

基本的思路就是通过脚本自动化配置要参与构建的路由,每次开发的时候只将要开发的页面配置到路由表中,这样可以大大降低要参与构建的内容。

最终,我们的编译耗时问题得以有效地解决

7a15eed7362496a407c33e833723d339.png

以上介绍了基本的实现思路和优化方案,同时我也整理了一个简单实现案例,方便给大家参考

https://github.com/chameleon-team/cml-best-practice

五.总结

日常开发中,我们面临的问题无非是 开发提效、业务开发、性能优化

其中 开发效率 会直接影响后续的 业务开发以及性能优化 等后续工作。

日常开发中的效率提升要重点注意和优化, 任何阻塞开发的流程和痛点问题都要及时解决 ,绝对不要忍受项目开发中的各种低效率问题, 万不可听之任之, 等到项目复杂庞大到无法变更、无法优化、甚至无法开发的地步,那个时候再想去优化开发效率将会更加棘手。

作者:王梦君

微信公众号:滴滴顺风车技术

出处:https://mp.weixin.qq.com/s/M1VArJ_ORY-eXSKzD6ysQw

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c 语言栈,C语言栈

C语言实现简单的栈结构今天看到一个问题是要交换两个变量的值并且不能使用中间变量,首先想到的方法就是用数学的方法:int a 10,b 12;a a b; // 求和b a - b; // 和减去b得到的是a的值a a - b; // 和减去a(此时的b是最初a的值)得到b 的值这种方法很…

【WebRTC---入门篇】(七)MediaStream

MediaStream方法 MediaStream.addTrack( ) 功能:向流媒体中加入不同的轨 MediaStream.removeTrack( ) 功能:从流媒体中移除不同的轨 MediaStream.getVideoTracks( ) 功能:从流媒体中取出所有的视频轨 MediaStream.getAudioTracks( …

jvm 宕机 打印jvm_通过入侵JVM打印阵列

jvm 宕机 打印jvm总览 Java中最常见的陷阱之一就是知道如何打印数组。 如果有关如何打印阵列的答案获得了超过1000票赞成票,那么您必须怀疑是否有更简单的方法。 几乎所有其他流行语言都具有这种更简单的方法,所以我不清楚为什么Java仍会这样做。 与其他…

python数码时钟代码_Python+Pyqt实现简单GUI电子时钟

本文实例为大家分享了PythonPyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQt5.QtGui import * from PyQt5.QtCore im…

两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...

本处设计一个网页投票器,它访问“www.zhiliaowang.com”上的服务程序“/toupiaoceshi.asp”,并通过“name”参数向选手投票。如代码15-16所示:代码15-16网页投票器(节自/code/chapter15/http1.c)#include char buf2[]/*组装HTTP协议GET请求报…

【WebRTC---入门篇】(八)WebRTC核心之RTP Medio 媒体控制与数据统计

RTCPeerConnection底层是通过RTP Medio实现的,处理真正数据传输,编码流量各种控制的实现。 Receiver 通过 getReceivers 可以获取一组RTCRtpReceiver对象,用于接收数据 Sender 通过getSenders 可以获取一组RTCRtpSender对象,用于发送数据,每个对象对应一个媒体轨 RTCR…

事件驱动程序设计_简单的事件驱动设计

事件驱动程序设计总览 开发人员经常询问系统或其代码的性能或效率。 这到底是什么意思? 我的代码是如此高效,只有编码神能理解它的工作原理。 我的代码确实很聪明,但是却难以维护。 下一位开发人员将继续重写它。 我的代码对机器确实很有效…

python语言中的单行注释语句_Python 1基础语法一(注释、行与缩进、多行语句、空行和代码组)...

#第一个注释 print ("Hello, Python!") #第二个注释 输出结果为:RESTART: E:/python/change.py Hello, Python! 多行注释可以用多个 # 号,还有 和 """:实例如下: #第一个注释#第二个注释 第三注释 第四…

c语言文件的读写通讯录,学C三个月了,学了文件,用C语言写了个通讯录程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #include struct QQ //结构体,有6个成员{char name[20];char age[5];char tel[15];char qq[15];char birth[12];char address[80];}user;void style()//窗口风格函数{system("mode con…

【WebRTC---入门篇】(九)WebRTC网络基础:P2P/STUN/TURN/ICE

NAT 作用:内网地址转公网地址 STUN 作用:中介将公网信息彼此交换 TURN 作用:P2P不成功的话在云端架设服务器,双方进入同一房间。可以在一起进行数据交互 ICE 作用:打包以上取最优,先尝试P2P。如果P2P不通再选择TURN。ICE尝试所有可能性 Relay是TURN Server,大多数情况…

antlr4例子_ANTLR和网络:一个简单的例子

antlr4例子网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序。 因此,我非常习惯在自己的机器上安装工具。 但是在2016年,网络无处不在,因此那里也可能需要我们的语言。 可能的情况: ANTLR 也在…

python 形参_python中参数总结

一、形参和实参 函数参数的作用是传递数据给函数使用。 在使用的过程中,参数有两种形式:形式参数和实际参数 形参:定义函数时的参数 实参:调用函数时的参数 根据实际参数类型不同,将实际参数传递给形参的方式有两种&am…

【WebRTC---入门篇】(十)NAT

NAT主要用于内网穿透 NAT产生原因 NAT的种类 NAT穿越原理 完全锥型:内网主机先向外发送一个请求形成IP和port

linux安装mq报5724,小白提问:linux安装MQ出现的错误

在安装MQ中遇到以下问题,求大神帮助# ./mqlicense.sh -acceptLicensed Materials - Property of IBM 5724-H72 (C) Copyright IBM Corporation 1994, 2009 All rights reserved.US Gover...显示全部在安装MQ中遇到以下问题,求大神帮助…

maven java1.7_本周Java技巧#7 – Maven慢吗?

maven java1.7本周Java本周技巧是有关Maven的上一期的后续内容。 第一个视频介绍了与Maven依赖关系有关的方面。 该视频将介绍一些加快Maven构建速度的技术。 Maven慢吗? 从Maven 3开始,您可以并行运行构建。 根据构建机器和项目结构的不同,…

vector 删除指定元素_std::vector简介

引入使用vector&#xff0c;需添加头文件#include<vector>&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include<algorithm>。简介vector是表示可以改变大小的数组的序列容器。就像数组一样&#xff0c;vector使用连续存储空间存储元素&#xff0c;这…

【WebRTC---入门篇】(十一)STUN协议

STUN作用:用于NAT穿越;它是典型的CS模式 RFC STUN规范 STUN header STUN Header格式

linux dd iflag oflag,centos – dd oflag =直接5倍速

我在这个规格的服务器中有Centos 6.2&#xff1a;2xcpu 16 Core AMD Opteron 6282 SE64GB RAMRaid controller H700 1GB cache NV- 2HD 74GB SAS 15Krpm RAID1 stripe 16k (OS Centos 6.2) sda- 4HD 146GB SAS 15Krpm RAID10 stripe 16k (ext4 bs 4096,no barriers) sdb -> …

mysql数据迁移到sqlserver_一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、postgres、SQLITE...

这是一个.net下操作数据库(结构数据库)的工具类&#xff0c;支持sqlserver、oracle、mysql、postgres、sqlite、access等常见数据库。注意&#xff1a;它并不是一个orm工具(常见的orm框架如&#xff1a;EF、Dapper等)。2.1 引入DBUtil依赖1. 首先打开vs(推荐vs2019)&#xff0c…

【H.264/AVC视频编解码技术】第二章【H264码流分析】

H264码流分层 NAL层,视频数据网络抽象层,作用是控制二进制数据的传输,主要用于网络传输。 VCL层,视频数据编码层。 VCL结构关系 NALU NAL Header (1B)+ RBSP H264码流中NALU sps pps IDR帧的理解 概念 什么是NALU? H264码流可以分为两层,VCL层和NAL层,NAL的全称…