Java Learning Path (一)、工具篇
一、 JDK (Java Development Kit)
JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。
1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,,http://java.sun.com/j2se/downloads.html ,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html。
下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。
2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。
二、 JDK Documentation
Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。
三、 应用服务器(App Server)
App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:
1、 Tomcat
Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:
Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。
下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:
JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)
这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。 [...]

在我们学习Java的过程中,掌握其中的基本概念对我们的学习无论是J2SE,J2EE,J2ME都是很重要的,J2SE是Java的基础,所以有必要对其中的基本概念做以归纳,以便大家在以后的学习过程中更好的理解java的精髓,在此我总结了30条基本的概念.
  Java概述:
  目前Java主要应用于中间件的开发(middleware)—处理客户机于服务器之间的通信技术,早期的实践证明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发.Java于其他语言所不同的是程序运行时提供了平台的独立性,称许可以在windows,solaris,linux其他操作系统上使用完全相同的代码.Java的语法与C++语法类似,C++/C程序员很容易掌握,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage Collector)垃圾处理机制,防止内存溢出.
  Java的白皮书为我们提出了Java语言的11个关键特性.
  (1)Easy:Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb.
  (2)分布式:Java带有很强大的TCP/IP协议族的例程库,Java应用程序能够通过URL来穿过网络来访问远程对象,由于servlet机制的出现,使Java编程非常的高效,现在许多的大的web server都支持servlet.
  (3)OO:面向对象设计是把重点放在对象及对象的接口上的一个编程技术.其面向对象和C++有很多不同,在与多重继承的处理及Java的原类模型.
  (4)健壮特性:Java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能性。
  (5)安全:Java用来设计网路和分布系统,这带来了新的安全问题,Java可以用来构建防病毒和防攻击的System.事实证明Java在防毒这一方面做的比较好.
6)中立体系结构:Java编译其生成体系结构中立的目标文件格式可以在很多处理器上执行,编译器产生的指令字节码(Javabytecode)实现此特性,此字节码可以在任何机器上解释执行.
  (7)可移植性:Java中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好.
  (8)多线程:Java处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成.所以多线程是Java作为服务器端开发语言的流行原因之一
  (9)Applet和servlet:能够在网页上执行的程序叫Applet,需要支持Java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的.
  基本概念:
  1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率.
  2.OOP中最重要的思想是类,类是模板是蓝图,从类中构造一个对象,即创建了这个类的一个实例(instance)
  3.封装:就是把数据和行为结合起在一个包中)并对对象使用者隐藏数据的实现过程,一个对象中的数据叫他的实例字段(instance field)
  4.通过扩展一个类来获得一个新类叫继承(inheritance),而所有的类都是由Object根超类扩展而得,根超类下文会做介绍.
  5.对象的3个主要特性
  behavior—说明这个对象能做什么.
  state—当对象施加方法时对象的反映.
  identity—与其他相似行为对象的区分标志.
  每个对象有唯一的indentity 而这3者之间相互影响.
6.类之间的关系:
  use-a :依赖关系
  has-a :聚合关系
  is-a :继承关系–例:A类继承了B类,此时A类不仅有了B类的方法,还有其自己的方法.(个性存在于共性中)
  7.构造对象使用构造器:构造器的提出,构造器是一种特殊的方法,构造对象并对其初始化.
  例ata类的构造器叫Data
  new Data()—构造一个新对象,且初始化当前时间.
  Data happyday=new
  Data()—把一个对象赋值给一个变量happyday,从而使该对象能够多次使用,此处要声明的使变量与对象变量二者是不同的.new返回的值是一个引用.
  构造器特点:构造器可以有0个,一个或多个参数
  构造器和类有相同的名字
  一个类可以有多个构造器
  构造器没有返回值
  构造器总是和new运算符一起使用.
  8.重载:当多个方法具有相同的名字而含有不同的参数时,便发生重载.编译器必须挑选出调用哪个方法.
  9.包(package)Java允许把一个或多个类收集在一起成为一组,称作包,以便于组织任务,标准Java库分为许多包.java.lang java.util java,net等,包是分层次的所有的java包都在java和javax包层次内.
  10.继承思想:允许在已经存在的类的基础上构建新的类,当你继承一个已经存在的类时,那么你就复用了这个类的方法和字段,同时你可以在新类中添加新的方法和字段.
  11.扩展类:扩展类充分体现了is-a的继承关系. 形式为:class (子类) extends (基类).
  12.多态:在java中,对象变量是多态的.而java中不支持多重继承.
