顯示包含「參考資料」標籤的文章。顯示所有文章
顯示包含「參考資料」標籤的文章。顯示所有文章

2008年5月20日星期二

義和團式的專案計劃

http://www.wretch.cc/blog/phopicking/2851110

老實說,很多人在進行軟體專案規劃的時候,都會有義和團上身的現象。無論外在環境多麼險惡,只要我擁有教主保佑,就有神功護體,可以刀槍不入,攻無不克,戰無不勝。所以兄弟們,不管實際上到底案子看起來有多困難,大家放心,一定沒問題。
吉娜:這個案子要做多久?
義和團團長:三個月。
布魯斯吃驚的說:三個月?這樣有任何的buffer嗎?你有抓任何risk factor嗎?我怎麼覺得少說也要六個月!
義和團團長模仿了一下李小龍:啊剎!啊剎!相信我,只要三個月。我一定把他做完。Risk factor?六個月?(模仿李小龍伸出食指左右搖晃後,往地上吐了一口口水。)這是沒有練過武功,對自己能力沒有自信的東亞病夫,才估的出來這種可恥的schedule。
......

本田:我覺得你們一定可以在3個月之內做完的。
布魯斯:怎麼可能!我們從沒做過銀行的案子。
本田:我知道你們一定可以的,你們技術能力這麼強,一定沒問題的。
布魯斯:話不是這樣講,3個月,又是不一樣的domain。還不要提,光使用者訪談最少就要一個月了。
本田:我知道你們一定可以的,你們技術能力這麼強,一定沒問題的。
布魯斯:話不是這樣講,這個案子的測試環境特別複雜。光是架這個測試的環境,就要花掉很多時間了。
本田:我知道你們一定可以的,你們技術能力這麼強,一定沒問題的。
布魯斯:我們再強也是有極限呀。這樣做的risk太高了啦。
本田:我知道你們一定可以的,你們技術能力這麼強,一定沒問題的。

......

也有人認為,如果立了一個完全不合理的deadline,反倒可以激起大家的士氣,願意努力加班達成不可能的任務。

......

所以當下一次有人請你對一個專案進行預估時,在你高喊:『神功護體,刀槍不入』前,請先想一想,你的金剛不壞護體神功,真的練到了第九層嗎?自己進行自我催眠,告訴自己一切都沒問題,這樣真的比較好嗎?

這是一篇我在上年暑假看到的文章,雖然我很早已經知道不要編排一個不可能的任務,但是在開發過程中才發現其速度沒有想像中般快,而在老師又以為我們有神功護體,總是以為會做得完,怎知道臨近期限才發覺不可能。我又再一次當義和團定下不可能的時間表了!

2008年5月19日星期一

當軟體專案計劃趕不上變化時

http://www.lifeparty.idv.tw/blog/archives/279(部份轉載)

雖然「計劃趕不上變化,變化比不上老闆一句話」,但趕不上或比不上並不代表要放棄計劃,否則專案的成功也只是聽天由命的偶然罷了。同人認為,軟體專案要成功,關鍵不在於如何照計劃進行,而是要「計劃」當計劃趕不上變化時該怎麼辦。換句話說,當軟體專案管理者把計劃當成死的名詞時,他將不會成為稱職的專案管理者;稱職的專案管理者會把計劃當動詞,用以採取適當行動,才會讓專案走向成功。

實際上,根據同人在軟體專案開發的實務經驗,期待專案問題藉由收尾巴的過程而得到解決的想法,往往是要付出很慘痛的代價的,但許多人總是無法從這些慘痛教訓中得到啟示。在專案後期所發現的問題、或產生變動,其所花費的成本與消耗的開發人員的青春,與產出軟體的功能與品質相比往往是划不來的。於是,歷史不斷地重演,軟體開發的痛苦經驗也一再地被經歷。

問題並不在於軟體功能無法說加就加、說改就改,而是在收尾巴的過程中自廢武功。不根據需求的變動或軟體的現存問題規劃出合適的架構與概念設計,現存設計怎麼會有足夠的空間來容納新功能?就好像想在堆滿東西的房間中,還要硬塞一些東西進去,這樣的結果當然很容易會讓我們在這房間中跌倒。

......

理論上專案管理中的專案收尾過程(project closeout)本來就不是用來讓開發者增加功能、修改缺陷的,而是吸取專案的經驗及教訓(Lessons Learned),以利後續專案當作規劃參考。因此,期待在專案收尾巴才來修改軟體的想法,事實上,正代表著專案在規劃、執行及控制的過程中有所遺漏。然而,一廂情願地認為收尾巴可以彌補這些在專案過程中的遺漏,這種想法實在是太過樂觀了呀。

所以,現在其實是反省的時候,開發的時間已經過去了,硬著頭皮去修改將會付出很慘痛的代價的。你想修改的等Further Development時再改吧!

Java , COBOL 以及版本控制

Java , COBOL 以及版本控制

2.Third party程式庫的版本及相容性問題
這個問題一樣,也不是一個可以一體適用的問題。可以不換,我們當然就可以撐住不換。可是有時候,是某個版本有重大的defect爆出來不得不換,有時候,是客戶一定要你換。這個世界上雖然也有升級狂的存在,可是也還是有不想升級卻是不得不升級的倒楣鬼。qing比較好命的地方在於他對於要使用的環境與 library有很高的控制權。不過這種事並非放諸四海都皆準的。
其實不要講別的,像我家的diggirl,有附一個軟體給大家下載,最近一堆買了新電腦的朋友,就跟我抱怨說,我的vista不能裝girl digger。
我當然可以說,靠盃呀,我連vista都沒有,誰叫你裝這麼吃resource的OS?可是這些朋友又會告訴我,現在notebook出廠就是vista,你沒別的可以選。
生意能夠不做嗎?我可以不support vista嗎?
這實在是個很傷感情的問題呀。^^
也有的朋友說,我們做的某些網站的網頁,IE7看了會爛掉。
我也很想高聲大罵,靠盃呀,我已經測了IE6跟firefox,哪有性命再去測其他版本的browser?可是我們還是要保持專業的形象,流露出淺淺的微笑,答應客戶我們會想辦法。
老實說,我還不知道該怎麼辦,就只好先鋸箭一下。

軟體測試真是不容易啊!

Java會步上 COBOL 的後塵嗎?

http://mmdays.com/2008/01/02/java_future/

最近這個禮拜,許多網站都在寫所謂的「年終回顧」,而向來報導資訊科技產業為主的InfoWorld卻列出了「2007最被低估〈未被大力報導〉的科技新聞」,而排名第一的就是這篇文章:「JAVA正步上COBOL的後塵!」

光看這標題實在太嚇人。從大學時候開始算起,Java我碰了少說也有快七年以上,雖然比起眾高手不敢說多麼精通,但是說Java說要像COBOL一樣被市場淘汰,會不會太早了點?如果真的有朝一日醒來,Java全面性的被新語言替換,那所有寫Java長大的程式設計師豈不是立刻失業?

好,先別急,先把原文內容看完再說。InfoWorld在這篇文章所持的幾個重要論點如下:

  1. 在網頁設計師界,擁抱Ruby on Rails、PHP、AJAX的人越來越多,而M$ .Net也正逐步把Java趕出企業應用市場。
  2. Java最被人傳頌的好處是可以跨平台,然而根據Twiki.net CEO的說法,Java的版本越來越多,還時常要去下載各種不同的Library檔案,因此他們開發網站後來都改用ROR,解決版本複雜性的問題。
  3. Java吃記憶體太兇、在UI上表現不佳,不利於手機版本J2ME的發展。
  4. 根據InfoWorld一份訪問超過1,850家企業的問卷結果顯示,各企業比較偏好用.Net,勝過用Java

好,我知道這樣的文章一定爭議滿天飛。我對當中的許多論點也不甚認同,但話說回來,它也的確點出一些問題。首先談談我不認同的點:

  • 少來了,AJAX什麼時候變成獨立的程式語言,還可以取代Java來著?
  • Ruby on Rails細節我不熟,但只因為這個語言近兩年開始起飛,開發網站套用模版用現成Framework開發速度很快,就可以取代Java了嗎?ROR之所以速度會快,是因為Rails已經寫好很多的模版可以套用是因為它的Framework可以讓你節省很多從頭開始的功夫,而寫Java的大部分人卻還習慣著從頭到尾一頁一頁慢慢刻。如果現在Wicket這些 Java Web Framework發展得好,也綁進Eclipse裡面,那未來JSP是不是也可以喊出取代ROR的口號了呢?

不過,我也必須承認,寫Java到現在,有很多地方是我認為值得討論的。

  • 版本控制:Java一直在推出新的版本,而且最近出的速度超快,一轉眼已經要出Java SE 7了,Java EE 6也預定2008年問世,速度快到其他家廠商都追不太上〈企業級伺服器WebLogic都到了2007年中出新版才能支援Java EE 5,而WebSphere、JBoss、Oracle等大廠都還在苦苦追趕中。〉
  • 除了SDK外,Java還有許多由Open Source界開發的Library。雖然這些軟體免費又好用,但是伴隨而來的版本與相容性問題也相對複雜。程式老跳訊息告訴你這個jar檔版本太舊不是他要的,怎麼辦?
  • 記憶體吃得兇:這顯然是跨平台的代價。我個人只遇過幾個純粹用Java寫的GUI程式,分別是JBuilder、Eclipse,以及NetBeans。而這幾個都是吃記憶體的超級怪物。就算我現在電腦有2G的ram,我也不敢同時開前面任兩個程式起來。
  • 程式架構越來越複雜:曾經我以為只要會寫繼承、MVC,看過Design Pattern就算是會寫Java了,但是我大錯特錯,Java還有很多Framework,而且到最後某些Framework已經複雜到有點變本加厲了。這當中首推EJB。EJB現在已經被認為是失敗的概念,因為它實在是超級複雜…我曾經在課堂上寫過Agent,要讓同一隻程式能「跨越不同的JVM執行」,天啊,從頭寫一隻出來大概要走我半條命。果不其然,現在POJO〈Plain Old Java Object〉的口號越來越響亮,呼籲大家把Java程式設計得越簡單越好,尤其是不要照EJB 2.x的模樣來寫。

但話說回來,縱使Java的確有許多缺點,這仍然離標題所預測:「JAVA正步上COBOL的後塵!」差之甚遠。與其他新進語言相比,Java因為平台眾多,又有大批open source人士寫了很多的Library,以致讓新手光看到版本就眼花撩亂,但這些並不是會影響Java是否能持續存活下去的關鍵因素;關鍵應該要從整個軟體產業的角度下手。在原文後面的回應中,有一位署名systemanalyst的人寫得相當精闢:〈以下節錄〉

拉回企業的角度來看,許多公司內的mainframe程式是用IMS、CICS搭配上JMS(Java Message Service的縮寫) Connector來寫的,PHP跟ROR在這一點是要怎麼取代Java?

當你的網站流量很大時,用Windws TCP/IP會癱瘓,你確定敢用Windows當作重要的前端系統平台嗎?

我不是說Java沒有問題,但相較於其他平台,如果我自己開公司,我一定會選擇Java平台。為何?因為我可能會選擇 POS平台用AIX〈IBM的Unix作業系統〉,線上購物平台用Linux,開發環境用Windows,而後端的資料倉儲系統架在z/OS上。為了省下管理不同異質平台的錢,我會用Java,因為它是唯一能在所有平台上通用的程式語言。

當我們在談論一個程式語言時,我們必須要從整個軟體工程的角度來看。Java不只是一個語言。當你看著Java時,你必須包含整個平台來看。看看這些為Java創造出來的架構與伺服器,它們的scalability是無限的!比起來.NET可就完全沒辦法比。如果你只是要講語言的syntax,是的C#跟Java沒什麼差別。但是如果你要評判Java能帶給你的價值,你必須從頭到尾、從上到下,完整的評估,而不只是”getThis()” 或 “setThat()”這些語法。

說到企業用途,或許Java還有另外一項好處,那就是Java Solution的平台提供者眾多,包括IBM、BEA、Sun、Oracle都有出Java專屬的應用伺服器,但.NET的平台似乎只有 Microsoft一家比較知名。不管M$的名聲如何,選擇Java平台的公司至少在短期內比較不用擔心被同一家廠商壟斷的問題。即使Sun這一兩年來的股票跌到連水餃股都不如,各家企業至少還有IBM、BEA這幾家可以選擇,而選擇.NET的公司,可能就只好期望M$能夠活得長長久久,永保安康了。

講到這裡,各位看倌,你們的看法又是如何呢?

熱門程度: 53%

 

 

看了這篇文章後,有沒有後悔當初要選JAVA呢?

延伸閱讀:

版本控制,版本升級是不是個問題?

2008年4月17日星期四

你想你的專案結完就「分」,還是兒孫滿堂?

  「就像寫程式一樣,剛剛寫的時候是覺得新奇有趣的。但當程式寫好,專案結束的時候,就算一開始時是多麼新奇有趣,也不想再開來看。我的缺點就是這樣......」雖然這是改編自某電視劇主角的對白(當時正用來游說另一位女朋友結束其關係),但這是我們這些經驗尚淺的Programmer都認同的。為了趕及限期,程式碼寫得亂七八糟也不要緊,反正可以做到要求便可以了。不過,相隔一段時間後,如果有人對你曾經做過的專案感興趣,想你為這個程式增加或改良一些功能,就算有人給你一個高價,也不會心甘情願去做。因為你的程式碼就如給加密了一樣,只有你自己才可以看明白,但是現在你連當時的「解密匙」也忘掉了,就更加不想再打開程式碼來看。

  不想你的專案絕子絕孫,你的專案一定要有文件說明,你既然知道要寫說明書給用戶,用戶才會懂得使用,為何你會以為不寫說明書給程式員,程式員會懂得如何把程式發展下去呢?為專案寫一份詳細的文件,記載你的軟體如何設計,程式碼是如何安排。讓後人得知你的軟體如何持續發展,你的軟體才會兒孫滿堂,而你也可安享晚年吧。

2008年3月23日星期日

Project management tools用後感

  今天,我們有幸請到AISP有限公司的Project Manger來試用我們的Project Management Tools。希望在我們的Tool未面世前,給我們一些寶貴的意見,等我們將來做出來的Tool能真正為Project Manager解決專案管理上的問題,使專案管理變得更輕鬆和更有效率。事不宜遲,我們馬上請Project Manger試試我們的軟體吧!

Maintain Task

  1. 當Task的完成日期大於Project完成日期應自動延長Project完成日期。
  2. 第一個task在3月開始,第2個接第1個在4月開始,第3個接第2個在5月開始......第10個.....按日期快按到手軟了,選取Task的Dependency時應自動調校start date或end date。
  3. 如果date out of range,應告訴我date的有校範圍,我不是每次都記得上個task的end date或下個task的start date的。
  4. 改完task後資料不會立刻更新,我還以為task沒有幫我儲存資料呢!
  5. Create task沒有cancel按鈕,還以為這個function要強逼人Create task。
  6. 如果double click便edit task便更user friendly了。

Gantt Chart

  1. Gantt Chart的位置不準確。
  2. 不習慣在Dialog要自己入副檔名。
  3. 應該顯示task dependency。
  4. Task name太長會超出範圍,應根據最長的task name來調校。

我發現Maintain Task和Gantt Chart合併在一起可以即時知道我的計畫有沒錯誤,是最方便的使用方法。不知你們會不會考慮呢?

接著應該是找人去做了。

Maintain Staff

  1. Create Staff
    1. Staff ID要用人手,不好吧?(醫生,不入Staff ID可不可以?)既然Staff ID只能用數字,為何不把他轉自動呢?
    2. 我們這個Project由於人手不足,要一人多工,得一個Post的欄位怎會夠用呢?而且,我們的Project的部分工作會由多人分擔,我不想再次輸入該Post的名稱,下次給我選可以嗎?
    3. 幸好今次Project我們全是義工,沒「人工」,所以不用煩惱,不然如果我以Post來定薪金便糟了。首先,我得要計算這位員工的工作薪金總和,再者,如果我要調節Post的薪金,我得要重新計算每個員工的薪金。如果這方面全由Tools來計算該多好啊!
    4. Skill都是自己入,你不當我是老闆嗎?(有得選,你才是老闆)
    5. Salary per month和overtime salary per hour出不來,放大Label顯示範圍可以嗎?
    6. Textarea不懂得自動換行,我不知打到那?
    7. 如果有多些東西預設填好的話,你說我可以節省多少輸入的時間呢?
    8. 我們組有人太厲害了,他樣樣皆精,可惜Skill的地方不多,不能盡錄。請問做這個function的是否經常小看他人呢?
  2. Edit Staff
    1. 選取Edit task時沒有反應,有Exception出現。

  「至於Reporting的function我不能開,因為還存在尚未解決的編譯問題,其實你們的時間也不多了,整個tools還未完全合併,demo時給人以為你們沒有完善的項目管理的。」

  我們再一次感謝AISP有限公司的Project Manger給我們寶貴且實用的意見,雖然他給我們的意見大多是不正面的,但是我們也清楚知道我們的Tool的價值如何了。前面還有很長的路要我們走,所以應該努力向前,做更多的function的,之後如果有空的,便應盡最大努力去改善以上的意見吧!否則到了最後,這些意見很有可能還是由老師口中覆述一次了。

2008年3月17日星期一

我就是佛地魔啦

輕鬆一下,給你們先看輕鬆點的東西。

(http://jonathanspeaking.blogspot.com/2007/12/blog-post.html)我不是溫伯格的粉絲啊!

我是溫伯格的粉絲,他的文章、書籍都是我重要的「讀品」。早上,同事傳來一篇溫伯格的專訪, Citerus - Interview with Jerry Weinberg ,並要我先看最後一段,還奸奸地笑說:你從哈利波特變成佛地魔了...

原來,這篇專訪的最後一段是這樣子的:

問:如果您是軟體界的 J.K 羅琳,那麼誰是您筆下的哈利波特?

答:Well,首先,我不是億萬富翁,所以我應該不是軟體界的 J.K 羅琳。(喲哪桑:你是!你是我的偶像啦!)

不過,如果我是的話,我想我的哈利波特應該是個測試經理,大家都希望他能施展魔法把產品變好,但老是被 developer 虧:「他只不過是一個 tester ...」

至於佛地魔,應該是個既不會說 NO,也聽不進哈利波特說什麼的專案經理吧!

哈哈,真尷尬啊!原來我就是佛地魔啦!我還不知道佛地魔最後的下場是什麼哩。他是被消滅了,還是征服世界了呢?哇哈哈哈!

看完後告訴我,你們認為我是不是佛地魔?如果我不是,老師是嗎?

專案時間不足,如何達成不可能的任務

(http://www.lifeparty.idv.tw/blog/archives/321)以下內容經過縮減,全文請參考原作

軟體專案開發常常會面臨時間不足的問題,尤其在台灣,Price on Cost更是不容易達到的理想,迫於現實,開發者只能硬著頭皮上陣去執行不可能的任務。但最後的結果卻常常是賠了夫人又折兵。即使透過不斷地加班,任務依舊還是無法完成,而且還會造成團隊士氣低彌,使得開發者缺乏工作的成就感與滿意度,甚至使專案開發人力大量流失。

其實大多的軟體開發者都期望專案能爭取到足夠的開發時間,不希望他們的青春浪費在無意義且永無休止的加班上。然而,軟體開發的現實就是如此殘酷,受到開發組織的營運面影響,通常專案總是很難爭取到足夠而充裕的開發時間。

工程與技術的妥協

因為軟體價格實在太低了,開發者只好捨棄一些可以增進或維持軟體品質的作業。結果軟體品質就會變成時間允許才能夠達到的一個理想,而現實通常是「時間總是不夠」。

當軟體專案把軟體價格當做專案成本估算的基礎時,這樣軟體開發就會沒辦法重視專業只能讓外行(市場因素)領導內行(研發設計專業),軟體開發者的痛苦夢魘於是從此開始。

現實就是這樣,專案就是難以爭取到足夠的充裕時間。但這樣要如何才能達到專案不可能的任務呢?從筆者在工作上的觀察中發現,不少的管理者會將這個問題焦點放在團隊生產力上,以提昇軟體的開發效率來縮短開發時間。不過,實際上卻不見軟體開發成果獲得到顯著地提昇。

生產力的迷思

管理者會希望軟體開發者加班或是增派開發人力,軟體開發每日的總工時增加了,照理說應該是可以增加軟體開發的效率,但卻也因此引發出新的問題,也就是軟體開發出錯的機率也會隨每日工作時數或開發人力增加而增加,反而降低了軟體開發的效能。

為什麼會這樣呢?綜歸一句話,增加了生產力卻讓軟體開發變得更複雜,使得團隊無法有效整合、發揮綜效。而這種現象又可從兩個方面來看,一方面是加班讓開發者身心耗弱、無法集中心力來完成任務,因此常因為工作上的疏忽而產生錯誤,反而讓問題變得更複雜,需要花更大的心力才能解決。

理論上,壓縮專案時程可以運用趕工(crash)或作業重疊(fast tracking)的方式來減少開發時間。趕工必須讓工作者加班而增加開發成本,作業重疊則會增加工作產出重工(rework)的風險。因此,似乎只要多付一些成本來支應加班的需求或加強風險管理,應該就可以達到時程壓縮的目標。然而,由前面的分析我們卻可以發現到,軟體開發的複雜度其實是經常超乎我們想像的,由此可知,軟體專案的時程上的妥協其實是很難用成本來彌補的

筆者最近才聽到朋友告訴我一個軟體專案失敗的案例,該專案是以另一個將近結案的專案為基礎。原來他評估勉強半年可以完成,本來公司把專案交由他負責,但最後專案經理卻因為客戶的意見而交由負責該客戶的業務來掛名,實際上專案則由我的朋友來負責開發該專案。

然而,當我的朋友才開始需求訪談時,專案經理卻告訴我的朋友他程式開發時間要在三個月內完成。而在我的朋友在研讀前一個專案的程式碼,以求了解程式架構以後才能根據客戶需求加以修改,那位專案經理卻要我的朋友立刻著手動手修改程式,問題留待後面再來處理

雖然我的朋友還是在時限內完成了程式,不過,這時候問題才真正開始。客戶驗收後提出了上百個程式錯誤。這時候我的朋友才發現,這專案所依據的快結案的專案本身就有很多問題,並不是像那位專案經理所說的「沒有問題」,因為有 3/4 的 bug 都是那個專案本來就存在的問題。

此外,客戶還提出了一些原先沒談到的需求,而那位專案經理則要求我的朋友要在不增加時間的情況下予以照單全收。因此在需求不斷膨脹的情況下,這個專案最後還是失敗了。當然,最後那位專案經理把失敗的所有責任都推到我的朋友身上。

相信任何有經驗的軟體開發者看到這故事都會了解,那個專案經理實在是太外行了,他以為軟體開發只是依據客戶的需要來產出程式,認為只要壓縮開發者的時間來產出更多的程式就可以解決問題。卻殊不知軟體開發在缺乏產能的情況下,再多的產出也只是徒增軟體的複雜度與風險,這樣要成功地達到專案目標只能靠聽天由命了

開發產出與產能之平衡

由此可知,在專案開發時間不足的情況下,用生產力的迷思所生產的程式產出,其實多半是無法具有實質效用的。因為開發者在龐大時間壓力是很難會有思考的空間,將使他的產能逐漸耗竭殆盡。即使在剛開始,可以一時滿足了客戶的需要,然而長久下來,卻在無形之中增加了專案的複雜度,最終只會在耗盡了開發者的青春與熱情之後,得到專案失敗的苦果

因此,在專案時間不夠的情況下,要達成不可能的任務必須要提昇軟開發的產能,必須讓開發的產出與產能可以相互配合。但至於要如何增進良好設計架構的產能呢?依筆者在軟體專案開發的實務經驗來看,關鍵在於必須同時兼顧客戶價值開發風險。而要做到這一點則必須要讓開發者與客戶充分溝通,讓專案產出確實可以為客戶創造最大的價值,同時也能有效地降低專案的風險。

筆者常觀察到許多開發者習慣把客戶提出來的功能直接當做軟體需求規格,卻沒有深入分析客戶真正遇到的問題。他們以為問題領域、業務流程或現場作業等知識是客戶的專業,開發者無從介入,因此往往在不知客戶要求之所以然的情況下,直接把客戶的話轉換成軟體規格。

然而,客戶所知道的並不是軟體需求(requirements),他們對系統的觀點只能顯露出他們對系統的需要(needs)。需要是抽象而片斷的,本身是非結構化的,而可用的軟體需求卻必須是具體而完整一致的,具備結構化的特性。

因此,如果開發者沒有針對客戶需要分析他們的問題,設計解決方案,只是直接把客戶的想法直接轉成軟體規格的話,客戶心中想的那朵雲,隨時都會變幻出各種不同的形狀,需求不斷變動當然是必然的,如果開發者沒做適切的分析及設計,只靠技術是很難滿足客戶多變的渴望與需要的

事實上,軟體開發是知識與腦力密集的工作。自許為知識工作者,重要的不在於產出的數量,而在產出的品質。要讓產出具有足夠的水準,必須要有足夠的時間在問題領域的分析上,才可能為客戶設計出可以解決他們問題的軟體,為客戶創造價值;也才能讓軟體具備足夠的彈性來適應客戶千變萬化的需求,有效地降低開發風險

要如何充分溝通?

於是,當我們用以上的思路來看軟體開發時,縱使專案沒有足夠的開發時間,我們依然要會從客戶的立基點中去思考問題,並從中找出最可行的技術來創造客戶的最大價值。同時,在這樣的情況下,開發者展現了足夠的專業,客戶也會很自然地信任開發者誠意與專業,形成了良性的雙向溝通。

在這種客戶與開發者良性溝通的情況下,客戶可以決定了時程、成本、品質等限制條件,而專案範疇的限制條件則應該由開發者與客戶溝通後依業務需求及技術架構的取捨來決定。這也就是說,客戶提出他的問題、以及希望解決的時限及願意付出的成本。開發者則應該針對問題分析出需求規格、發展出技術架構,並據此實作出軟體後再交由客戶驗收。然後客戶再依軟體實際使用狀況予以回饋,開發者再依照客戶的意見反覆地演化系統,以使軟體更趨於完善。

客戶應該優先提出最關鍵及最核心的業務問題,而開發者則必須針對這些問題分析,發展出軟體需求、找出解決問題應採用的技術與方法、優先將最高風險及最核心的架構與程式實作出來如此客戶最重要的問題可以優先被解決,而開發者也可以針對客戶問題而設計,而不會浪費時間與成本在過度設計上,降低了軟體開發的風險與複雜性,使得產出與產能可以相互配合。

開發產出與產能相互平衡,才不會偏廢於需求面或技術面,使技術可以面對現實地解決客戶的問題。就算開發時間真的不夠,至少也可以用空間換取時間呀。因為無論如何,客戶至少都會擁有一個可用的系統,而不是一堆無法正常運行的程式碼與文件

 

在水深火熱的時間看到這文章,也為時未晚。我對這文章也有同感,我們正面對的正是不斷加班,而且不了解老師想要的和技術的可行性,結果做不完便把失敗的所有責任推到我們身上。我們得要思考箇中原因,我們花了太多時間去寫程式,往往因需求不斷改變而未能完成。

老師的需求不是軟體需求,這個是重點,你們一定要牢記。我們設計軟體是要解決問題,應付千變萬化的需求是要解決的問題之一,不然我們為什麼要讀OOT和AOOT。給自己一點時間,想想老師真正想要解決的問題,檢視自己寫過的程式,修改甚至重新設計以便之後能應輕易面對不同需要,只要我們的程式能輕易應付不斷變化的需求,和不要接受不可行的要求(時間不許可也是原因之一),就是治本的方法。

2007年12月9日星期日

如何實現SWING界面的自動測試

http://www.cjsdn.net/post/view?bid=46&id=176496&tpg=1&ppg=1&sty=1&age=30#176496

前幾年書寫了一個技術SWING的界面測試的有些JAVA技術還比較有意思給大家分享一下。

SWING界面自動測試關鍵技術:
1, 如何替換掉系統的消息隊列
2, 如何識別事件
3, 如何記錄
4, 如何回放

第1個技術
使用 ActiveEvent

import java.awt.AWTEvent;
import java.awt.ActiveEvent;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.MenuComponent;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JDialog;

import nc.web.AWTAutoShutdown;

public class EventDispatch extends AWTEvent implements ActiveEvent {

public static EventQueue theQueue;
static{
if (theQueue == null) {
java.awt.Toolkit t = java.awt.Toolkit.getDefaultToolkit();
theQueue = t.getSystemEventQueue();
}
}
public static void replaceSysteEventDispatch() {
try {
//System.out.println("new frame");
if (theQueue == null) {
java.awt.Toolkit t = java.awt.Toolkit.getDefaultToolkit();
theQueue = t.getSystemEventQueue();
}
theQueue.postEvent(new EventDispatch(null));

} catch (Exception e) {
e.printStackTrace();
/** 可以是安全權限不能訪問*/
}
}
/** 虛禮一個對象 */
private static JButton jb=new JButton();
public EventDispatch(Event event) {
super(new MouseEvent(jb,1,1,1,1,1,1,false),1);
}

public void dispatch() {
while (true) {
try {
AWTEvent event = theQueue.getNextEvent();
/** 發送事件,可以在 Dialog.setModal(true) show ,接管事件 */
EventDispatch ed=new EventDispatch(null);
theQueue.postEvent(ed);

if(event.getClass() == EventDispatch.class )
continue;
Object src=event.getSource();
if (event instanceof ActiveEvent) {
((ActiveEvent)event).dispatch();
} else if (src instanceof Component) {
((Component)src).dispatchEvent(event);
} else if (src instanceof MenuComponent) {
((MenuComponent)src).dispatchEvent(event);
} else {
System.err.println("unable to dispatch event: " + event);
}

} catch (ThreadDeath death) {
break;
} catch (Throwable e) {
System.err.println("Exception occurred during event dispatching:");
e.printStackTrace();
}
}
}

}

鼠標事件是最難記錄的,由於鼠標事件前後界面會改變,或者有的需要MousePressed事件 ,有的需要MouseRelease 所以
在鼠標事件發送前後都需要進行處理
在事件隊列拿到的事件,是發送到Window上的底板的。
所以需要根據代碼取道它真正的控件對象
public static Component getMouseEventTarget(Object org,MouseEvent me)
{
Component targComponent=null;
if(org instanceof Component)
{
targComponent = (Component) org;
if(org instanceof Container)
{
Component temp=getMouseEventTarget((Container)org,me.getX(),me.getY());
if(temp!=null)
targComponent = temp;
}
}
return targComponent;
}
鼠標事件究竟發送給誰的需要在不同的點進行識別:
在鼠標 beforeMousePressed 需要識別:
JTree,JTable,javax.swing.plaf.metal.MetalComboBoxButton
需要識別單點雙點

beforeMouseRleased
需要識別:JList
afterMouseReleased
需要識別:JList,JSlider,JToggleButton,JScrollBar
其他事件簡單的介紹一下:
鍵盤事件處理:比較簡單。
記錄發送給具有焦點的對象就可以了。
itemEvent需要處理:javax.swing.JComboBox
TextEvent :需要處理文字錄入。
WINDOW_CLOSING:處理節點關閉

mouseMove:比較麻煩,大多數時候是無限的。

正確識別事件記錄比較簡單:

主要記錄的是 COMPONENT的相對位置。

比如:他在 XX控件上的YY位置上。

最簡單的辦法是。

將界面控件全部大列表,按照順序,得到他在什麼位置。

什麼控件類型上。

建議大家記錄後以JAVA 代碼的形式記錄,可以編輯重放。


4, 如何回放
回放就是模擬記錄的腳本:
創建事件對象就可以了。
關鍵技術是:
需要等待任務隊列中沒有任務然後再發送下一個模擬事件。

有 興趣的 可以回帖交流一下

2007年11月17日星期六

極限編程的「權利法案」

builder.com.cn
客戶的權利
  • 客戶有權利大規模地計劃成本和選擇。
  • 客戶有權利安排每週的開發優先順序。
  • 客戶有權利在第一週結束的時候以工作系統的形式查看進度,並瞭解之後每週會做些什麼。
  • 客戶有權利更新計劃安排、不論是好的還是壞的,只要有信息都要更新。
  • 客戶有權利改變他/她的主意而不需要付出太多的費用。
程序員的權力
  • 程序員有權利對工作進行評估,其評估的結果應該受到團隊其他成員的尊重。
  • 程序員有權利如實地報告進度。
  • 程序員有權利在所有的時候都進行高質量的工作。
  • 程序員有權利知道下一步要做的、以及最重要的是什麼。
  • 程序員有權利詢問面向商業的問題,如果這些問題出現的話。
管理人員的權利
  • 管理人員有權利對成本和結果進行全面的評估,確認實際情況將(和預計的)有所不同。
  • 管理人員有權利在項目之間調動人員,而不需要支付過高的費用。
  • 管理人員有權利每月更新進度,幫助客戶確定總體的優先順序。
  • 管理人員有權利根據最新的投資情況取消項目,並保留工作系統。

2007年9月24日星期一

登山的故事--Extreme Programming和傳統程式設計的分別

http://blog.csdn.net/testwin/archive/2007/04/19/1570069.aspx
從前,有一個A型血的人和一個B型血的人去登山。顯然A和B有著不同的登山方法。

 A到了山腳下,總是先停下來,仔細打量山勢。接著,圍著山腳轉轉,看看哪些是小山包,哪個是主峰。然後,設計幾條不同的

  登山線路,並選擇出最好的登山線路作為首選計劃。同時,他還考慮到如果首選計劃出現問題,則可以啟用第二計劃或第三計劃...

 而此時的B幾經爬上了第一個小山包。B登上小山包的時候,發現這個小山包不是去主峰的路。B並沒有氣餒,稍微打量一下環境,立即從小山包上下來,往更高的一個山峰進發...就這樣,B無時無刻不在後退中前進,在下坡中上山,已經將A遠遠的甩在後面。

  最後,B成功地登上主峰,而A還在半山腰艱難地攀登。當A終於登上主峰之後,B說了一句很有很有意思的話:你現在知道極限編程的威力了吧!A默然不語...

 一位想學登山的新手來向A和B請教登山的方法。A把他的線路圖和計劃全部給了新手,沒有說一句話。新手看都沒看,就跑去問B。B意味深長地說:努力,努力,再努力,當你到達山頂的時候,就知道了登山的方法!新手由衷敬佩。

 多年以後,A成功地登上了珠穆朗瑪峰。據說B倒下的地方離一號營地只有一百米遠...

 當那位新手終於找到A求教的時候,A還是將所有的登山線路和計劃交給了他,依然沒有說一句話。

 但新手明白:這就是設計!

2007年8月23日星期四

留些時間思考

新華網 (2003-03-12)
稿件來源:解放軍報

 某公司總經理專車公出,司機有事來找。當時總經理正忙於工作,只是隨意應答了幾句,連頭也沒抬。司機不高興地說:“你這態度不好。不要把自己弄得太忙,應該留些時間給自己思考。”這位總經理聽了下屬的批評不但不以為忤,而是真的思考起來,並且把“人生何必太匆忙,留些時間思考”製成卡片,壓在玻璃板下當作自己的座右銘。“留些時間思考”,說出了思考與學習、思考與工作、思考與生活之間的內在關係,也道出了思考與人生之間的必然聯繫。在世間一切存在之中,只有人善於通過思考不斷提升自身的價值。能否“留些時間思考 ”,也是一個人人生和事業能否成功的重要分水嶺。中國先哲孔子說:“學而不思則罔,思而不學則殆。”當代科學學創始人默頓的研究表明,科學研究猶如百米賽跑,有許多人朝著同一目標前進,在同一跑道上競爭。而最先到達終點取得成功的人,往往是在前進路上用更多的精力和時間進行思考、發揮出更大創新能力的人。愛因斯坦為創建狹義相對論,經過了長達十年的思考,他說:“學習知識要善於思考、思考、再思考,我就是靠這個學習方法成為科學家的。”牛頓從蘋果落地導出萬有引力定律,有人問他有什麼訣竅,他回答說:“我並沒有什麼訣竅,只是對於一件事做長時間的思考罷了。”

事實上,能夠經常“留些時間思考”,把思考作為學習、工作和生活的一部分,對於擔負一定領導責任的各級幹部來說,更是不斷提高自身綜合素質的要求。列寧曾經說:為了能夠分析和思考各種不同的情況,應該在肩上長著自己的腦袋。毛澤東同志明確提出:“對任何事情都要問一個為什麼,都要經過自己頭腦的週密思考,想一想它是否合乎實際,是否真有道理,絕對不應盲從,絕對不應提倡奴隸主義。”現在,我國已進入全面建設小康社會、加快推進社會主義現代化的新的發展階段。面對世界格局多極化、經濟全球化和資訊技術網路化的新的形勢,要完成十六大提出的全面建設小康社會的奮鬥目標,不斷開創中國特色社會主義事業新局面,各級領導幹部肩上的任務艱巨,責任重大。如果不善於“留些時間思考”,或人云亦云、盲從跟風,或沉迷于酒綠燈紅、迎來送往,對事關全局的大事、要事缺乏戰略上的和前瞻性的思考和研究,儘管成天忙忙碌碌、辛辛苦苦,也是很難做好領導工作的。

“留些時間思考”是一個思想方法問題,更是需要各級領導幹部躬身實踐、下苦功解決的現實問題。毛澤東同志曾經提倡以“擠”的方法獲得學習的時間,以“鑽”的方法求得對問題的了解和研究的深入。可以說,思考是做好一切工作的基礎。江澤民同志在黨的十六大報告中告誡全黨,要努力“成為勤奮學習、善於思考的模範”,可謂言之諄諄,用意深刻。如果各級領導幹部都能“留些時間思考”,都能夠擠時間下苦功進行學習和研究,視野定會更加開闊,胸懷定會更加博大,工作定會不斷取得新的進步。

(郭嵐)

2007年8月19日星期日

Project work 2B 好的方面的補充


  之前在會議中我想不到在Project Work 2B的後期做得好的原因,今晚看完一擲千金後終於記起了,原來都是個很動人的故事來的。當時,佔該科目總分的一半的製成品已經完成了,在最後一分鐘光碟已經繳交了,但是之後發現很多功能都用不到,在這時候多美好的期待都沒有了,就像一擲千金裡由三百萬跌至只有數萬,但我們不是甚麼都沒有,還有presentation和其他文件可以追回分數,但是分數最多只有15分(其他文件佔10分),我還記得在演說前一晚有組員在MSN問我做project先還是做ISP(其他科目的家課)先,我回答說:「做project先。」在演說中大家都很用心的介紹自己所做過的,還有組員擔心時間不足調節速度呢!接著在寫文件中組員們都很用心的去測試製成品,那怕製成品有甚麼缺憾,還忙著為到自己所做的功能提供詳細的說明,到了最後繳交時連同Project Work 2A所寫的文件,合共超過五百頁(Project Work 2A估算佔了總數一半,有錯請提示)。回想起這段情景,就像一擲千金裡的玩家要從幾個寶箱中爭取最大銀碼,即使無法回到有數十萬的時候,相信這是團隊合作最燦爛的一刻來吧!
  看回MSN的記錄,當時不只Project Work,還有其他科目也是忙著做的,當時其實可以放棄Project Work去做別的科目,用更多時間去爭取其他科目的分數不好麼?但是我們沒有放棄,只知道Project Work不合格的後果是不敢想像的,就是有這份堅持,這一科最後都合格,而且分數也不錯呢!
  如果當時我在MSN回答的時候不是這樣說,是回答做ISP先的話,我想沒有人會繼續為那些少分數而努力,也沒有這個出人意表成績。跌倒了,要懂得站起來,這樣的團隊才能經歷風浪,為自己,為朋友,留下美好的回憶。

2007年8月15日星期三

八福臨門

來源:《號角》八福臨門

中國人講求「五福」、「十全」;《聖經》卻傳講「八福」、「十誡」。所謂「八福」便是《聖經.馬太福音》第五章,耶穌基督在「登山寶訓」中談論的「八 福」。中國人追求「五福」,乃是為了自己今生的享受;而《聖經》內「八福」的含義,卻包括了個人、家庭、社會、今生和來世;若按照「八福」教導而行,以下 提及的福氣都得著了,這豈不是更大的祝福?

想得享「八福」,不妨先明其義:

虛心的人有福了!因為天國是他們的:虛心是自覺不足,而不斷追求進步。「滿招損,謙受益」,太自滿的人,沒有進步的餘地,這包括在學業和事業上。當一個人 開始自滿時,進步便相對減少;而更可怕的是,很多人只滿足於今生的成就,卻沒有虛心追求天國之道,以致失去永生的福分。若認識自己的渺小及生命的短暫空 虛,轉而懂得倚靠上帝,就必成為天國有福的子民了。

哀慟的人有福了!因為他們必得安慰:在人類壽命的紀錄中,一般女性比男性長壽,原因是女性愛哭,懂得發洩情緒;而男士們卻是流血不流淚。上帝要我們作個像 孩子般純真、處處真情流露的人,哀慟又何妨?因為哀慟的時候,必得著一個有福的確據──從天而來的安慰。

溫柔的人有福了!因為他們必承受地土:溫柔不是懦弱,卻是由個性成熟、思想冷靜產生出來的節制能力。在一般人的觀念裡,要得土地必須經過一番爭鬥,甚至強 搶;但是在神的應許裡,不使勁的溫柔人卻可得地土作獎賞。這不就是福氣了嗎?

飢渴慕義的人有福了!因為他們必得飽足:飢渴慕義是一種正確的動機,促使我們行走公義的路。可惜今天很多人渴求的,是金銀財帛、性愛情慾......一些 「喝了還要再喝」,永遠不能滿足的東西。那些追求公義、真理,以致心靈得著飽足的人,所享有的正是滿足的福樂。

憐恤人的人有福了!因為他們必蒙憐恤:孟子說:「愛人者,人恆愛之。」對人有出自愛心的關懷、憐憫、體恤,必得著別人的真正友誼。《聖經》明確記載:神喜歡憐恤;所以作一個憐恤的施予者,也必成為蒙福的接受者。


清心的人有福了!因為他們必得見神(上帝):「神是個靈,所以拜祂的,要用心靈和誠實拜祂。」清心,是指沒有雜念的心靈境界,當我們以單純清潔的心去親近 神時,神必被我們尋見;一個時常可以與神面對面交流的人,當然最為有福。

使人和睦的人有福了!因為他們必稱為神的兒子:神的獨生子耶穌基督,是和平之君,祂不單教導人互相扶持、彼此相愛;還捨己為人,叫人藉著祂能與神和好。若 我們效法基督的榜樣,廣傳福音,使人與人、人與神和好,就是神的好兒女了。能夠被天地間最偉大的神稱為兒子,世上哪有比這福更大的嗎?

為義受逼迫的人有福了!因為天國是他們的:若要締造一個公義、平等的社會,必須有不畏權勢、為公義發聲的正義者。為義受逼迫的人,有如中流砥柱,就像耶穌 當日為履行神的義而受人逼迫一樣,終必得著天國為賞賜。這個祝福是超越人可以想像的。

這樣說來,得著「八福」豈不比享有「五福」更具永恆價值嗎?祝願大家今年:「八福臨門,人生更豐盛,更滿足!」

2007年8月13日星期一

願景是甚麼?

來源:《號角》月報2004年5月

「願景」既不是讀書可以讀出來的,那麼是從何而來?願景雖然是領袖的見識和眼光,其實也不是只限於領袖所有。《 聖經 · 箴言》有一句話說:「民無異象,就必放肆。」這句話中「異象」,是古老的譯法,今天可以代之以「願景」,就不會讓人想到見到甚麼怪異的夢兆之類。撰寫《箴言》的智者說,人們如果看不見一個活著的意義和前景,就會出亂子。而這個「看見」這個人生的智慧,是從上帝而來的。《聖經》記載,敬畏上帝是智慧的開端,是同樣的意思。它與聰明不同,那是智商和技巧。它是智慧,一個對人生和社會的願景。

只可惜今日人人都追求聰明,忘記了智慧。只放眼在謀生的技能而沒去為自己的生活尋找「願景」。

2007年8月6日星期一

請用原因說服我

喲哪桑 Speaking | 管理.軟體.產品.專案: 請用原因說服我
不知道為何定下這樣的目標,不知道為何做出這樣的決定,就難以瞭解這工作的意義;

不瞭解工作的意義,就難以對工作投入熱情;

人不是棋子,不是工具。人若工作沒有熱情,就難以為繼。

因此,請用原因說服我。告訴我,為什麼要這樣做決定。而不要只是告訴我、通知我,你的決定,我的方向。

當我信了你,你我才是一個 team,有同樣方向的 team。

2007年7月25日星期三