2007年9月30日 星期日

[奇文]直銷雞八掌

※ [本文轉錄自 Gossiping 看板]

作者: blurry (半熟教師在東莞) 看板: Gossiping
標題: Re: [好奇] 有青森裡面那個台大人類休學的女生的八 …
時間: Sat Sep 29 01:08:01 2007

本文非八卦,
只是我之前被直銷人員婊到的舊文。

要揪戰直銷團的我可以給予心靈上的強大支持。

我這篇文章是來罵直銷從業人員的,從八個角度罵到爽歪歪。
而且完全是從以偏概全的角度,目的是一竿子打翻一船人。

我管你這鍋直銷粥是只有一顆老鼠屎還是三百顆老鼠屎,
反正我遇到一顆屎就罵一次,遇到一粒米還是會想辦法罵到屎。

如果你是直銷從業人員,那請先把文章看完,看看自己是不是屎。

不是,那恭喜你,你是一個好的直銷人員。
是,那拜託請你不要再汙辱直銷這兩個字了。

------------------------------
-正文開始------------------

1.工作機會

督嚕督嚕賭嚕督嚕督嚕賭嚕督嚕督嚕督大大大~~(手機響起)

「喂,鶧鳩喔,我A騙(讀音:ㄚ ㄆㄧㄢˋ)啦!
之前你不是說在找工作,我這裡有工作機會想介紹給你,
我們約明天在東區見面,下午三點在那個哪裡哪裡,明天見。」

「是喔,是什麼工作啊?」

「關於人際關係經營(或是電子商務)方面的啦,
明天見面再詳談,我請你吃頓飯啦,好久沒見面了就來聊聊天吧!」

沒錯,直銷雞八掌第一式就是在電話中,說有適合的工作機會要介紹給你。

如果你進一步發問,通常得到的都是人際關係經營、電子商務之類的答案。
要不就是用請你吃頓飯聊聊天,或是有重要的急事要找你商量等理由

掛電話速度之快,褲子還來不及脫就結束了,
連一點說不要不要不要停的妖閉空間都沒有,令人咋舌。


2.見面地點

直銷雞八掌第二式就是地點,
十之八九是麥當奴、肯塔基、頂姑姑之類的速食店。 選這些地方可不是沒有道理。

第一,狡兔有三窟,直銷公(或直銷婆)可要有三十窟。

一點約甲君在麥當奴,四點和乙君約在肯塔基,七點找丙君來去頂姑姑。
讓人感覺他很忙,其實不過就是在幾家鄰近的速食店轉來轉去,七姑姑苦。

速食店到處都是,又好找,不怕約到路癡浪費手機報路費。
下面音響,忠孝東路,四段,216巷,快到了,嗶。

第二,速食店是一般人都熟悉的地方,讓你輕鬆打扮,沒有面試壓力
避免你穿成套西裝附約,結果卻遇到老鼠國的聚會,不氣死才怪。

第三才是重點,說要請你吃飯,其實直銷公一點也不想花錢。

於是乎,請吃路邊的燒肉粽太奇怪,不好談事情。
咖啡廳又太貴,還是速食店最好,又可以久坐。


然而,重點中的重點是就是,約那種非職業球員用餐的業餘時間,
目的不是要叫社會人士棒球隊把職業球員棒球打爆,而是要你先吃飽

見面後不問你吃飽沒,他頂多請你喝杯可樂,在那個時間點完全名正言順。
甚至他會說他口不渴,只點一杯兩個人share,偏偏沒讓你喝幾口。


3.生涯規劃

直銷雞八掌第三式就是,不管坐下來先聊什麼話題,
我敢打賭,先問起工作機會的人一定是你。

「關於工作內容的問題我們等一下再談。
我先問你一個很重要的問題,我要看看你適不適合從事這個工作。

這個問題就是,你對工作有什麼樣的生涯規劃。
所謂的生涯規劃,不是你想在幾歲的時候年薪多少,賺到多少錢。

而是,我問你,你對工作的態度是什麼?你覺得賺錢的目的是什麼?
你選一份工作是看薪水、工作環境、同事關係、還是學習的潛力?
你的人生有沒有夢想?」

直銷公的問題排山倒海而來,如果你忘記此行的主要目的,
忘記你才是始發問者,而開始認真思考他所提出的問題時,你就中計了。



