星期四, 5月 25, 2006

呼叫外部程式

剛才在同事的Blog看到呼叫外部程序—ShellExecute

讓我想起十幾年前寫Turbo C 2.0時,都是用exec系列或spawn系列的api。
而這些現在都被M$加上底線,變成deprecated?印象中DOS不會返回原程式,因此又增加spawn系列,是unix沒有的api;system會呼叫shell;蔡明志翻的Turbo C Bible有詳細介紹。

現在.Net似乎都用Process的class處理。
請參考MSDN: http://msdn2.microsoft.com/en-us/library/d6dtz42k.aspx

星期二, 5月 23, 2006

Delegate的好處

原本以為用不到C#的delegate功能,沒想到有一支程式,由於特例太多,寫出許不同狀況下用的method而參數又相同,利用switch變數值去判斷使用那一個method。

接著又因為某因素去修改一個參數值,結果眼花少改一個;實在是受不了,花了15分鐘就改完,結果令我滿意。

範例:


delegate int delegate_method(int i, int j);

public int test_a(int i, int j)
{
return i+j;
}

public int test_b(int i, int j)
{
return i-j;
}

public int test_c(int i, int j)
{
return i*j;
}

public void test_delegate(string q)
{
delegate_method dm;
switch(q)
{
case "plus":
dm = new delegate_method(test_a);
break;
case "minus":
dm = new delegate_method(test_b);
break;
default :
dm = new delegate_method(test_c);
break;
}
Console.WriteLine(dm(3,4));
}

星期六, 5月 20, 2006

加班就是效率低:為效率高者叫屈

出處如下,但似乎不是原創。

http://spn.com.cn/sp1/index/11810.html

加班就是效率低:為效率高者叫屈
--------------------------------------------------------------------------------
  CNET科技資訊網4月11日評論

有一次,聽一位記者誇一位老總說:“你真敬業,總是在加班。”誰知這個老總聽到這樣誇獎並不高興,連忙搖搖手說——加班就是效率低。

  同一件事兒,一個人2 個小時完成,另一個人10分鐘完成,這說明什麼?說明前者工作效率低。而企業老闆往往不這麼看,也許在他的意識裏誰加班多,誰就是敬業。在IT業界有多少效率高者被冤枉成不敬業?又有多少效率低者被稱為敬業,這個案要翻。

  效率高者還加班是管理問題

  不對,有許多工作效率高者還要加班喔,這就不是效率的問題了,而是領導鞭打快牛,工作量管理分配上出問題了。工作量分配管理一有問題,很可能就不是一個環節的問題,而是連鎖性的問題。結果可能是忙的忙死,閑的閑得慌。

   解決管理多環節、工作量不均的問題,就是要解決管理模型的問題。資訊化過程就是管理模型優化的過程。不知道用以下的例子來比擬,是不是在說外行話,每次 去醫院看病,取藥都要排三次隊:一是劃價;二是交錢;三要再回到劃價窗口重新排取藥。每次都聽到排隊的人埋怨,50多年了取藥排3 次隊,這樣的管理模式就沒人管。雖然已經有醫院將3 個視窗合併成了2 個,但為什麼不能用電腦劃價付款取藥,在一個視窗解決三道工序?

  管理混亂重複勞動造成加班

  造成加班的另一個原因也是管理問題。

  如果管理混亂,肯定會有重複勞動,一有重複勞動,8 小時內肯定無法完成工作,肯定要加班。

  舉紙媒體的編輯流程例子吧。甲報社每週出64個版,每週四只要加2.3 小時的班。

  而同樣工作量的週報乙報社,每天都弄到12點以後,如果深入到乙報社內部流程看看,肯定有重複勞動的問題。很可能在出大樣之後又要改文、又要編輯,還要三校。其實這些工序應該在出大樣之前就已經做過一遍了,雙重的工作量使乙報社的工作量翻倍,肯定要加班。

  越加班效率越低

   如果一個人或者是一組人長期加班,工作效率肯定越來越低。每個工作者都是人,不是神,是人就要保證體力和精力,要保證體力和精力就不可能總是不休息、少 休息,否則第二天、第三天、第n 天精力不集中,記憶力衰退,本來幾分鐘就能做完的事兒,一個小時還沒進入狀態,他該休假去了。

  說到休假,中國白領、企業家大多數人不瀟灑,總說自己多忙,多麼沒空兒。實際上再忙也忙不過美國總統、外企中國區總裁,他們再忙也要休假,難道中國白領還能忙過美國總統不成。告訴誰誰也不信。

  為什麼沒有效率大學

   現在高等教育和成人教育五花八門,教技術的、教原理的、教MBA 的、教EMBA的,還有教英語的,教來教去就是沒有效率課,也就是說,幾乎所有的師資力量都在空間上下功夫,失去了時間座標的限制,就算MBA 、EMBA是教管理的,教高級管理的,也沒有開“工作效率如何縮半”之課,結果教了許多方法論,總結了許多的案例,就是沒有如何“一年盈利”之類的課程。

  也許本身的師資力量就不知道CEO 為什麼來上課,更不知道他有一年不完成任務,就要被迫辭職的壓力。

  也有效率高者被逼當偷懶者

   自己效率低還不算,還說效率高者在偷懶的狀況也有。儘管有時不是故意的,但事實是,如果一個效率高者和兩個效率低者合作,在工作流程上,效率高者夾在兩 個效率低者之間,就會造成這樣的局面,前面的工作滯後,中間的效率高者只有靜等,到了中間效率高者提前完成工作,甩給下道工序,領導們就會看到,一前一後 都忙,中間者偷懶,冤啊!再加上效率高者與效率低者工作無法配合,一說此人不僅偷懶,還不好配合,罪加一等。

  結束語

  造成加班效率低的原因還有,資訊化了,所有工作流程都加快了,但領導們開會做決定的時間越來越多,時間越來越長,不加班才怪!

  為什麼資訊化了加班還會越來越多,加班一多,不是效率低嗎?資訊化不是為了提高效率嗎?資訊化絕不是為了讓效率更低。
