<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JeffHung.Blog &#187; Work</title>
	<atom:link href="http://www.jeffhung.net/blog/categories/life/work/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jeffhung.net/blog</link>
	<description>(My smile insists of having nose. :-)</description>
	<lastBuildDate>Thu, 24 Nov 2011 07:25:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2-alpha</generator>
		<item>
		<title>生產力低落</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/2261/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/2261/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 16:11:30 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=2261</guid>
		<description><![CDATA[隨著新的 Mac 的到來，我發覺我的生產力，又陷入了另一個低潮。]]></description>
			<content:encoded><![CDATA[<p>隨著<a href="http://www.jeffhung.net/blog/articles/jeffhung/2255/">新的 Mac</a> 的到來，我發覺我的生產力，又陷入了另一個低潮。</p>
<p>第一個低潮來自於<a href="http://www.jeffhung.net/blog/articles/jeffhung/2026/">轉職</a>，因為跑道轉換，以往所培養的整套開發工具與流程，裡面的許多節點，不再適宜繼續使用，因而變得支離破碎。結果就是，做什麼都卡卡的，不斷地得重新製造螺絲。慶幸的是，螺絲僅須重新製造，無須重新發明。</p>
<p>不過，匆促地重新製造螺絲，也不是好事，畢竟從頭開始，是個很好的機會，檢討改進原先不良之處。還好，目前的工作環境，鼓勵使用適合的外來組件，重視的是達成目標，既沒有 <a href="http://en.wikipedia.org/wiki/Not_Invented_Here">not invented here</a> 症狀，亦對新事物 open minded，所以一切尚可。再加上在 linux 上開發軟體，一整個輕快方便，不像在 Windows 上那樣，總之就是一個爽字。</p>
<p>不過我敗了新 Mac，這是夢想已久的玩具，入手一天多來，發覺真的有很多東西需要慢慢習慣。舉例來說，Mac 的鍵盤與 PC 不甚相同，現在我用 <a href="http://irssi.org/">irssi</a> 上 IRC，要切到 window 11 的時候，總會習慣性地不小心按成 ⌘-Q，把 Terminal.app 關掉。</p>
<p>因為要習慣以前沒碰過的 mac 環境，因此我發覺，生產力又陷入了第二個低潮。雖然說 Mac OS X 可以說是<a href="http://www.jeffhung.net/blog/articles/jeffhung/2041/">最適合 developer 的系統</a>，但是在習慣之前，使用效率一樣還是很差啊。</p>
<p>因此，在最近總是接到很趕的工作項目的時候，這台新 mac 暫時變成了雞肋，越摸越會拖慢開發速度的玩具。還好換到新工作後，坐捷運的通勤時間比例變長了，也幾乎都能有位子坐，讓我有玩耍雞肋的時間，慢慢把生產力培養起來。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/2261/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>轉職</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/2026/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/2026/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 22:43:56 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=2026</guid>
		<description><![CDATA[在有些 RPG 的設定裡，角色在經過「轉職」後，能力可以突然提昇一大節…]]></description>
			<content:encoded><![CDATA[<p>在有些 RPG 的設定裡，角色在經過「轉職」後，能力可以突然提昇一大節。最近，我要轉職了。會不會能力也突然提昇，我不曉得，但至少環境改變了，面對的問題也改變了，前方，應該可以開闊許多。希望，能更有效率的，發揮自己，提昇自己。</p>
<p>將要去的公司，是當年找國防役時，我的第一志願。隨然時過境遷，現在與當年，篩選公司的條件與想法，已經完全不同了，再也沒有志願一說，只剩各種選項的權衡。不過，未來的公司，還是很令我滿意。至少，那應該會是一個，聽得懂我的專業的公司。</p>
<p>交接的工作，已經快要告一段落。我寫文件的速度其實不甚快，但零零總總，至今也寫了七十多頁。如此，應該算是已經盡到責任了吧。Brain copy 是不可能的，文件也只能夠作到提示與方向指引。</p>
<p>話說，內湖捷運就要通車了呢，結果待了五年，我要離開內湖了。公司有供應午餐，在地下室，搞得這些年，其實對內湖不太熟。要不是結婚後有在內湖住過一陣子，我對內湖的印象，可能還是模模糊糊的吧。</p>
<p>換工作，就像換情人一樣。慢慢地把與舊情人的牽扯濾清，不要留下遺憾，也不要留下怨懟。應該要把一個乾乾淨淨的自己，交到新情人手上。</p>
<p>嘿，我，加油喔。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/2026/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Timecard, garbage data, and work overhead</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1958/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1958/#comments</comments>
		<pubDate>Wed, 13 May 2009 09:42:51 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=1958</guid>
		<description><![CDATA[Some kind of time-card system must be introduced...]]></description>
			<content:encoded><![CDATA[<p>Some kind of time-card system must be introduced, to automate post-work processing. Or we'll have to increase work overhead to produce garbage statistic data. At the end, most of the work time will be spent in garbage in and garbage out.</p>
<p>碎碎念一則。頭部用嘴巴做管理，基本上 OK，但若是講太快手跟不上，那是一定會出問題的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1958/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>650 行的 constructor</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1838/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1838/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 06:51:04 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=1838</guid>
		<description><![CDATA[原來我也會寫出 650 行的 constructor。XD]]></description>
			<content:encoded><![CDATA[<p><span class="status-body"><span class="entry-content">原來我也會寫出 650 行的 constructor，滾輪轉半天，還看不到放在下面的 destructor。XD</span></span></p>
<p><span class="status-body"><span class="entry-content">哼哼，一切都是註解太多的錯。</span></span></p>
<p><span class="status-body"><span class="entry-content">另一個錯的是</span></span> Windows Programming 的 style，要不是已經把 error handling 另外濃縮處理過了，否則不含註解的部份，還要再膨脹個 5 倍左右。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1838/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Who&#039;s code caught the error, who deal with it?</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1016/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1016/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 14:53:14 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=1016</guid>
		<description><![CDATA[這是一個很久很久以前就有的 murmur。在工作上，有時候會聽到這樣的怒吼：「吼～又是你的 assertion 把程式當掉。」可是…]]></description>
			<content:encoded><![CDATA[<p>這是一個很久很久以前就有的 murmur。</p>
<p>在工作上，有時候會聽到這樣的怒吼：「吼～又是你的 assertion 把程式當掉。」可是，細查之後卻又發現，之所以會 assertion failure，是某個應該存在的值不存在，或某件事情在之前就失敗了，於是當程式執行到 assertion 處，一檢查就發現問題，然後把程式當掉。</p>
<p>Assertion 之所以存在，為的就是希望能夠揪出，所有不應該存在的異常情形，是故，assertion 其實應該是多多益善，埋的越多，越有機會揪出程式的不良之處。所以，我很喜歡埋 assertion，凡是無法處理的特殊輸入、必須存在的情境參數，甚至是失敗就等於整個程式根本無法運作的 API 呼叫，我都會使用 assertion 以便盡早地把程式當掉，輔助我們揪出錯誤的發生點。</p>
<p>問題是，當 assertion 發生時，總是要有某個人負責去找出問題的成因，而理所當然地，在只有 assertion failure 這條線索的情況下，問題就被丟給寫 assertion 的人。但因為 assertion 通常是用來抓「不是在此處發生的錯誤」，因此產生了這麼一個吊詭：</p>
<p><strong>越認真地(寫程式)使錯誤顯現的人，反而越容易領到爛攤子，必須承擔解決(多半)不是其程式所造成之錯誤的責任。</strong></p>
<p>一般來說，程式設計師比較喜歡寫新程式，而不喜歡維護舊程式，更討厭的就是負責維護不是他寫的舊程式，所以上述的吊詭，等於是在懲罰認真的人，而且是越認真(埋 assertion 炸彈)，等著的是越多的爛攤子。</p>
<p>也就是說，可以討論的，應該是 assertion 的標的是否合適，而不是 assertion 是否應該把程式當掉。只要標的合適，當程式當掉時，我們該慶幸，assertion 讓我們發現，程式會當掉，而不是等到移交給客戶後，隱藏的炸彈才一個一個爆發。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1016/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Code Review 什麼時候沒有用？</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1776/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1776/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 01:49:53 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=1776</guid>
		<description><![CDATA[今天早上一上班，看到上禮拜下班前跑的測試，果然還是死掉了。 面對體無完膚，多個臟器破裂，到處都是還沒找到的破洞，在這個情況之下，這種內出血嚴重的程式模組，code review 已經沒有用了。 更別提原作者在會中，一直嚷嚷，看起來都沒問題啊。XD 2009-03-23 13:00 更新：補一下這篇《The only valid measurement of code quality: WTF/m》。]]></description>
			<content:encoded><![CDATA[<p>今天早上一上班，看到上禮拜下班前跑的測試，果然還是死掉了。</p>
<p>面對體無完膚，多個臟器破裂，到處都是還沒找到的破洞，在這個情況之下，這種內出血嚴重的程式模組，code review 已經沒有用了。</p>
<p>更別提<a href="http://www.jeffhung.net/blog/articles/jeffhung/861/">原作者</a>在會中，一直嚷嚷，看起來都沒問題啊。XD</p>
<p><strong>2009-03-23 13:00 更新：</strong>補一下這篇《<a href="http://www.osnews.com/story/19266/WTFs_m">The only valid measurement of code quality: WTF/m</a>》。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1776/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>這是什麼英文？</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1196/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1196/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 08:47:31 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Links]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/?p=1196</guid>
		<description><![CDATA[這是什麼英文？ Do not call error handling function with new thread, that will cause chance dead lock after foo(). 還有這句： Call client RPC for tell stream initial done. 雖然說缺乏註解是常態，所以看到的機會不多，但每次一入眼，臉總還是會微微抽動。]]></description>
			<content:encoded><![CDATA[<p>這是什麼英文？</p>
<blockquote>
<p><span class="entry-content">Do not call error handling function with new thread, that will cause chance dead lock after <code class="inline_code">foo()</code>.</span></p>
</blockquote>
<p>還有這句：</p>
<blockquote>
<p>Call client RPC for tell stream initial done.</p>
</blockquote>
<p>雖然說缺乏註解是常態，所以看到的機會不多，但每次一入眼，臉總還是會微微抽動。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1196/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>面對秀才、面對兵</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/1046/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/1046/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 05:03:25 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Murmuring]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/articles/jeffhung/1046/</guid>
		<description><![CDATA[寧願跟秀才辯論三百回合，爭得面紅耳赤，也不要跟兵浪費任何一丁點時間。 與秀才辯論，敗了也沒關係，真理通常是可以辨得出來的，只要把持心中的那把尺，不放棄，即使不如初衷，但也更合道理。 但是面對兵，不值得花上一絲一毫的腦力。能夠直接忽略最好，但如果不行的話，千萬別傻到動手去證明自己是對的。]]></description>
			<content:encoded><![CDATA[<p><span class="entry-title entry-content"> 			  寧願跟秀才辯論三百回合，爭得面紅耳赤，也不要跟兵浪費任何一丁點時間。</span></p>
<p><span class="entry-title entry-content">與秀才辯論，</span><span class="entry-title entry-content">敗了也沒關係，真理通常是可以辨得出來的，只要把持心中的那把尺，不放棄，即使不如初衷，但也更</span>合道理。</p>
<p>但是面對兵，不值得花上一絲一毫的腦力。能夠直接忽略最好，但如果不行的話，千萬別傻到動手去證明自己是對的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/1046/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新同事</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/886/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/886/#comments</comments>
		<pubDate>Tue, 15 May 2007 09:05:03 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Feeling]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/articles/jeffhung/886/</guid>
		<description><![CDATA[喔耶，爆炸吧～爆炸吧！ 愛用 .lib 嘛... 爆炸吧！ 愛亂用 global variable 嘛... 爆炸吧！ 愛亂 call function 嘛... 爆炸吧！ 愛 copy &#38; paste 嘛... 爆炸吧！ 喔耶，我聽到 windiff 了，爆炸吧！爆炸吧～～～ 2007-05-16 更正：不是「愛用」.lib，而是有原因的。雖然說那個原因在不知不覺中，已經消滅了。]]></description>
			<content:encoded><![CDATA[<p>喔耶，爆炸吧～爆炸吧！</p>
<p><strike>愛</strike>用 .lib 嘛... 爆炸吧！</p>
<p>愛亂用 global variable 嘛... 爆炸吧！</p>
<p>愛亂 call function 嘛... 爆炸吧！</p>
<p>愛 copy &amp; paste 嘛... 爆炸吧！</p>
<p>喔耶，我聽到 windiff 了，爆炸吧！爆炸吧～～～</p>
<p><strong>2007-05-16 更正</strong>：不是「愛用」.lib，而是有原因的。雖然說那個原因在不知不覺中，已經消滅了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/886/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>征服職場煉獄</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/671/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/671/#comments</comments>
		<pubDate>Mon, 06 Nov 2006 15:28:28 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.net/blog/articles/jeffhung/671/</guid>
		<description><![CDATA[從 HemiDemi 看到了這個小遊戲《征服職場煉獄》，我玩跟寶貝玩都蠻準的。我玩的結果如下： 煉獄指數：45 你覺得目前的工作有些貧乏，也似乎到了一個瓶頸。有時覺得這份工作不算太差，有時覺得自己真要這麼繼續過生活嗎？換工作跑道是心中一直猶豫的議題，不熟悉的職場領域和環境、擔憂自身能力不足、不知道未來會不會更好，這些都是心中拉扯的因素。建議你多和工作場合以外的人接觸，拓展你的生活領域，相信你會從這些人得到一些對未來的啟發和靈感，以及找到屬於自己的勇氣。 你的職場瓶頸會發生在三種狀況：一、老闆沒有授予你足夠的權力，讓你好好發揮，使你心生鬱卒；二、工作上權力的鬥爭讓你窮於應付；三、老闆信任你的能力，賦予你過多的期望，導致工作量過大，身心難以負荷。 你具備強烈扭轉劣勢的能量，因為你是一個樂觀正向、不逃避問題、善於面對自我的人，因此當困在職場上時，你的韌性會為你贏得最後的勝利。 據說下一個案子我可能要和大陸的 RD 同事合作，忐忑不安中。:-p]]></description>
			<content:encoded><![CDATA[<p>從 HemiDemi 看到了這個小遊戲《<a href="http://www.sce.pccu.edu.tw/ghost/game/default.htm">征服職場煉獄</a>》，我玩跟<a href="http://www.afoofa.info/blog/">寶貝</a>玩都蠻準的。我玩的結果如下：  </p>
<blockquote>
<p>煉獄指數：45</p>
<p>你覺得目前的工作有些貧乏，也似乎到了一個瓶頸。有時覺得這份工作不算太差，有時覺得自己真要這麼繼續過生活嗎？換工作跑道是心中一直猶豫的議題，不熟悉的職場領域和環境、擔憂自身能力不足、不知道未來會不會更好，這些都是心中拉扯的因素。建議你多和工作場合以外的人接觸，拓展你的生活領域，相信你會從這些人得到一些對未來的啟發和靈感，以及找到屬於自己的勇氣。  </p>
<p>你的職場瓶頸會發生在三種狀況：一、老闆沒有授予你足夠的權力，讓你好好發揮，使你心生鬱卒；二、工作上權力的鬥爭讓你窮於應付；三、老闆信任你的能力，賦予你過多的期望，導致工作量過大，身心難以負荷。</p>
<p>你具備強烈扭轉劣勢的能量，因為你是一個樂觀正向、不逃避問題、善於面對自我的人，因此當困在職場上時，你的韌性會為你贏得最後的勝利。</p>
</blockquote>
<p>據說下一個案子我可能要和大陸的 RD 同事合作，忐忑不安中。:-p</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/671/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>工程師的宿命</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/403/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/403/#comments</comments>
		<pubDate>Mon, 23 Jan 2006 17:33:22 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Feeling]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/403/</guid>
		<description><![CDATA[唉唉，看來我又被調降信用評等了。今天前輩跟我說，部門老大將原本由我負責的案子，轉畫在他底下。於是，我從一開始的同時擁有三個頭頭，到成為無兵之將，再到現在這樣，還沒正式公布，只屬一個頭頭。我知道，這其實不是壞事，我的未來，應該會好過一些。我也知道，這主要是因為專案性質改變的緣故，所以有所調整。但是，最後總歸是讓部門老大出了手，我的心裡，還是有些落寞。 確實，我是有很多「可是」的，但我也知道，這些都可以算是藉口... 文件上沒寫，誰知道 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，我漸漸地有了這樣的想法：因為學管理的比較懂做人，所以作管理時就拼命地教下面學做人。會這樣想當然是覺得這是不對的，怎麼做事，和怎麼做人，是一樣重要的。問題只是，做事的人多半不懂得做人，而會做人的人，則多半不懂得做事，如果只是讓專業的傲慢決定做事或做人何者重要的話，那的確是會變成裡外不是人。 其實，「政治正確」我也不是嗅不出來，對於自保用的心機，我也不是一無所知。但在個性與價值觀的雙重作用之下，我也許還得再經過多年的挫折，才能學懂如何在專業的堅持與工作的目的之間取得平衡，又或是學曉如何放棄。]]></description>
			<content:encoded><![CDATA[<p>唉唉，看來我又被調降信用評等了。今天前輩跟我說，部門老大將原本由我負責的案子，轉畫在他底下。於是，我從一開始的同時擁有三個頭頭，到成為無兵之將，再到現在這樣，還沒正式公布，只屬一個頭頭。我知道，這其實不是壞事，我的未來，應該會好過一些。我也知道，這主要是因為專案性質改變的緣故，所以有所調整。但是，最後總歸是讓部門老大出了手，我的心裡，還是有些落寞。</p>
<p>確實，我是有很多「可是」的，但我也知道，這些都可以算是藉口...</p>
<ul>
<li>文件上沒寫，誰知道 GetSystemTime() 在 WinCE 裡抓不出 milliseconds？配上 eVC 那超慢的 download 速度與超高的失敗率，以及 99% 會失效的 debugger，兩天的時間就這樣浪費掉了。</li>
<li>Porting 當然是要按照原本 function 的 behavior 改寫，按照原本程式的介面邏輯，在目標平台找尋對應 API 完整重寫。這當然是「正確」的事，可惜卻是屬於「政治不正確」的一種。<a href="http://william.cswiz.org/blog/archives/2006-01-09/conceptual-integrity/" target="_blank">Conceptual Integrity</a> 在某些目標導向的情境下，常常是可以被犧牲的一項。以結果論英雄以證明抄捷徑才是正確的，我可以預見未來必定沒有機會補洞，但我沒有權力反對。</li>
<li>有時候碰到那種，說起來很簡單，但其實挺複雜，但對主管來說，又只需要知道很簡單的部分的東西時，還真的是挺讓人無奈只好硬吃黃連的。結果可想而知：「這不是很簡單嗎？不就是在那段 code 的前後記一下時間，相減取得所耗費的時間，為什麼會搞得這麼複雜，還花上半個星期的時間弄？」是啊，但是我必須為了 porting 找解法、測試，為了讓結果能夠印出來，思考良久以決定究竟該不該打洞抄捷徑，更別提中間還穿插為了與正因興起而被大整頓的 Visual SourceSafe repository 之間同步程式碼，而不得不斷地被打斷的開發過程，以及額外支援的抓網站小程式。</li>
<li>平心而論，對於同期或後期的同事，基本上其實我確實是沒有把來自他們的 coding request 放在心裡很重要的地位。但相對來說，雖然說看起來我未來暫時只會有一個頭頭，實際上的情形仍然將會是，來自前輩的交辦事項，還是得認真回應。單一擋箭牌的好處在單一，但缺點也在單一。讓我感到落寞的，正是在此。花了一年學懂了在三個頭頭下做事的方法，可惜又花了一年，才從錯誤中領悟到無兵之將的真正意涵：無兵之將還是兵。未來我有辦法在一個頭頭之下，用對方法態度行事嗎？我不確定，在必須將大部分精力以工程師性格的方式展現的情境下，能有多少心思保護自己不再吃暗虧。</li>
</ul>
<p>工程師的宿命是，要不就 work longer (加班)，然後讓肝爆掉，要不就 work harder (拼命)，讓胃穿孔。Work smarter 真的是藝術啊，還是讓別人的肝爆掉，胃穿孔才是王道。怎麼說呢？好歹自己也念了兩年資管，算是和管理有沾到邊了，然後這幾年看著老爸念 EMBA，我漸漸地有了這樣的想法：因為學管理的比較懂做人，所以作管理時就拼命地教下面學做人。會這樣想當然是覺得這是不對的，怎麼做事，和怎麼做人，是一樣重要的。問題只是，做事的人多半不懂得做人，而會做人的人，則多半不懂得做事，如果只是讓專業的傲慢決定做事或做人何者重要的話，那的確是會變成裡外不是人。</p>
<p>其實，「政治正確」我也不是嗅不出來，對於自保用的心機，我也不是一無所知。但在個性與價值觀的雙重作用之下，我也許還得再經過多年的挫折，才能學懂如何在專業的堅持與工作的目的之間取得平衡，又或是學曉如何放棄。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/403/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>這才是真正的黑手工程師啊！</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/427/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/427/#comments</comments>
		<pubDate>Thu, 19 Jan 2006 04:33:56 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/427/</guid>
		<description><![CDATA[剛剛寫程式寫到一半，突然聽到一陣「嘰拐嘰拐」的聲音，探頭一望，原來是來自桃園廠的同事，拿著鋸子在鋸 PCB 板。這，這才是真正的黑手工程師啊！「機絲」一大車，常常要桃園內湖兩邊載來載去，連鋸子榔頭都準備得好好的，隨時可以派上用場。]]></description>
			<content:encoded><![CDATA[<p>剛剛寫程式寫到一半，突然聽到一陣「嘰拐嘰拐」的聲音，探頭一望，原來是來自桃園廠的同事，拿著鋸子在鋸 PCB 板。這，這才是真正的黑手工程師啊！「機絲」一大車，常常要桃園內湖兩邊載來載去，連鋸子榔頭都準備得好好的，隨時可以派上用場。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/427/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can&#039;t just say &quot;No&quot; to bad old programmers</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/424/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/424/#comments</comments>
		<pubDate>Mon, 16 Jan 2006 15:10:58 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Feeling]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[cpp]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/?p=424</guid>
		<description><![CDATA[最近一直很忙，工作環境裡的一些困境一直在困擾著我，並不是沒有技術可以滿足種種需要，而是這些技術都無法被使用，猶如「被綁縛了雙手的俠客」一般，頓時失去了練在雙手上的功夫，連三歲小孩也打不過。看來，要能武功大成，無論在何種境界皆能自在充裕，還有好大好大的一段距離要努力啊。 拜讀 Jserv 的這篇《思索 C++》，裡面引的這句「just say &#34;No&#34; to bad old platforms」挺有意思的，可惜在軟體工程上，決定一切的通常不是技術因素，而是「錢」。「錢」最為優先，次之為「人」，最後才是「技術」。 小弟我有幸身在一個比較沒有市場壓力的研究單位，因此不需要直接面對「錢」的問題。但相對地，「人」的問題，便首當其衝。這兩年來的整理思考，讓我明瞭了，在實務工作上，除了常要 cross platforms 外，還常常需要 cross programmers，不僅 platform 要跨，連 programmer 也要跨。期待所有會使用到你的程式的 programmers 都能具有某些基本能力，就跟期待碰到的 platforms 可以支援基本的 C99/C++98 一樣，緣木求魚。 更慘的是，我們無法 just say &#34;No&#34; to bad old programmers，因為，不僅 team members 會碰觸到你的程式，你的 customer 也有可能會碰到你的程式。在客戶至上的大前提下，是沒有可能因為客戶不懂 template，就 just say &#34;No&#34; to dummy customers 的。最終，還是得弄出一套 pure C 版本朝聖才行。喔，客戶的問題可能還好解，大不了另外寫個 library 包一下就好了，更可怕的是，你完全有可能會碰到你的 mentor 這樣跟你說：「能不能不要用 [...]]]></description>
			<content:encoded><![CDATA[<p>最近一直很忙，工作環境裡的一些困境一直在困擾著我，並不是沒有技術可以滿足種種需要，而是這些技術都無法被使用，猶如「被綁縛了雙手的俠客」一般，頓時失去了練在雙手上的功夫，連三歲小孩也打不過。看來，要能武功大成，無論在何種境界皆能自在充裕，還有好大好大的一段距離要努力啊。</p>
<p>  拜讀 Jserv 的這篇《<a href="http://blog.linux.org.tw/~jserv/archives/001436.html" target="_blank">思索 C++</a>》，裡面引的這句「<em>just say &quot;No&quot; to bad old platforms</em>」挺有意思的，可惜在軟體工程上，決定一切的通常不是技術因素，而是「錢」。「錢」最為優先，次之為「人」，最後才是「技術」。</p>
<p>  小弟我有幸身在一個比較沒有市場壓力的研究單位，因此不需要直接面對「錢」的問題。但相對地，「人」的問題，便首當其衝。這兩年來的整理思考，讓我明瞭了，在實務工作上，除了常要 cross platforms 外，還常常需要 cross programmers，不僅 platform 要跨，連 programmer 也要跨。期待所有會使用到你的程式的 programmers 都能具有某些基本能力，就跟期待碰到的 platforms 可以支援基本的 C99/C++98 一樣，緣木求魚。</p>
<p>  更慘的是，我們無法 just say &quot;No&quot; to bad old programmers，因為，不僅 team members 會碰觸到你的程式，你的 customer 也有可能會碰到你的程式。在客戶至上的大前提下，是沒有可能因為客戶不懂 template，就 just say &quot;No&quot; to dummy customers 的。最終，還是得弄出一套 pure C 版本朝聖才行。喔，客戶的問題可能還好解，大不了另外寫個 library 包一下就好了，更可怕的是，你完全有可能會碰到你的 mentor 這樣跟你說：「能不能不要用 C++ 寫，我看不懂。」 </p>
<p> 十八般武藝，樣樣俱全，我總是這樣地期許自己，所以自大學時代開始，便東摸摸，西摸摸，舉凡 C/C++/Java 等一拖拉庫語言，到資料庫、物件導向、軟體工程、網路應用、UNIX/Windows programming、System Administration，有機會摸的至少都摸了兩下，摸到現在，總算是混到個雖樣樣不精，但也能得過且過的樣子。但直到現在才發覺，真正的十八般武藝，根本不是這些。作為一個 programmer，我們還需要一點口才，好說服老闆，唬弄客戶，教育同事，也還需要一點行銷技能，以避免 sales 的敷衍與出賣，更需要懂些法律，以便自保也保公司。</p>
<p>  這年頭，日子真難混。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/424/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Calling VC-made DLL from VB</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/291/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/291/#comments</comments>
		<pubDate>Tue, 04 Oct 2005 16:11:36 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[chinese]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[visualbasic]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/?p=291</guid>
		<description><![CDATA[記錄一下從 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 有 [...]]]></description>
			<content:encoded><![CDATA[<p>記錄一下從 VB 呼叫用 VC 製作的 DLL 的心得： </p>
<p><strong>1. 使用 <code class="inline_code">__stdcall</code> 搭配 <code class="inline_code">.def</code> 檔製作 DLL  VC 製作 DLL 的方法。</strong></p>
<p>有兩種方法。</p>
<p>第一種方法是使用 <code class="inline_code">__declspec(dllexport)</code> 宣告要 export 的函式，讓 VC 幫忙製作 stub library，這時預設使用的 calling convension 是 <code class="inline_code">__cdecl</code>。這樣宣告後，VC 會產出 <code class="inline_code">libFoo.dll</code> 與 <code class="inline_code">libFoo.lib</code> 兩個檔案，其中後者就是所謂的 stub library，VC 會自動於 stub library 裡製作對應到 <code class="inline_code">libFoo.dll</code> 裡 <code class="inline_code">_funcFoo</code> 這個 symbol 的 <code class="inline_code">__imp_funcFoo</code>。</p>
<p>這個方法的好處是，在 VC 裡的 project 有 dependency 時，會自動 link 所 depend 的 .lib 檔，使用起來非常方便。</p>
<p>第二種方法是使用 <code class="inline_code">__stdcall</code> 而不用預設的 <code class="inline_code">__cdecl</code> calling convension。Windows API 即是以 <code class="inline_code">__stdcall</code> 的形式存在，若有 <code class="inline_code">#include &lt;windows.h&gt;</code>，也可以用 <code class="inline_code">WINAPI</code> 這個 macro 代替。使用 <code class="inline_code">__stdcall</code> 就不需用 <code class="inline_code">__declspec(dllexport)</code> 宣告，而是必須自行製作 <code class="inline_code">.def</code> 檔案，詳列要 export 的那些 symbols。</p>
<p>由於 VB 只能接受使用此法製作的 DLL，所以我們必須選擇此法。缺點是，製作 <code class="inline_code">.def</code> 檔，當函式一多時，非常麻煩，且對於要 export 的 C++ class，更是複雜，畢竟我們很難人工處理 VC 的 C++ name mangling。</p>
<p><strong>2. 處理 VB 到 C/C++ 之間的型別轉換</strong></p>
<p>VB 與 C/C++ 兩者之間的型別對應，詳見 MSDN，記住幾點原則即可。</p>
<p>首先，VB 的 <code class="inline_code">ByRef</code> 相當於 C/C++ 的 indirect by pointer。所以 C/C++ 的參數若為 pointer 型別，在 VB 便用 <code class="inline_code">ByRef</code> 對應。不過我不清楚像 <code class="inline_code">int***</code> 這種型別，究竟該怎麼對應就是了。</p>
<p>  再來就是，C/C++ 的 <code class="inline_code">char*</code> 對應到 VB 直接是 <code class="inline_code">ByVal As String</code>，因為 VB 的 <code class="inline_code">String</code> 採用 BSTR 的機制，與 C/C++ 的 string 可以相容。只有兩點必須注意： </p>
<ul>
<li>VB 的 <code class="inline_code">String</code> 不以 <code class="inline_code">'\0'</code> 結尾，而是前冠以長度的 header。因此，從 C/C++ 的 DLL 獲得 <code class="inline_code">String</code> 後，必須用 <code class="inline_code">foo = Left(foo, InStr(foo, vbNullChar) - 1)</code> 將 <code class="inline_code">'\0'</code> 之後的部分去掉。</li>
<li>若要傳 output string buffer 進 C/C++ 的 DLL 時，記得必須先製作好該 buffer，否則若 VB 的 <code class="inline_code">String</code> 只有宣告就拿來用，便只是相當於只是傳入一個 <code class="inline_code">NULL</code>。製作 buffer 的方法為：<code class="inline_code">foo = String(BUF_SIZE, vbNullChar)</code>，其中 <code class="inline_code">BUF_SIZE</code> 為 buffer 所需的長度。 </li>
</ul>
<p><strong>3. 記得設定 C/C++ DLL 的 locale</strong></p>
<p> 在 VB 裡，會自動依據所處的 OS 所設定的 locale 而設定 locale，但若呼叫的 DLL 內需要正確的 locale 環境時，便會有問題。因為 VB 設定的是他自己的 locale，而不是 C/C++ 的 locale，因此雖然在 VB 裡的 locale 是對的，但在 C/C++ 寫成的 DLL 裡，locale 仍然是錯的。因此，要記得在 DLL 裡提供對應到 <code class="inline_code">setlocale()</code> 的 export function，讓 VB 可以事先呼叫，設定 C/C++ 的 locale 讓 DLL 用。</p>
<p>  第三點害我今天花了半個下午 debug，累，不過總是把技術問題都搞定了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/291/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bugs: Error 53 when calling functions from custom DLL</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/290/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/290/#comments</comments>
		<pubDate>Tue, 04 Oct 2005 07:10:43 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[visualbasic]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/290/</guid>
		<description><![CDATA[用 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 真的要自求多福才行。]]></description>
			<content:encoded><![CDATA[<p>用 VB6 呼叫用 VC6 寫的 DLL，檔案確實有更新且擺放在 VB 的 project 目錄下了，函式也確實地用 <code class="inline_code">__stdcall</code> 與 def 檔宣告了，但就是會跑出</p>
<p><pre class="code"> Error 53: File not found libFoo.dll</pre>
</p>
<p> 的訊息。</p>
<p>後來查到《<a href="http://www.mvps.org/access/bugs/bugs0019.htm" target="_blank">Bugs: Error 53 when calling functions from custom DLL</a>》這個網頁才知道，是 <code class="inline_code">libFoo.dll</code> 所需要的 <code class="inline_code">libBar.dll</code> 忘了複製過來的緣故。  不過，這什麼鳥蛋 error message 啊，一點提示效果都沒有，難怪查到的<a href="http://www.mvps.org/access/bugs/bugs0019.htm" target="_blank">網頁</a>要用 Bugs 開頭。</p>
<p>看了一下 <a href="http://msdn.microsoft.com/" target="_blank">MSDN</a> 裡 <a href="http://msdn.microsoft.com/library/en-us/vb98/html/idxRealMsgTrap.asp" target="_blank">VB6 的 error code 列表</a>，少的可憐。寫 VB 真的要自求多福才行。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/290/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fw: 在竹科上班嗎？</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/287/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/287/#comments</comments>
		<pubDate>Mon, 03 Oct 2005 14:17:57 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/287/</guid>
		<description><![CDATA[收到的轉寄文。 原作者的算法蠻有趣的......令人深思.....只不過大家都在等園區公司的分紅, 如果沒有分紅, 那麼, 真的可以考慮簡單一點...看到這,真是為這些園區上班的科技新貴感到悲哀,包括我自己在內..在來園區前,對園區有很大的憧憬,非園區的工作不作,來園區幾年後,卻恐懼的要逃離這個地方,商業周刊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年在新竹園區工作生活,呵~不如歸去......... 但是，考慮到下一代的教育問題，處在刺激、新知較多的地方，可能會比較好，至少，會有更多選擇的權力。因此我寧願在都會區生活、扎根。]]></description>
			<content:encoded><![CDATA[<p>收到的轉寄文。</p>
<hr style="width: 100%; height: 2px;" /><em>原作者的算法蠻有趣的......令人深思.....</em><br style="font-style: italic;" /><em>只不過大家都在等園區公司的分紅, 如果沒有分紅, 那麼, 真的可以考慮簡單一點...</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>看到這,真是為這些園區上班的科技新貴感到悲哀,包括我自己在內..</em><br style="font-style: italic;" /><em>在來園區前,對園區有很大的憧憬,</em><br style="font-style: italic;" /><em>非園區的工作不作,來園區幾年後,</em><br style="font-style: italic;" /><em>卻恐懼的要逃離這個地方,</em><br style="font-style: italic;" /><em>商業周刊897期主題『新迴游主張─返鄉工作,可以簡單,也可以富足』,一個環境法碩士</em><br style="font-style: italic;" /><em>,</em><br style="font-style: italic;" /><em>到宜蘭當月薪三萬元的農夫。</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>上個月我去當司機了,月薪三萬。</em><br style="font-style: italic;" /><em>電機碩士放下月薪六萬去幫人家開車,哈~</em><br style="font-style: italic;" /><em>我的同學都在笑我~</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>在新竹,我買一間透天要貸600萬(200萬自備),</em><br style="font-style: italic;" /><em>在新屋,我買一間全新透天要貸150萬,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>在新竹,我負債600萬,每個月要繳房貸3萬7,</em><br style="font-style: italic;" /><em>在新屋,我負債150萬,每個月要繳房貸9仟3,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>在新竹,上班為了怕塞車,6:30起床,</em><br style="font-style: italic;" /><em>下雨天運氣不好,在塞車的車陣中塞1個小時,心裡也罵了一個小時,</em><br style="font-style: italic;" /><em>在新屋,我8:00起床,開車十分鐘到公司,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>在新竹每天7:00出門,22:00回到家,每天在外15個小時,為了那600萬負債,所以我用青</em><br style="font-style: italic;" /><em>春去拚那六萬的薪水,</em><br style="font-style: italic;" /><em>在新屋每天8:15出門,17:15到家,我可以在家吃飯,晚上做我想做的事,因為我負債只有</em><br style="font-style: italic;" /><em>150萬,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>同學問我薪水會不夠用,</em><br style="font-style: italic;" /><em>在新竹,繳完房貸,我只剩下2萬5,</em><br style="font-style: italic;" /><em>在新屋,繳完房貸,我只剩下2萬,</em><br style="font-style: italic;" /><em>只差五仟嘍,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>新竹的新貴因園區而發達,</em><br style="font-style: italic;" /><em>新竹房地產因新貴而發達,</em><br style="font-style: italic;" /><em>新貴的錢最後吐給房地產,</em><br style="font-style: italic;" /><em>自己卻要拚死拚活去工作,</em><br style="font-style: italic;" /><em>這樣的生活,真不知是錢的主人,</em><br style="font-style: italic;" /><em>還是被錢所奴役,</em><br style="font-style: italic;" /><br style="font-style: italic;" /><em>房貸20年,人生有幾個20年,</em><br style="font-style: italic;" /><em>一生中若有10年在新竹園區工作生活,</em><br style="font-style: italic;" /><em>呵~不如歸去.........</em></p>
<hr style="width: 100%; height: 2px;" />但是，考慮到下一代的教育問題，處在刺激、新知較多的地方，可能會比較好，至少，會有更多選擇的權力。因此我寧願在都會區生活、扎根。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/287/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>libMMI 的第一千次 commit</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/256/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/256/#comments</comments>
		<pubDate>Fri, 12 Aug 2005 06:24:15 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[asr]]></category>
		<category><![CDATA[cpp]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/?p=256</guid>
		<description><![CDATA[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++ 推出不同介面，對應功能的版本。 就在剛剛，我做了第一千次的 [...]]]></description>
			<content:encoded><![CDATA[<p>libMMI 是我在工作上，順帶寫的一個程式庫。目的在累積 domain independent 的 know-how，以加速日後程式的建構。發展準則有：</p>
<ul>
<li>Incremental construction - 有用到的 feature 再加，慢慢累積。
</li>
<li>Homogeneous across languages - 橫跨若干 programming language，不同於 C# 的 CLI，只求用法、API 長相差不多就好。目前用到的有 C/C++、Perl、PHP、SH 等程式語言。
</li>
<li>Cross-platform if possible - 盡可能地隱藏 cross-platform 的細節，目前可以橫跨 FreeBSD/Win32 以及 GCC3/MSVC6。不過因為 incremental construction 的發展準則，尚未 porting 的功能，會產生 pre-processor-time 或 run-time error。
</li>
<li>Privode both C/C++ interface if possible - 盡可能地為 C/C++ 推出不同介面，對應功能的版本。
</li>
</ul>
<p>就在剛剛，我做了第一千次的 commit。因此趕緊來賽豬公一下：</p>
<pre><span class="code">SHELL&gt; <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=svn">svn</a> log -r 1 svn+ssh://mmi.jeffhung.idv.tw/svn/libMMI
------------------------------------------------------------------------
r1 | jeffhung | 2004-04-19 17:45:19 +0800 (Mon, 19 Apr 2004) | 2 lines

*** empty log message ***

------------------------------------------------------------------------
SHELL&gt; <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=svn">svn</a> log -r HEAD svn+ssh://mmi.jeffhung.idv.tw/svn/libMMI
------------------------------------------------------------------------
r1000 | jeffhung | 2005-08-12 13:17:46 +0800 (Fri, 12 Aug 2005) | 2 lines

Add ::mmi::util::version class.

------------------------------------------------------------------------
SHELL&gt; <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=svn">svn</a> export svn+ssh://mmi.jeffhung.idv.tw/svn/libMMI/trunk/libMMI
...
SHELL&gt; cd libMMI
SHELL&gt; <a target="_blank" href="http://www.freebsd.org/cgi/man.cgi?query=sloccount">sloccount</a> .
...
SLOC    Directory       SLOC-by-Language (Sorted)
13093   test            cpp=12669,ansic=424
10787   include         cpp=8838,ansic=1949
5764    src_top_dir     cpp=5764
2750    src_mmi         cpp=2750
1898    perl            perl=1898
1123    src_mmi_locale  cpp=1123
912     evaluating      cpp=912
857     src_mmi_string  cpp=857
363     top_dir         ansic=255,sh=108
183     php             php=183
122     src_mmi_utils   cpp=122
34      src_mmi_textproc cpp=34
11      sh              sh=11
0       doc             (none)
0       image           (none)
0       xsl             (none)

Totals grouped by language (dominant language first):
cpp:          33069 (87.26%)
ansic:         2628 (6.93%)
perl:          1898 (5.01%)
php:            183 (0.48%)
sh:             119 (0.31%)

Total Physical Source Lines of Code (SLOC)                = 37,897
Development Effort Estimate, Person-Years (Person-Months) = 9.09 (109.08)
 (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)                         = 1.24 (14.87)
 (Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule)  = 7.34
Total Estimated Cost to Develop                           = $ 1,227,939
 (average salary = $56,286/year, overhead = 2.40).
SLOCCount is Open Source Software/Free Software, licensed under the FSF GPL.
Please credit this data as &quot;generated using David A. Wheeler's 'SLOCCount'.&quot;
</span></pre>
<p>可惜 <a target="_blank" href="http://subversion.tigris.org/">Subversion</a> 沒有如 <a target="_blank" href="http://cvsplot.sourceforge.net/">cvsplot</a> 的工具，要不然就可以畫漂漂圖了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/256/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>是不是念電機的，都以為寫程式很簡單啊？</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/223/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/223/#comments</comments>
		<pubDate>Tue, 19 Jul 2005 16:05:15 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/223/</guid>
		<description><![CDATA[看似簡單的專案，原來並不簡單。 Core library 還真的只作核心的功能，幾乎毫無控制的機制，搞得我必須自己同時維護兩個 thread，各自有各自的 task queue 要持續不斷地進行任務，同時還要必須隨時能夠暫停、復行、終止、啟動、新增任務、插隊、任務重新排序，以及取得目前工作狀態。 另外還有永遠列不完，寫不完的內容修正規則要弄。而這一切，必須要在一個禮拜之內完成，而這一個禮拜裡，有一半的時間必須抽出來，去支援另外一個專案的文件撰寫，零零總總加起來共一天的時間要用來開會，一天颱風假放掉了。就算我有能力在這一年半裡，除了主要的專案之外，另外寫一個五萬行的多語言輔助程式庫，也沒有能力在不到兩天的時間內，寫完這所有的功能啊！ 不行，明天得先找老闆談談才行。不過想到要跟老闆解釋，這裡面的複雜性，好難。:-(]]></description>
			<content:encoded><![CDATA[<p>看似簡單的專案，原來並不簡單。</p>
<p>Core library 還真的只作核心的功能，幾乎毫無控制的機制，搞得我必須自己同時維護兩個 thread，各自有各自的 task queue 要持續不斷地進行任務，同時還要必須隨時能夠暫停、復行、終止、啟動、新增任務、插隊、任務重新排序，以及取得目前工作狀態。</p>
<p>另外還有永遠列不完，寫不完的內容修正規則要弄。而這一切，必須要在一個禮拜之內完成，而這一個禮拜裡，有一半的時間必須抽出來，去支援另外一個專案的文件撰寫，零零總總加起來共一天的時間要用來開會，一天颱風假放掉了。就算我有能力在這一年半裡，除了主要的專案之外，另外寫一個五萬行的多語言輔助程式庫，也沒有能力在不到兩天的時間內，寫完這所有的功能啊！</p>
<p>  不行，明天得先找老闆談談才行。不過想到要跟老闆解釋，這裡面的複雜性，好難。:-(</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/223/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>能夠花錢解決的問題，就不要花力氣去ㄍㄧㄣ</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/217/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/217/#comments</comments>
		<pubDate>Sun, 17 Jul 2005 03:02:24 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Devel]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[cpp]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/?p=217</guid>
		<description><![CDATA[抱歉，在標題裡用了注音符號了，沒辦法，這個台語不曉得怎麼用國語表達。 貓部大概是無意間逛到了我的 Blog，留了個言，提到： 而事實上, 花很多心思去榨出那5%, 10%的效能, 花的時間力氣可能遠超過說服老闆用好一點的hardware/software, 這是很悲哀的. 有時不如花這些時間去跟老闆social一下, 對前途還比較有幫助, 哈&#8230;.工作這麼多年有感. 之前也有類似的經驗。因為我們的辨識引擎還不夠快，所以資深同事打算用 SIMD 靠硬體架構拼效能。我很不以為然，不是因為這樣就會與硬體相依，而是因為在現在的 CPU 架構裡，pipeline、prediction 一大堆，cache 機制、大小也各有巧妙，我才不相信自己搞可以搞的好。 果不其然，在效能瓶頸處改用組語寫 SIMD，結果讓程式的整體速度更慢了。所以我就推薦改用 Intel C/C++ Compiler 試試，在網頁上申請之後，可以有一個月的試用期。如我所料，要靠硬體拼效能，手算是比不上 compiler 算的。換 compiler 帶來的，是 10% 的效能增進，執行速度比 MSVC++6 編譯出來的執行檔，還要少了 10% 的執行時間。 Intel C/C++ Compiler 才一、兩萬台幣，可以永久使用，加買 Support Services Renewal 的話，期限內還可以免費升級。比起 case-by-case 讓工程師花昂貴的時間ㄍㄧㄣ效能，還不一定能夠成功，要來得划算多了。]]></description>
			<content:encoded><![CDATA[<p>抱歉，在標題裡用了注音符號了，沒辦法，這個台語不曉得怎麼用國語表達。</p>
<p><a href="http://nekobe.tku.info/" target="_blank">貓部</a>大概是無意間逛到了我的 <a href="http://www.jeffhung.idv.tw/blog/" target="_blank">Blog</a>，<a href="http://www.jeffhung.idv.tw/blog/articles/jeffhung/210/#comment-148" target="_blank">留了個言</a>，提到：</p>
<blockquote>
<p>而事實上, 花很多心思去榨出那5%, 10%的效能, 花的時間力氣可能遠超過說服老闆用好一點的hardware/software, 這是很悲哀的. 有時不如花這些時間去跟老闆social一下, 對前途還比較有幫助, 哈&hellip;.工作這麼多年有感.</p>
</blockquote>
<p> 之前也有類似的經驗。因為我們的辨識引擎還不夠快，所以資深同事打算用 <a target="_blank" href="http://en.wikipedia.org/wiki/SIMD">SIMD</a> 靠硬體架構拼效能。我很不以為然，不是因為這樣就會與硬體相依，而是因為在現在的 CPU 架構裡，pipeline、prediction 一大堆，cache 機制、大小也各有巧妙，我才不相信自己搞可以搞的好。</p>
<p>  果不其然，在效能瓶頸處改用組語寫 SIMD，結果讓程式的整體速度更慢了。所以我就推薦改用 <a href="http://www.intel.com/cd/software/products/asmo-na/eng/compilers/cwin/index.htm" target="_blank">Intel C/C++ Compiler</a> 試試，在網頁上申請之後，可以有一個月的試用期。如我所料，要靠硬體拼效能，手算是比不上 compiler 算的。換 compiler 帶來的，是 10% 的效能增進，執行速度比 MSVC++6 編譯出來的執行檔，還要少了 10% 的執行時間。</p>
<p>Intel C/C++ Compiler 才一、兩萬台幣，可以永久使用，加買 Support Services Renewal 的話，期限內還可以免費升級。比起 case-by-case 讓工程師花昂貴的時間ㄍㄧㄣ效能，還不一定能夠成功，要來得划算多了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/217/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一次看 15 天份的呆伯特</title>
		<link>http://www.jeffhung.net/blog/articles/jeffhung/208/</link>
		<comments>http://www.jeffhung.net/blog/articles/jeffhung/208/#comments</comments>
		<pubDate>Mon, 11 Jul 2005 15:03:38 +0000</pubDate>
		<dc:creator>jeffhung</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.jeffhung.idv.tw/blog/articles/jeffhung/208/</guid>
		<description><![CDATA[積了好久，剛剛一次把 15 天份的呆伯特看完。當忙到沒時間看呆伯特的時候，這代表什麼呢？]]></description>
			<content:encoded><![CDATA[<p>積了好久，剛剛一次把 15 天份的<a href="http://www.dilbert.com/" target="_blank">呆伯特</a>看完。當忙到沒時間看<a href="http://www.dilbert.com/" target="_blank">呆伯特</a>的時候，這代表什麼呢？ </p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeffhung.net/blog/articles/jeffhung/208/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

