2008年12月25日 星期四

S25 理想元件結構的自動化產出

我最終的理想是將所有產出的程式碼視為一種Model,用方法論約束以形成為固定類型的結構,再撰寫(或找到適合的)應用工具導出到各種方向的結果。這裡記錄的是自己現在認為“應該且可以”具有與可以實現的同步轉出功能。

分析的最小單位應該是Method。每個Method在以規定的方法撰寫並註記合格的註解時,就可以將所有Method視為能用同樣方式存取的Model,依其特性與原則必定可以設計出工具程式自動取得以下的資訊:

◎所有的傳入參數
◎所有的傳回可能值
◎所有的使用資料、參數(常數)與例外
◎所有的方法呼叫(包括同一個Class與其他的)
◎所有使用常數與呼叫方法所屬的Class(使用關聯)
◎使用XML定義流程處理、依設定檔deploy出攤平的程式碼(執行速度變慢才會做)
◎程式的完整流程(搭配輸出工具可以產出流程圖)
◎所有判斷指令內依賴的條件清單(每個條件都附上所有可能的傳回值)
◎所有的變更歷史清單(包含日期)與改變的程式
◎Commit時產生所有需要填寫的變更註解


Method是最基本的單位,往上推展依序是Class、Component Package、Package……到最後就會達到Use Case Package。從最底層精確地產出每一個單位的完整記錄,往上產出時就能拿到百分之百正確的資訊,到最後產生一個關聯與影響的龐大結構,我們可以選取任一個方法作為起點,就可以拿到自己使用到哪些方法(與所屬Class)與哪些方法使用自己完整追溯結果。其實還不只如此,我們甚至可以在任何一個指定層次取得之下的所有資訊匯整出文件。

一直以來額外花時間製作程式文件與修改後同步文件的工作都是程式開發者頭痛的問題,多花一倍時間把原來設計程式時的想法再寫一次,文件或程式修改後還得要同步另一份的資訊。文件與程式相互依賴的關係是如此之多,只要有任何一個沒有更新為對的資訊就會造成兩者各做各的,完全失去原有的意義。

“完整規定程式設計產出的結構、要求在該寫註解的地方填上必要資料“,這是我想做出來的程式設計方法論!

2008年12月24日 星期三

S24 沒人想做的事裡有值得學習的道理

進社會找到了第一份工作,當時使用的作業系統與程式語言是全國唯一使用的,基於自身經驗不足想說有個穩定的工作再說。公司接著陸續應徵了許多人要做與我相同的工作,但是大部份的人在發現使用的是這種冷門技術後都很快消失,很快地除了主管之外就屬我最資深。

公司是製作電話語音系統的,在第一年裡我慢慢摸索後建立了一些好用的函式庫,第二年主管將我調到連線的部門去學習撰寫Gateway的技術。工作了兩年多後因故離開那間公司,在新公司裡綜合了前面兩年的經驗,以不同的作業系統與程式語言用相同的概念製作了另一個語音傳真系統。

2006年主管推派我當公司的福委,在幹部選舉的會議裡被拱為主委,起初對這種吃力不討好的職務頗為反感,不過從另一個角度發現有人出錢讓自己模擬公司的運作也是不錯的事。經歷幾個事件後倒也瞭解了行事曆、事件流程與資源規畫的道理,反而在OO的分析方面有了不同的體認。

同年公司製作的自有平台產品後續需要有人維護,在所有能夠接手的人選裡由於我之前沒有在專案裡奮鬥,因此選擇了我。接到問題後想辦法重現、確認問題發生處、無法解決的、詢問原作者、修改後程式比對、確認並撰寫影響報告、另外加上補齊一些需要的文件,這些事情其實都是工程師們很不願意做的事情。

這段時間其實做得很痛苦,因為要在說明極少的情況下去看懂沒有任何一行是自己所寫的系統,任誰都沒法輕鬆愉快的,但是我卻在不知不覺中累積下不同的經驗。做一個動作時去明白為什麼要做、做的時候缺乏什麼資訊、那些資訊可以在什麼時候由什麼人產出、動作做完之後可能產生什麼影響、影響的範圍在哪裡,腦中累積很多很多之後就開始思索要怎麼做才能改善現有的狀況,有了初步想法之後就開始在這個部落格裡記錄。

2008年12月23日 星期二

S23 專案問題產生原因之可能破解

專案時程給得過於緊迫會有這幾個後遺症:功能急著想完成忽略所有可能的例外、SA與SD收集分解動作的不完全、動作難以抽取或分派形成過多的重覆程式碼,最終造成難以調整的複雜結構。根據以上問題我採用的應對方式是從後面開始解決起。

首先是適合調整的軟體架構,依之前提到的軟體結構設計出放置程式的Class,確保每一個分解動作的程式都是分離且容易移動的。其次是找出適合SA與SD使用的工具軟體,在分析設計每一個Use Case的同時還能以整個系統的角度來思考與放置。最後則是具有大量元件的函式庫,分析設計出來的分解動作在以前若已經依理想的方式包裝成元件,那麼應該有理想的解法同時包覆著許多例外狀況的處理而能夠直接引用,考慮的重心就可以移到多個Use Case共用時產生的各種條件變化。

公司在數個專案間有共用的Jar File,在其中一個專案上線後根據其他專案遇到的問題陸續修改了其中一個。後來在上線專案那邊找到同一個Jar File的重大改變,但是我只敢改在原來的檔案裡而無法直接更新為最新的版本,因為我無法保證沒有side effect。主管說多測試後就可以用,我回答說就算投入一百個人測試,只要沒測到全部的流程就有可能出事,全部的流程卻又是眼前無法提供出來的。

就像以前提到的紅豆與綠豆的例子,在不分類的狀況下全丟在一起是很快完成的,但是未來遇到想分開的情況時會花更多時間。剛開始只求功能的完成,只要豆子的總數對怎麼放都無謂,但是在專案到尾聲時任何一個變動都可能牽一髮而動全身;如何拿出可以掌握任何改變的關聯與影響的追溯結果,正是維持品質的關鍵因素。

2008年12月22日 星期一

S22 專案的痛苦在投入時間的不足

