2019年我的技术自我救赎之路,只需一篇文章吃透Android多线程技术

那么接下来我就跟大家好好聊聊我在2019年技术上是怎么做自我救赎的,希望能给大家带来一些思考,为什么不是参考,因为参考本身没有意义,只有思想才是我觉得更有价值的。

什么是高级?


什么是高级?如果你在大厂做技术的话,晋级答辩时你必须要经历的过程。笔者入职鹅厂三年,从入职时T2-1一路升级打怪到T2-3,35年的工作经验基本能达到这个水平,但如果你想晋级到T3-1(现在叫T9),这是鹅厂技术人员的分水岭,大部分一线的技术同学集中在T8T9这里,因为再往上就不单单只是技术能力的要求了。

笔者是今年3月份晋级到T9,正式成为业内常说的高级工程师,那什么是高级?大家可以先不往下看,先自己思考一下,高级跟初中级本质的区别是什么?

先说下初中级吧,一般大家从毕业进入职场就是初级工程师水平了,这个阶段你能做的事情很有限,大部分工作都是上级给你安排什么就是什么,你也能靠搜索引擎解决你工作上的问题,能做一些简单的功能。中级工程师水平是你已经有几年的开发经验了,工作上的问题大部分都能独立解决,能很熟练的完成需求,也能够解决一些相对困难的问题了,你也能有计划的安排自己手头上的工作了,你也具备了基本的领域知识。比如你做Android开发,基本的UI开发难不倒你了,有过整体的产品研发经历了,能够跟产品测试能很好的沟通需求和bug了。

ok,达到中级工程师是大部分人都能达到的水平,那你觉得这样就够了吗?那你的可替代性也太高了吧,我很直白的说,你能做的市面上很容易就能找到替代你工作的人。如果你想进大厂,如果不能体现你的硬核实力和亮点,你面试的定级可能就是T9以下并且很容易被刷掉。

说了这么多, 我说说我对高级的理解吧,我理解的高级是能够帮助团队实现价值的人,前面说的初中级工程师可能只是能够完成工作范围的事情,但高级工程师是能够跳出自己的思维框架,去思考所做的事情本身的价值,他具备一定识别有价值事情的能力,而且能够利用自身的丰富的领域知识和行业视野去解决业务上真正有价值的事情。这么说可能很难理解,我举个例子:

就拿笔者做的Bugly热更新SDK来说,对初中级工程师来说,我只是实现了一个SDK,然后开发者能够用这个SDK来让APP支持热更新的能力。 而如果是高级工程师来思考这个问题,我不仅仅只是做了一个SDK,而是提供了一套热更新的解决方案,这个解决方案能够帮助APP产品更低成本的解决线上问题。而工程师这里体现的价值是理解业务场景,解决用户真正的痛点上。

你可以看到高级工程师思考框架应该是不一样的,他们不会一上来就开始撸代码,而是以终为始去思考问题,不单单为了完成某一件需求和实现某个功能。

其实笔者之前的文章也讨论过这个问题,感兴趣的可以详细读一下这篇文章:

[为什么道理懂那么多,你依然是个弱鸡

]( )

笔者也是反复思考才从以前的思维框架跳出来,这个过程很痛苦,自然也受过leader和同事们的启发,跟优秀的人一起共事,慢慢的你也会有这样的思维,环境的重要性就不多说了,希望这部分能对遇到职场瓶颈的同行能有所帮助吧。

人生苦短,我用Python


笔者18年下半年开始接触深度学习,开始尝试转型AI,也是这个时候我用起了Python。19年上半年在项目组也负责数据生产自动化管理平台的建设,Python就是我们的主力开发语言。来回顾下我用Python做了哪些事情:

  • 用Tensorflow搭建过几个NLP模型

  • 用Python写过几个爬虫

  • 用Airflow搭建过自动化任务调度系统

  • 用Python编写过代码框架

解释下,TensorFlow是Google开源的深度学习框架,采用的语言是Python,笔者当时也是感受到AI的浪潮已经来了,所以想去尝试下深度学习去解决业务的一些问题。经过一段时间学习和尝试,发现短时间内想恶补深度学习的领域知识还是有点困难的,数学相关的知识太过薄弱,模型算法基本都是使用现成的,所谓的调参就是AI工程师根据不同规模的数据来训练效果最好的模型的过程。目前数据才是深度学习最重要的输入,只有当数据达到一定的规模,调参才有意义。这也是我当时接触深度学习的一点感受吧。

