掘金 AMA - 听闲鱼客户端架构师宗心谈 Flutter 和他的团队

3,630 阅读18分钟

一周前的 沸点,掘金团队请来了闲鱼技术团队 Leader、闲鱼客户端架构师、Flutter 布道者的作者 @宗心 (于佳) 做了为期三天的 Ask Me Anything (AMA) 活动。我们在此精选了一些来自用户的提问及宗心的回答。

关于宗心:

掘金 AMA:@宗心(于佳)

社区小伙伴提问

如何看待目前大前端这个概念? ─ @一缕殇流化隐半边冰霜

想问宗心两个问题:

  1. 如何看待目前大前端这个概念的,大前端之所以为大,是因为涉及的面比较广,那前端的边界在哪里呢?前后端以 Nginx 为界么?那前端在 Nginx 之前的所有事情都可以做么?在我们这边还是有大前端的概念,我们大前端甚至也会接触到后端 mysql 这些。不过我看在阿里集团内部,这个概念好像并没有,内部好像是客户端终端团队,前端团队。

  2. 我之所以会问前一个问题,其实是因为在大前端的概念里,不管是前端的 leader 想带领好客户端同学往前进,还是客户端的 leader 想带领好前端的同学往前进,都是挺不容易的,虽然两者有结合点,但是在纵深方向两者差异挺大的。阿里内部是如何处理好这种问题的呢?

1.我其实觉得工种的细分,一定还是有原因的,所以其实针对大前端的概念,一方面我希望客户端的同学能拥有部分前端的知识,扩展自己的边界,另一方面,我很敬畏这件事情,曾经我以为我的团队特别优秀,一个月就可以全团队切换到weex,而且还能保证大项目的落地,但在后续的过程中随着对知识体系的深入了解,我发现,很多事情我们在短期内是无法搞定的,比如我们不擅长玩法和运营活动相关的事情,而且我们在weex的代码规范和工具体系建设上,实话说还是需要我们的前端团队以及我们自己的weex专家来帮助。所以我觉得尤其在大公司,要保证某些场景下的专精的情况下,分工依然在。这也是为什么公司没说大家都走全栈的原因。但大家可以在各自栈的场景下多走一步,多创造一些可能性,比如客户端会了weex可以在部分产品上使用该技术,比如店铺,比如闲鱼号,另外客户端同学能不能学点AI相关的东西呢,在端侧把tf-lite的工程体系用起来。总之,我希望的大前端概念上,应该有一定的跨栈能力,但不用做到都非常专精,依然还是在自己的领域有自己的专长。

2.对于leader来讲,在不停承担责任的同时,这个问题一定都会出现,试想我之前只做iOS带iOS团队,后来带android,我android勉强还可以吧,再做flutter要学flutter,再如果让我带服务端呢?我还是要会,但作为TL,我需不需要都是团队第一,我觉得不是,否则你带的团队一定很菜,所有人都不如你,那你就是团队的天花板,所以TL在技术上我来看,要有自己的专业度和方法论。再有就是业务TL一定要有广度,我的老板服务端出身,做客户端他肯定做不过我,但他的广度上面,他看业务的角度以及破局的能力,老实说高我好几个段位,那这就是他给予团队的独特性,所以我觉得如果今后我要做一个好的TL,我也需要补充这些内容,而深度的话,我觉得会能找到更多比我更专业的同学,一起做的更好。TL最重要的作用,是他有没有给公司带来一支有想象力的团队,这个应该就是阿里对TL的要求,聚人成事,借事修人

在面大厂的时候,简历、面试该关注哪些点?或者说,你招人的时候看中候选人的什么特性呢? ─ @永远的根号三

你好,我本科读的机械专业转的安卓开发,现在在一个不到 20 人的初创小公司,请问像我这种非科班出身的程序员,在面大厂的时候,简历、面试该关注哪些点呢?或者换句话,你们找人的时候看中候选人的什么特性呢?学历我也是 985 的只是非计算机专业出身