常聽人說專案給的時間都很緊迫所以沒法把設計作好,有次我就反問同事說如果現在有個專案給的時間非常充足,那會怎麼做來作好設計呢?他想了一下暫時沒有答案,不過我倒開始思考壓迫時程之後會造成設計上的什麼問題。

兩點之間最短的距離是一直線,完成功能最快的方式就是只直接寫出達成所需的全部動作,其他狀況就依經驗想得到的就做,所以此時完成的程式根本只夠做出達到目標的動作,沒空細想可能的變化。這樣先天不足的設計,若加上寫的人想偷懶只先寫一部分其他等測到再寫的後天不良,在動作層次不分、判斷條件不足的情況下如果測得出來問題就算幸運,沒測出來等客戶測到或是上線才爆發,那可只有一個慘字能形容。

客戶需求變更的管理是讓系統穩定的因素,但是時程過趕的狀況下,SA與SD沒有完全收集到Use Case應做的全部動作,未來發現缺少動作時就得再補上。一般無關緊要的動作直接補就沒事還沒話說,就怕缺少有關鍵性影響的動作與根據之前資訊所作的設計有所衝突,此時每加上一個就像一次重大的需求變更(或是需要抽取與分派的狀況卻無法重構而硬塞許多重覆的程式碼)。在這種狀況下作出來的設計怎麼可能有穩定的品質呢?

有次與總經理談話的時候他說:管理階層解決問題才是眼前重要的事。但是眼前的問題卻是之前專案模式所殘留下來的後遺症,再加上人設計程式時被測試抓到一項才承認一項的惰性,因而形成令人詬病的品質問題,到頭來需要投入更多額外的人力去找出問題。麻煩的是找到問題後即使知道怎麼改也會擔心影響其他大部分已經正常的功能而無法從根本改起,進而造就疊床架屋式的結構。

2008年12月21日 星期日

S21 做人的方法(15)──有關聯必有影響

物與物之間都是單獨的個體,初始時相互之間是沒有關聯的;物之間的關聯可以想作為有事發生才讓彼此產生關聯、互有影響。兩個物之間可以建立的關聯種類要看兩者之間能夠發生哪些事件來決定。人與人之間會有下面幾個事件與關聯的發生:生育(父子)、交往(情侶)、結婚(配偶)、看不順眼(仇家)、認同(朋友)……等等。

清楚與其他人與物之間的關聯、用對的態度面對接觸到的所有人與物是保持和諧的基礎。用錯誤的態度強欲建立起不自然的關係、在不應該做的時候依舊做了某件事、在該做某件事的時候沒做或未做好,就會使得事物之間的關聯失序而形成混亂。像是偷摘公園裡的花朵、將垃圾隨意丟棄、遇到親友視而不見……。

單純的事件失序時不見得會出問題,在很多時候問題都在於環環相扣的事件影響,像滾雪球般地造成連瑣效應而無可挽回。社會新聞裡偶而會看見原本兩個人在路上擦肩而過,因互看不順眼互罵進而互毆,甚至打電話邀集人馬示威,最後由於支援的朋友裡有人不慎擦槍走火而致人於死。觀看這類事件時人們難免會想:如果一開始擦撞時能夠忍一口氣的話就不會有這種後果。

任何的果都有因,從眼前的果探究形成的原因比較容易,但是在因一呈現時就能分析其利弊與影響而找出最理想作法的話,很多後來的事都可以消弭於無形。人生的經驗就在於收集世界上人事物的因果關係資訊,當某個人事物出現在眼前時,快速地分析不同的處理場景會造成哪些不同的結果影響,再從中抉擇出最有利於自己(有能力的話要同時有利於別人)的作法。

平時大量地收集資訊、條理化儲存資訊建立腦中的資料庫,遇到事件時快速分析並列舉出關聯資訊,最後判斷出一個結果最優化的決策。無論在什麼樣的場景,這個簡單的道理卻適用在整個人生。

2008年12月20日 星期六

S20 只要……就好了?!

這句話如果成立那真的很好,但是說這句話的時候到底是否評估過真正的關聯與影響?或者評估的內容有誤差?抑或僅是安慰可能受傷害的一方?就真的得審慎判斷了。

學生時代時若有同學請你抽煙同時還說:擔心什麼,只要不被教官看到就好了。半夜搭計程車闖了紅燈,司機說:半夜沒有人車,只要沒有警察就沒關係。若以會不會抓到角度看待自己所做的事情,社會秩序就會永遠這麼混亂,個人的生活同樣也會雜亂無章。

公司在其他客戶那邊有前一代的產品,客戶一直希望可以升級到現在的產品,但是由於在設計上的變更而無法直接相容升級。為了符合客戶的期待,有人提出一個簡單的方式:比對兩種產品,把相同的抽取出來放在一起,不相同的整理出相容的界面提出,然後不同的實作各自放在不同的地方,只要依此原則弄成三個專案就可以符合客戶需要。

主管問我的意見時我說:要滿足客戶的需求這樣最快沒錯,但是未來程式有變動時就很慘。一個改變要先研究出應該放在哪裡、程式改好後放回去可能得測試三遍、版本變更清單也要分三處處理,如果提出這種作法的人願意來做維護我就沒話說,我是絕對不接手這種東西的。主管說會再考慮看看,不過後來客戶也沒接受這種作法;一旦設計沒法相容在一起,幾乎是沒可能再合併的。

這個句型在顧前不顧後的案例發生時,至少還可以滿足眼前的需要;有時一聽就感覺有漏洞存在時才更令人無力,那時都會直接反問要是狀況之外的例外發生時該怎麼辦?想要能夠提出“只要……就好了”的說法,務必要對問題的所有發生條件與關聯影響都胸有成竹後再講出來,如此方能應付所有提問的可能狀況不致漏洞百出。

2008年12月19日 星期五

S19 讓流程中蘊藏彈性的思考

即使在軟體架構上使用了最靈活的設計,但是由於架構僅是靜態佈置的框架,實作的功能劇本仍然靠流程設計來達成;功能流程的設計的正確性與成熟度就得看是誰來設計的。如果動態的流程設計僵化而難以變動,不管放到多麼有彈性的軟體結構裡都完全不會有絲毫改善。

