paulwong

          #

          MyEclipse詳解及MyEclipse7.5的優化

            這篇文章本要講了兩方面的內容
          第一:對MyEclipse的解釋,讓您更加細致準確的了解MyEclipse,
          第二:對
          MyEclipse7.5的優化
          MyEclipse企業級工作平臺(MyEclipse Enterprise Workbench ,簡稱MyEclipse)是對Eclipse IDE的擴展,利用它我們可以在數據庫和J2EE的開發、發布,以及應用程序服務器的整合方面極大的提高工作效率。MyEclipse是功能豐富的J2EE集成開發環境,包括了完備的編碼、調試、測試和發布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。
            在結構上,MyEclipse的特征可以被分為7類:
          1. J2EE模型
          2. WEB開發工具
          3. EJB開發工具
          4. 應用程序服務器的連接器
          5. J2EE項目部署服務
          6. 數據庫服務
          7. MyEclipse整合幫助
            對于以上每一種功能上的類別,在Eclipse中都有相應的功能部件,并通過一系列的插件來實現它們。MyEclipse結構上的這種模塊化,可以讓我們在不影響其他模塊的情況下,對任一模塊進行單獨的擴展和升級。
            簡單而言,MyEclipse是Eclipse的插件,也是一款功能強大的J2EE集成開發環境,支持代碼編寫、配置、測試以及除錯。

          MyEclipse7.5的優化
          1、去除不需要加載的模塊 一個系統20%的功能往往能夠滿足80%的需求,MyEclipse也不例外,我們在大多數時候只需要20%的系統功能,所以可以將一些不使用的模塊禁止 加載啟動。通過Windows - Preferences打開配置窗口,依次選擇左側的General - Startup and Shutdown,這個時候在右側就顯示出了Eclipse啟動時加載的模塊,可以根據自己的實際情況去除一些模塊。
          windows–>perferences–>general–>startup and shutdown
          關掉沒用的啟動項:
          WTP :一個跟myeclipse差不多的東西,主要差別是 WTP 是免費的,如果使用myeclipse,這個可以取消
          Mylyn:組隊任務管理工具,類似于 CVS ,以任務為單位管理項目進度,沒用到的可以取消
          Derby:一種保存成 jar 形式的數據庫,我沒用到,取消一大排以 MyEclipse EASIE 打頭的啟動項:myeclipse 支持的服務器,只選自己用的,其他取消,比如我只選了tomcat6.x


          2、取消MyEclipse在啟動時自動驗證項目配置文件
          默認情況下MyEclipse在啟動的時候會自動驗證每個項目的配置文件,這是一個非常耗時的過程,
          可以在Preferences窗口依次選擇 MyEclipse Enterprise Workbench - Validation,然后在右側的Validator列表中只保留 Manual 項就可以了(Manual全部勾選,Bulid項只留下第一項)。
          如果需要驗證的時候只需要選中文件,然后右鍵選擇 MyEclipse - Run Validation就可以了。
          windows–>perferences–>myeclipse–>validation
          把除了manual 下面的全部點掉,build下只留 classpath dependency Validator
          手工驗證方法: 在要驗證的文件上,單擊鼠標右鍵–>myeclipse–>run validation

          3、去掉拼寫檢查(如果你覺的有用可以不去)
          拼寫檢查會給我們帶來不少的麻煩,我們的方法命名都會是單詞的縮寫,他也會提示有錯,所以最好去掉,沒有多大的用處:
          windows–>perferences–>general–>validation->editors->Text Editors->spelling
          myeclipse 打開 jsp 的默認編輯器不好,會同時打開預覽
          windows–>perferences–>general–>editors->file associations,
          把默認改成 MyEclipse JSP Editor()
          原默認的jsp編輯器是 MyEclipse Visual JSP Designer,顧名思義,此編譯器是jsp可視化編輯器,對于初學者有很多的幫助,但修改此項的默認編輯器其實可以提高啟動速度)


          4、關閉自動更新
          如果是myeclipse7.5:
          (1)關掉maven自動更新: window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven, 關閉所有Download和Update開頭的選項,共四項(去掉前面的勾)
          (2)關閉更新調度:window –> preferences –> General –> Startup and Shutdown –> Automatic Updates Scheduler(去掉前面的勾)
          (3)window –> preferences –>Myeclipse Dashboard,關閉Show……on start

          5、加大JVM的非堆內存
          打開 myeclipse.ini
          -startup
          ../Common\plugins\org.eclipse.equinox.launcher_1.0.101.R34x_v20081125.jar
          --launcher.library
          ../Common\plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.101.R34x_v20080731
          -clean
          -configuration
          configuration
          -vm
          C:\Users\lenovo\AppData\Local\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\client\jvm.dll
          -vmargs
          -Xmx384m
          -XX:MaxPermSize=384m
          -XX:ReservedCodeCacheSize=96m
          以上是我的myeclipse.ini,需要修改是-Xmx,-XX:MaxPermSize,-XX:ReservedCodeCacheSize,
          將這三項的值調大,但并不是越大越好,曾經在相同的條件下做過測試(內存2GB),-Xmx,-XX:MaxPermSize的值為384m時比512m時要快(視具體的計算機而定),
          -Xmx,-XX:MaxPermSize的值設為同樣大小且兩者之和不能超出你的計算機本身的內存大小


          6、window-preferences-MyEclipse Enterprise Workbench-Maven4MyEclipse-Maven,將Maven JDK改為電腦上安裝的JDK,即不使用myeclipse提高的JDK
          登記add按鈕,選擇你的電腦上的JDK即可(注意:不是JRE,我的值為:Java6.014)

          posted @ 2012-01-03 23:38 paulwong 閱讀(280) | 評論 (0)編輯 收藏

          Watij and Maven

          By the way, I did this "by hand" and got it working.

          First, download the waitj bundle and unzip it.

          Then, use maven to manually install each dependency in the lib folder
          like so:
          mvn install:install-file -Dfile=webspec.jar -DartifactId=webspec -
          DgroupId=watij -Dversion=1.3.1 -Dpackaging=jar

          You can also do deploy:deploy-file if you want to put them into a
          central maven repo.

          Of course, you don't need to do this for log4j, junit, slf4j. I did
          it for all the others for speed, registering them under "watij" and
          version 1.3.1

          Got this working in Eclipse, a simple login test case, yipee!

          Here is the POM snippet for my project:

            <dependencies> 
              
          <dependency> 
                
          <groupId>junit</groupId> 
                
          <artifactId>junit</artifactId> 
                
          <version>4.8.2</version> 
                
          <scope>test</scope> 
              
          </dependency> 


              
          <!-- WATIJ --> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>webspec</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>engine-gecko</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>engine-ie</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>engine-webkit</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>jniwrap-native</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>jxbrowser</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>MozillaGlue</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>MozillaInterfaces</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>mshtml</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>runtime</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>tuxpack</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>winpack</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>xulrunner-linux</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>xulrunner-linux64</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>xulrunner-mac</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>watij</groupId> 
                
          <artifactId>xulrunner-windows</artifactId> 
                
          <version>1.3.1</version> 
              
          </dependency> 


              
          <dependency> 
                
          <groupId>log4j</groupId> 
                
          <artifactId>log4j</artifactId> 
                
          <version>1.2.15</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>org.slf4j</groupId> 
                
          <artifactId>slf4j-api</artifactId> 
                
          <version>1.5.8</version> 
              
          </dependency> 
              
          <dependency> 
                
          <groupId>org.slf4j</groupId> 
                
          <artifactId>slf4j-log4j12</artifactId> 
                
          <version>1.5.8</version> 
              
          </dependency> 



          posted @ 2012-01-03 22:08 paulwong 閱讀(823) | 評論 (0)編輯 收藏

          Watij入門

               摘要: Watij介紹 Javadoc API for Watij: http://watij.sourceforge.net/docs/api/index.html?watij/IE.html 第三章 Watij環境設置 3.1 Watij環境要求 l Watij 3.2.1 l JDK 1.5 l Java IDE(本文中使用Eclipse) 3.2 Watij安裝及設置 l 下載軟...  閱讀全文

          posted @ 2012-01-03 22:01 paulwong 閱讀(2359) | 評論 (0)編輯 收藏

          了解CMS(Concurrent Mark-Sweep)垃圾回收器

          1.總體介紹:

          CMS(Concurrent Mark-Sweep)是以犧牲吞吐量為代價來獲得最短回收停頓時間的垃圾回收器。對于要求服務器響應速度的應用上,這種垃圾回收器非常適合。在啟動JVM參數加上-XX:+UseConcMarkSweepGC ,這個參數表示對于老年代的回收采用CMS。CMS采用的基礎算法是:標記—清除。

          2.CMS過程:

          • 初始標記(STW initial mark)
          • 并發標記(Concurrent marking)
          • 并發預清理(Concurrent precleaning)
          • 重新標記(STW remark)
          • 并發清理(Concurrent sweeping)
          • 并發重置(Concurrent reset)
          初始標記 :在這個階段,需要虛擬機停頓正在執行的任務,官方的叫法STW(Stop The Word)。這個過程從垃圾回收的"根對象"開始,只掃描到能夠和"根對象"直接關聯的對象,并作標記。所以這個過程雖然暫停了整個JVM,但是很快就完成了。
          并發標記 :這個階段緊隨初始標記階段,在初始標記的基礎上繼續向下追溯標記。并發標記階段,應用程序的線程和并發標記的線程并發執行,所以用戶不會感受到停頓。
          并發預清理 :并發預清理階段仍然是并發的。在這個階段,虛擬機查找在執行并發標記階段新進入老年代的對象(可能會有一些對象從新生代晉升到老年代,或者有一些對象被分配到老年代)。通過重新掃描,減少下一個階段"重新標記"的工作,因為下一個階段會Stop The World。
          重新標記 :這個階段會暫停虛擬機,收集器線程掃描在CMS堆中剩余的對象。掃描從"跟對象"開始向下追溯,并處理對象關聯。
          并發清理 :清理垃圾對象,這個階段收集器線程和應用程序線程并發執行。
          并發重置 :這個階段,重置CMS收集器的數據結構,等待下一次垃圾回收。  

          CSM執行過程:
           


          3.CMS缺點

          • CMS回收器采用的基礎算法是Mark-Sweep。所有CMS不會整理、壓縮堆空間。這樣就會有一個問題:經過CMS收集的堆會產生空間碎片。 CMS不對堆空間整理壓縮節約了垃圾回收的停頓時間,但也帶來的堆空間的浪費。為了解決堆空間浪費問題,CMS回收器不再采用簡單的指針指向一塊可用堆空間來為下次對象分配使用。而是把一些未分配的空間匯總成一個列表,當JVM分配對象空間的時候,會搜索這個列表找到足夠大的空間來hold住這個對象。
          • 需要更多的CPU資源。從上面的圖可以看到,為了讓應用程序不停頓,CMS線程和應用程序線程并發執行,這樣就需要有更多的CPU,單純靠線程切換是不靠譜的。并且,重新標記階段,為空保證STW快速完成,也要用到更多的甚至所有的CPU資源。當然,多核多CPU也是未來的趨勢!
          • CMS的另一個缺點是它需要更大的堆空間。因為CMS標記階段應用程序的線程還是在執行的,那么就會有堆空間繼續分配的情況,為了保證在CMS回收完堆之前還有空間分配給正在運行的應用程序,必須預留一部分空間。也就是說,CMS不會在老年代滿的時候才開始收集。相反,它會嘗試更早的開始收集,已避免上面提到的情況:在回收完成之前,堆沒有足夠空間分配!默認當老年代使用68%的時候,CMS就開始行動了。 – XX:CMSInitiatingOccupancyFraction =n 來設置這個閥值。
          總得來說,CMS回收器減少了回收的停頓時間,但是降低了堆空間的利用率。

          4.啥時候用CMS

          如果你的應用程序對停頓比較敏感,并且在應用程序運行的時候可以提供更大的內存和更多的CPU(也就是硬件牛逼),那么使用CMS來收集會給你帶來好處。還有,如果在JVM中,有相對較多存活時間較長的對象(老年代比較大)會更適合使用CMS。

          posted @ 2012-01-03 20:31 paulwong 閱讀(750) | 評論 (0)編輯 收藏

          JBOSS遠程代碼執行漏洞

            JBOSS默認配置會有一個后臺漏洞,漏洞發生在jboss.deployment命名空間 中的addURL()函數,該函數可以遠程下載一個war壓縮包并解壓訪問http://www.safe3.com.cn:8080/jmx-console/ 后臺,如下圖   下拉找到如下圖所示     點擊flavor=URL,type=DeploymentScanner進入 在輸入框中寫入war壓縮文件webshell的url地址,如上圖點擊invoke執行界面獲得一個jsp的webshell,如下圖  
          臨時漏洞修補辦法:給jmx-console加上訪問密碼
          1.在 ${jboss.server.home.dir}/deploy下面找到jmx-console.war目錄編輯WEB-INF/web.xml文件 去掉 security-constraint 塊的注釋,使其起作用
          2.編輯WEB-INF/classes/jmx-console-users.propertiesserver/default/conf/props/jmx-console-users.properties (version >=4.0.2)和 WEB-INF/classes/jmx-console-roles.properties 或server/default/conf/props/jmx-console-roles.properties(version >=4.0.2) 添加用戶名密碼
          3.編輯WEB-INF/jboss-web.xml去掉 security-domain 塊的注釋 ,security-domain值的映射文件為 login-config.xml (該文件定義了登錄授權方式)

          posted @ 2011-12-31 11:28 paulwong 閱讀(804) | 評論 (0)編輯 收藏

          多線程筆記

          1、同步
          線程初始化時,可以向線程傳入對象,就存在多條同類型的線程存取同一對象,帶來對象的值不同步的問題。
          JVM方案,采用鎖機制,線程的run代碼里,使用同步關鍵字,同步該對象,由于一個對象只有一個鎖,沒取得鎖的線程,就只能處于等待的狀態了,run方法執行完,則鎖就被釋放了,下一個線程是哪個,不確定,由他們進行競爭鎖,誰取得,誰就可以先上。

          2、wait()
          這是Object的方法,執行這個對象的wait()方法并不是去執行該對象里面的wait方法,而是通知JVM暫停鎖定了該對象的線程的run方法,進入等待狀態,同時也釋放該鎖,使得另外的同類線程有機會執行

          3、synchronized
          在方法前加synchronized,相當于線程的run方法中先同步資源對象,再且僅執行一個該方法。

          4、start()
          調用線程的start方法,并不會立即執行run方法,而是由JVM決定JVM里那一堆線程,哪個先執行,再執行run方法

          posted @ 2011-12-29 01:26 paulwong 閱讀(225) | 評論 (0)編輯 收藏

          聖誕禮物來了!iPhone / iPad iOS 5.0.1 簡單完美 Jailbreak



            這是一份歷盡千辛萬苦,遲來卻依舊讓人無比激動的圣誕禮物。就在大約1個小時之前,Pod 2g的博客終于迎來了更新,標題更是醒目的“A4 release”,等待終于結束了。

            Pod 2g在博客中稱,基于他的研發成果,Chronic Dev Team(帶頭大哥p0sixninja,代表作綠毒)和iPhone Dev Team(帶頭大哥肌肉男,代表作紅雪)經過測試后,于今天正式發布A4設備的iOS 5.0.1完美越獄

            無論是已經不完美越獄的用戶,還是從未使用RedSn0w越獄的用戶,均可使用本次越獄方案進行完美越獄。支持設備:iPhone 3GS/4,iPad1代,iPod touch 3/4。與此同時,Pod 2g建議大家在蘋果發布iOS 5.0.2時不要升級,以免越獄漏洞被封堵。

                  越獄工具下載,請點擊跳轉。

            使用最新版RedSn0w完美越獄iOS 5.0.1教程:

            首先當然是要將手上的設備升級到iOS 5.0.1了。向小白溫馨提示:不要直接連接iTunes之后點擊升級5.0.1,因為這樣一來設備上的部分軟件還會保留,不利于后面的越獄。正確做法:直接通過iTunes安裝蘋果官方的5.0.1固件即可。



          第一步:從我們給出的鏈接地址下載Mac/Windows版RedSn0w 0.9.10b1。解壓后打開redsn0w.exe,點擊Jailbreak。



          第二步:此時要確保需要越獄的設備與電腦連接,點擊Next



          第三步:進入DFU模式。具體操作方法RedSn0w已經給出:先按電源鍵三秒左右,等待跳轉之后再按下Home鍵,此時不要放開電源鍵,再次跳轉之后放開電源鍵,Home鍵保持不動。



          第四步:最后放開Home鍵之后就是驗證設備和準備越獄的過程了,需要花上一點時間。




          第五步:驗證完成后,出彈出以下圖框,第一個打勾選項為安裝Cydia,此時點擊Next。這時候RedSn0w會上傳RAM Disk和Kernel,最后就是進行越獄了,整個過程估計耗時5分鐘左右。




          第六步:此時iPod touch 4(iOS 5.0.1)已完美越獄

            iOS 5.0.1完美越獄方法2:

            以上是使用最新版本的RedSn0w v0.9.10b1進行的完美越獄。假如你的設備之前已經升級iOS 5.0.1,并且已通過RedSn0w進行過不完美越獄,那么這里還有一種來自綠毒團隊Chronic Dev Team的方法,支持iPhone 3GS/4, iPhone 4 CDMA, iPad 1, iPod touch 3/4。這種方法更為簡單直接:



          第一步:進入Cydia,搜索到Corona Untether 5.0.1

          第二步:點擊安裝,Cydia會幫你完成接下來的工作

          沒有第三步了。

            完美越獄完成,你現在已經可以安全重啟這些設備了。

            Cydia成功出現在iOS 5.0.1系統當中,還只是第一步而已。各位在越獄之后,先不要急著進入Cydia,因為Cydia在IOS5.0+的固件下,添加源會閃退,以下是處理方法:

            點擊設備中的設置→通用→多語言環境→語言中,選擇English(英文),進入英文環境。這時候Cydia不會出現閃退,所以可以在這個時候添加源。

            加入源的步驟如下:

          第一步:點擊下方Manage(管理),進入Source(軟件源)



          第二步:點擊右上方Edit(編輯)



          第三步:點擊左上方Add(加入)



          第四步:彈入方框后輸入apt.weiphone.com(威鋒源)后,點擊Add Source(加入軟件源)



          第五步:如果彈出一個警告窗口,請無視它,點擊Add Anyway(仍然加入),之后就會進入源的安裝中了。



          第六步:安裝完成之后,點擊右下的Search(搜索),輸入afc2,就會出現一個叫做“afc2服務補丁”的文件。



          第七步:點擊進入“afc2服務補丁”的文件之后,點擊右上的Install(安裝),跳轉頁面之后在點擊右上角的Confirm,之后就是安裝文件了。



          第八步:到了這步,大家可以下載iFunBox了(iFunBox下載地址請點擊跳轉)。下載完成后,打開iFunBox,選擇路徑文件系統/var/mobile/Library中找到Keyboard文件夾,并將其拖出桌面。



          第九步:然后再選擇路徑文件系統/var/root/Library,將桌面的Keyboard文件夾拖入其中。



             OK了,完成這步之后,就解決了你在簡體中文環境下,iOS5.0+系統使用Cydia崩潰的情況。之后就能在切換回簡體中文了。最后可不要忘了安裝 AppSync for iOS 5.0,只要在搜索中搜索就能看見,點擊安裝之后就能安裝破解過后的后綴名為ipa的軟件了。



            最后,我們仍然要再次重申的是,本次越獄僅支持iOS 5.0.1。大神的博客里寫得很清楚了,5.0的完美越獄目前還在測試之中,相信不久之后就會放出。另外,兩個版本的越獄都不支持iPhone 4S和iPad 2,希望大家注意了。

          posted @ 2011-12-28 00:02 paulwong 閱讀(396) | 評論 (0)編輯 收藏

          Java多線程編程總結

          Java線程:概念與原理
          Java線程:創建與啟動
          Java線程:線程棧模型與線程的變量
          Java線程:線程狀態的轉換
          Java線程:線程的同步與鎖
          Java線程:線程的交互
          Java線程:線程的調度-休眠
          Java線程:線程的調度-優先級
          Java線程:線程的調度-讓步
          Java線程:線程的調度-合并
          Java線程:線程的調度-守護線程
          Java線程:線程的同步-同步方法
          Java線程:線程的同步-同步塊
          Java線程:并發協作-生產者消費者模型
          Java線程:并發協作-死鎖
          Java線程:volatile關鍵字
          Java線程:新特征-線程池
          Java線程:新特征-有返回值的線程
          Java線程:新特征-鎖(上)
          Java線程:新特征-鎖(下)
          Java線程:新特征-信號量
          Java線程:新特征-阻塞隊列
          Java線程:新特征-阻塞棧
          Java線程:新特征-條件變量
          Java線程:新特征-原子量
          Java線程:新特征-障礙器
          Java線程:大總結

          posted @ 2011-12-21 23:13 paulwong 閱讀(291) | 評論 (0)編輯 收藏

          工期估算那點事

          周末聽了項目管理的課程,很有感觸,有很多記憶深刻的點,比如不要揣摩要提問,要先管理后產品,勝者先勝而后戰,敗者先戰而求勝。然而,讓我印象最深的是估算工時這點事,不禁讓我想起自己的經歷來。
          最開始剛參加工作時是在一家翻譯公司做它內部的協同系統,兩個程序員,老大和我,老大是30歲的老程序員,安排工作很隨性,每天早上,點點系統,然后想想接下來要做什么,然后,叫上我,說,把這棵樹實現一下吧,然后,再說,需要多長時間?我想一會兒,不就是一棵樹嗎,說,1小時。老大點點頭,說,好,1天。再一天,老大又交給我一項任務,這次任務量大一些,要實現一個完整的模塊,我同樣是想了想,說3天,老大點點頭,說,好,9天。老大總是這樣,只要是我作出的估算,他總要乘以3,對此我是不以為然的,這也太保守了。不過好消息是,一年下來我們從未加過班,幾乎所有的工作都按計劃完成了,日子過得輕松而又悠閑,經常有些時間寫點自己喜歡的其他代碼,一點也不像程序員。

          第二份工作就是IT公司了,做企業應用開發。老大使用干特圖來進行工期管理,項目開始之前,老大已經分好大的模塊了,這些模塊比我第一家公司所謂的模塊要大的多,需要以周來估算。這天,老大叫上我,問,這個門戶的模塊需要幾周完成?我想一想,門戶以前沒有接觸過,學習需要一周,開發需要兩周,再留一周測試,說,四周。老大點點頭,說,好,我再給你加一周學習時間,于是用鼠標在project上拖出一條長長的藍線來。幾個程序員每個都拖出一條藍線來,三個程序員,八個模塊,藍線短的就再估算一個模塊,這樣,一條一條藍線拼起來,最長的那條就成了關鍵路徑,也決定了交付日期,交付日期定在五個月以后。于是就開始開發,那時年輕,無知者無畏,還是單身,加班就不是問題,三個人周六都在公司,吭嗤吭嗤,還真在五個月后給吭嗤完了。于是開始請測試妹妹測試,這一測試問題就來了,很多模塊根本就是不可用,只是能夠增刪改查,很多功能點都沒有考慮到,易用性就更別談了,也難怪,系統設計、實現、測試都被一個只會寫代碼的程序員包了,既當運動員又當裁判員,能想清楚才怪,于是繼續吭嗤,這不吭嗤還好,一吭嗤不得了,又吭嗤出五個月來,再看看jira,幾百個bug,每個人都很絕望,老大手一揮,說,哪個軟件沒有bug,停止開發,修復最重要的bug,然后發布。

          第二個項目做完,開始反思,為什么延期這么長估算這么不準,想了很久,覺得是因為估算的粒度太大,時間超過一周,對估算的開發量實際就失去計算了,只剩下一個大概的印象,而為了不成為關鍵路徑不在老大面前丟臉,拍胸脯的情況也發生了,沒事,加幾個班就搞定了。同時,缺少系統需求說明,這樣,在一個錯誤時間內完成一個不可能完成的任務,質量可想而知,趕進度獻禮工程不僅政府在做,程序員同樣在做。

          這樣,到了第三年,自己開始負責一個項目了,吸取了教訓,開發估算時,估算的工作量不能超過1周,一旦超過就需要繼續分解再進行估算。估算下來,這個項目需要四個月完成,又想起第一個老大的乘三法則,心里顫了一下,難道需要12個月?不能這樣,這樣這個項目就被取消了。自己帶了僥幸的心理,團隊的成員都很強,事后也證明這個團隊的個人能力都很強,因為有兩個人現在在知名外企,一個在淘寶,一個在騰訊,小公司組成這樣豪華的陣容是很難得的,唯一不幸的是,我是那個項目經理。我把交付時間定在了四個月之后,開發進度整體還是順利的,稍微有延期,每周需要延一到兩天,這樣,我把時間又延長了一個月。天知道,意外發生了,因為我的一句批評,一個成員離職了!我痛哭的發現,項目又要延一個月了,于是,接下來,我就流涕了,六個月時間,公司沒有那么多錢投入了!我開始加班,要求其他人也加一些班,意外接著發生,有人生病了,有人有急事要請假了,到最后,終于發現,按估算完成是完全不可能的。最后,項目就被取消了,悲催的項目經理。

          繼續反思,為什么估算不準,這次我自以為原因很清楚,就是沒有考慮項目風險,沒有考慮到人會離職,沒有考慮到人會請假,沒有考慮到人會生病,甚至,沒有考慮到人一天工作的產出不是八小時。我太樂觀了。我再一次想起來我的第一個老大。

          新的公司,新的估算方式,不再一個人估算而是一伙人估算,特性不估算,故事點再估算,沒有需求不估算,不一次性估算,迭代估算。這次似乎沒有問題了,但客戶總是需要一個大的時間點的,于是每個迭代都會排定故事優先級,確保交付前交付的是最有價值的,此外,還有專職的業務分析和漂亮的測試美眉,一切看起來都很好。新公司第一個項目也確實輕松的,但第三個和第四個卻都失敗了,第三個項目在遇到一個很難解決的性能問題時陷入了一片混亂當中,迭代經理甚至自己都失去對整個項目的可視化了,她不知道項目上線究竟需要滿足什么條件,于是項目在一次次的下周二上線的空頭承諾中成了整個公司的笑柄。幸福的項目總是相似,不幸的項目各有各的不幸。第四個項目在一次項目中期的架構重寫中崩潰了,重寫耗去了團隊太多的時間,而由于對未知領域知識的不正確估算再次令項目雪上加霜,而更加致命的是,項目目標直到最后一刻也沒有發生變化,依舊是要在六個月后上線,于是,程序員們就內存溢出了。

          樂觀、管理混亂、領域知識不熟,這些都導致了項目延期,工時等于工期嗎?不等于,工期永遠是假的,工時估計的準確,混亂的管理同樣會毀掉它。更嚴重的不是項目延期,而是項目本來就是老板拍腦袋的結果,想想某個項目,如果不說我們能快速交付就根本得不到它,而得到它后怎么辦,那只能拜春哥了!

          posted @ 2011-12-12 01:10 paulwong 閱讀(429) | 評論 (1)編輯 收藏

          配置負載均衡 配置集群

               摘要: 所需軟件   Apache :apache_2.0.63 1 個 【apache_2.0.63-win32-x86-no_ssl.msi】   Tomcat: apache-tomcat-5.5.23 (zip版) 2個   mod_jk:: mod_jk-apache-2.0.55.so 1個   部署說明   在同一臺機器上部署,即充當Apache負載服務器,又安裝兩個Tomcat Web服務...  閱讀全文

          posted @ 2011-12-09 00:45 paulwong 閱讀(346) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 92 93 94 95 96 97 98 99 100 下一頁 Last 
          主站蜘蛛池模板: 辽阳市| 恩施市| 保靖县| 繁昌县| 汾阳市| 阜新市| 汽车| 厦门市| 广水市| 大理市| 镶黄旗| 密山市| 女性| 交城县| 鄂伦春自治旗| 九龙县| 长葛市| 蓬莱市| 什邡市| 吉安市| 鱼台县| 陆川县| 峨眉山市| 富顺县| 和林格尔县| 灵武市| 蓝山县| 信丰县| 瑞丽市| 嘉鱼县| 榆中县| 北宁市| 全椒县| 大英县| 色达县| 怀化市| 宜州市| 衡南县| 桐梓县| 那坡县| 都江堰市|