l

2011年12月24日 星期六

亂談軟體設計(1):Cohesion and Coupling

December 24 22:41~23:57


最近因為有人問 Teddy 如何設計軟體架構與如何套用 design patterns,讓 Teddy 突然想整理一下所學過的一些軟體設計基本原則,也讓有心想學的鄉民們省一點學習的時間(前提是要先不走火入魔...XD)。這些原則和設計軟體架構與套用 design patterns 也許沒有直接的關係,但是對於『產生軟體設計』與『評估軟體設計』卻是簡單又實用的方法。


在開始講古之前,Teddy 心中一直有一個疑問,那就是:『鄉民們都是如何會設計軟體的?』是學校有教,自己看書,還是工作上學習而來?有空的話也請鄉民們留言分享一下這方面的經驗讓 Teddy 增廣一下見聞,感恩。


今天要談的是兩個基本中的基本觀念:

  • Cohesion(內聚):用白話文解釋,把執行某個功能所需用到的程式與資料都塞在某一個模組(function, class, package, etc)之中,使得該模組可被視為一個單獨的個體執行,那麼這個模組的 cohesion 就愈高。內聚,內聚,顧名思義就是把程式,資料這些有的沒的東西都『聚在一起』打包起來。
  • Coupling(耦合):如果某個模組跟『其他人(另一個模組)』有關係(例如,使用 global variables 或是接受其他模組傳入的參數)那麼這兩個模組就彼此耦合。
做軟體的人應該都知道,設計一個模組的基本精神,就是要『提高內聚力,降低耦合度』(如果原本不知道也沒關係,至少現在知道了)。提高內聚力的好處就是提高了模組的『獨立性』,也就是說這個模組可以被單獨使用,也可以被單獨修改。這兩點都很重要,因為可以被單獨使,就表示模組被『重複使用(reuse)』的機會變多了;可以被單獨修改,就表示開發人員可以放心大膽的修改模組而不用怕萬一改了模組之後會引發『漣波效應(ripple effect)』影響到其他原本功能正常的模組(就是可以避免不小心改一的地方錯十個地方)

但是,軟體模組就跟人類一樣是『群居動物』,不太可能生活上食衣住行育樂一個人全部搞定。當然『程式是人寫出來的』,硬要寫出內聚力超高的模組也不是不可能。但是,一個內聚力超高的模組可能會發生以下兩個問題:
  • 你的軟體只有一個模組,所有需要的程式碼與資料都在這個模組中。此模組內聚力超高,但是...一共有一萬行。這種程式,應該不太好維護吧。
  • 為了不讓模組變得太大但是又要有很高的內聚力,當有新功能要開發的時候,你用 copy and past 的方式產生新的模組。新的模組內聚力很高,可以單獨執行(因為所需的資料與程式碼都被 copy 到新的模組中了),但是,這衍生了 duplicate code(重複程式碼)問題,此為軟體大忌,戒之,戒之。
所以,模組之間還是免不了需要『有關係』,也就是說耦合是難免的。但是不當的耦合(找小三,小四...XD),例如使用全域變數(global variables)就很容易產生一些很難看出來的 bugs(因為人人都可修改全域變數,萬一到時候資料不正確很難找到兇手)。如果是設計單一的 function 或是 method,那麼最低的耦合就是所謂的『資料耦合(data coupling)』,也就是說以參數傳遞的方式作為模組溝通的管道。但是,如果把『眼界放大一點』,看的是 design patterns 或是 architecture 中各個不同『角色(或是參與者)』的溝通方式要採用哪種耦合呢?

鄉民們不知道是否還記的『Design Patterns 分成三大類』這一篇,裡面有提到有一大類的 patterns 是屬於『patterns relying on abstract coupling』,包含了 State, Factory Method, Observer, Bridge, Builder, Command, Visitor, Interpreter, Mediator, Adapter, Prototype, Proxy,Strategy。那麼什麼又叫做『abstract coupling』?簡單的說,就是定義介面(interface),讓需要『有關係』模組透過介面來產生關係。所以 GoF 在 design patterns 書中開宗明義就說:

program to an interface,  not an implementation

***

Abstract coupling 的概念應用很廣,像是 Layers 這個軟體架構上,下兩個 Layers 也是 abstract coupling 的關係。有一句話 Teddy 再強調一次:

模組之間要有關係(耦合)可以,但是最好只能有『精神外遇 抽象關係』,不要有『肉體耦合 實做耦合(implementation coupling)。


***

友藏內心獨白:這一篇算是『Design Patterns 分成三大類』的補充包嗎,還是耶誕禮物?

2011年12月23日 星期五

Scrum 經驗分享內線消息

December 23 15:06~15:39


之前答應 ezScrum 團隊明年(2012)年要全程參與他們所舉辦的六場講座,剛剛收到活動負責人寄來的議程草稿通知。快過年了,怕有興趣參加的鄉民們來不及安排時間,Teddy 先幫忙打一下廣告(因為這次講者只有 Teddy 自己一個人啊...Orz



日期:2012/01/07 (禮拜六)
時間:14:00~16:00
題目:Scrum 經驗分享:使用Java與C/C++之跨平台軟體開發
主講:小弟
人數:40名 (迷之音:真的沒報到名又想去的鄉民直接衝過去應該也OK...
地點:台北科技大學 科技大樓 B425室 (捷運忠孝新生站)
議程:
14:00-14:10 Opening
14:10-14:50 40分鐘 第一段
14:50-15:10 20分鐘 Break
15:10-15:40 30分鐘 第二段
15:40-16:00 Q&A


要報名的話請連到這裡 http://registrano.com/events/ezscrum-workshop-5


***


題目是 Teddy 給的,不過題目訂好之後,Teddy 就在想『使用Java與C/C++之跨平台軟體開發』這個題目如何跟 Scrum 扯上關係,還真是有點傷腦筋,總之到時候就知道了。總不能每次都唬爛深宮怨婦 怨念很深』,『逆練九陰真經』,『都市游擊隊』這一套,講久了可能會被歸類成『邪門歪道』,還是趕快回歸名門正派以免被殺上光明頂圍剿。


剩下的其他五次分享活動,有兩次分別在中部與南部舉辦(又不是只有天龍國國民才在開發軟體...XD)是要簡介 Scrum,所以不用想題目。另外三個題目 Teddy 暫定為:
  • Scrum 經驗分享:如何改善開發流程
  • Scrum 經驗分享:軟體架構與演進式設計
  • Scrum 經驗分享:沒有專屬測試工程師的團隊如何安排測試工作
  • Scrum 經驗分享:敏捷例外處理設計(agile exception handling design)2011/12/26 18:13 修正。

現在現場開放點歌,如果鄉民們有什麼想聽的主題也歡迎留言或是來信告知 Teddy。活動是免費的,請多加把握。另外,投影片會在活動開始前幾天放到網路上,有需要者自行參閱。

該不會有鄉民還想聽『逆練九陰真經』吧?!

***

友藏內心獨白:這次活動的 video 總應該可以放到 YouTube 上了吧。

2011年12月22日 星期四

如何設計軟體架構

December 22 22:00~23:04


鄉民們應該知道 Teddy 最近在整理部落格的文章準備出書(有人認識出版社的嗎?!),今天沒有人找 Teddy 聊天,參考 Peopleware 中文版的書本大小,關在家裡努力工作了一整天把書的草稿重新排版的差不多了,居然有 500 頁左右(Peopleware 中文版約 320 頁)。以下是這本絕世武功的...目錄:


第一部 現在 15
1 好深的怨念 16
2 老闆,軟體不是這樣開發滴 18
3 600 百多個 BUGS 要怎麼修? 23
4 這不是髒話 29
5 改行寫網路小說算了(1) 32
6 改行寫網路小說算了(2) 36
7 改行寫網路小說算了(3) 40
第二部 SCRUM 44
8 SCRUM 是一種制度 45
9 就是這個光:SCRUM + LEAN + XP 51
10 導入 SCRUM?謝謝再聯絡。 56
11 都市游擊隊 60
12 如何估算 STORY POINT? 65
13 STORY POINT 為何沒有單位:相對論篇 74
14 END-TO-END STORIES:切蛋糕篇 79
15 功課寫完沒: THE DEFINITION OF DONE 82
16 我不能採用 SCRUM,因為我家人不同意 85
17 0 與 1 的距離 90
18 SCRUM 之逆練九陰真經 94
19 同誰,九陰真經不是這樣子練滴 99
20 放下心中舉起的中指 105
21 REDUNDANCY 110
22 SHARED CODE:讓我們變成博格人吧 114
23 口袋不夠深 119
24 我鬧,故我在 121
25 TEDDY 的 PAIR PROGRAMMING 之旅 123
26 RETROSPECTIVE MEETING=許願池 128
27 CERTIFIED SCRUM MASTER, DAY 1 132
28 CERTIFIED SCRUM MASTER, DAY 2 136
29 我變成有牌的 SCRUMMASTER 了 140
30 傳福音 142
第三部 LEAN 147
31 軟體庫存 148
32 消除浪費 (1):PARTIALLY DONE WORK 152
33 消除浪費 (2):EXTRA FEATURES 156
34 消除浪費 (3):RELEARNING 160
35 消除浪費 (4):HANDOFFS 164
36 消除浪費 (5):TASK SWITCHING 168
37 消除浪費 (6):DELAYS 171
38 停掉生產線 174
第四部 加班 178
39 加班,加班,我愛你 179
40 非加班不能搞定之台灣經濟奇蹟幕後無名英雄 184
41 過勞死之軟工無用論 189
42 我可能不會 18:30 下班 195
第五部 洗腦 198
43 學習犯錯 199
44 為什麼不問問題? 205
45 風範 209
46 傻的願意相信 212
47 造船的目的 218
48 發語詞,無義 222
49 軟體是長出來的 225
50 咸豐皇帝是怎麼死的? 229
51 精神不好的時候 233
52 剽竊 236
53 你重視什麼? 239
54 THE POWER OF DUPLICATE CODE 242
55 這不是整人遊戲之 TIME LOG 紀錄方式 246
第六部 設計 254
56 PROBLEM DOMAIN VS. SOLUTION DOMAIN 255
57 再論 PROBLEM DOMAIN VS. SOLUTION DOMAIN 259
58 要抄就要抄最好的:架構師篇 264
59 你的軟體架構有多軟 267
60 設計最難的部份是什麼? 272
61 PROGRAM TO AN INTERFACE 277
62 DESIGN PATTERNS 分成三大類 280
63 時間到 284
第七部 HCI 291
64 窮人 HCI 設計入門 293
65 歪批 GOMS 300
66 HCI 分類開張: DESIGNING FOR ERROR (1) 307
67 DESIGNING FOR ERROR (2) 31268 DESIGNING FOR ERROR (3):KNOWLEDGE IN THE WORLD AND IN THE HEAD 319
69 DESIGNING FOR ERROR (4):CONSTRAINTS, FORCING FUNCTIONS, AND
NATURAL MAPPINGS 326
70 DESIGNING FOR ERROR (5):EXECUTION AND EVALUATION 331
71 HCI 之博士熱愛的算式 337
第八部 測試與整合 343
72 有 TEST CASES 改遍天下,無 TEST CASES 寸步難行 344
73 忙到爆的五月天 347
74 TEN-MINUTE BUILD 351
75 人客的要求:TEN-MINUTE BUILD 後續報導 356
76 TEN-MINUTE BUILD 後續報導 (2) 359
77 落實的能力 366
78 落實的能力(2) 370
79 用 ROBOT 寫自動化功能測試到底有沒有用 375
80 用 ROBOT 寫自動化功能測試到底有沒有用 (2) 380
81 誰 COVER 誰 388
第九部 還少一本書 393  -->考慮是否移除
82 THE TIMELESS WAY OF BUILDING 394
83 SMALLTALK BEST PRACTICE PATTERNS 400
84 RELEASE IT! 405
85 MANAGING THE SOFTWARE PROCESS 410
86 THE UNIFIED SOFTWARE DEVELOPMENT PROCESS 417
87 CONTRIBUTING TO ECLIPSE: PRINCIPLES, PATTERNS, AND PLUG-INS 423
88 SOFTWARE BUILD SYSTEMS: PRINCIPLES AND EXPERIENCE 428
89 零與無限大 432
第十部 閒扯蛋 437
90 TEDDY 的初衷 438
91 幸福有感 443
92 一步到位還是一槍斃命? 446
93 聞過則喜...誰說的? 448
94 白飯一碗 454
95 秀才遇到兵 458
96 ISO 大戰乖乖 462
97 一萬個小時的練習 465
98 小朋友不可以說謊喔 468
99 需求分析書中最重要的資訊是什麼? 471
第十一部 欲練神功 475
100 從 THE TIMELESS WAY OF BUILDING 學設計(1) 476
101 從 THE TIMELESS WAY OF BUILDING 學設計(2) 483
102 從 THE TIMELESS WAY OF BUILDING 學設計(3) 489
103 從 THE TIMELESS WAY OF BUILDING 學設計(4) 493
104 從 THE TIMELESS WAY OF BUILDING 學設計(5) 498
105 QUALITY WITHOUT A NAME VS A NAME WITHOUT QUALITY 503106 有駕照不會開車 506 ---> 這一篇好像放錯地方

雖然內容都是發表在部落格上的文章,但是經過分類之後 Teddy 才發現,哇賽,如果有鄉民真的認真一篇一篇都讀完而且讀懂的話,Teddy 的『日月精華』就全部被吸光光了說(還好自己還有暗槓一些不外傳的密技...XD)。

Teddy 內心獨白:我也太好心了吧我。

***

以上都不是重點,今天的重點是『如何設計軟體架構?』上次去面試還有昨天下午和某位很有趣的鄉民聊天的時候,Teddy 都被問到:『你如何設計軟體架構』或是『你如何應用 design patterns』。Teddy 突然被問到這個問題,一下子反而答不上來。就好像有人問你:『你如何吃飯?你如何喝水?你如何呼吸』一樣,於是 Teddy 就說:『很自然的就設計出來了』。

當然 Teddy 並沒有這麼厲害,剛剛 Teddy 又再次思考這個問題,到底平常 Teddy 是如何設計軟體架構與應用 design patterns 的?其實這個問題 Teddy 之前都談過了,請參考『軟體這條路:Architect 篇』,『要抄就要抄最好的:架構師篇』,『你的軟體架構有多軟』,『還少一本書:Contributing to eclipse: Principles, Patterns, and Plug-ins』,以及『從 THE TIMELESS WAY OF BUILDING 學設計系列文章』。今天 Teddy 再來幫鄉民做一下總整理:
  • 首先,平常『有事沒空』的時候,就要多看 software architecture patterns 與 design patterns 這一類的書。由於大家時間都有限,因此看的目的不是要把這些一狗票的 patterns 全部都背下來,只要知道『有他們』這樣就可以了。等在工作上遇到問題的時候,再把可能可以派上用場的 patterns 拿出來研究一下看看是否有用。
  • 當真正遇到問題的時候,如果腦海中沒有任何已知的 solutions(沒有任何已知的 architecture patterns or design patterns 可以直接套用),那麼就去找書或用 google 找看看有沒有『可以抄襲的對象』。除非鄉民們遇到的問題是很特殊或是很偏門,否則要完全找不到可以扯上關係的參考架構的機會應該很小(也就是說應該可以找到可以參考的架構)。
  • 問題來了,假設可以找到一個或是多個參考架構,但是通常這樣的架構還是要經過一番的修修改改,才能用來解決鄉民們的問題。『功力好不好』此時就看得出來,這可能也是大部分的人在從事所謂的『架構設計』時遇到問題的時候。什麼問題?就是把一個參考架構調整成適合自己使用的樣子。
  • 如果不幸真的完全找不到任何可以參考的架構,那...恭喜老爺,賀喜夫人,您也許找到一個可以當作碩士甚至是博士論文的研究題目,趕快找研究單位合作吧。不過,大部分的情況都是...找得不夠用力啦,再用力找一下,你就可以回到樓上了。
這樣講鄉民們應該還是覺的無法了解,Teddy 的文筆就僅只能解釋到這樣的程度了。不過沒關係,最近 Teddy 有提供『家教服務(上一次當家教已經是10幾年前的事了,教人家 DOS 和 PE2...XD)』,有需要的鄉民們在下單就好了。

最後 Teddy 要建議,如果真的對於『design patterns』與軟體架構想要『深深深深深....入研究』的鄉民們,Teddy 也是不藏私的,一本葵花寶典很早以前就告訴大家了,不怕死的就去買一本來 攻吧。啊,什麼,你問 Teddy 那一本?!還有別本嗎,當然是 THE TIMELESS WAY OF BUILDING 啊。

***

友藏內心獨白:做功德的方式有很多種。



2011年12月21日 星期三

用 Java 存取存取 WMI,請選擇

December 21 21:55~22:58


前一陣子學弟提到要寫一個 Robot test case 來測試 SyncFree (一個開放原始碼檔案同步軟體,由北科大資工系軟體系統實驗室開發),這個 test case 需要準備某種測試環境:

  • 在 Windows 上用網路芳鄰開放一個共享的目錄,此目錄作為測試檔案同步功能的來源端(source)。
  • 在 Ubuntu 上的本地端硬碟建立一個目錄,此目錄作為測試檔案同步功能的目的端(destination)。

這個 Robot test case 要測什麼呢?要測試當 SyncFree 正在執行同步檔案功能的時候(同步尚未全部完成的當下),source 端的網芳共享目錄突然中斷了。在此情況下,SyncFree 還是要確保來源和目的端的資料以及系統的狀態都是正確的。換句話說,這是一個 robustness test case(測試 SyncFree 軟體的 耐操度 強健度)。


學弟提出了一個問題,


學弟:這個 Robot test case 沒辦法完全自動化耶,因為不知道要如何在同步到一半的時候把網芳共享目錄給中斷。


Teddy:那有可能不行。你可以在 Robot 程式中呼叫一個外部 script,然後用這個 Windows 上的 script 來停掉網芳共享目錄


Teddy:或是你可以透過 WMI(Windows Management Instrumentation)直接寫 Java 程式來關閉網芳共享目錄。

學弟:啥米!有這種東西....

***

在 Windows 平台上,透過 WMI 可以做到許多管理與查詢的功能,例如,查詢 CPU 負載,網路封包,服務(service)的狀態等等。也可以啟動或是停止服務。有興趣的鄉民可以自行查一下 WMI 的文件。Teddy 今天要介紹的是三個 Java 開放原始碼元件,讓鄉民們可以用 Java 來存取 WMI

這三個元件分別是:

  • com4j,MIT 授權,支援 64/32-bit JVM
  • j-Interop (Pure Java - COM Bridge),支援 64/32-bit JVM
  • JACOB (Java COM Bridge),LGPL 授權支援 64/32-bit JVM

說是介紹,其實也不算是介紹,應該說是推薦使用,這樣鄉民們就可以省去一些『試用期』。首先看一下授權,如果鄉民們的軟體是不開放原始碼的軟體,那麼使用 MIT 和 LGPL 的授權應該是 OK 的(不會因為使用這些元件而被迫開放自己的原始碼...如果 Teddy 有說錯請糾正)。


關於 com4j,Teddy 用過的經驗是在 64-bit 環境下(64-bit OS and 64-bit JVM),曾經發生過把 Windows WMI service 搞到掛掉的情況,但是在 32-bit 環境下卻很正常,所以不太推薦。


j-Interop 是完全用 Java 開發的軟體,沒有任何的 native code(其他兩個都有用 C/C++ 寫的 native code)。j-Interop 實做 DCOM 通訊協定,所以可以透過網路去存取其他電腦的 WMI 服務。但是缺點是,如果你要存取的是本機電腦,似乎(Teddy 不是 100% 肯定)也要提供一組帳號,密碼才可以存取 WMI 服務。com4j 和 JACOB 就沒有這樣的限制。


在 Jenkins(一個超好用的開放原始碼持續整合系統)中就有用到這個 j-Interop 來啟動與管理遠端 Windows 機器中的建構環境(支援 distributed build 的功能)。所以如果鄉民們有類似 Jenkins 這樣遠端存取其 Windows 電腦 WMI 服務需求的話,那麼用 j-Interop 是不錯的選擇。


如果是要存取本地端的 WMI 服務又不希望使用者一定要設定帳號與密碼的話,最後這個 JACOB 是 Teddy 推薦的元件。在  64-bit 與 32-bit 環境下工作都滿正常的。


講完收工。


***

友藏內心獨白:範例程式網路上找一下就有了。

2011年12月20日 星期二

設計最難的部份是什麼?

December 20 22:28~23:20


最近部落格都在講 Teddy 看病和找工作的事,今天主題回到軟體上面來。Teddy 去年九月寫過一篇『需求分析書中最重要的資訊是什麼?』不知道鄉民們還記得答案嗎?今天想談一個類似的問題『設計最難的部份是什麼



請鄉民們花一分鐘想一下這個問題,或是我們把原來的問題簡化一下,改成『設計軟體最難的部份是什麼?』是如何寫 stories or use cases,如何套用 design pattern,如何設計 software architecture,如何用 UML 畫出漂漂亮亮嚇死人不償命的圖,如何 coding,如何 testing,還是如何喝酒...Orz...(問業務就知道最後一項技能對於結案的重要性)


一分鐘差不多到了,公佈答案,這個答案是從 The Design of Design 這本書第 22 頁抄過來的:


The hardest part of design is deciding what to design.
(設計最難的地方在於決定要設計什麼東東)


假設鄉民們先暫時同意作者 Brooks 老先生在書中的說法,那麼重點在後面(23 頁)的幾句話:


Then, slowly, I came to realize that the most useful service I was performing for my client was helping him decide what he really wanted.


這一段話 Teddy 最近看了更有感覺,為什麼?因為最近 Teddy 在思考未來的職涯規劃,有人可能看上 Teddy 的 Scrum 與 agile practices 經驗,有人可能覺的 Teddy 的 software architecture 設計能力應該還不錯,也有人看上 Teddy 去上過 CMMI 課程而想找一個懂 CMMI 的 PM(此人一定沒看過搞笑談軟工...XD)。其實 Teddy 這兩個禮拜也一直在問自己同樣的問題:Teddy 能夠做什麼?


Teddy 內心獨白:都沒人想問說 exception handling design 要怎麼做耶...白研究了...Orz。


不過剛剛在擠料的時候,隨手翻到這本書,看到這段文字,嗯,覺的上面這段話的『abstraction(抽象化)』做的真好,一言以蔽之可以代表 Teddy 的心聲(至少 Teddy 內心希望是這樣啦)。


***


既然設計最難的地方在於決定要設計什麼東東,那是不是說『需求定義』很重要?Yes,可以這麼說。那是不是說回歸到傳統軟體開發流程告訴我們的:


需求分析 -> 架構分析 -> 設計 -> coding -> testing 


這種流程,所以在專案開始實做之前要把所有的需求都找出來?


Brooks 老先生很好心的告訴鄉民們,No. 一樣還是第 23 頁:


Not only is the design process iterative; the design-goal-setting process is itself iterative.


... knowing complete product requirements up front is a quite rare exception, not the norm.


其實這本書看到這邊  Brooks 老先生就被 Teddy 『看破手腳』了,這根本是另類的 agile methods 代言人啊。

***


對一個軟體專案來講,定義需求的確是不容易的一件事,尤其如果要處理的問題領域(problem domain)本身就非常複雜,那麼光是要把『what to design』... 的雛型...搞清楚,就夠花時間了。更難的還在後面,由於『design process 』與『design-goal-setting  process(搞清楚要設計什麼的流程)』都是 iterative (就是要跑個好幾次,一步
一步的來,才能把設計,以及到底要設計什麼搞懂),所以軟體開發才會常常被弄的很亂。


上面這段有點玄,請多看兩次。


Teddy 再補充一下,因為需求隨著時間越來越清楚,換句話說需求隨著時間一直在變(由模糊變清楚,或是由錯誤變正確),而相對的設計本身因為需求變了所以也要變。所以,如果軟體沒有『設計好』(或是說專案沒有帶好),那麼在這種『需求與設計的愛恨情仇交互作用之下』,最終的產品就不容易成功。


***


結論就是,老王賣瓜一下:做軟體要找到像 Teddy 這種『品德兼修(需求與設計)』都熟的人來帶專案,要不成功也難啊。

***


友藏內心獨白:最近突然覺的書看太多好像沒什麼鳥用,英文學好比較重要...Orz。

2011年12月19日 星期一

小感動

December 19 21:57~23:00


上禮拜五去看胃鏡檢查報告,護士告訴 Teddy 12:00 之前到就好了,Teddy 衝到門診的時候剛剛好 11:59 分,結果等到快 12:50 左右才輪到 Teddy。經過這幾天的經驗,到榮總看醫生等 1 個小時大概是『基本消費』。


醫生:(看著電腦螢幕)你的食道有一點發炎。


Teddy:食道?!(狐疑狀)可是我是十二指腸還有胃有點不舒服耶。


醫生:喔,你的胃有輕微的發炎,不嚴重,沒有長什麼髒東西(阿飄?)。



醫生:你的胃潰瘍是因為壓力造成的。


Teddy 內心獨白:這麼神,這你也看得出來?


Teddy:請問從胃鏡所拍得照片就可以看出來造成潰瘍是因為壓力的原因嗎?


醫生:當然可以啊,我看胃鏡看到都可以算命了。


Teddy:這麼厲害,那請問您看得出來我從事什麼行業嗎?


美國之音:遊民ing...


醫生:這沒辦法,沒辦法。


Teddy:我一年大概出國玩兩次,每次出國的時候,胃的狀況都還不錯,喝點咖啡也 OK,但是只要回國之後就又恢復原狀。


Teddy:有時候想說乾脆移民出國算了。


醫生:你出國玩當然是沒有壓力啊,要是移民出國一樣要工作,還是沒用。


Teddy:那請問有辦法改善嗎?我還需要定期回來檢查嗎?


醫生:(沈默不語)。


Teddy:那醫生您有什麼建議嗎?


醫生:我的建議你又做不到。


< 最後還真的是什麼建議都沒給 Teddy 耶,被放棄了....Orz....>


Teddy:請問我去看中醫會有幫助嗎?


醫生:中醫喔...看中醫也是開一些抑制胃酸和放鬆心情的藥,跟西醫的效果是差不多的。


醫生:不過你可以去試一下。


醫生:那我開個兩個禮拜的藥給你回去吃吧。


Teddy:好,謝謝。


最後獲得兩個禮拜的藥(制酸劑),不過還好不是什麼大毛病,心情頓時輕鬆不少。


***


依照往例以上都不是重點,今天的重點是 Teddy  上禮拜四去面試的時候,就在要離開前,面試官突然對 Teddy 說:『胃(還是身體,有點忘了)還好吧』。原來這位面試官有看 Teddy 的部落格...雖然只是一句小小的問候,當下卻是讓 Teddy 相當感動。


不過,昨天晚上發生一件事更是讓 Teddy 感動到失眠(這算是好事嗎?!)。就在 Teddy 快就寢的時候(快 24:00 ),Teddy 正在玩平板電腦,突然發現有人在 FB 傳了一段訊息給 Teddy,問 Teddy 找到工作沒,想幫 Teddy 介紹工作。


此人是何方神聖?一問之下原來是之前 Teddy 去分享 Scrum 經驗時的某位聽眾,不過介紹工作不是重點,重點是,這位好心的鄉民,居然也有胃潰瘍的毛病,還很熱心的介紹 Teddy 一味『藥方(應該算保健食品吧)』,而且還願意把自己手邊的庫存免費送一罐給 Teddy 試吃,總之...跟這位好心的鄉民聊了一會,突然覺的...這麼會有這麼熱心的鄉民呢,好感動啊... >_<...(自此之後包龍星從貪官變成好官...XD


***

今天花了整整一天的時間都在寫書,雛型已經差不多了,再花個2-3天左右應該可以把第一版的草稿給編好,之後再加點照片,圖片,補充說明什麼的,應該就可以 alpha release 了(找熟人幫忙讀一下)。雖然書的內容都是從部落格文中節錄出來的,但是編排成一本書的樣子之後,看起來好像變得比較高級一點,讀起來也好像比較輕鬆(這是錯覺,這是
錯覺...XD)。


對了,最近 Teddy 除了寫書與找工作之外,還算是滿閒的在找到合適的正式工作之前,如果有鄉民們的公司,想要找人演講介紹 Scrum 與 agile practices,或是想要找人幫忙 review 或是介紹如何設計 software architecture,或是想學一下 Teddy『法定的真正專長:exception handling design』,或是想找 Teddy 聊天,歡迎寫信與 Teddy 聯繫,以下是 Teddy 的 email:


teddy.chen.tw (at) gmail.com


至於費用...講到錢就傷感情了,凡是部落格的粉絲,一律『出價就賣(有機會 Teddy 還是要順便賺點伙食費啊)』,算是打發時間順便交朋友兼做功德。Teddy 也不知道會『閒多久』,希望不要太久...Orz....所以有需要的『捧油』請把握機會,最後 20 組,快撥電話ㄌㄡ(怎麼有點像電視購物)。


***

友藏內心獨白:你不是還欠人家兩篇 papers,拖多久了還不快生出來(來人啊,拖鞋伺候...)。

2011年12月16日 星期五

我可能不會18:30下班

December 16 01:50~02:57


23:40 就寢但是翻來覆去都睡不著,想說起來看個電視培養睡意,看了 30 分鐘還是睡不著,那乾脆寫篇部落格文章好了。這個禮拜行程滿檔,週一至週二連續兩天去榮總醫生,週三至週四下午去面試,週五(幾個小時之後 Orz...)又要回榮總看照胃鏡的報告,其他空檔的時間 Teddy 幾乎都在寫書。說『寫書』是比較好聽一點的講法啦,Teddy 其實只是把部落格的文章挑一些出來整理與分類一下,之後再花點時間排版與修飾一下,就這樣而已,也不是什麼真的從無到有生一本新的出來(做軟體的都知道要 reuse 啊)。


進度報告一下,現在已經整理了大概 100 頁左右,應該不會被鄉民們火力攻擊了(你,還看別人,就是在說你,槍放下來先...XD)。


***


最近民視剛播完一部很熱門的偶像劇叫做『我可能不會愛你』,Teddy 借用這個劇名的『梗』,這禮拜的兩次面試 Teddy 很 白目 坦白的告訴對方說『我可能不會18:30下班』。原本以為會遭受到猛烈的砲火攻擊,沒想到對方居然異常體貼的表示『理解』。奇怪,這怎麼和 Teddy 從網路上看到的印象完全不一樣啊,難道是 Teddy lag 了嗎,還是 Teddy 在做夢(誰來賞 Teddy 一巴掌..XD),亦或是對方採取『欺敵政策』?總之這兩次面試讓 Teddy 學到不少東西。


這幾天 Teddy 在網路上 search 了一下,發現很多台灣的公司都要求員工要加班,而且奉『責任制』之名可以名正言順的不必給加班費,有些公司甚至要求新人 22:00 之後才可下班。但是,員工也不是笨蛋,因為大家都看過『侏儸紀公園』,都知道『生命會找到出路』。此外,員工的中文程度也很好,都知道『上有政策,下有對策』這句話。所以呢,好啊,你要我晚走,OK 啊,我就白天的時候打混摸魚,晚上吃完飯之後混到 8 點多再回來,東摸摸西摸摸 10 點左右再發幾封 e-mail,搞定...最好回家之後晚上 2-3 點起床尿尿再順便發幾封 e-mail(Teddy  內心獨白:幹麼那麼累,寫個批次程式自動發 e-mail 不就好了)。哇哩勒...近一點看,工時這麼長好認真的員工喔,好心疼,好心疼,來,阿姑親一個...XD。


請問現在是比賽『挑大糞』嗎?工時長看誰挑的多?拜託眼睛上面的『蛤蠣肉』拿下來先好嗎...員工有沒有實質的產出不去管他,光去看工時有什麼用啊。


公司要養人才,還是養豬?要養豬的話當然是 24 小時都待在公司以方便定時灌食。好的人才 8 個小時做完奴才 1 個月的工作量,你老大還在嫌人家『我可能不會18:30下班』,那...套句 mobile01 上面鄉民常講的一句話...幫不了你


***

老師在講你到底有沒有在聽啊(丟手榴彈 丟筆),『加班,加班,我愛你』,『非加班不能搞定之台灣經濟奇蹟幕後無名英雄』,『過勞死之軟工無用論』,這幾篇回去大聲朗誦 10 遍先。


***

友藏內心獨白:還好長達一個小時的筆試最後沒有出現(擦汗...)。



PS:櫃台和 HR 怎麼都那麼正啊,有篩選過喔...(迷之音:都是電腦挑的啦...)...啊,歹勢,沒圖沒真相...偷拍器材忘記帶出門...XD。