初级程序员
仅能完成简单模块和项目的开发工作,难以胜任复杂模块的开发。通常是入行不久, 1 年及以下工作经验的同学。
能力要求
- 熟悉前端基础知识如 HTML、JS、CSS 。
- 能够使用一门 MVVM 框架进行简单的业务开发。
- 遇到复杂的组件和模块,会找现有的轮子使用。
- 会使用百度、google 等检索工具搜索问题。
中级程序员(阿里 p5)
在必要的辅导或标准流程支持下,能独立负责一个子模块或者一个项目的具体任务,对及时性和准确性负责。通常是 2-3 年工作经验的同学。
能力要求
- 除了前端基础知识外,熟悉计算机、网络等专业基础知识。
- 熟练掌握工作中使用的技术栈开发业务。(除了 MVVM 框架外,还能了解 webpack 的配置)。
- 能了解一个需求从开发-上线整个生命周期,并对各个环节负责。
- 具备基本的逻辑分析、问题分解、归纳总结等能力。
- 了解基本的数据结构和算法,写代码较熟练。
- 知道从靠谱的渠道去查找问题,在找不到合适轮子的时候,会造一些简单的轮子辅助业务开发。
高级程序员(阿里 p6)
具有独挡一面的能力,能够高质量完成工作,能把握一个系统/团队的整体实现,在推行过程中能提炼新的方法或方案,或对现有方案提出改进建议并被证明有效。通常是 3 年+ 工作经验的同学。
能力要求
- 具有独挡一面的能力,能高质量的完成模块级的工作。
- 熟练掌握工作中使用的技术栈,并能了解它们的实现原理。
- 能够在一个需求从开发-上线整个生命周期中找到痛点,并能使用技术的手段解决,提升效率。
- 能在模块维度对问题或需求做出分析和拆解,并做出相对合理的实现方案。
- 熟练掌握基础的数据结构和算法,代码符合规范,逻辑清晰。
- 有较好的技术选型能力。
程序员的进化之路
初级 -> 中级
通常在初级这个阶段,是进步空间最大的阶段,这个阶段是不存在天花板的。
编码
编码是初级阶段最需要经常做的事情,古话说孰能生巧,写代码也是同样的道理。
- 写什么的样代码
在公司要多做业务,尝试不同的业务,目标是让自己先成为一个熟练工。下班后也可以折腾点小项目做,可以选择自己感兴趣的内容,尝试自己实现一遍。 - 如何写代码
学会模仿,参考大牛的编码风格,照葫芦画瓢。如果公司有代码规范,跟随着公司的代码规范走,如果没有,参考业界规范,并用工具(如 eslint)约束自己。遇到一些不会写的,哪怕找到可以参考的代码,跟着抄一遍也行。
工作
大部分时间都在工作,那么如何合理的利用好 8 小时工作时间呢。
- 熟悉业务 不要仅仅埋头写代码,也需要对业务了解,认真参与需求评审环节,明确自己所做的任务。
- 熟悉工作流程
要熟悉从需求-开发-联调-测试-上线的每个工作环节,认真按照规范来执行,对上线要有敬畏心。 - 提升效率
工作的时候,尽量不要被打断,可以安排一个免打扰时段,比如下午的 2点-4点,只编码而不去处理其它事情。减少在群里 灌水和斗图的时间。 - 加班
可以接受合理的加班(比如为了赶某一个需求加班一阵子),不接受没有任何补偿和调休的日常加班(996),因为日常 加班会压缩你学习和生活的时间。
学习
初级阶段是需要通过大量的学习来提升自己的能力。
- 明确自己的学习目标 学习是为了提升能力,能让你胜任更复杂和有挑战的工作。
- 应该学习什么内容 前端基础,JS、CSS、HTML 反复学习。工作中用到的一门前端 MVVM 框架。了解一些广度知识,比如 HTTP、正则表达式、Web安全、性能优化、设计模式,数据结构和算法。
- 找到合适的学习方式
看书+编码:购买经典的书籍阅读,并作为平时写码的参考工具,看书和编码是一个反复的过程,基本就是看书->编码->看书->编码循环个 3-4 次,这个过程就是在不断修炼内功。
视频:慕课网的入门实战视频,根据自己的需求购买,要充分学习自己购买的每一个视频,认真的跟着老师学习一遍写一遍,遇到不懂的要积极提问,学习在于深入而不在于多。视频比书籍的好处在于更贴合实践,也更贴合公司业务,另外,课程的升级和更新也更加灵活。
官网文档:学习每一个新的技术栈,入门最好的方式是通过它的文档学习,可以系统的过一遍文档,手敲它每一个示例。
社区:慕课网手记、掘金、CSDN、InfoQ 等中文社区,利用碎片化时间看一些高质量文章学习。
GitHub:学会 GitHub 的使用,知道 clone、fork、pull、push 等基本操作。 - 花更多的学习时间 如果想比别人成长的快,就得花比别人更多的时间用来学习(这也是为什么不鼓励日常加班),尤其是初级这个阶段,成长曲线是非常快的。
- 知识沉淀 俗话说好记性不如烂笔头,可以养成写博客的习惯,把学习的内容用文字的形式记录下来,整理成文,并按学习的技术方向做归类。
提问
在初级阶段,免不了经常遇到问题,会提问也是一门技术活,好的提问姿势能让你事半功倍。
- 不好的提问方式
“这个报错是什么意思?”;缺乏思考,没有体现自己关于问题的思考过程。
“为什么我的代码和你的一模一样,就是运行不了?”;缺乏上下文,应告知代码是编译不过还是运行不起来、错误提示信息、相关代码、可能出错的代码分析。没有足够的上下文,神仙都不知道如何解决相关的问题。
“为什么 xxx 能(不能)yyy”;问的问题本身就是一个错误的结论,通常是只是看到了现象,而没有分析问题的本质。 - 好的提问方式
首先你在提问之前,自己应该经过充分的思考,并学会把问题拆解,在拆解的过程中就会把问题的复杂度降低。其次要善用搜索引擎,把关键字提取出来去搜索引擎上去搜索,先尝试自己去解决问题。
如果仍然不能解决,可以将问题的相关上下文、截图及必要标识及自己的思考过程、查找到的相关资料,以及自己的分析发送给想要帮助你的人,并能提供最小化复现的问题。
最后,请将你的问题及解决方案重新整理,并告知帮助你的人问题已经解决,重新整理解决问题的过程会帮助你理清思路、从而对问题有着更深的理解。
中级 -> 高级
到了中级阶段,基本上意味着你可以在大公司缺人的时候进入大公司工作了,如果想成为大公司不可拒绝的人才, 那你还需要朝着高级阶段努力。
编码
没错,到了中级阶段,你想要提升最重要的途径还是要编码。
- 写什么的样代码
和初级不同,除了做业务之外,你也参与开发做一些偏技术类型的项目,比如参与组内组件库的开发,一些通用 JSSDK 的开发,这些会对你的技术要求会更高。
有机会去参与平时使用到的一些开源技术栈的共建,比如想实现每个 feature 但现有开源库不满足,实现难度不大的情况下可以去提一个 pull request。 - 如何写代码
学会模仿,除了参考大牛的编码风格,还要琢磨他们的编码思路,多思考他们为什么这么做。
学会组件化、模块化的开发方式,学会复用和封装,减少 CV 的操作。
对自己的代码质量负责,可以经常组织 code review。
工作
想要进阶,需要在工作方面有些产出。
- 业务思考
要明白业务和公司的目标,参与到需求的早期阶段中,同时也要多思考业务,想着有没有通过技术手段来提升业务价值,比如移动端的白屏时间减少,可以带来很好的用户体验,提升用户的留存率。 - 技术思考
思考业务开发中的一些痛点,如何用技术手段去优化业务的开发流程,提升开发效率,比如为业务量身定制一款脚手架工具。 - 优化工作流程
不仅要熟悉从需求-开发-联调-测试-上线的每个工作环节,还要多思考每个环节有没有可以提升的点,特别是上线过程,比如能不能做到自动化,能不能做到小流量上线,能不能及时回滚代码。 - 技术分享
把工作中遇到的一些问题的解决方案、学习的一些新技术,产出的一些技术项目总结下来,作为组内技术分享和输出,这样一是可以总结沉淀你的技术,二是可以让大家能知道你做的东西,并活跃组内的技术氛围,三是锻炼自己的表述能力,这个能力在大公司的晋升述职中非常重要。
学习
中级阶段仍然需要通过大量的学习来提升自己的能力。
- 明确自己的学习目标
学习是为了提升自己的硬实力,不仅仅能够提升工作效率,还能让自己更好的服务于业务,升职加薪。 - 应该学习什么内容
研究工作中所用到的工具链,不仅仅是运行时的 MVVM 框架,还可以是编译时的 webpack,必要的时候去研究其中的源码实现。
深入学习一些广度知识,比如 HTTP、正则表达式、Web安全、性能优化、设计模式,数据结构和算法,并把它们应用到你的工作中。 - 找到合适的学习方式
看书:找到所学习方向的经典书籍阅读,适当做一些学习笔记。
视频:如慕课网的进阶实战视频,根据自己的需求购买。
官网文档:可以尝试去看一下英文文档。
社区:StackOverflow、HackerNews,慕课网手记、掘金等,除了利用碎片化时间看一些高质量文章学习,也可以往上面发布一些优质文章。
GitHub:关注 trending,参与开源社区的共建,并尝试自己造一些轮子。 - 学习时间与深度
在中级阶段,你仍然需要花很多时间去学习,这个时候要注重自己学习的深度了。 - 知识沉淀
俗话说好记性不如烂笔头,可以养成写博客的习惯,把工作中深入学习到的一些非敏感知识记录下来并发布,而不仅仅去发布一些基础知识的学习了。 - 技术视野
除了自己工作中的使用的技术栈之外,也要了解同类其它优秀的开源技术栈,从多个维度(feature 完整性、文档、上手难度、维护力度、生态等)去做对比。
要保持对新技术的敏感的关注,并时刻思考这些技术能否为自己的业务带来价值,在需要的时候做合理的技术选型。
总结
所谓技术能力其实就是解决问题的能力和学习能力,所以无论你在哪个阶段,甚至是更高的阶段,不断提升这两个能力都是你应该一直要做的事情。
最后
小编整理出一篇Java进阶架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等
由于pdf文档里的细节内容实在过多所以只编辑了部分知识点的章节粗略的介绍下,每个章节小节点里面都有更细化的内容!以下就是部分章节目录,由于头条的篇幅限制目录上的详细讲解也无法一一列出,文末底下有获取以下章节的所有详细知识讲解。
JVM
- 线程
- JVM内存区域
- JVM运行时内存
- 垃圾回收与算法
- JAVA 四中引用类型
- GC分代收集算法 VS 分区收集算法
- GC垃圾收集器
- JAVA IO/NIO
- JVM 类加载机制
由于篇幅限制小编,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点个赞+关注私信(资料)获取哦
JAVA集合
- 接口继承关系和实现
- List
- ArrayList(数组)
- Vector(数组实现、线程同步)
- LinkList(链表)
- Set
- HashSet(Hash表)
- TreeSet(二叉树)
JAVA多线程并发
- JAVA并发知识库
- JAVA线程实现/创建方式
- 4种线程池
- 线程生命周期(状态)
- 终止线程4种方式
- sleep与wait 区别
- start与run区别
- JAVA后台线程
- JAVA锁
- 线程基本方法4.1.11. 线程上下文切换
- 同步锁与死锁
- 线程池原理
- JAVA阻塞队列原理
- CyclicBarrier、CountDownLatch、Semaphore的用法
- volatile关键字的作用(变量可见性、禁止重排序)
- 如何在两个线程之间共享数据
JAVA基础
- JAVA异常分类及处理
- JAVA反射
- JAVA注解
- JAVA内部类
- JAVA泛型
- JAVA序列化(创建可复用的Java对象)
- JAVA复制
Spring 原理
- Spring 特点
- Spring 核心组件
- Spring 常用模块
- Spring 主要包
- Spring 常用注解
- Spring第三方结合
- Spring IOC原理
- Spring APO原理
- Spring MVC原理
- Spring Boot原理
- JPA原理
- Mybatis缓存
- Tomcat架构
由于篇幅限制小编,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙转发+关注私信(资料)获取哦
微服务
- 服务注册发现
- API 网关
- 配置中心
- 事件调度(kafka)
- 服务跟踪(starter-sleuth)
- 服务熔断(Hystrix)
- Hystrix断路器机制
- API管理
Netty 与RPC
- Netty 原理
- Netty 高性能
- Netty RPC实现
- 关键技术
- 核心流程
- 消息编解码
- 通讯过程
- RMI实现方式
分布式缓存
- 缓存雪崩
- 缓存穿透
- 缓存预热
- 缓存更新
- 缓存降级
网络
- 网络7层架构
- TCP/IP原理
- TCP三次握手/四次挥手
- HTTP原理
- CDN 原理
- 分发服务系统
- 负载均衡系统
- 管理系统
日志
- Slf4j
- Log4j
- LogBack
- Logback优点
- ELK
Zookeeper
- Zookeeper概念
- Zookeeper角色
- Zookeeper工作原理(原子广播)
- Znode有四种形式的目录节点
Kafka
- Kafka概念
- Kafka数据存储设计
- partition的数据文件(offset,MessageSize,data)
- 数据文件分段segment(顺序读写、分段命令、二分查找)
- 数据文件索引(分段索引、稀疏存储)
- 生产者设计
- 负载均衡(partition会均衡分布到不同broker上)
- 批量发送
- 压缩(GZIP或Snappy)
- 消费者设计
RabbitMQ
- RabbitMQ概念
- RabbitMQ架构
- Exchange 类型
Hbase
- Hbase概念
- 列式存储
- Hbase核心概念
- Hbase核心架构
- Hbase的写逻辑
- HBase vs Cassandra
- MongoDB
- MongoDB概念
- MongoDB特点
Cassandra
- Cassandra概念
- 数据模型
- Cassandra一致Hash和虚拟节点
- Gossip协议
- 数据复制
- 数据写请求和协调者
- 数据读请求和后台修复
- 数据存储(CommitLog、MemTable、SSTable)
- 二级索引(对要索引的value摘要,生成RowKey)
- 数据读写
设计模式
- 设计原则
- 工厂方法模式
- 抽象工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 适配器模式
- 装饰器模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
- 策略模式
- 模板方法模式
- 观察者模式
- 迭代子模式
- 责任链模式
- 命令模式
- 备忘录模式
负载均衡
- 四层负载均衡 vs 七层负载均衡
- 负载均衡算法/策略
- LVS
- Keepalive
- Nginx反向代理负载均衡
- HAProxy
数据库
- 存储引擎
- 索引
- 数据库三范式
- 数据库是事务
- 存储过程(特定功能的SQL 语句集)
- 触发器(一段能自动执行的程序)
- 数据库并发策略
- 数据库锁
- 基于Redis分布式锁
- 分区分表
- 两阶段提交协议
- 三阶段提交协议
- 柔性事务
- CAP
一致性算法
- Paxos
- Zab
- Raft
- NWR
- Gossip
- 一致性Hash
- 一致性Hash特性
- 一致性Hash原理
JAVA算法
- 二分查找
- 冒泡排序算法
- 插入排序算法
- 快速排序算法
- 希尔排序算法
- 归并排序算法
- 桶排序算法
- 基数排序算法
- 剪枝算法
- 回溯算法
- 最短路径算法
- 最大子数组算法
- 最长公共子序算法
- 最小生成树算法
数据结构
- 栈(stack)
- 队列(queue)
- 链表(Link)
- 散列表(Hash Table)
- 排序二叉树
- 红黑树
- B-TREE
- 位图
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙转发+关注私信(架构)获取哦
如何获取免费架构学习资料?
资料获取方式:
关注小编,私信关键词 【资料】即可免费获取到!
资料获取方式:关注小编,私信关键词 【资料】即可免费获取到!整理不易,日行一赞,普度众生吧~