微軟的各種開發工具、開發技術一向簡單易用,容易上手,比較容易的就能出效果,但由于其比較封閉的生態環境,很容易就在技術上止步,相對不容易深入。
Java生態環境很開放,各種開源第三方框架層出不窮,要學習的東西非常多,學習成本相對較高,技術上容易進步。
我個人感覺,Java體系的從業者平均技術水平應該是大于微軟體系的,下面開始學習之旅。
?
# 最基礎的語法和常用類--《Java無難事》
首先配置Java開發環境,到官網下載一個Java SE的SDK,安裝到你的機器上,安裝完畢后,在環境變量-〉系統變量中新增系統變量JAVA_HOME,其值為JDK安裝路徑,比如:D:\Java\jdk1.6.0_39,然后再path變量的頭部新增:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
在cmd中執行命令:java -version,如果輸出版本號,則說明最基本的Java開發環境配置成功了,那么我們可以使用EditPlus之類的文本編輯器書寫第一個Hello World程序了,命名為HelloWorld.java。
~~~
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World");
}
}
~~~
進入cmd,執行命令 javac HelloWorld.java編譯這個程序,執行命令 java HelloWorld 就可以看到cmd中正確的打印出了“Hello World”字符串。
Wornderful,是不是應該幸福一下呢 ,大笑現在我們開始基礎語法和常用類的學習吧。
怎么學呢?看厚厚的書嗎?太浪費時間了。建議還是看視頻吧,推薦:孫鑫的 《Java無難事》,可以去優酷下載12講視頻及配套的ppt講解,10/11/12講可以不用看,以后的工作過程中基本用不到;把視頻多看幾遍,理解透徹了,里面的所有例子,都用EditPlus多寫幾遍,調通,開始是抄,后來是自己寫,做到可以自行寫對所有的例子代碼寫對調通的時候,可以說已經Java入門了。
這第一步大約累計需要40小時。
在這個步驟,不要試著去閱讀800多頁的《Java編程思想》,更不要試著去閱讀關于“設計模式”的書籍,我們需要的是盡量壓縮學習時間,用這40個小時的時間,掌握基礎的Java,在這個最低可以工作的基礎上,先去做一個蹩腳的Java程序員,先到實操環境中去實踐。
# JAVA IDE 開發環境(Eclipse)
這第二步的目的是開發一個簡單的Web程序,數據庫的CRUD。
Eclipse就到官網下載一個Eclipse IDE for Java EE Developers,版本隨便:Kepler/Juno/Indigo都行。
這是最流行的,綠色的,解壓就能用。
執行eclipse.exe允許Eclipse,會提示你選擇一個WorkSpace(工作區),WorkSpace可以看作C#開發工具Visual Studio的解決方案(.sln)
試著建立幾個Java Project,試試一個Project如何引用其他的Project,就像Visual Studio中進行項目引用一樣;Eclipse也可以引用JAR包,就像Visual Studio進行DLL引用一樣。Java Project這種工程都可以導出成JAR包。
Eclipse也是可以直接連接SVN的,安裝插件,就像Visual Studio安裝Visual SVN一樣。
下面說下Eclipse集成Web容器(Tomcat):
開發環境一般都用Tomcat或者Jetty,好處就是啟動快,是Jboss的1/2甚至1/3。
官網下載一個Tomcat,綠色的,解壓就可以用,解壓后,cmd運行bin/startup.bat,就開啟了Tomcat,在瀏覽器輸入http://localhost:8080,就可以看到Tomcat的默認站點了;為了方便調試程序,我們是需要在Eclipse中啟動停止Tomcat的,關于具體的設置方法,可以Baidu一下,很多資料。
Eclipse默認支持Tomcat的版本到7,Jboss的版本到5;如果想在Eclipse中啟動停止更高版本的Web容器或者其他的容器,就要安裝插件了。
開發一個簡單的Web程序:
就用Spring+SpringMVC+MyBatis來練手,最好是看別人的例子,我這里也會逐漸放上自己寫的例程。
以上環節走通,大約1周,也就調通了,但是逐步的理解加深,必須到工作中逐步的提高了。
提高是一步一步的,真的。
# Java的常用框架:Spring、ORM、MVC
Spring+SpringMVC+MyBatis是值得學習的。
MAVEN:很多工作都用MAVEN管理項目,非常值得用,學習使用也就是幾天的事情,很快就熟。Maven打包和Export導出的war(jar)包,內容可能是不一樣的,比如pom.xml里面的
~~~
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
~~~
用Maven打包:mvn clean package -Dmaven.test.skip=true -U,會排除包servlet-api-2.5.jar,而Export會把這個包打進去,從而可能導致與容器(Jboss/Tomcat等都是自帶servlet/jsp等包的)里面的包沖突而出現問題。
WebService框架:CXF/Axis2等,最好都不要學習了,工作中能不用就不用吧,用DUBBO/Thrift替代。
Log4/QuartZ:不論哪種語言,都是會使用的吧。
這些也都是循序漸進的,工作中學習,工作中進步。
# Linux(rhel-server-6.2)
Java的生產環境基本都是部署在linux上的,常用的linux命令要了解。
容器的性能調優,要逐漸的學習。
個人感覺,最事半功倍的學習,是在工作中學習,學習中工作。有一個良好的氛圍很重要。
# JVM優化
**Tomcat增加內存:**catalina.sh第一行增加:set JAVA_OPTS='-Xms1024m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=512m' ,linux不需要set。
**Jboss5增加內存:**/usr/java/jboss-eap-5.1/jboss-as/bin/run.conf
if [ "x$JAVA_OPTS" = "x" ]; then
? ?JAVA_OPTS="-Xms2048m -Xmx2048m -XX:MaxPermSize=1024m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true -Dorg.terracotta.quartz.skipUpdateCheck=true -Dspring.profiles.active=production"
fi
? ?JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=本機IP地址"
另一臺機器(CPU: Xeon 5620 2G:24線程,內存32G)有如下配置:
? ?JAVA_OPTS="-Xss1280k -Xms15g -Xmx15g ?-Xmn8g -XX:MaxPermSize=300M -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=16 -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/jbosslogs -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/data/applogs/jbosslogs/heap_trace.log -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true -Dmemcached_config=file:/etc/yougouconf/memcached_cluster.xml -Dspring.profiles.active=production"
**內存溢出PermGen解決,增加方法區內存:**
-server -Xms768m -Xmx768m -XX:PermSize=1024m -XX:MaxPermSize=1024m
內存問題是需要了解的,找本JVM的書看看,這里簡單介紹 一下JVM內存:
[http://hi.baidu.com/zzusec/item/73895f11f405d2f89c778a3d](http://hi.baidu.com/zzusec/item/73895f11f405d2f89c778a3d)
[http://blog.csdn.net/kthq/article/details/8618052](http://blog.csdn.net/kthq/article/details/8618052)
[http://www.open-open.com/lib/view/open1324736648468.html](http://www.open-open.com/lib/view/open1324736648468.html)
JVM優化的核心,實際就是調整各個JVM內存塊為合適的大小,使用合適的垃圾收集器。
**jvm默認參數查看:**
java -XX:+PrintFlagsFinal?顯示所有可設置參數及默認值,可結合-XX:+PrintFlagsInitial與-XX:+PrintFlagsFinal對比設置前、設置后的差異,方便知道對那些參數做了調整。
java -XX:+PrintFlagsInitial?可以獲取到所有可設置參數及值(手動設置之后的值),這個參數只能使用在Jdk6 update 21以上版本(包括該版本)。
java -XX:+PrintCommandLineFlags ?顯示出JVM初始化完畢后所有跟最初的默認值不同的參數及它們的值。
jinfo -flag MaxPermSize pid號 ?:jinfo?查詢MaxPermSize 參數的值
# 如何利用各種語言
沒有一種語言能包打天下,都有其適用的場景。
基礎性語言:Html、JavaScript、CSS
通訊框架:Thrift/Hessian/Rest/Soap,常用語言都支持,性能Thrift>Hessian>Rest>Soap;Dubbo,如果公司沒有強大的研發力量開發基礎框架的話,這是一個很好的選擇
Web開發:使用最為廣泛的是Java體系,C#也很多,現在有一些使用Ruby on Rails
桌面開發:C#
PDA開發:比如倉儲的手持設備,是WinCE系統,所以還是要用C#開發,框架是.Net Compact FrameWork
手機開發:C、Java
所以,需要根據業務場景,選擇合適的語言,學習來說,是廣泛而深入的學習,不囿于具體語言。如果是新進入IT行業,首選的學習目標,建議還是Java。
# 工作兩到三年之后。。。
你是否已經**足夠努力**的工作了兩年,你是否已經學會使用(不是掌握)了很多很多的Java生態的框架,你是否已經走在了成為一名“高級軟件工程師”,并希望成為一名“資深工程師/架構師”的路上,再深入的看書吧
《Java編程思想》,第四版、第五版,快速看一遍,并隨手翻翻,受益良多;
《Java與模式》,這是一本2002年的說,沒錯,10多年前的書,可以很快閱讀,并和這兩年積累的經驗相互印證;
《Spring 3.X企業應用開發指南》,工作中一定用了Spring吧,常用的框架都會給予Spring進行配置吧,這個時候有必要把Spring知識系統的串聯一下了,Spring是因為JDK 有了反射才有可能被創造出來的,IoC只是基礎,AOP才是目的,利用AOP簡化我們的開發工作;如果有更多時間,可以通過《Spring Internals》這本書學習研究一下Spring源碼;
《深入理解Java虛擬機》,虛擬機的知識,還是有必要學習一下的;常用的JDK源碼,以及《算法導論》,也有必要研究一下;
關于Web服務器(Nginx、Apache)的書,關于Servlet容器(JBoss、Tomcat、Jetty)的書;
如果還有時間,擴充一下技術廣度和業務廣度吧;
這個階段,對于進階是最最重要的幾年,大多數人,在這個階段,都是把以前的編程經驗,又重復了很多年,很多年,沒有突破和進階,令人遺憾。。。
# 工作六到八年之后。。。
你已經**足夠努力**的工作了這么多年,真的應該恭喜一下,不論是否真的已經成為專家,你都是一個有恒心的人,真的是值得敬佩的。
但是這個時候,至少應該已經是技術專家/高級架構師級別了吧
?。
**我個人覺得,不論什么領域,成為專家有3條是最重要的:**
1、持續的努力,這是不可或缺的;
2、勤于思考,走了更少的彎路,這決定的是在路上的時間;
3、受到了高人的指導,或者自行模仿了高人,至少是仰望了一下,所謂:“身雖不能至,而心向往之”,這是理想,是驅動力。
- 前言
- Java之旅--如何從草根成為技術專家
- 《深入理解Java虛擬機》學習筆記
- 《Spring3.X企業應用開發實戰》學習筆記--IoC和AOP
- 《Tomcat權威指南》第二版學習筆記
- Java之旅--多線程進階
- Java之旅--Web.xml解析
- 《Spring3.X企業應用開發實戰》學習筆記--DAO和事務
- 《Spring3.X企業應用開發實戰》學習筆記--SpringMVC
- Java之旅--定時任務(Timer、Quartz、Spring、LinuxCron)
- Spring實用功能--Profile、WebService、緩存、消息、ORM
- JDK框架簡析--java.lang包中的基礎類庫、基礎數據類型
- JDK框架簡析--java.util包中的工具類庫
- JDK框架簡析--java.io包中的輸入輸出類庫
- Java之旅--通訊
- Java之旅--XML/JSON
- Java之旅--Linux&amp;java進階(看清操作系統層面的事)
- Java之旅--硬件和Java并發(神之本源)
- Java之旅--設計模式
- jetty