对于程序员而言,我始终认为代码是展现能力的关键。一个优秀程序员写的代码,和一个普通程序员写的代码是很容易看出差别的,代码是展示程序员硬实力的名片。如何提升写代码的能力,始终是一个关键的话题,不过很遗憾这篇文章其实也不是讲具体的步骤、银弹方法、武功秘籍什么的,这篇文章讲讲我自己印象中,对我写代码能力提升比较大的四段经历,也许可供参考。

第一段:第一次感受每天亿级系统的挑战

2008年,HSF的第二个版本,在当时淘宝最重要的交易中心上线,上线当天造成淘宝网站访问巨慢,交易类的页面几乎打不开,最后靠下线HSF才恢复。

下线后开始查问题,HSF的第二个版本基于的是JBoss Remoting,JBoss Remoting在当时的版本里远程同步调用的超时时间是写死在代码里的60s,而调用的服务确实会有一些超过10几秒的现象出现,导致了Web应用处理Web请求的线程池被这些慢请求给逐渐占据,请求堆积,最终呈现出了页面打开非常慢的现象。

查清原因后,决定基于当时的Mina重写整个HSF的通信。重写的这两个月时间对我自己写代码的能力有很大的提升,无论是对网络IO方面处理的深入学习,还是在高并发系统上的深入学习。现在想想学习的方式也就是翻各类网络IO的科普资料,然后是读Mina的源码、Java网络IO的源码。并发这块的学习主要还是靠那本经典的《Java并发编程实战》,以及读Java J.U.C里的代码。这段时间的学习相比以往翻《Think in Java》之类的最大区别是,学习后付诸实践,随着HSF这个新的重写的版本的上线,基本算是逐渐真正掌握了这些部分的代码能力。

除了代码能力的提升外,得到了另外一个最大的教训就是,对于一个亿级且长时间运行的系统,很多看起来的小概率的问题都一定会成为严重的问题。这也是写高并发系统难的原因,要求必须对自己写的代码,以及自己代码调用到的各种API里的实现都非常的清楚,这样才能真正确保最终代码的鲁棒性。

第二段:民间"消防队"的故事

第二段对我自己写代码能力提升特别大的经历是在民间"消防队"的那段日子。淘宝在2009年故障特别多,但处理故障还没有一个标准的体系和组织,导致很多时候会出现故障出了都没什么人处理,或者处理效率不高。于是当时有个运维团队的同学拉了一些人组建了一个群,群的名字叫淘宝消防队,用来处理淘宝出现的各种故障,我很凑巧的也加入了这个群,这个群里还有另外一个整个阿里公认的超级技术大神:多隆。

一开始看到各种故障的时候,压根就不知道怎么下手。处理故障需要的通常不仅仅是写代码的能力,还需要对一个系统的全貌要有一定的掌握。例如前几年一篇特别火的文章,点击搜索背后发生了什么,其实就是要对一个系统的处理流程特别的熟悉,这在处理故障的时候是非常重要的。在了解了故障大概在哪个环节后,很重要的就是对这个环节代码运行机制的细节的掌控了,这个时候通常来说运用各种工具是非常重要的,可以有效地帮助你知道具体发生了什么,例如像系统层面的top -H之类的,Java层面的BTrace等等,都可以让你根据运行情况去定位问题。

这段时间我觉得我的提升就是靠大量的练手。故障确实有点多,一开始就靠看别人怎么处理,主要是从多隆那里学,然后是尝试自己解决一些故障,解决的越来越多后慢慢熟练度就上去了。除了解决故障能力的提升外,由于看了很多由代码层面造成的故障,对自己在写代码时如何更好的保证鲁棒性来避免故障,也是非常有帮助的。例如,我看过很多滥用线程池造成创建了大量线程,最终导致线程创建不出来的case,就会明白自己在用线程池的场景里一定要非常清楚地控制最大的数量,包括堆积的策略等。又例如,我看过N多的因为自增长容量的数据结构导致的OOM的case,就会明白在写代码的时候不能认为一定不会发生数据结构增长到超级大,所以不做任何保护的case。这段时间我明白到的就是,写一段能运转、实现需求的代码不难,但要写一段在各种情况下都能长期稳定运行的代码是真心不容易,我觉得这是一个职业的写商业系统的程序员和只写程序玩玩的程序员的最大差别

第三段:重写通信框架

