Java工程師成神之路

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

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

一、基礎(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. 使用工具嘗試解決以下問(wèn)題,并寫下總結(jié)

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

1.1.7. 參考資料

1.2. Java基礎(chǔ)知識(shí)

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é)會(huì)使用List,Map,Stack,Queue,Set

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

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

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. 自動(dòng)拆箱裝箱與字節(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. 單元測(cè)試

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

java.lang.util.regex.*

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

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é)會(huì)使用

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);適用場(chǎng)景是什么;在并發(fā)編程中鎖的意義是什么。

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

1.3.5. sleep和wait

1.3.6. wait和notify

1.3.7. 寫一個(gè)死鎖的程序

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

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

C++ volatile關(guān)鍵字和Java volatile關(guān)鍵字;happens-before語(yǔ)義 ;編譯器指令重排和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底層知識(shí)

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

2.1.2. 寫一個(gè)程序要求實(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ò)編程知識(shí)

2.3.1. Java RMI,Socket,HttpClient

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

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

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

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

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

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

2.3.6. 參考資料

2.4. 框架知識(shí)

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

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

三、 高級(jí)篇

3.1. 編譯原理知識(shí)

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

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

3.1.2. 實(shí)現(xiàn)對(duì)一個(gè)List通過(guò)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%'");

要求返回列表中匹配的對(duì)象,即最后兩個(gè)對(duì)象;

3.1.3. 用Java實(shí)現(xiàn)以下程序(語(yǔ)法和變量作用域處理都和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)知識(shí)

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

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

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

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

3.3.2. NoSQL

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

3.3.3. 參考資料

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

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,不過(guò)比hive快,非常值得學(xué)習(xí)

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

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

3.4.7. 參考資料

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

3.5.1. 什么是DES、AES

3.5.2. 什么是RSA、DSA

3.5.3. 什么是MD5,SHA1

3.5.4. 什么是SSL、TLS,為什么HTTPS相對(duì)比較安全

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簽一個(gè)證書部署到apache或nginx

3.5.13. 參考資料

四、 擴(kuò)展篇

4.1. 相關(guān)知識(shí)

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í)一個(gè)小語(yǔ)種語(yǔ)言

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, 我們是中國(guó)人。";
    byte[] utf8Bytes = toUTF8Bytes(str);
    FileOutputStream fos = new FileOutputStream("f.txt");
    fos.write(utf8Bytes);
    fos.close();
}
public static byte[] toUTF8Bytes(String str) {
    return null; // TODO
}

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

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

4.1.11. 參考資料

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

4.2.1. JavaScript知識(shí)

4.2.1.1. 什么是prototype

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

4.2.1.2. 什么是閉包

看一下這段代碼,并解釋一下為什么按Button1時(shí)沒有alert出“This is button: 1”,如何修改: http://jsfiddle.net/FDPj3/1/

4.2.1.3. 了解并學(xué)習(xí)一個(gè)JS框架

jQuery;ExtJS;ArgularJS

4.2.1.4. 寫一個(gè)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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容