在流程設計過程中面對所有的動作時,可以思考是否符合這幾個原則:

整合與拆解:做一件事所需的動作拆解的步驟單位大小。切得太大步驟難以再細分、切得太小控制會太瑣碎,最理想的還是依現有層級的最適大小。分解步驟的恰當將會使得流程更容易設計,較不容易有盲點,也容易作不同方式的組合。

抽取與分派:某些不適合自己處理的步驟交由其他負責單位進行,將工作分派出去會讓自身的工作內容單純易管理;不過遇到別人的工作內容與自身的類似時就要考慮將工作抽取到同一個地方進行,以免造成多頭馬車的現象。

單一與重覆:一件事即使可以處理妥當,有時會需要處理集合內的多數相同事情;相對地也有可能將循環處理的事切分出可以單獨來做的。設計時若遇到有迴圈的地方,都盡可能把迴圈中的動作拉出為可以獨立呼叫的方法。

拆解與變動基本有三種不同的方向,但是其根本的原則還是在於把過程分解為一個個獨立無依賴關係的分解動作,再將各個動作放置到它應該存在的結構位置。只是憑個人去設計所有流程動作總會存在死角,藉由其他人的review與回饋才更能補齊各種可能的思緒。

2008年12月18日 星期四

S18 Review──問題來自過於相信自己

之前支援的專案在十一月下旬出了嚴重問題:執行交易後會保持交易執行中的狀態,無法恢復為等待執行。一開始沒有頭緒,花了很多時間後確認是UI被卡住,又再花了很多時間才知道是自己之前寫的一個API裡發生了無法離開的while迴圈。

那個API原來的用途是找出輸入元件前或後的下一個可輸入元件,尋找的流程是遇到下一個可輸入元件就傳回。設計之初認為再怎麼樣循環找回到自己一定會有結束,經過幾個月來的使用也沒有問題,卻沒想到在特別的操作狀況下會有欄位全部變成不能輸入的狀況,因此造成跑不出來的無窮迴圈,加上在AWT Event執行緒呼叫而使得其後排隊的UI動作全部不會運作。

檢討的最後客戶詢問我們:系統陸續出現這麼多問題的根本原因是什麼?我依據這次問題的經驗回答道:是因為對自己設計的執行流程過於自信。根據提出需求規格的人撰寫對應的方法時,依分解動作堆疊的同時心裡在意的是完成功能,相對於例外的處理則以自己的思維加以管控;然而例外的形成組合種類卻不是一時間可以完整條列的,因而寫出的程式邏輯間就形成潛在的漏洞。

程式能不能完成功能只是找出一條可以走到目的地的路,但是如何在動作的順序間條列出所有可能造成例外的情況,卻得一步一步審慎思考才有機會列舉更多。一個人思考或許列出95%以上,但是只要出現沒想到的狀況,整個系統就可能爆發出嚴重的問題,因此至少需要再有其他人的Review來儘可能協助補齊邏輯上的漏洞。其重要性比起找出程式更理想的寫法真的是大多了。

為人處世時亦是如此,光憑自己的直覺反應可能會太過衝動、粗心或鑽牛角尖,縱使三思過後也可能因為個人特性依然存在著盲點。在重大決定前與親朋好友稍作討論,取聽其他人的不同意見加以綜合應能找出一條更好的路。這幾年在想不透的人生問題上有這樣的朋友可以聽取我的疑問,提供我適切的回答,雖然說最後還是要自己想通才會有改變,但是有其他人幫忙檢視總是提供了更全面的資訊。

2008年12月17日 星期三

S17 做事的方法(15)──適當時機下的適當反應

人與人之間的關係是一種關聯,在發生某些事件的時候我們會與他人產生互動。一個事件的發生是由於人想達成什麼目的或是周遭發生了什麼事,每個關係人再根據事件產生時的連帶資訊,經由本身的判斷流程決定應怎麼回應。掌握好互動時機的發生、互動對象的確認與互動內容的選擇將會影響結果。

小朋友有時會問為什麼遇到親戚或鄰居時一定要打招呼?我說與他們見面是一種特殊的事件,在那個時機的最佳反應就是與對方打招呼。當然我們可以不打招呼,不過要去承擔應打招呼而不打時對方對自己可能產生的不好想法。在聽到內容不確定的消息時不要像傳聲筒般直接傳開,務必要根據現有資訊來研判其真偽,在確定內容真實之前試著完全封鎖消息不要再對任何人提起,這正是“謠言止於智者”所要告誡的。

公司有位主管在系統出問題時就會開始聯絡可能可以解決問題的人,這樣的反應動作是正確的。但是他在聯絡的同時不管正在處理的人已經看出問題都要求再跟原作者溝通,而且在工程師們正在討論時常會來問“問題在哪裡?要怎麼去改?”,感覺上我們付出了時間來處理額外的溝通與溝通時額外的資訊往來。

在不適當的時機作了多餘的溝通可能令人感覺麻煩,在應做事的時機沒有反應也可能造成困擾;即使在適當的時機作了反應,反應的內容太少可能不足以作出正確的判斷,反應的內容太多也可能形成資訊混淆而無法在第一時間找到重點。面對事件時的反應時機與資訊與接下來的處理動作有關聯,接下來的處理動作又與互動的對象有影響;在“牽一髮動全身”的關聯影響下,每一個細節都應該三思而行以避免決策的錯誤。

2008年12月16日 星期二

S16 做人的方法(14)──往好的方向解讀

前陣子寄了一封描述貧窮鄉下的投影片給朋友們,其中一位回覆說轉寄者的心態很可議,因為她看過很多人轉寄許多類似郵件卻一邊揮霍金錢的。我沒法想像可以單純表述世界上還有那樣地方的動作,為何在旁人眼裡卻會用不同方向來解讀而變調。這不禁讓我想到政論節目,每次總坐了一些人去“解讀”最近敵方陣營的行為,把為什麼要這麼做、這麼做有什麼好壞處以最有利於敵方且最不利於我方的方式講得頭頭是道。

