天空之城
new,think,program,happy to live
posts - 39,comments - 39,trackbacks - 0
                         蒋介石遇到孙中山

蒋介石去世后,不可避免的在天堂遇见了国父孙中山先生,壮志未酬身 先死的孙中山先生非常关心中华民国的状况,于是问老蒋:
「我死后中华民国有没有行宪啊?」

蒋介石马上回答:「有啊!有行宪,有行宪啦!」

孙中山又问:「那第一任总统是谁?」

蒋介石回答:「是我。」

孙中山心想还好,反正才做一任,又问:「那第二任呢?」

这时老蒋不太好意思说还是自己,可是又不太想说谎对不起国父,于是回答道:「于右任(余又任]」

孙中山高兴的说:「不错,不错,书法家当总统,文学治国,那第三任又是谁呢?」

蒋中正脑筋一转,机智地答:「吴三连(吾三连)」

孙:「嗯,舆论界有人出任总统,也好,那下一任又是谁?」

蒋:「赵元任(照原任)」

孙想了一想说道:「很好,语言学家当总统,那第五任呢?」

蒋:「是…是赵丽莲(照例连)」

孙中山开心的说:「太好了,连教育家也做总统了,那国家可真是越来越进步了,那第六任呢?」

「伍子胥(吾子续)」

这时,孙中山有点不解了,问道:「怎么春秋时代的古人也能跑来当总统了呢?」

老蒋只好不慌不忙的回答:「同名同姓」

听了国父若有所悟,愠中含笑的说:「该不会是林忆莲(您亦连)吧?」

老蒋尴尬假装耳背的说:「…是啊,俺也喜欢吴复连(吾复连)…」

国父听了,火了,怒道:「你乾脆改名叫『连……占』!」

老蒋也发火了 ,大声说:「 随便(水扁)啦…!」

posted @ 2006-04-13 23:53 太极虎~宏 阅读(326) | 评论 (0)编辑 收藏

中国的信息技术发展迅速,由它所带来的浪潮已经渗入到了人们生活的每一个角落,而程序员们成为了这场信息化浪潮的见证者之一,更是其中的主要参与者,这是时代赋予每个程序员的机会和责任。

  信息技术的更新速度是惊人的,程序员的职业生涯则是一个要求不断学习的过程,如何才能成为一名合格的程序员,一名合格的程序员需要掌握哪些技能呢?

  熟练掌握开发工具

  做为一名程序员至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C++和JAVA是重点推荐的开发工具,C/C++以其高效率和高度的灵活性成为开发工具中的利器,很多系统级的软件还是用C/C编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而JAVA即其相关的技术集JAVA One很可能会成为未来的主流开发工具之一。其次,能掌握一种简便的可视化开发工具,如VB,PowerBuilder,Delphi,C Builder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。另外,需要掌握基本的脚本语言,如shell,perl等,至少能读懂这些脚本代码。

  熟知数据库

  为什么数据库是如此重要?作为程序员,他们自然有自己的理由:很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的数据库操作方法。如果没有机会接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL, Postgres等。

  对操作系统有一定的了解

  当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。要想成为一个真正的编程高手,需要深入了解操作系统,了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统,是一个很好的学习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后,你会发现自己上了一个新的台阶。

  懂得网络协议TCP/IP

  在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式,从最早的客户/服务器结构,到今天的WEB Services,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,所以,深入掌握TCP/IP协议是非常必要的。至少,你需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。

  明白DCOM/CORBA/XML/WEB Services存在的意义

  随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的中间平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件,而是要理解这些技术的初衷,即为什么需要这项技术,如果你能理解了这一点,再回头看这些技术的具体实现,就如庖丁解牛,迎刃而解。XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布计算的基石之一。

  不要将软件工程与CMM分开

  现代大型软件系统的开发中,工程化的开发控制取代个人英雄主义,成为软件系统成功的保证,一个编程高手并不一定是一个优秀的程序员,一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合,编程只是软件生命周期中的其中一环,优秀的程序员应该掌握软件开发各个阶段的基本技能,如市场分析,可行性分析,需求分析,结构设计,详细设计,软件测试等。一句话可以概括我的看法:“创意无限,流程保证”。

  拥有强烈的好奇心

  什么才是一个程序员的终极武器呢,那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了,它是程序员们永攀高峰的源泉和动力所在。

  如果您正为如何成为一名合格的程序员而发愁的话,希望以上文字能为您排除一些顾虑和问题。如果您想获得更多有关程序员的信息,那么请随时关注天天招生网,我们将在最短的时间内提供最真实,最准确的相关信息。