2010年,我从中间件团队离开,去做HBase。那个时候的HBase里面的通信还是用一个非常简单的写法实现的。我想着要么就把以前HSF里用的移植到HBase里用,这个时候刚好多隆在用C给各类C的应用写一个通用的通信框架libeasy,于是就有了一次测试,我记得第一次测试的结果,就看到了原来HSF里面的通信框架的高并发能力和libeasy比相差无比巨大。我便和多隆探讨他是怎么实现的,我看看能不能学习下,在Java这边的版本里也改改,所以有了这段重写通信框架的经历。

本来以为之前在写HSF的那几年应该算是对通信框架这块的代码相关的能力掌握的不错了,在和多隆一起重写的这段过程中,才发现差距还是很大的。多隆教会了我很多细节的问题,基于NIO的通信框架的核心是用非常少的IO线程来处理IO事件(太多也没用,因为有些部分就只能串行),所以如何高效的使用好这几个IO线程是非常关键的,要尽量减少这几个IO线程处理一些不相关的动作,另外一点就是尽量减少IO线程和业务处理线程的切换,例如后来常见的批量把一个流里的多个请求一次性丢给业务处理线程。

这段经历对自己在代码逻辑整体的细节层面更加深入地掌握是非常有帮助的,这对于写要求很高的系统是非常重要的,毕竟对于一个超大规模的系统而言,1%的提升还是可观的。

第四段:学习JVM

之前因为处理故障比较多,有段时间我开始给公司同事们分享如何处理故障,后来发现有些问题自己也讲不清楚,或者也不知道怎么处理,必须深入学习JVM才行,但其实一开始我完全摸不着门路,JVM代码打开都不知道从哪看起。

很幸运,碰到了一个同样爱好JVM又比我强很多的同学,就是撒迦,圈内通常叫R大。我和撒迦好几个周末约着在公司一起看JVM代码,有撒迦的指点,我终于算是入门了,知道大概怎么去看了,而且两个人一起看代码,互相分享和探讨,效率是非常高的。

有了这段经历,再加上继续处理着一些故障,基本上逐渐对JVM的代码实现有了更多的理解。在后来做故障分享、问题解决什么的时候终于能更好地做到知其然知所以然。同样,这对处理故障的能力、写代码的能力也是非常有帮助的,例如会更加明白以前认为的所谓的面向GC友好的代码是几个意思。也有了更深的感受,就是其实Java的代码呢,通常不会写的太烂,因为JVM在运行期会做很多的尽可能的优化,拉到一个平均线,但要写得很好,难度是非常大的,因为需要懂JVM,懂JVM下面的OS。

总结

其实也总结不出什么,因为每个人所处的环境不一样,有不同的适合各自提升的方法。我看自己的经历总结下来,我觉得:

  • 如果环境不具备,就给自己一个命题挑战。例如要学高并发的通信,可以尝试自己写一个和其他的做对比,做性能等的PK,这个通常提升还是会很大的。要学GC,可以尝试给自己几个题目,来控制GC的行为等,如果环境具备的话,确实会更加有利。

  • 多和优秀的程序员一起学习。我自己从多隆、撒迦身上学习到了很多很多。从很多优秀的开源代码,像Netty、OpenJDK里面也学习到了很多很多,所以多参与一些优秀的开源项目也是一个很好的提升方法,看优秀的书(例如并发里的那本《Java并发编程实战》,JVM里的《Oracle JRockit: The Definitive Guide》,《深入理解Java虚拟机》等),也一样是一种向优秀程序员学习的好方法

  • 多多尝试解决问题/故障。这绝对是提升代码综合能力非常好的一个方法,自己工作里机会少的话,网上有大把的平台,像Stack Overflow之类的,都是很好的练习场。

最后的最后,我还是想说,代码能力作为程序员的硬名片始终是最有效的区分程序员能力的东西"talk is cheap, show me the code",这句话我觉得是永远成立的。

