軟件是對質(zhì)量的不懈追求

          #

          struts2 親密接觸 json(json result type)

          最近使用jquery,ajax調(diào)用后臺服務(wù)非常需要一個json返回類型,網(wǎng)上只有一個可用的插件,叫jsonplugin 。但是測試了一下,兩個版本居然都有錯誤,而且通過文檔知道,它的使用還是相對復(fù)雜的,需要配置哪個對象需要轉(zhuǎn)換,那些對象不需要。不難想象,通常我們只需要將一個對象轉(zhuǎn)換成json格式,如果數(shù)據(jù)多,大不了都塞到一個對象里。
          這樣說起來,倒不如棄配置,轉(zhuǎn)而采用規(guī)則,規(guī)定action中如果需要為ajax提供服務(wù)器端服務(wù),必須定義一個名字叫json的成員類,類型當(dāng)然是最通用的Object。然后實現(xiàn)一個Result,在value stack中,找到名字叫json的對象,把它序列化成json串寫回客戶端就ok了。

            注意:如果json的實際類型是String,這個String必須符合json語法規(guī)范。Map List之類的就無所謂,直接用就是了

            Result代碼如下:

          import com.opensymphony.xwork2.ActionContext;
          import com.opensymphony.xwork2.ActionInvocation;
          import com.opensymphony.xwork2.Result;
          import com.opensymphony.xwork2.util.ValueStack;
          import net.sf.json.JSONObject;
          import org.apache.commons.logging.Log;
          import org.apache.commons.logging.LogFactory;
          import org.apache.struts2.StrutsStatics;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;

          public class JSONResult implements Result {
             
              private static final Log log = LogFactory.getLog(JSONResult.class);

              
          public void execute(ActionInvocation invocation) throws Exception {
                  ActionContext actionContext 
          = invocation.getInvocationContext();
                 
                  HttpServletResponse response 
          = (HttpServletResponse) actionContext
                          .get(StrutsStatics.HTTP_RESPONSE);

                  
          try {
                      String json;
                      Object jsonObject;

                      
          // generate JSON
                     
                      ValueStack stack 
          = invocation.getStack();
                      jsonObject 
          = stack.findValue("json");
                      json 
          = JSONObject.fromObject(jsonObject).toString();
                     
                      log.debug(json);
                     
                      response.setContentType(
          "text/xml;charset=utf-8");
                      response.getWriter().write(json);

                  } 
          catch (IOException exception) {
                      log.error(exception.getMessage(), exception);
                      
          throw exception;
                  }
              }

          }
          struts配置如下:
            <result-types>
             
          <result-type name="json" class="JSONResult"/>
            
          </result-types>

          <action  >
              
          <result name="ajax" type="json" />
          </action>

          action部分代碼:
             

              
          private Object json;
              
          public Object getJson() {
                  
          return json;
              }

              
          public void setJson(Object json) {
                  
          this.json = json;
              }

          posted @ 2009-05-14 15:20 BlakeSu 閱讀(5110) | 評論 (2)編輯 收藏

          中國軟件產(chǎn)業(yè)問題何在(轉(zhuǎn))

          中國的軟件產(chǎn)業(yè)正陷入低迷,更可怕的是,認(rèn)識到危機所在的卻寥寥無幾!

          如果說數(shù)年前以求伯君先生為代表的金山公司能推出一些激動人心的軟件產(chǎn)品的話,近年來我們則不得不正視中國軟件產(chǎn)業(yè)每況愈下的現(xiàn)實。

          表面看來是這樣:軟件從業(yè)人員越來越多,動則上萬人的公司,數(shù)百畝的產(chǎn)業(yè)園,產(chǎn)值的增長卻遠(yuǎn)遠(yuǎn)落在投入增長的后面,換言之,中國軟件產(chǎn)業(yè)利潤率正逐年 下降,外包公司越來越多。由此帶來一系列問題——"軟件開發(fā)"工作變得愈加簡化,從業(yè)人員待遇每況愈下,整體素質(zhì)無法得到提升,企業(yè)勉力維持,只好擴(kuò)大規(guī) 模,降低成本,以吸引更多的外包服務(wù),而把行業(yè)拖入惡性循環(huán)。

          由此即便看到表面上的浮華——如東軟集團(tuán)的整體上市——但不得不為其發(fā)展方向而感到擔(dān)憂。

          香港人本管理機構(gòu)軟件事業(yè)部高級項目經(jīng)理鄭光輝先生(Raymond)與記者談到中國的軟件事業(yè)時,無不擔(dān)憂的說,有如過去金山wps office出來對抗外資巨頭(microsoft)的情況已經(jīng)不復(fù)存在。所有的中國企業(yè)表現(xiàn)出垂死掙扎的狀況,雖然不乏規(guī)模相對大一些如用友軟件,東軟 集團(tuán),等等。但也無一不是靠1. 模仿國外產(chǎn)品;2. 通過銷售人員抓客戶關(guān)系;來達(dá)成業(yè)績,而如金山軟件,盈利重點已轉(zhuǎn)移至在線游戲產(chǎn)品上。

          鄭先生談到,中國的行業(yè)性壟斷造成進(jìn)入壁壘,本土巨頭公司集中在政策性行業(yè),無法為更具有競爭力的民營軟件企業(yè)提供生存土壤,反而造就了如南瑞、寶信等等衍生軟件公司。(寶信隸屬寶鋼集團(tuán),南瑞隸屬國家電網(wǎng),等)。

          而反觀Larry Erison的Oracle 公司,Tom Siebel的Siebel公司,都在極短的時間內(nèi)造就出偉大公司,并將之理念深深植根于客戶,產(chǎn)品傳播于全世界,所依賴于培育同時引導(dǎo)客戶需求。

          鄭先生神色凝重的談到,人本管理機構(gòu)軟件事業(yè)本部從香港轉(zhuǎn)移到廣州,并同時在北京和上海設(shè)立辦事處,一方面看到的是中國軟件產(chǎn)業(yè)的問題,另一方面更是 希望藉由長期以來對美歐軟件企業(yè)研究的經(jīng)驗和知識積累,幫助內(nèi)地軟件企業(yè)從根本上解決發(fā)展問題。同時也希望內(nèi)地企業(yè)不要單純的追求短期利潤,當(dāng)務(wù)之急更要 協(xié)力將中國軟件產(chǎn)業(yè)發(fā)展環(huán)境建設(shè)起來。

          posted @ 2009-04-21 11:32 BlakeSu 閱讀(173) | 評論 (0)編輯 收藏

          莫要太信任數(shù)據(jù)庫,你會失望的

              數(shù)據(jù)庫啊,數(shù)據(jù)庫!
              雖然現(xiàn)在應(yīng)用架構(gòu)強調(diào)業(yè)務(wù)邏輯不依賴數(shù)據(jù)庫,僅把數(shù)據(jù)庫作為信息存儲的手段。但是國內(nèi)的情況似乎還是挺以數(shù)據(jù)庫為中心的。數(shù)據(jù)庫雖然存在了多年,也算成熟了,但是很多書上其實對如何有效使用數(shù)據(jù)庫的強調(diào)很不夠。

              尤其是對java而言,JDBC是java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn),也就是獨立于數(shù)據(jù)庫的。雖然如此,數(shù)據(jù)庫廠商大概不會為了jdbc去改自己的數(shù)據(jù)庫,要知道,數(shù)據(jù)庫肯定是要提供多種接口方式的,比如C。數(shù)據(jù)庫一改,這些接口很可能都要改,這就不好了,還可能因為接口做不到向下兼容得罪現(xiàn)有用戶。于是,成本比較低的做法,就變成了在jdbc層做手腳,也就是通常所說的“忽悠”。
              有些數(shù)據(jù)庫其實不支持預(yù)編譯sql的,但是仍然支持PrepareStatement,這里就會引起使用者的困惑,不清楚它內(nèi)部到底是怎么實現(xiàn)的。 還有些數(shù)據(jù)庫其實不支持jdbc所提供的那些事務(wù)隔離級別,或者跟jdbc規(guī)定的那些沒有嚴(yán)格對應(yīng)關(guān)系。這就更令人惱火了,經(jīng)常有人抱怨設(shè)置隔離級別沒有效果,大概就是這個原因所致。

              數(shù)據(jù)庫還有一個很少被提及的問題,那就是并發(fā)問題中的第二類丟失更新。比如:兩個客戶端A、B對同一條訂單數(shù)據(jù)進(jìn)行操作。事件序列如下:
              A:打開訂單
              B:打開訂單
              A:保存修改
              B:保存修改

             aha!A的修改就很可能丟失了。不要抱怨數(shù)據(jù)庫怎么連這個都解決不了,其實并不是解決不了,而是沒有什么通用的方案,倒不如把它交給開發(fā)人員自行選擇方案的好。開發(fā)人員可以選擇樂觀鎖和悲觀鎖,一切都要根據(jù)業(yè)務(wù)情況來。
             問題是,資料上邊很少提及會有這樣的情況發(fā)生,開發(fā)人員也就不曾處理過這個問題。根據(jù)我的理解,我覺得存在update操作的表都要進(jìn)行這個處理,否則數(shù)據(jù)的正確性就無從保證。

          posted @ 2009-04-10 11:07 BlakeSu 閱讀(137) | 評論 (0)編輯 收藏

          富國強軟(二):不可或缺的標(biāo)準(zhǔn)化

             我國從來都是一個缺乏標(biāo)準(zhǔn)化的國家,從古至今都是如此,我們似乎也不太喜歡被標(biāo)準(zhǔn)化束縛,反而更喜歡某種自在。如今更是愈演愈烈,每每有重大改革,中央都是鼓勵地方積極探索,探索的不好下臺,探索的好推開??梢?,可國內(nèi)當(dāng)個官也不容易啊,要時時處處當(dāng)領(lǐng)導(dǎo)的馬前卒,嗚呼。。。
              但是在軟件行業(yè),不尊重標(biāo)準(zhǔn)的結(jié)果卻是可怕的,甚至談不上自在,簡直就是折磨,讓人感覺棄之而后快,然而重新來過的好像也好不到哪里去。我曾經(jīng)就因為實在無法忍受系統(tǒng)的混亂而憤然離去,不知道有多少人有像我一樣的經(jīng)歷。
             標(biāo)準(zhǔn)的代碼實在是功德無量,甚至對技術(shù)人員形成一種吸引力,更沒有人忍心破壞這種和諧之美,哦。。代碼之美。。
              以下是我在做國外項目時他們的環(huán)境配置,他的整個開發(fā)環(huán)境是打包成安裝程序的,裝上以后所有的東西都已經(jīng)配置好了,你所要做的就是checkout代碼,編譯就好了。firefox也是這樣做的,為什么呢,無他,就是編譯程序太復(fù)雜了,復(fù)雜到需要專人維護(hù)的程度,于是大多數(shù)人實際是不需要懂的,用就是了。國內(nèi)還沒見過做到這種程度的。(以下是自己翻譯的,有蹩腳之處,您就湊合看了)

          應(yīng)用服務(wù)器配置

          某些配置(如:連接池配置)是依賴于應(yīng)用服務(wù)器的。為了解決這種狀況,build.xml文件使用屬性來區(qū)分不同的服務(wù)器。
          為了表明你在使用JBoss服務(wù)器,你必須定義deploy.config屬性,值為jboss.
                在左側(cè)面板,選擇"Ant/Runtime"(eclipse的Preferences窗口)
          選擇"Properties"選項
                點擊"Add Property..."按鈕并定義"deploy.config"屬性,值為"jboss"
                點擊"Apply"按鈕

          為了部署一個ear文件到應(yīng)用服務(wù)器目錄,必須定義屬性"dir.deploy"來制定正確的目錄。
              
          在左側(cè)面板,學(xué)責(zé)"Ant/Runtime"(eclipse的Preferences窗口)
          選擇"Properties"選項
          點擊"Add Property..."按鈕并定義"dir.config"屬性,值是應(yīng)用服務(wù)器的目錄。
          例如:“D:\apps\jboss-4.0.0\server\default\deploy”.
          點擊"Apply"按鈕

          代碼風(fēng)格
          本司代碼規(guī)則要求所有參數(shù)都以"p"為前綴。如下設(shè)置可在代碼生成時使用此規(guī)則:
          左側(cè)面板,選擇 "Java/Code Style"(eclipse的Preferences窗口)
          在"variable list"列選擇 "Parameters".
          在"Prefix list"列輸入"p".
          點擊"Apply"按鈕
           
          代碼格式化
          本司有標(biāo)準(zhǔn)的代碼格式化規(guī)則。這些規(guī)則保存在"…\apps\config\codeformatter-rules.xml"文件中。遵循以下
          步驟可導(dǎo)入規(guī)則:
               左側(cè)面板,選擇 "Java/Code Style/Code formatter",
          這里有兩個"Import …"按鈕,點擊頁面右上的一個,選擇"codeformatter-rules.xml"
          點擊"Apply"按鈕

          代碼模板
          本司有標(biāo)準(zhǔn)的代碼模板。這些模板存放在文件 "\apps\config\codetemplates.xml",。遵循以下
          步驟可導(dǎo)入模板:
          左側(cè)面板,選擇 "Java/Code Style/Code Template",
          這里有兩個"Import …"按鈕,點擊頁面右上的一個,選擇"codetemplates.xml"
          點擊"Apply"按鈕 

          組織imports
          本司在文件“…\apps\config\importorder中有標(biāo)準(zhǔn)的import順序,導(dǎo)入步驟如下:

                 左側(cè)面板,選擇 “Java/Code Style/Organize Imports”,
                 這里有兩個"Import …"按鈕,點擊頁面中間右側(cè)一個,選擇"importorder"文件,
                點擊"Apply"按鈕    

          編輯模板
          本司有標(biāo)準(zhǔn)的模板,位于文件"…\apps\config\editor-templates.xml",導(dǎo)入步驟如下:

                 左側(cè)面板,選擇 "Java/Editor/Templates",
          這里有兩個"Import …"按鈕,點擊頁面中間右側(cè)一個,選擇"editor-templates.xml"文件,
                 點擊"Apply"按鈕
                
          Checkstyle
          本司標(biāo)準(zhǔn)化了Checkstyle的使用。配置保存在文件 "…\apps\config\checkstyle-rules.xml" . 導(dǎo)入步驟如下:

                 左側(cè)面板,選擇 "Checkstyle",
                 點擊 "New …" 按鈕.
                 類型下拉列表中,選擇"External Configuration".
                 在name文本框輸入"My Checks",
                 選擇文件"checkstyle-rules.xml".
             
          拼寫檢查配置
              在Eclipse中使用拼寫檢查是可能的。步驟如下:
                
                 左側(cè)面板,選擇 "general/Editors/Text Editors/Spelling",
                 選中 "enable spell checking" 復(fù)選框
                 "User defined dictionary:"中輸入D:\apps\config\my.dic
                  選中 "Make dictionary available to content assist"
                 點擊"Apply"按鈕  
                
                
                





          posted @ 2008-11-10 22:05 BlakeSu 閱讀(254) | 評論 (0)編輯 收藏

          中國架構(gòu)師,名符其實有多少?(轉(zhuǎn))

          原文看這里:http://blog.chinaitlab.com/html/65/1041665-149664.html

          架構(gòu)師,聽起來一個響當(dāng)當(dāng)?shù)念^銜,但是你能分得清它跟項目經(jīng)理,產(chǎn)品經(jīng)理,項目負(fù)責(zé)人,CTO等頭銜的細(xì)微區(qū)別嗎

          參加什么技術(shù)活動,一看人家名片亮出來,卡!系統(tǒng)架構(gòu)師!自己都不好意思回贈名片了,因為自己才印著一軟件工程師!以后一定換成個“高級軟件工程師”再說。要說架構(gòu)師這詞也是翻譯過來的,英文是Architect,那么中國的架構(gòu)師和國外的架構(gòu)師相比到底怎么樣呢?不妨聽聽我朋友的說法吧:

          “系統(tǒng)架構(gòu)師不是科學(xué)家。科學(xué)家的工作可以說是非常難得的工作(技術(shù)含量高),而架構(gòu)師的工作主要是非常龐雜,在龐雜的技術(shù)要求中尋求最優(yōu)雅,簡潔的解決方案。”

          “架構(gòu)師的面臨的問題通常有下面幾個特征:1)要解決的問題非常龐雜2)技術(shù)實踐的途徑非常龐雜3)系統(tǒng)環(huán)境與約束比較復(fù)雜。在這一系列凌亂又龐大的要求中,有能力分辨問題的本質(zhì),并能給出大家認(rèn)可的——簡潔且具有伸縮性的解決方案的人通常被稱為架構(gòu)師。”

          “現(xiàn)在Web應(yīng)用服務(wù)器這一塊比較火,涉及的技術(shù)內(nèi)容非常多,所以這個領(lǐng)域頂著系統(tǒng)架構(gòu)師頭銜的人特別多。”

          “不能說國內(nèi)的架構(gòu)師的總體素質(zhì)不如國外。關(guān)鍵是國內(nèi)公司所面臨的問題與國外公司面臨的問題差距太大。你不能指望在小河里面游泳的人去穿越英吉利海峽。”

          “不能說國內(nèi)架構(gòu)師的能力與‘架構(gòu)師’這個頭銜名不符實。其實是名符其實的,只不過符合的是國內(nèi)現(xiàn)狀的‘實’。”

          “架構(gòu)師的職責(zé)是提出最佳實踐的解決方案。所以有時候需要驗證方案的可實踐性。只不過大多時候,在熟悉的領(lǐng)域,‘驗證方案的可實踐性’通過對方案的論述足以證明。”

          “架構(gòu)師的另外一個職責(zé)是保證‘解決方案’的實踐過程不走樣。這個需要架構(gòu)師在團(tuán)隊工作中提供協(xié)作。至于協(xié)作方式,未必需要編程。但是不排除出現(xiàn)較困難的問題時,動手編程解決的情況。”

          “從某種意義上說,最下層的架構(gòu)師和以前的技術(shù)負(fù)責(zé)人差不太多?;蛘吡硪环N情況,或者架構(gòu)師的地位相當(dāng)高,下面的是技術(shù)負(fù)責(zé)人。技術(shù)負(fù)責(zé)人需要負(fù)責(zé)技術(shù)工作的質(zhì)量因素,需要參與細(xì)節(jié);架構(gòu)師更多負(fù)責(zé)方案質(zhì)量,很多時候不需要過多的參與細(xì)節(jié)。”

          “架構(gòu)師也要從技術(shù)負(fù)責(zé)人過渡而來,不可能不參與細(xì)節(jié)直接成為架構(gòu)師。沒有足夠的細(xì)節(jié)工作積累,不能保證方案的可實踐度。提解決方案時就容易出現(xiàn)空中樓閣,看著好看,實施起來特別困難。”

          “說白了,架構(gòu)師和技術(shù)負(fù)責(zé)人到底有多大。更多取決于公司的安排,不取決于這個架構(gòu)師和技術(shù)負(fù)責(zé)人的Title。”

          “CTO是和技術(shù)有關(guān)系的最高負(fù)責(zé)人,要承擔(dān)與公司技術(shù)相關(guān)問題的行政責(zé)任。”

          總而言之,朋友把這個“架構(gòu)師”的定義是剖析得淋漓盡致了,就看大家如何對號入座了。


          posted @ 2008-10-21 12:19 BlakeSu 閱讀(228) | 評論 (0)編輯 收藏

          富國強軟(一):開篇

           對于國內(nèi)的軟件水平,不知各位看官如何看待。這樣吧,大家不妨看一下自己電腦上用了什么國產(chǎn)軟件。
           我電腦上只有QQ、迅雷、360安全衛(wèi)士、招商證券全能版而已。
           
           操作系統(tǒng)是微軟的,oracle,mysql,eclipse,office等等全都是進(jìn)口的。
           
           整體感覺是北美、歐洲最強,這兩個地區(qū)差別不大,甚至中東地區(qū)也偶有佳作,但諾大一個中國為什么就
           沒有一款拿得出手的軟件呢?國內(nèi)的軟件到底怎么了?
           
           究其原因,我想每個人都能說出一堆,但可能并不清楚哪個是決定性的,哪個是次要的。
           
           本博客試圖尋找到病根,并希望能開出一劑良藥。

          posted @ 2008-10-09 15:50 BlakeSu 閱讀(145) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共12頁: First 上一頁 4 5 6 7 8 9 10 11 12 
          主站蜘蛛池模板: 通山县| 延川县| 陆良县| 饶平县| 通河县| 来凤县| 潼南县| 延川县| 普兰县| 山丹县| 阿图什市| 兰溪市| 五莲县| 蒙阴县| 九台市| 四平市| 环江| 甘德县| 万宁市| 平和县| 景宁| 永川市| 东台市| 稻城县| 乐清市| 女性| 株洲县| 柞水县| 木兰县| 秭归县| 华池县| 乾安县| 申扎县| 平泉县| 大丰市| 五大连池市| 来凤县| 资阳市| 县级市| 漾濞| 通海县|