4.不會痛的

不管你的人生有什麼夢想,不管你對工作有什麼態度,
也不管你怎麼回答直銷公的問題,得到的回應永遠是千篇一律:

「沒錯,就是你,你實在太適合了,我覺得你很適合這份工作。」

這是直銷雞八掌的第四式,而且此招會在往後的談話中不斷出現。

譬如:

「我覺得我的個性比較內向,不擅長與人溝通,不想做直銷。」
「沒錯,就是你,你實在太適合了,我覺得你很適合這份工作。」

「我不想這麼快做決定,我想要多瞭解再考慮看看要不要做。」
「沒錯,就是你,你實在太適合了,我覺得你這種謹慎的心態很適合做直銷。」

「我的人生沒什麼夢想,只想找份穩定的工作就好。」
「沒錯,就是你,你實在太適合了,我覺得你這種想法很適合這份工作。」



5.公司介紹


從直銷雞八掌第五式開始,直銷公就會切入正題。

「沒錯,就是你,你實在太適合了,我覺得你很適合這份工作。
我們公司叫做阿麗,我告訴你,可能你覺得這是直銷,我告訴你並不是,
我們是所謂的多層次傳銷,直銷只是傳銷的一種,但完全不一樣。」

幹你娘勒!終於露出毛了齁!我管你是阿麗還是什麼維大力,
反正直銷就是直銷,不要把我騙來了,又說這份工作機會不是直銷。

「我跟你講,我們公司和其他公司不一樣,你聽我講完你就會知道。
我們的制度最公平,不像其他老鼠會,賺的是人頭的錢。
公司覺得錢不能只讓企業賺走,所以現在提供我們開店的機會。
你要知道,如果今天我們自己要開間店,要面臨很多問題。

第一,資本不夠;第二,風險性高;第三,產品不一定有市場;
第四,我們每個人都沒有當老闆的經驗,開店一定會賠。

可是公司現在提供你無風險的經營模式,可靠的產品,有制度的培訓
你一定覺得很奇怪,為什麼公司有錢不自己賺給我們賺,我告訴你,
這就是公司偉大的地方,公司願意給年輕人機會,而且不吝惜分享。

幹哩娘勒!直銷就是直銷,公司再怎麼好也是直銷。

直銷牽到北京也還是直銷,強暴犯陪受幹者聊天也還是強暴犯,
排骨飯加隻雞腿,頂多就叫做雞腿排骨飯,可是我沒吃過就是了。

如果你一開始就跟我說是直銷,我還不會那麼火。
現在繞了一大圈,還在那邊公司有多好,制度有多棒,產品有多好賣



6.交個朋友

一般人到第五式就已經聽不太下去,不悅之情多少都會寫在臉上。
直銷公也不是當假的,馬上就打出直銷雞八掌第六式,真是一波未平一波又起。

「我跟你說,今天找你來不是叫你一定要做,只是跟你分享我成功的心得。
你有沒有讀過論語?有沒有聽過好東西要跟好朋友分享?

願車、馬、衣、輕裘、妻子與朋友共,蔽之而無憾。

沒錯,今天找你來,只是想跟你交個朋友。我們不要談錢,談錢傷感情。
交朋友是不分時間地點不分公私的,我很想交你這個朋友,真的。」

幹林娘勒!一開始說要介紹工作機會,現在又改口說要交朋友,是想怎樣?
我跟你本來就是朋友,現在找我來談交朋友,那要不要一起去上雅虎交友?

朋友一生一起走,那些日子不再有,一句話一輩子,一生情一杯酒。

朋友,朋友,自從周華健唱過朋友之後,多少罪惡假朋友之名?

「我覺得你人很好,可是我只想跟你當朋友。」

「我不是要追你啦,我只想先跟妳當個朋友,好嗎?」

「我有個朋友(我不是我朋友><),他昨天不小心......(at笨版)」


甘寧娘勒!原來朋友的英文是「fuckable」,中文翻譯是能幹的。
能幹的,有兩解。一解是辦事能力很強,二且是可以用來推倒的。

媽的,那為什麼蔡依林、喬奶仁、吱吱玲、李嘉欣不和我當朋友?
我人那麼好,又這麼fuckable,為什麼impossible不是nothing?



7.老師的話

