发布新日志

  • 我的首个个人BLOG

    2007-06-13 22:36:17

    www.biejian.cn

    以后就很少来这了,上个人BLOG去,呵呵,欢迎大家来参观

  • 111

    2007-05-29 13:17:00

    <scrīpt type="text/javascrīpt"><!--
    google_ad_client = "pub-2707156901517359";
    google_ad_width = 728;
    google_ad_height = 90;
    google_ad_format = "728x90_as";
    google_ad_type = "text_image";
    google_ad_channel = "";
    //-->
    </scrīpt>
    <scrīpt type="text/javascrīpt"
      src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </scrīpt>
  • [深圳]周六IT专场招聘会

    2007-05-26 00:56:04

    5月26日(本周六),“群英会”—IT、电子制造业人才招聘会将在深圳市福田区八卦二路劳动就业大厦隆重举行,盛情邀请符合条件求职者免费光临。
         本次大会限定120家行业知名企业参会,包括联想、康佳、华为、三星、金蝶、长城、南太等众多知名企业拟强势出击,拿出多个高薪职位,最高年薪百万。参会企业提供职位年薪不低于5万元人民币。求职人员须大专或中级职称两年以上、本科或高级职称一年以上、硕士、博士以上学历。求职人员现场验证,符合条件免费进场。
         招聘信息查阅:登陆大会网站
    www.zshr.cn 查看或关注5月25日《深圳特区报》公告。

    前往公交路线: 乘24路、207路、218路、222路、319路至劳动就业大厦站 

  • 软件测试的职业划分的介绍

    2007-05-19 03:13:23

    外语水平

      了解——掌握该语言语法,可以进行简单工作文档的阅读、书写,能进行基本口语交流。

      一般——熟悉该语言下的计算机工作环境,能够熟练阅读并编写该语种工作文档,能进行日常口语交流。

      熟练——母语或类似母语程度,熟练使用该语种计算机环境,并完全具备行业内听、说、读、写等表达能力。

      精通——在该语种工作环境下具有丰富的经验,能在正式商务文件起草与商务谈判中熟练驾驭该语种的表达。

      功能自动化测试工具使用经验

      了解——仅具有个人学习经验,掌握工具的基本功能和操作方法。

      一般——了解自动化测试过程管理,并能对工具进行数据驱动式自动化脚本开发。

      熟练——熟悉自动化测试过程的实施与管理,能够结合工具自身特性,将自动化测试应用于企业级自动化测试过程里。

      精通——具有企业级自动化测试过程的实施与管理经验,能够结合工具特性和企业现状,为企业定制企业级或项目级测试框架,或自主开发测试工具等。

      性能测试/监控工具使用经验

      了解——具有个人学习经验,掌握工具基本功能,能够进行初级的脚本录制、开发与设置。

      一般——了解某些网络应用程序性能计数器,能够独立设计性能测试方案(场景),并结合工具完成简单网络程序的性能测试工作。

      熟练——具有企业性能测试工作经验,熟悉特定网络应用程序每个逻辑层的系统性能 指标,能够利用工具对特定架构(平台)的网络应用程序进行性能测试和性能分析。

      精通——在特定领域,能够独立承担大型或复杂结构网络应用程序性能测试的总体设计,对于该领域软件架构具有敏锐的性能瓶颈分析与定位能力,并对系统进行性能优化。

      白盒测试/代码分析工具使用经验

      了解——仅具有个人学习经验,掌握工具的基本功能和操作方法。

      一般——深入掌握该工具的使用,能将工具应用于实际的软件开发或单元测试工作中。

      熟练——具有基于工具的二次开发能力,或具有单元测试过程实施与管理的经验,可以根据工具的特性,将其灵活应用于企业级软件开发的某些过程里。

    测试管理工具使用经验

      了解——仅具有个人学习经验,了解工具的基本功能及使用。

      熟练——掌握工具的安装、配置与维护,具有企业应用经验,掌握工具使用中的操作细节。

      精通——掌握工具的技术实现细节,具有根据企业现状进行自定义或二次开发的能力。

      软件缺陷管理工具使用经验

      了解——仅具有个人学习经验,了解工具的基本功能及使用。

      熟练——掌握工具的安装、配置与维护,具有企业应用经验,掌握工具使用中的操作细节。

      精通——掌握工具的技术实现细节,具有根据企业现状进行自定义或二次开发的能力。

      软件开发经验

      了解——具有个人学习经验或实习经验。

      熟悉——具有特定语言的企业级软件开发经验。

      熟练——具有企业级软件架构设计或系统底层设计经验。

      数据库应用经验

      了解——掌握数据库原理,会使用sql语句。

      熟悉——具有企业级数据库安装、配置、管理、维护经验。

      熟练——具有企业级基于数据库的特定开发经验。

      精通——深入掌握特定数据库的性能参数,具有数据库的性能优化能力。

      软件配置管理/版本控制工具使用经验

      了解——仅具有个人学习经验,了解工具的基本功能及使用。

      熟练——掌握工具的安装、配置与维护,具有企业应用经验,掌握工具使用中的操作细节。

      精通——掌握工具的技术实现细节,具有根据企业现状进行自定义或二次开发的能力。

  • 小小一招巧解任何电脑的开机密码

    2007-05-19 03:07:44

    小小一招巧解任何电脑的开机密码,无需任何工具,无需放电

    任何电脑当开机需要密码时,只需将机箱打开,把里面的声卡或其它任何一

    个零件拔下来,然后通电启动,主板自检后再强行关机,把拔下的零件再插

    上去,开机,密码自动清除,百试百灵。

  • 又面试失败了

    2007-05-18 04:52:37

    昨天去个公司面试技术支持工程师的职位,进去的时候一看是3个人主持面试,第一次看见这阵仗,蒙了点,连自我介绍都说的结结巴巴的,到后面看到面试官都没有什么兴趣问话了,我就知道没戏了

    哎,要多练习练习面试技巧啊

  • 软件测试管理常见问题及其回答[ZT]

    2007-05-14 18:40:00

    1、测试负责人要进行严格的测试进度跟踪吗?
    很多时候,由于人力资源的不足,测试项目负责人都是在执行测试,这样就使整个项目缺乏控制,一些问题(例如:有些成员的缺陷质量不够合格;开发人员修改不及时,系统某些功能发生严重问题导致部分功能无法测试。)得不到解决,耽误了进度。所以测试负责任必须全程监控项目,尽可能多的掌握信息。通常,测试负责人需要完成下面这些内容的管理工作:
    测试用例执行情况;
    每个测试员提交的缺陷情况;
    测试中是否发生突发问题。

    2、 测试也有版本控制吗?
    这里的版本主要是指测试对象的版本控制,也就是指对开发部提交的产品进行版本控制。在开发小组版本管理不规范的情况下,测试小组进行版本控制十分重要,要保证测试对象是可以控制的。建议开发和测试双方进行明确的约定,可以各自指定专门的测试版本负责人,制定提交原则,对提交情况进行详细的记录,这样基本避免了版本失控导致的测试失误或无效。

    3、如何处理测试人员的流动问题?
    人员流动不仅仅是测试部门,这是IT行业的普遍现象。从管理者角度,主管需要多多和团队内成员进行沟通,建立一个融洽的团队环境,及时掌握情况,可以早些进行相应的调整。但是只有企业建立好的用人制度,给员工提高广阔的发展空间和好的培训学习机会,才能从根本上解决这一问题。
    加强项目管理,强化文档管理并保证文档的有效性,可以大大减少由于人员流失带来的损失。同时,测试部门要建立培训机制,使新到员工接受直接或者间接的培训,快速适应工作。

    4、为什么开发人员经常抱怨测试工程师提交的缺陷质量太差?
    我们经常听开发人员说:“这不是缺陷!”,“这个缺陷没有,因为我的系统上运行正常!”。测试工程师本身就是做质量工作的,提交的成果本身就应该质量高些,为什么还会有这种现象?
    提交的缺陷引起争议是一种正常的现象,例如测试人员描述不清楚就会引起争议。减少甚至避免这种现象的方法是交叉测试,交叉测试是提高测试质量的一个有效手段,当然交叉测试会增加一定的测试成本投入。在测试任务完成后,测试工程师之间互相验证彼此提交的缺陷,就会避免了缺陷描述不清、因运行环境而产生的缺陷等一系列问题,从而大大降低了回归测试以及交流的成本,因而这种投入也是值得的,实际开发人员在单元测试阶段也会进行交叉测试,来提高开发质量。
    另外,测试人员一定要按照规范描述测试中发现的缺陷,一个缺陷至少描述清楚概要描述、详细描述、重现步骤三方面的内容,缺陷管理参考第八章的内容。

    5、“让那些新手来做测试,反正他们也不会什么”正确吗?
    在实际项目开发中,我们常常看到有些单位忽视测试团队存在的意义,当要实施测试时,往往临时找几个程序员充当测试人员。也有些单位尽管认识到了组建测试团队的重要性,但在具体落实的时候往往安排一些毫无开发经验的行业新手去做测试工作,这常常导致测试效率低下,测试人员对测试工作索然无味。
    根据笔者的经验,测试团队应首先聘请一名资深的测试领域专家,他应具有极为丰富的同类项目软件测试经验,对软件开发过程中常见的缺陷或错误了然于胸;此外,他还具有较好的亲和力和人格魅力。其次,项目测试团队还具有很多具备一技之长的成员,如对某些自动化测试工具运用娴熟或能轻而易举地编写自动化测试脚本等。
    另外,测试团队还应聘请一些兼职成员,如验证测试实施过程中,同行评审是最常使用的一种形式,这些同行专家就属于兼职测试团队成员的范畴。至于测试团队里里的测试新手,这部分人可以安排去从事交付验证或黑盒测试之类的

    6、测试同化现象是什么?
    同化现象是指随着时间的推移,开发人员会逐渐影响测试人员的思维和对缺陷的判断能力,尤其是针对同一产品,同一组开发人员和同一组测试人员共同配合了很长时间,很多本来是缺陷的问题,由于测试人员对软件“习惯成自然”的使用,会不被当成缺陷,尤其是在开发人员的解释和说服下。同化现象发生可能意味着“恶性循环”的开始:测试人员会帮着开发人员解释一个个缺陷的合理性,一轮有一轮的测试都不会发现问题。
    招聘新的人员,不同的测试项目组轮换去测试不同的产品,就可以避免。同时建议产品可以发布测试版,更多的人对其进行测试,就可以发现更多的问题。

    7、测试工程师如何避免定位效应?
    社会心理学家曾作过一个试验:在召集会议时先让人们自由选择位子,之后到室外休息片刻再进入室内入座,如此五至六次,发现大多数人都选择他们第一次坐过的位子。这种现象称为定位效应,说明人们习惯上凡是自己认定的,人们大都不想轻易改变它。
    定位效应在开发人员和测试人员身上都有体现。例如开发工程师针对某一自己写的功能,经常进行代码移植,这种复制的“功能”,由于上一次经过调试,在新的地方往往不会认真调试,这些代码往往会带来共享变量冲突等许多种类型的缺陷。
    定位效应体现在测试人员身上就是测试过的功能不再进行认真测试:在回归测试时,之前由于进行过认真的测试,往往会认为某些功能是可靠,只要验证一些以前发现的缺陷是否修改完成就可以了。这种现象在反复多次回归时表现的更加突出,因为回归测试中很多功能都会进行多次反复测试。众所周知,开发人员在修改缺陷时往往会引入新的缺陷,测试人员的疏于防范就会把这些缺陷带到用户这里。
    解决这种问题的方案一般有两个:
    (1)完整的执行测试用例:这种方法投入较大,但是在开发产品时最好在最后一次回归测试时测试的执行一次全部的测试用例。
    (2)交叉测试:测试人员交叉测试,就可以很大程度的避免定位效应。测试工程师在回归测试时互相交换任务,反复测试某一功能的机会大大减少,从而也就不会“主观的”人员某些功能没有缺陷。
    通常上面的两个方法都是结合使用的,既要进行交叉测试,又要全面执行测试用例,测试覆盖面要尽可能的广泛。

    8、测试人员忽然辞职怎么办?
    目前IT行业人员流动较大已经成为一种不争的事实,员工的辞职大多数都会给组织带来一定的影响,而这种影响基本是不可能避免的。在测试领域,员工忽然辞职也会带来很大的负面影响,尤其测试队伍规模较小时。面对这种情况,我们所能做的,就是如何最大限度的降低这种影响。
    根据作者的经验,主要有两种方法:第一种是在测试人员内部建立一个良好的学习环境,大家互相学习,这样某些特有技术不会被某一个人所掌握,而互相学习和提高自身,也是大多数成员愿意做的;第二种就是在组织中进行知识管理,把技术作为知识沉淀下来,这样新的员工在接手工作时容易上手,通过学习快速适应环境。
    此外,日常还要注意工作规范化,例如形成尽可能多的文档,都可以降低员工离职带来的损失。

    9、测试人员工作发生问题测试经理应该如何做?
    测试人员工作发生问题是测试经理经常要面对的问题,作为测试部门的领导,首先要做的是指出测试人员所犯的错误,使其尽快改正错误。
    唯一不能做的就是盯着下属的错误不放。总盯着下属的失误,是一个领导者的最大失误。英国行为学家波特说:当遭受许多批评时,下级往往只记住开头的一些,其余就不听了,因为他们忙于思索论据来反驳开头的批评。身为测试经理要根据测试人员的心理来进行指导,最大限度的调动每个人员的积极性来参加工作。

    10、不深入到具体测试工作时,测试经理如何考核员工?
    这种现象在测试规模较大的组织中很常见。测试经理应该尽可能的安排每周与每个成员在不被打扰的环境下进行谈话,这样可以尽早发现和解决很多问题。
    最为一个测试经理,主要工作之一就是定期的评定组织做了些什么并且是怎样做的。同时还要为员工做一个报告——关于充分了解测试人员正在做什么和怎样做的报告,以此来给测试人员做做工作成绩考核。这份报告要了解到每个人的动态。
    测试经理和每个员工重点是谈谈目前的工作,例如大家在工作中的问题或意见;是否需要帮助等。许多管理者经常抱怨没有时间在一周会见每一个员工来谈他们的工作。但是根据作者的经验,如果不能安排时间和员工进行每周的谈话,员工会来打扰测试经理的工作,因为员工很多问题还要要来找测试经理商议。
    同时对待员工要用他们能接受的方式,而不是我们自己可以接受的方式。“己之不予,勿施于人”,这条黄金法则可能会对许多生活中的纯粹的社交因素有效,但是并不是总对工作有用。有效率的管理者知道应该逐渐了解每一个员工需要怎样的对待方式。
    总之,只有尽可能多的和员工接触,才能更精确的进行考核。
  • linux下安装php,apache,mysql,perl方法

    2007-05-14 18:39:03

    1.硬件环境:
    硬盘:9.2 G ; 内存:128 M ; 网卡:EEpor100
    2.软件
    操作系统: RedHat 6.2
    3.优化RedHat 6.2
    安装时选择
    ftp 和 dns
    编辑文件 /etc/hosts
    改为:
    202.104.131.100 info.langoit.com.cn info
    编辑文件 /etc/named.conf
    改为:
    // generated by named-bootconf.pl
    options {
    directory "/var/named";
    forwarders {202.104.131.98;};
    forwards only;
    // query-source address * port 53;
    };
    //
    // a caching only nameserver config
    //
    zone "." in {
    type hint;
    file "named.ca";
    };
    zone "0.0.127.in-addr.arpa" in {
    type master;
    file "named.local";
    };
    编辑文件 /etc/resolv.conf
    改为:
    search langoit.com.cn
    nameserver 202.104.131.98
    nameserver 202.96.134.133
    优化linux 内核:
    删除没有的rpm 包:
    首先要停止正在运行的进程
    cd /etc/rc.d/init.d
    ./sendmail stop
    ./apmd stop
    ./kudzu stop
    rpm -e --nodeps sendmail kudzu nfs-utils
    编辑文件 /usr/src/linux/include/linux/tasks.h
    编辑第十四行 (vi +14 ) :
    NR_TASKS 5120 ---> 3072
    MIN_TASKS_LEFT_FOR_ROOT 16 ---> 24
    编辑文件 /usr/src/linux/Makefile
    编辑第十八行 (vi +18 ) :
    HOSTCC =gcc
    --->
    HOSTCC =egcs
    编辑第二十五行 (vi +25 ) :
    CC =$(CROSS_COMPILE)gcc -D__KERNEL__ -I$(HPATH)
    --->
    CC =$(CROSS_COMPILE)egcs -D__KERNEL__ -I$(HPATH)
    编辑第九十行 (vi +90 ) :
    CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    --->
    CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=
    pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
    编辑第十九行 (vi +19 ) :
    HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
    --->
    HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=
    pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
    设置内核:
    make xconfig
    具体可自己根据系统来设置
    在 /usr/src/linux/ 目录下
    make dep
    make clean
    make bzlilo
    make modules
    make modules_install
    4.安装和优化mm,mysql,apache,php,phpMyAdmin,perl,mode_perl
    1) 文件
    mm: mm-1.1.3.tar.gz
    mysql: mysql-3.22.32.tar.gz
    apache: apache_1.3.12.tar.gz
    php: php-4.0.0.2.0.5.tar.gz
    phpMyAdmin: phpMyAdmin_2.0.5.tar.gz
    mode_perl: mod_perl-1.24.tar.gz
    perl-DBI: DBI-1.14.tar.gz
    DBD-Oracle-1.06.tar.gz
    Msql-Mysql-modules-1.2214.tar.gz
    Data-Dumper-2.101.tar.gz
    Data-ShowTable-3.3.tar.gz
    eperl: eperl-2.2.14.tar.gz
    perl: perl-5.6.0.tar.gz
    解压文件:
    tar -zxpf 文件名
    注意:以下所有的预编译和安装必须在要安装的软件目录下
    #) 安装mm
    ./configure /
    --disable-shared /
    --prefix=/usr
    make
    make test
    make install
    make clean
    #) mysql的安装和配置
    #) mysql的预编译
    CC="egcs" /
    OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro /
    -march=pentiumpro -fomit-frame-pointer -fno-exceptions" /
    ./configure /
    --prefix=/mysql /
    #) 安装mysql
    make
    make install
    make clean
    #) 配置mysql
    /mysql/bin/mysql_install_db
    初始化数据库
    cp /mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysql
    cd /etc/rc.d/rc3.d
    ln -s ../init.d/mysql S70mysql
    系统启动时加载mysql
    #) apache 的预编译
    CC="egcs" /
    OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro /
    -march=pentiumpro -fomit-frame-pointer -fno-exceptions" /
    CFLAGS="-DDYNAMIC_MODULE_LIMIT=0" /
    ./configure /
    --prefix=/apache /
    #) php的预编译
    CC="egcs" /
    OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro /
    -march=pentiumpro -fomit-frame-pointer -fno-exceptions" /
    ./configure /
    --prefix=/usr /
    --with-apache=../apache_1.3.12 /
    --enable-safe-mode /
    --with-mm /
    --enable-inline-optimization /
    --enable-memory-limit /
    --enable-track-vars /
    --with-mysql=/mysql /
    #) 安装php
    make
    make install
    make clean
    #) mode_perl 的预编译
    perl Makefile.PL /
    EVERYTHING=1 /
    APACHE_SRC=../apache_1.3.12/src /
    USE_APACI=1 /
    DO_HTTPD=1
    #) 安装mod_perl
    make
    make install
    make clean
    #) 编译apache
    EAPI_MM=SYSTEM /
    CC="egcs" /
    OPTIM="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro /
    -march=pentiumpro -fomit-frame-pointer -fno-exceptions" /
    CFLAGS="-DDYNAMIC_MODULE_LIMIT=0" /
    ./configure /
    --prefix=/apache /
    --activate-module=src/modules/php4/libphp4.a /
    --enable-module=php4 /
    --activate-module=src/modules/perl/libperl.a /
    --enable-module=perl
    #) 安装apache
    make
    make install
    make clean
    cp /apache/bin/apachectl /etc/rc.d/init.d/httpd
    cd /etc/rc.d/rc3.d
    ln -s ../init.d/httpd S80httpd
    系统启动时加载apache
    #) 安装eperl
    perl Makefile.PL
    make
    make test
    make install
    make clean
    -frame-pointer -fno-exceptions" /
    CFLAGS="-DDYNAMIC_MODULE_LIMIT=0" /
    ./configure /
    --prefix=/apache /
    --activate-module=src/modules/php4/libphp4.a /
    --enable-module=php4 /
    --activate-module=src/modules/perl/libperl.a /
    --enable-module=perl
    #) 安装apache
    make
    make install
    make clean
    cp /apache/bin/apachectl /etc/rc.d/init.d/httpd
    cd /etc/rc.d/rc3.d
    ln -s ../init.d/httpd S80httpd
    系统启动时加载apache
    #) 安装eperl
    perl Makefile.PL
    make
    make test
    make install
    make clean
    make
    make test
    make install
    make clean
    make clean
  • java的各种排序方法

    2007-05-14 18:38:13

    这是我们同学整理的笔记,经他允许发到网上,都是他在书或网上摘抄的,希望对大家有帮助



    用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。

    插入排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;
    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class InsertSort implements SortUtil.Sort{

      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
              SortUtil.swap(data,j,j-1);
            }
        }    
      }

    }
    冒泡排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class BubbleSort implements SortUtil.Sort{

      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        int temp;
        for(int i=0;i<data.length;i++){
            for(int j=data.length-1;j>i;j--){
              if(data[j]<data[j-1]){
                SortUtil.swap(data,j,j-1);
              }
            }
        }
      }

    }

    快速排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class QuickSort implements SortUtil.Sort{

      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        quickSort(data,0,data.length-1);    
      }
      private void quickSort(int[] data,int i,int j){
        int pivotIndex=(i+j)/2;
        //swap
        SortUtil.swap(data,pivotIndex,j);
       
        int k=partition(data,i-1,j,data[j]);
        SortUtil.swap(data,k,j);
        if((k-i)>1) quickSort(data,i,k-1);
        if((j-k)>1) quickSort(data,k+1,j);
       
      }
      /**
      * @param data
      * @param i
      * @param j
      * @return
      */
      private int partition(int[] data, int l, int r,int pivot) {
        do{
          while(data[++l]<pivot);
          while((r!=0)&&data[--r]>pivot);
          SortUtil.swap(data,l,r);
        }
        while(l<r);
        SortUtil.swap(data,l,r);    
        return l;
      }

    }
    改进后的快速排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class ImprovedQuickSort implements SortUtil.Sort {

      private static int MAX_STACK_SIZE=4096;
      private static int THRESHOLD=10;
      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        int[] stack=new int[MAX_STACK_SIZE];
       
        int top=-1;
        int pivot;
        int pivotIndex,l,r;
       
        stack[++top]=0;
        stack[++top]=data.length-1;
       
        while(top>0){
            int j=stack[top--];
            int i=stack[top--];
           
            pivotIndex=(i+j)/2;
            pivot=data[pivotIndex];
           
            SortUtil.swap(data,pivotIndex,j);
           
            //partition
            l=i-1;
            r=j;
            do{
              while(data[++l]<pivot);
              while((r!=0)&&(data[--r]>pivot));
              SortUtil.swap(data,l,r);
            }
            while(l<r);
            SortUtil.swap(data,l,r);
            SortUtil.swap(data,l,j);
           
            if((l-i)>THRESHOLD){
              stack[++top]=i;
              stack[++top]=l-1;
            }
            if((j-l)>THRESHOLD){
              stack[++top]=l+1;
              stack[++top]=j;
            }
           
        }
        //new InsertSort().sort(data);
        insertSort(data);
      }
      /**
      * @param data
      */
      private void insertSort(int[] data) {
        int temp;
        for(int i=1;i<data.length;i++){
            for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
              SortUtil.swap(data,j,j-1);
            }
        }    
      }

    }


    归并排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class MergeSort implements SortUtil.Sort{

      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
      }
     
      private void mergeSort(int[] data,int[] temp,int l,int r){
        int mid=(l+r)/2;
        if(l==r) return ;
        mergeSort(data,temp,l,mid);
        mergeSort(data,temp,mid+1,r);
        for(int i=l;i<=r;i++){
            temp=data;
        }
        int i1=l;
        int i2=mid+1;
        for(int cur=l;cur<=r;cur++){
            if(i1==mid+1)
              data[cur]=temp[i2++];
            else if(i2>r)
              data[cur]=temp[i1++];
            else if(temp[i1]<temp[i2])
              data[cur]=temp[i1++];
            else
              data[cur]=temp[i2++];        
        }
      }

    }
    改进后的归并排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class ImprovedMergeSort implements SortUtil.Sort {

      private static final int THRESHOLD = 10;

      /*
      * (non-Javadoc)
      *
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        int[] temp=new int[data.length];
        mergeSort(data,temp,0,data.length-1);
      }

      private void mergeSort(int[] data, int[] temp, int l, int r) {
        int i, j, k;
        int mid = (l + r) / 2;
        if (l == r)
            return;
        if ((mid - l) >= THRESHOLD)
            mergeSort(data, temp, l, mid);
        else
            insertSort(data, l, mid - l + 1);
        if ((r - mid) > THRESHOLD)
            mergeSort(data, temp, mid + 1, r);
        else
            insertSort(data, mid + 1, r - mid);

        for (i = l; i <= mid; i++) {
            temp = data;
        }
        for (j = 1; j <= r - mid; j++) {
            temp[r - j + 1] = data[j + mid];
        }
        int a = temp[l];
        int b = temp[r];
        for (i = l, j = r, k = l; k <= r; k++) {
            if (a < b) {
              data[k] = temp[i++];
              a = temp;
            } else {
              data[k] = temp[j--];
              b = temp[j];
            }
        }
      }

      /**
      * @param data
      * @param l
      * @param i
      */
      private void insertSort(int[] data, int start, int len) {
        for(int i=start+1;i<start+len;i++){
            for(int j=i;(j>start) && data[j]<data[j-1];j--){
              SortUtil.swap(data,j,j-1);
            }
        }
      }


    堆排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    * @author treeroot
    * @since 2006-2-2
    * @version 1.0
    */
    public class HeapSort implements SortUtil.Sort{

      /* (non-Javadoc)
      * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
      */
      public void sort(int[] data) {
        MaxHeap h=new MaxHeap();
        h.init(data);
        for(int i=0;i<data.length;i++)
            h.remove();
        System.arraycopy(h.queue,1,data,0,data.length);
      }

      private static class MaxHeap{      
       
        void init(int[] data){
            this.queue=new int[data.length+1];
            for(int i=0;i<data.length;i++){
              queue[++size]=data;
              fixUp(size);
            }
        }
         
        private int size=0;

        private int[] queue;
             
        public int get() {
            return queue[1];
        }

        public void remove() {
            SortUtil.swap(queue,1,size--);
            fixDown(1);
        }
        //fixdown
        private void fixDown(int k) {
            int j;
            while ((j = k << 1) <= size) {
              if (j < size && queue[j]<queue[j+1])
                j++;
              if (queue[k]>queue[j]) //不用交换
                break;
              SortUtil.swap(queue,j,k);
              k = j;
            }
        }
        private void fixUp(int k) {
            while (k > 1) {
              int j = k >> 1;
              if (queue[j]>queue[k])
                break;
              SortUtil.swap(queue,j,k);
              k = j;
            }
        }

      }
  • 【深圳求职】想找份软件测试工作

    2007-05-14 16:56:44

        小弟没有测试的工作经验,现在想要从事测试工作,书看过一些了,可是

    没有测试经验,简历投递出去总是没有回应,想先找个从基础开始的测试工作

    做起,但是网上一搜索,基本都要些项目经验的,不知有没人谁能帮忙介绍几

    个要求不是很高的公司职位呢?我很想从事软件测试这份工作啊,也愿从基

    层做起,我现在在深圳,如有好心人提供机会,小弟在此感谢!

        留下我的邮箱 fanewoxiao@163.com  (手机号码暂不留了)如有需要留下

    的联系方式,我发送简历过去,谢谢!

  • SQL查询语句精华使用简要

    2007-05-14 00:01:34

    一、 简单查询
      简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。
      例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段。

      SELECT nickname,email
      FROM testtable
      WHERE name='张三'

      (一) 选择列表

      选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

      1、选择所有列

      例如,下面语句显示testtable表中所有列的数据:

      SELECT *
      FROM testtable

      2、选择部分列并指定它们的显示次序

      查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
      例如:

      SELECT nickname,email
      FROM testtable

      3、更改列标题

      在选择列表中,可重新指定列标题。定义格式为:
      列标题=列名
      列名 列标题
      如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

      SELECT 昵称=nickname,电子邮件=email
      FROM testtable

      4、删除重复行

      SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

      5、限制返回的行数

      使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。
      例如:

      SELECT TOP 2 *
      FROM testtable
      SELECT TOP 20 PERCENT *
      FROM testtable

      (二)FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

      SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名

      (二) FROM子句

      FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。
      在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

      SELECT username,citytable.cityid
      FROM usertable,citytable
      WHERE usertable.cityid=citytable.cityid

      在FROM子句中可用以下两种格式为表或视图指定别名:
      表名 as 别名
      表名 别名
      例如上面语句可用表的别名格式表示为:

      SELECT username,b.cityid
      FROM usertable a,citytable b
      WHERE a.cityid=b.cityid

      SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

      例如:

      SELECT a.au_fname+a.au_lname
      FROM authors a,titleauthor ta
      (SELECT title_id,title
      FROM titles
      WHERE ytd_sales>10000
      ) AS t
      WHERE a.au_id=ta.au_id
      AND ta.title_id=t.title_id

      此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。
    (三) 使用WHERE子句设置查询条件

      WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

      SELECT *
      FROM usertable
      WHERE age>20

      WHERE子句可包括各种条件运算符:
      比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
      范围运算符(表达式值是否在指定的范围):BETWEEN...AND...
      NOT BETWEEN...AND...
      列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2......)
      NOT IN (项1,项2......)
      模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
      空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
      逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

      1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
      2、列表运算符例:country IN ('Germany','China')
      3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。
      可使用以下通配字符:
      百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
      下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
      方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
      例如:
      限制以Publishing结尾,使用LIKE '%Publishing'
      限制以A开头:LIKE '[A]%'
      限制以A开头外:LIKE '[^A]%'

      4、空值判断符例WHERE age IS NULL

      5、逻辑运算符:优先级为NOT、AND、OR

      (四)查询结果排序

      使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
      ORDER BY {column_name [ASC|DESC]} [,...n]
      其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
      序。
      例如:

      SELECT *
      FROM usertable
      ORDER BY age desc,userid ASC

      另外,可以根据表达式进行排序。

      二、 联合查询

      UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

      select_statement
      UNION [ALL] selectstatement
      [UNION [ALL] selectstatement][...n]

      其中selectstatement为待联合的SELECT查询语句。

      ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

      联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

      在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

      在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

      查询1 UNION (查询2 UNION 查询3)

      三、连接查询

      通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

      在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

      连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

      SQL-92标准所定义的FROM子句的连接语法格式为:

      FROM join_table join_type join_table
      [ON (join_condition)]

      其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

      join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

      交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

      连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

      无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

      SELECT p1.pub_id,p2.pub_id,p1.pr_info
      FROM pub_info AS p1 INNER JOIN pub_info AS p2
      ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

      (一)内连接
      内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
      1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
      2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
      3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
      例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

      SELECT *
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city
      又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
      SELECT a.*,p.pub_id,p.pub_name,p.country
      FROM authors AS a INNER JOIN publishers AS p
      ON a.city=p.city

      (二)外连接
      内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

      SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
      ON a.username=b.username

      下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

      SELECT a.*,b.*
      FROM city as a FULL OUTER JOIN user as b
      ON a.username=b.username

      (三)交叉连接
      交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。
      SELECT type,pub_name
      FROM titles CROSS JOIN publishers
      ORDER BY type
  • SQL语句优化技术分析

    2007-05-14 00:00:43

    操作符优化

    IN 操作符

    用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

    但是用IN的SQL性能总是比较低的:
      数据库试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

      推荐方案:在业务密集的SQL当中尽量不采用IN操作符。

    NOT IN操作符

      此操作是强列推荐不使用的,因为它不能应用表的索引。

      推荐方案:用NOT EXISTS 或(外连接+判断为空)方案代替

    <> 操作符(不等于)

      不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

    推荐方案:用其它相同功能的操作运算代替,如

      a<>0 改为 a>0 or a<0

      a<>’’ 改为 a>’’

    IS NULL 或IS NOT NULL操作(判断字段是否为空)

      判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

      推荐方案:

    用其它相同功能的操作运算代替,如

      a is not null 改为 a>0 或a>’’等。

      不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。

      建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)



    > 及 < 操作符(大于或小于操作符)

      大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时数据库会先找出为2的记录索引再进行比较,而A>=3时数据库则直接找到=3的记录索引。



    LIKE操作符

    LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。



    UNION操作符

    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

    select * from gc_dfys

    union

    select * from ls_jg_dfys

    这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。

    推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

    select * from gc_dfys

    union all

    select * from ls_jg_dfys



    SQL书写的影响

    同一功能同一性能不同写法SQL的影响

    如一个SQL在A程序员写的为

      Select * from zl_yhjbqk

    B程序员写的为

      Select * from dlyx.zl_yhjbqk(带表所有者的前缀)

    C程序员写的为

      Select * from DLYX.ZLYHJBQK(大写表名)

    D程序员写的为

      Select * from DLYX.ZLYHJBQK(中间多了空格)




    WHERE后面的条件顺序影响



    WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如

    Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1

    Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'

    以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。



    SQL语句索引的利用

    对操作符的优化(见上节)

    对条件字段的一些优化

    采用函数处理的字段不能利用索引,如:

    substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’

    trunc(sk_rq)=trunc(sysdate), 优化处理:

    sk_rq>=trunc(sysdate) and sk_rq<trunc(sysdate+1)

    进行了显式或隐式的运算的字段不能进行索引,如:

    ss_df+20>50,优化处理:ss_df>30

    ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’

    sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5

    hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’,注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型。

    条件内包括了多个本表的字段运算时不能进行索引,如:

    ys_df>cx_df,无法进行优化

    qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’
  • 测试人员面试三步曲[转贴]

    2007-05-13 23:46:57

    想找份软件测试的工作,特发个写面试经验的贴学习一下

    春节过后,很多测试朋友都想换换工作,找一个待遇好、环境好,又有自己用武之地和发展空间的工作。在此,我将自己招聘和面试的一些经验与心得汇成三步曲,献给大家,希望对大家找工作能有所帮助。





    第一步、投递简历


    投递简历,让招聘公司发现你,一般有4种方式:


    1.       通过招聘网站搜索测试招聘信息,选择合适的公司和职位,投递简历;


    2.       通过招聘网站发布自己的简历,等待招聘公司发现并下载你的简历;


    3.       通过本公司内部招聘、内部人员推荐;


    4.       通过招聘会,现场投递简历。


    以上4种招聘方式,最为常用的是1、2两种,而且结合使用,第3种的成功率最高,第4种应用很少。第1种方式是现在大多数测试朋友找工作的主要途径,目前,国内知名的人才招聘网站:中华英才网(www.chinahr.com)、51job前程无忧(www.51job.com)、卓博(www.jobcn.com)、中国国家人才网(www.newsjob.com.cn)、北京人才网(www.bjrc.com)等,相信各位想找工作的测试朋友,早已对这些网站如数家珍了。如果你想被猎头看重,那就赶快注册(更新)一下自己的简历吧,很快将会有一大堆公司给你打电话,通知你去面试,这就是第2种方式。一般说来,你在人才网上发布简历找工作的同时,猎头公司也在找你,所以说,1、2两种方式结合使用。接下来,我们再来探讨一下第3种方式。在外企以及一些大公司,为了减缓员工在从事一项工作几年之后产生的乏味情绪,特别推出一种内部招聘的方式,允许公司内部相关部门的相关人员的应聘,比如说作技术支持的要应聘作市场,作开发的要应聘作测试等等,或者在公司内部公布招聘信息,希望本公司的员工推荐符合招聘要求的人员,可以直接到公司进行面试。因为公司对内部员工相当了解,员工对招聘要求十分清楚,必然按要求搜寻符合条件的熟人进行推荐,所以,公司内部招聘、内部推荐十分容易成功。第4种招聘方式,近两年已经很少应用,因为招聘会有时间限制,还要跑到现场,在人山人海中搜寻符合自己条件的公司和职位,投递简历并进行简单面试,既费时、费力,效果也不佳,故而应用越来越少。





    第二步、准备面试


    想要参加面试,就一定要做好面试的准备:


    公司情况:


    在接到面试通知时,一定要简单而客气地询问一下公司的情况, 正所谓知己知彼,百战不殆。看看公司是否有你所关注的地方,比如公司的规模、办公地点、测试组的情况等,最主要的要知道公司的主要业务,测试什么,软件还是硬件,那个行业的,问话不要多,否则对方很容易反感,最好是要来对方的公司网址,到网站上浏览一下,大体也就知道了。


    穿衣戴帽:


    陌生人见面,第一印象很重要,你给招聘方的第一印象,主要通过衣着来表现。我们这些测试人员,都是搞技术的IT人士,不能穿的象个新新人类,试想一下,你作为主考官,见一个身穿乞丐服、头戴鸭舌帽的人进来应聘测试工程师,你会相信他的技术吗。所以在面试时,一定要穿洁净、整齐的职业装或者夹克,或者适中的风衣。女士稍微画一点淡妆,男式记得刮胡子。头发都要梳的整齐。


    言谈举止:


    言谈举止要透出一股自信,让人感觉你就是很棒,什么任务都可以放心的交给你去作,你都能圆满完成。


    证书、简历:


    很多公司可能在通知你面试的时候,就会通知你带相关的学历证件、培训证书,如果招聘方没有通知,你可以礼貌的问一下,是否需要携带。至于你的简历,一定要多带上几份,不要以为招聘方看过你的简历,就一定有你的简历。因为也许是人事部发现了你的简历,通知测试部一同面试,或者测试部发现了你的简历,通知人事部一同面试,而面试又是在几天之后的事情,早不知把你的简历扔到哪里去了。你以为网站上有你的简历,可以直接打印,那你就错了。因为招聘负责人可能工作比较忙,比较累,应聘的人又那么多,手头没有现成的简历,随便应付一下,就打发你走了。感觉难受吧,可你改变不了人家,如果不想失去这次机会,就自己准备简历吧,需要就拿出来,不需要可以留着下次用。


    语言表达:


    面试的关键就是语言表达,看你是否能够很有条理的把自己的经历、知识、技能表达清楚,并且在讲的过程中,注意观察招聘方的表情,看人家是否感兴趣,如果人家皱眉头,表情不悦,就尽快结束自己的话题。因此,在面试之前,你可以自己练习练习。


    知识、技能:


    知识、技能是测试人员平时积累下来的宝贵财富,面试之前,你可以将其条分缕悉,以备面试时表达清楚。


    英语能力:


    国内企业对英语要求不是十分苛刻,只要有良好的英文文档阅读能力即可;倘若是外企或者承包外企项目的公司,对英语要求则十分严格:要求你能够用日常英语会话,能够用英语撰写测试文档,汇报测试工作。所以在学习测试知识和技能的同时,我们也要注意对英语知识的积累。





    第三步、参加面试


    在约定的时间、约定的地点,你最好准时出现,如果不能准时赴约,一定要提前打电话,告知对方是什么原因导致你迟到,多长时间以后能你到达约定地点。进入公司,会有接待人员招呼你坐下,通知招聘负责人接待你面试,此间接待人员会给你送上来一杯水。


    1.       考试


    招聘负责人给你一份试卷(一般为笔试,也有上机的,如果对英语有严格要求,还会有一份英文试卷),规定一定的时限,到时间他来收卷。试卷的命题一般分为填空、选择、判断、逻辑推理、程序改错、简答,也有让你找bug的题,这些题给人的感觉都是在简单中透漏着怪异。如果你问为什么要有考试这一关,招聘人会告诉你,是想考察应聘者的能力。其实,不尽然,最根本是公司的质量保证体系,要求公司所有活动都得有记录,所以才出现了考试这回事。


    2.       初试


    初试是最关键的,几乎决定是否录用你。初试之前招聘负责人可能会寒暄几句,让你放松一下心情。招聘负责人一般有两位,一位负责测试技术,一位负责人事,招聘负责人会作自我介绍,也可能其中一位捎带介绍另一位的资历(比如留美博士),表示这家公司很有诱惑力,连这么好的人才都吸引来了。接下来负责测试技术的会问你几个问题:


    l       请你简单谈谈你的经历?


    l       你在某某家公司主要作哪些工作?


    l       测试过那些东西?


    l       测试流程是什么?


    l       手工测试还是自动测试?


    l       使用过哪些测试工具?使用过Rational系列测试工具吗?


    l       作过白盒测试吗?


    l       作过XXX测试吗?以前接触过XXX吗?你对XXX了解到什么程度?(XXX代表招聘公司所要测试的东西)


    l       平时使用哪些操作系统?Linux操作熟练吗?


    l       以前作过开发吗?开发了哪些东西?使用的什么语言?


    l       你觉得测试工程师应该具备哪些素质?


    l       对一个测试工程师来说,什么素质最重要?


    l       结合自己的实际工作,谈谈你对测试的理解?


    l       为什么要离开上一家公司?


    l       居住在哪里?离公司远不远?


    有经验的招聘负责人都会简单介绍一下自己的公司(背景、主营业务、发展前景等),然后开始问问题。一般开门见山的问题是’请你简单谈谈你的经历?’,回答这个问题,只要简单的叙述你从毕业到现在都在那些公司作了那些事情即可,叙述时一定要从容、清晰而有条理,眼睛瞅着招聘负责人,观察其表情,如果有些不耐烦,要尽早结束这一话题。招聘负责人此时会大致浏览你的简历,在你叙述完自己的经历时,招聘人会就你简历的某一项问你,比如’你在某某家公司主要作什么?测试过那些东西?测试流程是什么?’,待你回答完这些之后,继而问你测试的具体细节,手工测试、自动测试、用过那些工具?是否作过白盒测试?使用过什么操作系统?熟悉那些语言?是否作过开发?如果你肯定回答这些问题,那么还要继续问具体操作,比如你答作过白盒测试,那么招聘人会问你测了哪些东西?怎么进行的?是独立进行的还是和别人一起进行的?测试出的bug 如何处理?是否作进一步的分析?……





    负责测试技术的问完后,就由负责人事的继续发问:


    l       你的期望薪金是多少?税前还是税后?


    l       一旦录用多长时间可以来上班?


    l       你的户口在哪里?调档案是否有问题等?


    等你回答完毕,接下来他会告诉你:


    l       公司是否有试用期,试用期多长时间;


    l       试用期的薪金如何发放,其他待遇怎样处理;


    l       如果符合初试条件,多长时间之内通知复试;


    l       有无医疗保险、养老保险、失业保险、住房公基金等福利待遇。


    一般面试的会谈与过程掌控在招聘人手中,如果不想变得很被动,就要试着主动发问。不过,招聘人很少会给你机会,或者你问的不是时机,会让他很反感。只有到最后,招聘人才会说“我们的问题问完了,你有什么问题吗?”,这时你就可以放心大胆的问了,比如:


    l       公司是那年成立的?


    l       主要业务是什么?


    l       现有规模怎么样?


    l       测试组的情况怎么样?


    l       作息制度等等?


    凡是你所关心的问题都可以问。


    之后是几句寒暄的话,诸如:


    l       谢谢您来参加面试


    l       耽误您宝贵时间了


    l       我送您出门


    l       ByeBye,再见


    (注明:如果是外企公司或承包外企项目的公司,几乎整个初试将用英语进行。)


    这样,初试就结束了。一般初试后一周之内会通知你参加复试,如果没有接到通知,就不要再怀念这家公司了。假如你仍不死心,当然也可以打电话咨询一下,也许他们真的没有想好通知谁复试,也许因为你打了电话,通知复试就是你了;也许他们已经将你Pass掉了,就会委婉的告诉你,或者直截了当的告诉你。





    3.       复试


    在考试和初试综合成绩出来之后,招聘负责人决定推荐几位综合成绩好的初试者给老板(最终负责人),由其对你进行复试。谈话的内容与初试差不多,但你会觉得比较随和,因为大老板一般都很会做人,而且觉得你可能就是我们公司的员工了,所以会相对放松些。





    经过复试之后,几乎当场或者很快就会给你电话,告知你被录用了,报到时需要携带哪些证件,询问你何时能够上班?如果复试后几天都没有讯息,就不要再等了,招聘公司已经将你Pass掉了。


    (注明:不是所有公司的面试都有考试、初试、复试,但至少一次面谈是必需的)





    各位测试朋友,在经历了投递简历 、准备面试 、参加面试的三步曲之后,总会有一家适合你的公司;如果你经历了几次都没能成功,请不要气馁,也许我们与这些公司之间真的是有些偏差,比如人家要求有手机测试经验,而我们没有,就不要怀疑自己能力不行; 比如人家要求熟练使用Rational系列测试工具,我们现在不擅长,就可以向熟悉Rational工具的人学习学习。总之,无论成功、失败,我们都要保持一种谦虚、自信的态度,来面对人生中的一次又一次面试。

  • 软件测试面试试题

    2007-05-13 23:43:50

    01. 为什么要在一个团队中开展软件测试工作?

    02. 您是否了解以往所工作的企业的软件测试过程?如果了解,请试述在这个过程中都有哪些工作要做?分别由哪些不同的角色来完成这些工作?您是否了解以往所工作的企业的软件开发过程?如果了解,请试述一个完整的开发过程需要完成哪些工作?分别由哪些不同的角色来完成这些工作?(对于软件测试部分,可以简述)

    03. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)

    04. 请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?

    05. 您认为做好测试计划工作的关键是什么?您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。

    06. 您认为做好测试用例设计工作的关键是什么?请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。

    07. 您以往的工作中是否曾开展过测试用例的评审工作?如果有,请描述测试用例评审的过程和评审的内容。您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。

    08. 您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?

    09. 在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程。

    10. 您以往是否曾经从事过单元测试和集成测试?如果有,请谈一下这些工作的实际开展情况。您如何看待软件过程改进?在您曾经工作过的企业中,是否有一些需要改进的东西呢?您期望的理想的测试人员的工作环境是怎样的?

    11. 您以往工作过的企业中,是否开展了软件配置管理工作?您能否描述一下这项工作的开展情况和您对这项工作的认识?您是否熟悉一些主流的软件工程方法论和思想,如RUP、CMM、CMMI、XP、PSP、TSP。如果熟悉,您是否可以谈一下对这些方法论和思想的认识?

    12. 您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?在您以往的测试工作中,最让您感到不满意或者不堪回首的事情是什么?您是如何来对待这些事情的?

    13. 在即将完成这次笔试前,您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)
  • 空间开通了,呵呵

    2007-05-13 23:36:04

    注册了这么久第一次想起开通,以前在BLOGBUS上发的东西没人看,现在过来踩踩呵

数据统计

  • 访问量: 10978
  • 日志数: 17
  • 建立时间: 2007-05-13
  • 更新时间: 2007-06-13

RSS订阅

Open Toolbar