Java 工程师指的是以 Java 作为主要开发语言的后端工程师。本文用于梳理 Java 后端工程师所需要掌握的一些技能,以及如何学习后端技术,新技术应该如何学习?以及常见问题。
背景
作为已经工作多年的 Java 后端开发人员,在度过 Java 的入门期之后,会有一个烦恼,那就是面对 Java 这么庞大的体系,我们究竟应该学习什么?即使我已经从事了相关的 Java 后端开发,但面对复杂的知识体系和各种教程文档,眼前看到的已经不再是清晰的山脉,而是一片迷雾。所以带个这个问题阅读了《Java 工程师修炼之道》一书,本文是对“后端技术导言”章节的部分摘录。
目录:
- 后端工程师技能树
- 如何学习后端技术?
后端工程师技能树
使用 Java 后端技术的目的就是构建业务应用,为用户提供在线或者离线服务。因此,一个业务应用需要哪些技术、依赖哪些基础设施就决定了需要掌握的后端技术有哪些。(下图为后端技术设施图)。
由于 Java 的体系过于庞大,不同公司为了构建自家的产品也会有不同的技术栈,技术的目的是为了构建业务应用的,换句话说技术是由业务来推动的。所以我也会结合实际的工作需求完善相关内容,逐步构建一个完整的技术知识体系。
核心原则
- Don’t Repeat yourself(不要做重复的劳动)
不要做重复性劳动。代码重复、工作重复在软件开发中都是不合理的存在。利用各种手段消除这些重复是软件开发的一个核心工作准则。
- Keep It Simple Stupid(设计越简单越好)
在做软件设计的工作中,很多时候都不要想得过于复杂,也不要过度设计和过早优化,用最简单且行之有效的方案也就避免了复杂方案带来的各种额外成本。既有利于后续的维护,也利于进一步的扩展。
- You Ain’t Gonna Need it(不要添加当前不需要的功能)
只需要将应用程序必需的功能包含进来,而不要试图添加任何其他你认为可能需要的功能。因为在一个软件中,往往80%的请求都花费在20%的功能上。
- Done is beeter than perfect(先完成,再完美)
在面对一个开发任务时,最佳的一个思路就是先把东西做出来,再去迭代优化。如果一开始就面面俱到,考虑到各种细节,那么很容易陷入牛角尖而延误项目进度。
- Choose the most suitable things(选择最合适的而非最新的)
这是在做方案选择、技术选型时候的一个很重要的原则。在面对许多技术方案、开源实现的时候,务必做到的是不能盲目求新,要选择最合适的而非被吹得天花乱坠的。
软件过程
- 项目管理
- 敏捷开发Scrum
- 测试驱动
- 持续集成
- Jenkins
- Travis CI
- Rundeck
- 源码版本管理
- Git
- GitFlow
- SVN
- Git
日常开发
- 项目工具
- GitHub
- 类似实现
- Gitbucket
- Gitlab
- 项目工具
- Phabricator(Facebook)
- 禅道
- 第三方项目管理服务
- Tower、Teambition
- 编辑器
- Emacs
- Vim
- Sublime Text
- Visual Studio Code
运行环境
- Linux
- 发行版
- Ubuntu
- CentOS
- Debian
- 常用 Shell 命令
- 性能分析
- top
- vmstat
- iostat
- sar
- 发行版
- Server
- Nginx(Web Server)
- 扩展开发
- Perl
- Lua
- JavaScript
- 扩展开发
- Tomcat(Servlet容器)
- Connector(BIO、NIO、APR)
- Nginx(Web Server)
- 负载均衡
- LVS
- HAProxy
- Nginx/Tengine
- Keepalived(心跳检测、主从)
- 虚拟化
- VPS
- OpenStack
- CloudFoundry
- 容器技术
- Docker
- Kubernetes
- VPS
第三方服务
- IAAS
- AWS
- AICloud
- UCloud
- PAAS
- SAE
- BAE
- GAE
- 域名
- 服务商
- 备案
- DNS
- DNSPod
- API(用于故障时自动切备用环境)
- CDN加速
- 蓝汛
- 七牛
- 又拍
- 邮件发送
- 短信发送
- 消息推送
- 开放平台
- 微博
- 微信
- 支付接口
- 支付宝
- 微信
- 银行/银联
计算机科学基础知识
- 数据结构
- 字符串
- 类型转换
- 查找、翻转、匹配
- 正则表达式
- 数组
- 查找
- 多维数组
- 链表
- 翻转
- 遍历
- 查找
- 删除
- 合并
- 字符串
- 算法
- 排序&查找经典算法
- 函数
- 递归
- 迭代
- 性能
- 时间复杂度
- 恐惧复杂度
- 业务相关算法
- 压缩算法
- LRU
- 最终一致性
- 编译原理
- 状态机
- 机器学习
- 分词
- 结巴分词
- 中科院ICTCLAS
- 关键词提取
- TF-LDF
- Text-Rank
- 文本相似度
- Word2Vec
- 余弦相似度
- 欧几里得距离
- 分类
- 朴素贝叶斯
- 推荐算法
- 聚类
- 协同过滤(模型、用户、物品)
- 用户画像
- 隐语义模型
- 分词
- 计算机网络
- TCP/IP
- HTTP
- Restful API 设计规范
- OAuth2.0
- HTTPS
- HTTP2.0
- SMTP
- 设计模式
- 工厂模式
- 单例模式
- 观察者模式
- 代理模式
- 建筑者模式
- 装饰器模式
- 适配器模式
- 门面模式
数据
- 高速缓存
- Memcached
- Redis
- 数据库
- NoSQL
- SSDB/Piks
- MongoDB
- HBase
- SQL
- MySQL
- PgSQL
- 安全
- SQL注入
- NoSQL
- 搜索引擎
- Elasticsearch
- Solr
- 消息队列
- ActiveMQ
- Kafka
- RabbitMQ
- 存储和分析(大数据)
- 数据仓库
- Hive
- Impala
- 离线计算
- Hadoop
- Spark/Spark mlib
- 实时计算
- Storm
- Fink
- 实时分析
- Druid
- Kylin
- 资源管理调度
- Yarn
- Mesos
- 数据仓库
- 数据同步
- Sqoop
- Cannal
Java 编程
- IDE
- IntelliJ IDEA
- 核心语法:Java6、7、8、9、10、11
- 集合类
- HashMap/ConcurrentHashMap
- ArrayList/LinkedList
- 线程安全集合类
- 工具类
- Google Guava
- Apache commons lang & BeanUtils & codec & Collections & IO & HttpClient & Hutool
- FastJson
- Orika
- ASM字节码操作
- CGLIB代码生成
- 高级特性
- 并发编程
- Executors
- Fork/Join
- 同步工具
- 泛型
- 协变&逆变
- Socket/网络编程
- BIO、NIO、AIO
- 系列化
- ProtoBuf
- Kryo
- RPC
- RMI
- Dubbo
- Hessian
- Thrift
- 并发编程
- JavaEE
- Servlet3.0
- 异步Servlet
- Servlet3.0
- 项目构建
- Maven
- Grade
- 框架
- Web
- Spring
- Spring MVC
- Spring Boot
- Mybatis
- 日志
- Log4j
- Log4j2
- Logback
- Slf4j
- API
- Jensey
- Web
- 测试
- 单元测试
- JUnit
- 黑盒测试
- 白盒测试
- 单元测试
JVM
虚拟机实现
HotSpot
J9
JRockit
Dalvik
ART
运行时内存组成
内存模型:主内存&工作内存
类加载机制
- 双亲委派模型
- OSGI
系统架构
单体应用-ORM
垂直应用-MVC
分布式服务
微服务
Duobo(服务治理框架)
Spring Cloud(微服务整套框架)
Service Mesh(新兴微服务架构)
如何学习一门新技术?