如何学习Java
——谨以此文献给打算以编程为职业、并愿意为之疯狂的人
经常看到有些学生、求职者捧着一本类似JBuilder入门、Eclipse指南之类的图书学习Java,当他们学会了在这些工具中拖出窗体、安装按钮之后,就觉得自己掌握、甚至精通了Java;又或是找来一本类似JSP动态网站编程之类的图书,学会使用JSP脚本编写一些页面后,就自我感觉掌握了Java开发。
还有一些学生、求职者听说J2EE、Spring或EJB很有前途,于是立即跑到书店、或图书馆找来一本相关图书。希望立即学会它们,然后进入软件开发业、大显身手。
还有一些学生、求职者非常希望找到一本既速成、又大而全的图书,比如突击J2EE开发、一本书精通J2EE之类的图书(包括笔者曾出版的《轻量级J2EE企业应用实战》一书,据说销量不错),希望这样一本图书就可以打通自己的“任督二脉”,一跃成为J2EE开发高手。
也有些学生、求职者非常喜欢J2EE项目实战、项目大全之类的图书,他们的想法很单纯:我按照书上介绍,按图索骥、依葫芦画瓢,应该很快就可学会J2EE,很快就能成为一个受人羡慕的J2EE程序员了。
……
凡此种种,不一而足。但最后的结果往往是失败,因为这种学习没有积累、没有根基,学习过程中困难重重,每天都被一些相同、类似的问题所困扰,起初热情十足,经常上论坛询问,按别人的说法解决问题之后很高兴,既不知道为什么错?也不知道为什么对?只是盲目地抄袭别人的说法。最后的结果有两种:
  久而久之,热情丧失,最后放弃学习。
  大部分常见问题都问遍了,最后也可以从事一些重复性开发,但一旦遇到新问题,又将束手无策。
第二种情形在普通程序员中占了极大的比例,笔者多次听到、看到(在网络上)有些程序员抱怨:我做了2年多Java程序员了,工资还是3000多点。偶尔笔者会与他们聊聊工作相关内容,他们会告诉笔者:我也用Spring了啊,我也用EJB了啊……他们感到非常不平衡,为什么我的工资这么低?其实笔者很想告诉他们:你们太浮躁了!你们确实是用了Spring、Hibernate又或是EJB,但你们未想过为什么要用这些技术?用这些技术有什么好处?如果不用这些技术行不行?
很多时候,我们的程序员把Java当成一种脚本,而不是一门面向对象的语言。他们习惯了在JSP脚本中使用Java,但从不去想JSP如何运行,Web服务器里的网络通信、多线层机制,为何一个JSP页面能同时向多个请求者提供服务?更不会想如何开发Web服务器;他们像代码机器一样编写Spring Bean代码,但从不去理解Spring容器的作用,更不会想如何开发Spring容器。
有时候,笔者的学生在编写五子棋、梭哈等作业感到困难时,会向他们的大学师兄、朋友求救,这些程序员告诉他:不用写了,网上有下载的!听到这样回答,笔者不禁感到哑然:网上还有Windows下载呢!网上下载和自己编写是两码事。偶尔,笔者会怀念以前黑色屏幕、绿荧荧字符时代,那时候程序员很单纯:当我们想偷懒时,习惯思维是写一个小工具;现在程序员很聪明:当他们想偷懒时,习惯思维是从网上下一个小工具。但是,谁更幸福?
当笔者的学生把他们完成的小作业放上互联网之后,然后就有许多人称他们为“高手”!这个称呼却让他们万分惭愧;惭愧之余,他们也感到万分欣喜,非常有成就感,这就是编程的快乐。编程的过程,与寻宝的过程完全一样:历经辛苦,终于找到心中的梦想,这是何等的快乐?
如果真的打算将编程当成职业,那就不应该如此浮躁,而是应该扎扎实实先学好Java语言,然后按Java本身的学习规律,踏踏实实一步一个脚印地学习,把基本功练扎实了才可获得更大的成功。
实际情况是,有多少程序员真正掌握了Java的面向对象?真正掌握了Java的多线程、网络通信、反射等内容?有多少Java程序员真正理解了类初始化时内存运行过程?又有多少程序员理解Java对象从创建到消失的全部细节?有几个程序员真正独立地编写过五子棋、梭哈、桌面弹球这种小游戏?又有几个Java程序员敢说:我可以开发Struts?我可以开发Spring?我可以开发Tomcat?很多人又会说:这些都是许多人开发出来的!实际情况是:许多开源框架的核心最初完全是由一个人开发的。现在这些优秀程序已经出来了!你,是否深入研究过它们,是否深入掌握了它们?
如果要真正掌握Java,包括后期的Java EE相关技术(例如Struts、Spring、Hiberate和EJB等),一定要记住笔者的话:绝不要从IDE(如JBuilder、Eclipse和NetBeans)工具开始学习!IDE工具的功能很强大,初学者学起来也很容易上手,但也非常危险:因为IDE工具已经为我们做了许多事情,而软件开发者要全部了解软件开发的全部步骤。
笔者就自己对Java EE体系的理解,对Java EE学习者给出一个粗略线路图: