1、介紹
通過證書驗(yàn)證用戶身份(瀏覽器),其核心是利用cookie實(shí)現(xiàn)http和https的信息共享(同域名)。如http://test.abc.com/app/index.html 發(fā)現(xiàn)未驗(yàn)證后,跳轉(zhuǎn)到https://test.abc.com:443/app/checkCrt.html身份驗(yàn)證,要求出去證書,確認(rèn)后將身份信息帶入http請(qǐng)求頭部,跳轉(zhuǎn)到原請(qǐng)求頁面(http://test.abc.com/app/index.html ),讀取身份信息后進(jìn)入頁面(出于安全考慮Cookie需要加密)。
流程圖

流程說明:
登錄流程詳細(xì)介紹:
1). 未登錄用戶訪問頁面 如:http://test.abc.com/app/index.html
2). 【CertAuthValve】判斷是否訪問受限制資源,如訪問受限制的資源則判斷用戶身份是否已驗(yàn)證,未驗(yàn)證則將用戶重定向到身份驗(yàn)證頁面,原始請(qǐng)求的url做為
query的一部分,登錄成功后可以跳轉(zhuǎn)回來, 如:https://test.abc.com:443/app/checkCrt.htm?done=/index.html。
3). 【CertAuthValve】對(duì)于https請(qǐng)求,apache讀取請(qǐng)求提供的用戶證書,獲取證書中的郵件地址,并將該信息寫入請(qǐng)求頭中。
4). 【GetUserInfoValve】讀取請(qǐng)求頭,獲取剛剛設(shè)置的用戶郵件地址信息,進(jìn)一步獲取用戶的詳細(xì)信息,然后將這些信息加密后放入cookie中。
5). 登錄完成,將用戶外部重定向回原始頁面。
2、具體實(shí)現(xiàn)
1)、安裝apache、ssh、java、jboss等環(huán)境,略。
2)、生成服務(wù)證書和服務(wù)密碼
openssl req -new -x509 -nodes -out /home/admin/app/conf/ssl.crt/server.crt -keyout /home/admin/app/conf/ssl.crt/server.key -days 3600
因?yàn)橐蛢?nèi)網(wǎng)證書交互,所以需要一個(gè)內(nèi)網(wǎng)證書公鑰文件,可以通過以下方式獲取:
獲取方法:IE->工具->Internet選項(xiàng)->內(nèi)容->證書->受信任的根證書頒發(fā)機(jī)構(gòu),找到intranet行,點(diǎn)擊導(dǎo)出,選擇下一步,選擇Base64編碼X.509,將證書文件保存為intranet-ca.crt,拷貝到目錄/home/admin/app/conf/ssl.crt/。
3)、apache(httpd.conf)配置
應(yīng)用和身份驗(yàn)證頁面放在一起,所以需要同時(shí)配置兩個(gè)虛擬主機(jī),同時(shí)監(jiān)聽80(處理http請(qǐng)求)、443(處理https請(qǐng)求)端口。
#監(jiān)聽端口Listen 80Listen 443#app的虛擬主機(jī)配置NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin sa@abc.com
ServerName test.abc.com
DocumentRoot /home/admin/app/target/app/htdocs/
</VirtualHost>#身份驗(yàn)證的虛擬主機(jī)配置NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin sa@abc.com
ServerName test.abc.com
DocumentRoot /home/admin/app/target/app/htdocs/
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
#該指令為虛擬主機(jī)指定證書文件名。
SSLCertificateFile /home/
admin/app/conf/ssl.crt/server.crt
#該指令為證書指定一個(gè)對(duì)應(yīng)的私鑰文件
SSLCertificateKeyFile /home
/admin/app/conf/ssl.crt/server.key
#該指令為指定一個(gè)包含Certificate Authority證書的文件
SSLCACertificateFile /home/admin/app/conf/ssl.crt/intranet-ca.cer
SSLProxyEngine on
RewriteEngine on
#設(shè)置客戶端證書驗(yàn)證為必須
SSLVerifyClient require
#因?yàn)橐粋€(gè)CA證書能夠被另一個(gè)CA證書驗(yàn)證,所以可以形成一個(gè)CA證書鏈.使用該指令可指定服務(wù)器驗(yàn)證用戶證書時(shí)可以查找多少個(gè)CA證明。
#設(shè)置認(rèn)證深度:一般用默認(rèn)10。
SSLVerifyDepth 10
#把mod_ssl里的變量變?yōu)槿汁h(huán)境的變量
RequestHeader unset SSL_CLIENT_S_DN_Email
RequestHeader add SSL_CLIENT_S_DN_Email %{SSL_CLIENT_S_DN_Email}e
</VirtualHost>
4)、代碼片段
//CertAuthValve.java
//判斷session中是否有用戶郵箱地址
SessionValue session = SessionHelper.getSessionValue(rundata);
if (StringUtil.isNotEmpty(session.getCropEmail())) {
return null;
}
// 從內(nèi)網(wǎng)證書中獲取用戶郵箱地址: SSL_CLIENT_S_DN_Email
String cropEmail = rundata.getRequest().getHeader(SSL_CLIENT_HEADER_MAIL);
if (StringUtil.isNotEmpty(cropEmail)) {
//將郵箱地址保存到session
session.setCropEmail(cropEmail);
SessionHelper.saveSessionValue(rundata, session);
if (log.isDebugEnabled()) {
log.debug("用戶" + session.getCropEmail() + "已經(jīng)通過證書驗(yàn)證");
}
return null;
}
URIBrokerService uriBrokerService = (URIBrokerService) getWebxComponent().getService(
URIBrokerService.SERVICE_NAME);
URIBroker noPermissionUriBroker = uriBrokerService.getURIBroker(CHECK_CRT_URL);
//請(qǐng)求的原始URL & 驗(yàn)證的URL
String requestPath = rundata.getPathInfo().replace("_", "");
String checkCrtUrl = (String) noPermissionUriBroker.getPath().get(
noPermissionUriBroker.getPath().size() - 1);
try {
//原始請(qǐng)求判斷
if (requestPath.equalsIgnoreCase(checkCrtUrl)) {
//當(dāng)前是https請(qǐng)求,但是依然不能得到證書信息,轉(zhuǎn)到禁止頁面
//(要將禁止頁面加入到允許訪問的配置文件中,不然會(huì)導(dǎo)致循環(huán)重定向)
URIBroker uriBroker = uriBrokerService.getURIBroker("forbidden");
rundata.setRedirectLocation(uriBroker.render());
} else {
//轉(zhuǎn)到證書驗(yàn)證頁面
rundata.setRedirectLocation(noPermissionUriBroker.render() + "?done=" + rundata.getPathInfo());
}
} catch (IOException e) {
log.error("權(quán)限驗(yàn)證重定向出錯(cuò)", e);
}
return new BreakPipeline();
//GetUserInfoValve.java
Object user = rundata.getSession().getAttribute("userInfo");
if (user == null) {
SessionValue session = SessionHelper.getSessionValue(rundata);
String email = session.getCropEmail();
Employe employe = PersonInfoUtil.getPersonInfoByEmail(email);
// 寫入cookie
session.setEmployeeId(employe.getEmployeId());
session.setName(employe.getName());
session.setCropEmail(employe.getEmail());
SessionHelper.saveSessionValue(rundata, session);
}
采集到花瓣
posted @
2011-12-09 16:09 josson 閱讀(2441) |
評(píng)論 (0) |
編輯 收藏
受限于證書的原因,以前經(jīng)常不得已用IE打開一些應(yīng)用。其實(shí)有一工具可以幫助我們導(dǎo)出IE證書,用于firefox,解決證書的困惑。
Jailbreak [
https://www.isecpartners.com/application-security-tools/jailbreak.html],win32的一個(gè)小軟件,可以幫助我們導(dǎo)出IE證書,使用很簡(jiǎn)單。
1、windows環(huán)境(xp\win7均可),以adminstrator登錄;
2、下載jailbreak,解包后,運(yùn)行jailbreak.exe(非jailbreak.msc);
3、導(dǎo)出證書:Certificates - Current User > 個(gè)人 > 證書,選所有任務(wù)導(dǎo)出;

選擇導(dǎo)出私鑰。

4、在firefox中導(dǎo)入證書:選項(xiàng) > 高級(jí) > 查看證書(您的證書) > 導(dǎo)入(剛導(dǎo)出證書文件);

5、搞定。
采集到花瓣
posted @
2011-12-09 13:54 josson 閱讀(3107) |
評(píng)論 (1) |
編輯 收藏
互聯(lián)網(wǎng)的產(chǎn)品大都是面向海量用戶的服務(wù),且用戶分布區(qū)域廣泛,其教育水平、習(xí)慣也大多不同,具有高度不確定性,我們必須非常關(guān)注用戶的行為和反饋。因而,在互聯(lián)網(wǎng)產(chǎn)品服務(wù)的整個(gè)用戶研究,需求分析、產(chǎn)品研發(fā)及交付服務(wù)的過程中,都采用探索式、適應(yīng)性的研發(fā)理念進(jìn)行產(chǎn)品的研發(fā)。通常,會(huì)把整個(gè)產(chǎn)品研發(fā)周期劃分為若干個(gè)迭代,采用迭代式的演進(jìn)過程,不斷的去交付新的產(chǎn)品特性,并通過觀察用戶的行為和反饋獲取,進(jìn)而隨時(shí)調(diào)整產(chǎn)品的思路和方向。一切以用戶價(jià)值為核心是互聯(lián)網(wǎng)產(chǎn)品最核心的特點(diǎn),而以價(jià)值驅(qū)動(dòng)的敏捷開發(fā)方法非常符合這一特點(diǎn)。
一、敏捷項(xiàng)目管理實(shí)踐 
從阿里軟件開始,內(nèi)貿(mào)團(tuán)隊(duì)就一直在實(shí)行著敏捷項(xiàng)目管理實(shí)踐,通過小步快跑,快速迭代、增量交付用戶價(jià)值,不斷獲取用戶反饋,持續(xù)、快速的調(diào)整產(chǎn)品,驗(yàn)證并適合用戶價(jià)值。正是通過這些實(shí)踐活動(dòng),我們以迭代的、增量的交付用戶價(jià)值,最大限度的保證產(chǎn)品朝著符合用戶實(shí)際需求方向發(fā)展。目前,在內(nèi)貿(mào)團(tuán)隊(duì)?wèi)?yīng)用較成熟的敏捷實(shí)踐活動(dòng)有:
1)、迭代計(jì)劃(Sprint Planning Meeting)
2)、每日晨會(huì)(Daily Scrum Meeting) & 任務(wù)墻(Task Wall)
3)、功能預(yù)演(Spring Review)
4)、項(xiàng)目總結(jié)(Retrospect Meeting)
5)、結(jié)對(duì)編程(Pair Programming)
6)、其他技術(shù)實(shí)踐活動(dòng)等
二、敏捷團(tuán)隊(duì)
1)、自組織文化
如google、facebook等互聯(lián)網(wǎng)企業(yè),他們很少甚至沒有特定的項(xiàng)目流程,通常怎么敏捷怎么做,具有濃厚的工程師驅(qū)動(dòng)文化。我們則有較完整的開發(fā)流程指導(dǎo)和規(guī)范我們的項(xiàng)目研發(fā)工作,相比而言,喪失了一些靈活性和積極性,不利于我們工程師自我管理、自我驅(qū)動(dòng)意識(shí)的培養(yǎng)。臃腫、缺乏靈活性的流程同互聯(lián)網(wǎng)產(chǎn)品快速更新、快速發(fā)展是不相適應(yīng)的,同時(shí)也弱化我們的責(zé)任心意識(shí)。除了遵守詳盡的流程,我們是否可以換個(gè)角度、換種方法,提倡和營造一種自我管理、自我驅(qū)動(dòng)的開發(fā)文化,省卻一些并不能給我們帶來幫助卻影響效率的流程呢?
敏捷團(tuán)隊(duì)的自組織特性弱化了團(tuán)隊(duì)技術(shù)領(lǐng)導(dǎo)這個(gè)角色,強(qiáng)調(diào)自我管理和自我驅(qū)動(dòng)。雖然這對(duì)工程師的素質(zhì)要求更高,相對(duì)技術(shù)能力更難提高。但是,團(tuán)隊(duì)導(dǎo)向很重要,我們努力營造這樣的氛圍,從小團(tuán)隊(duì)做起,逐漸鍛煉和培養(yǎng)自組織團(tuán)隊(duì)。相信在這樣的開發(fā)氛圍下,會(huì)讓我們做的更高效、更敏捷,可以走的更穩(wěn)、更遠(yuǎn)。
2)、追求一體化
一體化團(tuán)隊(duì)作為敏捷開發(fā)方法中最具精益思想基因的實(shí)踐,是指每個(gè)項(xiàng)目團(tuán)隊(duì)包括分析,開發(fā),測(cè)試等角色,使團(tuán)隊(duì)滿足一個(gè)需求從設(shè)計(jì),開發(fā)到測(cè)試各個(gè)階段順利完成,達(dá)到符合質(zhì)量標(biāo)準(zhǔn)并滿足需求的軟件。這種以項(xiàng)目/產(chǎn)品為單位的虛擬團(tuán)隊(duì),坐在一起,全身心的為共同的目標(biāo)而努力,可以更好的凝聚項(xiàng)目組中的各種角色,消除部門墻。
3)、追求全功能
這里所指的全功能是希望項(xiàng)目團(tuán)隊(duì)能打破工程師角色之間的邊界,如研發(fā)、測(cè)試和前端工程師的界線,消除開發(fā)、測(cè)試流程中一些潛在浪費(fèi),提高效率。在項(xiàng)目團(tuán)隊(duì)內(nèi)部通過角色互換,不限角色的結(jié)對(duì)工作,加強(qiáng)不同角色,不同模塊間的知識(shí)傳遞,打破技術(shù)壁壘,幫助員工從不同視角理解項(xiàng)目,鍛煉技能,進(jìn)而增加團(tuán)隊(duì)均衡生產(chǎn)的能力。
為什么要提倡打破邊界?項(xiàng)目整體效率依賴于項(xiàng)目過程中各環(huán)節(jié)的工作效率,而整體效率的優(yōu)化往往依賴于均衡生產(chǎn)(精益思想的按需生產(chǎn)),即消除生產(chǎn)的波峰(過度生產(chǎn))和波谷(生產(chǎn)不足),只有局部效率的增加無法直接轉(zhuǎn)換為整體效率的增加(就象桶能裝多少水,決定于最短的那塊板)。整體效率的優(yōu)化要求IT團(tuán)隊(duì)消除技能壁壘,培養(yǎng)多面手,根據(jù)計(jì)劃的的變動(dòng),彈性地調(diào)整任務(wù),達(dá)到各角色和流程之間的平衡。
三、質(zhì)量保證
我們追求開發(fā)效率,同時(shí)也注重項(xiàng)目質(zhì)量。如何去保證質(zhì)量?就象美國的一位教授愛德化.戴明(W.Edwards Deming)所說:“我們應(yīng)該停止依靠大量檢驗(yàn)來保證質(zhì)量,而是要改進(jìn)工藝流程,從一開始就生產(chǎn)出優(yōu)質(zhì)的產(chǎn)品”。我們要在整個(gè)開發(fā)過程中多個(gè)環(huán)節(jié)去保證質(zhì)量。同時(shí),質(zhì)量保證是整個(gè)團(tuán)隊(duì)的責(zé)任,就如同前面所說的追求全功能團(tuán)隊(duì),打破邊界。
至于在哪些環(huán)節(jié)采用哪些實(shí)踐,我們先做個(gè)分類,按是否能被系統(tǒng)用戶感知將質(zhì)量問題區(qū)分內(nèi)部質(zhì)量和外部質(zhì)量。外部質(zhì)量指能直接被系統(tǒng)用戶感知,如運(yùn)行緩慢,不可操作或是操作復(fù)雜就屬于外部質(zhì)量低劣。而不能直接為系統(tǒng)用戶所直接感知的要素,對(duì)產(chǎn)品鍵壯性、可維護(hù)性有深遠(yuǎn)影響的問題就屬于外部質(zhì)量,如系統(tǒng)設(shè)計(jì)的一致性、代碼可讀性、邏輯完整性等。內(nèi)部質(zhì)量對(duì)用戶的影響比較間接,但比外部質(zhì)量意義更深遠(yuǎn)。一般來說,系統(tǒng)內(nèi)部質(zhì)量?jī)?yōu)秀,外部質(zhì)量仍有可能很差。而內(nèi)部質(zhì)量差的系統(tǒng),外部質(zhì)量肯定也不怎么樣。
1)、外部質(zhì)量保證
在外部質(zhì)量保證上,大部分會(huì)在開發(fā)后期介入,可以通過性能測(cè)試、自動(dòng)化測(cè)試及工程師的功能測(cè)試來保證,通過這些實(shí)踐活動(dòng)發(fā)現(xiàn)并保證例如運(yùn)行緩慢、不可操作等質(zhì)量問題不會(huì)存在。針對(duì)交互特別復(fù)雜的web應(yīng)用,可以更多的考慮采用webui自動(dòng)化測(cè)試工具,如selenium、pwaitr(b2b)、automan(淘寶)等,可以很好的完成那些簡(jiǎn)單、重復(fù)的TC用例,可以大大提高測(cè)試效率,解決測(cè)試工程師的資源瓶頸。
2)、內(nèi)部質(zhì)量保證
相對(duì)于外部質(zhì)量,內(nèi)部質(zhì)量問題影響更為深遠(yuǎn),在開發(fā)開始階段就應(yīng)該去保證。如通過單元測(cè)試、靜態(tài)代碼掃描(PMD\findbugs)、持續(xù)集成、重構(gòu)、結(jié)對(duì)編程、code review等多種實(shí)踐活動(dòng)來保證項(xiàng)目代碼的健康。
除了一些實(shí)踐活動(dòng)去檢查代碼質(zhì)量外,更為重要的是研發(fā)工程師對(duì)內(nèi)部質(zhì)量的重視,如果工程師沒有形成良好的質(zhì)量意識(shí),很可能這些實(shí)踐也只是停留于形式,并不能帶來較好的結(jié)果。如我們?cè)陂_發(fā)過程中的編碼規(guī)范、單元測(cè)試的質(zhì)量及覆蓋率,code review的及時(shí)性及問題是否持續(xù)跟進(jìn)等等。此外,有選擇的采用結(jié)對(duì)編程實(shí)踐,有助于質(zhì)量的提高。
本文以敏捷、精益(消除浪費(fèi)、按需生產(chǎn))思想的角度試圖去探討一種適合互聯(lián)網(wǎng)公司的產(chǎn)品開發(fā)體系,上述概要的介紹了項(xiàng)目管理、團(tuán)隊(duì)、質(zhì)量方面的一些敏捷實(shí)踐活動(dòng),主要涉及了我們對(duì)敏捷方面的經(jīng)驗(yàn)分享或者是些正在研究探討的課題。文中涉及的實(shí)踐活動(dòng),后續(xù)我將逐一展開詳細(xì)介紹,幫助大家更好的理解和認(rèn)識(shí)。希望本文的分享能成為一個(gè)引子,引起大家對(duì)敏捷開發(fā)的思考和討論,或者更好的了解敏捷和精益思想。
以下為本人在公司內(nèi)部關(guān)于項(xiàng)目質(zhì)量和工作效率郵件回復(fù)的一此意見和想法。
1、 談流程
不可否認(rèn)流程的重要性,但我們需要根據(jù)具合格情況分析,不斷的梳理和優(yōu)化我們的流程,讓流程更好的指導(dǎo)我們工作,而不是束縛。目前,我們的流程慢慢多了起來,感覺不如以前敏捷了。經(jīng)過rpm改造后,無論在測(cè)試環(huán)節(jié)還是發(fā)布階段,較之前失去了很大的靈活性。測(cè)試階段,開發(fā)bugfix后想在測(cè)試環(huán)境驗(yàn)證,每次必須重走aone的流程及打包布署,相比之前的build效率真的差了好多。當(dāng)然,也許是我們項(xiàng)目組對(duì)這個(gè)流程熟練度、方法還不夠,很多環(huán)節(jié)有待改進(jìn)。
發(fā)布階段,目前統(tǒng)一由SCM來發(fā)布,必然會(huì)導(dǎo)致開發(fā)對(duì)線上環(huán)境及發(fā)流程更加陌生,同我們提倡的打破邊界,敏捷響應(yīng)有些相背。再者,SCM資源有限的原因,要支持ITU眾多產(chǎn)品線,能否應(yīng)付的過來,始終是個(gè)問題。發(fā)布統(tǒng)一管理有好處,同樣也帶來了弊端,ITU不同于網(wǎng)站,大多數(shù)的技術(shù)團(tuán)隊(duì)共同在維護(hù)在幾個(gè)應(yīng)用,而itu的應(yīng)用多、規(guī)模相對(duì)小、環(huán)境各異,這樣的產(chǎn)品線采用統(tǒng)一管理性價(jià)比不高。希望相應(yīng)的owner,能不定期的搜集各產(chǎn)品線的意見和反饋,不斷的優(yōu)化,讓我們的流程更合理。
2、 談自測(cè)
我們團(tuán)隊(duì)一直在強(qiáng)調(diào)自測(cè)意識(shí),也在這方面不斷的總結(jié)和改進(jìn)。我覺的要提高自測(cè),首先應(yīng)讓每位開發(fā)同學(xué)形成較好的自測(cè)意識(shí),而不是自上而下的命令式管理,只有自己有這方面的意,才會(huì)去思考、去想辦法,去實(shí)踐。再者,需要PM或技術(shù)經(jīng)理去思考,目前階段實(shí)行自測(cè)會(huì)有什么困難,如沒有系統(tǒng)的自測(cè)方法、時(shí)間不充足(需要熟悉下階段的UC、下迭代的設(shè)計(jì)、單元測(cè)試補(bǔ)寫等),找到這些困難或問題,就容易對(duì)癥下藥了。最后,不斷總結(jié)和積累自測(cè)方式,優(yōu)化項(xiàng)目流程。自測(cè)不是一種形式,而要追求效果,開發(fā)自測(cè)同樣需要計(jì)劃和方法,所以我們需要向QA同學(xué)請(qǐng)教,總結(jié)過去 bug常犯的錯(cuò)誤,整理自己的check項(xiàng)。相信通過這樣的一些自測(cè)方法,能真正提高我們的項(xiàng)目質(zhì)量,打破同QA的界線,我們的開發(fā)、測(cè)試資源比例可以得到更大的優(yōu)化,將以前開發(fā)階段緊,測(cè)試階段松的狀況加以改善,使整個(gè)項(xiàng)目過程中的緊張度趨于平緩。
3、 談故障分
“盡量不要讓故障分成為大家包袱,可以考慮被實(shí)施產(chǎn)品對(duì)事故級(jí)和A類才對(duì)個(gè)人計(jì)故障分,B和C類故障分記在主管頭上!”,個(gè)人也比較支持駱駝的觀點(diǎn)。目前大家對(duì)線上故障都小心翼翼,大家對(duì)質(zhì)量的意識(shí)很高,這當(dāng)然是好事,但同時(shí)帶來的影響是效率低了。我的觀點(diǎn)是,作為增值服務(wù)的互聯(lián)網(wǎng)產(chǎn)品,我們更需要快速迭代增量提供用戶價(jià)值,盡快獲取用戶反饋并改善產(chǎn)品,產(chǎn)品推出的遲早,不僅影響獲得回報(bào)的時(shí)間,還影響到獲得價(jià)值的多少,錯(cuò)過了一個(gè)時(shí)間窗口,產(chǎn)品可能就不再有任何價(jià)值。所以,我們需要找到一個(gè)平衡量點(diǎn),可接受的質(zhì)量狀況達(dá)到最大的效率。
從客戶第一角度談質(zhì)量,某些時(shí)候,客戶可以接受服務(wù)偶而不可用重啟下,卻不能接受產(chǎn)品沒價(jià)值、交互性太差,操作太復(fù)雜。所以,對(duì)于客戶來說什么對(duì)他們更重要,就需要我們每個(gè)人去分析和評(píng)估。所以,我們一味只注重質(zhì)量,而忽略客戶真實(shí)需求,那就太悲哀。我的觀點(diǎn)是,case by case,帶著這樣的觀點(diǎn)去思考和解決問題。
4、談敏捷項(xiàng)目團(tuán)隊(duì)
從打破邊界,我想到了一體化的敏捷項(xiàng)目管理團(tuán)隊(duì),一個(gè)目標(biāo)一致、自我管理的團(tuán)隊(duì),應(yīng)該具備良好的目標(biāo)意識(shí)和執(zhí)行力,不僅能管好自己的一畝三分地,同時(shí)也能站在項(xiàng)目、團(tuán)隊(duì)的角度看待問題。PD出現(xiàn)了問題,開發(fā)積極去彌補(bǔ);開發(fā)出現(xiàn)了問題,QA積極去彌補(bǔ),項(xiàng)目團(tuán)隊(duì)的目標(biāo)非常一致。每位項(xiàng)目組成員一定要把好每一關(guān),萬不可把問題向下拋,因?yàn)檫€有開發(fā)或QA會(huì)把關(guān),所以差不多就行了,這樣往往就是災(zāi)難的開始。
2010已成為歷史,記憶里2010年變化很多、做的很多、收獲也很多。2010是個(gè)轉(zhuǎn)型期、創(chuàng)業(yè)期,從年初開始,就在新的Marking中努力耕耘。前半年,以新產(chǎn)品研發(fā)為主;后半年,結(jié)合客戶使用產(chǎn)品后的反饋,不斷的優(yōu)化和改進(jìn)產(chǎn)品功能,努力提升產(chǎn)品價(jià)值和用戶體驗(yàn)。通過大家的努力,幾款新產(chǎn)品還是彼受用戶歡迎的,最欣喜的是我們提前完成了2010年的KPI目標(biāo)。
過去的一年,有著太多的痛苦和艱辛,為了新產(chǎn)品的上線,晚上、周未都沒了,唯一想的和做的就是確保產(chǎn)品如期上線。過程雖然很艱苦,但大家都努力堅(jiān)持,齊心協(xié)力,確保任務(wù)如期完成,我們保持了一貫的說到做到、如期交付的作風(fēng)。因?yàn)檫@樣的磨練,我和我們的團(tuán)隊(duì)得到了更多成長(zhǎng)。困難并不可怕,熬過去,明天的太陽會(huì)更加燦爛。
1、談?wù)劤砷L(zhǎng)和不足:
1)、職業(yè)轉(zhuǎn)型,開發(fā)到管理
雖然Team Leader已經(jīng)做了幾年了,但一直停留在項(xiàng)目上,多為管事不管人,對(duì)細(xì)節(jié)問題關(guān)注較多,所以之前談不上管理,只能算是積累些項(xiàng)目管理經(jīng)驗(yàn)。經(jīng)過這一年的學(xué)習(xí)和發(fā)展,有了更多的管理意識(shí),逐漸關(guān)注團(tuán)隊(duì)建設(shè)、團(tuán)隊(duì)成長(zhǎng),注意給小組成員更多的機(jī)會(huì)和空間,讓他們得到鍛煉和成長(zhǎng),承擔(dān)更多團(tuán)隊(duì)或項(xiàng)目中的重要事項(xiàng),而他們通過完成這些重要任務(wù),不僅得到了磨練,同時(shí)在團(tuán)隊(duì)中建立了自己的影響力。
放在以前,我會(huì)認(rèn)為有風(fēng)險(xiǎn),或者自己做更快,更省事,或最有把握的人去。現(xiàn)在想來,以前認(rèn)識(shí)太膚淺了,我們需要的團(tuán)隊(duì)?wèi)?zhàn)斗力,而不是個(gè)別人的能力,若平常不注重團(tuán)隊(duì)成員的培養(yǎng),團(tuán)隊(duì)的戰(zhàn)斗力永遠(yuǎn)不行,承擔(dān)不了關(guān)鍵任務(wù)。
談到成長(zhǎng)和培養(yǎng),團(tuán)隊(duì)需要什么樣的人呢?作為互聯(lián)網(wǎng)企業(yè),同一般軟件企業(yè)不同,產(chǎn)品在推出之前,誰也無法肯定是否會(huì)受用戶歡迎,只能快速推出,讓市場(chǎng)來驗(yàn)證,不斷的改進(jìn)和適應(yīng)用戶的需要。因而,需要我們技術(shù)人員也具備技術(shù)判斷力,改變命令式管理體制下的工作習(xí)慣,充分發(fā)揮主觀能動(dòng)性和創(chuàng)新意識(shí),共同做好產(chǎn)品。
2)、學(xué)會(huì)擁抱變化;
2010年變化很多,有些也許對(duì)個(gè)人、團(tuán)隊(duì)沒有影響或影響很小,有些直接關(guān)系自己或團(tuán)隊(duì),如團(tuán)隊(duì)的核心成員不斷的被抽調(diào)、人員調(diào)整、KPI的271考評(píng)等,每次的變化都會(huì)帶來不同的問題。持續(xù)輸血,新人補(bǔ)允,使團(tuán)隊(duì)?wèi)?zhàn)斗力大打折扣,很長(zhǎng)一段時(shí)間非常的糾結(jié)和無耐。事情總是具有兩面性,往好處看,這對(duì)我、對(duì)團(tuán)隊(duì)也未必是件壞事,沒有經(jīng)驗(yàn)過挫折和磨練,又怎能成佛呢?既然是組織需要或Boss的決定,那就多些理解和支持,支持和協(xié)助上級(jí)完成也是每個(gè)下屬的職責(zé);況且,某些變化至少對(duì)于一些同學(xué)也是件好事,他們有更多的機(jī)會(huì)和更大的平臺(tái)去一展才華。
大概人都是喜歡按習(xí)慣辦事的緣故,每每有變化都覺的很痛苦。我覺的如何擁抱變化關(guān)鍵在于心態(tài),我們需要理性看待變化,多往積極的方向思考,不僅更容易調(diào)整好心態(tài),而且可以在變化中吸取經(jīng)驗(yàn)和教訓(xùn),鞭策我們成長(zhǎng)。
3)、提升項(xiàng)目管理能力
雖然在項(xiàng)目管理知識(shí)上沒有太多的時(shí)間和精力去系統(tǒng)的學(xué)習(xí),但通過不斷實(shí)踐和總結(jié),還是有了不少的積累和沉淀,對(duì)項(xiàng)目管理有了更多的理解和把握,對(duì)敏捷項(xiàng)目管理也有不同的認(rèn)識(shí),結(jié)合團(tuán)隊(duì)自身尋找適合我們的實(shí)踐方式。在項(xiàng)目管理方面,還有很多需要去提升和學(xué)習(xí),2011年希望安排更多的時(shí)間系統(tǒng)的學(xué)習(xí)項(xiàng)目管理知識(shí)及敏捷項(xiàng)目管理,并結(jié)合實(shí)際應(yīng)用到工作中。
4)、提升向上溝通力
在擁抱變化的同時(shí),同樣需要理性的分析和積極的向上溝通。在過去,雖然會(huì)盡可能的去表達(dá)和反饋?zhàn)约旱南敕ê鸵庖姡抑匦聦徱曄拢傆X得表達(dá)還不夠明確或不是那么的到位,或許在表達(dá)時(shí)還有更好的方式,至少還有提升的必要。向上溝通也是門學(xué)問,需要好好研究下。
5)、提升團(tuán)隊(duì)建設(shè)和輔導(dǎo)能力
相對(duì)來說,過去的一年所有的同學(xué)都會(huì)關(guān)注到,但領(lǐng)悟能力和基礎(chǔ)較好的同學(xué)成長(zhǎng)更快,基礎(chǔ)稍弱的沒有太大變化。顯然,平常輔導(dǎo)工作沒有做好或做到位,關(guān)注程度不夠。越是基礎(chǔ)差些的同學(xué)需要關(guān)注和幫助的點(diǎn)越多,需要幫助他們找到不足和問題所在,一起找改進(jìn)辦法,并給予必要的督促和檢查,養(yǎng)成好的學(xué)習(xí)習(xí)慣,促進(jìn)成長(zhǎng)。2011年,這方面需要做的還有更多。
2、談?wù)?011年的期望
1)、團(tuán)隊(duì)
解決目前團(tuán)隊(duì)新人多,有效資源少的問題;積極關(guān)注和幫助新人溶入團(tuán)隊(duì),熟悉業(yè)務(wù),以減少對(duì)項(xiàng)目開展的影響;
抓好梯隊(duì)建設(shè),關(guān)注和輔導(dǎo)基礎(chǔ)較差同學(xué)的,共同制定改進(jìn)計(jì)劃和Action,做好必要的監(jiān)督和指導(dǎo),促進(jìn)成長(zhǎng);
2)、能力
系統(tǒng)學(xué)習(xí)項(xiàng)目管理和敏捷軟件開發(fā)方面的知識(shí),并應(yīng)用到項(xiàng)目管理實(shí)踐中;同時(shí)積極參與相關(guān)方面的分享和討論。
3)、影響
推動(dòng)興趣小組活動(dòng)的開展,借開發(fā)工具的發(fā)展和分享,建立團(tuán)隊(duì)在部門或技術(shù)部的影響;
鼓勵(lì)團(tuán)隊(duì)成員積極參與技術(shù)部的公共事務(wù),提升影響力。
給力2010,加油2011!!!
1、什么是iteration和release?
iteration和release是兩個(gè)不同的概念,但在敏捷實(shí)踐活動(dòng)中,我們往往認(rèn)識(shí)的比較模糊,一個(gè)Iteration就是一次release,其實(shí)不然。那么,具體有什么區(qū)別和聯(lián)系呢?
Iteration(迭代):在固定的周期內(nèi),經(jīng)過需求分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試等活動(dòng),完成計(jì)劃的的業(yè)務(wù)需求,迭代結(jié)束提供一個(gè)可工作的產(chǎn)品。計(jì)劃的業(yè)務(wù)需求,可能是一個(gè)完整的User Story,也可能是一個(gè)Story中的若干task。
Release(發(fā)布):經(jīng)過一個(gè)或若干個(gè)iteration后,完成計(jì)劃中的所有User Story,經(jīng)過測(cè)試后才release,最終真正交付給客戶使用。
在我們的實(shí)踐活動(dòng)中,一個(gè)User Story所需的工作量超過我們的有效資源,無法安排在一個(gè)iteration內(nèi)。我們就會(huì)想當(dāng)然的會(huì)去延長(zhǎng)迭代周期,增加有效資源以適應(yīng)所需工作量。殊不知,這更象是形式上的迭代開發(fā),無異于瀑布式項(xiàng)目開發(fā)過程。
2、建立固定的迭代周期,保持穩(wěn)定的開發(fā)節(jié)奏
Scurm方法也非常強(qiáng)調(diào)穩(wěn)定的迭代節(jié)奏,一個(gè)穩(wěn)定的迭代節(jié)奏就如同項(xiàng)目的的心跳。Simon Baker描述說:"就像心臟有規(guī)律地跳動(dòng)來保持身體運(yùn)行,固定的迭代長(zhǎng)度提供了一個(gè)恒量,有助于建立開發(fā)和交付的節(jié)奏。根據(jù)我的經(jīng)驗(yàn),節(jié)奏是幫助取得不變的步幅的重要因素"(2004)。對(duì)于敏捷開發(fā)的團(tuán)隊(duì)而言,穩(wěn)定的迭代節(jié)奏可以讓產(chǎn)品保持更穩(wěn)定的交付。
3、如何保持穩(wěn)定的開發(fā)節(jié)奏?
當(dāng)一個(gè)迭代期內(nèi)可提供的有效資源無法實(shí)現(xiàn)一個(gè)User Story時(shí),我們?nèi)绾伟磁拍兀?在 談迭代周期控制的困惑 中已談到,這里不在細(xì)述。
4、如何選擇適合自己團(tuán)隊(duì)的迭代周期?
一般需要考慮以下因素:
1)、整個(gè)項(xiàng)目周期長(zhǎng)度(完成計(jì)劃的商業(yè)需求所需時(shí)間)
較短的迭代周期將會(huì)有以下一些好處:更頻繁的向客戶展示/交付可用的軟件;更頻繁的度量開發(fā)進(jìn)度;更頻繁的取得反饋并改進(jìn);一般大的項(xiàng)目最好有多次(3次或以上)獲取反饋、修正的機(jī)會(huì),根據(jù)項(xiàng)目周期調(diào)整迭代周期長(zhǎng)度。
2)、不確定性的多少
不確定性有多種形式,客戶到底想要的是什么?小組的工作效率,時(shí)間?技術(shù)門檻等都不存在不確定性,不確定性越多,迭代就應(yīng)該越短。
3)、獲得反饋的難易程度
指小組獲取反饋數(shù)量、頻度和及時(shí)性,視所處的環(huán)境不同,選擇合適的迭代長(zhǎng)度;
4)、優(yōu)先級(jí)要以多久保持不變
開發(fā)小組承諾在一次迭代中完成一組特定的功能,重要的是不要改變他們的目標(biāo)方向,優(yōu)先級(jí)不會(huì)被改變的時(shí)間長(zhǎng)度是選擇迭代長(zhǎng)度時(shí)需要考慮的因素。
5)、迭代的系統(tǒng)開銷
每次迭代的成本(時(shí)間),如迭代中進(jìn)行的完整回歸測(cè)試。最佳迭代周期的目標(biāo)之一就是減少或近似消除每次迭代的系統(tǒng)開銷。如每次回歸時(shí)間成本很高,那決定周期長(zhǎng)度時(shí)更傾向于長(zhǎng)一些。
6)、團(tuán)隊(duì)成員的緊迫感
Niels Malotaux指出:"只要項(xiàng)目的結(jié)束日期還在遙遠(yuǎn)的將來,我們就不會(huì)感到任何壓力,并從容不迫的工作。當(dāng)結(jié)束日期逼近時(shí),我們才會(huì)開始更努力的工作"。意思指項(xiàng)目開始大家比較放松,而越臨近結(jié)束,工作越忙壓力越大。因此,選擇一個(gè)合適的迭代周期長(zhǎng)度,讓團(tuán)隊(duì)成員在整個(gè)迭代過程中感受到的壓力更平均,不是給團(tuán)隊(duì)更多的壓力,而是壓力總量平均分布在迭代過程中。
每個(gè)團(tuán)隊(duì)根據(jù)所在環(huán)境和條件確定一個(gè)合適的迭代長(zhǎng)度,一般建議2~4周。在我們的實(shí)踐中,以2周一次迭代的頻率,保持相對(duì)穩(wěn)定的開發(fā)和交付的節(jié)奏。
5、參考資料:
《敏捷估計(jì)與規(guī)劃》 Mike Cohn
posted @
2011-01-31 14:26 josson 閱讀(3418) |
評(píng)論 (0) |
編輯 收藏
敏捷宣言中說到:"最好的架構(gòu)、需求和設(shè)計(jì)來自于自組織的團(tuán)隊(duì)"。在自組織團(tuán)隊(duì)中,我們每個(gè)人既是團(tuán)隊(duì)/項(xiàng)目的管理者,又是執(zhí)行者,要取得優(yōu)異的結(jié)果,必須加強(qiáng)自我管理。
如何做好自我管理呢?
1、平和的心態(tài):我們會(huì)不斷的遇到各類或好事或壞事、或成功或挫折,什么樣的心態(tài)去對(duì)待決定了我們成長(zhǎng)的方向及高度,"態(tài)度決定一切"。
2、目標(biāo)感:大到個(gè)人職業(yè)規(guī)劃,小到每件事的期望,對(duì)于目標(biāo)(期望)的制定和管理,都需要我們認(rèn)真的去對(duì)待;
3、執(zhí)行力:目標(biāo)是方向,不能執(zhí)行就不會(huì)有結(jié)果,好的執(zhí)行力是優(yōu)秀個(gè)人或團(tuán)隊(duì)的必要條件。
4、時(shí)間管理:工作需要區(qū)分輕重緩急,不能對(duì)事情沒有計(jì)劃和按排,對(duì)事需要分析重要性和緊急程度,分別對(duì)待;
5、學(xué)習(xí)能力:"學(xué)歷代表過去,能力代表現(xiàn)在,學(xué)習(xí)能力代表將來。",一個(gè)人的學(xué)習(xí)能力決定他將來的成績(jī);
任何人都不希望自己被人管著,但要想不被人管只有一種辦法:時(shí)時(shí)嚴(yán)格要求自己,主動(dòng)、出色的完成每項(xiàng)工作,努力學(xué)習(xí),與團(tuán)隊(duì)共成長(zhǎng)。