(ZDNet China)2005-4-12 8:42:37

星期五, 5月 19, 2006

新方法論與新XP

Martin Fowler在新方法論裏介紹各種敏捷軟體開發方法論。簡體中文版(較舊)
林耀珍在敏捷的軟體開發流程也有介紹幾種。

當然,最重要的Agile Methodology仍然是XP (eXtreme Programming),對我而言,以XP精神開發是最重要,配合MSF或是RUP都是其次。

Kent Beck在2004年寫的Extreme Programming Explained — Embrace Change Second Edition提出的新XP:The New XP(PDF)。

個人覺得,軟體工程距離成熟仍有很長的路要走,而目前最人性化的方式應該就是XP,所以,趕快擁抱XP吧。

星期四, 5月 18, 2006

Yahoo採用的技術

Yahoo! and FreeBSD裏David Filo有提到他們採用修改過的FreeBSD,另外Web Server呢?
Yahoo!の独自カスタマイズApache(yapache)とPHPについての資料有提到,Yahoo是用Yahoo修改的的Apache。

這裏有提到要改用PHP http://news.com.com/2100-1023-963937.html

Michael J. Radwin talks有更詳細的歷史,我只看了幾篇,有興趣自己去看,大致整理如下:

最早使用C,稱為Filo Server和Filo Pages。後來做出yscript(C)/yscript2(C++),這都是架構在apache 1.3上,也有用mod_python、mod_perl與perl cgi。

這已經是相當穩定的Framework,但是C++太過複雜,維護不易。他們開始找其他的方案,評估後發現PHP是最適合的技術,效率和記憶體使用都很好。在2002年開始轉換。

到最新一份2006年的簡報裏表示,他們除了有使用Zend和另外的加速器,並且用C++開發自己的extension,預計在年底完成PHP Unicode,號稱PHP6。最讓我驚訝的是在這份簡報裏,mod_perl最快,再來是PHP,最慢的居然是yscript

Yahoo也有回饋Open Source社群,讓這些努力能夠進入新版的程式,創造雙贏。希望不久的將來能夠看到FreeBSD/Apache/PHP的performance能像Yahoo Server那麼好。

窮則變,變則通

http://blog.xuite.net/efchang/network/6449318

這是另類思考的極致。
我們在思考問題時,通常會陷入傳統解法的窠臼。反向思考常能提供更好的解決方式。

花500萬做的Blog

剛看到一則新聞:公司砸500萬設「J-log」部落格 蔡依林公佈...
http://www.hijolin.com

速度頗慢,可能太多人在連。看了一下,是用JSP寫的,再仔細看,怎麼沒有RSS?

這個J-log的功能,看起來是從頭手工打造的;若請Rails高手做,可能一兩天就寫好。我的話....拒絕重造輪子,直接用現成的架站機或無名小站就好。又有人問啦~為什麼你不自己做支援靜態輸出的Blog呢?我的理由是,使用現有的引擎,若效能不夠好,升級時自然會去校調,加上output cache這些功能。OpenSource的意義也在這裏,並不是抓個source來自己做個版本,出新版本時又再幹一次。

