Java工程師成神之路

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

今天分享的這篇文章,作者從基礎(chǔ)、進(jìn)階、高級、擴(kuò)展四個方面,為大家分享了如何成為優(yōu)秀的Java工程師所具備的知識。來看看,你目前處在那一個階段呢?

一、基礎(chǔ)篇

1.1 JVM

1.1.1. Java內(nèi)存模型,Java內(nèi)存管理,Java堆和棧,垃圾回收

1.1.2. 了解JVM各種參數(shù)及調(diào)優(yōu)

1.1.3. 學(xué)習(xí)使用Java工具

1.1.4. 學(xué)習(xí)Java診斷工具

1.1.5. 自己編寫各種outofmemory,stackoverflow程序

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

1.1.6. 使用工具嘗試解決以下問題,并寫下總結(jié)

當(dāng)一個Java程序響應(yīng)很慢時如何查找問題 當(dāng)一個Java程序頻繁FullGC時如何解決問題,如何查看垃圾回收日志 當(dāng)一個Java應(yīng)用發(fā)生OutOfMemory時該如何解決,年輕代、年老代、永久代解決辦法不同,導(dǎo)致原因也不同。

1.1.7. 參考資料

1.2. Java基礎(chǔ)知識

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的各種函數(shù)

1.2.4. 熟悉Java中各種關(guān)鍵字

1.2.5. 學(xué)會使用List,Map,Stack,Queue,Set

上述數(shù)據(jù)結(jié)構(gòu)的遍歷;上述數(shù)據(jù)結(jié)構(gòu)的使用場景;Java實(shí)現(xiàn)對Array/List排序java.uti.Arrays.sort() java.util.Collections.sort(). Java實(shí)現(xiàn)對List去重; Java實(shí)現(xiàn)對List去重,并且需要保留數(shù)據(jù)原始的出現(xiàn)順序;Java實(shí)現(xiàn)最近最少使用cache,用LinkedHashMap.

1.2.6. Java IO & Java NIO,并學(xué)會使用

java.io.* java.nio.* nio和reactor設(shè)計(jì)模式,文件編碼,字符集

1.2.7. Java反射與javassist

反射與工廠模式:java.lang.reflect.*

1.2.8. Java序列化

java.io. Serializable什么是序列化,為什么序列化,序列化與單例模式, google序列化,protobuf

1.2.9. 虛引用,弱引用,軟引用

java.lang.ref.* 實(shí)驗(yàn)這些引用的回收

1.2.10. 熟悉Java系統(tǒng)屬性

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. 自動拆箱裝箱與字節(jié)碼

1.2.16. 實(shí)現(xiàn)Callback

1.2.17. java.lang.Void類使用

1.2.18. Java Agent,premain函數(shù)

java.lang.instrument

1.2.19. 單元測試

1.2.20. Java實(shí)現(xiàn)通過正則表達(dá)式提取一段文本中的電子郵件,并將@替換為#輸出

java.lang.util.regex.*

1.2.21. 學(xué)習(xí)使用常用的Java工具庫

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

1.2.22. 什么是API & SPI

1.2.23. 參考資料

  • JDK src.zip 源代碼

1.3. Java并發(fā)編程

1.3.1. 閱讀源代碼,并學(xué)會使用

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. 學(xué)習(xí)使用線程池,自己設(shè)計(jì)線程池需要注意什么

1.3.3. 鎖

什么是鎖;鎖的種類有哪些;每種鎖有什么特點(diǎn);適用場景是什么;在并發(fā)編程中鎖的意義是什么。

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

1.3.5. sleep和wait

1.3.6. wait和notify

1.3.7. 寫一個死鎖的程序

1.3.8. 什么是守護(hù)線程,守護(hù)線程和非守護(hù)線程的區(qū)別以及用法

1.3.9. volatile關(guān)鍵字的理解

C++ volatile關(guān)鍵字和Java volatile關(guān)鍵字;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. 參考資料

二、 進(jìn)階篇

2.1. Java底層知識

2.1.1. 學(xué)習(xí)了解字節(jié)碼、class文件格式

2.1.2. 寫一個程序要求實(shí)現(xiàn)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. 熟悉位運(yùn)算

用位運(yùn)算實(shí)現(xiàn)加、減、乘、除、取余

2.1.6. 參考資料

2.2. 設(shè)計(jì)模式

2.2.1. 實(shí)現(xiàn)AOP

2.2.2. 使用模板方法設(shè)計(jì)模式和策略設(shè)計(jì)模式實(shí)現(xiàn)IOC

2.2.3. 不用synchronized和lock,實(shí)現(xiàn)線程安全的單例模式

2.2.4. nio和reactor設(shè)計(jì)模式