昨日PM小組例會(huì),談到了需求評(píng)估工作量遠(yuǎn)大于有效資源情況下,如何保證迭代周期穩(wěn)定的問題。討論的內(nèi)容,對(duì)于PM如何控制、保持迭代周期穩(wěn)定有較大的參考價(jià)值。
|
有效資源 |
評(píng)估工作量 |
1 |
多 |
少 |
2 |
少 |
多 |
3 |
相同 |
相同 |
注:
有效資源:指迭代周期內(nèi),開發(fā)團(tuán)隊(duì)所能提供的有效工作日,單位人/天。
評(píng)估工作量:指迭代周期內(nèi),產(chǎn)品經(jīng)理提供需要實(shí)現(xiàn)的業(yè)務(wù)需求所評(píng)估的工作量之和。
上表描述以固定周期為兩周的迭代中,可能會(huì)出現(xiàn)的有效資源和評(píng)估工作量對(duì)比情況。其中,1、3兩種情況因?yàn)樵u(píng)估工作量小于或等同能提供的有效資源,所以不會(huì)影響迭代周期。重點(diǎn)需討論的是有效資源小于評(píng)估工作量時(shí),如何保持固定周期?
例舉:一迭代周期,能提供有效資源20人/天,需求評(píng)估工作量30人/天。
1、功能較獨(dú)立,需求不能拆分發(fā)布;
安排一個(gè)release,兩個(gè)iterative。這種情況需要在迭代2中附加一些技術(shù)改造或低優(yōu)先級(jí)的小需求、bugfix,release日期相對(duì)會(huì)慢幾天。
2、一個(gè)迭代中包括多個(gè)產(chǎn)品的需求(需要各位產(chǎn)品經(jīng)理協(xié)商,決定需求優(yōu)先級(jí));
a)、以保證質(zhì)量為重:
忽略商業(yè)優(yōu)先級(jí),先處理一個(gè)迭代中就能全部完成的需求。
b)、保證價(jià)值
分兩個(gè)迭代完成,一次release。
通常情況下,我們盡力保證迭代周期的穩(wěn)定,但也允許例外,如:商業(yè)需求,產(chǎn)品上確定了發(fā)布時(shí)間點(diǎn),或者節(jié)假期間團(tuán)隊(duì)請(qǐng)假比較多,一個(gè)迭代所能提供的有效資源相對(duì)比較少的情況。
保持迭代周期穩(wěn)定,其核心是:
固定Timebox和可提供的資源,讓產(chǎn)品經(jīng)理來決定需求的優(yōu)先級(jí),每迭代只接納(開發(fā)/QA資源)可承受的需求。
posted @
2011-01-13 15:31 josson 閱讀(1024) |
評(píng)論 (0) |
編輯 收藏
對(duì)于互聯(lián)網(wǎng)行業(yè)來說,快速推出產(chǎn)品占領(lǐng)市場(chǎng)、快速檢驗(yàn)產(chǎn)品的價(jià)值和方向性、快速調(diào)整及優(yōu)化是極期重要的。因此,采用小步快跑、持續(xù)迭代的敏捷實(shí)踐一種不錯(cuò)的項(xiàng)目管理方法。我們團(tuán)隊(duì)在敏捷項(xiàng)目管理方面持續(xù)開展了二年多時(shí)間,在scrum、xp等敏捷最佳實(shí)踐的基礎(chǔ)上,結(jié)合團(tuán)隊(duì)自身的基礎(chǔ)和條件,不斷的償試和優(yōu)化,總結(jié)和積累了一些經(jīng)驗(yàn)。目前,這些敏捷項(xiàng)目管理實(shí)踐在項(xiàng)目組開展情況良好,得到了大多數(shù)團(tuán)隊(duì)成員的認(rèn)同,特別是業(yè)務(wù)方、QA等合作方的認(rèn)可。

