???????????????????????? 蔣介石遇到孫中山
蔣介石去世后,不可避免的在天堂遇見了國父孫中山先生,壯志未酬身 先死的孫中山先生非常關心中華民國的狀況,于是問老蔣:
「我死后中華民國有沒有行憲?。俊?br />
蔣介石馬上回答:「有??!有行憲,有行憲啦!」
孫中山又問:「那第一任總統是誰?」
蔣介石回答:「是我。」
孫中山心想還好,反正才做一任,又問:「那第二任呢?」
這時老蔣不太好意思說還是自己,可是又不太想說謊對不起國父,于是回答道:「于右任(余又任]」
孫中山高興的說:「不錯,不錯,書法家當總統,文學治國,那第三任又是誰呢?」
蔣中正腦筋一轉,機智地答:「吳三連(吾三連)」
孫:「嗯,輿論界有人出任總統,也好,那下一任又是誰?」
蔣:「趙元任(照原任)」
孫想了一想說道:「很好,語言學家當總統,那第五任呢?」
蔣:「是…是趙麗蓮(照例連)」
孫中山開心的說:「太好了,連教育家也做總統了,那國家可真是越來越進步了,那第六任呢?」
「伍子胥(吾子續)」
這時,孫中山有點不解了,問道:「怎么春秋時代的古人也能跑來當總統了呢?」
老蔣只好不慌不忙的回答:「同名同姓」
聽了國父若有所悟,慍中含笑的說:「該不會是林憶蓮(您亦連)吧?」
老蔣尷尬假裝耳背的說:「…是啊,俺也喜歡吳復連(吾復連)…」
國父聽了,火了,怒道:「你乾脆改名叫『連……占』!」
老蔣也發火了 ,大聲說:「 隨便(水扁)啦…!」
posted @
2006-04-13 23:53 太極虎~宏 閱讀(347) |
評論 (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 太極虎~宏 閱讀(134) |
評論 (1) |
編輯 收藏
……、《計算引論》、《C 程序設計語言》、《數據結構與算法》、《C++ 程序設計語言》、《軟件工程》、《編譯原理》、《代碼大全(本書)》、《程序設計實踐(Brian W. Kenighan)》、《人月神話》、《Rational Unified Process》、《設計模式》、……
posted @
2006-04-11 13:18 太極虎~宏 閱讀(206) |
評論 (1) |
編輯 收藏
多爾袞,努爾哈赤最寵愛的兒子,一生有眾多機會去當“大清集團”的董事長——皇帝,但他還是放棄了當董事長的念頭,甘心做一個CEO,一個優秀的CEO——“皇父攝政王”。
強力整合
16世紀末17世紀初,中原的“大明集團”氣數已盡。
而此時關外的“大清集團”在皇太極的帶領下,已經占領了整個東北市場,并力圖攻入山海關,打開整個中原市場。就在“大清集團”形勢一片大好的情況下,集團董事長皇太極猝死在了辦公桌前。多爾袞為避免自相殘殺,接受“子承父業”這個中原傳統觀念,擁立皇太極幼子福臨接任董事長,自己則甘當CEO———攝政王,統管集團各項事務。
盡管多爾袞當上了CEO,且剛上任不久就干了件漂亮事:迅速打開山海關市場,并全面占有中國市場。然而他的地位并不是十分穩固。
“大清集團”的成員幾乎全是滿人,在中原客戶看來,他們對大清集團有很強的排外心理?!按笄寮瘓F”員工從關外來到中原,對中原文化也很難接受。強烈的文化沖突使得業務很難開展?!按笄寮瘓F”的男員工統一著深藍色長袍,跟據職位性質(文職或武職)的不同及高低配不同的文武補子及頂戴花翎。同時頭發前面一率剃光,后面編成一辮子。
大膽變革
多爾袞非常清楚,現在的“大清集團”跟在關外時情況完全不同,要想鞏固全國市場,必須加大本土員工的力量。多爾袞接受了大學士范文程的建議,“以漢治漢”,很多前“大明集團”的管理層繼續到“大清集團”擔任要職。
另一方面,滿族人說滿語,漢人說漢語,語言不通很不利于公司內部的溝通。多爾袞主動學習漢語和漢文化,影響集團內部其它成員,并將漢語當作“大清集團”的共同語。多爾袞的“以漢治漢”政策吸引了很多漢人才加盟“大清集團”,為剛起步的集團注入了新鮮的血液。
入關后的“大清集團”亦不得不進行組織變革,以適應新的市場業務模式。多爾袞大膽改革,但為了使原“大清集團”高層不因組織變革帶來的利益沖突影響工作,“八旗”事業部制繼續保留,同時前“大明集團”的組織人員裁汰冗員,保留大一統的中央集權制,延續科舉制選拔晉升員工。
多爾袞在職期間,全面打開了中原的市場,正式把總部Office定址北京,大刀闊斧地進行了多項改革??梢哉f,多爾袞是個十分優秀的CEO!
posted @
2006-04-10 13:18 太極虎~宏 閱讀(85) |
評論 (1) |
編輯 收藏
我們生活在一個浮躁的年代里!
浮躁的社會,浮躁的企業,浮躁的人,浮躁的生活。
剛畢業找工作的阿飛浮躁地說:“現在的公司太過分了,聘人就要有工作經歷,誰都不愿意出錢培訓員工,又都想招好員工,難怪留不住人”。
才接到一份辭職申請的上官老板浮躁地說:“現在的年輕人也太過分了,到公司兩年還沒見給公司做出任何東西,學到東西就要跑了,難怪大家都不愿用新人”。?
“天下熙熙,皆為利來,天下攘攘,皆為利往”,區區蠅頭小利尚且你爭我奪,想不浮躁,談何容易。
在浮躁的年代里,我們進取心太切,患得患失;虛榮心太強,戰戰兢兢。一心爭強好勝,惟恐榜上無名。說起來夸夸其談、頭頭是道,做起事來心中無數、手足無措。
在浮躁的年代里,我們嘩眾取寵,急功近利,惟名是圖。于是我們盲目追趕朝流、投機取巧,不做實事、也做不出實事。
在浮躁的年代里,我們為達目的,不擇手段。于是我們盜版,隨意踐踏別人的勞動成果,侵犯別人的知識產權。
在浮躁的年代里,我們隨波逐流,沒有主見,沒有定力,人云亦云。于是我們只能整天圍著Microsoft、IBM、SUN轉圈。
因為我們浮躁,所以我們沒有目標。
因為我們浮躁,所以我們沒有發明C/C++、Java、Ruby,甚至面對Spring、Hibernate,我們也只有膜拜。
因為我們浮躁,所以我們做學問只得天天面對無趣的English,并美其名曰:“師夷長技以自夷”。
做官因為浮躁,所以成為庸官;做學問因為浮躁,所以一事無成;做人因為浮躁,所以為人淺薄。
在浮躁的年代里做學問難,做好學問更是難上加難!
posted @
2006-04-10 13:09 太極虎~宏 閱讀(106) |
評論 (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 太極虎~宏 閱讀(892) |
評論 (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 太極虎~宏 閱讀(101) |
評論 (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 太極虎~宏 閱讀(112) |
評論 (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 太極虎~宏 閱讀(201) |
評論 (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 太極虎~宏 閱讀(165) |
評論 (1) |
編輯 收藏