比起運動場上拼鬥得你死我活後,雙方人員接受訪問時都讚揚對手的好表現的同時,為什麼政治上都只講對方的壞話,從來沒見過某方提出一個好方案時,另一方認同那的確是有利於全民的舉動呢?就算有雙方都發現某件事是應該去做的,在某方提出一個口號希望大家配合的同時,另一方又換個名字做一樣的動作還說對方有問題。

就像力的作用一般,人們的能力與資源如果用在指責對方,另一邊肯定會返回不小於原來指責的反彈;如果用在推動一個難以推行的好法案,另一方的認同將可以加速它的運行。一點點的“認同”會讓付出的心力有完全不同的結果,但是短期之內看來不可能出現這樣的政治人物。目前雙方又不乏許多根深蒂固的支持者,完全不管某個事件其真正的意義與影響直接就以陣營之間的利益去評斷,因此在很多地方(包括網路)都存在著爭論。在彼此相互拉址的狀況下,又怎可能一同向前進步?

另外,錢是以個人能力賺的,本來就有權力支配金錢的用途。收入要100%個人使用,或者是留下夠用的10%後把90%捐出去都是基於個人的意願,不應加以責難。我們只能說捐出百分比較多的人具有更多的同理心,在感同身受的胸懷下希望藉一己之力讓更多人獲取生活進步的機會。

2008年12月15日 星期一

S15 簡單的幽默(6)──切換為不同的視角

除了針對事物本身的特性作文章之外,還可以經由切換不同的角度來突顯既定事實被變調後的幽默。

有位業務在Facebook的塗鴉牆上留言:近年來收入越來越少,算命又說沒有偏財運,該怎麼辦才好?我建議說:如果沒有偏財運的話,不如將現在的工作當作兼差而把買彩券作為正職,應該就能改善。另一位單身同事也留言:最近手頭很緊卻有好朋友結婚,應該如何處理?我回答道:趕快在好朋友結婚前百日之內先結婚,這樣不僅可以省掉紅包錢還可以存下一小筆積蓄。

原先的事實都指定在一個限定的範圍裡,我們可以試著在它的上面或是平等的地方(通常是上面)找出能夠將之硬拗為截然不同意義的視角;前提當然是原來的事實不變而且完全合乎後來從另一視角所設計的劇本裡。第一個例子裡錢賺得少就用命運裡的財運來涵括,使之成為財運的子集合;第二個例子就設計讓主角先結婚,就可以順理成章地以習俗避開沒錢還要包紅包的事件。

工作忙時有些同事會感到頭痛,聊天時會談要怎麼樣可以有效地讓頭不會痛?總有人開玩笑地說:那就讓我用力跺你的腳吧,只要你的腳比頭還痛自然就會因注意腳痛而忘卻頭痛。男生積極邀約女生下班後搭他的便車回家,女生婉拒時可以試著說:搭我的便車回到巷口下車時,如果有鄰居看到就會感覺妳時常被不同的男生送回家會很有成就感喔。

在開玩笑的同時還要留意一個原則:“好的說法要用在對方身上,壞的譬喻得拿自己打比方”。儘量找好的說法來作範例當然可以避免無謂的不好觀感,倘使笑點一定要用不雅的方式才能呈現的話,就儘量用“如果是我的話……”作為開頭來陳述。適當地犧牲自己才會更有機會帶給別人歡樂,這是我所得到的經驗。

2008年12月14日 星期日

S14 簡單的幽默(5)──誇張聯想來龍去脈

與前面幾個類型比起來,這種作法是相對較難的部分,這是因為之前都是依現有資訊限定範圍作發揮,而此時必須以特定目的為基準,快速搜尋腦中的關聯記憶並決定好著重的論點。想要到達這個程度,腦袋裡堆積的記憶資料庫與指定題目的快速索引都是不可或缺的重要能力。

古代的說客是很明顯的例子,孔明過江東舌戰群儒在一群人輪番提問之下逐一找出反駁的道理令眾人無言,他當然對各國的立場與出路都作過一番分析,再以他的智慧作出即席的反應。這個部份在新聞上也很常見,政治人物在做錯事被發現的場合也都會找出一堆理由來合理化他的錯誤。

運用這樣原理在平時聊天,誇張化地導出一個現在的已知結果也是一種幽默;殺雞用牛刀、殺雞取卵的想法都帶有這樣的意味。另一個方向則是從現在的已知結果往後延伸其影響;杯弓蛇影也具有這樣的意味存在。想像出的所有原因或是所有的影響都必須具有一個特性:要能合理地同時滿足選定結果的所有限制條件,不然僅是牽強地符合的話也不過又是冷笑話而已。

曾看過一篇好笑的文章,它鎖定的標題是“一位計程車司機如何消化掉加油送的面紙”。內容敍述一位計程車司機每天因加油帶回家很多面紙,累積了幾年後只好租間倉庫來存放越來越多的面紙,司機太太說除了清潔用途之外即使每天都行房事來消耗還是用不完,所以現在也都送面紙給親朋好友並建議他們多行房事。司機說如果再這樣送下去,他每天開車的精神都很不好會擔心出車禍,所以希望加油站送點別的東西。

如果覺得不好笑的話,純粹是因為幽默的方向不同而已,不用太在意。那篇文章是以“加油送的面紙”鎖定一個方向引申,再加上使用“加油為什麼會是送面紙?”作為標題的話則是發展來源;一個既定標題的來龍去脈都有可能在上面大作文章,就看找出來的方向是否與標題有絕大多數的吻合。

2008年12月13日 星期六

S13 簡單的幽默(4)──提供遮蔽過的資訊

同事聊天時談到教育小孩的話題,問我會不會打小孩?我說會,而且是用“球棒”打。同事們都嚇了一跳。我補充說那只是遊戲用的“空心塑膠球棒”,打起來會痛但是不會受傷,大家才恍然大悟。先從一個正式的回答裡找出最能一鳴驚人的片段,有時真的可以造成令人哭笑不得的效果。

聊天的話題難免會碰到星座,每當問我是什麼星座時我總是回答“變態的雙魚”,對方通常會問:你是說雙魚很變態嗎?我說:不是,變態的是我。因為我的個性大半與星座書裡描述的雙魚座個性不同。這種方式其實很像演講或作文時使用的破題法,只是取用的內容是具有笑果的那種。