上圖描述了一個(gè)基本項(xiàng)目迭代流程,其中涉及三個(gè)角色,其職責(zé)同等于Scrum中的Product Owner、Scrum Master、Scrum Team。迭代流程中分別包含了以下敏捷實(shí)踐:
1)、迭代計(jì)劃會(huì)議,按商業(yè)優(yōu)先級(jí)篩選需求列表,確定本項(xiàng)目需求范圍;
2)、確認(rèn)本次迭代需求、資源、時(shí)間的具體情況;
3)、簡(jiǎn)單設(shè)計(jì),對(duì)關(guān)鍵技術(shù)點(diǎn)進(jìn)行必要的設(shè)計(jì);
4)、晨會(huì);
5)、結(jié)對(duì)編程;
6)、持續(xù)集成;
7)、showcase;
8)、項(xiàng)目總結(jié)會(huì);
9)、新迭代的開始... ...
以上具體實(shí)踐活動(dòng)內(nèi)容及組織形式,后續(xù)將逐一介紹,敬請(qǐng)關(guān)注。
1、什么是java序列化
Java
序列化
API
提供一種處理對(duì)象序列化的標(biāo)準(zhǔn)機(jī)制。序列化(Serialization)是指將java對(duì)象用一連串字節(jié)描述的一個(gè)過程;反序列化(deserialization)是一種將這一串字節(jié)構(gòu)建成一個(gè)對(duì)象的過程。
2、序列化的作用(必要性)
Java中,一切都是對(duì)象,在分布式環(huán)境中經(jīng)常需要將對(duì)象從這一端網(wǎng)絡(luò)或設(shè)備傳遞到另一端。Java
序列化機(jī)制就是一種解決在網(wǎng)絡(luò)兩端傳輸數(shù)據(jù)的問題而產(chǎn)生的協(xié)議。下圖表示客戶端/服務(wù)器之間通信,一個(gè)對(duì)象是從客戶端傳送到服務(wù)器通過序列化的視圖。

3、如何序列化一個(gè)對(duì)象
為序列化一個(gè)對(duì)象,你需確保對(duì)象類實(shí)現(xiàn)Serializable接口。Serializable接口沒有方法,只要實(shí)現(xiàn)了序列化接口,Class
就能被序列化機(jī)制處理。
示例代碼,需序列化的java對(duì)象:
1 import java.io.Serializable;
2
3 public class TestClassSerial implements Serializable {
4 public byte version = 100;
5 public byte count = 0;
6 }
示例代碼,
把TestClassSerial對(duì)照象
輸出成
Byte
流,存儲(chǔ)到
temp.out
文件里:
1 public static void main(String args[]) throws IOException {
2 FileOutputStream fos = null;
3 ObjectOutputStream oos = null;
4 try {
5 fos = new FileOutputStream("c:/temp.out");
6 oos = new ObjectOutputStream(fos);
7 TestClassSerial tcs = new TestClassSerial();
8 oos.writeObject(tcs);
9 oos.flush();
10 }
11 finally {
12 if(oos != null) {
13 oos.close();
14 }
15 if(fos != null) {
16 fos.close();
17 }
18 }
19 }
示例代碼,
從持久的文件中讀取
Bytes
重建對(duì)象:
1 public static void main1(String args[]) throws IOException {
2 FileInputStream fis = null;
3 ObjectInputStream oin = null;
4 try {
5 fis = new FileInputStream("c:/temp.out");
6 oin = new ObjectInputStream(fis);
7 TestClassSerial tcs = (TestClassSerial) oin.readObject();
8 System.out.println("version="+tcs.version);
9 }
10 finally {
11 if(fis != null) {
12 fis.close();
13 }
14 if(oin != null) {
15 oin.close();
16 }
17 }
18 }
執(zhí)行結(jié)果為:100.
4、對(duì)象的序列化格式
TestClassSerial對(duì)象序列化輸出的
temp.out
文件,以
16
進(jìn)制方式顯示,內(nèi)容如下:
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
這些二進(jìn)制字節(jié)就是用來描述序列化以后的TestClassSerial對(duì)象的,我們注意到
TestSerial
類中只有兩個(gè)域:
1 public byte version = 100;
2 public byte count = 0;
都是
byte
型,理論上存儲(chǔ)這兩個(gè)域只需要
2
個(gè)
byte
,但是實(shí)際上
temp.out
占據(jù)空間為
51bytes
,也就是說除了數(shù)據(jù)以外,還包括了對(duì)序列化對(duì)象的其他描述。
5、Java
的序列化算法
序列化算法一般會(huì)按步驟做如下事情:
1、將對(duì)象實(shí)例相關(guān)的類的元數(shù)據(jù)輸出;
2、遞歸地輸出類的超類元數(shù)據(jù)描述直到不再有超類;
3、類元數(shù)據(jù)完了以后,開始從最頂層的超類開始輸出對(duì)象實(shí)例的實(shí)際數(shù)據(jù)值;
4、從上至下遞歸輸出實(shí)例的數(shù)據(jù);
更多序例化事例及二進(jìn)制字節(jié)含義參考文檔:http://my.oschina.net/god/blog/1291
1、員工激勵(lì)
通過各種外部或內(nèi)部的刺激,以激發(fā)員工的需要、動(dòng)機(jī)、欲望,調(diào)動(dòng)人的工作積極性,充分挖掘潛力,全力達(dá)到預(yù)期目標(biāo)的過程。
2、激勵(lì)形式、方法:
廣義的分物質(zhì)激勵(lì)和精神激勵(lì)(職務(wù)、榮譽(yù)、目標(biāo)、信任、情感等)。

3、原則:
1)、精神激勵(lì)為主;
2)、只激勵(lì)該激勵(lì)的人;
3)、只激勵(lì)該激勵(lì)的事;
4)、激勵(lì)方法、手段因人而異,把握按需激勵(lì);
5)、鼓勵(lì)公開競(jìng)爭(zhēng)、和諧競(jìng)爭(zhēng);
4、案例:
1)、壓力非常大的時(shí)候,采用激勵(lì)手段 -- 目標(biāo)激勵(lì)
2)、當(dāng)前員工不開心,采用的手段 -- 先溝通,明確原因
3)、表現(xiàn)好的員工 -- 信任激勵(lì),肯定
4)、推行新方法 -- 目標(biāo)激勵(lì),競(jìng)賽
5、附:
馬斯洛需求層次理論(Maslow's hierarchy of needs),亦稱“基本需求層次理論”,是行為科學(xué)的理論之一,由美國心理學(xué)家亞伯拉罕·馬斯洛于1943年在《人類激勵(lì)理論》論文中所提出。
安全、生理需要屬于物質(zhì)性價(jià)值需求;社會(huì)需要、尊重需要、自我實(shí)現(xiàn)屬于精神價(jià)值需求;
解決沖突的法則
- 在不了解對(duì)方動(dòng)機(jī)之前千萬不要表明自己的立場(chǎng)
- 準(zhǔn)確把握自己的需求底線
- 解決沖突的最好辦法是談判
決策的法則
- 首先,以事實(shí)而后數(shù)據(jù)為依據(jù),如果沒有,
- 以嚴(yán)密的邏輯推理為依據(jù),如果沒有,
- 以民主評(píng)議,如果沒有,
- 以最終負(fù)責(zé)人來決斷
獎(jiǎng)懲制度
- 在構(gòu)建獎(jiǎng)勵(lì)制度的同時(shí)不要忘記處罰制度的建設(shè)
- 物質(zhì)與非物質(zhì)的獎(jiǎng)勵(lì)(以非物質(zhì)的獎(jiǎng)勵(lì))
- 側(cè)重獎(jiǎng)勵(lì)行為還是結(jié)果?
表揚(yáng)要及時(shí)(3天為限)、有理有據(jù)、真誠。
表揚(yáng)是最不花錢最辭舊的激勵(lì)手段,表揚(yáng)是為下一個(gè)成功設(shè)立起點(diǎn)。
不要過度的物質(zhì)獎(jiǎng)勵(lì),在這種方式的激勵(lì)下,員工永遠(yuǎn)得不到激勵(lì)。
要注重精神上的獎(jiǎng)勵(lì),只有精神是永存的。
垃圾收集的目的在于清除不再使用的對(duì)象,釋放那些不再使用的對(duì)象所占用的內(nèi)存。GC兩種常用的方法是引用計(jì)數(shù)和對(duì)象引用遍歷,早期的jvm使用引用計(jì)數(shù),現(xiàn)在大多數(shù)jvm采用對(duì)象引用遍歷。
1、對(duì)象引用計(jì)數(shù):
當(dāng)應(yīng)用程序創(chuàng)建引用以及引用超出作用域(范圍)時(shí),jvm必須適當(dāng)增減引用數(shù)。當(dāng)某對(duì)象的引用數(shù)為0時(shí),對(duì)象便可以進(jìn)行垃圾收集。
2、對(duì)象引用遍歷:
(1)、標(biāo)記(marking)對(duì)象:從一組對(duì)象開始,沿著整個(gè)對(duì)象圖上的引用鏈,遞歸確定可到達(dá)的對(duì)象,GC將標(biāo)記這些可到達(dá)的對(duì)象。如果某對(duì)象不能從這些根對(duì)象的一個(gè)(至少一個(gè))到達(dá),則表示它可被收集。
(2)、清除(sweeping)對(duì)象:GC刪除不可到達(dá)的對(duì)象,刪除時(shí),有些GC只是簡(jiǎn)單的掃描堆棧,刪除未標(biāo)記的對(duì)象,并釋放它們的內(nèi)存以生成新的對(duì)象。這種方法的問題在于內(nèi)存會(huì)分成好多小段,而它們不足以用于新的對(duì)象,但是組合起來卻很大。因此,許多gc可以重新組織內(nèi)存中的對(duì)象,并進(jìn)行壓縮(compact),形成可利用的空間。
不一定要將所有的真話講出來,但你講的每一句真話必須是真話。(white
lie)
最近一個(gè)項(xiàng)目主要涉及前端的交互優(yōu)化,由于UED資源不足,所以一起做了一些前端的工作,
由于各瀏覽器的標(biāo)準(zhǔn)不一樣,如要兼容像ie6,7,8及firefox,樣式調(diào)整比較費(fèi)事,現(xiàn)在css相關(guān)
的一些技巧分享一下,希望對(duì)大家有所幫助。
1、什么是css hack.
針對(duì)不同的瀏覽器去寫不同的CSS,讓它能夠同時(shí)兼容不同的瀏覽器,能在不同的瀏覽器中也
能得到我們想要的頁面效果,這種針對(duì)不同的瀏覽器寫不同的CSS code的過程,稱之為CSS hack。
通過下表中的hack
code就可以實(shí)現(xiàn)不同版本ie瀏覽器間的兼容:
hack code
|
ie6
|
ie7
|
firefox
|
_
|
√
|
×
|
×
|
*
|
√
|
√
|
×
|
!import
|
×
|
√
|
√
|
‘_’ : 只有ie6能識(shí)別_,如ie7,8下”width:100px; “的樣式是OK,但ie6不夠?qū)挄r(shí),可以在”width:100px”后面增加一段”_width:105px;” 那么ie7,8不會(huì)解析_width:105px,但ie6會(huì)執(zhí)行。
‘*’ : ie6,7都能識(shí)別*,但firefox不能識(shí)別;
‘!import’ : ie 6不能識(shí)別,ie7和ie8都能識(shí)別;
2、css調(diào)試工具
(1). ie8的調(diào)試工具,ie8下按F12能呼出開發(fā)人員開發(fā)工具,如下圖:

選中圖中的箭頭鼠標(biāo)按鈕,在瀏覽器中選中需要優(yōu)化的HTML對(duì)象,HTML窗口就會(huì)
定位到選中HTML對(duì)象的代碼上(如上圖左),則右窗口中則顯示當(dāng)前對(duì)象的所有樣式,
通過對(duì)右窗口中的樣式調(diào)整,達(dá)到預(yù)期效果后,找到css文件的class,并作相同修
改。通過這個(gè)工具,修改樣式后所見即所得,確定樣式后再修改樣式文件。
(2). Firebug,firefox下可以通過Firebug工具,來定位HTML對(duì)象并調(diào)試該對(duì)象的樣式,如下圖:

posted @
2010-06-29 11:03 josson 閱讀(2194) |
評(píng)論 (0) |
編輯 收藏
事件 |
解說 |
一般事件 |
onclick |
鼠標(biāo)點(diǎn)擊時(shí)觸發(fā)此事件 |
ondblclick |
鼠標(biāo)雙擊時(shí)觸發(fā)此事件 |
onmousedown |
按下鼠標(biāo)時(shí)觸發(fā)此事件 |
onmouseup |
鼠標(biāo)按下后松開鼠標(biāo)時(shí)觸發(fā)此事件 |
onmouseover |
當(dāng)鼠標(biāo)移動(dòng)到某對(duì)象范圍的上方時(shí)觸發(fā)此事件 |
onmousemove |
鼠標(biāo)移動(dòng)時(shí)觸發(fā)此事件 |
onmouseout |
當(dāng)鼠標(biāo)離開某對(duì)象范圍時(shí)觸發(fā)此事件 |
onkeypress |
當(dāng)鍵盤上的某個(gè)鍵被按下并且釋放時(shí)觸發(fā)此事件. |
onkeydown |
當(dāng)鍵盤上某個(gè)按鍵被按下時(shí)觸發(fā)此事件 |
onkeyup |
當(dāng)鍵盤上某個(gè)按鍵被按放開時(shí)觸發(fā)此事件 |
頁面相關(guān)事件 |
onabort |
圖片在下載時(shí)被用戶中斷 |
onbeforeunload |
當(dāng)前頁面的內(nèi)容將要被改變時(shí)觸發(fā)此事件 |
onerror |
出現(xiàn)錯(cuò)誤時(shí)觸發(fā)此事件 |
onload |
頁面內(nèi)容完成時(shí)觸發(fā)此事件 |
onmove |
瀏覽器的窗口被移動(dòng)時(shí)觸發(fā)此事件 |
onresize |
當(dāng)瀏覽器的窗口大小被改變時(shí)觸發(fā)此事件 |
onscroll |
瀏覽器的滾動(dòng)條位置發(fā)生變化時(shí)觸發(fā)此事件 |
onstop |
瀏覽器的停止按鈕被按下時(shí)觸發(fā)此事件或者正在下載的文件被中斷 |
oncontextmenu |
當(dāng)彈出右鍵上下文菜單時(shí)發(fā)生 |
onunload |
當(dāng)前頁面將被改變時(shí)觸發(fā)此事件 |
表單相關(guān)事件 |
onblur |
當(dāng)前元素失去焦點(diǎn)時(shí)觸發(fā)此事件 |
onchange |
當(dāng)前元素失去焦點(diǎn)并且元素的內(nèi)容發(fā)生改變而觸發(fā)此事件 |
onfocus |
當(dāng)某個(gè)元素獲得焦點(diǎn)時(shí)觸發(fā)此事件 |
onreset |
當(dāng)表單中RESET的屬性被激發(fā)時(shí)觸發(fā)此事件 |
onsubmit |
一個(gè)表單被遞交時(shí)觸發(fā)此事件 |
1、讓用戶隨時(shí)了解系統(tǒng)的狀態(tài);
2、系統(tǒng)應(yīng)與真實(shí)世界相符合;
3、給予用戶控制權(quán)和自主權(quán);
4、提倡一致性和標(biāo)準(zhǔn)化;
5、幫助用戶識(shí)別、診斷和修復(fù)錯(cuò)誤;
6、預(yù)防錯(cuò)誤;
7、依賴識(shí)別而不是記憶;
8、強(qiáng)調(diào)使用的靈活性及有效性;
9、最小化設(shè)計(jì);
10、提供幫助及文檔;
1、新建 archetype 項(xiàng)目(模板項(xiàng)目):
mvn archetype:genera -DgroupId=org.simple -DartifactId=simple -DarchetypeArtifactId=maven-archetype-archetype
2、修改主要模板文件:archetype-resources/pom.xml
1)修改 META-INF/maven/archetype.xml 中相關(guān)的 sources
2)安裝此項(xiàng)目:mvn install
3、根據(jù)模板項(xiàng)目創(chuàng)建新項(xiàng)目:
mvn archetype:generate
-DarchetypeGroupId=org.simple\
-DarchetypeArtifactId= simple \
-DarchetypeVersion=1.0-SNAPSHOT
【安裝私有庫】
1、復(fù)制 mylib-1.2.3.jar 到本地代碼庫
2、編寫 mylib-1.2.3.pom 文件:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mylib</groupId>
<artifactId>mylib</artifactId>
<version>1.2.3</version>
</project>
如果有依賴關(guān)系,可以將依賴關(guān)系描述在 pom 中
3、用Ant 來生成 jar 包和 pom 文件的 checksum 文件:
build.xml:
<project default="checksum">
<target name="checksum">
<checksum file="mylib-1.2.3.jar" algorithm="SHA" fileext=".sha1"/>
<checksum file="mylib-1.2.3.pom" algorithm="SHA" fileext=".sha1"/>
</target>
</project>
4、生成 mylib-1.2.3.jar.sha1 和 mylib-1.2.3.pom.sha1 文件
ant build.xml
【使用版本控制】
提交:mvn scm:checkin -Dmessage="Message"
檢出:mvn scm:checkout
更新:mvn scm:update
作為一名開發(fā)者,通常會(huì)忽視系統(tǒng)可用性及用戶體驗(yàn)。但系統(tǒng)的可用性和用戶體驗(yàn)對(duì)于一個(gè)真正優(yōu)秀的Web-based系統(tǒng)卻至關(guān)重要,因此,我們有必要花一些時(shí)間來了解和學(xué)習(xí)一下。
一、相關(guān)的概念:
用戶體驗(yàn),user experience(或稱ux/ue),指用戶訪問或使用一個(gè)產(chǎn)品/服務(wù)時(shí)的全部感受。具有主觀性,不同的用戶本身的知識(shí)、愛好、價(jià)值觀等會(huì)有不同的結(jié)果,因人而異。
可用性,指產(chǎn)品是否易學(xué)、使用是否有效果,以及通用性是否良好等。衡量一個(gè)產(chǎn)品的可用性,可以通過一些具體目標(biāo)來評(píng)判,相對(duì)用戶體驗(yàn)而言,比較客觀。考察產(chǎn)品可用性的目標(biāo)可分為:
1、可行性,指產(chǎn)品使用的效果;
2、有效性,產(chǎn)品使用的工作效率;
3、安全性,指產(chǎn)品能否安全的使用,或稱為容錯(cuò)性;
4、通用性,指產(chǎn)品是否具備良好的通用性;
5、易學(xué)性,指產(chǎn)品的是否容易上手,易操作;
6、易記性,指產(chǎn)品的操作方法簡(jiǎn)單,易記性;
二、開發(fā)人員的特點(diǎn)
作為一名開發(fā)者,通常會(huì)對(duì)目標(biāo)用戶的判斷有較大的偏差,往往高估實(shí)際用戶的操作能力和理解能力,忽視產(chǎn)品的易學(xué)性和易操作性。再者,作為技術(shù)人員,開發(fā)工作者通常重視功能實(shí)現(xiàn),忽視產(chǎn)品界面、視覺外觀,不重視用戶體驗(yàn)。
三、一些案例
1、iPhone的成功
iPhone的成功,產(chǎn)品的可用度及用戶體驗(yàn)有者至關(guān)重要的作用。其產(chǎn)品的很多細(xì)節(jié),都凝聚著apple公司的創(chuàng)新。如3.5吋屏幕上觸摸輸入,比較費(fèi)輕且易出錯(cuò),但iphone在輸入過程中,會(huì)放大選中的字符,便于用戶確認(rèn),同時(shí),作一些輸入校驗(yàn),進(jìn)行容錯(cuò)處理,避免用戶輸入錯(cuò)誤字符引起的麻煩。
2、在線訂票、論壇注冊(cè)
再如個(gè)在線訂票系統(tǒng),用戶興沖沖的跑上來想體驗(yàn)一把,千辛萬苦輸入一大段信息,終于注冊(cè)成功,想下單的時(shí)候,即發(fā)現(xiàn)自己有的銀行卡不支持,試想此時(shí)用戶的心情會(huì)多么的糟糕。試想一下,如果在用戶注冊(cè)前,提示系統(tǒng)當(dāng)前支持的銀行卡的話,用戶可以第一時(shí)間選擇其他的方式來實(shí)現(xiàn)自己的目的。
再談?wù)搲臅?huì)員管理機(jī)制,網(wǎng)上這種案例也很多。用戶費(fèi)了好大的勁完成注冊(cè)后,即告知新注冊(cè)用戶不能立即發(fā)言,很可能這個(gè)用戶就這樣失去了。
所以要做好一個(gè)產(chǎn)品,需要每位項(xiàng)目成員的投入,從用戶角度出度,解決用戶的實(shí)際問題。
Codereivew是開發(fā)團(tuán)隊(duì)中經(jīng)常采用的,為提高代碼質(zhì)量、提高編碼規(guī)范的一種手段。針對(duì)實(shí)際工作組織review過程中的一些想法、見解,作一下總結(jié)。
關(guān)于CodeReview的幾點(diǎn)作用:
1、提高團(tuán)隊(duì)的編碼規(guī)范,培養(yǎng)良好的coding風(fēng)格
旨在提高整個(gè)團(tuán)隊(duì)的編碼規(guī)范程度,統(tǒng)一編碼風(fēng)格。通過每次的codereivew,發(fā)現(xiàn)團(tuán)隊(duì)成員在實(shí)際開發(fā)中的一些細(xì)節(jié)問題,如不良的編碼習(xí)慣、錯(cuò)誤的調(diào)用方式等。通過多次的發(fā)現(xiàn)、解決問題,使大家都養(yǎng)成良好的編碼習(xí)慣。review的內(nèi)容一般包括:
1)、異常、日志的處理;
2)、常量的定義及使用;
3)、字符串處理、BigDecimal.ZERO等;
4)、代碼的封裝,提高重用性;
5)、代碼注釋情況;
6)、javascript文件的抽取情況;
2、檢查業(yè)務(wù)邏輯
對(duì)項(xiàng)目實(shí)現(xiàn)的功能邏輯進(jìn)行一次reivew,結(jié)合眾人發(fā)散思維,檢查業(yè)務(wù)邏輯是否有盲點(diǎn)或錯(cuò)誤。通常需要參與review的成員能夠靜下心來深入地認(rèn)真分析,比較耗費(fèi)時(shí)間。
3、分享和培訓(xùn)
每個(gè)項(xiàng)目的工作安排相對(duì)來說都是比較緊湊的,所以每個(gè)團(tuán)隊(duì)成員在完成自己的開發(fā)任務(wù)完,沒有太多的時(shí)間去了解或熟悉其他成員的功能實(shí)現(xiàn)。但對(duì)于敏捷開發(fā)來說,每個(gè)功能模塊的開發(fā)者并不是固定的,根據(jù)項(xiàng)目需要,很有可能由非原開發(fā)人員來完成增值功能或重構(gòu),所以codereivew是一次不錯(cuò)的培訓(xùn)及分享機(jī)會(huì),特別是對(duì)功能相對(duì)復(fù)雜的需求實(shí)現(xiàn)。可以讓團(tuán)隊(duì)成員了解或熟悉基本的設(shè)計(jì)思想和相關(guān)的類定義,確保在今后接手這一塊工作時(shí),可以更快的上手或找到最到最合適的人去了解更深層的邏輯。
關(guān)于reivew的方式:
1、集體review;
項(xiàng)目成員一起參與codereive,成本比較大,一般一個(gè)項(xiàng)目組織一次。比較適合開發(fā)經(jīng)驗(yàn)分享,以及新功能的實(shí)現(xiàn)介紹,利于其他成員了解、熟悉實(shí)現(xiàn)者的設(shè)計(jì)思路及代碼結(jié)構(gòu),在后續(xù)項(xiàng)目接手這些新功能時(shí),更加從容。
2、TM組織若干開發(fā)經(jīng)驗(yàn)豐富的一起review;
3、分組、交叉review;
具有較好的靈活性,根據(jù)情況隨時(shí)找相關(guān)人員一起對(duì)已實(shí)現(xiàn)的代碼進(jìn)行review,及時(shí)發(fā)現(xiàn)過程中問題并予以修正。比較適合分組\抱團(tuán)開發(fā),以2-3人為單位,對(duì)具體的功能模塊負(fù)責(zé),一起分析、設(shè)計(jì)、編碼,每位成員對(duì)于功能邏輯都比較邏輯,對(duì)業(yè)務(wù)邏輯reivew有比較好的效果。
實(shí)際工作中,根據(jù)實(shí)際情況靈活選擇合適的review方式,不應(yīng)拘于某種形式。review過程,應(yīng)有明確的目的,具有針對(duì)性,而不是停留于表面,避免逐漸成為一種負(fù)擔(dān),流于形式。另外,應(yīng)對(duì)每次review結(jié)果,整理出一份問題列表,進(jìn)行分析和總結(jié),避免相同問題的重復(fù)出現(xiàn)。同時(shí),也應(yīng)按排相關(guān)人員跟進(jìn)并解決問題。總之,通過codereivew這一手段,盡可能的在提交測(cè)試之前去發(fā)現(xiàn)代碼中存在的一些實(shí)際問題,從項(xiàng)目經(jīng)歷中得到成長(zhǎng)。