作者 | 毕玄
来源|阿里巴巴云原生公众号

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

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

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 代码打开都不知道从哪看起。

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

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

总结

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

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

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

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

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

怎么提升写代码的能力相关推荐

  1. 【杂谈】提升写代码效率不得不做的三件事

    想成为一个优秀的AI算法工程师必须要熟练使用Linux,这是学习AI的一个基础,如果你一直还在用Windows,那就很low了.本文我们聊聊提升写代码效率不得不做的三件事. 作者&编辑 | 汤 ...

  2. 马斯克的这波神操作,让我意识到保持写代码的能力有多重要

    作为一个在IT行业摸爬滚打了多年的老油条,我是越来越看不懂现在的互联网行业了. 至少曾经我听过太多人吐槽写代码的永远干不过写PPT的,并且在现实工作中验证过也确实如此,但是老马的这一波骚操作,让推特工 ...

  3. 程序员自我修练-提高写代码的能力

    首先让我们看一看刚入软件公司会出现的情况: 1. 你可能会常常发现,写了一段代码后,编译程序时是一大堆的出错 (原因:语法不熟) ──别担心,这是每个程序员必须经历的事,这时候你就需要更大的耐心及细心 ...

  4. 奉劝程序员们:写再多代码,还不如提升这两大能力有价值!

    哪个国家的程序员水平最高? 软件工程师水平测定平台HackRank发起了一系列编程挑战竞赛,给出了一份出乎意料的数据.据悉,这份数据研究分析了HackerRank社区里30万名开发者完成的140万项编 ...

  5. 为什么 CTO、技术总监、架构师都不写代码,还这么牛?

    作者| Mr.K   整理| Emma 来源| 技术领导力(ID:jishulingdaoli) 常常会被问到这样的问题:CTO.技术总监.架构师很少写具体代码,为什么还很牛逼的样子,拿这么高工资? ...

  6. #为何程序员百万年薪,CTO技术总监架构师不写代码还这么牛逼 ?

    [此文章转自乐字节] 真的是一点不服气我的领导,每天就在座位上看看头条,到时间开开会,每天写代码的时间可能不到两小时,到底是为什么他的收入有年薪百万?我们都是985研究生毕业,是什么铸就了他的价值? ...

  7. 为什么CTO、总监、架构师都不写代码,还这么牛逼?

    见字如面,我是军哥! 常常会被问到这样的问题:CTO.技术总监.架构师很少写具体代码,为什么还很牛逼的样子,拿这么高工资? 其实,这个问题本身就错了.就好比问:导演.制片人为什么不懂演戏,还能指导演员 ...

  8. 为什么CTO、技术总监、架构师都不写代码,还这么牛逼?

    常常会被问到这样的问题:CTO.技术总监.架构师很少写具体代码,为什么还很牛逼的样子,拿这么高工资? 其实,这个问题本身就错了.就好比问:导演.制片人为什么不懂演戏,还能指导演员,好像比演员厉害似的? ...

  9. 为什么 CTO 不写代码,还这么牛逼?

    见字如面,我是军哥! 各位周末好呀! 经常有读者问我,为什么 CTO 不写代码,还这么牛逼?拿那么高工资? 其实,这个问题本身就错了.就好比问:导演不会演戏,还能指导演员,好像比演员厉害似的?其实不难 ...

最新文章

  1. Oracle Grid Control 10.2.0.5 for Linux 安装和配置指南
  2. 机器学习算法独热编码及机器学习英语网站
  3. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )
  4. 如何用TensorFlow训练聊天机器人(附github)
  5. kafaka生产者消费者demo(简易上手demo)
  6. linux物理硬盘和sd的对应关系_计算机硬盘
  7. mysql5.5.49.tar.gz_CentOS6.5 解压安装 二进制分发版 mysql-5.5.49-linux2.6-x86_64.tar.gz
  8. android 应用自动退出,android – 应用程序自动退出,没有任何警告或错误
  9. c语言课程设计类层次图,C语言课程设计————写下流程图! 谢谢
  10. 用Java实现多线程下载
  11. Autoit+selenium+python实现文件上传功能
  12. Android Q版本实现自动连接WiFi
  13. 学校计算机信息固定资产编号,学校固定资产的分类和编号(仅供参考).doc
  14. 用AI一夜看尽长安花?华为云喊你来打卡
  15. .net linux 界面设计,.NET Core3.0开发Liunx桌面应用程序
  16. 转:宁愿在真实前颤抖,也不愿在催泪弹下哭泣(今何在)
  17. 高德地图自定义地图怎么去除最上边这个默认的蓝色天空?太丑了!!
  18. 编译小米2s CyanogenMod 版本遇到的几个问题
  19. Confluence创建自动填充序列表格
  20. mapi java_[Security:090504]Certificate chain received from mapi.alipay.com

热门文章

  1. CString类的用法总结
  2. MySQL GROUP BY:分组查询
  3. 【YApi】 yapi docker-compose 部署
  4. 5、优化MySQL服务器
  5. 2.1 基础-数字翻转
  6. 1147 Heaps (30 分)【难度: 一般 / 知识点: 堆 模拟 】
  7. 2021暑假每日一题 【week4 完结】
  8. docker之容器数据卷
  9. 将Datatable一分为二
  10. 为什么魂斗罗只有 128 KB却可以实现那么长的剧情?