从校招生到核心架构师,支付宝研究员李俊奎谈如何成为一名优秀的程序员

校招进入支付宝,11年时间,从一线工程师成长为支付宝安全核心架构师,这个技术牛人就是李俊奎。

李俊奎一直聚焦风控平台的技术和架构发展,并着手搭建了中国第一家云上的商业银行——网商银行。

在2016年双11和新春红包等活动中,李俊奎和他的团队实现历史性突破,即在系统不被降级的压力下,控制资源消耗不超过2015财年双11,并且很好地满足了业务需求。

同时,李俊奎率领团队实现了风控系统的异地多活,打造出新一代的风控体系。支付宝创立之初即提出“敢付敢赔”的口号,其背后的支撑就是由李俊奎及其团队负责建设的实时风控平台。

李俊奎乐于知识分享,经常在工作中对其他同学进行辅导,深受一线工程师的尊重和认可,被大家尊称为“向爷”(花名:向秀)。

不久前,在支付宝 BASIC College以代码为主题的分享活动中,李俊奎回顾了自己与代码是如何结缘的,并对程序员职业发展谈了谈自己的想法。

从校招生到核心架构师,支付宝研究员李俊奎谈如何成为一名优秀的程序员

一、给初入行程序员的建议

从在校学生到初入职场,首先是要过三关,很重要的一关就是在工作的第一天或头几天,就要接触到代码,因为只有接触到代码心里才感觉是有点踏实的。

我加入公司的时候,还是相对比较简单的,不像现在代码量,公司体量已经很大了,不管是系统数还是代码数以及变更的数量都是很大的。08年的时候阿玺(蚂蚁金服副CTO)带着我们一起搭全站的系统环境,当时是50多个,基本上三个人,花一上午就能够把整个支付宝所有的环境搭起来。

刚刚加入公司的时候会有一段强烈的新鲜感时光,是来源于我们总觉得代码其实是最重要的。我现在也会和很多的新同学说,新人同学进来首先是要过三关,很重要的一关就是希望他在工作的第一天,就是要接触到到代码(如果是技术同学),能看到代码,最好能写代码,因为只有接触到代码心里才感觉有点踏实的。

比如说你工作了几天,代码没看到或系统也不知道,这个时候心里是不踏实的,不知道自己在干嘛,会有点失落。

我入职后的一两个月都是觉得支付宝代码也还好,数量还可以,但是后来就发现我只看到了冰山的一角。

二、如何快速成长?

在项目中成长,从我个人的经历来看也是这样的,项目在你修炼自己的代码的这种能力里面是非常重要的。

今天最想要讲的就是项目中成长,我跟代码结缘以来最主要的经历就是在项目中的成长。

1.要写代码先看代码

支付宝的代码分成三类:第一类代码是写得很好的,这个好跟不好其实是有非常重要的一个评价,就是你能否可以快速了解它,觉得它赏心悦目并且能够快速地抓住它主要设计的精髓。

我觉得这种代码是好的代码。这一类代码,很多就是在什么地方呢?

第一个就是在一些公共的库,第二个是一些所谓的核心的系统。

我很长一段时间,一部分是自己参加一些项目,第二部分就是看代码。

我认为Code Review其实很多情况下并不是提交了代码然后让人来Code Review,这是一个过程。我认为的Code Review更多的是“看代码”,代码有好的也有坏的。

好的就是我刚才说的一些比较核心的系统,比较重要的库,这些代码能看到很多一些设计,很多的原理。新同学多看一些代码,这对于其了解全貌很有益处。

2.考古

很多同学可能接触到一些别人推送过来的系统,交接过来的系统,会发现文档不一定是最好的,很多情况下就需要考古。我也考了很多的古,做每个项目之前很大一个工作其实就是要了解过往的系统到底是怎么运作的,或者说整个链路是怎么运作的,这个时候就需要去考古了。

不能说看一些PPT上面的东西就能把这个方案能够做得非常细致,非常典型的是一些拆分类的项目或者移交过来的比较大的系统。这个时候你只能去看PPT那个层面,当然这是一个恶习,PPT画得高大上无比,真正到代码上就各种坑,各种不注意的细节。

考古我觉得是非常重要也是非常有必要的。只有把代码基本上能够粗略的看全,然后才真正能够通过代码大概了解它的运作方式,这是非常重要的。

3.不断磨炼

第三类代码就是说代码跟配置其实很多情况下是分离的,这种情况下出问题可能会比较大。

