2008年1月16日
想搬到BlogBus 去
理由如下:
1、BlogBus 速度很快
2、BlogBus 可以提供很好的API 調(diào)用,我可以利用JavaScript 整合許多別的應(yīng)用功能
3、BlogJava 這里的編輯器老出問題,還是我的FireFox 有問題?整得我很不爽
4、我的博客現(xiàn)在不光只有技術(shù)了,也不光只關(guān)注Java系列的了
新的地址為
http://phoenixtoday.blogbus.com/
2008年1月12日
看了部電影《鋼琴之森》,卻被它感動(dòng)了,觸動(dòng)很大,或許有些話說到心坎里了吧。
故事講述了兩個(gè)孩子,一個(gè)叫“海”,另一個(gè)叫“修”。他們都會(huì)彈鋼琴,“海”家里窮,卻從小與森林里的鋼琴一起長(zhǎng)大,對(duì)他來說鋼琴是親人,是樂趣,是享受,鋼琴是給自己彈的,鋼琴是存在于他每一個(gè)細(xì)胞中的;“修”從小練鋼琴,從生下來,鋼琴對(duì)他意味著日本第一,意味著成功,但鋼琴就是他的敵人,為了鋼琴,他放棄了太多太多,他刻苦練琴只為超越別人,拿得第一,彈鋼琴意味著只要不出錯(cuò),就是完美。森林里的鋼琴卻只有“海”才能彈響,無論“修”如何努力,森里的鋼琴選擇的只是“海”。
這個(gè)電影,先引發(fā)了我的回憶。記得小學(xué)我第一次擁有的學(xué)習(xí)機(jī),大部分時(shí)間,我是把它當(dāng)成游戲機(jī)的,可是看著那些動(dòng)來動(dòng)去的小人,心里總會(huì)犯嘀咕。后來,就照著學(xué)習(xí)機(jī)書本上的,照貓畫虎的寫了那么幾十行還是上百行的類Basic 程序,看著自己寫出來的“超級(jí)瑪莉”可以左右移動(dòng),還真的是有些激動(dòng),可是那時(shí)候的激動(dòng),卻遠(yuǎn)遠(yuǎn)及不上本科之后的那一次。第一次接觸真的電腦是在初一,一個(gè)電腦培訓(xùn)班里,對(duì)電腦有了概念,大致上就明白了一些基本操作和原理;后來有時(shí)會(huì)去網(wǎng)吧,再后來在初三擁有了自己的第一臺(tái)電腦,從此才走上了正軌。有了第一臺(tái)電腦后,不光用它來玩游戲,還開始買《大眾軟件》,慢慢的會(huì)的基礎(chǔ)知識(shí)越來越多,游戲也玩的越來越多,可是卻遠(yuǎn)遠(yuǎn)滿足不了自己的好奇心,到底這些游戲是怎么做出來的呢?初三的那一年,我將自己的理想從“科學(xué)家”細(xì)化為“計(jì)算機(jī)軟件學(xué)家”,呵呵,當(dāng)時(shí)真的不知道有程序員這個(gè)詞。大學(xué)報(bào)志愿,義無反顧的報(bào)考了計(jì)算機(jī)專業(yè),大一第一學(xué)期末,用C 語言寫出了自己平生第一個(gè)程序,望著幾百行的main 函數(shù),看著屏幕上閃動(dòng)的“Welcome” 心里真的激動(dòng)的不知道說什么好了。本科的計(jì)算機(jī)真的是偏理論也偏硬件,讓一向好強(qiáng)的我,為了在學(xué)業(yè)上有所作為,硬啃那些不喜歡的東西,好不費(fèi)力!大一、大二真的是迷茫,走了不少?gòu)澛罚钡酱笕_始學(xué)Java ,開始自己尋找興趣的出路,才逐漸有了自己的發(fā)展。從小到現(xiàn)在,這條路走的還真的彎彎曲曲,沒有得到多少人的幫助,沒有得到好老師的指導(dǎo),一切靠自己摸索,就為了心中那兩個(gè)字“喜歡”。
“海”的那句“彈琴是為自己彈得,不是為別人”,讓我想到了自己。是啊,我寫程序,研究技術(shù),從來沒有想過為任何人,就為了自己那份喜歡,當(dāng)然這不是說,我寫好的程序給別人帶來了快樂,減少了別人的工作量我不開心,而是當(dāng)初就壓根沒想到,就是想這個(gè)場(chǎng)景可以用自己喜歡的技術(shù),可以這么做,可以做的更好,可以解決以前遇到的問題。而這幾年,身邊遇到了很多朋友,有時(shí)也跟他們交談,大部分人給我說他當(dāng)初選擇計(jì)算機(jī)的原因是因?yàn)?#8220;熱門”,少部分的人則是因?yàn)?#8220;這個(gè)行業(yè)可以賺錢”,還有幾個(gè)人我認(rèn)為是為了“超越身邊的人”。這些人,從來沒有覺得自己是真喜歡這個(gè)行業(yè),這樣做是有趣的,他們的動(dòng)機(jī)都是由外在因素引起的,必然不會(huì)長(zhǎng)久,無法堅(jiān)持十幾年、幾十年,甚至一輩子,因?yàn)闊衢T的條件會(huì)改變,別的賺錢的機(jī)會(huì)未來會(huì)更多,身邊的強(qiáng)人你永遠(yuǎn)超越不完。捫心自問,這真的是你喜歡的嗎,它對(duì)你來說真的是有趣的嗎?如果這個(gè)行業(yè)只能給你保證溫飽,就像很多數(shù)學(xué)家窮得叮當(dāng)響,你也會(huì)義無反顧的堅(jiān)守嗎?
“如果你彈不出自己的舒伯特,遲早有一天,舒伯特會(huì)找你要回曲譜”,是啊,如果你設(shè)計(jì)不出自己真正想做的程序,那么你的所學(xué)所做,又有什么意義呢?而你如果不喜歡自己現(xiàn)在所做,那么將來,你還能做出自己想做的嗎?“海”為了彈出自己的舒伯特,每天除了練琴還是練琴,加上自己固有的靈性,最后終于成功。“興趣”和“愛好”對(duì)于你所要堅(jiān)持的行業(yè)來說,是遠(yuǎn)遠(yuǎn)不夠的,你能夠在別人享受生活的時(shí)候,自己安靜的看書嗎?你能真的為了一個(gè)目標(biāo),每天堅(jiān)持寫代碼嗎?前幾天被同學(xué)笑了,因?yàn)槲艺f“我過年和平時(shí)一樣的,看看書,寫寫程序,沒啥不同的”,然后他們笑我“你的生活還真的無趣”,o(∩_∩)o...,其實(shí)他們不知道,這才對(duì)我是最有趣的,我每天都在享受著,每天都在過年。越深入這個(gè)行業(yè),越發(fā)現(xiàn)自己所學(xué)太少,時(shí)間太少,還有很多自己感興趣的東西,每一門想精深的東西,都還有那么多那么多知識(shí)。真的想早一些譜出自己的舒伯特,真的向往那一天,不知道何時(shí)真的能達(dá)到?努力吧!加油!
2008年1月8日
昨天,要寫一段程序完成一個(gè)定時(shí)任務(wù),是有關(guān)Socket 發(fā)送的。胖子給我發(fā)了一段現(xiàn)成的程序,這段程序基本上的功能是實(shí)現(xiàn)了,但是表達(dá)的并不是那么清晰,因此我想重構(gòu)一下。沒想到重構(gòu)的過程竟然花了一個(gè)多小時(shí),從晚上八點(diǎn)多,一下就寫到了十點(diǎn),但是重構(gòu)完后,感覺清晰多了。仔細(xì)想想收獲頗多,因此在這里寫寫經(jīng)驗(yàn)進(jìn)行總結(jié)。
重構(gòu)程序的目的,不是因?yàn)槌绦虿荒苡貌乓闳ブ貥?gòu),重構(gòu)的目的是因?yàn)橐弧⒛愕拇a,被人看的次數(shù),遠(yuǎn)比它用到的次數(shù)多;二、重構(gòu)有利于你發(fā)現(xiàn)問題,讓你的程序結(jié)構(gòu)優(yōu)化,因此可復(fù)用性更強(qiáng),遵守了知識(shí)的唯一性,DRY 原則;三、如果你要改動(dòng)這段代碼,那么先重構(gòu),使得你的代碼好改,這實(shí)際是在為你的未來減少工作量,而且一段優(yōu)秀的代碼,帶給你的價(jià)值,遠(yuǎn)比你每次都要Ctrl+C,Ctrl+V 大得多。
寫代碼,要讓你的代碼第一次呈現(xiàn)在別人面前的時(shí)候,像讀英語一般,那么你的代碼功底是足夠了。你的代碼就可以稱作你最好的文檔了,其余什么文檔,大可不必!
基于昨天的經(jīng)驗(yàn),我新總結(jié)了兩條:
一、經(jīng)常使用重構(gòu)方法extract method 的人,會(huì)發(fā)現(xiàn),總是可以省掉一些臨時(shí)變量。這是好事,但這可能會(huì)造成如下的結(jié)果:
method_one(method_two(method_three(method_four())))
也就是說,很可能會(huì)導(dǎo)致這種長(zhǎng)串的嵌套,導(dǎo)致程序可讀性的下降,使人看的暈頭轉(zhuǎn)向。那么如何解決呢,其實(shí)是一個(gè)度的問題。我給自己定了一個(gè)規(guī)矩,臨界點(diǎn)是三個(gè)函數(shù)這樣級(jí)聯(lián)起來,如果超過三個(gè),我就將它們拆開。比如說上面這個(gè)小例子,我會(huì)拆成:
arg = method_three(method(four));
method_one(method_two(arg));
雖然浪費(fèi)了一個(gè)臨時(shí)變量,但是這樣就可以讓人一眼看懂我的意思,可讀性提升,修改起來自然也會(huì)容易些。
二、寫過Java I/O 的人,肯定看到過這樣的程序:
Reader in = null;
Writer out = null;
try
{
in = new InputStreamReader(socket.getInputStream(),"utf8");
out = new OutputStreamWriter(socket.getOutputStream(),"utf8");
/**
* some TODOs here
*
**/
}catch(IOException ioe)
{
System.err.println("error message");
ioe.printStackTrace();
}
finally
{
try
{
if(in != null)
in.close();
if(out != null)
out.close();
}catch(IOException ioe2)
{
System.err.println("some error message");
ioe2.printStackTrace();
}
}
怎么說呢,這段代碼看上去,其實(shí)是夠好了,其實(shí)不重構(gòu)也是可以的。也許我偏執(zhí)吧,我認(rèn)為它不夠好,因?yàn)椋菏紫龋蠖蔚膖ry catch 的確會(huì)捕獲異常,但是這段代碼至少有好幾段是會(huì)獨(dú)立拋出異常的,這里包含了四個(gè)IO 實(shí)例的創(chuàng)建和銷毀,這四段代碼如果出錯(cuò)都會(huì)拋出異常,那么你捕獲的到底是哪個(gè)呢?其次,沒有把功能段合理分開,這段代碼的邏輯功能實(shí)際上是兩個(gè),一個(gè)是讀,一個(gè)是寫,那么合并在一起,首先順序很亂,其次容易讓閱讀的人產(chǎn)生困惑,從而造成代碼可讀性差。我是這樣做的:
private void writeFile(String fileName, String outStr)
{
Writer writer = null;
try
{
writer = new OutputStreamWriter(new FileOutputStream(fileName),
"utf8");
}
catch (UnsupportedEncodingException e)
{
System.err.println("不支持的編碼方式");
e.printStackTrace();
}
catch (FileNotFoundException e)
{
System.err.println("初始化文件失敗,或路徑不存在:" + fileName);
e.printStackTrace();
}
try
{
writer.write(outStr);
writer.flush();
}
catch (IOException e)
{
System.err.println("寫文件失敗");
e.printStackTrace();
}
finally
{
try
{
if(writer != null)
writer.close();
}
catch (IOException e)
{
System.err.println("關(guān)閉文件失敗");
e.printStackTrace();
}
}
}
類似的,也將讀的邏輯獨(dú)立抽出來,雖然,這不但沒使代碼的量減少,卻增加了很多try catch 模塊,不過邏輯上很完整,而且發(fā)揮了每個(gè)try catch 的最佳功效。我把它起名曰,我個(gè)人的偏執(zhí)情節(jié)吧。
困了,要睡覺了,本來還想將代碼從最初模樣,到最后模樣的過程復(fù)述一遍,改天有機(jī)會(huì)再說,精華都已經(jīng)說了。嘿嘿
2007年12月31日
今天早上打破了原本的計(jì)劃,對(duì)于網(wǎng)上看到的一位小狂人,發(fā)表了很多看法。中國(guó)IT 這個(gè)行業(yè)就是這樣的,普遍的年輕化,輕狂化,但是真正的大師卻少的可憐。看了看自己在豆瓣上的“想讀”列表,突然覺得時(shí)間大大的不夠,心里又激起了一層漣漪,打破了那片平靜。不過經(jīng)過一個(gè)小時(shí)的深入思考,我又重歸了那份平靜。
我是贊成中國(guó)道家學(xué)派的,人只有歸于平靜,身體和心靈都達(dá)到陰陽(yáng)調(diào)和的狀態(tài),心情穩(wěn)定,脾氣溫和,頭腦冷靜,做事要循序漸進(jìn),才可以穩(wěn)穩(wěn)當(dāng)當(dāng),根基牢固。所以我個(gè)人并不羨慕暴發(fā)戶,也不羨慕那些少年得志的人。一個(gè)完整的、健全的人,成大事的人,是要體會(huì)人生的低潮期的。和命運(yùn)作斗爭(zhēng)的過程,你的思想和心智都會(huì)得到歷練,正如古人所說“天將降大任于斯人也,必先苦其心志,餓其體膚”,沒有經(jīng)歷過失敗的人,是很難長(zhǎng)久守住你的成功的。就像我上個(gè)禮拜讀的那本書里寫的故事一樣,一夜成名者,招致的嫉妒和怨恨太多,不是自己不夠優(yōu)秀,而是環(huán)境不允許你優(yōu)秀,終歸無以成大事。所以,做人還是要謙虛謹(jǐn)慎的,扎穩(wěn)根基,一步一步的來,厚積而薄發(fā)。
思考到這一步,心情從浮躁終歸于平靜了。所以還是應(yīng)當(dāng)遵循我的目標(biāo),一步步來,時(shí)間之與我,的確寸秒寸金,所以我不能把這些時(shí)間浪費(fèi)在對(duì)人生太多的感慨中,而應(yīng)當(dāng)去努力的尋覓,去體驗(yàn)生活,去做自己該做的事情!不去空嘆光陰似箭,也不去妄自菲薄!從現(xiàn)在開始投入到實(shí)際的工作中吧!
2007年12月22日
今天算是在2008年的中國(guó)年、圣誕、陽(yáng)歷年新年之前,所以我寫這篇blog無論你怎么算,那可是真正意義上的辭舊迎新啊(哈哈,我又有點(diǎn)偏執(zhí)了)。一個(gè)目的,過去的一年是很精彩的,也很開心,我很努力,也收獲很多。未來的一年,我要更加好好珍惜我的朋友們,更加努力的面對(duì)一切困難和挑戰(zhàn),擁抱2008!
在2007年發(fā)生了很多事情,有些可控,有些不可控,但是整體上來講還是收獲遠(yuǎn)遠(yuǎn)大于付出的。而我熱愛的軟件開發(fā)行業(yè),也還是處于藝術(shù)的那種狀況,而且我估計(jì)在未來的10到20年仍舊會(huì)繼續(xù)這樣的情況,因此我還是可以以藝術(shù)家自詡的(哎呦,好臭屁啊!),我也會(huì)繼續(xù)充滿熱情的投入到這個(gè)行業(yè)中去。
過去的一年里,值得自豪的事情有(排名不分先后,想到哪寫哪的):
1、做事情做的問心無愧,努力做好了每一件事情,認(rèn)真面對(duì)生活的每一個(gè)細(xì)節(jié)
2、在繁重的項(xiàng)目壓力下(最多同時(shí)負(fù)責(zé)五個(gè)項(xiàng)目,還要帶團(tuán)隊(duì)OOPS,還要帶導(dǎo)師的兒子,555555),依舊能堅(jiān)持學(xué)習(xí)從而提高自己
3、體驗(yàn)了一把累病了的滋味,并成功恢復(fù)了健康,而且在累病了期間感悟了許多人生,收獲頗多。恢復(fù)健康后,一直堅(jiān)持鍛煉身體,現(xiàn)在的身體狀況一級(jí)棒!還胖啦,哇哈哈
4、在年底,順利的完成了項(xiàng)目的平滑交接,讓研二的師弟師妹們成為導(dǎo)師值得信賴的動(dòng)力,最值得自豪的是我將很多平時(shí)鉆研的開發(fā)軟件的技術(shù)、思想和經(jīng)驗(yàn)延承了下去,培養(yǎng)出實(shí)驗(yàn)室良好的研發(fā)氣氛(應(yīng)用了很多極限編程和敏捷開發(fā)的思想哦)。
5、找了一份非常適合自己,非常喜歡,有良好前景的工作
6、完成了6到7個(gè)項(xiàng)目,做了兩個(gè)自己能給85分以上的項(xiàng)目(NASAC 論文評(píng)審系統(tǒng)和華秦智能管理系統(tǒng))
7、深化了Java 語言的運(yùn)用,可以熟練的使用Spring、Ajax、OSGi等框架和技術(shù),深入研究了敏捷軟件開發(fā)和項(xiàng)目管理的種種方法,并應(yīng)用到實(shí)際的項(xiàng)目中去。總之是深化了自己最擅長(zhǎng)的技術(shù),而又學(xué)會(huì)了許多新的技術(shù)。
8、珍惜了已有的朋友,又新交了許多優(yōu)秀的新朋友
9、好好孝敬了父母,做了很多父母都為我自豪的事情
10、明確了自己下一步要做的計(jì)劃(這一條我感覺是在湊數(shù)吧,哈哈,圓圓滿滿吧)
過去一年里有些可惜的事情:
1、感情道路依然坎坷啊,還是沒有方向啊,哎~~~~
2、以后要注意身體的,不能再次累病了,切記切記哦
3、研究生階段有車有房的目標(biāo)看來是宣告破產(chǎn)啦!
4、沒有出去實(shí)習(xí)一次,的確是有些遺憾的
嗯,開始未來的計(jì)劃吧:
1、依然要做事認(rèn)真,注意細(xì)節(jié),問心無愧;做一個(gè)正直的、善良的、有責(zé)任感的男人!
2、堅(jiān)持鍛煉身體,讓自己再胖一些吧!
3、認(rèn)真的、充滿熱情的投入到TW 的工作中,好好的和同事們相處,多交各種各樣的朋友,并努力增加知己的數(shù)目
4、努力使自己的感情道路不要再那么坎坷了,慎重慎重!
5、深化自己已掌握的知識(shí)包括深化敏捷開發(fā)、Spring2.X(包括Spring Web Flow、Spring OSGi 等等)、Ajax(GWT 和CSS,尤其是CSS,一定要做到是真的可以用它來改變自己的風(fēng)格和布局,而不只是簡(jiǎn)單的樣式而已,master it);新的知識(shí)呢,再努力掌握RoR、Python、Erlang和項(xiàng)目風(fēng)險(xiǎn)控制、項(xiàng)目估算的相關(guān)知識(shí),學(xué)會(huì)使用Unix/Linux 操作系統(tǒng),并堅(jiān)持下去,深入研究下Android 并努力應(yīng)用到實(shí)際的項(xiàng)目中去;努力使自己的軟件架構(gòu)能力更上一層樓;努力提高自己的代碼編寫質(zhì)量,達(dá)到90分以上
6、完成自己的BoBoBlog release 1
7、好好的,順利的在四月份完成畢業(yè)(這個(gè)不難吧)
8、如果有出國(guó)的機(jī)會(huì),努力把握之,好好見識(shí)一下!
9、讓自己的英語能夠,看英文書不累,跟看中文書一樣;跟老外對(duì)話不需思考,聽口音重的老外講話也OK
10、學(xué)會(huì)做一手好菜,努力讓自己的父母更開心快樂
好了,咋想也想不出來啥了,辭舊迎新、辭舊迎新!寫此文以表決心!
2007年12月19日
上周六、日兩天參加了公司的Away Day。作為一名還沒入職的員工,能有這樣的機(jī)會(huì)融入進(jìn)去,實(shí)在很難得。兩天的行程是這樣安排的,第一天主要去聽一些session,包括技術(shù)和非技術(shù)的;第二天就是真的away 啦,吃喝玩樂嘍。整體感覺很舒心,公司的同事們都很好,很open mind,大部分都很健談,很樂于幫助你。兩天的生活感觸多多,交了許多新朋友,也看到了差距和很多新的有趣的東西以供我修正自己前進(jìn)的方向。
第一天剛進(jìn)公司,就感覺外國(guó)人很多,我覺得公司在中國(guó)也就一百多號(hào)人,外國(guó)人至少占了三分之一吧。來之前就知道,公司的總部加大了對(duì)中國(guó)部門的投入,鼓勵(lì)國(guó)外優(yōu)秀員工進(jìn)入中國(guó)幫助中國(guó)同事提高他們的項(xiàng)目完成能力,但是真的親眼見到才覺得挺震撼的。這一天最有感觸的是幾件事,第一件事情是,剛進(jìn)公司沒多久就被發(fā)了一件印有公司名和Away Day 的長(zhǎng)袖衫,趕緊穿上。然后所有人都乘電梯下到一樓去參加全體大會(huì)了,大會(huì)主要是對(duì)過去一年的總結(jié),可以說是一個(gè)大大的show off 吧,才發(fā)現(xiàn)原來中國(guó)分公司在過去的一年中做了那么多重大的事情,收到了那么多客戶的表?yè)P(yáng)和贊賞。心里著實(shí)的高興了一把。然后就是Roy 給我們打氣啦,說原來他是以麥肯錫為目標(biāo)的,結(jié)果現(xiàn)在是麥肯錫以TW為目標(biāo),然后小小透漏了一下公司的秘密,那才真的是最震撼的,這件事情讓我真的確信了我們加入了一個(gè)全球最好的技術(shù)咨詢公司。從同事那里聽到Roy 是一個(gè)極其個(gè)性的領(lǐng)軍人物,是他決定了四年前公司進(jìn)行Ruby 相關(guān)的實(shí)驗(yàn)開發(fā)(四年前啊,那是Ruby才出來,真有遠(yuǎn)見),是他反對(duì)公司進(jìn)行股票上市,是他確定公司的目標(biāo)為“using IT to make the world better”,還是他以自己的孩子專業(yè)是“促進(jìn)世界和平”而自豪。進(jìn)公司之前就聽說了TW 絕對(duì)是非常人性化非常公平的一個(gè)公司,每個(gè)TWer 都覺得自己的公司是最好的,都很自豪,自己經(jīng)歷一下才發(fā)現(xiàn)是真的,因?yàn)閷?duì)中國(guó)地區(qū)的老大當(dāng)場(chǎng)就開始投票了,而且是絕對(duì)的公開投票,當(dāng)然結(jié)果還是我們的G 大大了,因?yàn)樗龅牡拇_足夠好,后面還有一段和他的故事呢。開會(huì)的最后,還有一件值得一提的事情,那就是見到了傳說中的TW 第一美女 S,Sun 高層挖過來的,據(jù)說Java TW 第一人啊。真的是很漂亮,美麗的英國(guó)lady。
這一天值得提起的第二件事情,就是參加的session 了,印象最深的是A (就是面試我那個(gè))講的Erlang。在來之前,好像在雜志上還是網(wǎng)上略知一二,就是下一代語言么,很支持并行編程的那種,號(hào)稱是下一代語言中的Java,這個(gè)自然是要狠狠的關(guān)注一下的。A 在講的時(shí)候,好像也不那么熟悉,后來被問倒了,還真的很不好意思哪,哈哈,不過沒什么,大家人都很好。我知道在Java 中同時(shí)處理千級(jí)別的線程就會(huì)出現(xiàn)比較嚴(yán)重的問題了,而且那程序?qū)懙目删褪窍喈?dāng)?shù)碾y看啦。當(dāng)天聽了Erlang 的session,說是并行度可以輕松達(dá)到萬以上的級(jí)別,而且不會(huì)像Java 中出現(xiàn)對(duì)具體線程的控制模塊。我看到了那些示例程序,很優(yōu)雅的腳本,從來沒有出現(xiàn)諸如synchronized 這些詞匯。語言風(fēng)格有點(diǎn)DSL 的味道,Erlang 也是腳本語言,而且與那些主流語言的風(fēng)格很不相同,是一種自頂向下,逆推式的風(fēng)格。熊哥哥給我們當(dāng)場(chǎng)演示了一個(gè)用Erlang 完成的消費(fèi)者模式的程序,寫的的確很清晰。據(jù)說公司有一個(gè)項(xiàng)目正在做的就是用Erlang,真的是很佩服TW 的先驅(qū)思想和執(zhí)行力度。
晚上吃飯也發(fā)生了一件很有趣的事情——看TW 的酒協(xié)與來自澳大利亞的C 拼酒還有C 勸老大喝酒。C 是很壯的那種外國(guó)人,高大、英俊、強(qiáng)壯,那酒量,那可是相當(dāng)?shù)南喈?dāng)?shù)?.....TW 酒協(xié)會(huì)長(zhǎng),差點(diǎn)就栽在他手里了。下一次一定能和C 合張影,他是給我感覺最好的外國(guó)人,很想和他成為朋友,幽默有趣,個(gè)性開朗。
晚上回到旅館和小龍聊了好久,小龍透漏給我一個(gè)很有價(jià)值的信息,那就是在TW 里,如果你有好的想法,可以做一個(gè)session 希望大家和你一起同做,這對(duì)我來說可是天大的福音了。呵呵,加油,給自己打打氣!
第二天的行程是爬長(zhǎng)城和去紅螺寺,一天里最有趣的事情莫過于和老大在車上玩殺人了,學(xué)會(huì)了一句經(jīng)典對(duì)白“現(xiàn)在,我來理性的分析一下”,說的時(shí)候要注意臉部表情要認(rèn)真嚴(yán)肅,聲調(diào)要低但是要有穿透力和震撼力,不然沒老大那效果。這是和老大在整個(gè)行程中最親密的接觸了,后來在爬長(zhǎng)城的時(shí)候,還和老大和熊哥一起合影了。
記成流水帳了,哎,真不好。不過兩天行程很緊張,活動(dòng)密度大,經(jīng)歷的事情都是沒經(jīng)歷過的,將就點(diǎn)吧。呵呵。我想我會(huì)在公司里好好努力和發(fā)展的,因?yàn)榭吹焦纠锖芏嗳硕际俏疫@樣的,不僅是喜歡這個(gè)行業(yè),更想創(chuàng)造出無限的價(jià)值,來讓生活更美好,藝術(shù)家,藝術(shù)家啊(哈哈,自夸了,真的好邪惡啊——這是和NaNa 學(xué)到的一句經(jīng)典對(duì)白)。
2007年12月11日
看了同事的一篇Blog 講的Uncle Bob 好像是生病了,還要用嗎啡。不是真的吧,我可是看他的《敏捷軟件開發(fā)》才開始喜歡上敏捷軟件開發(fā)的,真的希望這不是真的,如果是真的,那我在這里祈禱希望他早日康復(fù)。
順便提一下吧,今天看了了Jessie 的Blog 真的很喜歡Thoughtworks,大家讓我感覺到那里是很開心的,很開朗,很人性的一個(gè)環(huán)境。有很多小故事都令我挺感動(dòng)的,舉一個(gè)小例子吧,我們?cè)诒本┑淖》慷际枪編臀覀冋液茫覀內(nèi)タ吹模茏龀蛇@樣的公司,全中國(guó)能有幾家?好了,這算是我遇到前所未有的明主了,好好干吧,加油!
人生就是這樣,有得有失,不過只要自己一直努力,那么得到的總會(huì)比失去多。我很滿意啦,很知足啦!
2007年12月9日
前兩天看到一個(gè)有趣的觀點(diǎn):早崩潰,不破壞。這個(gè)理論給我了許多思考,不只是軟件開發(fā)上的,更有很多對(duì)人生的看法。
這個(gè)理論大致是這樣的一個(gè)意思:當(dāng)前的軟件設(shè)計(jì),與其說是科學(xué)不如說是藝術(shù),因?yàn)椴]有一個(gè)嚴(yán)格的方法和論斷可以定奪一個(gè)軟件的好壞,也沒有一個(gè)確定的工業(yè)標(biāo)準(zhǔn)(通常很科學(xué)化的東西都可以很快的用工業(yè)標(biāo)準(zhǔn)來描述)可以指導(dǎo)、確保軟件的開發(fā)過程不那么隨意。正因?yàn)槿绱耍?dāng)前的軟件世界問題多多,而且久違的銀彈還是沒有出現(xiàn)。那么,在實(shí)際開發(fā)的過程中,如何開發(fā)出一個(gè)質(zhì)量高,又符合要求的系統(tǒng)呢?這就是“早崩潰,不破壞”理論存在的價(jià)值了。它是說,項(xiàng)目你可以讓它盡早的崩潰,實(shí)時(shí)的崩潰,以發(fā)現(xiàn)問題,從而改正這些Bug,使系統(tǒng)能夠暴露問題,盡早的恢復(fù)到正常的狀態(tài)。這就引出了測(cè)試要頻繁的進(jìn)行,甚至是使用測(cè)試驅(qū)動(dòng)進(jìn)行開發(fā)。當(dāng)然開發(fā)的早期,會(huì)陷入比較痛苦的狀態(tài),問題多多,不知道如何解決。不過這些都是有好處的,做了這樣的工作,確保了發(fā)展方向和軟件質(zhì)量的正確性,就使你的系統(tǒng)在最后才不會(huì)產(chǎn)生嚴(yán)重的破壞。破壞——disaster 級(jí)別的,有時(shí)是很難恢復(fù)的。所以這么看來,前期的打擊會(huì)造就后期的輕松與成熟,這何嘗不是大大的值得呢?
這個(gè)理論看似只是針對(duì)軟件開發(fā)的,卻給我了許多額外的思考。生活、工作、愛情等等又何嘗不是這樣的呢?
生活中,從最小的小孩子呀呀學(xué)語,蹣跚學(xué)步,多讓家長(zhǎng)“崩潰”啊,是不是,呵呵(其實(shí)我覺得那時(shí)候要是自己有意識(shí),也會(huì)很崩潰的),可是卻造就了他們未來發(fā)展的基礎(chǔ);最近要開始學(xué)做菜,因?yàn)橐ケ本┌l(fā)展了,這個(gè)學(xué)習(xí)過程也是很崩潰的,不過想想未來,做菜可以帶來自己伙食的改善,可以增加自己的技藝,可以讓家庭更幸福,可以讓父母更開心等等,這個(gè)未來的力量還是很強(qiáng)大的。所以,生活實(shí)際上也是“早崩潰,不破壞”的。
工作中,你初期進(jìn)入公司,總有個(gè)人生地不熟的過程,總有個(gè)和公司文化適應(yīng)的過程,不是每個(gè)人都那么幸運(yùn),可以一去就融入環(huán)境的。一進(jìn)公司,要學(xué)習(xí)很多知識(shí),要學(xué)會(huì)與同事友好的相處,這些東西別看貌似很小,其實(shí)壓力會(huì)不小的,所以也是很“崩潰”的。但是從長(zhǎng)遠(yuǎn)來看,只要你努力的去做好前面的一切,那么這樣的過程會(huì)讓自己得到很大的提高,會(huì)讓你的人際關(guān)系更加的順暢,會(huì)讓你的工作更加的舒心,當(dāng)然經(jīng)濟(jì)價(jià)值也會(huì)逐漸的體現(xiàn)出來。這就使得你后期的“破壞”的可能性就很低了。看來有時(shí)“郁悶”“崩潰”不見得是一件壞事情,關(guān)鍵是你不要迷失,不要認(rèn)為你的生活會(huì)永遠(yuǎn)如此,要開朗些,陽(yáng)光些,繼續(xù)努力下去。
最后就是關(guān)于愛情了。我有一些朋友曾經(jīng)跟我說過他們希望找從來沒有談過戀愛的女孩子或男孩子,這樣固然是好,因?yàn)閱渭儯梢越o人很純凈的愛情的感覺。但是我個(gè)人覺得,如果一些女孩子有過戀愛的經(jīng)驗(yàn),至少是曾經(jīng)很努力的去喜歡過一個(gè)人,能成熟的思考一些問題。這對(duì)于將來的愛情和婚姻是很大很大的一筆財(cái)富(當(dāng)然愛看書的女孩子除外,因?yàn)樗齻兛梢詮臅畜w驗(yàn)人生,使自己思想成熟起來)。先前的愛情失敗的確會(huì)讓一個(gè)人很“崩潰”的,愛情失敗無所謂對(duì)錯(cuò),兩個(gè)人不可能一方全對(duì),另一方全錯(cuò)。兩人皆有不對(duì)的地方,皆有處理不當(dāng)?shù)氖虑椋皇嵌嗌俣选J〉膼矍殡p方都是輸家,沒有人是贏家。不過這樣的“崩潰”是有好處的,它會(huì)引起你的反思,會(huì)讓你思考自己的錯(cuò)誤,從而為下一次感情做好準(zhǔn)備。當(dāng)然,“崩潰”的原因,也可能是真的不合適,那么你就更要好好總結(jié)一下,從而為下一個(gè)合適的做好準(zhǔn)備。關(guān)鍵是,不要讓“崩潰”麻痹了你,喪失了去追尋真愛的勇氣,這是最最主要的!“崩潰”不是“破壞”,關(guān)鍵是看你怎么處理,怎么對(duì)待。只要結(jié)局不是“破壞”,那么前期的“崩潰”均是有很大的價(jià)值的!
歸根到底還是,要有勇氣,要能耐得住壓力和寂寞,不要為社會(huì)和生活的繁雜喪失那顆珍貴的心,在那最艱難的時(shí)刻,聽聽你自己的心是怎么說的,堅(jiān)強(qiáng)下去,你可以的。
傻傻的想,傻傻的揣摩,隨便寫寫,從軟件談到人生,供大家思考。
2007年12月6日
When asked "Do you write tests?", a lot of developers these days will
say "of course" as their answers. However, not everyone can admit to
doing TDD (Test Driven Development) correctly. Test Driven Development
says, a developer will write a test that fails first, then write code
to make the test pass, and refactor when possible, and repeat. This is
what most people's TDD rhythm is. For the most part this is fairly easy
to do. But to reach the next level, one has to understand TDD as a
tool: TDD means more than just test your own code. Here is a couple
tips on what the last "D" means:
Discipline
It
takes a great deal of discipline to even write a failing test before
writing the actual code. Sometimes, we write a little seudo-code here,
or move a method definition there, or changing code else where trying
to see if more new code needs to be written after it, and sooner than
you think you are writing the actual implementation of the methods you
wanted to test (Test Afterwards Development anyone?). Other times you
write the test, but you are too anxious to even run it and see it
fails. And other times you want to jump into the actual code
immediately when you see your new test fails, but failing for the
unexpected reasons.
Don't fall into these traps. If anything is true, testing is hard, but it is at the same time rewarding and fun. What's also true is, it will pay off.
Write the failing test, draw up your list of tests you will need to
write, and satisfy them one by one. Having discipline is the
cornerstone of becoming a better programmer.
Design
It
takes too long to write a test? Tests are running too slowly? Are your
tests difficult to read? Are they too brittle and fail all the time?
Hang in there! You ever had the feeling you saw code in the codebase
that irks the living hell out of your mind written by someone else on
your team? Well, it is time for you to get some of these feedback about
your own code. Yay, your code sucks! Your tests
are telling you that! Let's address each of these one by one.
Slow
running tests? You shouldn't be hitting a database or web service in
your unit tests, because you can mock/stub them out. Difficult to
mock/stub it out? There probably is a better way to design your classes
your tests are hitting. Ever heard of Inversion of Control (or
Dependency Injection)? Master them. True TDD masters use them
extensively.
Unreadable tests? Is it because of too many
mocks/stubs? Or is it the code is 500 lines long and doing high octane
720-double-backflip logic? Either way, you have to learn to like small
objects. Check this
blog post of mine out.
Hard
to test something? Tests too brittle? Perhaps you have encapsulation
issues in your class design. If your classes are referencing 15 other
neighbors, of course they are hard to mock/stub. Chances are, you have
to spend time to debug your tests to find out what's wrong! Heard of
Law of Demeter? Even if you have, take a look at this
highly entertaining yet informative post. It might change your perspective a little.
The
bottom line is, TDD is a way to guide you to writing good code, but
only if you know how to use it as a tool. Now that you know, hopefully
you will have a new perspective next time you write a test.