500萬,下次讓我去賺好嗎?買台HP DL380架個Wordpress+FreeBSD我只要一天,找幾個美工朋友做幾張圖,在Hinet代管一年...我隨便說說,大夥別認真。

動態網站的缺點

星期二發生一件大事,就是MacBook終於在千呼萬喚下現身,結果造成我現在一直連不上OKIOS。

由前一份工作中學到的技巧告訴我,loading高的網站應該採用靜態與動態並用的方式。簡單地說,一個討論區如果沒有新資料時,先將web page存成html是最簡單的方式也最快,或是用output cache(這是asp.net常用的方式)。

一般的架站機都是純動態網站,拿來當做個人網站還OK,若以100 request/sec來stress,保證大部份都會掛,就算你後端連的是Oracle,用雙核心的CPU,系統的loading也會馬上直線上升;若改用混合模式,至少可以增加一倍以上的capacity。

很多的軟體在系統設計時都犯了大量使用DB的錯誤,這是典型的反模式,但大家卻樂此不疲,實在令在下不解呀~

星期二, 5月 16, 2006

和我有類似看法的人

在Xexex's Java看到 a little Ruby on a little Rails ,他也覺得Rails不適合當企業平台。

事實上,如果用Visual Studio 2005加SQL 2005 Express並不會比Rails慢多少,而且不需要懂多少API也不需要寫太多code。

我還是喜歡自己一步步建出來的網頁搭Struts之類,感覺比較能掌控。

再強調一次,Ruby/Rails是好東西,但並不一定適合所有人,也不可能適用所有場合。

星期六, 5月 13, 2006

VCS的操作

嗯...有些同事不太瞭解VCS的操作,所以我大概寫點概念,有經驗的人請儘量上來討論,最近我會專注在團隊開發與敏捷流程。

VCS最早是在Unix上有RCS,後來演變成為CVS,因此大多數的術語都以此為主,其他廠商推出的VCS雖然術語有所不同,但觀念和操作步驟大同小異。

1. VCS的資料儲存在Repository,必須先在Repository產生一個Module或叫Project。
2. 若是團隊開發,通常SA/SD會先做好module/project,你要做的是checkout module/project。
3. 自己新增的程式/文件要add進module,真正上傳的動作叫Commit(TFS叫Check in)。
2. 如果有現成的Code,可以Import Module,在CVS import module時會產生新的module。TFS必須先產生project,add後再check in。
5. 把別人更新的部份抓下來叫Update,若是真正在公司開發,建議每天下班一定要commit,而上班時先update。
6. 遇到兩個人都修改同個程式時,稱為conflict,此時最好手動處理,通常VCS自動處理都是merge,有些時候不注意就造成bug。
7. 若覺得穩定性夠時,就可以tag成release 1.0、beta1等等名稱,在checkout時會比較方便。
8. 有時候要做大規模的修改或是準備下一個發行版本時,就可以產生branch。分支是一個非常有用的東西,例如說Apache 1.x版可以繼續在同一個VCS儲存,但同時另一組人也在開發Apache 2.x。當branch要整合回主幹時,就使用merge,當然也可以反過來。

VCS是Team Development的基礎,這一關都過不了其他的就不用提。除VCS外,還有Unit Test、Integrate Test、Code Convention等,有空我再寫一點介紹。

該全面換到Subversion

使用CVS(Concurrent Versions System)這個 VCS(Version Control System)將近十年,當初也是看在它跨平台而且不像VSS只能check out一份unlock。但CVS不支援rename,只能刪除新增,對於之前的版本就無法追蹤。另一個CVS的缺點是只看日期,而Subversion 是比對差異,因此CVS的許多問題不會在Subversion出現。

目前我有一部份程式是CVS與Subversion同時儲存但有些更新的問題,我打算找時間把CVS全換成Subversion,等到公司的TFS上線後,TFS專案會採用與Subversion並存的方式。

ALM 應用程式生命週期管理

ALM: Application Lifecycle Management 應用程式生命週期/軟體生命週期 管理

我找到的資料
http://www.borland.com/tw/products/alm/index.html
http://www.microsoft.com/taiwan/msdn/security/dnsecure/sdl.mspx
http://www.microsoft.com/taiwan/press/2005/03/0329.mspx
http://www.ca.com/tw/news/share/index.htm