我的例子就是当时我是在做前台业务,交易核心是最重要的系统的服务。交易其实代码跟它的配置是分离的,交易的代码,如果不知道它下一步往哪里走的,就只能把代码跟配置一起来看,甚至要调试。

这个时候,通过运行它的配置的代码,在整个运行中看它的过程,而不是只看JAVA的代码,实际上这个配置代表一些很重要的逻辑在里面,现在这样的情况越来越多。我理解现在是比以前更加的难,或者说范围更加的广。

第三类代码就是不断地去做这样的一个磨炼,我的理解就是自己在项目中做这种磨炼。

关于磨练,我这里有几个例子是自己经历过的。

(1)看书

不知道大家现在还看不看书?我当然是指不是看《故事会》《小人书》,而是看一些设计的书或者别人代码的这些书,我以前参加项目的过程中,其实忙里偷闲还是要去看一些书,我看鲁肃(蚂蚁金服CTO)也是这样的习惯,经常看到鲁肃拿了一堆的书自己在那里狂啃,这个确实是一个比较好的习惯。我自己的经验是,看书的过程中可以使大家开阔思路。

(2)单元测试

第二个我刚才说会看代码,其实还有一部分看单元测试。当然现在是在强制做,有覆盖率的要求,单元测试是非常重要的一个环节。单元测试是相对非常小的一段,它能做一些测试、模拟,甚至说做一些演示的工作。

如果大家一味地看注释,注释不一定是准确的,有的注释写得好,有的注释写得差,但是实际上单元测试如果它有一定的覆盖率的话,其实在哪些逻辑不清楚的情况下,看或者写一些单元测试对于理解系统运行也是非常重要的。

(3)设计的经验

比如SOFA框架(分布式中间件),我对新同学说,如果在试用期或实习期,能够把SOFA框架的整体的原理图能够搞清楚,它的一个依赖关系的那张图能搞清楚,那么就抓住了SOFA的精髓。然后再去看支付宝主要的系统的代码,就有据可依,这就是设计的一个好处。SOFA的框架相当于龙骨,能看懂就会知道主要的一些代码,核心代码是写在哪里的,一些主要的逻辑放在哪里的,这个很重要。

设计的第一块是向框架去学习,第二块其实就是向他人去学习。我经常看项目组其他同学的代码,看优秀的代码还会做一些总结。

在项目中成长,对工程师来说是非常重要的。从我个人的经历来看也是这样的,项目在自己修炼代码能力方面是非常重要的,大概占了百分之七八十。

三、总结

最后,是我给大家的一些建议。

1.多看代码,无论好坏,保持代码敏感度。

代码方面,我认为首先要看代码,多看代码,因为无论如何要保持自己对代码的敏感。大家可能经常自己吐槽是一个码农,天天不管需求在哪里,只管代码码哪里,这个肯定不是最好的方式。好代码跟坏代码是有本质的差距,好代码是体现了人的思想,体现人的设计。坏代码,为什么看坏代码?某种原因也是给大家一个警示,这个我们要避免。

2.写代码,多做总结,一次比一次好。

除了经常看别人写的好代码或者考古别人的代码,我也会经常回过去看以前自己写的代码。看的时候就想,这个代码,为什么觉得写得好?为什么它那个地方是有一些问题的。

我相信不是所有的代码都是好的,自己写的代码也不一定所有都是好的。但是自己给自己是有个评判,有的时候去看,这个地方做一下更多的抽象,或者更多地提取一些公共的一些东西,这个是非常重要的。

多做总结其实是为了让自己一次比一次写得少,一次比一次好,能够避免以前的一些坑,或者说能够避免以前的一些错误,这个就是一个进步。

3.写代码前,一些设计很重要。

写代码有很多种,有的是直接完全按照需求实现,按逻辑实现。但我想即使这样,如果大家要提高自己的代码的能力或者代码的意识,一些设计特别重要。这个设计不是要去整设计模式,整高大上的框架。很多情况下是能够通过一些代码,能够把一些这种共性的东西做一些写法的不一样,可能都是很好的设计。但是如果只是纯粹的把逻辑实现,或者说就按照这个逻辑去这样做,有的时候并不一定是最好的。

4.养成看书的习惯。

现在是时间碎片化非常严重的时代,获取知识的渠道非常多,但是有一些经典的书或者体系化的书,建议还是要去多看。养成看书的习惯,那么获取的知识会比你看比如今日头条或者一些网页还是要来得更加的体系化。

上一篇:为什么支付宝有这么多“原生”技术牛人?


下一篇:《STL系列》之map原理及实现