Yu

我的IT生活。

博客园 首页 新随笔 联系 订阅 管理
  22 Posts :: 1 Stories :: 55 Comments :: 0 Trackbacks

2004年10月1日 #

    记得两三年前被逼无奈利用自己的时间为现在的公司制作过[如何提高生产能力及质量]的小报告。当时主要是罗列并粗浅的比较了一些比较流行的方法论,并没有感觉到很难。可是在企图定量的衡量提高多少的时候,我却找不到答案。和提高比较起来更难的应该是如何计算生产能力,固然不知道如何计算生产能力根本无法准确衡量提高多少,还有就是毕竟是否有提高还可以定性的分析,如何计算的时候就必须要定量了。

    目前我采用计算代码行数的方法统计并衡量。
    这里不得不插一句,用计算代码行数这个方法本身的问题,Martin Fowler在  CannotMeasureProductivity  这篇随笔(?)中围绕无法合理的测量生产能力这一主题展开了相当精辟的分析,首当其冲的恶例就是利用代码行数计算,非常值得一读。至于为什么我顽固不化的依然计算代码行数,也许我要强调一下这个单词 [平均生产能力],同时我也尝试导入了计算纯生产代码行+共通代码的计算方式,自以为在统计的时候可以在很大程度上接近“实际”生产能力...
    在计算生产能力时,自然总会接触到很多个人的信息。因为我是在一个成员相对稳定的公司,工作内容只是普通的应用软件开发(说白了就是高中毕业生也可以做的工作),再加上法律上有关解雇条文的禁止半禁止导致对劳动者的保护造成了企业竞争能力低下、个人能力差很大。
    很久以前看到的一个分析数据就和我们公司的情况很接近。能干的大概占项目人数的20%却做了50%以上的工作。
 
    软件业的人月其实应该是一个非常不好的概念,也有太多人对这个有怀疑,至少从理论上根本无法找到任何根据。至于为什么还广泛的存在于我们的行业的理由,我想应该是如果不用这个概念的话,就不知道如何与客户交涉的人不少的原因吧。放下这些不谈,在目前广泛存在的人月这个概念的基础上,可能就不难理解计算平均生产能力的重要性,如果没有这个数据就不知道如何做预算,如何分配工作了。
 
    其实生产能力不只与每个人的自身能力有关,影响它的实在有太多因素,假设有一位刚刚失恋;假设中有一位对公司现存制度很不满的朋友;假设有一位元老级的人被降职。。。。。。甚至计算机的反应速度也决定了个人的生产能力。应该是IBM做的调查吧,同样的人在不同反应速度的机器上工作,工作能力的差会有1.6倍左右。。。
 
    生产能力是一个不得不计算的参考数值,也是一个永远也算不准确的参考数值。如果能保证上下偏差10%可能就是精度超高了。
 
    生产能力这些数据的利用面很广,假设做我们要做某个项目的预算,如果有一个相对准确的平均生产能力值可能就会让结果准确很多,特别是用cocomo计算的朋友会很爽吧。当然不管是画个WBS然后一点点相加还是用FP或者用类似经验法则做预算,都实在是太需要这样的基础数据。

    自己也许更需要其他的方法来计算......
