编程能力|阿里毕玄:程序员如何提升自己的硬实力( 二 )


我自己排查问题能力的提升主要是在2009年和2010年 。 那两年作为淘宝消防队(处理各种问题和故障的虚拟团队)的成员 , 处理了很多的故障和问题 。 当时消防队还有阿里最公认的技术大神——多隆 , 我向他学习到了很多排查问题的技巧 。 和他比 , 我排查问题的能力就是初级的那种 。
印象最深刻的是一次我们一起查一个应用cpu us高的问题 , 我们两定位到是一段代码在某种输入参数的时候会造成cpu us高的原因后 , 我能想到的继续查的方法是去生产环境抓输入参数 , 然后再用参数来本地debug看是什么原因 。 但多隆在看了一会那段代码后 , 给了我一个输入参数 , 我拿这个参数一运行 , 果然cpu us很高!这种case不是一次两次 。 所以我经常和别人说 , 我是需要有问题场景才能排查出问题的 , 但多隆是完全有可能直接看代码就能看出问题的 , 这是本质的差距 。
除了查问题外 , 更厉害的程序员是在写代码的过程就会很好的去避免问题 。 大家最容易理解的就是在写代码时处理各种异常情况 , 这里通常也是造成程序员们之间很大的差距的地方 。
写一段正向逻辑的代码 , 大部分情况下即使有差距 , 也不会太大 , 但在怎么很好的处理这个过程中有可能出现的异常上 , 这个时候的功力差距会非常明显 。 很多时候一段代码里处理异常逻辑的部分都会超过正常逻辑的代码量 。
我经常说 , 一个优秀程序员和普通程序员的差距 , 很多时候压根就不需要看什么满天飞的架构图 , 而只用show一小段的代码就可以 。
举一个小case大家感受下 。 当年有一个严重故障 , 最后查出的原因是输入的参数里有一个是数组 , 把这个数组里的值作为参数去查数据库 , 结果前面输入了一个很大的数组 , 导致从数据库查了大量的数据 , 内存溢出了 , 很多程序员现在看都会明白对入参、出参的保护check , 但类似这样的case我真的碰到了很多 。
在中级这个阶段 , 我会推荐大家尽可能的多刻意的去培养下自己这两个方面的能力 , 成为一个能写出高质量代码、有效排查问题的优秀程序员 。
3、编程能力高级:懂高级API和原理
就我自己的经历而言 , 我是在写了多年的Java代码后 , 才开始真正更细致的学习和掌握Java的一些更高级的API , 我相信多数Java程序员也是如此 。
我算是从2003年开始用Java写商业系统的代码 , 但直到在2007年加入淘宝后 , 才开始非常认真地学习Java的IO通信、并发这些部分的API 。 尽管以前也学过也写过一些这样的代码 , 但完全就是皮毛 。 当然 , 这些通常来说有很大部分的原因会是工作的相关性 , 多数的写业务系统的程序员可能基本就不需要用到这些 , 所以导致会很难懂这些相对高级一些的API , 但这些API对真正的理解一门编程语言 , 我觉得至关重要 。
在之前的程序员成长路线的文章里我也讲到了这个部分 , 在没有场景的情况下 , 只能靠自己去创造场景来学习好 。 我觉得只要有足够的兴趣 , 这个问题还是不大的 , 毕竟现在有各种开源 , 这些是可以非常好的帮助自己创造机会学习的 , 例如学Java NIO , 可以自己基于NIO包一个框架 , 然后对比Netty , 看看哪些写的是不如Netty的 , 这样会非常有助于真正的理解 。
在学习高级API的过程中 , 以及排查问题的过程中 , 我自己越来越明白懂编程语言的运行原理是非常重要的 , 因此我到了后面的阶段开始学习Java的编译机制、内存管理、线程机制等 。 对于我这种非科班出身的而言 , 学这些会因为缺乏基础更难很多 , 但这些更原理性的东西学会了后 , 对自己的编程能力会有质的提升 , 包括以后学习其他编程语言的能力 , 学这些原理最好的方法我觉得是先看看一些讲相关知识的书 , 然后去翻看源码 , 这样才能真正的更好的掌握 , 最后是在以后写代码的过程中、查问题的过程中多结合掌握的原理 , 才能做到即使在N年后也不会忘 。
在编程能力的成长上 , 我觉得没什么捷径 。 我非常赞同1万小时理论 , 在中级、高级阶段 , 如果有人指点或和优秀的程序员们共事 , 会好非常多 。 不过我觉得这个和读书也有点像 , 到了一定阶段后(例如高中) , 天分会成为最重要的分水岭 , 不过就和大部分行业一样 , 大部分的情况下都还没到拼天分的时候 , 只需要拼勤奋就好 。
系统设计能力的成长除了少数程序员会进入专深的领域 , 例如Linux Kernel、JVM , 其他多数的程序员除了编程能力的成长外 , 也会越来越需要在系统设计能力上成长 。