posted @ 2006-04-11 13:23 太极虎~宏 阅读(128) | 评论 (1)编辑 收藏
……、《计算引论》、《C 程序设计语言》、《数据结构与算法》、《C++ 程序设计语言》、《软件工程》、《编译原理》、《代码大全(本书)》、《程序设计实践(Brian W. Kenighan)》、《人月神话》、《Rational Unified Process》、《设计模式》、……
posted @ 2006-04-11 13:18 太极虎~宏 阅读(199) | 评论 (1)编辑 收藏
多尔衮,努尔哈赤最宠爱的儿子,一生有众多机会去当“大清集团”的董事长——皇帝,但他还是放弃了当董事长的念头,甘心做一个CEO,一个优秀的CEO——“皇父摄政王”。

  强力整合

  16世纪末17世纪初,中原的“大明集团”气数已尽。

  而此时关外的“大清集团”在皇太极的带领下,已经占领了整个东北市场,并力图攻入山海关,打开整个中原市场。就在“大清集团”形势一片大好的情况下,集团董事长皇太极猝死在了办公桌前。多尔衮为避免自相残杀,接受“子承父业”这个中原传统观念,拥立皇太极幼子福临接任董事长,自己则甘当CEO———摄政王,统管集团各项事务。

  尽管多尔衮当上了CEO,且刚上任不久就干了件漂亮事:迅速打开山海关市场,并全面占有中国市场。然而他的地位并不是十分稳固。

  “大清集团”的成员几乎全是满人,在中原客户看来,他们对大清集团有很强的排外心理。“大清集团”员工从关外来到中原,对中原文化也很难接受。强烈的文化冲突使得业务很难开展。“大清集团”的男员工统一着深蓝色长袍,跟据职位性质(文职或武职)的不同及高低配不同的文武补子及顶戴花翎。同时头发前面一率剃光,后面编成一辫子。

  大胆变革

  多尔衮非常清楚,现在的“大清集团”跟在关外时情况完全不同,要想巩固全国市场,必须加大本土员工的力量。多尔衮接受了大学士范文程的建议,“以汉治汉”,很多前“大明集团”的管理层继续到“大清集团”担任要职。

  另一方面,满族人说满语,汉人说汉语,语言不通很不利于公司内部的沟通。多尔衮主动学习汉语和汉文化,影响集团内部其它成员,并将汉语当作“大清集团”的共同语。多尔衮的“以汉治汉”政策吸引了很多汉人才加盟“大清集团”,为刚起步的集团注入了新鲜的血液。

  入关后的“大清集团”亦不得不进行组织变革,以适应新的市场业务模式。多尔衮大胆改革,但为了使原“大清集团”高层不因组织变革带来的利益冲突影响工作,“八旗”事业部制继续保留,同时前“大明集团”的组织人员裁汰冗员,保留大一统的中央集权制,延续科举制选拔晋升员工。

  多尔衮在职期间,全面打开了中原的市场,正式把总部Office定址北京,大刀阔斧地进行了多项改革。可以说,多尔衮是个十分优秀的CEO!

posted @ 2006-04-10 13:18 太极虎~宏 阅读(74) | 评论 (1)编辑 收藏

我们生活在一个浮躁的年代里!

浮躁的社会,浮躁的企业,浮躁的人,浮躁的生活。

刚毕业找工作的阿飞浮躁地说:“现在的公司太过分了,聘人就要有工作经历,谁都不愿意出钱培训员工,又都想招好员工,难怪留不住人”。

才接到一份辞职申请的上官老板浮躁地说:“现在的年轻人也太过分了,到公司两年还没见给公司做出任何东西,学到东西就要跑了,难怪大家都不愿用新人”。 

“天下熙熙,皆为利来,天下攘攘,皆为利往”,区区蝇头小利尚且你争我夺,想不浮躁,谈何容易。

在浮躁的年代里,我们进取心太切,患得患失;虚荣心太强,战战兢兢。一心争强好胜,惟恐榜上无名。说起来夸夸其谈、头头是道,做起事来心中无数、手足无措。

在浮躁的年代里,我们哗众取宠,急功近利,惟名是图。于是我们盲目追赶朝流、投机取巧,不做实事、也做不出实事。

在浮躁的年代里,我们为达目的,不择手段。于是我们盗版,随意践踏别人的劳动成果,侵犯别人的知识产权。