posted @ 2004-10-01 15:00 Yu 阅读(1076) | 评论 (0)编辑

    昨天(2004/09/30)休息一天什么事情都没有做,今天一大早上翻翻新闻,就发现J2SE5.0于9/30正式推出。总算满足了那些把眼睛都看红红的JAVA用户了。

   下载地址
   http://java.sun.com/j2se/1.5.0/download.jsp

   在7、8月的时候,有听说是无法直接在Eclipse上工作,可能要到这里(http://genady.net/forum/)下载JDK 1.5 Plugin。不过是否支持中文,我也就不知道了。说句心里话,为了稳妥些,还是等Eclipse正式支持好一些。

   我是一个JAVA2的初学者(说了有好几年了,一直都没有学),其实这次听说支持Enum,我就很满足。
posted @ 2004-10-01 11:07 Yu 阅读(1016) | 评论 (0)编辑

2004年9月27日 #

  DataTable是在内存中展开的表结构。各种更新都可以在内存中实现。可是想要取得更新后DataTable的行数的时候出了问题。取得结果与预想的结果
不一致。

  主要的原因是我使用的是DataTable的Items.Count(DataRowCollection.Count)。本以为内部会为我做解析,毕竟DataRowCollection是一个面向
DataRow的专门Collection。没有理由不可以。可是查找文档的结果是Count会把DataRowCollection所有成员都作为Count的对象,并且没有提供其他重
载。

  嗯,我不知道这个设计的本身是否有问题,至少让我很苦恼。

  查找了若干文档,似乎没有什么好的东西,只好返回DataTable看看有没有其他可用的方法或者属性。

  最后,我发现了Select有一个重载
  public DataRow[] Select(string, string, DataViewRowState);

  就是它了?这样我就可以取得指定DataViewRowState的成员,求Count更不会是难题。

  但是问题又出来了,public DataRow[] Select();返回来的DataViewRowState又是什么呢?因为不是做项目,所以也就没有自己执行,简单查了一下Mono1.0的程序,发现使用的是DataViewRowState.CurrentRows。

  DataViewRowState.CurrentRows 为 22。刚刚好没有DataViewRowState.Deleted (8)。

  原来是它才对。。。
posted @ 2004-09-27 13:47 Yu 阅读(1025) | 评论 (0)编辑

    因为工作的原因,基本上都是使用Oracle系列的数据库,很少有接触DB2的机会,可从9月17日开始就开始密切的注意IBM的DB2 UDB 8.2,因为让我有些不太愿意相信的事情发生了。
    使用DB2 UDB 8.2就可以写C#/VB.NET等基于.NET Framework的存储过程,无疑这给.NET程序员带来了更宽广的世界。还有就是微软的Sql Server还在Beta2,看样子至少从广告效果上DB2也给Sql Server一个小耳光吧。这样的小地方也都不愧是被称作Stinger。

    在IBM的主页上有这样两篇文章介绍相关的知识
    DB2 Development Add-In Technical Preview
    A look at the new functions in DB2 Universal Database V8.2
    通过它能有个大概的印象,趁着休息天就按照这两篇文章开始了尝鲜的“旅程“。

    ⒈下载DB2 UDB ( 我的OS为W2K,我下载的版本都是32Bit的)
        在9/17的随笔 DB2 UDB Ver 8.2 ( Stinger )中也有介绍,我们需要下载下面两个软件。
        
           ⑴ DB2 Personal Developers Edition for Windows
                  这也就是DB2 UDB 8.1.3,目前似乎以对该版本升级的形式提供,还没有直接提供8.2的下载。
                  需要注意的是如果没有注册过,下载前需要注册您的个人信息。
                  当打开下载页面后,选择DB2 Personal Edition V8.1 with FixPack 3 (32 Bit)。

           ⑵ V810 FixPak 7 for WINDOW 32-bit
                  DB2 UDB V8.2 ( Stinger ) 是按照FixPak 7提供的,选择DB2 Personal Edition下载即可。

    ⒉安装DB2 UDB 
        按照下载顺序安装,具体安装说明可以参看帮助文件。

    ⒊安装VS.NET Add-in
        如果在安装DB2前已经安装了VS.NET 2003,那么就没有必要自行安装。如果之后安装了VS.NET 2003,那么只要在没有VS.NET运行的前提下执行Program Files\IBM\SQLLIB\DB2VSRGX.BAT批处理文件即可。

    ⒋制作DB2 Database Project
        打开VS.NET 2003生成新的项目文件,项目文件的种类为IBM独自追加的DB2 Database Project。生成后还需要设置IBM Explorer,只要和安装的DB2的某个数据库连接即可。

    ⒌添加DB2 Class Library
        添加新项目时候选择VC# Project中选择DB2 Class Library,这样会自动生成DB2Class1.cs文件。

        文件内容( 该文件由 IBM DB2 UDB 8.2 的 VS2003 Addin 自动生成 )
using System;
using IBM.Data.DB2;

namespace StudyDB2ClassLibrary1
{
    
/// <summary>
    
/// Summary description for DB2Class1.
    
/// This class and method can be used as the basis for a DB2 CLR procedure.
    
/// For more information on creating and deploying DB2 CLR procedures visit:
    
///    http://www.ibm.com/software/data/developer
    
///
    
/// </summary>

    public class DB2Class1
    
{
        
public static void Procedure1(
            String        inParm1,
            
ref String    inoutParm2,
            
out String    outParm3)
        
{
            
// Create new command object from connection context
            DB2Command myCommand = DB2Context.GetCommand();

            
// TODO: Insert your code here

            outParm3 
= null;
            
// myCommand.CommandText = "SELECT FIRSTNME, MIDINIT, LASTNAME FROM EMPLOYEE";
            
// DB2DataReader myReader = myCommand.ExecuteReader();
            
// myReader.Close();
        }

    }

}

   
     有一些小小的感动,因为就这样简单,用它就可以做存储过程了。

    ⒍添加存储过程
       
先在IBM Explorer的Procedures上右击鼠标,添加CLR存储过程,这里只要按照对话框的提示添加即可。然后用鼠标右击DB2 Database Project项目文件,选择Assemblies,这样会有对话框出来,选择好DB2 Class Library生成的DLL,然后点击安装按钮即可。
        如果想要测试,在IBM Explorer上右击添加的过程就可以选择执行,进行测试。

# 在操作中,有很多奇怪的问题,如参数无法使用NULL,CLR存储过程中无法Commit等,
# 我想这些只是我还没有完全理解好,如果有正式使用DB2开发的机会,那个时候再慢慢的摸索吧。
posted @ 2004-09-27 10:26 Yu 阅读(1283) | 评论 (4)编辑

2004年9月24日 #

[2004/09/24]
    问题已经解决。
    原因是我没有再稍稍等一小会儿。


    今天发现新添加了个人的阅读排行榜功能,实在是辛苦辛苦。。。

    只是当我尝试在管理页面取消  [阅读排行榜]  表示时,发现似乎无法取消。
    虽然有确认过取消的操作的的确确被保存了,可是不知道别人那里是不是有同样的现象。
posted @ 2004-09-24 08:35 Yu 阅读(500) | 评论 (2)编辑

2004年9月22日 #

代码覆盖率工具    Clover.NET
http://www.cenqua.com/clover.net/

居然要250美元。。:< 正式开发的时候再说吧。

老铺Compuware的DevPartner Studio Professional Edition也有同样的功能,
要买的话,可能至少要1700美金。:<
我虽然没有用过,但是感觉肯定值。hoho。。
当然,要是真的买的话,我会先用DevPartner Profiler Community Edition爽爽的。

# 只是简单的看了看,NClover似乎还没有到达商业应用的水准。

posted @ 2004-09-22 10:32 Yu 阅读(739) | 评论 (0)编辑

2004年9月17日 #

刚刚看到了DB2 UDB Ver 8.2 ( Stinger )应该可以在今天下载,可是跑去看了看居然还没有。。。
仔细想了想,哦。。因为东方人是世界上起的早的人群。hoho。。

至于为什么期待它,主要也是.NET闹的,因为Stinger 可以用.NET语言写存储过程。
至今我还有些怀疑这个消息,实在是因为我弄不懂为什么DB2可以抢在SQL Server前面。

# 我是一个对商业软件的Beta版不感兴趣的人,别说SQL Server,
# 包括VS.NET 2005不过才Beta1,实在是没有去摸摸的想法。
# 毕竟我不是学生也不做软件评估更不做什么研究,只是要做我
# 自己能力范围内可以做到的坚实的商业软件。
# 所以比较起来这也是为什么对 Stinger 感到有兴趣的原因。

等他们的17号吧。睡觉。

先把地址写上。。。
http://www14.software.ibm.com/webapp/download/search.jsp?go=y&rs=db2pde&S_TACT=&S_CMP
=

[2004/09/18]
今天还没有。急!
[2004/09/21]
这几天不知道查了多少次,我还是歇一歇吧。hoho。。。
不知道是不是真的会让Oracle10g很不爽呢。。。我还是好想现在用一下。
[2004/09/24]
看样子是我比较笨,这里可以下载。。。
http://www-306.ibm.com/software/data/db2/udb/support/downloadv8.html#WIN-32
posted @ 2004-09-17 01:04 Yu 阅读(1052) | 评论 (0)编辑

2004年9月15日 #

  在读代码的时候有机会经常看到这样的书写方式。
 
ClassA cc = (ClassA)(new ClassB());
 
  如果是用惯C++的用户可能马上就会把心脏提到嗓子眼儿,这样的代码不会有危险吗?能确认这样的强制转换不会出现问题吗?
  让我们做一下测试就会发现,在C#中
    ClassA与ClassB没有任何继承关系的话,
       编译时能为我们抛出CS0030错误,编译都过不了的问题自然不用担心。
    ClassA与ClassB有继承关系的话,
       如果ClassA是父类那么一切正常,不会出现问题。
       如果ClassA是子类,当执行这条语句时会被抛出System.InvalidCastException异常。
 
  OK,C#真够健壮,毫无问题!
 
  于是应该可以得到这样的结论,C#语言的cast与C语言中的不同,从动作式样来看,它的内部实现了类似C++中的dynamic_cast。可以放宽心使用。
 
  在这个基础之上让我再延伸的讨论一下C#的cast。
 
  在调试程序的时候发生了System.InvalidCastException异常,发生异常的地方刚刚好是用cast的地方。
 
  这个时候有两种解决办法:
   一种是程序的错误。
   一种是没有做异常处理。
 
   如果是程序的错误,那么检测程序-->修改Bug-->重新测试-->...这个比较直接。
 
   可是在不得不处理这个异常的时候就有些让人不爽了,不的不处理这个异常代表这样一个客观事实。
   只有在程序跑起来的时候才能确定cast一个什么东西...
 
  解决办法:
 
   我在做些个人的小程序中曾经不止一次的try catch过;   不好。
   后来有看了一遍C#的语言手册,学会了用is先判断后执行;还成,有点儿性能问题。
     先问是ClassA吗?那么让你cast。
   后来有再看了一遍C#的语言手册,学会了用as代入;   我是满意了。
     不是ClassA的话我就不执行。
 
--
  这不仅包袱太小,还抻的太长,写到最后的时候我脸红了。
posted @ 2004-09-15 17:37 Yu 阅读(767) | 评论 (0)编辑

2004年9月11日 #

   在MFC中有这样一个类CWaitCursor。功能虽小,但是做UI的时候却是从来不会少用的。以至于用VC的时候会用自制的继承于CWaitCursor的CXXXWaitCursorEx类,用VB的时候,会自己做一个CWaitCursor,。。。。。。
   # 有关CWaitCursor的定义以及它本身的意义,如果您不清楚请参阅相关文档或者Google一下。
   # 应该很快就可以找到。

   到了.NET的时代,因为析构函数没有办法按照程序员的意愿在指定的时间发生,我似乎没有想的就在很早前否定了这个功能。其实在很早的时候也已经知道了Using这个东西,可惜事情没有经过大脑,只是想当然的,外加工作中也不用.NET,失之交臂。

   终于让我有机会在今天想起来这件事情,简单的做了一小段代码。
using System;
using System.Windows.Forms;

namespace Change.UI 
{
    
public class WaitCursor : System.IDisposable
    
{

        
private Form _target;
        
private bool _enabled;
        
private Cursor _cur;

        
public WaitCursor ( Form target )
        
{
            _target 
= target;
            _enabled 
= _target.Enabled;
            _cur 
= _target.Cursor;

            _target.Enabled 
= false;
            _target.Cursor 
= Cursors.WaitCursor;

        }


        
public void Dispose()
        
{
            
this.Release();
        }


        
private void Release()
        
{
            
if!(_target == null) )
            
{
                _target.Enabled 
= _enabled;
                _target.Cursor 
= _cur;
            }

        }

    }

}


