阿里毕玄:程序员如何提高本身的硬实力

从业余程序员到职业程序员

程序员刚入行时,我以为最重要的是把本身培养成职业的程序员。git

个人程序员起步比同龄人都晚了不少,更不用说如今的年轻人了。我大学读的是生物专业,在上大学前基本算是彻底没接触过计算机。军训的时候由于很无聊,我和室友天天跑去学校的机房玩,我如今还印象很深入,我第一次走进机房的时候,别人问,你是要玩windows,仍是dos,我那是彻底的一抹黑。后来就只记得在机房一堆人都是在练习盲打,军训完,盲打却是练的差很少了,对计算机就这么产生了浓厚的兴趣,大一的时候都是玩组装机,捣鼓了一些,对计算机的硬件有了那么一些了解。程序员

到大二后,买了一些书开始学习当时最火的网页三剑客,学会了手写HTML、PS的基本玩法之类的,课余、暑假也能开始给人作作网站什么的(那个时候作网站真的好赚钱),可能那样过了个一年左右,作静态的网页就很差赚钱了,也很差找实习工做,因而就开始学asp,写些简单的CRUD,作作留言板、论坛这些动态程序,应该算是在这个阶段接触编程了。面试

毕业后加入了深圳的一家作政府行业软件的公司,一个很是靠谱和给我空间的Leader,使得本身在那几年有了不错的成长,终于成了一个职业的程序员。数据库

一般来讲,业余或半职业的程序员,多数是1我的,或者很小的一个团队一块儿开发,使得在开发流程、协做工具(例如jira、cvs/svn/git等)、测试上一般会有很大的欠缺,而职业的程序员在这方面则会专业不少。另外,一般职业的程序员作的系统都要运行较长的时间,因此在可维护性上会特别注意,这点我是在加入阿里后理解更深的。一个运行10年的系统,和一个写来玩玩的系统显然是有很是大差异的。编程

这块本身感受也很难讲清楚,只能说模模糊糊有个这样的概念。一般在有兴趣的基础上,从业余程序员跨越到成为职业程序员我以为不会太难。windows

编程能力的成长

做为程序员,最重要的能力始终是编程能力,就我本身的感觉而言,我以为编程能力的成长主要有这么几个部分:数组

一、编程能力初级:会用网络

编程,首先都是从学习编程语言的基本知识学起的,不管是什么编程语言,有不少共同的基本知识,例如怎么写第一个Hello World、if/while/for、变量等,所以我比较建议在刚刚开始学一门编程语言的时候,看看编程语言本身的一些文档就好,不要上来就去看一些高阶的书。我当年学Java的时候上来就看Think in Java、Effective Java之类的,真心好难懂。架构

除了看文档之外,编程是个超级实践的活,因此必定要多写代码,只有这样才能真正熟练起来。这也是为何我仍是以为在面试的时候让面试者手写代码是很重要的,这个过程是很是容易判断写代码的熟悉程度的。不少人会说因为写代码都是高度依赖IDE的,致使手写很难,但我绝对相信写代码写了不少的人,手写一段不太复杂的、可运行的代码是不难的。即便像我这种三年多没写过代码的人,让我如今手写一段不太复杂的可运行的Java程序,仍是没问题的,前面N年的写代码生涯使得不少东西已经深刻骨髓了。并发

我以为编程能力初级这个阶段对于大部分程序员来讲都不会是问题,勤学苦练,是这个阶段的核心。

二、编程能力中级:会查和避免问题

除了初级要掌握的会熟练的使用编程语言去解决问题外,中级我以为首先是提高查问题的能力。

在写代码的过程当中,出问题是很是正常的,怎么去有效且高效的排查问题,是程序员群体中一般能感觉到的你们在编程能力上最大的差距。

解决问题能力强的基本很容易在程序员群体里获得很高的承认。在查问题的能力上,首先要掌握的是一些基本的调试技巧,好用的调试工具,在Java里有JDK自带的jstat、jmap、jinfo,不在JDK里的有mat、gperf、btrace等。工欲善其事必先利其器,在查问题上是很是典型的,有些时候你们在查问题时的能力差距,有可能仅仅是由于别人比你多知道一个工具而已。

除了调试技巧和工具外,查问题的更高境界就是懂原理。一个懂原理的程序员在查问题的水平上和其余程序员是有明显差距的。我想不少的同窗应该能感觉到,有些时候查出问题的缘由仅仅是由于有效的工具,知其然不知其因此然。

我给不少阿里的同窗培训过Java排查问题的方法,在这个培训里,我常常也会讲到查问题的能力的培养最主要的也是熟练,多尝试给本身写一些会出问题的程序,多积极的看别人是怎么查问题的,多积极的去参与排查问题,不少最后查问题能力强的人多数仅仅是由于“无他,但手熟尔”。

