早在工作之前,就有學長們、老師們諄諄教導說,語言不要貪多,學一門語言學到精,其他語言再學就很容易了。
我是這么做的,而且,做的有點過。很長時間里都扎在Java的世界里不肯出來,找開源工具也一定要找基于Java的。最早找一個Wiki都執意要找Java的,找到了JSPWiki。也因此認識了BeanSoft和Java Ajax群的朋友們,呵呵。
但是,隨著開發任務的變化,不得不去學一些其他的語言。沒辦法,人在江湖身不由己啊,所以,也就開始了多門語言的學習之路。javascript可以說是我學的第一門“外語”。最早的時候對js的應用,也就簡單用一下得了。后來隨著時間的推移,覺得將來脫不了要靠它吃飯,也就主動買了幾本JavaScript的書,慢慢的去啃,甚至啃到了很多對我沒什么用的高級的特性,再后來工作需要,接觸了Flex,js用的就少了,也就慢慢的放下了。
ActionScript是我接觸的第三門外語。也是用心比較大的,呵呵,很長一段時間里甚至熱情超越了Java。中間根據個人興趣還看了點Ruby。
隨著實踐的增多,對語言的恐懼心理下降了。反而發現了各個語言所在世界的優勢。每個語言所在的世界里都有非常優秀的東西。最早想做一個手腳架,看了一下Rails,是基于Ruby的;為了測試Flex,研究了FunFX,也是基于Ruby的;前不久在部門里搭建了一個wiki,是基于PHP的;這段時間又研究了一下Trac,是基于Python的;研究Trac的時候發覺它可以跟Bugzilla集成,而Bugzilla是基于Perl的。這么多優秀的東西,讓我覺得學習多門語言的困難變得無所謂了。
上次去OpenParty,參與了鄭曄的那個session。他講了自己在項目中使用多種語言的經歷。其實很有趣,作為只會一種語言的人來說,他覺得學多門語言會讓自己泛而不精,然而真正掌握多門語言的人卻發覺,他山之石可以攻玉,當你學會別的語言之后反過來在使用以前的語言的時候,思路會變得異常開闊。不管是對設計模式的領悟上還是對架構的組織上,都達到了一個更高的高度,反而更加精深了。
回來后,我也想了很多。記得早前看o6z一個帖子講,SOA之所以風行,很大原因是因為企業已經積累了一些設備和軟件。因為金融風暴也好,因為經濟衰退也好,因為成本考慮也好,因為這這那那也好,不想統一成一個,需求決定供給,所以SOA才風行起來。那么這樣一個環境對我們開發人員的會不會有什么影響呢?而且開源風行的今天,我們的軟件行業也已經積累了一批財富。我們業內的人,也是不想統一替換成一類語言的,那么市場上的需求會不會慢慢變得要求我們程序員必須掌握多種語言呢?其實現在已經這樣了,我就是一個例證,我的變化不是我主觀想這么做的,而是一只看不見的手---市場推動的。不過我個人預測未來可能會更嚴重,如果JVM成功變成一個可以跑各種動態語言的超級平臺的話。
瘋泉的故事一直困擾著我---相傳,有一個國家,有一口瘋泉,喝了泉水的人都會瘋,很快全國人民都瘋了,只有國王是正常的,在國民眼中看來國王是不正常的,其結果就是國王被灌下瘋泉水,成為了瘋子,全國狂歡。作為旁觀者看來,你告訴我,國王是對的?還是國民是對的?
可是跟所有的故事一樣,故事總是只強調問題的一方面,我反過來講這個故事,如果全國人民都沒瘋,就國王瘋了,國王認為,不行,全國人民得跟我這樣,于是想法設法讓全國人民喝上瘋泉水。那么現在作為旁觀者你告訴我,國王是對的?還是國民是對的?
現在有一個國家,有兩口泉,一口是瘋泉,一口是醒泉。喝了瘋泉的人會變成瘋子,喝了醒泉的人會變成正常人。最早國家的人全變成了瘋子。機緣巧合,國王喝下了醒泉。清醒過來的國王想讓國民都醒過來,想讓國民喝醒泉。而國民發現了國王與自己不一樣的地方,于是將國王灌下瘋泉水,國王再次瘋了。那么現在作為旁觀者,你告訴我,國王是對的,還是國民是對的?
其實三個問題都挺簡單的,第一個:國王是對的,第二個,國王是錯的,第三個,還是國王是對的。可是,我現在再給旁觀者的你一個新情報,三個故事是一件事,只不過是三個人講的,所以出現了三個版本。其實我還能講一個故事,就是把第三個故事反過來講,大家自己想去吧,相當于第二個故事的擴展版。如果是這四個故事一塊看,你說誰是對的呢?是“群眾的眼睛是雪亮的”呢?還是“真理掌握在少數人手中”呢?
如果到現在你還沒有被我繞暈了的話,應該心中還能響起柯南的那句話:“真相只有一個”。沒錯,所以你只要找到那兩個泉,搞清楚到底哪個是醒泉哪個是瘋泉就好了。真理,自然就知道是掌握在誰手中了。繼而也就可以證明國王是對的,還是國民是對的。
可是,事情沒有那么簡單,你率領的觀察隊發現,兩個泉水是兩口魔泉,你喝下一口泉水的水,你就有擁有了一種價值觀,喝另一口泉的水,就擁有了另一種價值觀。兩種價值觀是對立的,但是,誰知道哪種是瘋的呢?事情變得更復雜了。。。難道在這個事件中我們無法證明什么嗎?誒,還真有一個,你證明了,這個國家有兩口魔泉,不是一口。
這世界上有很多事情就是這樣,撲朔迷離的,就算最終謎底揭曉,發覺反而不知道對錯了。可是如果我們一開始就知道這些,我們就能知道對錯了嗎?還是不知道啊。不過呢,這種問題,我們苦惱,精英們比我們更苦惱。早在我們考慮之前,精英賢者們就在考慮這些問題了,并得到了一些結論。最早的時候,老子就說,有錯才有對。這說法比較言簡意賅,乍一看就是句廢話。我以前也覺得他是句廢話,知道有一天看到了另一句話,才明白他老人家的微言大義。這句話就是:“可以被證偽的命題才是科學的命題”。這話聽著跟我們日常里對科學的印象不太一樣呢,我們常說,你這個說法不科學,那意思就是不對。科學當然是對的,證偽,證明是錯誤的,那種東西怎么能算是科學的呢?可惜,事實正是如此,所有科學的命題都是可以被證偽的。科學也正是因為信奉這一條原則,所以才可以自我修正,自我進化,以致今天的高度。
所謂可以被證偽不是說這個東西有錯誤,而是說,你這個命題天生帶著可以被推翻的情況出生的。比如,曾經有人懷疑進化論的科學性,說你這個東西無法被證偽,進化論的擁護者就說,你只要找到一批侏羅紀的兔子或者猩猩化石什么的,那么進化論就被證偽了,因為進化論說物種的進化一定是從低級到高級。這種情況,我們稱之為可被證偽。指一個命題能夠被推翻。什么是不可被證偽的呢?比如說什么是美的,我們常說情人眼里出西施,那美自然是無法被證偽的東西。藝術的東西,大都是無法被證偽的。無法被證偽的東西,自然沒有錯誤,沒有錯誤的東西自然就沒有正確。像這樣的東西,就不要追求什么對錯了,硬要追求,只有自討苦吃。
前一陣跟一做企業文化咨詢的哥們混了一陣,從他那瞅見一書,挺有意思。叫《公司基因》,看著不錯就買了。
這OpenParty是不興推薦書了,下次再有機會就推薦這個。
這書里認為企業文化不管怎么變,他的DNA都是由四個元素組成的,即:組織架構(原詞是structure)、決定權、信息、激勵機制。
它根據這四個元素把企業分成了七種類型
- 消極進取型
- 時進時停型
- 過度膨脹型
- 過度管理型
- 隨機應變型
- 軍隊型
- 韌力調節型
其中前四者看名字就知道不是什么好東西,書中也定義為不健康的企業。后三者,雖然都算是健康的,但最好的其實是最后一個。
敏捷常常被說是一種文化,我也這么覺得。所以,我最近一直讓自己從這四個角度看敏捷的方法學。分析來分析去,反而搞不清敏捷應該塑造一種文化,還是某種文化是維持敏捷的土壤。有點雞生蛋蛋生雞的意思。不過不管哪個生哪個,如果目的是養雞,那誰先誰后就不是我關心的了。
這本書前面部分寫了太多關于案例的內容。沒有足夠形象的講解Scrum。也沒有充分描述Scrum的假設、適應情況和不適應情況。講Scrum的風格跟微軟的講師講座倒是真挺像。
書中的Service1st公司的案例跟我們部門的情況極其相似。最后他也沒解決,只是說Scrum在現有的形勢下帶來了什么好處,有些失望。不過仔細想想,這個團隊的問題不是軟件開發方法的問題,而是企業文化的問題。所以Scrum解決不了是意料之中的。
但是這本書,說實話,不是特別經典的一本書,大概看看吧。
敏捷是以消除浪費、提高質量為目標的。但是有些時候總能見到一些原教旨主義者指出,重構也是浪費、結對也是浪費、討論也是浪費。然后呢,又有人提出,XX是必要的浪費這種說法。
想了一下,XX是必要的浪費這個說法其實不確切,只能說,這些東西是必要的成本支出。所謂浪費,必須從經濟學角度講才行。不然世間一切都可以帶上這個難看的帽子。
從牛博網最近新來的騙銀老師那里學來一個概念:“經濟學上有個奇怪的概念叫‘冤死的損失’(deadweight loss),英文的直譯是‘未被釋放出來的能量損失’,那是說,有一部分損失,...”誰也沒拿走,“...但因為效率原因,它就那么憑空損失掉了。”
因為聽起來很玄,為了讓大家更好理解,騙銀老師在后面講的一個非常耳熟能詳的例子:
“
我雇了一幫人,天天就負責刨坑,刨了然后填上,然后再刨開,再填上(這例子不荒謬,中國隨處可見),我發給他們工資,這一來一往國民生產總值(GDP)就上去了。看起來誰也沒損失什么,對不對?只是簡單的財富轉移。其實不然,這里面有巨大的浪費,因為這些錢、這些勞力本來可以用在其他更為有效的生產上,可都用來刨坑了,那就是浪費。”(其實個人這個例子還不夠形象,如果挖坑和填坑的不是一批人,他們自己根本就不知道自己做的是浪費的事情,就知道干了活,拿錢,而且還為挖坑和填坑做了很多過程改進,提高工作效率。那就更形象了。)
所以說,您不能因為某些工作做了您能看到效果了,就不稱之為浪費,而有些工作做了您看不到效果就稱之為浪費了,應當反思一下是不是自己眼界不到。
離職將近,我在交接工作之際,因為我最熟,所以要我把依賴我負責模塊的其他模塊的適配器類改至新版。自己搬著Mingle寫了一些故事卡,又用CC寫了一
些持續集成的腳本。接下來,我還會去寫測試用例。整個過程中,沒有一行有效代碼的產出。在以代碼計績效的角度看,我的工作就算是浪費。可是,大家應該知
道,沒有這些東西,先不說我會不會在開發的時候保證質量。就說我離開以后,當產品質量出問題了,誰來保證?我可以根據異常一眼看出問題可能出在哪里,新接手的人能嗎?如果他改了程序,能保證不會按下葫蘆起來瓢嗎?他需要時間去犯錯去學習,這個時間,沒有產生新的價值,這才是真正的浪費。而且這也就成了挖坑-填坑的模式了。
問題反過來了,我做好這個CI的環境走了,來了一個新人接手,會怎樣?一天,系統報異常了。他有我的測試環境,而且,還是可以運行的。他可以很快的寫一個測試用
例,并開始調試,即便他無法理解整個設計,那不妨礙他快速的修復Bug。而且,因為以前的測試用例可以自動運行,他還可以保證自己的修改不會導致之前的功
能出現問題。一個為產品而組織的團隊,離開了某個特定的人,產品仍然可以自我完善,能完成這樣的目標的手法才是最有價值的。
很多人擔心前期花費的時間太多,后期就更沒時間,問題又來了。前期花費的時間多,是浪費掉了,還是合理的用掉了?如果是浪費掉了,自然不應該,如果是合理的用掉了,那是必須的。我們學軟件工程的時候都學過,一個問題發現的越晚,改正他的成本就越高。后期所謂的沒時間,就是因為前期太多問題沒有修正。
說道這個前后期的問題就不得不提最近一次結對的經歷。在我的堅持下,總算完成了一次與同等水平開發人員的結對編程。持續時間有三天。與同等水平的人結對,感覺是不一樣。也發現了很多以前沒有發現的問題。這都是個人問題,脫離我本人就沒有意義了,所以也就不說了。主要說一下心得。這三天的時間里做了一件什么事呢?推翻以前分成兩個模塊的應用,合成一個。兩個人做一件事,大家可以隨時根據今天剩余的時間做工作的調節,精確到小時。因為了解的信息不同,可以快速傳遞,合作互補,當他提出一方案的時候我可以快速告訴他,我這邊沒有問題,減少了嘗試造成的時間浪費。因為兩個人一起做,腦子根本停不下,一個人停了,另一個人還在轉,帶著你不得不進行。一天的有效工作時間在6小時以上。而分開的話,基本上能有3個小時就不錯了。
(中間發生的一點插曲。因為結對開發從不了解的人看來,是一件很浪費時間的事情。所以出現干預結對的現象出現,理由是擔心做不完。我覺得,如果不是堅持的話,就真的做不完了。從現實中看來,強調浪費,很容易被偷歡概念。而偷換概念的人很多人都沒有做過仔細的考慮。純粹的想當然。)
今天公司過了CMMI 4級,5級沒過,聽老外講述什么是5級也就是說什么是持續改進以后,感覺到CMMI的持續改進和Agile的消除浪費其實是一枚硬幣的兩面,持續改進就是消除浪費,為什么這么說呢?CMMI的持續改進本來就是高級別的過程域,那個時候指望重大變革基本就不靠譜,所以這個時候,看不管哪個行業,都會走向消除浪費的方向,軟件開發也不例外。CMMI的持續改進要求一直做一直做,那跟敏捷要求的追求精益的觀點是一致的。
CMMI認為通過4級的度量形成了穩定的過程之后,5級就應該是對4級過程的不斷改進,什么時候看,都是不滿足的,值得修改的。那種精神不正是敏捷的世界觀嗎?CMMI給出了一堆過程域和目標,并沒有告訴我們怎么實現,Agile就更粗狂,不過大家提到Agile其實想到的是XP。所以覺得Agile就是一堆實踐而已,沒關系,不去爭辯這個問題。我就看XP,XP的那12個最佳實踐,跟CMMI的思想一點都不矛盾。(細節不可考,因為很多時候我很難清到底是CMMI里面就定好了這細節還是我們的EPG定的)。以前的時候只是粗略的感覺這兩者可以不矛盾,現在培訓過后,更證實了這點。
============
縮寫解釋:
Agile 敏捷
CMMI 能力成熟度模型集成
XP 極限編程
EPG 企業過程小組
不知不覺做這個產品已經一年了,其實除了技術積累,對這個產品的概念基本是處于原始階段。雖然早已經過了企業內容管理與網站內容管理的疑問階段。但是內容管理本身是對企業有什么價值,問了很多人。很多人的回答都不讓我們滿意,因為他們回答的其實是工作流有什么價值、OA有什么價值、文檔管理有什么價值、ERP有什么價值。
昨天聽一位曾經實施過FileNet的同事說了一句話才明白過來這個東西的價值在于“提供一種海量非結構化異構文檔的查詢服務”,其余的都是在其之上的附加價值。
價值有了,可是越看越沒底:“海量”、“非結構化”、“異構”僅一個關鍵字就夠麻煩的了,三個拼一塊。。。很好,很強大。。。。。
這兩天為了Fluorida的closePopUp功能,讀了點Flex框架的源碼,對Alert,TitleWindow以及Flex的PopUp功能做了簡單的分析。
【Alert和PopUp】
Alert內部其實是調用了PopUpManager.在parent參數為null或者為Application的時候,彈出的窗口將跟當前Application在一個容器下。Alert在最頂層,Application在最底層,中間那層是一個稱之為modalWindows的控件,其實就是Alert后面那個磨砂的層。為了點到Alert上的按鈕,寫了一個小程序分析Alert的結構,不是很好讀,但是可以運行一下,看看分析出的Alert的內部結構:(大略說一下,Alert的Child有一個AlertForm,而AlertForm的Child除了第一個是TextField以外,都是按鈕)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.core.IChildList;
import mx.core.UIComponent;
import mx.core.IFlexDisplayObject;
import mx.managers.ISystemManager;
import mx.managers.PopUpManagerChildList;
import mx.managers.PopUpManager;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.core.Singleton;
import mx.managers.IPopUpManager;
private function showSimpleAlert():void{
Alert.okLabel="oKey";
Alert.show("Hello, World!","",15,null,alertCloseHandle);
var myTimer:Timer = new Timer(1000, 1);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();
}
private function alertCloseHandle(event:CloseEvent):void{
simpleAlertShower.label = event.detail.toString();
}
private function timerHandler(event:TimerEvent):void{
var text:String = "elements:";
var sm:ISystemManager = (Application.application.root as ISystemManager);
text+=sm.numChildren.toString();
text+=";\n modalWindows:";
text+=sm.numModalWindows.toString();
for(var index:int = 0; index < sm.numChildren; index++)
{
text += "\n" + index + " : ";
text += sm.getChildAt(index).toString();
}
var alert:Alert = sm.getChildAt(sm.numChildren - 1) as Alert;
text += "\n buttonFlags : "+alert.buttonFlags;
text += "\n alertChildren:" + alert.numChildren;
for(var index:int = 0; index < alert.numChildren; index++)
{
text +="\n" + alert.getChildAt(index).toString();
}
var alertForm:UIComponent = alert.getChildAt(0) as UIComponent;
text += "\n alertFormChildren:" + alertForm.numChildren;
for(var index:int = 0; index < alertForm.numChildren; index++)
{
text +="\n"+index+":"+ alertForm.getChildAt(index).toString();
}
popupChildText.text = text;
alertForm.getChildAt(1).dispatchEvent(new MouseEvent(MouseEvent.CLICK));
// var popupContainer:IChildList = (application.root as IChildList);
// PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);
}
]]>
</mx:Script>
<mx:Button id="simpleAlertShower" click="showSimpleAlert();" label="Click Me"/>
<mx:Text id="popupChildText"/>
</mx:Application>
【關于TitleWindow】
TitleWindow作為彈出窗口的時候,跟Alert處的位置沒什么區別,我想說的是TitleWindow的closeButton在哪里。下面這個同樣不好讀的程序可以幫助你分析TitleWindow或者說Panel里面都有用什么,以及closeButton在哪,其實就是在rawChildren的最后一個。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.containers.TitleWindow;
import mx.core.IChildList;
import mx.core.UIComponent;
import mx.core.IFlexDisplayObject;
import mx.managers.ISystemManager;
import mx.managers.PopUpManagerChildList;
import mx.managers.PopUpManager;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.core.Singleton;
import mx.managers.IPopUpManager;
private function showSimpleAlert():void{
var popUpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this,TitleWindow,true));
popUpWindow.width = 400;
popUpWindow.height = 300;
popUpWindow.visible = true;
popUpWindow.showCloseButton = true;
var myTimer:Timer = new Timer(2000, 1);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();
}
private function alertCloseHandle(event:CloseEvent):void{
simpleAlertShower.label = event.detail.toString();
}
private function timerHandler(event:TimerEvent):void{
var text:String = "elements:";
var sm:ISystemManager = (Application.application.root as ISystemManager);
text+=sm.numChildren.toString();
text+=";\n modalWindows:";
text+=sm.numModalWindows.toString();
text+="\n top children: ";
for(var index:int = 0; index < sm.numChildren; index++)
{
text += "\n" + index + " : ";
text += sm.getChildAt(index).toString();
}
var titleWindow:TitleWindow = sm.getChildAt(sm.numChildren - 1) as TitleWindow;
text += "\n popUpWindowrawChildren:" + titleWindow.rawChildren.numChildren;
for(var index:int = 0; index < titleWindow.rawChildren.numChildren; index++)
{
text +="\n" + titleWindow.rawChildren.getChildAt(index).toString();
}
var titleBar:UIComponent = (titleWindow.rawChildren.getChildAt(2) as UIComponent);
text += " has " + titleBar.numChildren;
text += "\n" + titleBar.getChildAt(3).toString();
popupChildText.text = text;
// var popupContainer:IChildList = (application.root as IChildList);
// PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);
PopUpManager.removePopUp(titleWindow);
}
]]>
</mx:Script>
<mx:Button id="simpleAlertShower" click="showSimpleAlert();" label="Click Me"/>
<mx:Text id="popupChildText"/>
</mx:Application>
最近的一個月事情真不少,公司內:要過CMMI,公司外:活動接連著就有倆。接連參加了OpenParty和RIAMeeting之后覺得自己應該總結一下了。
上次的OpenParty質量奇高。從那里學到了很多知識,從gigix那里學到基礎的價值,在session的學習中還順帶自己想明白了迪米特法則的價值,了解了壞的制度是如何作用于公司氛圍的,親眼目睹到設計欠債的后果,以及補救僅能做到的程度有多高。從Tin哪里學到界面開發過程方面的一些非常優秀思路,今天參加RIAmeeting的時候還討論了更細節的開發人員和設計人員配合的問題。這次的好topic太多了,只能挑著最感興趣的聽了,次感興趣的其實也很想去聽得,比如精益、CMMI & Agile、巨富客戶端,這一說起來好像哪個都想聽了,但只有在好看簿上看了,這種不完美別有一番吸引力,還有些沒選上的topic其實也不錯的。希望下次有機會聽到。Open Party給我的東西太多了,每次想說的時候就被教育一次自己的語言能力有多貧乏。
這次RIAmeeting也不錯,見到一些老朋友,也見到了沒有見過面的朋友。而topic呢,說實話,我已經過了對技術普及的topic感興趣的階段了。所以兩個主要的topic都不是很吸引我,而這半途蹦出來的一位90后的小兄弟貢獻的topic給了我不小的震撼,他的作品雖然還有點稚嫩,但是可以看到很多創新點和一些真正的產品級設計。看到了一個如此鮮活,沒有被教育體制的“壓模機”殘害過的頭腦,感覺真是不錯。(腦子中閃過“炸學校”短片里的那個壓模機)一年、3萬行代碼,高二,這幾個關鍵加在一起,讓我覺得這個小兄弟的時間管理能力應該不錯,于是問了一下,他還真給出了一個時間表,很有意思。會后的討論也很有趣,大家就美工與開發人員如何配合展開了很深的討論。那對美工與程序員的搭檔給我留下深刻印象,他們說的一些話體現出來態度讓我仿佛看到了一個優秀的團隊,尤為欣賞,尤其那位美工那種追求更高效交流以期減少浪費的“敏捷”態度在美工中真的是非常少見。(說實話,程序員中這種態度也不忒多見)
兩個活動都參加之后,個人比較來看,Open Party比RIAmeeting精彩,大概是因為RIAMeeting更像是Flex的傳播活動,偏向普及,缺乏高級點的交流,而OpenParty則是從業人員的經驗交流,門檻稍微高一點。其實對于線下的交流我還是比較喜歡門檻高一點,那樣比較過癮。
【花絮】
在OpenParty上我們講解了FunFX之后。熊節跟我說他剛才也做了一個自動化測試的框架。雖然我已經把敏捷和熊節這兩個詞關聯起來很久了,但是這等速度還是讓我吃了一驚(導致現在我還在懷疑是不是我聽錯了,
已經證實。。。我聽錯了)。那個框架當天就被熊節發到了google code上,當時他的名字是:
Fluorine,還寫了一句很有趣的話:Fluorine makes your teeth FLASH。可惜這個名字有人用過了,現在改名為Fluorida。
Fluorida的原理說白了很簡單,使用dispatchEvent的方式模擬操作,若干個月之前我也這么干過,當時是對這種方式的可行性表示懷疑的。在后來在Google code上下載了代碼并閱讀一遍之后,我開始覺得這個做法沒啥問題。而且相比FunFx,他不需要Flex程序員再去學Ruby。今天很榮幸的加入到這個項目組中。
如今預覽版--0.0.1版已經發布,廣泛征集回饋和建議中,有任何建議可以到
http://code.google.com/p/fluorida/wiki/Announcement001 發表評論
======
主要相關報道及文章:
http://www.matrix.org.cn/resource/news/7cf0239a-ebe6-11dc-91da-b599c3ba16ef.html
http://dreamhead.blogbus.com/logs/16533990.html
http://gigix.thoughtworkers.org/2008/3/6/announcement-fluorida-0-0-1
項目地址:
http://code.google.com/p/fluorida/
這世界上有很多界限,有些是看的見得,有些是看不見的。看得見的界限我們想辦法總能突破,而看不見的,則無法可想。
最可悲的是當看到本來看不見界限的時候,剎那的無力感會將自己的一切驕傲粉碎。
我很喜歡《褻瀆》的一個詞--位面。不一樣強大的人們就像活在不同的位面。在一個位面里,沒什么障礙是無法突破的,可位面間的界限,有時候你連他在哪都不知道。何談突破。
像我這樣從Java平臺進入Flex平臺的人經常會為ActionScript不容易實現某些設計模式(比如單例)而煩惱,跟我一樣煩惱的人有福了,這里有一本很棒的書:
http://www.tkk7.com/Files/tj19832/flex/Adobe.Press.Advanced.ActionScript.3.with.Design.Patterns.Nov.2006.rar
這本書一定要讀,一定要讀,一定要讀,不然開發的時候會犯很多錯誤,走很多彎路,產生很多錯誤的認識。后果很嚴重的:P
從來沒有想過把“炫”這個詞跟諾基亞的產品聯系在一起,通常這個詞都是給apple之類的公司的,但是在開始看這個視頻不到30秒,我的觀念就被徹底顛覆了。據說,七年之后,這款手機將上市。期待啊。。。。。
這就是我參加完第二次OpenParty的感覺,這次的topic有十幾個。很可惜最后進行的只能有9個。我跟Thoughtworks的韓鍇一起準備了一個關于Flex的session。沒想到還得到最多人的支持。虛榮心得到極大滿足,咔咔。
坐在里面,參與或主持Session,感受知識的傳播與再造,那真的是一件非常快樂的事情。我可以感受到自己的成長和別人的成長。往大了說可以感覺到中國的軟件界的成長,因為大家都是來自不同的公司,等大家帶著知識回到公司,又會對公司成長產生作用也就一點點得對業界產生了作用。就像蝴蝶效應,雖然這是一只頗大個的蝴蝶。(PS:但是出了門沒多遠就看到Police坐著車慢游,頓時緊張是不是查證的,唉有推動力就有障礙么)
整個活動是idea的碰撞、攪拌。這種感覺遍布各個角落,經常看到session已經結束,但是思維的碰撞仍在繼續。甚至這一期的OpenParty結束了,他的效果卻才剛剛開始,一直綿延到很久以后。在那種氛圍下,頭腦在一刻不停的思考、汲取知識,同時不自覺的就想去跟人交流。這半天過得是非常充實的。
也正是因為前面的原因,等回到家中,興奮勁稍微過去之后,大腦似乎才剛剛意識到累了。其表現就在于一回想白天的某一個topic,腦子里就爆炸式得蹦出一堆東西,有自己的想法,有別人的話,甚至當時的場景,一遍遍像過電影一樣閃現,最終崩潰,所有的畫面連不成一個有序的思維。于是打開優酷看美劇,同時上網跟人聊天,讓大腦停止思考。這招百試百靈,這次也不例外。直到現在,好象才從中稍微的恢復過來。可也想睡覺了。。。。。。
我的操作系統是Vista Home Basic版,Adobe網站上有兩個地方下載Flex Builder。我從http://www.adobe.com/go/flex_trial下載的怎么也裝不上。而從https://www.adobe.com/cfusion/tdrc/index.cfm?product=flex下載的就能裝(這個地址需要你有Adobe的id,注冊一個就好)。雖然解壓出來也是前一個的文件,但就是能裝,實在是有點暈。不知道是不是vista都這德行,反正跟我一樣裝不上Flex Builder3的話,去后一個地址下載就可。
最近,Adobe發布了Flex 3和AIR 1.0。宣布一個新時代的正式來臨。Flex的時代。
回顧多年以前,當它僅僅是Flash的時候,那時的它也可以運行在網頁中和桌面上,大家覺得它很漂亮,僅此而已,那時的它只是個非常可愛的小玩具。不要說巨人微軟沒有注意到它身上隱藏的潛力,就連他現在的主人Adobe也對它不感興趣。也正是這樣,他在每一個平臺上都很好的生存了下來。
在這個世界上,有另外一個技術,叫做Java。它以跨平臺為理念,努力打造一個統一的軟件世界。在后臺,它取得了無與倫比的成功,可是在前臺,它總是不那么順利。我,就生活在這樣的世界里。
日子一天天過去,Flex迎來了3.0。FlashPlayer9也占據了世界上94%的PC(如果算上以前的版本,這個占有率逼近100%)。而相比只下,JRE之占據了84.6%,在蘋果和其他操作系統的沖擊下,windows也降到了90%以下。毫不客氣的說,FlashPlayer已經是世界上覆蓋率最大的運行環境。昔日的星星之火開始呈現燎原之勢。
今年,毫無疑問會有很多的開發人員轉向或者開始接觸Flex,中國的Flex資源還比較貧乏,不過已經有一群人在努力了。雖然已經有了AnyFlex,RIAchina之類的論壇,但是相比較傳統的論壇,下面的幾個更有特色:
以
Kenshin為首的人做的
RXNA是一個非常棒的Flex相關RSS信息整合站,類似國外的mxna
而
閑云野鶴則建造了一個Flex搜索引擎計劃:
http://blog.eshangrao.com/index.php/2007/02/27/352-googleflex
以及同樣是他搞得Flex Wiki計劃:
http://blog.eshangrao.com/index.php/2007/05/12/390-flexwikiflex
還有促進線下交流的
RIAmeeting
有聲有色的活動和網站正在一點點多起來,今年將是Flex星火燎原的一年。我對此充滿信心。
所有關注Flex的博客上都在寫這個,那我也跟風好了。
Adobe發布Flex 3和AIR 1.0的正式版。
在這個日子里我在干啥捏?配CruiseControl,嘗試將持續集成引入我們部門,順便,考慮CI in Flex的解決方案。
我人生的道路上,我在做的事情有意義嗎?不知道。我的幸福是什么呢?不知道。我如此努力會不會是無謂的付出呢?不知道。我只知道,有一種力量在逼迫我行動,我不知道是在向前還是在向后。它讓我很累,很充實,同時很失落。我今天的努力可能在明天被證明是無謂的。我正在做的事情也可能會在將來被我意識到是沒有意義的。我的幸福,可能早已被我錯過。但是我依然不能停止我行進的步伐,向著幻想中的希望前進。這,就是我的人生吧。
今天應用維基百科的程序搭建了一個wiki,想架設知識庫的伙計們可以參考
部署方式如下:
下載Apache2.2,相關地址:
http://httpd.apache.org/ windows下要下載msi那個版本。雙擊將其安裝在機器上,我選擇的目錄是:C:\Apache2.2。如果不想使用80端口,在安裝過程中設置
下載php5,相關地址:
http://www.php.net/downloads.php 我下載的是windows的zip包那個版本,將其解壓在c:\php下。
下載mysql,這個就不廢話了。
安裝完后,將C:\Apache2.2\conf下的httpd.conf打開,在LoadModule一組處加上LoadModule php5_module "c:/php/php5apache2_2.dll",在AddType處添加的
AddType
application/x-httpd-php .php 在LoadModule下面加上PHPIniDir
"C:/php"。把"c:/php"下的"php.ini-recommended"文件復制一份,改名為"php.ini",在php.ini中將
extension=php_mysql.dll
extension=php_mysqli.dll
兩行前的;去掉。
將extension_dir = "./"改為extension_dir = "C:/PHP/ext"
下載wikipedia:
http://sourceforge.net/projects/wikipedia/
將所有文件拷到"C:\Apache2.2\htdocs"下
運行開始菜單里Apache Http Server下的Start Apache in Console
打開瀏覽器,輸入:http://localhost:8080/index.php,在頁面上點擊 set up the wiki,頁面跳轉到:http://localhost:8080/config/index.php
輸入wiki name,和Admin username的名稱(默認是WikiSysop)和密碼
配置mysql的屬性,Database name,Database host,DB username,DB password還有超級用戶的用戶名密碼
全部設置完畢后點擊 install mediaWiki
完成之后,系統會提示你
Installation successful! Move the config/LocalSettings.php file into the parent directory, then follow
this link to your wiki.
將"C:\Apache2.2\htdocs"下的config/
LocalSettings.php拷貝到父目錄里即可
===================
以上部署過程在vista下測試通過。那些安裝路徑都可以換掉,但是不要安裝在Programe Files下。如果系統安全性設置太高的話,最后可能不生成LocalSettings.php
硅谷創業公司 BeyondMedia 高薪招聘 (北京)
BeyondMedia 是位于美國硅谷的一家提供媒體服務的互聯網公司, 主要為美國所有的媒體和客戶提供一個中間平臺.
現在公司處于快速成長期, 希望在國內發展一個研發中心, 目前正在招聘研發人才.
本公司是一家正在快速發展的互聯網公司, 公司為員工提供良好的工作環境, 具有吸引力的薪水以及股票期權, 履行正規的保險權益.
有意者,請發送中英文簡歷到
cnscud@gmail.com 郵件, 并請注明期望薪水,外語情況等, 謝謝.
以下要求僅供參考.
==============================
====
高級Flash工程師
主要工作職責:
* 和整個開發/設計團隊協作
* 完成相關的Flash設計, 制作, 維護
* 其他相關的設計工作
* 編寫相關文檔
基本要求:
* 3年+工作經驗
* 美術設計專業或有相關從業經驗
* 熟悉Flash制作
* 熟悉Flash編程 (Flex, ActionScript等)
* 熟悉JavaScript, Html, XML
* 有網站設計經驗更佳
個人:
* 能熟練閱讀英文文檔, 能編寫英文文檔更佳
* 良好的溝通能力, 能與團隊緊密協作
* 富有責任感
* 能積極主動完成工作
* 善于學習
===============================================
高級網站美術設計師
主要工作職責:
* 和整個開發/設計團隊協作
* 了解整個平臺網站的結構, 對網站進行設計, 實現和維護
* 編寫相關文檔
基本要求:
* 3+年工作經驗
* 美術設計專業或相關從業經驗
* 熟悉Photoshop, Dreamweaver等相關軟件的使用
* 熟悉網頁的制作編輯, Html, CSS. (Div+Css方式)
* 了解歐美網站風格者優先考慮
* 熟悉Javascript更佳
* 熟悉Flash制作更佳
個人:
* 能熟練閱讀英文文檔, 能編寫英文文檔更佳
* 良好的溝通能力, 能與團隊緊密協作
* 富有責任感
* 能積極主動完成工作
* 善于學習
高級J2EE軟件工程師
工作職責:
* 和開發/設計團隊進行協作, 了解系統需求,架構和設計
* 設計, 實現和維護系統平臺
* 編寫相關文檔
技術要求:
* 4年+ 的J2EE應用開發經驗
* 熟悉Struts2, Webwork或類似MVC框架
* 熟悉Spring和Hibernate
* 熟悉Javascript, Html, Jsp
* 有Ajax的使用經驗更佳
* 數據庫方面的經驗, 例如數據庫設計和SQL
* 熟悉Mysql, Oracle或者其他數據庫
* 有Web services的使用經驗更佳
* 熟練使用Java IDE, 例如Idea, Eclipse
* 了解Weblogic, Tomcat, JBoss或Resin的部署
* 熟悉Linux系統更佳
* 有網頁制作編輯(美工)經驗更佳
個人要求:
* 能熟練閱讀英文文檔, 能編寫英文文檔更佳
* 良好的溝通能力, 能與團隊緊密協作
* 富有責任感
* 能積極主動完成工作
* 善于學習
===============================================
J2EE軟件工程師
工作職責:
* 和開發/設計團隊進行協作, 了解系統需求,架構和設計
* 設計, 實現和維護系統平臺
* 編寫相關文檔
技術要求:
* 2年+ 的J2EE應用開發經驗
* 熟悉Struts2, Webwork或類似MVC框架
* 熟悉Spring和Hibernate
* 熟悉Javascript, Html, Jsp
* 有Ajax的使用經驗更佳
* 數據庫方面的經驗, 例如數據庫設計和SQL
* 熟悉Mysql, Oracle或者其他數據庫
* 熟練使用Java IDE, 例如Idea, Eclipse
個人要求:
* 能熟練閱讀英文文檔, 能編寫英文文檔更佳
* 良好的溝通能力, 能與團隊緊密協作
* 富有責任感
* 能積極主動完成工作
* 善于學習