【转】阿里毕玄:提升代码能力的4段经历【无它就是实干】相关推荐

  1. 程序员看过来:阿里毕玄提升代码能力的4段经历

    简介:对于程序员而言,我始终认为代码是展现能力的关键.一个优秀程序员写的代码,和一个普通程序员写的代码是很容易看出差别的,代码是展示程序员硬实力的名片.如何提升写代码的能力,始终是一个关键的话题,不过 ...

  2. 11月27日云栖精选夜读:阿里毕玄:智能时代,运维工程师在谈什么? 飞

    2019独角兽企业重金招聘Python工程师标准>>> 智能化运维的终极目标,就是将运维人员从繁琐的工作中解放出来,提高整体运维效率,降低运维成本,实现业务系统的高可用性. 目前业界 ...

  3. 云栖专辑| 阿里毕玄:程序员的成长路线

    2018年12月20日,云栖社区3周岁生日.阿里巴巴常说"晴天修屋顶",所以我们特别策划了这个专辑--分享给开发者们20个阿里故事,50本书籍.第一位是林昊(毕玄). 在这篇< ...

  4. 阿里毕玄:阿里十年,从分布式到云时代的架构演进之路

    这是一篇来自鲲鹏会的文章,其内容是毕玄在TGO 鲲鹏会杭州分会活动现场分享的<云时代的软件架构>的整理.特别转载到云栖社区,让更多开发者深入了解阿里架构的变迁和对云技术的一些新的想法. 2 ...

  5. 阿里毕玄:程序员技术能力的成长最重要!

    面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...

  6. 阿里毕玄:系统架构师如何做好系统设计?

    阿里妹导读:毕玄是阿里巴巴资深技术专家,07年加入阿里,一手打造了HSF,十多年来更见证参与了阿里在基础技术上的演进与发展.他觉得系统设计是远比 Java 编程技能更难的培训,很容易变成务虚课.为了挑 ...

  7. java分布式开发 毕玄_阿里毕玄:RPC 框架优化之路,从 37k 到 168k

    在 文章里有一些关于Java网络通信的题目,翻出几年前的一篇文章再给大伙看看,这应该算是怎么写一个高性能RPC框架的还不错的实践,感兴趣的其实也可以自己去写个玩玩,这个过程会是学到很多东西的好方法. ...

  8. 阿里毕玄:推荐给Java程序员的7本好书

    我主要还是个Java程序员,所以进阶类型的书就推荐Java相关的. <Java并发编程实战> 并发是高级语言里都需要掌握的稍微高级一些的技巧,这本书尽管是2012年的书了,但我觉得仍然是无 ...

  9. 毕玄:我在阿里的十年技术感悟

    阿里妹导读:在阿里,我们习惯尊称毕玄老师为"毕大师".他2007年加入阿里,一手打造了HSF,十多年来更见证.参与了阿里在基础技术上的演进与发展:如淘宝在2007-2009年的分布 ...

最新文章

  1. 赠书 | 干货!用 Python 动手学强化学习
  2. Winform中设置ZedGraph当前所有曲线的颜色
  3. 使用jmeter 设计流程发起测试
  4. Nginx的启动、停止和重启
  5. C语言试题十五之编写函数void function(int x,int pp[],int *n),求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回
  6. Day2 HTML基本标签元素
  7. 这回真要涨工资了!国务院教育督导办:2020年把义务教育教师平均工资收入水平不低于当地公务员作为督导检查重点...
  8. 《南溪的目标检测学习笔记》——图像预处理的学习笔记
  9. 伴生对象-apply方法
  10. 系统学习机器学习之总结(三)--多标签分类问题
  11. Sqoop 是什么?(二)
  12. 浅谈Unity中的优化
  13. 利用MapGis6.7 对 jpg图像文件进行图形校准
  14. To C、To G、To B,数字化转型
  15. PLSQL入门与精通(第56章:用PLSQL读写文件)
  16. 阿里云服务器升级openssl1.1.1k 2021-07最新
  17. JavaScript 常见安全漏洞和自动化检测技术
  18. 华氏温度与摄氏温度用C语言的实现方法
  19. 网络编程——CS模型(总结)
  20. matlab中floor函数,Matlab基本函数-floor函数

热门文章

  1. 3310 4g版 支持java吗,诺基亚3310 4G版发布:运行YunOS系统,支持WLAN热点
  2. 如何向公众号添加的邮箱链接(已解决)
  3. 如何解决el-input中文逗号自动转化英文逗号失效问题?
  4. 处理使用top提示terminal is not big enough
  5. GibbsCAM2013v10.5
  6. linux firefox applet,在HTTPS上的Firefox中加载Java Applet
  7. 2023西安邮电大学计算机考研信息汇总
  8. 企业微信处理客户消息怎么快速回复
  9. 安卓端小黄鸟抓包,请求注入
  10. Python脚本猜解网站登录密码(带token验证)