打出直銷雞八掌第六式後,不讓你喘息,直銷公又會拉回正題,
火力再度全開意圖對你徹底洗腦,讓你受不了疲勞轟炸跪地求饒。

所謂的老師的話,就是他會端出很多成功老師(就是前輩啦)的例子
直銷公的筆電或公文夾,永遠都會夾有老師們的照片,還會不小心掉出來讓你看到。

當然,更有辦法的直銷公,會把本尊不小心請來。

身邊突然坐下一個禿頭仔,哎唷鋒哥怎麼是你?
難怪剛剛感覺到一陣風生水起西裝革履,來來來介紹一下新朋友給你們互相認識。


「這是我們的翡翠級主任,他大三來做的,原本只是抱著做做看的心態。
沒想到他只用一年的時間就升上翡翠,現在27歲,一個月收入都有十幾萬。」

「這個是我們鑽石級老師,他現在在內湖買了兩間房子,年收入千萬
出門都開雙B名車(black & big),他才45歲,打破我們公司的紀錄。」

「喔這個,他家原本負債千萬,原本一無所有的他現在已經將負債還清,
明年打算在淡水買間房子,也要結婚了,我實在是非常佩服他。」

幹乳娘勒!講那麼多,要是他們的財產可以分我一半我就做,
不然不要那麼多廢話,我先回家跟我的經紀人以及律師談好條件再說

當然,直銷公到了雞八掌第七式打出來之後,已經不管被騙來的你有多不爽,
也不管賣當奴的客人有多少,嗓門全開,火力大放送,口水噴滿桌,

虎嘯風生龍吟雲萃,眼光炯炯有神,天大地大台科大。

「我問你,你的人生夢想是什麼?你這麼努力是為了什麼?
如果努力的目的是為了更努力,那你這麼努力是為了誰?錢都被老闆賺走了。」

「這麼好的機會不要再猶豫了,今天我們坐在這裡,是緣份,我加了緣份。

Come on let's go,囧囧!Come on let's go,Taiwan!ㄐㄩㄥˋㄐㄩㄥˋ~
Come on let's go,囧囧!Come on let's go,Taiwan!ㄐㄩㄥˋㄐㄩㄥˋ~

Go go go!Taiwan Go go go!」


駕馭汝娘勒!夠什麼夠,來是抗,去是夠,這我會不知道嗎?
不要當我是三歲小孩,我也是他媽人生父母養的。夠?大韓民夠啦!


8.七次機會


直銷公終於要打完收功了,沒收功之前不能罵髒話,
所以他還會把握最後機會,用直銷雞八掌第八式,也就是最後一式徹底擊潰你。

「這樣吧,正好晚上我們公司在這附近有場心得分享,要不要來聽聽看?
免費的,聽聽看不會少塊肉,就當作是個緣份,來交交朋友也好。

今晚請到的是王八老師,他平常人都在國外,難得他正好人在台北,
我講真的,這是個很不容易的機會,很多人搶著聽他演講都不一定聽的到。

而且,這種經驗分享,你只要花兩個小時,就能學到人家幾十年的東西,
再花兩個小時對你一點損失也沒有,時間就是金錢,一個晚上就讓你賺好多錢呢!」

幹你媽勒!騙了我一下午,還想再騙我一個晚上,你當我是沒出過社會是不是?

我告訴你,我一歲就會讀kk音標,三歲打破水缸救同伴,六歲到河邊看魚兒逆流而上,
九歲有強盜搶我家,我對強盜說「你四肢健全為什麼不回家種田」,就退敵了。

但是想要我再給你一次機會,想都別想。
什麼剛剛好今晚有心得分享,這也是直銷公的技倆吧。

「我今天找你出來,不是一定要你加入我們公司。
可是有件事情很重要,我一定要跟你講,就是每個人都要給自己七次機會。

你今天用了一次,但是你千萬不要馬上做決定,因為你還不夠瞭解。
如果你不夠瞭解就進來做,這樣會很辛苦,我也會覺得對不起你。」

幹你阿罵勒!我的臉上有寫著「來騙我吧」這四個字嗎?有嗎?有嗎?有嗎?
有的話我再考慮要不要去聽演講,沒有的話我要回家睡覺了,掰掰不聯絡。

什麼七次機會,是你說要給我工作機會我才來的,現在變成我要給你機會?

操,你去找個正妹給我七次機會,我就再給你一次機會,不然拉倒,免談。



