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

最后更新于:2022-04-01 20:11:39

微软的各种开发工具、开发技术一向简单易用,容易上手,比较容易的就能出效果,但由于其比较封闭的生态环境,很容易就在技术上止步,相对不容易深入。 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里面的 ~~~ javax.servlet servlet-api 2.5 provided ~~~ 用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://docs.gechiui.com/gc-content/uploads/sites/kancloud/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://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-19_569e21abc5518.gif)  。 **我个人觉得,不论什么领域,成为专家有3条是最重要的:** 1、持续的努力,这是不可或缺的; 2、勤于思考,走了更少的弯路,这决定的是在路上的时间; 3、受到了高人的指导,或者自行模仿了高人,至少是仰望了一下,所谓:“身虽不能至,而心向往之”,这是理想,是驱动力。
';