你好,我相信这个也是很多同学关心的问题,校招的同学如果有问题我单独再讲,社招的同学,除了经验和技能上的要求以外,我想突出说两点,一个是希望在做事情的时候有自己的思考和总结,比如你做的项目,好在哪里,有什么问题,后续要怎么解决,度量标准是什么,这个很重要,我们希望这个同学是不断思考持续进步的,送大家一句话,if you cannot measure it,how to improve it。第二点,好奇心,除了你本职工作以外,想不想了解你上下游的同学在做什么,这个业务整体架构是什么,你们公司在端侧核心竞争力的那些代码是怎么实现的,为什么这么做,业内流行趋势是什么,有没有尝试过,怎么看这些技术的未来。我在面试每位同学的时候,打心里希望大家都能过,因为我们真的非常缺人,但可能很多同学在工作以后,没有以上两点意识,造成后续的积累就会比较慢,这里讲给你,也希望能帮助更多同学成就更好的自己,找到好工作。

基于什么样的考虑选择在闲鱼客户端中使用 Flutter ?─ @liutao

你好,新技术刚发布的时候,通常都有很多未知的坑要去填,风险比较大,所以很多技术团队都不会第一时间去选择新技术来开发业务,请问你和团队当时是基于什么考虑选择在闲鱼客户端中使用 Flutter ?

讲一下心路历程,确切的说我们是在去年flutter还在alpha版本的时候就已经跟进了,开始的时候更多的是做预研部分的事情,比如做了一个内部国际版的闲鱼,完全基于flutter的,整个工具链和flutter的内部原理我们都趟过一遍,在我看来flutter的设计思想比较先进,在ui的兼容性以及性能上,较其他的跨平台框架是有较大优势的,加上我们跟google的flutter团队建立了长期的完善的交流机制,为后续的落地打下了比较坚实的基础,另外,我在flutter上看到了未来跨终端上友好的扩展性,据我所知google团队已经完成了flutter在mac上的demo,后续是否可以在其他桌面操作系统和iot设备上应用,让我们拭目以待。我们在一年的调研沉淀以后,基于上述的原因,选择了flutter在闲鱼业务线的尝试和落地,目前看起来,会有少部分兼容性问题,但整体来看,距离大面积商业应用已经比较近了。

请闲鱼使用 Flutter 开发时,移动客户端的分工是怎样的 ?─ @NeXT

请闲鱼使用 Flutter 开发时,移动客户端的分工是怎样的?会有专人进行 Flutter 的开发还是 Android 和 iOS 都要参与到 Flutter 的开发和学习中?会考虑更大范围使用 Flutter 吗?

很好的问题,闲鱼在使用过程中,采取了混合工程的场景,所以确实是有专人写flutter,部分同学仍然开发native的代码的,所以这个过程中,如果希望平滑的做技术栈的切换,我们在工程改造上做了很大的努力,研发模式上,我们针对native和flutter的同学有两种开发模式,比较好切换,对native同学来说,是感知不知道flutter存在的,当然,未来我们希望在业务代码测逐渐切换成flutter。

为何阿里一直在基于其他技术做改造 ?─ 令狐洋葱

为何阿里产出不了类似react, webpack, babel, flutter等框架/工具,一直在基于其他技术做改造 ?

我跟google团队接触的过程中,确实能看到,跟世界最顶端的公司相比,我们的技术水平上确实还是有一定的差距,我觉得没什么,正视差距跟优秀的团队看齐,继续努力学习他们的优势,把他们的优势带回来,另外,公司在工程化和技术的商业化上,我觉得做的挺好,只要能产生商业价值,基于这些现有的架构体系改造是最快的。

淘宝为啥不把首页改为flutter ?─ @快乐有家

问个无关的问题。很多人都已经把淘宝作为新时代的跑分软件了,卡的死人的淘宝为啥不把首页改为flutter ?

淘宝首页其实使用了另一种模版引擎的技术叫dynamic,是我的其他同事做的,相比weex来讲,主要负责模版的渲染,会更轻量一些,如果考虑首页的方案,建议也可以去看下天猫的同学的Tangram的方案,是比较完善的。我看来现阶段flutter的初次加载,其实也比较慢一些,可能还达不到首页的加载效果,我们正在考虑优化这个加载过程。

怎么在flutter里处理h5链接跳转,flutter和native间的数据传递和状态保存怎么管理 ?─ @不万能的喜剧6

一般用flutter结合native去写的时候,怎么在flutter里面处理h5链接跳转,flutter和native之间的数据传递和状态保存又是怎么管理的呢?

