总是很难忘记生活的点点滴滴, 脑海中总是闪过好多的曾经, 美好的回忆, 但成长中却让我们失去了很多, 很想在忙碌的生活中淡淡忘记; 不曾放低的东西却始终让我忘记不了, 但我还要在忙碌的生活中继续生活!

发布新日志

  • 软件版本知识(合集)

    2008-08-01 09:12:46

    软件版本知识合集|emule 限制
    要了解软件,必须了解软件的一些入门知识。下面给大家讲解下软件版本号代表的知识。
    该知识对软件菜鸟很有帮助,学会该知识,等于迈进了软件殿堂的初步门槛。下面跟随笔者学?

    emule是什?,逐一了解各版本号的含义:

    版本号划分:

    V(Version):即版本,通常用数字表示版本号。(如:EVEREST Ultimate V4.20.1188beta??

    Build:用数字或日期标示版本号的异种方式。(如:VeryCD eMule V0.48a Build 071112??

    SP:Service Pack,升级包????Windows XP SP 2/Vista SP 1)

    授权和功能划分:

    Trial:试用版,通常都有时间限制,有些试用版软件还在功能上做了一定的限制。可注册或购买成为正式版??

    Unregistered:未注册??a href=http://agame.byethost16.com/147.html>emule.exe,通常没有时间限制,在功能上相对于正式版做了一定的限制。可注册或购买成为正式版??

    Demo:演示版,仅仅集成了正式版中的几个功能,不能升级成正式版??

    Lite:精简版??

    Full:完整版??

    开发阶段划分:

    α(Alpha)版:内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装??

    β(Beta)版:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装??

    γ(Gamma)版:相当成熟的测试版,与即将发行的正式版相差无几??

    RC版:Release Candidate候选版??a href=http://www.netcs.org.cn/posts/182>emule vista,处于Gamma阶段。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系??

    Final:正式版??

    语言划分??

    SC:Simplified Chinese简体中文版??

    GBK:简体中文汉字内码扩展规范版??

    TC:Traditional Chinese繁体中文版??

    BIG5:繁体中文大五码版??

    UTF8:Unicode Transformation Format 8 bit,对现有的中文系统不是好的解决方案?

      其他不太常见的版本号

    alphal 内部测试??

    beta 外部测试??

    demo 演示??

    Enhance 增强版或者加强版 属于正式??

    Free 自由??

    Full version 完全??属于正式??

    shareware 共享??

    Release 发行??有时间限??

    Upgrade 升级??

    Retail 零售??

    Cardware 属共享软件的一??a href=http://agame.byethost16.com/466.html>emule电驴下载,只要给作者回复一封电邮或明信片即可。(有的作者并由此提供注册码等),目前这种形式已不多见??

    Plus 属增强版,不过这种大部分是在程序界面及多媒体功能上增强??

    Preview 预览??

    Corporation &Enterprise 企业??

    Standard 标准??

    Mini 迷你版也叫精简版只有最基本的功??

    Premium 贵价??

    Professional 专业??

    Express 特别??

    Deluxe 豪华??

    Regged 已注册版

    CN 简体中文版

    CHT 繁体中文??

    EN 英文??

    Multilanguage 多语言??

    Rip 是指从原版文件(一般是指光盘或光盘镜像文件)直接将有用的内容(核心内容)分离出??table align=center border=0 width=480 cellspacing=0 cellpadding=0>emule lowid,剔除无用的文档,例如PDF说明文件啊,视频演示啊之类的东西,也可以算做是精简版吧…但主要内容功能是一点也不能缺少的!
    另:DVDrip是指将视频和音频直接从DVD光盘里以文件方式分离出来??

    trail 试用版(含有某些限制,如时间、功能,注册后也有可能变为正式版??

    RC 版。是 Release Candidate 的缩写,意思是发布倒计时,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改??

    RTM 版。这基本就是最终的版本,英文是 Release To Manufactur,意思是发布到生产商??

    Original Equipment Manufacturer (OEM) :OEM软件是给电脑生产厂的版本

      Full Packaged Product (FPP)–Retail

    FPP就是零售版(盒装软件),这种产品的光盘的卷标都带??quot;FPP"字样,比如英文WXP Pro的FPP版本的光盘卷标就是WXPFPP_EN,其中WX表示是Windows XP,P是Professional(H是Home),FPP表明是零售版本,EN是表明是英语。获得途径除了在商店购买之外,某些MSDN用户也可以得到??

    Volume Licensing for Organizations (VLO)

    团体批量许可证(大量采购授权合约),这是为团体购买而制定的一种优惠方式。这种产品的光盘的卷标都带有"VOL"字样,取"Volume"??个字母,以表明是批量,比如英文WXP Pro的VOL版本的光盘卷标就是WXPVOL_EN,其中WX表示是Windows XP,P是Professional(VOL没有Home版本),VOL表明是团体批量许可证版本,EN是表明是英语。获得途径主要是集团购买,某些MSDN用户也可以得到?

     

  • 游戏测试过程(转)

    2008-08-01 09:08:13

    一.游戏测试与开发过程的关系
    CMM(Software Capability Maturity Model)软件成熟模型,大家都比较熟悉了,但在实施的过程中却存在这样那样的问题,对于游戏开发就更没有一个固定的路可以讲了,我们的团队是一个长期的游戏开发团队,对游戏开发有着很深的认识,我们认为游戏的Process(过程)实际上也是软件过程,不过是特殊的游戏软件开发过程,各个生命周期还是相通的。所以我们总结一套以测试作为质量驱动的、属于自己的开发过程。下图是游戏的迭代式开发过:

    由于网络游戏的生命周期也是3、4年,所以采用迭代式的开发过程,既可以适应网络游戏本身这种长周期的开发,又可以利用RUP的迭代式开发的优点与CMM的里程碑控制,从而达到对游戏产品的全生命周期的保证。

    在游戏开发过程中,通用软件的需求分析阶段被策划所代替,但起的作用是一样的,明确游戏的设计目标(包括风格,游戏玩家群),游戏世界的组成,为后期的程序设计,美工设计,测试提出的明确的要求。由于开发是一个阶段的过程,所以测试与开发的结合就比较容易,从图上我们可以看到测试的工作与游戏的开发是同步进行的,每一个开发阶段中测试都进行了参与,能够深入的了解到系统的整体与大部分的技术细节,从而从很大程度上提高了测试人员对错误问题判断的准确性,并且可以有效的保证重要游戏系统的稳定。

    二.游戏策划与测试计划
    测试过程不可能在真空中进行。如果测试人员不了解游戏是由那几个部分组成的,那么执行测试就非常的困难,同时测试计划可以明确测试的目标,需要什么资源,进度的安排,通过测试计划,既可以让测试人员了解此次游戏测试中那些是测试重点,又可以与产品开发小组进行交流。在企业开发中,测试计划书来源于需求说明文档,同样在游戏开发过程中,测试计划的来源则是策划书。策划书包含了游戏定位,风格,故事情节,要求的配制等等。在策划评审中我们的高级测试人员可以参与进来,得到详细的游戏策划书,从里面了解到游戏的组成,可玩性,平衡(经济与能力),与形式(单机版还是网络游戏),而我们测试在这一阶段主要的事情就是通过策划书来制定详细的测试计划,主要分两个方面一是游戏程序本身的测试计划,比如任务系统,聊天,组队,地图等等由程序来实现的功能测试计划,二是游戏可玩性有测试计划,比如经济平衡标准是否达到要求,各个门派技能平衡测试参数与方法,游戏风格的测试,三是关于性能测试的计划,比如客户端的要求,网络版的对服务器的性能要求。同时测试计划书中还写明了基本的测试方法,要设计的自动化工具的需求,为后期的测试打下良好的基础。同时由于测试人员参与到策划评审,资深的游戏测试人员与产品经理由于对游戏也有很深入的了解,会对策划提出自己的看法,包含可玩性,用户群,性能要求等等并形成对产品的风险评估分析报告,但这份报告不同于策划部门自己的风险分析报告,主要从旁观者的角度对游戏本身的品质作充分的论证,从而更有效的对策划起到控制的作用。

    三.游戏设计与测试
    设计阶段是做测试案例设计的最好时机。很多组织要么根本不做测试计划和测试设计,要么在即将开始执行测试之前才飞快地完成测试计划和设计。在这种情况下,测试只是验证了程序的正确性,而不是验证整个系统本该实现的东西。而我们的测试则会很明确,因为我们的测试计划已经写的很明确,需要测试那些游戏系统,但是我们还需要了解系统的组成,而设计阶段则是设计系统的过程,所有的重要系统均是用UML状态图进行了详细的描述,比如用户登陆情况。

    在我们的团队中资深的测试人员要具备的一项基本的素质就是可以针对UML的用例图,时序图,状态图来设计出重要系统的测试案例,只有重要系统的质量得到充分的测试,游戏程序的质量才可以得到充分的保证。比如上图中就是一个用户登陆游戏系统的时序图。从这里我们可以很明确的了解玩家是如何验证并登陆系统的,在这个过程中要与那些对象进行交互,比如这里我们就是三个系统之间的交互,客户端(玩家部分),网关,账号服务之间的一个时序变化关系,为了能够完整的对这个流程进行测试,我们必需设计出可以覆盖整个流程的测试案例,并考虑其中可能的非法情况,因为这个时序图只是考虑了用户正常登陆成功的情况,并没有考虑密码错误,通信失败等许多可能存有的情况,并形成完整的测试案例库,从而对登陆系统的系统化测试做了充分的准备。同时通过这张图,性能分析人员还可以分析出可能存的性能瓶颈,比如这里可能有的瓶颈如下,总网关是否可以达到多少用户的并发,是如果达不到,是否可以采用分布式部署或是支持负载平衡,三者之间的网络带宽的比例分配,账号服务器是否可以承载多个网关的连接请求,最大连接请求可以达到多少等等,同时会针对这些风险做性能测试的设计,并提出自动化测试的需求,比如模拟玩家登陆的压力工具等等。
     
    四. 游戏测试过程
     
    同时在设计评审时,测试人员的介入可以充分的对当前的系统构架发表自己的意见,由于测试人员的眼光是最苛刻的,并且有多年的测试经验,可以比较早的发现曾经出现的设计上的问题,比如在玩家转换服务器时是否作了事务的支持与数据的校验,在过去设计中由于没有事务支持与数据的校验从而导致玩家数据丢失,而这些风险可以在早期就规避掉。上面所说的是对游戏程序本身的测试设计,对于游戏情节的测试则可以从策划获得,由于前期的策划阶段只是对游戏情节大方向上的描述,并没有针对某一个具体的情节进行设计,进入设计阶段时,某个游戏情节逻辑已经完整的形成了,策划可以给出情节的详细设计说明书,称为任务说明书,通过任务说明书我们可以设计出任务测试案例,比如某一个门派的任务由那些组成,我们可以设计出完整的任务测试案例,从而保证测试可能最大化的覆盖到所有的任务逻辑,如果是简单任务,还可以提出自动化需求,采用机器人自动完成。

    游戏测试与开发
    开发与测试一直有人认为是不可以平行进行的,必需要先开发后测试,但是软件的开发过程又要求测试必须早期介入,但在这里这种矛盾得到了很好的解决。我们采用了每日编译,将测试执行和开发结合在一起,并在开发阶段以编码--测试--编码--测试的方式来体现。也就是说,程序片段一旦编写完成,就会立即进行测试。普通情况下,先进行的测试是单元测试,但是一个程序片段也需要相关的集成测试,甚至有时还需要一些特殊测试。特别是关于接口测试,像游戏程序与任务角本、图片的结合,大家都认为需要提前测试,通过每日编你可以把已经写好的程序片段接合起来,形成部分的集成测试,从而有效的体现的接口优先测试的原则。同时由于软件测试与开发是并行进行的,并且实行的是软件缺陷优先修改的策略,所以很少会出现缺陷后期无法修改的情况,并且由于前期的测试案例的设计与自动化工具的准备,我们不需要投入太多的人力就可以极高的保证游戏软件的产品质量,特别是重要系统的质量。由于我们的游戏程序是每日不断的完善,所以集成测试也在同步的进行之中,当开发进入最后阶段时,集成测试也同步的完成了。这里有一个原则,也就是我前面所说的,测试的主体方法和结构应在游戏设计阶段完成,并在开发阶段进行补充(比如在游戏开发中会有相应的变动,或是某个转移变地址的变化,这就需要实时的更新)。这种方法会对基于代码的测试(开发阶段与集成阶段)产生很重要的影响,但是不管在那个阶段,如果在执行前多做一点计划和设计,都会大幅度的提高测试效率,改善测试结果,同时还有利于测试案例的重用与测试数据的分析,所以我们的测试计划是在策划时就形成了,为后继的测试形成了良好的基础。

    集成测试阶段
    集成测试是对整个系统的测试。由于前期测试与开发的并行,集成测试已经基本完成,这时只需要对前期在设计阶段中设计的系统测试案例运行一下就OK了。我们主要的重心在集成测试中的兼容性测试,由于游戏测试的特殊性,对兼容性的要求特别高,所以我们采用了外部与内部同部进行的方式,内部我们有自己的平台试验室,搭建主流的硬软件测试环境,同时我们还通过一些专业的兼容性测试机构对我们的游戏软件做兼容性分析,让我们的游戏软件可以跑在更多的机器上。

    游戏可玩性测试
    游戏可玩性测试也是非常重要的一块,主要包含四个方面:

    1.游戏世界的搭建,包含聊天功能,交易系统,组队等可以让玩家在游戏世界交互的平台。

    2.游戏世界事件的驱动,主要指任务。

    3.游戏世界的竞争与平衡。

    4.游戏世界文化蕴涵,游戏的风格与体现。

    这种测试主要体现在游戏可玩性方面,虽然策划时我们对可玩性作了一定的评估,但这是总体上的,但一些具体的涉及到某个数据的分析,比如PK参数的调整,技能的增加等一些增强可玩性的测试则需要职业玩家对它进行分析,这里我们主要通过三种方式来进行:

    1.内部的测试人员,他们都是精选的职业玩家分析人员,对游戏有很深的认识,在内部测试时,对上面的四点进行分析。

    2.利用外部游戏媒体专业人员对游戏作分析与介绍,既可以达到宣传的效果,又可以达到测试的目的,通常这种方式是比较好的。

    3.利用外部一定数量的玩家,对外围系统的测试,他们是普通的玩家,但却是我们最主要的目标,主要的来源是大中院校的学生等等,主要测试游戏的可玩性与易用性,发现一些外围的Bug。

    4.游戏进入到最后阶段时,还要做内测,公测,有点像应用软件的beta版的测试,让更多的人参与测试,测试大量玩家下的运行情况。

    可玩性测试是游戏最重要的一块,只有玩家的认同,我们才可能成功。

    性能测试与优化
    最后要单独提一下的是性能优化,在单机版的时代,性能的要求并不是很高,但是在网络版的时代,则是两个完全不同的概念,主要包含了以下几个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。不过在测试过程中有这样一个原则,就是由于测试是在集成测试完成或接近完成时进行,要求测试的功能点能够走通,这时你首先要进行优化的是数据库或是网络本身的配制,只有这样才可以规避改动程序的风险。同时性能的测试与优化是一个逐步完善的过程,需要前期的很多的工作,比如性能需求,测试工具等等,不过由于前期工作的完善,这些都在前期完成了。这里我只做原则性的描述。

    数据库的优化的原则主要是这样的,首先是索引进行优化,由于索引的优化不需要对表结构进行任何改动,是最简单的一种,又不需要改动程序就可能提升性能若干倍,不过要注意的是索引不是万能的,若是无限的增加会对增删改造成很大的影响。其次是对表,视图,存储过程的优化。不过在分析之前需要知道优化的目标,客户行为中那些SQL是执行的最多的,所以我们必需借助些SQL的跟踪分析工具,例如SQLProfile,SQLExpert,等工具,这样会迅速的定位问题。

    关于网络的优化,这里我所说的并不是针对网络本身的优化,而是对游戏本身的网络通信的优化,所以它是与程序的优化是结合在一起的,首先也是发现问题,通过Monitor与Sniff先定位是什么应用占用了较多的网络流量,由于网络游戏的用户巨大,所以这也是一个重在的问题。对于程序的性能优化,最主要的是找到运行时间最长的函数,只有优化它,性能才有大幅度的提升,具体的方法我就不做详细的描述了。

    总述
    游戏测试是一个新的领域,它既有通用测试的特点,又有自己的特点,有许多未知的路要走,每天都在总结,希望给大家带来一些帮助,同时在这里也谢谢所有支持我的同事。
     
     

  • 测试工程师如何规划自己的职业生涯(转载)

    2008-07-29 17:32:07

    测试工程师如何规划自己的职业生涯(转载)
    初级测试工程师––入门级,具有一些手工测试经验,开发测试脚本并开始熟悉测试生存周期和测试技术;
         测试工程师––能够独立编写自动测试脚本程序并担任测试编程初期的领导工作,进一步拓展编程语言、操作系统、网络与数据库方面的技能;
         高级测试工程师––帮助开发或维护测试或编程标准与过程,负责同级的评审,并能够指导初级的测试工程师;
         Team Leader––一般具有5年左右工作经验,负责管理一个小团队。负责进度安排、工作规模/成本估算、按进度表和预算目标交付产品,负责开发项目的技术方法,能够为用户提供支持与演示;
         测试经理––能够担当测试领域内的整个开发生存周期业务,能够为用户提供交互和大量演示,负责项目成本、进度安排、计划和人员分工;
          计划经理––具有多年纯熟的开发与支持(测试/质量保证)活动方面的经验,管理从事若干项目的人员以及整个开发生存周期,负责把握项目方向与盈亏责任。

    职业规划:
    1.第一阶段,学习自动化测试工具,学会编写脚本;
    2.第二阶段,学习编写测试计划,测试方案,测试用例;
    3.第三阶段,学习配置管理,版本控制,项目管理,bug管理;
    4.第四阶段,转向做一个管理者.

          每个人选择测试工程师职位的原因不尽相同.为了以后转开发积累经验的的,为了入门简单的,为了不加班的,有看好职业前景的,等等,..
    技术方向就沿着测试开发的路一直走下去.最终成为技术上的大拿,在一个公司里成为核心技术人员
    这个方向对技术的积累要求最高,适于那些对管理没什么兴趣,就想专心做技术的人。要沿着这条路走下去,需要一直不断地在开发能力上的积累,并且还要求一定的知识广度和对职业的独特理解。
    管理方向呢,工作个几年以后转向测试经理,以后的发展就多样了,质量总监\项目经理等等
    有些人说做管理不需要技术,却没想过作过一个技术工作,自己都不会的东西怎么去管理别人,当然也有例外,有些管理人员也的确是靠自己的人格魅力去让一个团队健康发展的。不过那只是极少数罢了。大多数测试管理人员也是需要在技术上有一定积累的。而且对于所有工作都一定要比较熟悉,黑白盒,自动化,性能,用例设计,配置管理,计划方案的设计等等,并且还要去调合团队内部的工作氛围,制定适当的激励机制,作为一个管理者绝不比一个技术人员需要积累的东西少。
    而流程控制大概是选的人最少的,QA累死不讨好,最终成为一代终极流程控制顾问
    这一类工作需要有非常大的耐心和自信,需要在工作中对流程控制方面有自己的感悟,需要对理论很熟悉。对人的毅力也是个极大的考验呢
    其他的,还有做用例做到极至,做功能测试做到极至,做用户体验做到极至的等等,总之各种发展方向者需要努力的坚持,任何一个方向做好了都很好。

    如果你是测试员或是高级测试员,有志转向管理发展,那么需要加强以下几点:
    1. 测试计划的编写(要结合测试的项目,能以此来控制和确定测试所需人员,设备及时间来管理测试时间)
    2. 要熟悉BUG跟踪工具及软件测试流程.(如: TD, Bugzilla, CQ等)
    3. 要熟悉配置管理工具. (如: CVS, VSS等)
    4. 要熟悉自动化工具.(例如:WinRunner, QTP, Robot, RFT, Automation等,能结合录制完的脚本编写代码)
    5. 要熟悉压力及性能测试工具.(例如: LoadRunner, webload, silkperformance等,能结合相关数据,分析出性能瓶颈)
    6. 要熟悉或精通一门语言. (例如: Java, C++)
    7. 要熟悉数据库.(例如: Oracle, DB2, SQLServer, MySQL)
    8. 要熟悉主流操作系统. (例如: HP Unix, IBM AIX, Sun Solaris, Red Hat Linux, SuSE Linux, Windows)
    9. 能用英文流利的和老外交流以及往来Email.
    10. 语言表达能力强,表达问题清晰明了.
    11. 沟通能力强,能和上级/开发经理很好的达成测试相关/BUG事宜.
    12. 学习技术的能力要强,能快速上手一个新的技术.
    13. 乐于与人交流.

    初级测试工程师:刚走出大学校门或者刚从些培训机构出来的学员,之前没有或具备很少的测试经验,这个阶段主要是掌握最基本的测试方法、测试计划、测试用例、测试报告、环境搭建等。北京上海地区,该职位薪水一般在2000-5000之间。
    中级测试工程师:从事过2-3年实际工作的测试工程师,能够独立制定测试计划,编写测试用例,对初级测试工程师进行指导等。北京上海地区,该职位薪水一般在4000-6000之间。
    达到中级测试工程师水准后,以后的发展可以存在多种方向:
    管理方向:
    测试组长:一般5人以下团队,能够同时承担2-3个较小项目(程序代码在5000行以下)或者1个中、大型项目(程序代码在5000行-25000行左右)。北京上海地区,该职位薪水一般在5000以上,好的过万。
    测试经理:可以管理多个小型测试团队,能够承担多个中型及较大型项目的测试,及具备至少1个大型项目(程序代码在25000行以上)的测试管理能力。该职位薪水一般过万,年薪二三十万正常。
    质量经理/项目管理:跳出测试的执行转而关注过程。SQA待遇差别比较大,但有2年以上测试或开发经验的人5000以上应该没问题,好的也过万。
    技术方向:
    白盒测试:这个由开发人员转过来的比较多,一般技术上要至少达到技术经理的水准。待遇比较好,一般7k以上,好的年薪二三十万。
    自动化测试方向:熟练使用一种以上自动化测试工具,做的好的待遇与白盒测试有的一拼,一般6k以上,不过最近学的人多了,待遇贬值可能比较快。
    测试分析师/技术总监:主要职责是对系统的测试结果进行综合的分析,例如缺陷分析、性能分析等。不但测试技术能力较强,还要具备数据库、操作系统等多方面的技术知识。这个待遇一般过万了吧.
    行业测试专家:物以稀为贵,过万一般问题不大。
    经历了以上一些阶段,大概在35岁左右,职业发展上基本达到瓶颈,此时只要混的不是很差收入一般可以算的上中产阶级,日子可能依然过的比较郁闷,之后的方向可能有做培训,咨询,自己开公司创业等。
    好了,暂时先罗嗦这么多,具体的发展路线嘛各位八仙过海各显神通了!~

    入测试行已有五、六年,谈谈自己的规划和一些想法:
    一、自己的规划:
        做了几年之后,积累的了一些行业经验(电子商务型,电信通信行业)和管理经验(指的是测试管理),毕竟是女孩,这么多年一直都在不断地学习各种技术,总怕落后。时间长了,感觉还是很累,感觉比做开发累。所以将来的方向是:走管理路线。(当然这条线也不好走,但是做了2年管理后,感觉在这方面有一定能力,只要努力就一定会成功的)
    做好测试:主动性强,有信心,能听取接纳别人的意见。( 自己悟出的)
    二、对于测试新手来说,如何入行,需要具备的知识和能力
    1、测试的基础理论知识,知道测试流程是什么?测试的常用的文档有哪些,该如何编写?测试方法有哪些?
    方法:去一些测试论坛(如:51testing,测试时代,3atesting,一起测试网等)找些资料来学习。或者买一些测试的书籍。再有也可以参加测试培训。
    2、要熟悉或精通一门语言. (例如: Java, C++,.net,VB,PB,Dephi),做到能读懂代码。当然能独立编写代码更好。
    方法:学习一种比较流行的语言即可,因为时间有限不可能学很多开发语言。学习的过程一定要给自己制订时间计划,而且语言这东西最好结合实例来学习,主要学习设计思路。
    3、要熟悉BUG跟踪工具.(如: TD, Bugzilla, CQ等),学习一种即可,主要能领悟出bug的处理流程是什么,如何管理。
    方法:到网上看资料,装上工具适用。
    4.  要熟悉配置管理工具. (如: CVS, VSS等),会一种即可,当然有时间的话,2种工具都会更好。
    5.  精通OFFice系列工具,排版能力强。测试中经常会写文档,所以这方面要强。
    6、 要熟悉数据库.(例如: Oracle, DB2, SQLServer, MySQL),对一种数据库精通就可以了。
    7、要熟悉主流操作系统. (例如:  Red Hat Linux, Windows)
    8、需要增强的能力:
    学习能力强;表达能力强;耐心,细心,信心,责任心;能承受压力;沟通能力强。
    以上这些,都是需要下功夫的,不能做表面功夫,那样的话,就算你入行后,会发现自己要学的东西会很多。
    三、入行后,要学习的知识和能力:
    1 、公司的文化和制度
    2、熟悉业务,这块很重要,需要认真对待。
    3、熟悉公司的开发流程和测试流程。
    4、业务熟悉后,将自己所学的知识运用到实际工作中。提高自己的测试水平。
    5、培养自己的沟通能力,与业务相关的所有人都能很好的沟通。
    6、工作中遇到的问题及解决措施要及时总结整理。
    7、针对公司的项目或产品选择适合的自动测试工具,帮助公司提高测试效率。
    这一阶段重在:熟悉业务,熟悉工作流程
    四、入行半年——1年后,要学习的知识和能力
    1)提高编写用例的技巧。
    2)熟悉一种单元测试工具。(针对公司的项目或产品使用的开发语言而定)
    如果公司这块一直都是开发人员来做,暂且跳过。
    3)熟悉一到两种自动化工具。(功能类和性能类的,如:WR,QTP,LR,ROBOT等)
    建议:学习工具的话,一定要结合实际的项目,这样学得快而且效果比较好。
    4)熟悉一种测试管理工具。
    (呵呵,为以后做测试管理者打算)
    5)了解新业务,开发的新技术。
    这个阶段的重点:就是提高自己编写用例的水平,工具的使用。
    五、 多年以后,相信自己都自己的目标了。
    1)如果做专职的性能测试工程师:精通一种性能测试工具,并能分析出瓶颈。(这点我没做到)(这些需要提高多方面的知识:服务器,中间件,开发,数据库等)
    2)如果做自动化测试工程师,精通一种自动化工具,并能独立编写脚本,了解一些最新自动化测试方面的技术。
    3)测试管理者。(技术+管理),哪方面薄弱就补哪块。多多听取别人的意见,改进自己身上的缺点。
       不管做任何事,都要有目标。

  • 软件测试技术总结(强烈推荐)

    2008-07-29 17:15:21


     软件测试是指使用人工或者自动的手段来运行或测定某个软件产品系统的过程,其目的是在于检验是否满足规定的需求或者弄清预期的结果与实际结果的区别。本文主要描述软件测试的类型。
    1 数据和数据库完整性测试
    数据与数据库完整测试是指测试关系型数据库完整性原则以及数据合理性测试。
    数据库完整性原即:
    主码完整性:主码不能为空;
    外码完整性:外码必须等于对应的主码或者为空。
    数据合理性指数据在数据库中的类型,长度,索引等是否建的比较合理。
    在项目名称中,数据库和数据库进程应作为一个子系统来进行测试。在测试这些子系统时,不应将测试对象的用户界面用作数据的接口。对于数据库管理系统 (DBMS),还需要进行深入的研究,以确定可以支1持测试的工具和技术。
    比如,有两张表:部门和员工。部门中有部门编号,部门名称,部门经理等字段,主码为部门编号;员工表中有员工编号,员工所属部门编号,员工名称,员工类型等字段,主码为员工编号,外码为员工所属部门编号,对应部门表。如果在某条部门记录中部门编号或员工记录员工编号为空,他就违反主码完整性原则。如果某个员工所属部门的编号为##,但是##在部门编号中确找不到,这就违反外码完整性原则。
    员工类型如下定义:0:职工,1:职员,2:实习生。但数据类型为Int,我们都知道Int占有4个字节,如果定义成char(1).就比原来节约空间。

    2 白盒测试
    白盒测试是基于代码的测试,测试人员通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理在程序员开发中来实现。白盒测试分为动态白盒测试和静态白盒测试
    2.1 静态白盒测试
    利用眼睛,浏览代码,凭借经验,找出代码中的错误或者代码中不符合书写规范的地方。比如,代码规范中规定,函数必须为动宾结构。而黑盒测试发现一个函数定义如下:
    Function NameGet(){
    ….
    }
    这是属于不符合开发规范的错误。
    有这样一段代码:
    if (i<0) & (i>=0)

    这段代码交集为整个数轴,IF语句没有必要
    I=0;
    while(I>100){
    J=J+100;
    T=J*PI;
    }
    在循环体内没有I的增加,bug产生。
    2.2 动态白盒测试
    利用开发工具中的调式工具进行测试。比如一段代码有4个分支,输入4组不同的测试数据使4组分支都可以走通而且结果必须正确。
    看一段代码
    if(I<0){
    P1
    }else{
    P2
    }
    在调试中输入I=-1,P1程序段通过, P2程序段未通过,属于动态黑盒测试的缺陷

    3.功能测试
    功能测试指测试软件各个功能模块是否正确,逻辑是否正确。
    对测试对象的功能测试应侧重于所有可直接追踪到用例或业务功能和业务规则的测试需求。这种测试的目标是核实数据的接受、处理和检索是否正确,以及业务规则的实施是否恰当。此类测试基于黑盒技术,该技术通过图形用户界面 (GUI) 与应用程序进行交互,并对交互的输出或结果进行分析,以此来核实应用程序及其内部进程。功能测试的主要参考为类似于功能说明书之类的文档。
    比如一个对电子商务系统,前台用户浏览商品-放入购物车-进入结账台,后台处理订单,配货,付款,发货,这一系列流程必须正确无误的走通,不能存在任何的错误。

    4.UI测试
    UI测试指测试用户界面的风格是否满足客户要求,文字是否正确,页面美工是否好看,文字,图片组合是否完美,背景是否美观,操作是否友好等等
    用户界面 (UI) 测试用于核实用户与软件之间的交互。UI 测试的目标是确保用户界面会通过测试对象的功能来为用户提供相应的访问或浏览功能。另外,UI 测试还可确保 UI 中的对象按照预期的方式运行,并符合公司或行业的标准。包括用户友好性,人性化,易操作性测试。UI测试比较主观,与测试人员的喜好有关
    比如:页面基调颜色刺眼;用户登入页面比较难于找到,文字中出现错别字,页面图片范围太广等都属于UI测试中的缺陷,但是这些缺陷都不太严重。

    5.性能测试
    性能测试主要测试软件测试的性能,包括负载测试,强度测试,数据库容量测试,基准测试以及基准测试
    5.1负载测试
    负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。
    在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如,响应时间、事务处理速率和其他与时间相关的方面。
    比如,在B/S结构中用户并发量测试就是属于负载测试的用户,可以使用webload工具,模拟上百人客户同时访问网站,看系统响应时间,处理速度如何?
    5.2强度测试
    强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。这类测试往往可以书写系统要求的软硬件水平要求。
    实施和执行此类测试的目的是找出因资源不足或资源争用而导致的错误。如果内存或磁盘空间不足,测试对象就可能会表现出一些在正常条件下并不明显的缺陷。而其他缺陷则可能由于争用共享资源(如数据库锁或网络带宽)而造成的。强度测试还可用于确定测试对象能够处理的最大工作量。
    比如:一个系统在内存366M下可以正常运行,但是降低到258M下不可以运行,告诉内存不足,这个系统对内存的要求就是366M。
    5.3数据库容量测试
    数据库容量测试指通过存储过程往数据库表中插入一定数量的数据,看看相关页面是否能够及时显示数据。
    数据库容量测试使测试对象处理大量的数据,以确定是否达到了将使软件发生故障的极限。容量测试还将确定测试对象在给定时间内能够持续处理的最大负载或工作量。例如,如果测试对象正在为生成一份报表而处理一组数据库记录,那么容量测试就会使用一个大型的测试数据库,检验该软件是否正常运行并生成了正确的报表。做这种测试通常通过书写存储过程向数据库某个表中插入一定数量的记录,计算相关页面的调用时间。
    比如,在电子商务系统中,通过insert customer 往user表中插入10 000数据,看其是否可以正常显示顾客信息列表页面,如果要求达到最多可以处理100 000个客户,但是顾客信息列表页面不能够在规定的时间内显示出来,就需要调整程序中的SQL查询语句;如果在规定的时间内显示出来,可以将用户数分别提高到20 000 , 50 000, 100 000进行测试。
    5.4基准测试
    基准测试与已知现有的系统进行比较,主要检验是否与类似的产品具有竞争性的一种测试。
    如果你要开发一套财务系统软件并且你已经获得用友财务系统的性能等数据,你可以测试你这套系统,看看哪些地方比用友财务系统好,哪些地方差?以便改进自己的系统,也可为产品广告提供数据。
    5.5竞争测试
    软件竞争使用各种资源(数据纪录,内存等),看他与其他相关系统对资源的争夺能力。比如:一台机器上即安装您的财务系统,又安装用友财务系统。当CPU占有率下降后,看看是否能够强过用友财务系统,而是自己的系统能够正常运行?


    6. 安全性和访问控制测试
    安全性和访问控制测试侧重于安全性的两个关键方面:
    应用程序级别的安全性,包括对数据或业务功能的访问
    系统级别的安全性,包括对系统的登录或远程访问。
    6.1应用程序级别的安全性
    可确保:在预期的安全性情况下,主角只能访问特定的功能或用例,或者只能访问有限的数据。例如,可能会允许所有人输入数据,创建新账户,但只有管理员才能删除这些数据或账户。如果具有数据级别的安全性,测试就可确保“用户类型一”能够看到所有客户消息(包括财务数据),而“用户二”只能看见同一客户的统计数据。
    比如B/S系统,不通过登入页面,直接输入URL,看其是否能够进入系统?
    6.2系统级别的安全性
    可确保只有具备系统访问权限的用户才能访问应用程序,而且只能通过相应的网关来访问。
    比如输入管理员账户,检查其密码是否容易猜取,或者可以从数据库中获得?

    7.故障转移和恢复测试
    故障转移和恢复测试指当主机软硬件发生灾难时候,备份机器是否能够正常启动,使系统是否可以正常运行,这对于电信,银行等领域的软件是十分重要的。
    故障转移和恢复测试可确保测试对象能成功完成故障转移,并能从导致意外数据损失或数据完整性破坏的各种硬件、软件或网络故障中恢复。
    故障转移测试可确保:对于必须持续运行的系统,一旦发生故障,备用系统就将不失时机地“顶替”发生故障的系统,以避免丢失任何数据或事务。
    恢复测试是一种对抗性的测试过程。在这种测试中,将把应用程序或系统置于极端的条件下(或者是模拟的极端条件下),以产生故障(例如设备输入/输出 (I/O) 故障或无效的数据库指针和关健字)。然后调用恢复进程并监测和检查应用程序和系统,核实应用程序或系统和数据已得到了正确的恢复。一定要注意主备定时备份
    比如电信系统,突然主机程序发生死机,备份机器是否能够启动,使系统能够正常运行,从而不影响用户打电话?

    8.配置测试
    又叫兼容性测试。配置测试核实测试对象在不同的软件和硬件配置中的运行情况。在大多数生产环境中,客户机工作站、网络连接和数据库服务器的具体硬件规格会有所不同。客户机工作站可能会安装不同的软件例如,应用程序、驱动程序等而且在任何时候,都可能运行许多不同的软件组合,从而占用不同的资源。(如浏览器版本,操作系统版本等)
    下面列出主要配置测试
    8.1浏览器兼容性
    测试软件在不同产商的浏览器下是否能够正确显示与运行;
    比如测试IE,Natscape浏览器下是否可以运行这套软件?
    8.2操作系统兼容性
    测试软件在不同操作系统下是否能够正确显示与运行;
    比如测试WINDOWS98,WINDOWS 2000,WINDOWS XP,LINU, UNIX下是否可以运行这套软件?
    8.3硬件兼容性
    测试与硬件密切相关的软件产品与其他硬件产品的兼容性,比如该软件是少在并口设备中的,测试同时使用其他并口设备,系统是否可以正确使用.
    比如在INTER,舒龙CPU芯片下系统是否能够正常运行?
    这样的测试必须建立测试实验室,在各种环境下进行测试。

    9.安装测试
    安装测试有两个目的。第一个目的是确保该软件在正常情况和异常情况的不同条件下: 例如,进行首次安装、升级、完整的或自定义的安装_都能进行安装。异常情况包括磁盘空间不足、缺少目录创建权限等。第二个目的是核实软件在安装后可立即正常运行。这通常是指运行大量为功能测试制定的测试。
    安装测试包括测试安装代码以及安装手册。安装手册提供如何进行安装,安装代码提供安装一些程序能够运行的基础数据。

    10.多语种测试
    又称本地化测试,是指为各个地方开发产品的测试,如英文版,中文版等等,包括程序是否能够正常运行,界面是否符合当地习俗,快捷键是否正常起作用等等,特别测试在A语言环境下运行B语言软件(比如在英文win98下试图运行中文版的程序),出现现象是否正常。
    本地化测试还要考虑:
    l 当语言从A翻译到B,字符长度变化是否影响页面效果。比如中文软件中有个按键叫“看广告”,翻译到英文版本中为 “View advertisement”可能影响页面的美观程度
    l 要考虑同一单词在各个国家的不同意思,比如football在英文中为足球,而美国人使用中可能理解为美式橄榄球。
    l 要考虑各个国家的民族习惯,比如龙个美国中被理解邪恶的象征,但翻译到中国,中国人认为为吉祥的象征。

    11.文字测试
    文字测试测试软件中是否拼写正确,是否易懂,不存在二义性,没有语法错误;文字与内容是否有出入等等,包括图片文字。
    比如:“比如,请输入正确的证件号码!”何谓正确的证件号码,证件可以为身份证,驾驶证,也可为军官证,如果改为“请输入正确的身份证号码!”用户就比较容易理解了。

    12.分辨率测试
    测试在不同分辨率下,界面的美观程度,分为800*600,1024*768,1152*864,1280*768,1280*1024,1200*1600大小字体下测试。一个好的软件要有一个极佳的分辨率,而在其他分辨率下也都能可以运行。

    13发布测试
    主要在产品发布前对一些附带产品,比如说明书,广告稿等进行测试
    13.1说明书测试
    主要为语言检查,功能检查,图片检查
    语言检查:检查说明书语言是否正确,用词是否易于理解;
    功能检查:功能是否描述完全,或者描述了并没有的功能等;
    图片检查::检查图片是否正确
    13.2宣传材料测试
    主要测试产品中的附带的宣传材料中的语言,描述功能,图片
    13.3帮助文件测试
    帮助文件是否正确,易懂,是否人性化。最好能够提供检索功能。
    13.4广告用语
    产品出公司前的广告材料文字,功能,图片,人性化的检查


    14 文档审核测试
    文档审核测试目前越来越引起人们的重视,软件质量不是检查出来的,而是融进软件开发中来。前置软件测试发越来越受到重视。请看一个资料:
    文档审核测试主要包括需求文档测试,设计文档测试,为前置软件测试测试中的一部分。
    14.1需求文档测试
    主要测试需求中是否存在逻辑矛盾以及需求在技术上是否可以实现;
    14.2设计文档测试
    测试设计是否符合全部需求以及设计是否合理。

    总结
    据美国软件质量安全中心2000年对美国一百家知名的软件厂商统计,得出这样一个结论:软件缺陷在开发前期发现比在开发后期发现资金,人力上节约90%;软件缺陷在推向市场前发现比在推出后发现资金,人力上节约90%。所以说软件的缺陷应该尽早发现。不是所有的软件都要进行任何类型的软件测试的,可以根据产品的具体情况进行组装测试不同的类型。

  • 在深圳找工作的经历(转载)

    2008-07-28 09:30:09

       看了丝路飞洋及jennice在这里开贴写找工作经历,我也来效仿一下,
    讲讲我最近找工作的经历。

      先大致介绍一下我。2000年会计学本科毕业,先是在老家的省城一个事业单位做了一年半的会计,主要是管理固定资产、住房公积金及一些费用,实际上没有什么工作经验的。后来因种种原因,我于2001年11月中旬来到了深圳。

      第一份工作找得还算艰辛,当时是想在关内找,结果面试了N多单位,全是些小公司,都认为我没有全盘经验,没戏啊。所以我后来将目标移至了关外。面试关外的第一家公司,居然是有很漂亮的厂房且装修考究,而且会计主管一看我是本科学历,立马拍板要了我。从开始找到我去上班一共用了20天,相对而言还算正常吧。

      这个公司是民营,生产电子产品的,财务分工较细,我是做AP的,每天重复同一个工作,月末和供应商对对账,就这样,从没做过凭证。

      做了一年后,于2002年12月经人介绍进了一家新注册的外企。外企吸引我的就是有双休和有社保,同时认为能提高点英语水平,于是我进去了。在这里我做了近4年,所做的事情就是用英文版的财务软件做全盘账务及给财务总监发送报表。英文水平的确提高了一些,且在这里生了孩子休了产假。

      在2006年的7月,我认为我在这里再也学不到什么了,账务实在太简单了,且工资也不可能加了(是在宝安区,我当时4500,职位是经理助理),想升职做财务经理也是不可能,我只能走人了。

      不过走的时候还算开心吧,老板认为我给公司做了很多贡献,加上我自已的争取,额外多得了3.5个月工资。

      于是拿着这笔钱,带上女儿和老妈外出旅游了一下。

      当然,我在想换工作的同时,去报了个口语培训班,倒是有用了。

      旅游回来后,我开始找工作,因为以前只有一次找工作的经验,在近5年没找过工作了。结果没想到找工作还很顺利,很快就找上了一个工作。这是一家位于科技园的美资的企业,规模相当小,才70人。财务只2人,出纳还要做成本核算,我就是那个会计。因为以前从没做过税务方面,所以我刚来时花了很多时间和精力来研究和学习这些((以前的会计我连人影都没见过,更别提交接了)。事实证明我的努力是有用的,我用了不到一个月的时间,弄清楚了生产企业免抵退税的申报,个税的申报,外汇核销等程序。

      

     作者: Luckyandhouston   回复日期:2007-7-13 23:21:00 


      这家公司因为小,所以业务倒是不多,每个月的所有记账凭证不超过200个。倒是能学到很多东西。因为采购有进口也有国内的,销售有出口也有内销。所以我学会了开增值税专用发票和普通发票。学会了进项发票抵扣。也第一次接触了外汇核销和免抵退税。倒是有些成就感的。但是这家公司的管理很特别,虽说是外商独资企业,实际上是中国人在管理,我感觉我不习惯这里的机制,所以又一次做出了辞职的决定,当然还有个想法是以为找工作很容易。

     作者: Luckyandhouston   回复日期:2007-7-13 23:25:00 


      现在进入我的主题吧。谈谈我最近找工作的失败经历。因为目前我还没找上合适的工作呢。

      

     作者: Luckyandhouston   回复日期:2007-7-13 23:30:00 


      我主要也是在51JOB和CJOL上投简历,周一呢也会买份南方都市报,不过我认为买报全是徒劳,很少有合适的机会啊。

      我因为是有家庭有孩子的人了,所以找工作地点放第一位,因为我家在宝安和蛇口有房产,所以找工作的重点是南山区蛇口区。加上我有5年外企的工作经验,所以找工作的重心也是放在外资。

      事实上,符合这2条的单位少之又少啊。

      

     作者: Luckyandhouston   回复日期:2007-7-13 23:42:00 


      1.ASOKA美国深圳代表处,公司位于大冲飞亚达大厦,因为是代表处所以深圳这边才10多人,做软件开发的,目前还没有财务软件的。面试我的是一个主管吧,对财务了解一些又不全懂,你想我有这么多年的全盘工作经验,如果来他们这里做还不是轻车熟路啊。所以在面试时他问我的任何问题我回答得都不错,他也明知我能做好。最后是关于薪水没谈好。我想我总不能低于我以前的薪水吧。我要求试用期5K,试用期满后6K,他笑了,说我要求得还不低呢。

      最终我没收到录用通知。

     作者: Luckyandhouston   回复日期:2007-7-13 23:55:00 


      2.肯发精密仪器(深圳)有限公司。应聘职位是税务会计。公司是在宝安区的,离我家倒是不远。是一家新加坡独资企业。厂房看上去破破烂烂的,老公送我时建议我不要去了,我心想既然都到了门口了还是去吧。开始接待我居然是在食堂的一个破办公室里,人事一个文员让我填表,也就是简历表,上面很多空白处让你填离职原因啊,在职时证明人,电话。然后那人事文员问我在以前的公司做些什么,我回答了,她感觉很奇怪,说那不是很忙啊,我说公司小所以并不忙的。她又问我期望薪资,我答5K,她很怀疑地看我“你凭什么要求这么多啊?”我坦然回答:“因为我有这么多年工作经验,还有我会专业英语。”后来让我等了好久,才带我去见会计部的人。第二次面试我的是一个30多岁的男的,估计是会计主管,问了我一些外汇核销和报税的问题,我都很熟练地回答了。于是又讲到薪水,他看我在表上填的是5K,他说目前达不到这个数。底薪3500,岗位津贴500,伙食补贴300,住房补贴150,全勤奖60,试用期后加5%-10%,另外每年有5%的加薪。我犹豫了3分钟后才不情愿地回答他,可以接受,还是看在离家近,且跑税务行动比较自由这一点上的。估计是看我这么为难吧,所以这次面试又没什么结果了。

     作者: Luckyandhouston   回复日期:2007-7-14 0:09:00 


      3.沃尔玛。

      初试时是一个人事部的文员。非常有礼貌非常友好。问了我很多网上常见的问题,也用英语提问了,她的口语相当流利。后来让我填了份表,同时有份英文小测试,主要是单词汉译英,单词英译汉,句子汉译英。很简单。我感觉我表现还不错。

      几天后通知我周6去复试。这一天是财经专场招聘,很多人还是初试来着。像我这样复试的人是很少的。可是我迟到了,因为老公说开车送我,他总没时间观念,磨磨蹭蹭的。面试官有2个人,都是40岁左右的,估计是会计部的主管了。提问很尖刻了。我印象最深的是我失败的地方了。我应聘的是AP部经理这一职位,她指明我以前没什么管理人员的经验,说如果让我管一个7-8人的团体,我还是新来的,且我的资历还没别人高,我如何去管理?我答我会兢兢业业做好我本职工作,且以身做责,给他们做个好榜样。她又提问,如果上级有紧急任务,需全体加班,可是我底下人全部要请假,我如何办?的确我没经验,她本意想让我回答强制执行。可是我因自身性格方面,我没这样答。这一点她对我很不满的。后来让我做了份卷子,全是CPA课本上的。经济法啊,财管啊。

      又一次失败的面试。

     作者: Luckyandhouston   回复日期:2007-7-14 0:17:00 


      4.深圳市四方电器技术有限公司 职位:总账会计。位于侨香路中航沙河北工业区,做变频调速产品的

      是内资的,本来就不是我想像的单位,但是我收到通知还是去了。刚开始让我做卷子。题目非常简单,做一些分录,借了备用金后报差旅费啊,结转利润啊,计提地税综合税。如果是做过全盘的一定会感觉简单。然后面试我的是财务经理,一个很有亲和力的女人。她对我的各种回答是很满意,还是薪水方面,达不到我的要求。

      真郁闷,我在网上注册的简历上明明写明了期望薪资,总是有单位要浪费我的时间啊。

     作者: Luckyandhouston   回复日期:2007-7-14 0:28:00 


      5.香港中国液化天然气运输公司深圳代表处

      位于蛇口明华,地点对我来说是最理想的了。这公司相当有实力,垄断行业,运输方面的合同一签就是25年。面试我的是个财务方面的副老总了,问的主要是财务方面的问题。一是问新会计准则有哪些,我正好刚学了后续教育,很流利回答了。然后问我合并报表如何做,我说没做过,但是学过。我答出实收资本和长期投资要抵销,关联方的应收和应付要抵销。看来她比较满意的。考英文是一个小伙子提问的。问了我一些问题,有哪些强势啊。还让我口译一张纸上的文章,温家宝对猪肉涨价的看法。

      我自我感觉良好吧,却又一次失败了。2周后人事小姐说领导录用了另外的人。估计主要原因是我没有中级职称。实际上外资企业并不看重这个,但面试我的是个中国人,财务行业的,一定看重这个的。

     作者: Luckyandhouston   回复日期:2007-7-14 0:35:00 


      6.鸿荣源房地产公司

      我家的房子就是买这家的,所以知道他们实力强大.那天同时去面试的有10个人,架势惊人啊.

      面试官是个40岁的男的,问的全是专业的问题.我答得都不好.问题一:金碟如果没结转本年利润就出了资产负债表和损益表,会如何? 我从来不可能不结转利润就出报表,所以我答不出.问题二:用应付模块时如何进行月末和供应商对账? 我说操作下查询就可以了.我明明会用却不知如何去答.所以很快我被PASS了.

     作者: Luckyandhouston   回复日期:2007-7-14 0:39:00 


      7.和记电讯

      职位:会计主任助理

      网上明明有2个职位:会计主任和会计主任助理。我去了却让我面助理这个职位,我的经验显然不合适。所以又一次徒劳啊。

     作者: abrena   回复日期:2007-7-14 0:50:00 


      呵呵 加油 好久没来了 呵呵

     作者: Luckyandhouston   回复日期:2007-7-14 0:51:00 


      8.Burton美国深圳代表处

      南山区海德3路。上周5去初试,一个中国的主管。用中文和英文都问了我很多问题。我感觉我答得还不错,她也认为我很合适。

      这周4去复试了,亚洲地区副总裁,一个美国人。问我如何做好一个会计?我回答“careful,responsible,diligent"都不是他想听的。后来我说找出不合理的,然后去解决,他有点认可了。然后我说最终目标是实现企业价值最大化,可是他怎么听也听不明白。面试了很久以后,他让我提问,可是我没什么问题可提了啊。本来初试时就面了很长时间,主管对公司的发展啊,规划啊已做过详尽的说明了。其实他是想让我问公司的未来发展,他自已说了一遍,并指出实际上是想让我来问他的。

      这一次是50%的希望。因为他还要见另一个人,然后再做决定。

      面试时这美国人给了我一张名片,面试后我给他及主管都发了邮件,表明了我想进他们公司的诚意,并对我没提问做了些解释。

      这一个还不知结果呢。等待中!!

     作者: fogfox   回复日期:2007-7-14 9:31:00 


      确实不易啊

     作者: lixunbin   回复日期:2007-7-14 10:49:00 


      难呀

      

     作者: 丝路飞洋   回复日期:2007-7-14 10:50:00 


      

      鸿荣源房地产公司

      答:1没有结转本年利润,资产负债表是不平的。

       2用应付模块与供应商核对,虽说查询下能达到目的,是不是对方想核销往来的应答.

       看来以上是考核财软的应用熟练程度.

      ===============================

      面试时揣摸对方的用意是最重要了.

      加油!

      

      

      

     作者: Luckyandhouston   回复日期:2007-7-14 11:24:00 


      多谢丝路飞洋。财务软件我只用过总账模块,没用过什么ERP,SAP之类,所以如果进大公司这一点是弱势呢。

     作者: 海纳斯川   回复日期:2007-7-14 11:43:00 


      楼主的英文水平不错啊,看来在外资企业做真是有帮助的.向你学习!加油!

     作者: Luckyandhouston   回复日期:2007-7-14 12:02:00 


      我在大学时英文是最差的了,因为就一个CET-4,我考了三次才考了60多分,上学时因为四级不过将没有学位证,压力非常大,非常痛恨英文,毕业时将所有和英文相关的书全卖掉了。

      没想到在深圳英文这么重要啊。实际上我在工作中只能用到书面的,每天就那么一些单词。口语方面,一直没机会去说。也很想提高啊。

     作者: Work0755   回复日期:2007-7-14 13:56:00 


      在深圳,找一份合适的工作真的不容易

      我曾经看过丝路飞扬的文章,那时我也处在工作的低谷

      不过,我最后还是找过了一家500强欧洲公司,做财务分析

      记得低谷的时候,AP我都去面试过,不过都被自己拒绝了。因为自己真的不甘心

     作者: 斌丫頭   回复日期:2007-7-14 14:12:00 


      暈死了,我也看过丝路飞扬的文章,LZ跟她都有是经验的老会计了,找工作都这么难,我才刚刚报了会计班,想转行,我05年就毕业了,在一间小公司做出纳,公司是找财务公司做帐的.已经两年了,现在想转行了,可是看到这种情况,有些灰心...........

     作者: abrena   回复日期:2007-7-14 20:44:00 


      lz加油呵呵,财务软件是我的优势之一呵呵,所以要针对性的突出自己的优势

      

      现在我适应了新的公司,感觉轻松了 呵呵。又闲了 不过确实是学到了不少东西,特别是税务方面的,这也一直是我以前的弱点。

     作者: FLORENCE_LSZ   回复日期:2007-7-15 15:54:00 


      在一个上市公司做了六年,用SAP,财务各个模块都做过,手下带着几号人,中级,平常基本用不到英语,这样的条件在深圳能找什么样的工作呢?(待遇)深圳的公司是不是对英语要求都比较高啊?各位指导一下吧.谢谢.

     作者: Luckyandhouston   回复日期:2007-7-16 1:36:00 


      楼上那位,我讲明一下,以免误导了大家。因为我家里无任何经济负担,所以我在工作上也不是很上进,工作上算是混得比较差,我是这样认为的。我的同班同学在深圳的,在内资企业里做有2人,一个有中级,一个无证,但薪水都为6K,另一同学,中级也没考,在外资企业里做薪水为8K。你参照一下吧。

     作者: Luckyandhouston   回复日期:2007-7-16 1:41:00 


      晚上喝了茶,睡不着觉。只好上网。记得我在还没辞职时一家飞煌世亚的打来电话,让我应聘应收会计,需要和国外客户对账的,电话中问了我一些情况,问到薪资时说她们为5K,所以我在电话中就拒绝了。

      其间也接过华为的电话,也被我拒掉了,我也是以为面试过程繁杂。

     作者: wlmwxm1983   回复日期:2007-7-16 9:30:00 


      ……………………各位加油啊!!!!

     作者: hxj18888   回复日期:2007-7-16 17:15:00 


      不错,继续加油

     作者: 向日葵之灿烂   回复日期:2007-7-17 10:22:00 


      LZ,这两天找工作有没有什么新的消息啊?

      

      希望LZ早日找到合意的工作:)

      

     作者: 喜欢11   回复日期:2007-7-17 11:18:00 


      机遇很重要呀

     作者: abrena   回复日期:2007-7-17 13:15:00 


      同意楼上的,机遇其实很重要,自从来深圳之后,我的运气确实不错,比我厉害的会计比比皆是,但是机遇都不好多少,

     作者: Luckyandhouston   回复日期:2007-7-17 18:49:00 


      感谢大家关注我的贴子。今天我收到那个美国博登公司的电话通知了。明天就要上班了!

     作者: Luckyandhouston   回复日期:2007-7-17 18:57:00 


      我是上周4进行复试了,给我的答复是第二天可以知道结果,因为是从2人中选出一个。结果上周五他们回复我的邮件中并没直接答复。直到今天才通知我。

      我在上周五接到了好几个面试通知,我全都放弃了。本来都对找工作没信心了,感觉太累了的。而且这几天是在老公的公司里管理财务的了,已经转念去帮忙老公了。今天这个通知一下子又将我的思想转过来了!!

      我骨子里是那种有点自立的吧。不想生活在老公的影子下。不管怎样,这个新工作我会好好珍惜,并会努力去做好。

     作者: 丝路飞洋   回复日期:2007-7-17 22:09:00 


      天道酬勤

      恭喜姐姐,没打破我的记录,哈哈!

      要是有机会,可得请我喝酒哦!

      祝贺!祝贺!

      

     作者: Luckyandhouston   回复日期:2007-7-17 22:30:00 


      多谢丝路飞洋了!

     作者: tonghua644   回复日期:2007-7-17 23:26:00 


      哎呀

      看来我这本科还没毕业的会计确实还有很多要向前辈们学习的地方哟!~现在在忙准备CPA的考试,又想考研,英语也不怎么样,其实还是有点迷茫!都不知道自己到底该重点抓哪一方面!~

      希望前辈们能给点中肯的建议,在还有两年的大学生活里我应该往哪方面下功夫?谢谢!~小弟不甚感激!~

     作者: 海纳斯川   回复日期:2007-7-19 10:32:00 


      恭喜楼主!

     作者: 梅花飘然   回复日期:2007-7-19 12:56:00 


      看了LZ的找工经历,看来我真要学学英语了,这一直是我的痛处,怎么办?目前的这家日本公司做了五年多了,业务上没一点提高呢.顺便问一句,大专,1997年毕业至今做会计工作,中级职称,现公司的所有帐务,报税,免抵退等等,目前薪水很低,真的很想换,可自己又怕,也不知现在深圳的工作到底怎么样?

     作者: lian_8321   回复日期:2007-7-19 17:08:00 


      唉,我也得加油了

     作者: onliyoulove   回复日期:2007-7-19 19:19:00 


      看了lz的介绍

      

      感觉自己好菜

      

      05年出来在一家内资企业干到现在

      

      一直做的成本

      

      就学了大半年的SAP

      

      其他G/L AR AP AM 税务进出口都没接触过

      

      不知道以后出来后怎么办

      

      

      

      

     作者: dawai2829   回复日期:2007-7-20 9:08:00 


      会计专业在深圳不好混吗?我知道北京中新在深圳有分部,他们专门针对会计进行培训,ACCA辅导,你可以考一下CAT,这个含金量很高的!!具体可以咨询http://www.bssti.com/news_detail.asp?nclass=ACCA课程&id=407

     作者: 弦停山洲   回复日期:2007-7-20 10:16:00 


      还没有离职,想换工作.已经在面了,感觉找工作象和别人聊天一样,没有任何压力也没有意思!

      看来一定要辞掉工作再去找才有点感觉!

      

     作者: 暗香浮盈袖   回复日期:2007-7-21 9:57:00 


      我也是2000年毕业,会计专科,二年会计,二年主办,三年主管经验,对外企业全盘,税务通晓,8/1就要正式离职了,交接了二个月,

      今年4月份面试过一家美资企业(关外)总账会计,财务经理问了外汇核销及报税方面的,回答还OK,要求薪水5K,最终没结果,因为同时去的一个面试工程的本科生三年经验定下的工资只有3.5K,整个面试没用英语,只是考试了一张英文试着卷,发邮件给了人事,最终没有回复.整个感觉没有英语气氛围,当初是冲着美资才投的.

      再然后现在还没有一次面试机会,这几天网上看了几下,投了几份都没有回复!有点害怕找工作,五年没找过了.

      

     作者: 深圳168   回复日期:2007-7-21 15:26:00 


      LZ这回可以面试他人了,下回到我应聘了,LZ要给点面子啊。

     作者: Luckyandhouston   回复日期:2007-7-22 10:03:00 


      昨天同班同学请我吃喜酒,正好几个同学聚了下,我和几个同学交流了下我这次找工作的经历,结论是港资、台资、新加坡资都不用去考虑了,很不好做。还是欧美的企业要好些。

      我现在进的这家感觉很好,企业文化,管理模式等很人性化。

     作者: 丝路飞洋   回复日期:2007-7-22 17:31:00 


      怪事

      莫非有国人血统的企业都不能去?

      看来现在要向LUCK姐学习,向欧美企事业进军!

      为了美好的前程

      战斗着

     作者: 幸福胖考拉   回复日期:2007-7-22 20:42:00 


      楼主,加油!

      祝你早日找到称心如意的工作!

     作者: Luckyandhouston   回复日期:2007-7-26 16:20:00 


      幸福胖考拉,多谢你的关心。我已经上班一周多了!感觉还不错。

     作者: astromoon   回复日期:2007-7-26 23:18:00 


      在博登刚搬到南山的时候,我就被通知去面试过,不过没有通过,真是羡慕楼主呀,听说那个公司上班很灵活,福利也很好。我8月份要重新找工作了,不知道结果会怎样。祈祷中!

      我也是一个作全盘会计6年的人,不过英语不好,虽说有六级证书,同时我也没有中级职称也不是CPA,佩服楼主可以开5000以上的工资。

     作者: 德鲁克和曼昆   回复日期:2007-9-4 18:14:00 


      05年毕业,之前都是在物流行业做

      感觉物流行业,收付款、往来出其的多

      最近也在找工作中,明天南山有一家。还是过去看一下

      实在不是很想AR,都有去做成本的想法

     作者: ao831209   回复日期:2007-9-4 20:20:00 


      一样的,找工作真的是考人的耐心,对于找工作,我是怕到极点,工作一至处于被动地位。可能是我这个人原则性太强了吧,在哪里都坚持不了多久。好郁闷哟,支持LZ!你一直是我的楷模。哈哈,我的工作跟专业一点也对不上口滴,郁闷死了。

     作者: qkhhcl   回复日期:2007-9-4 23:23:00 


      我一直都是想进的是是欧洲的企业,荷兰.瑞典.德国之类的企业,谁知道鬼差神错,竟然进到台资企业去了,抠门得要死...

     作者: 江南深秋   回复日期:2007-9-7 11:09:00 


      说实话,5000块钱在深圳实在是没有幸福感可言啊

      月光光,无聊地生活着。

     作者: 异人梦   回复日期:2007-9-7 12:30:00 


      那你还算是蛮顺利的了,我明年就要去找工作了,都说会计难找,在说一个大专生,也就更难找了/但愿不要太难~

     作者: camelsmile   回复日期:2007-9-7 17:19:00 


      工作再难找还是会很努力的......

      

      ^____^

      

      继续不断努力咯

     作者: 逸慈庄主人   回复日期:2007-9-8 15:06:00 


      楼主说的对我很有用处,至少知道自己有什么不足,本人去年本科毕业,在深圳关外工作一年,销售成本都做过,深感能力不足,现在要换一个工作充实一下,没想到关内的待遇并不怎么样.有的在关内工作好些年却不如刚毕业在关内第一年的待遇,很失望.

     作者: yxh2045   回复日期:2007-9-12 10:53:00 


      大家都不容易啊!

     作者: 美丽的漂   回复日期:2007-9-13 15:51:00 


      偶大专,还是自考的,虽说干了这么多年会计,好象啥也不懂。想到深圳来找工作,估计是没人要了,忘了说本人现在还是单身。是不是更不好找哟。工业的一般纳税人做过,超市做的是往来会计。

     作者: 德鲁克和曼昆   回复日期:2007-9-13 18:26:00 


      今天,深圳航空公司面试。

      一开就搞小组讨论面试,后直接淘汰了一半的人,我也在其中。什么专业测试都没有

      现在回想起来,真是哭笑不得。

      真好玩!

     作者: nofatebird   回复日期:2007-11-2 10:36:00 


      我下周也要去博登复试,CAD engineer,lucky姐姐需要注意什么问题呀

     作者: 易木123   回复日期:2007-11-2 20:26:00 


      我还准备从头开始做起.年龄也不小了.还没有实际经验.学历也还在努力当中哦~~

     作者: K歌龙王   回复日期:2007-11-3 12:51:00 


      找工作真不容易,我也找了很久,久得都快霉掉了。除了税务没做过,其他都做过了,目前的工作干得就像喝白水。可能是简历在网上挂得太久了吧,竟然有公司找我去做出纳文员,开2K的价,疯了!

    总页数:1  当前页:1  第1页

     

  • 比尔-盖茨退休前给职场青年的十句警言

    2008-07-25 18:02:38

    1、社会充满不公平现象。你先不要想去改造它,只能先适应它。(因为你管不了它)
    2、世界不会在意你的自尊,人们看的只是你的成就。在你没有成就以前,切勿过分强调自尊。(因为你越强调自尊,越对你不利)
    3、你只是中学毕业,通常不会成为CEO,直到你把CEO职位拿到手为止。(直到此时,人们才不会介意你只是中学毕业)
    4、当你陷入人为困境时,不要抱怨,你只能默默地吸取教训。(你要悄悄地振作起来,重新奋起)
    5、你要懂得:在没有你之前,你的父母并不像现在这样“乏味”。你应该想到,这是他们为了抚养你所付出的巨大代价。(你永远要感恩和孝敬他们,才是硬道理)
    6、在学校里,你考第几已不是那么重要,但进入社会却不然。不管你去哪里,都要分等排名。(社会、公司要排名次,是常见的事,要鼓起勇气竞争才对)
    7、学校里有节假日,到公司打工则不然,你几乎不能休息,很少能轻松地过节假日。(否则你职业生涯中一起跑就落后了,甚至会让你永远落后)
    8、在学校,老师会帮助你学习,到公司却不会。如果你认为学校的老师要求你很严格,那是你还没有进入公司打工。因为,如果公司对你不严厉,你就要失业了。(你必须清醒地认识到:公司比学校更要严格要求自己)
    9、人们都喜欢看电视剧,但你不要看,那并不是你的生活。只要在公司工作,你是无暇看电视剧的。(奉劝你不要看,否则你走上看电视连续剧之路,而且看得津津有味,那你将失去成功的资格)
    10、永远不要在背后批评别人,
    尤其不能批评你的老板无知、刻薄和无能。(因为这样的心态,会使你走上坎坷艰难的成长之路)

  • 软件战——行业本质决定胜负

    2008-07-25 17:56:22

           同是软件巨头,为什么微软、IBM和SAP都能长期占据垄断地位,而又不会相互打垮?这是因为他们各自处于产业链的上、中、下游,并且分别抓住上、中、下游不同行业本质。微软占据上游的系统软件,IBM则专心做中游的中间件,SAP则专注于下游的应用软件。那么中游软件的行业本质是什么呢?就是“占据软件产业必经部分的核心技术”。而下游应用软件的行业本质是什么呢?由于技术壁垒低,外来者容易进入,其行业本质就是:“把本土化、行业化、专门化知识,转化成商业智慧,并融入软件产品及服务之中。”
           那么,软件行业是一个什么样的行业?
           简单的说,软件就是计算机能够理解的一串指令,这些指令会告诉计算机要做什么事。他们一般被划分为三大类:系统软件,中间件,应用软件。
           系统软件(Operating systems)是整个计算机系统的基础及总指挥,负责内部执行,如微软的Windows;
           中间件(Middleware)是连接前线与指挥之间的软件,提供及加强系统软件和应用软件之间的沟通,如TIBM开发的Lotus;
           应用软件(Application Software)负责前线服务,为一般用户提供多种不同的计算机应用功能,也是用户最常接触到的部分,如企业经常用到的财务管理软件。
           寻找软件业本质,要先从软件产业链开始着手。
           系统软件是中间件和应用软件得以运行的基础。中间件为体统软件与应用软件提供接口,即使系统软件发生变动,只要作为借口的中间件不变,应用软件就不必大幅修改。应用软件则建立在系统软件与中间件的基础上,为企业客户解决实际问题(如财务软件用友)。
            如果只有系统软件或中间件,而没有能解决客户实际问题的应用软件,是没有用的;相反,如果只有应用软件,却没有可供运行的系统软件与中间件,也是行不通的,它们是循序渐进,缺一不可的。
           系统软件和中间件的技术壁垒高,外来者难进入,因此竞争并不十分激烈,边际利润较高。至于应用软件,技术壁垒低,功能与种类多不胜数,外来者较易侵入及模仿,因此竞争十分激烈,边际利润相对较低,没有真正的“领导者”。
           由此可见,链的上、中、下游,其特质各有不同,软件企业站在链的不同位置,自然有不同的景观,也需要不一样的策略,起所体现出的行业本质,也大不相同。

    中游本质:“占据软件产业必经部分的核心技术”
           中国很多厂商,在产业链中缺乏议价交涉能力。被外国企业不断压价,导致利润萎缩,最后倒闭。不是他们工作的不好,而是他们所做的工序只需要很低的技术,要找代替的太容易。
           相反,只要你拥有议价交涉能力,站在无可取代的位置,即使你工作做的不那么好,买家、卖家也无可奈何。就像现在大家对微软的Windows边用边骂的情况一样。
           那么,中游软件的行业本质是什么呢?就是:“占据软件产业必经部分的核心技术”。
           怎么理解呢?我们以一个简单的比喻来说明:如“大富翁”游戏,在棋盘上,只要在别人会经过的地方买地,建房子,建酒店,你就赢了。你可能会问:在软件行业中,哪里有棋盘?在哪里地,建房子,建酒店?
           我们先将软件产业链看成是大富翁游戏棋盘上的路,而中间件,就是连接系统软件与应用软件的必经之路,至于土地、房子和酒店,就是软件的核心技术,房子和酒店越多,表示那里的技术越高,越重要。只要占据了重要的核心技术,其他软件企业要通过时,都必须付款或合作。
           大部分软件商,都不能没有中间件的配合,而且根据之前技术需求链的研究,中间件的技术壁垒很高,不能轻易被模仿或跨过,所以如果占据了当中必要的高端技术,就像掐着其他软件商的脖子一样。
           所以,当你能够抓住行业本质,“占据软件产业必经部分的核心技术”,就能产生两个效果:
           一是能提升在软件业界的议价能力。这个议价能力,在产业链中有着决定性的作用。
           第二个效果,就是能够让占有市场自动增大,因为你的合作伙伴会不自觉地主动帮你找客户。当应用软件商开发的应用软件,必须配合你的中间件时,他们花费了不少人力、金钱所找来的客户,也自然要用你的中间件。
           当你拥有了高度的议价能力,还有庞大的市场占有率后,那就更容易以并购或合作方式,来获得其他重要的核心技术。就像IBM,通过吞并其他软件企业,来扩大自己的软件王国。
           我们来看看,IBM如何占领中游软件的核心技术以实施起策略。

    蓝色巨人IBM选择中游,成领头羊
            IBM一向为人熟悉的,是它的硬件产品,不论是家用或是商用计算机,我们总会很容易找到IBM的迹影,但早在上世纪九十年代,IBM已开始发展软件业,因为它的硬件产品,在九十年代中期已开始停滞不前,甚至被其他对手超越。
           因此,IBM要发展软件行业,占据市场重要地位。回过头看,它的选择无疑是正确的。
           短短10年之间,IBM便摇身一变,成为同行业的指标。过去5年的平均资产回报率,IBM较同行业的平均值多出9%左右,而较道琼斯30大成份股的平均值,更超出11%左右。
           在2007年中间件的市场占有率统计中,IBM遥遥领先其余两间国际知名软件公司BEA和Oracle,市场占有率超过30%。
            它为什么可以在中间件市场取得绝对领导地位?因为它符合了软件业中游的本质——先占领整个中间件的核心技术,成为中间件的领导,再与下游的应用软件公司合作,成功控制整个软件业的流程,令大部分的客户不得不选择IBM。
            IBM在软件行业发展中,选择了中间件作为主要对象,主要是当时中间件并没有存在任何一个主要的领导公司。
           中间件负责应用软件与操作系统的相互沟通,为软件与软件之间提供标准接口。不管底层怎样更新,只要接口不变,应用软件也不必大幅修改,产生跨平台资源共享的效能。因为应用软件及基层系统软件,本身各有不同的接洽方式,会令开发失去弹性,而中间件就像家电万用拖板,为应用软件及基层系统提供接洽位。
           中间件三大主要功能就是:构建(To Build)、运行(To Run)和管理(To Manage)。以下我们用一个简单例子说明:
           一名厨师想要烤熟食物,一名青年想要上网。电器开发员就为他们分别造了一台微波炉和一台计算机,微波炉忽然计算机需要电力发动,电力就由发电厂管理,经过电线的运行,传输到厨师和青年家中,再供微波炉和计算机使用,而当中的电线需要技工维护及管理 ,当青年想要订烤鸡的时候,邮差就将邮件送到厨师手上。
           青年和厨师就是应用软件的用户,微波炉和计算机是应用软件,微波炉和计算机开发员是(To Build)应用软件开发,发电厂、邮差和电线技工是讯息、系统和数据管理(To Manage),而电线是运行协作平台(To Run)。
           一如上述例子所说明,无论是一个企业软件用户想自行研发解决方案,或是选择其他软件厂商的软件,在整个从开发到运行到保养维修,研发、运行和管理都是必需的。只要掌握了中游软件的核心技术就能掌握其行业本质。
           那么,我们现在看看,IBM如何彻底实践软件业中游的本质。
           首先,IBM将整条产业链必需的技术都完全掌握,而且每项技术在该领域都名列前茅。它集中研发中间件,本开发了五个品牌,分别是:担当构建角色的Rational,担当运行角色的WebSphere,以及担当管理角色的Tivoli、Infomation Management和Lotus。这五个品牌各自担当中间件的不同功能,令IBM能占据中间件的所有核心技术。
           如果对应我们以上所用的比喻,Rational是负责构件那台计算机(即构建);Websphere扮演着电缆输送的角色(即运行);Tivoli负责所有系统的管理,Lotus即扮演寻系管理的角色,Infomation Management是负责电缆上的数据管理(最后三个都是管理)。
           那么IBM如何占据这些核心技术呢?除了自己研发外,还大量收购其他公司。
           IBM的并购并不是杂乱无章,目的都是完善和提升其中间件五大品牌的功能,巩固其关键地位,以“占据软件产业链必经部分之核心技术”,为企业提供量身定做的解决方案。为此IBM在2001-2007年期间大量收购公司,从而令核心技术更完善。

    老二、老三为何被IBM甩的老远
           在中间件市场,IBM的占有率2007年达32%,遥遥领先于第二名BEA(10%),及第三名甲骨文(9%),是什么原因使这两家公司落后如此之大呢?
           BEA曾一度占据市场龙头地位,它成立于1995年,当时主力发展下游的企业软件,但在同年收购了全世界第一件中间件的品牌——Tuxedo,便成为当时中间件开发商的先驱。
           接着,BEA便开始分拆不同的中间件品牌出来:BEA AquaLogic担当管理的角色,而BEA Workshop担当构建的角色,BEA Tuxedo及BEA WebLogic担当运行的角色。
           公司其后在1998年收购了WebLogic(即现在的BEA WebLogic),并在2005年推出了BEA WebLogic籍以稳固市场,但却逃不过市场占有率被IBM追讨的命运。
           乍一看,BEA好象跟IBM一样,拥有整条产业链的技术。但我们仔细地看看,就会发现BEA的不足之处。
           BEA与IBM真正的差距,是在“构建”的层面上。

  • 软件工程师不可不知的10个概念

    2008-07-25 17:51:55

    软件工程师不可不知的10个概念
       出色的软件工程师善用设计模式,勤于代码重构,编写单元测试,并对简单有宗教般的追求。除了这些,优秀的软件工程师还要通晓10个概念,这10个概念超越了编程语言与设计模式,软件工程师应当从更广的范围内明白这些道理。

    1. 关系数据库 (Relational Databases)
    关系数据库因为在大规模 Web 服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处理订单,公司数据方面有着出色的表现。

    关系数据库的核心是以记录表示数据,记录存放在数据库表,数据库使用查询语言(SQL)对数据进行搜索与查询,同时,数据库对各个数据表进行关联。

    数据库的标准化技术(normalization)讲的是使用正确的方式对数据进行分存以降低冗余,并加快存取速度。
     
    2. 安全 (Security)
    随着黑客的崛起与数据敏感性的上升,安全变得非常重要。安全是个广义的概念,涉及验证,授权与信息传输。

    验证是对用户的身份进行检查,如要求用户输入密码。验证通常需要结合 SSL (secure socket layer)进行;授权在公司业务系统中非常重要,尤其是一些工作流系统。最近开发的 OAuth 协议可以帮助 Web 服务将相应信息向相应用户开放。Flickr 便使用这种方式管理私人照片和数据的访问权限。

    另外一个安全领域是网络设防,这关系到操作系统,配置与监控。不仅网络危险重重,任何软件都是。Firefox 被称为最安全的浏览器,仍然需要频频发布安全补丁。要为你的系统编写安全代码就需要明白各种潜在的问题。
     
    3. 云计算 (Cloud Computing)
    RWW 最近的关于云计算的文章 Reaching For The Sky Through Compute Clouds 讲到了云计算如何改变大规模 Web 应用的发布。大规模的并行,低成本,与快速投入市场。

    并行算法发明以来,首先迎来的是网格计算,网格计算是借助空闲的桌面计算机资源进行并行计算。最著名的例子是 Berkley 大学的 SETI@home 计划,该计划使用空闲的 CPU 资源分析太空数据。金融机构也大规模实施网格计算进行风险分析。空闲的资源,加上 J2EE 平台的崛起,迎来了云计算的概念:应用服务虚拟化。就是应用按需运行,并可以随着时间和用户规模而实时改变。

    云计算最生动的例子是 Amazon 的 Web 服务,一组可以通过 API 进行调用的应用,如云服务(EC2),一个用来存储大型媒体文件的数据库(S3),索引服务(SimpleDB),序列服务(SQS)。

    4. 并发 (Concurrency)
    并发是软件工程师最容易犯错的地方,这可以理解,因为我们一直遵从线形思维,然而并发在现代系统中非常重要。

    并发是程序中的并行处理,多数现代编程语言包含内置的并发能力,在 Java,指的是线程。关于并发,最经典的例子是“生产/消费”模式,生产方生产数据和任务,并放入工作线程消费或执行。并发的复杂性在于,线程需要经常访问共同数据,每个线程都有自己的执行顺序,但需要访问共同数据。Doug Lea 曾写过一个最复杂的并发类,现在是 core Java 的一部分。

    5. 缓存(Caching)
    缓存对现代 Web 程序不可或缺,缓存是从数据库取回,并存放在内存中的数据。因为数据库直接存取的代价非常高,将数据从数据库取回并放在缓存中访问就变得十分必要。比如,你有一个网站,要显示上周的畅销书,你可以从数据将畅销书榜一次性取回放在缓存中,而不必在每次访问时都去数据库读数据。

    缓存需要代价,只有最常用的内容才可以放入缓存。很多现代程序,包括 Facebook,依靠一种叫做 Memcached 的分布式缓存系统,该系统是 Brad Firzpatrick 在工作于 LiveJournal 项目时开发的,Memcached 使用网络中空闲的内存资源建立缓存机制,Memcached 类库在很多流行编程语言,包括 Java 和 PHP 中都有。

    6. 散列法(Hashing)
    Hashing 的目的是加速访问速度。如果数据是序列存储的,从中查询一个项的时间取决于数据列的大小。而散列法对每一个项计算一个数字作为索引,在一个好的 Hashing 算法下,数据查找的速度是一样的。

    除了存储数据,散列法对分布式系统也很重要。统一散列法(uniform hash )用来在云数据库环境下,在不同计算机之间分存数据。Google 的索引服务就是这种方法的体现,每一个 URL 都被散列分布到特定计算机。

    散列函数非常复杂,但现代类库中都有现成的类,重要的是,如何对散列法进行细调以获得最好的性能。

    7. 算法的复杂性 (Algorithmic Complexity)
    关于算法的复杂性,软件工程师需要理解这样几件事。第一,大O标记法(big O notation);第二,你永远都不应该使用嵌套式循环(循环里面套循环),你应该使用 Hash 表,数组或单一循环;第三,如今优秀类库比比皆是,我们不必过分纠缠于这些库的效能的差别,我们以后还有机会进行细调;最后,不要忽视算法的优雅及性能,编写紧凑的,可读的代码可以让你的算法更简单,更干净。

    8. 分层 (Layering)
    用分层来讨论软件架构是最容易的。John Lakos 曾出版过一本关于大型 C++ 系统的书。Lakos 认为软件包含了层,书中介绍了层的概念,方法是,对每个软件组件,数一下它所依赖的组件数目就可以知道它的复杂程度。

    Lakos 认为,一个好的软件拥有金字塔结构,就是说,软件组件拥有层层积累的复杂度,但每个组件本身必须简单,一个优秀的软件包含很多小的,可重复使用的模块,每个模块有自己的职责。一个好的系统中,组件之间的依赖性不可交叉,整个系统是各种各样的组件堆积起来,形成一个金字塔。

    Lakos 在软件工程的很多方面都是先驱,最著名的是 Refactoring (代码重构)。代码重构指的是,在编程过程中需要不断地对代码进行改造以保证其结构的健壮与灵活。

    9. 惯例与模板 (Conventions and Templates)
    命名惯例和基础模板在编程模式中常被忽视,然而它可能是最强大的方法。命名惯例使软件自动化成为可能,如,Java Beans 框架在 getter 和 setter 方法中,使用简单的命名惯例。del.icio.us 网站的 URL 命名也使用统一的格式,如
    http://del.icio.us/tag/software 会将用户带到所有标签为 software 的页。

    很多社会网络均使用简单命名,如,你的名字是 johnsmith ,那你的头像可能命名为 johnsmith.jpg,而你的 rss 聚合文件的命名很可能是 johnsmith.xml 。

    命名惯例还用于单元测试,如,JUnit 单元测试工具会辨认所有以 test 开头的类。

    我们这里说的模板(templates )指的并不是  C++ 或 Java 语言中的 constructs,我们说的是一些包含变量的模板文件,用户可以替换变量并输出最终结果。

    Cold Fusion 是最先使用模板的程序之一,后来,Java 使用 JSP 实现模板功能。Apache 近来为 Java 开发了非常好用的通用模板, Velocity。PHP 本身就是基于模板的,因为它支持 eval 函数。

    10. 界面(Interfaces)
    软件工程中最重要的概念是界面。任何软件都是一个真实系统的模型。如何使用简单的用户界面进行模型化至关重要。很多软件系统走这样的极端,缺乏抽象的冗长代码,或者过分设计而导致无谓的复杂。

    在众多软件工程书籍中,Robert Martin 写的《敏捷编程》值得一读。

    关于模型化,以下方法对你会有帮助。首先,去掉那些只有在将来才可能用得着的方法,代码越精练越好。第二,不要总认为以前的东西是对的,要善于改变。第三,要有耐心并享受过程。

  • 嵌入式软件设计中查找缺陷的几个技巧(下)

    2008-07-25 09:36:34

      大部分软件开发项目依靠结合代码检查、结构测试和功能测试来识别软件缺陷。尽管这些传统技术非常重要,而且能发现大多数软件问题,但它们无法检查出当今复杂系统中的许多共性错误。本文将介绍如何避免那些隐蔽然而常见的错误,并介绍的几个技巧帮助工程师发现软件中隐藏的错误。

    竞争条件

    当两个或更多独立线程同时访问同一资源时,就出现了竞争条件。竞争条件的影响多种多样,取决于具体的情况。清单1解释了一个潜在的竞争条件。函数Update_Sensor()通过调用get_raw()来读取传感器的原始数据。在处理过程中,该数据被乘上一个定标因子,并加上一个偏移量。处理是在该数据的一个临时副本上进行的,然后,该临时副本被写入共享变量。

    如果在数据写入之前,使用shared_sensor的另一个线程或ISR先占(preempt)了这个线程,它将得到原来的传感器读数。使用临时副本可以防止先占线程读取只经过部分处理的数据。不过,如果这些代码在一个数据总线不足32位的处理器上运行,就会存在竞争条件。

    在一个8位或16位的处理器上,向shared_sensor的写入操作并不是一次性完成的。在8位处理器上,写入32位浮点值可能需要四条指令,在16位处理器上可能需要两条指令。如果在对shared_sensor进行连续写入中途Update_Sensor()被先占,则先占线程将从由一部分老数据和一部分新数据组成的shared_sensor读取一个数值。根据应用的具体情况,这有可能造成严重的后果。解决的办法是锁定调度程序,或在更新共享变量期间禁止中断。

    消除竞争条件通常很简单,但找出隐藏在代码中的竞争条件则需要仔细的分析。

    对于由一个循环程序和不同ISR组成的简单系统,分析竞争条件很简单,只需检查每个ISR并识别它引用的所有共享变量。共享变量通常是这些系统中的全局数据,一旦这些共享变量被找出来之后,就可以检查它们在代码中的各次使用情况。每次访问都必须按需要进行保护,以避免潜在的冲突。在简单设计中,一般通过在关键代码段周围禁止中断来实现保护。遵守下列规则可帮助避免竞争问题:

    * 如果一个ISR对共享数据进行写入,则该ISR之外的每次可中断的读操作都必须予以保护。

    * 如果一个ISR对共享数据进行写入,则该ISR之外的任何读-修-写操作都必须予以保护。

    * 如果一个ISR读取共享数据,则对该数据的可中断写操作必须予以保护。

    * 如果一个ISR和其它代码都要检查一个硬件状态标志,以便在使用某资源之前确定其可用性,如:

    if (!resource_busy)

    {

    // Use resource

    }

    则从检查标志之时开始,到硬件设置标志表示资源不可用为止,必须采取保护措施。

    对于使用了优先级不同的多个线程的更为复杂的系统,其分析也非常相似。上述规则仍然适用于ISR使用的所有数据。此外,还必须识别出每个线程使用的共享数据。首先从系统中优先级最高的线程开始,找出它与任何优先级较低的线程共享的所有数据,然后按照上述四条规则进行保护。对于软件使用的其它每个优先级,再重复这一过程。

    注意,如果系统采用了一种循环调度算法,则特定优先级内的所有线程可在任意时刻相互先占。这意味着前述四条分析规则在考虑较低优先级的线程之外,还必须考虑同一优先级的所有线程。

    多线程系统通常使用某种类型的操作系统,它能够提供多种保护选择。可以使用互斥或信号量,或者锁定调度器。有时也可使用其它进程间通信(IPC)基本技术:通过向消息队列发送消息(而非修改共享变量)来表示数据已经改变。在许多情况下,最好由单一线程来管理共享资源,它负责处理所有的读写请求,并在内部防止访问冲突。

    在复杂的代码中辨认潜在的竞争条件可能是一项乏味而又耗时的工作。相应的辅助工具从用来识别全局数据访问的简单脚本到先进的动态分析程序如Polyspace Verifier。虽然比较困难,但详尽的代码分析是识别这类错误的唯一途径。测试不大可能能够建立重复触发竞争条件所需的精确时序序列。

    死锁

    在共享资源的系统中,防止访问冲突极为重要,但这有可能导致另一个问题:死锁。当通过"锁定"一个资源来防止任何其它线程访问这个资源,以避免竞争条件时,必须对设计进行评估,确保绝对不会发生死锁。死锁测试通常没有什么效果,因为只有某种特定顺序的资源锁定才可能产生死锁,而一般的测试不大可能导致这种顺序。

    死锁只不过是多线程环境中一个锁定资源的问题。以下四个条件必须同时具备,才会发生死锁。防止其中任何一个条件出现都可以排除死锁的可能性:

    * 相互排除---每次只有一个线程可以使用某个锁定的资源;

    * 非先占---其它线程不能强迫另一个线程释放资源;

    * 保持并等待---线程在等待需要的其它任何资源时,保持它们已经锁定的资源;

    * 循环等待---存在一个线程循环链,其中每个线程保持链中下一个线程所需要的资源。

    图1中的资源分配图是死锁问题的一个例子。线程1首先锁定Buf资源,在保持Buf时,指向Bus,然后是Mux。如果线程1一直运行到结束,它最终将释放所有这些资源。线程2运行时,必须指向Bus、Sem,最后是Mux。线程3运行时,需要Sem和Buf。

    在这个设计实例中,无法保证任何一个线程能够在另一个线程开始执行之前结束。如果一鱿叱滩荒艿玫叫枰 哪掣鲎试矗 移鹬葱?阻塞),直到该资源有效为止。在系统运行过程中,各线程都将对资源进行锁定或解锁。由于各线程运行和指向其资源的相对时序各不相同,有可能出现由于各个线程正在等待被其它线程保持的资源,导致所有线程都无法运行的情况。例如,如果线程1保持Buf,线程2保持Bus,而线程3已经取得了Sem,则系统将发生死锁。因为按照从Buf到Bus到Sem,再回到Buf的线程分配箭头,循环等待条件得到了满足。

    潜在死锁问题识别出来之后,通常很容易进行修复。在图2中,对线程3进行了修改,使其在得到Sem之前首先设法指向Buf。这样,循环等待的条件就被打破了,系统将不会再受到死锁的影响。

    一些操作系统过多地使用消息传递来进行线程间通信和同步。在这些类型的系统中,当某线程向另一个线程传递消息时,发送线程将阻塞,直到从接收线程收到响应为止。接收线程通常将一直阻塞到从其它某个线程接收到一个消息为止。这些结构中也会发生死锁。为了给一个基于消息的操作系统建立一张资源分配图,我们利用消息通道来模拟分配的资源。图3是一个例子。线程2建立了通道T2 Ch,当它未因为等待这个通道上的一个消息而阻塞时,线程2就将"锁定"这个通道。当它阻塞并等待一个消息时,另一个线程可在这个通道上向它发送一个消息,并且这个消息将立即被接收到。

    现在考虑下面这个系统:线程1指向Mutex并在通道T2 Ch上向线程2发送消息。在线程2中的某个地方,线程2在通道T3 Ch上向线程3发送消息。线程3也在通道T4 Ch上向线程4发送消息。在线程4中的某个地方,它也尝试指向Mutex,如果得不到,它就将阻塞。显然,各资源之间存在一条循环路径,这表明有可能发生死锁。例如,如果某一时刻线程1保持Mutex而线程4尝试指向它,线程4就将在Mutex上阻塞。然后当线程3尝试在通道T4 Ch上向线程4发送一个消息时,线程3将阻塞,等待来自线程4的应答(因为线程4是由于等待Mutex而阻塞,不是为了等待这个消息)。类似地,当线程2尝试向线程3发送一个消息时,将被阻塞;线程1尝试向线程2发送一个消息时也将阻塞,由于它仍然保持着Mutex,所以系统将发生死锁。

    对付死锁的最容易的办法是通过设计进行避免。采用以下任何一条设计约束都可排除死锁出现的可能性:

    * 任意时刻线程锁定的资源不超过一个。

    * 线程开始执行前就完全分配它所需的全部资源。

    * 指向多个资源的线程必须按照一种系统范围的预设顺序来锁定(并释放)这些资源。

    如果无法通过设计来避免死锁,则应该建立资源分配图。检查资源分配图可以识别潜在的死锁。通过仔细跟踪系统中的所有线程和它们锁定的共享资源,可以维护资源分配图并周期性地进行检查,及时发现循环等待的特征。

    建立资源分配图需要识别每个受保护的共享资源,以及指向其中某一资源的所有线程。如果使用一个操作系统,可以采用下面的过程步骤:

    1. 识别所有可能阻塞的系统调用,如Mutex_Lock(),每个受保护的共享资源总是有一些与访问它有关的阻塞调用。

    2. 识别出获取共享资源的阻塞调用之后,在源代码中查找它们的各次调用情况。

    3. 对于每次调用,记录下指向资源的线程名称和该资源的名称。通常调用本身将受保护的资源作为一个参数来传递,调用在源代码中所处的位置表明了哪个线程需要该资源。通过这种方式,可以识别出所有受保护的资源以及分配资源的线程。

    4. 建立资源分配图,并检查是否有任何资源存在循环路径。当线程和共享资源较少时,画出资源分配图比较简单。在较为复杂的系统中,最好将这些信息输入分析表格,并编写一个宏来检查线程和资源分配结构,以识别潜在的死锁。编写好宏之后,就可以快速地对资源分配变化进行重新评估。编写宏时,可以忽略不会导致死锁的资源之间的循环。在表2所示的例子中,各种资源之间有许多循环,但只有线程6和线程7之间可能存在死锁。

    在一些类型的系统中,预先确定每一个共享资源并建立分配图是不实际或不可能的。此时可以增加一些额外的代码,以便在系统运行时检测出潜在的死锁。许多不同的算法都致力于优化这个检测过程,但本质上它们几乎都动态地建立某种资源分配图。只要有线程请求、分配或释放资源,分配图就会被修改和检测,以确定是否存在表明潜在死锁的循环路径。

    检测到某个死锁之后,唯一的克服方法是强迫线程释放关键的资源。通常,这意味着中断正保持着所需资源的线程。对于某些应用,这种方法可能是无法接受的。另一个有趣的解决方案是在运行时收集资源分配情况并进行事后分析处理,以确定在程序运行过程中是否有死锁情况发生。尽管这种方法并不能防止在运行时发生死锁,但它确实有助于在死锁出现后发现问题并进行修复。

    还有一些工具也可以用来帮助发现代码中的死锁。例如,Solaris程序设计员可以采用Sun公司的LockLint工具来对代码进行统计分析。它可以发现对锁定技术的不一致用法,识别引起竞争条件和死锁的许多原因
     

  • 嵌入式软件设计中查找缺陷的几个技巧(上)

    2008-07-25 09:35:16

       大部分软件开发项目依靠结合代码检查、结构测试和功能测试来识别软件缺陷。尽管这些传统技术非常重要,而且能发现大多数软件问题,但它们无法检查出当今复杂系统中的许多共性错误。本文将介绍如何避免那些隐蔽然而常见的错误,并介绍的几个技巧帮助工程师发现软件中隐藏的错误。

    结构测试或白盒测试能有效地发现代码中的逻辑、控制流、计算和数据错误。这项测试要求对软件的内部工作能够一览无遗(因此称为"白盒"或"玻璃盒"),以便了解软件结构的详细情况。它检查每个条件表达式、数学操作、输入和输出。由于需要测试的细节众多,结构测试每次检查一个软件单元,通常为一个函数或类。

    代码审查也使用与实现缺陷和潜在问题查找同样复杂的技术。与白盒测试一样,审查通常针对软件的各个单元进行,因为一个有效的审查过程要求的是集中而详尽的检查。

    与审查和白盒测试不同,功能测试或黑盒测试假设对软件的实现一无所知,它测试由受控输入所驱动的输出。功能测试由测试人员或开发人员所编写的测试过程组成,它们规定了一组特定程序输入对应的预期程序输出。测试运行之后,测试人员将实际输出与预期输出进行比较,查找问题。黑盒测试可以有效地找出未能实现的需求、接口问题、性能问题和程序最常用功能中的错误。

    虽然将这些技术结合起来可以找出隐藏在一个特定软件程序中的大部分错误,但它们也有局限。代码审查和白盒测试每次只针对一小部分代码,忽视了系统的其它部分。黑盒测试通常将系统作为一个整体来处理,忽视了实现的细节。一些重要的问题只有在集中考察它们在整个系统内相互作用时的细节才能被发现;传统的方法无法可靠地找出这些问题。必须整体地检查软件系统,查找具体问题的特定原因。由于详尽彻底地分析程序中的每个细节和它与代码中所有其它部分之间的相互作用通常是不大可能的,因此分析应该针对程序中已经知道可能导致问题的特定方面。本文将探讨其中三个潜在的问题领域:

    * 堆栈溢出

    * 竞争条件

    * 死锁

    读者可在网上阅读本文的第二部分,它将探讨下列问题:

    * 时序问题

    * 可重入条件

    在采用多任务实时设计技术的系统中,以上所有问题都相当普遍。

    堆栈溢出

    处理器使用堆栈来存储临时变量、向被调函数传递参数、保存线程“状态”,等等。如果系统不使用虚拟内存(换句话说,它不能将内存页面转移到磁盘上以释放内存空间供其它用途),堆栈将固定为产品出厂时的大小。如果由于某种原因堆栈越出了编程人员所分配的数量范围,程序将变得不确定。这种不稳定可能导致系统发生严重故障。因此,确保系统在最坏情况下能够分配到足够的堆栈至关重要。

    确保永不发生堆栈溢出的唯一途径就是分析代码,确定程序在各种可能情况下的最大堆栈用量,然后检查是否分配了足够的堆栈。测试不大可能触发特定的瞬时输入组合进而导致系统出现最坏情况。

    堆栈深度分析的概念比较简单:

    1. 为每个独立的线程建立一棵调用树。

    2. 确定调用树中每个函数的堆栈用量。

    3. 检查每棵调用树,确定从树根到外部“树叶”的哪条调用路径需要使用的堆栈最多。

    4. 将每个独立线程调用树的最大堆栈用量相加。

    5. 确定每个中断优先级内各中断服务程序(ISR)的最大堆栈用量并计算其总和。但是,如果ISR本身没有堆栈而使用被中断线程的堆栈,则应将ISR使用的最大堆栈数加到各线程堆栈之上。

    6. 对于每个优先级,加上中断发生时用来保存处理器状态的堆栈数。

    7.如果使用RTOS,则加上RTOS自身内部用途需要的最大堆栈数(与应用代码引发的系统调用不同,后者已包含在步骤2中)。

    除此之外,还有两个重要事项需要考虑。首先,仅仅从高级语言源代码建立的调用树很可能并不完善。大部分编译器采用运行时库(run-time library)来优化常用计算任务,如大值整数的乘除、浮点运算等,这些调用只在编译器产生的汇编语言中才可见。运行时库函数本身可能使用大量的堆栈空间,在分析时必须将它们包括进去。如果使用的是C 语言,则以下所有类型的函数(方法)也都必须包含到调用树内:结构器、析构器、重载运算符、复制结构器和转换函数。所有的函数指针也都必须进行解析,并且将它们调用的函数包含进分析之中。

    第二,编译器使用一个C库来实现memcpy()、cos()和atof ()等标准函数,而这些例程的源代码可能无法得到。如果能够得到它们的源代码,就有可能确定程序用到的每个库调用在最坏情况下的堆栈使用数量。如果这些库只包含在目标文件中,则编译器厂商必须提供每个库例程使用的堆栈数。如果没有这些信息,就无法通过分析来确定最坏情况下程序使用的最大堆栈数。幸运的是,许多面向嵌入式系统的编译器厂商都提供这些信息。

    通常,每次一个函数被调用时,编译器将使用堆栈来保存返回地址并传递函数参数。函数的自动(局部)变量通常也在堆栈当中。不过,由于编译器会尽可能通过将参数或局部变量放入寄存器来优化代码,因此检查汇编语言以精确地确定堆栈用量非常重要。编译器也有可能在代码中的其它地方选择使用堆栈,如用堆栈来保存中间计算结果。

    有些与编译器一起打包销售的开发环境包含生成调用树的工具,还有许多第三方的调用树生成工具。但是,除非它们能够对汇编语言进行分析,否则这些工具可能会遗漏运行时库和C库的调用。不过无论在哪种情况下,开发分析汇编语言文件并提取函数名称以及各函数内部调用的脚本都比较简单。分析的结果可写入一个文件,而这个文件能够方便地输入到表格之中。

    确定了各个函数的堆栈用量之后,必须计算每个线程所需的最大堆栈数。由于一般程序通常涉及数百个函数,调用跨越多层深度,处理这些信息的一种简便方法就是采用分析表格。如表1所示,表格的各行包含了函数名称、该函数使用的最大堆栈数(包括调用其它函数所需的堆栈数),以及它调用的所有函数的清单。通过编程控制,这个表格从每个函数的"根"开始迭代循环,计算该函数及其调用的所有函数需要的堆栈。这些信息存放在堆栈路径列中,这样,采用每个线程根函数(如main)的堆栈路径数据就可以方便地计算出需要的最大堆栈数了。这个过程包含了先前介绍的堆栈分析过程中的前四个步骤。

    有时候,采用堆栈深度分析过程可能是无法做到,或者是不实际的。如果无法得到运行时库或C库的源代码,而编译器厂商又没有提供任何堆栈使用信息,就不可能进行完整的堆栈分析。在这种情况下,有两种选择:

    1. 在测试期间,观察堆栈所能达到的深度,并保证有较大的堆栈空间余量。

    2. 检测堆栈溢出,并采取改进措施。

    观察堆栈深度的方法很简单:

    * 向整个内存堆栈区写入一个特定的数据图案符号,如55AA。

    * 在预期使用最大堆栈空间的条件下运行系统。

    * 使用仿真器或其它工具检查堆栈存储区,看有多少符号图案由于堆栈的使用而被改写了。

    当然,这些步骤并不能保证在一些不同条件下不会需要更多的堆栈,但确实可以表明所需要的最小堆栈数。

    使用带内存管理单元(MMU)的处理器时,有可能检测出运行时的堆栈溢出现象。MMU将内存划分为多个区域,用一个受保护的内存段来“警戒”堆栈区域。发生堆栈溢出时,处理器将访问这个受保护段。这个操作将引发一个异常事件(如产生SIGSEGV信号),可被程序捕获到。创建线程时,与实时POSIX标准兼容的RTOS提供有这种堆栈警戒功能选项,大大简化了编程人员的工作。GNU工具等其它开发环境包含有编译器开关,可在程序中添加实现堆栈警戒功能所需的代码,但它们仍然依靠底层操作系统来有效地处理堆栈溢出。但是,按照这种方式检测溢出还只是问题的一部分。为了使这类设计更为有效,系统必须能够从堆栈溢出中恢复过来并继续正确地工作。

    在一个对安全或任务要求严格的应用中,系统运行时在测试或检测堆栈溢出期间监视堆栈的深度可能并不是一项足够的风险控制措施。对于一些应用,必须确保系统绝对不会越出所分配的堆栈范围;只有通过完整的堆栈深度分析才能证明这一点。这意味着,如果整个程序在同一内存空间运行,则必须对所有代码执行这项分析。不过,如果使用MMU,分析常可简化。在设计系统时,可将所有关键代码置于一个或多个独立线程内,而这些线程分别在各自的保护内存段中运行。这样,只要对这些关键线程进行堆栈使用分析就可以了。当然,这项简化设计假定当非关键线程溢出其堆栈并失效时,关键线程仍可正确执行。

    由于分析工作所需的堆栈使用数据来自汇编语言清单,因此修改代码时,相应模块的堆栈使用信息必须予以更新。如果使用不同的编译器版本,或者改变了优化设置,也必须复核整个分析过程。在理想情况下,编译器将提供每个函数(如果不是每个线程的话)的堆栈使用数量,因为它拥有计算需要的所有信息。例如,瑞萨公司提供有Call Walker,这是该公司高性能的Embedded Workshop开发环境的一部分。这个工具可以图形化地显示每个函数使用的调用树和堆栈,包括运行时库和C库的函数。Call Walker也能找出使用堆栈数量最大的路径。使用这样的工具可以实现步骤1到步骤3的自动化。


     

  • JAVA错误处理大集合

    2008-07-24 15:57:32

    JAVA错误处理大集合

    0、 需要标识符
    a) 不在函数内
    1、 非法表达式开始
    b) 可能:丢失括号 .
    2. no data found
    a) 可能:setInt(1,100)中,没有100这个值
    3. 找不到符号
    a) 可能:没导入包
    4. 指定了无效URL
    a) 可能:数据库名或IP错误,即连接出错
    5. 类路径没有找到
    a) 可能: ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    b) 原因: 一般是指包名写错,或者没有import包,或者没有在类路径中找到jar文件
    c) 解决: 没有加载Oracle驱动jar,在.bash_profile中把ojdbc14.jar加进来
    6. 空指针异常
    a) 可能: 数据源错误 比如数据库名或IP错误
    7. 不能执行查询
    a) 可能: 数据库中表的问题,比如列名不存在
    8. invalid identity
    a) 可能: 列名出错
    9. 若在数据库中创建了 两个sequence ,运行时出现异常可能是先后执行了多次select语句,导致与原有的序列号产生冲突
    10. 表名或列名不存在
    a) 可能:表不存在或者没有插入数据到表中
    11. 不支持的类,类的版本错误
    a) 可能:没有导入jdk5.0,或者编译器仍为1.4
    12. MappingNotFoundException
    a) Maybe: In the Eclipse Not refersh , or not exist in the dirctory
    13. HibernateException: /hibernate.cfg.xml not found
    a) Maybe1: hibernate.cfg.xml not in the root directory
    b) Maybe2: Could not parse configuration .
    c) resolve: database not connect or use another database
    14. ConstraintViolationException
    a) Maybe: used a not true database
    15. 驱动没有找到 或者 JDBC Driver not found
    可能:连接数据库的驱动jar包不存在或者版本不一致,比如将旧的版本换成新的会造成该类错误
    16. 空指针异常 , java.lang.NullPointerException 
    a) 可能1:数据库连接出错,比如在hibernate.cfg.xml中的数据错误会导致异常。
    17. 数据插入异常 ,GenericJDBCException: could not insert
    a) 可能1:没有建立表或者表中没有任何数据
    b) 可能2:插入数据后没有执行提交语句:commit
    18. LazyInitializationException 或者延迟加载异常
    a) 可能1:没有在查询语句中加fetch
    19. IdentifierGenerationException
    a) 可能1:高位表没有初始化(比如hi_value中没有记录)
    20. could not initialize a collection: [hibernate.entity.Role.modules#32768] Syntax error: Encountered "-" at line 1, column 132.
    a) 错误原因:<set name="modules" table="module-role" lazy="false">红色字部分中“-”为非法字符,替换为module_role
    21. could not insert collection rows: [hibernate.entity.Module.roles#1]
     在Module.hbm.xml文件的如下配置中加入inverse=”true”
    <set name="roles" table="module_role" inverse="true">

    22.在部署Struts时,出现如下错误信息:
    HTTP Status 404 - Servlet action is not available
     
    type Status report
    message Servlet action is not available
    descrīption The requested resource (Servlet action is not available) is not available.
    问题原因:
    1.、web.xml文件中未配置ActionServlet。
    2、struts-config.xml文件未配置你要访问的Action。
    3、你的jsp文件form标记中action属性的路径名称错误。
    4、非以上三种情况。
    针对以上4种情况相应的解决方案如下:
    1、在web.xml文件中加上ActionServlet的配置信息
    ?????? /WEB-INF/struts-config.xml?
    ?2、在struts-config.xml文件检查你要访问的Action配置文件。
    3、检查jsp文件form标记中action属性的路径名称是否与struts-config.xml文件中action标记的path属性的路径名称一致。
    4、非以上情况的解决办法就是检查web容器的log日志,如果时tomcat则检查下logs目录下的localhost_log文件,看里边是否记录有错误信息,然后根据错误信息提示将其纠正。

    23.java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter
    缺少spring-framework-2.0.3\lib\jakarta-commons\commons-beanutils.jar
    24.
    ava 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type  
    缺少spring-framework-2.0.3\lib\asm\asm-2.2.2.jar包,版本不同,该包的名字有相应的区别

    java 代码Caused by: java.lang.NoClassDefFoundError: org/dom4j/DocumentException  
    缺少spring-framework-2.0.3\lib\dom4j\dom4j-1.6.1.jar包,版本不同,该包的名字有相应的区别
    把这个包进去就可以了:\Spring206\lib\dom4j、dom4j-1.6.1.jar

    java 代码Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap  
    缺少spring-framework-2.0.3\lib\jakarta-commons\commons-collections.jar包,版本不同,该包的名字有相应的区别

    java 代码Caused by: java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter  
    缺少spring-framework-2.0.3\lib\cglib\cglib-nodep-2.1_3.jar包,版本不同,该包的名字有相应的区别

    java 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor  
    缺少hibernate-3.2\lib\asm.jar包,版本不同,该包的名字有相应的区别

    java 代码
    org.hibernate.exception.SQLGrammarException: could not load an entity: [www.proudsoul.xml.User#1] 
    JAVA工程与WEB工程包的区别:一个是asm.jar,一个是jta.jar

    java 代码Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager  
    缺少spring-framework-2.0.3\lib\j2ee\jta.jar包,版本不同,该包的名字有相应的区别此种错误请检查相应的***.hbm.xml配置文件的配置

    25,
    Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value
    Caused by: org.hibernate.exception.SQLGrammarException: could not get next sequence value
    原因:没有加Sequence或者数据库的方言写错了

    26,
    我的配置文件
        <id name="id" column="id">
                <generator class="native" />
            </id>
    然后我运行保存一条数据进去
    The database returned no natively generated identity value
    就会报这个错误
    因为你native是根据看底层数据库的能力选择identity, sequence 或者hilo中的一个
    而我建表的时候id没有指定
    alter table `student` change `id` `id` int auto_increment
    我们把我们的表的结构小小的改动一下就没问题了

    27,
    UpdateManager无法启动2007-08-09 15:21如果在应用程序安装过程中,暴力中断安装程序,会出现如下状况:1.apt-get remove 和dpkg --remove 无法删除软件 2.UpdateManager无法启动3.新立得软件包管理程序无法启动
    以上可能是deb损坏之类造成的
    sudo dpkg -r sqldveloper
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树... 完成
    E: 软件包 sqldeveloper 需要重新安装,但是我无法找到相应的安装文件。
    解决方法:1.从 /var/lib/dpkg/status 中把对应的段删掉
    重要:修改之前请先备份
    在status中找到你对应的包删除就OK了...

    28,
    Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException
    少了antlr-2.7.5H3.jar包,从D:\eclipse\eclipse\plugins\com.genuitec.org.hibernate.eclipse_4.1.1\myeclipse-data\3.0\lib

    29,
    Caused by:
    java.lang.NoClassDefFoundError: javax/transaction/Synchronization
    缺少Spring206\lib\j2ee\jta.jar

    30,
    Caused by:
    java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy3] to required type [business.impl.PriceBiz] for property 'priceBiz': no matching editors or conversion strategy found
    在java类中设置priceBiz时应该设置的是接口PriceBizIf,而非实现类

    18, 数组越界
     可能1: 在命令行后面需要加入参数.
     可能2:加入的参数错误
    19, car is not mapped
     可能1: 在cfg.xml中没有增加映射的hbm.xml文件在<mapping.../>中   
    20, 属性没有找到
     可能1: hbm.xml文件中的 <property name =""> 有问题, 也许是name的值与对应类中的成员名不一致
    21,SQLException: 无当前连接          可能1:在比如创建帐户时没有对相应的方法添加到<list>中去,比如这个没有加入:<value>newAccount</value>
     
     <bean id="transactionAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
      <property name="advice">
       <ref bean="advice"/>
      </property>
      <property name="mappedNames">
       <list>
        <value>transfer</value>
       </list>
     </bean>
    22,SQLException: Syntax error: Encountered "table" at line 1, column 8.
     可能1;执行SQL时出现冲突,可能是SQL语句中使用了关键字作为变量来用,比如
      update order set balance=1000000;
      其中order被用作表名来使用,这是错误的,因为order是个关键字,用在order by中

    23, Servlet /Spring-WebMvc threw load() exception
    org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
     jar包的冲突,spring-1.2.6.jar和spring.jar出现在一个war的目录中:JBoss/server/all/deploy/Spring-WebMvc.war/WEB-INF/lib   

    24, java.sql.SQLException: 当事务仍处于活动状态时,无法关闭连接。


    25 ,
    validateJarFile(/home/soft01/Tomcat/webapps/sms-token-struts/WEB-INF/lib/servlet-api.jar)
    Servlet /sms-struts-tiles threw load() exception
    java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
    原因:在WEB-INF/lib/ 目录下有servlet-api.jar与/Tomcat/common/lib目录下的servlet-api.jar冲突了,把WEB-INF/lib/下的servlet-api.jar删除就可以了

    26,java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn
    Marking servlet action as unavailable
    10:30:47,088 ERROR [/NetCT_OSS]:3953 - Servlet /NetCT_OSS threw load() exception
    javax.servlet.UnavailableException

    27,org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
    缺少MyEclipse/eclipse/plugins/com.genuitec.eclipse.springframework_5.5.0/data/2.0/dist/modules/spring-struts.jar

    28,Caused by: java.sql.BatchUpdateException: ORA-02291: integrity constraint (SD0702.FK82D343CF49A4B831) violated - parent key not found
    Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    有可能是ID生成策略的问题,我将它XML映射文件改成<generator class="increment" />就好了

    29,
    2007-08-19 16:21:43,290 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/OSS].[action]] - Servlet.service() for servlet action threw exception
    org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [entity.Module#2]
    java.util.ConcurrentModificationException
    原因:已经有对象拥有了所选择的module,用clear(),而不是remove();

    30,
    ERROR [org.apache.catalina.session.ManagerBase] - IOException while loading persisted sessions: java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
    java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
    在Module中加上一个关键字:transient

    31,
    Caused by: java.sql.BatchUpdateException: ORA-02292: integrity constraint (SD0702.SYS_C00132664) violated - child record found
    原因:有其他的表引用了该表的外建,所以报这个异常,如果没有引用就不会出现

    32,
    出现数组越界的时候,看看是不是循环时没有加=,比如:
    for(int i = 1; i<arr.length;i++)可以改成
    for(int i = 1; i<=arr.length;i++)

     

    1.如果使用Ant和Junit是被报找不到test,检查一下是否误用了private
    出错信息:
        <failure message="No tests found in test.AllTest" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: No tests found in test.AllTest
    该错误有个很特别的特点,当你不通过ant来运行测试,而是通过AllTest类来运行的话,可以正常运行。小心哦

    2.如果遇到报:表名无效,且jvm报严重错误,看看是不是用了数据库的保留关键字来做表名了,如User。

    3.使用ant时必须小心ant的classpath它用的不是IDE的classpath,小心!

    4.小心下边的异常,
    exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of xp.bean.Users.?" type="net.sf.hibernate.PropertyAccessException">java.lang.ClassCastException at xp.bean.UsersMetaClass1.setPropertyValues(<generated>) at net.sf.hibernate.persister.AbstractEntityPersister.setPropertyValues
    上次出现该错错误的原因是:
    源文件里我的class类型为一个类Contact contact
    而跑到mapping里却成了Set,呵呵厉害。

    5.突然间冒出大量的NullPointException
    重新build一下看看先。

    6.="Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by cascade"

    7.Tapestry的出错信息:
    Class com.bookshop.Hello does not implement the IPage interface.
    location: context:/WEB-INF/Home.page, line 6
    原因:与显示有关的哪个java类没有从IPage家族继承。

    8.使用ant时给出的路径好象不允许出现空格。

    9.由于使用ant时用junit做测试的话,classpath中出现j2ee.jar的话,问题多多。例如xml格式的log文件生成不了,莫名其妙的NullPointException等。所以我设置了两个包个包含j2ee.jar,为编译用;一个没有,为junit用

    10.进行单元测试时,在查询返回后应马上assertNotNull(),这样可以更快速的定位NullPointException

    11.要使用ResourceBundle的话,要千万小心。必须用日志记录下它的状态。还有该属性文件应该放在classes下面。

    12.当要显示任何页面时,都被提示无效,那么应该检查一下lib目录了,还有一些很奇怪的异常,例如你明明可以找到一个类但是服务器却提示ClassNotDefException,那么估计是缺少了该类所必须的包了。或者多了不兼容的包,如, xdoclet系列包不被struts的lib目录所兼容

    13.编写clone时从Java编程思想(2nd)上学到的(732):
    .引数传递过程中会自动产生别名(alias)。
    .没有局域对象(local objects),只有局域性的(local)references。
    .reference受范围(scope)的限制,对象则否。
    .对象的寿命从来不是Java的讨论议题(因为有垃圾回收机制)

    14.try catch finally的域居然是分离的。

    15.jsp乱码的其中一个原因:charset="gb2312" 等号"="的两边不允许有空格。

    16.我的基于Displaytag的简单报表解决方案。
    http://displaytag.sourceforge.net/
    下载displaytag.jar和displaytag.tld
    displaytag.jar放在lib目录,而displaytag.tld放在WEB-INF目录,在web.xml中为displaytag.tld声明一下。
      <taglib>
        <taglib-uri>http://displaytag.org</taglib-uri>
        <taglib-location>/WEB-INF/displaytag.tld</taglib-location>
      </taglib>
    在jsp里使用前,加上
      <%@ taglib uri="
    http://displaytag.org" prefix="display" %>
           
    注意该软件有个bug,他要用的一个包common-lang.jar版本必须在2.0以上。
    如果碰到下面异常,则应坚持一下是否该包的版本问题。
    java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.capitalize(Ljava/lang/String;)Ljava/lang/String;
    然后就可放心使用了
    <display:column property = "xxx"/>其中xxx为对象中的带有getter的变量>。
    定义表格的样子,用css定义。如
    TABLE.its THEAD TR {
     BACKGROUND-COLOR: #69c
    }
    TABLE.its TR.even {
     BACKGROUND-COLOR: #def
    }
    在使用分页时,可能会出现这种情况,点击其他页时,弹出下载窗口,让你下载当前jsp页面,这是因为你在当前页面读取了数据的缘故。解决办法为在action里读取数据而不是在jsp里。可以参考
    http://www.displaytag.org/example-paging.jsp?d-26189-p=2

    17.使用displaytag时,在一列中放入多个元素
    必须在display:table中定义一个id
    <display:table name = "allBooks" class = "its" pagesize = "5" id = "item">
      <display:column title = "操作">
        <a href = "/Bookshop/admin/bookManagement.do?action=view&id=<%=((Book)item).getId()%>" target = "_blank" >查看</a>
        <a href = "/Bookshop/admin/bookManagement.do?action=edit&id=<%=((Book)item).getId()%>">编辑</a>
        <a href = "/Bookshop/admin/bookManagement.do?action=delete&id=<%=((Book)item).getId()%>">删除</a>
      </display:column>
    要在displaytag中使用链接,必须具备paramId,否则不显示为链接
     <display:column property = "product.name" href = "viewDetailV2.0.jsp" title = "书名" paramId="item" paramProperty="product.id"/>
    可以这样使用display
      <display:column property = "product.id" title = "ID"/>
    其中product为对象

    18.<bean:write name = "xxxx" property = "xxx"/> 可以直接取到session.getAttribute()取到的东西。

    19.实验struts-upload例子时要注意的地方:
       1.If you would rather write this file to another file, please check here:
     这一行要打钩
       2.If you checked the box to write to a file, please specify the file path here:
    在这里要重命名如:c:\b.jpg
    上传成功的话,会出现提示 The file has been written to "c:\b.jpg"

    20.Hibernate的like可以这么用:
          Query query = session.createQuery("from src.persistent.Book as book where upper(book.name) like :name ");
          query.setString("name", "%");
          result = query.list();

    21.Hibernate出现 duplicate import : className
    异常也可能是因为忘了为持久类在configuration中addClass了
         
    22.<logic:iterate id = "author" name = "authors">
    name所引用的是session里的attribute。

    23.如果发现要出现询问下载的情况,有可能是因为要跳转的页面出现了问题。试试在要跳转到的页删掉
    <%@ page contentType="text/html; charset=gb2312"%>

    24.如果JSP页面跳转时出现下边的错误信息:
    The request sent by the client was syntactically incorrect (Invalid path /web/shoppingCart was requested).
    原因是struts-config的action = "x" 写成了 action = "x.do"

    25.在struts中,strut-config.xml中,forward时使用redirect = "true"可以将.do重定向为.jsp

    26.以后在判断相等性之前先用logger把两个值显示出来。

    27.从session里getAttribute后,修改并不需要重新setAttribute一次。

    28.在hibernate中使用subclass是一棵继承树共用一个表,仅生成个mapping。
    每个类中必须有discrimator-value。在最上层的类中必须声明:
    @hibernate.discriminator column = "class"。
    不可以将子类添加到configuration里去。(即不可addClass(子类))
    使用Xdoclet的建立subclass的例子(该类是父类)
    /**
     * @hibernate.class discriminator-value = "customer"
     * @hibernate.discriminator column = "class"
     */

    而使用joined-subclass则是一类一表,也不许将子类添加进configuration里去。
    /**
     * @hibernate.joined-subclass
     * @hibernate.joined-subclass-key
     * column="customer_id"
     */
    如果发现生成的mapping文件中joined-subclass的key column为空,那么可能是@hibernate.joined-subclass-key这句没有写对。
    用joined-subclass生成的表,仔细看。Member extends Customer
    create table Customer (
       id VARCHAR2(255) not null,
       name VARCHAR2(255),
       descrīption VARCHAR2(255),
       primary key (id)
    )
    create table Member (
       customer_id VARCHAR2(255) not null,
       password VARCHAR2(255),
       primary key (customer_id)
    )

    29.在junit中尽量使用assertEquals代替assertTrue;

    30.Hibernate
    如果Child extends Parent
    那么from Parent as parent 也将会将Child选出来,而from Child as child 则不会选出Parent

    31.Hibernate
    使用hibernate的one-to-one时,应该两方向都set,否则会报save NullPointException
    parent.setChild(child);
    child.setParent(parent);

    32.Hibernate
    遇到下边的异常,估计是与因为外键出现了问题:

    java.lang.NullPointerException
     at net.sf.hibernate.persister.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:675)
     at net.sf.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:33)
    如:
    * @hibernate.id generator-class = "foreign"
    * @hibernate.generator-param name = "property" value = "customer"
    * @hibernate.one-to-one name = "custmoer" class = "src.persistent.Customer"
    value的值和one-to-one 中name的值不符,则会出现上边的异常。如果不显示指定name则默认取成员变量名

    Customer a
    则name = "a" 需要小心的是不是类名。所以,以后最好显示指定名字为好。

    33.出现异常:
    Exceptionobject references an unsaved transient instance - save the transient instance before flushing: src.persistent.Product
    原因没有为某对象进行set设置, 如上边的这个就是某对象没有调用setProduct

    34.
    "xxx action = "/a" 不用.do和根目录名
    <a href = "b.do" 需要.do和根目录名

    35.
    Caused by: java.sql.SQLException: ORA-02291: 违反完整约束条件 (BOOKSHOP.FK4AAEE
    47687CCA6B) - 未找到父项关键字
    如果你觉得该做的e是出现这个问题,那么检查一下,是否将类的继承关系在hibernate的mapping中反映了出来。joined-subclass或subclass
    例如a extends b
    如果持久类c 需要Set的是持久类a,那么你把b传入,而b又没有在mapping中将父子关系反映出来的话,就会出现该异常

    36.使用DynaActionForm需要注意的问题
    在struts-config声明
    <form-bean name="memberloginForm" dynamic ="true" type="org.apache.struts.action.DynaActionForm">
      <form-property name = "name" type = "java.lang.String"/>
      <form-property name = "password" type = "java.lang.String"/>
    </form-bean>
    在Action里将form强制转化成DynaActionForm,然后get("属性名")就可以了

    37.那位大侠能给出一个用hibernate进行分页得实际例子,学习中!
    http://forum.hibernate.org.cn/viewtopic.php?t=1772
    Query q = s.find(".....");
    q.setFirstResult(10);   //  从第11条记录开始
    q.setMaxResults(100);  //  取出100条
    ......

    38.struts的validate最简单实现
    1.首先准备好错误提示信息。
    xxx.properties 里
    errors.required={0} is required.(默认已有)
    2.Form必须从ValidatorForm继承
    3.不可以重载ValidatorForm的validate函数
    4.在validate.xml中为你想验证的表单进行验证设计。例如
    <form name="logonForm">
        <field property="userName" depends="required">
     <arg0 key="prompt.userName"/>
     (该参数将在显示错误信息是从xxx.properties读取prompt.userName,填入{}方括号里,取代0。如果是arg1将将填入{1}位置,以此类推。
        </field>
    </form>
    不需要在action里做任何处理。只管forward就行了。作为forward的目标页,不需要任何有关用于处理出错信息的处理。

    39.服务器报
    The requested resource (/xxxx/xxx.htm) is not available.的很奇怪的一个的可能原因
    在web.xml中定义的tld,没有找到
    或者是lib目录下的包太多出现了问题。

      <taglib>
        <taglib-uri>/spring</taglib-uri>
        <taglib-location>/WEB-INF/spring.tld</taglib-location>
      </taglib>
    如WEB-INF目录下不存在spring.tld的话,就会报上边的错误

    40.
    spring的xxx-servlet.xml的使用SimpleFormController系列的类问题:
      <bean id = "priceIncreaseForm" class="PriceIncreaseFormController">
        <property name="sessionForm"><value>true</value></property>
        <property name="beanName"><value>priceIncrease</value></property>
        <property name="commandClass"><value>PriceIncrease</value></property>
        <property name="formView"><value>priceIncrease</value></property>
        <property name="successView"><value>hello</value></property>
        <property name="productManager">
          <ref bean="prodMan"/>
        </property>
      </bean>
    这里要注意几个问题:
    (1)上边的PriceIncrease是了类名,必须在classes里存在该类,否则报:
    PropertyVetoExceptionsException: 1 errors:-- ErrorCodedPropertyVetoException: message=[Failed to convert property value of type [java.lang.String] to required type [java.lang.Class] for property named 'commandClass'; nested exception is:
     java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease]; errorCode=[typeMismatch]
    java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease
    (2)<property name="formView"><value>priceIncrease</value></property>
    这一行必不可少,priceIncrease是页面的名字,他将会是prefix + priceIncrease + suffix
    如果缺少该行,则报:
    javax.servlet.ServletException: Error in ModelAndView object or View resolution encountered by servlet with name 'pocketSpring': View to render cannot be null with ModelAndView [ModelAndView: materialized View is [null]; Model=[{priceIncrease=PriceIncrease@148e798, org.springframework.validation.BindException.priceIncrease=org.springframework.validation.BindException: BindException: 0 errors}]]

    使用Errors的rejectValue相关问题:
    rejectValue(java.lang.String field, java.lang.String errorCode, java.lang.Object[] errorArgs, java.lang.String defaultMessage)
    Reject the given field of the current object, using the given error descrīption.
    当前对象指的是xxx-servlet.xml中与validator类有联系的哪个对象。
             
    第一个是:当前对象的属性名,必须存在
    第二个是:将要从属性文件中读取的消息
    第三个是:传递给所读取的消息的参数,如:
    error.too-low=You have to specify a percentage higher than {0}!
    第四个是:当从属性文件中读取消息不成功时,所reject的值

    以后从request中读取parameter可以借用spring的RequestUtils包里的
    getStringParameter
    public static java.lang.String getStringParameter(javax.servlet.http.HttpServletRequest request,
                                               &bsp;      java.lang.String name,
                                                      java.lang.String defaultVal)
    Get a string parameter, with a fallback value. Never throws an exception. Can pass a distinguished value to default to enable checks of whether it was supplied.
    不会抛异常
    Hibernate的问题:2.1rc的问题
    INFO: cache provider: net.sf.ehcache.hibernate.Provider
    net.sf.hibernate.HibernateException: could not instantiate CacheProvider:
    解决办法,2.1rc比以前的版本多需要一个包
    ehcache.jar

    43.static的问题
    static函数只可以访问static成员变量。
    而static变量可以被任何成员函数访问。

    44.
    java.lang.NoClassDefFoundError: javax/transaction/Synchronization];
    需要添加JTA.jar


     

  • 中国人的8大消费心理

    2008-07-23 15:37:03

     一、 面子心理

      中国的消费者有很强的面子情结,在面子心理的驱动下,中国人的消费会超过甚至大大超过自己的购买或者支付能力。营销人员可以利用消费者的这种面子心理,找到市场、获取溢价、达成销售。

      脑白金就是利用了国人在送礼时的面子心理,在城市甚至是广大农村找到了市场;当年的TCL凭借在手机上镶嵌宝石,在高端手机市场获取了一席之地,从而获取了溢价收益;终端销售中,店员往往通过夸奖消费者的眼光独到,并且产品如何与消费者相配,让消费者感觉大有脸面,从而达成销售。

     

     二、 从众心理

      从众指个人的观念与行为由于受群体的引导或压力,而趋向于与大多数人相一致的现象。消费者在很多购买决策上,会表现出从众倾向。比如,购物时喜欢到人多的商店;在品牌选择时,偏向那些市场占有率高的品牌;在选择旅游点时,偏向热点城市和热点线路。

      以上列举的是从众心理的外在表现,其实在实际工作中,我们还可以主动利用人们的从众心理。比如:现在超市中,业务员在产品陈列时故意留有空位,从而给人以该产品畅销的印象;电脑卖场中,店员往往通过说某种价位以及某种配置今天已经卖出了好多套,从而促使消费者尽快做出销售决策;SP行业中,在推铃声广告的时候,往往也多见最流行铃声推荐的字眼,最流行也就是目前最多人喜欢,这都是在主动的利用消费者的从众心理。

     

     三、 推崇权威

      消费者推崇权威的心理,在消费形态上,多表现为决策的情感成分远远超过理智的成分。这种对权威的推崇往往导致消费者对权威所消费产品无理由的选用,并且进而把消费对象人格化,从而达成产品的畅销。

     现实中,营销对消费者推崇权威心理的利用,也比较多见。比如,利用人们对名人或者明星的推崇,所以大量的商家在找明星代言、做广告;IT行业中,软件公司在成功案例中,都喜欢列举一些大的知名公司的应用;余世维先生有说在自己汽车销售店中,曾经以某某车为某某国家领导人的座车为卖点,从而让该车销售火爆;更大的范围内,很多企业都很期望得到所在行业协会的认可,或者引用专家等行业领袖对自己企业以及产品的正面评价。 

     

       四、 爱占便宜

      刘春雄先生说过:”。“便宜”与“占便宜”不一样。价值50元的东西,50元买回来,那叫便宜;价值100元的东西,50元买回来,那叫占便宜。中国人经常讲“物美价廉”,其实,真正的物美价廉几乎是不存在的,都是心理感觉的物美价廉。

      他进而说道:消费者不仅想占便宜,还希望“独占”,这给商家有可乘之机。比如,女士在服装市场购物,在消费者不还价就不买的威胁之下,商家经常做出“妥协”:“今天刚开张,图个吉利,按进货价卖给你算了!”“这是最后一件,按清仓价卖给你!”“马上要下班了,一分钱不赚卖给你!”这些话隐含如下信息:只有你一人享受这样的低价,便宜让你一人独占了。面对如此情况,消费者鲜有不成交的。除了独占,另外消费者并不是想买便宜的商品而是想买占便宜的商品,这就是买赠和降价促销的关键差别。  

      五、 害怕后悔

      每一个人在做决定的时候,都会有恐惧感,他生怕做错决定,生怕他花的钱是错误的。按照卢泰宏先生提到的就是购后冲突,所谓购后冲突是指:消费者购买之后出现的怀疑、不安、后悔等不和谐的负面心理情绪,并引发不满的行为。

     

      通常贵重的耐用消费品引发的购后冲突会更严重,为此国美针对消费者的这个心理,说出了“买电器,到国美,花钱不后悔”,并作为国美店的店外销售语。进一步说在销售的过程中,你要不断地提出证明给顾客,让他百分之百地相信你。同时你必须时常问你自己,当顾客在购买我的产品和服务的时候,我要怎样做才能给他百分之百的安全感?  

     

      六、 心理价位

      任何一类产品都有一个“心理价格”,高于“心理价格”也就超出了大多数用户的预算范围,低于“心理价格”会让用户对产品的品质产生疑问。因此,了解消费者的心理价位,有助于市场人员为产品制定合适的价格,有助于销售人员达成产品的销售。

      在IT行业,无论是软件还是硬件设备的销售,如果你了解到你的下限售价高于客户的心理价位,那么下面关键的工作就是拉升客户的心理价位,相反则需要适度提升你的售价;心理价位在终端销售表现就更为明显,以服装销售为例,消费者如果在一番讨价还价之后,如果最后的价格还是高于其心理价位,可能最终还是不会达成交易,甚至消费者在初次探询价格时,如果报价远高于其心理价位,就会懒得再看扭头就走。  

      七、 炫耀心理

      消费者炫耀心理,在消费商品上,多表现为产品带给消费者的心理成分远远超过实用的成分。正是这种炫耀心理,在中国目前并不富裕的情况下,创造了高端市场,同时利用炫耀心理,在国内企业普遍缺乏核心技术的情况下,有助于获取市场,这一点在时尚商品上表现得尤为明显。

     

      为什么这样说呢?女士都钟爱手袋,一些非常有钱的女士为了炫耀其极强的支付能力,往往会买价值几千甚至上万的世界名牌手袋。同时国内的TCL和夏新手机,之前在缺乏核心技术的情况下,在与NOKIA和MOTO的竞争中,劣势不是特别明显,其中通过工业设计给手机时尚的外表造型就功不可没。因此,对消费者来说,炫耀重在拥有或者外表。

      

      八、 攀比心理

      消费者的攀比心理是基于消费者对自己所处的阶层、身份以及地位的认同,从而选择所在的阶层人群为参照而表现出来的消费行为。相比炫耀心理,消费者的攀比心理更在乎“有”——你有我也有。

      MP3、MP4、电子词典的热销并且能形成相当的市场规模,应该说消费者的攀比心理起到推波助澜的作用。很多商品,在购买的前夕,萦绕在消费者脑海中最多的就是,谁谁都有了,我也要去买。在计算机的配置中,也多见学生出于同学们都有的心理,也要求父母为自己购买计算机。对营销人员来说,我们可以利用消费者的攀比心理,出于对其参照群体的对比,有意强调其参照群体的消费来达成销售。

  • 典型测试错误(英中文对照)

    2008-07-22 09:19:52

    t's easy to make mistakes when testing software or planning a testing effort. Some mistakes are made so often, so repeatedly, by so many different people, that they deserve the label Classic Mistake.
    在测试软件或制订测试工作计划时很容易犯一些错误。有些错误经常被许多不同的人一而再、再而三地犯,应该被列为典型错误。

    Classic mistakes cluster usefully into five groups, which I've called "themes":

    典型错误可以有效地分为五组,我把这些组称为“主题”。

    · The Role of Testing: who does the testing team serve, and how does it do that?

    · 测试的作用:谁承担测试小组的责任,如何做?

    · Planning the Testing Effort: how should the whole team's work be organized?

    · 制订测试工作计划:应该如何组织整个小组的工作?

    · Personnel Issues: who should test?

    · 人员问题:谁应该做测试?

    · The Tester at Work: designing, writing, and maintaining individual tests.

    · 工作中的测试员:设计、编写和维护各测试。

    · Technology Rampant: quick technological fixes for hard problems.

    · 过度使用技术:艰难问题的快速技术修复

    I have two goals for this paper. First, it should identify the mistakes, put them in context, describe why they're mistakes, and suggest alternatives. Because the context of one mistake is usually prior mistakes, the paper is written in a narrative style rather than as a list that can be read in any order. Second, the paper should be a handy checklist of mistakes. For that reason, the classic mistakes are printed in a larger bold font when they appear in the text, and they're also summarized at the end.

    本文有两个目标。第一,应当识别错误,将它们放到具体环境中,描述它们为什么是错误,并给出替代方法的建议。因为一个错误的具体环境通常是先决错误,所以本文将以叙事的方式而不是以可以按任意顺序阅读的列表方式来描述。第二,本文应该是一个便于查看的错误列表。因为这个原因,文章中出现的典型错误都以大号粗体字印刷,并在文章的结尾处汇总。

    Although many of these mistakes apply to all types of software projects, my specific focus is the testing of commercial software products, not custom software or software that is safety critical or mission critical.

    虽然这些错误很多都适用于所有类型的软件项目,但我的重点将放在商用软件产品的测试上,而不是定制软件或者是高度安全或关键任务的软件测试上。

    This paper is essentially a series of bug reports for the testing process. You may think some of them are features, not bugs. You may disagree with the severities I assign. You may want more information to help in debugging, or want to volunteer information of your own. Any decent bug reporting system will treat the original bug report as the first part of a conversation. So should it be with this paper. Therefore, follow this link for an ongoing discussion of this topic.

    本文主要是测试过程的一系列错误报告。你可能认为它们中的部分属于特性问题而不是 bug。你可能不赞成我设定的严重性级别。你可能需要更多的信息以用于帮助排除错误,或者希望提供你自己的信息。任何设计良好的错误报告系统都将原始的错误报告当作是对话的起始部分。本文也是这样,所以,可以按照链接参加这个主题的讨论。

    Theme One: The Role of Testing

    主题一:测试的作用

    A first major mistake people make is thinking that the testing team is responsible for assuring quality. This role, often assigned to the first testing team in an organization, makes it the last defense, the barrier between the development team (accused of producing bad quality) and the customer (who must be protected from them). It's characterized by a testing team (often called the "Quality Assurance Group") that has formal authority to prevent shipment of the product. That in itself is a disheartening task: the testing team can't improve quality, only enforce a minimal level. Worse, that authority is usually more apparent than real. Discovering that, together with the perverse incentives of telling developers that quality is someone else's job, leads to testing teams and testers who are disillusioned, cynical, and view themselves as victims. We've learned from Deming and others that products are better and cheaper to produce when everyone, at every stage in development, is responsible for the quality of their work ([Deming86], [Ishikawa85]).

    人们犯的第一个主要错误是认为测试小组应当负责质量保证。这个角色常常分配给组织中的第一测试小组,将它作为最后的防御,成为开发小组(被指责为产生低劣质量)和客户(必须受到保护以远离低劣质量)的一个屏障。它的特征是测试小组(常称为“质量保证组”)表面上具有阻止产品发货的权力。这本身是一个令人沮丧的任务:测试小组不能提高质量,只能强制一个最低水平。更糟糕的是,这种权力常常是看上去比实际的重要。如果发现这一点,再加上有违常理地暗示开发人员质量是别人的事情,导致测试小组和测试员感到失望、愤事嫉俗、感觉自己是受害者。我们从Deming 和其他人的工作可以得知:如果每个人都在开发的各个阶段对他们的工作质量负责,则产品会又好又便宜([Deming86],[Ishikawa85])。

    In practice, whatever the formal role, most organizations believe that the purpose of testing is to find bugs. This is a less pernicious definition than the previous one, but it's missing a key word. When I talk to programmers and development managers about testers, one key sentence keeps coming up: "Testers aren't finding the important bugs." Sometimes that's just griping, sometimes it's because the programmers have a skewed sense of what's important, but I regret to say that all too often it's valid criticism. Too many bug reports from testers are minor or irrelevant, and too many important bugs are missed.

    实际上,不管表面上的作用是什么,大多数组织都相信测试的目的是发现 bug。这个定义的危害比前一个定义的危害要小,但是忽略了一个关键词。当我同程序员和开发经理谈到测试员的时候,不时听到一个关键的句子:测试员找不到重要的 bug。有时候这种说法只是一种抱怨,有时候是因为程序员对于什么是正确的感觉不对,但我很遗憾地说,它们经常是有效的批评。测试员的太多的bug 报告是微小的、不相关的,而有太多重要的错误都被遗漏了。

    What's an important bug? Important to whom? To a first approximation, the answer must be "to customers". Almost everyone will nod their head upon hearing this definition, but do they mean it? Here's a test of your organization's maturity. Suppose your product is a system that accepts email requests for service. As soon as a request is received, it sends a reply that says "your request of 5/12/97 was accepted and its reference ID is NIC-051297-3". A tester who sends in many requests per day finds she has difficulty keeping track of which request goes with which ID. She wishes that the original request were appended to the acknowledgement. Furthermore, she realizes that some customers will also generate many requests per day, so would also appreciate this feature. Would she:

    什么是重要的 bug?对谁而言是重要的?直观的估计,答案肯定是“对于客户”。听到这个定义,几乎每个人都会点头称是,但他们确实这样认为吗?这里要测试一下你们组织的成熟度。假设你们的产品是一个接受电子邮件请求服务的系统。当收到请求时,它马上发送一个“您在97年5月12日发送的请求已经受理,参考ID是NIC -051297-3”的答复。一个每天发送很多请求的测试员发现要分清楚哪个请求与哪个ID对应是非常困难的。她希望最初的请求能够附加在确认邮件的后面。并且,她意识到某些可户可能每天也会产生很多请求,所以会高度评价这个功能的。那么她将:

    1. file a bug report documenting a usability problem, with the expectation that it will be assigned a reasonably high priority (because the fix is clearly useful to everyone, important to some users, and easy to do)?

    写一个 bug 报告,记录一个可用性问题,希望能够分配一个合理的高优先级(因为这个修复很明显对每个人都很用,对有部分用户来说还非常重要,并且也容易修改)?

    2. file a bug report with the expectation that it will be assigned "enhancement request" priority and disappear forever into the bug database?

    写一个 bug 报告,希望它被分配为“功能提升请求”优先级并永远从 bug 数据库中消失?

    3. file a bug report that yields a "works as designed" resolution code, perhaps with an email "nastygram" from a programmer or the development manager?

    写一个 bug 报告,产生一个“按设计工作”解决码,可能还加上一个来自程序员或开发经理的“不同意”电子邮件?

    4. not bother with a bug report because it would end up in cases (2) or (3)?

    不打算费事去写 bug 报告,因为它将以情况(2)或(3)结束?

    If usability problems are not considered valid bugs, your project defines the testing task too narrowly. Testers are restricted to checking whether the product does what was intended, not whether what was intended is useful. Customers do not care about the distinction, and testers shouldn't either.

    如果可用性问题不认为是有效的 bug,那么你们的项目将测试任务定义得太狭窄了。测试员严格限制为检查产品是否按预期工作,而不管这种预期是否有效。客户不关心这个区别,测试员也不应该关心。

    Testers are often the only people in the organization who use the system as heavily as an expert. They notice usability problems that experts will see. (Formal usability testing almost invariably concentrates on novice users.) Expert customers often don't report usability problems, because they've been trained to know it's not worth their time. Instead, they wait (in vain, perhaps) for a more usable product and switch to it. Testers can prevent that lost revenue.

    测试员经常是组织中唯一像专家一样大量使用系统的人。他们会注意到专家会看到的可用性问题。(形式上的可用性测试几乎不可避免地集中于没有经验的用户。)专家客户常常不会报告可用性问题,因为他们已经被训练的知道不值得花时间去这样做。相反,他们(也许是徒劳地)等待下一个可用的产品然后切换过去。测试员可以避免这个损失。

    While defining the purpose of testing as "finding bugs important to customers" is a step forward, it's more restrictive than I like. It means that there is no focus on an estimate of quality (and on the quality of that estimate). Consider these two situations for a product with five subsystems.

    将测试的目的定义为“找到对用户重要的 bug ”是向前进了一步,但与我所喜欢定义相比仍有限制。这意味着没有集中于质量评估(以及这种评估的质量)。考虑一下测试含有五个子系统的产品的两种情况。

    1. 100 bugs are found in subsystem 1 before release. (For simplicity, assume that all bugs are of the highest priority.) No bugs are found in the other subsystems. After release, no bugs are reported in subsystem 1, but 12 bugs are found in each of the other subsystems.

    在发布前,在子系统1中找到了100个bug 。(为了简单起见,假设所有的 bug 都是最高级别的。)在其他子系统中没有发现 bug 。在发布后,在子系统1中没有报告 bug ,但在其他每个子系统中都报告了12个 bug 。

    2. Before release, 50 bugs are found in subsystem 1. 6 bugs are found in each of the other subsystems. After release, 50 bugs are found in subsystem 1 and 6 bugs in each of the other subsystems.

    在发布前,在子系统1中找到了50个 bug 。在其他每个子系统中都找到了6个 bug 。在发布后,在子系统1中报告了50个 bug ,在其他每个子系统中都报告了6个 bug。

    From the "find important bugs" standpoint, the first testing effort was superior. It found 100 bugs before release, whereas the second found only 74. But I think you can make a strong case that the second effort is more useful in practical terms. Let me restate the two situations in terms of what a test manager might say before release:

    从“找到重要 bug”的观点看,第1种测试情况较为理想。在发布前找到了100个 bug ,但是第2种情况中只找到74个。但我想你们可能会提出一个有力的理由认为第2中测试在实际中更有用。让我以产品发版前测试经理可能说些什么来重新描述一下两种测试情况:

    1. "We have tested subsystem 1 very thoroughly, and we believe we've found almost all of the priority 1 bugs. Unfortunately, we don't know anything about the bugginess of the remaining five subsystems."

    “我们全面测试了子系统1,我们相信已经找出了几乎所有优先级为1的 bug。不幸的是,我们对其他五个子系统的的 bug 一无所知。”

    2. "We've tested all subsystems moderately thoroughly. Subsystem 1 is still very buggy. The other subsystems are about 1/10th as buggy, though we're sure bugs remain."

    “我们比较全面地测试了所有的子系统。子系统1仍旧有不少 bug。其他子系统虽然还有 bug,但只有子系统1的 bug 的十分之一。”

    This is, admittedly, an extreme example, but it demonstrates an important point. The project manager has a tough decision: would it be better to hold on to the product for more work, or should it be shipped now? Many factors - all rough estimates of possible futures - have to be weighed: Will a competitor beat us to release and tie up the market? Will dropping an unfinished feature to make it into a particular magazine's special "Java Development Environments" issue cause us to suffer in the review? Will critical customer X be more annoyed by a schedule slip or by a shaky product? Will the product be buggy enough that profits will be eaten up by support costs or, worse, a recall?

    必须承认,这是一个极端的例子,但是证明了一个重要的观点。项目经理有一个艰难的决定:是延迟产品交付,再工作一段时间,还是现在就交付使用?许多因素 ——都是一些大致的评估——都必须予以权衡:竞争对手会抢先发布产品并占领市场吗?如果丢掉一个未完工的功能部件会使得某一个杂志的 “Java 开发环境” 特别期刊的评论中对我们造成损害吗?关键客户 X 对产品延期和劣质产品哪一个更感到烦恼?产品是否有很多 bug,以至于支持成本会吃掉利润,或者更糟糕的是将产品召回?

    The testing team will serve the project manager better if it concentrates first on providing estimates of product bugginess (reducing uncertainty), then on finding more of the bugs that are estimated to be there. That affects test planning, the topic of the next theme.

    如果测试小组首先集中于产品错误的估计(减少不确定性),然后再找到更多的错误,他们会更好地服务于项目经理。这会影响测试计划。测试计划将在下个主题中论述。

    It also affects status reporting. Test managers often err by reporting bug data without putting it into context. Without context, project management tends to focus on one graph:

     

  • 持续集成与测试自动化

    2008-07-22 09:05:45

    自动化测试就是希望能够通过自动化测试工具或其他手段,按照测试工程师的预定计划进行自动的测试,目的是减轻手工测试的劳动量,从而达到提高软件质量的目的。自动化测试的目的在于发现老缺陷。而手工测试的目的在于发现新缺陷。

    测试自动化涉及到测试流程、测试体系、自动化化编译、持续集成、自动发布测试系统以及自动化测试等方面整合。也就是说要让测试能够自动化,不仅是技术、工具的问题,更是一个公司和组织的文化问题。首先公司从资金、管理上支持您,其次要有专门的测试团队去建立适合自动化测试的测试流程、测试体系;其次就是把原代码从受控库中取出、编译、集成、发布可运行系统、进行自动化的单元测试和自动化的功能测试的过程。

    (一)、自动化测试的好处

    1、 对新版本执行回归测试--测试每个特征

    对于产品型的软件,每发布一个新的版本,其中大部分功能和界面都和上一个版本相似或完全相同,这部分功能特别适合于自动化测试, 从而可以让测试达到测试每个特征的目的。

    2、 更多更频繁的测试--沉闷、耗时

    我们的产品向市场的发布周期是3个月,也就是我们的开发周期只有短短的3个月,而在测试期间是每天/每2天都要发布一个版本供测试人员测试,一个系统的功能点有几千个上万个,人工测试是非常的耗时和繁琐,这样必然会使测试效率低下。

    3、替代手工测试的困难--300个用户有些非功能性方面的测试:压力测试、并发测试、大数据量测试、崩溃性测试,用人来测试是不可能达到的。 在没有引入自动化测试工具之前,为了测试并发,研发中心的一、两百号人在研发经理的口令:1-、2-、3!, 大家同时按下同一个按钮。回想起这中情景也蛮有意思的。

    4、具有一致性和可重复性

    由于每次自动化测试运行的脚本是相同的, 所以每次执行的测试具有一致性, 人是很难做到的. 由于自动化测试的一致性,很容易发现被测软件的任何改变。

    5、更好的利用资源--周未/晚上

    理想的自动化测试能够按计划完全自动的运行, 在开发人员和测试人员不可能实行三班倒的情况下, 自动化测试可以胜任这个任务, 完全可以在周末和晚上执行测试. 这样充分的利用了公司的资源,也避免了开发和测试之间的等待.

    6、解决测试与开发之间的矛盾

    通常在开发的末期,进入集成测试阶段, 由于每发布一个版本的初期,测试系统的错误比较少,这时开发人员有等待测试人员测试出错误的时间. 事实上在叠代周期很短的开发模式中,存在更多的矛盾, 但自动化测试可以解决其中的主要矛盾。

    7、增加软件信任度

  • IT是怎样的感觉?

    2008-07-21 14:57:24

    现在感觉IT业不知道什么滋味了,想离开,却找不到路可行,
    除了IT,自己还能做什么?
    IT真的有这么不好?
    加班多,工作累,工资反而下降?
    开发就是写代码,我想未必,
    其实如果你不懂得一些业务知识,
    开发出来的软件,你能确定别人接受?
    开发就是要设计自己的思路,或者根据市场来开发软件,
    其实软件也是一种工具来的,是用来帮助解决问题,
    而现在好似困入困境了,作为客户,不可能懂IT方面技术,
    只想软件能满足需求就可以了,
    具体需求又是什么呢?界面漂亮,业务数据正确,操作速度快,具有行业特性,
    要比别的软件供应商做得更好,操作简单,功能强大?
    其实客户需求不一定全部说给你知道,
    只能开发人员发现和总结,也是一种设计者角色,
    而测试人员真的点点鼠标就可以了,如果不懂得思考,
    能把测试工作做好?真正去测试,也要做下测试准备(业务知识积累,软件使用,客户需要等等)
    ,只要能想出更多有效的用例或条件,开发的成本就会相应降低,
    客户也会更加信任我们,
    但好多时候,测试人员只是决策的讨论者,而不是执行者,
    发现错误,有时并不一定可以真正解决该问题,
    所以工作有时做得很辛苦,自己也只能自己忍受..
    不过现在对IT工作真的不知道是什么感觉,希望同行能多讨论不同公司的情况咯..
  • 性能测试:软件测试的重中之重

    2008-07-19 15:58:49

    性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。

       应用在客户端性能的测试

      应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。

      并发性能测试是重点

      并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。负载测试(Load Testing)是确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。压力测试(Stress Testing)是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

      并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。

      当一家企业自己组织力量或委托软件公司代为开发一套应用系统的时候,尤其是以后在生产环境中实际使用起来,用户往往会产生疑问,这套系统能不能承受大量的并发用户同时访问? 这类问题最常见于采用联机事务处理(OLTP)方式数据库应用、Web浏览和视频点播等系统。这种问题的解决要借助于科学的软件测试手段和先进的测试工具。

      举例说明:电信计费软件

      众所周知,每月20日左右是市话交费的高峰期,全市几千个收费网点同时启动。收费过程一般分为两步,首先要根据用户提出的电话号码来查询出其当月产生费用,然后收取现金并将此用户修改为已交费状态。一个用户看起来简单的两个步骤,但当成百上千的终端,同时执行这样的操作时,情况就大不一样了,如此众多的交易同时发生,对应用程序本身、操作系统、中心数据库服务器、中间件服务器、网络设备的承受力都是一个严峻的考验。决策者不可能在发生问题后才考虑系统的承受力, 预见软件的并发承受力, 这是在软件测试阶段就应该解决的问题。

      目前,大多数公司企业需要支持成百上千名用户,各类应用环境以及由不同供应商提供的元件组装起来的复杂产品,难以预知的用户负载和愈来愈复杂的应用程序,使公司担忧会发生投放性能差、用户遭受反应慢、系统失灵等问题。其结果就是导致公司收益的损失。

      如何模拟实际情况呢? 找若干台电脑和同样数目的操作人员在同一时刻进行操作,然后拿秒表记录下反应时间?这样的手工作坊式的测试方法不切实际,且无法捕捉程序内部变化情况,这样就需要压力测试工具的辅助。

      测试的基本策略是自动负载测试,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。预先知道了系统的承受力,就为最终用户规划整个运行环境的配置提供了有力的依据。

      并发性能测试前的准备工作

      测试环境:配置测试环境是测试实施的一个重要阶段,测试环境的适合与否会严重影响测试结果的真实性和正确性。测试环境包括硬件环境和软件环境,硬件环境指测试必需的服务器、客户端、网络连接设备以及打印机/扫描仪等辅助硬件设备所构成的环境;软件环境指被测软件运行时的操作系统、数据库及其他应用软件构成的环境。

      一个充分准备好的测试环境有三个优点:一个稳定、可重复的测试环境,能够保证测试结果的正确;保证达到测试执行的技术需求;保证得到正确的、可重复的以及易理解的测试结果。

      测试工具:并发性能测试是在客户端执行的黑盒测试,一般不采用手工方式,而是利用工具采用自动化方式进行。目前,成熟的并发性能测试工具有很多,选择的依据主要是测试需求和性能价格比。著名的并发性能测试工具有QALoad、LoadRunner、Benchmark Factory和Webstress等。这些测试工具都是自动化负载测试工具,通过可重复的、真实的测试,能够彻底地度量应用的可扩展性和性能,可以在整个开发生命周期、跨越多种平台、自动执行测试任务,可以模拟成百上千的用户并发执行关键业务而完成对应用程序的测试。

      测试数据:在初始的测试环境中需要输入一些适当的测试数据,目的是识别数据状态并且验证用于测试的测试案例,在正式的测试开始以前对测试案例进行调试,将正式测试开始时的错误降到最低。在测试进行到关键过程环节时,非常有必要进行数据状态的备份。制造初始数据意味着将合适的数据存储下来,需要的时候恢复它,初始数据提供了一个基线用来评估测试执行的结果。

      在测试正式执行时,还需要准备业务测试数据,比如测试并发查询业务,那么要求对应的数据库和表中有相当的数据量以及数据的种类应能覆盖全部业务。

      模拟真实环境测试,有些软件,特别是面向大众的商品化软件,在测试时常常需要考察在真实环境中的表现。如测试杀毒软件的扫描速度时,硬盘上布置的不同类型文件的比例要尽量接近真实环境,这样测试出来的数据才有实际意义。

      并发性能测试的种类与指标

      并发性能测试的种类取决于并发性能测试工具监控的对象,以QALoad自动化负载测试工具为例。软件针对各种测试目标提供了DB2、DCOM、ODBC、ORACLE、NETLoad、Corba、QARun、SAP、SQLServer、Sybase、Telnet、TUXEDO、UNIFACE、WinSock、WWW、Java scrīpt等不同的监控对象,支持Windows和UNIX测试环境。

      最关键的仍然是测试过程中对监控对象的灵活应用,例如目前三层结构的运行模式广泛使用,对中间件的并发性能测试作为问题被提到议事日程上来,许多系统都采用了国产中间件,选择Java scrīpt监控对象,手工编写脚本,可以达到测试目的。

      采用自动化负载测试工具执行的并发性能测试,基本遵循的测试过程有:测试需求与测试内容,测试案例制定,测试环境准备,测试脚本录制、编写与调试,脚本分配、回放配置与加载策略,测试执行跟踪,结果分析与定位问题所在,测试报告与测试评估。

      并发性能测试监控的对象不同,测试的主要指标也不相同,主要的测试指标包括交易处理性能指标和UNIX资源监控。其中,交易处理性能指标包括交易结果、每分钟交易数、交易响应时间(Min:最小服务器响应时间;Mean:平均服务器响应时间;Max:最大服务器响应时间;StdDev:事务处理服务器响应的偏差,值越大,偏差越大;Median:中值响应时间;90%:90%事务处理的服务器响应时间)、虚拟并发用户数。

      应用实例:"新华社多媒体数据库 V1.0"性能测试

      中国软件评测中心(CSTC)根据新华社技术局提出的《多媒体数据库(一期)性能测试需求》和GB/T 17544《软件包质量要求和测试》的国家标准,使用工业标准级负载测试工具对新华社使用的"新华社多媒体数据库 V1.0"进行了性能测试。

      性能测试的目的是模拟多用户并发访问新华社多媒体数据库,执行关键检索业务,分析系统性能。

      性能测试的重点是针对系统并发压力负载较大的主要检索业务,进行并发测试和疲劳测试,系统采用B/S运行模式。并发测试设计了特定时间段内分别在中文库、英文库、图片库中进行单检索词、多检索词以及变检索式、混合检索业务等并发测试案例。疲劳测试案例为在中文库中并发用户数200,进行测试周期约8小时的单检索词检索。在进行并发和疲劳测试的同时,监测的测试指标包括交易处理性能以及UNIX(Linux)、Oracle、Apache资源等。

      测试结论:在新华社机房测试环境和内网测试环境中,100M带宽情况下,针对规定的各并发测试案例,系统能够承受并发用户数为200的负载压力,最大交易数/分钟达到78.73,运行基本稳定,但随着负载压力增大,系统性能有所衰减。

      系统能够承受200并发用户数持续周期约8小时的疲劳压力,基本能够稳定运行。

      通过对系统UNIX(Linux)、Oracle和Apache资源的监控,系统资源能够满足上述并发和疲劳性能需求,且系统硬件资源尚有较大利用余地。

      当并发用户数超过200时,监控到HTTP 500、connect和超时错误,且Web服务器报内存溢出错误,系统应进一步提高性能,以支持更大并发用户数。

      建议进一步优化软件系统,充分利用硬件资源,缩短交易响应时间。

      疲劳强度与大数据量测试

      疲劳测试是采用系统稳定运行情况下能够支持的最大并发用户数,持续执行一段时间业务,通过综合分析交易执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。

      疲劳强度测试可以采用工具自动化的方式进行测试,也可以手工编写程序测试,其中后者占的比例较大。

      一般情况下以服务器能够正常稳定响应请求的最大并发用户数进行一定时间的疲劳测试,获取交易执行指标数据和系统资源监控数据。如出现错误导致测试不能成功执行,则及时调整测试指标,例如降低用户数、缩短测试周期等。还有一种情况的疲劳测试是对当前系统性能的评估,用系统正常业务情况下并发用户数为基础,进行一定时间的疲劳测试。

      大数据量测试可以分为两种类型:针对某些系统存储、传输、统计、查询等业务进行大数据量的独立数据量测试;与压力性能测试、负载性能测试、疲劳性能测试相结合的综合数据量测试方案。大数据量测试的关键是测试数据的准备,可以依靠工具准备测试数据。

      速度测试目前主要是针对关键有速度要求的业务进行手工测速度,可以在多次测试的基础上求平均值,可以和工具测得的响应时间等指标做对比分析。

       应用在网络上性能的测试

      应用在网络上性能的测试重点是利用成熟先进的自动化技术进行网络应用性能监控、网络应用性能分析和网络预测。

      网络应用性能分析

      网络应用性能分析的目的是准确展示网络带宽、延迟、负载和TCP端口的变化是如何影响用户的响应时间的。利用网络应用性能分析工具,例如Application Expert,能够发现应用的瓶颈,我们可知应用在网络上运行时在每个阶段发生的应用行为,在应用线程级分析应用的问题。可以解决多种问题:客户端是否对数据库服务器运行了不必要的请求?当服务器从客户端接受了一个查询,应用服务器是否花费了不可接受的时间联系数据库服务器?在投产前预测应用的响应时间;利用Application Expert调整应用在广域网上的性能;Application Expert能够让你快速、容易地仿真应用性能,根据最终用户在不同网络配置环境下的响应时间,用户可以根据自己的条件决定应用投产的网络环境。

      网络应用性能监控

      在系统试运行之后,需要及时准确地了解网络上正在发生什么事情;什么应用在运行,如何运行;多少PC正在访问LAN或WAN;哪些应用程序导致系统瓶颈或资源竞争,这时网络应用性能监控以及网络资源管理对系统的正常稳定运行是非常关键的。利用网络应用性能监控工具,可以达到事半功倍的效果,在这方面我们可以提供的工具是Network Vantage。通俗地讲,它主要用来分析关键应用程序的性能,定位问题的根源是在客户端、服务器、应用程序还是网络。在大多数情况下用户较关心的问题还有哪些应用程序占用大量带宽,哪些用户产生了最大的网络流量,这个工具同样能满足要求。

      网络预测

      考虑到系统未来发展的扩展性,预测网络流量的变化、网络结构的变化对用户系统的影响非常重要。根据规划数据进行预测并及时提供网络性能预测数据。我们利用网络预测分析容量规划工具PREDICTOR可以作到:设置服务水平、完成日网络容量规划、离线测试网络、网络失效和容量极限分析、完成日常故障诊断、预测网络设备迁移和网络设备升级对整个网络的影响。

      从网络管理软件获取网络拓扑结构、从现有的流量监控软件获取流量信息(若没有这类软件可人工生成流量数据),这样可以得到现有网络的基本结构。在基本结构的基础上,可根据网络结构的变化、网络流量的变化生成报告和图表,说明这些变化是如何影响网络性能的。 PREDICTOR提供如下信息:根据预测的结果帮助用户及时升级网络,避免因关键设备超过利用阀值导致系统性能下降;哪个网络设备需要升级,这样可减少网络延迟、避免网络瓶颈;根据预测的结果避免不必要的网络升级。

       应用在服务器上性能的测试

      对于应用在服务器上性能的测试,可以采用工具监控,也可以使用系统本身的监控命令,例如Tuxedo中可以使用Top命令监控资源使用情况。实施测试的目的是实现服务器设备、服务器操作系统、数据库系统、应用在服务器上性能的全面监控,测试原理如下图。
     

      UNIX资源监控指标和描述

      监控指标 描述

      平均负载 系统正常状态下,最后60秒同步进程的

      平均个数

      冲突率 在以太网上监测到的每秒冲突数

      进程/线程交换率 进程和线程之间每秒交换次数

      CPU利用率 CPU占用率(%)

      磁盘交换率 磁盘交换速率

      接收包错误率 接收以太网数据包时每秒错误数

      包输入率 每秒输入的以太网数据包数目

      中断速率 CPU每秒处理的中断数

      输出包错误率 发送以太网数据包时每秒错误数

      包输入率 每秒输出的以太网数据包数目

      读入内存页速率 物理内存中每秒读入内存页的数目

      写出内存页速率 每秒从物理内存中写到页文件中的内存页数

       目或者从物理内存中删掉的内存页数目

      内存页交换速率 每秒写入内存页和从物理内存中读出页的个数

      进程入交换率 交换区输入的进程数目

      进程出交换率 交换区输出的进程数目

      系统CPU利用率 系统的CPU占用率(%)
        用户CPU利用率 用户模式下的CPU占用率(%)

  • 程序员修炼之七杀秘技

    2008-07-18 13:13:53

    程序员修炼之七杀秘技
    学好一门计算机编程语言真的不值得过分骄傲,可悲的是,我们往往一门编程语言也没有学习好就在简历上写着精通XX编程。
    想想一个旧社会的老太太,即使一天学都没有上过,说起话,讲起故事来也能出口成章。
    想想一个小孩,从出生开始短短三年就能把复杂如汉语的语言说得很流利了。

    为什么有的程序员,工作十年了还不开窍,仍然写不出高质量的程序,以至于哀叹程序员是吃青春饭,过了三十岁就不知道何去何从。

    为什么有的程序员,勤勤恳恳,却事倍功半,写出来的程序仍然七疮八孔,bug众多?

    计算机至今无法像人类这样好的理解自然语言,编程语言其实比自然语言简单的多,但是为什么我们学起编程语言来还不如三岁小孩学自然语言?
    小孩学语言和成长的过程对我们学习编程语言是不是有所启迪呢?

    笔者曾多次与公司新员工座谈,新员工多爱问程序员有何速成之法,谈起应该菜鸟如何修炼七步杀一人之绝技,具体的方法总结了一下,是为七多,现分享如下,各位看家指正:

    多想:思考是写好程序的源泉,从今天起开始思考吧;
    多写:努力与实践是成功的不二法门;
    多读:读高手写的程序,召唤内心深处的渴望,压抑不住写程序的冲动,是一件心旷神怡的事情;
    多讲:头几次讲课的人绝对比听课的人能收获更多,我们公司运用此法取得了很好的培训效果;
    多审:怀疑自己和他人的程序,并不是怀疑自己的智商,要想成为一个优秀的程序员,拿自己开审吧;
    多画:许多学数学的人往往后发先至,超越计算机可伴选手成为程序高手,因为他们画竹之前先成竹于胸;
    多构:“妈呀,我以前写的那一段程序真烂,惨不忍睹”,大有往事不堪回首之意。为什么不重构呢?

  • 测试三年(别人转载经验感觉)

    2008-07-18 13:12:12

    所谓三年了(转载)
        昨天是2008年7月11日,我入职满三年之日。很多公司都把三年作为一个新人当作公司自己人的一个标志,就像《忠奸人》里所说,这是He's a friend of ours和He's our friend的区别。呆在一个行业里久了,即使再愚钝,也能看出这个行业的整体趋势来。现在大体聊聊这三年对这个行业的看法:
        1、软件测试热门不热门?
        在google中输入“软件测试”,它告诉你共有487万项符合要求的网站。当你看到这篇博客的时候,这个数字可能又增长了,至少,我又贡献了一篇(笑)。看起来蔚为壮观吧,满眼都是用词火辣的新闻告诉你软件测试有多热门、多高薪。
        好了,如果你有基本的新闻鉴别能力的话,你应该能看得出,这些都是软文,全部都是,无一遗漏。赤裸裸的软文。机缘巧合,我有机会接触到几个在软件测试培训机构的朋友,就是目前很热门的“BTEST”和“北大青鸟”。上述你搜到的各个网站发的这些文章,都是他们进行媒体公关的结果。不信?你看看文章的结尾,都或明或暗地提到“你丫该去找个软件测试机构培训一下了”。感觉自己上当了吧?适当问候一下欺骗你感情的媒体吧。
        软件测试工程师的确在国内很紧缺。但是,这个趋势不会持久,这十年来,类似的热门IT岗位我可以举出几十个:网络工程师、WEB程序员、JAVA程序员、嵌入式工程师,不一而足。它们现在怎么样了?全都处于过饱和状态。他们全都是明日黄花了,一朵朵都已经凋谢。软件测试工程师也不例外,它们的今天就是软件测试工程师的明天。
        那这行还能干么?能,只要你够NB。(废话,忽略之。)由于入门门槛不高,初级软件测试人员很快会处于过饱和状态,顶多3年,就会成为街边的地摊货。而且,月薪会低得可怜。但是,高级人才还是会保持紧俏,这在哪个行业都是如此。目前国内的软件测试的水平还普遍偏低,高级人才依然非常少,依然很值钱。
        什么是高级人才?说一下自己不成熟的看法。数据库、中间件、Windows、Linux、Unix都能深刻理解原理,能调整内核参数,如果只是会用那就算了。完全掌握某一门程序语言,达到开发人员的水平,可以写出一切自己想要的小工具。自动化测试、性能测试、白盒测试、安全测试,四个都比较熟悉,并至少精通其中的一个。而且,英语水平要能达到和老外正常沟通。达到这个水平,就很可以笑看云卷云舒了,你已经接近神了,凡人要忍受的裁员、生活压力等痛苦都与你无关。你只需用一颗慈悲的心去同情他们。
        那么报纸上说的,“月薪8千找不到高级软件测试人才”是什么意思?别逗人笑了!这是无知记者想当然编出来的谎话。长安城内,月薪8千顶多找个熟练的中级工程师,真正的高级工程师是不会在菜市场里贴上标签月薪8千代售的,他们只会安静地坐在写字楼里,等着猎头给他们打电话,然后面无表情地回答:“OK,deal.”
    2、关于技术和商务   
        我只是从事过技术,并没有做过商务,但是通过自己的好朋友了解了不少。总的来说,作为技术,除非是去摩根之类的投行做IT,否则在IT公司做技术员工的话,不当领导或当小领导,很牛逼的人,年薪20~25万是上限了,IBM的band8\band9大致如此。有年薪百万的,实在太少。作商务的话,同样的公司,同样程度的员工,年薪的上线应该是50~60W。接触过猎头的朋友都了解,猎头接到命令年薪50w去挖一个商务人员不奇怪,但是如果接到命令年薪50w去挖一个技术员,那雇佣方肯定脑子秀逗了。技术和商务相形见绌,作为IT技术人员,很不甘心,但是,这是事实,铁一般的血淋淋的事实。我们从来不怕落后,只怕自己不敢承认落后。
        商业是一切活动的润滑剂,这个领域是独特而有魅力的。从市场宣传到寻找定位、售前、销售,每一步都是和活生生的人打交道,他们不用彻夜加班。但并不见得就比技术轻松。做商务的好处在于,他们积累的是人脉和关系,这使他们越老越值钱,而且不用被驱动着每天熬夜看书更新自己的知识。而做技术,一个季度不学习,就会有很多新出的东西不明白了。即使你年薪20万,你仍然需要每天下班后熬夜学习新的技术。
        上面这么一对比,技术和商务高下立见。技术相对挣得少,还要每天学习,担心自己老了会失业。但是不要这么轻易就动摇,有的人是天生的程序员,和人说话会咬自己舌头,但写代码就像吸白粉,那你就每年领个20万,可以活得很滋润了,不必转行,不要嫌商务的赚钱比自己多,全聚德的烤鸭卖得好,做烤鸭的师傅肯定挣得不多,就是这个道理;有的人天生喜欢和人打交道,鬼话说得连自己都信,一群人中国人在一起开会就是要用英文,那他天生适合一年领个50万;但如果你是个中间派,不知道自己适合干什么,我的标准回答是:笑。
    3、关于国内企业和外企
        简单地说:外企钱多,但是年薪50万后,上头都是新加坡和香港的假鬼子了,你上不去。而且IT外企在中国没有核心研发。私企的钱比外企少好几个档次(百度例外),但是,如果你觉得自己很牛,到了犇的级别,就来私企,搞核心研发,要股份(这是关键),工资少,算上股份就比外企多了。
        如果是没牛到那个地步,该怎么选择,我的标准回答是:笑。
    4、关于创业和打工
        我现在还没有魄力创业,如果没有人脉,要创业,三思。卖馄饨的能搞几千万,但是几千万个里面只有这一个成功了。
     
  • IT人离开IT还能做什么?(转载)

    2008-07-17 10:56:04

    今天一位同事(已30多了),被老板叫到他的办公室去。老总对他说,由于效益不好,公司不再和他续订到期的合同!我看到他很落寞地离去。他前年才结婚,还供着房子,老婆孩子要养,这一下子就失业了,而且又是快过年的时候!我跑去和他道别,他没有说什么,只让我好好干,公司还是大有前途的。

      他是一个好人,在技术上决不保密。记得三年前我刚进公司的时候,他正是公司的主力,他对我这个应届毕业生十分关照,只要我不懂的,他一定尽力相告。那时公司的老板也很器重他,可能是正当壮年的时候(还有很多剥削价值)。但自去年开始,公司转向了。net平台,我们都去研发新技术了,原有的pb老版本程序基本上都由一些老程序员来维护(可能老板想他们年龄不小了,学新技术有些障碍)。公司产品的升级工作进展很快,pb版本的程序越来越少了,我们晚上经常加班,而他由于年龄和家庭的缘故,并不经常加班了。我渐渐地从老板对他的态度的变化——从最早的极为欣赏到一般到渐渐地嫌弃。今年公司的效益不太好,也许正是到了鸟尽弓藏、兔死狗烹的时候了?

      上世纪末那会儿,曾有“做IT,35岁就可以退休”的说法,历经沧海这么多年,35岁退休成了童话,35岁的职业坎儿却无法众多IT人回避。有人说,可以转为管理,然而管理的一条线就像窄窄的独木桥,又有多少人可以通过呢(据统计平均大约100名程序员也就只有一两个做管理的机会)?转向传统行业?已经30多了,能再重新来过吗?绝大多数平凡IT人的出路又在哪儿呢?

      35岁对于IT人是个坎儿,过了这个年纪基本技术生涯即告终结,这是IT界多数人认可的。所以,也让IT人着实为35岁后的自己生了不少忧虑:IT人离开IT后能干什么?

      印象中的IT人都因为职业的缘故而木讷寡言。他们与机器沟通的能力显然优于与人沟通的能力。从机器到人,IT人必须跨过来。

      IT业的技术语言过于狭窄。社会却是复杂的。IT人的知识面不够广泛。社会上不需要人人都懂如何设计程序,但IT人却必须要懂社会。

      IT内的项目,有些人也有些经验,但这些经验性的东西多数是专业性的,个别种类项目的经验能否转化为普遍的社会经验,也确实需要时间。

      这些劣势,可以说,凡是地球上的IT人大概都知道。除了IT,要重新换个活法一时还真的玩不转。

      但IT人毕竟是IT人。IT是高薪行业,IT人从业几年十几年,一般都有了一定的物质基础。这是IT人比其他行业的人具有的优势。

      有了这样的物质基础,我认为,后IT人的关键是要实现思维方式的转变:从技术性思维到社会性思维,从而开创人生事业的第二高峰。

      技术性思维是面向机器的、僵硬的、封闭的、单向性的;社会性思维要求是面向常识和社会的、灵活的、开放的、多向综合的。后IT的人士最需要的是这种思维方式的转变。

      思维一转天地宽。后IT人会发现社会比IT里面其实更精彩。

      后IT人可以走出来干销售。这个工作富于挑战,而且收入与工作业绩直接挂钩。IT人有很强的技术背景,更擅长发掘产品性能的优缺点,对于IT产品的介绍具有权威性,容易被客户相信。

      后IT人可以走出程序迷宫来做培训。IT人在运用某一技术语言上相当精深,另外他们在技术研发中的实战经验,对于学员来说也是相当宝贵的教学资源。

      后IT人也可以由直面数字转为面向众人做咨询。成功的咨询师决不会因为年龄而贬值。有过实际项目经验的IT人,解决实际问题的能力非常强,出身IT的人作为咨询师是其他行业人士无法取代的。还可以做老板,做IT活动策划等等。

      需要提醒的是,思维方式的转变不是一朝一夕的事。一旦离开IT,IT人所要做的是不断调整自我,保持对社会的参与激情。阅读一些人际沟通技巧之类的书籍是必要的,还可以参加社会活动,给自己洗洗脑,从以数字中心、个人中心的思维方式转换到以人为中心、社会为中心的模式中。要注意多与人沟通。同时,个人应该尽早明确自己的发展方向,并根据新的事业来重新积累,不断升级完善自身的“软硬件”。

     

  • 清华校长送给毕业生的五句话

    2008-07-14 12:10:53

    方向比努力更重要

    能力比知识更重要

    健康比成绩更重要

    生活比文凭更重要

    情商比智商更重要

                               ——清华大学校长留给毕业生的一段话


    方向比努力重要。

         现在是讲究绩效的时代,公司、企业、政府,需要的是有能力且能与企业方向共同发展的人,而不是一味努力但却南辕北辙的人。自己适合哪些行业,哪些职业,有很多东西是先天决定的,只有充分地发掘自己的潜力,而不是总与自己的弱点对抗,一个人才能出人头地,就像现在很多企业招聘的时候,他们相信通过培训和教育可以让火鸡学会爬树,但是还是觉得选个松树方便一些。方向不对,再努力、再辛苦,你也很难成为你想成为的那种人。

    能力比知识重要。

         知识在一个人的构架里只是表象的东西,就相当于有些人可以在答卷上回答如何管理企业、如何解决棘手的问题、如何当好市长等等,但是在现实面前,他们却显得毫无头绪、不知所措,他们总是在问为什么会是这种情况,应该是哪种情况等等。他们的知识只是知识,而不能演化为能力,更不能通过能力来发掘他们的潜力。现在很多企业都在研究能力模型,从能力的角度来观察应聘者能否胜任岗位。当然,高能力不能和高绩效直接挂钩,能力的发挥也是在一定的机制、环境、工作内容与职责之内的,没有这些平台和环境,再高的能力也只能被尘封。

    健康比成绩重要。

         成绩只能代表过去,这是很多人已经认同的一句话。对于毕业后走入工作岗位的毕业生,学生阶段的成绩将成为永久的奖状贴在墙上,进入一个工作单位,就预示着新的竞赛,新的起跑线。没有健康的身心,如何应对变幻莫测的市场环境和人生变革,如何应对工作压力和个人成就欲的矛盾?而且在现代社会,拥有强健的身体已经不是最重要的,健康的心理越来越被提上日程,处理复杂的人际关系、承受挫折与痛苦、缓解压力与抑郁,这些都将成为工薪族乃至学生们常常面对的问题。为了防止英年早逝、过劳死,还是多注意一下身体和心理的健康投资吧。

    生活比文凭重要。

         曾经有一个故事,说有个记者问放羊的小孩,为什么放羊?答:为了挣钱,挣钱干啥?答:盖房子,盖房子干啥?答:娶媳妇,娶媳妇干啥?答:生孩子,生孩子干啥?答:放羊!

         记得去年在人大听一个教授讲管理学基础课,他说你们虽然都是研究生,但很多人本质上还是农民!大家惊愕,窃窃私语。他说你们为什么读研究生,很多人是不是想找个好工作,找好工作为了什么,为了找个好老婆,吃喝住行都不错,然后生孩子,为了孩子的前途更光明,这些不就是农民的朴素想法吗?那个农民父母不希望自己的子女比自己更好?说说你们很多人是不是农民思想,什么时候,你能突破这种思维模式,你就超脱了。当这个社会看重文凭的时候,假文凭就成为一种产业,即使是很有能力的人,也不得不弄个文凭,给自己脸上贴点金。比起生活,文凭还重要吗?很多人找女朋友或者男朋友,把学历当作指标之一,既希望对方能够给他/她伴侣的温暖与浪漫,又希望他/她知识丰富、学历相当或更高,在事业上能蒸蒸日上;我想说,你找的是伴侣,不是合作伙伴,更不是同事,生活就是生活,这个人适合你,即使你是博士他/她斗大字不识一个,那也无所谓,适合就会和谐融洽,人比文凭更重要。很多成功的人在回头的时候都说自己太关注工作和事业了,最遗憾的是没有好好陪陪父母、爱人、孩子,往往还伤心落泪,何必呢,早意识到这些,多给生活一些空间和时间就可以了。我们没有必要活得那么累。

    情商比智商重要。

         这个就很有意思了,大家忽然一下子对情商重视了起来,因为在新的世纪,情商将成为成功领导中最重要的因素之一。比如在许多员工和自己的亲人因恐怖袭击丧生的时刻,某公司CEO Mark Loehr让自己镇定下来,把遭受痛苦的员工们召集到一起,说:我们今天不用上班,就在这里一起缅怀我们的亲人,并一一慰问他们和亲属。在那一个充满阴云的星期,他用自己的实际行动帮助了自己和他的员工,让他们承受了悲痛,并把悲痛转化为努力工作的热情,在许多企业经营亏损的情况下,他们公司的营业额却成倍上涨,这就是情商领导的力量,是融合了自我情绪控制、高度忍耐、高度人际责任感的艺术。曾经有个记者刁难一位企业家:听说您大学时某门课重考了很多次还没有通过。这位企业家平静地回答:我羡慕聪明的人,那些聪明的人可以成为科学家、工程师、律师等等,而我们这些愚笨的可怜虫只能管理他们。要成为卓越的成功者,不一定智商高才可以获得成功的机会,如果你情商高,懂得如何去发掘自己身边的资源,甚至利用有限的资源拓展新的天地,滚雪球似得积累自己的资源,那你也将走向卓越。
     

     

Open Toolbar