Java工程师成神之路

作者:HollisChuang
原文地址:http://www.hollischuang.com/archives/489

今天分享的这篇文章,作者从基础、进阶、高级、扩展四个方面,为大家分享了如何成为优秀的Java工程师所具备的知识。来看看,你目前处在那一个阶段呢?

一、基础篇

1.1 JVM

1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收

1.1.2. 了解JVM各种参数及调优

1.1.3. 学习使用Java工具

1.1.4. 学习Java诊断工具

1.1.5. 自己编写各种outofmemory,stackoverflow程序

HeapOutOfMemory
Young OutOfMemory
MethodArea OutOfMemory
ConstantPool OutOfMemory
DirectMemory OutOfMemory
Stack OutOfMemory Stack OverFlow

1.1.6. 使用工具尝试解决以下问题,并写下总结

当一个Java程序响应很慢时如何查找问题 当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志 当一个Java应用发生OutOfMemory时该如何解决,年轻代、年老代、永久代解决办法不同,导致原因也不同。

1.1.7. 参考资料

1.2. Java基础知识

1.2.1. 阅读源代码

java.lang.String java.lang.Integer java.lang.Long java.lang.Enum java.math.BigDecimal
java.lang.ThreadLocal java.lang.ClassLoader & java.net.URLClassLoader
java.util.ArrayList & java.util.LinkedList
java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap
java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet

1.2.2. 熟悉Java中各种变量类型

1.2.3. 熟悉Java String的使用,熟悉String的各种函数

1.2.4. 熟悉Java中各种关键字

1.2.5. 学会使用List,Map,Stack,Queue,Set

上述数据结构的遍历;上述数据结构的使用场景;Java实现对Array/List排序java.uti.Arrays.sort() java.util.Collections.sort(). Java实现对List去重; Java实现对List去重,并且需要保留数据原始的出现顺序;Java实现最近最少使用cache,用LinkedHashMap.

1.2.6. Java IO & Java NIO,并学会使用

java.io.* java.nio.* nio和reactor设计模式,文件编码,字符集

1.2.7. Java反射与javassist

反射与工厂模式:java.lang.reflect.*

1.2.8. Java序列化

java.io. Serializable什么是序列化,为什么序列化,序列化与单例模式, google序列化,protobuf

1.2.9. 虚引用,弱引用,软引用

java.lang.ref.* 实验这些引用的回收

1.2.10. 熟悉Java系统属性

java.util.Properties

1.2.11. 熟悉Annotation用法

java.lang.annotation.*

1.2.12. JMS

javax.jms.*

1.2.13. JMX

java.lang.management.* javax.management.*

1.2.14. 泛型和继承,泛型和擦除

1.2.15. 自动拆箱装箱与字节码

1.2.16. 实现Callback

1.2.17. java.lang.Void类使用

1.2.18. Java Agentpremain函数

java.lang.instrument

1.2.19. 单元测试

1.2.20. Java实现通过正则表达式提取一段文本中的电子邮件,并将@替换为#输出

java.lang.util.regex.*

1.2.21. 学习使用常用的Java工具库

commons.lang, commons.*... guava-libraries netty

1.2.22. 什么是API & SPI

1.2.23. 参考资料

  • JDK src.zip 源代码

1.3. Java并发编程

1.3.1. 阅读源代码,并学会使用

java.lang.Thread
java.lang.Runnable
java.util.concurrent.Callable
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.locks.ReentrantReadWriteLock
java.util.concurrent.atomic.Atomic*
java.util.concurrent.Semaphore
java.util.concurrent.CountDownLatch
java.util.concurrent.CyclicBarrier
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.Executors

1.3.2. 学习使用线程池,自己设计线程池需要注意什么

1.3.3. 锁

什么是锁;锁的种类有哪些;每种锁有什么特点;适用场景是什么;在并发编程中锁的意义是什么。

1.3.4. synchronized的作用是什么,synchronized和lock

1.3.5. sleep和wait

1.3.6. wait和notify

1.3.7. 写一个死锁的程序

