本人已经工作两年多了,尴尬的是待过的两家公司都是外包,大部分外包公司技术性都很一般,这也是很多人看不起外包公司的一点,有的公司招聘明确
说不要外包,就问你尴尬不?可是已经在外包公司了怎么办,我也很绝望啊。。。。。而且我做过的项目都是很老的项目,后期做些需求。现在待的甲方公司
项目很多,我接触的项目框架就是SSH,中间件是Redis、ActiveMQ,当然会包含企业内部开发的一些构件等。这里不是说甲方公司技术性不高,只是我接触
到的项目技术性不高。
进入公司的时候,自己基本知道情况了,几乎不加班,这点事挺好的(因为我们组就三个人,负责项目需求少)。自己也不想成为一个很咸的咸鱼,也
期望着有天能够进入互联网公司。但是下班回来学习的次数很少,即使学习也静不下心。人总是这样,一边玩着手机,一边又很内疚自己浪费时间,虚度光阴。
博客在7.20号写的,今天10.24,我从外包进入一家发展不错的互联网公司,算是脱离苦海,让未来有点盼头了,顺便说下,微服务挺重要的,我面试
三家都是用Spring Cloud,你如果完全不懂,跟专业不对口差不多,可能简历都过不去,我本人有用微服务重构过一个小项目,算是练手吧。
后来给自己列了学习计划,也是从网上搜索一个工作两三年的程序员需要掌握哪些知识才是合格的。
1、Java基础知识
#反射、IO、接口/抽象类、内部类、异常、Enum、序列化、static、final、Iterator,Iterable和Comparable,Comparator等
基础知识肯定不是只有这点内容的,这部分很多人忽略的,包括我自己,总感觉这么简单的内容,自己已经会了,但是实际上你还差得远,在面试之前
刷刷题,你就会了?这部分内容深入学习之后,总能发现以前不知道的知识。
我们在面试要求上总能看到基础扎实,说明基础真的很重要,基础都不行,扯什么高并发、分布式。
PS:这里推荐《Java编程思想》或者一些大神博客
2、jvm相关内容
#GC、运行时数据区、类加载机制、双亲委派模型、内存溢出/泄露、Java内存模型、字节码、jdk工具、GC调优/jvm调优、Tomcat相关等
jvm的内容是你成为一个高级工程师必须具备的知识,高工不是工作年限到了就是了,你的知识储备能够达到要求吗?
这部分内容自己也学了很多了,但是真正在工作中应用很少,特别是jvm调优一部分,只是在自己的阿里云上面进行调试,缺少真正的经验。jvm调优总是
出现在招聘要求上,所以是需要你去注意的内容。
PS:推荐《深入理解Java虚拟机》以及我在公众号买的课《从0开始带你成为JVM实战高手》,如果你在项目中这方面接触较少,这门课会有很多生产案例去
分析,这不是广告,只是本人买了之后感觉还不错,比哪些只会空谈jvm优化的讲师强多了,就推荐一下,而且就几十块钱,感兴趣的可以了解一下。
3、jdk源码
#集合源码 1.List:ArrayList,LinkedList 2.set:HashSet,LinkedHashSet 3.map:hashmap,hashtable,concurrentHashMap源码以及区别 3.对Object,String,synchronized等类的源码了解。 #并发包源码 1、线程池 2、Automic源码 3、ReentrantLock等相关Lock源码 4、CopyOnWrite* ....
源码部分本人只是学习了集合部分,并发相关源码只是对Automic基本了解了一下,但是后续也是会看的。
这里说下看源码的目的:无论是jdk源码,还是框架源码,首先能够让你对这个东西更深入的了解,第二能够学习优秀代码,学习到内部使用的设计模式
等。如果只是为了面试,真的没必要花费很多时间在上面。
很多人学些Spring源码,本人是没看的,因为很多人都说需要花好几个月的时间才能完全理解,我想自己肯定坚持不下来的。如果你能坚持下来,收获
肯定也很大。之前有去学习Netty源码,然后导致我后面一个月几乎都没学习,真的很枯燥,直接放弃学习,放飞自我了。学些任何框架源码,一定是你对
这个框架有深入了解过后,否则你都不知道怎么用,看源码更是懵逼。
4、多线程、并发
多线程、JMM、synchronized、Lock相关、volatile、ThreadLocal、线程池、线程安全、Atomic(CAS)、生产着消费者、线程安全集合类、CountDownLatch、Semaphore、CyclicBarrier等
这部分内容一般公司开发中使用很少,个人也学习了,但是不在工作中应用,学完过后就忘了。但是没办法,面试要求啊,这些也属于基础知识的。工作
中也就使用线程池、volatile、ThreadLocal吧,最近从头学习,发现真正深入之后,wait(),join()这些简单的方法,有很多知识点不知道的。
5、设计模式
#工厂、抽象工厂、代理、单例、策略、模板、观察者、装饰器、适配器、组合模式等
设计模式其实就是套路,为了解决某些问题而被总结出来的。设计模式应该被理解,被应用到项目中,而不是只是简单理解,然后写个demo,面试官
也会问你在项目中用到哪些设计模式。个人对这方面掌握比较薄弱。。。
6、MySQL
#基础语法、数据类型、日志、存储引擎、索引优化、SQL优化、触发器、视图、存储过程等
常用的关系型数据库有MySQL、Oracle、DB2等,MySQL应该是使用最多的,所以这里列举MySQL相关内容。这部分也是开发人员需要掌握的内容,
最终能够达到熟悉SQL调优,索引调优,设计表结构的程度。
特别是B-tree索引原理一定要很清楚,对你工作和面试都有帮助,SQL、索引优化都很重要,平时要多积累,而不是面试前背一些东西,那样很容易穿帮。
7、框架
#SpringMVC、Spring、Hibernate、MyBatis、SpringBoot等
这里列举了常用框架,SSH/SSM是基础,SpringBoot你也应该掌握的,用过SpringBoot之后,你就不想用回之前的框架了,简化配置到极致,虽然也有
着一些缺点。包括权限控制方面,可以选择Spring Security和Oauth2、SSO、AWT等等了解一下。
以后肯定要看IOC、AOP、mybatis源码,都说阅读源码能够有很多收获,而且面试也是一点优势。
8、Redis
#基础API、主从复制、持久化、集群、其他功能
我们对Redis的理解,不应该只是停留在性能强大,缓存的程度。想起来一年多之前我来上海面试的时候,简历上面写着了解Redis,然后面试官问
分布式锁,缓存雪崩这些内容,直接一脸懵逼。。。
首先,基础API一定要熟悉,哪些命令的时间复杂度O(N),不能再生产环境使用。除了上面列举的内容,还需要掌握
Redis实现分布式锁,分布式ID,慢查询,pipeline,消息队列,排行榜,缓存穿透、缓存雪崩,缓存过期策略,更新策略等。
把这些内容了解之后,才能抗住面试官的狂轰滥炸。。。包括Redis优化方面也要接触。
个人认为MongoDB最好也了解一下。
9、MQ
#RabbitMQ/RocketMQ/Kafka
上面RabbitMQ和RocketMQ可以选择一种去学习,当然都学了更好,Kafka更适合大数据日志记录等场景。而之前的ZeroMQ和ActiveMQ渐渐被
淘汰了,本人项目组就是用的ActiveMQ。我选择学习了RabbitMQ,需要了解:
基础组件、Java API、可靠性传输以及幂等性、Confirm、Return机制、限流、死信队列、TTL、顺序消费、延时消息、集群等
10、微服务
Dubbo+Zookeeper、SpringCloud/SpringCloud Alibaba、Docker
微服务这几年很火的架构,主要是阿里系的Dubbo+Zookeeper,还有Spring系的SpringCloud,以及在此基础上二次开发可能更优秀的SpringCloud
Alibaba。本人两边都有学习了解,这里需要掌握的内容:
注册中心、应用间通信RestTemplate/Feign、统一配置中心、网关Zuul/gateway、服务容错Hystrix、Ribbon、Sleuth、Zipkin等
这里推荐学习一下GitHub上面很好的学习项目:https://github.com/zhangxd1989/spring-boot-cloud
Docker也是需要学习的,微服务避免不了的东西。这里说下,用Docker安装其他应用真的超级方便。。。
再加个全文搜索的内容吧,本人学习了Elasticsearch,感觉挺不错的,也建议学习一下。
11、计算机网络
HTTP、HTTPS、TCP、UDP、Socket等
这里把HTTP也归类到这部分,你需要了解报文内容/参数、状态码、cookie、session、跨域等内容。网络分层(四层、五层、七层),TCP的三次握手,
四次挥手,滑动窗口,拥塞控制以及相关算法,粘包、拆包等内容。
如果可以的话,也学习一个Netty,一个特别好的框架。
12、数据结构、基础算法
以前学习Java的时候我就想这辈子我都不会再学习算法了,因为老是感觉智商有点欠费,现在还是需要把以前的债还上,mmp。。。
需要掌握的内容:
链表,栈,队列和堆、树、B+树、二叉搜索树、AVL树、红黑树、图等
一般面试最多问到红黑树的难度,还有InnDB索引用到的B+树。
算法我只是了解基本排序算法:三大排序、希尔排序、快排。下面是需要掌握的内容,我估计这辈子我都掌握不了。。。
1.理解大O等记号 2.动态规划如:几类背包问题最好有现成的代码用于笔试。最长公共子序列 3.贪心算法:理解赫夫曼编码(笔试常考概念) 4.B树B+树用于理解数据库索引 5.常用的图算法:广度优先,深度优先,最短路径算法(最好有现成的代码),最小生成树。
13、基础工具:maven、SVN、Git等
这部分内容只要项目中有用到,应该没啥问题的,只要平常专门看下相关文章,把你没有关注过的点补上就可以了,可以关注一点大佬的公众号。
14、Linux、Nginx
Linux基础命令肯定都要会的,例如:
mv、cp、vi、vim、cat、tail、grep、more、tar、ps、netstat、kill、scp、top、编译命令、sudo、nohup、ssh、chmod、rpm、yum、wget、find、which、whereis等
基础命令太多了,没法一一列举,平常多注意点就可以了,Linux系统参数怎么看等,这也只是我知道的内容,可以自行百度了解。
特别是关于项目参数的监控,CPU、内存,硬盘等等相关命令一定很熟。
至于Nginx的部分,本人只是停留在负载均衡、反向代理这些基础功能,和一些简单配置上面。可以自行百度,或者学习慕课网上的一个视频
几百块钱也不是很贵,毕竟现在是知识付费的年代,不想花钱,自己可以想办法,这里不能多说,应该都知道。
PS:推荐大家都知道的《鸟哥的Linux私房菜》
15、分布式架构:
分布式缓存、分布式存储、分布式锁、幂等性、分布式事务、流量削峰、服务容错、服务降级等
这部分内容我理解的很浅显,但是很重要。
例如如何实现分布式锁:
1、数据库主键
2、Redis实现
3、Zookeeper实现(最优)
本人没有学习过Zookeeper,所以实现不太清楚,但是网上都说它才是最佳实现。
分布式,或者秒杀等业务场景很多面试都会问到,别管我用不用得到,你必须要会,面试造核弹,工作拧螺丝,这是大环境,既然不能反抗,就默默努力吧。
本人最近在学习这部分内容,推荐:Java电商秒杀系统深度优化 从容应对亿级流量挑战,大佬的这个视频很牛逼,366块钱,绝对物有所值。
秒杀这种场景,不是随便刷点题就能蒙混过关的,你要知道优化的步骤,每一步系统吞吐量提高了多少,否则面试的时候直接尴尬到死吧。
16、代码优化
工作年限高了,代码也要写的更加优雅,阅读源码,应用设计模式,书籍都是进阶的途径。例如:《代码整洁之道》和《Effective Java》
学习方式:
学习的渠道有很多吧,书籍,博客,公众号,视频等,每个人的学习方式不同,适合的也不一样,如果想要精通某个技术,肯定还是回归书本,博客的
学习可以选择一些大神的博客,内容有保障,或者是公众号。
这是本人关注的公众号,收藏了一大堆文章,看过的没多少。。。
至于视频学习,比较推荐慕课网吧,特别是付费部分,讲师很多都是BAT的大牛,但是视频学习有个缺点,很多人技术好,讲课不一定适合,说了一
大堆废话,听过后啥都没记住。看视频你也不敢快进,可能30分钟的视频,你只需要那30s的内容,这点还是比不了文字的。
公众号的内容讲真的很多质量无法保证,更重要的是一般无法系统学习,系统学习真的很重要,才能真正的提升,而不是这里学一下,哪里来一下的。
总结:
以上就是本人到工作5年的学习计划,为啥是五年呢,因为我马上要工作3年了23333333。老实说几乎都学了一部分,最开始学习就是东一榔头,西一棒子的,
没啥效率,下班回来也不想学习,大学养成的坏毛病。如果我学习的劲头能和健身的热情差不多,估计我都学完了。
今年开始系统学习了,因为真的要努力了,工作两年多了,作为一个菜逼,再不学习就晚了。
花了几个小时写博客,BB了一大堆废话,算是给那些迷茫的人一个基本学习计划参考吧。
本人最近刚换工作,学习真的很重要,不要说什么"面试造火箭,工作拧螺丝",如果真要你造火箭了,你什么都不会,难道去百度吗?
这次换工作,面试了三家小互联网公司,都通过了,想想刚来上海面试的时候,和现在差别真的不小。终于脱离外包了,希望能在这家公司学到很多。
没有几个人喜欢学习,但是为了工资,为了将来,也要努力啊,因为我TM想要买房啊。