克莱's profile克莱沃曼PhotosBlogListsMore Tools Help

Blog


    August 21

    2006 世界软件50强(看看你的公司排第几)

    Rank         Company     Software / Services Revenue ($Million)    Software / Services Revenue Growth    Corporate Revenue ($Million)    Corporate Revenue Growth    Services as %    R&D as % of Corporate Revenue    Employees    Software Business Sector
    1    IBM     $63,110.00    3.0%    $91,134.00    -5.0%    75.0%    6.0%    366,345    Middleware/Application Server/Web Server
    2    Microsoft     $36,546.00    8.0%    $39,788.00    8.0%    NA    16.0%    61,000    Operating Systems           
    3    EDS     $19,757.00    -4.0%    $19,757.00    -4.0%    NA    NA    117,000    Outsourcing Services        
    4    Hewlett Packard     $17,380.00    26.0%    $86,696.00    8.0%    NA    4.0%    150,000    System Integration Services/IT Consulting         
    5    Accenture     $17,094.40    13.0%    $17,094.40    25.0%    NA    NA    123,000    Operating Systems           
    6    Computer Sciences Corporation     $14,058.60    -7.0%    $14,058.60    -7.0%    NA    NA    79,000    System Integration Services/IT Consulting         
    7    Oracle Corporation     $11,799.00    16.0%    $11,799.00    16.0%    20.0%    13.0%    49,872    Database       
    8    SAP     $9,994.40    7.0%    $10,080.40    8.0%    67.0%    13.0%    32,205    Enterprise Resource Planning(ERP)         
    9    Hitachi     $9,023.10    -5.0%    $80,896.00    -4.0%    85.0%    4.0%    35,600    Middleware/Application Server/Web Server         
    10    Capgemini Pvt     $8,885.90    4.0%    $8,885.90    4.0%    NA    NA         System Integration Services/IT Consulting         
    11    Lockheed Martin     $8,141.00    6.0%    $37,213.00    5.0%    NA    NA    135,000    System Integration Services/IT Consulting       
    12    NTT Data Corporation     $7,982.70    0.0%    $7,982.70    0.0%    NA    NA    7,620    Telecommunication Services           
    13    QUALCOMM     $5,673.00    16.0%    $5,673.00    16.0%    66.0%    18.0%    9,300    Wireless/Mobile           
    14    SYNNEX Corporation     $5,640.80    6.0%    $5,640.80    6.0%    NA    NA    2,026    Supply Chain/Manufacturing          
    15    EMC Corporation     $5,177.10    19.0%    $9,664.00    17.0%    51.0%    10.0%    26,500    Storage Management       
    16    Affiliated Computer Services, Inc.     $5,000.00    22.0%    $5,000.00    22.0%    100.%    NA    55,000    Outsourcing Services     
    17    Avaya, Inc.     $4,902.00    20.0%    $4,902.00    20.0%    NA    8.0%    19,100    Telecommunication Services     
    18    Unisys Corporation     $4,788.50    1.0%    $5,758.70    -1.0%    NA    NA    36,100    System Integration Services/IT Consulting       
    19    Fiserv, Inc.     $4,059.50    9.0%    $4,059.50    9.0%    NA    NA    22,000    Financial Application         
    20    SunGard Data Systems, Inc. Pvt     $4,002.00    13.0%    $4,002.00    13.0%    NA    NA         Financial Applications         
    21    Sun Microsystems, Inc.     $3,944.00    3.0%    $11,070.00    -1.0%    NA    NA    38,802    Middleware/Application Server/Web Server      
    22    LogicaCMG     $3,428.70    7.0%    $3,428.70    7.0%    NA    NA         System Integration Services/IT Consulting      
    23    Computer Associates International, Inc.     $3,426.00    5.0%    $3,530.00    8.0%    29.0%    NA    15,300    Infrastructure/Network Management     
    24    Getronics     $3,320.10    2.0%    $3,320.10    2.0%    NA    NA    25,266    Enterprise Application Integration    
    25    Symantec Corporation     $2,582.80    38.0%    $2,582.80    38.0%    NA    13.0%    15,500    Security Tools/Systems       
    26    Convergys Corporation     $2,582.10    4.0%    $2,582.10    4.0%    NA    NA    66,300    Financial Applications       
    27    DST Systems     $2,500.00    3.0%    $2,500.00    3.0%    NA    NA    9,500    Financial Applications        
    28    Wipro Limited     $2,185.30    117.%    $2,385.50    77.0%    NA    NA    46,500    System Integration Services/IT Consulting      
    29    Juniper Networks, Inc.     $2,064.00    54.0%    $2,064.00    54.0%    14.0%    17.0%    4,145    Infrastructure/Network Management       
    30    Amdocs     $2,038.60    15.0%    $2,038.60    15.0%    95.0%    7.0%    13,000    Telecommunication Services      
    31    Perot Systems     $1,998.30    13.0%    $1,998.30    13.0%    NA    NA    13,500    System Integration Services/IT Consulting      
    32    Intuit, Inc.     $1,966.70    13.0%    $2,037.70    13.0%    37.0%    15.0%    7,000    Financial Applications        
    33    Adobe Systems, Inc.     $1,966.30    18.0%    $1,966.30    18.0%    2.0%    19.0%    5,480    Office Productivity Tools     
    34    Level 3 Communications     $1,894.00    2.0%    $3,613.00    -1.0%    NA    NA    4,800    Telecommunication Services       
    35    SAS Pvt     $1,680.00    10.0%    $1,680.00    10.0%    9.0%    24.0%    10,180    Business Intelligence/Analytics       
    36    VeriSign, Inc.     $1,661.00    43.0%    $1,661.00    43.0%    NA    NA    4,076    Messaging/Communications        
    37    Misys plc     $1,619.40    2.0%    $1,619.40    -2.0%    NA    NA    6,507    Financial Applications      
    38    Infosys Technologies Limited     $1,592.00    50.0%    $1,592.00    50.0%    NA    NA    36,800    System Integration Services/IT Consulting  
    39    Autodesk, Inc.     $1,523.20    23.0%    $1,523.20    23.0%    18.0%    20.0%    4,813    Engineering       
    40    Anteon International Corporation     $1,493.20    18.0%    $1,493.20    18.0%    NA    NA    9,500    System Integration Services/IT Consulting        
    41    BMC Software     $1,463.00    3.0%    $1,463.00    3.0%    63.0%    18.0%    6,000    Storage Management    
    42    The Sage Group plc     $1,368.80    11.0%    $1,368.80    11.0%    NA    NA    8,686    Financial Applications      
    43    Emdeon Corporation     $1,276.90    10.0%    $1,276.90    10.0%    NA    NA    6,100    Healthcare        
    44    Compuware Corporation     $1,231.80    -3.0%    $1,231.80    -3.0%    75.0%    NA    7,908    Lifecycle Management        
    45    Acxiom Corporation     $1,223.00    21.0%    $1,223.00    21.0%    NA    NA    6,500    Customer Relationship Management        
    46    BEA Systems, Inc.     $1,200.00    19.0%    $1,200.00    19.0%    57.0%    14.0%    3,878    Middleware/Application Server/Web Server    
    47    Novell, Inc.     $1,197.70    3.0%    $1,197.70    3.0%    28.0%    17.0%    5,200    Infrastructure/Network Management     
    48    Dassault Systems     $1,184.10    10.0%    $1,184.10    20.0%    16.0%    26.0%    5,693    Application Development/Testing/Lifecycle Tools         
    49    UGS Corporation Pvt     $1,154.60    18.0%    $1,154.60    18.0%    69.0%    15.0%    6,200    Engineering         
    50    Harte-Hanks     $1,135.00    10.0%    $1,135.00    10.0%    NA    NA    7,106    Customer Relationship Management

    August 14

    用一个小例子来说明手工测试,自动化测试,系统命令,编程语言,API的关系

    很多人理解的自动化就是把手工测试case用脚本和工具转变成自动化测试。也就是说把手工测试的每一个步骤用脚本来模拟,从而执行test case。那么自动化的所有问题就归结于,如何用工具和脚本来转化手工操作步骤了。还有很多非常senior的,但是不会coding的手工测试工程师强调case的design能力是如何如何重要,自动化相对来说不是那么重要。我这里可以肯定的说,没有好的编程功底,你也不可能涉及出非常好的test case, 自动化的开发也不应该是仅仅把手工操作用脚本来模拟,而是应该大幅度的改变test case,使得能够用最好的方式来进行自动化。那些手工测试人员所谓的设计case的重要性,和他们设计case的高水平,实际上只是在他们的知识范围之内产生的观点。下边我用一个小例子来说明,编程能力在自动化过程中起的作用到底有多大。基本上来讲,有多强的开发水平,就有多强的自动化设计,实现水平。自动化开发和产品的开发实际上都是一样的,都是有需求,你来实现。当然,不同水平的人,实现起来的效果是千差万别的。这也就是为什么开发有高手,有低手,自动化测试的开发也同样有低手,有高手。自动化测试水平没有上限,你要学会发挥自己的无穷潜力。

    不多说了,现在说一下我们要自动化什么问题。我们有两个计算机帐号,A和B。我们需要用B帐号进行系统的设置,也就是测试的准备工作,然后用A帐号来进行测试。下边来说一下不同水平的人是如何进行自动化的。

    1. 手工测试人员

    • Log on B
    • Configure
    • Log out
    • Log on A
    • Test

    2. 初级自动化人员(直接把手工case转成自动化)

    • Set autologon B
    • Set autorun
    • Record test status: 0
    • Logout
    • Check status

    if(status==0)
    {
        Configure
        Set autologon A
        Record test status:1
        Logout
    }

    if(status==1)
    {
        Test
    }

    这个级别的人,需要懂得脚本编程,需要懂得系统设置,autologon and autorun。

    3. 有一定经验的自动化人员(改变手工测试case以利于自动化的更简单,可靠的实现)

    • 不需要log out and log on
    • 利用Windows命令Runas
    • 用高级语言调用Runas
    • 利用重定向来输入Password

    这个级别的人,需要懂得高级语言,重定向,Windows系统命令Runas

    4. 中级自动化人员(具有更丰富的开发经验,可以用程序代替UI和系统命令)

    • 不需要Runas命令
    • 利用.NET的Process对象
    • 用B的身份生成一个Process来进行配置工作

    这个级别的人,要比较熟悉高级语言,比较熟悉高级语言的类库,懂得操作系统的内核基本概念

    5. 高级自动化人员(精通高级语言,精通操作系统内核)

    • 不需要多生成一个进程
    • 用本线程impersonate用户B
    • 利用.NET WindowsIdentity 对象
    • 必须要调用Windows API,LogonUser

    这个级别的人,要精通C/C++和Java,C#等高级语言,精通Windows内核的知识和Windows API

    从以上的例子可以看到,针对同一个test case,不同的测试人员,从手工到高级自动化,由于自己知识面的原因,会设计出非常不同的case出来。越高级的自动化越灵活,稳定,可靠,也更需要掌握更多的开发和内核的知识。因此,我们看到很多人在强烈的否定自动化,你先看看他到底在哪个层次中。越下边层次的自动化人员,由于技术的原因,碰到的问题会越多,能解决的问题却越少,因此对自动化的抱怨也就越大了。这些都是可以理解的,不过以此来否定自动化,我觉得还是不太应该,毕竟自己技术还不过关。

    August 12

    一个UI自动化的小例子

    随便用一个小例子来解释一下UI自动化的开发吧.

    我先现在有一个Button是disable的状态,一旦Button enable,我们就Click弹出一个窗口.

    我们使用的测试工具就有同步的功能.

     

    1.自动化工具生成的程序(发现和操作控件,不能真正运行)

    button=FindButton(); 

    ClickButton(button);

     

    2.傻瓜的自动化程序(通过加入sleep变成可以运行的程序)

    button=FindButton(); 

    Sleep(10);

    ClickButton(button);

    Sleep(10);

    window=FindWindow();

     

    3.简单的自动化程序(加入同步,使得更可靠和有效率)

    button=FindButton(); 

    WaitButtonEnable(button);

    ClickButton(button);

    window=WaitWindowOpen();

     

    4.完整的自动化程序(保证100%可靠,没有测试程序bug,简单写了一下,没有包含exception的控制,时间急,可能也会有错误,不过就是这个意思)

    Button button=null;
    for(int i=0;button==null&&i<3;i++) //如果FindButton不稳定,调用三次in case
    {
        button=FindButton();
        if(button==null)
        {
            Log.Error("Tryout{0}:Can not find button",i); //测试工具不稳定
        }
        else
        {
            break;
        }
    }

    if(button==null)
    {
        Log.Error("Cannot find button. Quit"); //测试工具找不到button,或者产品问题
        Log.Screen();//截图,只是为了示例,以后不再单独写
        return;
    }

    if(!WaitButtonEnable(button))
    {
        if(button.Enabled==true) //测试工具问题,没有得到enable的消息
        {
            Log.Error("enabled, but tool didn't detect");
        }
        else//测试工具问题,不能成功检测button的状态,或者产品问题没有enable
        {
            Log.Error("don't enable");                      return;                                                                                                                                                                                                                                                                                                                
        }
    }

    Window window=null;

    for(i=0;window==null&i<3;i++)//ClickButton不稳定,或者没有得到open event,或者产品问题
    {
        ClickButton(button);
        window=WaitWindowOpen();
        if(window==null)//没有click或者没有得到消息,或者产品问题
        {
            int count=0;
    findwindow://FindWindow不稳定,重试3次
            window=FindWindow();
            if(window!=null) //没有得到消息,但是窗口弹出
            {
                Log.Error("didn't get event");
                break;
            }
            else //没有click,或者产品问题, 或者FindWindow不稳定
            {
                Log.Error("Tryout{0}:didn't get window",i);
                count++;
                if(count>3)
                {
                }
                else //FindWindow不稳定,workaround
                {
                    Log.Error("goto{0}",count);
                    goto findwindow;
                }
            }
        }
        else //成功
        {
            break;
        }
    }

    if(window==null)
    {
        Log.Error("didn't get window, maybe tool or product problem.");
        return;
    }

    再谈UI自动化测试

    最近还是发现有一些文章,个人对于自动化测试报有很大的怀疑态度,本人也对相关的文章给与了驳斥。我个人和公司对自动化测试都是报有很积极的态度的。这里我想再次的写一篇文章来阐述到底UI自动化测试可以做什么,作为一个优秀的UI自动化测试工程师应该具备有什么方面的技能,以及本人对UI自动化的一些经验和体会。

    首先还是要强调一点,API和command line程序都是非常适合用自动化来进行测试的。我想这个观点,即使那些反对自动化测试的人也不应该否认吧?至少我觉得他们应该有这个意识。因此,对于他们反对自动化就集中在了UI自动化方面,我这里也完全站在UI自动化测试的角度来写这篇文章,后边就不再强调了。

    再次套用朋友的一句话,"自动化测试听起来很神秘,学起来很简单,用起来很麻烦"。我想有过自动化测试经验的人,可能大多都有这个体会吧?前边的过程我就不提了,以后主要探讨为什么用起来会麻烦和怎样简单化自动化测试。总而言之,想搞好自动化测试,还是需要测试人员比较高的技术水平,尤其是编程能力和解决问题,分析问题的能力。

     

    首先,我要谈谈自动化测试工具和编程语言的关系。作为一个优秀的自动化测试人员,他的最基本的能力就是编程水平了。所谓编程就是至少要精通一门高级语言,比如Java,C#等等,脚本语言不计算在内。请记住,不是熟悉,是精通。高级编程语言给我们提供很强的能力来实现一些东西。你所精通的语言能力越强,你在自动化测试可以做的事情就越多,越好。简单来讲,论程序的能力来排序是这样的,测试工具-〉脚本语言-〉高级语言(Java,C#)-〉C/C++-〉C++/CLI。根据这个语言能力的排序,结合你自己的语言能力,你可以想想你到底具备多少自动化测试能力。我所强调的是,如果你想优秀,你至少要精通一门高级语言,这是必不可少的。如果很多人还只是用测试工具,脚本语言工作而抱怨自动化,我要强烈的建议他们好好去学习一下编程能力先了。他们的问题在于,由于编程能力的不足,使得自动化测试的很多问题没有能力和办法去解决。再谈一下自动化测试工具,无论哪种测试工具,无论他们设计的多么强大,从编程语言来讲,他们最多能够达到脚本语言的能力。也就是说,如果你完全用测试工具来进行自动化的开发,很多问题你还是无法解决的。因此,我推荐的自动化开发方法是高级语言结合测试工具。我的自动化测试逻辑是,用测试工具只是完成UI操作,其他部分完全用高级语言来实现。我们不能否认高级语言所具有的能力,他们创造出了世界上这么多丰富多彩,这么多优秀的软件,难道开发测试程序会有问题吗?因此,我们的焦点就落在了测试工具的UI操作部分。

     

    第二,关于测试工具。开发语言重要,选择一个合适的测试工具也同样的重要。一个灵活,强大的测试工具可以使你的自动化开发起到事半功倍的作用。结合不同的项目,不同的语言,你可能会有不同的选择。不过,这里我想解释的是,具有了高级语言的开发能力之后,我们期望测试工具来为我们做什么。我前边也说过了,我们所要求自动化测试工具所做的就是UI的操作。这里边比较重要的是三个方面,一是找到UI对象,二是操作UI对象,三是同步。如果一个工具能够让你找到所有的UI对象,并且能成功操作这些对象,就完全满足我们的自动化开发需要了。如果,工具能够提供同步的功能,就使你能够如虎添翼,不然的话要自己去实现,会麻烦不少。到了这里,你已经具有了所有UI的操作能力(测试工具提供),并且具有了高级语言的实现能力(高级语言提供),你才有了基本的能力去做一个优秀的自动化开发。没有这些能力的人,我严重怀疑能否做出好的自动化测试。

     

    第三,怎样自动化。我的自动化的原则是,尽量少的进行UI的操作,除非是你本身要测试的UI。道理很简单,UI操作由于可能受各种问题的干扰,很容易失败。通过非UI的方法去实现是更加可靠和快速的。这也是我为什么要强调对于高级语言的精通,具有高级语言的开发能力,你就能过把大量的任务从UI操作转向了程序操作,使得你的自动化程序的可靠性大大的增强。这里还需要强调的一点能力就是系统应用的能力,比如Windows使用的能力。Windows的很多的操作是有相关的命令来实现的,不一定非得通过大家熟悉的UI。记住这个原则:除非是你要测试的UI,否则尽可能的通过高级语言来实现。我想大家对于高级语言来实现的工作应该还是有信心吧?因此,下边我要谈的内容就完全的与你要测试的界面相关了。

     

    第四,怎样进行UI测试。首先要尽量的减少UI操作,除非是你必须要测试的操作。比如简洁快速的启动你要测试的界面,用快捷键代替鼠标操作等等。总而言之,理想状态下我们进行的每一次UI操作,都是我们需要测试的,其他操作尽量避免,不能避免用最可靠的方式去实现。那么我们现在的焦点就变成了,怎样来处理我们真正要测试的UI了。UI测试的开发基本上就三个问题:发现对象,操作对象和同步。简单解释一下同步,同步就是有一个机制告诉你何时可以执行一个UI操作。很多人是用sleep的方式,等待一定的时间去执行下一个操作,这是我非常反对的。我的原则是,尽量少用sleep,就算要用每次最多不要超过一秒。滥用sleep会严重影响测试程序的性能(具体的UI自动化过程,大家可以参考我的其他文章)。

     

    第五,UI测试错误/异常的解决和Debug。通过以上的解释,我们只是在自己需要测试的UI操作才进行UI操作,否则通过高级语言或者系统命令来实现。是不是我们的UI自动化就完美了呢?绝对不是,这只是一个基础,还远远没有达到完美。我们在自动化开发和应用的过程中,大部分的时间其实是花费在了异常/错误处理和Debug上面。这跟真正的程序开发非常的类似,你如果去看代码的话,大量的是在进行返回值得检验和异常的处理。如果我们的程序在运行过程中出了问题怎么办,或者如果没有出现我们期望的结果怎么办?一般来说有三种问题,第一是产品的问题,我们可以报bug了,第二是你测试程序的bug,你需要fix。第三是其他的问题,比如测试工具,甚至高级语言本身的问题,你需要workaround。总而言之,优秀的测试程序最终的目的是,一旦程序的运行发现了问题,就是产品的问题,就是可以报bug的。能够达到这种境界才能算自动化测试的完美,才能算是一个真正优秀的测试人员。(当然了,正如软件产品不可能没有bug,你的测试程序也不可能完全没有bug。但是,由于软件产品是有大量的用户来使用,而你的测试程序只是很小范围内来使用,使得你消除影响测试过程的bug成为完全可能)

     

    综上所述,一个优秀的自动化测试工程师必须要具备高级语言的开发能力,自动化工具的灵活应用能力,系统命令和使用的熟练能力等这些基本功,还更要具备优秀的Debug,Fixbug的能力,和保持程序稳定性能力。换句话讲,一个优秀的自动化测试工程师必定也是一个优秀的软件开发工程师。

    最后谈一下我为什么要转向C++/CLI?从上边的排序大家可以看到,C++/CLI是目前Windows平台最强大的编程语言。在我的自动化开发的过程中,我需要高级语言和系统命令都不能完成的功能。如果没有C++/CLI我就必须要通过UI来实现,从而降低我程序的可靠性。而有了C++/CLI的功能,我就可以绕过UI操作了。总之,能够绕过UI操作的能力也体现出一个自动化测试人员的能力。从这个角度讲,测试人员有很多东西要学的。最后说一下,我自动化工作的要求是100%可靠,我还不能完全满足,因为使用我程序的人是那些手工测试的人,他们的使用环境的变化有可能引起一些问题的产生,基本上还不是我程序的问题,而是测试工具,或者其他模块的问题,我需要想办法去workaround。不过,随着一定时间问题的积累和解决,如果环境不变,应该可以达到100%可靠。(可是环境的变化是不会停止的,因此实际上很难达到永久的可靠,不过一段时间的可靠还是应该可以达到的,或者说我们的测试开发必须有这样一个目标,就如同软件开发的目标一样)

    August 08

    驳斥《C++/CLI 的十宗罪》

      由于公司有大批程序员死在 C/C++ 的内存管理上(泄露,越界),作为有先见之明的,伪程序员的老板征集了各方意见后,决定将现有的所有框架代码移植到 C++/CLI 下面来。由于本人在 C/C++ 上多花了几年功夫,自然,这个“简单”的问题就落在了我的肩膀上。用了一端时间 C++/CLI 后,发觉 C++/CLI 不是鼓吹中的那么好,特别是对于 C++ 程序员来说,简直是噩梦。依据 MS 的历史,我认为 MS 在 VC9.0 以后的版本中才能将 C++/CLI 实现的比较完美。(MS 的历史:要在第三个版本才会比较好用,例如:VC4、VC5 都不是很好,VC6 我用了 7 年;.NET 2002、2003 也一堆问题,.NET 2005 终于好用了)。

    特在此总结了 C++/CLI 的十宗罪,罪状如下:

    第一、没有全局变量

      好吧,我承认“现代”的高级语言都没有全局变量,不过,实现这些高级语言的运行库都有无数的全局变量(反汇编跟踪下就知道了)——哦,只许州官放火,不许百姓点灯。好吧,我承认没有全局变量,我还能生存,大不了晚上我不点灯不做事了。

     

    [Comments] 既然你知道现代的高级语言都没有全局变量,怎么能把它作为C++/CLI的罪过呢?为什么现代的高级语言都没有全局变量呢?为什么面向对象的一大特点就是封装性呢?既然你研究了几年了C/C++,应该清楚和明白吧?简单的来说,在C语言时代是没有封装性的概念的,因此全局变量满天飞,使得大型程序维护起来十分的不方便。这也是为什么面向对象概念兴起的一个很重要的原因。作为一个程序员如果从整体的设计来考虑的话,是应该尽量少用或者不用全局变量的。这也是为什么现代的高级语言都取消了全局变量了,而且如果面向对象的设计能力比较强的话,是可以完全的抛弃全局变量的使用的。当然了,对于很多C程序员来说,不能使用全局变量有点要命的感觉。不过这不能怨语言,应该看看自己是否真正理解了面向对象的概念。

    还有就是,为什么他们的运行库有无数全局变量?因为他们是用C来实现的,在C语言里是必须要用全局变量的。

     

    第二、类的静态成员变量的初始化时机问题

      没有全局变量是吧,那么我用静态成员变量来模拟总可以了吧。很好,顺利编译通过!但是,但是,这个静态成员变量是什么时候初始化的呢?哦,用到这个类的任何变量/函数/实例的时候初始化的!这个到是很好,解决了全局变量的初始化顺序问题。问题是,我只不过希望静态成员变量将本类注册到类工厂去。我从来不会直接访问这个类的任何变量/函数/实例——我只访问他的基类。这样一来,我的类工厂里空空如野,我的系统再也工作不起来了。

     

    [Comments]这个问题跟第一个问题是类似的。还是你要想方设法的去用全局变量,而没有想过为什么不让你用全局变量。静态成员变量本来就不是做这个用途的,它是类的实例的一个全局变量,注意只是这个类的实例,而不是整个应用程序。这只能说明你错用了静态成员,而不能归于C++/CLI的罪过。

    还有就是静态成员完全可以初始化,只是你自己不会罢了。建议你好好的去学习一下.NET。

     

    第三、弱智的、缺乏实际应用经验的人设计的的静态成员变量初始化地方的问题

      你能判断下面这句话是变量声明还是函数申明吗?
    static int myfunc(mytype_or_myvar);
    反观 C++ 的做法:
    static int myfunc;
    int myclass::myfunc(mytype_or_myvar);
    你会有歧义吗?

     

    [Comments]没看出这个有什么问题呀?你难道读程序是一句一句的读吗?我们怎么能够把程序分割理解呢?如果上下文一起来看,能有什么歧义呢?

     

    第三、静态局部变量的问题

      你知道,仅仅一个“单件”,就多么的需要这个玩意!

     

    [Comments]这个不太明白想表达什么。

     

    第四、功能弱到极点的 array

      其实已经很强大了,比 C++ 的数组多了一个 Resize() 功能了。但是,跟 std::vector 比较起来,一个天上,一个地狱!好吧,我承认我对 CLI 不熟悉,那么,谁告诉我,C++/CLI 提供了什么样的东西,具备 std::vector 的功能?不要告诉我基于 CLI 的模板库,我严重怀疑其可工作否。

     

    [Comments]看来你真的没好好学过C++/CLI,你不知道C++/CLI最大的优点在于通吃一切吗?你现在抱怨的是CLI,就算CLI没有你想要的功能。可是C++/CLI是C++和CLI的混合体,你没有必要一定用CLI,你当然还可以用回你所有的C++功能。std::vector算个什么呢?

     

    第五、value struct 和 cpp struct 在模板函数上,对“引用”的符号匹配问题

      对于 cpp struct 应该匹配那个符号?'&' 还是 '%'?答案是 '%'。哦,我的天哪,居然还可以使用 pin_ptr<cpp struct> 来取地址!实在是太伟大了!那么,我的 cpp struct 变量究竟位于哪里?堆上?栈上?还是托管堆上?我迷糊了,编译器跟我一起迷糊了。

     

    [Comments] 看来你还没分清楚cpp struct和CLI struct的区别呀。建议你还是好好学习一下再来讨论吧。

     

    第六、模板函数的特例化问题

      对于下面这样的函数:
    ref class myclass
    {
             template<typename T>
             myclass % operator << (T % t){...}            // 函数一
             myclass % operator << (mytype % t){...} // 函数二
    };

    myclass c;
    mytype t;
    c << t;   // 式一

      你认为“式一”会调用那个函数?我知道你的答案,不过你的答案是错误的,因为你是一个资深的 C++ 程序员。当我意识到我的系统不能正常工作是源于此的时候,我很想联系恐怖份子,购置一枚或者更多的原子弹,然后在 google 上找到 MS 总部甚至分部的坐标,然后把原子弹的目标设置好……

     

    [Comments] 建议你先学学template和generic的区别吧。

     

    第七、C++ 和 C++/CLI 的代沟问题

      ref class,value class 里不能放置 cpp class 的实例,这个我还能接受。但是,cpp class 里不能放置 ref class,value class 的任何玩意——实例、引用、指针、interior_ptr,pin_ptr。我怎么实现回调式的功能?不是我非要设计出回调式的功能,而是,有那么多,那么多的Win32 API 是回调式的!好在我在知识的海洋中找到了 System::Runtime::InteropServices::GCHandle,不然,我定制的原子弹就会上升成为氢弹!

     

    [Comments] 这不是C++和C++/CLI的代沟问题,是C++和CLI的代沟问题,C++/CLI提供了你一个桥梁把他们联系在一起,你应该感激才对。没有C++/CLI你更没法搞。这是C++/CLI一大优点,而不是罪过。

     

    第八、.NET提供的类库太过于臃肿

      大家知道,C/C++ 的 CRT 也就几百K,C/C++ 仍然实现了你所能看到的软件的绝大部分——但是,你看到的,用 .NET 实现的软件有几个?好吧,我承认我偷梁换柱,不过,由于.NET库的臃肿,以致于稍微一个好听,合义的单词都被.NET用掉了。这让我不能放心用 Object,String,IStream...等等作为我自己的类型的命名,我只好绞尽脑汁想别的名字——正如您所猜测的一样,我的英文很差,必须要借助翻译工具才能看懂 C++/CLI 的白皮书。这让我想出新鲜的,上口的,其他跟我英文一样差的人能看明白的单词,其难度真不啻于用随机数拼出一个Windows啊!

      随机数拼出一个Windows:这个是我一个哥们的研究课题,把 N 台电脑关在一个小黑屋里,让他们随机生成二进制数据,并当作程序来运行。当速度足够快或者运气足够好的时候,生成的二进制数据刚好跟你从 DB 商手里买到的 Window XP 一样。(UMU:U墨的手法,说明几率极小极小!)

     

    [Comments]首先.NEt是否臃肿,是否应该臃肿本身就是一个问题。就算.NET是臃肿的,也不是C++/CLI的罪过。那是.NET的问题。

     

    第九、四饼!

      这个问题是由第八个问题引起的,因为有这么多,这么深的名字空间,各个名字空间下有这么多相同名字的类型名,让我不得不整天::...::...::...::...::...::...::...::...::...::...::...::...::......
    真的,四饼占了我代码的十分之一的字数。如果按字数发工资,我是乐意的,问题是,不是按字数发工资!

     

    [Comments]如果你用了using spacename, 是不用那么多::的,这个是.NET的常识问题,也是.NET的一大预言特点。优于C++的。

     

    第十、GC不能解决内存泄露问题

      首先,我们要承认 GC 的一个伟大壮举:GC 能够在程序退出去的时候,释放所有的内存。但是,在 8 年前,我用 C 在 DOS 也能够办到这个功能。问题是,运行十天后,我 C/C++ 占用的不会释放的内存,GC 也不能释放,甚至 GC 占用的内存还更多。因为 GC 分不清楚没有置空的句柄是否还有机会被再次使用。

     

    [Comments] 看来你一点都不懂GC呀。建议你先去好好学学。

    综上所述,作者是一个对.NET没有太多概念的C/C++的程序员。因此,对C++/CLI的理解,就显得非常肤浅了。不知道作者搞了几年的C/C++为什么就这么轻率的发表这样不负责任,有很大误导作用的文章出来。从作者这样热衷全局变量的使用来看,好像面向对象的设计水平也很普通。希望大家不要被误导,看到作者的文章,使我对C++/CLI更加有信心了。

    August 07

    发现C++/CLI是发现新大陆了吗?

    最近事情不多,想学点什么新东西了。最近几个月Facebook的F8炒得很火,吸引我看了看他们的Application是什么样子的,应该怎么开发。看完之后,自己不太感兴趣,因为自己要建Server,比较麻烦。然后,随便找找发现了C++/CLI。原来微软在2005年就推出了这门算是新的语言吧,以前只是知道有managed C++,评价不高,C++/CLI是它的改进版本。随便了解了一下,感觉这门语言还是很吸引我的。原因很简单,就是它的强大混合编程的能力。它可以调用.NET, MFC, Windows API。目前的测试开发语言主要是C#。一直以来自己都认为C#是最适合自己的测试开发工具了,因为用C++开发测试程序不太现实,至少不能作为主要的开发语言。VB,Java什么的是我一直都讨厌的,其他script的什么的,功能都太弱了。唯有C#是除了C++以外最强大的快速开发工具。可是,用C#开发里边就存在了一个不可逃避的问题,就是调API的艰难。很多时候,我们都会碰到.NET不能完成的功能,尤其是偏系统一类的测试。那么我们就需要用Windows API来实现,可是C#调API的方式使我选择了逃避,或者说放弃。心里想,必要的时候就用C++吧,可是还真没用过。(这也就是测试人员的灵活性了,呵呵)

    大概一天的时间都是看别人对C++/CLI的评论,使用心得什么的。感觉大部分人都是批评的态度,少数人喜欢和支持。说真的,自己也能理解C++程序员对它的看法。首先,它新增加的关键字确实让人不习惯,看起来,用起来都觉得怪怪的。其次,大部分C++程序员开发的项目都不需要用到.NET吧?至少目前应该是这样,很多人还在VC6下边编程。既然用不到它,就不会体会它的好处,那么就真的只有不好了。少数人喜欢它就是因为它强大的能力。目前来看,还真的没有其他语言从功能上说能与它相提并论。另外一点就是,从资料上来看,目前使用这门语言的人很少。因此我也很犹豫到底应不应该学习和使用它。

    在疑惑中对它进行了学习,感想如下。

    1。想真正的掌握好这门语言既需要C++的知识,又需要.NET的知识。正如一些人所说,学习它的难度要高于C++和C#。当然我是说真正的掌握,你可以用它只做C++程序,或者只做.NET程序,那就跟单独学C++或者C#的难度一样了。因为,大部分C++程序员侧重于底层,C#程序员侧重于上层,使得纯C++/C#程序员转向C++/CLI都需要一定的时间,不会轻易上手。当然对C++程序员来说会更简单一些,毕竟.NET还是比较容易掌握的(前提是他们能有心,耐心学习)。另外,如果同时具备了C++和C#的知识和经验,上手C++/CLI还是会很快的。比如我学了一天就可以上手了。

    2。功能的确强大,.NET, MFC, API通吃。我装的VS2008 express 版本不支持MFC, 不过.NET+API真的就足够对付任何工作了。

    3。语法没有想象中的那么不可接受。首先,它增加的关键字其实并不多,大概10几个吧,很容易学习和掌握。其次,很多关键字你也可以完全不用的,比如ref struct, value struct可以完全不用。value class 我觉得也没什么太大用。ref class就足够了。这样的话,虽然是4个关键字,可是对你来说就只是一个。再次,这里边真的有一个习惯问题, */^, using/using spacename, ./->, new/gcnew 这些东西你很快就应该能够适应。

    4。和C#的比较。C#的语法还是简洁许多,也更自然。如果纯做.NET程序,目前来看没有必要非用C++/CLI。可是如果需要调用API的话,C++/CLI给你带来的方便性还是要大于语法的繁琐。因为语法可以去适应,习惯。功能的强大可是可遇而不可求的东西呀。所以,个人认为做测试程序,C++/CLI还是一个不错的选择,能够更广阔的设计我们的test case。

    5。关于C++/CLI的未来。未来真的很难说,一看市场的需求,二要看微软的支持。目前来看,C++多用于系统,驱动方面。C#用于应用方面。相信未来的一段时间都会维持在这种状态中。C++/CLI给我们带来的是C++,C#混合编程。可是市场上有多少产品的开发需要这种混合编程呢?目前来看很少,就算有,有些公司就单独用C++,C#来做,再集成起来也是解决的一种方法。另一方面,C++程序员和C#程序员分的很开,没有适合用这种语言的中间状态的程序员。如果没有产品,没有程序员的支持,很难说能有什么太好的前途。不过我想C#加上C++/CLI的解决方案还是要比C#加上纯C++的解决方案更合适,合理一些。如果不嫌弃C++/CLI的语法,单独用它也可以完全的解决。现在来看,C++/CLI的阻力最大来自于它的语法了,如果语法简洁了,在.NET领域会有不少人用,从而引起它的流行,而在系统领域也得到一定的应用。个人认为,using space可以就改为using, *,^合并为*,由编译器智能判断是传统指针还是引用指针,new和gcnew也合并,编译器智能判断是应该在普通堆还是在托管堆上建立。如果这样的话,我想就没什么人会拒绝接受它了。

    个人来说, C++/CLI还是极大的提高了我写测试程序的能力,我还是抱着积极的态度去采用它。这也避免我长期用C#而疏远了C++。用好C++/CLI就等于用好了三门语言。

    August 02

    如何debug lsass.exe

    这两天需要调试lsass.exe, 昨天baidu竟然都查不到什么信息。lsass有它的一些特点。首先它是运行在user mode, 因此一般来讲应该用user mode的调试工具来调试。可是,如果用debuuger直接跟它相连,计算机就会自动重启,使得调试无法进行下去。其次,如果我们想在机器启动的时候调试lsass也比较麻烦,因为user mode debugger那个时候还不能工作。再次,调试lsass的时候,网络的访问不能进行,因此从网络上访问symbols and source code 也成为了不可能。经过认真研究,发现有三种方法可以用来调试lsass,并且各有优缺点。下面就一一讲解一下。

    1. ntsd piped through KD

    a. 修改注册表

    HKLM\Software\Microsoft\Windows NT\CurrenVersion\Image File Execution Options\lsass.exe debugger = REG_SZ c:\debuggers\ntsd.exe -d -g -G

    b. 用另一台机器通过kernal debugger和测试机相连

    c.重起测试机

    这样的话,在启动阶段,当系统调起lsass的时候,测试机的ntsd就开始工作,并且将输入,输出传送到kernal debugger上。这个属于在kernal debugger里进行user mode的调试。

    优点:可以在启动的时候调试lsass。

    缺点:symbols and source files 必须要copy在测试机上。(不太方便)

     

    2.Debugging LSA via dbgsrv.exe

    a.Find the PID for LSA via tlist.exe

    b. C:\Program Files\Debugging Tools for Windows>dbgsrv.exe -t tcp:port=1234,password=spat

    c.Run this command to attach to LSA on the remote machine.

    I:\debugger>windbg.exe -premote tcp:server=192.168.1.102,port=1234,password=spat -p 596  -- where 596 = PID of LSASS

    优点:symbols and source files 可以在调试机上

    缺点:不能在启动的时候进行调试

     

    3.Debugging LSA from Kernel

    a. Get the process address for LSASS

    0: kd> !process 0 0 lsass.exe

    PROCESS 815196c0 SessionId: 0 Cid: 010c Peb: 7ffdf000 ParentCid: 00e4

    DirBase: 042d2000 ObjectTable: 81519aa8 TableSize: 859.

    Image: LSASS.EXE

    b. Switch to the process context:

    Either

    .process /p /r 815196c0

    Or

    .process –i 815196c0 ;g;.reload /user

    优点:symbols and source files 可以在调试机上,可以进行log out/ log on 过程的调试

    缺点:不能在启动的时候进行调试

    因此,如果想在启动的时候调试,就必然要选方法1。如果想在log on的时候调试,选择方法3。其他情况,可以选择方法2,或者方法3。