爬虫就不用多说了,数据的来源之一也是靠爬取网络上的数据,python写爬虫也不是什么新鲜事,笔者当时也只是用Scrapy爬虫框架去解析网页的xpath结构。当时面试过很多Python工程师候选人,发现他们还在手写爬虫,连基本的爬虫框架也没有接触过,基本面试结果就挂了。作为工程师,善于使用工具来提升自己的工作效率,不要只会写胶水代码。

Airflow也是Python写的任务调度框架,因为我们的业务场景跟DAG(有向无环图,Airflow的一个概念)很类似,经过技术选型选定了Airflow来搭建我们的任务调度系统,这个平台还是蛮有意思的,因为可以通过自动化去释放人力,我们的数据生产从按时交付率85%提升到98.5%,把从按月交付的节奏加速到按周到按日交付,并且实现周六日持续运作,在业务量增长3倍的情况下,同时投入人力减少至少10%,将一部分生产管理转向需求管理。 做这个当时还是觉得有点价值的,因为我们把重复的事情真正的实现自动化,把数据实现全流程串联。

真的是人生苦短,我用Python啊,其实用什么并不重要,重要的是你清楚自己正在解决的问题是什么。不管是用Python还是其他什么语言,都是解决问题的手段罢了

聊聊技术人的工程能力


什么是技术工程能力? 19年我在这方面又有哪些提升呢。

TDD

测试驱动开发,相信很多开发者都听说过,但我重来没见过哪个团队真正的做到测试驱动开发的。很多人以为测试驱动开发就是先写测试,然后再写业务代码。这不叫测试驱动,只是测试先行。

19年尝试过的一件事就是使用TDD去做开发,这是一种反直觉的编码方式,因为你需要针对业务需求,先要想清楚你要做的事情,然后将任务拆解到足够小的粒度,并且要做到可测试,并且能保证一定的代码覆盖率。做到这种程度本不是一件易事,因为这对工程师的要求极高,日常工作光是能将任务拆解到足够小的粒度就很困难,很多人可能前置阶段都没能把需求理解清楚,更加别说他能够按照这种模式去开发了。TDD是外国人提的,由国内的一些行业意见领袖推广,我思考过一个问题,为什么国内没有多少团队能做好TDD,并且能真正落地这件事。我想了一下,这可能跟我们国内的互联网环境有关,因为这些年互联网行业的井喷,我们都太过关注业务的发展,很多团队迫于业务的压力根本没有时间写单元测试,还有很多人的技术素养本身就比较低,连单元测试是什么都没搞清楚,而且写单元测试不是KPI并且费时费力没有直接上手来得更快,这样也就能理解为什么大家都不愿意写单元测试。

关于TDD,我从来都是持认可的态度,但我有以下几个观点:

  1. 团队成员知道并懂得怎么写单元测试,这需要大量的训练和培训

  2. 不要为了TDD而TDD,它只是保证质量的一种手段

  3. 提升你的团队成员工程素养,把质量意识融入到血液中去,而不是靠KPI

CI/CD

持续集成持续交付,如果你还没听说过,说明你已经outer了。得益于我参与过开发者服务的产品和工具研发,这些年我学会了怎么给自己开发提速,CI和CD就是能够让我从繁重和重复的构建工作中脱身出来,从而更关注业务价值的创造。可能大家说,不就是接入持续集成吗,这个我也会用。我这里不是想说怎么用这些工具,而是一种敏捷的思想,这里就不得不谈谈DevOps

DevOps是一种软件工程文化和实践,旨在统一整合软件开发和软件运维。

从集成、测试、发布到部署所有环节,你都能全程自动化。构建自动化、测试自动化,一切皆代码,自动化一切,能够尽早得到反馈。 知道为什么别人能够高效的完成工作了吗,利用工具和平台帮助你解决低效的重复劳动就是你提升工作效率的思路。

也正是这样的思路,今年我帮助团队利用DevOps平台搭建了能给我们构建提速的流水线,将自动化融入到我们日常工作当中,我也从中受益良多。

所以什么是技术工程能力?我个人觉得是你保证研发质量和效率的能力,利用工具和平台赋能于日常开发,将技术和业务价值相结合。

回归客户端开发


19年的其中一个重要的决定就是重新回归客户端开发,毕竟这是我的入行以来的吃饭的行当,而这也是我最擅长做的事情。很多鸡汤文都在说什么“逃离舒适区”,我觉得做擅长的事情并不是让你呆在舒适圈不出来,而是选择适合自己做的事情然后坚持做下去做到最好,比起你每天焦虑的要去追赶什么趋势要更靠谱一些。

