采访者|于佳(宗欣)
编辑|蒂娜
闲鱼在2017年推出了Flutter,当时Flutter还远未成熟,业内也没有将Flutter放入现有工程系统进行开发的先例。
之后,这个不足15人的闲鱼团队在工程架构、混合栈调用、封装构造、协作模式等方面做了一些创新,保证了Flutter可以集成到闲鱼现有的客户端工程系统中。2017-2019年期间,闲鱼也不断修复bug,提高Flutter的稳定性,并同步到Google。在实践中沉淀了一套自己的混动技术方案,并开放了颤振增压发动机。
2019年,闲鱼开始大规模落地,推动了Flutter在闲鱼的应用。2020年,闲鱼线主要环节几乎已经完全拥抱了Flutter。这两年,Flutter逐渐在其他企业落地,但同时也不断有质疑的声音。甚至有传言称“闲鱼新业务已经放弃飘起”“相信闲鱼遇到了很大的问题”......
那么,作为Flutter的开创者和探路者,闲鱼在过去几年的摸索过程中是否走了弯路?闲鱼现在面临着怎样的挑战?你会放弃颤振吗?新业务选择了什么技术?相应的技术选择原则是什么?针对这些问题,闲鱼科技团队客户端负责人于佳(宗欣)给我们一一解答。
国内首个引入Flutter的团队
InfoQ:当时闲鱼引入Flutter的主要目的是什么?
于佳(宗信):闲鱼17年研究期间,客户团队不到15人,闲鱼的业务场景可以称之为“小淘宝”,相对复杂。在这种场景下,我们首先需要解决的就是多终端人力共享的问题。多终端人力的好处不仅是一个人可以开发两个终端,而且R&D资源分配灵活性更好(这意味着团队中iOS: Android的比例不再需要1:1,市场上Android的工程师基数比iOS大很多)。
另外,我们希望这项技术适用于移动R&D技术栈,而不是前端技术栈。对于RN和Weex来说,工具链和R&D习惯还是有很大区别的。最后,我们希望这项技术的体验能够接近原生。AOT下的旋舞基本上满足了我们当时的要求。在实际测试过程中,Flutter在低端电脑上的表现要优于未深度优化的详情页上的Native。因此,颤振是根据这三个条件选择的。
2018年试投期间,整个基建和勘探带来了一定的成本。2019年,团队开始正式使用Flutter进行研发。目前整个团队70%的commit来自Dart,基本实现了我们当初的预期。在实际的R&D过程中,我们基本上可以实现要求一个客户投资的目标。
InfoQ:很多人质疑Dart语言,认为它是独特的、小众的,存在一些多层嵌套等问题。你对新语言的应用有什么看法?
于佳(宗欣):语言是我们选择技术方案的因素之一,但却是一个相对较弱的因素。
我们将从几个角度来看:
像多层嵌套这样的问题,可以通过进一步抽象一些控件类或者方法来解决,不是特别大的问题。
InfoQ:闲鱼引入Flutter后有哪些关键创新?使用Flutter有什么好处?
于佳(宗信):闲鱼在这部分做了很多创新,内部申请了很多专利。
有没有想过放弃Flutter?
InfoQ:最近一两年,你在开发Flutter时遇到的最大挑战是什么?这和你第一次使用Flutter时的挑战一样吗?
于佳(宗信):早年作为整个行业的开创者,主要挑战是整个技术生态太差,都需要自己做。另外早期发动机的稳定性也有很大问题。
近年来,随着整个技术的深入运用,以及近两年闲鱼业务的快速发展,越来越多的体验问题被大家提及。所以从去年开始,我们对整个产品进行了一次大改版,客户端的目标是全面优化,为客户端创造更好的产品体验。
所以,在生态逐渐完善之后,我们面临的挑战是如何通过Flutter 实现更精细化的用户体验。去年这部分真的花了我们很多精力。基于这个命题,我们在内存和卡顿方面也开发了更多基于颤振的检测工具,在内存优化和卡顿优化方面也有一些具体的方法。但是不得不说,所有的细节优化都是耗费人力的,Native和Flutter都要投入相当大的精力,所以目前在面向全行业招募客户,希望有兴趣探索Flutter的同学可以联系我。
InfoQ:在混合动力R&D系统下,闲鱼也做了引擎定制,那么官方方案的主要问题是什么?对于普通小企业来说,混合开发的复杂度会不会太高?
于佳(宗信):闲鱼前期有很多改装引擎的动作。我反思了自己当时的一些。一方面真的是因为Flutter不完美。另一方面,在18年左右的时间里,对我们自己的发动机的了解还不够深入。很多时候可以通过更高层的方案来解决,这也是
所以这部分我想说的是,目前官方的方案可以解决90%的问题。如果一定要说定制的话,性能方面还是有些问题的。比如目前闲鱼的首页还是没有用原生的Flutter,只是因为更换后启动加载的体验太差。另外,我们已经尝试通过上层框架解决了一部分在长列表端被大家诟病的卡顿问题,接下来可能还需要底层引擎帮助优化。另外还有一些问题,包括两端字体不一致,输入框体验不一致,需要政府长期优化。
目前主要希望按照主分支走,尽量不要修改Flutter的代码。闲鱼团队会在引擎端储备一些专家,同时会依托团AliFlutter的生态来做事。在支付宝的整个组织中,不同的总线在这一点上也是不同的。比如UC同学更擅长引擎定制,闲鱼团队有大量上层应用框架,淘宝团队提供基于搭建的相关基础设施。这样大部分问题都可以通过大公司内部开源社区解决,可以放心开发。
对于中小企业来说,要搞清楚大家面临的情况。如果早期迭代运行得很快,可能会在细节上做出部分妥协。选择颤振是一条相对清晰的路径。今天的环境比闲鱼的环境完美多了。对于混合动力开发,建议使用颤振助推。在某些场景下,当问题无法快速响应时,还可以使用native进行混合工程。在复杂度方面,单纯引入混合栈能力,整体复杂度一般。
InfoQ:有传言说闲鱼在新业务中不使用Flutter,这让很多人产生了闲鱼放弃Flutter的想法。那么,你在新业务的技术选择上考虑了哪些因素呢?
于佳(宗欣):作为技术决策者,要避免被某项技术绑架,在落地过程中出现失误。与其他技术一样,Flutter最终旨在帮助团队实现商业价值。同时,它只是移动端的一种技术,不宜杀熟和滥用。这也是我特别不想在公开场合回应这件事的原因,因为技术本身取决于适用的场景。
目前按照闲鱼的人员规模和业务规模。对于建筑设计,我的理念是尽可能追求建筑的一致性和简洁性。
整个客户机构的未来在语言方面是Dart First,以尽量减少双方的R&D投资。对于其他集装箱,H5是主要选择。以后尽量减少其他容器的接入,让前端开发回归标准路线。
这里有两个优点:
从设计的角度来看,我们将有几个明确的选择:
关于未来发展
InfoQ:用了多年的Flutter,现在回头看,你觉得哪些公司和场景适合用Flutter?
于佳(宗欣):目前看来,有几个典型场景比较合适:
InfoQ:你认为Flutter未来需要改进哪些地方?
于佳(宗信):从Flutter 2.0发布后与一些一线开发者交流的经验来看,Flutter在跨端性能和细节体验的优化上仍需推进。去年,Flutter在大的战略方向(跨终端)上做得不错,在PC和Web上都有所建树,在与车企和操作系统厂商的合作上也有所进展。但是,回归产品体验和开发者体验还有很长的路要走。很多时候,对于一个严谨的商务党来说,小字体和控件的体验会是最后不选择这项技术的原因。这一部分希望整个开源社区在新的一年能够有所进步。在我们AliFlutter组织内部,以UC内核团队为首的同学在这方面有很多沉淀和PR,在内部引擎制定方面有很多经验提升。未来,在AliFlutter组织中,我们不仅会完善整个公司的基础设施,还会更加注重细节经验,为其他开发学员沉淀一些最佳实践。你会在两个月内看到我们最新出版的书籍。欢迎交流。
InfoQ: Flutter 2.0来了,Flutter会成为主流选择吗?
于佳(宗欣):你能告诉我我对Flutter未来的判断吗?一方面,在未来操作系统很可能拆分、多终端的场景下,Flutter会有一个比较好的发展。跨平台本身在成本端对企业尤其是互联网公司的需求很大。但是从历史经验来看,Flutter只是一个渲染引擎。即使在今天的游戏开发中,有了完善的游戏引擎和配套工具,一些功能模块(比如社区/直播功能)仍然是一个混合框架,所以混合开发必然一直存在。能否成为未来整个移动R&D的主流,我无法给出答案,但可以肯定的是,在生态更加完善之后,它将成为客户端R&D在某个历史阶段的又一种常见技术选择。
嘉宾介绍:
于佳,花名宗欣[/s2/],闲鱼技术团队客户端负责人。2012年毕业于阿里巴巴,经历了集团无线转型的重要时期,参与了集团多个重量级app和移动中间件的设计开发,是多年的客户端老兵。2014年,我参与了手机淘宝iOS客户端的架构升级,首次完成了对百人团队并行开发的支持。同年,我牵头将手机天猫客户端基础架构和交易链路整合到手机淘宝架构,为手机淘宝作为未来集团的无线中间站打下了坚实的基础。2015年加入闲鱼客户端团队,负责客户端架构和团队建设。工作期间,完成了基于Flutter混合架构的闲鱼客户端整体架构设计,完善了工程系统中Flutter的持续集成和高可用系统的支持,推动了闲鱼主链路业务的Flutter化。未来我们将持续关注终端技术的演进和发展趋势。