牛骨文教育服务平台(让学习变的简单)

Java之旅--如何从草根成为技术专家

微软的各种开发工具、开发技术一向简单易用,容易上手,比较容易的就能出效果,但由于其比较封闭的生态环境,很容易就在技术上止步,相对不容易深入。

Java生态环境很开放,各种开源第三方框架层出不穷,要学习的东西非常多,学习成本相对较高,技术上容易进步。

我个人感觉,Java体系的从业者平均技术水平应该是大于微软体系的,下面开始学习之旅。

 

最基础的语法和常用类--《Java无难事》

首先配置Java开发环境,到官网下载一个Java SE的SDK,安装到你的机器上,安装完毕后,在环境变量-〉系统变量中新增系统变量JAVA_HOME,其值为JDK安装路径,比如:D:Javajdk1.6.0_39,然后再path变量的头部新增:%JAVA_HOME%in;%JAVA_HOME%jrein;

在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://blog.csdn.net/kthq/article/details/8618052

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、受到了高人的指导,或者自行模仿了高人,至少是仰望了一下,所谓:“身虽不能至,而心向往之”,这是理想,是驱动力。