被遮蔽的資訊也可以是主詞,在對方認為你描述的內容是某種物件時,答案卻根本是另一種物件。十歲的小明高興地跑進大人的聚會要讓大家猜謎,他出題道:什麼東西是橢圓形、週邊有毛、而且還經常濕濕的?大人們臉色都變了責罵他怎麼可以猜這種東西?小明委屈地說答案是眼睛啊!大人們才安慰他說誤會他了,沒事。

有時直接坦承自己心裡想的就是對方所說的,也會教人不知該怎麼辦才好。佛洛依德的夢解析大多都是以性為說法,像是夢到蛇代表什麼、夢到球棒代表什麼等等(我沒記);某人有次聊到這個,我問他說我昨晚就直接夢到性器官,請問這代表什麼意義?旁人笑說:那代表你很色。

隔了一會兒,小明又跑進那群大人的聚會要大家猜謎,這次的謎題是:什麼東西是橢圓形、週邊有毛、而且還經常濕濕的?大人們說:咦?這不是剛才猜過了嗎?是眼睛啊!小明笑著說:不對,這次的答案是你們剛才想的那個。一對男女朋友躺在沙灘上作日光浴,女問男說:你心裡在想什麼?男的笑答:我想的跟妳想的一樣。女的立即給男的一巴掌:不要臉!

面對遮蔽的資訊時,每個人習慣用自己的思維去補齊缺失的部份以求一個完整的答案,在接續的過程中如果與正解有差異就會產生幽默的效果。但也要小心會有人根據這個原理來提問,進而探索旁人的內心想法。(我就是這一類型的人)

2008年12月12日 星期五

S12 簡單的幽默(3)──著眼於不同的特性

公司對因專案而長期駐點在客戶端的同事會有定期的拜訪,招待一頓午餐時順便宣導一下公司近期政策並聽取同仁的意見。

這次人事主管提出公司樓上將要設置健身房,詢問大家是否會在下班之餘到公司使用。同仁普遍的意見都說專案實在太忙,沒辦法再花時間到公司健身;人事主管說要是專案經理每週固定一天讓大家準時下班的話,大家回答說要是準時下班就會回家休息而不會去。看起來要多花一段時間才能健身並不會是理想的選擇。

這時我提議說,我們每個專案裡其實都有很多電腦,或許可以讓專案的同仁效法陶侃搬磚的精神,每天早上一來先把電腦搬到樓上裝起來用(那個專案在四樓,而且只能走樓梯),下班時再搬到一樓放好。當時每個人當然是無言以對啦,不過根據“健身”這個需求,與其他類似需求作關聯與搜尋後,我鎖定了古代陶侃的例子作為話題的衍伸。

朋友聊天時說她前幾天騎機車被車子從後面撞倒,一時之間根本搞不清楚是誰撞她的,我開玩笑地跟她說那妳以後騎車必須騎快一點,她問為什麼,我說這樣一來至少車禍時妳可以看清楚妳撞到了誰。或者像這個笑話裡的描述,妻問:我新燙的頭髮看起來會不會很醜?夫答:妳的醜跟頭髮完全沒有關係。

在一件事中找出不重要的特性作文章雖然可以有牛頭不對馬嘴的幽默,但在實際生活運用時要特別留意對方的感受。如果在對方迫切需要正確的回饋時,卻發現你言不及義地越扯越遠,那時就有可能會有意料之外的反應。(像我就會觀察對方是否開始左顧右盼地像在找球棒,那時就該切回正題了……)

2008年12月11日 星期四

S11 簡單的幽默(2)──只滿足需求的結論

跳脫置換字詞與句型的小框架,根據整個描述的真實意義還有可以變化的地方,那就是定義出該段話裡所有的需求,再判斷是否有某個需求可以找出符合但是很誇張的結論。

有位同事花了不少錢購買一個具有濾水功能的水壺,平時都裝大型濾水器的溫水過濾飲用。某天大型濾水器停水,同事說即使是過濾茶水間水龍頭出來的水他就可以喝,我好奇地問他:那要是裝廁所洗手台上的水可以喝嗎?他說他不敢,不過小時候我倒是曾經對嘴直接喝過啦。(要再誇張的話可以問能否裝馬桶裡的水,不過幽默的內容要在好笑與不傷人的狀況下取得平衡)

有位同事中午都會出去步行半個小時以上,有一天中午外面下起雨來,他擔心地說今天沒辦法運動,根據他“想運動來消耗熱量”的需求,其他同事就開始幫他出點子。首先建議可以上下樓梯來運動,他說那對腳的負擔太大;改到一樓大廳的空地踱步兜圈子,他說繞圈的運動量不夠;那麼就加強為兜圈子時抱著一張椅子,他說別人會把他當精神病患看。

聊了一會兒後忽然發現雨變小了,同事還是穿上輕便雨衣出去步行。不過經由這次的事件倒是可以發現原來只描述一個主要功能的Use Case,可以在不斷地提問與答覆之間慢慢地摸索出功能的邊界限制,也更有利於作出一個趨近於完全符合客戶需求的東西。

小題大作地完成別人話中隱含的需求是這種幽默方式的重點。更進階的此種幽默,是讓找出來的結論不管是做或不做都有笑點;要達成的要件是原先的需求應該是要恰好的中庸,但是建議結論裡的做與不做卻是太少與太多。

2008年12月10日 星期三

S10 簡單的幽默(1)──相同表面相異意義

在生活中除了達成目標的成就喜悅外,好笑的事同樣也可以帶來歡笑。工程人員通常給人的印象都是孤僻且沉悶的,但是運用Interface的基本思維卻是可以造就一些幽默出來。雖然Inteface型的幽默有時會很冷,不過出人意表的聯想也能夠有令人擊掌叫好的產出。

當一句話由旁人口中說出時,就可以開始快速檢視其中的字詞有沒有可以抽出成介面,然後把那個字詞換成介面相同但意義迥異的另一個字詞。最典型的代表就是同音異義字,常看綜藝節目的人應該可以從主持人與來賓的對話裡發現很多這種用法。