1.3.8. 什么是守护线程,守护线程和非守护线程的区别以及用法

1.3.9. volatile关键字的理解

C++ volatile关键字和Java volatile关键字;happens-before语义 ;编译器指令重排和CPU指令重排

1.3.10. 以下代码是不是线程安全?为什么?如果为count加上volatile修饰是否能够做到线程安全?你觉得该怎么做是线程安全的?

public class Sample {
  private static int count = 0;
  public static void increment() {
    count++;
  }
}

1.3.11. 解释一下下面两段代码的差别

// 代码1
public class Sample {
  private static int count = 0;
  synchronized public static void increment() {
    count++;
  }
}

// 代码2
public class Sample {
  private static AtomicInteger count = new AtomicInteger(0);
  public static void increment() {
    count.getAndIncrement();
  }
}

1.3.12. 参考资料

二、 进阶篇

2.1. Java底层知识

2.1.1. 学习了解字节码、class文件格式

2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具)

如Java源代码:

public static void main(String[] args) {
    int i = 0;
    i += 1;
    i *= 1;
    System.out.println(i);
  }

编译后读取class文件输出以下代码:

public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:   iconst_0
   1:   istore_1
   2:   iinc    1, 1
   5:   iload_1
   6:   iconst_1
   7:   imul
   8:   istore_1
   9:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   12:  iload_1
   13:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   16:  return
  LineNumberTable: 
   line 4: 0
   line 5: 2
   line 6: 5
   line 7: 9
   line 8: 16

2.1.3. CPU缓存,L1,L2,L3和伪共享

2.1.4. 什么是尾递归

2.1.5. 熟悉位运算

用位运算实现加、减、乘、除、取余

2.1.6. 参考资料

2.2. 设计模式

2.2.1. 实现AOP

2.2.2. 使用模板方法设计模式和策略设计模式实现IOC

2.2.3. 不用synchronized和lock,实现线程安全的单例模式

2.2.4. nio和reactor设计模式

2.2.5. 参考资料

2.3. 网络编程知识

2.3.1. Java RMI,Socket,HttpClient

2.3.2. 用Java写一个简单的静态文件的HTTP服务器

实现客户端缓存功能,支持返回304;实现可并发下载一个文件;使用线程池处理客户端请求;使用nio处理客户端请求;支持简单的rewrite规则;上述功能在实现的时候需要满足“开闭原则”。

2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器

2.3.4. 用Java实现FTP、SMTP协议

2.3.5. 什么是CDN?如果实现?DNS起到什么作用?

搭建一个DNS服务器 搭建一个 Squid 或 Apache Traffic Server 服务器

2.3.6. 参考资料

2.4. 框架知识

spring,spring mvc;阅读主要源码 ibatis;用spring和ibatis搭建java server

2.5. 应用服务器知识

三、 高级篇

3.1. 编译原理知识

3.1.1. 用Java实现以下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual类似)

sysdate
sysdate - 1
sysdate - 1/24
sysdate - 1/(12*2)

3.1.2. 实现对一个List通过DSL筛选

QList<Map<String, Object>> mapList = new QList<Map<String, Object>>;
mapList.add({"name": "hatter test"});
mapList.add({"id": -1,"name": "hatter test"});
mapList.add({"id": 0, "name": "hatter test"});
mapList.add({"id": 1, "name": "test test"});
mapList.add({"id": 2, "name": "hatter test"});
mapList.add({"id": 3, "name": "test hatter"});
mapList.query("id is not null and id > 0 and name like '%hatter%'");

要求返回列表中匹配的对象,即最后两个对象;

3.1.3. 用Java实现以下程序(语法和变量作用域处理都和JavaScript类似):

代码:

var a = 1;
var b = 2;
var c = function() {
  var a = 3;
  println(a);
  println(b);
};
c();
println(a);
println(b);

输出:

3
2
1
2

3.1.4. 参考资料

3.2. 操作系统知识

Ubuntu Centos;使用linux;熟悉shell脚本

