计算人生,不是要用减法计算它的长度,而是要用内心感受计算它的“利润”。

发布新日志

  • 软件测试人员的1和0的世界(鉴)

    2008-04-03 09:52:48Top 3 Digest 3

                           ——本文送给常年奋战在测试一线的测试人员。

      小时候上政治课,深信自己“要为共产主义事业奋斗终生”,现在看来目标有一点遥远,估计为计算机事业奋斗终生的可能性很大。不知不觉,我做测试这一行已经八年了,有时感觉到自己似乎患上了测试的“职业病”。这里我把自己的一些感觉写下来,如果你发现完全没这种感觉,可以一笑了之,如果发现有符合的症状,也不要太在意,因为,你不是一个人。
     
      很多人认为,测试人员的职业习惯是,喜欢挑毛病,找错误,其实远不止如此,一旦你进入测试这个行业,你会慢慢发现,自己的思维习惯被悄悄改变了。
     
      习惯用“对”和“错”来判断一件事情
     
      在计算机的世界里,只有两个数字,1和0,要么就对,要么就错,没有别的可能。也许就是这个原因,计算机难以取代人类的智慧(计算机下不好围棋就是个例子)。测试人员的工作也完全遵循这一逻辑,我们的工作就是,判断软件或者是软件的一部分是不是合格,要不就合格,要不就是不合格。
     
      这是测试工作最重要的原则,也是我们思维方式的核心。另外,测试是“证伪”的工作,只有我们证明了所有的可能性都通过了,才能说“合格”。这一点也极大的影响了测试人员的思维方式。
     
      在1和0的世界里,我们可以用对错来判断事物,可是在现实生活里,这个逻辑却经常失效。虽然我们心里很清楚,这世上的很多事情,不能用对和错来判断,但是一旦当我们陷于事情之中,却总是下意识的这样考虑,不能自拔。
     
      不仅如此,这个问题会衍生出一系列其他的问题。
     
    难以做出选择和决定
     
      有句广告词叫:只买对的,不选贵的。又牵涉到是不是“对”的问题了,如果我们面临的选择,能很容易分出“对错”,那还好办。可惜我们总是要做出一些很难说清是对还是错的选择,这确实让我很伤脑筋。
     
      最常见的一个场景就是不会点菜,当我拿着陌生的菜单,总是很紧张,不知道该吃什么。因为我们的潜意识里,只有认为这道菜“合格”,才可以点。可是判断菜是否合格的条件太多,如果有一条不符合,我就会觉得菜“不合格”,因此很难决定是不是点这道菜。
     
      还有一个现象就是买东西,总是要左思右想,确定这样东西“合格”以后,才会掏钱,其中道理和点菜一样。不同的是,点菜有时间限制,买东西一般没有,可以慢慢的评估,慢慢的证明这件东西“可以买”。经常买个东西买半年,不过仔细想想,好像工作前就有这个毛病。
     
    对于想不明白的事情总是喜欢刨根问底
     
      世上的事,皆有因果。软件也是一样,出现一个bug,可以说一定有原因,只能说有时我们不知道原因,但是不能说,没有原因。从这一点看,测试和医生有很大的相似之处(都是根据一些表面的症状,查找内部的原因,然后给出解决方案)。
     
      测试人员坚信世上没有无因之果,当我们遇到bug的时候,总要考虑怎么找出bug的原因,如果找不到,寝食难安。在生活里,碰到想不明白的事情,也总是习惯性的刨根问底,一定要获得一个答案。最常见的一个场景,就是当一样东西找不到了,我便发了疯一般的找,完全投入进去,不断的回忆和推理,一定要把它找到,真的是到了废寝忘食的程度,我的老妈老婆也是哭笑不得。
     
    对自己和身边的事物要求尽善尽美
     
      测试工作也是一项追求完美的工作,当我们宣布一个软件“合格”的时候,可以说几乎考虑了所有的可能性,证明了它没有问题。可即使这样,还是会有我们考虑不到的情况,会出现bug,于是,我们会继续完善测试方案,让软件更完美。
     
    我们最喜欢看的东西,就是一张全部标着“pass”的测试清单。如果里面有一个红色的“fail”,就会觉得浑身不爽。渐渐地,我们变成了完美主义者,对身边的人和物,都希望完美。
     
      但是这世上的事情和人,都不是尽善尽美的,所以完美主义者活的会很辛苦。比如我家里的电脑,为了保证电脑软件系统“完美”的工作,我经常的重装xp系统。只要系统出了点问题,其实远不到需要重装的程度,但是我觉得不爽,干脆,重装!我老婆都烦了:你怎么又在装系统。这个毛病现在已经好多了,我已经坚持半年没重装系统了。这是不是强迫症啊?
     
      写了这么多,大家是不是觉得我似乎已经“病入膏肓”了。其实我写的时候很开心,一点没有觉得压力,反而很轻松。有时想想这些事情,着实有趣,随它去吧。 

  • 爱情不是奇遇

    2008-04-11 11:27:04




      有些人硬要说,与陌生人一个眼神,已经是爱情。  
      在巴士上和他对望了一眼,已经可以悬念一生。 

      在车站月台上和他擦肩而过,就爱上了他。 

      在派对上惊鸿一瞥,胜过一生相聚。 

      爱情不是这么儿戏吧?我从来不相信这是爱情。 

      也许,你曾在巴士上跟一个陌生人并肩而坐,那一刻,你对他有了些奇妙的感觉,但那不是爱情。 

      E说,年少时候,他天天在同一个巴士站碰到一个女孩子,那班车通常都挤满人,他们常常在车厢内被其他人挤在一起,天天如是。 

      一天,车厢又如常挤满人,他和女孩坐在巴士下层最后一排,两个人被夹在中间,身体互相紧贴着,当其他人都下车了,后排只剩下他两个,女孩竟然依旧紧贴着他?没有移开,他也紧贴着女孩的身体。到了终站,两个人才分开,各自下车,而且也没有交谈过半句。那天以后,害羞的他,不敢再在那个巴士站上车。 

      这是爱情吗?这只是奇遇。 

      如果你认同佛洛姆所说,爱情是一项意志、一项决心、一项允诺,那么,爱情决比那些奇遇深刻得多。 

      奇遇没有痛苦,爱情却有。  
  • 编写测试用例方法心得体会(转载)

    2008-04-10 14:40:12

    编写背景:

      一直以来都不太想把技术方面的文章写出来给大家看,一个是怕写作功底不好误导哪些刚入门的测试同行,自己的表达能力有限,另一方面怕有的同行拿出去炒作,再者测试网站论坛上关于测试用例的资料已经实在是多。但是看到同行纷纷都在问我测试用例的问题,都很想知道我写测试用例的心得体会。我就抱着试试看的心态写写吧,希望测试的老前辈看见了,可以给我多提提建议。

      编写测试用例方法心得体会

      在我的个人邮箱和MSN上,通常同行都问我类似下面这样的问题:

      1、一个测试用例要写到什么程度才比较好?

      2、刚开始做测试的时候,你是怎么学习写测试用例的?

      3、你对黑盒测试用例的编写的体会是什么?有什么好的版本或者标准吗?

      对于测试用例,而我目前正在思考的问题是:怎么写出对公司有价值的测试用例,对公司来说,怎么测试才是最有价值的测试?

      下面先来分析第一个问题吧:一个测试用例要写到什么程度才比较好?

      这个问题,没有定语,没有说是在什么样的一个情况下,因此我这里只能就我工作中碰到的情况说说了。说起来比较长阿,大家要有耐心看才行哈。^_^

      在我测试工作中,碰上的测试类型我自己划分成这么4种:项目的测试,产品的测试,产品个性化的测试,第三方验收测试。项目的测试指的是我所测试的软件是一个项目,是某一个具体用户使用的。产品的测试指的是我所测试的软件是一个通用产品,是供很多用户使用的。产品个性化测试指的是我所测试的软件是某一用户在使用产品时,提出了特殊的功能,针对这些新功能,对产品针对用户进行了个别修改。第三方验收测试大家都应该很熟悉了,这里就不需要做解释了。

      对项目、产品的测试,测试的时候通常要考虑这个项目的周期和测试资源。我所在的公司,通常项目开发时间都很短4到5个月,然而测试通常都是在开发即将结束的时候才真正介入。测试就是1个人负责。因此时间和人力资源对测试来说是完成测试工作的一个风险。为此在这种情况下,我都是先熟悉系统的业务,把握重点业务和功能后,参考需求,把测试需求、测试计划和测试大纲给制定好。由于时间关系,测试用例都是先写重点的业务,也就是集成测试的测试用例。另外测试用例是根据测试大纲来的。通常都是先挑最重要的测试项和风险大的业务功能编写测试用例。由于测试用例是本人执行,所以测试用例可以写的简单些,但是一定要开发人员能够看明白。可惜我所在的公司,都没有人来看我的测试用例。测试用例对我来说是用来提示我不要忘记了要测试哪些项。一些很有价值的bug通常不是在写测试用例的时候发现的,而是在测试软件的过程中,我在家睡觉前的思考和回家的路上思考出来的。这就是手动测试的魅力,有些软件的缺陷是在你使用软件的一瞬间和思考的一刹那突然发现的。所以要我回答测试用例要写到什么程度才比较好,我觉的只要你所写的测试用例在你的公司能够顺利的执行,不影响你的测试执行工作就可以了。因为测试用例写的太详细,你要花费时间和人力成本,这样出来的测试用例是最好的也是最贵的,一旦需求变更,也需要修改,这时你会发现这种详细的测试用例是最不挣钱的。测试用例写的太粗,别人看不懂,不能执行,那你要花费你的时间去解释,这就加大了测试的工作量。这也不是好的方法。

      第二个问题,刚开始做测试的时候,你是怎么学习写测试用例的?

      我之所以选择测试这个工作是因为:我毕业后,在第一家公司做技术支持,产品的问题很多,导致技术支持工作很辛苦、很累。为了让用户买到的产品的质量是好的,我选择了做测试,到了现在的公司。我刚做测试的时候,对测试一无所知,什么测试流程阿、文档阿都不知道,公司的测试和管理也不规范。对测试,大家都认为不就是拿个鼠标点来点去,谁都可以来做。为此,我经常上网查测试的资料,看看自己到底适合不适合做测试,测试到底是什么样的一个职业,怎么去规划自己的个人发展。其实要做好测试,真是不容易。不喜欢,真是不能做这个职业。

      现在想想自己刚开始写测试用例的时候,真是好笑。就像小孩子学习写字一样。先是在网上狂搜索了一把测试用例的模板,综合了几个,就形成了。我之所以不用公司原有的测试用例模板,是因为太不适用了。还好,公司没有严格要求必须要那个模板,只要适用就行。模板找好了,可是写就费劲了。对于刚做测试的新人,看似简单的一个填表工作,要写好真是不简单。一开始写的比较不自然,有些生搬硬套,而且还很慢。没有办法,那时候没有人指导我,全靠自己自学和领悟,所以那段日子很苦阿!多写几次后,就知道和领悟了,测试用例要根据测试大纲来写,测试大纲要根据测试计划来写。测试大纲更多的是把握住测试项的方向,而测试用例是指导怎么去执行测试。还好,我有编程的经验,所以对我熟悉软件帮了一个很大的忙。熟悉了软件的业务才能去写测试用例,才能更好的去测试。这也是我一点一点的领悟出来的。说了这么多,不知道这样的回答是否是回答了这个问题。

      最后一个问题了,我尽量少写些,文字太多了大家看的也累,我写的也累。嘿嘿。^_^

      你对黑盒测试用例的编写的体会是什么?有什么好的版本或者标准吗?

      我的体会:

      1、测试用例要根据测试大纲来编写

      2、测试用例也要分测试项进行归类,这样比较好分析和阅读。如:业务流程测试、安装测试、功能测试、用户友好性测试、兼容性测试、性能测试、安全性测试等等。

      3、编写测试用例要考虑各种情况,精力主要集中在软件的主要业务流程和风险高的地方。能分出测试优先级别就最好了。

      4、熟悉系统,对编写测试用例很有帮助。

      5、即使对测试很熟悉了,在时间非常紧的时候,编写测试用例还是很有必要和好处的。

      今天就想到那么些了,以后想到了在补充上了。我把我用的模板给你们粘贴一份上来,只能给你们做些参考,具体还是要看对你所在的公司适用不适用。测试项的归类我就不列举了,因为每个公司的都不太一样。

  • 测试用例的编写

    2008-04-10 14:36:33

    了解软件测试也已经有一段时间了。也看了一些测试用例的编写。但是发现测试用例还是必须根据自己项目的真实情况来编写才能起到真正的作用。
    转一篇关于编写测试用例问题的文章,在今后的测试过程中有所参考
     
     
    对于一个测试人员来说测试用例的设计编写是一项必须掌握的能力。但有效的设计和熟练的编写却是一个十分复杂的技术,它需要你对整个软件不管从业务还是从功能上都有一个明晰的把握。

    一、问题:
        许多测试类书籍中都有大幅的篇章介绍用例的设计方法,如等价类划分,边界值,错误推断,因果图等。但实际应用中这些理论却不能给我们很明确的行为指导,尤其是业务复杂,关联模块紧密,输入标准和输出结果间路径众多时,完全的遵循这些方法只能让我们在心理上得到一种满足,而无法有效的提高测试效率。有时我们只有依靠以前项目的用例编写经验(或习惯),希望能在这一个项目中更加规范,但多数情况下我们规范的只是“书写的规范”,在用例设计上以前存在的问题现在依旧。
        当好不容易用例基本完成,我们却发现面对随之而来的众多地区特性和新增需求,测试用例突然处于一种十分尴尬的境地:
     从此几乎很少被执行
    已经与程序的实现发生了冲突(界面变动,功能变动)
     执行用例发现的bug很少
     根本没有时间为新的功能需求增补用例
     有时间补充,但用例结构越来越乱,
    特性的用例与通性用例之间联系不明确(以新增需求为主线列出所有涉及到的更改,但特性与通行之间的数据或业务联系在用例中逐渐淡化)
    知道怎样执行这个用例,但它要说明什么呢?(多数用例给我们的感觉是只见树木,不见森林,只对某一功能,无法串起)

        通过上面的一系列问题可以看到,似乎测试用例给我们带来的问题远多于益处,也正是因为在实际过程中遇到的问题积累,导致我们有很充分的理由忽视或拒绝用例的应用。
    但没有用例或简略用例的编写我们又会舒服很多么?不言自明,谁也不想倒退发展吧。

    二、原因:
        事实上我们在测试用例编写和设计上遇到的一系列问题只是一种表面的呈现,究其原因我认为有如下几点:

    1、没有适合的规范
        “适合的规范”或称“本地化的规范”。这是我们在测试过程中遇到的第一个问题,通常也是很容易习惯且淡忘的。我们拥有相当多的流程文档、书本上的定义,但它适合我们当前的项目么?
    每一个测试工程师在进入这个职业的初期都会了解一些测试上的概念和术语,进入公司或项目组后也会进一步学习相应的文档,例如怎样规范编写,怎样定义bug级别,软件实现的主要业务等。但当测试经理开始给我们分配某一模块的用例编写时,又有多少人知道该怎样去写,怎样写算是好?
    在测试论坛中常能看到介绍用例编写方法的帖子,而迷茫于怎样应用到实践的回复也不为少数。为何我们无法在公司和项目组内找到明确且适合的规范?于是我们只得选择从书本或之前的用例中复制,不管是结构还是方式都依赖于以往"的经验,我并不是说这样就是错误的,但不能总结成文的经验无法给予测试更多帮助。
    我们有太多经验,但却没有形成适合的规范。

    2、功能与业务的分离
        我们知道怎样列举一个输入框的用例,但却很少考虑说明这个输入框是用来做什么的,如果仔细分析不难发现,用例中这种功能与业务的分离越来越普遍也越来越明显。
    边界值、等价类划分、因果图,这些用例方法是一种高度提纯的方法,本身就很偏向于功能及代码,所以怎样编写业务的用例我们就从理论上失去了参考。
        复杂的业务会贯穿于整个软件,涉及众多功能点,里面组合的分支更不可胜数。测试用例务求简洁、明确,这一点也与业务“格格不入”。功能用例依赖程序界面,业务描述依赖需求文档。于是我们更偏向于根据已实现的界面编写功能用例,列举出众多的边界值、等价类。流程的操作只有凭借经验和理解,这时测试出的bug是最多的,但我们却无法使这个bug对应到一个用例中(点击一个按钮报出的错误有时原因并不在这个按钮或按钮所在的窗体)。正因为我们没有很好的积累业务上的用例,才使得我们感到执行用例时发现的bug不多。
    用例结构的划分一定程度上也造成了功能和业务的分离,依照界面模块建立文件夹,并在其中新建不同用例,这使得用例从结构上就很难联通起来。

    3、测试未能跟上变化
        变化!想象一下,当我们越来越多的听到开发人员在那里高呼“拥抱变化”“敏捷开发”的时候,测试又有什么举措呢?当地区特性,软件版本越来越多的时候,测试是否在积极响应呢?变化是我们面临的最大挑战,我认为测试未能跟上变化是造成测试过程中遇到种种问题和矛盾的主要原因。
    对需求和程序的变化测试人员的感受是非常深的,测试总是跟在需求和开发后面跑,使得所有风险都压在自己身上。不断压缩的时间和资源使我们只能放弃那些“不必要”的工作:尽快投入测试,尽快发现bug,而非从整体把握软件的质量情况,统筹策略。
    疲于应对的直接影响就是程序质量无法准确度量,进度无法控制,风险无法预估。用例与程序脱节,新增用例混乱和缺少。长此以往我们只得放弃修改、增补用例,甚至放弃之前积累的所有成果。用例变为程序变更的记录摘要,没有测试数据的保留,测试步骤和重点无法体现,新加功能与原来的程序逐渐“脱离”,可能还会出现相互违背的情况,但这我们却无法很快发现。
    永远是变化决定我们的下一步工作,这也是混乱的开始。

    三、可能的解决办法:
        在这里我希望以探讨的方式提出一些可能的解决办法,因为上面的问题也许在成熟的公司和项目组内很少遇到,而遇到问题的也需根据不同的情况单独考虑。不用拘泥形式,最适合的就是最好的。

    1、测试驱动开发,用例指导结果,数据记录变化
        “测试驱动开发”(TDD)是一个比较新的概念,在网上可以看到很多介绍文章,它主要讨论如何让开发的代码更奏效(Work)更洁净(Clean),“测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码”。可以看到,TDD是建立在“代码”级别的驱动,但目前我们需要探讨的问题是怎样在黑盒测试中做到“测试驱动开发”。
    首先我们需要纠正一个态度,很多人认为黑盒测试的技术含量不高,可思考可拓展的内容不多,主要的工作就是用鼠标在那里瞎点,于是很多“高级”的技术方法都试图与黑盒测试划清界限。但测试人员发现的bug有80%以上都是黑盒测试发现的,手工操作软件仍是目前检验
    软件质量最有效的一种方法。
        如何在黑盒测试中做到测试驱动开发?我认为可以从用例级别做起,以业务用例指导过程和结果。
    开发人员通常比较关注技术,对于业务上的理解容易忽视并出现偏差,而需求文档又不会很明确的指出应该实现怎样的结果,这使得从业务到功能出现一个“阅读上的障碍”,如果最后程序错误了还需返工,这样耗费的人力物力就非常大了。使用业务用例驱动开发,就是一个比较好的方法,同样这也需要运用测试中的各种方法,列举出业务流程里数据的等价类和边界值。
    业务用例的构造要先于程序实现,与需求和开发人员沟通一致,并以此作为一个基准,保证程序实现不会错,还能对整个软件的进度和质量有一个很好的估计和度量。业务用例可以不关注程序的界面,但一定要有数据的支持。这就是测试主导变化的另一点“数据记录变化”。
    我们不仅要应对变化,还要记录变化,使测试用例成为对程序持续性的监控,数据可以作为最基本、最简单的支持。当一个业务很复杂时可以拆分成段(业务段与程序中以窗体或页面的划分是不一样的),使用典型的用例方法列出实际输入和预期结果。我们希望数据能做到通用和共享,最理想的情况就是建立一个“数据库”,每个业务用例都从“数据库”中取得输入数据和预期结果,这个数据只是针对业务入口和出口的,当程序内部设计变更时,保留的数据不会因此而作废。举一个例子,例如我的程序要从某种文件中读取数据并计算结果,一段时间后程序内部字段增加了,如果是以保存的文件附件方式提供数据,则现在程序很可能就打不开这个文件了。使用“数据库”指导测试人员可以在变化的程序里直接针对业务输入,而不关心程序内部结构。
        再进一步的话“数据库”就开始涉及到程序内部的接口了,这需要开发人员的配合。

    2、为用例标明时间(版本)和优先级
        为测试用例标明时间或版本可以起到一种基准的作用,标明项目进度过程中的每一个阶段,使用例直接和需求基线、软件版本对应。同样这需要规范流程,也是对变更的一种确认和控制。或者可以为用例增加一个状态,指明这个用例目前是否与程序冲突,当程序变更时改变用例的状态,并更新用例版本。
        为测试用例标明优先级可以指出软件的测试重点、用例编写的重点,减少用例回归的时间,增加重点用例执行的次数,帮助项目组新人尽快了解需求,在自动化测试的初期也可以参考这个优先级录制脚本。

    3、功能用例与业务用例分开组织
        将功能用例与业务用例分开组织,按照不同关注点列举执行路径。业务用例应在开发前或同期编写,帮助测试人员和开发人员明确业务,了解正确流程和错误流程。功能用例更依赖于程序界面的描述,但功能用例并不等于使用说明。对某些模块的等价类、边界值测试会发现很多严重的bug,也许与业务无关,但用户往往很容易这样操作(例如登录名,你是否考虑到很长的名字,或者用户的键盘有问题,总是敲入n多空格在里面,这与业务无关,但程序将会怎样处理?)。

    4、审核用例,结对编写
        测试组长或经理对用例进行审核可以做到用例的补充和校对,但一般情况下是很难做到的,我们可以采用另一种方法,就是结对编写测试用例(前提是你有两个以上的测试人员),内部审核。
    测试用例不是一个人编写一个人执行,它需要其他测试人员都能读懂且明白目标所指。结对编写可以尽量减少个人的“偏好习惯”,同时也能拓展思维,加强测试重点的确认,小组内部达到统一。一定程度上结对编写也可以减少组长或经理对用例的管理,提高组员的参与积极性。

    四、发展
        上面的这些解决方法只是一种建议,具体怎样实施到项目中还需根据情况而定。可以看到测试的发展方向是很多很广的,传统的黑盒测试并不是毫无新意,测试工作怎样适合我们而发展,将给予我们更多的思考。
  • 一个老程序员的心理话[转贴]

    2008-04-10 09:53:19

    今年是我大学毕业满10年的日子,也是我投身IT技术的第10年。一直想能对过去的经历做些回顾与反思,以更好地走向未来,但总没有笔。刚好 CSDN举办“讲述程序员的故事”征文,这件事成了一个引子,我终于趁着暑期有时间,敲了一天键盘,便有了这篇人生自述。

      10年对于一个人来说是比较长的一个阶段,10年之后,同期大学毕业的同学情况差异之大,让人叹息命运之变幻莫测。

      我在此记录下了我的生活足迹,由于时间较长,有些事记得不太清了,但我是尽量真实的记录当时的情况,有兴趣看我这篇长文的人请把我看成是一个在你我中间一块生活,一起喜怒哀乐,一起努力的平凡人,相信我们之间会有很多跨越时空的情感交流。

      好,就说到此吧。
    ------------------------------------------------------------------------



      从1994到2003,不知不觉之间,我已在计算机技术的世界里沉浸了十年。有位哲人说过:如果一个人能用十年的时间专心致志地研究一门学问,或学习一门手艺,或从事一个职业,他一定能成为这个领域的专家。我天资平庸,但哲人的话是有道理的。我用十年的时间先成为了一名合格的程序员,再成为了一个重点大学计算机专业的大学教师。十年磨一剑,蓦然回首,年华如水,青春如歌!

      我父母都是城市中的平民,家境仅能解决温饱,我想我可能代表了中国社会的一大类青年,我的经历与体会可能会对许多条件并不好的年青程序员有所启示:只要努力,天资差与环境不好都是可以克服的。因为我不是牛人,所以我不能教你如何成为牛人,我只是尽量真实地写下我的经历与感触,写一个平凡人的努力过程。我为我是一个软件开发者而自豪,为我从事的教书育人的事业而自豪,并愿意为中国落后的软件业尽己菲薄之力,为此,我人生无悔!

      我想分为三部分讲述我的人生经历:
      上篇:学习人生:主要是我学习计算机技术的经历与感触,时间跨度大约是从1994~1996年;
      中篇:艰难人生:主要是我流迹社会,失业一年半,三次考研的痛苦经历;时间跨度大约是从1997~1999年;
      下篇:实践人生:主要是我的技术实践经历:在公司打工,开发软件,毕业求职与教书生涯,时间跨度是1999~2003。

    一 计算机是什么东西?

     我是七十年代初在中国出生的那一代人,等我们长大开始读书时,文革已经结束,相对于我们的兄长,从我们这一代开始,以后出生的孩子都能受到较为正规的教育,这是我们幸运的地方。

     也就是我们上小学的时候,七十年代末,以美国为技术资源中心的计算机技术开始在全球范围内迅猛发展,这时正是世界性的“软件危机”极为严重的时候,计算机技术各方面都在酝酿着新的突破,而此时比尔盖茨也正在准备构建他的明日 微软帝国。

     七十年代末与八十年代初,在我们的生活中,看不到一点计算机技术的影子,刚刚改革开放的中国,99%以上的人连“计算机”这个词恐怕都没听说过,中国游离于信息技术大门之外。

     在中华”成为时代主旋律的八十年代,整个中国真的是呈现出一种勃勃的生机,这是一个民族在经历百年耻辱,十年挫折之后的再起步,象一些老歌---《金梭与银梭》,《在希望的田野上》等,就是当时青年的一种积极向上的精神风貌的体现。这种环境下,对于正在成长中的我们这一批少年,在潜意识中有极为深刻的影响,我们认为爱国与振兴中华是天经地义的事,并且成为了努力学习的主要动力(呵呵,现在的一些“愤青”---愤怒青年一定会说我们当时被“洗脑”了,也许真的是吧,这种信念确实会给人以极大的动力,我看不出有什么不好,至少我不会有现在这一批青年所经历的非常迷茫的感觉)。

      1986年我考上了桂林市重点高中---桂林中学,在那儿,我第一次见到了电脑。

      1.中学的计算机兴趣班

      1987年我在桂林中学读高二,桂中是重点高中,条件较好,当时学校课外安排了两个班:无线电班和计算机班,我上的是计算机班,当时用的微机是Apple II,用Basic编程。记得当时中国也开发了一种同档次的计算机,叫做中华学习机,要在中小学中大力推广,但Apple II后来发展成了著名的Mac系列,并拥有了自己的操作系统,而中国的中华学习机,还有后来的小霸王等电脑学习机,都无疾而终了。

      学校安排上机,有同学不知从哪找来了一些有趣的Basic程序,什么“比翼双飞”,“飞机空战”等等,都是一些非常简单的小游戏,当时他抄了厚厚一本,一上机就敲一些到计算机中运行,而我是一点也不会,只有站在一边看的份。

      那时会计算机的人很少,老师讲的我又不明白,考试的时候也不知道怎么过的。呵呵,后来我读研打工时,在网上看到洛阳一个高中生用VB编的一个“电子书童”程序,水平之高,我当时真是没法比。
    1989年六四动乱,广西高考名额一下减了7000多,竞争激烈,十几人里才能取一个,由于压力过大,我高考前夕失眠,第二天考语文,120分的试卷当时只考了68分,因而与重点高校无缘。本想复读,但父母怕我来年考不上,一定要让我读广西大学,我万分不情愿地顺从了父母的意愿,去了我不喜欢的学校,读了我不喜欢的专业。男怕入错行,我在大学毕业后重新开始学我喜欢的专业,足足用了五六年的时间才转过来,真正成为一名合格的劳动者,走了一条长长的弯路,所以,父母的决定对缺乏经验与决断力的孩子而言,真的是非常重要。

      现在想起来,父母当时没错,我也没错,那都是在时代与社会环境下的自然选择。

      2.失败的四年本科与工作初期

     作为六四之后第一批进入大学的本科生,我们学习了两年的“六四风波的反思”,四年里我是个老老实实的好学生,但四年除了玩命过了六级,什么也没学会.


     记得大学第一节课就是Basic语言,呵呵,也根本没学会,但我看来注定了要与Basic难解难分了,后面的实践篇中我会讲我用Basic开发的

     大学里我学的专业是电力系统自动化,学过微机原理与Fortran,上机时还用的是古老的主机加终端方式的计算机(叫做L/F机),我上机时真是一塌糊涂,因为这门课我从没学进去,也从没学懂过。有同学很厉害的,会用电脑打印出许多漂亮的图片(当然现在看起来很粗糙,针式打印机打的),我那时就称这些人为牛人了。

      我如果没记错的话,做超级解霸的梁肇新也是广西大学的,但不是我们系,记得我当时就已听到有关几个计算机牛人的事,估计其中就有他吧,如果我记错了,梁肇新先生请指正。在本科期间,我对电脑是神秘多于兴趣。这也说明我成为不了牛人与大师,天资有限。

     后来,我发现一个普遍的规律,如果能成为计算机方面的牛人与大师,请去翻翻他们的传记,绝大多数在本科期间就已展露出他们的才华。而我们现在的中国高校,这么多的本科生都在为考试、考研、考托、考G而奔忙,这种填鸭式的应试教育体制,扼杀了太多学生的创造性。结果是一个学生在大学里读得越认真,就受到的错误影响越大,我是用好几年的时间反思才得出这个结论的。所以,中国高校十几年数以几十万计的本科生中出不了可编写Linux内核的杰出人才,一点也不奇怪。

     1993年我毕业了,用我总结的一段话来说,是:一张白纸进来,一脑浆糊出去。

     毕业后我分到了一所号称是“中港合资”的生产蓄电池的公司,呵呵,刚刚工作的日子让我这个单纯的大学生被生活好好的教训了一下,许多无法以前想象的社会现象让我目瞪口呆,年轻气盛导致穿了小鞋,还只能忍气吞声。吃了生活的一个闷棍,我才明白,我除了有张文凭,什么都不是!

     当时,我感到最郁闷的是我在公司里什么都不会做,一个电机烧坏了我楞不知如何下手修,公司老总办公室里的灯不亮了,学电的大学生我花了半小时楞不知原因在哪!我学的东西没一样能用的。开始我还以为是因为我在学校里没认真学,但后来问了很多同学,90%以上的都有同感,我现在终于认识到这不单是我个人的错,我自认为在学校中是很努力的,从未偷懒过,但如果90%以上的学生所学不能服务社会,这种教育体制一定存在问题。

     四年里,我的电脑知识与技能=0!

     现在看起来,我浪费了宝贵的四年光阴!但当时的环境与认识水平,也只能如此了,没有当初的浪费,怎有后来的珍惜?这是人生必经的一个阶段。


    二 漫长的理论学习时期

      1.从电脑培训班开始

      我毕业后的第一个工作单位是一个非常差的企业,我在那儿见识了几乎所有中国差的企业的弊端:人浮于事,拉帮结派,暗箭伤人,损公肥私……。可以想见,在这样的企业工作,人是多么的颓废。我在无聊之中过了大半年的时间。1994年4月的一天我去桂林新华书店买书,看到桂林电子工业学院老师举办一个电脑培训班,教打字、排版、常用DOS命令等电脑使用基础,反正也没事,不如上个班学点东西吧。不曾想就是这样一个培训班,却根本影响了我的人生之路。

      我清楚地记得当我第一次上机时,连电脑开关在哪都找不到,老师拿着一张五寸软盘,插入软驱,打开电源,在一阵“吱吱”的声音之后,屏幕上开始有英文字符出现,然后,教师在键盘上敲入几个键,电脑沉默一会,突然在屏幕上跳出一个小人,出现一行字:快快乐乐学电脑,还传出了音乐。我当时真是惊呆了,电脑怎么还会唱歌?现在想起来,那个软件其实是台湾松岗系列教学软件,而我一个大学本科生,在毕业之后居然对电脑无知到这个地步,我真不知道是该哭还是该笑……!

      俗语说:“一见钟情”。我是相信这种事的,因为就是这第一次上机,让我产生了搜索这一神秘世界的强烈兴趣,从此就再难与电脑分开了。

      当时,有两位电子学院的老师:尹老师和陈老师。他们给我们讲DOS,讲汉字输入,讲他们如何修改天汇汉字系统使它能在一张软盘上运行,讲打字排版……,一个月之后,我不满足,又学了一个月。

      在上培训班的时间里,我向老师要来了桂林电子工业学院计算机应用专业本科四年的培养方案,回到家中,列出了所有本科课程,再根据书上的先修课程介绍,绘制了一张巨大的课程树,从树根开始,决定一本本地啃,从头开始学计算机技术。计算机科学的学习有较强的系列性,想一步到位很可能会学不懂,但循序渐进又无法跟上技术发展的速度,这是一个非常突出的问题。我现在想起来,觉得好的学习方式是:学理论打基础,在实践中逐步理解理论,多思多悟,就会发现层出不穷的新技术中有许多一直不变的东西存在。把握这种东西,就可以以不变应万变。这种“不变”的东西是什么?就是软件开发的基本原理与理论,基本思想与方法!在我对面向对象理论进行了较深入的学习与把握之后,我学.net只用了三个月的时间就可以独立设计一个完整的全面向对象软件架构,并且用VB.net与C#混合语言把它给做出来了。对于J2EE,我同样有这种自信,也用三个月的时间,一定可以开发与设计基于J2EE平台的软件,因为它们背后的计算机技术基础是一致的,完全可以触类旁通。

      尹老师和陈老师可能不知道,他们开的一个也许是为了经济效益的培训班,最后居然培育出了一个计算机硕士!所以,作为一名教师,其责任真的是非常重大的,可能会影响学生的一辈子,我感激他们!

      2.漫长而艰辛的学习之路

     我当时每月只有一百多元的工资收入,把大半收入都用到买书上去了。电子工业学院门旁的那个科技书店,以及桂林科技书店,成为了我最常去“站读”的地方。我买了数据结构、操作系统、微机原理、IBMPC汇编程序设计,C程序设计……这些教材,就按照预定的计划开始学了。

     我当时也说不清楚为什么要学这些东西,决不象现在学生学什么东西都有很强的功利性:学英语为了出国,学电脑为了好找工作。当时根本就没有想过今后如何如何,就是对计算机技术本身的兴趣推动我去学

     当时计算机书还不象现在这样扑天盖地,我几乎看完了我能弄到的每一本计算机书,看了一些书,就特别想有地方上机,能练一练。但我一个月一百多元收入,一台电脑怎么也得几千元,要五六年不吃不喝才攒够钱,父母都是普通百姓,家境仅能温饱,拥有一台电脑真成了我最大的美梦。

     为了有机会上机,我这个脸皮极薄的人也会什么都顾不上了,带着一盒保存着各种软件的软盘,厚着脸皮到处找可能的地方上机。在这个时候,电子工业学院又一次帮了我,他们的机房管理得并不严,我就冒充是他们的学生去买机票上机。后来去得多了,那儿的老师都熟悉我这张脸了,但搞笑的是,居然没一人知道我是哪个班的!

     当时电子学院用的局域网操作系统是Novell,我在那儿学会了使用许多最基础的软件,现在仍然如数家珍:CPAV,Turbo Pascal 5.5,UCDOS,TWAY(天慧汉字系统),Masm,TurboC2.0,还有鼎鼎大名的Norton公司的磁盘医生NDD,PCTOOLS,Borland公司的最牛的常驻内存的软件SideKick,……

     在电子学院机房,我还玩了经典游戏:决战中国海,冒险岛,战斧,三国……。

     学校网络里软件很多,但其中所染的病毒也五花八门。我记忆深刻的是第一次遇见Dir II病毒时,那种感觉决不是害怕,而是欣喜,呵呵,我见到病毒什么样的啦!由于DOS内核是开放的,所以那时开发一个病毒程序相对容易,大家又都喜欢用软盘拷来拷去,结果毒源泛滥,病毒的猖獗使得杀毒软件有了巨大的市场,现在大名鼎鼎的江民KV系列,就是在那时开始占据中国防毒市场,同时还有公安部的Kill等竞争对手,瑞星, 金山等都是后来者。

     那时,我白天在公司上班,就盼望着晚上的上机,每次上机我都有详细的计划,因为机时宝贵,所以份外珍惜。

     为了上机时能多敲些程序,我一咬牙,向妈妈要了两百元,买了一台电脑学习机,回家苦练英文指法与五笔输入,每天对着家里那台14寸的电视机屏幕,敲击至少键盘2小时以上。练得手腕酸疼,但终于达到了运指如飞盲打的程度。学五笔,背字根“目具上止卜虎皮,……”,足足花了一星期才背下来,并把每个字根与手指对应起来,后来看报纸都不自觉地将汉字给拆得七零八落,再也看不到是一个完整的汉字啦,当时好象练到了每分钟可打60多个字,后来我居然靠着这弹指神功当了一阵打字员混饭吃!呵呵,练好了指法,一上机,确实效率倍增,两小时能敲入并运行调试的程序比以前花三小时敲的还多。

     94,95年是我条件最差,但学习劲头最足的两年时期,外在环境的恶劣,却反而造就了我高昂的学习兴趣,那种痴迷,我想热恋也不过如此了,可能因为我太喜欢计算机了,所以爱情与我无缘,这也是无可奈何的事。 :-(

      我特别想说说我学习计算机技术书籍的感觉。如果你真的喜欢一门学科,那在啃一本本专业书籍时,就决不会觉得它厚,而只嫌它不够厚。对比我在本科学《电磁学》、《自控原理》之类枯燥无味的课程的感觉,那种课程脱离实际,从纸上到纸上,学生根本无法真正掌握。而学计算机课程《C程序设计》、《数据结构》、《操作系统》等课程的感觉真是天壤之别,原来本科学的东西是越学越糊涂,而我在学习计算机科学的过程中自己就感到慢慢地将所有的知识串成了一条线,脑中有一棵知识树在成长,这不是形容词,是真的感受。我学DOS命令,学了很久不明其道理,是在一天早上醒来时灵感一来,突然理解了文件与树的概念,于是,就真正把握了DOS命令的内涵,开始对Copy,Format,Move……这些英文单词游刃有余了。有段时间,我甚至能感觉得到我的知识在与日俱增!如果那时能有相对稳定的客观条件:比如有一台随时可用的计算机,那我一定学得更快更好。不过话又说回来,条件好的时候,人又容易为安逸所累,进步反而慢。还是那句老话:业精于勤荒于嬉。现在的许多学生就是物质条件太好了,反而不懂得珍惜。

      后来我看了金庸先生的《射雕英雄传》,郭靖成了我最喜欢的人物,不是因为他有黄蓉的爱,而是他那种坚忍不拔的毅力,以平凡之资终登绝顶!金庸先生真是妙笔!此小说我不知看了多少遍。

     最值得怀念的就是我学编程的岁月,我学C语言用的是谭浩强的《C程序设计》,当时谭老师在电视上同时讲C程序设计,我每天必看,把书上的每道例题与习题全部做了一遍,并写出了每次上机的安排。我每次都先在纸上把程序写出来,然后上机时争分夺秒地在计算机中调试运行,并根据运行结果思索为什么会运行不正常,在哪儿出错了,如何更正,上机完后还有总结。就是这样,我把谭浩强的《C程序设计》一书中的所有例题和习题全部敲到计算机中运行了一遍,打下了C语言扎实的基础。谭老师的书和课,的确影响了中国多少名程序员!

     我学了C语言之后,就开始想做点东西了。我用了一个月的时间,用C编写了一个中文下拉菜单的程序,从UCDOS中的字库中提取汉字点阵,然后在图形模式下“画”出汉字来,使程序能脱离汉字系统的支持直接显示汉字。整个程序应该有一两千行代码吧,全部是自己寻找资料,一行行敲进去的。后来,我又编了读取WPS文件的程序(当时DOS下打字排版是求伯君的WPS一统天下,Word当时在哪里我不知道呢!《电脑报》介绍过的求伯君,鲍岳桥等作为第一代中国杰出程序员代表,是我当时崇拜的偶像),我还编写了一个绘制简单图形的小程序,从编程调试的过程中,我得到了程序员基本功的最初训练。我当初没人教,遇见各种困难只能自己解决,为找出一个BUG,晚上睡觉做梦都在编程,而现在的一些大学生,程序通不过,马上问老师,甚至有学生把程序发到我的邮箱,叫我帮他调程序!有的计算机专业学生,学了四年,四年敲过的代码总数恐怕不超过2千行!

     的确,我当时的水平很低,现在的本科生比我当时强太多了,但至少有一点他们中的许多人不如我,他们不如我勤奋,也不具备我的毅力,我觉得这是现在这批八十年代出生的大学生最缺的东西。

     我用一年半的时间基本自学完了计算机专业的主干课程(除了《编译原理》,我实在看不懂),1995年我参加了初级程序员考试,结果上下午成绩加起来有90多分。但96,97我两次参加程序员级考试,虽然我已有不少编程实践,但仍然通不过,现在看起来,这反映出一个事实:我理论基础实在太差,天资也并不高。直到现在,我仍然痛感我的计算机基础理论不好,使我难以成为一名计算机科学家,而只能成为一名不错的软件工程师。

     从95年开始,我的生活开始加速下降,我所在的公司由于被一群我现在称之为驻虫与流氓的人给弄得不成样子,每月连100多元的工资都无法保证,我只得离开了公司,把档案往人才交流中心一放,就开始了我四年的社会漂浮生活……。

     在这四年中,我干了不下四五种工作:当过推销员,当过打字员,当过培训老师,修过电脑,从事售后服务,甚至摆过地摊……,一切的一切,很简单,就为了能有口饭吃。生活是严厉的,不讲情面的,我唯一的爱好就是闲下来就拿起我的计算机书来看。当时我大哥说过:你学这些东西有什么用?能靠它当饭吃?不要惊奇这种观点,在我们那信息闭塞的地方,当时有谁能想到计算机技术会有如此大的改变社会的能力?我之所以不懈学习,纯粹是为了解脱精神上的困惑,在技术的海洋中忘却生活的烦恼。我后来有一句名言:何以解忧,唯有电脑。别人当作一句笑话,但却是我当时的真实写照。

     万事都有两面,事情坏到极处,就会向好转化。又是一个很偶然的事,改变了我的人生轨迹。

     1996年,我的一个高中同学杨考上了湖南大学计算机系研究生,请客吃酸菜鱼火锅。在大家喝酒时,杨提了一个问题:请大家说出一个自己最想达到的目标。我的桂中同学大多数都是上的全国重点大学,此时毕业三年了,大家都对社会对生活有了自己的认识,于是就有了各种不同的答案,我当时的回答是:“我希望能有一天开发出一个好的软件,让许许多多的人都能用上它。”,这个目标我到现在都没达到。但当时大家是给我热烈地鼓励。杨饭后跟我说,你既然那么喜欢计算机,为什么不考研呢?对啊,我为什么不去试试呢?当天晚上我躺在床上,没怎么想就确定了要考研的想法。当时却怎么也没想到,考研之路成了另一条折磨人的不归路。对我一生的影响深远……

     这就是我早期的学习生涯,深深地体现出中国的时代特色。这段时间我的生活是困苦的,心情是苦闷的,但学习热情却是无以伦比的。现在我一个人拥有两台奔四电脑,随时可上互联网获取丰富的资源,反而在技术上难有寸进了。越来越觉得古语说得好:

     艰难困苦,玉汝于成!

      这是生活的真理!


      第一次考研的失败

     决定考研之后,我就去买了相关资料,取出尘封己久差点当废纸卖掉的大学课本,又开始了学生生涯。

     考哪儿的大学?是我首先要考虑的问题。

      当时还有另一个高中同学也准备考研,也是计算机,他报了广西师范大学的研究生。

      父母则劝我也考广西师大或我的母校广西大学的研究生,说那好考得多,也可以托人走走关系。但我这人很犟,我在西大混了4年,什么也没学到,我还去那儿干什么?我想起了高中时的梦想,决定直接考北京的高校。当然,北大清华是想都不敢想的,社会上工作几年,我毕竟清楚自己几斤几两,但北京几十所高校,难道一所也不行?我不能再听父母的话了,我要走自己的路,自己的命运自己负责,于是我坚持要考北京的学校。

      知道这件事的朋友都对我表示惊奇,工作了4年,学校里的知识都忘得差不多了,还想直接考北京的学校,难度之大,相信不少人都认为我成功的希望很渺茫。事实证明,他们的看法是对的,但不全对,因为世上本就没有绝对的事情。

     这时,我还在一家私营公司里打工,于是,白天上班,晚上就挑灯夜战,每晚不到12点不休息。
    经过半年的复习,我参加了1997年元月的全国研究生入学考试,成绩出来,我专业课没问题,但数学才得了44分,毫无疑问,名落孙山。

      这是一个打击,但对我并没有太大的影响。

      这时,我小时住在隔壁的阿姨来到桂林,她说她女儿(我小时的玩伴,也姓杨)去年就考研了,但也同样没过,她原先在北京服装学院读本科,毕业分回广西柳州一个国企里,工作一年之后考研,没考上之后,她就把工作给辞了,专门跑到北京同学家中复习一年。97年考研她成功了。
    得知这个消息,对我是个很大的鼓励。我想,她一个比我小的女孩都能成功,我为什么不行?我想办法与她联系上了,在后来的考研岁月中,她给了我极大的帮助,帮我买资料,帮我问成绩,写信给我,鼓励我坚持下去……

      受人滴水之恩,当涌泉以报。

      世上的人大都只会“锦上添花”,但只有“雪中送炭”才是最宝贵的。她就是我的“雪中送炭”人,她研究生毕业后嫁到青岛去了,断了音讯,但我心中永远记住了她的帮助。我决定,从今往后,如果我有能力帮助别人的,就一定要帮助人。这世界充满了太多不好的东西,我应该努力往其中添一点好的东西,哪怕显得多么微不足道

      “土包子”的北京之行

     中关村印象

      刚好,1997年我大哥在北京中央美院进修美术,我决定明年继续考研,于是辞去了在一家私营电脑公司的工作,于6月底来到了北京,住进了大哥的宿舍中。6月到7月,我在北航学计算机维修,7月参加陈文灯老师的考研班,一直呆到9月中旬,我才回到桂林。

     中央美院当时搬到了北京西北角的西八间房,我和大哥一起住在学生宿舍中。认识了不少来自全国各地的搞美术的大哥同学,我很喜欢和他们这些搞艺术的人在一起,看他们色彩斑斓,形象逼真的油画,和设计精巧的一些手工作品,是一种美的体验。与我们工科人相比,他们是另一种思维方式。

     7月份,大哥要回桂林了。在回桂林前,我帮他和他的同学们去中关村电子市场一口气买了三台电脑,当时最红火的电子市场是中关村电子市场,就是现在北大太平洋电脑商场所在的地方。那时电子市场里熙熙攘攘,如此的红火,是我在广西所从未见到的也从未想到的。在大街上随处可见抱着台打印机,拎着个扫描仪的人,把电脑配件当成白菜一样卖,这就是我对闻名全国的“中关村电子一条街”的最初印象。

     我到了中关村,见到了那些我非常熟悉的公司:北大方正, 金山WPS,江民科技……,见到了北京书堆积如山的书店,感叹这里真是一个知识的海洋,觉得亲身感受到了中国IT业的脉博。
    大哥回去后,我一个人留在北京,骑着辆破自行车逛了中国最有名的大学:北大和清华,北大风景如画的未名湖上处处荷叶飘香,清华平平展展的草坪展示一种平实坦荡的心胸。一墙之隔,校园内外,就是两种不同气氛,无名无状,却让我这个二十多岁没出过广西的土包子感受深刻。
    “疯狂”的考研班

     我参加的是暑期文登学校的考研班。中央财经大学那栋破败不堪的学四楼里,住满了来自全国各地的学生,和我住在一起的,一个是湖北的,一个是东北的,一个四川的,为了同一个目的,大家从天南地北聚到了一起,我当时真感到了一种“家”的感觉,原来这世界有这么多同路人,我不过是中国十几万考生中一名不起眼的“老生”罢了,但还不算是“范进”。

      考研班的日子是“疯狂学习”的日子。

      记得我们需要到北方交通大学的大礼堂去听人大老师索爱群的政治课,一千多人的大礼堂被挤得满满的,连过道上都坐了人。在老师的讲台前堆满了各式各样的录音机,足有一百多部,来自全国各地的莘荠学子拿着一瓶矿泉水,在北京最热的7月,挥汗如雨地在记笔记!这段日子,我用去了7个笔记本!这种气氛,我以前在广西是从未见过的。我本来以为我已经够努力勤奋的了,到北京考研班一看,根本就不算什么。

     陈文灯老师教的数学给我留下了最为深刻的印象,他上课不用讲稿,所有的例题全都记在他的脑里,随手就可以写出来,丝毫不差,还总结出一整套解题方法,让我大开眼界。我是见着了,原来一个人对本职工作可以精熟到这种地步!后面我还会谈到另一位老教授对职业可贵可敬的敬业精神,不敬业,就不是一个合格的劳动者。

      我一直呆到身上没钱了才离开北京。这三个月花完了我工作几年的所有积蓄,却对我的影响是巨大的,中国什么地方最适合学习?最适合学计算机?在我看来,只有北京!

      我下定决心,一定要到北京来学习计算机技术。

      差点跳楼的致命打击

      9月中旬我回到了桂林,开始准备第二年的考研。

      但生活是不讲情面的,我想当然地认为经过了北京名师的指点,我去年就是数学没过,今年应该没问题了,但事实并不如此。

      1998年的数学试题,突然有了一次很大的变动,这次数学考试特别难,题量还特别大,全国及格率仅7%,平均分为30多分。我现在将这次考试试题称之为“变态”的题目,出题的那帮呆在空调房里的教授们挖空心思出出来的题目,可把我给害惨了。我自认为心理素质够强了,但因为这场考试关系命运太大,在考场上我的手都是抖的,几乎晕倒,一道道的大题空在那儿做不出来,都象是在不断地讥笑我不自量力,又象是一张张面无血色的血盆大口,一张口就把我给吞下去了,连骨头渣子都不吐。
    考完数学,我就知道我今年没戏了。原来一个考场有几十位考生,考完数学之后只剩下不到三分之一的人。我坚持着把后面的课目考完。在那种明知无望但仅凭一种信念支撑着要坚持到底的时刻,我真不知道当时是怎么挨完后面的专业课考试的。

      3月,成绩下来了,我的数学成绩让我差点去跳漓江了---13分!我从小学习勤奋努力,从没拿过这么低的分数。真是破纪录!当时真是灰心到了极点,准备放弃考研,到广东打工,找个地方浪迹天涯,自生自灭去,实在没脸在家呆了。

      这个时候,我大哥劝住了我:你都考了两次了,我看来你就是数学差,其它课你都过线了,专业课还都是80多分,为什么不继续努力?集中精力把数学搞好就可以了。你现在放弃,就前功尽弃!
    我这人笨,从小学东西就慢,这是一大弱点。但上天是公平的,他给你一个弱点的同时,也一定提供了让你克服这个弱点的方法。

      我笨,但我好强,但我勤奋,但我坚持,人一之,我十之,笨鸟先飞,古已有之,古人可以做到,我为什么就不能做到?这事就这么收场?我不服,不甘心!于是,我下定决心再拼一次。
    我现在没有工作,也不想再去找工作了,住在家中,就与堆积如山的书干上了。在关键时刻,年迈的父母无条件地支持了我,他们默默地承担了一切,让我有饭吃,给我一个安静的环境,让我去实现我的梦想。

      我深深感受到父母的爱是多么的无条件!我一个二十五六的大小伙子,呆在家中吃闲饭,还让父母为我的前途操心,那种心灵的煎熬,现在想起来都有种想哭的感觉。男儿有泪不轻弹,只因未到伤心处!在此,我要深情地对我的父母说:儿子绝不会忘记你们的恩情,唯望两老保重身体,一定要等到看到我过上好日子的时光。

      反思,走自己的路!

      考研失败,我反复想,为什么我听了陈文灯传授的做题秘诀,反而考得更差了?别人为什么用陈老师的方法考出了好成绩?看来,每个人的具体情况不同,不存在可以让人暴长功力的“武林密笈”,从这件事中我学到,决不能迷信权威,迷信理论。后来我对许多现象与潮流如CMM热,设计模式,软件工程等理论都持有不同的看法,认为把西方的东西原样照搬是行不通的,不经过自己的大脑独立地思索,不经过实践的检验,不要相信任何东西!

      从98年到99年1月,我断绝了一切外部联系,把自己关在了家中。我父母的工作单位是一个疗养院,全院加起来也就一两百号人,后山就是一个森林公园,空气清新,林木繁茂,大院里还有一个小山(是真山,不是假山,桂林的这样象竹笋似的山多了),山上修了个亭子,平时少有人来,真是一个闭门修行的好地方。

      我每天到小山亭子上去学英语,背政治,桂林四季长青,我周围是青山绿竹,微风一过,树叶沙沙做响,我就在这里学起了战国时的苏秦。从春学到夏,再从夏学到冬,苦苦学了一年,这一年里,使我的心志得到了极大的锻炼,困难更加难以击倒我。后来我境况转好,生活中很多人觉得受不了的挫折,在我看来都不过是小菜一碟罢了。

      桂林多奇山,秀美苍翠,风景四季如画。每当我学累的时候,总是看着这美丽的风景,赞叹祖国江山如画,感触人生之渺小,命运之无常!

      大哥从北京带回了一台电脑,奔腾166,4.2G的昆腾大脚硬盘,当时不错的配置,把它送给了我用。我渴望了多久的东西终于到手了,我终于可以无限制地使用计算机了!我把电脑放在床前,伴它入眠。
    我有时半夜会突然惊醒,想着目前的困境,浑身会出一身冷汗。电脑沉默不语,在一旁安静地陪着我。我看着那蓝幽幽的屏幕,心情非常复杂。

      有了电脑也难过,我得抑制住自己强烈地想探索软件技术的欲望,强制自己把主要精力放在考研上。
    整个考研英语大纲有5300多个单词,为了背下它们,我用VB编了一个背单词的小软件,每次可以分别显示中文或英文,并可以区分哪些单词没记住,下次复习。所有单词我都是用键盘一个字母一个字母地敲入的,每天早上一起床,先对着电脑背它半个小时。到考研结束,我一看,数据库中已有了两千多个单词。

      这一年以来,我真是玩命,什么考研理论我都不信了,我就托人买了国家教委出的几本考试分析,就专门研究考研试题,我要找出适合我自己的方法来。

      考研数学考试分析500多页的书,被我翻来覆去地将历年考试试题做了三遍。党的十五大报告我至少背了一百多遍,我称之为背“语录”,真称得上是“倒背如流”,考政治时我把大段大段的十五大报告文字抄上去,居然得了75分!

      发黄的本科高等数学和概率与数理统计,以及蓝色封皮的线性代数课本,都被我翻得不成样子。我觉得我就是基础太差,在这种基础之上,讲什么做题方法都是空中楼阁,一定要抓住“三基”(基本知识,基本方法与基本原理)。但我不得不悲哀地指出,我这些努力并未使我的数学能力有所提高,数学并不是这样学的,数学思维绝不是这样培养的。怎样学数学?得去问华罗庚与陈景润等数学大师!我至今数学还是不行。也希望有这方面经验的人能够教我,让我补上数学这一课。

      生活总算给了我一次微笑。1999年考研,我数学得了60分,终于迈进了大学的门槛,可以打起背包上北京了。

      我这人比较笨,不善于找到达到目标的最佳路线,但凭着牛劲钻下去,硬给我钻出了一条路。这条路能走通还带有一些侥幸的色彩,大家想必比我聪明得多,一定能找到更好的路,用更经济更聪明的办法达到目的,这是一种大智慧,是我所没有的。

      这段经历对我个人的思想品质的影响是深远的。为什么这么说?为了考政治,我深入全面地了解了中国近现代史,我去盗版碟市场买了不少存有历史资料的光盘,从多方面来看中国历史,凡电视中有关历史的节目,我必看。我在这里尤其想说的是一个巨著——《毛泽东选集》!经历过文革的每个家庭,哪家没有毛选?我家就有不止一套。毛泽东选集一到四卷,发黄的书被我在这段时间通读了一遍。其中的经典文章更是被我看了一遍又一遍,赶上金庸的《射雕英雄传》了。越读越觉得毛泽东之人真是数百年才出一人的大牛人,他的《湖南农民运动考察报告》、《论持久战》等著作,其中体现出来的深刻洞察力与对中国国情的深入把握,其博大的心胸,为国为民的精神真叫我震撼!***最终夺了天下,实在是中国社会的必然,当时她集中了多少中国最出色最优秀的人才,再加上毛泽东这种不世出的大牛人领导,老蒋真与他不是一个水准的,想与老毛逐鹿中原,必败无疑!我成了毛泽东的崇拜者,但绝不是盲从者。

      说起来大家可能不信,我从毛选中得到了许多精神上的营养,更加乐观了。毛选,真是中国人巨大的精神财富!近年来有不少愤青指着毛泽东晚年的失误全盘否定毛泽东,在我看来真是狂妄无知,他们有几个真正了解毛泽东?有几个真正客观地看过毛选?有几个有资格对毛泽东做出评价? 把他们放回毛泽东生存的那个民族危亡的时代,他们还会有这么多屁放?!说不定最先当汉奸的就是他们。呵呵,不好意思,说粗话了。

      闲话少说,回到正题。

      回顾这段经历,我只能说是“具有中国特色的考研之路”。我感叹,中国的考试就是扼杀人性的东西,高考与考研尤其如此。我要是用这种精力去学计算机,一年半的时间,还有什么技术学不到手?但我没办法,现实逼着我去考这种我并不想考的试。中国考试之难我看全世界也不多见,我想,每年全国还有那么多的学生要参加这种考试,大量的人力物力与年青人的精力和时间都耗费在考试上了,而考试的内容与实际脱离那么远,真的有助于人才的脱颖而出?我看反倒是形成了一种应试教育,扼杀了年青人本来所具有的创造性,中国现在为什么出不了大师级的人物,应该反思中国的教育制度。


    下篇 曲折的实践之路

    1.希特勒地堡与CIH病毒

     99年4月,我来到北京参加研究生复试。复试完了之后就不回去了,我拿着一张光盘,里面刻着我用VB和Authorware3.5编的一个Cool 3D的教学软件,到处参加招聘会,开始了在北京的打工生涯。

     说句实话,我心中真是一点底也没有。北京人才济济,我一个三流大学的毕业生,又不是计算机专业的,有人要我吗?

     我在北京无依无靠,没有任何一个亲戚在北京,住成了大问题。北京这地方,钱太不经花,生活费用太高,我四处寻找便宜的地方住。后来,我在北京化工大学对面的招待所中租了个床位,每晚20元,地下室。这个招待所的地下室非常大,每天回去的时候,都要走过长长的曲曲折折的通道,加上那昏黄的灯泡,每次我都有走进了希特勒地堡的感觉。地下室里潮湿阴暗,不见天日。地下室里人员很杂,什么人都有,永远没有一种安全的感觉,所幸的是我也是个穷光蛋,光脚的还怕穿鞋的?别人能呆我也能呆,唯一让我担心的是钱,没钱,在北京连流落街头都不够格,立马被收容去昌平筛沙。呵呵,我没这种经历,这是当时住一块的一个外地要考北京中医药大学的博士生说的(我俩居然住到了一个屋里,大家都没钱,只能挤地下室,只是他老兄晚上打呼,我可真受了不少罪)。

     日子一天天过去,袋里的钱一天天少了,但工作还是没着落,心中越来越慌,除去学费,来京时父母给我2000元,大哥资助我的1000元就是我当时的全部资金(3000元在北京能呆多久?!)。我当时订了个计划,留下500元保底,打死都不能动,要靠它作路费回家的。我当时说,一定得找到一家公司,再少的钱都干,只要有口饭吃,有张床让我睡我就满足了。

     我一共应聘了四五家公司,最具传奇色彩的是到西单附近一家公司的应聘经历。那时,我带去了我的作品,公司项目经理要看,于是我给他们演示,很奇怪,程序一打开就死机,一连两台电脑都一样,末了,两台电脑都启动不起来了。用瑞星一查,CIH病毒——那天正是4月26日!于是,CIH破坏了电脑主板的同时,也无情地摧毁了我的就业机会。还算老板可怜我,没要我赔。其实我当时快到山穷水尽的地步了,真要我出钱,我可能连家都回不了啦。陈盈豪(CIH病毒的作者),你小子这么的聪明做什么不行,偏要去做病毒,害人害已,弄得我连个饭碗也找不到,晚上回“希特勒地堡”,把这小子骂了无数次!

     总算天无绝人之路,在我数着最后还剩余600元钱的时候,终于有一家公司要我了,做中小学教育软件,月薪1600。干了两星期,又给我在公司的仓库挪开货物,搭了个床位,我就在那住下了,庆幸再也不用到“希特勒地堡”里当冲锋队员了。每天下班后,我就睡在林立的大纸箱之中,如果来个地震,呵呵,我就埋在纸箱中了,休想爬得出来!

     我干得非常努力,第一个月工资开出来,扣掉个人所得税,我拿了1500多元。你们不知道我拿到第一笔工资的感觉!这钱在很多人眼里简直不算钱,但对于一个没工作近两年,工作也一个月收入不到200的穷小子而言,就象陈佩斯小品中所演的:“我王老五活了一辈子,还从没见过这么多钱啊!”。好笑吗?我一点也不觉得好笑。我只是心酸,我到了28岁才可以用自己的知识与技能养活自己,再不用依靠父母和兄长的资助,才真正完全用自己的力量在社会上站起来,一个没有经济自立能力的人,只能是个不成熟的人,一个躺在父母身上的人,不是一个真正的男子汉!我当这样的孬种当了28年!

      我找到工作后向家里写过一封长信,信中讲了我对父母平时不好意思说的很多心里话,当时,我父亲说,母亲接到信都哭了。 我刚拿到工资,马上打了个电话回家里告诉母亲,以缓解他们的焦虑,毕竟儿行千里母担心啊!父母有退休金,一再表示不需要我赡养,而我再这样不要脸下去,我还是人吗?我就是从那时候开始,下定决心,从今往后,再不向家中要一分钱!今后三年读书和生活的费用我一定要用自己的劳动来获

     金钱带给我的激动就是在那段时间,温饱问题解决之后,金钱对我的诱惑就再没有了,哪怕让我一个月赚一万,给套房子给我,也不可能再给我带来幸福的感觉了,钱是重要的,但不能成为它的奴隶,家中不需要我负担,我一个人有吃有喝,干着我喜欢的工作,足矣!

     我在那公司一直干到九月学校开学为止。我走的那一天,公司居然还开了个欢送宴会,老板封了5的封包给我。我真是感动。我大学毕业后在社会上挣扎求生,得到的大都是冷眼与蔑视,社会终于认可了我的价值,我不是一个只知道吃饭的废物!

     1999年9月9日上午9点,在这个最多9字的时刻,我到学校报道来了,放下行李,我坐在分配给上,心中终于踏实下来。

      现在,我在北京终于有一张属于我的床了,一张真正属于我的床了,终于有个地方可以让我安稳地睡觉了。没有这段经历,我怎么体验到“安居乐业”这一个词的真实含义!个人如此,国家要做到,中国要做到,更难!

    2.编程生涯

      读研两年半的时间,我四处打工,这两年半我至少在七八家公司做过,编了十几万行代码,为自己赚了一台电脑,两部手机(丢了一部),还有读研期间的所有费用,实现了我的目标:没向家里要一分钱。我水平不高,但在打工过程中,发现许多中国软件公司的水平更菜!

     2000年暑假,我参加一个商品软件的开发,搬到了北大燕北园的一个宿舍,在那儿搞封闭式开发。在这个项目采用VB6开发,主力程序员除我之处,还有一个华北电力大学的研究生。大家都没开发商品软件的经验,没经过正式的设计,就匆忙编码了。我曾经想采用分层的系统架构,但遭到另一位程序员的反对,争吵没有结果,老板也不能做决定,结果各行其是。现在看起来,那时真是太菜了,任何一本软件工程书都会指出这种做法是不对的。

     我们直接就热火朝天的干了起来,那位华北电力大学的老兄,真让我佩服,他可以在一个Sub过程中写上2000行代码!我觉得奇怪,为何他能写这么多的代码?一看,顿时我晕倒,他居然将每个控件的Left,Top,Width等属性都用代码来设定!想想这样的程序,调试时光单步执行就需要按多少次F8键!

     我们在电脑旁边搭了个行军床,每天都是干到早上6点才睡,12点吃中饭,然后又是一个通宵整个工程只有一个类模块,被我用于封装访问数据库的ADO数据引擎,这是整个工程中唯一一处用到了最简单的面向对象技术的地方,然后,我写了近十个Bas公用模块,每个模块代码规模都有一两千行,还有十几个窗体,每个窗体中都塞满了事件驱动的VB代码,整个软件应该有10万行代码,我一个人在此期间至少就写了3万多行VB代码。程序的主处理流程我甚至用ADO与DAO写了两套!

     现在想起来,我们当时根本就不知道面向对象为何物,更不理解许多对软件开发至关重要的理论着一种热情。在这段痛苦的开发经历中,我不仅精熟了VB,而且从中学到了很多。现在再开发同样功能的东西。我至少可以砍掉2/3的代码。怎么学都不如从失败中学得多。

     后来我总结VB程序员的三个境界:
     (1)所有代码都只放在窗体文件中的,属于菜鸟级,他们只会从面板上拖控件,设置属性,然后再给事件编码
     (2)工程中有BAS模块的,属于中间级,他们已意识到有大量的代码是重复出现的,应该将其抽取出来作为公用模块
     (3)工程中有CLS模块的,属于高手,他们已掌握了面向对象的思想,并能应用这种思想来解决实际问题

     正是这次开发经历,促使我反思:到底如何开发软件?我个人可以用VB完成各种各样的功能,为什么凑在一起就会那么困难?更正一个BUG为何那么难?为什么一个看似简单的软件,要拖半年的时间还看不到结束的日子?

     九月,研究生要开题,我自拟了个课题:软件体系结构设计。我决心弄明白,好软件到底是怎么做出来的。

     我放下了VB,开始研究C++,原来学过VC,但没学会,就直接从C++ Builder入手。Borland公司的VCL类库让我大为叹服,很快就迷上了它,为此连带学了Delphi,并参与了一个Delphi项目。给我真正震撼的是《设计模式》这本书,看了才知道,原来好软件是这么设计出来的!在此,我强烈推荐所有有一定编程经验的程序员一定要看这本书!

     一边学习理论,一边可没忘记我没经济来源,于是又四处打工,接一些小项目与小模块来赚些生活费,国内一家横跨家电与软件的著名公司是我打工期间去过的最大的公司。但无论什么公司,都给我一种感觉——烂!公司中充满了对员工的剥削与不尊重,对软件开发这一事物的错误认识,管理混乱。

     我没机会去外企,技术水平不到,别人不要我 L,但我所见到的软件公司,我敢说没一家能做出世界一流的软件!

     我上的研究生课程也让我失望,整个就是本科教育的再版。经过高考与考研两次重大考试,我对考试已是深恶痛绝,但读研期间仍要考试,而且是闭卷!我就不知道我去背那些条文对我的研究与学习有何帮助?2000年7月当我考完最后一门,终于大松一口气,我终于摆脱了考试的压迫,可以在剩余的一年半中真正搜索我渴望已久的软件技术了。这年,我29岁。

     悲哀吗?一个中国的程序员要到29岁才可以真正自由地学习想学的东西!

     我开始研究面向对象理论,看了大量的书,每天都在实验室学习到深夜12点,天天上网, CSDN成了我最常去的网站。

     随着我对软件技术的了解越多,就越深刻地感到国内与国外技术水平的差异是如此的巨大,巨大得甚至有让人绝望的感觉。同时,在北京这个中国软件人才最集中的地方,我也见到了许多牛人,一个清华的本科学生,做程序员可以拿到一个月12000元的工资,一个北大的计算机系研究生,一毕业就到外企,一个月一万多收入,每年发16个月工资!干了两年就开了自己的公司。我看到了一个北方交大的本科生作品,在半年的业余时间里,用Delphi写了十几万行代码,他甚至在代码中嵌入汇编,自行编写数据存取引擎读写Foxpro,速度超快!软件中有一个计算公式解析模块,他用编译原理理论居然做了一个小型的公式解析器,就象C++编译器检查C++程序一样,不仅可以判断是否公式正确,而且给出的出错信息还相当准确!其基本功之扎实,水平之高让我望尘莫及!中国优秀的人才真还是不少的!在精英集聚的北京,面对着博大精深的软件科学,我深感自身的渺小。

     但我毕竟是靠自己奋斗出来的,我并不自卑,这世界需要牛人,同样需要大批合格的劳动者,我成为不了牛人,但我作一名程序员是合格的。

    时间过得飞快,一年半根本就不算时间,马上就要毕业了,学习的成绩如何,要到社会上去竞争了,让社会考场来决定你是否及格。

    3.毕业求职

     98级的研究生是IT业最后辉煌的回光反照。当时,各大公司都发了疯似的要人,象华为,当时是来者不拒。计算机专业的研究生是一抢而光,本科生也供不应求。2001年毕业的我的师兄师姐们,平均每个人手头都至少有两三个Offer,谈的工资没有低于每月6000的,许多人去了外企,工资在8000~10000每月的也有。真是毕业生的黄金时间。

     但好景不常在,911事件我看来好象成了分水岭,911之后,整个IT业急刹车,就业形势急转直下,各大公司都在消化去年吃得过饱的胃口,我形容是大家都吃坏了胃,再也不可能有我师兄师姐们的风光了。虽然时间相隔仅大半年。

      从10月开始,11月和12月,我几乎是在招聘会与公共汽车上渡过的,北京东南西北地去面试,上午在上地,下午可能就要跑到朝阳区,疲于奔命。

     在找工作过程中,我良好的心理素质与丰富的编程经验起到了很大的作用,并没有遇到很大的困难,就先后有几家公司表示要我。

      其中我想说的有两家公司。

      一家是台湾公司,应该说他们做得是不错的,但我非常反感他们那种自认为高于大陆人的那种优越感,而且待遇也不高。面试之后,回来感觉很不好。当时台湾是民进党上台主政,我就称之为“民进党”看不起“***”(虽然我不是党员,但我们都是中国人,都希望中国能强大,让她的人民能挺直腰杆)。
    我想:我们大陆确实是不如台湾发达,难怪别人看不起我们,这世界势利得很,社会如此,国家亦然。但我中华960万平方公里的国土,13亿人口,难道要依靠一个小小的岛屿来撑门面?难道除了台湾公司,我就无处可去了?虽然改变不了什么,但我决定绝不去台资和日资的公司工作(日本人我更不喜欢,但我认为他们做事实在优秀,我们一定要向日本人学习)!在这种公司呆着,不爽!同时,我们的确也得争气些,这世界只尊重强者。

     另一家是个很不错的民族软件企业,想要我,其老总专门找我去面谈了一次,希望我能到他的公司工作。这位老总白手起家,能在五六年的时间内由几个人发展到300多人,当时,是中国这个领域软件市场占有率最高的公司,我非常佩服,他为人也很好,并表示可以给我每月比其他研究生多加1000元工资,而且希望锻炼一两年之后我能够带领一个团队来开发产品,并负担我毕业所需交纳的各种费用。在就业不景气的2002年,对我一个30岁的技术水平有限的老程序员如此看重,真叫我感动。虽然我最后还是没去,但我仍然对这个公司充满了好感。一个软件企业最重要的是什么?是对人的尊重,没有这点,可以断定,这个公司长不大。

     我为什么没去软件公司?放弃有可能在几年之后年薪突破10万的收入?是因为我已有了更想做的事,我想当老师!

     我自己是从自学的路上走过来的,其中的艰辛历历在目,无人指点,我走了多少弯路?中国还有多少是象我这样的年轻人无人指点的?我幸运能爬出来了,因为我至少还能有饭吃,比我条件更差的,比如农村的孩子,可能就被生活的压力所淹没了。我个人的力量很微弱,技术也有限,但我自认为至少是一名合格的程序员,如果能培养出一大批达到我的水平的学生,他们毕业后成为合格的程序员,中国软件的根基就会更扎实,如果更能有一批远远超过我水平的学生出来,中国软件就有希望了。软件是什么?软件以人为本!

     人生追求什么?金钱?我很缺钱,但不可能把金钱作为我的目标,我希望我能够成为一个对社会有所贡献的人,能够获得心灵的充实,于是,我选择了留校。

    4.对教育的反思与教书生涯

      2002年下半年,我参加了北京高校青年教师岗前培训。一位杜教授的两堂课让我印象深刻,其中两句话让我深深震动:

      第一句话:我是一个教书匠,教书匠好啊,好就好在“匠心独运”!
      第二句话:做什么工作都要达到变魔术的境界!

     是的,作为一名教师,就必须起到一个传声筒与放大器的作用,将人类最聪明的人探索世界所得到的知识予以拓宽发展,以便让更多的人能够掌握这些知识并进而应用于实践,从而推动人类的不断进步。

     作为一名计算机专业的教师,就要努力把先进的计算机技术以尽可能高的效率传授给广大的学生,引导他们直接面对真实的软件世界,而不是向他们硬灌各种各样的理论知识,强迫他们去死记硬背以应付考试。

     我是一个小人物,才低学浅,但我真的认为高校计算机教育存在严重的问题。我在打工期间的开发经历,以及阅读国外相关资料的时候,发现学校中教的和社会上用的差得太远!都已经是什么时代了,许多大学还设立Foxpro课程,难道就不能直接用现代主流的数据库如Oracle,SQL Server,哪怕是Access也好,来讲授数据库知识?还有所谓的计算机等级考试,呵呵,过了三级学生的我见过不少,但他们真正对软件,对计算机又理解多少?

      在中国甚至于升职称也要考计算机,我看了一本职称计算机考试教材,里面几乎原样照搬计算机原理课程中的相关章节,弄得我给搞艺术的大嫂讲了一个小时的二进制与八进制、十六进制的转换方法,她还是弄不太清。我都泄气了,对啊,他们搞艺术的,有必要去分清二进制的10与十进制的2有何分别吗?他们八辈子也用不上。但是考试用得上,呵呵,又是中国特色。

     拿C++来说,我讲过C++课,许多的国内教材对C++语法下了大功夫,却对体现了C++精华的STL只字不提,对代码背后所体现的软件开发思想与方法更是视而不见,我用C++也编过不少程序了,说句实话,我用到的特性不到C++的三分之一!于是就出现了这种怪现象,许多学生考试可以拿八九十分,给他一个简单的实际问题他却不知如何下手!

     还有UML,现在好象很火的样子,我们读研时就开了这门课,讲句实话,当时这门课我就没听懂,可后来我尝试着用C++用面向对象的方法来编程序,然后,由代码倒推回UML类图,一下子就明白了,原来UML只不过是一种描述面向对象系统的符号罢了,如果学生没进行过真正的OOP,那就是为了学UML而学UML,根本就本末倒置。

     还有软件工程,我的感觉,一个人如果没写过一万行以上的程序,他看软件工程书就同看政治书差不多,每句都对,呵呵,就不知道为什么对。我完成了那个几万行的VB程序之后,再回过头看看理论,真是句句是真理!每个理论背后都是大量实践经验的总结。

     回想我做软件的体会,我发现所有的知识都是一个完整的体系,根本就无法区分哪些知识是本科的,哪些知识是研究生课程。于是,一种想法产生了,我主讲程序语言类的课程,那我就直接以真实的软件开发过程为主线,实践中需要什么我就讲什么。讲C++/Java,我就抛开了指定的教材,C++我讲了STL,Java我讲了OOAD,两者我都讲了用Rose进行双向工程,引导学生去学UML,一开始就用UML去描述自己开发的程序,何必浪费大量的时间去学结构化的编程方法?

     我现在简直成了面向对象技术的布道者,我下学期即将开设OOAD基础选修课,从实际项目中抽取典型的案例,讲UML,讲Rose,讲设计模式,讲软件体系结构,例子代码横跨C++/Java和.net下的开发语言(C#和VB.net),这对于我一个技术水平有限公司的董事长而言,实在有点不自量力,我鼻子上才插上几根葱,就想装大象?但我想,如果我能成功地激发出哪怕1%的学生的兴趣,能引导他们走向我认为是正确的方向,能启发他们思考,能直接面向真实的软件开发活动而不是学校的考试,就是我的成绩。我现在正在看引进的原版书籍---《设计模式解析》,时时击节赞叹!《设计模式》经典但难懂难用,而《解析》一书的两位作者既有丰富的从业经验,又对OOAD进行了深入的思索,真知灼见时时展露于书中,我现在刚看了这本书的80%,基本上可以用一个成语来描述这部书:深入浅出!

     要做到深入浅出谈何容易!只有同时具备技术专家与文学作家素质的人才能做到!

     反观我们国内的大量教材,还有大量的垃圾论文(包括硕士,博士的,本科的就算了,我看绝大部分根本不能称之为论文),全都是“浅入深出”,作者自己都未必明白,就东拼西凑,摆出个样子吓人。本来完全可以用大白话三言两语讲清楚让人明白的道理,有人专门要绕一大圈,专挑用高深的数学公式来表达,唯恐别人容易理解,显得他水平不高!呵呵,什么东西一沾上“数学”,立马身价百倍。我就听过一个北师大的一个在读博士说过:如果一篇博士论文中没有一个数学公式,根本就不算是博士论文。这句话对不对,大家可以多思索。我数学不好,没资格讨论数学,我的直觉:数学是工具,但如果为了发表论文等目的而故弄玄虚,为数学而数学,是不合道理的。中国的学术水平与现状,大家都心知肚明,不用我废话了。

     现在每年都毕业大批的计算机专业学生,可其中真正具备扎实根基的可以很快胜任工作的我看只有5%(95%的学生不要扁我,不同意就当我在说胡话,我很瘦的,一扁就没了J)。多年以来,我国高校计算机教育是按照计算机科学研究者来培养的,可事实上,有多少学生能从事计算机方面研究的能力?我看应分流,80%的学生按工程师方向来培养,20%的学生按研究者方向来培养,而且应大幅减少必修课的数量,计算机领域太深太广,样样都想教给学生,反而成了夹生饭,一个想从事硬件设计的学生和一个想从事软件开发的学生,能给他们一样的饭吃吗?学校应提供各种条件和资源去引导学生,激发学生的创造性与主动探索性,让他们去尝试,去发现自己的长处,最终找到最适合自己的发展方向。不这样做,中国软件后继乏人,没希望。

      5.实践第一

     2002年下半年,我和一个朋友去了北京郊区的一家杂志社,看到的情形让我震惊:在信息产业最发达的北京,这家杂志社还用人工查对杂志订单和款单,看着那按省来登记的几大本厚厚的客户登记本,工作人员需要手工来在其中查找相应的信息。这样的工作效率,这样的行业信息化水平!北京如此,全国又如何?

     从这件事上,我看到了中国软件业的另一方面。一方面我们没有核心技术,另一方面,已有的技术又根本没推广没用好。追踪世界先进水平,对于我等这种水平的人来说,确实勉为其难,但将已有的技术用于解决实际问题,却是我们可以做的。如果中国各行各业都真正能通过进行信息化而提高生产效益,那中国不就从根本上强大起来了吗(象印度,IT一枝独秀,其他行业没有起色,我称之为跛足的国家,绝不能成为世界强国)?在扎实的社会基础之上,软件业不就有了更大的市场与发展潜力?中国许多行业的信息化水平非常低,而且中国地域广大,发展非常不平衡,有些地方信息化水平甚至为0!努力推动行业信息化,是我们这一代软件开发者的责任!而追赶国外先进水平,恐怕就不是一代两代程序员可以达到目标的,需要长期的努力。作为一名软件开发者,只能脚踏实地,哪怕你只做一个小小的MIS产品,也要尽力把它做好来。

     于是,我开始了期刊发行系统的开发,这完全是自发的,没有任何资金投入,只有一种热情在支撑。我开始选择C++ Builder开发,做了几个月,完成了第一个版本,但我发现,我找不到足够水平的C++程序员进行合作开发,而且整个一个EXE文件,在体系结构设计上虽采用了分层分块的设计方案,但却是源代码级别的,要拆分成COM组件难度太大,不是一个人能完成的,于是中途流产。

     2003年3月,我开始系统地学习.net,我吃惊地发现,我原来想在C++中实现的许多功能,比如对象串行化为XML,在.net中已有现成的类可用,.net更把OO的功用发挥到了极致,它的混合语言开发,它的反射机制,它的新的自识别的软件组件,以及强大好用的开发环境VS.net,都让我惊叹 微软对开发者遇到的困难的深入把握,相比用C++开发,至少可以提高1/3的开发效率。于是一个新的想法产生了,我要把以前的产品用.net重写,利用.net强大的组件模型,将设计模式理论推广应用到组件级别,通过XML和反射机制建立一套可动态装配的软件生产流水线,实现象Dell直销PC那样的软件动态装配直销。只要建立好灵活可不断重构的系统架构,配以对业务领域的深入分析,逐步建立功能强大的业务组件仓库,就可以实现软件系统的动态装配。说干就干,我用VB,net重写了原先用C++编写的系统,将原先的一个EXE变为十几个DLL,而且这些DLL还会随着发展而不断地分裂,也有可能重新组合,利用Refractoring(重构)不断进化,最终形成一整套完备的行业软件组件库。做软件关键因素是变化,只有适应变化的系统才是有生命力的。

     我用两个月的时间大体上弄清了.net平台下的主要类库,然后又用两个月的时间再次重新实现了期刊发行系统的C++版本的全部功能,到8月份我写这篇文章之时,第一个产品里程碑已经完成。同样的,除了需求是由另一个合作者去搜集的之外,几乎又是全部由我一个人包揽了所有的系统设计及编码工作!

      毫无疑问,我自觉得新系统要比老系统可维护性强得多,真正实现了彻底的全组件化系统开发,计划再有一个月的界面美化,改正Bug,引用多线程提高运行效率,优化系统结构,就可以提供给用户试用了。市场如何,难说难测。

      在开发过程中,我再次感到巨大的挑战,不光是技术上的,更是管理上的。人才是我最头痛的问题,没有一流的人才,哪来一流的产品?我们找不到足够水平的程序员一起合作(牛人哪屑于做这样一个小儿科的产品?)我们要走的路还很长。也许我们开发的产品是失败的,但我从来就没指望能用这赚钱,我只是尽一个软件开发者的责任而己,成败已不重要!人生不尝试,怎能体现人活着的价值?

        
    结束语 永无止境的软件之路

      1.辛酸与苦辣
      做软件开发很苦的,技术进步如此神速,每个软件开发者都得不断地学习以跟上发展的步伐。有时我常想,何苦呢?我现在在大学中混,怎么样不能混下去?为什么要做这些吃力不讨好的事?我投了十年的时间去学习电脑,却最终发现自己不过中人之资,离顶峰远之又远。古语云:三十而立。我今年32了,仍是孤身一人,看看周围的同学,他们的小孩都差不多上小学了!许多都有了自己的房子和车子,而我到现在才开始申报中级职称,还挤在集体宿舍中,望着北京高昂的房价而叹息。现在社会越来越功利了,看着象我这样的穷光蛋,看着由于长期面对电脑缺少锻炼而瘦弱的身躯,又有哪个女孩愿意嫁过来受苦?

      软件人的生活很苦,压力很大,我认为是拿青春赌明天。就是在这种恶劣的开发环境中,还有许多业外人士指手划脚说程序员如何如何,还有太多的公司只顾压榨程序员的劳动,缺乏对程序员基本的尊重,怎不叫人寒心?“三十而衰”,这句本不应该流行的话居然成了中国软件人员的流行语。中国程序员的悲哀!

     2.无止境的追求
      人类已进入信息时代,计算机技术几乎每隔半年就有一次大的变化,我现在又面临着这样的抉择:今后的路如何走?

      北大的教师聘任制度的改革一石激起千层浪,说明了中国高校的改革势在必行。我是欢迎这种变化的,虽然到时我可能会下岗。但人生中总会遇到各种各样的挑战,只要你不倒下爬不起来,就有希望。
    我想我必须再次让自己有个提升,要从小事做起,但做小事则绝不能成为最终的目标,也许,不远的将来,我会走出国门,到世界软件技术最发达的地区去汲取丰富的养份。今后的路怎么走,我还在摸索之中。

      3.人生无悔
     人生年华如水,时光无情。在过去的岁月中,我尽了自己的力,回顾往事,我可以说:过去的事只有遗憾,却没有后悔。如果给我再一次选择职业的机会,我还会再次选择软件!

     再过10年,到2013年的时候,我也许会再次写一篇人生的十年回顾,到那时中国的软件会如何?中国软件的明天靠你我这些普通人去扎扎实实地去工作来支撑!少发些牢骚,多做些实事,中国软件才会有光辉的明天。你我共勉!

    --------------------------------------
    一个老程序员的心理话

  • 测试报告编写指南

    2008-04-10 09:38:07

    摘要 测试报告是把测试的过程和结果写成文档,并对发现的问题和缺陷进行分析,为纠正软件的存在的质量问题提供依据,同时为软件验收和交付打下基础。本文提供测试报告模板以及如何编写的实例指南。

    关键字 测试报告 缺陷



    正文

        测试报告是测试阶段最后的文档产出物,优秀的测试经理应该具备良好的文档编写能力,一份详细的测试报告包含足够的信息,包括产品质量和测试过程的评价,测试报告基于测试中的数据采集以及对最终的测试结果分析。

    下面以通用的测试报告模板为例,详细展开对测试报告编写的具体描述。

    PARTⅠ 首页

    0.1页面内容:

    密级

        通常,测试报告供内部测试完毕后使用,因此密级为中,如果可供用户和更多的人阅读,密级为低,高密级的测试报告适合内部研发项目以及涉及保密行业和技术版权的项目。

    XXXX项目/系统测试报告

    报告编号

        可供索引的内部编号或者用户要求分布提交时的序列号

    部门经理 ______项目经理______

    开发经理______测试经理______

    XXX公司 XXXX单位 (此处包含用户单位以及研发此系统的公司)

    XXXX年XX月XX日

    0.2格式要求:

        标题一般采用大体字(如一号),加粗,宋体,居中排列

    副标题采用大体小一号字(如二号)加粗,宋体,居中排列

    其他采用四号字,宋体,居中排列

    0.3版本控制:

    版本 作者 时间 变更摘要

    新建/变更/审核

    PARTⅡ 引言部分

    1.1编写目的

        本测试报告的具体编写目的,指出预期的读者范围。

    实例:本测试报告为XXX项目的测试报告,目的在于总结测试阶段的测试以及分析测试结果,描述系统是否符合需求(或达到XXX功能目标)。预期参考人员包括用户、测试人员、、开发人员、项目管理者、其他质量管理人员和需要阅读本报告的高层经理。

    提示:通常,用户对测试结论部分感兴趣,开发人员希望从缺陷结果以及分析得到产品开发质量的信息,项目管理者对测试执行中成本、资源和时间予与重视,而高层经理希望能够阅读到简单的图表并且能够与其他项目进行同向比较。此部分可以具体描述为什么类型的人可参考本报告XXX页XXX章节,你的报告读者越多,你的工作越容易被人重视,前提是必须让阅读者感到你的报告是有价值而且值得浪费一点时间去关注的。

    1.2项目背景

        对项目目标和目的进行简要说明。必要时包括简史,这部分不需要脑力劳动,直接从需求或者招标文件中拷贝即可。

    1.3系统简介

        如果设计说明书有此部分,照抄。注意必要的框架图和网络拓扑图能吸引眼球。

    1.4术语和缩写词

        列出设计本系统/项目的专用术语和缩写语约定。对于技术相关的名词和与多义词一定要注明清楚,以便阅读时不会产生歧义。

    1.5参考资料

    1.需求、设计、测试用例、手册以及其他项目文档都是范围内可参考的东东。

    2.测试使用的国家标准、行业指标、公司规范和质量手册等等

    PARTⅢ 测试概要

    测试的概要介绍,包括测试的一些声明、测试范围、测试目的等等,主要是测试情况简介。(其他测试经理和质量人员关注部分)

    2.1测试用例设计

        简要介绍测试用例的设计方法。例如:等价类划分、边界值、因果图,以及用这类方法(3-4句)。

    提示:如果能够具体对设计进行说明,在其他开发人员、测试经理阅读的时候就容易对你的用例设计有个整体的概念,顺便说一句,在这里写上一些非常规的设计方法也是有利的,至少在没有看到测试结论之前就可以了解到测试经理的设计技术,重点测试部分一定要保证有两种以上不同的用例设计方法。

    2.2测试环境与配置

        简要介绍测试环境及其配置。

        提示:清单如下,如果系统/项目比较大,则用表格方式列出

    数据库服务器配置

    CPU:

    内存:

    硬盘:可用空间大小

    操作系统:

    应用软件:

    机器网络名:

    局域网地址:

    应用服务器配置

    …….

    客户端配置

    …….

        对于网络设备和要求也可以使用相应的表格,对于三层架构的,可以根据网络拓扑图列出相关配置。

    2.3测试方法(和工具)

        简要介绍测试中采用的方法(和工具)。

    提示:主要是黑盒测试,测试方法可以写上测试的重点和采用的测试模式,这样可以一目了然的知道是否遗漏了重要的测试点和关键块。工具为可选项,当使用到测试工具和相关工具时,要说明。注意要注明是自产还是厂商,版本号多少,在测试报告发布后要避免大多工具的版权问题。

    PARTⅣ 测试结果及缺陷分析

    整个测试报告中这是最激动人心的部分,这部分主要汇总各种数据并进行度量,度量包括对测试过程的度量和能力评估、对软件产品的质量度量和产品评估。对于不需要过程度量或者相对较小的项目,例如用于验收时提交用户的测试报告、小型项目的测试报告,可省略过程方面的度量部分;而采用了CMM/ISO或者其他工程标准过程的,需要提供过程改进建议和参考的测试报告-主要用于公司内部测试改进和缺陷预防机制-则过程度量需要列出。

    3.1测试执行情况与记录

    描述测试资源消耗情况,记录实际数据。(测试、项目经理关注部分)

    3.1.1测试组织

        可列出简单的测试组架构图,包括:

    测试组架构 (如存在分组、用户参与等情况)

    测试经理(领导人员)

    主要测试人员

    参与测试人员

    3.1.2测试时间

        列出测试的跨度和工作量,最好区分测试文档和活动的时间。数据可供过程度量使用。

    例如 XXX子系统/子功能

    实际开始时间-实际结束时间

    总工时/总工作日

    任务 开始时间 结束时间 总计

    合计

        对于大系统/项目来说最终要统计资源的总投入,必要时要增加成本一栏,以便管理者清楚的知道究竟花费了多少人力去完成测试。

    测试类型 人员成本 工具设备 其他费用



    总计

        在数据汇总时可以统计个人的平均投入时间和总体时间、整体投入平均时间和总体时间,还可以算出每一个功能点所花费的时/人。

    用时人员 编写用例 执行测试 总计



    合计

        这部分用于过程度量的数据包括文档生产率和测试执行率。

    生产率人员 用例/编写时间 用例/执行时间 平均



    合计

    3.1.3测试版本

        给出测试的版本,如果是最终报告,可能要报告测试次数回归测试多少次。列出表格清单则便于知道那个子系统/子模块的测试频度,对于多次回归的子系统/子模块将引起开发者关注。

    3.2覆盖分析

    3.2.1需求覆盖

        需求覆盖率是指经过测试的需求/功能和需求规格说明书中所有需求/功能的比值,通常情况下要达到100%的目标。

    需求/功能(或编号) 测试类型 是否通过 备注

    [Y][P][N][N/A]

    根据测试结果 ,按编号给出每一测试需求的通过与否结论。P表示部分通过,N/A表示不可测试或者用例不适用。实际上,需求跟踪矩阵列出了一一对应的用例情况以避免遗漏,此表作用为传达需求的测试信息以供检查和审核。

    需求覆盖率计算 Y项/需求总数 ×100%

    3.2.2测试覆盖

        需求/功能(或编号) 用例个数 执行总数 未执行 未/漏测分析和原因



        实际上,测试用例已经记载了预期结果数据,测试缺陷上说明了实测结果数据和与预期结果数据的偏差;因此没有必要对每个编号在此包含更详细的说明的缺陷记录与偏差,列表的目的仅在于更好的查看测试结果。

    测试覆盖率计算 执行数/用例总数 ×100%

    3.2缺陷的统计与分析

        缺陷统计主要涉及到被测系统的质量,因此,这部分成为开发人员、质量人员重点关注的部分。

    3.3.1缺陷汇总

        被测系统 系统测试 回归测试 总计



    合计

    按严重程度

    严重 一般 微小

    按缺陷类型

    用户界面 一致性 功能 算法 接口 文档 用户界面 其他

    按功能分布

    功能一 功能二 功能三 功能四 功能五 功能六 功能七

    最好给出缺陷的饼状图和柱状图以便直观查看。俗话说一图胜千言,图标能够使阅读者迅速获得信息,尤其是各层面管理人员没有时间去逐项阅读文章。

    图例

    3.3.2缺陷分析

        本部分对上述缺陷和其他收集数据进行综合分析

    缺陷综合分析

    缺陷发现效率 = 缺陷总数/执行测试用时

    可到具体人员得出平均指标

    用例质量 = 缺陷总数/测试用例总数 ×100%

    缺陷密度 = 缺陷总数/功能点总数

    缺陷密度可以得出系统各功能或各需求的缺陷分布情况,开发人员可以在此分析基础上得出那部分功能/需求缺陷最多,从而在今后开发注意避免并注意在实施时予与关注,测试经验表明,测试缺陷越多的部分,其隐藏的缺陷也越多。

    测试曲线图

    描绘被测系统每工作日/周缺陷数情况,得出缺陷走势和趋向

    重要缺陷摘要

    缺陷编号 简要描述 分析结果 备注



    3.3.3残留缺陷与未解决问题

    残留缺陷

    编号:BUG号

    缺陷概要:该缺陷描述的事实

    原因分析:如何引起缺陷,缺陷的后果,描述造成软件局限性和其他限制性的原因

    预防和改进措施:弥补手段和长期策略

    未解决问题

    功能/测试类型:

    测试结果:与预期结果的偏差

    缺陷:具体描述

    评价:对这些问题的看法,也就是这些问题如果发出去了会造成什么样的影响

    PARTⅤ 测试结论与建议

    报告到了这个部分就是一个总结了,对上述过程、缺陷分析之后该下个结论,此部分为项目经理、部门经理以及高层经理关注,请清晰扼要的下定论。

    4.1测试结论

    1. 测试执行是否充分(可以增加对安全性、可靠性、可维护性和功能性描述)

    2. 对测试风险的控制措施和成效

    3. 测试目标是否完成

    4. 测试是否通过

    5. 是否可以进入下一阶段项目目标

    4.2建议

    1.对系统存在问题的说明,描述测试所揭露的软件缺陷和不足,以及可能给软件实施和运行带来的影响

    2.可能存在的潜在缺陷和后续工作

    3.对缺陷修改和产品设计的建议

    4.对过程改进方面的建议

    测试报告的内容大同小异,对于一些测试报告而言,可能将第四和第五部分合并,逐项列出测试项、缺陷、分析和建议,这种方法也比较多见,尤其在第三方评测报告中,此份报告模板仅供参考。

  • 从测试工作出发去减少项目风险

    2008-04-10 09:24:01

    1、要在第一时间进入项目,有的时候客户提出一个需求的,未必他就一定深思熟虑了,所以非常需要我们再多替他想想,学会反问,充分利用你的逻辑思维,如果这样,你们想要得到什么样的结果,如果那样你想得到什么样的结果,从某种目的来说,就是充分理解你的需求,同时也是为了检测你的这个需求是否具有可测性。

    2、在项目设计阶段,需要了解开发人员怎么去实现?我们尽量去做灰盒的测试,而非纯黑盒的测试,这样也是做的话非常有利于你在后期有需求变更的时候,来分析和确定测试的范围。很少有项目在整个过程不变动的,所以这么做是非常有必要的。而且是在用最少的时间做最合适的事情。

    3、在测试用例设计阶段,根据时间的关系,选择高效而合适的用例模板,在我带的项目中,如果无论时间长短,我们都用freemind来组织大的测试框架。或则说是测试需求或测试点,有时间才写详细的测试用例,有了大的框架,详细的用例就交给初级的tester来写,这样的话,对初级的tester也是一个锻炼,同时也让他对需求有了更加深刻的理解,对后期也是很有帮助的。

    4、在测试阶段,需要在容易出错的部分自己亲自抽查做检测。(要赶火车了,去旅游,哪天回来再继续write)

  • 软件测试中WEB测试

    2008-04-10 09:13:24

    软件测试中的WEB测试通常可以从以下几点来考虑

    前边有人在论坛里提到过,但我觉得有的方面还考虑的不是很详细,在此补充下

    1 UI测试 看页面是否美观养眼(包括页面的布局是否合理,策划是否舒服美观,页面长度是否合理,前景色与背景色是否搭配,页面风格是否统一,色调是否适合人眼,会不会太刺眼,字体大小是否合适,字体的颜色是否与背景色搭配,字体链接时是否会出现设置怪异的背景色,字体颜色有没有与背景色太接近或差距太大导致我们没办法看清字体或刺激了我们的视觉,点击链接时图片和字体会不会产生移位),表格和DIV测试,是否网页设计师在表格或DIV里放置了过多的东西导致表格或DIV拉长,表格或DIV之间对齐了没有,中间是否有空隙,是否产生了错位,如果在表格或DIV中设置了溢位,表格或DIV中的内容是否可以全部看到,有没有出现一半字的情况,如果使用了框架结构.框架结构是否合理,表格每行的宽度是否足够,是否有折行

    2 链接测试  点击链接时是否可以进入我们要找的页面,进入了我们要找的页面后能否正确返回,链接页面会不会是空白页面或孤立页面或根本没链接(也就是说链接的是自己本身),如果链接的是空白页我们是否可以再正确返回,如果使用了框架或内嵌框架是否可以正确在本框见页内显示要查找的页面,使用内容置顶时是否可以正确实现

    3 表单测试  表单的测试包括单选按钮,复选框,文本框,密码项和菜单项和提交按钮类按钮的测试和后台数据库的测试.首先如果是单选按钮我们选择了一个后可不可以再选第二个,如果是复选框的话我们能不能同时选择多个选项,选择多个选项时若需要全选那摸我们是要一个个的选择还是只需要选择一次就可以,在文本框里我们输入的字数有无特别限定,若与特别限定条件不符那摸我们是否可以操作成功,在对用户名和密码的设置时用户名是否可以为数字,汉字,非英文 字符,中间是否可以有空格,标点符号,对密码的长度有无特别限定,若超过特别限定或少于特别限定我们是否可以操作成功,密码是否可以为汉字,英文,特殊字符和标点符号,中间是否可以空格,密码是否设置了屏蔽菜单项分级是不是太多,过长(特别是我们为了节省空间在导航上设置的菜单)点击菜单选项上的各分级目录是否可以正确进入链接页面,进入链接页面我们是否可以正确返回,点击提交按钮看是否可以提交成功,点击取消按钮看其是否生效,提交后看我们的资料是否保存成功,保存后刷新页面看我们的资料是否可以正确显示,我们是否还可以再回到原始页面,如果未输入用户名或密码会不会提示出错,错误提示是否可以关掉,提示出错后我们能否回到原始页面,用户提交的数据是否真实有效,如填写的所属省份与所在城市是否匹配,出生年月与身份证号是否匹配等

    4  兼容性测试  在各种配置不同操作系统上和分辨率不同的电脑上及使用不同的浏览器对其测试,看其是否可以正确显示,是否有图片和页面错位和太大太小等问题使有的部分无法看到,是否有图片或视频无法显示

    5  网络配置测试  看看网页是否可以打印或保存(如果是保密的网页或不想让别人保存的页面可以将其作成FLASH格式的,不让用户保存),看看网页冗余代码是否过多或容量太大导致网络运行速度过慢

    6  负载测试  多个用户同时上网,砍其最大的承受能力是多大,如果超过了这个极限会有何反应

    7  压力测试  看看几百,几千甚至几万个人同时上网网页还能显示不,运行速度会有怎样的变化,是否响应时间太长或运行过慢,他到啥时候会崩溃

    8 安全测试  用户名和密码是否有长度限制,是否有复杂度限制,登陆次数是否受限,如果超过了登陆次数,关闭页面重新登陆是否还可以登陆进去,换了台电脑或在另外的地方登陆呢,WEB系统是否有超时限制,超时以后是否会提示登陆,日志文件是否记录登陆后用户进行的操作操作,是否记录登陆失败的操作,事物完成后,会不会记录拥护进行的操作,会不会记录用户名,是否在ASP,JSP,JAVAscrīpt,VBscrīpt等脚本语言里有设置可以访问服务器的语言,是否使用了安全套接字层协议SHTTP,若使用了这种协议,那摸在网页中是否有备份替换的页面

    9  接口测试  在处理过程中中断事务,看看会发生什么情况?订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?

    10 应该对网页中的插件,如FLASH,视屏,音频的也应该测试,看看是否可以正常播放或播放太慢,还应该对网页中的特效及脚本,如JAVAscrīpt,VBscrīpt进行测试,看看是否可以达到预期效果,西西,如果像是51这样的论坛,当然应该页是否可以实时更新啦,看看发新帖了后,啥时可以看到NEW,苹果红,绿,黄是否对应实际的情况,默认表情是否可以正确显示,回复了新帖后,刷新看能否置顶

    11 网站有设置下载和上传文件的功能那摸我们就应该考虑下载和上传是否可以成功,如果下载上传文件不成功是否可以报错,报错后是否可以刷新,下载文件指定的服务器地址是否有效,下载地址是否方便用户查找等,如果是招聘网站就应该考虑到招聘信息是否可以时实更新,新加入的网站是否可以置顶,如果是按招聘会发布时间排序排序是否成功,若按召开招聘会时间排序,排序是否成功,如果是金融,银行网站,我们不但要考虑其安全性还应该考虑操作的成功性,查询呀,转帐呀之类的,很多,其他的五花八门的就更多了,的知道需求才可以!

    12 如果是邮件网站的测试的话,应该考虑到收信,发信及写信功能是否正常,是否可以正常保存草稿,搜索功能是否正确无误,已发送与与已删除功能是否正常,读完信件后,是否会显示读完的状态,是否还会提示你有信件未读,这种情况是有的,我就碰到好几次,明明读完了,却在收件箱中还显示有信件未读,还有提示,太晕了,看起来,网易的邮箱也有问题呀,还有,经常出现草稿需要保存N多次的情况,还有,网易的发送主体窗口会改变文本本身的格式,也不知道他们考虑过改进没有,用的超不爽,至于其他的邮箱服务之类的,也就是正常的功能测试,多考虑些特殊情况就好了!

  • LoadRunner 9.0

    2008-04-09 14:22:24

    HP Mercury LoadRunner 的最新版本

     

    LoadRunner 是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
    目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担心会发生用户响应速度过慢,系统崩溃等问题。这些都不可避免地导致公司收益的损失。Mercury Interactive 的 LoadRunner 能让企业保护自己的收入来源,无需购置额外硬件而最大限度地利用现有的IT 资源,并确保终端用户在应用系统的各个环节中对其测试应用的质量,可靠性和可扩展性都有良好的评价。
    LoadRunner 是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner 能支持广范的协议和技术,为您的特殊环境提供特殊的解决方案
    轻松创建虚拟用户
    使用LoadRunner 的Virtual User Generator,您能很简便地创立起系统负载。该引擎能够生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。它先记录下业务流程(如下订单或机票预定),然后将其转化为测试脚本。利用虚拟用户,您可以在Windows ,UNIX 或Linux 机器上同时产生成千上万个用户访问。所以LoadRunner能极大的减少负载测试所需的硬件和人力资源。另外,LoadRunner 的TurboLoad 专利技术能。
    提供很高的适应性。TurboLoad 使您可以产生每天几十万名在线用户和数以百万计的点击数的负载。
    用Virtual User Generator 建立测试脚本后,您可以对其进行参数化操作,这一操作能让您利用几套不同的实际发生数据来测试您的应用程序,从而反映出本系统的负载能力。以一个订单输入过程为例,参数化操作可将记录中的固定数据,如订单号和客户名称,由可变值来代替。在这些变量内随意输入可能的订单号和客户名,来匹配多个实际用户的操作行为。
    LoadRunner 通过它的Data Wizard 来自动实现其测试数据的参数化。Data Wizard 直接连于数据库服务器,从中您可以获取所需的数据(如定单号和用户名)并直接将其输入到测试脚本。这样避免了人工处理数据的需要,Data Wizard 为您节省了大量的时间。
    为了进一步确定您的Virtual user 能够模拟真实用户,您可利用LoadRunner 控制某些行为特性。例如,只需要点击一下鼠标,您就能轻易控制交易的数量,交易频率,用户的思考时间和连接速度等。
    创建真实的负载
    Virtual users 建立起后,您需要设定您的负载方案,业务流程组合和虚拟用户数量。用LoadRunner 的Controller,您能很快组织起多用户的测试方案。Controller 的Rendezvous 功能提供一个互动的环境,在其中您既能建立起持续且循环的负载,又能管理和驱动负载测试方案。
    而且,您可以利用它的日程计划服务来定义用户在什么时候访问系统以产生负载。这样,您就能将测试过程自动化。同样您还可以用Controller 来限定您的负载方案,在这个方案中所有的用户同时执行一个动作---如登陆到一个库存应用程序----来模拟峰值负载的情况。另外,您还能监测系统架构中各个组件的性能---- 包括服务器,数据库,网络设备等----来帮助客户决定系统的配置
    LoadRunner 通过它的AutoLoad 技术,为您提供更多的测试灵活性。使用AutoLoad ,您可以根据目前的用户人数事先设定测试目标,优化测试流程。例如,您的目标可以是确定您的应用系统承受的每秒点击数或每秒的交易量。
    定位性能问题
    LoadRunner 内含集成的实时监测器,在负载测试过程的任何时候,您都可以观察到应用系统的运行性能。这些性能监测器为您实时显示交易性能数据(如响应时间)和其它系统组件包括application server, web server,网路设备和数据库等的实时性能。这样,您就可以在测试过程中从客户和服务器的双方面评估这些系统组件的运行性能,从而更快地发现问题。
    再者,利用LoadRunner 的ContentCheck TM ,您可以判断负载下的应用程序功能正常与否。ContentCheck 在Virtual users 运行时,检测应用程序的网络数据包内容,从中确定是否有错误内容传送出去。它的实时浏览器帮助您从终端用户角度观察程序性能状况。
    分析结果以精确定位问题所在
    一旦测试完毕后,LoadRunner 收集汇总所有的测试数据,并为您提供高级的分析和报告工具,以便迅速查找到性能问题并追溯原由。使用LoadRunner 的Web 交易细节监测器,您可以了解到将所有的图象、框架和文本下载到每一网页上所需的时间。例如,这个交易细节分析机制能
    够分析是否因为一个大尺寸的图形文件或是第三方的数据组件造成应用系统运行速度减慢。另外,Web 交易细节监测器分解用于客户端、网络和服务器上端到端的反应时间,便于确认问题,定位查找真正出错的组件。例如,您可以将网络延时进行分解,以判断DNS 解析时间,连接服务器或SSL 认证所花费的时间。通过使用LoadRunner 的分析工具,您能很快地查找到出错的位置和原因并作出相应的调整。
    重复测试保证系统发布的高性能
    负载测试是一个重复过程。每次处理完一个出错情况,您都需要对您的应用程序在相同的方案下,再进行一次负载测试。以此检验您所做的修正是否改善了运行性能。
    Enterprise Java Beans的测试
    LoadRunner 完全支持EJB 的负载测试。这些基于Java 的组件运行在应用服务器上,提供广泛的应用服务。通过测试这些组件,您可以在应用程序开发的早期就确认并解决可能产生的问题。
    利用LoadRunner, 您可以很方便地了解系统的性能。 它的Controller 允许您重复执行与出错修改前相同的测试方案。它的基于HTML 的报告为您提供一个比较性能结果所需的基准,以此衡量在一段时间内,有多大程度的改进并确保应用成功。由于这些报告是基于HTML 的文本,您可以将其公布于您公司的内部网上,便于随时查阅。
    最大化投资回报
    所有Mercury Interactive 的产品和服务都是集成设计的, 能完全相容地一起运作。由于它们具有相同的核心技术,来自于LoadRunner和ActiveTest TM 的测试脚本,在Mercury Interactive 的负载测试服务项目中,可以被重复用于性能监测。借助Mercury Interactive的监测功能--Topaz TM 和ActiveWatch TM ,测试脚本可重复使用从而平衡投资收益。更重要的是,您能为测试的前期布署和生产系统的监测提供一个完整的应用性能管理解决方案。
    支持无线应用协议
    随着无线设备数量和种类的增多,您的测试计划需要同时满足传统的基于浏览器的用户和无线互联网设备,如手机和PDA。LoadRunner 支持2 项最广泛使用的协议:WAP和I-mode。此外,通过负载测试系统整体架构,LoadRunner 能让您只需要通过记录一次脚本,就可完全检测上述这些无线互联网系统。
    支持Media Stream应用
    LoadRunner 还能支持Media Stream应用。为了保证终端用户得到良好的操作体验和高质量Media Stream,您需要检测您的Media Stream应用程序。使用LoadRunner ,您可以记录和重放任何流行的多媒体数据流格式来诊断系统的性能问题,查找原由,分析数据的质量。
    完整的企业应用环境的支持
    LoadRunner 支持广泛的协议,可以测试各种IT 基础架构。

  • SQL Server字符串处理函数大全

    2008-04-09 10:13:36

    select 字段1 from 表1 where 字段1.IndexOf("云")=1;
            这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
    left()是sql函数。
            select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR 或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。
            常用的字符串函数有:

    一、字符转换函数
    1、ASCII()
            返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
    2、CHAR()
            将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。
    3、LOWER()和UPPER()
            LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
    4、STR()
            把数值型数据转换为字符型数据。
    STR (<float_expression>[,length[, <decimal>]])
            length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。
            当length 或者decimal 为负值时,返回NULL;
            当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
            先服从length ,再取decimal ;
            当返回的字符串位数小于length ,左边补足空格。
    二、去空格函数
    1、LTRIM() 把字符串头部的空格去掉。

    2、RTRIM() 把字符串尾部的空格去掉。

    三、取子串函数
    1、left()
    LEFT (<character_expression>, <integer_expression>)
    返回character_expression 左起 integer_expression 个字符。

    2、RIGHT()
    RIGHT (<character_expression>, <integer_expression>)
    返回character_expression 右起 integer_expression 个字符。

    3、SUBSTRING()
    SUBSTRING (<expression>, <starting_ position>, length)
    返回从字符串左边第starting_ position 个字符起length个字符的部分。

    四、字符串比较函数
    1、CHARINDEX()
            返回字符串中某个指定的子串出现的开始位置。
    CHARINDEX (<’substring_expression’>, <expression>)
            其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。
            此函数不能用于TEXT 和IMAGE 数据类型。
    2、PATINDEX()
            返回字符串中某个指定的子串出现的开始位置。
            PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则返回值为0。
            与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和TEXT 数据类型。

    五、字符串操作函数
    1、QUOTENAME()
            返回被特定字符括起来的字符串。
    QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所用的字符,缺省值为“[]”。
    2、REPLICATE()
            返回一个重复character_expression 指定次数的字符串。
    REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL 。

    3、REVERSE()
            将指定的字符串的字符排列顺序颠倒。
    REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。

    4、REPLACE()
            返回被替换了指定子串的字符串。
    REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替换在string_expression1 中的子串string_expression2。

    4、SPACE()
    返回一个有指定长度的空白字符串。
    SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。

    5、STUFF()
            用另一子串替换字符串指定位置、长度的子串。
    STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
            如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
            如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1 只保留首字符。


    六、数据类型转换函数
    1、CAST()
    CAST (<expression> AS <data_ type>[ length ])

    2、CONVERT()
    CONVERT (<data_ type>[ length ], <expression> [, style])

            1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。
            2)length用于指定数据的长度,缺省值为30。
            3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。
            4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度。
            5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符。
            6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。
            7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储。
            8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,以标识发生了这种截断。
            9)用CONVERT()函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。
    七、日期函数
    1、day(date_expression) 
            返回date_expression中的日期值

    2、month(date_expression)
            返回date_expression中的月份值

    3、year(date_expression)
            返回date_expression中的年份值

    4、DATEADD()
    DATEADD (<datepart>, <number>, <date>)
            返回指定日期date 加上指定的额外日期间隔number 产生的新日期。
    5、DATEDIFF()
    DATEDIFF (<datepart>, <date1>, <date2>)
            返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的整数值。

    6、DATENAME()
    DATENAME (<datepart>, <date>)
            以字符串的形式返回日期的指定部分此部分。由datepart 来指定。

    7、DATEPART()
    DATEPART (<datepart>, <date>)
            以整数值的形式返回日期的指定部分。此部分由datepart 来指定。
    DATEPART (dd, date) 等同于DAY (date)
    DATEPART (mm, date) 等同于MONTH (date)
    DATEPART (yy, date) 等同于YEAR (date)

    8、GETDATE()
            以DATETIME 的缺省格式返回系统当前的日期和时间。

我的栏目

我的存档

数据统计

  • 访问量: 6746
  • 日志数: 10
  • 建立时间: 2008-04-03
  • 更新时间: 2008-04-11

RSS订阅

Open Toolbar