18年我做了一次错误的判断就是转型做AI工程师,因为当时我所接触的业务和自己的认知想当然的认为自己可以转型成功,赶上这一波浪潮,从此走上人生巅峰。现在回想起来,我确实也被这团火热的深度学习给带偏了,首先现在所谓的人工智能基本都是数据喂出来的,而AI工程师也不过是调参工程师,并没有什么特别高大上的东西。然而我那薄弱的数学基础和算法能力(这是绝大部分偏软件开发的工程师的通病),我也很难真的在这个领域有很比较深的造诣。根据我以往的工作经验和能力圈来看,我更适合做软件工程方面的事情,客户端开发更能让我发挥自身的价值。

笔者是做APP应用开发出身的,负责过南方周末APP,Bugly 热更新SDK、搜活帮APP的开发,已经足以证明我有比较强的开发商业级APP的能力,加上业界口碑比较的好的开发者服务产品Bugly,我比纯应用开发的工程师更有研发效能的视角,比如研发工具和开发者服务的理解。

回归客户端开发不意味着吃老本走老路,从18年开始说Android凉凉,iOS凉凉的观点就经常听到,而笔者觉得不是行业凉凉,而是觉得以前随便培训几个月就能找到好工作的时代已经过去了再加上资本寒冬,行业进入规范阶段对人的要求变得越来越高,尤其对高端人才的要求,你只会写几个页面是远远达不到一些大厂的要求的。然而AI的火热让很多人都出现淘金热的现象,大家都想赶上这波浪潮,可惜的是AI商用落地仍未成形,市场上的缺口远没有移动端的大。那些放弃客户端转AI的,反倒为客户端打开了缺口,一些大厂和独角兽公司仍在大力招移动开发工程师。所以并不用担心做移动开发找不到工作,只是你没达到别人的要求罢了,好好积累吧。

除了对行业形势的思考,我更看好的是大前端的技术发展趋势,以前分Android和iOS两端,分别要花比较大的人力成本去做研发,而且研发效率也大打折扣,未来多端融合开发一定是趋势。也意味着,你不能只掌握一端的开发能力了,包括iOS,跨端开发能力将会更能让你更吃香。虽然大前端都喊了很多年了,类似RN、Weex的跨端解决方案仍然不能很好解决平台的差异性,然而今年的Flutter将以一个全新的思路来解决跨端UI渲染的问题,各大前端的大会都在推广Flutter的行业实践,我觉得2020年这将会是井喷的技术领域,也正是客户端开发转型大前端的一个契机。 正是因为这个,我选择继续在客户端领域继续深耕来让自己更好将技术和业务结合,创造更多的价值。

上班如上坟,定位有多重要?


前面讲了19年我尝试过Python解决业务上的一些问题,一些技术工程能力的思考,重回客户端开发的决定。这些都不是最想要说的东西,我最想说的还是困扰我许久的职业定位。

相信大家跟我一样,都是怀揣着梦想进入互联网行业,想开发一款产品来改变世界。但真正进入这个社会,这个行业之后,你会发现往往我们才是那个被世界改变的人,认清楚自己真的只是个普通人。

前段我在公司参加了一门叫做职业画布设计的培训,我觉得非常有价值,大家感兴趣的在网上可以搜一下兴远咨询。为什么它非常有价值,因为它让我更系统的思考了自己为什么选择做在线教育,让我了解了工作和职业两种的职业画布是不一样的。

工作 VS 职业

什么是工作,需要你付出劳动时间换取报酬的事情。那么什么是职业,是能够实现自我价值的事业。所以你选择了哪种性质的工作,就是选择哪种生活。 附上当时上课的一张图:

这里面让你思考几件事情:

  1. 谁是你的客户

  2. 你的角色/你和客户的关系

  3. 客户如何了解你/你如何交付

  4. 你如何帮助客户

  5. 你做什么活动

  6. 你是谁/你拥有什么

  7. 谁能帮助你

  8. 你付出了什么

  9. 你得到了什么

所以你思考下,你目前所做的事情让你付出了什么,而你从中又得到了什么。我觉得这比你看多少书,学多少新技术会更有价值。因为你只要想清楚,你未来所做的事情都是围绕着你的价值主张所做的决定。

我分享下笔者的价值主张是什么吧,我是希望知识和技能能够做到更好的传播,让教育资源变得更加公平,帮助有需要的同学更好的得到成长,提升他们的职业竞争力。关于其他的,就需要你们自己根据自己的情况去完成思考,什么才是你最想去做的,而你愿意付出什么,最终又想得到些什么。想清楚这些,或许这些年回头看才不会觉得白过。

2020年展望

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

浏览器打开:qq.cn.hn/FTe 免费领取

你可能感兴趣的:(程序员,面试,android,移动开发)