結語


我不討厭直銷業,但某些直銷從業人員的說謊功力實在另我反感至極
做直銷不是原罪,但請不要汙辱這分職業。

完。

財經blog

以下是我常看的財經blog,不過很多都沒再更新了
http://blog.pixnet.net/ddk
http://www.wretch.cc/blog/onewidesky
http://www.wretch.cc/blog/Jacky1231
http://blog.pixnet.net/kinopio
http://tw.myblog.yahoo.com/richie-chen
http://tw.myblog.yahoo.com/rus_lee/
http://tw.myblog.yahoo.com/stock168-rain/
http://www.wretch.cc/blog/oolong1001
http://blog.cnyes.com/
http://www.wretch.cc/blog/alexlovesky
http://www.shukai.biz/
http://picardinvest.wordpress.com/

2007年9月28日 星期五

相依倒轉原則

from http://javaworld.com.tw/roller/page/qing/20070924

類別物件的產生(4)相依倒轉原則

在前文中,我們介紹了如何透過reflection的技巧來降低”Simple Factory Method”與它所產生之類別物件的相依性。在本文中,我們要轉向討論一個和產生物件息息相關的設計原則。

在 套用各式以工廠為中心的生成模式時,你會發現,基本上我們有一個重要的中心思想,就是隔離用戶端程式碼對實際類別的認識,我們只允許用戶端程式碼認識某個 介面,不允許它認識某個實際的類別。在之前的實例中,你應該會慢慢了解到當我們採用這樣子的設計方式時,我們的設計對於「變更」的抵抗力提昇了。

而這便是物件導向類別設計裡的一個重要的原則:相依倒轉原則(Dependency Inversion Principle ; DIP)。DIPRobert C. Martin所提出的一個重要的設計原則,這個設計原則有兩個核心:(1)高階模組不應相依於低階模組,二者皆應相依於抽象概念(2)抽象概念不應該相依於實作細目,實作細目應相依於抽象概念。

這個設計原則,其實本質上就是告訴我們,如果設計上非得存在相依關係時,那麼就相依在比較抽象的部份吧!為什麼要這麼做呢?在系統的設計中,愈是抽象的事物,被改變的機會就愈小。例如,我們把系統中的登入功能分成三個層次來探討:(a)系統提供認證使用者身份的功能(b)系統提供讓使用者輸入帳號及密碼來認證的功能(c)系統提供讓使用者輸入帳號及密碼以比對資料庫中的帳號資料來認證的功能。很容易便可以理解到,這分別是依照抽象程度的高低,由高至低排列下來,但可以說是在描述同一樣事。

立足在愈抽象的點來看系統的功能,就愈不會被可能的改變所影響。怎麼說呢?倘若上述的三個層次是系統目前設計的寫照,那麼最有可能被改變所波及的,正是抽象程度最低的(c)。因為我們的系統很有可能被要求要改採別的帳號資料來源來認證使用者,例如LDAP。儘管如此,在大多數的情況下,我們只會遇上(c)改變的情況,但比較不會遭遇到(b)必須要改變的情況,因為基於帳號和密碼的認證模式,是廣泛被採用的認證方式-姑且不論系統要到那邊對比對帳號和密碼。(b)比較不會需要改變的原因正是因為(b)的抽象程度比較高,它將比較具體的實作細目(也就是具體的帳號密碼來源)予以抽離,所以受到變動而影響的威脅就小的多了。不過,它的抽象程度終究不夠高,倘若有朝一日,這個系統被要求要使用IC卡來認證使用者時,建立在(b)之上的概念,就會被影響到,因為從(b)的角度來看,認證使用者的基準是一組帳號和密碼,但IC卡的認證模式卻非如此。但即使(b)被影響到了,但(a)仍是高枕無憂,因為就算是系統要改用IC卡來認證使用者,從(a)來看系統的觀點-系統提供認證使用者身份的功能,依然適用。這又再次的說明,愈是抽象的概念,愈不會被改變所影響。

讓我們回到DIPDIP告 訴我們如果非得存在相依關係時,選擇相依於較為抽象的部份,因為愈抽象愈不會被改變所影響,愈是抽象的部份,就愈會是系統中宏觀的部份。倘若我們讓抽象相 依於具象,便會因為具象的部份容易變動,引發抽象的部份也頻繁的跟著變動,這使得星星之火時常燎原,然後設計者就會像疲於奔命的救火隊一樣的四處救火。而DIP原則便希望設計者將錯誤設計中時常看到的抽象相依於具象的情況予以倒轉,讓抽象不再相依於具象。