會注意ALM是因為前兩天去上VSTS二日課程,內容在介紹VSTS團隊開發的方式,使用MSF for Agile。時間很趕,似乎是把美國的教材壓縮後在兩天講完。幸好我對SCM、Unit Test和Test Tool有些經驗,不然上起來會很吃力。

不可否認,原本非常昂貴的Case/ALM Tool在微軟把ALM整合至Visual Studio後,讓一般公司也可能會引進完整的開發流程(當然便宜是相對值,對一個5人小組而言,完整的VSTS環境也要50萬~100萬)。SCM僅是 ALM中的一小環,而MS整合設計、分析、測試、開發於同一工具,比起早期Rational的工具更勝一疇(因為我在這裡待太久,不知道現在IBM的 Tool有沒有整合到WebSphere)。

除了買Borland/IBM/MS的ALM工具外,難道就沒有辦法了嗎?目前似乎是的。好消息是Eclipse在2006年3月成立ALF,以後還是有機會,只是還得等上一陣子。Eclipse的Project很多,像TPTP就是針對Test,等到那一天整合起來,可能又會再度讓某些公司活不下去。

我的OS使用經歷與寫過的程式語言

第一台開始流行的個人電腦應該要算Apple II,我自己的是宏碁的小教授三號,算Apple Compatible,但是只有98%左右,有2%的程式會有問題。

仔細想想,我也用過了不少作業系統,到老了可能自己都記不得,先寫下來好了。
Apple DOS -> Apple CP/M -> MS-DOS 3.3 -> MS-DOS 4.01 -> MS-DOS 5.0 -> Win 3.0 -> MS-DOS 6.0 -> Win 3.1 -> OS/2 2.0 -> Linux 0.9 -> Win 95 (Dos 7.0) -> WinNT 3.5 -> WinNT 3.51 -> OS/2 2.1 -> Win 95 OSR2 -> WinNT 4.0 -> IRIS -> HPUX -> FreeBSD 2.x -> Win98 -> Linux 1.x -> OS/2 Warp -> FreeBSD 3.x -> Solaris 2.8 -> Win 2000 -> BEOS Personal -> FreeBSD 4.x -> Linux 2.x -> WinXP -> FreeBSD 5.x -> Win 2003 -> OS X 10.4 -> FreeBSD 6.x

懶得畫表格,所以有些是同時在使用的,像Linux除了早期0.9版是只有 Slackware外,其他的發行版我試過太多種,很多像藍點這種一閃即逝,所以就只記Kernel版本。而其中像IRIS、HPUX、BEOS並沒有太深入研究,Solaris則是沒有管理權限。如果有仔細看的人就知道,我的Apple II用了六年才換386 SX-25,所以中間的IBM PC XT/AT都沒用過。

目前手邊有在用的只有 Win 2000/XP/2003,FreeBSD 4.x/5.x/6.x,OS/X及Linux。比較可惜的是沒有新版OS/2,我一直覺得它是很棒的OS,當年我有它根本不想用Win31。

國中時才有電腦,所以我學的程式就沒有Randy那麼久。有寫過的程式語言有Apple Basic、6502 Assembly、Apple Fortran、Fortran 77、Turbo C 2.0、8086 Assembly、GWBasic、Turbo Pascal、Lisp、Prolog、C++、Java、Javascript、Perl、PHP、Python、VB6、VBScript、C#和 VB.net。
以上這些,真正有用一段長時間的Apple Basic、Fortran 77、Turbo C 2.0、GWBasic、Lisp、Prolog、C++、Java、PHP、VB6、C#。會用這麼多種,有些是在大學時修課用到,像Fortran、 Lisp、Prolog,其他的就是興趣,而Java則用來寫論文因此最熟。PHP和Perl是我在.com公司工作時學的,也寫了一些小東西,但不算專精。花我最多心思結果害我研究所考不好的就是超複雜的C++,而且當年我學會寫template卻遇到一堆compiler的bug,無法正常運作;到現在的compiler才讓我滿意,可惜沒有再寫C++了。

這兩年因為工作都在寫C#,兩年前花了一點時間準備後去考SCJP與SCWCD,但只是多花一萬考試費,在這間公司一點用都沒有,所以我也不想再花錢去考MCSD之類。

對了,除了大學時有上過Fortran、Lisp及Prolog,我沒有去上過其他程式語言的課程,相信許多同好也和我相同。

12 core practices of XP

以下摘自 http://www.jera.com/techinfo/xpfaq.html

The 12 core practices of XP are:

1. The Planning Game: Business and development cooperate to produce the maximum business value as rapidly as possible. The planning game happens at various scales, but the basic rules are always the same:
1. Business comes up with a list of desired features for the system. Each feature is written out as a User Story, which gives the feature a name, and describes in broad strokes what is required. User stories are typically written on 4x6 cards.
2. Development estimates how much effort each story will take, and how much effort the team can produce in a given time interval (the iteration).
3. Business then decides which stories to implement in what order, as well as when and how often to produce a production releases of the system.
2. Small Releases: Start with the smallest useful feature set. Release early and often, adding a few features each time.
3. System Metaphor: Each project has an organizing metaphor, which provides an easy to remember naming convention.
4. Simple Design: Always use the simplest possible design that gets the job done. The requirements will change tomorrow, so only do what's needed to meet today's requirements.
5. Continuous Testing: Before programmers add a feature, they write a test for it. When the suite runs, the job is done. Tests in XP come in two basic flavors.
1. Unit Tests are automated tests written by the developers to test functionality as they write it. Each unit test typically tests only a single class, or a small cluster of classes. Unit tests are typically written using a unit testing framework, such as JUnit.
2. Acceptance Tests (also known as Functional Tests) are specified by the customer to test that the overall system is functioning as specified. Acceptance tests typically test the entire system, or some large chunk of it. When all the acceptance tests pass for a given user story, that story is considered complete. At the very least, an acceptance test could consist of a script of user interface actions and expected results that a human can run. Ideally acceptance tests should be automated, either using the unit testing framework, or a separate acceptance testing framework.
6. Refactoring: Refactor out any duplicate code generated in a coding session. You can do this with confidence that you didn't break anything because you have the tests.
7. Pair Programming: All production code is written by two programmers sitting at one machine. Essentially, all code is reviewed as it is written.
8. Collective Code Ownership: No single person "owns" a module. Any developer is expect to be able to work on any part of the codebase at any time.
9. Continuous Integration: All changes are integrated into the codebase at least daily. The tests have to run 100% both before and after integration.
10. 40-Hour Work Week: Programmers go home on time. In crunch mode, up to one week of overtime is allowed. But multiple consecutive weeks of overtime are treated as a sign that something is very wrong with the process.
11. On-site Customer: Development team has continuous access to a real live customer, that is, someone who will actually be using the system. For commercial software with lots of customers, a customer proxy (usually the product manager) is used instead.
12. Coding Standards: Everyone codes to the same standards. Ideally, you shouldn't be able to tell by looking at it who on the team has touched a specific piece of code.

以上這些,我只有做到4. 簡單設計、6.重構及10. 四十工時
其實我也有做一些5. Unit Test但不夠全面,主要是沒有7.雙人開發。

Extreme Programming

Windows自動登入

除了可以下載PowerToy裡的TweakUI設定自動登入Windows外,也可以直接改機碼:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
增加以下3個:
AutoAdminLogon 字串值 1
DefaultDomainName 字串值
DefaultUserName 字串值
DefaultPassword 字串值

另外在Winlogon裡其他好玩的機碼:
Shell
ShutdownWithoutLogon

WinPE

這是自己用的備忘錄。
WinPE是未來在Vista用的安裝光碟,也是維修Windows可以用的LiveCD,兩年前有拿到企業用版。
Windows 預先安裝 Windows 預先安裝環境概觀
以下是Google找到的2004年XP SP2版
繁體中文版
英文版
簡體中文版

BartPE
其他的討論
http://www.pczone.com.tw/vbb3/showthread.php?t=55925
http://home.so-net.net.tw/dseditor/pepnp/
http://www.aptv38.dsl.pipex.com/Plugins/pluginlist.htm

BartPE的中文化很麻煩,一位Semson本來有放出來,但現在似乎連不到。幸好我手上還有這個pecwin.inf。

本來官方版的PE並沒有自訂環境的功能,但現在看到中文的解釋會有。
而BartPE的優點是可以自訂軟體,而且已經有許多plugin,目前可以拿來安裝chkdsk和Adaware、DefragNT及其他防毒軟體,這是我所需要的功能。

星期三, 5月 10, 2006

Linux比較快?

今天看到Checko's Blog: Linux : Still the Fastest
我倒沒有太驚訝,之前也對OSX抱很大希望,不過Randy有告訴我其實OSX並不快,而XP若沒灌什麼垃圾也是跑得相當快的。最近Apple也傳出要丟掉Mach的謠言,若純用FreeBSD再加上ZFS,就很有可能打敗Linux,至少不會最後一名。