微软的各种开发工具、开发技术一向简单易用,容易上手,比较容易的就能出效果,但由于其比较封闭的生态环境,很容易就在技术上止步,相对不容易深入。
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生态的框架,你是否已经走在了成为一名“高级软件工程师”,并希望成为一名“资深工程师/架构师”的路上,再深入的看书吧![大笑](https://box.kancloud.cn/2016-01-19_569e21abc5518.gif)
《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)的书;
如果还有时间,扩充一下技术广度和业务广度吧;
这个阶段,对于进阶是最最重要的几年,大多数人,在这个阶段,都是把以前的编程经验,又重复了很多年,很多年,没有突破和进阶,令人遗憾。。。
# 工作六到八年之后。。。
你已经**足够努力**的工作了这么多年,真的应该恭喜一下,不论是否真的已经成为专家,你都是一个有恒心的人,真的是值得敬佩的。
但是这个时候,至少应该已经是技术专家/高级架构师级别了吧![大笑](https://box.kancloud.cn/2016-01-19_569e21abc5518.gif)
。
**我个人觉得,不论什么领域,成为专家有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