前文我們已經寫過相依於具象的程式碼了:

LDAPAuthenticator authLDAP = new LDAPAuthenticator ();

authLDAP.authenticate(id, passowrd);

前文我們已經寫過相依於具象的程式碼了:

這段程式碼即為用戶端程式碼,它是系統中認證使用者的部份,當它直接寫下new LDAPAuthenticator ()時,這意指它認識了一個相當具象的類別(也就是在前段文中所提到的(c)的抽象層級上),所以它也相依於LDAPAuthenticator這個相當具象(因為它的抽象層級低)的類別之上。當這具象的事實有所變動(帳號密碼來源改變時),這段用戶端程式碼立即被影響到,使得它必須改變,例如改寫成以資料庫帳號密碼來認證:

DBAuthenticator authDB = new DBAuthenticator ();

fAuthResult = authDB.authenticate(id, passowrd);

在本文中已經提到:是抽象的概念,愈不會被改變所影響。相反的,愈是具象的事物,就愈會被改變所影響。當我們直接產生一個類別時,我們幾乎都相依於某個相當具象的事物(因為代表抽象觀念的介面及抽象類別是無法透過new語 法去產生其物件的),這是我們之所以要透過以工廠為中心的生成模式來產生物件實體的原因。當我們應用以工廠為中心的生成模式來產生物件實體時,用戶端程式 並不會碰觸到具象的部份,反而只會接觸到抽象的部份,因為它只會接觸到所有可能實際類別的共通介面,也就是產品介面,如此一來,便降低了相依於具象事物的 程度,達到了DIP希望我們依循的原則。

基本上,在程式中直接利用new語法來產生類別物件,其實就違反了DIP。因為直接產生類別物件的寫法,使得程式和具象類別有了相依性。因此,倘若要完全的遵守DIP,勢必得利用各種生成模式才有可能辦到,好比我們在本系列文中,使用”Simple Factory Method”來產生符合同一介面的各式具象類別的實體一樣。大量的採用生成模式會面臨實務上的考量,因為這使得系統在設計上,得為每種可能會採用到的類別,都套用生成模式。即使採用最簡單的”Simple Factory Method”,每需要產生一種具象的類別,就得為系統添加一個相對應的介面或抽類別,以及工廠類別或是method,這使得系統的類別數會大增,同時因為加上一層間接層,也提高了系統的複雜度。

實務上要完全遵守DIP,我覺得是有困難。DIP的 基礎假設是所有的具象類別都有可能會變化,因此才會希望程式碼相依於抽象的介面,而不要相依於會變化的具象類別。不過,這樣的假設並不一定符合我們所開發 之系統的實況。在設計時,不應該無條件的假設萬事萬物都會改變。倘若我們在設計的同時,對於系統未來可能的變化假設過了頭,想要提供無止盡的彈性及擴充 性,很容易會落入過度工程化(over engineering)的陷阱之中。對彈性及擴充性的假設,還是需要框在一個合理的範圍之中,至於多大的範圍算是合理的範圍,顯然是對設計者功力的考驗。

許多類別在系統中其實是保持相對穩定的狀態。這些類別可以被預期系統中不致於有什麼變化,這類的類別其實就算違反DIP去直接產生它們的物件,也不致於對系統產生什麼負面的效應。設計者應該關注的,是那些明知日後會變化或預期日後可能變動的類別。設計者在設計時,應該針對這類變化可能性高的類別,事先利用生成模式來封裝其產生的邏輯,將所產生的具象類別予以隱藏。

DIP是物件導向類別設計原則中和產生物件息息相關的一個。因為產生物件是使用物件的源頭,倘若在產生物件時便相依於具象,那麼便等於在源頭就製造了不正確的相依性方向。我們套用了適當的生成模式,便是在源頭處建立起正確的相依性方向。

除錯這回事(4/4)殺蟲

from http://javaworld.com.tw/roller/page/qing/20070905

很棒的一篇文章,或許IMMain該做個相依列表,因為我常常改出另一個bug出來。


