2006年9月29日
#
玩電腦寫程序多年了,太投入,以至于得了職業(yè)病。手指、手腕、肩頸部都經(jīng)常疼痛,眼睛干澀紅癢,肚子也變將軍了。
后來在家soho,頸椎問題尤為嚴(yán)重。在網(wǎng)上尋求解決方法,并自行研究實(shí)踐,有了明顯的好轉(zhuǎn)。記錄于下,望對使用電腦工作的人有點(diǎn)用處。
1.頸椎問題的嚴(yán)重性:會引發(fā)腦部供血、脊柱神經(jīng)、睡眠等問題。不是專家,網(wǎng)上可自己查找相關(guān)資料。
2.原因。久坐少動。肩頸部肌肉勞損以至骨骼、軟骨受損。
3.我的解決過程。
? 買了個(gè)太空枕,睡覺時(shí)可支撐頸部。效果不明顯。
? 后來每周按摩1小時(shí)。你要想有點(diǎn)效果一定得到正規(guī)的地方,還得受得了疼。按一次,得疼三天。有是有點(diǎn)用,回想一下,這不是花錢找罪受么?
? 然后去了曙光醫(yī)院,醫(yī)生給開了一些藥,問了,大概都是緩解癥狀的,不能治本。
? ---我一向不同意程序員30歲轉(zhuǎn)行的觀點(diǎn),難道我過不去這個(gè)坎?---
? 轉(zhuǎn)而采取日常生活中自己注意保健。一般來說,主流的意見是多運(yùn)動。包括體育運(yùn)動和針對性的保健操。
? 我在家實(shí)踐了兩個(gè)月,3天一次長跑或羽毛球,每天一次散步和多次保健操。效果不算明顯。
? 后來我從源頭上著手。
????? 硬性的就是減少坐在電腦前的時(shí)間,打游戲不打了,工作時(shí)想問題就起身。這個(gè)也不易。這個(gè)對工作有一定影響,但也是重要方法之一。
????? 軟的是調(diào)整桌椅高度及坐姿。桌椅一定是符合三個(gè)90度:坐著膝蓋90度,大腿和上身90度,肘部90度。
? 肘部一定要有依托,至少有椅子的扶手,我現(xiàn)在是用了大桌子,對著90的圓弧,兩肘都放在桌面上。
現(xiàn)在我的頸椎問題已經(jīng)好多了。
總結(jié)一下,方法是綜合的。但效果最明顯的就是桌椅。其中最關(guān)鍵的就是肘部的依托,肘部放在桌面上我覺得是挺有效。
另外,不能覺得沒有時(shí)間想健康問題,否則結(jié)果是不得不想。拿出你打游戲、寫程序的勁頭對待健康,肯定能解決問題的。
2006年9月11日
#
www.lucas-lee.com
免費(fèi)軟件,非開源軟件。
純JAVA開發(fā),B/S架構(gòu)。目前支持MySQL5.0.21及以上數(shù)據(jù)庫。
預(yù)定義了多種缺陷處理流程,可選擇使用。
- 小型團(tuán)隊(duì)自由流程
由當(dāng)前處理者指定下一個(gè)處理者,流程比較靈活。
- 小型團(tuán)隊(duì)受控流程
以項(xiàng)目經(jīng)理為中心的流程,提交后的審核、轉(zhuǎn)交程序員、修改后的驗(yàn)證等步驟都由項(xiàng)目經(jīng)理控制。
- 單人流程
只有一個(gè)使用者的流程。適合個(gè)人軟件的開發(fā)過程。
缺陷統(tǒng)計(jì)功能。使用琴棋報(bào)表。
郵件提醒。流程轉(zhuǎn)入下一步驟后,系統(tǒng)會自動發(fā)郵件給下一處理者。
字典數(shù)據(jù)可自定義。優(yōu)先級別、嚴(yán)重程度、項(xiàng)目、模塊等等。
基于角色--用戶組--用戶的權(quán)限控制。
www.lucas-lee.com
1)解決了Excel格式輸出大量單元格時(shí)出現(xiàn)的Excel樣式過多的問題。
2)優(yōu)化了clone的算法。
2006年9月1日
#
所謂字典就是數(shù)據(jù)庫應(yīng)用中被其他表(通常加以外鍵約束)引用的表,如客戶表引用客戶類型,那么客戶類型即為字典表。刪除字典數(shù)據(jù)要考慮是否已被其他數(shù)據(jù)引用,一般不允許做級聯(lián)刪除。
這個(gè)問題想必大家都碰到過,但各有各的?做法。本人與若干同事討論過,將各種做法總結(jié)一下。
- 物理刪除,即用delete SQL刪除。如果字典數(shù)據(jù)被引用,則會拋出違反外鍵約束的異常,將其封裝為可讀的信息提示給用戶。JDBC中的異常類為SQLException,如何判斷是違反外鍵約束的異常呢?有方法如下:
- 利用SQLException中的errorCode,這是數(shù)據(jù)庫特有的錯(cuò)誤編碼。
- 利用SQLException中的SQLState,在JAVA API DOC中說明這個(gè)是SQL99或XOPEN 標(biāo)準(zhǔn)的編碼,而且可以用connection的meta data來判斷符合哪個(gè)標(biāo)準(zhǔn)。經(jīng)過的試驗(yàn),說明這個(gè)meta data不太好用,但是SQLState還是較為統(tǒng)一的。
? | mysql5.0.21 | sqlserver2000 | oracle10 | postgresql8 |
ANSI99 SQLState標(biāo)準(zhǔn)的違反外鍵約束編碼為:23000 | 23000 | 23000 | 23000 | 23503(可能要在BatchUpdateException的nextException中才能取得) |
Connection的meta data中的getSQLStateType(),符合SQL99標(biāo)準(zhǔn)應(yīng)該為2 | 2 | 2 | 0 | 2 |
- 邏輯刪除。即置表中的一個(gè)標(biāo)記字段為已刪除。查詢時(shí)不可見,但實(shí)際還保留在表中。 好處是不用處理數(shù)據(jù)被引用的情況。它的缺點(diǎn)是,如果數(shù)據(jù)沒有被引用,那么它其實(shí)可以被物理刪除,但確留在系統(tǒng)中成為垃圾數(shù)據(jù);其次在數(shù)據(jù)有唯一編碼的情況下,被邏輯刪除的數(shù)據(jù)實(shí)際上還占用著一個(gè)編碼,有時(shí)用戶會疑惑,明明表中查不到這個(gè)編碼,我在新增的數(shù)據(jù)中使用這個(gè)編碼卻總提示編碼已存在。
??? 各位又是用的什么方法來處理的呢?你的方法有何優(yōu)缺點(diǎn),不妨一同討論一下。
??
2006年7月9日
#
[一.奠定基礎(chǔ)]
1. 任何不能改善產(chǎn)品的工作,都是浪費(fèi)時(shí)間或是偏離方向。
2. 領(lǐng)導(dǎo)者的任務(wù)是努力消除程序設(shè)計(jì)師工作上的一切障礙,讓程序設(shè)計(jì)師全力專注在真正重要的工作─改善產(chǎn)品。
3. 千萬不要把程序設(shè)計(jì)師的時(shí)間浪費(fèi)在改善產(chǎn)品以外的工作上。
4. 永遠(yuǎn)記得自己真正的目標(biāo),然后讓團(tuán)隊(duì)用最有效又最愉快的方法把它完成。
5. 理清詳細(xì)的項(xiàng)目目標(biāo),可以避免在不必要的工作上浪費(fèi)時(shí)間。
6. 不要因?yàn)橹贫繕?biāo)需要花很多時(shí)間,或是別人都沒有做,就省略了目標(biāo)的制定。制定明確詳盡的目標(biāo)所花的時(shí)間,絕對會讓團(tuán)隊(duì)得到更大的好處。
7. 事前決定最合適的優(yōu)先考慮順序,以及各考慮點(diǎn)的質(zhì)量規(guī)范,能夠指引開發(fā)團(tuán)隊(duì)的工作。
?
[二.策略性的作業(yè)方式]
8. 錯(cuò)蟲愈晚清除,時(shí)間花得愈多。畢竟,您得知道程序是怎么寫的,才能判斷那里出了錯(cuò)蟲;剛寫完的程序記憶猶新,一年前寫的程序可能早就忘了
。
9. 在開發(fā)的過程就立即除蟲,可以讓您早些學(xué)到經(jīng)驗(yàn),然后就不會再犯同樣的錯(cuò)誤;相反地,如果到了項(xiàng)目后期才發(fā)現(xiàn),您可能已經(jīng)犯過多次同樣的錯(cuò)誤而不自知。
10. 發(fā)現(xiàn)錯(cuò)蟲而立即除錯(cuò)是一種緩沖器,提醒那些講求快速而不夠謹(jǐn)慎的程序設(shè)計(jì)師,以后多加小心。如果您堅(jiān)持錯(cuò)蟲全都清除了才能開發(fā)新的功能,就可以防止所有的程序處于半完成狀態(tài),因?yàn)殄e(cuò)蟲太多而使項(xiàng)目延誤乃至無法推出;相反地,如果您允許錯(cuò)蟲的存在,等于是埋下了項(xiàng)目失控的地雷,最后看似完成的項(xiàng)目,其實(shí)已經(jīng)失控。
11. 若能保持沒有任何錯(cuò)蟲,您就能比較準(zhǔn)確估出項(xiàng)目的完成時(shí)間。不必猜測3 2項(xiàng)功能和1 742個(gè)錯(cuò)蟲共要花費(fèi)多少時(shí)間,只要估算3 2項(xiàng)功能的工作時(shí)間就行了。更重要的時(shí),萬一到時(shí)候有些功能做不完,您可以做多少算多少,因?yàn)檐浖恢北3衷跓o錯(cuò)誤狀態(tài)。
12. 不要把策略性工作方式當(dāng)作訓(xùn)練的教條,應(yīng)該向組員解釋這些工作方式的內(nèi)涵與用意。
13. 提出精確詳盡的問題,可以引導(dǎo)出真正有效的策略性工作方式,幫助項(xiàng)目目標(biāo)順利完成。
14. 策略不是死的定律,要把它當(dāng)作指導(dǎo)原則來活用。大部分的時(shí)候都應(yīng)該遵循,但也有例外的時(shí)候。
?
[三.保持進(jìn)度]
15. 定期暫停手邊的工作,然后往前思考,隨時(shí)做必要的修正,以避免未來的大障礙。
16. 有什么事情是我今天能做,而且可以幫助項(xiàng)目在未來幾個(gè)月內(nèi)順利進(jìn)行的?
17. 不要浪費(fèi)時(shí)間在錯(cuò)誤的問題上,一定要先確定真正的問題在哪里,然后才去改正它。
18. 人們開口要求的東西未必是他真正想要的。處理他的要求之前,請務(wù)必確定他究竟想要做什么。
19. 絕對不要答應(yīng)別人自己做不到的事情,這樣對雙方都有益無害。
20. 不要為了討好別人而傷害雙方的工作進(jìn)程,您永遠(yuǎn)要根據(jù)自己的目標(biāo),做適當(dāng)?shù)臎Q策。
21. 是您在為項(xiàng)目負(fù)責(zé)。不要讓任何人的建議阻礙項(xiàng)目的進(jìn)行,包括上級的建議。
22. 天下沒有真正免費(fèi)的軟件
23. 應(yīng)該開發(fā)策略上具有重要性的功能,而不是把媒體的評比項(xiàng)目都做齊全。
24. 軟件產(chǎn)品的開發(fā),不能只為了有趣、挑戰(zhàn)性,或是夠有個(gè)性夠令人眩目。
25. 不要把時(shí)間浪費(fèi)在無法改善產(chǎn)品的工作上,即使這么做在將來會有潛在的利益,也要與現(xiàn)在投入的時(shí)間成本做個(gè)衡量。
?
[四.走向極端的狂熱]
26. 確定您所要求的報(bào)告真的值得屬下暫停工作,花那么多時(shí)間去寫。
27. 利用項(xiàng)目檢查報(bào)告來改進(jìn)軟件開發(fā)的工作程序。為了使報(bào)告發(fā)生作用,報(bào)告中必須確實(shí)描述我們這次解決問題的每一個(gè)詳細(xì)步驟,以及將來應(yīng)該如何運(yùn)用這項(xiàng)新發(fā)現(xiàn)。
28. 請注意定期會議的價(jià)值,確定它值得每個(gè)人放下手上的工作。
29. 召開任何會議之前,請確定本次會議的目的是什么,達(dá)成這個(gè)目的的條件是什么,然后,務(wù)必達(dá)到開會的目的。
30. 試著排除不必要的后續(xù)工作。
?
[五.進(jìn)度狂]
31. 不要利用進(jìn)程表來驅(qū)使項(xiàng)目的進(jìn)行,這對小組的士氣傷害太大了。
32. 讓日程表維持適度的緊迫,但又是可以做到的,好讓組員振奮、不松懈,專心致力于項(xiàng)目的推進(jìn)。
33. 絕對不要草率定出不可能的期限,導(dǎo)致組員為了趕進(jìn)度而損害產(chǎn)品的質(zhì)量。
34. 把長期的大項(xiàng)目,分成幾個(gè)完整而獨(dú)立的小項(xiàng)目,各小項(xiàng)目必須有一個(gè)主題。
35. 為了保持創(chuàng)意的活力和團(tuán)隊(duì)士氣,必須讓每一個(gè)小項(xiàng)目都有令人興奮的結(jié)果。
36. 產(chǎn)品的質(zhì)量遠(yuǎn)比遵守期限重要.
?
[六.學(xué)無止境]
37. 不要讓程序設(shè)計(jì)師的學(xué)習(xí)停滯不前,要讓程序設(shè)計(jì)師有機(jī)會磨練不同領(lǐng)域的技術(shù),培養(yǎng)十八般武藝樣樣精通的組員。
38. 訓(xùn)練新進(jìn)程序設(shè)計(jì)師時(shí),先培養(yǎng)他對整個(gè)公司所有項(xiàng)目都有價(jià)值的技術(shù),然后才培養(yǎng)本項(xiàng)目獨(dú)有的技術(shù)。
39. 不要舍不得放您最優(yōu)秀的程序設(shè)計(jì)師到別的項(xiàng)目去。如果他在您的項(xiàng)目已經(jīng)沒有新的東西可學(xué),為了公司和他個(gè)人的前途,您應(yīng)該把他推薦到別的項(xiàng)目,讓他的成長永不間斷。
40. 確定每位組員、每兩個(gè)月都有一項(xiàng)技術(shù)上進(jìn)步。
41. 一發(fā)現(xiàn)某處需要改進(jìn),就立即采取更正的行動。
42.不要用年終考評來訂立學(xué)習(xí)目標(biāo),要利用年終考評來記錄個(gè)人的成長。
43. 絕對不要讓組員一直做同樣的工作,這樣是限制了他的學(xué)習(xí),使他停滯在原來的領(lǐng)
域。一旦程序設(shè)計(jì)師精通了某一個(gè)領(lǐng)域,就讓他換別的領(lǐng)域做做看,永遠(yuǎn)讓他們學(xué)習(xí)新的技術(shù)。
44. 各種技術(shù)的用途范圍有所不同,有的技術(shù)在一般的項(xiàng)目都用得上,有的技術(shù)只有在特定性質(zhì)的項(xiàng)目才用得上。當(dāng)您訓(xùn)練您的組員時(shí),必須讓他們的技術(shù)能在公司發(fā)揮最大的用處,最好的辦法就是,把應(yīng)用范圍最廣的技術(shù)放在訓(xùn)練的最前期,應(yīng)用范圍最小的技術(shù)放在最后訓(xùn)練。
45. 優(yōu)秀的程序設(shè)計(jì)師是項(xiàng)目經(jīng)理最需要的,所以經(jīng)理們通常舍不得讓自己手下功力最強(qiáng)的人到別組去,但是如果這位第一高手在本組內(nèi)再也沒有新東西可學(xué)時(shí),經(jīng)理就應(yīng)該讓他到別的項(xiàng)目去,一方面他個(gè)人可以重新開始另一次的成長,一方面讓接替他的人學(xué)著承擔(dān)重要的工作,最后公司的平均程序技術(shù)水準(zhǔn)因而提升,對大家都很有好處。
46. 為了確保每位程序設(shè)計(jì)師的技術(shù)都在穩(wěn)定地進(jìn)步,一定要讓每個(gè)人有個(gè)努力的目標(biāo),最好的方法是把個(gè)人的成長和項(xiàng)目每兩個(gè)月的階段性目標(biāo)相結(jié)合,這樣一年就有至少六次的進(jìn)步了。假定一位組員在公司待了五年,那么他就學(xué)了3 0種新技術(shù)、或是讀了3 0本好書、或是1 5項(xiàng)技術(shù)加1 5本書,對他的工作能力影響多大啊。
47. 最好的成長目標(biāo)是出于當(dāng)時(shí)的需要。如果您發(fā)現(xiàn)有位組員工作缺乏效率,或總是在犯同樣的錯(cuò)誤,最好抓住機(jī)會立即為他立一個(gè)目標(biāo),并且要求他立刻開始改進(jìn)。這種當(dāng)時(shí)設(shè)立的目標(biāo)讓人印象深刻,又是馬上尋求改善,效果通常會非常好。比起年終考評那種模模糊糊的建議,更能引起程序設(shè)計(jì)師的重視。
?
[七.態(tài)度問題]
48. 要讓每一位程序設(shè)計(jì)師都明白,寫出零錯(cuò)誤程序是很不容易的,所以應(yīng)該多花功夫用各種方法做最徹底的測試。
49. 糾正程序設(shè)計(jì)師以為加除錯(cuò)碼會花太多時(shí)間的觀念,應(yīng)該訓(xùn)練程序設(shè)計(jì)師第一個(gè)反應(yīng)是考慮加上除錯(cuò)碼是否有道理,第二是考慮加除錯(cuò)碼是否符合項(xiàng)目的目標(biāo)與工作的優(yōu)先級。
50. 當(dāng)某人說“某件事不可能做到”時(shí),他往往是錯(cuò)的。
51. 不要讓凡事不能的態(tài)度阻礙了創(chuàng)新。
52. 使用者和程序的撰寫者一樣關(guān)心速度和品質(zhì)的問題。
53. 不要讓程序設(shè)計(jì)師以為使用者并不在乎軟件的質(zhì)量。
54. 不要給使用者次品,寧愿延期交貨,務(wù)必追求質(zhì)量完美。
55. 程序設(shè)計(jì)師必須經(jīng)常以使用者的觀點(diǎn)來看自己寫的程序,程序設(shè)計(jì)師必須能體會使用者的感受。
56. 在包裝盒里的每一件東西,都是產(chǎn)品的一部分。
57. 將程序的重用性當(dāng)作優(yōu)先考慮的目標(biāo)之一,否則程序設(shè)計(jì)師將經(jīng)常做重復(fù)的工作。
58. 充分利用現(xiàn)有資源或創(chuàng)造新資源,以便從每一項(xiàng)工作中獲得更大的價(jià)值。程序代碼的再利用,就是很好的例子,當(dāng)然,還有其他的地方可以運(yùn)用“杠桿原理”。
59. 如果您創(chuàng)造了一項(xiàng)資源,并且讓別人知道,那么總有一天會派上用場。
60. 從您的每件工作中創(chuàng)造最大的資源,不管是利用現(xiàn)有的杠桿,或是創(chuàng)造新的杠桿。
61. 小心那種“太難了”、“太花時(shí)間”或是“太麻煩”的反射性反應(yīng)。當(dāng)您遇到別人有這種反應(yīng),請先問自己他有沒有認(rèn)真思考過這件事的重要性、以及是否符合項(xiàng)目目標(biāo),如果您認(rèn)為他其實(shí)未經(jīng)深思熟慮,只是直覺的反應(yīng),那您就應(yīng)該把您的想法告訴他,請他重新評估,也許就會有公平的答案。
62. 人們遇到經(jīng)驗(yàn)范圍之外的事情,多少有恐懼感,就會認(rèn)為“這完全不可能”而強(qiáng)烈反對。試著消除這種習(xí)慣性的反應(yīng),設(shè)法給組員灌輸“只要花時(shí)間想想看,大部分的事情都做得到”的觀念。您不妨以這個(gè)問題來對付那種“凡事不能”的態(tài)度:“我了解這是做不到的,但是‘如果’做得到,那你會怎么做?”然后您就會發(fā)現(xiàn)驚人的轉(zhuǎn)變,您馬上就會聽到組員七嘴八舌地說應(yīng)該這樣做、那樣做,說的是他們剛剛堅(jiān)持做不到的事情。這個(gè)“如果”把他們帶離直覺的反應(yīng),帶到全新的思考模式,這才是他們應(yīng)該做的。
63. 把使用者當(dāng)作什么都不懂的外行人,是非常不好的觀念。每當(dāng)您發(fā)現(xiàn)有人表露出這種心理,一定要立即糾正,提醒他們使用者才是真正受產(chǎn)品好壞影響最深的人,他們和程序設(shè)計(jì)師一樣關(guān)心軟件的執(zhí)行速度和質(zhì)量。
64. 杠桿原理是您最有用的觀念,找到您工作中的杠桿,您可以為小組、項(xiàng)目、公司、甚至軟件業(yè)創(chuàng)造無可限量的價(jià)值。無論如何,盡量利用資源并創(chuàng)造資源,這個(gè)原則是絕對錯(cuò)不了的。在您寫程序的時(shí)候注意程序代碼的共享性、訓(xùn)練組員的時(shí)候注意到他對公司的價(jià)值,即使是像函數(shù)命名這種小事,都有杠桿的存在。不管做任何事,都要想到“善用資源”,為未來做好準(zhǔn)備。
?
[八.沉船的感覺]
65. 如果進(jìn)度發(fā)生落后,那表示有個(gè)地方出錯(cuò)了。您應(yīng)該找出問題,并加以解決,不要一味要求組員加班,在問題沒有解決之前,加班是沒有用的。
66. 別誤信加班等于增加生產(chǎn)能力,長期的加班只會傷害生產(chǎn)能力,對項(xiàng)目沒有幫助。
67. 周末是屬于組員私人的時(shí)間,不是公司的。公司不應(yīng)該以打敗競爭對手為理由,要求員工周末加班。
68. 強(qiáng)調(diào)思考的重要性,而不是長時(shí)間工作。
69. 訓(xùn)練開發(fā)小組懂得在正常工作時(shí)間內(nèi)掌握好工作的效率,不要讓他們超時(shí)工作,因?yàn)槌瑫r(shí)工作只是浪費(fèi)時(shí)間的假面具。
70. 與程序設(shè)計(jì)師共同研擬出一份每日活動的時(shí)間表,把無法預(yù)期的臨時(shí)公務(wù)變成固定時(shí)間處理的事情,并且把程序開發(fā)的工作放在最優(yōu)先的地位,不要讓其他次要的事情干擾到寫程序。
71. 經(jīng)常加班就是項(xiàng)目出問題的明顯信號,也許是因?yàn)橹鞴艿挠^念錯(cuò)誤或是目標(biāo)不夠清楚,不論是什么原因,項(xiàng)目經(jīng)理絕對不能忽視這種現(xiàn)象,要對這個(gè)問題正確處理,項(xiàng)目經(jīng)理必須協(xié)助組員在每周4 0小時(shí)的工作時(shí)間里,把事情做得更有效率。
72. 我經(jīng)常聽到高層主管稱贊組員每天為公司工作很長的時(shí)間:“您對公司的貢獻(xiàn)值得嘉獎(jiǎng),做得很好!”這絕對是錯(cuò)誤的信息,員工應(yīng)該是因?yàn)楣ぷ髯龅煤枚艿椒Q贊,而不是因?yàn)樵谵k公室待得久,管理者不該把“生產(chǎn)效率”和“工作時(shí)間”混為一談,有的人也許可以用更少的時(shí)間,完成兩倍的工作呢。
73. 為了讓組員把辦公時(shí)間用在正確的地方,并提高部門的工作效率,項(xiàng)目經(jīng)理不但要為他們排除任何不必要的會議、報(bào)告和雜事,還要協(xié)助他們好好運(yùn)用寶貴的上班時(shí)間。您應(yīng)該協(xié)助組員安排適當(dāng)?shù)拿咳栈顒颖恚靡恍┬〖记桑尳M員有長段又不受干擾的時(shí)間,適合進(jìn)行開發(fā)工作。
74. 如果您關(guān)心組員的生活,就不要讓他們把全部的時(shí)間都投入在工作。每天只要確定他們賣力工作了八小時(shí),就可以把他們趕出辦公室了,當(dāng)然這樣做也許會有老板看不順眼,但是如果您像我一樣相信均衡、健康的生活是一切創(chuàng)意的原動力,就堅(jiān)持這份理念吧!
75. 每周工作4 0小時(shí)并不是金科玉律,只不過是美國的傳統(tǒng),而軟件開發(fā)項(xiàng)目大都以此為前提編定日程表。所以如果一個(gè)項(xiàng)目需要程序設(shè)計(jì)師每周工作40 小時(shí)以上才能趕上進(jìn)度,就表示有問題,也許是日程表定得太樂觀,也許是程序設(shè)計(jì)師需要再訓(xùn)練。不管怎么說,這個(gè)問題一定要認(rèn)真解決,絕對不應(yīng)該讓程序設(shè)計(jì)師加班來彌補(bǔ)這個(gè)漏洞。
2006年6月13日
#
MySQL5支持視圖、存儲過程、觸發(fā)器等高級特性了,終于象個(gè)完整的數(shù)據(jù)庫了!
很高興啊,我們做項(xiàng)目的時(shí)候選擇性更強(qiáng)了。
不過在我一個(gè)實(shí)際的網(wǎng)站項(xiàng)目中,發(fā)現(xiàn)事實(shí)和看上去的不太相同啊。是否支持這些特性和支持得多好畢竟是不同的問題!比如在使用Oracle時(shí),發(fā)現(xiàn)在9i上能正確執(zhí)行的統(tǒng)計(jì)SQL到8i上居然報(bào)錯(cuò),無非是多用了幾個(gè)嵌套的子查詢。Oracle尚且如此,MySQL也的確不能有太高期望。
下面列舉一下MySQL5的問題:
版本5.0.16中對視圖進(jìn)行排序時(shí),會導(dǎo)致服務(wù)器崩潰。如:select * from 視圖名 order by 某字段。所幸5.0.21版本解決了這個(gè)問題。不過我這只是隨便一用就能碰上這種致命錯(cuò)誤,誰知道還有多少bug隱藏著呢?
存儲過程更是不太爽。居然不支持遞歸,SQLServer和Oracle都早就支持了。郁悶,在處理樹形數(shù)據(jù)時(shí),只能寫點(diǎn)固定樹的深度的視圖了。
1.1.20版本的Query browser和1.1.9版本的Administrator客戶端工具穩(wěn)定性好差,每天能崩個(gè)幾回。不過功能比以前強(qiáng)些了。Query browser中多粘貼點(diǎn)SQL腳本就能搞死它;CREATE 某東西,按執(zhí)行多兩次、或快了些也能搞死它。只能說比沒有強(qiáng),湊合用吧。
其他基本功能用起來還不錯(cuò),沒碰到什么問題。當(dāng)然MySQL有如此影響力肯定有他獨(dú)到之處,對我來說除了免費(fèi)外就是速度快、用戶群大(則技術(shù)支持會比較多),否則可以考慮免費(fèi)的其他數(shù)據(jù)庫,如PostgreSQL,它的客戶端工具就專業(yè)多了,初步感覺跟SQLServer的差不多了。
2006年6月12日
#
1.歷史上出現(xiàn)的編程方法
? 1)結(jié)構(gòu)化編程
??? 程序應(yīng)該按自上而下的順序執(zhí)行,不會做隨便跳轉(zhuǎn)。主要為了提高可讀性(特別是控制結(jié)構(gòu)的),可自上而下的閱讀代碼,并且執(zhí)行的順序也大體是這樣的。
??? 它的三個(gè)組成部分:順序Sequence,選擇selection,循環(huán)(或迭代)repetition (or iteration)。任何控制結(jié)構(gòu)都可以用這三個(gè)部分組成。
??? 需要小心使用其他方式如:break,continue,return,throw-catch.
? 2)模塊化編程
??? 將邏輯相關(guān)的數(shù)據(jù)和函數(shù)放在一個(gè)模塊中。
??? VB中的Module就是這個(gè)思想的應(yīng)用。
??? 它沒有多個(gè)實(shí)例的概念,相當(dāng)于面向?qū)ο笾械膬H包含靜態(tài)方法和靜態(tài)變量的類。不需要實(shí)例化即可直接調(diào)用方法,只存在一個(gè)"實(shí)例"。
? 3)面向?qū)ο缶幊?br />??? 主要特點(diǎn):封裝(Encapsulation),繼承(Inheritance),多態(tài)(Polymorphism)。
??? 封裝:將邏輯相關(guān)的數(shù)據(jù)和方法(函數(shù))放在一個(gè)類中。跟模塊化編程做的一致。
??? 繼承:將內(nèi)容或接口重用,并實(shí)現(xiàn)類型的多態(tài)。
??? 多態(tài):不同的語義環(huán)境下,同一名稱可以有多種不同的實(shí)現(xiàn)。
? 具體表現(xiàn)為兩類:
? 同名方法不同內(nèi)容,實(shí)現(xiàn)方式:使用重載(overload),當(dāng)然方法的參數(shù)是不同的;
? 同名類型不同內(nèi)容,實(shí)現(xiàn)方式:使用覆蓋(override)或?qū)崿F(xiàn)(implement)。允許使用同一接口調(diào)用不同類的的實(shí)例對象。
2.各種方法的目標(biāo)
? 結(jié)構(gòu)化編程。重點(diǎn)是是控制結(jié)構(gòu),可看作是基本程序語句(無子程序)的結(jié)構(gòu);
? 子程序化編程。似乎沒有相關(guān)的歷史潮流,但我認(rèn)為加入認(rèn)為的加入它會使整個(gè)方法的發(fā)展過程更加完整。也許這個(gè)大家都認(rèn)為是當(dāng)然的了?子程序(或過程、函數(shù)、方法)是模塊化、面向?qū)ο缶幊痰淖钪匾幕?br />? 模塊化編程。重點(diǎn)是將數(shù)據(jù)和子程序邏輯相關(guān)的組合;
? 面向?qū)ο缶幊獭T谀K化的基礎(chǔ)上重點(diǎn)加入了模塊之間的關(guān)系。這里的模塊已演化為類。
3.方法體系
? 上述幾種編程方法可以歸為一類,屬于一個(gè)方法體系,其重點(diǎn)在于編程本身,力圖有效管理并降低程序邏輯的復(fù)雜性。
? 隨其發(fā)展,管理的代碼單元越來越大,越來越復(fù)雜,其方式也越來越接近日常的思維。
? 其輔助技術(shù)或方法有編輯器、調(diào)試器、UML、軟件工程等。
? 我認(rèn)為此體系中新的方法還未出現(xiàn)。現(xiàn)在流行的方法中:AOP面向方面編程,僅是此體系有益的補(bǔ)充;SOA面向服務(wù)架構(gòu),重點(diǎn)在于用統(tǒng)一的方式調(diào)用,而不依賴于底層技術(shù),是組件化的一種形式,這不是這一類的主線方向。
?
4.總結(jié):
????? 以往的編程方法和原則在現(xiàn)代的方法中得到了保留和發(fā)展,這對新手是一個(gè)挑戰(zhàn),不循序漸進(jìn)的學(xué)習(xí)這些技術(shù),想要短期學(xué)會現(xiàn)代方法(如:面向?qū)ο缶幊?是困難的。
????? 記住這些編程方法的主旨是很有好處的。
????? 新的編程方法必將是歷史方法的繼承和發(fā)展,所以學(xué)好這些舊的方法非常重要。
????? 掌握這些在各種層出不窮的新語言和新工具中不變的精華,或許,你可以不再那么疲于追趕新的技術(shù)潮流。
2006年6月9日
#
老婆的堂弟今年要畢業(yè)了,老婆本想給他介紹個(gè)工作,就問你想做什么工作?回答是什么賺錢做什么,現(xiàn)在不都這樣么?
好熟悉的話!現(xiàn)在社會上的確是這么個(gè)風(fēng)氣。回想當(dāng)初我畢業(yè)時(shí),也基本是這么個(gè)態(tài)度。不過我當(dāng)時(shí)對本專業(yè)基本沒興趣,當(dāng)時(shí)本專業(yè)工作也難找,在一個(gè)中南地區(qū)的省會城市工資3、5百。當(dāng)然也有好點(diǎn)的1千多,不過那是給成績好的人留的。不是我這種不務(wù)正業(yè)的主可以觸及的。
當(dāng)初的考慮是基本上要先能養(yǎng)活自己。獨(dú)立!在我心中是第一位的。上大學(xué)時(shí),我就已經(jīng)恥于每月向我爸要300月生活費(fèi)了。我的考慮是:
- 干本專業(yè)如果有人要我,有個(gè)5百塊我也就勉為其難的去了。不過由于我不感興趣也就沒有好好學(xué),成績單上是比較難看的,估計(jì)不找點(diǎn)門路也不會有人要。總之想來想去這條路可行性約等于0。
- 那我有什么拿手的?好像還有門手藝,倒是玩了4年吉他,也有不少大學(xué)畢業(yè)的去酒吧唱歌。不過本人嗓子容易啞,不適于干這個(gè)職業(yè)。
- 我應(yīng)該找我喜歡干的,又比較能賺錢的。計(jì)算機(jī),就是它了。我十分想當(dāng)程序員,這個(gè)名稱對我,那就是一個(gè)夢想啊。就跟剛玩計(jì)算機(jī)時(shí),對“電腦高手”名號之渴望一般。
?結(jié)果我走了第三條路。不容易啊,其間辛苦和曲折一言難盡。簡而言之,就是嘗試了考研換行的(考計(jì)算機(jī))的路子失敗,賣過10臺品牌電腦5周后試用期后被開除,兩次進(jìn)過我哥同學(xué)的公司干活。成功的是第二次進(jìn)我哥同學(xué)的公司,做ASP+SQLServer開發(fā)。
我當(dāng)時(shí)對ASP連聽都沒聽說過。填面試單時(shí),我在期望工資上寫的是500,我想基本上能維持大學(xué)生活的水平,夠自己活下去就行了。面試時(shí),那邊就是我哥的同學(xué),他問了些學(xué)什么專業(yè)之類的問題,我據(jù)實(shí)以告,他似乎不太滿意。看到我的期望工資時(shí),他有些憤怒,說我們這里3000以下的都不要!后來他想了想,給我的500前面加了個(gè)"1",因?yàn)檫@個(gè)是公司對畢業(yè)生的平均水平。
面試完那個(gè)狂喜阿,讓我下周一去上班。我回家時(shí)在路上就暗下決心,一定要好好抓住這個(gè)機(jī)會!給我一個(gè)月的試用期,說一個(gè)月后水平可以就留下否則就走人。我的壓力很大啊。買本書自己看,項(xiàng)目經(jīng)理偶爾回來指點(diǎn)一下,前兩周我基本上是在公司自學(xué)。后來讓我做個(gè)簡單的數(shù)據(jù)查詢頁面。搞出來就算通過。
過了好多年了,對那時(shí)的心情還是如此清晰。感謝我哥和他的那個(gè)同學(xué)讓我步入了這一行。不容易,不容易。
畢業(yè)后的幾年,本專業(yè)忽然熱了起來,一點(diǎn)不比計(jì)算機(jī)掙得少,但是比干編程的輕松多了。真是30年河?xùn)|,30年河西!不過我基本上對這個(gè)選擇沒有后悔,因?yàn)槲耶?dāng)時(shí)也不是把賺錢當(dāng)作唯一的或者第一的目的。主要是因?yàn)橄矚g。
所以,逢老婆的堂弟即將畢業(yè)、找工作之際,說兩句心里話,不要把錢看作是好工作標(biāo)準(zhǔn)的全部,錢的多少是可變的。綜合考慮行業(yè)未來的發(fā)展、自身的興趣等多方面因素,才是比較正確的方法。
?
Servlet是在多線程環(huán)境下的。即可能有多個(gè)請求發(fā)給一個(gè)servelt實(shí)例,每個(gè)請求是一個(gè)線程。
struts下的action也類似,同樣在多線程環(huán)境下。可以參考struts user guide: http://struts.apache.org/struts-action/userGuide/building_controller.html 中的Action Class Design Guidelines一節(jié):? Write code for a multi-threaded environment - Our controller servlet creates only one instance of your Action class, and uses this one instance to service all requests. Thus, you need to write thread-safe Action classes. Follow the same guidelines you would use to write thread-safe Servlets.
譯:為多線程環(huán)境編寫代碼。我們的controller servlet指揮創(chuàng)建你的Action 類的一個(gè)實(shí)例,用此實(shí)例來服務(wù)所有的請求。因此,你必須編寫線程安全的Action類。遵循與寫線程安全的servlet同樣的方針。
?
1.什么是線程安全的代碼
? 在多線程環(huán)境下能正確執(zhí)行的代碼就是線程安全的。
? 安全的意思是能正確執(zhí)行,否則后果是程序執(zhí)行錯(cuò)誤,可能出現(xiàn)各種異常情況。
2.如何編寫線程安全的代碼
? 很多書籍里都詳細(xì)講解了如何這方面的問題,他們主要講解的是如何同步線程對共享資源的使用的問題。主要是對synchronized關(guān)鍵字的各種用法,以及鎖的概念。
? Java1.5中也提供了如讀寫鎖這類的工具類。這些都需要較高的技巧,而且相對難于調(diào)試。
?
? 但是,線程同步是不得以的方法,是比較復(fù)雜的,而且會帶來性能的損失。等效的代碼中,不需要同步在編寫容易度和性能上會更好些。
? 我這里強(qiáng)調(diào)的是什么代碼是始終為線程安全的、是不需要同步的。如下:
? 1)常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。
? 2)對構(gòu)造器的訪問(new 操作)是線程安全的,因?yàn)槊看味夹陆ㄒ粋€(gè)實(shí)例,不會訪問共享的資源。
? 3)最重要的是:局部變量是線程安全的。因?yàn)槊繄?zhí)行一個(gè)方法,都會在獨(dú)立的空間創(chuàng)建局部變量,它不是共享的資源。局部變量包括方法的參數(shù)變量。
??? struts user guide里有:
??? Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
??? 譯:只使用用局部變量。--編寫線程安全的代碼最重要的原則就是,在Action類中只使用局部變量,不使用實(shí)例變量。
?
總結(jié):
??? 在Java的Web服務(wù)器環(huán)境下開發(fā),要注意線程安全的問題。最簡單的實(shí)現(xiàn)方式就是在Servlet和Struts Action里不要使用類變量、實(shí)例變量,但可以使用類常量和實(shí)例常量。
如果有這些變量,可以將它們轉(zhuǎn)換為方法的參數(shù)傳入,以消除它們。
??? 注意一個(gè)容易混淆的地方:被Servlet或Action調(diào)用的類中(如值對象、領(lǐng)域模型類)中是否可以安全的使用實(shí)例變量?如果你在每次方法調(diào)用時(shí)
新建一個(gè)對象,再調(diào)用它們的方法,則不存在同步問題---因?yàn)樗鼈儾皇嵌鄠€(gè)線程共享的資源,只有共享的資源才需要同步---而Servlet和Action的實(shí)例對于多個(gè)線程是共享的。
換句話說,Servlet和Action的實(shí)例會被多個(gè)線程同時(shí)調(diào)用,而過了這一層,如果在你自己的代碼中沒有另外啟動線程,且每次調(diào)用后續(xù)業(yè)務(wù)對象時(shí)都是先新建一個(gè)實(shí)例再調(diào)用,則都是線程安全的。