3.3. 数据存储知识

3.3.1. 关系型数据库

MySQL 如何看执行计划;如何搭建MySQL主备;binlog是什么;Derby,H2,PostgreSQL SQLite

3.3.2. NoSQL

Cache\Redis\Memcached\Leveldb\Bigtable\HBase\Cassandra\Mongodb;图数据库;neo4j

3.3.3. 参考资料

3.4. 大数据知识

3.4.1. Zookeeper,在linux上部署zk

3.4.2. Solr,Lucene,ElasticSearch

在linux上部署solr,solrcloud,新增、删除、查询索引

3.4.3. Storm,流式计算,了解Spark,S4

在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。

3.4.4. Hadoop,离线计算

  • Hdfs:部署NameNode,SecondaryNameNode,DataNode,上传文件、打开文件、更改文件、删除文件
  • MapReduce:部署JobTracker,TaskTracker,编写mr job
  • Hive:部署hive,书写hive sql,得到结果
  • Presto:类hive,不过比hive快,非常值得学习

3.4.5. 分布式日志收集flume,kafka,logstash

3.4.6. 数据挖掘,mahout

3.4.7. 参考资料

3.5. 网络安全知识

3.5.1. 什么是DES、AES

3.5.2. 什么是RSA、DSA

3.5.3. 什么是MD5,SHA1

3.5.4. 什么是SSL、TLS,为什么HTTPS相对比较安全

3.5.5. 什么是中间人攻击、如果避免中间人攻击

3.5.6. 什么是DOS、DDOS、CC攻击

3.5.7. 什么是CSRF攻击

3.5.8. 什么是CSS攻击

3.5.9. 什么是SQL注入攻击

3.5.10. 什么是Hash碰撞拒绝服务攻击

3.5.11. 了解并学习下面几种增强安全的技术

3.5.12. 用openssl签一个证书部署到apache或nginx

3.5.13. 参考资料

四、 扩展篇

4.1. 相关知识

4.1.1. 云计算,分布式,高可用,可扩展

4.1.2. 虚拟化

4.1.3. 监控

4.1.4. 负载均衡

http://www.linuxvirtualserver.org/

4.1.5. 学习使用git

4.1.6. 学习使用maven

http://maven.apache.org/

4.1.7. 学习使用gradle

http://www.gradle.org/

4.1.8. 学习一个小语种语言

Groovy Scala LISP, Common LISP, Schema, Clojure R Julia Lua Ruby

4.1.9. 尝试了解编码的本质

了解以下概念 ASCII, ISO-8859-1 GB2312, GBK, GB18030 Unicode, UTF-8 不使用 String.getBytes() 等其他工具类/函数完成下面功能

public static void main(String[] args) throws IOException {
    String str = "Hello, 我们是中国人。";
    byte[] utf8Bytes = toUTF8Bytes(str);
    FileOutputStream fos = new FileOutputStream("f.txt");
    fos.write(utf8Bytes);
    fos.close();
}
public static byte[] toUTF8Bytes(String str) {
    return null; // TODO
}

想一下上面的程序能不能写一个转GBK的? 写个程序自动判断一个文件是哪种编码

4.1.10. 尝试了解时间的本质

4.1.11. 参考资料

4.2. 扩展学习

4.2.1. JavaScript知识

4.2.1.1. 什么是prototype

修改代码,使程序输出“1 3 5”: http://jsfiddle.net/Ts7Fk/

4.2.1.2. 什么是闭包

看一下这段代码,并解释一下为什么按Button1时没有alert出“This is button: 1”,如何修改: http://jsfiddle.net/FDPj3/1/

4.2.1.3. 了解并学习一个JS框架

jQuery;ExtJS;ArgularJS

4.2.1.4. 写一个Greasemonkey插件

http://en.wikipedia.org/wiki/Greasemonkey

4.2.1.5. 学习node.js

http://nodejs.org/

4.2.2. 学习html5

ArgularJS,https://docs.angularjs.org/api

4.2.3. 参考资料

五、 推荐书籍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容