对于一个Java开发来说,编程能力无疑是重要的。
不过,除了基本的编程和开发能力之外,其他能力也是体现一个程序员能力的非常重要的因素。
比如问题排查能力、在线运维能力、项目管理能力、协调沟通能力等。
本文就来简单介绍一下,作为一名合格的Java开发人员,除了自身的技术成长外,还有哪些方面是可以提升的。
班级发展技巧
第一类不是纯粹的技能,但也和开发相关,我称之为开发类技能。
系统
很多人的开发机器通常都是图形化开发界面。但这并不意味着你不需要基本技能。
因为你开发的应用可能会部署在一台机器上,而经常要和这台线上的服务器打交道,所以系统的安装、开发环境的搭建、常用命令以及在环境中的项目部署、启动、调试等都是必备的技能。
否则,一旦网上出现问题,你将束手无策。
单元测试
我在《单元测试的重要性》中说过,单元测试非常重要,好的单元测试可以帮助我们节省很多开发时间。单元测试是保证更好的持续集成和持续交付软件的基本前提。
单元测试也涉及很多技术,比如使用Mock进行单元测试,使用内存数据库进行单元测试等等。
开发人员应该养成编写单元测试的习惯,并掌握基本的单元测试编写技巧,这样才能尽早发现问题。
版本管理
我相信基本上所有公司代码都会通过版本管理工具进行托管,无论是Git还是SVN。
而且现在很多技术都是开源的、共同共建的,使用版本管理工具也是Java开发必备的基本技能。
版本管理涉及到的知识点比较多,比如什么时候提交,提交的时候怎么写,代码冲突怎么解决等等,都需要熟练掌握。
构建工具
和版本管理一样,企业级开发的依赖管理也不再是原来的Jar包的导入导出,而是依靠or等工具。
构建工具的使用同样重要,一个合格的开发人员必须知道如何检查依赖冲突,如何进行依赖仲裁等。
代码调试
有人开玩笑说,程序员一半的时间都在写bug,另一半的时间都在写代码。这句话听起来很让人心痛,但也说明了代码的重要性。
虽然说程序员有一半的时间都在写 Bug 有点过分,但任何程序员都不可能一气呵成地写完代码,项目越大,可能出现的 Bug 就越多,离线开发是发现问题、解决问题最有效的手段。
代码调试其实很简单,只要设置端点,然后一步一步跟着程序运行,就能看到结果。只要学会使用IDE提供的工具,就可以参考“
故障排除和解决方案
当进行故障排除时,这种能力非常非常重要。
当出现问题的时候,就是考验程序员能力的时候了,这是最能区分程序员水平的技能,一个问题往往可能涉及到很多方面的知识。
阿里里面有一个大神级的人物,绰号多龙,淘宝早期,他基本上什么问题都能解决,被人称为大神,就是因为他的排错能力和解决问题的能力。如果你能在两天之内解决一个团队两周都没解决的问题,那你也会被人称为大神。
很多时候,解决问题并不难,难的是定位问题所在。这涉及到很多知识,知识储备很重要。但如果知识储备不够,至少可以从以下几个方面提升自己的能力。
1. 查看日志
2.分析Java堆栈信息
3.查看集群监控指标
非开发技能
还有一类技能可能与开发无关,我称之为非开发技能。这些技能往往决定了开发人员能达到的高度。
目标导向
我把目标定向称为一种能力,是一个人应该具备的基本能力,而且是可以训练和培养的。
目标导向的人在做事情之前会先明确自己的目标,然后寻找实现目标的方法,最后利用一切可以利用的资源,通过各种方法来实现目标。
有目标导向的人有明确的目标。
目标明确的人,做事就不会轻易动摇和放弃,为了目标,会克服困难,坚持到底。
目标明确的人在做事时,会思考并尝试各种方法来实现目标。
有明确目标的人在做事时,会发现、创造、借用一切可以实现目标的资源。
坚持给自己定目标,做一个目标导向的程序员。如果你坚持把目标导向理解为KPI导向,我也不拦着你。最主要的是有一个目标,并为之努力,我觉得就行。
时间管理
时间管理对每个人来说都很重要,对于程序员来说尤其重要,因为我们没有太多的可支配时间。
如何合理管理时间,是一个很深奥的课题。有些人每天加班加点,甚至每天工作996小时,但最后还是得不到好结果。这很大程度上就是因为他们的时间管理不好,大部分时间都花在了“忙碌”上。

