Planet Linux of Taiwan

01月28日

hoamon's sandbox's face
hoamon's sandbox


縮小 展開

2011年 1- 11 月創世基金會的平均每張發票中獎金額還是偏低!!!

 

因為 2011 年的獎號組合數都是一樣: 1000萬 1 組、 200 萬 1 組、頭獎 3 組外加兩組 200 元的。所以 2011 年的發票期望值就等於上表所計算的 1.425元(稅後)。而創世基金會的兌獎結果如下:

歷年發票兌獎情形

仍舊有 (1.11-1.425)/1.425 = -22.105% 的差距。而 2008 年的差距是 -14.3% 2009 年的差距也才 -10% 。我滿懷疑他們是如何對獎的。

再重申一次我所想的可能原因:
  1. 部份人士把沒中的發票才寄給創世基金會,所以增加了發票總數
  2. 內部兌獎人員錯把中獎發票當成未中獎發票,所以降低了得獎金額,這問題還算小
  3. 內部兌獎人員私吞中獎發票,所以降低了得獎金額,這問題比較大
  4. 財政部所公告的中獎號碼是在發票銷售之後,所以它調整過中獎發票的數量
  5. 純粹是命運造成的
實在很希望有那個記者(我已投到 weReport 去了)能去挖挖看。或許這報導能減少公益團體對電子發票的憂心

事實上,改為電子發票後, 1 、 2  、 3 的原因就不會發生了,只有 4 、 5 有可能發生。我想看看在「電子發票」盛行後,創世基金會的兌獎情形是否會提高?

== 後記 ==

改以電子發票捐款後,應該是無法算出平均每張兌獎金額,因為「電子發票」是中獎後再捐贈的。

richliu's face
richliu


縮小 展開

cygwin package manager

cygwin 要使用 install 非常麻煩.
apt-cyg 這個套件提供了一個非常好的安裝方式, 雖然每次都還要跑一次 download setup.bz2 的動作.
但是總比要去使用那個鳥到爆的 setup.exe 好太多了.

簡單 install 方法

# wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg
# chmod +x apt-cyg
# mv apt-cyg /usr/local/bin/

Help


$ apt-cyg
apt-cyg: Installs and removes Cygwin packages.
  "apt-cyg install <package names>" to install packages
  "apt-cyg remove </package><package names>" to remove packages
  "apt-cyg update" to update setup.ini
  "apt-cyg show" to show installed packages
  "apt-cyg find <patterns>" to find packages matching patterns
  "apt-cyg describe </patterns><patterns>" to describe packages matching patterns
  "apt-cyg packageof <commands or files>" to locate parent packages
Options:
  --mirror, -m <url> : set mirror
  --cache, -c <dir>  : set cache
  --file, -f <file>  : read package names from file
  --noupdate, -u     : don't update setup.ini from mirror
  --help
  --version

安裝

# apt-cyg install git

找套件

# apt-cyg find git

若是不想每次都要升級 setup.bz2, 可以使用 -u
使用 -m 可以指定 mirror site.

# apt-get -u install git

如果不想每次都指定 mirror site, 就直接改主程式吧

# vim `which apt-cyg`

     68   mirror=ftp://mirror.mcs.anl.gov/pub/cygwin
     69   cache=/setup

這二行可以修改 default mirror site and cache directory.

總結, 非常實用.

ref.
Installing Cygwin packages from the command-line [closed]

PlurkTwitterYahoo BookmarksGoogle BookmarksFacebookFunPShare

01月27日

AppleBOY's Blog's face
AppleBOY's Blog


縮小 展開

用 Ubuntu 10.10 Live CD 重新安裝 GRUB 2 到 Bootloader

logo-Ubuntu

今天起床打開電腦,Ubuntu 跳出 Warning 訊息,boot 磁區剩下 84MB,所以我手殘進去 /boot/ 目錄,把舊的 Kernel 清除,不小心砍掉 initrd.img-2.6.35-32-generic Linux Image 開機所需要的檔案,結果之後開機出現

You need to load the kernel first