再往上一層可以針對一個句子作聯想,把第一句的語意抽取出來,然後承接語意與句型卻在下一段展現出乎意料的轉變以製造笑料。這裡有幾個範例:“跟網友見面時要小心,以免對方因為你太醜而把你揍得半死”、“半夜不要照鏡子,否則會嚇到自己”、“慎防吃到不潔的東西搞壞腸胃,尤其不要吃自己煮的菜”。

雖說這種幽默需要快速的聯想力找出許多待置換的內容再選擇最好玩的,但是在文字學習方面也有很多這樣的考題,像是一個句子裡某個字寫上注音要求填上國字 (字音)、或是在一段話裡找出錯別字訂正(字形),這些都是在小學國語考試時經常出現的題型。心裡對於那個注音或字形(Interface)能列出多少單字(Class),關係著是否能夠解答那個問題。

以上是用字詞的抽換與句型的接續的基本型幽默。(現在很多腦筋急轉彎都是運用這個方式)

2008年12月9日 星期二

S09 生活中的事件追溯

生活裡與事件記錄有關的典型是日記與報紙,兩者都是記錄一天內所發生的事件。在寫日記與看報紙時面對的都是今天的內容,我們會很容易就把注意力放在當天的範圍,而忽略了事件與事件之間關聯。

媒體在發生轟動的社會新聞時會在初期的幾天不斷地重覆報導,鉅細靡遺地記載了很多的相關內幕,但是事件熱潮過後的追蹤報導常常少得可憐只是說個結果;如果媒體後來沒有提起,讀者根本不會想起事件曾經是什麼內容。對於類似的新聞事件,我們可以比對它們的形成原因、當事人想法與作法、還有後續產生的影響的異同以獲取其經驗值。

寫日記時亦是如此,在記錄一天的事件時如果沒有連帶地回顧自己之前面對類似事件時的處理與心情,又怎麼查覺出自己的行為與心境是否更加成熟?人的成長部分是經由回顧與反省來學習最佳的處理方式,這需要比對差異的部份才能得知前後的不同並作適當的改進。

當著眼於一件特定事件時,瞭解其前因後果是必然的動作;研究輸入給當事人的所有資訊,分析當事人根據什麼判斷才作出那樣的決定是一件很有趣的事。當觀察的事件數量多的時候,記憶並歸納眾人的思維與決定,可以慢慢地對於人性有更多的認識。倘使搭配一些名家深入說明的文章,有時可以更快速地推算出結論來。

另外,事與物是相互有緊密關連的:做事時會使用到物或是留下物,物的存在也需要事加以處理。因多做事減少的物(像是大量獵殺動物、濫墾森林)或是因少做事增加的物(不帶走自己拿去的垃圾、有毒廢棄物不依規定回收而亂丟),都可能對個人、社會甚至地球造成難以回復的負面影響。

2008年12月8日 星期一

S08 生活中的物品關聯

一般來說物品存放時會根據其特性分開保管,像是浴室用品放在浴室、寢具放在房間;有些時候會依存取習慣來放置,是書桌上同時會放著平時常用的所有物品、廚房流理台上放著等待處理的食材。有的時候除了一般的擺放處之外還會有放置備份品的倉儲空間。以上是物品存放的場所分別。

物品的存放數量與使用類型大致有以下幾種:一是數量少且取用量也少,像梳子、筆、傘等;二是數量多且取用量也多,像米、綠豆等;三是數量多但取用量少,而且需要識別取用的物品,像圖書、光碟片等。前兩種由於沒有識別物件的特性,取用時依序找過所有可能放置的地方找到就用,但是圖書與光碟片這兩種就必定得找到心裡想要的那一個才能滿足需求。

以光碟片來說,量很少時應是放在一本收集簿或布丁桶裡,需要時逐一檢視到找到為止。當數量越來越多時,收集簿或布丁桶的數量自然增多,等到找一片光碟需要太長的時間就會重新整理,把同類型的光碟片放在同一個收集簿或布丁桶減少尋找時間。數量再多到兩三千片時,每一種類型的數量也多到找起來很辛苦時,就會希望還有更好的儲存方式。

後來我找到有光碟櫃這樣的產品,用最小的空間吊掛著三百個棉套可放六百片光碟片,每個棉套位置都定義一個編號在放光碟時記錄其放置編號,最後把所有光碟片與放置編號收集起來製作成索引檔,未來要拿光碟片時只要參考索引檔便可按圖索驥一次拿到正確的結果。快速在大量的同質物品中找到可識別的唯一一個是這種管理方式的優點,但是放置時需要再額外建立對應的關聯是連帶的缺點,而且管理一旦失聯要再重建又得花很大的功夫。

根據物品使用與存放的特性有不同的管理方式,也有不同的優缺點。選擇某種物品的最佳存放方式也是一項決策。

2008年12月7日 星期日

S07 做事的方法(14)──自己做事的痕跡

“凡走過必留下痕跡”,做過的事也必然會留下相對的證據。對於自己曾經做過的事,不想被別人發現的就會儘量抹滅證據,在證據無法消除時就佈置假證據作為煙幕;希望日後可以回溯的就會留下詳細的記錄以便各方面的查詢;至於沒什麼重要性的自然完全不會在意有沒有留下記錄。

同樣的事在不同的情境下會有不同的重要性,因而對應不同的處理方式。就以“小便”這件事來說,在日常生活裡大家想小便就去廁所,只需要知道小便的分解動作與廁所的位置即可;但是在住院的時候,某些情況下醫生會要求記錄次數與數量作為診療的參考資料;至於臨時在路邊小便時,通常會儘量遮掩不被發現並在事後掩埋痕跡。(現在於路邊小便時不遮飾且不掩埋的人越來越多,這個現象不在本次討論範圍)

小時候考試曾有這樣的是非題:深夜路上沒有其他人車時為了節省時間可以闖紅燈,每個人為了理想的考試結果都會填否,但是在實際的生活裡呢?不需要考試結果時還是有人真的為了節省時間而闖了紅燈或是其他的違規。這代表了什麼樣的含意呢? 

