零、前言

为梳理 Java 工程师所需具备的技能,特编写该文档,为了更具有针对性,标题中含有 Java 一词,但实际内容中也包含许多非 Java 部分。要成为 Java 领域中的专家,不仅要求精通 Java,还需要掌握其他技术以及许多软技能,如:沟通能力、学习能力、业务能力等,该文也会略有涉及。

本文为能力提升系列第一篇《从业余到专业》,后续计划编写第二篇《从专业到专家》,本文所指的从业余到专业可以对应为实习生到中高级工程师的能力级别。

一、从业余到职业

每一个参加工作的人,都应当具备职业精神,那么对于 Java 工程师而言,在进入职场以后,我们需要改变自己许多业余的编码习惯和工作习惯,首先做到从业余到职业的转变。

这个部分包含需要掌握的基础技术、需要具备的职业心态以及在职场需要具备的核心能力。

1.1 基础技术

要成为一个职业的 Java 工程师,数据结构、算法、计算机网络、计算机原理等基础知识必不可少,这里暂不讨论,更多的是从工作中直接接触的应用层面着眼。

在业余到职业的转变过程中,以下的应用层技术需要系统性掌握并熟练使用。

1.1.1 编码规范

编写产品代码不同于编写业余项目,在一个在高度协作的环境下进行编码,必须有一定的规范来提升协作间的效率。编码规范的重要性不言而喻,不重视编码规范是一种业余的行为,长期不重视编码规范则对自己的职业生涯具有相当的破坏性,最终可能走向「从业余到失业」。

一般采用阿里开源的 Java 编码规范,在这里面有较为细致的规范,每一位 Java 工程师都应当细读。这套规范也有许多未涵盖的内容,对于未提及的部分,应当多查询资料,查找最佳实践方案,多记录,最终完善自己的规范体系。

结论:按照编码规范进行编码,将编码规范融入自身知识体系。

1.1.2 Java 基础

从事 Java 开发相关工作,必然需要具备坚实的 Java 基础,对于许多研发人员,可能由于种种原因这一知识体系并不系统,那么需要针对以下内容进行系统化学习。

  • 基本数据类型
    • 熟悉常用集合、字典、枚举等类型的使用
    • 理解装箱与拆箱
    • 泛型的使用
  • OOP
    • 深刻理解封装继承多态、高内聚低耦合的思想。
  • 多线程编程
  • IO 处理
  • 理解异常处理机制
  • JVM 运行原理
    • 垃圾回收机制
  • 反射
  • JDBC

推荐阅读:

《Java 编程思想》可检验自身 Java 基础的掌握程度,这本书对于初学者具有一定的难度,但对于将 Java 开发作为职业的人来说,这属于基础知识。

1.1.3 Spring 框架

Spring 框架已替代 J2EE 成为 Java 服务端开发事实上的标准,优秀的 Spring 基础必不可少,在这个阶段,主要需要熟悉以下内容。

  • Spring IoC 容器
    • 装配 Bean
  • Spring AOP
  • Spring MVC
    • 视图引擎
    • REST API
  • Spring 应用程序生命周期
  • Spring Security
  • Spring 集成数据访问
    • JDBC 模板
    • Redis
    • MyBatis
    • Hibernate
    • JPA
  • 数据缓存
  • Spring Boot

推荐阅读:

1.1.4 数据库基础

在服务端开发领域,说数据库技能所占的比重为 50% 也不为过,尤其是在传统项目中,在大型项目中由于所用的技术越来越多,这一比重会有所下降。那么在工作中,要掌握哪些数据库技能才不会显得业余,以主流的 MySQL 为例,请看下面所列举的一些技能点。

  • 数据库基础
    • 数据类型
    • 数据库设计范式
  • 数据库核心功能
    • 表、视图
    • 存储过程
    • 触发器
    • 游标
    • 函数
    • 事件调度器
  • 查询优化
    • 复杂查询
    • 索引优化
  • 事务处理
    • 事务隔离级别
    • 嵌套事务

推荐阅读:

扩展阅读:

熟练掌握以上技能即可从事基础的 Java 开发工作,除此之外,要想达到职业的标准,心态上也需要有适当地转变。

1.2 职业心态

所谓心态的转变,并不仅仅适用于刚入行的新人,而是需要在完成这一转变之后,在整个职业生涯中一以贯之。

  • 主动的心态
    • 职场和学校不同,在职场中需要强大的自我驱动力和积极的心态去面对工作。
  • 务实的心态
    • 从小事做起,把小任务做到极致也是实力的表现。
  • 成长的心态
    • 不管是硬实力、软技能,永远有学不完的东西,始终以谦虚的态度督促自身不断成长。
  • 竞争的心态
    • 持续不断提升自身的竞争力,避免被淘汰。
  • 共赢的心态
    • 竞争与共赢并不冲突,只有共赢,团队才能走的更远,个人才会有更大的发展。