13.动态绑定:调用对象方法的机制.
  (1)编译器检查对象声明的类型和方法名.
  (2)编译器检查方法调用的参数类型.
  (3)静态绑定:若方法类型为priavte static final 编译器会准确知道该调用哪个方法.
  (4)当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用x所指向的对象的实际类型相匹配的方法版本.
  (5)动态绑定:是很重要的特性,它能使程序变得可扩展而不需要重编译已存代码.
  14.final类:为防止他人从你的类上派生新类,此类是不可扩展的.
  15.动态调用比静态调用花费的时间要长,
  16.抽象类:规定一个或多个抽象方法的类本身必须定义为abstract例: public abstract string getDescripition
  17.Java中的每一个类都是从Object类扩展而来的.
  18.object类中的equal和toString方法.equal用于测试一个对象是否同另一个对象相等.toString返回一个代表该对象的字符串,几乎每一个类都会重载该方法,以便返回当前状态的正确表示.(toString 方法是一个很重要的方法)
  19.通用编程:任何类类型的所有值都可以同object类性的变量来代替.
  20.数组列表:ArrayList动态数组列表,是一个类库,定义在java.uitl包中,可自动调节数组的大小.
  21.class类 object类中的getclass方法返回ckass类型的一个实例,程序启动时包含在main方法的类会被加载,虚拟机要加载他需要的所有类,每一个加载的类都要加载它需要的类.
  22.class类为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为JavaBeans特别有用,使用反射Java能支持VB程序员习惯使用的工具.能够分析类能力的程序叫反射器,Java中提供此功能的包叫Java.lang.reflect反射机制十分强大.
  1.在运行时分析类的能力.
  2.在运行时探察类的对象.
  3.实现通用数组操纵代码.
  4.提供方法对象.
  而此机制主要针对是工具者而不是应用及程序.
  反射机制中的最重要的部分是允许你检查类的结构.用到的API有:
  java.lang.reflect.Field 返回字段.
  java.reflect.Method 返回方法.
  java.lang.reflect.Constructor 返回参数.
  方法指针:java没有方法指针,把一个方法的地址传给另一个方法,可以在后面调用它,而接口是更好的解决方案.
23.接口(Interface)说明类该做什么而不指定如何去做,一个类可以实现一个或多个interface.
  24.接口不是一个类,而是对符合接口要求的类的一套规范.若实现一个接口需要2个步骤:
  1.声明类需要实现的指定接口.
  2.提供接口中的所有方法的定义.
  声明一个类实现一个接口需要使用implements 关键字class actionB implements Comparable 其actionb需要提供CompareTo方法,接口不是类,不能用new实例化一个接口.
  25.一个类只有一个超类,但一个类能实现多个接口.Java中的一个重要接口Cloneable
  26.接口和回调.编程一个常用的模式是回调模式,在这种模式中你可以指定当一个特定时间发生时回调对象上的方法.例:ActionListener 接口监听.
  类似的API有:java.swing.JOptionPane
        java.swing.Timer
        java.awt.Tookit
  27.对象clone:clone方法是object一个保护方法,这意味着你的代码不能简单的调用它.
  28.内部类:一个内部类的定义是定义在另一个内部的类
  原因是:1.一个内部类的对象能够访问创建它的对象的实现,包括私有数据
  2.对于同一个包中的其他类来说,内部类能够隐藏起来.
  3.匿名内部类可以很方便的定义回调.
  4.使用内部类可以非常方便的编写事件驱动程序.
  29.代理类(proxy):1.指定接口要求所有代码 2.object类定义的所有的方法(toString equals)
  30.数据类型:Java是强调类型的语言,每个变量都必须先申明它都类型,java中总共有8个基本类型.4种是整型,2种是浮点型,一种是字符型,被用于Unicode编码中的字符,布尔型.

UNIX家族及类UNIX系统
1969年,在AT&T的Bell Labs,Ken Thompson和Dennis Ritchie(他们曾是大型操作系统Multics的两名开发者,Multics太庞大了最终没有成功)为了一项名为太空旅游的实验计划,需要一个操作系统。他们找了一台闲置的PDP-7机器,在上面写了个Multics的改编版,1971年正式发布。这个东东就是后来名扬天下的UNIX了。Multics——UNIX,大家看出了点什么吗?
1973年,Dennis Ritchie用他自己开发的C语言重写了一遍UNIX,奠定了UNIX普及化的基础。1976年他们首次将第六版的UNIX流传到AT&T以外的地方。 UC Berkeley的人以UNIX 7.0为基础,发表了称作BSD的系统,并且开发到1992年的4.4版;而AT&T也不断改进他们的系统,发表了商业化的System Ⅲ直到System Ⅴ。以后UNIX的发展都是围绕这两大主流展开的。
UNIX的设计目标是小而美:希望能在任何小系统上执行,而核心只提供必不可少的一些功能,其他的则根据需要加上去。这已经成为操作系统的一种设计哲学。现在许多公司有了自己的UNIX版本,但它们基本特性是一致的:开放性、多用户、多任务、功能强、实现高效、网络功能丰富。为了克服UNIX版本差异对可移植性的损害,1990年ISO制定了ISO/IEC 9945-1-1990标准,这是整个可移植操作系统界面(POSIX)的第一部分;系统应用程序界面即POSIX.1。这就是常说的UNIX操作系统的界面标准。