當我們做一件事時,可以先想想做的原因、做的結果與做的影響作為判斷的依據,但是最重要的是選擇了什麼樣的標準來檢驗自己的行為?人民在路上是否會違規要看有沒有交警存在,官員是否收賄要看有沒有被狗仔跟拍的可能;檢驗如果只是為了做給檢視的對象看,觀念根本上與做黑心產品無異。

一個人的良好道德依賴時時用內心的良知來檢驗言行慢慢建立而成的,外在的檢驗對象大多只存在於一時,而內心的標準卻無時無地影響我們的作為。為了應付外在的檢驗一時變好,卻在無人發現時言行卑劣,如此表裡不一的行為總會有被比對出來的時候,進而造成對自己的重大負面影響。

2008年12月6日 星期六

S06 見微知著──觀察處理資源的作法

過了將近一個月,我再度回到曾經貼紙條提醒大家容器可以回收的那個專案,當初我列印的告示還是貼在相同的地方,而那些容器的蹤跡也還是同樣出現在資源回收桶與垃圾桶裡。對此我並不再有特別的動作,只是感覺到觀察這樣的小地方的確可以看出一個人的作法。

對於因應自己需求產生的物品,理應由自己將之放置到它該去的地方,對於連這樣的小事都無法盡責的人,我會將之歸類到不負責任的群組裡。一年半前在對公司新人講課時,曾有部門同事進來旁聽,在離去時我觀察到他們沒有把自己放在座椅下的空飲料杯帶出去;當時我故意留下來想對新人說明沒有清理好自己應清理的垃圾時造成的影響,但卻也發現已經有人主動地把那些紙杯都處理掉了。

偶而會有人將飲料空杯直接放在我的車上,方便處理的時候我會帶走,但要是不方便時我就會直接將之放在地上。對於丟垃圾的人來說,他不想負責拿去丟,又覺得直接丟地方違背自己的道德觀,所以就採用間接的作法:把丟垃圾的責任推到不相干的人身上。對於不相干被波及的人來說,當然可以好心地幫那人擦屁股式地做好,也可以順著他的想法預設自己的車不在那裡而形成垃圾直接落地的結果。

我是從來不亂丟垃圾的,即使是再小的紙屑都會先收進口袋裡等想到時再拿出來丟;我也同樣地告誡家人與朋友,應該做好自己該做的事。現在在路上如果看到垃圾時,不管是走路或騎車,只要不會影響別人就會立即撿拾起來另外再丟到垃圾桶去;雖然以往也像路人那樣視而不見,不過在瞭解事物的道理後,反倒願意多花一點心力讓事物返回正軌以減少額外的影響。

2008年12月5日 星期五

S05 做人的方法(13)──推算對方的想法

人就像一個系統,心裡的想法也像是黑盒子般不易得知。路遙知馬力、日久見人心,描述的是時日一久就可以累積足夠的經驗值去明白一個人的內心;當然我們也可以藉由觀察其言行與詢問一些設計過的問題較快速地測試一下,然而卻也得提防對方反過來灌輸假象的可能。

要明白一個人的個性,大致來說是知道該人在面對某一種特定狀況下的決定是什麼。人在面對狀況時,參考的各種變因或多或少有點不同,思考的模式也都有些差異。在敵對時知道對手的個性與想法,就有制敵機先的可能;在合作時知道同伴的個性與想法,就有發揮所長的好處;在帶人時知道下屬的個性與想法,就可以將人放在最適當的位置。

雖然日久可見人心,但是能夠越快瞭解一個人總是比較有利的。最快速的方式就是用相人術,觀察對方的面相、言談與舉止,利用前人累積的觀察經驗立即知道對方時常作什麼樣的想法;最簡單的方式可以使用占星術,利用生日資訊簡單地得到其特性作為初步的認知;最沒辦法的方式,就是利用時間慢慢累積對方做事的方法來反推其個性與想法。

有時在感覺對方可能是什麼樣的人時,我會隨時提出幾個小問題再根據答案來分析,因為就像開車時會反應出駕駛者的直覺想法,突如其來的單刀直入式問題也會令人不知所措而直接回答。就像是系統在面對尋常的測試方式時很可能過關,但是忽然改變測試的方法與內容時說不定就會發現內部與期望不同的地方。

不著痕跡地觀察言行、不經意地詢問意料外的問題,對於一個人我們可以這麼地搜集他所表露出來的各種記錄,再藉由易地而處地思維收集對方身邊所有可能的變因,進而推斷出其內心想法。

2008年12月4日 星期四

S04 追查事件表露的跡象

車輛對我們來說就像是一個黑盒子,它會有什麼樣的行為與反應都仰賴內部(駕駛者)的控制,我們沒法得知內部的行為模式,只能憑它表露的跡象來評估它接下來會可能會發生什麼動作。根據事件所有已知資訊去推論當事人的想法,在生活中是時常可見的事──尤其是在談話性政論節目裡。

在談話性節目裡,常可見到評論者根據已知的事實加以衍伸與推論,雖然說來頭頭是道,但是有些從根本上完全是斷章取義,只選擇對自己有利的部分加以說明。由於評論者刻意隱蔽了某些資訊,倘使群眾沒有查覺到而只聽信他說出來的部分,就會被引導到刻意安排的邏輯裡而深信不移。有些人則深信某公眾人物的個人魅力,會自動忽略或扭曲解讀對他不利的事件;這樣得到的結果自然是有失公平的。

事件發生後,總需要聽取雙方不同的說法,加以收集整理後套用邏輯來篩選不合的條件,剩下合理的狀況才有可能隱藏著正解。但是由於當事人與媒體都有可能隱藏正確的資訊或是增加不正確的煙霧,更添增了推理的重要性。

推理是嘗試著找出在各種條件限制下,唯一的一種符合所有條件的答案。當有複數的答案存在時,不是重新檢視現有的答案是否推算錯誤,就是再依據現況找出其他的限制條件繼續篩選,直到符合的答案只有一個為止。有時也需要留意裡面夾雜有假的限制條件,屆時得額外花費精力判斷出哪些是假的風聲而已。

對於自己沒法明瞭內部的黑盒子,感受氣氛的不尋常、針對可疑處測試,大膽假設並小心求證是很理想的作法。