除錯的工作中,找到臭蟲的真實所在,大概會佔去70%以上的時間。在之前的幾篇文章中,我們把主軸放在如何有效的搜尋出臭蟲的位置。而在本回中,我們則要討論在找到臭蟲之後,如何解決你所發覺的臭蟲。

相 較於在開發的過程中撰寫新的程式碼,除錯時需要撰寫的程式碼數量明顯少的多了。在大多數時候,我們僅僅只是改寫既有的程式碼,偶而會為了修正錯誤時添加新 的程式碼。但是,這並不意謂著修正錯誤需要投入的心力小於撰寫全新的程式碼,相反的,為了修正錯誤而對程式碼進行的調整工作,往往是最耗費心神的。

為什麼修正程式碼是最耗費心神的呢?事實上,軟體開發工作中,對既有的程式碼進行修正都是很危險的一件事,這當然包括因為除錯而對程式碼做的修改。無論是不是要除錯,程式員都應該懷著戒慎恐懼、如履薄冰的心情來看待對程式碼的修改,同時把它視為是一件很嚴重的事。

我 有位朋友,他所工作的公司,對於修正程式碼中的錯誤有一個特殊的規定,就是倘若因為錯誤而要修改某個既有系統的程式碼(即使只更動一行),必須協同三名相 關人員,舉行一次的會議討論,只有在所有與會人員都同意欲修改者所提出的修改方式,並且都在會議記錄上簽名同意後,修改者才能進行修改。

以上我所舉的例子固然是一個十分嚴謹的規範,在我們日常的開發生活中,多半不會遭遇到這種規定,但這個例子也突顯出,必須要十分慎重的對待修改程式碼這個動作。

為 什麼修正程式碼中的錯誤需要如此的慎重呢?這是因為軟體系統本身的高複雜度所導致的。軟體系統中的組成,往往有牽一髮而動全身的特性。很多程式碼之間的相 依性,是人腦所難以處理的。前些日子,我為某個系統加上了一個清理系統閒置資源的功能,這個功能乍看之下是一個相當獨立的功能,因為它只是在系統初始化 時,產生一個獨立的執行緒,並且定期的檢查是否有閒置過久的資源,倘若有便加以清除。可是,在加入這個功能後,我們卻發現,我們所有定期執行的工作(cron jobs)全部都沒有在完成工作後把行程終止掉,因此導致系統殘存一堆沒有被終止的行程。但我所做的修改看起來應該和這個問題沒有什麼相依性呀?問題出在那呢?我所加入執行緒的模組,也會被這些獨立執行的cron jobs所含入,因此,這些cron jobs在執行時,這個清理閒置資源的執行緒,也會被一併啟動。這個系統是用Java寫成的,JavaThread(執行緒)類別,有一個方法叫做setDaemon(boolean),可以用來設定某執行緒為daemon執行緒。而一個Java行程結束的條件是,當所有非daemon執行緒皆終止時,行程便會結束。對,看出問題在那了呢?我的清理閒置資源的執行緒並未被設為daemon執行緒,造成了即使cron job的工作都完成了,行程仍未自然終止。

在上面的這個例子中,我想表達的是,因為軟體系統的高度複雜性,即使程式員小心翼翼的進行修改,仍然有可能引發預期之外的行為,甚至造成嚴重的錯誤。而這類因為修改而造成預期之外的行為,在軟體開發中,我們時常把它稱為「副作用(side effect)」,而副作用正是修正錯誤時的最大敵人。

當 你費盡千辛萬苦,好不容易找到臭蟲的所在位置,也正確的分析出臭蟲的導因時,在動手修改之前,你得隨時將副作用的可怕之處牢記於心,隨時提醒自己不要冒然 的做出修正的決策。請你務必要仔細的評估所做的修改可能對整個系統造成的衝擊及影響,才進行修改。錯誤的修改方式,或許會解決眼前所遭遇的臭蟲,但卻可能 造成新的臭蟲,甚至是將原本就已經存在但未被發現的臭蟲給召喚出來。為什麼會召喚出早已存在的臭蟲呢?這多半都是因為你所除去的臭蟲遮掩了某些臭蟲,例如 因為某個臭蟲的關係,程式的執行永遠都不會經過某一條路徑,而這些寄生在這條路徑的臭蟲,也就一直都沒有被發現了。但是,當你除錯了這個臭蟲之後,程式的 執行便有機會走到這條臭蟲埋伏的路徑,對你而言,它們也就會突然的蹦現出來。