1.3 核心通用能力

Java 工程师的核心能力除了技术、编码、逻辑等之外,还需要掌握许多能力,应当从这众多的能力中分清楚优先级,提取出核心并将其提升。

以下列举的是「从业余到职业」所需关注的核心能力。

1.3.1 个人执行力

业余与职业最大的一个区别之一在于工作必须付诸行动,必须不断向前推进并最终实现目标。 对于个人执行力,是指把上级的命令和想法变成行动,把行动变成结果,从而保质保量地完成任务。

1.3.2 沟通能力

不要将沟通能力理解成狭义上的表达能力,而要从广义上运用沟通能力,包括但不限于清晰准确地表达意见、持续向领导反馈信息、保持信息透明、与团队成员达成共识等。

出现缺乏沟通交流的情况时个人容易被团队所忽略,被忽略意味着个人价值认可度的降低。

1.3.3 责任心

能力越大,责任越大,反过来说,工作责任心越强,个人的能力就越能体现,不论工作大小,始终保持高度负责的态度,必然会获得领导的赏识。

责任心该如何体现? 一个项目中的开发人员总是处于流动状态,当我们参与一个项目的时候,也许只是负责其中的一小部分,但是将整个项目都纳入自己的责任范围才是正确的心态,这样往往能使自己脱颖而出。

1.3.4 业务能力

刚参加工作的新人往往对技术报有较大的热情,这个时候也不能忽视业务能力,技术最终是为业务服务,熟练的业务能力可以提升自身的价值。

积极地用技术中的系统性思维去解决业务上的问题,有效地提高业务各个环节的效率,最终实现技术驱动业务的发展,为企业创造更大的价值。

避免闭门造车、与业务脱节、不懂用户等现象,提升业务能力的同时也更能帮助自己提升产品思维,以便更好地达成开发出好产品的目标。

1.3.5 总结

在这里强调以上几点核心通用能力,主要是由于研发人员普遍更关注技术,但要把工作做好不能仅依靠提升技术能力,高效地执行工作、持续不断地沟通、树立正确的责任心态度、加强业务能力,这些同样非常重要,在这些能力里面都有一个共性,那就是我们作为组织里面的一份子,应该关注大图景:持续观察周围发生的事情,而不只是自己在做的事情,不要做温水里的青蛙

二、从职业到专业

业余到职业的转变是第一步,工作中必须不断设定更高的目标、持续提升自己,为了更得心应手地将工作做好,我们还需朝更专业的方向发展。在这个阶段需要掌握更多工作中常用的技术,我将这部分归为三类,第一类是需要精通或熟练掌握的,第二类是需要能够上手应用但现阶段还不要求精通的,第三类是需要略知一二能够知其用途、在相应场景下能派上用场的,体现个人价值的核心能力也不再局限于通用能力,而是包含更多该岗位所特需的能力。

注意,从职业到专业需要一个漫长的过程,这部分包含的内容也较多。

2.1 专业技术之了然于胸

2.1.1 Java 高效编程

这部分的技术点与 Java 基础有重叠,但要求对 Java 语言有更深入的掌握,并使用更高效的编程方法。

推荐阅读:

2.1.2 设计模式

在编码过程中反复解决的一些问题被归纳为设计模式,它是在技术交流中的重要组成部分,不会设计模式必然称不上专业的工程师。

推荐阅读:

  • 《Head First 设计模式》
  • 《设计模式:可复用面向对象软件的基础》

相关开源项目推荐:

除了阅读这些书籍之外,每一种设计模式最好都自己实现一遍以加深理解。

2.1.3 SQL 程序设计

推荐阅读:

2.1.4 Git 流程规范

推荐阅读:

2.1.5 Redis

推荐阅读:

2.1.6 工具类

  • IDEA
    • 熟悉快捷键
    • 探索插件市场,使用工具提升效率。
    • 熟练掌握重构工具。
  • maven

2.1.7 RPC

至少掌握以下一种常见 RPC 方式。

  • REST
  • Dubbo
  • grpc
  • Web Service

推荐阅读:

  • 《Netty 实战》
  • 《计算机网络:自顶向下方法》

2.1.8 代码质量

推荐阅读:

  • 《代码整洁之道》
  • 《编写整洁代码的艺术》
  • 《重构》

2.2 专业技术之驾轻就熟

