发布新日志

  • 高效开发与彻底测试

    2007-12-04 08:58:36Top 3 Digest 3

    高效开发与彻底测试。 一、“千般路”与“磨豆腐”


    很久以前听一个故事:从前有个小伙子,少时有大志,长大后却无好营生,开了个豆腐作坊,每天磨豆腐累得腰酸背疼。每到夜深人静,小伙子辗转反侧,总想找条更好的“事业之路”,可是想过千百条、尝试过几十条路,都走不通。夜不成寝,白天干活更累,小伙子不由慨叹:“晚上想过千般路,白天还得磨豆腐”。


    不久以前看过一篇文章:《CMM欺骗了中国的软件业》,内容是对CMM热的反思。CMM当然不会主动欺骗人,实际上是我们的软件业自己欺骗自己。我们从来不缺少“某某模式”,“面向某某”,“某某认证”等等听起来美妙无比的东西,问题是实际的研发过程中能做得到码?现实是残酷的,美妙的概念漫天飞舞,开发过程仍然是作坊式的,正是:“晚上想过千般路,白天还得磨豆腐”。


    中国的故事通常都有圆满的结局,现在接着说“磨豆腐”的故事。过了很长时间,小伙子终于面对现实,不再沉迷于不切实际的空想,用心磨好豆腐,闲时琢磨些个窍门,慢慢地,他的豆腐质量越来越好,每天产量也越来越多,作坊越开越大,成了远近闻名的“豆腐老板”,后来,他做起了别的生意,发现年轻时的空想,其实很多都是可行的,因为现在“能力”和“财力”都不同了。


    再说软件开发。我们不反对任何理论、技术、方法、模式等等,但第一,您的企业或团队做得到吗?不要做“如果开发时间延长一倍,就可以做到”之类毫无意义的假设。第二,做了真的有效益吗?效益是指扣除成本之后的收益。如果不具备这两点,那么还是不要整天想着“千般路”,首先想想如何好好的“磨豆腐”吧。


    对于所有软件开发来说,代码编写都是无可逃避的“磨豆腐”。改进代码编写工作,高率效低成本地开发出高质量的代码,对于软件产品能否在激烈的竞争中胜出,对于软件企业的生存和发展,都具有重要的现实意义。


    本文是Visual Unit应用的范例项目C++代码文档生成器的主题文档,叙述的正是改进代码编写工作的方法和工具,所有内容均经过实战检验,具有"可行"和"效益"两个特征,"可行"是指较低门槛或没有门槛,凭现有条件即可实施;"效益"是指能产生立竿见影的效果。


    本文所援引的范例项目,模拟最糟糕的开发团队,最混乱的开发流程:由很少写代码的测试和预研部门开发,人员不固定,时间也不固定,谁有空就写上一些;没有设计,没有文档,基至也不在代码文件中保存编码人员的信息,成员完全依赖于阅读代码和测试用例来理解其他成员写的代码;除了简单的命名规则外,没有其他规范,甚至连一个函数原则上不能超过50行之类的基本规范也没有(范例中有超过200行的函数CMacro::Unwind(),一万多条路径)。任何开发团队和开发流程都会好于范例项目的开发团队和开发流程,因此,范例所展示的方法和工具,具有"广泛可行性"。


    本文介绍如何进行高效编码调试和实现彻底的单元测试。编码调试是任何软件开发都无可逃避的工作,在Visual Unit的支持下编码调试,只是把本来就一定要做的工作改变一下方式,不需要多做什么,就可以大幅提高编程效率和质量;另一方面,Visual Unit彻底改变了单元测试难于实施或成本昂贵的局面,无论团队中开发与测试人员的比例是怎么样的,都可以轻松快捷地实现彻底的单元测试。


    二、高效编码调试

    任何软件开发,都离不开编码调试。对于稍为复杂一点的函数,一般来说,编写几行代码,就要执行一下,看它们是否按预想的工作,然后再继续写,写完后还要将各种可能输入都执行一下。如何执行?一般由别的代码来调用,也就是说需要驱动,驱动通常是在开始编写函数实现代码之前建立,这样才能一边编写一边调试。驱动大致可分为自然驱动和专门驱动。

    自然驱动:利用项目中已有的代码作为驱动,通常是在被调试的函数中加断点,从界面执行一个需要调用该函数的功能,调试器中断时就可以调试了;专门驱动:为需要调试的函数编写专门的驱动代码,通过执行驱动代码来执行被调试函数。


     

    自然驱动的主要优点是不需要其他工作就可以直接调试,甚至感觉不到需要驱动,主要缺点是输入数据通常是公共的,即很多代码都使用相同的输入源进行调试,实际输入往往是经过其他代码处理后的中间结果,要针对各种可能输入都进行调试往往很困难,造成调试不全面,程序员的思维受到局限,难于做到全面地考虑各种可能输入。


     

    专门驱动的主要优点是输入数据是专门针对于被测试程序,容易做到比较全面,程序员的思维也会比较全面,对编写功能齐全的健壮的程序很有好处,要针对某种特定输入进行调试比较容易,缺点是需要花费大量的时间来编写驱动代码。


     

    显然,自然驱动的主要问题是不全面,代码错误较多,专门驱动的主要问题是编写驱动代码很费时。有没有更好的方法,既不需要编写驱动代码,又能方便且全面地调试?有 !这就是自动驱动,即在Visual Unit的支持下编码调试,不但无需费时间写驱动代码,更拥有多种独特的便利,可以大幅提高编码调试的质量和效率。


     

    Visual Unit是单元测试工具,但也是高效编程调试的支持环境,在Visual Unit的支持下调试,既全面又省时:


     

    自动生成驱动代码,但又可以方便地设定调试输入;


     

    测试用例编辑器列出全部输入,可以很方便地检查是否全面。


     

    除了上述优点外,在Visual Unit的支持下调试,还可以:


     

    可视化地选择调试输入;


     

    调试过程中还可以切换输入;


     

    无限制的后退,重复。


     

    上述仅是免费的个人版的功能,对于企业版用户,实际上大多数单步调试都可以省略:


     

    自动输出参数、成员变量的输入输出值,返回值,用户也可以用简单的语法输出任何变量或表达式的值,这些数值都是上下文相关的;


     

    显示在一个用例下,程序所执行的代码,可以很方便地查看程序是否按预想的流程执行。


     

    程序无论多复杂,无非就是执行一些代码,读写、计算一些数据,因此,上述两方面信息已完整地描述了程序行为,一眼就能看出程序干了什么,通常可以很快判断程序是否按预想的工作并找到出错原因,比单步调试要快得多。


     

    下面以实例来进一步分析三种调试方式的优缺点。这里所用的示例是范例项目中的CExFunction::ParseOneParameter()函数,这是一个很普通的函数,读者也可以随便拿其他有些复杂度的代码来比较。该函数的功能是解析C++代码中的一个参数,原形如下:


     

    PARAMETER* CExFunction::ParseOneParameter(CTokenList& iList);


     

    PARAMETER 是保存一个参数对象的结构,定义如下:


     

    struct PARAMETER


     

    {


     

    CString type; //参数类型


     

    CString name; //参数名


     

    CString defVal; //缺省值


     

    CString array; //如果参数是数组,保存[]及[]内的文字常量


     

    };


     

    参数iList是一个输入参数(范例的命名规则是用i表示输入参数),传递由C++代码中的一个参数经过词法分析转换获得的记号对象序列,例如参数int* pi,将转换为三个记号对象,分别对应于:int, *, pi。该函数将记号对象序列解析到一个PARAMETER结构的指针中,并作为返回值返回。


     

    在这个示例中,如果要进行比较全面的调试,输入至少要考虑以下可能:


     

    普通输入,如int i;


     

    类型中有符号,如int* pi;


     

    类型中有多个符号,如int*& pi;


     

    模板类,如CList list;


     

    带缺省值,如int i=0;


     

    数组,如int ai[10];


     

    类型有多个单词,如const unsigned int& i;


     

    缺少参数名,如const int;


     

    我们在编写这个函数的实现代码前,首先建立调试驱动,以例边编码边执行调试。


    自然驱动

    假设界面和要调用这个函数的其他代码都已完成。在函数的入口处插入断点,以调试方式运行工程,在界面中选择要生成文档的工程目录,点击"生成文档",程序中断时就可以调试了。这种方式相信所有程序员都很熟悉,并且很多人都会认为这种方式最省时.

     

  • 世间什么才是最珍惜的

    2007-06-16 09:33:16Top 1 Digest 1

        在很久很久以前,有一座圣安禅寺,每天都有许多人上香拜佛,香火很旺。在圣安禅寺前的横梁上有个蜘蛛结了张网,由于每天都受到香火和虔诚的祭拜的熏陶,蜘蛛便有了佛性。经过了一千多年的修炼,蜘蛛佛性增加了不少。

      忽然有一天,佛祖光临了圣安禅寺,看见这里香火甚旺,十分高兴。离开寺庙的时候,不经意间抬头看见了横梁上的蜘蛛。佛祖停下来,问这只蜘蛛:“你我相见总算是有缘。我来问你个问题,看你修炼了这一千多年来,有什么真知灼见?”蜘蛛遇见佛祖很是高兴,连忙答应了。佛祖问到:“世间什么才是最珍贵的?”蜘蛛想了想,回答到:“世间最珍贵的是‘得不到’和‘已失去’。”佛祖点了点头,离开了。

      就这样又过了一千年的光景,蜘蛛依旧在圣安禅寺的横梁上修炼,它的佛性大增。一日,佛祖又来到寺前,对蜘蛛说道:“你可还好,一千年前的那个问题,你可有什么更深地认识吗?”蜘蛛说:“我觉得世间最珍贵的是‘得不到’和‘已失去’。”佛祖说:“你再好好想想,我会再来找你的”。

      又过了一千年,有一天,刮起了大风,风将一滴甘露吹到了蜘蛛网上。蜘蛛望着甘露,见它晶莹透亮,顿生怜爱之意。蜘蛛每天看着甘露很开心,它觉得这是三千年来最开心的几天。突然,又刮起了一阵大风,将甘露吹走了。蜘蛛觉得一下子失去了什么,感到很寂寞和难过。这时佛祖又来了,问蜘蛛:“这一千年,你可好好想过这个问题:世间什么才是最珍贵的?”蜘蛛想到了甘露,对佛祖说:“世间最珍贵的是‘得不到’和‘已失去’。”佛祖说:“好,既然你有这样的认识,我让你到人间走一遭吧。”

      就这样,蜘蛛投胎到了一个官宦家庭,成了一个富家小姐,父母为她取了个名字叫蛛儿。一晃,蛛儿到了16岁了,已经成了个婀娜多姿的少女,长的十分漂亮,楚楚动人。

      这一日,皇帝决定在后花园为新科状元郎甘鹿举行庆功宴席。席间来了许多妙龄少女,包括蛛儿,还有皇帝的小公主长风公主。状元郎在席间表演诗词歌赋,大献才艺,在场的少女无一不被他折服。但蛛儿一点也不紧张和吃醋,因为她知道,这是佛祖赐予她的姻缘。

      过了些日子,说来很巧,蛛儿陪同母亲上香拜佛的时候,正好甘鹿也陪同母亲而来。上完香拜过佛,二位长者在一边说上了话。蛛儿和甘鹿便来到走廊上聊天,蛛儿很开心,终于可以和喜欢的人在一起了,但是甘鹿并没有表现出对她的喜爱。蛛儿对甘鹿说:“你难道不曾记得16年前,圣安禅寺的蜘蛛网上的事情了吗?”甘鹿很诧异,说:“蛛儿姑娘,你漂亮,也很讨人喜欢,但你想像力未免太丰富了一点吧。”说罢,和母亲离开了。

       蛛儿回到家,心想,佛祖既然安排了这场姻缘,为何不让他记得那件事,甘鹿为何对我没有一点的感觉?

      几天后,皇帝下诏,命新科状元甘鹿和长风公主完婚,蛛儿和太子芝草完婚。这一消息对蛛儿如同晴空霹雳,她怎么也想不通,佛祖竟然这样对她。几日来,她不吃不喝,穷究急思,灵魂就将出壳,生命危在旦夕。太子芝草知道了,急忙赶来,扑倒在床边,对奄奄一息的蛛儿说道:“那日,在后花园众姑娘中,我对你一见钟情,我苦求父皇,他才答应。如果你死了,那么我也就不活了。”说着就拿起了宝剑准备自刎。

      就在这时,佛祖来了,他对快要出壳的蛛儿灵魂说:“蜘蛛,你可曾想过,甘露(甘鹿)是由谁带到你这里来的呢?是风(长风公主)带来的,最后也是风将它带走的。甘鹿是属于长风公主的,他对你不过是生命中的一段插曲。而太子芝草是当年圣安禅寺门前的一棵小草,他看了你三千年,爱慕了你三千年,但你却从没有低下头看过它。蜘蛛,我再来问你,世间什么才是最珍贵的?”蜘蛛听了这些真相之后,好像一下子大彻大悟了,她对佛祖说:“世间最珍贵的不是‘得不到’和‘已失去’,而是能把握现在的幸福。”话刚说完,佛祖就离开了,蛛儿的灵魂也回位了,睁开眼睛,看到正要自刎的太子芝草,她马上打落宝剑,和太子深深地拥抱着……

     

  • 测试答案

    2007-06-21 13:24:02

    ★测试结果:

     

    A型的人:

     

      你的行动力和适应能力都超极强,无论是在多么大的逆境之中,都能过关斩将,开创出一番新的天地。拥有如此力量的你,最适合去做一些劳动身体方面的工作。比方说运动选手啦、每天要跑来跑去的采访记者啦、外务员、推销员等。

     

      B型的人:

     

      你非常喜欢和人交往,最擅长的就是观察人心。不论是当一个听众或是一个说话的人,你对于处理复杂的人际关系都非常拿手。运用这样的才能,你非常适合做接待客人的工作,比方说:店员啦、旅馆的工作人员、柜台接待、或是自己开咖啡厅当老板,都是非常速配的哦!

     

      C型的人:

     

      你拥有非常敏锐的判断力和一双观察入微的眼睛。知性就是你的武器,你非常地冷静、且非常地细心,再困难的问题也都能迎刃而解!所以你应该去找一份能好好运用你聪明头脑的工作。例如:老师、秘书和计算机有关的工作、出版情报方面、广告公司、研究方面的工作,或是自己动笔写写书,都非常适合你。

     

      D型的人:

     

      你对于美的方面非常地敏感,简单地说,你是一个很感性的人。你非常喜欢运用自己的创造力去做出与众不同的东西。不管是绘画方面、裁缝设计、或是乐器等等,你都得心应手。如果要找工作当然也要找可以激发你创作欲的工作啰!例如:雕塑家、珠宝设计、插画家、室内设计师等等,都能将你的才能完全地发挥出来!

     

      E型的人:

     

      你天生就具有一种不可思议的魅力,而且全身散发出神秘的气息。你对于隐藏真正的自己非常拿手,所以有当艺人的天分,在大众面前表演的工作最适合你,例如:模特儿、演员等,还有占卜师或是算命,你也可以试试看哦

  • 测试你最适合的行业~超准的哦~

    2007-06-21 12:25:32

    ★问 题:

     

      假设有一天,你在梦中乘着船去寻宝,请运用你的想象力,回答下面的问题。最后再将点数加起来,就可以知道最适合你的工作了~

     

      1.你所乘的船是那一种?

      A。海盗船。

      B。小船。

      C。木筏。

     

      2.有多少人和你一起去?

      A。几十个人。

      B。几个人。

      C。只要你自己1人。

     

      3.如果可以带一只动物,你要带那一种?

      A。狗。

      B。猫。

      C。小鸟。

     

      4.你认为什么东西可以守护你?

      A。从母亲那边拿来的娃娃。

      B。从父亲那边拿来的宝剑。

      C。在海边捡到的小石子。

     

      5.船会往什么方向出发呢?

      A。东。

      B。西。

      C。南。

      D。北。

     

      6.你想要的东西是?

      A。藏在很深洞窟中的宝藏。

      B。沈在海底的宝藏。

      C。放在废弃的古老神殿中的宝藏。

     

      7.当你往大海前进,这时海平线彼方出现了一个巨大的黑影,你认为是什么?

      A。别艘船经过。

      B。只是一大片黑云罢了。

      C。大恐龙出现了。

     

      8.在航海的途中,有一样东西遗失了,是什么东西?

      A。水。

      B。食物。

      C。火。

      D。指南针。

     

      9.经过长久的航行,终于到达了藏宝地点,这时,有位恶魔出现了,并在你身边说了一句话,你觉得他说了什么?

      A。根本就没有宝藏,你被骗了。

      B。宝藏早就被拿走了。

    C。你是不可能找到宝藏的!死心吧!

     

      10.你终于找到了宝藏了!当你打开箱子的那一剎那,你想,你看到了什么?

      A。金银珠宝。

      B。可以看见未来的镜子。

      C。可以将你所带的动物变回人类的解药。

     

    ★计分表

     

    题目1 2 3 4 5 6 7 8 9 10

     

    A 1 1 1 2 1 1 1 2 1 2

     

    B 2 2 3 1 3 2 2 4 3 3

     

    C 3 3 2 3 2 3 3 3 2 1

     

    D       4    1

     

    ★计分方式请按照分数表计算。

     

      1014分的人→A型

     

      1519分的人→B型

     

      2027分的人→C型

     

      2832分的人→D型

     

    32分以上的人→E型

  • 遥远的距离

    2007-06-12 12:14:38

    世界上最遥远的距离 

                             ——泰戈尔  
         世界上最远的距离  
         不是 生与死  
                             而是 我就站在你的面前你却不知道我爱你  

                  世界上最远的距离  
                  不是 我就站在你的面前你却不知道我爱你  
                  而是 明知道彼此相爱 却不能在一起  

                  世界上最远的距离  
                  不是 明知道彼此相爱 却不能在一起  
                  而是 明明无法抵抗相思  
                  却还得故意装作丝毫不把你放在心里  

                  世界上最远的距离  
                  不是 明明无法抵抗相思 却还得故意装作丝毫不把你放在心里  
                  而是 用自己冷漠的心 对爱你的人  
                  掘了一条无法跨却的深渠

Open Toolbar