本文作者为优知学院创始人陈睿(mike),作者有10年以上技术&产品经验,曾任百度研发经理、携程定制旅游CTO。
“
这是一篇完整的java程序员学习线路图,一共分为六个阶段。
我以java为例,展示完整的学习步骤。
最后,还有我的学习经验思考。
希望,看完此文,你完全可以自学成为一名真正牛逼的程序员。
java程序员学习线路流程
第一步:Java语言基础
从最简单的开始,hello world开始Java之旅
1.编程基础
-
常量与变量
-
数据类型
-
运算符
-
流程控制语句
-
方法
-
数组
2.面向对象
-
面向对象思想
-
类与对象
-
成员变量和局部变量
-
封装
-
this关键字
-
构造方法
3.集合
-
集合概述
-
集合特点
-
ArrayList集合
-
HashMap集合
-
常用集合优劣比较
4.输入/输出 IO
-
字符输入流
-
字符输出流
-
字符缓冲输入流
-
字符缓冲输出流
-
复制文件
-
集合与文件中数据相互读写
5.练习阶段
属于你自己的helloword
第二步:java语言高级
再结合java高级部分,里面的部分内容,这个阶段你不一定能理解很彻底。但有一点,如果你今后想进入高阶俱乐部,这些内容你必须掌握牢固。
举个栗子,如果你面试通过进入了公司,我一定会在早期仔细review你的代码。代码的功力是欺骗不了人的,不同人写一个接口,呈现的结果也是千差万别(所以才有了规范)。
1.面向对象
-
继承
-
多态
-
重写(Override)
-
重载(Overload)
-
封装
-
接口
-
java包 package
2.异常处理
-
异常概述
-
异常分类
-
异常处理方案
-
自定义异常
3.多线程
-
Java线程:概念与原理
-
Java线程:创建与启动
-
Java线程:多线程的实现方案
-
Java线程:线程生命周期
-
Java线程:线程池
-
Java线程:线程状态的转换
-
Java线程:线程的同步与锁
-
Java线程:线程的交互等等
线程的几个主要概念
在多线程编程时,你需要了解以下几个概念
-
线程同步
-
线程间通信
-
线程死锁
-
线程控制:挂起、停止和恢复
4.输入与输出IO
-
文件和I/O
-
读写文件
-
Java 流(Stream)
-
文件(File)
-
缓冲流
5.泛型(Generic )
-
泛型的使用场景
-
泛型类型
-
泛型方法
-
泛型通配符?
6.网络编程
-
网络机制
-
Socket原理机制
-
UDP、TCP传输等
7.反射(reflection)
-
类加载机制原理
-
反射构造方法、字段、方法
-
Properties配置文件
8.注解(annotation)
-
注解的使用和原理
-
三种内置annotation
-
自定义annotation
-
注解类的反射调用
-
动态代理类如何处理
9.Java高级特性和类库
-
java类加载器class loader
-
java 程序运行的基础知识,java编译后的bytecode的整个运行机制,这一点对应.net的IL(intermediate language)。
-
理解Java nio,关于这一点网上有非常多的教程,这一条需要重点掌握,对于高并发的掌握很重要。
-
java juc(java.util.concurrent)等等
10.JVM原理和调优
JVM最重要的三个部分必须要非常清楚,内存划分、class加载机制以及GC策略。搞清楚这三部分不仅仅是为了面试,也是为了让你对于Java有更深刻的理解,这对于你的Java生涯非常有帮助。
内存划分简单说分为三个部分,Young Generation(年轻代)、Old Generation(年老代)以及Perm Generation(永久代)。其中的Young Generation(年轻代),又分为Eden、From和To,其中From和To又统称为Survivor Spaces(幸存区)。
关于classloader机制的学习,可以结合tomcat去学习,了解清楚tomcat的classloader机制,看tomcat是如何保证各个APP之间的类隔离的。如果可能的话,看一下tomcat中classloader的源码,当中也包含了与tomcat类加载机制相似的部分。
至于GC,需要清楚GC Roots都有哪些,以及如何判断一个对象可以被回收。此外,GC的算法和策略也要有大概的了解。
第三步:java web阶段
1.前段技术掌握
-
html
-
css
-
js
-
jquery
-
bootstrap
2.动态网页技术
-
Java Servlet API
-
Velocity
-
FreeMarker
-
JSP等常用模板引擎
比如,淘宝前端层使用的是velocity模板,部分公司采用jsp、freemarker等,基本类似。
3.linux服务器基本命令
在个阶段,也可以结合自己的情况,学习linux系统底层原理。
第四步:java框架阶段
1.SSH(struts2+spring+hibernate)
2.SSM(springmvc+spring+mybatis)
备注:如果你仔细,网上有部分叫SSI,I为ibatis,后来ibatis改名为mybatis了。
框架组合,我首推SSM,比SSH灵活强大。
框架的优缺点,我会再单独写文。
如果你还有兴趣,可以自己搭建Lucene、solr框架,以及memcached/ redis、activeMQ、hadoop等等搜索、分布式缓存、异步消息、数据等。
我一般建议自己搭建,从学习效果再到理解深度都不一样。有兴趣,就开始自己搭建。
第五步:开发工具阶段
1.web调试工具
-
firefox
-
firebug
-
web developer
-
yslow
-
httpwatch
-
ietester等
这些都是开发必用。
2.集成开发工具
eclipse(首推) ,STS,myEclipse,Idea
eclipse里的插件太多,推荐几个必装插件:
JadClipse 、run-jetty-run(很牛的热部署调试)、veloctiy、freemarker IDE、Subclipse、m2eclipse、mybatis Editor、 Easy Explorer等等。
3.版本控制工具
svn、git(首推)
4.构建工具
maven、nexus搭建maven私服
建议自己搭建一套nexus maven私服,成为你们公司的代码仓库员。
5.java调试工具
-
jProfiler(性能跟踪)
-
jClarity(性能监控和日志分析)
-
Visualvm(性能分析和调优)等
java调试还有很多,以上偏向性能调优和分析
第五步:项目实践阶段(淘宝店铺装修)
所谓的项目实践阶段,其实就是把以上的内如付诸于实践。听一万遍还不如自己动手一试。
项目实践的重要性,也许比你以上的学习步骤还来得重要得多,而且学习速度也更快。
如果大家有兴趣,我可以给大家分享,关于淘宝阶段的有技术挑战的项目,从需求收集MRD->需求文档(PRD)->需求评审->写技术设计方案->设计方案评审->写UC(User Case 用户用例)->UC评审->写TC(Test Case测试用例)->TC评审->编码…
当然,以上流程步骤,现在已经有部分变动,但是,万变不离其宗。
备注:
1.淘宝是所有公司里,要写UC的一家公司,其实就是开发写测试用例,开发写得好,测试根本不需要写测试用例。
2.很多同学不太会写设计方案,设计方案其实最好的方式就是借鉴,一个好的设计方案模板很管用。技术设计方案模板和代码规范,其实都是大部分人不断实践后沉淀下的结晶。
我的学习经验
首先,自己得有信心。
我之前也仅是表象相信这件事,我也是经历几次跨界学习之后,才从本质认识到这句话的重要性。
如果你从早期就不相信你能做到,基本你也很难做到,更难做好。大部分学习新技能,一看一听再看,彻底被吓退了,从学习气势上就已败下。如果这样的信心没建立起来,其实也不要紧,但至少需要具备这样的思维能力。学习的信心最后也是通过不断的学习积攒起来的。
其实学习本身根不是事,反而是你要学什么,这件事反而变得极其重要了。
要想学好,先从气场上就得暂得先机。
其次,凡事讲究方法。
自信是第一条,但是,光有自信肯定是不行的。
方法论很重要,我比较喜欢研究方法论。关于技术、产品的方法论,如果你是老读者,我之前写了很多类似的方法论。如果你想了解,那就勤快一点,翻翻老文,这里我就不多讲了。
总之,项目实践带动理论,自认为效果最好。
再次,专注是最好的老师。
现在回想起来,只有我早期在newegg、淘宝的阶段是最专注技术的阶段,专注有时候真是一种享受。后面进入百度、携程开始,由于带团队,还要管产品业务,每天一小会,每周两大会,特别是在携程阶段,技术、产品、测试都管、还有部分运营。所以,珍惜你现在的编码阶段吧,对技术的提升其实也在这个阶段。
最后,兴趣能引导你走得更好。
以上的内容,我认为都是平行阶段。如果你想有更大的发展或者造化,我坚信一定是兴趣引导的阶段,也只有这样,才能把自己的潜能最大化。