2.2.1 Javascript

后端开发过程中,难免也会有一些前端编码工作,有一定的 js 编码能力可以起到事半功倍的效果。

2.2.2 消息队列

  • rabbitmq
  • kafka

2.2.3 Linux

熟悉 Linux 常用命令。

推荐阅读:

  • 《鸟哥的 Linux 私房菜》
  • 《Linux Shell 脚本攻略》

2.2.4 Web 服务器

熟悉常用 Web 服务器的使用。

  • nginx
  • tomcat

2.2.5 分布式相关

  • 数据库主从
  • Redis
    • 主从
    • 集群
  • Spring Cloud

2.2.6 单元测试

推荐阅读:

  • 《单元测试之道 Java 版》

2.2.7 Docker

推荐阅读:

2.2.8 Web 安全

常见攻击方式的防御。

  • xss
  • sqli
  • csrf
  • url 重定向攻击

推荐阅读:

  • 《白帽子讲 Web 安全》

2.3 专业技术之略知一二

2.3.1 NoSQL

  • mongodb

2.3.2 搜索引擎

  • lucene
  • ElasticSearch

2.3.3 序列化

  • Protobuf
  • Protostuff
  • Hessian
  • Bson

2.3.4 分布式工具

  • 分布式锁
  • ELK
  • Zookeeper
  • 分布式事务

2.3.5 正则表达式

推荐阅读:

  • 《精通正则表达式》

2.4 其他推荐书目

  • 《程序员修炼之道:从小工到专家》
  • 《代码大全》

2.5 核心能力

2.5.1 解决问题的能力

解决问题的能力被排在第一位,因为这是最能体现工作价值的一个能力,从某一层面来讲,老板雇佣员工都是为了解决某一问题。

在解决问题之前先避免成为问题的引发者,避免成为 bug 生产专家,程序员不同于其他工种的一个地方在于——糟糕的程序员可能给企业带来负价值,所以在提升解决问题的能力之前要先确保自己不会成为问题,这个过程也需要自身在逻辑能力、工作严谨性、技术能力等多方面进行提升。

解决问题包含几个阶段:

  • 发现问题
    • 不局限于个人工作领域,全盘看待整个团队。足够多的眼睛,就可以让所有问题浮现——linus。
  • 分析问题
    • 许多时候一些技术问题会让人摸不着头脑,有一套分析问题的理论体系是很重要的,当问题出现时,首先收集数据,让数据支撑自己对问题的原因提出假设,然后验证假设是否成立,若不成立则重复这一步骤。对于可能原因的初步判断、如何高效率地进行分析,这些则需要通过不断的学习和经验积累来进行支撑。
  • 解决问题
    • 解决问题时对准解决方法,而不是人。
    • 解决问题时真正理解出问题的代码。
  • 问题记录
    • 记录问题并进行复盘,防止此类问题再次发生,积累知识库。

在解决了具体的问题之后,我们不能仅局限于此,还需要多帮助团队成员解决问题,这是更能体现专业能力的地方。

2.5.2 学习能力

学习能力对于技术岗位极其重要,一方面需要技术积累以支撑工作,另一方面工作中也会碰到推陈出新的技术,这些迫使我们在工作中需要不断学习,因此也重点强调该能力。

好的学习能力有以下几个要素:

  • 自驱力
    • 对新知识、新技能具有强烈的渴求;积极利用多种途径为自己创造学习机会。
  • 好奇心
    • 好奇心是工程师应具备的特质,它能够驱使你不断深入地学习。
  • 认真
    • 学习方法上不存在银弹,认真阅读、认真记笔记、认真写读后感,这些最朴素的方式就是好的学习方法。
  • 动态规划
    • 动态调整学习步伐。
  • 联想
    • 将相关的技术串联在一起,帮助理解与记忆,加深思想。

2.5.3 信息获取能力

IT 行业构建于信息论之上,程序员应当更善于获取信息,在工作中也需要无时不刻地利用互联网查取资料,这是非常容易被忽视的一个重要能力。不同的程序员获取信息的能力和渠道都是不同的,可以在以下方面进行提升。

  • 做信息的捕食者而不是被喂养者。
  • 使用 Google ,充分利用全世界的信息。
  • 提升英文水平。
  • 学会利用各种信息工具。
  • 编写爬虫抓取信息。

三、尾声

作为一个 Java 后端工程师,需要学习的东西非常多,即使成长为一个专业的 Java 工程师,后面的路也还很长,本文所定义的「专业」是指接近高级工程师的能力,在下篇将继续讲解从专业到高级再到专家所需具备的技能。