1.第一个问题,我这边的场景会有一个统一的openurl方法,在native侧,native调用大家应该都很清楚,flutter的调用的话,写一个plugin,调用dart的openurl方法通过channel机制转到native的openurl统一处理即可,剩下的不管是什么链接,都跟native的处理方式是一样的。

2.第二个问题的数据传递和状态保存是个难点,因为flultter对native的数据传递都是copy生成一份的,所以native和flutter的状态就是两份,不同步的,目前如果有变更我们主要还是采取通知的方式,但处理起来还是有点不优雅,有更好的方案可以跟我们交流哈,我自己的希望是,可能后续都存在一边会比较好,不管是flutter还是native,理论上来讲可能是flutter,因为后续希望把剩余的native代码迁走。

一般19届的进去,需要什么样的条件呢 ?─ @山鬼

19届的同学看你投递的岗位哈,我目前也在负责闲鱼的校招,对大部分同学来说,建议投递工程相关的岗位,比如java研发,客户端开发等,要求一般是三点:1.基础,要求重点学科优秀,对数据结构/算法/操作系统原理/计算机网络等掌握扎实,或在某个领域有特别的特长 2.热情,了解目前广泛应用的技术,有自己的学习技术的路径,对某一领域有自己的强烈好奇心,并愿意额外投入很多精力,并最终能取得好的结果3.成果,这个主要指专注于某一个领域,深入了解了技术在实际场景的应用,可以通过自己专注的领域去解决实际问题,或者有重要学术论文和专利。

满足两条的同学是最低要求,满足三条的同学一般比较合适。希望能帮到你。

如何管理一个技术团队?在团队管理上你踩过那些坑 ?─ @一百一

宗心大佬我想问下,你们技术团队现在有多少人?如何管理一个技术团队?在团队管理上你踩过那些坑?

我们大技术团队大概70多人吧,还属于一个比较小的团队,当然我们希望能在今年招到更多优秀的同学做同事,我的目前团队大概不到20名同学,都是我招进来的。

我觉得技术团队的管理相对简单一些,比较重要的其实是要关注大家的成长,自己需要在大的框架目标确定后,在过程中放权和训练团队的思考能力,让团队同学在重要的事情上面形成自己的判断和决定,引导他们思考,而不是直接给他们结论,其实总结起来也很简单,就是一切都是以团队同学的成长为出发点思考,并不断沟通和对焦,怀着对大家负责的心,应该就能做好。

踩坑上面,我觉得我犯得比较大的错误是我刚带团队那会儿,自己是p7,团队大部分同学是p5和p6,招进来新同学的时候,发现很多事情他们做不了,所以自己主动就把大的架构升级改造的迁移全部自己做了,也承担了很多业务,但最后的结果就是,新的同学其实在试用期并没有承担很大的压力,也没有获得快速的成长,后续的过程中,表现的就比较不好,这个结果我一直都觉得对两位同学有所内疚,我觉得如果当时对他们要求高一些,而不是当老母鸡一样护着他们,他们也许会有更好的发展,老母鸡是带不出雄鹰的,所以自己后续有了改变,知道TL更多是做引导和训练,而不是直接给结论,而且你要允许下属在一定时间段内产能不如你,学会放手,下属的成长就是要主管给予指导和放权。

我去年自己也会看一些课程,推荐得到上的宁向东老师的清华管理学课,非常赞。不但对一线TL管用,对公司的中高层同样管用,后面课程里的战略地图等都是很有效的方法。

闲鱼招 iOS 吗?具体的岗位要求是怎么样的呢 ?─ @周熵

大佬好,我最近在找 iOS 的工作,方便的话可以分享下你之前面试的时候提的面试题吗?以及闲鱼招 iOS 吗?具体的岗位要求是怎么样的呢?

我自己在阿里内部整理过比较多iOS的面试题,但后续随着时间推移,一个是知识已经比较过时了,另一个自己在招聘上对人的思考也有提升,可能我觉得面试题本身不太适合找到合适的人,所以更多是从人本身的特质上去看一个人是什么样子的。

我们有闲鱼的岗位JD,里面描述了一些知识层面的基本要求,岗位要求

我这里补一些闲鱼或者说阿里在这上面的软性的要求