很多时候,与成绩相比,努力会显得有些暗淡。
一个程序员一天要做的事情很多,工作上可能要好几次需求评审、设计评审、交互评审、TC评审等,还要排查问题、写代码,有时候还要兼任产品、运营,甚至客服的角色,生活上也要陪家人,充实自己,锻炼身体等等,如何安排好自己的时间很重要。
关于时间管理,我有一个建议,就是把手头的事情安排好,一次只做一件事。
快速学习
在这个技术飞速发展的时代,每天都有新技术推出,一个优秀的开发人员需要不断学习,才能保证自己永远不会被淘汰。
学习无疑需要花费大量的时间,因此对于时间有限的程序员来说,快速学习的能力也是至关重要的。
英语能力
首先我们日常开发的代码都是英文的,很多技术都是外国人发明的,也就是说很多新发布的技术文档都是英文的。
以目前最火爆的区块链为例,不管中本聪是不是日本人,他发布的区块链白皮书也是英文的,英文水平好的人可以立刻学到新知识,而英文水平差的人可能只能看到二手翻译的资料。
一个英语好的技术人员可以通过翻译书籍赚很多钱,但是一个英语不好的程序员却很难命名变量。
科学上网
我觉得这个对于开发者来说很重要,就像上面说的英语能力一样,很多手机号交易平台的信息都是在国外的网站上发布的。
不管是维基百科,这些都需要科学上网。而且很多国外网站,比如,也可以通过科学上网更快的访问。
项目管理
每个程序员将来都会成为 PM,无论他们负责的是大项目还是小项目。他们都需要良好的项目管理技能。
你要懂得如何评估风险,如何评估成本,如何确保项目按时上线,如何管理项目团队,要学的东西还有很多。
任何一个点把握不好,都可能导致项目风险,甚至项目失败。
在项目管理方面,如果项目按时发布,你可能不会获得任何荣誉,但如果项目失败了,你就会感到愧疚。
一个不懂项目管理的程序员最多只能是一个高级程序员,不可能晋升到专家级以上。
协调与沟通
在一个项目中,除了项目经理的角色之外,开发人员并不是独立的,经常需要跨团队、跨部门,甚至跨公司进行协作。
在项目中,你和其他参与的同学所扮演的角色是相同的,你们之间的关系也算是平级的,所以如何横向管理就显得很重要。
为什么很多人解决问题很快,而有些人却要走很多弯路呢?因为有些人懂得协调沟通的技巧。说白了,他们出去办事,有时候只要“扫一扫脸”就能解决问题。所以,他们之所以能“扫一扫脸”,是因为他们有很强的协调沟通能力。
理解
如果没有很好的理解能力,就无法很好的理解需求,如果不能很好的理解需求,可能会浪费很多时间,很多时候PD提供的需求文档并不全都是合理的,这种情况下,如果开发人员的理解能力更加差,在需求评审阶段无法正确的理解需求,那么项目的结果可想而知。
如果你的理解能力不好,那么你就无法快速学习新知识,而且要比别人花费更多的时间。即使是学习 Java 9,有些人可以很快理解模块化的原理,而有些人却完全搞不懂。这就是理解能力的差异。
表达能力
以上这些能力在一定程度上都依赖于自我表达能力,如果自我表达能力不好,协调沟通肯定会有问题,更别说项目管理了。
除了日常工作需要有表达和沟通能力外,很多公司还会要求你写日报、周报或月报。如果你表达能力好,可以很清楚的写出自己做了什么,做出了什么贡献,领导看了心里舒服,工作成果自然也不会差。
另外,很多公司的晋升制度是防御性的,所以能否清晰地表达自己过去一段时间的工作成绩和收获,很大程度上决定了你的晋升结果。
有时候,开发者也要参与演讲,无论是团队内部,公司内部,还是行业会议,表达能力很重要,很多时候别人认识一个人,首先就是看他的表达能力。
新木桶理论
说了这么多,好像程序员是无所不能的。但是我想说,程序员应该是无所不能的,因为我们要改变世界。
话虽如此,如果你有能力,最好把上述所有能力都培养起来。但是,如果你在某方面不太擅长,那么你也应该清楚地认识到自己缺乏什么。
最可怕的就是不知道自己不知道什么,这篇文章有个小目的,就是先让大家知道自己不知道什么。
我们都知道木桶定律——木桶里的水量取决于最短的木板。
传统的木桶定律是将木桶放在平面上测量,但如果将木桶放在倾斜的平面上,则木桶可容纳的水量取决于最长木板的长度。
当然,这要求长度必须是相对的,并且长木块周围要有相应长度的木块来辅助。
也就是说,当某一块体比其他块体短一段时,不但要选择合适的坡度,更重要的是要合理地排列其他块体,让它们发挥应有的作用,最大限度地发挥现有块体的作用。
以上我列出的技能是程序员的木板,有短板没关系,只要找到自己的长板,并在其周围安排相应长度的其他木板就行。
鸡汤时间
以上所说的技能,之所以叫技能,是因为这些技能是可以训练的,包括理解的能力,表达的能力,学习的能力,这些都是可以训练的。
所以,开发人员,不要只专注于编码。抬头看看,弥补你桶里的木板的长度。这将帮助你走得更远。
你的技术水平决定了你发展的下限,而你的软技能决定了你发展的上限。
来吧,我们互相鼓励吧。