大家好像都是升級 Kernel 之後才會出現上述狀況,網路上找到的解答都不符合我的需求,所以我又往 GRUB2 開機 Boot 去瞭解,新的 GRUB 2 跟原先的 GRUB 的解法已經完全不同了,沒有 /boot/grub/menu.list,而被 /boot/grub/grub.cfg 取代,所以不應該在手動編輯此檔案。grub.cfg 會在有更新 Kernel 版本時,手動執行 update-grub 的時候被修改覆寫。這次發生的原因是在我把舊版 Kernel 刪除,而忘記執行 update-grub,這時候的最佳解法就是透過 Live CD 來救援。

Ubnutu Live CD 救援

先把 Ubuntu Live CD 放入,直接先選 Try Ubuntu,接著就會進入桌面,將 Terminal 打開 (Applications -> Accessories -> Terminal),之後只要按照底下步驟就可以成功還原 boot loader。

1. 首先確定系統的根目錄以及 boot 磁區代號,大致上都是 sda1, sda5 等等,可以透過 fdisk -l 來瞭解這些資訊。

$ fdisk -l

輸出底下結果

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13       96256   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              13       38914   312471553    5  Extended
/dev/sda5              13         499     3905536   82  Linux swap / Solaris
/dev/sda6             499        5362    39061504   83  Linux
/dev/sda7            5362       38914   269502464   83  Linux

2. 將 / 跟 /boot mount 到任意目錄

$ sudo mkdir /mnt/root
$ sudo mount -t ext4 /dev/sda6 /mnt/root
$ sudo mount /dev/sda1 /mnt/root/boot

建立 /mnt/root 目錄,用來掛載自己的 Linux 系統,/dev/sda6 是原先 / 磁區,而 /dev/sda1 則是 /boot 區域

3. 掛載 critical virtual filesystems,請執行底下 command

$ for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt/root$i; done

4. 用 chroot 指令切換到 system device

$ chroot /mnt/root /bin/bash

5. 重新將 Kernel 安裝

$ sudo apt-cache search linux-image

找到您要的版本後重新安裝

$ sudo apt-get install linux-image-x.x.x-xx

6. 更新 /boot/grub/grub.cfg

$ update-grub

7. 重新安裝 GRUB 2

$ grub-install /dev/sda

8. 重新確認是否安裝成功

$ grub-install --recheck /dev/sda

9. 按 CTRL-D 離開 chroot

10. 卸載全部虛擬系統

$ for i in /sys /proc /dev/pts /dev; do sudo umount /mnt/root$1; done

卸載 boot 及 / 系統

$ sudo umount /mnt/root/boot
$ sudo umount /mnt/root

11. 重新開機

$ sudo reboot

結論

因為不小心砍一個系統開機檔案,所以花了一些時間找資料,以及瞭解 GURB2,這樣也是不錯啦 XD,底下是參考的一些資料

Reference:
[SOLVED] Can’t start ubuntu (WUBI) : You need to load the kernel first
Clean up your grub menu and the kernels you do not use
Ubuntu Wiki Grub2
How to Restore Grub 2 As The Main Bootloader
How to create edit/extract initrd in Ubuntu/Debian and Redhat/Fedora Linux ?
Howto: Upgrade Linux Kernel
Clean Up the New Ubuntu Grub2 Boot Menu

Related View

01月26日

黑眼珠's face
黑眼珠


縮小 展開

Hime 輸入法 for openSUSE


Hime 首頁:https://github.com/caleb-/hime/
Hime 是由 gcin 輸入法分支出來開發的,
http://tetralet.luna.com.tw/index.php?op=ViewArticle&articleId=234&blogId=1
兩方面仍維持合作的關係,
不過可能開發的重心會不一樣,
也就是說,隨著時間流逝,兩者的差別將越來越大
如果您想要嘗試一下 hime
可以由 home:swyear 套件庫安裝
以 openSUSE 12.1 為例:
# zypper ar obs://home:swyear/openSUSE_12.1 swyear
(若已經加過 home:swyear 套件庫,上面步驟不必再做)
# zypper in hime

重新登入後會自動改用 hime
(這裡的優先順序並不代表任何的偏好,
只是希望新安裝一個輸入法後能順利的切換)

若要改回用其他輸入法可以
1. 移除 hime,回到您的原本設定
2. 要同時保有 hime
在 ~/.profile 加上
export INPUT_METHOD=gcin

全域設定在 /etc/sysconfig/language
設定
INPUT_METHOD=gcin

或其他您想要的輸入法

01月25日

Tetralet's face
Tetralet


縮小 展開

賀!HIME 已進入 Debain Offical Repository,Luna's Debain Archiver 退居幕後!

感謝 Yao Wei 的辛勞奔走,目前 HIME 已進入 Debian 官方的套件庫,您應該已經可以使用 apt 工具直接由 Debian 官方下載安裝 HIME 了。為了衝 Debian Popularity Contest個人建議您能轉用 Debian 官方的套件庫,而 Luna's Debian Archiver 則退居第二線,回歸原本的 (不負責) 私人套件站台。

當然,本站台上的 HIME deb 仍會持續更新。但因為是私人站台,很多做法上可能會較為我行我素甚至是自以為是,若您還是想使用本站的 deb 的話,還是請小心謹慎為上。

以下為 Luna's Debian Archiver 和 Debian 官方 deb 已知的不同點:

  1. 本站支援較舊的 Debian/Ubuntu 版本,包括 Debian Lenny、Squeeze 及 Ubuntu Lucid (10.04 LTS)、Natty(11.04)、Oneiric(11.11)。
    Debian Lenny 的支援會於 2012/2/6 日後終止;Ubuntu Lucid
    的支援則在 Precise (11.04 LTS) 推出後終止。

  2. 本站的 deb 某些預設值和 HIME 官方的不同。
  3. 本站的 deb 針對 Ubuntu 的使用者有些小小的特別修正。

  4. 本站的 deb 裡包含一些 DFSG non-free 的軟體,像大易三碼的碼表。

  5. 本站會視情況提供較新、較快速的 git 嘗鮮版。

  6. 本站僅提供 i386/amd64 之套件。Debian 官方無意外的話,會提供所有 Debian 已支援平台的 deb。

  7. 提供 hime-qt3-immodule 套件。 
  8. 分離出 hime-icon-themes 套件。

  9. hime-datahime-tables 的套件內容和 Deian 官方後來所提供的不同。(註)

  10. 提供 hime-dbg 套件以供除錯。

  11. 提供 im-config 較合理的設定檔。

而以下為本站所提供的 hime 套件相關列表及說明:

hime:
主程式。
(內含檔案可能和 Debian 官方的 hime 套件有異:本站 deb 還包含了 /usr/share/hime 裡,和處理器平台相關的檔案。)
hime-data:

主要內容為 /usr/share/hime 裡,和處理器平台無關的檔案。必須安裝
另外包含了給 im-config 使用、但較合理的設定檔。
(內含檔案和 Debian 官方的 hime 套件不同,本站 deb 還包含/usr/share/hime/table/ 裡,和處理器平台無關的檔案。)