使用方法:
        private void button1_Click(object sender, System.EventArgs e)
        
{
            
using(Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this))
            
{
                DateTime dt;
                dt 
= DateTime.Now;
                
while(true)
                
{
                    System.TimeSpan diff 
= DateTime.Now.Subtract(dt);
                    
if ( diff.Seconds > 3 )
                        
return;
                }

            }

        }


注: 至于为什么不用Sleep等待结束,只是因为自己想尝试用一下TimeSpan。

   上面的代码至少在我这里工作的还不错,但是有下面两个问题。
   1. 在微软中文新闻组的DotNet.VB组(?)中有过类似的提问及解答。
       问题:在设置Form的Enabled的时候,内部的控件也变灰了。
       解决:使用
                 [DllImport("User32.dll")]
                 public static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

  2.  在Form被禁止使用的时候点击Button,那么这个事件会被存在消息队列中。
       期望使用API可以解决这个问题,如果无法解决,不知道用.NET的方法要怎么样才能实时的响应该事件(也就是说让事件白发生?)

追记 [2004/09/16]

   如果利用上面的方法在Using Block中查错并对某Control设置焦点的话,会出现无法设置的情况。这点与VC中应该是一样的。作为解决办法一直以来我都是这样做的。
if ( XXXX == System.String.Empty )
{
    XXXX.Focus();
    
return;
}

using ( Change.UI.WaitCursor wc = new Change.UI.WaitCursor(this) )
{
    
}

posted @ 2004-09-11 16:56 Yu 阅读(1640) | 评论 (5)编辑

    今天有幸再次被自己对Excel的不了解给枪毙了。

    一直以来在用Excel做Sheet拷贝等操作时,都不会出现任何表示和印刷上的问题。这次的系统内有一个报表要用Excel来做。内部处理中有一个把报表雏形拷贝到数据Excel文件的操作。报表的雏形已经对各种设置进行了手工处理,特别是在印刷方面。
    在实际操作上出现了印刷出来的东西和雏形比起来整体缩小的现象。

    调查结果是没有设置数据Excel文件的标准Style。给制作报表人员的程序是很久以前我做过的某个系统的东西,估计那个时候我机器上Excel设置的标准Style为某字体的9。但是制作报表人员机器上的Excel标准Style为某字体的11。于是......

    以前做的系统都怎么样了?你们都还好吗?

    悲惨,下午要打打电话通知一下了。真没有想到这四五年前的Bug又出来了。

posted @ 2004-09-11 11:04 Yu 阅读(558) | 评论 (0)编辑