todayx.org
          todayx.org
          posts - 39,comments - 60,trackbacks - 0
               摘要: JDBC模板類 概述        Spring JDBC抽象框架core包提供了JDBC模板類,其中JdbcTemplate是core包的核心類,所以其他模板類都是基于它封裝完成的,JDBC模板類是第一種工作模式。          JdbcTemplate類通過(guò)模板...  閱讀全文
          posted @ 2012-02-26 09:39 todayx.org 閱讀(2723) | 評(píng)論 (0)編輯 收藏

          在軟件這個(gè)行業(yè)里有些規(guī)則是很有殺傷力的,比如很有名的摩爾定律。

          總結(jié)出這些規(guī)則的意義在于可以大致的照明方向,免得努力來(lái)努力去卻走到了陰溝里。

          現(xiàn)實(shí)中種種利益紛爭(zhēng)、觀點(diǎn)之爭(zhēng)看似紛繁,但在大時(shí)間尺度下來(lái)看卻都是規(guī)則的實(shí)現(xiàn)手段。

          這就好比下圍棋,每一手都要為謀得利益而計(jì)算,但結(jié)局卻只有三種:贏、輸或和,這就是規(guī)則的力量。

           

          民以食為天,所以第一定律從收入開始。

           

          程序員第一定律可以表述為:程序員的收入是技能復(fù)雜度和技能實(shí)現(xiàn)可能程度的函數(shù)。

          如果程序員的工資是S,社會(huì)平均水平的工資為A,程序員掌握的技能復(fù)雜度為C,實(shí)現(xiàn)程度為P

          那么S = A x C x P

           

          這里面的實(shí)現(xiàn)程度P不太好理解,額外做點(diǎn)說(shuō)明。

          好比說(shuō)有人在東北種了很多白菜,并獲得了大豐收。與此同時(shí)廣州也確實(shí)需要大白菜,按批發(fā)價(jià)他的這批白菜可以買10萬(wàn)。

          但關(guān)鍵是這個(gè)人找不到車皮,大白菜就只能在當(dāng)?shù)亓闶郏@個(gè)時(shí)候這批大白菜就只能買1萬(wàn)塊錢。

          這就是實(shí)現(xiàn)程度。

          大白菜內(nèi)蘊(yùn)了既定的價(jià)值,這種價(jià)值并不因?yàn)橘u多少錢而改變,但這種價(jià)值能實(shí)現(xiàn)到什么程度則依賴于現(xiàn)實(shí)的可能性。

           

          這視乎很簡(jiǎn)單,但其實(shí)不是,很多人的一生就籠罩在這條定律下面,我們來(lái)基于這第一定律繼續(xù)做些推導(dǎo)。

           

          • 推論1:越容易上手的技術(shù),其內(nèi)蘊(yùn)價(jià)值越低。

           

          技能的復(fù)雜度C可以大致等價(jià)于掌握一門技術(shù)所需要的時(shí)間。

           

          各種集成的開發(fā)環(huán)境,各種容易學(xué)習(xí)的類庫(kù)等使軟件開發(fā)的門檻降得很低,這對(duì)整個(gè)產(chǎn)業(yè)是有利的,但對(duì)個(gè)體而言則是不利的。

          你花5個(gè)月可以學(xué)會(huì)的技術(shù),其他人花5個(gè)月也可以學(xué)會(huì),而5個(gè)月可以學(xué)會(huì)的東西所蘊(yùn)含的價(jià)值一定是低的。

          與之相對(duì)5年才可以學(xué)會(huì)的東西,其內(nèi)蘊(yùn)價(jià)值一定是高的。

          內(nèi)蘊(yùn)價(jià)值低,所對(duì)應(yīng)的收入必然偏低。

           

          為避免爭(zhēng)議,我這里就不寫技術(shù)的名字了,但大家可以從學(xué)習(xí)所需要的時(shí)間上來(lái)對(duì)各種技術(shù)做個(gè)分類。

           

          有時(shí)候很多人會(huì)有一種錯(cuò)覺,認(rèn)為越熱門的技術(shù)收益越好。

          這在大多時(shí)候是錯(cuò)的。

          越熱的技術(shù),越成熟的技術(shù)越是大眾的,而越是大眾的技術(shù)內(nèi)蘊(yùn)價(jià)值越低,所以收益越不好。

          熱度能夠幫助找到工作,但對(duì)技能復(fù)雜度C沒有影響。

           

          • 推論2:?jiǎn)渭兊纳娅C廣泛,沒有專精,對(duì)收入的影響是負(fù)面的。

          各種技術(shù)的復(fù)雜度大概是呈指數(shù)增長(zhǎng)的,越到后面前進(jìn)一步越困難。

          好比說(shuō)學(xué)會(huì)5門語(yǔ)言所需要的時(shí)間大多時(shí)候遠(yuǎn)比學(xué)精一門語(yǔ)言要短。

          在特定年紀(jì)尚,每樣技術(shù)都會(huì)一點(diǎn),對(duì)提高實(shí)現(xiàn)程度P略有幫助,但自身可替代性很強(qiáng),對(duì)技能復(fù)雜度C的影響為負(fù)面。

          長(zhǎng)期來(lái)看得不償失。

           

          • 推論3:實(shí)現(xiàn)程度P越高,風(fēng)險(xiǎn)越大。

          有些技術(shù)領(lǐng)域很窄,上手也慢,實(shí)現(xiàn)程度卻高,比如顯卡驅(qū)動(dòng),打印驅(qū)動(dòng)等。

          但這類工作好比在鋼絲上跳舞:只要能實(shí)現(xiàn)自己的價(jià)值,那么回報(bào)大體不錯(cuò),但最怕技術(shù)更迭。

          技術(shù)一換代,可能多年積累十去六七。

           

          總結(jié)來(lái)看,程序員要想獲得不錯(cuò)的收入,第一要掌握稀缺的技術(shù),即技術(shù)的內(nèi)蘊(yùn)價(jià)值要高;第二要找到實(shí)現(xiàn)稀缺技術(shù)的場(chǎng)景。

          《微軟的秘密》一書中提到,微軟里面優(yōu)秀的程序員是可以擁有許多輛保時(shí)捷的。

          用上面兩條做分解,就會(huì)發(fā)現(xiàn)原因很簡(jiǎn)單:

          一是這樣的人是NT的核心開發(fā)人員,這類人員內(nèi)蘊(yùn)價(jià)值極高,處于稀缺狀態(tài);二是微軟提供了實(shí)現(xiàn)這種技能內(nèi)蘊(yùn)價(jià)值的機(jī)會(huì)。

          這二者缺一不可。

          #根據(jù)大家的回復(fù)做了點(diǎn)修改把"實(shí)現(xiàn)可能性"替換成了"實(shí)現(xiàn)程度"。


          2012世界末日暨環(huán)境保護(hù)主題站,關(guān)注國(guó)內(nèi)外最新2012世界末日信息,旨在通過(guò)關(guān)注,收集,展示2012世界末日相關(guān)資料的方式,喚醒并提高人們保護(hù)環(huán)境與愛護(hù)地球的意識(shí),引導(dǎo)人類保護(hù)環(huán)境.
          posted @ 2012-02-14 22:03 todayx.org 閱讀(557) | 評(píng)論 (4)編輯 收藏

          什么是HTTP協(xié)議

          協(xié)議是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標(biāo)記語(yǔ)言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器

           

          目前我們使用的是HTTP/1.1 版本

          Web服務(wù)器,瀏覽器,代理服務(wù)器

          當(dāng)我們打開瀏覽器,在地址欄中輸入U(xiǎn)RL,然后我們就看到了網(wǎng)頁(yè)。 原理是怎樣的呢?

          實(shí)際上我們輸入U(xiǎn)RL后,我們的瀏覽器給Web服務(wù)器發(fā)送了一個(gè)Request, Web服務(wù)器接到Request后進(jìn)行處理,生成相應(yīng)的Response,然后發(fā)送給瀏覽器, 瀏覽器解析Response中的HTML,這樣我們就看到了網(wǎng)頁(yè),過(guò)程如下圖所示

           

           

           

          我們的Request 有可能是經(jīng)過(guò)了代理服務(wù)器,最后才到達(dá)Web服務(wù)器的。

          過(guò)程如下圖所示

           

          代理服務(wù)器就是網(wǎng)絡(luò)信息的中轉(zhuǎn)站,有什么功能呢?

          1. 提高訪問(wèn)速度, 大多數(shù)的代理服務(wù)器都有緩存功能。

          2. 突破限制, 也就是翻-墻了

          3. 隱藏身份。

           

          URL詳解

           URL(Uniform Resource Locator) 地址用于描述一個(gè)網(wǎng)絡(luò)上的資源,  基本格式如下

          schema://host[:port#]/path/.../[?query-string][#anchor]

          scheme               指定低層使用的協(xié)議(例如:http, https, ftp)

          host                   HTTP服務(wù)器的IP地址或者域名

          port#                 HTTP服務(wù)器的默認(rèn)端口是80,這種情況下端口號(hào)可以省略。如果使用了別的端口,必須指明,例如 http://www.cnblogs.com:8080/

          path                   訪問(wèn)資源的路徑

          query-string       發(fā)送給http服務(wù)器的數(shù)據(jù)

          anchor-             錨

           

          URL 的一個(gè)例子

          http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff  Schema:                 http host:                   www.mywebsite.com path:                   /sj/test Query String:           name=sviergn&x=true Anchor:                 stuff

           

          HTTP協(xié)議是無(wú)狀態(tài)的

          http協(xié)議是無(wú)狀態(tài)的,同一個(gè)客戶端的這次請(qǐng)求和上次請(qǐng)求是沒有對(duì)應(yīng)關(guān)系,對(duì)http服務(wù)器來(lái)說(shuō),它并不知道這兩個(gè)請(qǐng)求來(lái)自同一個(gè)客戶端。 為了解決這個(gè)問(wèn)題, Web程序引入了Cookie機(jī)制來(lái)維護(hù)狀態(tài).

           

          HTTP消息的結(jié)構(gòu)

          先看Request 消息的結(jié)構(gòu),   Request 消息分為3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之間有個(gè)空行, 結(jié)構(gòu)如下圖

          第一行中的Method表示請(qǐng)求方法,比如"POST","GET",  Path-to-resoure表示請(qǐng)求的資源, Http/version-number 表示HTTP協(xié)議的版本號(hào)

          當(dāng)使用的是"GET" 方法的時(shí)候, body是為空的

          比如我們打開博客園首頁(yè)的request 如下

          GET http://www.cnblogs.com/ HTTP/1.1 Host: www.cnblogs.com

          下面我們打開Fiddler 捕捉一個(gè)博客園登錄的Request 然后分析下它的結(jié)構(gòu), 在Inspectors tab下以Raw的方式可以看到完整的Request的消息,   如下圖

           

          我們?cè)倏碦esponse消息的結(jié)構(gòu), 和Request消息的結(jié)構(gòu)基本一樣。 同樣也分為三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之間也有個(gè)空行,  結(jié)構(gòu)如下圖

          HTTP/version-number表示HTTP協(xié)議的版本號(hào),  status-code 和message 請(qǐng)看下節(jié)[狀態(tài)代碼]的詳細(xì)解釋.

          我們用Fiddler 捕捉一個(gè)博客園首頁(yè)的Response然后分析下它的結(jié)構(gòu), 在Inspectors tab下以Raw的方式可以看到完整的Response的消息,   如下圖

           

           

          Get和Post方法的區(qū)別

          Http協(xié)議定義了很多與服務(wù)器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個(gè)URL地址用于描述一個(gè)網(wǎng)絡(luò)上的資源,而HTTP中的GET, POST, PUT, DELETE就對(duì)應(yīng)著對(duì)這個(gè)資源的查,改,增,刪4個(gè)操作。 我們最常見的就是GET和POST了。GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息.

          我們看看GET和POST的區(qū)別

          1. GET提交的數(shù)據(jù)會(huì)放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中.

          2. GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒有限制.

          3. GET方式需要使用Request.QueryString來(lái)取得變量的值,而POST方式通過(guò)Request.Form來(lái)獲取變量的值。

          4. GET方式提交數(shù)據(jù),會(huì)帶來(lái)安全問(wèn)題,比如一個(gè)登錄頁(yè)面,通過(guò)GET方式提交數(shù)據(jù)時(shí),用戶名和密碼將出現(xiàn)在URL上,如果頁(yè)面可以被緩存或者其他人可以訪問(wèn)這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶的賬號(hào)和密碼.

           

          狀態(tài)碼

          Response 消息中的第一行叫做狀態(tài)行,由HTTP協(xié)議版本號(hào), 狀態(tài)碼, 狀態(tài)消息 三部分組成。

          狀態(tài)碼用來(lái)告訴HTTP客戶端,HTTP服務(wù)器是否產(chǎn)生了預(yù)期的Response.

          HTTP/1.1中定義了5類狀態(tài)碼, 狀態(tài)碼由三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別

          1XX  提示信息 - 表示請(qǐng)求已被成功接收,繼續(xù)處理

          2XX  成功 - 表示請(qǐng)求已被成功接收,理解,接受

          3XX  重定向 - 要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的處理

          4XX  客戶端錯(cuò)誤 -  請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)

          5XX  服務(wù)器端錯(cuò)誤 -   服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求

           

          看看一些常見的狀態(tài)碼

          200 OK

          最常見的就是成功響應(yīng)狀態(tài)碼200了, 這表明該請(qǐng)求被成功地完成,所請(qǐng)求的資源發(fā)送回客戶端

          如下圖, 打開博客園首頁(yè)

           

          302 Found

          重定向,新的URL會(huì)在response 中的Location中返回,瀏覽器將會(huì)自動(dòng)使用新的URL發(fā)出新的Request

          例如在IE中輸入, http://www.google.com. HTTP服務(wù)器會(huì)返回304, IE取到Response中Location header的新URL, 又重新發(fā)送了一個(gè)Request.

           

          304 Not Modified

          代表上次的文檔已經(jīng)被緩存了, 還可以繼續(xù)使用,

          例如打開博客園首頁(yè), 發(fā)現(xiàn)很多Response 的status code 都是304

          提示: 如果你不想使用本地緩存可以用Ctrl+F5 強(qiáng)制刷新頁(yè)面

           

          400 Bad Request  客戶端請(qǐng)求與語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解

          403 Forbidden 服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)

          404 Not Found

          請(qǐng)求資源不存在(輸錯(cuò)了URL)

          比如在IE中輸入一個(gè)錯(cuò)誤的URL, http://www.cnblogs.com/tesdf.aspx

           

          500 Internal Server Error 服務(wù)器發(fā)生了不可預(yù)期的錯(cuò)誤

          503 Server Unavailable 服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常

           

          HTTP Request header

          使用Fiddler 能很方便的查看Reques header, 點(diǎn)擊Inspectors tab ->Request tab-> headers  如下圖所示.

          header 有很多,比較難以記憶,我們也按照Fiddler那樣把header 進(jìn)行分類,這樣比較清晰也容易記憶。

          Cache 頭域

          If-Modified-Since

          作用: 把瀏覽器端緩存頁(yè)面的最后修改時(shí)間發(fā)送到服務(wù)器去,服務(wù)器會(huì)把這個(gè)時(shí)間與服務(wù)器上實(shí)際文件的最后修改時(shí)間進(jìn)行對(duì)比。如果時(shí)間一致,那么返回304,客戶端 就直接使用本地緩存文件。如果時(shí)間不一致,就會(huì)返回200和新的文件內(nèi)容。客戶端接到之后,會(huì)丟棄舊文件,把新文件緩存起來(lái),并顯示在瀏覽器中.

          例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

          實(shí)例如下圖

           

          If-None-Match

          作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當(dāng)用戶再次請(qǐng)求該資源時(shí),將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務(wù)器驗(yàn)證資源的ETag沒有改變(該資源沒有更新),將返回一個(gè)304狀態(tài)告訴客戶端使用 本地緩存文件。否則將返回200狀態(tài)和新的資源和Etag.  使用這樣的機(jī)制將提高網(wǎng)站的性能

          例如: If-None-Match: "03f2b33c0bfcc1:0"

          實(shí)例如下圖

           

          Pragma

          作用: 防止頁(yè)面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣

          Pargma只有一個(gè)用法, 例如: Pragma: no-cache

          注意: 在HTTP/1.0版本中,只實(shí)現(xiàn)了Pragema:no-cache, 沒有實(shí)現(xiàn)Cache-Control

           

          Cache-Control

          作用: 這個(gè)是非常重要的規(guī)則。 這個(gè)用來(lái)指定Response-Request遵循的緩存機(jī)制。各個(gè)指令含義如下

          Cache-Control:Public   可以被任何緩存所緩存()

          Cache-Control:Private     內(nèi)容只緩存到私有緩存中

          Cache-Control:no-cache  所有內(nèi)容都不會(huì)被緩存

          還有其他的一些用法, 我沒搞懂其中的意思, 請(qǐng)大家參考其他的資料

           

          Client 頭域

          Accept

          作用: 瀏覽器端可以接受的媒體類型,

          例如:  Accept: text/html  代表瀏覽器可以接受服務(wù)器回發(fā)的類型為 text/html  也就是我們常說(shuō)的html文檔,

          如果服務(wù)器無(wú)法返回text/html類型的數(shù)據(jù),服務(wù)器應(yīng)該返回一個(gè)406錯(cuò)誤(non acceptable)

          通配符 * 代表任意類型

          例如  Accept: */*  代表瀏覽器可以處理所有類型,(一般瀏覽器發(fā)給服務(wù)器都是發(fā)這個(gè))

           

          Accept-Encoding:

          作用: 瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate),(注意:這不是只字符編碼);

          例如: Accept-Encoding: gzip, deflate

           

          Accept-Language

          作用: 瀏覽器申明自己接收的語(yǔ)言。 

          語(yǔ)言跟字符集的區(qū)別:中文是語(yǔ)言,中文有多種字符集,比如big5,gb2312,gbk等等;

          例如: Accept-Language: en-us

           

          User-Agent

          作用:告訴HTTP服務(wù)器, 客戶端使用的操作系統(tǒng)和瀏覽器的名稱和版本.

          我們上網(wǎng)登陸論壇的時(shí)候,往往會(huì)看到一些歡迎信息,其中列出了你的操作系統(tǒng)的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神 奇,實(shí)際上,服務(wù)器應(yīng)用程序就是從User-Agent這個(gè)請(qǐng)求報(bào)頭域中獲取到這些信息User-Agent請(qǐng)求報(bào)頭域允許客戶端將它的操作系統(tǒng)、瀏覽器 和其它屬性告訴服務(wù)器。

          例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

           

          Accept-Charset

          作用:瀏覽器申明自己接收的字符集,這就是本文前面介紹的各種字符集和字符編碼,如gb2312,utf-8(通常我們說(shuō)Charset包括了相應(yīng)的字符編碼方案);

          例如:

           

          Cookie/Login 頭域

          Cookie:

          作用: 最重要的header, 將cookie的值發(fā)送給HTTP 服務(wù)器

          Entity頭域

          Content-Length

          作用:發(fā)送給HTTP服務(wù)器數(shù)據(jù)的長(zhǎng)度。

          例如: Content-Length: 38

           

          Content-Type

          作用:

          例如:Content-Type: application/x-www-form-urlencoded

           

          Miscellaneous 頭域

          Referer:

          作用: 提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個(gè)鏈接過(guò)來(lái)的,比如從我主頁(yè)上鏈接到一個(gè)朋友那里,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶點(diǎn)擊我主頁(yè)上的鏈接訪問(wèn)他的網(wǎng)站。

          例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

          Transport 頭域

          Connection

          例如: Connection: keep-alive   當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接

          例如:  Connection: close  代表一個(gè)Request完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉, 當(dāng)客戶端再次發(fā)送Request,需要重新建立TCP連接。

           

          Host(發(fā)送請(qǐng)求時(shí),該報(bào)頭域是必需的)

          作用: 請(qǐng)求報(bào)頭域主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),它通常從HTTP URL中提取出來(lái)的

          例如: 我們?cè)跒g覽器中輸入:http://www.guet.edu.cn/index.html

          瀏覽器發(fā)送的請(qǐng)求消息中,就會(huì)包含Host請(qǐng)求報(bào)頭域,如下:

          Host:http://www.guet.edu.cn

          此處使用缺省端口號(hào)80,若指定了端口號(hào),則變成:Host:指定端口號(hào)

           

          HTTP Response header

          同樣使用Fiddler 查看Response header, 點(diǎn)擊Inspectors tab ->Response tab-> headers  如下圖所示

           我們也按照Fiddler那樣把header 進(jìn)行分類,這樣比較清晰也容易記憶。

          Cache頭域

          Date

          作用:  生成消息的具體時(shí)間和日期

          例如: Date: Sat, 11 Feb 2012 11:35:14 GMT 

           

          Expires

          作用: 瀏覽器會(huì)在指定過(guò)期時(shí)間內(nèi)使用本地緩存

          例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

           

          Vary

          作用:

          例如: Vary: Accept-Encoding

           

          Cookie/Login 頭域

          P3P

          作用: 用于跨域設(shè)置Cookie, 這樣可以解決iframe跨域訪問(wèn)cookie的問(wèn)題

          例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

           

          Set-Cookie

          作用: 非常重要的header, 用于把cookie 發(fā)送到客戶端瀏覽器, 每一個(gè)寫入cookie都會(huì)生成一個(gè)Set-Cookie.

          例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

           

          Entity頭域

          ETag

          作用:  和If-None-Match 配合使用。 (實(shí)例請(qǐng)看上節(jié)中If-None-Match的實(shí)例)

          例如: ETag: "03f2b33c0bfcc1:0"

           

          Last-Modified:

          作用: 用于指示資源的最后修改日期和時(shí)間。(實(shí)例請(qǐng)看上節(jié)的If-Modified-Since的實(shí)例)

          例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

           

          Content-Type

          作用:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對(duì)象的類型和字符集,

          例如:

          Content-Type: text/html; charset=utf-8

          Content-Type:text/html;charset=GB2312

          Content-Type: image/jpeg

           

          Content-Length

          指明實(shí)體正文的長(zhǎng)度,以字節(jié)方式存儲(chǔ)的十進(jìn)制數(shù)字來(lái)表示。在數(shù)據(jù)下行的過(guò)程中,Content-Length的方式要預(yù)先在服務(wù)器中緩存所有數(shù)據(jù),然后所有數(shù)據(jù)再一股腦兒地發(fā)給客戶端。

          例如: Content-Length: 19847

           

          Content-Encoding

          WEB服務(wù)器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應(yīng)中的對(duì)象。

          例如:Content-Encoding:gzip

           

          Content-Language

          作用: WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對(duì)象的語(yǔ)言者

          例如: Content-Language:da

           

          Miscellaneous 頭域

          Server:

          作用:指明HTTP服務(wù)器的軟件信息

          例如:Server: Microsoft-IIS/7.5

           

          X-AspNet-Version:

          作用:如果網(wǎng)站是用ASP.NET開發(fā)的,這個(gè)header用來(lái)表示ASP.NET的版本

          例如: X-AspNet-Version: 4.0.30319

          X-Powered-By:

          作用:表示網(wǎng)站是用什么技術(shù)開發(fā)的

          例如: X-Powered-By: ASP.NET

          Transport頭域

          Connection

          例如: Connection: keep-alive   當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接

          例如:  Connection: close  代表一個(gè)Request完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉, 當(dāng)客戶端再次發(fā)送Request,需要重新建立TCP連接。

          Location頭域

          Location

          作用: 用于重定向一個(gè)新的位置, 包含新的URL地址

           實(shí)例請(qǐng)看304狀態(tài)實(shí)例

           

          HTTP協(xié)議是無(wú)狀態(tài)的和Connection: keep-alive的區(qū)別

          無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力,服務(wù)器不知道客戶端是什么狀態(tài)。從另一方面講,打開一個(gè)服務(wù)器上的網(wǎng)頁(yè)和你之前打開這個(gè)服務(wù)器上的網(wǎng)頁(yè)之間沒有任何聯(lián)系

          HTTP是一個(gè)無(wú)狀態(tài)面向連接的協(xié)議,無(wú)狀態(tài)不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協(xié)議(無(wú)連接)

          從HTTP/1.1起,默認(rèn)都開啟了Keep-Alive,保持連接特性,簡(jiǎn)單地說(shuō),當(dāng)一個(gè)網(wǎng)頁(yè)打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接

           Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-14 21:58 todayx.org 閱讀(331) | 評(píng)論 (3)編輯 收藏

          作為一個(gè)開發(fā)者,尤其是web開發(fā)人員,我想你有必要去了解這一系列的處理流程,在這期間,瀏覽器和服務(wù)器到底是如何打交道的?服務(wù)器又是如何處理的?瀏覽器又是如何將網(wǎng)頁(yè)顯示給用戶的呢?......

          疑惑和細(xì)節(jié)真是太多了。坦白講,要想徹徹底底的弄清楚以上每個(gè)疑惑和處理細(xì)節(jié),至少需要十本書的厚度,所謂“底層無(wú)極限”嘛,而且不同的web服務(wù) 器和服務(wù)器端編程語(yǔ)言的實(shí)現(xiàn)和處理流程不盡相同(但本質(zhì)都是相通的)。本文中,我將根據(jù)http協(xié)議的有關(guān)知識(shí),跟大家講解一些web開發(fā)的本質(zhì)。不管你 是從事.NET,還是J2EE或者php開發(fā)等等,都離不開這些本質(zhì)。希望你讀完本文,能有新的收獲和見解。由于本人水平和經(jīng)驗(yàn)有限,難免有誤,望讀者見 諒。

           

          何為http協(xié)議(Hypertext Transfer Protocol,超文本傳輸協(xié)議)?

          所謂協(xié)議,就是指雙方遵循的規(guī)范。http協(xié)議,就是瀏覽器和服務(wù)器之間進(jìn)行“溝通”的一種規(guī)范。我們?cè)诳纯臻g,刷微博...都是在使用http協(xié)議,當(dāng)然,遠(yuǎn)遠(yuǎn)不止這些應(yīng)用。

          筆者一直聽說(shuō)http是屬于“應(yīng)用層的協(xié)議”,而且是基于TCP/IP協(xié)議的。這個(gè)不難理解,如果你上大學(xué)時(shí)候?qū)W過(guò)“計(jì)算機(jī)網(wǎng)絡(luò)”的課程,就一定知 道OSI七層參考協(xié)議(我當(dāng)時(shí)是死記硬背的)。如果你接觸過(guò)socket網(wǎng)絡(luò)編程,就應(yīng)該明白TCP和UDP這兩種使用廣泛的通信協(xié)議(建立連接、三次握 手等等,當(dāng)然,這不是本文討論的重點(diǎn))。如圖:

          既然TCP/UDP是廣泛使用的網(wǎng)絡(luò)通信協(xié)議,那為啥有多出個(gè)http協(xié)議來(lái)呢?

          筆者曾自己動(dòng)手寫過(guò)一個(gè)簡(jiǎn)單的web服務(wù)器處理軟件,根據(jù)我的推斷(不一定準(zhǔn)確)。UDP協(xié)議具有不可靠性和不安全性,顯然這很難滿足web應(yīng)用的需要。

          而TCP協(xié)議是基于連接和三次握手的,雖然具有可靠性,但人具有一定的缺陷。但試想一下,普通的C/S架構(gòu)軟件,頂多上千個(gè)Client同時(shí)連接,而B/S架構(gòu)的網(wǎng)站,十萬(wàn)人同時(shí)在線也是很平常的事兒。如果十萬(wàn)個(gè)客戶端和服務(wù)器一直保持連接狀態(tài),那服務(wù)器如何滿足承載呢?

          這就衍生出了http協(xié)議。基于TCP的可靠性連接。通俗點(diǎn)說(shuō),就是在請(qǐng)求之后,服務(wù)器端立即關(guān)閉連接、釋放資源。這樣既保證了資源可用,也吸取了TCP的可靠性的優(yōu)點(diǎn)。

          正因?yàn)檫@點(diǎn),所以大家通常說(shuō)http協(xié)議是“無(wú)狀態(tài)”的,也就是“服務(wù)器不知道你客戶端干了啥”,其實(shí)很大程度上是基于性能考慮的。以至于后來(lái)有了session之類的玩意。

           

          實(shí)戰(zhàn)準(zhǔn)備工作:

          在監(jiān)視網(wǎng)絡(luò)方面,windows平臺(tái)上有一款叫做Sniffer的優(yōu)秀軟件,這也是很多“黑客”經(jīng)常使用的嗅探工具。 在研究http協(xié)議時(shí),推薦大家使用一款

          叫作httpwatch的工具。(遺憾的是,該工具是收費(fèi)的。該咋辦就咋辦,你懂的)。安裝完成后,可以在IE瀏覽器的tools中直接打開(目前也支持firefox)。如圖所示:


           

           

           

           

           

           

          點(diǎn)擊Record,就可以開始監(jiān)視并記錄http消息了。stop、Clear等等按鈕的功能,這里就不一一介紹了。拿實(shí)例來(lái)說(shuō)話,下面就是我記錄訪問(wèn)main.aspx頁(yè)面的時(shí)候記錄的,能夠清晰的看到http報(bào)文消息的詳細(xì)信息,如圖:

          學(xué)習(xí)http協(xié)議,主要需要了解http的請(qǐng)求和響應(yīng)(當(dāng)然,還有g(shù)et、post等請(qǐng)求方式,狀態(tài)碼、URI、MIME等)


          首先看看http請(qǐng)求消息(就是瀏覽器丟給服務(wù)器的):


          一個(gè)http請(qǐng)求代表客戶端瀏覽器向服務(wù)器發(fā)送的數(shù)據(jù)。一個(gè)完整的http請(qǐng)求消息,包含一個(gè)請(qǐng)求行,若干個(gè)消息頭(請(qǐng)求頭),換行,實(shí)體內(nèi)容

          請(qǐng)求行:描述客戶端的請(qǐng)求方式、請(qǐng)求資源的名稱、http協(xié)議的版本號(hào)。 例如: GET/BOOK/JAVA.HTML HTTP/1.1

          請(qǐng)求頭(消息頭)包含(客戶機(jī)請(qǐng)求的服務(wù)器主機(jī)名,客戶機(jī)的環(huán)境信息等):
          Accept:用于告訴服務(wù)器,客戶機(jī)支持的數(shù)據(jù)類型  (例如:Accept:text/html,image/*)
          Accept-Charset:用于告訴服務(wù)器,客戶機(jī)采用的編碼格式
          Accept-Encoding:用于告訴服務(wù)器,客戶機(jī)支持的數(shù)據(jù)壓縮格式
          Accept-Language:客戶機(jī)語(yǔ)言環(huán)境
          Host:客戶機(jī)通過(guò)這個(gè)服務(wù)器,想訪問(wèn)的主機(jī)名
          If-Modified-Since:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器,資源的緩存時(shí)間
          Referer:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器,它(客戶端)是從哪個(gè)資源來(lái)訪問(wèn)服務(wù)器的(防盜鏈)
          User-Agent:客戶機(jī)通過(guò)這個(gè)頭告訴服務(wù)器,客戶機(jī)的軟件環(huán)境(操作系統(tǒng),瀏覽器版本等)
          Cookie:客戶機(jī)通過(guò)這個(gè)頭,將Coockie信息帶給服務(wù)器
          Connection:告訴服務(wù)器,請(qǐng)求完成后,是否保持連接
          Date:告訴服務(wù)器,當(dāng)前請(qǐng)求的時(shí)間

          (換行)
          實(shí)體內(nèi)容:
          就是指瀏覽器端通過(guò)http協(xié)議發(fā)送給服務(wù)器的實(shí)體數(shù)據(jù)。例如:name=dylan&id=110
          (get請(qǐng)求時(shí),通過(guò)url傳給服務(wù)器的值。post請(qǐng)求時(shí),通過(guò)表單發(fā)送給服務(wù)器的值)
           
          再看看HTTP響應(yīng)消息(服務(wù)器返回給瀏覽器的):

          一個(gè)http響應(yīng)代表服務(wù)器端向客戶端回送的數(shù)據(jù),它包括:
          一個(gè)狀態(tài)行,若干個(gè)消息頭,以及實(shí)體內(nèi)容

          響應(yīng)頭(消息頭)包含:
          Location:這個(gè)頭配合302狀態(tài)嗎,用于告訴客戶端找誰(shuí)
          Server:服務(wù)器通過(guò)這個(gè)頭,告訴瀏覽器服務(wù)器的類型
          Content-Encoding:告訴瀏覽器,服務(wù)器的數(shù)據(jù)壓縮格式
          Content-Length:告訴瀏覽器,回送數(shù)據(jù)的長(zhǎng)度
          Content-Type:告訴瀏覽器,回送數(shù)據(jù)的類型
          Last-Modified:告訴瀏覽器當(dāng)前資源緩存時(shí)間
          Refresh:告訴瀏覽器,隔多長(zhǎng)時(shí)間刷新
          Content- Disposition:告訴瀏覽器以下載的方式打開數(shù)據(jù)。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                        context.Response.WriteFile("aa.jpg");
          Transfer-Encoding:告訴瀏覽器,傳送數(shù)據(jù)的編碼格式
          ETag:緩存相關(guān)的頭(可以做到實(shí)時(shí)更新)
          Expries:告訴瀏覽器回送的資源緩存多長(zhǎng)時(shí)間。如果是-1或者0,表示不緩存
          Cache-Control:控制瀏覽器不要緩存數(shù)據(jù)   no-cache
          Pragma:控制瀏覽器不要緩存數(shù)據(jù)          no-cache

          Connection:響應(yīng)完成后,是否斷開連接。  close/Keep-Alive
          Date:告訴瀏覽器,服務(wù)器響應(yīng)時(shí)間

          理解了以上的http請(qǐng)求消息和響應(yīng)消息,相信你對(duì)于http協(xié)議已經(jīng)理解得足夠深刻了。關(guān)于http協(xié)議的更多具體細(xì)節(jié),可以參照http RFC文檔

          大致步驟就是:瀏覽器先向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求后,做相應(yīng)的處理,然后封裝好響應(yīng)報(bào)文,再回送給瀏覽器。瀏覽器拿到響應(yīng)報(bào)文后,再通過(guò) 瀏覽器引擎去渲染網(wǎng)頁(yè),解析DOM樹,javascript引擎解析并執(zhí)行腳本操作,插件去干插件該干的事兒...關(guān)于瀏覽器渲染、解析的原理,可以參考 http://kb.cnblogs.com/page/129756/

          說(shuō)白了,所謂web的本質(zhì),無(wú)非是:請(qǐng)求/處理/響應(yīng) ,任何的web服務(wù)器,任何的服務(wù)端編程語(yǔ)言,都沒法脫離這個(gè)本質(zhì)。 而瀏覽器端解析html、圖片等靜態(tài)內(nèi)容,呈現(xiàn)給用戶,腳本引擎執(zhí)行腳本代碼,完成腳本代碼要做的事兒(例如dom操作,css屬性更改,發(fā)送ajax請(qǐng) 求等等)。

          筆者淺淺的認(rèn)為,其實(shí)瀏覽器就是一種特殊的Client,而B/S架構(gòu)也是一種特殊的C/S架構(gòu)。這里值得一提的是,不同的web服務(wù)器和編程語(yǔ) 言,又是如何接收用戶http請(qǐng)求。如何處理,如何響應(yīng)的呢?筆者拿熟悉的ASP.NET為例,通過(guò)反編譯工具查看源代碼(微軟這家伙實(shí)在封裝的太好了) 從底層進(jìn)行了剖析,如圖:

          由于篇幅有限,無(wú)法再繼續(xù)將asp.net、iis web服務(wù)器的細(xì)節(jié)及底層實(shí)現(xiàn)再做進(jìn)一步地進(jìn)行剖析了。因?yàn)槲④浀腶sp.net技術(shù)體系實(shí)在龐大,而且很復(fù)雜。有時(shí)間筆者會(huì)繼續(xù)更新系列文章,歡迎讀者繼續(xù)關(guān)注。


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-14 21:56 todayx.org 閱讀(279) | 評(píng)論 (0)編輯 收藏
               
          2012世界末日暨環(huán)境保護(hù)主題站,關(guān)注國(guó)內(nèi)外最新2012世界末日信息,旨在通過(guò)關(guān)注,收集,展示2012世界末日相關(guān)資料的方式,喚醒并提高人們保護(hù)環(huán)境與愛護(hù)地球的意識(shí),引導(dǎo)人類保護(hù)環(huán)境.



                最近一直比較忙,所以一連幾天都沒有更新。本來(lái)覺得沒什么,后來(lái)有幾個(gè)網(wǎng)友都問(wèn)起為什么沒有更新,才覺得大家對(duì)我的博客還是比較關(guān)心的。于是覺得挺對(duì)不起大家的。終于到了周末,昨天晚上忙乎了一晚上,寫了個(gè)Swing演示,今天把它共享出來(lái),算是彌補(bǔ)。 

            

              收到一個(gè)朋友的郵件說(shuō)如何在Swing中實(shí)現(xiàn)組件的動(dòng)畫效果,就像JIDE的那些組件一樣。的確Swing框架的靈活性和可擴(kuò)展性,使得它非常適合做這樣Makeover工作。我簡(jiǎn)單總結(jié)一了以下,這種組件不外乎要有以下三種元素:

              1.外觀華麗。這包括使用漸變色,線條和字體反走樣,圖標(biāo)設(shè)計(jì)漂亮搶眼,界面變化要柔和等等。但要避免設(shè)計(jì)太花哨,給人華而不實(shí)的感覺。原則上避免顏色太 碎,圖標(biāo)應(yīng)以簡(jiǎn)潔為主,不可濫用圖片等。技術(shù)上沒有多大要求,主要是美工,你需要掌握各種做圖工具,自己最好有好的審美和設(shè)計(jì)能力。

              2.動(dòng)畫效果。組件行為變化要柔和化,盡量使用動(dòng)畫效果,如淡入淡出、滾動(dòng)彈出等等。技術(shù)上最常用的方法是使用javax.swing.Timer。為什 么要使用javax.swing.Timer,這是因?yàn)閖avax.swing.Timer觸發(fā)的事件都在EDT上執(zhí)行,是線程安全的。除此外還需掌握 Java 2D的常用接口及圖像處理的常見技巧。

              3.空間布局。這種組件空間布局的特點(diǎn)是立體、動(dòng)態(tài)、拖拽式的。這和人的認(rèn)知能力有關(guān)。人類認(rèn)知的特點(diǎn)是具體到抽象。二維、靜態(tài)和鍵盤式操作對(duì)普通用戶來(lái) 說(shuō)太過(guò)抽象和專業(yè)化,需要一定的輔助學(xué)習(xí)才能理解的。而三維、動(dòng)態(tài)、拖拽式操作更貼近于感性的認(rèn)知范疇。因此這類組件經(jīng)常有浮動(dòng)式窗口、組件布局動(dòng)態(tài)變化 及拖拽式操作等特征。實(shí)現(xiàn)技術(shù)包括布局管理器(LayoutManager)、Swing組件分層結(jié)構(gòu)、Swing事件體系結(jié)構(gòu)以及DnD接口等。   

              美工對(duì)于java程序員來(lái)說(shuō)可能比較缺乏,但是華麗外觀不僅僅是美工技術(shù),這包括一些宏觀設(shè)計(jì)原則。java程序員完全可以通過(guò)掌握這些方針原則來(lái)提高自 己的設(shè)計(jì)水平。前面文章介紹那個(gè)《Swing外觀設(shè)計(jì)方針》就是一本這樣的書。至于美工,我覺得如果你有美術(shù)天分,那就要充分利用;如果沒有,那么你可以 模仿,熟悉幾種的圖形工具就完全可以不用自己的畫圖做出比較漂亮的圖標(biāo)、圖片(當(dāng)然沒有考慮版權(quán)問(wèn)題)。我就是后者,但是我發(fā)現(xiàn)我平時(shí)只需要PrScrn 鍵(抓圖)、Paint(Windows 畫圖工具,切圖、剪裁、轉(zhuǎn)換格式)、PowerPoint/OpenOffice Imprise(畫圖)、Google Image(搜索圖片)就已經(jīng)足夠了。其他所需的技術(shù)就需要你掌握Swing和Java 2D方方面面的技術(shù)了。當(dāng)然復(fù)雜的組件不僅僅是靠掌握這些技術(shù)能解決的,可能你還需要能比較好地熟悉各種編程模式。   

              這個(gè)朋友特別提到Windows上的折疊式操作面板,他說(shuō):   

              另外,我對(duì)JIDE中兩個(gè)東西很感興趣,一個(gè)是CollapsiblePanel(Windows Explorer左邊的常見任務(wù)),點(diǎn)擊后折疊、展開子面板,而且是動(dòng)畫效果

              因此昨晚就特地試了一下。雖然以前就大概明白使用Timer和布局管理器以及圖像處理就可以實(shí)現(xiàn)這些東西,但一直沒有做。昨晚的實(shí)驗(yàn)還是很成功的,大概花 了兩個(gè)小時(shí)就實(shí)現(xiàn)了這個(gè)面板。工作過(guò)程大概就是分解這些面板組件、解析那部分需要?jiǎng)赢嫛?yīng)該在哪兒觸發(fā)何種事件。另外就是編寫這些組件,不斷調(diào)試。這個(gè)過(guò) 程的大部分時(shí)間都被效果調(diào)整占去了。你需要不斷的運(yùn)行程序,抓取屏幕,然后將它帖到Paint中,然后放大,然后和Windows上的抓圖比較,包括大 小、尺寸、顏色、字體、微觀變化等等。最后算是基本實(shí)現(xiàn)了Windows這個(gè)折疊式的面板組件。下面的是我的演示程序的一個(gè)抓圖:

          高級(jí)Swing組件makeover的三要素   

          這個(gè)是淡出淡入動(dòng)畫效果:

          高級(jí)Swing組件makeover的三要素   

              下面的Enable Animation的JCheckBox可以設(shè)置是否使用動(dòng)畫效果。選擇上折疊和展開就具有動(dòng)畫效果。   

              這個(gè)組件的類名是dyno.swing.beans.FolderPane。使用比較簡(jiǎn)單: 

              FolderPane fp=new FolderPane();//設(shè)置是否有動(dòng)畫效果,缺省沒有
              fp.setAnimated(true);//添加子面板      
              fp.addFolder("文件和文件夾任務(wù)", getFileFolderPane());      
              fp.addFolder("其他位置", getOtherPlacePane());      
              fp.addFolder("詳細(xì)信息", getDetailsPane());      
              add(fp, BorderLayout.CENTER);  

                  主要接口有兩個(gè):  

              設(shè)置是否要?jiǎng)赢嬓Ч?nbsp;     
              public void setAnimated(boolean b)
              添加面板,title是面板標(biāo)題文字,content是應(yīng)用程序組件
              public void addFolder(String title, JComponent content)
           
             這個(gè)演示的源碼可以從這兒下載,是一個(gè)NetBeans工程。編譯之后,直接雙擊foldered_pane.jar既可觀看效果。源代碼中有詳細(xì)的注解。

              更新:剛剛修改了一下,現(xiàn)在可以支持JScrollPane,即能放到JScrollPane,并能在動(dòng)畫時(shí)動(dòng)態(tài)的更新JScrollPane狀態(tài)。

          高級(jí)Swing組件makeover的三要素


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-08 21:26 todayx.org 閱讀(365) | 評(píng)論 (2)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          程序員到底可以做多久,這個(gè)職業(yè)是否真的到35歲就終止?帶著這個(gè)問(wèn)題,和所有有此疑問(wèn)和憂慮的朋友們探討。先說(shuō)說(shuō)我自己的觀點(diǎn)吧。要回答這個(gè)問(wèn)題,我們首先要回答另外幾個(gè)問(wèn)題。

           

               1. 人得學(xué)習(xí)能力是否會(huì)隨著年齡的增長(zhǎng)而變差?

           

               可能是如此,我兩歲的兒子一首唐詩(shī)說(shuō)兩遍就記住了,很長(zhǎng)繞口的兒歌《小熊過(guò)橋》幾乎能一字不差的唱完;而我是顯然辦不到的。不過(guò)發(fā)現(xiàn)一個(gè)事實(shí),就是人的學(xué) 習(xí)能力不僅僅是靠記憶能力,跟邏輯思維能力,還有人的經(jīng)驗(yàn)也有很大的關(guān)系;我們每個(gè)人也許都發(fā)現(xiàn),你如果只是個(gè)優(yōu)秀的Java程序員,如果要你去維護(hù)一 個(gè).net的系統(tǒng),不出兩個(gè)月, 你馬上就是一個(gè).net專家。因?yàn)槟阒老嚓P(guān)的知識(shí)怎么學(xué)習(xí),知道如何才能最快定位問(wèn)題的一般方法。我個(gè)人是個(gè)完全不懂php得人,結(jié)果被強(qiáng)拉過(guò)去搞了個(gè) php的項(xiàng)目,結(jié)果被認(rèn)為是php expert!  所以我的最終答案是,人得記憶力更年齡成反比,但是學(xué)習(xí)能力跟年齡成正比。

           

                2. 人的年齡越大,精力會(huì)跟不上程序員這樣高強(qiáng)度的工作嗎?

           

                我的答案也是否定的。首先這是個(gè)偽命題,沒有哪件事情是輕松的;你覺得別人比你輕松,那也只是你覺得而已。大體上個(gè)人的回報(bào)跟付出是成正比的。其實(shí)隨著你 的年齡增長(zhǎng),知識(shí)積累越多,經(jīng)驗(yàn)越豐富,你的工作效率會(huì)更高。5年前你修一個(gè)Bug要一個(gè)星期,現(xiàn)在也許10分鐘就夠了,并且是又快又好。難道不是這樣 嗎?所以你的工作強(qiáng)度事實(shí)上會(huì)變得更低,因?yàn)槟愕男矢撸銜?huì)有更多時(shí)間喝咖啡,也會(huì)遭你鄰桌的同事低語(yǔ)“這家伙每天無(wú)所事事,咋工資比我高那么多?” 因?yàn)槟愕?0分鐘就抵別人的一個(gè)星期。

           

               3. 人的年齡越大,就沒有激情學(xué)習(xí)新知識(shí)了嗎?

           

                對(duì)有些人是,對(duì)有些人不是。計(jì)算機(jī)科學(xué)日新月異,確實(shí)更新相當(dāng)快。你真的會(huì)跟不上腳步嗎?可能會(huì),如果你自己不學(xué)習(xí)。但我一定要亦步亦趨嗎?也不見得,無(wú) 論如何,即便是軟件開發(fā),也還是有方向,有領(lǐng)域,你只要更上你需要更上的節(jié)奏就夠了。今天請(qǐng)我的一個(gè)兄弟給我講了下Struts應(yīng)用,就是給我搞個(gè)最小化 的Struts項(xiàng)目,包含所有Struct的重要知識(shí)點(diǎn),然后搬個(gè)椅子坐我旁邊,花上半個(gè)小時(shí)跟我講解;我現(xiàn)在儼然Struts專家了,不信,我跟你講講 看? 呵呵,開玩笑了。

              

              如果我們覺得每天吃飯不是件枯燥無(wú)趣的事,我們應(yīng)該也不太會(huì)拒絕不斷學(xué)習(xí);如果我們一定會(huì)因?yàn)樽匀灰?guī)律而失去某些優(yōu)勢(shì),記得你其實(shí)有更多的優(yōu)勢(shì)可以彌補(bǔ);最重要的是,做你喜歡的事,做你能做的事情。


              正月十五,明月高懸;祝福各位龍圖大展!


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-07 13:46 todayx.org 閱讀(596) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          --核心類主要有:
          org.jfree.chart.JFreeChart :圖表對(duì)象,任何類型的圖表的最終表現(xiàn)形式都是在該對(duì)象進(jìn)行一些屬性的定制。JFreeChart引擎本身提供了一個(gè)工廠類用于創(chuàng)建不同類型的圖表對(duì)象
          org.jfree.data.category.XXXDataSet: 數(shù)據(jù)集對(duì)象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對(duì)應(yīng)著很多類型的數(shù)據(jù)集對(duì)象類
          org.jfree.chart.plot.XXXPlot :圖表區(qū)域?qū)ο螅旧线@個(gè)對(duì)象決定著什么樣式的圖表,創(chuàng)建該對(duì)象的時(shí)候需要Axis、Renderer以及數(shù)據(jù)集對(duì)象的支持
          org.jfree.chart.axis.XXXAxis :用于處理圖表的兩個(gè)軸:縱軸和橫軸
          org.jfree.chart.render.XXXRender :負(fù)責(zé)如何顯示一個(gè)圖表對(duì)象
          org.jfree.chart.urls.XXXURLGenerator: 用于生成Web圖表中每個(gè)項(xiàng)目的鼠標(biāo)點(diǎn)擊鏈接
          XXXXXToolTipGenerator: 用于生成圖象的幫助提示,不同類型圖表對(duì)應(yīng)不同類型的工具提示類


          JFreeChart類:
          void setAntiAlias(boolean flag) 字體模糊邊界
          void setBackgroundImage(Image image) 背景圖片
          void setBackgroundImageAlignment(int alignment) 背景圖片對(duì)齊方式(參數(shù)常量在org.jfree.ui.Align類中定義)
          void setBackgroundImageAlpha(float alpha) 背景圖片透明度(0.0~1.0)
          void setBackgroundPaint(Paint paint) 背景色
          void setBorderPaint(Paint paint) 邊界線條顏色
          void setBorderStroke(Stroke stroke) 邊界線條筆觸
          void setBorderVisible(boolean visible) 邊界線條是否可見

          -----------------------------------------------------------------------------------------------------------

          TextTitle類:
          void setFont(Font font) 標(biāo)題字體
          void setPaint(Paint paint) 標(biāo)題字體顏色
          void setText(String text) 標(biāo)題內(nèi)容

          -----------------------------------------------------------------------------------------------------------

          StandardLegend(Legend)類:
          void setBackgroundPaint(Paint paint) 圖示背景色
          void setTitle(String title) 圖示標(biāo)題內(nèi)容
          void setTitleFont(Font font) 圖示標(biāo)題字體
          void setBoundingBoxArcWidth(int arcWidth) 圖示邊界圓角寬
          void setBoundingBoxArcHeight(int arcHeight) 圖示邊界圓角高
          void setOutlinePaint(Paint paint) 圖示邊界線條顏色
          void setOutlineStroke(Stroke stroke) 圖示邊界線條筆觸
          void setDisplaySeriesLines(boolean flag) 圖示項(xiàng)是否顯示橫線(折線圖有效)
          void setDisplaySeriesShapes(boolean flag) 圖示項(xiàng)是否顯示形狀(折線圖有效)
          void setItemFont(Font font) 圖示項(xiàng)字體
          void setItemPaint(Paint paint) 圖示項(xiàng)字體顏色
          void setAnchor(int anchor) 圖示在圖表中的顯示位置(參數(shù)常量在Legend類中定義)

          -----------------------------------------------------------------------------------------------------------

          Axis類:
          void setVisible(boolean flag) 坐標(biāo)軸是否可見
          void setAxisLinePaint(Paint paint) 坐標(biāo)軸線條顏色(3D軸無(wú)效)
          void setAxisLineStroke(Stroke stroke) 坐標(biāo)軸線條筆觸(3D軸無(wú)效)
          void setAxisLineVisible(boolean visible) 坐標(biāo)軸線條是否可見(3D軸無(wú)效)
          void setFixedDimension(double dimension) (用于復(fù)合表中對(duì)多坐標(biāo)軸的設(shè)置)
          void setLabel(String label) 坐標(biāo)軸標(biāo)題
          void setLabelFont(Font font) 坐標(biāo)軸標(biāo)題字體
          void setLabelPaint(Paint paint) 坐標(biāo)軸標(biāo)題顏色
          void setLabelAngle(double angle) 坐標(biāo)軸標(biāo)題旋轉(zhuǎn)角度(縱坐標(biāo)可以旋轉(zhuǎn))
          void setTickLabelFont(Font font) 坐標(biāo)軸標(biāo)尺值字體
          void setTickLabelPaint(Paint paint) 坐標(biāo)軸標(biāo)尺值顏色
          void setTickLabelsVisible(boolean flag) 坐標(biāo)軸標(biāo)尺值是否顯示
          void setTickMarkPaint(Paint paint) 坐標(biāo)軸標(biāo)尺顏色
          void setTickMarkStroke(Stroke stroke) 坐標(biāo)軸標(biāo)尺筆觸
          void setTickMarksVisible(boolean flag) 坐標(biāo)軸標(biāo)尺是否顯示

          ValueAxis(Axis)類:
          void setAutoRange(boolean auto) 自動(dòng)設(shè)置數(shù)據(jù)軸數(shù)據(jù)范圍
          void setAutoRangeMinimumSize(double size) 自動(dòng)設(shè)置數(shù)據(jù)軸數(shù)據(jù)范圍時(shí)數(shù)據(jù)范圍的最小跨度
          void setAutoTickUnitSelection(boolean flag) 數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽是否自動(dòng)確定(默認(rèn)為true)
          void setFixedAutoRange(double length) 數(shù)據(jù)軸固定數(shù)據(jù)范圍(設(shè)置100的話就是顯示MAXVALUE到MAXVALUE-100那段數(shù)據(jù)范圍)
          void setInverted(boolean flag) 數(shù)據(jù)軸是否反向(默認(rèn)為false)
          void setLowerMargin(double margin) 數(shù)據(jù)軸下(左)邊距
          void setUpperMargin(double margin) 數(shù)據(jù)軸上(右)邊距
          void setLowerBound(double min) 數(shù)據(jù)軸上的顯示最小值
          void setUpperBound(double max) 數(shù)據(jù)軸上的顯示最大值
          void setPositiveArrowVisible(boolean visible) 是否顯示正向箭頭(3D軸無(wú)效)
          void setNegativeArrowVisible(boolean visible) 是否顯示反向箭頭(3D軸無(wú)效)
          void setVerticalTickLabels(boolean flag) 數(shù)據(jù)軸數(shù)據(jù)標(biāo)簽是否旋轉(zhuǎn)到垂直
          void setStandardTickUnits(TickUnitSource source) 數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽(可以只顯示整數(shù)標(biāo)簽,需要將AutoTickUnitSelection設(shè)false)

          NumberAxis(ValueAxis)類:
          void setAutoRangeIncludesZero(boolean flag) 是否強(qiáng)制在自動(dòng)選擇的數(shù)據(jù)范圍中包含0
          void setAutoRangeStickyZero(boolean flag) 是否強(qiáng)制在整個(gè)數(shù)據(jù)軸中包含0,即使0不在數(shù)據(jù)范圍中
          void setNumberFormatOverride(NumberFormat formatter) 數(shù)據(jù)軸數(shù)據(jù)標(biāo)簽的顯示格式
          void setTickUnit(NumberTickUnit unit) 數(shù)據(jù)軸的數(shù)據(jù)標(biāo)簽(需要將AutoTickUnitSelection設(shè)false)

          DateAxis(ValueAxis)類:
          void setMaximumDate(Date maximumDate) 日期軸上的最小日期
          void setMinimumDate(Date minimumDate) 日期軸上的最大日期
          void setRange(Date lower,Date upper) 日期軸范圍
          void setDateFormatOverride(DateFormat formatter) 日期軸日期標(biāo)簽的顯示格式
          void setTickUnit(DateTickUnit unit) 日期軸的日期標(biāo)簽(需要將AutoTickUnitSelection設(shè)false)
          void setTickMarkPosition(DateTickMarkPosition position) 日期標(biāo)簽位置(參數(shù)常量在org.jfree.chart.axis.DateTickMarkPosition類中定義)

          CategoryAxis(Axis)類:
          void setCategoryMargin(double margin) 分類軸邊距
          void setLowerMargin(double margin) 分類軸下(左)邊距
          void setUpperMargin(double margin) 分類軸上(右)邊距
          void setVerticalCategoryLabels(boolean flag) 分類軸標(biāo)題是否旋轉(zhuǎn)到垂直
          void setMaxCategoryLabelWidthRatio(float ratio) 分類軸分類標(biāo)簽的最大寬度

          -----------------------------------------------------------------------------------------------------------

          Plot類:
          void setBackgroundImage(Image image) 數(shù)據(jù)區(qū)的背景圖片
          void setBackgroundImageAlignment(int alignment) 數(shù)據(jù)區(qū)的背景圖片對(duì)齊方式(參數(shù)常量在org.jfree.ui.Align類中定義)
          void setBackgroundPaint(Paint paint) 數(shù)據(jù)區(qū)的背景圖片背景色
          void setBackgroundAlpha(float alpha) 數(shù)據(jù)區(qū)的背景透明度(0.0~1.0)
          void setForegroundAlpha(float alpha) 數(shù)據(jù)區(qū)的前景透明度(0.0~1.0)
          void setDataAreaRatio(double ratio) 數(shù)據(jù)區(qū)占整個(gè)圖表區(qū)的百分比
          void setOutLinePaint(Paint paint) 數(shù)據(jù)區(qū)的邊界線條顏色
          void setOutLineStroke(Stroke stroke) 數(shù)據(jù)區(qū)的邊界線條筆觸
          void setNoDataMessage(String message) 沒有數(shù)據(jù)時(shí)顯示的消息
          void setNoDataMessageFont(Font font) 沒有數(shù)據(jù)時(shí)顯示的消息字體
          void setNoDataMessagePaint(Paint paint) 沒有數(shù)據(jù)時(shí)顯示的消息顏色

          CategoryPlot(Plot)類:
          void setDataset(CategoryDataset dataset) 數(shù)據(jù)區(qū)的2維數(shù)據(jù)表
          void setColumnRenderingOrder(SortOrder order) 數(shù)據(jù)分類的排序方式
          void setAxisOffset(Spacer offset) 坐標(biāo)軸到數(shù)據(jù)區(qū)的間距
          void setOrientation(PlotOrientation orientation) 數(shù)據(jù)區(qū)的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)
          void setDomainAxis(CategoryAxis axis) 數(shù)據(jù)區(qū)的分類軸
          void setDomainAxisLocation(AxisLocation location) 分類軸的位置(參數(shù)常量在org.jfree.chart.axis.AxisLocation類中定義)
          void setDomainGridlinesVisible(boolean visible) 分類軸網(wǎng)格是否可見
          void setDomainGridlinePaint(Paint paint) 分類軸網(wǎng)格線條顏色
          void setDomainGridlineStroke(Stroke stroke) 分類軸網(wǎng)格線條筆觸
          void setRangeAxis(ValueAxis axis) 數(shù)據(jù)區(qū)的數(shù)據(jù)軸
          void setRangeAxisLocation(AxisLocation location) 數(shù)據(jù)軸的位置(參數(shù)常量在org.jfree.chart.axis.AxisLocation類中定義)
          void setRangeGridlinesVisible(boolean visible) 數(shù)據(jù)軸網(wǎng)格是否可見
          void setRangeGridlinePaint(Paint paint) 數(shù)據(jù)軸網(wǎng)格線條顏色
          void setRangeGridlineStroke(Stroke stroke) 數(shù)據(jù)軸網(wǎng)格線條筆觸
          void setRenderer(CategoryItemRenderer renderer) 數(shù)據(jù)區(qū)的表示者(詳見Renderer組)
          void addAnnotation(CategoryAnnotation annotation) 給數(shù)據(jù)區(qū)加一個(gè)注釋
          void addRangeMarker(Marker marker,Layer layer) 給數(shù)據(jù)區(qū)加一個(gè)數(shù)值范圍區(qū)域

          PiePlot(Plot)類:
          void setDataset(PieDataset dataset) 數(shù)據(jù)區(qū)的1維數(shù)據(jù)表
          void setIgnoreNullValues(boolean flag) 忽略無(wú)值的分類
          void setCircular(boolean flag) 餅圖是否一定是正圓
          void setStartAngle(double angle) 餅圖的初始角度
          void setDirection(Rotation direction) 餅圖的旋轉(zhuǎn)方向
          void setExplodePercent(int section,double percent) 抽取的那塊(1維數(shù)據(jù)表的分類下標(biāo))以及抽取出來(lái)的距離(0.0~1.0),3D餅圖無(wú)效
          void setLabelBackgroundPaint(Paint paint) 分類標(biāo)簽的底色
          void setLabelFont(Font font) 分類標(biāo)簽的字體
          void setLabelPaint(Paint paint) 分類標(biāo)簽的字體顏色
          void setLabelLinkMargin(double margin) 分類標(biāo)簽與圖的連接線邊距
          void setLabelLinkPaint(Paint paint) 分類標(biāo)簽與圖的連接線顏色
          void setLabelLinkStroke(Stroke stroke) 分類標(biāo)簽與圖的連接線筆觸
          void setLabelOutlinePaint(Paint paint) 分類標(biāo)簽邊框顏色
          void setLabelOutlineStroke(Paint paint) 分類標(biāo)簽邊框筆觸
          void setLabelShadowPaint(Paint paint) 分類標(biāo)簽陰影顏色
          void setMaximumLabelWidth(double width) 分類標(biāo)簽的最大長(zhǎng)度(0.0~1.0)
          void setPieIndex(int index) 餅圖的索引(復(fù)合餅圖中用到)
          void setPieIndex(int index)    餅圖的索引(復(fù)合餅圖中用到)
          void setSectionOutlinePaint(int section,Paint paint) 指定分類餅的邊框顏色
          void setSectionOutlineStroke(int section,Stroke stroke) 指定分類餅的邊框筆觸
          void setSectionPaint(int section,Paint paint) 指定分類餅的顏色
          void setShadowPaint(Paint paint)   餅圖的陰影顏色
          void setShadowXOffset(double offset)   餅圖的陰影相對(duì)圖的水平偏移
          void setShadowYOffset(double offset)   餅圖的陰影相對(duì)圖的垂直偏移
          void setLabelGenerator(PieSectionLabelGenerator generator) 分類標(biāo)簽的格式,設(shè)置成null則整個(gè)標(biāo)簽包括連接線都不顯示
          void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠標(biāo)移上的顯示格式
          void setURLGenerator(PieURLGenerator generator)   MAP中鉆取鏈接格式

          PiePlot3D(PiePlot)類:
          void setDepthFactor(double factor)   3D餅圖的Z軸高度(0.0~1.0)

          MultiplePiePlot(Plot)類:
          void setLimit(double limit)    每個(gè)餅圖之間的數(shù)據(jù)關(guān)聯(lián)(詳細(xì)比較復(fù)雜)  
          void setPieChart(JFreeChart pieChart)   每個(gè)餅圖的顯示方式(見JFreeChart類個(gè)PiePlot類)

          -----------------------------------------------------------------------------------------------------------


          AbstractRenderer類:
          void setItemLabelAnchorOffset(double offset)     數(shù)據(jù)標(biāo)簽的與數(shù)據(jù)點(diǎn)的偏移
          void setItemLabelsVisible(boolean visible)     數(shù)據(jù)標(biāo)簽是否可見
          void setItemLabelFont(Font font)      數(shù)據(jù)標(biāo)簽的字體
          void setItemLabelPaint(Paint paint)      數(shù)據(jù)標(biāo)簽的字體顏色
          void setItemLabelPosition(ItemLabelPosition position)    數(shù)據(jù)標(biāo)簽位置
          void setPositiveItemLabelPosition(ItemLabelPosition position)   正數(shù)標(biāo)簽位置
          void setNegativeItemLabelPosition(ItemLabelPosition position)   負(fù)數(shù)標(biāo)簽位置
          void setOutLinePaint(Paint paint)      圖形邊框的線條顏色
          void setOutLineStroke(Stroke stroke)      圖形邊框的線條筆觸
          void setPaint(Paint paint)       所有分類圖形的顏色
          void setShape(Shape shape)       所有分類圖形的形狀(如折線圖的點(diǎn))
          void setStroke(Stroke stroke)       所有分類圖形的筆觸(如折線圖的線)
          void setSeriesItemLabelsVisible(int series,boolean visible)   指定分類的數(shù)據(jù)標(biāo)簽是否可見
          void setSeriesItemLabelFont(int series,Font font)    指定分類的數(shù)據(jù)標(biāo)簽的字體
          void setSeriesItemLabelPaint(int series,Paint paint)    指定分類的數(shù)據(jù)標(biāo)簽的字體顏色
          void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 數(shù)據(jù)標(biāo)簽位置
          void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正數(shù)標(biāo)簽位置
          void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 負(fù)數(shù)標(biāo)簽位置
          void setSeriesOutLinePaint(int series,Paint paint)    指定分類的圖形邊框的線條顏色
          void setSeriesOutLineStroke(int series,Stroke stroke)    指定分類的圖形邊框的線條筆觸
          void setSeriesPaint(int series,Paint paint)     指定分類圖形的顏色
          void setSeriesShape(int series,Shape shape)     指定分類圖形的形狀(如折線圖的點(diǎn))
          void setSeriesStroke(int series,Stroke stroke)     指定分類圖形的筆觸(如折線圖的線)

          AbstractCategoryItemRenderer(AbstractRenderer)類:
          void setLabelGenerator(CategoryLabelGenerator generator)   數(shù)據(jù)標(biāo)簽的格式
          void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠標(biāo)移上的顯示格式
          void setItemURLGenerator(CategoryURLGenerator generator)   MAP中鉆取鏈接格式
          void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分類的數(shù)據(jù)標(biāo)簽的格式
          void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分類的MAP中鼠標(biāo)移上的顯示格式
          void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分類的MAP中鉆取鏈接格式

          BarRenderer(AbstractCategoryItemRenderer)類:
          void setDrawBarOutline(boolean draw)      是否畫圖形邊框
          void setItemMargin(double percent)      每個(gè)BAR之間的間隔
          void setMaxBarWidth(double percent)      每個(gè)BAR的最大寬度
          void setMinimumBarLength(double min)      最短的BAR長(zhǎng)度,避免數(shù)值太小而顯示不出
          void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 無(wú)法在BAR中顯示的正數(shù)標(biāo)簽位置
          void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 無(wú)法在BAR中顯示的負(fù)數(shù)標(biāo)簽位置

          BarRenderer3D(BarRenderer)類:
          void setWallPaint(Paint paint)    3D坐標(biāo)軸的墻體顏色

          StackedBarRenderer(BarRenderer)類:
          沒有特殊的設(shè)置

          StackedBarRenderer3D(BarRenderer3D)類:
          沒有特殊的設(shè)置

          GroupedStackedBarRenderer(StackedBarRenderer)類:
          void setSeriesToGroupMap(KeyToGroupMap map) 將分類自由的映射成若干個(gè)組(KeyToGroupMap.mapKeyToGroup(series,group))

          LayeredBarRenderer(BarRenderer)類:
          void setSeriesBarWidth(int series,double width) 設(shè)定每個(gè)分類的寬度(注意設(shè)置不要使某分類被覆蓋)

          WaterfallBarRenderer(BarRenderer)類:
          void setFirstBarPaint(Paint paint)   第一個(gè)柱圖的顏色
          void setLastBarPaint(Paint paint)   最后一個(gè)柱圖的顏色
          void setPositiveBarPaint(Paint paint)   正值柱圖的顏色
          void setNegativeBarPaint(Paint paint)   負(fù)值柱圖的顏色

          IntervalBarRenderer(BarRenderer)類:
          需要傳IntervalCategoryDataset作為數(shù)據(jù)源

          GanttBarRenderer(IntervalBarRenderer)類:
          void setCompletePaint(Paint paint)   完成進(jìn)度顏色
          void setIncompletePaint(Paint paint)   未完成進(jìn)度顏色
          void setStartPercent(double percent)   設(shè)置進(jìn)度條在整條中的起始位置(0.0~1.0)
          void setEndPercent(double percent)   設(shè)置進(jìn)度條在整條中的結(jié)束位置(0.0~1.0)

          StatisticBarRenderer(BarRenderer)類:
          需要傳StatisticCategoryDataset作為數(shù)據(jù)源

          LineAndShapeRenderer(AbstractCategoryItemRenderer)類:
          void setDrawLines(boolean draw)    是否折線的數(shù)據(jù)點(diǎn)之間用線連
          void setDrawShapes(boolean draw)   是否折線的數(shù)據(jù)點(diǎn)根據(jù)分類使用不同的形狀
          void setShapesFilled(boolean filled)   所有分類是否填充數(shù)據(jù)點(diǎn)圖形
          void setSeriesShapesFilled(int series,boolean filled) 指定分類是否填充數(shù)據(jù)點(diǎn)圖形
          void setUseFillPaintForShapeOutline(boolean use) 指定是否填充數(shù)據(jù)點(diǎn)的Paint也被用于畫數(shù)據(jù)點(diǎn)形狀的邊框

          LevelRenderer(AbstractCategoryItemRenderer)類:
          void setItemMargin(double percent)   每個(gè)分類之間的間隔
          void setMaxItemWidth(double percent)   每個(gè)分類的最大寬度

          CategoryStepRenderer(AbstractCategoryItemRenderer)類:
          void setStagger(boolean shouldStagger)   不同分類的圖是否交錯(cuò)

          MinMaxCategoryRenderer(AbstractCategoryItemRenderer)類:
          void setDrawLines(boolean drawLines)   是否在每個(gè)分類線間畫連接線
          void setGroupPaint(Paint groupPaint)   一組圖形連接線的顏色
          void setGroupStroke(Stroke groupStroke)   一組圖形連接線的筆觸
          void setMaxIcon(Icon maxIcon)    最大值的ICON
          void setMinIcon(Icon minIcon)    最小值的ICON
          void setObjectIcon(Icon objectIcon)   所有值的ICON

          AreaRender(AbstractCategoryItemRenderer)類:
          沒有特殊的設(shè)置

          StackedAreaRender(AreaRender)類:
          沒有特殊的設(shè)置

          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-07 13:46 todayx.org 閱讀(262) | 評(píng)論 (0)編輯 收藏
               摘要: 歷史上的今天回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天http://www.todayx.org/每天在寫Java程序, 其實(shí)里面有一些細(xì)節(jié)大家可能沒怎么注意, 這不, 有人總結(jié)了一個(gè)我們編程中常見的問(wèn)題. 雖然一般沒有什么大問(wèn)題, 但是最好別這樣做. 另外這里提到的很多問(wèn)題其實(shí)可以通過(guò)Findbugs( http:/...  閱讀全文
          posted @ 2012-02-05 22:56 todayx.org 閱讀(232) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          今天我不談抱負(fù)理想,也不談具體的技術(shù),我來(lái)談幾個(gè)看法上的典型錯(cuò)誤。下面的這些問(wèn)題都是我曾經(jīng)遇到,或者是我的朋友們遇到過(guò)的問(wèn)題,這些都是我個(gè)人的理解,希望對(duì)大家有幫助。

           

          關(guān)于設(shè)計(jì)模式、設(shè)計(jì)原則

          有人認(rèn)為,熟悉了設(shè)計(jì)模式、設(shè)計(jì)原則,就學(xué)會(huì)了設(shè)計(jì)。其實(shí),設(shè)計(jì)模式和設(shè)計(jì)原則,只是前人根據(jù)設(shè)計(jì)實(shí)踐做的總結(jié)和提煉,設(shè)計(jì),歸根到底是要解決問(wèn)題的,把具體問(wèn)題的解決辦法,經(jīng)過(guò)一定的抽象,變成程序員的語(yǔ)言

          我見過(guò)一些人,他們知識(shí)淵博、見識(shí)廣博,甚至理論可以給你闡述得冠冕堂皇,但是到了實(shí)際需要解決問(wèn)題的時(shí)候,他們卻拿不出巧妙的、優(yōu)雅的辦法,這是典型的象牙塔人

          另一方面,也有一些人看不起學(xué)習(xí)設(shè)計(jì)模式的人,他們覺得他們已經(jīng)掌握了軟件設(shè)計(jì)的奧義,這些對(duì)他們來(lái)說(shuō)是毫無(wú)意義的詞匯,對(duì)此大可以一笑置之。

          有時(shí)候我們反而被設(shè)計(jì)模式或設(shè)計(jì)原則粗暴的掌握束縛了手腳,譬如我遇到這樣一件事情,某位努力的程序員,設(shè)計(jì)的代碼用遍了組合(例如把User對(duì)象 放置到Administrator里面),我好奇地問(wèn),有一些類和對(duì)象之間的關(guān)系很明顯符合繼承的特征,為什么不愿意用它?他說(shuō),設(shè)計(jì)原則告訴我們,要多 用組合,少用繼承。我想,對(duì)這些優(yōu)秀的模式、原則、方法論,如果不能透徹地掌握,不能根據(jù)實(shí)際場(chǎng)景合適地運(yùn)用,是不是反而不如對(duì)其不了解來(lái)的好呢?

           

          關(guān)于多種計(jì)算機(jī)語(yǔ)言的學(xué)習(xí)

          有人覺得學(xué)習(xí)一種語(yǔ)言就可以了,學(xué)習(xí)那么多語(yǔ)言沒有必要。事實(shí)上,多掌握一門合適的計(jì)算機(jī)語(yǔ)言不僅僅是多掌握一種謀生的工具,如果一種新的語(yǔ)言能夠很大程度上改變你對(duì)編程、對(duì)設(shè)計(jì)的看法,那么興許它就值得你去學(xué)習(xí)

          譬如C語(yǔ)言,可以培養(yǎng)嚴(yán)謹(jǐn)?shù)乃季S;譬如動(dòng)態(tài)語(yǔ)言,它可以幫助程序員更好地做面向?qū)ο蟮腸oding;譬如函數(shù)式語(yǔ)言,它在工業(yè)生產(chǎn)、運(yùn)算領(lǐng)域有著不可替代的作用。

          當(dāng)然話說(shuō)回來(lái),所謂術(shù)業(yè)有專攻,對(duì)于某一門計(jì)算機(jī)語(yǔ)言(包括該語(yǔ)言所需的運(yùn)行時(shí)環(huán)境、其中的編譯或解釋的原理)深入的掌握,是很有必要的。

          另外,我們時(shí)常看到諸多計(jì)算機(jī)語(yǔ)言孰優(yōu)孰劣的爭(zhēng)論,計(jì)算機(jī)語(yǔ)言歸根到底是一種工具,工具是隨著時(shí)代發(fā)展升級(jí)和變更的,單純的優(yōu)劣爭(zhēng)論沒有太大意義。

           

          關(guān)于英語(yǔ)

          中國(guó)人為什么要學(xué)英語(yǔ),程序員為什么要學(xué)英語(yǔ),當(dāng)我把那些方法名、變量名全部取成拼音,一樣可以,誰(shuí)下的這個(gè)破規(guī)定?

          遺憾的是,諸多學(xué)習(xí)材料、論文、技術(shù)資料(尤其是一些剛出不久的技術(shù)),都是英語(yǔ)的;另一方面,國(guó)際標(biāo)準(zhǔn)、程序員交流的通用方式,都是英文的,我想肯定很難想象,那些有名的framework、lib的源碼,如果用拼音來(lái)寫變量名會(huì)成什么樣子。

          所以,如果你的英語(yǔ)不好(至少讀寫不好),就不要給自己找太借口,英語(yǔ)是一個(gè)掌握其他工具的工具,除非你堅(jiān)信,中文很快就會(huì)在計(jì)算機(jī)界變成世界第一通用的語(yǔ)言。

           

          關(guān)于算法

          算法有多重要,這一件事的爭(zhēng)議一直都很大。

          軟件歸根到底是用來(lái)解決問(wèn)題的,提到算法就不能不提到數(shù)學(xué)(這也是為什么很多軟件領(lǐng)域的大師都具備相當(dāng)?shù)臄?shù)學(xué)背景),對(duì)于解決問(wèn)題,這里可以簡(jiǎn)單歸納成兩步:

          (1)把實(shí)際的問(wèn)題抽象成簡(jiǎn)化的數(shù)學(xué)模型

          (2)用算法去解決這個(gè)數(shù)學(xué)問(wèn)題

          算法,在這里應(yīng)該是一個(gè)廣義的概念(這里的算法并不僅僅指大學(xué)里學(xué)習(xí)的狹義的具體算法),算法是解決上述數(shù)學(xué)問(wèn)題的辦法。如果工作中你并未意識(shí)到它的存在,那只是說(shuō)明,你抽象出的數(shù)學(xué)模型比較簡(jiǎn)單,解決這個(gè)模型的辦法也很簡(jiǎn)單,或者有現(xiàn)成的方式可以模仿,或者有現(xiàn)成的框架幫你完成了,以至于你不去關(guān)注它、在乎它

          如果你做的事情是充滿創(chuàng)新意義的,是別人從沒有做過(guò)的,這時(shí)候算法興許就成了決定你成敗的因素。

          在當(dāng)前中國(guó)的環(huán)境下,視野廣闊和經(jīng)歷豐富的人很好找,但是企業(yè)要招到具備上述兩點(diǎn)能力來(lái)解決問(wèn)題的人,其實(shí)是非常困難的。

           

          關(guān)于經(jīng)驗(yàn)

          唯經(jīng)驗(yàn)論者的人有很多,他們認(rèn)為,在軟件企業(yè)的職位、薪水、甚至決策能力,都取決于經(jīng)驗(yàn),一個(gè)5年經(jīng)驗(yàn)的工程師,肯定比3年經(jīng)驗(yàn)的工程師能找到更好的飯碗:

          “我是老員工,我工作5年了,憑什么工作3年的他薪水比我高那么多”

          實(shí)際上,很多因素,包括領(lǐng)域積累(這是業(yè)務(wù)上的,例如互聯(lián)網(wǎng)領(lǐng)域、傳統(tǒng)軟件領(lǐng)域,這和所謂的純技術(shù)沒有直接關(guān)系)、視野、承受壓力的能力等等往往都 在很大程度上取決于“經(jīng)驗(yàn)”的積累,但是,這并不是絕對(duì)的。有句話叫做“事業(yè)一半是干出來(lái)的,一半是總結(jié)出來(lái)的”,也確實(shí)有一些出色的程序員,他們善于總 結(jié)、善于觀察和積累,并且善于不斷地思考,這樣的程序員就是擁有更多優(yōu)秀的經(jīng)驗(yàn)。

          另一方面,程序員是要來(lái)解決問(wèn)題的,經(jīng)驗(yàn)不能代替解決問(wèn)題,有的人具備更優(yōu)秀的解決問(wèn)題的能力,他為什么就不能得到更優(yōu)厚的薪水?


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-05 22:53 todayx.org 閱讀(256) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          越來(lái)越多人開始使用Java,但是他們大多數(shù)人沒有做好足夠的思想準(zhǔn)備(沒有接受OO思想體系相關(guān)培訓(xùn)),以致不能很好駕馭Java項(xiàng)目,甚至導(dǎo)致 開發(fā)后的Java系統(tǒng)性能緩慢甚至經(jīng)常當(dāng)機(jī)。很多人覺得這是Java復(fù)雜導(dǎo)致,其實(shí)根本原因在于:我們?cè)日莆盏年P(guān)于軟件知識(shí)(OO方面)不是太貧乏就是 不恰當(dāng),存在認(rèn)識(shí)上和方法上的誤區(qū)。

            軟件的生命性

            軟件是有生命的,這可能是老調(diào)重彈了,但是因?yàn)樗玛P(guān)分層架構(gòu)的原由,反復(fù)強(qiáng)調(diào)都不過(guò)分。

            一個(gè)有生命的軟件首先必須有一個(gè)靈活可擴(kuò)展的基礎(chǔ)架構(gòu),其次才是完整的功能。

            目前很多人對(duì)軟件的思想還是焦點(diǎn)落在后者:完整的功能,覺得一個(gè)軟件功能越完整越好,其實(shí)關(guān)鍵還是架構(gòu)的靈活性,就是前者,基礎(chǔ)架構(gòu)好,功能添 加只是時(shí)間和工作量問(wèn)題,但是如果架構(gòu)不好,功能再完整,也不可能包括未來(lái)所有功能,軟件是有生命的,在未來(lái)成長(zhǎng)時(shí),更多功能需要加入,但是因?yàn)榛A(chǔ)架構(gòu) 不靈活不能方便加入,死路一條。

            正因?yàn)槠胀ㄈ藢?duì)軟件存在短視誤區(qū),對(duì)功能追求高于基礎(chǔ)架構(gòu),很多吃了虧的老程序員就此離開軟件行業(yè),帶走寶貴的失敗經(jīng)驗(yàn),新的盲目的年輕程序員 還是使用老的思維往前沖。其實(shí)很多國(guó)外免費(fèi)開源框架如ofbiz compiere和slide也存在這方面陷阱,貌似非常符合胃口,其實(shí)類似國(guó)內(nèi)那些幾百元的盜版軟件,擴(kuò)展性以及持續(xù)發(fā)展性嚴(yán)重不足。

            那么選擇現(xiàn)在一些流行的框架如Hibernate、Spring/Jdonframework是否就表示基礎(chǔ)架構(gòu)打好了呢?其實(shí)還不盡然,關(guān)鍵還是取決于你如何使用這些框架來(lái)搭建你的業(yè)務(wù)系統(tǒng)。

            存儲(chǔ)過(guò)程和復(fù)雜SQL語(yǔ)句的陷阱

            首先談?wù)劥鎯?chǔ)過(guò)程使用的誤區(qū),使用存儲(chǔ)過(guò)程架構(gòu)的人以為可以解決性能問(wèn)題,其實(shí)它正是導(dǎo)致性能問(wèn)題的罪魁禍?zhǔn)字唬騻€(gè)比喻:如果一個(gè)人頻臨死亡,打一針可以讓其延長(zhǎng)半年,但是打了這針,其他所有醫(yī)療方案就全部失效,請(qǐng)問(wèn)你會(huì)使用這種短視方案嗎?

            為什么這樣說(shuō)呢?如果存儲(chǔ)過(guò)程都封裝了業(yè)務(wù)過(guò)程,那么運(yùn)行負(fù)載都集中在數(shù)據(jù)庫(kù)端,要中間J2EE應(yīng)用服務(wù)器干什么?要中間服務(wù)器的分布式計(jì)算和 集群能力做什么?只能回到過(guò)去集中式數(shù)據(jù)庫(kù)主機(jī)時(shí)代。現(xiàn)在軟件都是面向互聯(lián)網(wǎng)的,不象過(guò)去那樣局限在一個(gè)小局域網(wǎng),多用戶并發(fā)訪問(wèn)量都是無(wú)法確定和衡量, 依靠一臺(tái)數(shù)據(jù)庫(kù)主機(jī)顯然是不能夠承受這樣惡劣的用戶訪問(wèn)環(huán)境的。(當(dāng)然搞數(shù)據(jù)庫(kù)集群也只是五十步和百步的區(qū)別)。

            從分層角度來(lái)看,現(xiàn)在三層架構(gòu):表現(xiàn)層、業(yè)務(wù)層和持久層,三個(gè)層次應(yīng)該分割明顯,職責(zé)分明:持久層職責(zé)持久化保存業(yè)務(wù)模型對(duì)象,業(yè)務(wù)層對(duì)持久層 的調(diào)用只是幫助我們激活曾經(jīng)委托其保管的對(duì)象,所以,不能因?yàn)槌志脤邮潜9苷撸覀兙鸵云錇楹诵膰@其編程,除了要求其歸還模型對(duì)象外,還要求其做其做復(fù) 雜的業(yè)務(wù)組合。打個(gè)比喻:你在火車站將水果和盤子兩個(gè)對(duì)象委托保管處保管,過(guò)了兩天來(lái)取時(shí),你還要求保管處將水果去皮切成塊,放在盤子里,做成水果盤給 你,合理嗎?

            上面是談過(guò)分依賴持久層的一個(gè)現(xiàn)象,還有一個(gè)正好相反現(xiàn)象,持久層散發(fā)出來(lái),開始擠占業(yè)務(wù)層,腐蝕業(yè)務(wù)層,整個(gè)業(yè)務(wù)層到處看見的是數(shù)據(jù)表的影子 (包括數(shù)據(jù)表的字段),而不是業(yè)務(wù)對(duì)象。這樣程序員應(yīng)該多看看OO經(jīng)典PoEAA.PoEAA 認(rèn)為除了持久層,不應(yīng)該在其他地方看到數(shù)據(jù)表或表字段名。

            當(dāng)然適量使用存儲(chǔ)過(guò)程,使用數(shù)據(jù)庫(kù)優(yōu)點(diǎn)也是允許的。按照Evans DDD理論,可以將SQL語(yǔ)句和存儲(chǔ)過(guò)程作為規(guī)則Specification一部分。

            Hibernate等ORM問(wèn)題

            現(xiàn)在使用Hibernate人也不少,但是他們發(fā)現(xiàn)Hibernate性能緩慢,所以尋求解決方案,其實(shí)并不是 Hibernate性能緩慢,而是我們使用方式發(fā)生錯(cuò)誤:

            "最近本人正搞一個(gè)項(xiàng)目,項(xiàng)目中我們用到了struts1.2+hibernate3, 由于關(guān)系復(fù)雜表和表之間的關(guān)系很多,在很多地方把lazy都設(shè)置false,所以導(dǎo)致數(shù)據(jù)一加載很慢,而且查詢一條數(shù)據(jù)更是非常的慢。"

            Hibernate是一個(gè)基于對(duì)象模型持久化的技術(shù),因此,關(guān)鍵是我們需要設(shè)計(jì)出高質(zhì)量的對(duì)象模型,遵循DDD領(lǐng)域建模原則,減少降低關(guān)聯(lián),通 過(guò)分層等有效辦法處理關(guān)聯(lián)。如果采取圍繞數(shù)據(jù)表進(jìn)行設(shè)計(jì)編程,加上表之間關(guān)系復(fù)雜(沒有科學(xué)方法處理、偵察或減少這些關(guān)系),必然導(dǎo)致 系統(tǒng)運(yùn)行緩慢,其實(shí)同樣問(wèn)題也適用于當(dāng)初對(duì)EJB的實(shí)體Bean的CMP抱怨上,實(shí)體Bean是Domain Model持久化,如果不首先設(shè)計(jì)Domain Model,而是設(shè)計(jì)數(shù)據(jù)表,和持久化工具設(shè)計(jì)目標(biāo)背道而馳,能不出問(wèn)題嗎?關(guān)于這個(gè)問(wèn)題N多年就在Jdon爭(zhēng)論過(guò)。

            這里同樣延伸出另外一個(gè)問(wèn)題:數(shù)據(jù)庫(kù)設(shè)計(jì)問(wèn)題,數(shù)據(jù)庫(kù)是否需要在項(xiàng)目開始設(shè)計(jì)?

            如果我們進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì),那么就產(chǎn)生了一系列問(wèn)題:當(dāng)我們使用Hibernate實(shí)現(xiàn)持久保存時(shí),必須考慮事先設(shè)計(jì)好的數(shù)據(jù)庫(kù)表結(jié)構(gòu)以及他們的關(guān)系如何和業(yè)務(wù)對(duì)象實(shí)現(xiàn)映射,這實(shí)際上是非常難實(shí)現(xiàn)的,這也是很多人覺得使用ORM框架棘手根本原因所在。

            當(dāng)然,也有腦力相當(dāng)發(fā)達(dá)的人可以實(shí)現(xiàn),但是這種圍繞數(shù)據(jù)庫(kù)實(shí)現(xiàn)映射的結(jié)果必然扭曲業(yè)務(wù)對(duì)象,這類似于兩個(gè)板塊(數(shù)據(jù)表和業(yè)務(wù)對(duì)象)相撞,必然產(chǎn) 生地震,地震的結(jié)果是兩敗俱傷,軟的一方吃虧,業(yè)務(wù)對(duì)象是代碼,相當(dāng)于數(shù)據(jù)表結(jié)構(gòu),屬于軟的一方,最后導(dǎo)致業(yè)務(wù)對(duì)象變成數(shù)據(jù)傳輸對(duì)象DTO, DTO滿天飛,性能和維護(hù)問(wèn)題隨之而來(lái)。

            領(lǐng)域建模解決了上述眾多不協(xié)調(diào)問(wèn)題,特別是ORM痛苦使用問(wèn)題,關(guān)于 ORM/Hibernate使用還是那句老話:如果你不掌握領(lǐng)域建模方法,那么就不要用Hibernate,對(duì)于這個(gè)層次的你:也許No ORM 更是一個(gè)簡(jiǎn)單之道: No ORM: The simplest solution

            Spring分層矛盾問(wèn)題

            Spring是以挑戰(zhàn)EJB面貌出現(xiàn),其本身?yè)碛械膹?qiáng)大組件定制功能是優(yōu)點(diǎn),但是存在實(shí)戰(zhàn)的一些問(wèn)題,Spring作為業(yè)務(wù)層框架,不支持業(yè)務(wù)層Session 功能。

            具體舉例如下:當(dāng)我們實(shí)現(xiàn)購(gòu)物車之類業(yè)務(wù)功能時(shí),需要將購(gòu)物場(chǎng)合保存到 Session中,由于業(yè)務(wù)層沒有方便的Session支持,我們只得將購(gòu)物車保存到 HttpSession,而HttpSession只有通過(guò)HttpRequest才能獲得,再因?yàn)樵赟pring業(yè)務(wù)層容器中是無(wú)法訪問(wèn)到 HttpRequest這個(gè)對(duì)象的,所以,最后我們只能將"購(gòu)物車保存到HttpSession"這個(gè)功能放在表現(xiàn)層中實(shí)現(xiàn),而這個(gè)功能明顯應(yīng)該屬于業(yè)務(wù) 層功能,這就導(dǎo)致我們的Java項(xiàng)目層次混亂,維護(hù)性差。 違背了使用Spring和分層架構(gòu)最初目的。

            領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD

            現(xiàn)在回到我們討論的重點(diǎn)上來(lái),分層架構(gòu)是我們使用Java的根本原因之一,域建模專家Eric Evans在他的"Domain Model Design"一書中開篇首先強(qiáng)調(diào)的是分層架構(gòu),整個(gè)DDD理論實(shí)際是告訴我們?nèi)绾问褂媚P蛯?duì)象oo技術(shù)和分層架構(gòu)來(lái)設(shè)計(jì)實(shí)現(xiàn)一個(gè)Java項(xiàng)目。

            我們現(xiàn)在很多人知道Java項(xiàng)目基本有三層:表現(xiàn)層 業(yè)務(wù)層和持久層,當(dāng)我們執(zhí)著于討論各層框架如何選擇之時(shí),實(shí)際上我們真正的項(xiàng)目開發(fā)工作還沒有開始,就是我們選定了某種框架的組合(如 Struts+Spring+Hibernate或Struts+EJB或Struts+ JdonFramework),我們還沒有意識(shí)到業(yè)務(wù)層工作還需要大量工作,DDD提供了在業(yè)務(wù)層中再劃分新的層次思想,如領(lǐng)域?qū)雍头?wù)層,甚至再細(xì)分為 作業(yè)層、能力層、策略層等等。通過(guò)層次細(xì)化方式達(dá)到復(fù)雜軟件的松耦合。DDD提供了如何細(xì)分層次的方式

            當(dāng)我們將精力花費(fèi)在架構(gòu)技術(shù)層面的討論和研究上時(shí),我們可能忘記以何種依據(jù)選擇這些架構(gòu)技術(shù)?選擇標(biāo)準(zhǔn)是什么?領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD 回答了這樣的問(wèn)題,DDD會(huì)告訴你如果一個(gè)框架不能協(xié)助你實(shí)現(xiàn)分層架構(gòu),那就拋棄它,同時(shí),DDD也指出選擇框架的考慮目的,使得你不會(huì)人云亦云,陷入復(fù) 雜的技術(shù)細(xì)節(jié)迷霧中,迷失了架構(gòu)選擇的根本方向。

            現(xiàn)在也有些人誤以為DDD是一種新的理論,其實(shí)DDD和設(shè)計(jì)模式一樣,不是一種新的理論,而是實(shí)戰(zhàn)經(jīng)驗(yàn)的總結(jié),它將前人 使用面向模型設(shè)計(jì)的方法經(jīng)驗(yàn)提煉出來(lái),供后來(lái)者學(xué)習(xí),以便迅速找到駕馭我們軟件項(xiàng)目的根本之道。


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-04 23:21 todayx.org 閱讀(185) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
               其實(shí)寫這篇博客的想法在年前已經(jīng)有了,但一直在猶豫要不要寫,一是因?yàn)閷懗鰜?lái)肯定會(huì)有人罵的了,剛過(guò)完春節(jié)的,在自己地頭找罵,實(shí)在是晦氣;二是因?yàn)槲覍?duì) 行業(yè)趨勢(shì)的眼光向來(lái)不準(zhǔn),估計(jì)今天的想法也是十有八九會(huì)錯(cuò),錯(cuò)了日后自己的看著也不爽。但是又覺得如果心里有想法,不記錄下來(lái),思緒就飄遠(yuǎn)了,年代久了之 后,都忘記自己曾經(jīng)也有過(guò)“看法”,應(yīng)該會(huì)為自己的庸碌后悔吧?所以還是寫了。寫了歸寫了,請(qǐng)各位看官往下讀之前,先整理好心情,做到:一是自己對(duì)世界有 自己的看法;二是認(rèn)同別人的看法可以跟自己不同;三是對(duì)別人的看法跟自己不同時(shí)不要生氣因?yàn)闅獾氖悄阕约簞e人替不了。如果做到了這三點(diǎn),再往下讀,因?yàn)橄?文的觀點(diǎn)會(huì)很偏激、很有態(tài)度,我歡迎你留言討論、發(fā)表不同的見解,如果純粹是謾罵(或有很多臟詞),建議你自己開一篇博客或發(fā)到你的微博,不要評(píng)論本文, 因?yàn)槲視?huì)刪除“純粹是謾罵(或有很多臟詞)”的評(píng)論。

          ActionScript/MXML

          其實(shí)就是說(shuō) Adobe Flash 平臺(tái)不值得進(jìn)入。在 2011 年,F(xiàn)lash 終于能夠開發(fā) iOS/Android 應(yīng)用,再加上網(wǎng)頁(yè)游戲市場(chǎng)火爆,估計(jì)很多人會(huì)想要進(jìn)入這個(gè)平臺(tái)。但我有不同的看法,列幾點(diǎn)理由:
          1、 Adobe 是市場(chǎng)導(dǎo)向的,沒有技術(shù)領(lǐng)袖氣質(zhì)。視頻網(wǎng)站興起后,F(xiàn)lash Player 的新版本就加強(qiáng)視頻播放;網(wǎng)頁(yè)游戲興起后,新版本就加強(qiáng)圖形渲染;移動(dòng)設(shè)備開發(fā)興起后,新版本就是能夠運(yùn)行在更多的平臺(tái)上。一直在跟隨,從來(lái)不能領(lǐng)導(dǎo);選 擇 Flash 平臺(tái)就意味著你永遠(yuǎn)都不能走在時(shí)代前緣,只能吃別人吃剩下的;選擇 Flash 平臺(tái)就意味著你最急切的需求無(wú)法滿足,比如最近他們都在忙著支持移動(dòng)設(shè)備,我們做網(wǎng)頁(yè)游戲的希望他們加強(qiáng)實(shí)時(shí)性小數(shù)據(jù)包網(wǎng)絡(luò)傳輸?shù)男枨缶透緵]有人理會(huì)。
          2、 HTML5 出來(lái)以后,Adobe 這個(gè)本來(lái)也沒有多少技術(shù)人員的公司還分心去支持它,出把 swf 轉(zhuǎn)為 html+js+css 工具,出圖形化 html5+css3+js 編程的工具。它樂(lè)于革掉自己的命,因?yàn)樗皇莻€(gè)賣工具的,支持 html5 就像是 photoshop 支持多一種圖像格式;但是程序員你呢,你被革命后你的未來(lái)在哪里,見過(guò)當(dāng)年的“中年下崗工人”不?
          3、從 ActionScript 3 發(fā)布之后,這門語(yǔ)言基本上沒有什么變化。你看從 Flash Player 9 發(fā)布 AS3 以來(lái),連 C++、C 語(yǔ)言都出了新的標(biāo)準(zhǔn),java/c# 這類有大公司支持的語(yǔ)言變化巨大,甚至 python 也出了 python 3,更別提 google 公司新出的 go 和 dart 兩門優(yōu)秀的語(yǔ)言。AS3 作為 ECMAScript 的一種方言,現(xiàn)在 ECMA-262 都發(fā)布到 5.1 版本了,它仍然沒有想要跟進(jìn)的樣子。
          4、Flex SDK 類庫(kù)狗血地照抄了早期版本的 java 類庫(kù)的設(shè)計(jì),連缺陷也照抄不誤。你有多少次為了截取 Array 的一部分元素而去看它的手冊(cè)的?這也就算了,還有一堆的 bugs。你知不知道 Application.application 是會(huì)變的?
          5、 虛擬機(jī)方面,javascript 都有了 V8 引擎,而 AVM 還是那個(gè) AVM,無(wú)數(shù)用戶抱怨它慢都沒有用的,優(yōu)先級(jí)高的需求永遠(yuǎn)是更能夠直接賺錢的特性。選擇 Flash 就好像你是一個(gè)賽車手選了一輛小馬力的車,雖然你彎道轉(zhuǎn)得很好,也從不撞車,但可能一輛大馬力的車還是從容地超越你。js 有了 V8 后開發(fā)出了 Node.js 從前端轉(zhuǎn)到后端,拓展了更加廣闊的應(yīng)用領(lǐng)域,AS 在可以預(yù)見的未來(lái),還是逃脫不了“寫點(diǎn)小動(dòng)畫”的命運(yùn)。
          6、Stage 3D 不是救世主。不要忘記“low-level”這個(gè)定語(yǔ),如果你直接使用 Stage 3D APIs 來(lái)編寫程序,你知道那得多么痛苦。選擇 A3D、Away3D 能夠減輕一定的工作量,但使用開源引擎支持較差、特性較少。客觀地說(shuō),寫 3D 應(yīng)用現(xiàn)在應(yīng)該選擇 Unity3D 或 Unrel Engine 3,反正它們也能編譯成 swf 了。
          7、2012 年,網(wǎng)頁(yè)游戲的冬天不來(lái),起碼也是秋天。網(wǎng)頁(yè)游戲的增長(zhǎng)將會(huì)放緩,其實(shí)從 2011 年第四季度可以看到各大公司都開始?jí)嚎s產(chǎn)品線,開始不再大量招工,而是轉(zhuǎn)向消化之前已經(jīng)招到的技術(shù)人員。在 2012 年,將會(huì)有更多的頁(yè)游創(chuàng)業(yè)公司倒閉或轉(zhuǎn)向移動(dòng)設(shè)備游戲開發(fā),AS 開發(fā)人員將會(huì)過(guò)剩,薪資下降。如果你在 2012 年上半年開始進(jìn)入 AS 領(lǐng)域,那么下半年剛有所成的時(shí)候,就會(huì)遇到一大批剛下崗的競(jìng)爭(zhēng)者,高薪夢(mèng)肯定要落空。
          8、移動(dòng)設(shè)備應(yīng)用或游戲開發(fā)在 2012 年還會(huì)受到資本的熱捧,但 AS 在這個(gè)領(lǐng)域的競(jìng)爭(zhēng)力我心存疑慮。Flash 優(yōu)勢(shì)就是跨平臺(tái),而 Unity3D 和 UDK 同樣可以跨平臺(tái),同樣可以使用腳本語(yǔ)言開發(fā),而且性能、效果都更加優(yōu)秀。隨著 Unity3D 和 UDK 可以編譯成 swf 在 Flash Player 上運(yùn)行,學(xué)習(xí) AS 的必要性進(jìn)一步降低。
          綜上 8 點(diǎn),可以看到?jīng)]有技術(shù)基因的 Adobe 公司引導(dǎo)下的 Flash 開發(fā)路線圖缺乏方向,前景模糊,再加上 ActionScript 和 Flex SDK 本身的缺陷,又遇上 Unity3D 和 UDK 這樣的強(qiáng)勁外敵,再加上網(wǎng)頁(yè)游戲大盤下滑,內(nèi)憂外患之下,實(shí)在不是明智之選。Adobe Flash 當(dāng)然不會(huì)死掉,也不會(huì)在 2012 年大量失去市場(chǎng)份額,但 Flash 程序員的 2012 不好過(guò),想活得輕松點(diǎn),注意距離。


          線程

          線程是指進(jìn)程中的一個(gè)單一順序的控制流,是操作系統(tǒng)能夠調(diào)度的最小單位,一個(gè)進(jìn)程中可以有多條線程,分別執(zhí)行不同的任務(wù)。線程有內(nèi)核線程和用戶線程之分,但在本文中僅指內(nèi)核線程。在軟件開發(fā)中,使用線程有以下好處:
          1、在多核或多路 CPU 的機(jī)器上多線程程序能夠并發(fā)執(zhí)行,提高運(yùn)算速度;
          2、把 I/O,人機(jī)交互等與密集運(yùn)算部分分離,提升 I/O 吞吐量和增進(jìn)用戶體驗(yàn)。
          線程的缺點(diǎn)也很明顯:
          1、創(chuàng)建一條線程需要較大的內(nèi)存開銷,導(dǎo)致不能創(chuàng)建海量的線程;
          2、線程由操作系統(tǒng)調(diào)度(分配時(shí)間片),線程切換的 CPU 成本比較高,導(dǎo)致大量線程存在時(shí)大量 CPU 資源消耗在線程切換上;
          3、同一進(jìn)程的多條線程共享全部系統(tǒng)資源,在多線程間共享資源需要進(jìn)入加鎖,大量的鎖開銷不提,重要的是加大了編寫程序的復(fù)雜性,這一點(diǎn)你看看有多少書名含有“多線程”三個(gè)字就明白寫個(gè)多線程應(yīng)用有多難了;
          4、 I/O 方面,多線程幫助有限,以 TCP Socket Server 為例,如果每一個(gè) client connection 由一條專屬的線程服務(wù),那么這個(gè) server 可能并發(fā)量很難超過(guò) 1000。為了進(jìn)一步解決并發(fā)帶來(lái)的問(wèn)題,現(xiàn)代服務(wù)器都使用 event-driven i/o 了。
          event-driven i/o 解決了并發(fā)量的問(wèn)題,但引入了“代碼被回調(diào)函數(shù)分割得零零碎碎”的問(wèn)題。特別是當(dāng) event-driven i/o 跟 multi-threading 結(jié)合在一起的時(shí)候,麻煩就倍增了。解決這個(gè)問(wèn)題的辦法就使用綠色線程,綠色線程可以在同一個(gè)進(jìn)程中成千上萬(wàn)地存在,從而可以在異步 I/O 上封裝出同步的 APIs,典型的就是用基于 greenlet + libevent 開發(fā)的 python 庫(kù) gevent。綠色線程的缺陷在于操作系統(tǒng)不知道它的存在,需要用戶進(jìn)行調(diào)度,也就無(wú)法利用到多核或多路 CPU 了。為了解決這個(gè)問(wèn)題,很多大牛都做出了巨大的努力,并且成果斐然,scala、google go 和 rust 都較好地解決了問(wèn)題,下文以 rust 的并發(fā)模型為例講一下。
          rust 提出一個(gè) Task 的概念,Task 有一個(gè)入口函數(shù),也有自己的棧,并擁有進(jìn)程堆內(nèi)存的一部分,為方便理解,你可以把它看作一條綠色線程。rust 進(jìn)程可以創(chuàng)建成千上萬(wàn)個(gè) Tasks,它們由內(nèi)建的調(diào)度器進(jìn)行調(diào)度,因?yàn)?Tasks 之間并不共享數(shù)據(jù),只通過(guò) channels/ports 通信,所以它們是可并行程度很高。rust 程序啟動(dòng)時(shí)會(huì)生成若干條(數(shù)量由 CPU 核數(shù)決定或運(yùn)行時(shí)指定)線程,這些線程并行執(zhí)行 Tasks,從而利用多個(gè) CPU 核心。

          如 上圖,rust 應(yīng)用程序不停地 spawn 出一個(gè)又一個(gè) Tasks,它們由 tasks 調(diào)度器管理,在適當(dāng)?shù)臅r(shí)機(jī),調(diào)度器會(huì)把某一個(gè) Task 分配給原生線程執(zhí)行,如果這個(gè) Task 進(jìn)入 I/O 等待或主動(dòng)讓出 CPU(sleep),那么這個(gè) Task 會(huì)被交回給調(diào)度器,而相應(yīng)的原生線程會(huì)執(zhí)行另一個(gè)新分派的 Task。盡管使用 rust 編程語(yǔ)言是不能創(chuàng)建線程的(直接調(diào)用 C 函數(shù)不算),但 rust 應(yīng)用程序?qū)嶋H上是多線程的(一般情況下),它能夠充分地利用多核或多路 CPU。
          綜上,類似 rust 的 Task 的概念是比線程更好的并發(fā)模型,更安全,編寫的代碼也更加容易維護(hù)(關(guān)于維護(hù)性,我相信寫過(guò) gevent 程度或 go 程序的同學(xué)會(huì)認(rèn)同的)。線程當(dāng)然不會(huì)消亡,但隨著 scala/go/rust 的成熟,在可以預(yù)見的將來(lái),線程會(huì)退到它呆著的角落:遠(yuǎn)離普通程序員,只有少數(shù)人需要了解它的細(xì)節(jié)。



          C++

          C++ 在 2011 年其實(shí)風(fēng)頭甚勁,C++2011 標(biāo)準(zhǔn)出臺(tái),gcc/msvc/clang 都很快速地支持了許多新特性,新興的移動(dòng)設(shè)備的性能較差,更是 C++ 的新舞臺(tái),在這個(gè)時(shí)候唱衰 C++,壓力很大。我使用 C++ 年頭不少,但除了在校的時(shí)候?qū)戇^(guò)兩個(gè)小游戲參加過(guò)兩個(gè)比賽(分別是面向社會(huì)和面向大學(xué)生的)弄些證書好找工作以外,在工作中只用過(guò)大概不到一年半,做《斬 魂》(http://zh.163.com)的早期版本,寫了服務(wù)器端的幾條進(jìn)程和客戶端的 GameAI 部分。經(jīng)驗(yàn)少,而且寫得不好,所以基本上有人在 weibo 上問(wèn)我 C++ 的問(wèn)題,我都是轉(zhuǎn)發(fā)給 @bnu_chenshuo@miloyip 等真正的行家去回答的。所以實(shí)際上今天寫這一篇,我底氣很是不足,但是朋友們給前兩篇很大面子,弄得我騎虎難下,只好硬著頭皮寫了。
          前 文提到 C++ 的新標(biāo)準(zhǔn),很有必要提一下標(biāo)準(zhǔn)化對(duì) C++ 的影響。首先我們要肯定標(biāo)準(zhǔn)定制對(duì) C++ 的積極作用,但標(biāo)準(zhǔn)化過(guò)程中的超長(zhǎng)流程,一次次將 C++ 推向深淵。C++ 的第一個(gè)標(biāo)準(zhǔn)是 1998 年的 ISO/IEC 14882:1998,距離整個(gè) 90 年代最流行的 C++ 程序庫(kù) MFC(Microsoft Foundation Class Library)的第一個(gè)版本發(fā)行時(shí)間已經(jīng)整整  6 年。1998 年,MFC 版本號(hào)為 6.0,與其一起發(fā)布的 Visual C++ 6.0 占有了巨大的市場(chǎng)。因?yàn)?MFC 發(fā)布得標(biāo)準(zhǔn)制定的時(shí)間早,所以 MFC 內(nèi)部實(shí)現(xiàn)了許多后來(lái)標(biāo)準(zhǔn)庫(kù)里也有的組件,比如各種數(shù)據(jù)結(jié)構(gòu)容器。VC6 的市場(chǎng)占有率讓 windows 平臺(tái)下開發(fā)的許多 C++ 程序員甚至不知道有 STL,同時(shí)也無(wú)視 C++98 標(biāo)準(zhǔn),從更兼容標(biāo)準(zhǔn)的 VC2002/2003 的市場(chǎng)占有率就可以看出來(lái),直到今天,我知道國(guó)內(nèi)不少公司還是只用 VC6 的。
          其實(shí)在 90 年代,計(jì)算機(jī)的運(yùn)算能力有限,市場(chǎng)上非常需要一款性能較高、抽象較強(qiáng)的編程語(yǔ)言,C++ 獲得了成功,但它標(biāo)準(zhǔn)化的時(shí)間過(guò)長(zhǎng),造成各種編譯器有各自互不兼容的“方言”,成了它的第一個(gè)軟肋。第一個(gè)瞄準(zhǔn)這個(gè)軟肋的就是 java,java 在 1995 年推出,雖然性能稍遜,但它有更高的抽象能力、也更安全,并且更容易跨平臺(tái),所以迅速獲得了成功;第二個(gè)瞄準(zhǔn)這個(gè)軟肋的是 C#,微軟不能推動(dòng) C++ 發(fā)展,又不愿 C++ 的市場(chǎng)被 java 鯨吞,于是在 2001 年推出了 C#,經(jīng)過(guò) 10 年的發(fā)展和微軟大量的金錢推廣,C# 已經(jīng)成功獲得了它應(yīng)有的江湖地位。
          雖然 java/c# 都不是善類,但 C++ 在 21 世紀(jì)的第一個(gè)十年里仍然地位穩(wěn)固,這是因?yàn)? Linux 和 MacOS X 大獲成功,在這兩個(gè)平臺(tái)上 C++ 都是非常有競(jìng)爭(zhēng)力的編程語(yǔ)言,C++ 自然水漲船高。但隨著 web2.0 和 web app 概念的興起,以及 CPU 的主頻進(jìn)一步提升,服務(wù)器端編程語(yǔ)言漸漸地對(duì)執(zhí)行效率不再敏感,而是更在意程序員的開發(fā)效率,眾多的腳本語(yǔ)言開始蠶食 C++ 的市場(chǎng)份額,從早期的 perl 到后期的 python/php/ruby,在 2005 年以后,C++/java/C# 等靜態(tài)類型的編譯型語(yǔ)言的市場(chǎng)份額都下降了,新興的貴族是動(dòng)態(tài)語(yǔ)言。面對(duì)動(dòng)態(tài)語(yǔ)言在開發(fā)效率上的強(qiáng)勁挑戰(zhàn),C++ 社區(qū)除了在 2003 年對(duì) C++98 做了小小的 patch,基本上睡著了,完全沒有應(yīng)對(duì)之策,哦不,連應(yīng)用的姿態(tài)都沒有。
          進(jìn)入 21 世紀(jì)的第二個(gè)十年,市場(chǎng)又發(fā)生了變化,云計(jì)算越走越近,也許我們中的大部分人今天還可以說(shuō)只聞其聲不見其形,但 The Data Center Is the Computer 這句話大家應(yīng)該覺得很務(wù)實(shí):完成一個(gè)用戶操作,在服務(wù)器端的進(jìn)程間通信次數(shù)前所未有地多。在這個(gè)十年,我們需要這樣的編程語(yǔ)言:
          1、能充分利用現(xiàn)代 CPU 的計(jì)算能力,不僅僅是多個(gè)核心,更是巨大的 L1/L2/L3 Cache、超線程等;
          2、能夠大量減小異步 I/O 的性能提升的同時(shí)帶來(lái)的副作用:異步編程的復(fù)雜性以及對(duì)可維護(hù)性的傷害;
          兩 句話其實(shí)也可以壓縮為一句:需要有更好的并發(fā)模型的語(yǔ)言。一開始大家都在已有的編程語(yǔ)言中尋找,然后找到了 erlang,實(shí)踐證明 erlang 自有其局限,所以 google go/scala/rust 等新語(yǔ)言如同雨后春筍般撥地而出。C++2011 標(biāo)準(zhǔn)努力降低 C++ 的編程難度,并提供了線程庫(kù)以支持現(xiàn)代 CPU,如果在 2005 年,這個(gè)標(biāo)準(zhǔn)絕對(duì)有競(jìng)爭(zhēng)力,但在今天,它只能成為新的編程語(yǔ)言的墊腳石。正如 IE 最大的用處是用來(lái)下載其它瀏覽器,不久之后,也許會(huì)流行新的冷笑話:C++ 最大的用處就是用來(lái)實(shí)現(xiàn)其它編程語(yǔ)言。
          市場(chǎng)一直在尋找一門中間的高級(jí) 語(yǔ)言,它上承 C 語(yǔ)言和匯編語(yǔ)言,下啟腳本語(yǔ)言。C++ 最先搶占了高地,并在與 java/c# 的爭(zhēng)斗中不落下風(fēng),但新的十年,它的對(duì)手又增加了 google go/scala/rust 等新銳,并且新的標(biāo)準(zhǔn)不可能在兩三年內(nèi)再次出臺(tái),兩三年內(nèi)新銳成長(zhǎng)起來(lái)后,留給它的位置就不多了。
          上 文討論的基本上都是服務(wù)器編程,有必要再來(lái)看一下桌面和移動(dòng)設(shè)備領(lǐng)域。首先看桌面軟件,rust 是 mozilla 基金會(huì)開發(fā)系統(tǒng)程序語(yǔ)言的,它的定位是部分取代 C++ 開發(fā) firefox 的瀏覽器,所以 rust 會(huì)進(jìn)入桌面開發(fā),google go 肯定會(huì)順道啃一口。移動(dòng)設(shè)備方面,主要是 android、ios 和 windows phone,隨著移動(dòng)設(shè)備性能增強(qiáng),編譯型語(yǔ)言加腳本的模式就會(huì)占大頭,編譯型語(yǔ)言方面主要是 C++ 和 Objective-C 在競(jìng)爭(zhēng),C++ 會(huì)占上風(fēng)(但需求量遠(yuǎn)遠(yuǎn)小于腳本,從 lua 在 2011 年的增長(zhǎng)速度可以印證),但是誰(shuí)知道 rust 之類的會(huì)不會(huì)進(jìn)入移動(dòng)設(shè)備呢,畢竟移動(dòng)設(shè)備的 CPU 核心也越來(lái)越多了呀,C++ 還是前景堪憂。
          回首 C++ 的 30 年,展望它的未來(lái),總結(jié)起來(lái)可能就是:標(biāo)準(zhǔn)化流程拖死人了。如果不是 15 年不能標(biāo)準(zhǔn)化,java/c# 的攪局可能不會(huì)出現(xiàn);如果在 2005 年能夠應(yīng)對(duì)動(dòng)態(tài)語(yǔ)言……如果云時(shí)代有更好的并發(fā)模型……
          題 外話:java/c# 不會(huì)有 C++ 的問(wèn)題,因?yàn)樗鼈冇凶约旱钠脚_(tái),有巨大的財(cái)富支撐。特別是平臺(tái)的作用非常巨大,你可以想像一下如果 Adobe 有自己的瀏覽器或手機(jī)操作系統(tǒng) ActionScript/MXML 會(huì)不會(huì)是今天的境地;也可以想像一下 google go 的飛速發(fā)展動(dòng)力是什么。

          兩點(diǎn)解釋

          1、 我覺得有必要解釋“不宜進(jìn)入”一下這四個(gè)字,我想要表達(dá)的意思就是如果你現(xiàn)在不是這三個(gè)技術(shù)點(diǎn)的專家,并且手上沒有使用這三個(gè)技術(shù)點(diǎn)的項(xiàng)目,進(jìn)入這三個(gè)技 術(shù)點(diǎn)僅為技術(shù)儲(chǔ)備,那么就“不宜進(jìn)入”。另外我不是說(shuō)用了這三個(gè)技術(shù)點(diǎn)的項(xiàng)目就死,學(xué)了這三個(gè)技術(shù)點(diǎn)的人就找不到工作,或者這三個(gè)技術(shù)點(diǎn)明天或明年就 game over,渣都沒得剩,不是這樣的意思,它們還會(huì)存在很長(zhǎng)一段時(shí)間。本文不是叫專家自廢武功,也不是叫已經(jīng)做好技術(shù)造型的項(xiàng)目趕緊兒換技術(shù),舉例說(shuō),如果 你選擇了用 java 做服務(wù)器端,flash 做客戶端開發(fā)一個(gè) webgame,那你最好玩命兒地把 ActionScript/MXML 和 java 多線程編程(及異步 I/O)給鉆透,不然可能隨時(shí)掉陷阱里。
          2、新年新氣象,工作和家庭都有很重要的事情壓在肩上,大家的評(píng)論我不逐條回復(fù)了,我會(huì)在一兩個(gè)星期后再統(tǒng)一寫一篇《2012 不宜進(jìn)入的三個(gè)技術(shù)點(diǎn)(Q&A)》統(tǒng)一回答,還請(qǐng)見諒。

          posted @ 2012-02-04 23:19 todayx.org 閱讀(195) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          勞動(dòng)密集型公司

          這樣的公司以業(yè)務(wù)為導(dǎo)向,市場(chǎng)團(tuán)隊(duì)在公司中占據(jù)較高的地位。每一個(gè)技術(shù)人員最終被折算到了“人天”里面去,團(tuán)隊(duì)規(guī)模相對(duì)較大,所有技術(shù)人員都比較容 易被替代,能力強(qiáng)的可以做更多的事情,能力弱的就少做一些。通過(guò)強(qiáng)有力的制度、政策和流程的規(guī)約,團(tuán)隊(duì)有條不紊地運(yùn)作起來(lái)。業(yè)務(wù)氛圍強(qiáng)勢(shì),技術(shù)通道升級(jí)較 慢,需要非常長(zhǎng)期的積累才可以獲得豐厚的回報(bào),諸多優(yōu)秀人才脫離編碼,而潛心轉(zhuǎn)管理、談需求并獲得回報(bào)。愿意招納畢業(yè)生編碼,以減小運(yùn)營(yíng)成本。只鼓勵(lì)小范 圍、淺層次的創(chuàng)新,對(duì)于優(yōu)秀的創(chuàng)意、想法,必須轉(zhuǎn)化為生產(chǎn)力才能夠被認(rèn)可。

           

          技術(shù)密集型公司

          這樣的公司較為重視技術(shù)和創(chuàng)新,敢于在產(chǎn)品中使用預(yù)期能夠帶來(lái)收益的技術(shù)。公司非常愿意招聘一些有豐富研發(fā)經(jīng)驗(yàn)、有廣泛閱歷的程序員加入,同時(shí)也能 吸引一些比較優(yōu)秀的技術(shù)人才,并且長(zhǎng)期為公司工作。團(tuán)隊(duì)人員較少,研發(fā)過(guò)程無(wú)論是從時(shí)間還是環(huán)境來(lái)看,通常比較寬松,用較少約束、任務(wù)驅(qū)動(dòng)的形式,鼓勵(lì)程 序員按期完成下發(fā)的任務(wù)。技術(shù)人員層次劃分較多,不同層次技術(shù)人員在一起辦公,往往都不脫離編碼,和項(xiàng)目結(jié)合緊密。愿意招不同層次的研發(fā)人員,不愿意招經(jīng) 驗(yàn)豐富但脫離技術(shù)的人到研發(fā)團(tuán)隊(duì)。

           

          思維密集型公司

          這樣的公司對(duì)研發(fā)人員思辨能力要求較高,愿意做一些創(chuàng)造性的產(chǎn)品。公司技術(shù)人員的招聘較為嚴(yán)格,更看重人員的創(chuàng)新氣質(zhì)、解決問(wèn)題的思路、建模和抽象 的能力,而對(duì)于具體的某種技術(shù)實(shí)現(xiàn),并沒有很高的要求。團(tuán)隊(duì)人員不多,項(xiàng)目壓力不大,任務(wù)給定的要求和流程約束較少,需要團(tuán)隊(duì)成員較強(qiáng)的自主能力來(lái)解決問(wèn) 題。技術(shù)人員層次劃分不多,討論氣氛濃厚,設(shè)計(jì)精益求精,創(chuàng)新的點(diǎn)子容易得到認(rèn)可并嘗試實(shí)現(xiàn)。

           

          你所在的公司,屬于哪一種?



          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-04 01:10 todayx.org 閱讀(3306) | 評(píng)論 (5)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          漁夫 蛇 青蛙的故事

                     漁夫看到船邊有條蛇,口中正銜著一只青蛙。漁夫動(dòng)了惻隱之心,把青蛙從蛇的口中救了出來(lái)。但漁夫又為蛇將挨餓而難過(guò),便拿出一瓶酒,往蛇的口中滴了幾滴。 蛇高興地游走了,青蛙也為重獲新生而高興,漁夫則為自己的善舉而感到快樂(lè)。他想,這真是皆大歡喜!沒料到,僅僅過(guò)了幾分鐘,漁夫聽到有東西在叩擊他的船 板。他低頭一看,那條蛇又回來(lái)了,而且嘴里咬著兩只青蛙——它來(lái)討要更多酒的獎(jiǎng)賞!  

           

                     漁夫的本意是希望蛇不再捕捉青蛙,但是由于憐憫而給了它幾滴酒——這是獎(jiǎng)勵(lì)而不是懲罰,結(jié)果事與愿違。你獎(jiǎng)勵(lì)了什么行為,就會(huì)得到更多這樣的行為。所以,這則寓言要告訴我們的是,別去獎(jiǎng)勵(lì)那些錯(cuò)誤的行為。

           

          我們?cè)僦v一個(gè)企業(yè)獎(jiǎng)勵(lì)錯(cuò)誤行為的故事

                     一家企業(yè)制定了一個(gè)規(guī)定,如果該企業(yè)的員工加班到晚上7 點(diǎn)可以獲得10元錢的晚餐補(bǔ)助,如果加班到8點(diǎn)可以打出租車回家(平常5點(diǎn)下班)。該獎(jiǎng)勵(lì)制度執(zhí)行了一段時(shí)間之后,公司管理者竟然發(fā)現(xiàn),有很多員工在正常 下班前或者很早就已經(jīng)完成了工作,但是他們居然不正常下班而是留下來(lái)繼續(xù)加班,有的待到七點(diǎn),有的待到八點(diǎn)以后。一個(gè)管理者親眼看見一個(gè)員工在下午4點(diǎn)前 就完成了文檔整理,然后一直在那里上網(wǎng)聊天一直到晚上8點(diǎn)。

           

                     你也行會(huì)認(rèn)為這些員工鉆公司的空子有些不太好,但是這不能完全怪他們,因?yàn)樵缭绲耐瓿晒ぷ鞑灰姷臅?huì)得到公司的獎(jiǎng)勵(lì),相反有意把工作拖到晚上8點(diǎn)之后就可以拿到打車費(fèi),并且能免費(fèi)獲得一頓飯錢,多劃算呀!

           

                     管理者一定要牢記住這句話"受到獎(jiǎng)勵(lì)的事情人們都喜歡去做" 為此管理者應(yīng)該仔細(xì)檢測(cè)獎(jiǎng)勵(lì)制度,哪些是積極的 ,哪些可能帶來(lái)消極的影響,修改掉哪些不合理的部分,通過(guò)獎(jiǎng)勵(lì)正確的行為來(lái)獲得自己想要的結(jié)果。

           

                     美國(guó)管理專家拉伯福認(rèn)為,企業(yè)在獎(jiǎng)勵(lì)員工方面最常范的十個(gè)錯(cuò)誤.

           

                     1、需要好的結(jié)果,卻獎(jiǎng)勵(lì)了那些看上去最忙碌,工作時(shí)間最長(zhǎng)的人
                    
          2、要求工作的質(zhì)量,卻設(shè)下了不合理的完成工期
                    
          3、希望從根本上解決問(wèn)題,卻獎(jiǎng)勵(lì)那些治標(biāo)不治本的人
                    
          4、要求員工對(duì)公司忠誠(chéng),卻支付高薪給新來(lái)的員工或威脅要離職的員工
                    
          5、要求事情簡(jiǎn)單化,卻獎(jiǎng)勵(lì)制造瑣碎和使事情復(fù)雜化的人
                    
          6、想要?jiǎng)?chuàng)造和諧的工作環(huán)境,卻獎(jiǎng)勵(lì)那些光說(shuō)不做并且經(jīng)常抱怨的人
                    
          7、要求員工有創(chuàng)意,卻指責(zé)那些公司里有特立獨(dú)行的人
                    
          8、要求節(jié)儉,卻獎(jiǎng)勵(lì)那些浪費(fèi)資源的人
                    
          9、要求員工有團(tuán)隊(duì)精神,卻犧牲團(tuán)隊(duì)利益獎(jiǎng)勵(lì)那些投機(jī)取巧的人
                    
          10、要求創(chuàng)新,卻獎(jiǎng)勵(lì)保守的人,責(zé)罰未能完成的創(chuàng)意

           

          如何改進(jìn)我們的獎(jiǎng)勵(lì)行為

           

                     孔子云:舉一而不能以三反,不可教也。每一個(gè)治理者都可以對(duì)照拉伯福所說(shuō)的這十種錯(cuò)誤,舉一反三,驗(yàn)照一下自己是不是犯過(guò)類似的錯(cuò)誤。例如:

                    1、 我們 是不是口頭上公布講究實(shí)績(jī)、注重實(shí)效,卻往往獎(jiǎng)勵(lì)了那些專會(huì)做表面文章、投機(jī)取巧之人?

                    2、 我們是不是口頭上公布員工考核以業(yè)績(jī)?yōu)橹鳎瑓s往往憑主觀印象評(píng)價(jià)和獎(jiǎng)勵(lì)員工?

                    3、 我們是不是口頭上公布鼓勵(lì)創(chuàng)新,卻往往處罰了敢于創(chuàng)新之人?

                    4、 我們是不是口頭上公布鼓勵(lì)不同意見,卻往往處罰了敢于發(fā)表不同意見之人?

                    5、 我們是不是口頭上公布按章辦事,卻往往處罰了堅(jiān)持原則的員工?

                    6、 我們是不是口頭上鼓勵(lì)員工勤奮工作、努力奉獻(xiàn),卻往往獎(jiǎng)勵(lì)了不干實(shí)事、專事?lián)v鬼、鉆營(yíng)之人?

           

          總結(jié) 

                     總之,我們每一個(gè)治理者都要牢記:“在表現(xiàn)與獎(jiǎng)勵(lì)之間建立起正確的連帶關(guān)系,是改進(jìn)組織運(yùn)作的唯一要訣”。在考核和獎(jiǎng)勵(lì)員工時(shí)非凡要注重的是,要注重其實(shí) 際業(yè)績(jī),而不要注重其口頭上怎么說(shuō)。不能獎(jiǎng)勵(lì)了投機(jī)取巧,冷落了埋頭實(shí)干,否則以后我們指望誰(shuí)來(lái)做事呢?

           

                     治理大師卡耐基說(shuō)過(guò):我年紀(jì)越大,就越不重視別人說(shuō)些什么,我只看他們做些什么。其實(shí)中國(guó)古賢更早就說(shuō)過(guò)這樣的話:“始吾于人也,聽其言而信其行;今吾于 人也,聽其言而觀其行”。在獎(jiǎng)罰問(wèn)題上,每個(gè)治理者確實(shí)不可粗心大意,草率行事。否則,“種瓜得瓜,種豆得豆”,種下了苦果可是要自己吃的!


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-04 01:08 todayx.org 閱讀(1335) | 評(píng)論 (3)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          博士
             有一個(gè)博士分到一家研究所,成為學(xué)歷最高的一個(gè)人。
             有一天他到單位后面的小池塘去釣魚,正好正副所長(zhǎng)在他的一左一右,也在釣魚。
             他只是微微點(diǎn)了點(diǎn)頭,這兩個(gè)本科生,有啥好聊的呢?
             不一會(huì)兒,正所長(zhǎng)放下釣竿,伸伸懶腰,蹭蹭蹭從水面上如飛地走到對(duì)面上廁所。
             博士眼睛睜得都快掉下來(lái)了。水上飄?不會(huì)吧?這可是一個(gè)池塘啊。
             正所長(zhǎng)上完廁所回來(lái)的時(shí)候,同樣也是蹭蹭蹭地從水上飄回來(lái)了。
             怎么回事?博士生又不好去問(wèn),自己是博士生哪!
             過(guò)一陣,副所長(zhǎng)也站起來(lái),走幾步,蹭蹭蹭地飄過(guò)水面上廁所。這下子博士更是差點(diǎn)昏倒:不會(huì)吧,到了一個(gè)江湖高手集中的地方?
             博士生也內(nèi)急了。這個(gè)池塘兩邊有圍墻,要到對(duì)面廁所非得繞十分鐘的路,而回單位上又太遠(yuǎn),怎么辦?
             博士生也不愿意去問(wèn)兩位所長(zhǎng),憋了半天后,也起身往水里跨:我就不信本科生能過(guò)的水面,我博士生不能過(guò)。
             只聽咚的一聲,博士生栽到了水里。
             兩位所長(zhǎng)將他拉了出來(lái),問(wèn)他為什么要下水,他問(wèn):“為什么你們可以走過(guò)去呢?”  
             兩所長(zhǎng)相視一笑:“這池塘里有兩排木樁子,由于這兩天下雨漲水正好在水面下。我們都知道這木樁的位置,所以可以踩著樁子過(guò)去。你怎么不問(wèn)一聲呢?”  


             這個(gè)故事告訴我們:學(xué)歷代表過(guò)去,只有學(xué)習(xí)力才能代表將來(lái)。尊重經(jīng)驗(yàn)的人,才能少走彎路。一個(gè)好的團(tuán)隊(duì),也應(yīng)該是學(xué)習(xí)型的團(tuán)隊(duì)。 

           

           

          個(gè)人理解和感悟:看學(xué)歷更要看能力

           

             招聘廣告上面我們經(jīng)常會(huì)看到“要求本科以上學(xué)歷”,很少有企業(yè)招聘的時(shí)候 是不在乎學(xué)歷的,而且在一些正規(guī)的企業(yè)里,如果沒有足夠的學(xué)歷,是不予以考慮加薪升職的。企業(yè)在人才的競(jìng)爭(zhēng)上面出現(xiàn)了一種盲目攀比學(xué)歷的不良傾向,現(xiàn)在經(jīng) 常可以看到在某些企業(yè)的官方介紹上面寫“公司的本科以上學(xué)歷占有xx比例”的字眼,,似乎聘用的人才學(xué)歷越高
          越好,在職員工高學(xué)歷的越多越好。有一則消息稱研究生學(xué)歷的人比本科學(xué)歷的人平均年薪要高出2w元,從這里看出,學(xué)歷在企業(yè)招聘和考核中的重要性。

           


             現(xiàn)在越來(lái)越多的人堅(jiān)持考研或者讀MBA,他們認(rèn)為一旦有了高的學(xué)歷就可以“春風(fēng)得意馬蹄疾,一頁(yè)看遍長(zhǎng)安花”了。目前學(xué)歷仍然是一個(gè)隱形的、力量巨大的“殺手”,生生的把沒有一紙文憑的人拒之門外。


             有文憑不等于有水平,沒有學(xué)歷不等于沒有能力,大量的事實(shí)說(shuō)明, 不少才華橫溢、能力卓越的人才,他們并沒有高的學(xué)歷,有的甚至沒有大學(xué)文憑,例如愛迪生、高爾基諾貝爾 比爾蓋茨 喬布斯等,這些人雖然沒有高的學(xué)歷,但是他們?nèi)〉玫某删褪欠欠驳模瑯蝇F(xiàn)實(shí)中生活中也能輕易的發(fā)現(xiàn),很多擁有高學(xué)歷的人在工作中能力平平、毫無(wú)建樹、庸庸 碌碌的過(guò)萬(wàn)了一生,管理者在選擇人才時(shí),只能把學(xué)歷當(dāng)作一種參考條件,更重要的是要看這個(gè)人的實(shí)際能力。如果企業(yè)不從實(shí)際出發(fā),競(jìng)相制定一些高學(xué)歷的規(guī) 定,對(duì)學(xué)歷的要求過(guò)為嚴(yán)格,甚至唯學(xué)歷取人,很難選拔出優(yōu)秀的人才,衡量人才既要有文化程度方面的要求,更總要視履行崗位職責(zé)的能力,真正使那些有學(xué)歷, 有智慧又有能力的人得到重用.

           

              伯 樂(lè)相馬,主要是看馬能否跑千里而不是看馬的出身。近有消息說(shuō),有些用人單位招聘人才的取向已更加務(wù)實(shí),選才標(biāo)準(zhǔn)正在由“學(xué)歷型”向“能力型”轉(zhuǎn)變,這是一 種令人欣慰的轉(zhuǎn)變。畢竟,千里馬是跑出來(lái)的,人才是干出來(lái)的。創(chuàng)造業(yè)績(jī)主要不是靠職前的學(xué)歷,而是靠任職后的實(shí)踐經(jīng)歷和創(chuàng)造性努力。但愿我們公開選拔干部 時(shí),能夠更重任職的能力而不是更重職前的學(xué)歷。

           

             一個(gè)人是否真正的有才能,并不能以學(xué)歷作為衡量的唯一標(biāo)準(zhǔn),管理者在選人、用人時(shí),不要被學(xué)歷遮住了視野,二應(yīng)該把有實(shí)際能力的員工放在最重要的位置上



          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-03 00:00 todayx.org 閱讀(1462) | 評(píng)論 (3)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          春節(jié)前和同事在回家的路上看到了建筑工地,不由的感慨建筑業(yè)相比軟件業(yè)來(lái)講實(shí)在是成熟太多了! 想想看,建筑師設(shè)計(jì)好圖紙,交給建筑公司(大包工頭), 大包工頭再報(bào)給小包工頭, 小包工頭隨便抓一些農(nóng)民工就可以干活了! 農(nóng)民工們可不懂得那么多高深的建筑原理, 對(duì)整個(gè)建筑也并不了解,可是他們只需要把自己的一磚一瓦做好,整個(gè)建筑就能做成了 -- 當(dāng)然也有豆腐渣工程-- 但畢竟是少數(shù),排除在外。

           

          更重要的是他們根本不用擔(dān)心項(xiàng)目的后期客戶突然想改設(shè)計(jì)方案,客戶不會(huì)也不可能要求你把朝北的窗戶挪到南邊去,也不會(huì)要求把10層樓中的第3層和第7層扒掉重蓋。

           

          我們這些苦苦掙扎的碼農(nóng)們肯定會(huì)想, 什么時(shí)候軟件業(yè)也能這樣啊,什么時(shí)候我們也能快樂(lè)編程,按時(shí)上下班,或者以后這些底層的Labor work都讓機(jī)器人做了, 我們都去做需求,架構(gòu),設(shè)計(jì), 然后項(xiàng)目按進(jìn)度,高質(zhì)量的完成, 大家都很happy...

           

          但是無(wú)數(shù)的無(wú)情現(xiàn)實(shí)告訴教育我們:別做夢(mèng)了,這是絕對(duì)不可能的, 至少在可以預(yù)見的時(shí)間段(比如50年)是不可能的, 原因就在于軟件的復(fù)雜性,在現(xiàn)有的技術(shù)情況下, 軟件的固有復(fù)雜性無(wú)法解決, 只有依靠我們這么碼農(nóng)們?nèi)浹a(bǔ)。

           

          為什么軟件這么復(fù)雜, 為什么我們無(wú)法像建筑業(yè)蓋房子,汽車業(yè)裝配汽車一樣去寫軟件?

           

          布魯克斯 在著名的《人月神話》中提到軟件的內(nèi)在復(fù)雜性, 的確,軟件系統(tǒng)的復(fù)雜性遠(yuǎn)遠(yuǎn)超過(guò)建筑業(yè)和制造業(yè), 軟件的需求是在人的腦子中的, 用自然語(yǔ)言都很難完整、準(zhǔn)備的表達(dá)出來(lái),更不用說(shuō)用計(jì)算機(jī)(好吧,更好聽的名字是”電腦“)這種原始的工具了。 不錯(cuò),我用的正是”原始“這個(gè)詞, 從二進(jìn)制語(yǔ)言,到匯編語(yǔ)言,再到高級(jí)語(yǔ)言,其最基本的、最核心的東西依然是順序,循環(huán),分支, 即使加上面向?qū)ο螅瑒?dòng)態(tài)語(yǔ)言,庫(kù), 框架,計(jì)算機(jī)語(yǔ)言的本質(zhì)仍然沒有改變,我們只是在已經(jīng)建好的大廈上做裝飾而已。  使用這種原始的工具,怎么能夠表示復(fù)雜的需求? 

           

          程序員的出現(xiàn)正是為了填充這之間的巨大鴻溝,程序員需要用自己的大腦,使用極其”原始“的工具, 把無(wú)法準(zhǔn)確表述的,尚在腦子中的需求映射到代碼上,其難度可想而知!

           

          當(dāng)然我們程序員也不笨, 在長(zhǎng)期的斗爭(zhēng)中,我們學(xué)會(huì)了把一個(gè)問(wèn)題用劃分為一個(gè)一個(gè)的模塊, 讓這些模塊低耦合,高內(nèi)聚,  我們還學(xué)會(huì)了分層,讓各個(gè)部分的聯(lián)系達(dá)到最小, 可是所有的這些努力只是把復(fù)雜性降低了一點(diǎn), 本質(zhì)的復(fù)雜性依然存在。

           

          未完待續(xù)。。。


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-02 23:59 todayx.org 閱讀(1560) | 評(píng)論 (2)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          酒宴開始。

           

          酒杯盛酒,酒杯碰撞,這是物理層

          你要根據(jù)不同人的外貌特征找到你要敬酒的人所坐的位置,這是IP協(xié)議網(wǎng)絡(luò)層);

          你明白,敬酒的實(shí)際目的是加深感情,這在應(yīng)用層,而這酒中的感情,才是報(bào)文的數(shù)據(jù)部分

           

          你和某位新見面的兄弟互相來(lái)回敬酒,這叫TCP

          你給同一位好兄弟敬酒好多次,死命灌他,他也不回禮,這叫UDP

          你對(duì)全桌的人說(shuō),來(lái),咱們同歸于盡,這叫廣播

          你在對(duì)這一桌的人順序挨個(gè)敬酒,這叫令牌環(huán)

           

           

          你對(duì)該兄弟說(shuō),初次見面,請(qǐng)多關(guān)照,請(qǐng)問(wèn)閣下尊姓大名,敬酒一杯,這叫SYN報(bào)文

          這位兄弟說(shuō),同是天涯淪落人,相逢何必曾相識(shí),喝!這叫ACK報(bào)文

          你一看,對(duì)方的啤酒怎么沒有氣泡啊,不行,你怎么能拿茶水當(dāng)啤酒呢?這叫數(shù)據(jù)校驗(yàn)

           

           

          有一個(gè)兄弟過(guò)來(lái)給你桌上的領(lǐng)導(dǎo)敬酒,你說(shuō)不行,領(lǐng)導(dǎo)喝多了,不能再喝了,這叫防火墻

          有一位兄弟過(guò)來(lái)敬酒,你說(shuō)10分鐘里面已經(jīng)喝了5杯了,達(dá)到我極限了,這叫帶寬

          而且我還沒回禮呢,現(xiàn)在喝不下了,先緩緩,這叫擁塞控制

           

          你現(xiàn)在要給你最好的兄弟敬酒,于是你先找到了他所在的桌子(網(wǎng)絡(luò)號(hào)),再找到他本人的位置(主機(jī)號(hào));

          從你要準(zhǔn)備敬酒到敬酒完成,這叫時(shí)延,其中要經(jīng)歷倒酒(發(fā)送時(shí)延)、碰杯(傳播時(shí)延)、你的兄弟被灌下(處理時(shí)延)這幾個(gè)過(guò)程。

           

          終于,你醉了,你吐了一地,不省人事,這叫緩沖區(qū)溢出

          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          posted @ 2012-02-01 23:19 todayx.org 閱讀(1711) | 評(píng)論 (3)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

           故事一
                    去過(guò)廟的人都知道,一進(jìn)廟門,首先是彌陀佛,笑臉迎客,而在他的北面,則是黑口黑臉的韋陀。
                    但相傳在很久以前,他們并不在同一個(gè)廟里,而是分別掌管不同的廟。 彌樂(lè)佛熱情快樂(lè),所以來(lái)的人非常多,但他什么都不在乎,丟三拉四,沒有好好的管理賬務(wù),所以依然入不敷出。而韋陀雖然管賬是一把好手,但成天陰著個(gè)臉,太 過(guò)嚴(yán)肅,搞得人越來(lái)越少,最后香火斷絕。   
                    佛祖在查香火的時(shí)候發(fā)現(xiàn)了這個(gè)問(wèn)題,就將他們倆放在同一個(gè)廟里,由彌樂(lè)佛負(fù)責(zé)公關(guān),笑迎八方客,于是香火大旺。而韋陀鐵面無(wú)私,錙珠必較,則讓他負(fù)責(zé)財(cái)務(wù),嚴(yán)格把關(guān)。在兩人的分工合作中,廟里一派欣欣向榮景象。


          故事二

           

                    在動(dòng)物園里的小駱駝問(wèn)媽媽:"媽媽媽媽,為什么我們的睫毛那么地長(zhǎng)?" 
                    駱駝媽媽說(shuō):"當(dāng)風(fēng)沙來(lái)的時(shí)候,長(zhǎng)長(zhǎng)的睫毛可以讓我們?cè)陲L(fēng)暴中都能看得到方向。" 
                    小駱駝?dòng)謫?wèn):"媽媽媽媽,為什么我們的背那么駝,丑死了!"
                    駱駝媽媽說(shuō):"這個(gè)叫駝峰,可以幫我們儲(chǔ)存大量的水和養(yǎng)分,讓我們能在沙漠里耐受十幾天的無(wú)水無(wú)食條件。"
                    小駱駝?dòng)謫?wèn):"媽媽媽媽,為什么我們的腳掌那么厚?" 
                    駱駝媽媽說(shuō):"那可以讓我們重重的身子不至于陷在軟軟的沙子里,便于長(zhǎng)途跋涉啊。"
                    小駱駝高興壞了:"嘩,原來(lái)我們這么有用啊!!可是媽媽,為什么我們還在動(dòng)物園里,不去沙漠遠(yuǎn)足呢?" 

           

          故事三


                    有個(gè)魯國(guó)人擅長(zhǎng)編草鞋,他妻子擅長(zhǎng)織白絹。他想遷到越國(guó)去。友人對(duì)他說(shuō):“你到越國(guó)去,一定會(huì)貧窮的。”“為什么?”“草鞋,是用來(lái)穿著走路的,但越國(guó)人 習(xí)慣于赤足走路;白絹,是用來(lái)做帽子的,但越國(guó)人習(xí)慣于披頭散發(fā)。憑著你的長(zhǎng)處,到用不到你的地方去,這樣,要使自己不貧窮,難道可能嗎?”


                    故事一告訴我們:其實(shí)在用人大師的眼里,沒有廢人,正如武功高手,不需名貴寶劍,摘花飛葉即可傷人,關(guān)鍵看如何運(yùn)用。
                    故事二告訴我們:天生我才必有用,可惜現(xiàn)在沒人用。一個(gè)好的心態(tài)+一本成功的教材+一個(gè)無(wú)限的舞臺(tái)=成功。每個(gè)人的潛能是無(wú)限的,關(guān)鍵是要找到一個(gè)能充分發(fā)揮潛能的舞臺(tái)。
                    故事二告訴我們:一個(gè)人要發(fā)揮其專長(zhǎng),就必須適合社會(huì)環(huán)境需要。如果脫離社會(huì)環(huán)境的需要,其專長(zhǎng)也就失去了價(jià)值

           

          個(gè)人理解和感悟:充分發(fā)揮員工的長(zhǎng)處

           

                    管理者的任務(wù),簡(jiǎn)單的說(shuō)就是找到對(duì)的人,把他們放到對(duì)的地方,然后鼓勵(lì)他們充分發(fā)揮自己的創(chuàng)意,完成本職工作,在這個(gè)過(guò)程中管理者既要用人職場(chǎng),又要容忍之短,使員工最大限度的發(fā)揮自己的才能,達(dá)到合理使用人才的目的。

                    正確的用人之道,就是用人的長(zhǎng)處,即讓一個(gè)人的長(zhǎng)處和優(yōu)勢(shì)得到充分的發(fā)揮,讓一個(gè)人的短處和劣勢(shì)得到有效的避免,正所謂“人盡其才,物盡其用”“木匠手中 無(wú)爛木”“智者不用其短,而用愚人之所長(zhǎng)也”,從某種意義上說(shuō)天下沒有無(wú)用之人,一個(gè)擅長(zhǎng)用人的管理者,能將每個(gè)人都派上用場(chǎng)

           

          如何才能揚(yáng)人之所長(zhǎng)

           

                    1、管理者必須做到客觀公正。每個(gè)人都不可避免的會(huì)有自己的好惡,也會(huì)收到成見、偏見影響、管理者一定要待人寬容,心胸開闊,一切從公司的利益出發(fā),不可錯(cuò)過(guò)一個(gè)人才
                    2、管理者應(yīng)該充分利用科學(xué)方法。人才入冰山,其優(yōu)秀特質(zhì)浮出水面的只有1/3 ,如果不運(yùn)用一些科學(xué)的方法很難看出來(lái),方法有很多,筆試、面試、心理測(cè)試、情景模擬、評(píng)價(jià)中心等,在使用的過(guò)程中要注意靈活運(yùn)用
                    3、將人才放到對(duì)的位置上。根據(jù)其特點(diǎn),為其提供充分展示自己能力的平臺(tái),讓其在實(shí)際的工作中不斷鍛煉
                    4、適時(shí)展開具有針對(duì)性、個(gè)性化的培訓(xùn)。培訓(xùn)不但要補(bǔ)員工所短,同時(shí)應(yīng)該培訓(xùn)員工長(zhǎng)處,讓員工之“長(zhǎng)”根突出、更醒目。并讓其在你的公司里面形成一定的品牌
                    5、優(yōu)化配置、平衡互補(bǔ),取各家之“長(zhǎng)”溶于一爐,并相互揚(yáng)“長(zhǎng)”,相互促“長(zhǎng)”


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-01 23:19 todayx.org 閱讀(1501) | 評(píng)論 (0)編輯 收藏
               摘要: 歷史上的今天回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天http://www.todayx.org/jdk1.5以后用Integer舉例Integer a = 3;              ...  閱讀全文
          posted @ 2012-02-01 00:23 todayx.org 閱讀(1692) | 評(píng)論 (0)編輯 收藏
          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/

          等于還是不等于?

          看來(lái)看下面的一段代碼:

           

             代碼片段1

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = new Integer(100);  
          3.     Integer b = 100;  
          4.     System.out.println(a == b);   
          5. }  

           

           這段代碼的輸出是什么?相信很多人都會(huì)很容易的猜到:false,因?yàn)閍、b兩個(gè)對(duì)象的地址不同,用“==”比較時(shí)是false。恭喜你,答對(duì)了。

           

          再看下面的一段代碼:

            

             代碼片段2

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = 100;  
          3.     Integer b = 100;  
          4.     System.out.println(a == b);   
          5. }  

           

          你可能會(huì)回答,這沒什么不一樣啊,所以還是false。很遺憾,如果你執(zhí)行上面的一段代碼,結(jié)果是true。

           

          上面的代碼可能讓你有些意外,那好吧,再看看下面的這段代碼:

           

              代碼片段3

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = 156;  
          3.     Integer b = 156;  
          4.     System.out.println(a == b);   
          5. }  

           結(jié)果是true嗎?很遺憾,如果你執(zhí)行上面的一段代碼,結(jié)果是false。

           

           感到吃驚嗎?那最后再看下面的一段代碼:

           

              代碼片段4

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = Integer.valueOf(100);  
          3.     Integer b = 100;  
          4.     System.out.println(a == b);   
          5. }  

          最后的結(jié)果,可能你已經(jīng)猜到了,是true。

          為什么會(huì)這樣?

          現(xiàn)在我們分析一下上面的代碼。可以很容易的看出,這一系列代碼的最終目的都是用“==”對(duì)兩個(gè)對(duì)象進(jìn)行比較。Java中,如果用“==”比較兩個(gè)對(duì)象結(jié)果為true,說(shuō)明這兩個(gè)對(duì)象實(shí)際上是同一個(gè)對(duì)象,false說(shuō)明是兩個(gè)對(duì)象。

           

          現(xiàn)在,我們來(lái)看看為什么會(huì)出現(xiàn)上面的現(xiàn)象。

           

          我們先看代碼片段4:最后的運(yùn)行結(jié)果是true,說(shuō)明a、b兩個(gè)對(duì)象實(shí)際上是同一個(gè)對(duì)象。但是a對(duì)象是通過(guò)調(diào)用Integer的valueOf方法創(chuàng)建的,而b對(duì)象是通過(guò)自動(dòng)裝箱創(chuàng)建出來(lái)的,怎么會(huì)是同一個(gè)對(duì)象呢?難道問(wèn)題在字節(jié)碼那里,畢竟Java程序是依靠虛擬器運(yùn)行字節(jié)碼來(lái)實(shí)現(xiàn)的。

           

          通過(guò)jdk中自帶的工具javap,解析字節(jié)碼,核心的部分摘取如下:

          Java代碼  收藏代碼
          1. 0:  bipush  100  
          2. 2:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  
          3. 5:  astore_1  
          4. 6:  bipush  100  
          5. 8:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  

          代碼中我們只調(diào)用了一次Integer.valueOf方法,但是字節(jié)碼中出現(xiàn)了兩次對(duì)Integer.valueOf方法的調(diào)用。那么另一次是哪里呢?只可能在自動(dòng)裝箱時(shí)調(diào)用的。因此這段代碼實(shí)際上等價(jià)于:

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = Integer.valueOf(100);  
          3.     Integer b = Integer.valueOf(100);  
          4.     System.out.println(a == b);   
          5. }  

           現(xiàn)在問(wèn)題就簡(jiǎn)單了:看jdk源代碼,查看valueOf方法的具體實(shí)現(xiàn):

          Java代碼  收藏代碼
          1. public static Integer valueOf(int i) {  
          2.     final int offset = 128;  
          3.     if (i >= -128 && i <= 127) { // must cache   
          4.         return IntegerCache.cache[i + offset];  
          5.     }  
          6.     return new Integer(i);  
          7. }  

           

          看到這兒,上面的代碼就很明確了:對(duì)于-128到127的數(shù)字,valueOf返回的是緩存中的對(duì)象。所以兩次調(diào)用Integer.valueOf(100)返回的都是同一個(gè)對(duì)象。

          我們?cè)傧瓤创a片段3:根據(jù)上面的分析,代碼片段3實(shí)際上等價(jià)于以下代碼:

          Java代碼  收藏代碼
          1. public static void main(final String[] args) {  
          2.     Integer a = Integer.valueOf(156);  
          3.     Integer b = Integer.valueOf(156);  
          4.     System.out.println(a == b);   
          5. }  

           由于156不在-128到127范圍內(nèi),所以兩個(gè)對(duì)象都是通過(guò)new Integer()的方式創(chuàng)建的,所以最后結(jié)果為false。

           

           片段1和片段2就不做具體分析了,相信讀者可以自行分析。

           

           最后,請(qǐng)大家思考一下問(wèn)題:通過(guò)上面的分析,了解到整數(shù)的自動(dòng)裝箱是通過(guò)Integer.valueOf(int number)實(shí)現(xiàn)的,那么自動(dòng)拆箱是如何實(shí)現(xiàn)的呢?


          歷史上的今天
          回顧歷史的今天,歷史就像生活的一面鏡子;可以了解歷史的這一天發(fā)生的事件;借古可以鑒今;歷史是不能忘記的.要記住歷史的每一天
          http://www.todayx.org/
          posted @ 2012-02-01 00:21 todayx.org 閱讀(1976) | 評(píng)論 (3)編輯 收藏
          主站蜘蛛池模板: 宝应县| 昌图县| 聊城市| 临洮县| 陆丰市| 沭阳县| 墨脱县| 故城县| 淄博市| 八宿县| 河东区| 英超| 平定县| 福州市| 图们市| 寿光市| 云霄县| 大庆市| 海门市| 巴林右旗| 沧州市| 杂多县| 阳东县| 左权县| 旬邑县| 如皋市| 大竹县| 山阴县| 雅江县| 威宁| 开封市| 金沙县| 建德市| 安丘市| 九台市| 南康市| 遂川县| 沁阳市| 乡城县| 宾阳县| 梓潼县|