我本身排查问题能力的提高主要是在2009年和2010年。那两年做为淘宝消防队(处理各类问题和故障的虚拟团队)的成员,处理了不少的故障和问题。当时消防队还有阿里最公认的技术大神——多隆,我向他学习到了不少排查问题的技巧。和他比,我排查问题的能力就是初级的那种。

印象最深入的是一次咱们一块儿查一个应用cpu us高的问题,咱们两定位到是一段代码在某种输入参数的时候会形成cpu us高的缘由后,我能想到的继续查的方法是去生产环境抓输入参数,而后再用参数来本地debug看是什么缘由。但多隆在看了一会那段代码后,给了我一个输入参数,我拿这个参数一运行,果真cpu us很高!这种case不是一次两次。因此我常常和别人说,我是须要有问题场景才能排查出问题的,但多隆是彻底有可能直接看代码就能看出问题的,这是本质的差距。

除了查问题外,更厉害的程序员是在写代码的过程就会很好的去避免问题。你们最容易理解的就是在写代码时处理各类异常状况,这里一般也是形成程序员们之间很大的差距的地方。

写一段正向逻辑的代码,大部分状况下即便有差距,也不会太大,但在怎么很好的处理这个过程当中有可能出现的异常上,这个时候的功力差距会很是明显。不少时候一段代码里处理异常逻辑的部分都会超过正常逻辑的代码量。

我常常说,一个优秀程序员和普通程序员的差距,不少时候压根就不须要看什么满天飞的架构图,而只用show一小段的代码就能够。

举一个小case你们感觉下。当年有一个严重故障,最后查出的缘由是输入的参数里有一个是数组,把这个数组里的值做为参数去查数据库,结果前面输入了一个很大的数组,致使从数据库查了大量的数据,内存溢出了,不少程序员如今看都会明白对入参、出参的保护check,但相似这样的case我真的碰到了不少。

在中级这个阶段,我会推荐你们尽量的多刻意的去培养下本身这两个方面的能力,成为一个能写出高质量代码、有效排查问题的优秀程序员。

三、编程能力高级:懂高级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,其余多数的程序员除了编程能力的成长外,也会愈来愈须要在系统设计能力上成长。

一般一个编程能力不错的程序员,在必定阶段后就会开始承担一个模块的工做,进而承担一个子系统、系统、跨多领域的更大系统等。

我本身在工做的第三年开始承担一个流程引擎的设计和实现工做,一个不算小的系统,而且也是当时那个项目里的核心部分。那个阶段我学会了一些系统设计的基本知识,例如须要想清楚整个系统的目标、模块的划分和职责、关键的对象设计等,而不是上来就开始写代码。但那个时候因为我是一我的写整个系统,因此其实对设计的感受并尚未那么强力的感受。

在那以后的几年也负责过一些系统,但整体感受好像在系统设计上的成长没那么多,直到在阿里的经历,在系统设计上才有了愈来愈多的体会。(点击文末阅读原文,查看:我在系统设计上犯过的14个错,能够看到我走的一堆的弯路)。

在阿里有一次作分享,讲到我在系统设计能力方面的成长,主要是由于三段经历,负责专业领域系统的设计 -> 负责跨专业领域的专业系统的设计 -> 负责阿里电商系统架构级改造的设计。

第一段经历,是我负责HSF。HSF是一个从0开始打造的系统,它主要是做为支撑服务化的框架,是个很是专业领域的系统,放在整个淘宝电商的大系统来看,其实它就是一个很小的子系统,这段经历里让我最深入的有三点:

1).要设计好这种很是专业领域的系统,专业的知识深度是很是重要的。我在最先设计HSF的几个框的时候,是没有设计好服务消费者/提供者要怎么和现有框架结合的,在设计负载均衡这个部分也反复了几回,这个主要是由于本身当时对这个领域掌握不深的缘由形成的;

2). 太技术化。在HSF的阶段,出于情怀,在有一个版本里投入了很是大的精力去引进OSGi以及去作动态化,这个后来事实证实是个很是很是错误的决定,从这个点我才真正明白在设计系统时必定要想清楚目标,而目标很重要的是和公司发展阶段结合;

3). 可持续性。做为一个要在生产环境持续运行不少年的系统而言,怎么样让其在将来更可持续的发展,这个对设计阶段来讲相当重要。这里最low的例子是最先设计HSF协议的时候,协议头里居然没有版本号,致使后来升级都特别复杂;最典型的例子是HSF在早期缺少了缺少了服务Tracing这方面的设计,致使后面发现了这个地方很是重要后,所有落地花了长达几年的时间;又例如HSF早期缺少Filter Chain的设计,致使不少扩展、定制化作起来很是不方便。