2.2.5. 參考資料

2.3. 網(wǎng)絡(luò)編程知識

2.3.1. Java RMI,Socket,HttpClient

2.3.2. 用Java寫一個簡單的靜態(tài)文件的HTTP服務(wù)器

實(shí)現(xiàn)客戶端緩存功能,支持返回304;實(shí)現(xiàn)可并發(fā)下載一個文件;使用線程池處理客戶端請求;使用nio處理客戶端請求;支持簡單的rewrite規(guī)則;上述功能在實(shí)現(xiàn)的時候需要滿足“開閉原則”。

2.3.3. 了解nginx和apache服務(wù)器的特性并搭建一個對應(yīng)的服務(wù)器

2.3.4. 用Java實(shí)現(xiàn)FTP、SMTP協(xié)議

2.3.5. 什么是CDN?如果實(shí)現(xiàn)?DNS起到什么作用?

搭建一個DNS服務(wù)器 搭建一個 Squid 或 Apache Traffic Server 服務(wù)器

2.3.6. 參考資料

2.4. 框架知識

spring,spring mvc;閱讀主要源碼 ibatis;用spring和ibatis搭建java server

2.5. 應(yīng)用服務(wù)器知識

三、 高級篇

3.1. 編譯原理知識

3.1.1. 用Java實(shí)現(xiàn)以下表達(dá)式解析并返回結(jié)果(語法和Oracle中的select sysdate-1 from dual類似)

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

3.1.2. 實(shí)現(xiàn)對一個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實(shí)現(xiàn)以下程序(語法和變量作用域處理都和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. 操作系統(tǒng)知識

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

3.3. 數(shù)據(jù)存儲知識

3.3.1. 關(guān)系型數(shù)據(jù)庫

MySQL 如何看執(zhí)行計(jì)劃;如何搭建MySQL主備;binlog是什么;Derby,H2,PostgreSQL SQLite

3.3.2. NoSQL

Cache\Redis\Memcached\Leveldb\Bigtable\HBase\Cassandra\Mongodb;圖數(shù)據(jù)庫;neo4j

3.3.3. 參考資料

3.4. 大數(shù)據(jù)知識

3.4.1. Zookeeper,在linux上部署zk

3.4.2. Solr,Lucene,ElasticSearch

在linux上部署solr,solrcloud,新增、刪除、查詢索引

3.4.3. Storm,流式計(jì)算,了解Spark,S4

在linux上部署storm,用zookeeper做協(xié)調(diào),運(yùn)行storm hello world,local和remote模式運(yùn)行調(diào)試storm topology。

3.4.4. Hadoop,離線計(jì)算

  • Hdfs:部署NameNode,SecondaryNameNode,DataNode,上傳文件、打開文件、更改文件、刪除文件
  • MapReduce:部署JobTracker,TaskTracker,編寫mr job
  • Hive:部署hive,書寫hive sql,得到結(jié)果
  • Presto:類hive,不過比hive快,非常值得學(xué)習(xí)

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

3.4.6. 數(shù)據(jù)挖掘,mahout

3.4.7. 參考資料

3.5. 網(wǎng)絡(luò)安全知識

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碰撞拒絕服務(wù)攻擊

3.5.11. 了解并學(xué)習(xí)下面幾種增強(qiáng)安全的技術(shù)

3.5.12. 用openssl簽一個證書部署到apache或nginx

3.5.13. 參考資料

四、 擴(kuò)展篇

4.1. 相關(guān)知識

4.1.1. 云計(jì)算,分布式,高可用,可擴(kuò)展

4.1.2. 虛擬化

4.1.3. 監(jiān)控

4.1.4. 負(fù)載均衡

http://www.linuxvirtualserver.org/

4.1.5. 學(xué)習(xí)使用git

4.1.6. 學(xué)習(xí)使用maven

http://maven.apache.org/

4.1.7. 學(xué)習(xí)使用gradle

http://www.gradle.org/

4.1.8. 學(xué)習(xí)一個小語種語言

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

4.1.9. 嘗試了解編碼的本質(zhì)

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

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
}

想一下上面的程序能不能寫一個轉(zhuǎn)GBK的? 寫個程序自動判斷一個文件是哪種編碼

4.1.10. 嘗試了解時間的本質(zhì)

4.1.11. 參考資料

4.2. 擴(kuò)展學(xué)習(xí)

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. 了解并學(xué)習(xí)一個JS框架

jQuery;ExtJS;ArgularJS

4.2.1.4. 寫一個Greasemonkey插件

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

4.2.1.5. 學(xué)習(xí)node.js

http://nodejs.org/

4.2.2. 學(xué)習(xí)html5

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

4.2.3. 參考資料

五、 推薦書籍

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容