註:“大膽假設,小心求證;認真做事,嚴肅做人”是胡適送字畫給梁實秋時題在上頭的對聯。

2008年12月3日 星期三

S03 駕駛者的個性

有位朋友說過,瞭解一個人個性最好的方式就是觀察他開車的方式,因為開車時的反應都是人依眼前資訊直覺反應的結果。這句話提供了我在上下班途中一個很好的打發時間方式。

不打燈就變換車道的人很明顯地比較自我;跟車跟得很近的人比較自信;車子開得很慢的人比較封閉保守;車子排氣聲大、機車排氣管上翹的人比較自私而不顧他人感受;快速變換車道求快的人比較躁進;無視交通規則(像闖紅燈)而繼續的人比較沒有法治觀念……。馬路上就如同人生一般,存在著各式各樣的人。

有時看到年輕人騎機車載著女友橫衝直撞,不時有超速、闖紅燈的現象,不禁會聯想坐在後座的女人嫁給那樣的人之後會有什麼樣的生活?有時被前面騎車上翹的排氣噴到時也會想,不知道前面的人同樣被別人的排氣噴到時會不會有快感?有時被忽然切入自己行進路線的車嚇到時,也會用同樣的方式切回到對方的前面,不知道他有什麼樣的感受?

在一個忽然下起雨的日子,騎機車的我因為雨衣沒弄好想靠邊整理,但是靠邊時忘記先打方向燈而使用一個從右邊超車的年輕人因嚇到而對我罵了一句;一時間心情不好很想快速追上去超他的車,但是轉念一想是自己沒有做好才會造成後面的一連串事件,因而降回原來的速度繼續行駛。就在兩個路口後就看到一位女騎士因前面機車忽然切出而剎車滑倒的事故,我扶起她的機車推到路旁見她沒事後坐回車上,不禁回想了一下這五分鐘內所發生的一切,彷彿如同一種啟示。

在行車中觀察人生的百態同時反省自己的行為,是不是也算是一種修行?

2008年12月2日 星期二

S02 偵測路上人車的流向

路上總有許多車與行人遍佈,要能平安地到達目的地,必須密切注意路上所有物件,務必不要讓自己與他們產生任何的時間與空間的“同時交集”。宣導交通安全時會提醒我們要注意什麼什麼的,但是行車安全總歸只有一句話:去感受所有人車的流向!

在路上要避免只將注意力集中在一點上,因為重心放置的輕重不同會造成反應上快慢不一。我習慣將視線放在約二至四輛車左右的距離前,且只固定在那個位置而不是物件上;這樣做的目的是為了以眼睛的餘光儘量地收集所有可能有例外行進路線的人車,以期快速地做出反應。

同事朋友們公認台北的馬路上要數計程車與公車最為危險,因為他們最常在無法預期的狀況切到不同車道而造成問題。其實計程車與公車的特別行為也是有跡象可尋的:公車除了依路線的左右轉外只有靠站的動作,觀察更前面的地方是否有公車站將會是避免與公車發生碰撞的關鍵;空計程車會在路邊疑似有想搭車的人時靠邊,同樣把注意力放一點在路旁的人就可以避免;有人搭的計程車風險較小,但是也要提防乘客忽然間要求的轉變與車門的開啟,這是較困難的部分。

在路上的累積經驗夠多時,去分析各種車輛的行為並找出原因,就可以在路上判斷該原因是否存在來決定前車是否會有變換車道的動作。當然也會有例外,一次在兩線的慢車道上,我以時速50公里跟在一部靠左邊轎車的右後方,他在某個巷口忽然邊打右轉燈邊右轉,來不及剎車的我只好跟著他的轉彎弧度右轉而避免事故。另一次是以時速70公里通過一個十字路口,結果有部轎車從右方路口闖紅燈右轉然後停車並立即開啟駕駛座的車門,我下意識地繞過車門然後停在不遠的前面。

由於前車的突然變化,造成我的行車路線也跟著立即改變。有時在新聞上會看見駕車者因閃避前車的改變反而遭後方車輛追撞的後果。這兩次能夠化險夷的關鍵在於我隨時使用照後鏡觀察左右兩邊的後方沒有其他車輛,所以才能夠保證自己的變化不至於造成後車的影響。

隨時觀察是否有人車可能影響自己,同時注意自己是否可能影響其他人車,會是行車安全必須的重要保證。(在收集資訊時若感覺可能有風險則不要涉險,因為保守而不躁進只會浪費一點時間,但是判斷錯誤卻會造成一生的遺憾)

2008年12月1日 星期一

S01 生活中的推理無所不在

每個人都有自己的生活。在生活裡會遇到許許多多的人事物,雖然絕大部分都是閃過即逝的,但是若用心觀察其中一個相遇的人事物,總是會有不同的收獲。

對於物,我們可以去觀察它的外觀與特性、瞭解如何使用。像是認識各種動植物、記憶城市與道路等地理位置、能夠操作不同的科技產品都是我們可以做到的。多去觀察與瞭解各種物件能夠增加我們心中的資料庫,也會是旁人評斷你認識東西多寡的依據。

對於事,可以分為兩種:一種是發生的事,像是新聞事件與歷史事件,這類與自己沒有切身關係的事,使用對待物的方式加以記憶相關資訊即可;另一種是達到特定目的的事,像是釣魚這樣,需要透過學習與經歷才能夠做好的事,這是擴展我們人生經驗的唯一途徑。事與物的記錄,就像是個人腦中的百科全書建置,記憶得越多越正確就越可以快速地舉一反三。

對於人,如果是跟自己相關性較高的也是要記住他的資訊,接著要明白他的個性,再來可以判斷這個人對於自己要達成某件事是否有影響。在路上擦肩而過的人,隨時的記憶有可能在重要的案件提供關鍵的線索;觀察其動作,或許可以得知他正在做的事會有什麼樣的結果。

觀察、記憶、組織、關聯,四個必要的動作可以讓周遭所有的人、事、物的資訊得以留存,同時在未來需要的時候從腦海中取用;但是付出的代價是要耗費腦中的資源來達成這個功能。有些人願意作這種犧牲而致力於資訊的收集,也有些人因為避免麻煩而忽略不做;聰明的你會怎麼決定呢?