第二段经历,是作T4。T4是基于LXC的阿里的容器,它和HSF的不一样是,它实际上是一个跨多领域的系统,包括了单机上的容器引擎,容器管理系统,容器管理系统对外提供API,其余系统或用户经过这个来管理容器。这个系统发展过程也是各类犯错,犯错的主要缘由也是由于领域掌握不深。在作T4的日子里,学会到的最重要的是怎么去设计这种跨多个专业领域的系统,怎么更好的划分模块的职责,设计交互逻辑,这段经历对我本身更为重要的意义是我有了作更大一些系统的架构的信心。

第三段经历,是作阿里电商的异地多活。这对我来讲是真正的去作一个巨大系统的架构师,尽管我之前作HSF的时候参与了淘宝电商2.0-3.0的重大技术改造,但参与和本身主导是有很大区别的,这个架构改造涉及到了阿里电商众多不一样专业领域的技术团队。在这个阶段,我学会的最主要的:

1). 子系统职责划分。在这种超大的技术方案中,很容易出现某些部分的职责重叠和冲突,这个时候怎么去划分子系统,就很是重要了。做为大架构师,这个时候要从团队的职责、团队的可持续性上去选择团队;

2). 大架构师最主要的职责是控制系统风险。对于这种超大系统,必定是多个专业领域的架构师和大架构师共同设计,怎么确保在执行的过程当中对于系统而言最重要的风险可以被控制住,这是我真正的理解什么叫系统设计文档里设计原则的部分。

设计原则我本身以为就是用来确保各个子系统在设计时都会遵循和考虑的,必定不能是虚的东西,例如在异地多活架构里,最重要的是如何控制数据风险,这个须要在原则里写上,最基本的原则是可接受系统不可用,但也要保障数据一致,而我看过更多的系统设计里设计原则只是写写的,或者千篇一概的,设计原则切实的体现了架构师对目标的理解(例如当时异地多活这个其实开始只是个概念,但作到什么程度才叫作到异地多活,这是须要解读的,也要确保在技术层面的设计上是达到了目标的),技术方案层面上的选择原则,并确保在细节的设计方案里有对于设计原则的承接以及执行;

3). 考虑问题的全面性。像异地多活这种大架构改造,涉及业务层面、各类基础技术层面、基础设施层面,对于执行节奏的决定要综合考虑人力投入、机器成本、基础设施布局诉求、稳定性控制等,这会比只是作一个小的系统的设计复杂很是多。

系统设计能力的成长,我本身以为最重要的一是先在一两个技术领域作到专业,而后尽可能扩大本身的知识广度。例如除了本身的代码部分外,还应该知道具体是怎么部署的,部署到哪去了,部署的环境具体是怎么样的,和整个系统的关系是什么样的。

像我本身,是在加入基础设施团队后才更加明白有些时候软件上作的一个决策,会致使基础设施上巨大的硬件、网络或机房的投入,但其实有可能只须要在软件上作些调整就能够避免,作作研发、作作运维多是比较好的把知识广度扩大的方法。

第二点是练习本身作tradeoff的能力,这个比较难,作tradeoff这事须要综合各类因素作选择,但这也是全部的架构师最关键的,能够回头反思下本身在作各类系统设计时作出的tradeoff是什么。这个最好是亲身经历,听一些有经验的架构师分享他们选择背后的逻辑也会颇有帮助,尤为是若是刚好你也在一样的挑战阶段,光听最终的架构结果其实大多数时候帮助有限。

技术Leader我以为最好是能在架构师的基础上,后续注重成长的方面仍是有挺大差异,就不在这篇里写了,后面再专门来写一篇。

程序员金字塔

我认为程序员的价值关键体如今做品上,被打上做品标签是一种很大的荣幸,做品影响程度的大小我以为决定了金字塔的层次,因此我会这么去理解程序员的金字塔。

固然,要打造一款做品,仅有上面的两点能力是不够的,做品里很重要的一点是对业务、技术趋势的判断。

但愿做为程序员的大伙,都能有机会打造一款世界级的做品,去为技术圈的发展作出贡献。

因为目前IT技术更新速度仍是很快的,程序员这个行当是特别须要学习能力的。我一直认为,只有对程序员这个职业真正的充满兴趣,保持自驱,才有可能在这个职业上作好,不然的话是很容易淘汰的。

做者简介:

毕玄,2007年加入阿里,十多年来主要从事在软件基础设施领域,前后负责阿里的服务框架、Hbase、Sigma、异地多活等重大的基础技术产品和总体架构改造。



本文做者:云效鼓励师

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索