面對秀才、面對兵
寧願跟秀才辯論三百回合,爭得面紅耳赤,也不要跟兵浪費任何一丁點時間。
與秀才辯論,敗了也沒關係,真理通常是可以辨得出來的,只要把持心中的那把尺,不放棄,即使不如初衷,但也更合道理。
但是面對兵,不值得花上一絲一毫的腦力。能夠直接忽略最好,但如果不行的話,千萬別傻到動手去證明自己是對的。
寧願跟秀才辯論三百回合,爭得面紅耳赤,也不要跟兵浪費任何一丁點時間。
與秀才辯論,敗了也沒關係,真理通常是可以辨得出來的,只要把持心中的那把尺,不放棄,即使不如初衷,但也更合道理。
但是面對兵,不值得花上一絲一毫的腦力。能夠直接忽略最好,但如果不行的話,千萬別傻到動手去證明自己是對的。
喔耶,爆炸吧~爆炸吧!
愛用 .lib 嘛... 爆炸吧!
愛亂用 global variable 嘛... 爆炸吧!
愛亂 call function 嘛... 爆炸吧!
愛 copy & paste 嘛... 爆炸吧!
喔耶,我聽到 windiff 了,爆炸吧!爆炸吧~~~
2007-05-16 更正:不是「愛用」.lib,而是有原因的。雖然說那個原因在不知不覺中,已經消滅了。
從 HemiDemi 看到了這個小遊戲《征服職場煉獄》,我玩跟寶貝玩都蠻準的。我玩的結果如下:
煉獄指數:45
你覺得目前的工作有些貧乏,也似乎到了一個瓶頸。有時覺得這份工作不算太差,有時覺得自己真要這麼繼續過生活嗎?換工作跑道是心中一直猶豫的議題,不熟悉的職場領域和環境、擔憂自身能力不足、不知道未來會不會更好,這些都是心中拉扯的因素。建議你多和工作場合以外的人接觸,拓展你的生活領域,相信你會從這些人得到一些對未來的啟發和靈感,以及找到屬於自己的勇氣。
你的職場瓶頸會發生在三種狀況:一、老闆沒有授予你足夠的權力,讓你好好發揮,使你心生鬱卒;二、工作上權力的鬥爭讓你窮於應付;三、老闆信任你的能力,賦予你過多的期望,導致工作量過大,身心難以負荷。
你具備強烈扭轉劣勢的能量,因為你是一個樂觀正向、不逃避問題、善於面對自我的人,因此當困在職場上時,你的韌性會為你贏得最後的勝利。
據說下一個案子我可能要和大陸的 RD 同事合作,忐忑不安中。:-p
唉唉,看來我又被調降信用評等了。今天前輩跟我說,部門老大將原本由我負責的案子,轉畫在他底下。於是,我從一開始的同時擁有三個頭頭,到成為無兵之將,再到現在這樣,還沒正式公布,只屬一個頭頭。我知道,這其實不是壞事,我的未來,應該會好過一些。我也知道,這主要是因為專案性質改變的緣故,所以有所調整。但是,最後總歸是讓部門老大出了手,我的心裡,還是有些落寞。
確實,我是有很多「可是」的,但我也知道,這些都可以算是藉口...
文件上沒寫,誰知道 GetSystemTime() 在 WinCE 裡抓不出 milliseconds?配上 eVC 那超慢的 download 速度與超高的失敗率,以及 99% 會失效的 debugger,兩天的時間就這樣浪費掉了。
Porting 當然是要按照原本 function 的 behavior 改寫,按照原本程式的介面邏輯,在目標平台找尋對應 API 完整重寫。這當然是「正確」的事,可惜卻是屬於「政治不正確」的一種。Conceptual Integrity 在某些目標導向的情境下,常常是可以被犧牲的一項。以結果論英雄以證明抄捷徑才是正確的,我可以預見未來必定沒有機會補洞,但我沒有權力反對。
有時候碰到那種,說起來很簡單,但其實挺複雜,但對主管來說,又只需要知道很簡單的部分的東西時,還真的是挺讓人無奈只好硬吃黃連的。結果可想而知:「這不是很簡單嗎?不就是在那段 code 的前後記一下時間,相減取得所耗費的時間,為什麼會搞得這麼複雜,還花上半個星期的時間弄?」是啊,但是我必須為了 porting 找解法、測試,為了讓結果能夠印出來,思考良久以決定究竟該不該打洞抄捷徑,更別提中間還穿插為了與正因興起而被大整頓的 Visual SourceSafe repository 之間同步程式碼,而不得不斷地被打斷的開發過程,以及額外支援的抓網站小程式。
平心而論,對於同期或後期的同事,基本上其實我確實是沒有把來自他們的 coding request 放在心裡很重要的地位。但相對來說,雖然說看起來我未來暫時只會有一個頭頭,實際上的情形仍然將會是,來自前輩的交辦事項,還是得認真回應。單一擋箭牌的好處在單一,但缺點也在單一。讓我感到落寞的,正是在此。花了一年學懂了在三個頭頭下做事的方法,可惜又花了一年,才從錯誤中領悟到無兵之將的真正意涵:無兵之將還是兵。未來我有辦法在一個頭頭之下,用對方法態度行事嗎?我不確定,在必須將大部分精力以工程師性格的方式展現的情境下,能有多少心思保護自己不再吃暗虧。
工程師的宿命是,要不就 work longer (加班),然後讓肝爆掉,要不就 work harder (拼命),讓胃穿孔。Work smarter 真的是藝術啊,還是讓別人的肝爆掉,胃穿孔才是王道。怎麼說呢?好歹自己也念了兩年資管,算是和管理有沾到邊了,然後這幾年看著老爸念 EMBA,我漸漸地有了這樣的想法:因為學管理的比較懂做人,所以作管理時就拼命地教下面學做人。會這樣想當然是覺得這是不對的,怎麼做事,和怎麼做人,是一樣重要的。問題只是,做事的人多半不懂得做人,而會做人的人,則多半不懂得做事,如果只是讓專業的傲慢決定做事或做人何者重要的話,那的確是會變成裡外不是人。
其實,「政治正確」我也不是嗅不出來,對於自保用的心機,我也不是一無所知。但在個性與價值觀的雙重作用之下,我也許還得再經過多年的挫折,才能學懂如何在專業的堅持與工作的目的之間取得平衡,又或是學曉如何放棄。
剛剛寫程式寫到一半,突然聽到一陣「嘰拐嘰拐」的聲音,探頭一望,原來是來自桃園廠的同事,拿著鋸子在鋸 PCB 板。這,這才是真正的黑手工程師啊!「機絲」一大車,常常要桃園內湖兩邊載來載去,連鋸子榔頭都準備得好好的,隨時可以派上用場。
最近一直很忙,工作環境裡的一些困境一直在困擾著我,並不是沒有技術可以滿足種種需要,而是這些技術都無法被使用,猶如「被綁縛了雙手的俠客」一般,頓時失去了練在雙手上的功夫,連三歲小孩也打不過。看來,要能武功大成,無論在何種境界皆能自在充裕,還有好大好大的一段距離要努力啊。
拜讀 Jserv 的這篇《思索 C++》,裡面引的這句「just say "No" to bad old platforms」挺有意思的,可惜在軟體工程上,決定一切的通常不是技術因素,而是「錢」。「錢」最為優先,次之為「人」,最後才是「技術」。
小弟我有幸身在一個比較沒有市場壓力的研究單位,因此不需要直接面對「錢」的問題。但相對地,「人」的問題,便首當其衝。這兩年來的整理思考,讓我明瞭了,在實務工作上,除了常要 cross platforms 外,還常常需要 cross programmers,不僅 platform 要跨,連 programmer 也要跨。期待所有會使用到你的程式的 programmers 都能具有某些基本能力,就跟期待碰到的 platforms 可以支援基本的 C99/C++98 一樣,緣木求魚。
更慘的是,我們無法 just say "No" to bad old programmers,因為,不僅 team members 會碰觸到你的程式,你的 customer 也有可能會碰到你的程式。在客戶至上的大前提下,是沒有可能因為客戶不懂 template,就 just say "No" to dummy customers 的。最終,還是得弄出一套 pure C 版本朝聖才行。喔,客戶的問題可能還好解,大不了另外寫個 library [...]
記錄一下從 VB 呼叫用 VC 製作的 DLL 的心得:
1. 使用 __stdcall 搭配 .def 檔製作 DLL VC 製作 DLL 的方法。
有兩種方法。
第一種方法是使用 __declspec(dllexport) 宣告要 export 的函式,讓 VC 幫忙製作 stub library,這時預設使用的 calling convension 是 __cdecl。這樣宣告後,VC 會產出 libFoo.dll 與 libFoo.lib 兩個檔案,其中後者就是所謂的 stub library,VC 會自動於 stub library 裡製作對應到 libFoo.dll 裡 _funcFoo 這個 symbol 的 __imp_funcFoo。
這個方法的好處是,在 VC 裡的 project 有 dependency 時,會自動 [...]
用 VB6 呼叫用 VC6 寫的 DLL,檔案確實有更新且擺放在 VB 的 project 目錄下了,函式也確實地用 __stdcall 與 def 檔宣告了,但就是會跑出
Error 53: File not found libFoo.dll
的訊息。
後來查到《Bugs: Error 53 when calling functions from custom DLL》這個網頁才知道,是 libFoo.dll 所需要的 libBar.dll 忘了複製過來的緣故。 不過,這什麼鳥蛋 error message 啊,一點提示效果都沒有,難怪查到的網頁要用 Bugs 開頭。
看了一下 MSDN 裡 VB6 的 error code 列表,少的可憐。寫 VB 真的要自求多福才行。
收到的轉寄文。
原作者的算法蠻有趣的......令人深思.....只不過大家都在等園區公司的分紅, 如果沒有分紅, 那麼, 真的可以考慮簡單一點...看到這,真是為這些園區上班的科技新貴感到悲哀,包括我自己在內..在來園區前,對園區有很大的憧憬,非園區的工作不作,來園區幾年後,卻恐懼的要逃離這個地方,商業周刊897期主題『新迴游主張─返鄉工作,可以簡單,也可以富足』,一個環境法碩士,到宜蘭當月薪三萬元的農夫。上個月我去當司機了,月薪三萬。電機碩士放下月薪六萬去幫人家開車,哈~我的同學都在笑我~在新竹,我買一間透天要貸600萬(200萬自備),在新屋,我買一間全新透天要貸150萬,在新竹,我負債600萬,每個月要繳房貸3萬7,在新屋,我負債150萬,每個月要繳房貸9仟3,在新竹,上班為了怕塞車,6:30起床,下雨天運氣不好,在塞車的車陣中塞1個小時,心裡也罵了一個小時,在新屋,我8:00起床,開車十分鐘到公司,在新竹每天7:00出門,22:00回到家,每天在外15個小時,為了那600萬負債,所以我用青春去拚那六萬的薪水,在新屋每天8:15出門,17:15到家,我可以在家吃飯,晚上做我想做的事,因為我負債只有150萬,同學問我薪水會不夠用,在新竹,繳完房貸,我只剩下2萬5,在新屋,繳完房貸,我只剩下2萬,只差五仟嘍,新竹的新貴因園區而發達,新竹房地產因新貴而發達,新貴的錢最後吐給房地產,自己卻要拚死拚活去工作,這樣的生活,真不知是錢的主人,還是被錢所奴役,房貸20年,人生有幾個20年,一生中若有10年在新竹園區工作生活,呵~不如歸去.........
但是,考慮到下一代的教育問題,處在刺激、新知較多的地方,可能會比較好,至少,會有更多選擇的權力。因此我寧願在都會區生活、扎根。
libMMI 是我在工作上,順帶寫的一個程式庫。目的在累積 domain independent 的 know-how,以加速日後程式的建構。發展準則有:
Incremental construction - 有用到的 feature 再加,慢慢累積。
Homogeneous across languages - 橫跨若干 programming language,不同於 C# 的 CLI,只求用法、API 長相差不多就好。目前用到的有 C/C++、Perl、PHP、SH 等程式語言。
Cross-platform if possible - 盡可能地隱藏 cross-platform 的細節,目前可以橫跨 FreeBSD/Win32 以及 GCC3/MSVC6。不過因為 incremental construction 的發展準則,尚未 porting 的功能,會產生 pre-processor-time 或 run-time error。
Privode both C/C++ interface if possible - 盡可能地為 C/C++ 推出不同介面,對應功能的版本。
就在剛剛,我做了第一千次的 commit。因此趕緊來賽豬公一下:
SHELL> svn log -r 1 [...]