在浮躁的年代里,我们随波逐流,没有主见,没有定力,人云亦云。于是我们只能整天围着Microsoft、IBM、SUN转圈。

因为我们浮躁,所以我们没有目标。

因为我们浮躁,所以我们没有发明C/C++、Java、Ruby,甚至面对Spring、Hibernate,我们也只有膜拜。

因为我们浮躁,所以我们做学问只得天天面对无趣的English,并美其名曰:“师夷长技以自夷”。

做官因为浮躁,所以成为庸官;做学问因为浮躁,所以一事无成;做人因为浮躁,所以为人浅薄。

在浮躁的年代里做学问难,做好学问更是难上加难!

posted @ 2006-04-10 13:09 太极虎~宏 阅读(96) | 评论 (2)编辑 收藏
 

工厂模式定义:提供创建对象的接口.
为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,
我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来
创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,
虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少
的修改量。

我们以类Sample为例, 如果我们要创建Sample的实例对象:
 Sample sample=new Sample();
可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如
赋值 查询数据库等。首先,我们想到的是,可以使用Sample的构造函数,这样
生成实例就写成:  Sample sample=new Sample(参数);
但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能
是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。
为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果
是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡
蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的
封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成
每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,
以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,
让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。
这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。
还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个
接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:
Sample mysample=new MySample();
Sample hissample=new HisSample();
随着项目的深入,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个
实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传
统程序中是无法避免的.
但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.
工厂方法
你会建立一个专门生产Sample实例的工厂:
public class Factory{
  public static Sample creator(int which){
  //getClass 产生Sample 一般可使用动态类装载装入类。
  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();
  }
}
那么在你的程序中,如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,
这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做
过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性
就越少.好象我们从编程序中也能悟出人生道理?呵呵.
使用工厂方法要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口
下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample。
进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类
concreteFactory了。
抽象工厂
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).
这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,
如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.
这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类
Sample2A和SampleB2,那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽
象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂:
public abstract class Factory{
  public abstract Sample creator();
  public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
  public Sample creator(){
    .........
    return new SampleA
  }
  public Sample2 creator(String name){
    .........
    return new Sample2A
  }
}
public class BombFactory extends Factory{
  public Sample creator(){
    ......
    return new SampleB
  }
  public Sample2 creator(String name){
    ......
    return new Sample2B
  }
}
从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我
不可以使用两个工厂方法来分别生产Sample和Sample2?
抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和生产
Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂
类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称
叫SimpleFactory。
在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,
举例
我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,
现在再讨论其工厂模式:
public abstract class ForumFactory {
  private static Object initLock = new Object();
  private static String className = "com.jivesoftware.forum.database.DbForumFactory";
  private static ForumFactory factory = null;
  public static ForumFactory getInstance(Authorization authorization) {
    //If no valid authorization passed in, return null.
    if (authorization == null) {
      return null;
    }
    //以下使用了Singleton 单态模式
    if (factory == null) {
      synchronized(initLock) {
        if (factory == null) {
            ......
          try {
              //动态转载类
              Class c = Class.forName(className);
              factory = (ForumFactory)c.newInstance();
          }
          catch (Exception e) {
              return null;
          }
        }
      }
    }

    //Now, 返回 proxy.用来限制授权对forum的访问
    return new ForumFactoryProxy(authorization, factory,
                    factory.getPermissions(authorization));
  }

  //真正创建forum的方法由继承forumfactory的子类去完成.
  public abstract Forum createForum(String name, String description)
  throws UnauthorizedException, ForumAlreadyExistsException;

  ....

}
因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:

private static String className = "com.jivesoftware.forum.database.DbForumFactory";

你可以使用自己开发的创建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.

在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果. 

看看Java宠物店中的CatalogDAOFactory:

public class CatalogDAOFactory {

  /**

  * 本方法制定一个特别的子类来实现DAO模式。
  * 具体子类定义是在J2EE的部署描述器中。
  */

  public static CatalogDAO getDAO() throws CatalogDAOSysException {

    CatalogDAO catDao = null;

    try {

      InitialContext ic = new InitialContext();
      //动态装入CATALOG_DAO_CLASS
      //可以定义自己的CATALOG_DAO_CLASS,从而在无需变更太多代码
      //的前提下,完成系统的巨大变更。

      String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);

      catDao = (CatalogDAO) Class.forName(className).newInstance();

    } catch (NamingException ne) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: NamingException while
          getting DAO type : \n" + ne.getMessage());

    } catch (Exception se) {

      throw new CatalogDAOSysException("
        CatalogDAOFactory.getDAO: Exception while getting
          DAO type : \n" + se.getMessage());

    }

    return catDao;

  }

}

CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类,这个实现子类在Java宠物店是用来操作catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自己的子类名给与CATALOG_DAO_CLASS变量就可以。

由此可见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化。

设计模式如何在具体项目中应用见《Java实用系统开发指南》

posted @ 2006-04-08 16:53 太极虎~宏 阅读(885) | 评论 (0)编辑 收藏
NET委托:一个C#睡前故事
英文版原作者:Chris Sells(www.sellsbrothers.com
翻译:袁晓辉(www.farproc.comhttp://blog.csdn.net/uoyevoli

紧耦合
从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用”(原文为:“typed reference” 也就是delegate??)“回调”他的老板来实现他的承诺,如下:
class Worker {
    public void Advise(Boss boss) { _boss = boss; }
    public void DoWork() {
        Console.WriteLine(“工作: 工作开始”);
        if( _boss != null ) _boss.WorkStarted();

        Console.WriteLine(“工作: 工作进行中”);
        if( _boss != null ) _boss.WorkProgressing();

        Console.WriteLine("“工作: 工作完成”");
        if( _boss != null ) {
            int grade = _boss.WorkCompleted();
            Console.WriteLine(“工人的工作得分=” + grade);
    }
}
private Boss _boss;
}

class Boss {
    public void WorkStarted() { /* 老板不关心。 */ }
    public void WorkProgressing() { /*老板不关心。 */ }
    public int WorkCompleted() {
        Console.WriteLine(“时间差不多!”);
        return 2; /* 总分为10 */
    }
}

class Universe {
    static void Main() {
        Worker peter = new Worker();
        Boss boss = new Boss();
        peter.Advise(boss);
        peter.DoWork();

        Console.WriteLine(“Main: 工人工作完成”);
        Console.ReadLine();
    }
}


接口

现在,彼得成了一个特殊的人,他不但能容忍吝啬的老板,而且和他周围的宇宙也有了密切的联系,以至于他认为宇宙对他的工作进度也感兴趣。不幸的是,他必须也给宇宙添加一个特殊的回调函数Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来,于是他决定把方法分离为一个接口:

interface IWorkerEvents {
    void WorkStarted();
    void WorkProgressing();
    int WorkCompleted();
}

class Worker {
    public void Advise(IWorkerEvents events) { _events = events; }
    public void DoWork() {
        Console.WriteLine(“工作: 工作开始”);
        if( _events != null ) _events.WorkStarted();

        Console.WriteLine(“工作: 工作进行中”);
        if(_events != null ) _events.WorkProgressing();

        Console.WriteLine("“工作: 工作完成”");
        if(_events != null ) {
            int grade = _events.WorkCompleted();

            Console.WriteLine(“工人的工作得分=” + grade);
            }
    }
    private IWorkerEvents _events;
}

class Boss : IWorkerEvents {
    public void WorkStarted() { /* 老板不关心。 */ }
    public void WorkProgressing() { /* 老板不关心。 */ }
    public int WorkCompleted() {
        Console.WriteLine(“时间差不多!”);
        return 3; /* 总分为10 */
    }
}


委托

不幸的是,每当彼得忙于通过接口的实现和老板交流时,就没有机会及时通知宇宙了。至少他应该忽略身在远方的老板的引用,好让其他实现了IWorkerEvents的对象得到他的工作报告。(”At least he'd abstracted the reference of his boss far away from him so that others who implemented the IWorkerEvents interface could be notified of his work progress” 原话如此,不理解到底是什么意思 )

他的老板还是抱怨得很厉害。“彼得!”他老板吼道,“你为什么在工作一开始和工作进行中都来烦我?!我不关心这些事件。你不但强迫我实现了这些方法,而且还在浪费我宝贵的工作时间来处理你的事件,特别是当我外出的时候更是如此!你能不能不再来烦我?”

于是,彼得意识到接口虽然在很多情况都很有用,但是当用作事件时,“粒度”不够好。他希望能够仅在别人想要时才通知他们,于是他决定把接口的方法分离为单独的委托,每个委托都像一个小的接口方法:

delegate void WorkStarted();
delegate void WorkProgressing();
delegate int WorkCompleted();

class Worker {
    public void DoWork() {
        Console.WriteLine(“工作: 工作开始”);
        if( started != null ) started();

        Console.WriteLine(“工作: 工作进行中”);
        if( progressing != null ) progressing();

        Console.WriteLine("“工作: 工作完成”");
        if( completed != null ) {
            int grade = completed();
            Console.WriteLine(“工人的工作得分=” + grade);
        }
    }
    public WorkStarted started;
    public WorkProgressing progressing;
    public WorkCompleted completed;
}

class Boss {
    public int WorkCompleted() {
    Console.WriteLine("Better...");
    return 4; /* 总分为10 */
}
}

class Universe {
    static void Main() {
        Worker peter = new Worker();
        Boss boss = new Boss();
        peter.completed = new WorkCompleted(boss.WorkCompleted);
        peter.DoWork();

        Console.WriteLine(“Main: 工人工作完成”);
        Console.ReadLine();
    }
}


静态监听者

这样,彼得不会再拿他老板不想要的事件来烦他老板了,但是他还没有把宇宙放到他的监听者列表中。因为宇宙是个包涵一切的实体,看来不适合使用实例方法的委托(想像一下,实例化一个“宇宙”要花费多少资源…..),于是彼得就需要能够对静态委托进行挂钩,委托对这一点支持得很好:

class Universe {
    static void WorkerStartedWork() {
        Console.WriteLine("Universe notices worker starting work");
    }

    static int WorkerCompletedWork() {
        Console.WriteLine("Universe pleased with worker's work");
        return 7;
    }

    static void Main() {
        Worker peter = new Worker();
        Boss boss = new Boss();
        peter.completed = new WorkCompleted(boss.WorkCompleted);
        peter.started = new WorkStarted(Universe.WorkerStartedWork);
        peter.completed = new WorkCompleted(Universe.WorkerCompletedWork);
        peter.DoWork();

        Console.WriteLine(“Main: 工人工作完成”);
        Console.ReadLine();
    }
}


事件

不幸的是,宇宙太忙了,也不习惯时刻关注它里面的个体,它可以用自己的委托替换了彼得老板的委托。这是把彼得的Worker类的的委托字段做成public的一个无意识的副作用。同样,如果彼得的老板不耐烦了,也可以决定自己来激发彼得的委托(真是一个粗鲁的老板):

// Peter's boss taking matters into his own hands
if( peter.completed != null ) peter.completed();
彼得不想让这些事发生,他意识到需要给每个委托提供“注册”和“反注册”功能,这样监听者就可以自己添加和移除委托,但同时又不能清空整个列表也不能随意激发彼得的事件了。彼得并没有来自己实现这些功能,相反,他使用了event关键字让C#编译器为他构建这些方法:

class Worker {
...
    public event WorkStarted started;
    public event WorkProgressing progressing;
    public event WorkCompleted completed;
}


彼得知道event关键字在委托的外边包装了一个property,仅让C#客户通过+= 和 -=操作符来添加和移除,强迫他的老板和宇宙正确地使用事件。

static void Main() {
    Worker peter = new Worker();
    Boss boss = new Boss();
    peter.completed += new WorkCompleted(boss.WorkCompleted);
    peter.started += new WorkStarted(Universe.WorkerStartedWork);
    peter.completed += new WorkCompleted(Universe.WorkerCompletedWork);
    peter.DoWork();

    Console.WriteLine(“Main: 工人工作完成”);
    Console.ReadLine();
}


“收获”所有结果

到这时,彼得终于可以送一口气了,他成功地满足了所有监听者的需求,同时避免了与特定实现的紧耦合。但是他注意到他的老板和宇宙都为它的工作打了分,但是他仅仅接收了一个分数。面对多个监听者,他想要“收获”所有的结果,于是他深入到代理里面,轮询监听者列表,手工一个个调用:

public void DoWork() {
    ...
    Console.WriteLine("“工作: 工作完成”");
    if( completed != null ) {
        foreach( WorkCompleted wc in completed.GetInvocationList() ) {
            int grade = wc();
            Console.WriteLine(“工人的工作得分=” + grade);
        }
    }
}


异步通知:激发 & 忘掉

同时,他的老板和宇宙还要忙于处理其他事情,也就是说他们给彼得打分所花费的事件变得非常长:

class Boss {
    public int WorkCompleted() {
        System.Threading.Thread.Sleep(3000);
        Console.WriteLine("Better..."); return 6; /* 总分为10 */
    }
}

class Universe {
    static int WorkerCompletedWork() {
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Universe is pleased with worker's work");
        return 7;
    }
    ...
}
很不幸,彼得每次通知一个监听者后必须等待它给自己打分,现在这些通知花费了他太多的工作事件。于是他决定忘掉分数,仅仅异步激发事件:

public void DoWork() {
    ...
    Console.WriteLine("“工作: 工作完成”");
    if( completed != null ) {
        foreach( WorkCompleted wc in completed.GetInvocationList() )
        {
            wc.BeginInvoke(null, null);
        }
    }
}


异步通知:轮询

这使得彼得可以通知他的监听者,然后立即返回工作,让进程的线程池来调用这些代理。随着时间的过去,彼得发现他丢失了他工作的反馈,他知道听取别人的赞扬和努力工作一样重要,于是他异步激发事件,但是周期性地轮询,取得可用的分数。

public void DoWork() {
    ...
    Console.WriteLine("“工作: 工作完成”");
    if( completed != null ) {
        foreach( WorkCompleted wc in completed.GetInvocationList() ) {
            IAsyncResult res = wc.BeginInvoke(null, null);
            while( !res.IsCompleted ) System.Threading.Thread.Sleep(1);
            int grade = wc.EndInvoke(res);
            Console.WriteLine(“工人的工作得分=” + grade);
        }
    }
}


异步通知:委托

不幸地,彼得有回到了一开始就想避免的情况中来,比如,老板站在背后盯着他工作。于是,他决定使用自己的委托作为他调用的异步委托完成的通知,让他自己立即回到工作,但是仍可以在别人给他的工作打分后得到通知:

    public void DoWork() {
        ...
        Console.WriteLine("“工作: 工作完成”");
        if( completed != null ) {
            foreach( WorkCompleted wc in completed.GetInvocationList() ) {
                wc.BeginInvoke(new AsyncCallback(WorkGraded), wc);
            }
        }
    }

    private void WorkGraded(IAsyncResult res) {
        WorkCompleted wc = (WorkCompleted)res.AsyncState;
        int grade = wc.EndInvoke(res);
        Console.WriteLine(“工人的工作得分=” + grade);
    }


宇宙中的幸福

彼得、他的老板和宇宙最终都满足了。彼得的老板和宇宙可以收到他们感兴趣的事件通知,减少了实现的负担和非必需的往返“差旅费”。彼得可以通知他们,而不管他们要花多长时间来从目的方法中返回,同时又可以异步地得到他的结果。彼得知道,这并不*十分*简单,因为当他异步激发事件时,方法要在另外一个线程中执行,彼得的目的方法完成的通知也是一样的道理。但是,迈克和彼得是好朋友,他很熟悉线程的事情,可以在这个领域提供指导。

 

他们永远幸福地生活下去……<完>

posted @ 2006-04-08 16:46 太极虎~宏 阅读(92) | 评论 (0)编辑 收藏
   程序员每天该做的事 
1、总结自己一天任务的完成情况 
最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 

2、考虑自己明天应该做的主要工作 
把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 

3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 
出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢 

4、考虑自己一天工作完成的质量和效率能否还能提高 
一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍 

5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 
闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示 

6、记住一位同事的名字及其特点 
你认识公司的所有同事吗?你了解他们吗? 

7、清理自己的代码 
今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗? 

8、清理自己的桌面 
当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净 

程序员每周该做的事 
1、向你的老板汇报一次工作 
让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定 

2、进行一次自我总结(非正式) 
这周之内自己表现得怎么样?该加分还是扣分? 

3、制定下周计划 
把下周要做的事情列出来,一样要分清楚优先级 

4、整理自己的文件夹、书柜和电脑文件 
把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉 

5、与一个非公司的朋友沟通 
它山之石,可以攻玉 

6、看一本杂志 
找一本适合自己的专业杂志 

7、纠正自己或同事一个细节上的不正确做法 
《细节决定成败》看过了吗?没看过强烈建议先看看 

程序员每月该做的事 
1、至少和一个同事一起吃饭或喝茶 
不光了解自己工作伙伴的工作,还要了解他们的生活 

2、自我考核一次 
相对正式地考核自己一下,你对得起这个月的工资吗? 

3、对你的同事考核一次 
你的同事表现怎么样?哪些人值得学习,哪些人需要帮助? 

3、制定下月的计划,确定下月的工作重点 

4、总结自己工作质量改进状况 
自己的质量提高了多少? 

5、有针对性地对一项工作指标做深入地分析并得出改进的方案 
可以是对自己的,也可以是对公司的,一定要深入地分析后拿出自己的观点来。要想在老板面前说得上话,做的成事,工作上功夫要做足。 

6、与老板沟通一次 
最好是面对面地沟通,好好表现一下自己,虚心听取老板的意见,更重要的是要了解老板当前关心的重点 

程序员每年该做的事 
1、年终总结 
每个公司都会做的事情,但你真正认真地总结过自己吗? 

2、兑现给自己、给家人的承诺 
给老婆、儿子的新年礼物买了没有?给自己的呢? 

3、下年度工作规划 
好好想想自己明年的发展目标,争取升职/加薪、跳槽还是自己出来干? 

4、掌握一项新技术 
至少是一项,作为程序员一年要是一项新技术都学不到手,那就一定会被淘汰。 
掌握可不是看本书就行的,要真正懂得应用,最好你能够写一篇教程发表到你的blog 

5、推出一种新产品 
可以是一个真正的产品,也可以只是一个类库,只要是你创造的东西就行,让别人使用它,也为世界作点贡献。当然如果真的很有价值,收点注册费也是应该的 

6、与父母团聚一次 
常回家看看,常回家看看 

posted @ 2006-04-08 16:12 太极虎~宏 阅读(105) | 评论 (0)编辑 收藏
1、接电话时对着话筒说:你好,主人不在家,这里是电话录音,当你听到biu~~的一声时,请留言。biu~~(打入者楞住了)biu~~biu~~(……)biu~~靠!我都biu~~了怎么还不留啊!


   2、接电话时说:对不起,您拨打的电话已关机或已离开服务区。

3、索性一接电话就发出 嘟嘟的声音。

   4、接电话时对着话筒发出贞子般的呼气声。

   5、接女生电话时说:王老五!拜托!装个娘娘腔我就听不出了吗?不要再骚扰我了,我正泡妞呢,再打过来小心我报警,告你打色情电话!

   6、接到电话时叽里呱啦说上几句外国话,让对方误以为打错了电话,不小心拨了个国际长途。

   7、接到电话时对着电话大笑几声,然后挂掉。

   8、接到电话和对方聊到一半时忽然说你中计了,这里是电话录音,刚才您说的不算,请在听到biu~~的一声后开始录音,biu~~

   9、接到电话后说你好,这里是宝丽金唱片公司,本公司正在招收歌手,请您听到biu~~的一声后演唱,谢谢!biu~~

   10、接到电话便说,不是我干的不是我干的!然后挂掉。

   11、最后一招最无聊,就是接到电话后打死也不吭声!

   补:听到“喂”的一声后对着听筒狂呼:

   “向我开炮,向我开炮。祖国会为我骄傲”然后挂断。

   一分钟后再接通刚才的电话:

   “飞是小李飞刀的飞,刀是小李飞刀的刀”语气要深沉。

  

   两天后你可以等到人民公安或精神病院的护理工
posted @ 2006-04-07 23:45 太极虎~宏 阅读(186) | 评论 (3)编辑 收藏

一艘没有航行目标的船,任何方向的风都是逆风

1、你为什么是穷人,第一点就是你没有立下成为富人的目标

2、你的人生核心目标是什么?

杰出人士与平庸之辈的根本差别并不是天赋、机遇,而在于有无目标。

3、起跑领先一步,人生领先一大步:成功从选定目标开始

4、贾金斯式的人永远不会成功

为什么大多数人没有成功?真正能完成自己计划的人只有5%,大多数人不是将自己的目标舍弃,就是沦为缺乏行动的空想

5、如果你想在35岁以前成功,你一定在25至30岁之间确立好你的人生目标

6、每日、每月、每年都要问自己:我是否达到了自己定下的目标

  二:两个成功基点

站好位置,调正心态,努力冲刺,35岁以前成功

(一)人生定位

1、人怕入错行:你的核心竞争力是什么?

2、成功者找方法,失败者找借口

3、从三百六十行中选择你的最爱

人人都可以创业,但却不是人人都能创业成功

4、寻找自己的黄金宝地

(二)永恒的真理:心态决定命运,35岁以前的心态决定你一生的命运

1、不满现状的人才能成为富翁

2、敢于梦想,勇于梦想,这个世界永远属于追梦的人

3、 35岁以前不要怕,35岁以后不要悔

4、出身贫民,并非一辈子是贫民,只要你永远保持那颗进取的心。中国成功人士大多来自小地方

5、做一个积极的思维者

6、不要败给悲观的自己

有的人比你富有一千倍,他们也会比你聪明一千倍么?不会,他们只是年轻时心气比你高一千倍。

人生的好多次失败,最后并不是败给别人,而是败给了悲观的自己。

7、成功者不过是爬起来比倒下去多一次

8、宁可去碰壁,也不要在家里面壁

克服你的失败、消极的心态

(1)找个地方喝点酒

(2)找个迪厅跳跳舞

(3)找帮朋友侃侃山

(4)积极行动起来

  三:三大技巧

1、管理时间:你的时间在哪里,你的成就就在哪里。

把一小时看成60分钟的人,比看作一小时的人多60倍

2、你不理财,财不理你

3、自我管理,游刃有余

(1)创业不怕本小,脑子一定要好

(2)可以开家特色店

(3)做别人不愿做的生意

  四:四项安身立命的理念

35岁以前一定要形成个人风格

1、做人优于做事

做事失败可以重来,做人失败却不能重来

(1)做人要讲义气

(2)永不气馁

2、豁达的男人有财运,豁达的女人有帮夫运

35岁以前搞定婚姻生活

3、忠诚的原则:35岁以前你还没有建立起忠诚美誉,这一缺点将要困扰你的一生

4、把小事做细,但不要耍小聪明

中国人想做大事的人太多,而愿把小事做完美的人太少

  五:五分运气

比尔·盖茨说:人生是不公平的,习惯去接受它吧

1、人生的确有很多运气的成人:谋事在人,成事在天:中国的古训说明各占一半

2、机会时常意外地降临,但属于那些不应决不放弃的人

3、抓住人生的每一次机会

机会就像一只小鸟,如果你不抓住,它就会飞得无影无踪

4、者早一步,愚者晚一步

  六:六项要求

1、智慧

(1)别人可你以拿走你的一切,但拿不走你的智慧

(2)巧妙运用自己的智慧

(3)智者与愚者的区别

2、勇气

(1)勇气的力量有时会让你成为“超人”

(2)敢于放弃,敢于“舍得”

3、培养自己的“领导才能、领袖气质”

(1)激情感染别人

(2)“三·七法则”实现领袖气质

(3)拍板决断能力

(4)人格魅力

4、创造性:不要做循规蹈矩的人

25-35岁是人生最有创造性的阶段,很多成功人士也都产生在这一阶段

5、明智

(1)知道自己的长处、短处,定向聚焦

(2)尽量在自己的熟悉的领域努力

6、持之以恒的行动力:在你选定行业坚持十年,你一定会成为大赢家

  七:七分学习

1、知识改变命运

2、35岁以前学会你行业中必要的一切知识

a)每天淘汰你自己

b)在商言商

3、太相信的书人,只能成为打工仔

4、思考、实践、再思考、再实践

  八:八分交际

朋友多了路好走
 
1、智商很重要,情商更重要:35岁以前建立起人际关系网

2、人脉即财脉:如何搞好人际关系

3、交友有原则

4、善于沟通:35岁以前要锻炼出自己的演讲才能

  九:九分习惯

习惯的力量是惊人的,35岁以前养成的习惯决定着你的成功的大小

1、积极思维的好习惯

2、养成高效工作的好习惯

(1)办公室

(2)生活可以不拘小节,但要把工作做细

(3)学习聆听,不打断别人说话

3、养成锻炼身体的好习惯

4、广泛爱好的好习惯

5、快速行动的好习惯

  十:十分自信

1、自信是成功的精神支柱

2、自信方能赢得别人的信任

3、把自信建立在创造价值的基础上

4、如何建立自信

(1)为自己确立目标

(2)发挥自己的长处

(3)做事要有计划

(4)做事不拖拉

(5)轻易不要放弃

(6)学会自我激励

(7)不要让自己成为别人

  十一: 11个需要避开的成功陷阱
 
1、只有功劳,没有苦劳

2、不要“怀才不遇“,而要寻找机遇

3、不要想发横财

4、不要为钱而工作,而让钱为你工作

5、盲目跟风,人云亦云,人做我也做

6、小富即安,不思进取,知足常乐

7、承认错误而非掩饰错误

8、脚踏实地而非想入非非

9、野心太大而不是信心十足

10、反复跳槽不可取

11、眼高手低

12、不择手段

  十二:十二分努力

没有人能随随便便成功

1、小不是成功,大不是成功,由小变大才是成功

2、中国社会进入微利时代:巧干+敢干+实干=成功

3、努力尝试就有成功的可能

4、做任何事情,尽最大努力

5、把事情当成事业来做

6、我看打工者

7、祝你早日掘到第一桶金来源:

posted @ 2006-04-06 23:29 太极虎~宏 阅读(152) | 评论 (1)编辑 收藏
仅列出标题
共4页: 1 2 3 4