早在工作之前,就有学长们、老师们谆谆教导说,语言不要贪多,学一门语言学到精,其他语言再学就很容易了。
我是这么做的,而且,做的有点过。很长时间里都扎在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.blogjava.net/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
个人要求:
* 能熟练阅读英文文档, 能编写英文文档更佳
* 良好的沟通能力, 能与团队紧密协作
* 富有责任感
* 能积极主动完成工作
* 善于学习