hime-tables: 主要內容為 /usr/share/hime/table/*.gtab
若您是 詞音/新酷音/anthy 的使用者,可不必安裝此套件。
(內含檔案和 Debian 官方的 hime-tables 套件不同,Debian 官方包含了 /usr/share/hime/table/ 裡所有的檔案。)
hime-icon-themes: 內為 pinkblackdark這三組 icon theme。hime 內建的則為 blue 這組 icon theme。
(Debian 官方無此套件,被整合至 hime 套件裡)
hime-gtk3-immodule: GTK3 輸入法模組。
但 GTK3 目前只出現在 Debian Wheezy / Ubuntu Oneiric 裡,所以本站台所提供的 hime-gtk3-immodule只有在 Debian Wheezy / Ubuntu Oneiric 版才有。
如果您已升級至 GNOME3,或系統是 Ubuntu 11.10,請務必記得安裝本套件!
hime-qt3-immodule: QT3 輸入法模組。
(Debian 官方無此套件
hime-qt4-immodule: QT4 輸入法模組。
hime-anthy: anthy 日文輸入法模組。
hime-chewing: libchewing 新酷音輸入法模組。
因為 libchewing 版本過舊,Debian Lenny 裡並沒有提供 hime-chewing套件。
hime-dbg: gdb 除錯資訊。
如果您在使用 HIME 時卻發生了問題,您可以安裝此套件後,利用 dbg 來替 HIME 除錯。請參考:Linux 除錯利器 - GDB 簡介
(Debian 官方無此套件)
hime-dev: header files,若要套用 distro/dev-tools/patches/rxvt-unicode-9.14.diff 並編譯 rxvt-unicode 時會用到。

本站的 hime 套件會如此分割的主因是除了想要減輕本站硬碟空間的負擔之外,也希望讓一般 詞音/新酷音/anthy 使用者只要安裝 himehime-data 套件即可,不必一定要安裝 hime-tables 套件。(Debian 官方套件目前的做法是一定要安裝 hime/hime-data/hime-tables 這 3 個套件。)

因此,不管您是想轉而使用 Debian 官方的 hime 套件,或是想換用 Luna's Debian Archiver 的套件,建議您能先將 hime 完全移除後再轉換 deb 站台

當然了,因為是私人站台,當然是以惡搞為上。如果您想用 Luna's Debian Archiver 的套件的話,建議您在下載安裝前請務必三思。若您遇到了什麼奇怪的問題,或是套件版本未能即時更新,請您不吝向敝人反應。謝謝!

AppleBOY's Blog's face
AppleBOY's Blog


縮小 展開

01月22日

かいお's face
かいお


縮小 展開
Tetralet's face
Tetralet


縮小 展開

如何自行編譯/打包/測試/回報/參與 HIME?

如果您想自行編譯 HIME,以下提供了簡單的步驟:

原始碼位置:

您可以在 https://github.com/caleb-/hime/downloads 取得 HIME 的最新穩定版/開發版 tarball。
穩定版 tarball 備份站:http://hime.luna.com.tw/

所需套件:

必需套件build-essential libgtk2.0-dev/libgtk-3-dev libxtst-dev

build-essential 是 Debian 的一個虛擬套件,裡面包含了一些編譯時的必要套件,像 gccmake 之類的;如果您使用的是其它的 Linux Distribution,可能要找找看有沒有類似的套件。

選用套件libanthy-dev libchewing3-dev libgtk2.0-dev/libgtk-3-dev libqt3-mt-dev libqt4-dev libappindicator-dev gettext

libanthy-dev: 如果要加入 anthy 的支援的話
libchewing3-dev: 如果要加入 新酷音 的支援的話。注意至少要使用新酷音 0.3.2 以上才能順利編譯喔!
libgtk2.0-dev 如果要編譯 GTK2+ 輸入法模組的話
libgtk-3-dev: 如果要編譯 GTK3+ 輸入法模組的話
libqt3-mt-dev: 如果要編譯 QT3 輸入法模組的話。
因為要 QT3 im-modules 能動作需在 QT3 上套用一個非官方的修正程式,請確認您的系統有套用此修正程式,再啟用 --enable-qt3-immodule 選項來編譯 QT3 輸入法模組。
libqt4-dev: 如果要編譯 QT4 輸入法模組的話
libappindicator-dev:
如果要支援 Ubuntu 的 Unity Tray 的話。注意至少要使用 Ubuntu 11.10 的 libappindicator-dev 0.4.1 以上才能順利編譯喔!
gettext:
如果要編譯翻譯檔的話。覺得沒必要的話記得指定 --disable-nls

HIME 可以在純 GTK2+(libgtk2.0-dev) 或 GTK3+(libgtk-3-dev) 環境下編譯。在編譯時會同時編譯相對應的 GTK2+/3+ 輸入法模組。

解開原始碼

目前 HIME 的官方原始碼是用 xv 壓縮的。所以請以以下指令解開下載來的原始碼:
tar xJf hime-0.9.9.tar.xz

編譯流程:

清除上次編譯所殘留下來的暫存檔:

在開始編譯之前,請順手清除上次編譯所殘留下來的暫存檔,以確保您的 HIME 是全新編譯的:
make clean distclean
HIME 支援以下的 make 指令:
make clean:
清除在 make 過程中所產生的所有中繼檔,如 *.o 之類的。
make distclean:
清除由 configure 所產生的設定檔。
make:
編譯 HIME。
make install:
將 HIME 安裝至系統中。
HIME 目前尚未支援 make uninstall 指令。

執行 ./configure 並設定 CFLAGS、CC--prefix 及其它編譯選項

可以使用 CFLAGSCC 來指定 HIME 所要使用的編譯程式和它的 CFLAGS。目前 HIME 支援了 gcc/clang 編譯程式,預設的 CFLAGS 則為 -Wall

也可以藉由 --prefix 來指定 HIME 的安裝路徑,建議要小心得修改這個值,像是 Debian User 應該指定為 /usr;否則 GTK/QT im moduels 很可能會安裝在錯誤位置。

如果您的系統中同時有 GTK2+ 及 GTK3+,但您想編譯 GTK3+ based 的 HIME,請記得加上 --with-gtk=3.0 選項。

如果您沒安裝 gettext 套件,您可能得下達 --disable-nls HIME 不會去編譯翻譯檔。

綜合範例如下:
CFLAGS="-g -Wall -Os" ./configure --prefix=/usr --with-gtk=3.0 --disable-nls
HIME 目前所提供的編譯選項如下:
--prefix=PREFIX 指定安裝路徑。預設為 /usr/local
--with-gtk=2.0|3.0 要以 GTK2+ 還是 GTK3+ 來編譯 HIME。預設為 2.0。
--disable-nls 不編譯翻譯檔,目前預設介面為繁體中文。
--disable-xim 不使用 XIM。
--disable-system-tray 不使用 System Tray。
--disable-tsin 不使用詞音。
--disable-gtk2-im-module 不編譯 GTK2+ 輸入模組。預設為自動偵測。
--disable-gtk3-im-module 不編譯 GTK3+ 輸入模組。預設為自動偵測。
--enable-qt3-immodule 編譯 QT3 輸入模組。預設為自動偵測。
--disable-qt4-immodule 不編譯 QT4 輸入模組。預設為自動偵測。
--disable-anthy 不支援 anthy。預設為自動偵測。
--disable-chewing 不支援 chewing。預設為自動偵測。
--disable-appindicator 不支援 Ubuntu Unity Tray。預設為自動偵測。
--qt3-moc-path=PATH 指定 QT3 的 moc 指令的路徑。
--qt4-moc-path=PATH 指定 QT4 的 moc 指令的路徑。
--qt4-im-module-path=PATH 指定 QT4 輸入模組的安裝路徑。

開始編譯

接下來只要下達 make 就會開始編譯了。如果在編譯過程中遇到任何問題,請您不吝向我們回報:
make
如果編譯一切順利,您就可以開始測試/除錯 HIME 了。請參考下個章節的介紹;或是把 HIME 安裝在系統裡,請參考下個步驟。

HIME 安裝至系統裡:

如果編譯的過程中沒出現任何問題,您可以利用以下指令把 HIME 安裝到系統裡:
make install
註:為了維護您系統的純淨度,請儘量利用系統的套件機制來安裝軟體。自行用  ./configure && make && make install 來編譯軟體並將軟體直接安裝到您的系統裡可能會搞亂您的系統並使得您的系統套件機制混亂。請戒而慎之。

自行打包 deb 套件:

為了確保您的系統的純淨度,在此強烈建議把 HIME 打包成 deb 套件後再用 dpkg 指令來安裝 hime 套件。這在 HIME 裡這完全不是難事,只要先安裝好 fakerootdebhelper,以及上文所寫的必需/選用套件,然後執行以下指令即可生成 hime_0.9.9+git120115-1_amd64.deb 了:
sh distro/debian/gen-deb
然後用 dpkg 把它安裝起來即可:
dpkg -i hime_0.9.9+git120115-1_amd64.deb

自行打包 rpm 套件:

這部份由於筆者對 rpm 系列實在不熟,尚待強者補完。

測試 HIME

HIME 還提供了一個小小 script 可以讓您不用將 HIME 安裝至系統裡,就能直接執行 HIME 並進行測試/除錯。

首先,請先安裝 gtk2.0-examples gtk-3-examples 這幾個套件,然後執行以下指令即可:

sh distro/dev-tools/scripts/test-hime
如果以上指令失效,您可能要稍加修改 distro/dev-tools/scripts/test-hime 才能讓這個小測試程式能夠動作。例:
GTK_2_DEMO_APP=leafpad ← 測試 GTK2+ 的程式。您可以考慮在此指定為 leafpad 之類的 GTK2+ based 應用程式。
GTK_3_DEMO_APP=
l3afpad ← 測試 GTK3+ 的程式。您可以考慮在此指定為 l3afpad 之類的 GTK3+ based 應用程式。
GTK_QUERY_IMMODULES_2=/usr/lib/x86_64-linux-gnu/libgtk2.0-0/gtk-query-immodules-2.0gtk-query-immodules-2.0 這個指令的路徑。
GTK_QUERY_IMMODULES_3=/usr/lib/x86_64-linux-gnu/libgtk-3-0/gtk-query-immodules-3.0gtk-query-immodules-3.0 這個指令的路徑。

然後再執行一次 distro/dev-tools/scripts/test-hime 試試看。

不過這個小小 script 只能測試 XIM 及 GTK2+/3+ 輸入模組。QT3/4 輸入模組還是只能安裝到系統裡後再行測試了。

回報問題:

如果您在測試 HIME 時發現了任何問題,請您不吝向我們回報問題。為了能更快速釐清問題所在,建議您能詳述問題發生的步驟,如果可以,請先參考:如何有效地報告錯誤

而在必要時,建議您在回報問題時,順便回報您的系統設定。在 HIME 裡有一個小小的 script 可以顯示一些 HIME 的相關系統設定,請直接執行:

hime-env
然後,再把輸出的資訊貼上來即可。

善用 coredump 資訊

在 Linux 裡,如果程式當掉了的話,系統可以把當時記憶體內容 dump 成檔案以便於日後除錯。但在 Debian/Ubuntu 裡,因為這些除錯檔可能會佔上硬碟很大的空間,所以預設上這個功能是被關閉的。

如果您想打開這個功能,請設定 /etc/security/limits.conf 如下:
# <domain>      <type>  <item>          <value>
*               hard    core            409600
*               soft    core            102400

其中的 <domain> 指的是使用者名稱;<type> 中的 hard 指的是『系統限制大小』;soft 指的是『使用者預設大小』;<item> 指的是類別;<value> 指的是檔案限制大小,不想限制的話可在此填上 unlimited。請 man limits.conf 以取得更多詳盡資訊。

設定完成後,登出登入後即可生效。

之後,如果您在執行 HIME 的期間發生了什麼問題而當掉了,您應該可以看到如下的錯誤訊息:

程式記憶體區段錯誤 (core dumped)
然後會在執行 HIME 的目錄下生成 core 這個檔案。您可以提交這個檔案以利於除錯。不過,這個檔案包含了您的記憶體的資料,提交這個檔案可能會引發安全及個人隱私上的隱憂。如果您會使用 gdb 的話,建議您自行用 gdb 載入這個檔案並 backtrace 後提交追蹤後的資訊方為上策。

參與 HIME

您不需要是箇中高手才能加入 HIME 開發團隊,我們需要的只是您肯試著捲起袖子幫忙。我們 HIME 開發團隊的成員其實都只是在修改各自自己感興趣的地方,所以時時期待能有新血加入。HIME 開發團隊中有個新成員是高中生,這是他第一次接觸 C 語言,也是第一次開發 GTK 程式。讓 HIME 能支援 Ubuntu 的 Unity Tray 就是他的大作喔!

而對於 HIME 團隊而言,其實只要您肯幫忙測試推廣回報問題,對我們就是莫大的助益。請立即加入 IRC 頻道 #hime@freenode.net 吧!就算上來聊天哈啦也好。

但其實只要您肯試用看看 HIME,我們 HIME 團隊就感到非常榮幸了。我們衷心期望您立即下載測試使用 HIME 吧!謝謝!

01月21日

Fred's blog's face
Fred's blog


縮小 展開

商業操弄,軟體研發人員不喜歡做的事!

在國外,許多大型軟體公司林立,老牌軟體商建立了不少現今軟體業仍在使用的遊戲規則。而比較小的軟體外包商、工作室或是個人,也糊裡糊塗依照這些大公司使用的遊戲規則走,甚至是遵守不合時宜的淺規則。然後,軟體業進入了國內,又被代工思維牽著走,軟體業因此哀嚎聲不斷。軟體研發人才不喜歡去操弄商業,卻被商業操弄著。

身為軟體外包或是軟體客製化的外包商,你是否曾遇過,客戶有很多大大小小的鎖碎要求,不定期會交代過來? 這些修修改改,看似不癢的功能和需求,做起來毫不費功夫,三兩下順手就能完成,卻往往造成雙方驗收標地的分岐,此外,不知不覺中所累積的份量,也讓結案時間遙遙無期,甚至造成軟體產生更多的問題待解決。對於只想當水電工的研發人員,總是在客戶的要求下,修完馬桶順道通水管,又補個土、也打個臘。另外,如果馬桶旁邊剛好有漏水,那你要自認倒楣了,因為客戶也會請你幫忙『順手』解決一下,或認定是你在修馬桶時弄壞的。是吧,令人難過。

難道研發人員就要這麼可憐嗎?我們做錯了什麼,為何就要這樣被對待?明明是為了提供更好服務,卻累死三軍,又讓人有把柄指著鼻子唸。更慘的是,一旦這些看似不起眼的修修改改,累積成有影響力,讓專案與合約內的需求不完全相符。客戶就有機會利用『與合約不符』的矛盾點,再殺下一城。

筆者也同是天涯淪落人,曾經不斷思考這問題也同時咒罵著台灣的業界,咒罵他們總不給軟體商有活命的空間。尤其受了委屈後,更是一股惱自命不凡,認為自己無論做什麼樣的事,都應該比一般人收取更多費用,以平心頭之恨。但過些時日後,經過冷靜思考,發現是一開始雙方的互動模式就錯了,或許更仔細檢視這個行業,才能找到改變現況的辦法。

大多數軟體開發不是演藝事業

一直不認為『軟體程式設計師』是演藝事業,所謂『台上一分鐘,台下十年功』不能完全形容軟體開發的工作。雖然,越厲害的研發人員,越能設計好品質的軟體;越是名不經傳的軟體商,也越難生存於業界。許多面向與藝人生態有些相似,但其實完全不是這個樣子。

因為我們雖練功多年,在專案過程中,卻仍然做很多沒技術性又取代性高的工作,或是『順手工作』這類連項目都寫不出來的事。所以,與演藝事業最大的不同是,我們不是只做一件事:『像巨星一樣站上台吸引全場目光,解決觀眾們長達數十分鐘的無聊時間』,而是因應專案需求,巨星仍然要下海當工讀生或工作人員,甚至是清潔工。所以,大多數軟體研發人員,其實扮演的是『跨年晚會工程的承包商』,不是巨星。許多客戶的額外零碎需求,就像有人在會場中亂扔垃圾需要被收拾,或是突然有人身體不適昏倒需要救護車送醫,這些都無法預期也無法很容易的按工計酬。

這一切,除非你有將風險成本都算在專案內,更重要的是案子也要夠大,不然相當不容易去完成工作。這也是為什麼許多比較大的軟體商,比較不受影響,因為他們接的案子也夠大,風險成本都能很輕易的被安插進總報價裡面。

因此,除了這類大型軟體商,多數中小外包商和客戶的想法,其實一開始便有了分岐。很多研發人員真的分不太清楚,自己只是當個明星,還是承包整個工程的承包商。但無論如何,客戶的心中一直很清楚認定:『承接專案的人就是整場晚會的承包商,我們不管你是不是把巨星拿來當小弟用,我們要得到的就是一個成功又圓滿的晚會』。

一切的痛苦,已經不能責怪是不是當初定需求不夠明確,也不能怪研發人員利用太多『舉手之勞』提供給客戶額外的服務。最後你會發現,想再多的方法與客戶確認需求、利用商業手段與客戶定下契約,或是出動威脅利誘的業務手法與客戶協商,都是頭痛醫頭腳痛醫腳之舉。或許先認清楚自己想要做的角色和可以做的角色,再引入適當的制度,才是突破現況的第一要務。


我們只想當水電工

說明白了,我們只想當個『軟體水電工』,有工就有酬,沒經驗的小工拿一份酬,有經驗的工頭拿雙倍酬,立即解決問題就立即收錢,然後打道回府等下一個工。至於整體工程承包,我們其實一點興趣都沒有。

只是,當水電工似乎是遙不可及的夢,因為客戶就是自己不能解決或決定,才外包找人解決,他們想要得到的是整個解決方案,而不只是工人。更重要的是,在資訊科技業中,客戶無法看到漏水就能自行判斷要找水電工,而是要先找醫生診斷病情,然後才選擇治療方案和醫療團隊。

雖然很可惜的是,大多數情況下,軟體研發人員沒辦法只當個『水電工』,但肯定有不少需求,是可以規劃成專業服務,使用水電工的收費方式,若是多加思考,應該能有些斬穫。



我們也許可以當醫生

其實仔細省閱一下醫生的工作,除了要聽取問題、診斷病情、評估可行性和提出處方,必要時要進入手術室開刀和操作儀器去治療病人,就像軟體外包在做的一般,開玩笑的說,我們也許可以稱醫生為『人體工程師』。此外,而客戶基於安心考量,多少也會自行去尋找名醫。這些種種情況,個人認為軟體研發人員其實更像個醫生。

因為像醫生,所以在簽約進行手術或治療前,我們也必需要做許多評估。但不一樣的是,無論醫生是否有治療成功,醫院總是有錢領,但軟體業則是要摸著鼻子認了。許多軟體外包商,在談案子的階段,最怕的就是不清楚技術上可行與否,或是不知自己有沒有能力達成。所以,多數軟體研發人員在面對不同案子簽約之前,就算不確定是否會得到案子,也都會先做許多評估或提前研究,甚至,必需提前偷跑才能知道可行性。

不過,面對現在科技產業客戶都追求創新的情勢,這種不確定性的程度更甚也更常見,如果案子接到了還算好,如果沒接到,這種事前研究期的資源浪費,讓更多中小軟體商非常痛苦。更還沒提到,接到案子後如果有不可預期的技術瓶頸(像是配合的硬體平台有嚴重且之前未被發現的 Bug),造成手術失敗或時間拉長的情況。真正的醫療體系或許還有保險可以支付手術費用,但在軟體業,這意味著無法結案,收不到款。

因為這樣不易收到款的制度,軟體承包商為了結案,屢見不鮮地用盡『各種手段』處理和討好客戶的需求,包括了文章開頭提到的『舉手之勞』和隨之而來的各種問題。導致其開發出來的軟體品質不佳,客戶也得不到最好的成果,常有狗尾續貂的情況發生,講的更難聽些,虎頭蛇尾會更為貼切。

可憐的是,軟體研發不是人命關天,一切在商言商,客戶們通常不願只付『掛號費』,還可能貨比三家。哪一家能『價格殺的夠低』又拍胸脯『保證全部完成』,哪一家就能搶到案子。如此惡性競爭,更加深擴大了軟體研發人員被劃開的傷口。

軟體產業沒有軟體健康保險補助,不是所有人都能夠負擔起看醫生、身體檢查和評估的費用,所以在這產業中有錢人才能夠看醫生。不然就是醫生得扛起所有風險和責任,並吸收許多成本,才能去拓展市場。

或許,要求政府有相應的保險制度不太可能,但更細的分工整合和處方制度,可能是一個可行的思路。


試圖尋求保障雙方的軟體開發模式

客戶和軟體商雙方的拉距戰,就像一個很大的槓桿,一不小心另一邊就飛上了雲端。

我們可以理解,不能完全怪罪於客戶,畢竟所有人都總是希望得到完整的解決方案、降低風險,又盡可能支付最少的錢。小客戶是預算不高要緊扣,大客戶則是怕付了錢,卻達不到目的,或是得到一堆無法使用的 01 文字。

但對於軟體研發人員來說,卻也太過不公平,只能全賠和拼命乞討二選一。

現有的各種手段都無法幫助軟體商突破現況,太多的慣例也惡習累積已久。這也是為什麼,很多以接案起家的新創公司(Startup),到五、六個人之後,開始碰到瓶頸。因為小案子已經養不起公司,中間的案子不好做,再上去就要一股作氣引進人員到數十人才能做。但人數到這麼多時,大案子的獲利也只是勉勉強強。

所以,如何想出方法,雙方保障,是不可放棄的目標。


後記

本文只是先起了個開頭,省視當前情勢。雖然對於實際執行,已經有些初步方案,有空再記錄下來,期望大家共同尋找出一個可行的制度。