目前的x86平台上的BSD系统大多基于Berkeley的4.4 BSD Lite,这是去掉了那些来自AT&T的代码后公开发布的一个不完整的系统。其中最有名的当属FreeBSD(最新版为FreeBSD 5.2 [Jan-12-2004]),其他还有NetBSD(最新版为NetBSD 1.6.1 [Apr-21-2003]),OpenBSD(最新版为OpenBSD 3.4 [Nov-1-2003])等版本,都是免费的,可以在相应的官方网站下载。
Sun Solaris:

Sun Microsystems公司早期的操作系统版本Sun OS是基于BSD的。在1993年,他们与AT&T合作,转向了UNIX System V,并发布了称作Solaris.System V release 4的系统,这是一个UNIX System V和BSD的整合体。Solaris系统主要是用在Sun公司自己的SPARC机器上,但他们也发布了相应的x86版本,并且免费。最新的测试版本Software Express for Solaris(12/03) [Dec-?-2003],在官方网站有下载。
SCO UNIX
Santa Cruz Operation(SCO)公司的UNIX主要有两套。一方面,1980年的时候,Microsoft开始研制UNIX的PC版本XENIX,后来卖给了SCO。在这个基础上,SCO又不断引入AT&T的技术,后来发展成为了SCO Open Server系列。目前我国银行,邮政等系统很多都用的这个操作系统,最新的版本是SCO Open Server 5.0.7 [Feb-21-2003]。另一方面,1993年,AT&T把他们关于UNIX的整个队伍、技术包括版权卖给了Nowell公司,有了UnixWare。1995年,Nowell又把这一套东东卖给了SCO,这样SCO就成了UNIX的嫡传正宗。SCO整合了自己的技术,发布了UnixWare 7,之后被Caldera并购。Caldera这块招牌不够响,又换回了SCO。UnixWare最新版是UnixWare 7.1.3 [Nov-21-2002]。这些在ED上或许可以找到下载。
Darwin
Darwin是Apple公司Macintosh电脑的操作系统Mac OS X的内核,在1999年的时候出的第一个版本。它基于FreeBSD和Mach 3.0技术,这两个都是开放源码的。Apple对Darwin也采用了开放源码的策略,制作发行版让人们自由下载,包括x86版本。最新版是Darwin 7.0.1 [Nov-14-2003],可去官方网站免费下载。注意Darwin毕竟不是Mac OS X,少了那个漂亮的的Aqua用户界面。目前有一些添加了免费GUI的版本,如GNU-Darwin。
MINIX
由于版权的问题,UNIX的源码不再适用于教学,为此1987年著名的荷兰计算机科学家Andrew Tanenbaum专门写了了个简化的类UNIX系统MINIX(mini-UNIX的意思)来给入门者学习。最新的版本是MINIX 2.0.4 [Nov-9-2003],可以去官方网站免费下载。
Linux
1991年,芬兰学生Linus [...]

到网上下载以上三个软件并安装
jdk1.4安装目录:D:/jdk14
Tomcat5.0安装目录:D:/tomcat5
SQL Server2000安装目录默认
====================================================
一、设置环境变量
Classpath
D:\jdk14\lib\tools.jar;D:\jdk14\lib\dt.jar;
D:\tomcat5\bin;D:\Program Files\
Microsoft SQL Server 2000 Driver for JDBC\lib\msbase.jar;
D:\Program Files\Microsoft SQL Server 2000 Driver for JDBC\
lib\mssqlserver.jar;
D:\Program Files\Microsoft SQL Server 2000 Driver f or JDBC\
lib\msutil.jar
Java_home
D:\jdk14
Tomcat_home
D:\tomcat5
Path
D:\Program Files\Microsoft SQL Server\80\
Tools\BINN;D:\jdk14
二、Tomcat5的设置网站虚拟路径
用记事本打开:[系统盘:]\tomcat5\conf\server.xml
之前加
方法1:

方法2:(为方便调试建议用此方法,网站端口设为80,
如果你想保留Tomcat5的帮助信息网页,
请用第一种方法):