我可以说下闲鱼希望iOS开发是什么样子的 1.基础好,基本上iOS的一些基础的知识体系要知道,但可能我不会直接就问你题目,我希望你能在自己做的项目或者实践中有体现,比如我问内存管理相关的知识,如果你只知道它的原理,但根本没用到过,我觉得基本上也是属于死记硬背型的,没有项目或者技术方案落地的基础知识,我觉得可能只能对工作2年内的同学是work的,再工作久一些的我觉得就不行了。 2.有好奇心的,关注最近产出的新技术,不管是wwdc也好,还是github上的重点项目,并关注它的一些原理性的东西,这是很好的习惯,但我希望可以再进一步,将你关注的这些内容落地,比如我觉得现在大部分的iOS开发应该都了解一些RN和weex的知识,那原理是什么,有没有做过扩展,有没有踩过什么坑,能答上来有一些不一样的思考我就觉得很棒。3.精益求精,这点特别体现在性能和稳定性上,这里既可以考知识体系的基础,也可以考知识体系的系统性,专业性。比如每个人看待性能优化都是不一样的,你的整体解决方案是什么,哪一部分是你优化的重点,效果如何度量,你的方法能不能沉淀作为基础设施,都是很重要的。这里其实能看出P6/P7/P8在上面的区别。

所以我希望能找到的同学是--基础好/好奇心驱动/有匠心/理论结合实际有结果 这样的一个人。

请问,闲鱼App中有哪些地方使用RN,你怎样看待最近Airbnb和Udacity都相继放弃了RN ?─ @zyf在掘金

闲鱼app里没有使用RN,但有不少页面使用Weex,在我看来,不管是Weex还是RN,我们去看成本1.前端体系的学习成本 2.debug和兼容性的成本 3.基础设施建设的成本 这三个成本是逃不过的,所以如果觉得这三个成本大于你的收益,建议不要用。而对于闲鱼来说 1.我团队有专门的weex专家带一些有前端知识体系的同学 2.基础设施有阿里巴巴集团的基础设施做基础,自己需要再建设的不多。 这两个其实已经决定了我们在使用过程中成本没有那么高,目前最高的可能就是debug成本和兼容性问题了,暂时是可以接受的。再说收益1.我们有一套从sketch到代码的生成工具,所以UI还原部分,我们基于此少写了很多代码2.三端一致性,在部分业务上确实带来了好处,尤其闲鱼要在外部多端进行投放,不管是手淘还是外部投放,我就写一份代码,相比来说成本肯定要低一些,所以这个要看场景3.作为前端使用,性能上比h5还是会好很多,前端使用过程中也有一些收益。 均衡来看,我们还是在对应的场景下会持续使用下去。

这里延伸一下flutter,成本可能会是1.flutter的学习成本2.debug体系和工程体系的成本3.基础设施的成本 这里没提到兼容性,因为从UI还原的角度上来,flutter的兼容性肯定还是好于weex,至少两端的一致性是比较强的。我们看怎么解这个问题1.学习成本上dart比较接近java非常好学,基本上看一遍就会了,工具体系也像java,团队有成熟的android同学完全可以cover 2.debug体系和工程体系成本,确实是一个成本,目前在逐步解决,但怎么说,IDE开发flutter的时候,还是相对更接近客户端的开发体验3.基础设施的成本,确实也有,所以我们现在考虑,怎么后续通过建立一套基础设施能支持flutter/weex/h5/native等多个体系,也就是说,通过架构统一底层能力,而不用重复建设。我们再看收益1.同样我们有sketchToFlutter的工具,部分代码也可以不用写了,虽然还有一些bug,后续会持续做优化2.双端一致性,效率翻倍,这个过程前期只要兼容性问题我们做好,后期应该不太会有兼容性问题 3.高性能,整个flutter的性能是非常好的,native的性能表现

这么看来,对native侧的需求来说,flutter是另一个比较好的选择。


本期 AMA 社区小伙伴提了许多实用问题,同样感谢宗心认真地为掘金小伙伴解答了不少疑问。浏览更多的问答,可以到宗心的 AMA 进行阅读和讨论。


下期预告

下期 AMA 嘉宾为腾讯 NOW 直播技术团队的 Rand,大家记得准备好问题哟~ 下期 AMA 结束,嘉宾将会指定一名他觉得提出好问题的小伙伴赠送一本书籍 《码农翻身》,同样的,官方会根据谁的提问获得最多点赞赠送他一本《码农翻身》哟~ 下期 AMA:2018.07.25 - 2018.07.27 见