因此,關於修正臭蟲會有兩個議題需要討論:(1)如何防止副作用(2)如何檢查修正後的系統正確性。如何防止你所做的修改造成對系統的副作用呢?你可以從軟體的架構著手。好的軟體架構能夠降低系統中各模組之間的相依性,也同時降低每次修改程式碼對系統造成的衝擊。近年來,設計模式(designer patterns)已廣為軟體設計者採用,而許多設計模式的目標,便包括了「為了因應變更而做的設計(design for change)」。 想要避免日後修改容易引發副作用的局面,最好在架構設計時,便妥善的運用能降低軟體模組之間相依性及相關性的設計。另外,如果允許(時間及資源充足)的 話,可以在設計及開發的同時,建立各程式組件(例如類別)之間相依性的對照表,描述某個程式組件相依於那些組件。透過這種方式,你可以進行追溯的動作。以 下便是一個簡單的例子:

類別名稱

相依類別

WatchDog

Façade

ThreadPoolManager

Façade

SQLManager

DBAccessProxy

從這張表,我們可以建立起反向的追溯表:

類別名稱

受依類別

DBAccessProxy

Façade

SQLManager

Façade

Façade

WatchDog

ThreadPoolManager

WatchDog

有了反向的追溯表,當我們要修改任一個類別時,我們便可以透過這張表去追溯有那些類別可能會被影響到。當我們修改的是DBAccessProxy時,便知道Façade可能會被直接影響到,而且還有可能因為Façade被影響到,導致WatchDog也 被間接的波及。我們在設計或撰寫程式時,可以同時建立起正向的相依關係,接著再利用正向的相依關係,建立起反向的受依關係。有了這兩張追溯用的表格,對於 我們評估某個修改的動作,可能會對系統造成的衝擊是有幫助的,因為我們可以藉以了解這個修改的動作之影響所及,究竟包括那些類別,也有助於我們構畫出系統 大致的面貌。另一方面,當你的追溯表龐大而且相依關係交錯複雜時,代表你的系統也許存在著設計上的根本問題。此外,類別之間的相依關係,可以在設計階段建 立,也可以在程式撰寫的階段倚靠自動化的工具來進行。

你 可以透過好的架構設計,跟相依性評估,來降低修改錯誤所造成的副作用。但無論如何,進行修改之後,我們都需要進行測試。測試的目的有二:一是檢查所做的修 改是否的確修正了目標臭蟲,二則是檢查所做的修改是否不正確的改變了系統其餘部份原先就保有的正確行為。所以,除了針對臭蟲回報時所提供的操作情境,重新 複製產生臭蟲的方法,以檢查臭蟲是否已被消除之外,我們通常會花上更多的心力來檢查,系統其餘部份是否依然正確。此種類型的測試活動,一般我們稱之為「迴 歸測試(regression testing)」。迴歸測試的目的在於測試之前已經測試過的系統功能是否在系統變更之後,仍然能夠保有運作的正常。

近來單元測試(unit testing)的觀念已廣為接受。尤其像極限編程(eXtreme Programming)之類的開發方法流行之後,更有許多開發團隊接受在撰寫程式碼之前先行撰寫單元測試案例(test case)的觀念。如果單元測試的案例建立的足夠完整,那麼進行迴歸測試的成本也就可以降低,我們便可以對修正程式碼這項工作,擁有較高的信心。日後,我們會針對單元測試進行專門的探討。

透 過測試,我們可以檢視所做的修正是否解決臭蟲,也可以盡可能確保沒有引發系統的副作用,造成了意料之外的改變。最後,還有一個重要的原則要提醒,也就是一 次只解決一個臭蟲。當你解決一個臭蟲後,請務必把應該要執行的迴歸測試執行完畢,確保此次的修正是正確,而且沒有引發新的臭蟲。千萬不要為了節省迴歸測試 的時間,合併多個修正一起測試。這樣子偷懶的作法,會導致在迴歸測試的過程中所找到的問題,難以界定其真正的導因。除錯,需要有耐心。

2007年9月27日 星期四

台股投資戰略-謝金河20070926