三、端口设置
Tomcat5网站端口默认为8080
为了调试方便,将它设为HTTP默认的端口80
这时,请注意你的Internet 信息服务IIS
(如果装有)已关闭。如果装有,它会每
次跟着系统启动,将它设为手动即可!“控制面板”
—>“管理工具”—->“组件服务”—–>
选中左边的“服务(本地)”—–>打开右边
“World Wide Web Publishing”的属性—–>
“常规”—–>服务状态:点击“停用”—–>
在启动类型:选择“手动”—>“确定”
四、修改启用默认网页:
用记事本打开:[系统盘:]
\tomcat5\conf\server.xml

index.jsp
在此可以增删修默认网页文档
为了调试方便,建议注释掉或删掉默认网页(即一下代码):

index.jsp

打开网站时,会把当前文件夹下所有文件以列表形式显示
点击相应的网页就可进行测试了。
五、启动Tomcat5
打开:[系统盘:]\tomcat5\bin\startup.bat
关闭:[系统盘:]\tomcat5\bin\shutdown.bat
六、测试网页:
设置了虚拟目录方法1:

在地址栏输入(端口为80):http://localhost/
在地址栏输入(端口为8080):http://localhost:8080/
设置了虚拟目录方法2:

在地址栏输入(端口为80):http://localhost/EnglishStars/
在地址栏输入(端口为8080):http://localhost:8080/EnglishStars/
////////////////////////////////////////////////////
七、测试与SQL server2000数据库连接代码
数据库名:test
表名:userinfo
字段名:随便(本例3个以上)
< %@ page contentType="text/html;charset=gb2312"%>
< %@ page import="java.sql.*"%>
< %Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")
.newInstance();
String
url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=test";
//user,password 分别为数据库的用户名及密码
String user="sa";
String password="";
Connection conn=DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from userinfo";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:< %=rs.getString(1)%>
您的第二个字段内容为:< %=rs.getString(2)%>
您的第三个字段内容为:< %=rs.getString(3)%> [...]

给编程爱好者的忠告
近来有不少人问我是学Vb好还是学C好,还有人问Vc和C++Builder哪个更好,还有人说只要是面向对象的就是好的所以C++和Java最有前途。以我从事计算机教育多年的经验我要告诉这些编程爱好者,如果只是一味追求学会一门所谓的最先进的编程语言(事实上不存在最优),而忽视了编程思想和基础知识无疑是犯了学习编程的大忌。
就拿面向对象来说,人们一提到它就赞不绝口,然而又有多少人领会到什么是面向对象的思想,我想如果没有真正做过大项目的人是很难体会到其优越性的,这不是通过学习C++或Java就能掌握的。我的意思是编程注重的是想法而不是语言,这就是计算机专业要开设“算法分析”和“数据结构”的原因,如果一头钻到某一门语言中无疑于作茧自缚,束缚了自己的思想,打一个不好的比方一个程序员的工作性质和民工没什么两样只是在垒砖头,而真正的计算机人才应该是一个设计师、工程师。
现在国外的一些优秀的计算机著作的都是一些从事如生物、化学等领域的专家,我想这是因为他们以前没学过计算机,没有被某些传统的观点所束缚,从宏观上来看待问题,反而在思想上有所突破,这是值得我们深思的。
 
真正的程序员(转贴)
作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具有的素质。
1:团队精神和协作能力
把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。
2:文档习惯
说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。
3:规范化,标准化的代码编写习惯
作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助踊同技术人员之间的协作。
有些coding fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。
再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可想象的。
4:需求理解能力
程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。
5:复用性,模块化思维能力
经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成了熟练程序员的主要工作,而这些,其实是完全可以避免的。
复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。
一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重写,大部分重复性工作无谓的浪费了时间和精力。
6:测试习惯
作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效率和可靠性就有了最大的保证。
测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情下的测试,整体系统局部故障情下该模块受影响状的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试并尽早发现和解决问题,当然这需要上面提到的需求理解能力。
7:学习和总结的能力
程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。
善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高了。但是学习也要找对目标,一些小coding fans们,他们也津津乐道于他们的学习能力,一会学会了asp,一会儿学会了php,一会儿学会了jsp,他们把这个作为炫耀的资本,盲目的追逐一些肤浅的,表面的东西和名词,做网络程序不懂通讯传输协议,做应用程序不懂中断向量处理,这样的技术人员,不管掌握了多少所谓的新语言,永远不会有质的提高。
善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状和用户反馈,随时总结,找到自己的不足,这样逐步提高,一个程序员才可能成长起来。
一个不具备成长性的程序员,即便眼前看是个高手,建议也不要选用,因为他落伍的时候马上就到了。
具备以上全部素质的人,应当说是够格的程序员了,请注意以上的各种素质都不是由IQ决定的,也不是大学某些课本里可以学习到的,需要的仅仅是程序员对自己工作的认识,是一种意识上的问题。