摘要:全球股災後的新思維
1.最恐慌的風暴已經過去
剩下的是餘震,看看還有多少未爆地雷
全球資金有趨緊跡象,股市成交量萎縮
2.全球股市以美股馬首是瞻,美股漲跌掌控短期方向
3.中國崛起成了新主流
中國13億內需市場是新成長動力
奧運未來一年是新焦點
4.中國開放一般民眾資金到香港
再為香港添加新動力
台灣應努力加入搶錢行列
5.繼續觀察日圓走勢
日圓強升,全球股市有再探底壓力
6.台股月線KD指標交叉向下,整理期會拉長,三、四個月盤整恐難避免
7.半年報大揭露→上市公司表現比預期搶眼
把基本面擺中間,股價將進行大調整
傳產股驚奇多:一線大廠 +中國概念
台泥、亞泥、統一、大成、台塑五寶、台聚家族、永大、聚陽、東元、華城、亞崴、台橡、正新、建大、南帝化工、中鋼、東鋼、豐興、榮剛、大成、允強、唐榮
8.八月營收驚奇也多:
鴻海 1003.67億 +40.5%
華碩 418.9 +43%
廣達 730.4 +121.3%
仁寶 371.31 +45.9%
宏碁 294.29 +75.61%
緯創 200.52 +32%
9.金融股基期最低,選舉行情最大黑馬
10.不可不慎的員工分紅實質課稅殺傷力
IC設計股暴跌效應
跌深→強力反彈
達創的個案
07年上半年稅後盈餘 1241萬美元
依國際會計準則,提列員工分紅配股支出 1586萬美元
未計員工分紅純益 2827萬美元
EPS 0.0338美元→0.0148美元
股價跌破承銷價

2007年9月19日 星期三

10步驟,打造超人氣網路社群!

文/《經理人月刊》】

在Web2.0網路浪潮下,全球企業莫不投注心力在部落格、網路社群的經營,但要如何經營出超人氣的社群網站?

根據萊恩(Ryan)在〈建立網路社群〉(Building online communities)一文中提及,成功經營網路社群必須依循10個步驟:

步驟1:測試社群可行性

當你產生一個經營社群的想法時,為了能了解這個想法的方向是否正確,可以到網路上找一個已存在且成功經營的討論區、聊天室或布告欄,建立一個討論話題,來測試社群的想法是否可行。

步驟2:熱切歡迎造訪者

成立一個社群網站,就必須全心投入在這個群體中。一般而言,訪客都不喜歡自己一個人待在偌大的空間中,因此,當訪客一現身時,要立即去歡迎你的訪客,並引導他到一個有對話的團體中。

步驟3:使顧客自動上門

將成立社群的訊息告知你潛在的參與者,將能使得你的網站熱鬧地開張。雖然這種情況需要事前的規畫、資源與些許的創意,但是若能在產生一個新的社群前,製造一些吵嘈聲,將有助於吸引人潮聚集。

步驟4:激發社群討論

經營社群網站,適時激發討論,有助於人們的知識創造與分享。

步驟5:招募志願幫忙的人

經營社群並不是一個人或兩個人的工作,即使你不需要一天24小時的經營社群,但是經營社群比規畫社群需要更多的時間、精力與努力。因此,若能招募志願幫忙的人,可以讓社群經營得更熱絡。

步驟6:訂定遊戲規則

你想要經營哪一類型的社群?以可種對話方式呈現?期待何種社群氣氛?要鼓勵哪些互動行為?若希望社群未來的走向能朝向你期待的方式呈現,制定某些規範與遊戲規則絕對是必要的。

步驟7:屬於大家的社群

讓這個社群不僅是屬於你的,也同時讓它屬於所有參與的社群成員,才能讓社群日益成長。

步驟8:讓社群自成風格

在規畫社群時,也要同時保有那些有不同想法的聲音,如此才會使得大家想要進來社群看看不同的論調。

步驟9:謹慎地成長

在社群慢慢成長後,你便會開始需要資料庫工程師、軟體開發工程師、系統管理員等的協助。因此,在你盡力網羅不同的人才合作之際,其實也正在同時壯大你的社群成員。

步驟10:培養社群引導員

每周有新的主題是很重要的好方法,會使得人們一再回來這個社群。好的社群經營技巧包括產生合時的議題、引言一周的主題、問一些大家有興趣的話題等。

(取材自《解開KM成功密碼》,中國生產力中心出版。)