• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-15  評(píng)論-5  文章-0  trackbacks-0
              2011年3月4日
            作者介紹:Brian Peasland,Techtarget網(wǎng)站Searchoracle子站的資深專(zhuān)家,SGT, Inc.公司首席DBA。Oracle7.3,8和8i的OCP,計(jì)算機(jī)科學(xué)碩士學(xué)位,專(zhuān)攻數(shù)據(jù)庫(kù)方向。Brian 在IT行業(yè)從業(yè)已有20年,并且是從計(jì)算機(jī)操作人員到操作分析員、然后成為系統(tǒng)管理員,隨后成為應(yīng)用軟件開(kāi)發(fā)人員直至目前的DBA. 可以說(shuō),Brian本身的職業(yè)歷程就是一部完整的DBA成長(zhǎng)指南,后來(lái)他應(yīng)美國(guó)Techtarget網(wǎng)站之邀,寫(xiě)了一個(gè)白皮書(shū)——《Grow that DBA Career》并發(fā)到了其個(gè)人的網(wǎng)站上 Peasland.net.


            許多年來(lái),我在不同的新聞組上花費(fèi)了很多時(shí)間與那些想知道如何得到數(shù)據(jù)庫(kù)管理員(DBA)的工作或者如何成長(zhǎng)為一名DBA的IT人進(jìn)行交談,現(xiàn)在他們有了工作。這些年來(lái)許多人針對(duì)如何達(dá)到這個(gè)目標(biāo)提出了不同意見(jiàn)。本文即是那些意見(jiàn)的綜合并且能夠在如何才能出色的完成DBA的工作方面給出好的建議。這篇文章同樣對(duì)于如何讓一名DBA變得對(duì)老板更有價(jià)值。假如你已經(jīng)是一名DBA,那么也許你會(huì)希望跳過(guò)文章的前幾段。

            我應(yīng)該成為一名DBA么?
              我曾問(wèn)過(guò)的一個(gè)問(wèn)題是一個(gè)人應(yīng)該從事DBA這樣的職業(yè)么。這個(gè)問(wèn)題并不容易回答,因?yàn)樗蛉硕悺S械娜擞谐蔀橐幻肈BA所需要的天賦。而其他人并不認(rèn)為能夠很容易掌握成為DBA的秘訣。DBA職業(yè)需要掌握一定的技能。而且還需要其他IT職業(yè)所不必需的要求。因此,為了回答這個(gè)問(wèn)題,我通常給將要成為DBA的人描述DBA職業(yè)所必需的要求。下面的段落中,我都將以問(wèn)題結(jié)尾。在繼續(xù)下一段以前請(qǐng)花一些時(shí)間考慮并且回答這些問(wèn)題。
              許多人因?yàn)樵S多原因而立志要成為DBA。其中一個(gè)主要原因是薪水。DBA是IT業(yè)中薪水最高的職業(yè)之一。其他人想成為DBA是因?yàn)橄矚g贊揚(yáng) DBA是受到的榮譽(yù),或者因?yàn)樗瓷先ズ芸?我個(gè)人認(rèn)為,成為DBA是很值得的。它是一個(gè)很有意思,令人興奮的職業(yè)。那么,你把DBA作為一個(gè)可能的職業(yè)選擇的原因是什么呢?
              除非你已經(jīng)提前準(zhǔn)備好了,否則你可能會(huì)發(fā)現(xiàn)從事DBA職業(yè)充滿(mǎn)了挫折和令人頭痛。一個(gè)數(shù)據(jù)庫(kù)存在于操作系統(tǒng)和最終用戶(hù)應(yīng)用程序之間。同樣地, DBA必須非常精通他的數(shù)據(jù)庫(kù)所在的操作系統(tǒng)。DBA并不一定需要知道所有有關(guān)操作系統(tǒng)的知識(shí),但是他知道得越多越好。數(shù)據(jù)庫(kù)與操作系統(tǒng)聯(lián)系非常緊密。理解這種關(guān)聯(lián)是十分必要的。DBA還需要知道服務(wù)器硬件以及它如何影響與幫助數(shù)據(jù)庫(kù)。同時(shí),DBA必須理解應(yīng)用軟件。DBA可能會(huì)被要求幫助開(kāi)發(fā)人員創(chuàng)建可靠,健全的數(shù)據(jù)庫(kù)應(yīng)用程序。還有,最重要的也是最明顯的,DBA必須十分徹底的理解數(shù)據(jù)庫(kù)引擎,它是如何工作的,所有的引擎是如何組合在一起的,以及如何影響數(shù)據(jù)庫(kù)引擎向最終用戶(hù)和應(yīng)用程序傳送數(shù)據(jù)的能力。我見(jiàn)過(guò)的最好的DBA有非常深刻的理解而且不僅僅在數(shù)據(jù)庫(kù)本身。他們知道一些系統(tǒng)管理與應(yīng)用開(kāi)發(fā)。好多時(shí)候他們?cè)诔蔀镈BA之前有其中一個(gè)或兩個(gè)背景。無(wú)論如何,成為一名合格的而不是出色的DBA也需要許多背景知識(shí)。你是否已經(jīng)做好準(zhǔn)備開(kāi)始學(xué)習(xí)直到你感到已經(jīng)無(wú)法再學(xué)下去了?
              許多和我交談過(guò)的,在開(kāi)始DBA職業(yè)時(shí)遇到困難的人,在嘗試著吸收大量DBA所需了解的信息時(shí)實(shí)際上都會(huì)有一些問(wèn)題。畢竟系統(tǒng)管理員是全職學(xué)習(xí)操作系統(tǒng)的細(xì)節(jié)。應(yīng)用程序開(kāi)發(fā)人員全職學(xué)習(xí)如何編寫(xiě)好的程序。DBA不僅要非常了解這兩種不同的工作,而且還需要花費(fèi)更多的時(shí)間去理解數(shù)據(jù)庫(kù)的體系結(jié)構(gòu),以及理解每一樣?xùn)|西的每一塊是如何組合在一起的!聽(tīng)起來(lái)是不是很讓人畏縮?有許多人失敗后這樣想,并且把DBA工作看作一項(xiàng)非常困難的事情。也有那些傳播和理解所有這些信息,并且使用這些信息做出好的,聽(tīng)起來(lái)具有技術(shù)性的決定的人。正如我以前是一名DBA時(shí)喜歡說(shuō)的,所有這些對(duì)我來(lái)說(shuō)看上去像一個(gè)大謎團(tuán)。把這些所有的很好的組合在一起就是挑戰(zhàn)。你是哪一種人?

              許多DBA是隨時(shí)侯命的。他們會(huì)在白天或晚上的所有時(shí)間接到呼叫去解決他們的數(shù)據(jù)庫(kù)出現(xiàn)的致命問(wèn)題。數(shù)據(jù)庫(kù)是商業(yè)信息技術(shù)基礎(chǔ)組織的必不可少的組成部分。沒(méi)有數(shù)據(jù),就沒(méi)有必要擁有一個(gè)計(jì)算機(jī)系統(tǒng)。數(shù)據(jù)推動(dòng)商業(yè)。假如amazon.com的網(wǎng)站不能在數(shù)據(jù)庫(kù)中搜索產(chǎn)品并且假如沒(méi)有人能夠?yàn)樗麄兊漠a(chǎn)品下訂單,那么它會(huì)變成什么樣?它就不會(huì)在商業(yè)中存在很久。當(dāng)數(shù)據(jù)庫(kù)down掉,即使只是很短的時(shí)間,公司也會(huì)損失重大。基于這個(gè)原因,DBA到達(dá)現(xiàn)場(chǎng)后必須盡可能迅速的解決問(wèn)題。許多公司有自己的DBA團(tuán)隊(duì)以便可以輪流待命。這些DBA 24x7小時(shí)的維持?jǐn)?shù)據(jù)庫(kù)應(yīng)用程序。假如工作需要的話(huà),你準(zhǔn)備好隨時(shí)候命了么?

              一些DBA的職責(zé)包括為軟件打補(bǔ)丁或者對(duì)數(shù)據(jù)庫(kù)做些改變。通常,這些操作不能在公司職員工作的時(shí)候做,因?yàn)榇藭r(shí)數(shù)據(jù)庫(kù)必須運(yùn)行以便他們能夠工作。這意味著DBA經(jīng)常不得不在很早或者深夜甚至周末,總之,在正常工作時(shí)間以外來(lái)完成工作。你準(zhǔn)備好在非正常時(shí)間工作,或者你在找一個(gè)朝九晚五的工作?

              對(duì)DBA而言,需要掌握的一個(gè)重要內(nèi)容就是通常被稱(chēng)為“軟技術(shù)”的東西。DBA需要在團(tuán)隊(duì)中很好的工作,通常團(tuán)隊(duì)是在變化的,如系統(tǒng)管理員,網(wǎng)絡(luò)管理員,應(yīng)用程序開(kāi)發(fā)人員,項(xiàng)目經(jīng)理和其他人。DBA要能夠用流利的英語(yǔ)解釋復(fù)雜的技術(shù)概念,讓團(tuán)隊(duì)中其他人明白。DBA還要能夠在數(shù)據(jù)庫(kù)相關(guān)問(wèn)題上指揮團(tuán)隊(duì)隊(duì)員。你的軟技術(shù)怎么樣?

              下面不是全部列表,但是包括了DBA的典型職責(zé):

                · 把監(jiān)視數(shù)據(jù)庫(kù)實(shí)例當(dāng)作每日必做工作以保證其可用性。解決不可用的問(wèn)題。

              · 收集系統(tǒng)統(tǒng)計(jì)和性能信息以便定向和配置分析。

               · 配置和調(diào)整數(shù)據(jù)庫(kù)實(shí)例以便在應(yīng)用程序特定要求下達(dá)到最佳性能。

               · 分析和管理數(shù)據(jù)庫(kù)安全性。控制和監(jiān)視用戶(hù)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)。必要時(shí)審計(jì)數(shù)據(jù)庫(kù)的使用。

              · 監(jiān)視備份程序。必要時(shí)提供恢復(fù)。測(cè)試備份與恢復(fù)程序。

              · 升級(jí)RDBMS軟件并且在必要時(shí)使用補(bǔ)丁。必要時(shí)升級(jí)或者遷移數(shù)據(jù)庫(kù)實(shí)例。

              · 通過(guò)數(shù)據(jù)庫(kù)相關(guān)動(dòng)作來(lái)支持應(yīng)用程序開(kāi)發(fā)人員。

               · 跟隨數(shù)據(jù)庫(kù)趨向和技術(shù)。當(dāng)可應(yīng)用時(shí)使用新技術(shù)。安裝,測(cè)試和評(píng)估Oracle新的相關(guān)產(chǎn)品。

              · 執(zhí)行存儲(chǔ)和物理設(shè)計(jì)。均衡設(shè)計(jì)問(wèn)題以完成性能優(yōu)化。

              · 創(chuàng)建,配置和設(shè)計(jì)信的數(shù)據(jù)庫(kù)實(shí)例。

              · 診斷,故障檢測(cè)和解決任何數(shù)據(jù)庫(kù)相關(guān)問(wèn)題。必要時(shí)聯(lián)系Oracle支持人員以便使問(wèn)題得到較好的解決。

              · 確保Oracle網(wǎng)絡(luò)軟件(SQL*Net, Net8, Names, OiD)配置和運(yùn)行的很好。

               · 與系統(tǒng)管理員(Unix& NT)一起工作以保證Oracle相關(guān)事務(wù)得到很好的處理。

               · 為有效的,定期的維護(hù)數(shù)據(jù)庫(kù)創(chuàng)建任何必要的腳本。

              前面各段的問(wèn)題是為了使你考慮一名DBA該做些什么,幫助你決定這是不是適合你的職業(yè)。我并非意味著假如你的目標(biāo)是成為DBA這些會(huì)阻止你。我只是嘗試著展現(xiàn)一些事實(shí)。我看到過(guò)一些DBA一旦被實(shí)際工作打擊了就一蹶不振。他們花費(fèi)時(shí)間,精力和一些金錢(qián)獲得了他們的第一份DBA工作。我個(gè)人認(rèn)為這個(gè)職業(yè)非常有價(jià)值。而且我無(wú)法想像現(xiàn)在做任何其他的會(huì)怎樣。所以,這一段幫助你決定這是不是你希望從事的。假如它是,那么盡你所有去得到它!

            我怎樣得到第一份DBA工作?

               你已經(jīng)閱讀了前面的段落并且認(rèn)為成為一名DBA是一個(gè)好的職業(yè)。祝賀你!我希望你的職業(yè)能變成你想像得那么令人興奮和有意義。那么,你如何找到第一份DBA工作?這個(gè)問(wèn)題我已經(jīng)聽(tīng)別人問(wèn)了許多許多遍。

              在90年代早期,因特網(wǎng)急速發(fā)展。它使公司象草一般萌芽。公司蜂擁而至并且開(kāi)始創(chuàng)建他們?cè)诰W(wǎng)上的形象。幾乎所有這些有網(wǎng)站的公司都需要一個(gè)數(shù)據(jù)庫(kù)作為 web應(yīng)用的后臺(tái)。不幸的是,當(dāng)時(shí)在該領(lǐng)域卻沒(méi)有那么多DBA。在IT業(yè),DBA變得奇缺。那段時(shí)間里,得到一份DBA工作看上去只要可以拼出 “Oracle”或者可能只是在大學(xué)里接觸過(guò)一學(xué)期的數(shù)據(jù)庫(kù)就行。為了使生活變得更好,DBA的匱乏促使公司付給有潛力的職員很高的薪水。假如你想要成為一名DBA,很容易,非常容易。你需要做的就是證明你了解什么是數(shù)據(jù)庫(kù)然后工作就會(huì)比你預(yù)期的更早的出現(xiàn)在你面前。ITPUB個(gè)人空間!K&d7a

               然后因特網(wǎng)的泡沫破滅了。大量投產(chǎn)因特網(wǎng)的公司破產(chǎn)。許多給公司工作的DBA重新尋找工作。缺少DBA的公司找到一名有DBA經(jīng)驗(yàn)的人比以前容易得多。在21世紀(jì)初期,由于經(jīng)濟(jì)并不十分穩(wěn)固,因此生活并不容易(至少在美國(guó)如此)。公司都勒緊了他們的褲腰帶。所有這些轉(zhuǎn)化為更少的工作機(jī)會(huì)和DBA 候選人更少的工作空缺。
              得到第一份DBA工作的最艱難的部分是每一個(gè)職位都要求有一些工作經(jīng)驗(yàn)。如果你從公司的角度出發(fā),你就可以理解為什么對(duì)DBA職位而言經(jīng)驗(yàn)是必需的。假如他沒(méi)有一點(diǎn)經(jīng)驗(yàn),你會(huì)付給這個(gè)人很高的工資讓他去操作,維護(hù)和運(yùn)行你IT基礎(chǔ)組織的最大最重要的一部分么?你的公司會(huì)付錢(qián)給一名沒(méi)有經(jīng)驗(yàn)的 DBA么?并且,在等待他成長(zhǎng)起來(lái)的過(guò)程中可能會(huì)損失上百萬(wàn)美元的收入。對(duì)大多數(shù)公司而言,這些問(wèn)題的答案肯定是‘不’。所以,沒(méi)有經(jīng)驗(yàn),獲得你的第一份 DBA工作是很困難的。

               第一份DBA工作現(xiàn)在成了惡性循環(huán)的境遇。假如我沒(méi)有任何經(jīng)驗(yàn),我怎樣才能得到DBA的工作呢?我沒(méi)有工作的話(huà)又怎么能得到DBA經(jīng)驗(yàn)?zāi)?這是要戰(zhàn)勝的最困難的障礙。最困難的部分是獲得第一個(gè)DBA工作。這部分的剩下部分將針對(duì)實(shí)現(xiàn)你第一個(gè)DBA工作的目標(biāo)給你一些建議。

              提示#1:接受教育。--盡可能多的學(xué)習(xí)有關(guān)數(shù)據(jù)庫(kù)的知識(shí)。這很可能將占用你正常工作以外的部分時(shí)間也精力。參加本地大學(xué)舉辦的數(shù)據(jù)庫(kù)培訓(xùn)班。許多培訓(xùn)公司都會(huì)舉辦數(shù)據(jù)庫(kù)管理員的培訓(xùn)班。假如你的老板不資助你的學(xué)習(xí),那么你可能不得不自己支付這筆費(fèi)用。許多DBA職業(yè)要求至少為計(jì)算機(jī)科學(xué)或相關(guān)專(zhuān)業(yè)本科以上學(xué)歷,因此你必須至少有那樣的文憑。

              提示#2:鍛煉成為DBA。--許多數(shù)據(jù)庫(kù)供應(yīng)商都允許你下載他們數(shù)據(jù)庫(kù)系統(tǒng)的測(cè)試版或評(píng)估版。下載一份并且在自己的個(gè)人電腦上安裝軟件。練習(xí)使用數(shù)據(jù)庫(kù)。故意破壞數(shù)據(jù)庫(kù)并且嘗試修復(fù)它。嘗試著履行你所能想到的盡可能多的DBA職責(zé)。測(cè)試和磨練你在自己的測(cè)試平臺(tái)上的技能這樣你就可以證明你的數(shù)據(jù)庫(kù)管理能力。

              提示#3:獲得認(rèn)證。 --許多數(shù)據(jù)庫(kù)提供商都提供自己的數(shù)據(jù)庫(kù)產(chǎn)品的認(rèn)證。許多公司現(xiàn)在都把認(rèn)證看作是一種標(biāo)準(zhǔn)。需要記住的一件事是僅獲得認(rèn)證是不夠的。通過(guò)DBA認(rèn)證測(cè)試并不意味著你知道如何管理一個(gè)數(shù)據(jù)庫(kù)。它只是告訴你以后可能的老板,現(xiàn)在你擁有了一定的技術(shù)。它還告訴你的老板你對(duì)DBA工作的態(tài)度是很認(rèn)真的。我看到許多人抱怨他們已經(jīng)得到了認(rèn)證但是沒(méi)有經(jīng)驗(yàn),卻仍然不能得到第一份DBA工作。認(rèn)證本身并不能使你得到工作,但它是無(wú)害的。即使沒(méi)有其他的,在你進(jìn)行認(rèn)證的時(shí)候你也已經(jīng)學(xué)到了許多知識(shí)。只是不要依賴(lài)認(rèn)證來(lái)給你帶來(lái)你要找的工作。你需要的比這還要多。但它會(huì)在最后幫助你。

              提示#4:利用你現(xiàn)有的技能。--許多DBA具有系統(tǒng)管理員背景。其他的有應(yīng)用程序開(kāi)發(fā)背景。假如可能,查看你能否利用現(xiàn)有的技能來(lái)得到工作。現(xiàn)在的目標(biāo)就是為你和你的老板創(chuàng)造一個(gè)雙贏的局面。例如,讓我們假設(shè)你已經(jīng)是一名系統(tǒng)管理員而想進(jìn)入DBA領(lǐng)域。也許你會(huì)找到一份工作,這份工作一部分時(shí)間里可以用到你的系統(tǒng)管理技能,并且在剩下的時(shí)間里可以使你涉及到數(shù)據(jù)庫(kù)管理領(lǐng)域。假如你已經(jīng)是一名某個(gè)產(chǎn)品平臺(tái)上的DBA但你希望轉(zhuǎn)到其他產(chǎn)品平臺(tái),那么看看你能否找到一份同時(shí)接觸兩個(gè)產(chǎn)品平臺(tái)的工作。這樣,公司和你都得到了想要的。在你定向到了DBA工作后,你可以試著得到一個(gè)能讓你全職作它的職位,也許還可以在同一個(gè)公司中。

               提示#5:利用現(xiàn)在的機(jī)會(huì)。--有時(shí)候,一個(gè)人進(jìn)入DBA領(lǐng)域僅僅需要的是正確的地方和正確的時(shí)機(jī)。假如你現(xiàn)在的老板有一個(gè)機(jī)會(huì)讓你進(jìn)行任何數(shù)據(jù)庫(kù)的項(xiàng)目,抓住這個(gè)機(jī)會(huì)!任何數(shù)據(jù)庫(kù)經(jīng)驗(yàn)就比沒(méi)有數(shù)據(jù)庫(kù)經(jīng)驗(yàn)要好。讓你的管理者知道你十分積極的在尋找任何可能的數(shù)據(jù)庫(kù)機(jī)會(huì)。他們就有可能在下次機(jī)會(huì)到來(lái)的時(shí)候想到你。進(jìn)行這些數(shù)據(jù)庫(kù)項(xiàng)目以及看到你要成為一個(gè)DBA的渴望以后,他們可能會(huì)決定培訓(xùn)你,提拔你。許多許多人都是以這種方式獲得他的第一個(gè) DBA工作,在進(jìn)行了一些數(shù)據(jù)庫(kù)相關(guān)的項(xiàng)目后不知不覺(jué)的成為一名較低級(jí)的DBA。通常當(dāng)一名DBA離開(kāi)公司后,公司將在內(nèi)部尋找一個(gè)候選人,假如他們認(rèn)為這名候選人是可訓(xùn)練的話(huà)。

              提示#6:尋找較低級(jí)的DBA職位。--假如你只是為了一個(gè)較低級(jí)的DBA工作,看到DBA職位的需求描述說(shuō)他們正在尋找高級(jí)DBA或者其他的。所以,讓我們嚴(yán)謹(jǐn)一些。你并沒(méi)有一個(gè)高級(jí)方面的經(jīng)驗(yàn)。我已經(jīng)討論過(guò)了對(duì)于這樣的職位為什么公司不會(huì)考慮你。但是他們會(huì)在低級(jí)的職位上考慮你。低級(jí)的 DBA在高級(jí)DBA的指導(dǎo)下完成工作。他們摸索竅門(mén)。一般來(lái)說(shuō),高級(jí)DBA對(duì)數(shù)據(jù)庫(kù)承擔(dān)責(zé)任,同時(shí)也獲得所有的榮譽(yù)。但是不要焦急。隨著你的事業(yè)發(fā)展,你將會(huì)有越來(lái)越多的責(zé)任和得到越來(lái)越多的信任。因?yàn)槟銢](méi)有任何經(jīng)驗(yàn),你應(yīng)該從這里開(kāi)始啟航。

               我也聽(tīng)到過(guò)一些公司尋找一名高級(jí)DBA,但是到最后,他們實(shí)際想要雇一名低級(jí)的DBA。你或許希望申請(qǐng)這樣的職位雖然你也許沒(méi)有資格。他們可能還是會(huì)決定雇傭你。但是提前說(shuō)明你仍然在摸索階段并且已經(jīng)是較低級(jí)的DBA水平。不要試圖欺騙他們讓他們認(rèn)為你是高級(jí)DBA的水平。這只會(huì)降低你得到這項(xiàng)工作的機(jī)會(huì)。

               這些提示將幫助你得到第一份DBA的工作。祝你在尋找工作時(shí)有好運(yùn)氣。當(dāng)你已經(jīng)找到了第一份DBA工作后,繼續(xù)下面的部分來(lái)學(xué)習(xí)如何往下走下去。

              我剛得到我的第一份工作!現(xiàn)在該怎樣?

              祝賀你!你現(xiàn)在是DBA俱樂(lè)部的正式成員了!對(duì)于這份夢(mèng)寐以求的令人激動(dòng)的職業(yè),你準(zhǔn)備好了么?你的工作才剛開(kāi)始并且你在學(xué)習(xí)上已經(jīng)落在后面。你將會(huì)發(fā)現(xiàn)要成為一名高效的數(shù)據(jù)庫(kù)管理員有大量的知識(shí)你必須掌握。你的第一年或前兩年將花費(fèi)比以前更多的時(shí)間來(lái)學(xué)習(xí)。假如你發(fā)現(xiàn)學(xué)習(xí)知識(shí)的數(shù)量使你大腦超負(fù)荷,那么休息一下,歇口氣,然后再回到學(xué)習(xí)中去。為了幫助你繼續(xù)走下去,你可以按照下面的方法進(jìn)行:

              步驟#1: 關(guān)系型數(shù)據(jù)庫(kù)理論 –這部分我假設(shè)你將管理的數(shù)據(jù)庫(kù)是一個(gè)“關(guān)系型”數(shù)據(jù)庫(kù)。其他數(shù)據(jù)庫(kù)模型也存在,但是關(guān)系型模式是近二十年工業(yè)上占統(tǒng)治地位的一種數(shù)據(jù)庫(kù)模式。假如你的數(shù)據(jù)庫(kù)系統(tǒng)是其他的模式,那么學(xué)習(xí)它的理論。相關(guān)數(shù)據(jù)庫(kù)理論是十分重要的。它是其他一切的基礎(chǔ)。我也看到許多跳到數(shù)據(jù)庫(kù)管理職位的人從不想去學(xué)習(xí)純粹的關(guān)系型數(shù)據(jù)庫(kù)理論。不可避免的,在他們的事業(yè)中對(duì)理論基礎(chǔ)的匱乏作為缺點(diǎn)暴露了出來(lái)。假如你對(duì)關(guān)系型數(shù)據(jù)庫(kù)理論理解得很好,那么你將非常容易的在任何平臺(tái)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)中轉(zhuǎn)變。我使用Oracle數(shù)據(jù)庫(kù),或者IBM的DB2,或者微軟的SQL Server是無(wú)關(guān)緊要的。他們都是關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)。他們?cè)谧畹讓佣荚谧鲋嗤氖虑椤^(qū)別在于他們?cè)鯓尤プ鱿嗤氖虑椤<兇獾年P(guān)系型數(shù)據(jù)庫(kù)理論對(duì)于較低級(jí)的DBA來(lái)說(shuō)并非必需的。但是假如你想要超越低級(jí)DBA的水平它就是十分重要的。許多大學(xué)的教科書(shū)都很好的包含了關(guān)系型數(shù)據(jù)庫(kù)的理論。其中一本被廣泛使用的教科書(shū)就是由Elmasri and Navathe編寫(xiě)的數(shù)據(jù)庫(kù)系統(tǒng)基礎(chǔ),

              步驟#2: 徹底的學(xué)習(xí)查詢(xún)語(yǔ)言 –數(shù)據(jù)庫(kù)都有語(yǔ)言讓你能夠從數(shù)據(jù)庫(kù)中得到數(shù)據(jù),把數(shù)據(jù)放到數(shù)據(jù)庫(kù)中,以及修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。對(duì)于關(guān)系型數(shù)據(jù)庫(kù)而言,這種語(yǔ)言就是結(jié)構(gòu)化查詢(xún)語(yǔ)言 (SQL)。這門(mén)語(yǔ)言是你與數(shù)據(jù)庫(kù)接觸的工具。不能讓這個(gè)工具成為以后學(xué)習(xí)的障礙,這一點(diǎn)很重要。在你的測(cè)試數(shù)據(jù)庫(kù)中練習(xí)不同的SQL語(yǔ)句直到他們變成了你的習(xí)慣。這方面的一本非常好的書(shū)叫做Oracle 9i完全參考(Oracle 9i The Complete Reference)由Loney 和Koch編寫(xiě),Oracle Press。每一名Oracle DBA都應(yīng)該在他事業(yè)的早期閱讀這本書(shū)。Oracle 9i參考手冊(cè)(Oracle 9i SQL Reference manual)是另一個(gè)很重要的知識(shí)來(lái)源。在他們的技術(shù)網(wǎng)站TechNet上(http://technet.oracle.com)你可以訪...t上有一個(gè)賬號(hào)。

              步驟#3: 開(kāi)始學(xué)習(xí)基本的數(shù)據(jù)庫(kù)管理工作 –這難道不是你最開(kāi)始在這里的原因?為什么它在列表的第三位?我們嘗試著建造一個(gè)知識(shí)的金字塔,我強(qiáng)烈的感覺(jué)到一個(gè)人需要知道關(guān)系型數(shù)據(jù)庫(kù)理論和SQL,并且在你學(xué)習(xí)如何進(jìn)行基本的數(shù)據(jù)庫(kù)管理工作時(shí)把他們當(dāng)作工具來(lái)使用。這些工作包括啟動(dòng)和關(guān)閉數(shù)據(jù)庫(kù),備份和恢復(fù)數(shù)據(jù)庫(kù),以及創(chuàng)建/刪除/ 修改數(shù)據(jù)庫(kù)對(duì)象。對(duì)于Oracle數(shù)據(jù)庫(kù)管理而言,在市面上有大量的書(shū)籍可以給你所期望的一個(gè)很好的體會(huì)。這本書(shū)是Oracle 9i DBA手冊(cè)(Oracle 9i DBA Handbook by Loney on Oracle Press)。我知道的大多數(shù)DBA都在他們事業(yè)的早期不只一遍的閱讀過(guò)這本書(shū)。這里,你應(yīng)該同時(shí)閱讀和理解Oracle 9i 概念指導(dǎo),Oracle 9i管理員指導(dǎo),以及Oracle 9i備份與恢復(fù)指導(dǎo)(Oracle 9i Concepts Guide, the Oracle 9i Administrator’s Guide, and the Oracle 9i Backup and Recovery Guide)都來(lái)自O(shè)racle文檔。

               步驟#4: 閱讀,閱讀,再閱讀 –由于你才剛開(kāi)始你的DBA職業(yè)生涯,因此你正在開(kāi)始為你的技能奠定基礎(chǔ)。這需要一段很長(zhǎng)的時(shí)間去形成,吸收和領(lǐng)會(huì)所有你將學(xué)到的知識(shí)。毫無(wú)疑問(wèn)的,比你資深的DBA由許多工作要做,因此他們可能不會(huì)總是騰出大量時(shí)間輔導(dǎo)你的學(xué)習(xí)。你不得不靠自己學(xué)習(xí)很多東西。這就是閱讀的目的。市面上有許多書(shū)籍可以解答許多數(shù)據(jù)庫(kù)相關(guān)的話(huà)題。Oracle Press是Oracle公司的官方出版社,有大量的Oracle相關(guān)書(shū)籍。同時(shí)也有其他的出版社,如Wrox Press 和 O’Reilly Press。你也可以找到Oracle文檔來(lái)閱讀。并且還有許多網(wǎng)站和新聞組。盡可能多的讀書(shū)使你能夠繼續(xù)下去。還有,不只一遍的閱讀它們可以使你吸收你第一次閱讀時(shí)錯(cuò)過(guò)的內(nèi)容。

              步驟#5: 創(chuàng)建測(cè)試案例 –我經(jīng)常看到初學(xué)者問(wèn)一些很基礎(chǔ)的問(wèn)題,其實(shí)假如他們花一些時(shí)間來(lái)考慮,這些問(wèn)題都是很容易解答的。毫無(wú)疑問(wèn)的,在你開(kāi)始學(xué)習(xí)Oracle的時(shí)候你會(huì)有許多的問(wèn)題。看看這些問(wèn)題你能不能自己回答出來(lái)。例如,我又一次被問(wèn)到能不能向有唯一性約束的列中插入空值。最開(kāi)始,這看上去也許不是很容易回答的問(wèn)題。但它卻是非常容易去試驗(yàn)的!只需要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的表。在其中的一列,假如唯一性約束。嘗試著在該列插入一個(gè)空值。有效么?你應(yīng)該能夠非常容易的回答出這個(gè)問(wèn)題了。那么,為什么要?jiǎng)?chuàng)建這些案例呢?一個(gè)原因是這樣做可以提高你解決問(wèn)題的能力。創(chuàng)建這些案例需要的技能就是解決問(wèn)題用到的技能。解決問(wèn)題的技能將會(huì)對(duì)你的DBA事業(yè)有很大的幫助。另一個(gè)原因是隨著你的事業(yè)的發(fā)展,你將經(jīng)常需要?jiǎng)?chuàng)建更復(fù)雜的測(cè)試案例以便保證數(shù)據(jù)庫(kù)和應(yīng)用程序的成功。在將來(lái),甚至簡(jiǎn)單的測(cè)試案例也可以組成更復(fù)雜的數(shù)據(jù)庫(kù)和應(yīng)用程序分解。

              步驟#6: 找一個(gè)良師 –一個(gè)良師能夠?yàn)槟愕腄BA生涯(或者其它類(lèi)似的職業(yè))引領(lǐng)方向。他們能夠給你指示,回答問(wèn)題以及在你的DBA的成長(zhǎng)過(guò)程中幫助你節(jié)約一些時(shí)間。但愿這篇文章能夠在你事業(yè)發(fā)展的一段時(shí)間內(nèi)起到良師益友的作用。假如你與一名資深的DBA共同工作,那么那個(gè)人應(yīng)該有責(zé)任為你的事業(yè)進(jìn)行有益的指導(dǎo)。你也可以同時(shí)選擇其他的人指導(dǎo)你。

              步驟#7: 參加本地用戶(hù)群 –許多跨國(guó)家的城市有本地用戶(hù)群,他們定期聚會(huì)討論數(shù)據(jù)庫(kù)相關(guān)的話(huà)題。假如可能,參加其中一個(gè)本地用戶(hù)群。這將給你一個(gè)與他人相互交流的很好的方法。

              我如何能夠從一名DBA初學(xué)者變?yōu)橐粋€(gè)具有中級(jí)水平的DBA?

               你已經(jīng)成為DBA一段時(shí)間了,你現(xiàn)在希望你的技術(shù)水平提高一階么?下一步該怎么做?首先,往回看前面的部分,確認(rèn)你已經(jīng)完成了所有的步驟。徹底理解 SQL語(yǔ)言是十分重要的。理解關(guān)系型數(shù)據(jù)庫(kù)理論和掌握基本的數(shù)據(jù)庫(kù)管理任務(wù)也是非常重要的。到如今,你應(yīng)該閱讀文檔和其他書(shū)籍到已經(jīng)郁悶了。假如沒(méi)有,那么你還沒(méi)準(zhǔn)備好繼續(xù)深造,增長(zhǎng)你的DBA的技術(shù)水平。假如你已經(jīng)準(zhǔn)備好繼續(xù)了,我已為你的繼續(xù)深造準(zhǔn)備了一些方法。

              步驟#1: 學(xué)習(xí)操作系統(tǒng)和你的服務(wù)器硬件 – 正如我前面所說(shuō),數(shù)據(jù)庫(kù)存在于操作系統(tǒng)和服務(wù)器硬件之上。理解這些組成部分如何工作是很必要的。你應(yīng)該知道如何與特殊的操作系統(tǒng)相合。你如何刪除或者編輯文件?假如你的操作系統(tǒng)是Unix,你應(yīng)該掌握命令行以及Unix命令如何輔助你工作。對(duì)于運(yùn)行在Windows或其他操作系統(tǒng)上而言也是一樣的。你同時(shí)需要對(duì)服務(wù)器的硬件有一定的了解。物理內(nèi)存和虛擬內(nèi)存有什么區(qū)別?RAID是什么以及不同的級(jí)別是如何產(chǎn)生影響的?為什么數(shù)據(jù)庫(kù)喜歡更多的物理硬盤(pán)而非一個(gè)大硬盤(pán)卷?你需要知道這些事情以便你能夠容易的與系統(tǒng)管理員進(jìn)行如何配置好你的服務(wù)器以便使它能夠充分的支持?jǐn)?shù)據(jù)庫(kù)方面的交談。

              步驟#2: 學(xué)習(xí)應(yīng)用程序設(shè)計(jì)因?yàn)樗c數(shù)據(jù)庫(kù)相關(guān) – 如前面所述,數(shù)據(jù)庫(kù)存在于操作系統(tǒng)與數(shù)據(jù)庫(kù)應(yīng)用程序之間。你真的需要這兩者。SQL語(yǔ)言是如何幫助創(chuàng)建好的應(yīng)用程序的?綁定變量是什么并且為什么他們很重要?Tom Kyte 寫(xiě)了一本非常好的書(shū),在Oracle應(yīng)用程序設(shè)計(jì)上給出了很好的建議。他的Expert One-on-one Oracle書(shū)可在 Wrox Press找到。我強(qiáng)烈推薦閱讀此書(shū)。他詳細(xì)的敘述了那些能夠生成和破壞Oracle應(yīng)用程序的東西。你需要知道這些,因?yàn)槟愕膽?yīng)用程序開(kāi)發(fā)人員希望從你這里得到指導(dǎo)和數(shù)據(jù)庫(kù)知識(shí)。學(xué)習(xí)任何與應(yīng)用程序設(shè)計(jì)有關(guān)的知識(shí)。也許參加一個(gè)關(guān)于軟件工程,操作系統(tǒng)或數(shù)據(jù)結(jié)構(gòu)的課程班會(huì)有好處。

              步驟#4: 取得認(rèn)證 – 也許你的工作并不需要,但是取得認(rèn)證一定對(duì)你有益。作為DBA的每一天里,你學(xué)到了許多新的和令人激動(dòng)的事情。也許在你職業(yè)生涯的這段時(shí)間里,有幾天你沒(méi)學(xué)到任何新的東西。但你仍然有很多要學(xué)習(xí)。成為一名OCP(Oracle Certified Professional) DBA要求你必須已經(jīng)學(xué)到了數(shù)據(jù)庫(kù)管理所有方面的基礎(chǔ)。我發(fā)現(xiàn)在OCP考試的學(xué)習(xí)過(guò)程中,我學(xué)到了在我工作中從未接觸過(guò)的東西。一次我學(xué)到了我從未碰到過(guò)的一個(gè)特殊課題,在后來(lái)的日子里我就能夠使用那個(gè)知識(shí)解決問(wèn)題。假如我從為在 OCP考試中學(xué)倒它,那么我永遠(yuǎn)也不會(huì)用那種特殊的方法去解決問(wèn)題。這已經(jīng)一次次的發(fā)生在我的面前。有的人可能會(huì)說(shuō)認(rèn)證實(shí)際上真的不值得。我要說(shuō)它只會(huì)對(duì)你有益無(wú)害。所以,去取得認(rèn)證吧!

              步驟#5: 獲得一個(gè)資源庫(kù) – 在前面的部分中,我指出每個(gè)DBA都應(yīng)該在Technet上有個(gè)賬號(hào)。這是你其中一個(gè)主要資源。但是同時(shí)還有許多其他資源。很多人共享他們的Oracle 知識(shí)。假如你還沒(méi)有開(kāi)始,你應(yīng)該用網(wǎng)絡(luò)瀏覽器去搜索并收集很多Oracle資源。愿意的話(huà),你可以從訪問(wèn)我的網(wǎng)站(http: //www.peasland.net)開(kāi)始。下面是一些Oracle DBA必須了解得網(wǎng)站列表:

              Ask Tom –http://asktom.oracle.com

               Jonathan Lewis web site -http://www.jlcomp.demon.co.uk/ITPUB個(gè)人空間/HFcu N

              Ixora (Steve Adams) –http://www.ixora.com.au

               Orapub –http://www.orapub.com

              Metalink (Oracle支持網(wǎng)站) –http://metalink.oracle.com

                國(guó)內(nèi)的:

                ITPUB論壇-http://www.itpub.net

                Oracle技術(shù)網(wǎng) -http://www.oradb.net

                CSDN社區(qū) -http://community.csdn.net

               還有許多其它的好網(wǎng)站

               步驟#6: 開(kāi)始在不同的新聞組和論壇上交流 – 也許你已經(jīng)發(fā)現(xiàn)了他們,但假如現(xiàn)在你還沒(méi)有那么是時(shí)候去開(kāi)始了。有許多的新聞組和論壇可以回答你的任何Oracle問(wèn)題。在Oracle群落里還有許多高手愿意和你共享他們的知識(shí)。你所要做的就是提問(wèn)。下面是一個(gè)列表包含了可以開(kāi)始交流的最好的因特網(wǎng)團(tuán)體:

              Usenet newsgroups – comp.databases.oracle.server和 comp.databases.oracle.misc 是兩個(gè)可以交流的非常著名的世界性的新聞組。他們擁有大量的針對(duì)Oracle問(wèn)題的交流卷宗。觀看這些組的最好的方法式使用新聞廣播員。但是假如你想通過(guò)基于web的方式訪問(wèn),也可以通過(guò)Google搜索引擎搜索它。 (http://groups.google.com/groups?hl=...atabases.oracle)

              Quest Pipelines – 當(dāng)他們?cè)谧铋_(kāi)始還屬于軟件提供商RevealNet的時(shí)候,被稱(chēng)為the RevealNet Pipelines。現(xiàn)在,Quest購(gòu)買(mǎi)了RevealNet 并且擁有Pipelines 。因?yàn)镻ipelines是中等的,所以這些是我最喜歡的。你可以在這里找到Pipelines (http://www.quest-pipelines.com/index.asp)。

              觀察別人是如何經(jīng)歷考驗(yàn)和磨難的是一件好事。假如你有問(wèn)題,可以自由的在群里提出來(lái)。假如你要提出問(wèn)題,通常應(yīng)該包括一些信息,比如你的 Oracle版本和Oracle運(yùn)行的平臺(tái)。這些將會(huì)得到有很大的差別的答案。假如你忘記了,會(huì)有人提醒你!甚至你不用提問(wèn)也可以從其他人的答案中學(xué)到許多知識(shí)。我已經(jīng)記不得多少次我之所以能夠解決問(wèn)題完全是因?yàn)槲矣浀闷渌嗽谛侣劷M里問(wèn)過(guò)相同的問(wèn)題。
            posted @ 2011-03-04 15:38 學(xué)習(xí)才能進(jìn)步 閱讀(209) | 評(píng)論 (0)編輯 收藏
              2008年4月29日

            簡(jiǎn)述:
              作為網(wǎng)頁(yè)主體內(nèi)容的BODY部分將直接顯示在瀏覽器的窗口中,它里面的內(nèi)容直接影響著整個(gè)網(wǎng)頁(yè)的好壞,在網(wǎng)頁(yè)設(shè)計(jì)中起著至關(guān)重要的作用。

              在開(kāi)始編寫(xiě)具體頁(yè)面內(nèi)容之前,我們需要對(duì)頁(yè)面進(jìn)行整體的基本規(guī)劃和設(shè)置,如整個(gè)頁(yè)面的背景色、背景圖案、前景(文字)色、頁(yè)面左/上邊距大小等等,在HTML中,我們用<body>標(biāo)簽內(nèi)指定參數(shù)來(lái)設(shè)置:
            <body bgcolor="?" background="?"text="?" leftmargin="?" topmargin="?"link="?" alink="?" vlink="?">…..</body>
            其中各參數(shù)為:
            Bgcolor:指定網(wǎng)頁(yè)背景色,可指定其顏色值;例:bgcolor="#E2E2FF";
            Background:指定網(wǎng)頁(yè)背景圖案地址,如background="images/back.gif";
            Text:指定網(wǎng)頁(yè)內(nèi)文字顏色,如:text="#000000";
            Leftmargin:指定網(wǎng)頁(yè)的左邊距,如:leftmargin="0";
            Topmargin:指定網(wǎng)頁(yè)上邊距,同上。
            Link:指定鏈接文字的顏色,如:link="blue";
            Alink:指定當(dāng)鼠標(biāo)移動(dòng)到鏈接文字上時(shí)文字的顏色,如:alink="red";
            Vlink:指定當(dāng)我們?cè)L問(wèn)過(guò)后的鏈接顏色,如:vlink="#555555";
            盜版它人網(wǎng)站的內(nèi)容可恥,您查看的內(nèi)容盜版于★點(diǎn)擊設(shè)計(jì)★www.djasp.Net
            示例:網(wǎng)頁(yè)背景為白色,文字為紅色,鏈接色為綠色,訪問(wèn)過(guò)的鏈接也為綠色,網(wǎng)頁(yè)左邊距為10像素,上邊距為3像素。
            代碼如下:
            <html>
            <head><title>點(diǎn)擊設(shè)計(jì)</title></head>
            <body bgcolor="#ffffff" text="red" link="green"vlink="green" leftmargin=10 topmargin=3>
            網(wǎng)頁(yè)正文內(nèi)容….
            </body>
            </html>

            posted @ 2008-04-29 11:09 學(xué)習(xí)才能進(jìn)步 閱讀(433) | 評(píng)論 (0)編輯 收藏
              2008年4月18日
            1、觸發(fā)器

            定義: 何為觸發(fā)器?在SQL Server里面也就是對(duì)某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程。
            常見(jiàn)的觸發(fā)器有三種:分別應(yīng)用于Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發(fā)器,這里不提)

            我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:

            Create Table Student( --學(xué)生表
            StudentID int primary key, --學(xué)號(hào)
            ....
            )

            Create Table BorrowRecord( --學(xué)生借書(shū)記錄表
            BorrowRecord int identity(1,1), --流水號(hào)
            StudentID int , --學(xué)號(hào)
            BorrowDate datetime, --借出時(shí)間
            ReturnDAte Datetime, --歸還時(shí)間
            ...
            )

            用到的功能有:
            1.如果我更改了學(xué)生的學(xué)號(hào),我希望他的借書(shū)記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書(shū)記錄表的學(xué)號(hào));
            2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書(shū)記錄。
            等等。

            這時(shí)候可以用到觸發(fā)器。對(duì)于1,創(chuàng)建一個(gè)Update觸發(fā)器:

            Create Trigger truStudent
            On Student
            for Update
            As
            if Update(StudentID)
            begin

            Update BorrowRecord
            Set StudentID=i.StudentID
            From BorrowRecord br , Deleted d ,Inserted i
            Where br.StudentID=d.StudentID

            end

            理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
            一個(gè)Update 的過(guò)程可以看作為:生成新的記錄到Inserted表,復(fù)制舊的記錄到Deleted表,然后刪除Student記錄并寫(xiě)入新紀(jì)錄。

            對(duì)于2,創(chuàng)建一個(gè)Delete觸發(fā)器
            Create trigger trdStudent
            On Student
            for Delete
            As
            Delete BorrowRecord
            From BorrowRecord br , Delted d
            Where br.StudentID=d.StudentID

            從這兩個(gè)例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個(gè)臨時(shí)的表;B.觸發(fā)機(jī)制。
            這里我們只講解最簡(jiǎn)單的觸發(fā)器。復(fù)雜的容后說(shuō)明。
            事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級(jí)聯(lián)”所替代.
            posted @ 2008-04-18 16:09 學(xué)習(xí)才能進(jìn)步 閱讀(192) | 評(píng)論 (0)編輯 收藏
              2008年4月17日
            使用多層架構(gòu)進(jìn)行系統(tǒng)開(kāi)發(fā)是現(xiàn)今系統(tǒng)設(shè)計(jì)的流行趨勢(shì)。通過(guò)分解業(yè)務(wù)細(xì)節(jié),將不同的功能代碼分散開(kāi)來(lái),更利于系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā),同時(shí)為可能的變更提供了更小的單元。

            以下就是一個(gè)典型的多層體系結(jié)構(gòu)圖。

            uploads/200607/24_142206_mt.png


            首先我們以“訂單(Order)”為例,進(jìn)行一個(gè)簡(jiǎn)單的業(yè)務(wù)分解。

            1. 訂單自然包括訂單的內(nèi)容(OrderInfo),其中有諸如訂單編號(hào)、商品名稱(chēng)、數(shù)量,以及金額等信息。
            2. 有了訂單信息,我們還需要一個(gè)存儲(chǔ)訂單的場(chǎng)所,那么自然需要有個(gè)操作讀寫(xiě)的對(duì)象(OrderAccess)。
            3. 為了外界能進(jìn)行相關(guān)的訂單操作,我們還需要有個(gè)業(yè)務(wù)邏輯對(duì)象(Order),它提供創(chuàng)建新訂單,向訂單插入/刪除商品,保存訂單等操作。

            通過(guò)上面的分析,我們基本上可以將一個(gè)業(yè)務(wù)邏輯完整地分割為:

            業(yè)務(wù)實(shí)體 ---> OrderInfo
            數(shù)據(jù)訪問(wèn) ---> OrderAccess
            業(yè)務(wù)邏輯 ---> Order

            基于系統(tǒng)架構(gòu)考慮,我們將這些對(duì)象分別放置在不同的邏輯單元中,這些邏輯單元就組成了“多層”。

            業(yè)務(wù)實(shí)體層(Model) ---> 業(yè)務(wù)實(shí)體 ---> OrderInfo
            數(shù)據(jù)訪問(wèn)層(DAL) ---> 數(shù)據(jù)訪問(wèn) ---> OrderAccess
            業(yè)務(wù)邏輯層(BLL) ---> 業(yè)務(wù)邏輯 ---> Order

            同樣以上面訂單為例,我們進(jìn)一步講述各層對(duì)象的實(shí)現(xiàn)細(xì)節(jié)。

            1. 客戶(hù)基本上只依賴(lài)于 Order 和 OrderInfo,通過(guò)他們就可以操作業(yè)務(wù)的全部,它并不關(guān)心業(yè)務(wù)存儲(chǔ)等細(xì)節(jié)。

            2. 大多數(shù)時(shí)候我們會(huì)將 OrderAccess 設(shè)計(jì)成 Internal Protected 方式,OrderAccess 可以是一個(gè)抽象類(lèi)或者接口。我更習(xí)慣于將其實(shí)現(xiàn)為抽象類(lèi),因?yàn)槟承┓椒ㄊ钦{(diào)用其他方法來(lái)實(shí)現(xiàn)的,抽象類(lèi)的設(shè)計(jì)可以減少實(shí)現(xiàn)類(lèi)的代碼數(shù)量。另外將該抽象類(lèi)設(shè)計(jì)成工廠方法模式,通過(guò) IoC 或者 "配置反射" 來(lái)獲得具體的實(shí)現(xiàn)類(lèi),可以減少層之間的耦合,也便于數(shù)據(jù)系統(tǒng)的替換。

            3. Order 多數(shù)時(shí)候可以實(shí)現(xiàn)為 Singleton 或者靜態(tài)類(lèi),它只是提供了一系列的方法來(lái)操作某些邏輯,通過(guò)接受 OrderInfo 參數(shù)來(lái)獲取信息。其本身無(wú)需保存任何狀態(tài)。如果需要實(shí)現(xiàn)購(gòu)物車(chē),只需將 OrderInfo 存儲(chǔ)到 Session 之中即可。

            通過(guò)上面的例子,我們還可以發(fā)現(xiàn)多層的另外一個(gè)好處就是更利于團(tuán)隊(duì)協(xié)作開(kāi)發(fā)。架構(gòu)設(shè)計(jì)人員無(wú)需考慮具體的數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼,而將設(shè)計(jì)重點(diǎn)放在業(yè)務(wù)層面;數(shù)據(jù)庫(kù)開(kāi)發(fā)人員自然也可將重心放在數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化上。團(tuán)隊(duì)成員之間不再是一人負(fù)責(zé)一個(gè)業(yè)務(wù)模塊,不再有了 n 個(gè)數(shù)據(jù)訪問(wèn)類(lèi),不再有 n 種不同的對(duì)象模式等等。從傳統(tǒng)的 "瓦罐作坊" 演變?yōu)?"工業(yè)流水線",更利于根據(jù)技術(shù)能力和業(yè)務(wù)熟悉度的差別來(lái)劃分不同的角色。
            posted @ 2008-04-17 17:13 學(xué)習(xí)才能進(jìn)步 閱讀(217) | 評(píng)論 (0)編輯 收藏
            使用多層架構(gòu)進(jìn)行系統(tǒng)開(kāi)發(fā)是現(xiàn)今系統(tǒng)設(shè)計(jì)的流行趨勢(shì)。通過(guò)分解業(yè)務(wù)細(xì)節(jié),將不同的功能代碼分散開(kāi)來(lái),更利于系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā),同時(shí)為可能的變更提供了更小的單元。

            以下就是一個(gè)典型的多層體系結(jié)構(gòu)圖。

            uploads/200607/24_142206_mt.png


            首先我們以“訂單(Order)”為例,進(jìn)行一個(gè)簡(jiǎn)單的業(yè)務(wù)分解。

            1. 訂單自然包括訂單的內(nèi)容(OrderInfo),其中有諸如訂單編號(hào)、商品名稱(chēng)、數(shù)量,以及金額等信息。
            2. 有了訂單信息,我們還需要一個(gè)存儲(chǔ)訂單的場(chǎng)所,那么自然需要有個(gè)操作讀寫(xiě)的對(duì)象(OrderAccess)。
            3. 為了外界能進(jìn)行相關(guān)的訂單操作,我們還需要有個(gè)業(yè)務(wù)邏輯對(duì)象(Order),它提供創(chuàng)建新訂單,向訂單插入/刪除商品,保存訂單等操作。

            通過(guò)上面的分析,我們基本上可以將一個(gè)業(yè)務(wù)邏輯完整地分割為:

            業(yè)務(wù)實(shí)體 ---> OrderInfo
            數(shù)據(jù)訪問(wèn) ---> OrderAccess
            業(yè)務(wù)邏輯 ---> Order

            基于系統(tǒng)架構(gòu)考慮,我們將這些對(duì)象分別放置在不同的邏輯單元中,這些邏輯單元就組成了“多層”。

            業(yè)務(wù)實(shí)體層(Model) ---> 業(yè)務(wù)實(shí)體 ---> OrderInfo
            數(shù)據(jù)訪問(wèn)層(DAL) ---> 數(shù)據(jù)訪問(wèn) ---> OrderAccess
            業(yè)務(wù)邏輯層(BLL) ---> 業(yè)務(wù)邏輯 ---> Order

            同樣以上面訂單為例,我們進(jìn)一步講述各層對(duì)象的實(shí)現(xiàn)細(xì)節(jié)。

            1. 客戶(hù)基本上只依賴(lài)于 Order 和 OrderInfo,通過(guò)他們就可以操作業(yè)務(wù)的全部,它并不關(guān)心業(yè)務(wù)存儲(chǔ)等細(xì)節(jié)。

            2. 大多數(shù)時(shí)候我們會(huì)將 OrderAccess 設(shè)計(jì)成 Internal Protected 方式,OrderAccess 可以是一個(gè)抽象類(lèi)或者接口。我更習(xí)慣于將其實(shí)現(xiàn)為抽象類(lèi),因?yàn)槟承┓椒ㄊ钦{(diào)用其他方法來(lái)實(shí)現(xiàn)的,抽象類(lèi)的設(shè)計(jì)可以減少實(shí)現(xiàn)類(lèi)的代碼數(shù)量。另外將該抽象類(lèi)設(shè)計(jì)成工廠方法模式,通過(guò) IoC 或者 "配置反射" 來(lái)獲得具體的實(shí)現(xiàn)類(lèi),可以減少層之間的耦合,也便于數(shù)據(jù)系統(tǒng)的替換。

            3. Order 多數(shù)時(shí)候可以實(shí)現(xiàn)為 Singleton 或者靜態(tài)類(lèi),它只是提供了一系列的方法來(lái)操作某些邏輯,通過(guò)接受 OrderInfo 參數(shù)來(lái)獲取信息。其本身無(wú)需保存任何狀態(tài)。如果需要實(shí)現(xiàn)購(gòu)物車(chē),只需將 OrderInfo 存儲(chǔ)到 Session 之中即可。

            通過(guò)上面的例子,我們還可以發(fā)現(xiàn)多層的另外一個(gè)好處就是更利于團(tuán)隊(duì)協(xié)作開(kāi)發(fā)。架構(gòu)設(shè)計(jì)人員無(wú)需考慮具體的數(shù)據(jù)庫(kù)實(shí)現(xiàn)代碼,而將設(shè)計(jì)重點(diǎn)放在業(yè)務(wù)層面;數(shù)據(jù)庫(kù)開(kāi)發(fā)人員自然也可將重心放在數(shù)據(jù)庫(kù)訪問(wèn)優(yōu)化上。團(tuán)隊(duì)成員之間不再是一人負(fù)責(zé)一個(gè)業(yè)務(wù)模塊,不再有了 n 個(gè)數(shù)據(jù)訪問(wèn)類(lèi),不再有 n 種不同的對(duì)象模式等等。從傳統(tǒng)的 "瓦罐作坊" 演變?yōu)?"工業(yè)流水線",更利于根據(jù)技術(shù)能力和業(yè)務(wù)熟悉度的差別來(lái)劃分不同的角色。
            posted @ 2008-04-17 17:13 學(xué)習(xí)才能進(jìn)步 閱讀(215) | 評(píng)論 (0)編輯 收藏
              2007年4月9日
            二叉樹(shù)是一種非線性的數(shù)據(jù)結(jié)構(gòu),在對(duì)它進(jìn)行操作時(shí),總是需要逐一對(duì)每個(gè)數(shù)據(jù)元素實(shí)施

                 操作,這樣就存在一個(gè)操作順序問(wèn)題,由此提出了二叉樹(shù)的遍歷操作。所謂遍歷二叉樹(shù)就  

                 是按某種順序訪問(wèn)二叉樹(shù)中的每個(gè)結(jié)點(diǎn)一次且僅一次的過(guò)程。這里的訪問(wèn)可以是輸出、比

                 較、更新、查看元素內(nèi)容等等各種操作。

                 二叉樹(shù)的遍歷方式分為兩大類(lèi):一類(lèi)按根、左子樹(shù)和右子樹(shù)三個(gè)部分進(jìn)行訪問(wèn);另一類(lèi)按

                 層次訪問(wèn)。下面我們將分別進(jìn)行討論。


                1、 按根、左子樹(shù)和右子樹(shù)三部分進(jìn)行遍歷

            遍歷二叉樹(shù)的順序存在下面6種可能:

                TLR(根左右), TRL(根右左)

                LTR(左根右), RTL(右根左)

                LRT(左右根), RLT(右左根)

                 其中,TRL、RTL和RLT三種順序在左右子樹(shù)之間均是先右子樹(shù)后左子樹(shù),這與人們先左后右

            的習(xí)慣不同,因此,往往不予采用。余下的三種順序TLR、LTR和LRT根據(jù)根訪問(wèn)的位置不同分別

            被稱(chēng)為先序遍歷、中序遍歷和后序遍歷。

            (1)先序遍歷

            若二叉樹(shù)為空,則結(jié)束遍歷操作;否則

            訪問(wèn)根結(jié)點(diǎn);

            先序遍歷左子樹(shù);

            先序遍歷右子樹(shù)。

            (2)中序遍歷若二叉樹(shù)為空,則結(jié)束遍歷操作;否則

            中序遍歷左子樹(shù);

            訪問(wèn)根結(jié)點(diǎn);

            中序遍歷右子樹(shù)。

            (3)后序遍歷

            若二叉樹(shù)為空,則結(jié)束遍歷操作;否則

            后序遍歷左子樹(shù);

            后序遍歷右子樹(shù);

            訪問(wèn)根結(jié)點(diǎn)。

            例如。以下是一棵二叉樹(shù)及其經(jīng)過(guò)三種遍歷所得到的相應(yīng)遍歷序列

            二叉樹(shù)的兩種遍歷方法:

            (1)對(duì)一棵二叉樹(shù)中序遍歷時(shí),若我們將二叉樹(shù)嚴(yán)格地按左子樹(shù)的所有結(jié)點(diǎn)位于根結(jié)點(diǎn)的左

            側(cè),右子樹(shù)的所有結(jié)點(diǎn)位于根右側(cè)的形式繪制,就可以對(duì)每個(gè)結(jié)點(diǎn)做一條垂線,映射到下面的

            水平線上,由此得到的順序就是該二叉樹(shù)的中序遍歷序列

            (2)任何一棵二叉樹(shù)都可以將它的外部輪廓用一條線繪制出來(lái),我們將它稱(chēng)為二叉樹(shù)的包線,

            這條包線對(duì)于理解二叉樹(shù)的遍歷過(guò)程很有用。

                 由此可以看出:(1)遍歷操作實(shí)際上是將非線性結(jié)構(gòu)線性化的過(guò)程,其結(jié)果為線性序列,

            并根據(jù)采用的遍歷順序分別稱(chēng)為先序序列、中序序列或后序序列;(2)遍歷操作是一個(gè)遞歸的

            過(guò)程,因此,這三種遍歷操作的算法可以用遞歸函數(shù)實(shí)現(xiàn)。

            (1)先序遍歷遞歸算法
            void PreOrder(BTree BT) {
                  if (BT) { Visit(BT);
                  PreOrder(BT->Lchild);
                  PreOrder(BT->Rchild);
            }

            (2)中序遍歷遞歸算法
            void InOrder(BTree BT) {
                  if (BT) {
                     InOrder(BT->Lchild);
                     Visit(BT);
                     InOrder(BT->Rchild);
                   }
                }

            (3)后序遍歷遞歸算法
            void PostOrder(BTree BT) {
                 if (BT) {
                    PostOrder(BT->Lchild);
                    PostOrder(BT->Rchild);
                    Visit(BT);
                   }
                }

               2 、按層次遍歷二叉樹(shù)

                 實(shí)現(xiàn)方法為從上層到下層,每層中從左側(cè)到右側(cè)依次訪問(wèn)每個(gè)結(jié)點(diǎn)。下面我們將給出一棵

            二叉樹(shù)及其按層次順序訪問(wèn)其中每個(gè)結(jié)點(diǎn)的遍歷序列。

            void LevelOreder(QBTree BT) {
                 for (i=1;i<=BT.n;i++)
                 if (BT.elem[i]!='#') Visite(BT.elem[i]);
            }

            二叉樹(shù)用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示時(shí),按層遍歷的算法實(shí)現(xiàn)

            訪問(wèn)過(guò)程描述如下:

            訪問(wèn)根結(jié)點(diǎn),并將該結(jié)點(diǎn)記錄下來(lái);

            若記錄的所有結(jié)點(diǎn)都已處理完畢,則結(jié)束遍歷操作;否則重復(fù)下列操作。

            取出記錄中第一個(gè)還沒(méi)有訪問(wèn)孩子的結(jié)點(diǎn),若它有左孩子,則訪問(wèn)左孩子,并將記錄下來(lái);

            若它有右孩子,則訪問(wèn)右孩子,并記錄下來(lái)。

                 在這個(gè)算法中,應(yīng)使用一個(gè)隊(duì)列結(jié)構(gòu)完成這項(xiàng)操作。所謂記錄訪問(wèn)結(jié)點(diǎn)就是入隊(duì)操作;

                 而取出記錄的結(jié)點(diǎn)就是出隊(duì)操作。這樣一來(lái),我們的算法就可以描述成下列形式:

            (1)訪問(wèn)根結(jié)點(diǎn),并將根結(jié)點(diǎn)入隊(duì);

            (2)當(dāng)隊(duì)列不空時(shí),重復(fù)下列操作:

            從隊(duì)列退出一個(gè)結(jié)點(diǎn);

            若其有左孩子,則訪問(wèn)左孩子,并將其左孩子入隊(duì);

            若其有右孩子,則訪問(wèn)右孩子,并將其右孩子入隊(duì);

            void LevelOrder(BTree *BT) {
                  if (!BT) exit;
                  InitQueue(Q); p=BT; //初始化
                  Visite(p); EnQueue(&Q,p); //訪問(wèn)根結(jié)點(diǎn),并將根結(jié)點(diǎn)入隊(duì)
                  while (!QueueEmpty(Q)) { //當(dāng)隊(duì)非空時(shí)重復(fù)執(zhí)行下列操作
                  DeQueue(&Q,&p); //出隊(duì)
                  if (!p->Lchild) {Visite(p->Lchild);EnQueue(&Q,p->Lchild); //處理左孩子
                  if (!p->Rchild) {Visite(p->Rchild);EnQueue(&Q,p->Rchild); //處理右孩子
               }
            }


               五、典型二叉樹(shù)的操作算法

                 1、 輸入一個(gè)二叉樹(shù)的先序序列,構(gòu)造這棵二叉樹(shù)

                 為了保證唯一地構(gòu)造出所希望的二叉樹(shù),在鍵入這棵樹(shù)的先序序列時(shí),需要在所有空二叉

                樹(shù)的位置上填補(bǔ)一個(gè)特殊的字符,比如,'#'。在算法中,需要對(duì)每個(gè)輸入的字符進(jìn)行判

                斷,如果對(duì)應(yīng)的字符是'#',則在相應(yīng)的位置上構(gòu)造一棵空二叉樹(shù);否則,創(chuàng)建一個(gè)新結(jié)

                點(diǎn)。整個(gè)算法結(jié)構(gòu)以先序遍歷遞歸算法為基礎(chǔ),二叉樹(shù)中結(jié)點(diǎn)之間的指針連接是通過(guò)指針

                參數(shù)在遞歸調(diào)用返回時(shí)完成。

            算法:

            BTree Pre_Create_BT( ) {
                  getch(ch);
                  if (ch=='#') return NULL;                     //構(gòu)造空樹(shù)
                  else { BT=(BTree)malloc(sizeof(BTLinklist)); //構(gòu)造新結(jié)點(diǎn)
                  BT->data=ch;
                  BT->lchild =Pre_Create_BT( );                 //構(gòu)造左子樹(shù)
                  BT->rchild =Pre_Create_BT( );                 //構(gòu)造右子樹(shù)
                  return BT;
                }
            }

               2、 計(jì)算一棵二叉樹(shù)的葉子結(jié)點(diǎn)數(shù)目

                 這個(gè)操作可以使用三種遍歷順序中的任何一種,只是需要將訪問(wèn)操作變成判斷該結(jié)點(diǎn)是否

                 為葉子結(jié)點(diǎn),如果是葉子結(jié)點(diǎn)將累加器加1即可。下面這個(gè)算法是利用中序遍歷實(shí)現(xiàn)的。

            算法:

            void Leaf(BTree BT,int *count) {
                  if (BT) {
                  Leaf(BT->child,&count); //計(jì)算左子樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù)
                  if (BT->lchild==NULL&&BT->rchild==NULL) (*count)++;
                  Leaf(BT->rchild,&count); //計(jì)算右子樹(shù)的葉子結(jié)點(diǎn)個(gè)數(shù)
                }
            }

               3、 交換二叉樹(shù)的左右子樹(shù)

                 許多操作可以利用三種遍歷順序的任何一種,只是某種遍歷順序?qū)崿F(xiàn)起來(lái)更加方便一  

            些。而有些操作則不然,它只能使用其中的一種或兩種遍歷順序。將二叉樹(shù)中所有結(jié)點(diǎn)的左右

            子樹(shù)進(jìn)行交換這個(gè)操作就屬于這類(lèi)情況。

            算法:

            void change_left_right(BTree BT) {
                  if (BT) {
                     change_left_right(BT->lchild);
                     change_left_right(BT->rchild);
                     BT->lchild<->BT->rchild;
                   }
               }

               4 、求二叉樹(shù)的高度

                 這個(gè)操作使用后序遍歷比較符合人們求解二叉樹(shù)高度的思維方式。首先分別求出左右子樹(shù)

            的高度,在此基礎(chǔ)上得出該棵樹(shù)的高度,即左右子樹(shù)較大的高度值加1。

            算法:

            int hight(BTree BT) {     //h1和h2分別是以BT為根的左右子樹(shù)的高度
                 if (BT==NULL) return 0;
                 else {
                     h1=hight(BT->lchild);
                     h2=hight(BT->right);
                     return max{h1,h2}+1;
                    }
               }

               六、樹(shù)、森林與二叉樹(shù)的轉(zhuǎn)換

               1、 樹(shù)、森林轉(zhuǎn)換成二叉樹(shù)

                 將一棵樹(shù)轉(zhuǎn)換成二叉樹(shù)的方法:

                 將一棵樹(shù)轉(zhuǎn)換成二叉樹(shù)實(shí)際上就是將這棵樹(shù)用孩子兄弟表示法存儲(chǔ)即可,此時(shí),樹(shù)中的每

            個(gè)結(jié)點(diǎn)最多有兩個(gè)指針:一個(gè)指針指向第一個(gè)孩子,另一個(gè)指針指向右側(cè)第一個(gè)兄弟。當(dāng)你將

            這兩個(gè)指針看作是二叉樹(shù)中的左孩子指針和孩子右指針時(shí),就是一棵二叉樹(shù)了。

                 特點(diǎn):一棵樹(shù)轉(zhuǎn)換成二叉樹(shù)后,根結(jié)點(diǎn)沒(méi)有右孩子。

                 將森林轉(zhuǎn)換成二叉樹(shù)的方法與一棵樹(shù)轉(zhuǎn)換成二叉樹(shù)的方法類(lèi)似,只是把森林中所有樹(shù)的根

                  結(jié)點(diǎn)看作兄弟關(guān)系,并對(duì)其中的每棵樹(shù)依依地進(jìn)行轉(zhuǎn)換。

                2 、二叉樹(shù)還原成樹(shù)或森林

                 這個(gè)過(guò)程實(shí)際上是樹(shù)、森林轉(zhuǎn)換成二叉樹(shù)的逆過(guò)程,即將該二叉樹(shù)看作是樹(shù)或森林的孩子

            兄弟表示法。比如,若二叉樹(shù)為空,樹(shù)也為空;否則,由二叉樹(shù)的根結(jié)點(diǎn)開(kāi)始,延右指針向下

            走,直到為空,途經(jīng)的結(jié)點(diǎn)個(gè)數(shù)是相應(yīng)森林所含樹(shù)的棵數(shù);若某個(gè)結(jié)點(diǎn)的左指針?lè)强眨f(shuō)明這

            個(gè)結(jié)點(diǎn)在樹(shù)中必有孩子,并且從二叉樹(shù)中該結(jié)點(diǎn)左指針?biāo)附Y(jié)點(diǎn)開(kāi)始,延右指針向下走,直到

            為空,途經(jīng)的結(jié)點(diǎn)個(gè)數(shù)就是這個(gè)結(jié)點(diǎn)的孩子數(shù)目。

            posted @ 2007-04-09 16:25 學(xué)習(xí)才能進(jìn)步 閱讀(1446) | 評(píng)論 (0)編輯 收藏
              2007年4月6日

            面向?qū)ο缶幊?/h1>

              面向?qū)ο缶幊?/font>Object Oriented ProgrammingOOP面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)。OOP 的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或對(duì)象組合而成。OOP 達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性、靈活性和擴(kuò)展性。為了實(shí)現(xiàn)整體運(yùn)算,每個(gè)對(duì)象都能夠接收信息、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息。OOP 主要有以下的概念和組件

                  組件 - 數(shù)據(jù)和功能一起在運(yùn)行著的計(jì)算機(jī)程序中形成的單元,組件在 OOP 計(jì)算機(jī)程序中是模塊和結(jié)構(gòu)化的基礎(chǔ)。
                  抽象性 - 程序有能力忽略正在處理中信息的某些方面,即對(duì)信息主要方面關(guān)注的能力。
                  封裝 - 也叫做信息封裝:確保組件不會(huì)以不可預(yù)期的方式改變其它組件的內(nèi)部狀態(tài);只有在那些提供了內(nèi)部狀態(tài)改變方法的組件中,才可以訪問(wèn)其內(nèi)部狀態(tài)。每類(lèi)組件都提供了一個(gè)與其它組件聯(lián)系的接口,并規(guī)定了其它組件進(jìn)行調(diào)用的方法。
                  多態(tài)性 - 組件的引用和類(lèi)集會(huì)涉及到其它許多不同類(lèi)型的組件,而且引用組件所產(chǎn)生的結(jié)果得依據(jù)實(shí)際調(diào)用的類(lèi)型。
                  繼承性 - 允許在現(xiàn)存的組件基礎(chǔ)上創(chuàng)建子類(lèi)組件,這統(tǒng)一并增強(qiáng)了多態(tài)性和封裝性。典型地來(lái)說(shuō)就是用類(lèi)來(lái)對(duì)組件進(jìn)行分組,而且還可以定義新類(lèi)為現(xiàn)存的類(lèi)的擴(kuò)展,這樣就可以將類(lèi)組織成樹(shù)形或網(wǎng)狀結(jié)構(gòu),這體現(xiàn)了動(dòng)作的通用性。

              由于抽象性、封裝性、重用性以及便于使用等方面的原因,以組件為基礎(chǔ)的編程在腳本語(yǔ)言中已經(jīng)變得特別流行。Python 和 Ruby 是最近才出現(xiàn)的語(yǔ)言,在開(kāi)發(fā)時(shí)完全采用了 OOP 的思想,而流行的 Perl 腳本語(yǔ)言從版本5開(kāi)始也慢慢地加入了新的面向?qū)ο?/font>的功能組件。用組件代替“現(xiàn)實(shí)”上的實(shí)體成為 JavaScript(ECMAScript) 得以流行的原因,有論證表明對(duì)組件進(jìn)行適當(dāng)?shù)慕M合就可以在英特網(wǎng)上代替 HTML 和 XML 的文檔對(duì)象模型(DOM)。  


            一、oop的基本思想


                  OOP的許多原始思想都來(lái)之于Simula語(yǔ)言,并在Smalltalk語(yǔ)言的完善和標(biāo)準(zhǔn)化過(guò)程中得到更多的擴(kuò)展和對(duì)以前的思想的重新注解。可以說(shuō)OO思想和OOPL幾乎是同步發(fā)展相互促進(jìn)的。與函數(shù)式程序設(shè)計(jì)(functional-programming)和邏輯式程序設(shè)計(jì)(logic-programming)所代表的接近于機(jī)器的實(shí)際計(jì)算模型所不同的是,OOP幾乎沒(méi)有引入精確的數(shù)學(xué)描敘,而是傾向于建立一個(gè)對(duì)象模型,它能夠近似的反映應(yīng)用領(lǐng)域內(nèi)的實(shí)體之間的關(guān)系,其本質(zhì)是更接近于一種人類(lèi)認(rèn)知事物所采用的哲學(xué)觀的計(jì)算模型。由此,導(dǎo)致了一個(gè)自然的話(huà)題,那就是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,對(duì)象作為計(jì)算主體,擁有自己的名稱(chēng),狀態(tài)以及接受外界消息的接口。在對(duì)象模型中,產(chǎn)生新對(duì)象,舊對(duì)象銷(xiāo)毀,發(fā)送消息,響應(yīng)消息就構(gòu)成OOP計(jì)算模型的根本。

                  對(duì)象的產(chǎn)生有兩種基本方式。一種是以原型(prototype)對(duì)象為基礎(chǔ)產(chǎn)生新的對(duì)象。一種是以類(lèi)(class)為基礎(chǔ)產(chǎn)生新對(duì)象。原型的概念已經(jīng)在認(rèn)知心理學(xué)中被用來(lái)解釋概念學(xué)習(xí)的遞增特性,原型模型本身就是企圖通過(guò)提供一個(gè)有代表性的對(duì)象為基礎(chǔ)來(lái)產(chǎn)生各種新的對(duì)象,并由此繼續(xù)產(chǎn)生更符合實(shí)際應(yīng)用的對(duì)象。而原型-委托也是OOP中的對(duì)象抽象,代碼共享機(jī)制中的一種。一個(gè)類(lèi)提供了一個(gè)或者多個(gè)對(duì)象的通用性描敘。從形式化的觀點(diǎn)看,類(lèi)與類(lèi)型有關(guān),因此一個(gè)類(lèi)相當(dāng)于是從該類(lèi)中產(chǎn)生的實(shí)例的集合。而這樣的觀點(diǎn)也會(huì)帶來(lái)一些矛盾,比較典型的就是在繼承體系下,子集(子類(lèi))對(duì)象和父集(父類(lèi))對(duì)象之間的行為相融性可能很難達(dá)到,這也就是OOP中常被引用的---子類(lèi)型(subtype)不等于子類(lèi)(subclass)[Budd 2002]。而在一種所有皆對(duì)象的世界觀背景下,在類(lèi)模型基礎(chǔ)上還誕生出了一種擁有元類(lèi)(metaclass)的新對(duì)象模型。即類(lèi)本身也是一種其他類(lèi)的對(duì)象。以上三種根本不同的觀點(diǎn)各自定義了三種基于類(lèi)(class-based),基于原型(prototype-based)和基于元類(lèi)(metaclass-based)的對(duì)象模型。而這三種對(duì)象模型也就導(dǎo)致了許多不同的程序設(shè)計(jì)語(yǔ)言(如果我們暫時(shí)把靜態(tài)與動(dòng)態(tài)的差別放在一邊)。是的,我們經(jīng)常接觸的C++,Java都是使用基于類(lèi)的對(duì)象模型,但除此之外還有很多我們所沒(méi)有接觸的OOPL采用了完全不一樣的對(duì)象模型,他們是在用另外一種觀點(diǎn)詮釋OOP的內(nèi)涵。

                  什么是oop的基本思想呢?把組件的實(shí)現(xiàn)和接口分開(kāi),并且讓組件具有多態(tài)性。不過(guò),兩者還是有根本的不同。oop強(qiáng)調(diào)在程序構(gòu)造中語(yǔ)言要素的語(yǔ)法。你必須得繼承,使用類(lèi),使用對(duì)象,對(duì)象傳遞消息。gp不關(guān)心你繼承或是不繼承,它的開(kāi)端是分析產(chǎn)品的分類(lèi),有些什么種類(lèi),他們的行為如何。就是說(shuō),兩件東西相等意味著什么?怎樣正確地定義相等操作?不單單是相等操作那么簡(jiǎn)單,你往深處分析就會(huì)發(fā)現(xiàn)“相等”這個(gè)一般觀念意味著兩個(gè)對(duì)象部分,或者至少基本部分是相等的,據(jù)此我們就可以有一個(gè)通用的相等操作。再說(shuō)對(duì)象的種類(lèi)。假設(shè)存在一個(gè)順序序列和一組對(duì)于順序序列的操作。那么這些操作的語(yǔ)義是什么?從復(fù)雜度權(quán)衡的角度看,我們應(yīng)該向用戶(hù)提供什么樣的順序序列?該種序列上存在那些操作?那種排序是我們需要的?只有對(duì)這些組件的概念型分類(lèi)搞清楚了,我們才能提到實(shí)現(xiàn)的問(wèn)題:使用模板、繼承還是宏?使用什么語(yǔ)言和技術(shù)?gp的基本觀點(diǎn)是把抽象的軟件組件和它們的行為用標(biāo)準(zhǔn)的分類(lèi)學(xué)分類(lèi),出發(fā)點(diǎn)就是要建造真實(shí)的、高效的和不取決于語(yǔ)言的算法和數(shù)據(jù)結(jié)構(gòu)。當(dāng)然最終的載體還是語(yǔ)言,沒(méi)有語(yǔ)言沒(méi)法編程。stl使用c++,你也可以用ada來(lái)實(shí)現(xiàn),用其他的語(yǔ)言來(lái)實(shí)現(xiàn)也行,結(jié)果會(huì)有所不同,但基本的東西是一樣的。到處都要用到二分查找和排序,而這就是人們正在做的。對(duì)于容器的語(yǔ)義,不同的語(yǔ)言會(huì)帶來(lái)輕微的不同。但是基本的區(qū)別很清楚是gp所依存的語(yǔ)義,以及語(yǔ)義分解。例如,我們決定需要一個(gè)組件swap,然后指出這個(gè)組件在不同的語(yǔ)言中如果工作。顯然重點(diǎn)是語(yǔ)義以及語(yǔ)義分類(lèi)。而oop所強(qiáng)調(diào)的(我認(rèn)為是過(guò)分強(qiáng)調(diào)的)是清楚的定義類(lèi)之間的層次關(guān)系。oop告訴了你如何建立層次關(guān)系,卻沒(méi)有告訴你這些關(guān)系的實(shí)質(zhì)。
            (這段不太好理解,有一些術(shù)語(yǔ)可能要過(guò)一段時(shí)間才會(huì)有合適的中文翻譯——譯者)

                  面向?qū)ο蟮木幊谭椒∣OP是九十年代才流行的一種軟件編程方法。它強(qiáng)調(diào)對(duì)象的“抽象”、“封裝”、“繼承”、“多態(tài)”。我們講程序設(shè)計(jì)是由“數(shù)據(jù)結(jié)構(gòu)”+“算法”組成的。從宏觀的角度講,OOP下的對(duì)象是以編程為中心的,是面向程序的對(duì)象。我們今天要講的OOD是面向信息的對(duì)象,是以用戶(hù)信息為中心的。

            二、OOP技術(shù)的歷史

              面向?qū)ο蠹夹g(shù)最初是從面向?qū)ο蟮某绦蛟O(shè)計(jì)開(kāi)始的,它的出現(xiàn)以60年代simula語(yǔ)言為標(biāo)志。80年代中后期,面向?qū)ο蟪绦蛟O(shè)計(jì)逐漸成熟,被計(jì)算機(jī)界理解和接受,人們又開(kāi)始進(jìn)一步考慮面向?qū)ο蟮拈_(kāi)發(fā)問(wèn)題。這就是九十年代以Microsoft Visual系列OOP軟件的流行的背景。

              傳統(tǒng)的結(jié)構(gòu)化分析與設(shè)計(jì)開(kāi)發(fā)方法是一個(gè)線性過(guò)程,因此,傳統(tǒng)的結(jié)構(gòu)化分析與設(shè)計(jì)方法要求現(xiàn)實(shí)系統(tǒng)的業(yè)務(wù)管理規(guī)范,處理數(shù)據(jù)齊全,用戶(hù)能全面完整地其業(yè)務(wù)需求

              傳統(tǒng)的軟件結(jié)構(gòu)和設(shè)計(jì)方法難以適應(yīng)軟件生產(chǎn)自動(dòng)化的要求,因?yàn)樗赃^(guò)程為中心進(jìn)行功能組合,軟件的擴(kuò)充和復(fù)用能力很差。

              對(duì)象是對(duì)現(xiàn)實(shí)世界實(shí)體的模擬,因面能更容易地理解需求,即使用戶(hù)和分析者之間具有不同的教育背景和工作特點(diǎn),也可很好地溝通。

              區(qū)別面向?qū)ο蟮拈_(kāi)發(fā)和傳統(tǒng)過(guò)程的開(kāi)發(fā)的要素有:對(duì)象識(shí)別和抽象、封裝、多態(tài)性和繼承。

              對(duì)象(Object)是一個(gè)現(xiàn)實(shí)實(shí)體的抽象,由現(xiàn)實(shí)實(shí)體的過(guò)程或信息牲來(lái)定義。一個(gè)對(duì)象可被認(rèn)為是一個(gè)把數(shù)據(jù)(屬性)和程序(方法)封裝在一起的實(shí)體,這個(gè)程序產(chǎn)生該對(duì)象的動(dòng)作或?qū)λ邮艿降耐饨缧盘?hào)的反應(yīng)。這些對(duì)象操作有時(shí)稱(chēng)為方法。對(duì)象是個(gè)動(dòng)態(tài)的概念,其中的屬性反映了對(duì)象當(dāng)前的狀態(tài)。

              類(lèi)(Class)用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類(lèi)的實(shí)例。

              由上分析不難看出,盡管OOP技術(shù)更看中用戶(hù)的對(duì)象模型,但其目的都是以編程為目的的,而不是以用戶(hù)的信息為中心的,總想把用戶(hù)的信息納入到某個(gè)用戶(hù)不感興趣的“程序?qū)ο?#8221;中。

            三、OOP 的優(yōu)缺點(diǎn)

                  · OOP 的優(yōu)點(diǎn):使人們的編程與實(shí)際的世界更加接近,所有的對(duì)象被賦予屬性和方法,結(jié)果編程就更加富有人性化。

                  · OOP 的也有缺點(diǎn),就 C++ 而言,由于面向更高的邏輯抽象層,使得 C++ 在實(shí)現(xiàn)的時(shí)候,不得不做出性能上面的犧牲,有時(shí)候甚至是致命的 ( 所有對(duì)象的屬性都經(jīng)過(guò)內(nèi)置多重指針的間接引用是其性能損失的主要原因之一;不過(guò),筆者的局限性在于未使用過(guò) VC++ 外的面向?qū)ο笳Z(yǔ)言,所以不是十分肯定,哈哈,有人笑出來(lái)了… )。

                  在計(jì)算機(jī)速度飛速發(fā)展的今天,你可能會(huì)說(shuō),一丁點(diǎn)的性能犧牲沒(méi)什么大不了。是的,從面向?qū)ο蟮慕嵌龋沟木幊痰慕Y(jié)構(gòu)更加清晰完整,數(shù)據(jù)更加獨(dú)立和易于管理,性能的犧牲可以帶來(lái)這么多的好處,沒(méi)有理由不做穩(wěn)賺的生意吧?

                  不過(guò),在某些對(duì)速度要求極高特殊場(chǎng)合,例如你做的是電信的交換系統(tǒng),每秒鐘有超過(guò)百萬(wàn)的人同時(shí)進(jìn)行電話(huà)交換,如果,每一個(gè)數(shù)據(jù)交換過(guò)程都是一個(gè)對(duì)象,那么總的性能損失將是天文數(shù)字!!

                  或者這個(gè)例子不夠貼身,再舉個(gè)例子吧。假如你受聘于一個(gè)游戲設(shè)計(jì)公司,老板希望做出來(lái)的游戲可以更多的兼顧到更多的電腦使用者,游戲每秒鐘的運(yùn)行的幀可以更多,子彈和爆炸物可以更多、更華麗。那么,你會(huì)發(fā)現(xiàn)使用 C++ 會(huì)使你的程序變得笨拙,無(wú)法滿(mǎn)足你的需求,除非你非得要你的游戲運(yùn)行于奔騰四的機(jī)器上 ( 如果不是,而你又堅(jiān)持用 C++ 的對(duì)象編程,那么請(qǐng)減少主角的槍的威力吧 )。

                  如果你是冥頑不寧的人,你說(shuō)不相信 OOP 會(huì)有性能上的損失,那么,我記得曾看到在 CSDN 上關(guān)于 VB 和 VC 執(zhí)行效率的討論的文章,講述的就是使用了 MFC 以后,執(zhí)行效率甚至低于 VB 開(kāi)發(fā)出來(lái)的東西。請(qǐng)各位驗(yàn)證一下:如果使用的是純粹的 C 語(yǔ)言語(yǔ)法的話(huà),那么一定會(huì)比在 VB 編出來(lái)的東西要快很多 ( GetTickCount 函數(shù)可以查閱 MSDN ,如果想更加精確一些,可以使用 QueryPerformanceCounter 函數(shù) )。

            四、OOP的未來(lái)(撰文/Bjarne Stroustrup & Tim Lindholm   編譯/孟巖)

            在未來(lái)三年,程序員編寫(xiě)代碼的方式會(huì)發(fā)生那些變化?

            Stroustrup: 在C++中,假如沒(méi)有合適的庫(kù)在背后支撐,完成任何重要的工作都可能是很復(fù)雜的。而一旦有了合適的庫(kù),任何東西都可以被我們操控于股掌之間。因此,構(gòu)造和使用程序庫(kù)的重要性與日俱增。這也暗示我們,泛型程序設(shè)計(jì)(generic programming)將會(huì)越來(lái)越多地被運(yùn)用。只有通過(guò)GP,我們才能確保庫(kù)的通用性和高效率。我還預(yù)期在分布式計(jì)算和“組件(components)”應(yīng)用領(lǐng)域會(huì)出現(xiàn)喜人的增長(zhǎng)。就大部分程序員而言,通過(guò)使用方便適用的程序庫(kù),這些開(kāi)發(fā)工作會(huì)變得簡(jiǎn)單明了。

            現(xiàn)在有一個(gè)趨勢(shì),編譯器廠商試圖把其特有的“對(duì)象模型”和圖形界面(GUI)細(xì)節(jié)推銷(xiāo)給用戶(hù)。比如微軟的COM和Inprise的類(lèi)屬性“properties”。對(duì)于用戶(hù)來(lái)說(shuō),這既不必要,也不情愿。我所希望看到的程序庫(kù),應(yīng)該是用標(biāo)準(zhǔn)C++打造,界面靈活,值得信賴(lài)的程序庫(kù)。通常,這些界面應(yīng)該是平臺(tái)無(wú)關(guān)的。C++的表達(dá)能力極強(qiáng),即使不使用大量的宏,也應(yīng)該足以達(dá)成這一要求。就算有些地方無(wú)法百分之百的遵守這一原則,也應(yīng)該將對(duì)于平臺(tái)和廠家的依賴(lài)性限制起來(lái)。這個(gè)目標(biāo)的完成情況,可以反映軟件工具產(chǎn)業(yè)對(duì)于應(yīng)用程序開(kāi)發(fā)行業(yè)的關(guān)注程度。我懷疑目前對(duì)于那些獨(dú)立的、跨平臺(tái)廠商來(lái)說(shuō),并不存在相應(yīng)的市場(chǎng)。如果能夠建立這樣的市場(chǎng),也許能夠促進(jìn)廠商們?yōu)榭蛻?hù)做出“真正有用的”產(chǎn)品。

            Lindholm: 對(duì)于編寫(xiě)代碼的開(kāi)發(fā)者來(lái)說(shuō),主要的驅(qū)動(dòng)力量仍將是兩個(gè):網(wǎng)絡(luò)和分布式——也就是設(shè)計(jì)和開(kāi)發(fā)非單機(jī)軟件的需求。大部分的應(yīng)用程序?qū)⒉粫?huì)是孤零零地運(yùn)行在單一設(shè)備上,而是運(yùn)用了類(lèi)似EJB和JSP之類(lèi)技術(shù)的,平臺(tái)無(wú)關(guān)的分布式程序。程序員們將不得不面對(duì)分布式計(jì)算的重重險(xiǎn)阻。這將對(duì)許多程序員所依賴(lài)的設(shè)計(jì)模式、技術(shù)和直覺(jué)構(gòu)成嚴(yán)峻的挑戰(zhàn)。這是選擇編程語(yǔ)言之前必須認(rèn)識(shí)到的,盡管不同語(yǔ)言的設(shè)計(jì)特性可能促進(jìn)或者阻礙這一轉(zhuǎn)化。

            在網(wǎng)絡(luò)應(yīng)用的增長(zhǎng)中,一個(gè)很重要的部分是小型移動(dòng)設(shè)備和特殊Internet設(shè)備的爆炸性增長(zhǎng)。這些設(shè)備各有各的操作系統(tǒng),或者只在某種特定的設(shè)備領(lǐng)域內(nèi)有共同的操作系統(tǒng)。我們現(xiàn)在還可以一一列舉出這些設(shè)備——家庭接入設(shè)備、蜂窩電話(huà)、電子報(bào)紙、PDA、自動(dòng)網(wǎng)絡(luò)設(shè)備等等。但是這些設(shè)備領(lǐng)域的數(shù)量和深入程度將會(huì)很快變得難以估量。我們都知道這個(gè)市場(chǎng)大得驚人,PC的興起與之相比不過(guò)小菜一碟。因此在這些設(shè)備的應(yīng)用程序市場(chǎng)上,競(jìng)爭(zhēng)將會(huì)相當(dāng)殘酷。獲勝的重要手段之一,就是盡快進(jìn)入市場(chǎng)。開(kāi)發(fā)人員需要優(yōu)秀的工具,迅速高效地撰寫(xiě)和調(diào)試他們的軟件。平臺(tái)無(wú)關(guān)性也是制勝秘訣之一,它使得程序員能夠開(kāi)發(fā)出支持多種設(shè)備平臺(tái)的軟件。

            我預(yù)期的另一個(gè)變化是,我們對(duì)于代碼(Java)和數(shù)據(jù)(XML)協(xié)同型應(yīng)用程序的開(kāi)發(fā)能力將會(huì)不斷提高。這種協(xié)同是開(kāi)發(fā)強(qiáng)大應(yīng)用程序的核心目標(biāo)之一。我們從XML的迅速流行和ebXML規(guī)范的進(jìn)展中,已經(jīng)看到了這個(gè)趨勢(shì)。ebXML是一個(gè)針對(duì)電子商務(wù)和國(guó)際貿(mào)易的,基于XML的開(kāi)放式基礎(chǔ)構(gòu)架,由聯(lián)合國(guó)貿(mào)易促進(jìn)和電子商務(wù)中心(UN/CEFACT)與結(jié)構(gòu)性信息標(biāo)準(zhǔn)推進(jìn)組織(OASIS)共同開(kāi)發(fā)。

            我們能否期望出現(xiàn)一個(gè)真正的面向組件(component-oriented)的語(yǔ)言?它的創(chuàng)造者會(huì)是誰(shuí)呢?

            Stroustrup: 我懷疑,這個(gè)領(lǐng)域中之所以缺乏成果,正是因?yàn)槿藗儭饕悄切┓浅绦騿T們——對(duì)“組件”這個(gè)意義含糊的字眼寄予了太多的期望。這些人士夢(mèng)想,有朝一日,組件會(huì)以某種方式把程序員趕出歷史舞臺(tái)。以后那些稱(chēng)職的“設(shè)計(jì)員”只需利用預(yù)先調(diào)整好的組件,把鼠標(biāo)拖一拖放一放,就把系統(tǒng)組合出來(lái)。對(duì)于軟件工具廠商來(lái)說(shuō),這種想法還有另一層意義,他們認(rèn)為,到時(shí)候只有他們才保留有必要的技術(shù),有能力編寫(xiě)這樣的組件。

            這種想法有一個(gè)最基本的謬誤:這種組件很難獲得廣泛歡迎。一個(gè)單獨(dú)的組件或框架(framework),如果能夠滿(mǎn)足一個(gè)應(yīng)用程序或者一個(gè)產(chǎn)業(yè)領(lǐng)域?qū)λ岢龅拇蟛糠忠蟮脑?huà),對(duì)于其制造者來(lái)說(shuō)就是劃算的產(chǎn)品,而且技術(shù)上也不是很困難。可是該產(chǎn)業(yè)內(nèi)的幾個(gè)競(jìng)爭(zhēng)者很快就會(huì)發(fā)現(xiàn),如果所有人都采用這些組件,那么彼此之間的產(chǎn)品就會(huì)變得天下大同,沒(méi)什么區(qū)別,他們將淪為簡(jiǎn)單的辦事員,主要利潤(rùn)都將鉆進(jìn)那些組件/框架供應(yīng)商的腰包里!

            小“組件”很有用,不過(guò)產(chǎn)生不了預(yù)期的杠桿效應(yīng)。中型的、更通用的組件非常有用,但是構(gòu)造時(shí)需要非同尋常的彈性。

            在C++中,我們綜合運(yùn)用不同共享形式的類(lèi)體系(class hierarchies),以及使用templates精心打造的接口,在這方面取得了一定的進(jìn)展。我期待在這個(gè)領(lǐng)域取得一些有趣和有用的成果,不過(guò)我認(rèn)為這種成果很可能是一種新的C++程序設(shè)計(jì)風(fēng)格,而不是一種新的語(yǔ)言。

            Lindholm: 編寫(xiě)面向組件的應(yīng)用程序,好像更多的是個(gè)投資、設(shè)計(jì)和程序員管理方面的問(wèn)題,而不是一個(gè)編程語(yǔ)言問(wèn)題。當(dāng)然某些語(yǔ)言在這方面具有先天優(yōu)勢(shì),不過(guò)如果說(shuō)有什么魔術(shù)般的新語(yǔ)言能夠大大簡(jiǎn)化組件的編寫(xiě)難度,那純粹是一種誤導(dǎo)。

            微軟已經(jīng)將全部賭注押在C#上,其他語(yǔ)言何去何從?

            Stroustrup: C++在下一個(gè)十年里仍然將是一種主流語(yǔ)言。面對(duì)新的挑戰(zhàn),它會(huì)奮起應(yīng)對(duì)。一個(gè)創(chuàng)造了那么多出色系統(tǒng)的語(yǔ)言,絕不會(huì)“坐視落花流水春去也”。

            我希望微軟認(rèn)識(shí)到,它在C++(我指的是ISO標(biāo)準(zhǔn)C++)上有著巨大的利益,C++是它與IT世界內(nèi)其他人之間的一座橋梁,是構(gòu)造大型系統(tǒng)和嵌入式系統(tǒng)的有效工具,也是滿(mǎn)足高性能需求的利器。其他語(yǔ)言,似乎更注重那些四平八穩(wěn)的商用程序。

            競(jìng)爭(zhēng)

            C#會(huì)不會(huì)獲得廣泛的接受,并且擠掉其他的語(yǔ)言?

            Lindholm: 通常,一種語(yǔ)言既不會(huì)從別的語(yǔ)言那里獲利,也不會(huì)被擠掉。那些堅(jiān)定的Fortran程序員不還用著Fortran嗎?對(duì)于個(gè)人來(lái)說(shuō),語(yǔ)言的選擇當(dāng)然因時(shí)而異,但就整體而言,語(yǔ)言的種類(lèi)只會(huì)遞增,也就是說(shuō),它們之間的關(guān)系是“有你有我”而不是“有你沒(méi)我”。

            對(duì)于一個(gè)新語(yǔ)言的接受程度,往往取決于其能力所及。Java技術(shù)被迅速接受,原因是多方面的,Internet和World Wide Web接口,在其他技術(shù)面前的挫折感,對(duì)于Java技術(shù)發(fā)展方向的全面影響能力,都是原因。另一個(gè)重要的原因是Java獨(dú)立于廠商,這意味著在兼容產(chǎn)品面前可以從容選擇。

            C#是否會(huì)獲得廣泛接受?視情況而定。總的來(lái)說(shuō),那些對(duì)于平臺(tái)無(wú)關(guān)性和廠商無(wú)關(guān)性漠不關(guān)心的程序員,可能會(huì)喜歡C#。那些跟微軟平臺(tái)捆在一起人當(dāng)然可能想要尋找VB 和VC的一個(gè)出色的替代品。但是對(duì)于程序跨平臺(tái)執(zhí)行能力特別關(guān)注的程序員,將會(huì)堅(jiān)守Java之類(lèi)的語(yǔ)言。這種能力對(duì)于多重訪問(wèn)設(shè)備(multiple access devices)和分布式計(jì)算模型至關(guān)重要,而Java語(yǔ)言提供了一個(gè)標(biāo)準(zhǔn)的、獨(dú)立于廠商運(yùn)行時(shí)環(huán)境。

             

            Stroustrup: C#的流行程度幾乎完全取決于微軟投入的資金多少。看上去C#的興起肯定會(huì)犧牲掉其他一些語(yǔ)言的利益,但是事實(shí)上未必如此。Java的蓬勃發(fā)展并沒(méi)有給C++帶來(lái)衰敗。C++的應(yīng)用仍然在穩(wěn)定增長(zhǎng)(當(dāng)然,已經(jīng)不是爆炸性的增長(zhǎng)了)。也許其他的語(yǔ)言也還能獲得自己的一席之地。

            不過(guò),我實(shí)在看不出有什么必要再發(fā)明一種新的專(zhuān)有語(yǔ)言。特別是微軟,既生VB,何需C#?

             

            不同OOP語(yǔ)言各有什么優(yōu)勢(shì)和劣勢(shì)?

            Stroustrup: C++的優(yōu)點(diǎn)自始至終都是這么幾條:靈活、高效,而且并非專(zhuān)有語(yǔ)言。現(xiàn)在ISO C++標(biāo)準(zhǔn)的出現(xiàn),鞏固了最后一點(diǎn)。

            我認(rèn)為C++的高效是它最基本的優(yōu)點(diǎn)。這種高效來(lái)自于其特有的數(shù)據(jù)和計(jì)算模型,較之Java和C#,這種模型更加貼近機(jī)器。不過(guò),哪些程序才真正地渴望這么高的效率?這是個(gè)問(wèn)題。我認(rèn)為這類(lèi)程序非常多。人們對(duì)于計(jì)算機(jī)的期望,永遠(yuǎn)都超越硬件科技的發(fā)展速度。很顯然,Java和C#的設(shè)計(jì)者的想法不同,他們認(rèn)為,在很多地方效率問(wèn)題無(wú)關(guān)緊要。

            C++主要的缺點(diǎn),歸罪于糟糕的教育(是那些始終認(rèn)為C++是個(gè)純粹面向?qū)ο笳Z(yǔ)言的人,和那些把C++當(dāng)成C語(yǔ)言變體的人導(dǎo)致了這種情況),歸罪于不同平臺(tái)上的不一致性,歸罪于不完整、不標(biāo)準(zhǔn)的編譯器實(shí)現(xiàn),歸罪于平臺(tái)無(wú)關(guān)的系統(tǒng)級(jí)程序庫(kù)的缺少。

            這些問(wèn)題歸于一點(diǎn),就是缺乏一個(gè)卓越的廠商,能夠滿(mǎn)足整個(gè)C++社區(qū)的需求,勇于投入大量的資金開(kāi)發(fā)必要的程序庫(kù)。

             

            Lindholm: Java技術(shù)的成功,是因?yàn)樗诤线m的時(shí)間,出現(xiàn)在合適的地點(diǎn),而且合理地選擇了語(yǔ)言和計(jì)算平臺(tái)的支持目標(biāo)。Java并不是在所有場(chǎng)合都優(yōu)于其他OOP語(yǔ)言,但是對(duì)于出現(xiàn)的新問(wèn)題能夠解決得很出色。它面向Internet計(jì)算環(huán)境,避免了C++中晦澀的結(jié)構(gòu),成功翻越了繼承機(jī)制的惱人問(wèn)題。垃圾收集機(jī)制顯著地提高了生產(chǎn)率,降低了復(fù)雜度。在網(wǎng)絡(luò)背景下使用虛擬機(jī),以及有關(guān)安全性和動(dòng)態(tài)加載的一系列設(shè)計(jì)選擇,迎合了正在出現(xiàn)的需求和愿望。這些特性使Java不僅成為現(xiàn)有程序員的新武器,而且也為新的程序員創(chuàng)造了繁榮的市場(chǎng)空間。

            此外,Java擁有一個(gè)標(biāo)準(zhǔn)化的、二進(jìn)制形式的類(lèi)庫(kù),提供了必要的(當(dāng)然并非充分的)平臺(tái)與廠商無(wú)關(guān)性。平臺(tái)與廠商無(wú)關(guān)性要求一項(xiàng)技術(shù)必須有清晰的規(guī)范,摒棄那些阻礙二進(jìn)制標(biāo)準(zhǔn)實(shí)施的特性。C++雖然有一個(gè)ISO標(biāo)準(zhǔn),但其實(shí)甚至對(duì)于相同系統(tǒng)與相同指令體系的各個(gè)平臺(tái),也提不出一個(gè)實(shí)用的、各版本兼容的二進(jìn)制標(biāo)準(zhǔn)。

            歷史上很多使用虛擬機(jī)的語(yǔ)言飽受責(zé)難,是因?yàn)槠洳粔虺錾男阅軉?wèn)題,而這要?dú)w過(guò)于緩慢的解釋器和糟糕的垃圾收集器。Java的早期實(shí)現(xiàn)也因?yàn)橥瑯拥膯?wèn)題受到嚴(yán)厲的批評(píng)。但是自那時(shí)起,業(yè)界向新的虛擬機(jī)實(shí)現(xiàn)技術(shù)投入了大量資金,取得了顯著的效果,如今在大部分場(chǎng)合,Java的性能跟常規(guī)的靜態(tài)編譯語(yǔ)言相比毫不遜色。這使得程序員在獲得平臺(tái)和廠商無(wú)關(guān)性的同時(shí),也不必付出性能上的代價(jià)。

            C++并沒(méi)有強(qiáng)制使用面向?qū)ο蠓椒?/font>,因此為了編寫(xiě)出色的面向?qū)ο蟠a,就要求程序員們有相當(dāng)強(qiáng)的紀(jì)律性。很多公司就是因?yàn)檫@個(gè)原因放棄了C++。作為語(yǔ)言,Java的一個(gè)突出的優(yōu)點(diǎn)就是強(qiáng)制面向?qū)ο蠓椒ǎ辉试S非面向?qū)ο蟮慕Y(jié)構(gòu)。

            C#介于C++和Java之間,腳踏兩只船,因此既不夠安全,又失之復(fù)雜。

             

            對(duì)于公司來(lái)說(shuō),采用新的語(yǔ)言要付出巨大代價(jià)。雇不到好的程序員(沒(méi)人熟悉這種新語(yǔ)言),培訓(xùn)費(fèi)用高得驚人,學(xué)習(xí)過(guò)程中生產(chǎn)率和產(chǎn)品質(zhì)量下降,多年的經(jīng)驗(yàn)隨風(fēng)消逝,等等。一種語(yǔ)言如何克服這些障礙?

            Lindholm: 說(shuō)得很對(duì),采用新東西確實(shí)常常開(kāi)銷(xiāo)巨大。不過(guò)問(wèn)題是:這個(gè)新東西是否能夠節(jié)省更多的開(kāi)支,或者提供巨大的改進(jìn),獲取合理的回報(bào)?很多公司發(fā)現(xiàn),轉(zhuǎn)向Java技術(shù)不論在開(kāi)發(fā)的后端(盡快進(jìn)入市場(chǎng)、快速迭代開(kāi)發(fā)、維護(hù)簡(jiǎn)單性)還是前端(跨平臺(tái)發(fā)布,適用范圍從低端設(shè)備到高端服務(wù)器的技術(shù),安全性),都能節(jié)省大筆的開(kāi)銷(xiāo)。

            對(duì)于新事物的接納,常常是在痛楚的壓力之下。很大程度上,這正是Java所經(jīng)歷的。Java的產(chǎn)生,是對(duì)當(dāng)時(shí)很多系統(tǒng)的缺陷所做出的反應(yīng)。Java技術(shù)通過(guò)下面的手段減輕了開(kāi)發(fā)者的痛楚:1) 顧及了網(wǎng)絡(luò)計(jì)算方面的需求,是應(yīng)運(yùn)而生。2) 在技術(shù)能力的抉擇上,保持良好的品位,顧及了大眾的心理。3) 采用適度強(qiáng)制性策略推行設(shè)計(jì)決定。此外,Java技術(shù)已經(jīng)成為大學(xué)教學(xué)中的主流,這同樣保證了Java開(kāi)發(fā)者隊(duì)伍的不斷壯大。

            但是最重要的一點(diǎn)是,再?zèng)]有另一種程序設(shè)計(jì)技術(shù),能夠像Java那樣允許程序員開(kāi)發(fā)基于Internet的不同平臺(tái)之上的應(yīng)用程序。Java平臺(tái)在這方面的杰出表現(xiàn),已經(jīng)被大量的實(shí)例證明。Java已經(jīng)成為Internet上的缺省應(yīng)用程序平臺(tái),Java APIs也成為Internet應(yīng)用程序開(kāi)發(fā)的天然平臺(tái)。

             

            Stroustrup: 微軟和Sun把大筆的金錢(qián)扔在Java、VB和C#中,并不是因?yàn)樗夹陌l(fā)現(xiàn),也不是因?yàn)樗麄冋娴南嘈胚@些語(yǔ)言能夠帶給程序員更美好的生活,而是利益使然。

            有一個(gè)說(shuō)法,認(rèn)為軟件工具廠商如果能夠把應(yīng)用程序開(kāi)發(fā)者的專(zhuān)業(yè)技術(shù)任務(wù)負(fù)擔(dān)起來(lái),將獲取巨大的經(jīng)濟(jì)利益。我對(duì)其背后的經(jīng)濟(jì)分析頗為懷疑,我認(rèn)為這很難成為現(xiàn)實(shí),特別是當(dāng)應(yīng)用程序開(kāi)發(fā)者使用開(kāi)放的、標(biāo)準(zhǔn)化的工具時(shí),他們可以有多種選擇,從而使上面的想法更加不可能。

             

            多年以前,C++就已經(jīng)具有泛型能力(也就是templates和STL),有運(yùn)算符重載,有枚舉類(lèi)型?我們會(huì)不會(huì)在Java的未來(lái)版本中看到這些特性?Java是不是應(yīng)該納入這些特性呢?

            Strousturp:從1988-89年起,C++就已經(jīng)有了templates。但是我們花了不少時(shí)間來(lái)了解如何最好地運(yùn)用這個(gè)工具,早期各廠家對(duì)于template的支持在品質(zhì)上也有很大的差異。有些編譯器廠商動(dòng)作遲緩,至少有一個(gè)主要的編譯器廠商(好像是指微軟,微軟在Visual C++4.0才開(kāi)始支持template,在此之前一直聲稱(chēng)template是過(guò)于復(fù)雜而又沒(méi)什么用的技術(shù),時(shí)至今日,Visual C++對(duì)于template的支持在主流編譯器中都屬于最差的一檔——譯者注)暗中鼓勵(lì)聲名狼藉的反template宣傳,直到他們自己終于學(xué)會(huì)了這項(xiàng)技術(shù)為止。直到今天,對(duì)于template的支持在品質(zhì)上仍然有待改進(jìn)。

            你上面提到的那些特性,我認(rèn)為Java(還有C#)應(yīng)該,也肯定會(huì)逐漸引入。那些對(duì)于程序員來(lái)說(shuō)最有用的語(yǔ)言特性和概念,將會(huì)逐漸集中,成為各家主流語(yǔ)言的必然之選。也就是說(shuō),我認(rèn)為類(lèi)似析構(gòu)函數(shù)和模板特殊化之類(lèi)的機(jī)制,遠(yuǎn)遠(yuǎn)比枚舉等機(jī)制重要得多。

             

            Lindholm:Java技術(shù)成功的原因之一,就是很清楚哪些不該做。我們得多問(wèn)幾個(gè)為什么:這項(xiàng)特性是不是必不可少?增加它會(huì)帶來(lái)哪些開(kāi)銷(xiāo)?運(yùn)算符重載是C++中一項(xiàng)極其強(qiáng)大的特性,但是它也大大增加了C++語(yǔ)言的復(fù)雜度,很多人都難以招架。Java在各種可能的權(quán)衡之中,做出了明智的抉擇,找到了能力與需求之間的完美平衡點(diǎn)。

            當(dāng)然,Java也會(huì)發(fā)展,而且最重要的是,現(xiàn)在是開(kāi)發(fā)者們?cè)谕苿?dòng)發(fā)展。Java增加泛型能力這件事,很好地展示了Java是如何通過(guò)整個(gè)開(kāi)發(fā)者社群的參與,在權(quán)衡中決定正確的平衡點(diǎn)。關(guān)于增加泛型類(lèi)型(generic types)的“Java規(guī)格申請(qǐng)”(Java Specification Request, JSR)已經(jīng)進(jìn)入JCPJava Community Process)程序,而且已經(jīng)開(kāi)發(fā)了很長(zhǎng)一段時(shí)間(參見(jiàn) http://java.sun.com/aboutJava/communityprocess/之JSR-014)。現(xiàn)在,在JCP中,有超過(guò)80個(gè)JSRs正在討論中,這充分體現(xiàn)了整個(gè)體系對(duì)開(kāi)發(fā)者的積極反饋和高度合作,這正是驅(qū)動(dòng)Java平臺(tái)不斷進(jìn)化的動(dòng)力。

             

            發(fā)展 vs. 革新(Evolution vs. Revolution)

            C++是一種發(fā)展型的語(yǔ)言,Java和C#似乎更像是革新型語(yǔ)言(它們是從頭設(shè)計(jì)的)?什么時(shí)候,革新型的語(yǔ)言才是必需的呢?

            Lindholm: Java技術(shù)并非憑空出世,反而更像是發(fā)展型的。Java所有的特性,在Java平臺(tái)推出之前,都至少已經(jīng)存在于另一種環(huán)境之中。Java的貢獻(xiàn)在于,在眾多的特性和權(quán)衡中,做出了合理的選擇,使得產(chǎn)品既實(shí)用,又優(yōu)雅。Java技術(shù)對(duì)于程序員的態(tài)度是:撫養(yǎng),但不溺愛(ài)。

             

            Stroustrup:從技術(shù)上講,我并不認(rèn)為Java和C#是什么“從頭設(shè)計(jì)的”革新型語(yǔ)言。倘若Java是從技術(shù)原則出發(fā),從頭設(shè)計(jì),大概就不會(huì)模仿C/C++那種丑陋和病態(tài)的語(yǔ)法了(不必驚訝,Stroustrup在很多場(chǎng)合表示過(guò),C++采用C的語(yǔ)法形式,實(shí)在是迫于兼容性。他本人更偏愛(ài)Simula的語(yǔ)法——譯者)。

            我認(rèn)為,只有當(dāng)程序員們面對(duì)的問(wèn)題發(fā)生了根本的變化的時(shí)候,或者當(dāng)我們發(fā)現(xiàn)了全新的、極其優(yōu)越的程序設(shè)計(jì)技術(shù),又完全不能為現(xiàn)存語(yǔ)言所支持的時(shí)候,我們才需要全新的語(yǔ)言。問(wèn)題是,我們恐怕永遠(yuǎn)也碰不到那些“根本”、“全新”的情況。

            我以為,自從OOP問(wèn)世以來(lái),可稱(chēng)為“根本”的新型程序設(shè)計(jì)技術(shù),唯有泛型程序設(shè)計(jì)(generic programming)和生成式程序設(shè)計(jì)(generative programming)技術(shù),這兩項(xiàng)技術(shù)主要是源于C++ templates技術(shù)的運(yùn)用,也有一部分曾經(jīng)被視為面向?qū)ο蠛秃瘮?shù)式語(yǔ)言(functional languages)的次要成分,現(xiàn)在都變成正式、可用和可承受的技術(shù)了。我對(duì)于目前C++模板(template)程序設(shè)計(jì)的成果非常興奮。例如,像POOMA, Blitz++和MTL等程序庫(kù),在很多地方改變了數(shù)值計(jì)算的方式。

             

            Java和C#的一個(gè)“賣(mài)點(diǎn)”,就是它們的簡(jiǎn)單性。現(xiàn)在Java是不是快失去這個(gè)賣(mài)點(diǎn)了?

            Stroustrup:新語(yǔ)言總是宣稱(chēng)自己如何如何簡(jiǎn)單,對(duì)老語(yǔ)言的復(fù)雜性頗多非議。其實(shí)這種所謂的“簡(jiǎn)單性”,簡(jiǎn)單地說(shuō),就是不成熟性。語(yǔ)言的復(fù)雜性,是在解決現(xiàn)實(shí)世界中極為煩瑣和特殊的復(fù)雜問(wèn)題的過(guò)程中逐漸增加的。一個(gè)語(yǔ)言只要活的時(shí)間夠長(zhǎng),總會(huì)有某些地方逐漸復(fù)雜起來(lái),或者是語(yǔ)言本身,或者是程序庫(kù)和工具。C++和Java顯然都不例外,我看C#也一樣。如果一種語(yǔ)言能夠度過(guò)自己的幼年時(shí)代,它會(huì)發(fā)現(xiàn),自己無(wú)論是體積還是復(fù)雜性都大大增加了。

             

            Lindholm:Java技術(shù)的的功能在增加,需要學(xué)習(xí)的東西也在增加。不過(guò)功能的增加并不一定帶來(lái)復(fù)雜性的增加。Java技術(shù)的發(fā)展,并沒(méi)有使學(xué)習(xí)曲線更加陡峭,只是讓它繼續(xù)向右方延展了。

             

            標(biāo)準(zhǔn)

            標(biāo)準(zhǔn)化語(yǔ)言和開(kāi)放型語(yǔ)言各自的優(yōu)點(diǎn)和缺點(diǎn)何在?

            Lindholm:對(duì)于一個(gè)開(kāi)放、不允許專(zhuān)有擴(kuò)展、具有權(quán)威的強(qiáng)制性標(biāo)準(zhǔn)語(yǔ)言或者運(yùn)行環(huán)境來(lái)說(shuō),不存在什么缺點(diǎn)。允許專(zhuān)有擴(kuò)展就意味著允許廠商下套子綁架客戶(hù)。特別重要的是,必須讓整個(gè)平臺(tái),而不只是其中一部分完全標(biāo)準(zhǔn)化,才能杜絕廠商們利用高層次的專(zhuān)有API下套子。客戶(hù)要求有選擇廠商的自由,他們既要有創(chuàng)造性,又需要兼容性。

             

            Stroustrup:對(duì)于一個(gè)語(yǔ)言,如C/C++來(lái)說(shuō),建立正式標(biāo)準(zhǔn)(如ISO標(biāo)準(zhǔn))最大的好處,在于可以防止某一個(gè)廠商操縱這種語(yǔ)言,把它當(dāng)成自己的搖錢(qián)樹(shù)。多個(gè)廠商的競(jìng)爭(zhēng)給用戶(hù)帶來(lái)的是較低的價(jià)位和較好的穩(wěn)定性。

            專(zhuān)有語(yǔ)言的好處,一是流行,二是便宜(不過(guò)等你被套牢了之后,情況就會(huì)起變化),三是對(duì)于商業(yè)性需求可以做出快速的反應(yīng)。

            標(biāo)準(zhǔn)化語(yǔ)言的特點(diǎn)之一是,它不能忽略特殊用戶(hù)的需求。比如我在AT&T中所考慮的東西,其規(guī)模、可靠性和效率要求,跟那些普通廠商關(guān)注的大眾軟件相比,根本不可同日而語(yǔ)。那些公司很自然只關(guān)注主要的需求。

            然而,多數(shù)大機(jī)構(gòu)和身處前沿的公司,都有著特殊的需求。C++的設(shè)計(jì)是開(kāi)放、靈活和高效的,能夠滿(mǎn)足我所能想象的任何需求。跟其他的現(xiàn)代語(yǔ)言相比,C++的家長(zhǎng)式作風(fēng)可謂少之又少,原因就在這。當(dāng)然,不能贊賞這一點(diǎn)的人會(huì)詬病C++的“危險(xiǎn)”。

            擁有正式和開(kāi)放標(biāo)準(zhǔn)的語(yǔ)言主要是為編程工具的使用者和客戶(hù)服務(wù)的,而擁有專(zhuān)屬“標(biāo)準(zhǔn)”的語(yǔ)言,主要是為廠商服務(wù)的。

            posted @ 2007-04-06 17:08 學(xué)習(xí)才能進(jìn)步 閱讀(225) | 評(píng)論 (0)編輯 收藏

            真實(shí)的C++之父

            ——Bjarne Stroustrup訪談錄

            趙玉勇

            Bjarne Stroustrup簡(jiǎn)介

             

             

            許多重要人物之所以成名,或者是因?yàn)槠涓淖兞藲v史或者是因?yàn)槠鋭?chuàng)造了歷史,Bjarne Stroustrup先生,C++之父,屬于后者;歸結(jié)個(gè)人成功的原因,理由可能有許多,但他只有淺顯的兩個(gè)一點(diǎn)點(diǎn):他比多數(shù)人天真和理想主義那么一點(diǎn)點(diǎn);比多數(shù)人花在解決問(wèn)題上的時(shí)間多一點(diǎn)點(diǎn)。

            C++程序設(shè)計(jì)語(yǔ)言是一種承前啟后,被數(shù)以百萬(wàn)計(jì)的程序員應(yīng)用在各個(gè)領(lǐng)域中的語(yǔ)言,我們正在使用的Windows操作系統(tǒng),我們上網(wǎng)用的瀏覽器IE無(wú)不是出自C++的手筆。

            C++是一種重要的和比較流行的計(jì)算機(jī)語(yǔ)言之一,也是未來(lái)十年內(nèi)仍然發(fā)揮重要作用的語(yǔ)言。C++語(yǔ)言是一種通用的應(yīng)用廣范的程序設(shè)計(jì)語(yǔ)言,是一種既支持傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì),又支持面向?qū)ο蟪绦蛟O(shè)計(jì)的系統(tǒng)復(fù)雜的語(yǔ)言。C++對(duì)C語(yǔ)言的擴(kuò)充首先由 Stroustrup先生于1980年在貝爾實(shí)驗(yàn)室提出的,于1983年改名為C++。盡管C++的祖先C語(yǔ)言是世界上最受喜愛(ài)和應(yīng)用最廣的專(zhuān)業(yè)程序設(shè)計(jì)語(yǔ)言之一,但C++的發(fā)明是必需的。C++的本質(zhì)就是讓程序員理解和管理更大更復(fù)雜的程序。而對(duì)這種語(yǔ)言有著最大貢獻(xiàn)的C++之父又是怎樣一個(gè)人呢?

            Bjarne Stroustrup先生,1950年生于丹麥港口城市奧爾胡斯,1975年在奧爾胡斯大學(xué)畢業(yè),1979年獲得劍橋大學(xué)計(jì)算機(jī)科學(xué)博士學(xué)位。他是C++語(yǔ)言的設(shè)計(jì)者和實(shí)現(xiàn)者,現(xiàn)在是得克薩斯州A&M大學(xué)計(jì)算機(jī)系教授。1979年他來(lái)到美國(guó)的新澤西州并加入貝爾實(shí)驗(yàn)室,與C語(yǔ)言之父、1983年圖靈獎(jiǎng)得主Dennis Ritchie以及大名鼎鼎的Brian Kernighan(兩人合著《C程序設(shè)計(jì)語(yǔ)言》)共事多年,期間參與了貝爾實(shí)驗(yàn)室的C語(yǔ)言標(biāo)準(zhǔn)化活動(dòng)。他的研究興趣十分廣泛,包括分布式系統(tǒng)、操作系統(tǒng)、仿真、設(shè)計(jì)以及編程,Bjarne還積極推動(dòng)C++ANSI/ISO標(biāo)準(zhǔn)化。

            20世紀(jì)90年代以后,Bjarne Stroustrup步入人生的最輝煌時(shí)期。

            1990年,Bjarne榮獲《財(cái)富》雜志評(píng)選的“美國(guó)12位最年輕的科學(xué)家”稱(chēng)號(hào)。

            1993年,由于在C++領(lǐng)域的重大貢獻(xiàn),Bjarne獲得了ACM該年度的 Grace Murray Hopper大獎(jiǎng)并成為ACM院士(成立于1947年的ACM協(xié)會(huì)是歷史最悠久、目前世界上最大的教育和科學(xué)計(jì)算協(xié)會(huì),成為ACM院士是個(gè)人成就的里程碑)。

            1995年,BYTE雜志頒予他“近20年來(lái)計(jì)算機(jī)工業(yè)最具影響力的20人”的稱(chēng)號(hào)。

            除了他的專(zhuān)業(yè)研究領(lǐng)域外,他對(duì)歷史,通俗文學(xué),攝影,運(yùn)動(dòng),旅行和音樂(lè)等有廣泛的興趣。他對(duì)C++語(yǔ)言的推廣也做出了極大的貢獻(xiàn),他寫(xiě)的書(shū)“The C++ Programming LanguageC++程序設(shè)計(jì)語(yǔ)言》”已經(jīng)成為這種語(yǔ)言中最為流行的學(xué)習(xí)資料,至少被翻譯成18種語(yǔ)言。

             

            給中國(guó)程序員最美好的祝愿

            2004128日,杭州,C++之父Bjarne Struostrup先生再次來(lái)到中國(guó)。我們有幸采訪到了這位大師!請(qǐng)看大師給中國(guó)程序員的最美好祝愿。

            問(wèn): 您對(duì)中國(guó)和中國(guó)的程序員有什么認(rèn)識(shí)?您想對(duì)他們說(shuō)點(diǎn)什么嗎?

            Bjarne Stroustrup中國(guó)是個(gè)大國(guó),并且她有許許多多有趣的文化。我想和中國(guó)程序員說(shuō)的和對(duì)其他國(guó)家的程序員說(shuō)的是一樣的,所以我有如下的回答:優(yōu)秀軟件所具有的特點(diǎn)和技術(shù)在全世界都是通用的。

             

            C++之父給中國(guó)程序員最美好的祝愿

             

            現(xiàn)在,成為一名電腦高手是許多年輕學(xué)生的夢(mèng)想,面對(duì)Stroustrup這樣一位大師級(jí)人物的出現(xiàn),最令我們感興趣的問(wèn)題莫過(guò)于:Bjarne成為大師的歷程是什么樣子的呢?

            Bjarne Stroustrup先生出生的奧爾胡斯市是日德蘭半島東海岸的一個(gè)美麗的小城,那里每家都有自己的小公寓,公寓里有個(gè)小院,小院是孩子們踢足球的地方,那時(shí),成為一名足球明星比成為一名電腦高手是更可行的想法,做一名電腦名星好象是很遙遠(yuǎn)的事情,因?yàn)閭€(gè)人不太可能擁有一臺(tái)昂貴的計(jì)算機(jī)。很幸運(yùn),在大學(xué)時(shí)他就用上了系里的計(jì)算機(jī),它叫GIER,是一臺(tái)舊的丹麥計(jì)算機(jī),有一個(gè)房間那么大,程序都寫(xiě)在磁帶上面,他用它學(xué)習(xí)Algol 60程序設(shè)計(jì)。

            而對(duì)Bjarne生活產(chǎn)生質(zhì)的變化的事情是什么呢?

            他認(rèn)為在他的發(fā)展生涯中,最關(guān)鍵的一個(gè)項(xiàng)目是在劍橋大學(xué)攻讀博士學(xué)位時(shí)用Simula67計(jì)算機(jī)做的模擬分布式系統(tǒng)。做這個(gè)項(xiàng)目除了使他成為一名頂尖的程序設(shè)計(jì)高手外,更使他養(yǎng)成了程序員應(yīng)具有的溝通和交流能力,這為他后來(lái)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。

             

             

            BC

            BjarneC有緣。

            Bjarne Stroustrup先生和CChina中國(guó))有緣,對(duì)他來(lái)說(shuō)中國(guó)是一個(gè)神秘、美麗而有趣的國(guó)度。

            Bjarne兩度親密接觸中國(guó),第一次是2002年,曾在中國(guó)的幾所大學(xué)講學(xué),而第二次是在浙江大學(xué)參加ICESS國(guó)際會(huì)議ICESS 2004, http://www.cs.zju.edu.cn/icess2004/Bjarne Stroustrup先生兩年前在中國(guó)有過(guò)長(zhǎng)時(shí)間的旅程,而在杭城的日子恰逢陰雨,這次到來(lái)對(duì)晴天的期望是強(qiáng)烈的,何況有杭州西湖美景。作為丹麥人,也就是賣(mài)火柴的小女孩誕生的地方,也就是安徒生童話(huà)誕生的國(guó)度,和中國(guó)有著很深的淵源,安徒生童話(huà)里恰巧里面有一篇《夜鶯》,那里寫(xiě)到了中國(guó),而Bjarne Stroustrup先生對(duì)于C(中國(guó))的認(rèn)識(shí)又是什么呢?

            他的回答很微妙,他自然知道安徒生童話(huà),他也很喜歡它們,《夜鶯》中描繪的中國(guó)純是虛構(gòu),與當(dāng)時(shí)的中國(guó)可能有也可能沒(méi)有任何關(guān)系,安徒生創(chuàng)造了那個(gè)“中國(guó)”來(lái)泛指多個(gè)國(guó)家及其統(tǒng)治者。而作為一個(gè)教育者,他對(duì)中國(guó)的教育老祖師孔老夫子也有自己獨(dú)到的見(jiàn)解。

            作為第二個(gè)C,自然就是C++了。勿庸置疑,C++對(duì)于IT的分量,和對(duì)于Bjarne個(gè)人的影響,都是巨大的。還有一個(gè)C,就是計(jì)算機(jī),且看下面他如何描述自己與計(jì)算機(jī)的聯(lián)系。

            問(wèn): 您的生活是怎樣和計(jì)算機(jī)聯(lián)系在一起的?

            Bjarne Stroustrup我也不曉得自己到底是怎樣和計(jì)算機(jī)聯(lián)系在一起的。當(dāng)我上高中時(shí),不知什么原因總覺(jué)得計(jì)算機(jī)科學(xué)是數(shù)學(xué)的某種實(shí)用形式。而事實(shí)不完全是這樣,或者至少?gòu)能浖陌l(fā)展上看并不是如此,但正是這種誤解使得我在還不知計(jì)算機(jī)為何物時(shí)選擇了 “計(jì)算機(jī)科學(xué)數(shù)學(xué)” ,作為我學(xué)習(xí)的專(zhuān)業(yè),并獲得了我的碩士學(xué)位。我寫(xiě)完第一個(gè)程序后,就著了迷,曾沒(méi)有回過(guò)頭。正象大家所看到的,很幸運(yùn),我找到了一個(gè)使自己的才能可以很好地發(fā)揮的位子。

            問(wèn):您怎樣教育自己的孩子和學(xué)生們?

            Bjarne Stroustrup多數(shù)情況下,我是通過(guò)實(shí)例來(lái)進(jìn)行教學(xué)的。我認(rèn)為多數(shù)人過(guò)高的估計(jì)了言語(yǔ)的影響力,而過(guò)低的估計(jì)了這種影響力是怎樣達(dá)到的過(guò)程。我盡量通過(guò)把理論和實(shí)踐相結(jié)合起來(lái)以更好地達(dá)到目的,這樣可以比僅用理論或僅用實(shí)踐示例來(lái)教育更能取得事半功倍的成效。我盡量舉出實(shí)例,從這些活生生的實(shí)例中引導(dǎo)歸納出一般的規(guī)則和概念。

             

            C++是怎樣煉成的,是什么促成了C++語(yǔ)言?這象迷一樣繞在我們的心頭;那什么又是計(jì)算機(jī)語(yǔ)言呢?后者弄懂了,前者看起來(lái)也許就更簡(jiǎn)單了!且看大師的回答:

            問(wèn): 您覺(jué)得計(jì)算機(jī)語(yǔ)言和我們?nèi)祟?lèi)的語(yǔ)言有什么不同呢?

            Bjarne Stroustrup計(jì)算機(jī)語(yǔ)言要比人類(lèi)語(yǔ)言簡(jiǎn)單的多,并且精確的多,那也是它應(yīng)該具有的方式。我不贊成用自然語(yǔ)言去指令電腦的想法。一種程序語(yǔ)言是專(zhuān)家們的工具,并且和普通人相比,是對(duì)所有的專(zhuān)家來(lái)說(shuō)用更加專(zhuān)業(yè)、定義的更加精確的符號(hào)和術(shù)語(yǔ)來(lái)表達(dá)的工具。

            當(dāng)然兩者也有相同之處。那些用的較多的語(yǔ)言比那些使用率較小的語(yǔ)言擁有更多的俗語(yǔ)、表達(dá)方式、詞匯,這一點(diǎn)無(wú)論是計(jì)算機(jī)語(yǔ)言還是自然語(yǔ)言都是一樣的。語(yǔ)言還有一個(gè)傾向就是越來(lái)越易學(xué),但卻很難精通,象C++ 和英語(yǔ)。在兩種語(yǔ)言當(dāng)中,我們都希望能從最初的基本的應(yīng)用到真正的掌握。另外一個(gè)相同之處就是語(yǔ)言的發(fā)展都要適應(yīng)一個(gè)群體的需求,并且一個(gè)大的群體或者說(shuō)社區(qū)本身就有重要意義,因?yàn)樽鳛檫@個(gè)群體的一部分可以讓你有更多的人來(lái)進(jìn)行互動(dòng)并且有更多的機(jī)會(huì)可以使用。所有鮮活的語(yǔ)言都是通過(guò)獲得新的術(shù)語(yǔ)、俗語(yǔ)和表達(dá)方式來(lái)得到發(fā)展的。在C++中我們已經(jīng)看到了關(guān)于模板技術(shù)的迅猛發(fā)展,始因是STL(注:STL指標(biāo)準(zhǔn)模板庫(kù),后面我們將采訪STL之父 Stepanov先生,他確實(shí)有許多精彩的言論,和Bjarne Stroustrup先生相比,毫不遜色),也就是經(jīng)常提到的泛型編程(generic programming和模板元程序(template metaprogramming。以后幾年里,我們將會(huì)在新的ISO C++標(biāo)準(zhǔn)中看到,比1998年標(biāo)準(zhǔn)中對(duì)模板技術(shù)更強(qiáng)的支持和更廣的應(yīng)用。

             

            那么,究竟是什么促成了C++語(yǔ)言呢?

            他的研究生涯給了他很大靈感,他所在的AT&T貝爾實(shí)驗(yàn)室是一個(gè)光榮的群體,那里有一群非常出色的研究人員,那里有許多著名的IT人物,他們彼此間的影響十分深遠(yuǎn)。他曾經(jīng)和C語(yǔ)言之父Dennis Ritchie親密接觸十多年,他們的辦公室相距不遠(yuǎn),C++語(yǔ)言受C的影響是巨大的。而對(duì)于C++來(lái)說(shuō),尤其值得我們推崇的是:作為一種學(xué)術(shù)性語(yǔ)言,他是從商業(yè)性語(yǔ)言的重圍中殺出的。

            1979Bjarne在劍橋完成學(xué)業(yè)后,到了貝爾實(shí)驗(yàn)室從事研究工作,20世紀(jì)80年代,AT&T曾拔款5000美元作為市場(chǎng)預(yù)算,創(chuàng)建一門(mén)語(yǔ)言的決心可能由此而始。在那里,開(kāi)始研究幾個(gè)與分布式計(jì)算有關(guān)的項(xiàng)目。可是工作進(jìn)展得并不順利,因?yàn)槟菚r(shí)幾乎所有程序設(shè)計(jì)工具都不適合完成此類(lèi)工作。所以,他決定自己開(kāi)發(fā)一個(gè)名為“帶類(lèi)的C”的工具,它既允許以類(lèi)似于Simula的方式組織程序(這種方式現(xiàn)在被稱(chēng)為面向?qū)ο螅瑫r(shí)也支持在硬件層次上進(jìn)行系統(tǒng)軟件開(kāi)發(fā)。從1980年開(kāi)始,“帶類(lèi)的C”被應(yīng)用于貝爾實(shí)驗(yàn)室的很多應(yīng)用領(lǐng)域,在應(yīng)用過(guò)程中,他又學(xué)到了很多東西,而C++正是以“帶類(lèi)的C”為基礎(chǔ)并結(jié)合了一些我們學(xué)到的新東西發(fā)展而來(lái)的。1983年夏天,Rick Mascitti給起了C++的名字,這個(gè)名字也象征著兩種語(yǔ)言之間巨大的淵源。

             

             

            生活中更有意義的事情

            對(duì)于Bjarne來(lái)說(shuō),生活中更有意義的事情是什么呢?是學(xué)習(xí)和教育。這看起來(lái)象個(gè)沉重的話(huà)題,而在Bjarne身上卻顯得如此生動(dòng),作為教育家,Bjarne Stroustrup先生本身便是一個(gè)成才的典范,他出身于農(nóng)場(chǎng)和“藍(lán)領(lǐng)工人”家庭,他在專(zhuān)業(yè)領(lǐng)域孜孜耕耘,取得了不菲業(yè)績(jī)。先是AT&T的研究者,現(xiàn)在又兼任教席,Bjarne從研究室又走進(jìn)了大學(xué),直接面對(duì)大學(xué)的新學(xué)生!

            C++Bjarne生命中最重要的事情,而還有一些更有意義的事情。

            他對(duì)大學(xué)教育情有獨(dú)衷,他現(xiàn)在是A&M大學(xué)的教授,這種行動(dòng)便是很好的說(shuō)明,在這里,以一種在AT&T研究所中無(wú)法采用的方式將研究和教學(xué)結(jié)合起來(lái)。他認(rèn)為教學(xué)是一種與工業(yè)生產(chǎn)不同的能影響世界并使其變得更加美好的方式,而且大學(xué)里的研究工作的成果與曾經(jīng)進(jìn)行的工業(yè)研究的并不相同 - 不是說(shuō)它更好,僅僅只是不同而已。

            他的一些教育觀點(diǎn)也非常值得我們深思:

            他說(shuō),不要只學(xué)習(xí)計(jì)算機(jī)和編程,要積累一種或多種領(lǐng)域的經(jīng)驗(yàn),要有其他專(zhuān)業(yè)知識(shí),這樣就能明白什么東西值得我們?nèi)ゾ幊虒?shí)現(xiàn)。另外,學(xué)習(xí)多種語(yǔ)言也是他一再?gòu)?qiáng)調(diào)的,如果只學(xué)一種,容易導(dǎo)致想象力的僵化。他本人愛(ài)好廣范,精通多種計(jì)算機(jī)語(yǔ)言。

             

             

             

            問(wèn):您覺(jué)得怎樣才是學(xué)編程的好方法?學(xué)習(xí)語(yǔ)言時(shí)一種好的工具是不是必需的?

            Bjarne Stroustrup 這是過(guò)去一年左右里一直占據(jù)我大部分注意力的一個(gè)問(wèn)題。我志愿教授電子工程/ 計(jì)算機(jī)工程專(zhuān)業(yè)大學(xué)一年級(jí)的學(xué)生編程,我認(rèn)為我們目前教編程的傳統(tǒng)方法不夠嚴(yán)謹(jǐn)也不夠廣闊。我們社會(huì)的文明進(jìn)步是建立在軟件上的,因而必須培養(yǎng)更好的軟件專(zhuān)家。我認(rèn)為已經(jīng)到了我開(kāi)始培養(yǎng)新手程序員的時(shí)候了,在我此之前我都是把精力放在專(zhuān)家上。我基本的設(shè)想是讓學(xué)生成為專(zhuān)家,使他們最終能夠編出可靠并且別人可以信賴(lài)的軟件,這就意味著在培養(yǎng)新手時(shí)要求更高,要將重點(diǎn)放在對(duì)程序正確性和處理錯(cuò)誤的訓(xùn)練上。既然目標(biāo)是為了制造現(xiàn)實(shí)世界中可用的軟件,我也非常重視標(biāo)準(zhǔn)庫(kù)的應(yīng)用和設(shè)計(jì)。對(duì)于C++標(biāo)準(zhǔn)庫(kù)工具的教學(xué),例如向量(vector)和字符(string)從第一周就該開(kāi)始應(yīng)用,在第一個(gè)月之內(nèi)類(lèi)(class)就應(yīng)該介紹,在第二個(gè)月之內(nèi)介紹圖形(graphics)和繼承性(inheritance)。這種方法和傳統(tǒng)的方法不同,那些教學(xué)方法往往花費(fèi)數(shù)周的時(shí)間來(lái)區(qū)分那些令人迷惑的C++基本類(lèi)型,并且浪費(fèi)寶貴的時(shí)間來(lái)處理諸如聲明和循環(huán)上的一些迷人耳目的語(yǔ)法細(xì)節(jié)。我稱(chēng)我的方法為“深度優(yōu)先法”,因?yàn)槲覀兪紫冉涛覀兊膶W(xué)生足夠的知識(shí)去做一些有用的工作,然后才在這有限的基礎(chǔ)上拓寬他們的理解能力和對(duì)工具的使用能力。

            我所有的教學(xué)都是在實(shí)例的基礎(chǔ)上進(jìn)行的。我通過(guò)典型的例子來(lái)使學(xué)生理解,用親身的體會(huì)來(lái)解釋一些規(guī)則。自然地,我要求學(xué)生寫(xiě)大量代碼如果你不讀也不寫(xiě)大量代碼的話(huà)你就學(xué)不會(huì)編程。第一階段如下,學(xué)生必須經(jīng)過(guò)親身寫(xiě)代碼,體會(huì)解題過(guò)程中出現(xiàn)的實(shí)際問(wèn)題;第二個(gè)階段必須好好體會(huì)親身所犯的錯(cuò)誤,并且學(xué)會(huì)克服他們。這其中,調(diào)試、錯(cuò)誤處理,還有學(xué)會(huì)將大問(wèn)題分解成小問(wèn)題,從最小的組件來(lái)編程是非常重要的。

             

            問(wèn):數(shù)學(xué)和計(jì)算機(jī)科學(xué)有什么關(guān)系嗎?

            Bjarne Stroustrup 兩者并沒(méi)有很強(qiáng)的直接聯(lián)系,但是有一部分編程的實(shí)質(zhì)包含在里面-- -象學(xué)數(shù)學(xué)一樣,編程有時(shí)也需要很?chē)?yán)密的思維。自從古希臘以來(lái),數(shù)學(xué)就被用來(lái)訓(xùn)練人們的邏輯思維,并且我覺(jué)得如果不用數(shù)學(xué)的話(huà)很難想象怎樣才能編出好程序來(lái)。當(dāng)然也有一些計(jì)算機(jī)領(lǐng)域,用到高深的數(shù)學(xué)知識(shí)。然而,這些領(lǐng)域通常是非常專(zhuān)業(yè)的。數(shù)學(xué),特別是數(shù)學(xué)思維是計(jì)算機(jī)的一個(gè)支柱。經(jīng)驗(yàn)主義是另一支柱,通過(guò)觀察和測(cè)量來(lái)幫助理解實(shí)際的發(fā)展,用以調(diào)整我們的系統(tǒng)和行為。兩方面我們都需要。計(jì)算機(jī)科學(xué)不是僅僅用來(lái)證明定理的,也不是僅僅用來(lái)收集數(shù)據(jù)的。為了有效地實(shí)踐計(jì)算機(jī)科學(xué)和發(fā)展高質(zhì)量軟件,更同時(shí)需要數(shù)學(xué)和經(jīng)驗(yàn)的訓(xùn)練。

            問(wèn): 您以前在歐洲學(xué)習(xí)而現(xiàn)在在美國(guó)工作,您覺(jué)得歐美有什么學(xué)術(shù)傳統(tǒng)區(qū)別?怎樣才算是一種好的大學(xué)教育呢?尤其對(duì)計(jì)算機(jī)科學(xué)來(lái)說(shuō)。現(xiàn)在的大學(xué)有部分學(xué)生中途退學(xué),您怎樣看待這一現(xiàn)象呢?

            Bjarne Stroustrup這很難回答。歐洲和美國(guó)都幅員遼闊,而且有很多不同的學(xué)術(shù)傳統(tǒng)。真的不好總結(jié),并且在兩地都有一些非常好的大學(xué)科系,這不是很容易區(qū)別和下結(jié)論的。

            很少有學(xué)生離開(kāi)學(xué)校去開(kāi)公司,較多的是離開(kāi)學(xué)校去從事一些有較高收入的工作,但大多數(shù)人還是完成了學(xué)業(yè)。我印象中那些放棄了計(jì)算機(jī)科學(xué)學(xué)習(xí)轉(zhuǎn)而投入業(yè)界工作的是會(huì)為此感到后悔的。從長(zhǎng)期眼光來(lái)看學(xué)位對(duì)一個(gè)好工作來(lái)說(shuō)是重要的,特別是學(xué)生在他們最后一年或最后幾年的學(xué)習(xí)。當(dāng)然也確實(shí)有些相反的例子,但那些人通常永遠(yuǎn)不會(huì)再?gòu)氖抡嬲募夹g(shù)工作,而轉(zhuǎn)為商業(yè)管理人員了,如果那是他們想做的,那一個(gè)學(xué)位并不是必須的。我一直認(rèn)為:一個(gè)學(xué)生如果還未獲得學(xué)位,最好不要離開(kāi)學(xué)校。

            問(wèn):我們經(jīng)常批評(píng)我們現(xiàn)在的C++教育不夠現(xiàn)代、不夠科學(xué),您是通過(guò)“深度優(yōu)先法”來(lái)教授學(xué)生的,您是否覺(jué)得在一個(gè)學(xué)生學(xué)習(xí)早期有些難嗎?我們?cè)撊绾巫瞿兀?/span>

            Bjarne Stroustrup這是必然的。傳統(tǒng)的教授編程的方法是不行的,學(xué)完這些課程的學(xué)生寫(xiě)不出很好的代碼。說(shuō)得更激進(jìn)一點(diǎn),他們甚至不知道什么是好的代碼!我的方法可以避免這種情況發(fā)生。我已在300 名學(xué)生身上實(shí)驗(yàn)成功。對(duì)于程序員來(lái)說(shuō)這是非常關(guān)鍵的——包括新程序員——了解基本概念和基本技能。但僅僅了解程序設(shè)計(jì)語(yǔ)言的基本構(gòu)造是不夠的。另一方面,如果沒(méi)有一種編程語(yǔ)言我們就不可能教授編程的技能和規(guī)則,因此,對(duì)一種語(yǔ)言工具充分掌握,做盡可能多的練習(xí)是必需的。

            很顯然,這種教育問(wèn)題不僅僅局限于C++語(yǔ)言。我的方法可以應(yīng)用于任何其他語(yǔ)言。

             

            面向金錢(qián)、面向未來(lái)和面向?qū)ο?/span>

            面向?qū)ο笫莻€(gè)有趣的問(wèn)題,C++正是和面向?qū)ο笥兄浅B?lián)系的語(yǔ)言,作為一種非商業(yè)化語(yǔ)言,他已經(jīng)影響了世界范圍數(shù)十億美元的設(shè)計(jì)決策。而還有許多語(yǔ)言具有這種特點(diǎn),因而,關(guān)于各種語(yǔ)言的爭(zhēng)論喋喋不休地進(jìn)行了幾十年。

            當(dāng)有人問(wèn)Bjarne Stroustrup先生:有人說(shuō)Java是純粹面向?qū)ο蟮模鳦#更勝一籌,而還有很多人說(shuō)它們純粹是面向金錢(qián)的。以您之見(jiàn)呢?

            Bjarne 的回答非常風(fēng)趣:我喜歡“面向金錢(qián)”這個(gè)詞 :-) 還有Andrew Koenig的說(shuō)法"面向大話(huà)"我也喜歡。C++可不面向這兩個(gè)東東。對(duì)這點(diǎn)我還想指出,我認(rèn)為純粹性并非什么優(yōu)點(diǎn)。C++的優(yōu)點(diǎn)恰恰在于其支持多種有效的編程風(fēng)格(多種思維模型吧,如果你一定要這么說(shuō))及其組合。最優(yōu)雅最有效也最容易維護(hù)的解決方案常常涉及到一種以上的風(fēng)格(編程模型)。如果一定要用吸引人的字眼,C++是一種多思維模型的語(yǔ)言。在軟件開(kāi)發(fā)的龐大領(lǐng)域,需求千變?nèi)f化,起碼需要一種支持多種編程的設(shè)計(jì)風(fēng)格的通用語(yǔ)言,而且很可能需要一種以上呢。再說(shuō),世界之大,總?cè)莸孟潞脦追N編程語(yǔ)言吧?那種認(rèn)為一種語(yǔ)言對(duì)所有應(yīng)用和每個(gè)程序員都是最好的看法,根本就是荒謬的。

            他上面的回答很好地告訴了我們面向?qū)ο蠛兔嫦蚪疱X(qián)的關(guān)系,也給我們的爭(zhēng)論劃上了圓滿(mǎn)的句號(hào)。

            問(wèn):您對(duì)面向?qū)ο笫窃鯓永斫獾模克遣皇且环N好的可接受的編程思考方式?有沒(méi)有學(xué)習(xí)OO必須的有用的工具?

            Bjarne StroustrupOO 技術(shù)在現(xiàn)在軟件發(fā)展的扮演了非常重要的角色,但并不是唯一的方法。象泛型程序設(shè)計(jì)(generic programming),用C++ 模板是另一種方法,這些方法必須通過(guò)綜合應(yīng)用來(lái),才能創(chuàng)造出:一流的、最可讀的、最易于維護(hù)的、最高效的程序。但沒(méi)有任何一種方法是適合所有要求的。

            我主要用C++來(lái)編程。我覺(jué)得C++是一種學(xué)習(xí)和實(shí)踐OO思想很好的編程語(yǔ)言。

             

            敢問(wèn)路在何方

            問(wèn): 您能對(duì)IT的將來(lái)做一下預(yù)測(cè)嗎?將來(lái)我們最有可能用什么語(yǔ)言

            Bjarne Stroustrup一個(gè)聰慧的幽默大師曾經(jīng)說(shuō)過(guò):預(yù)測(cè)是困難的,特別是對(duì)將來(lái)的預(yù)測(cè)。但是我認(rèn)為未來(lái)十年之內(nèi)我們用的東西在今天的實(shí)驗(yàn)室里是能夠看到的。另外我們將用的最主要的語(yǔ)言也是今天最主要的。我們不可能因?yàn)橐恍┬聳|西和一些更好的東西的出現(xiàn)就重組整個(gè)工業(yè)領(lǐng)域,因此在五到十年之內(nèi),我們還是用C, C++, COBOL, Fortran, Java, Perl, Python,也許還有C#,和其它許多種語(yǔ)言。沒(méi)有一種語(yǔ)言能適合所有用途,并且好的程序員都懂并且都能用好幾種語(yǔ)言。懂好多種語(yǔ)言和多種程序設(shè)計(jì)技術(shù)會(huì)使我們可以更好地編程。

            對(duì)于IT我不想說(shuō)太多,很顯然:我們會(huì)繼續(xù)依賴(lài)IT并且它會(huì)延伸到越來(lái)越多的領(lǐng)域。當(dāng)然,肯定會(huì)有失敗,通常是因?yàn)檫^(guò)度的濫用引起的——但是在十年以后我們受IT的影響肯定要比今天大得多。

             

             

             

            人物印象

             

            很幸運(yùn),通過(guò)電郵采訪的同時(shí)終于有機(jī)會(huì)和大師面對(duì)面。想象中的大師和面對(duì)面見(jiàn)到的有太多的意想不到,用一個(gè)詞來(lái)形容是“謙遜”。

            Bjarne到杭州下了飛機(jī),便撲向美麗的西湖,同去的是他的好友STL之父Alex Stepanov先生。在未去杭州之前,Bjarne Stroustrup先生通過(guò)電郵告訴我杭州城的美;去了之后,少有的好天氣讓我們碰上了,爽;夜里在旅館見(jiàn)到了久違的大師,一夜之間見(jiàn)到兩位大師,更爽!

            我對(duì)Bjarne Stroustrup先生有著特殊的感情,覺(jué)得他象位慈父,而他正和我的父親同樣的年紀(jì)。大師,慈父!接觸越多,對(duì)Bjarne Stroustrup先生的感觸越深。到了杭城,見(jiàn)到大師其人,這種感覺(jué)越來(lái)越濃厚,他又象海,既有熱情,又能包容。

            采訪大部是通過(guò)Email進(jìn)行的,采訪的過(guò)程中對(duì)我的問(wèn)題孜孜以求,給我的回答細(xì)微備至,Email的好處在此發(fā)揮到了極致,大洋這邊的我沐著陽(yáng)光,那邊的他在挑燈夜書(shū)。

            唯有謝謝眾多C++程友和非C++朋友對(duì)我的支持,唯有大師再來(lái)杭城時(shí),到最好的茶館將上好的龍井泡上,親手送到大師的手中!

            20041219

            posted @ 2007-04-06 16:35 學(xué)習(xí)才能進(jìn)步 閱讀(268) | 評(píng)論 (0)編輯 收藏
            1  new自動(dòng)計(jì)算需要分配的空間,而malloc需要手工計(jì)算字節(jié)數(shù)
            2  new是類(lèi)型安全的,而malloc不是,比如:
            int* p = new float[2]; // 編譯時(shí)指出錯(cuò)誤
            int* p = malloc(2*sizeof(float)); // 編譯時(shí)無(wú)法指出錯(cuò)誤
            new operator 由兩步構(gòu)成,分別是 operator new 和 construct
            3  operator new對(duì)應(yīng)于malloc,但operator new可以重載,可以自定義內(nèi)存分配策略,甚至不做內(nèi)存分配,甚至分配到非內(nèi)存設(shè)備上。而malloc無(wú)能為力
            4  new將調(diào)用constructor,而malloc不能;delete將調(diào)用destructor,而free不能。
            5  malloc/free要庫(kù)文件支持,new/delete則不要。
            posted @ 2007-04-06 15:28 學(xué)習(xí)才能進(jìn)步 閱讀(765) | 評(píng)論 (0)編輯 收藏

             如果const關(guān)鍵字不涉及到指針很好理解,下面是涉及到指針的情況:    
              int   b   =   500;  
              const   int*   a   =   &b;                             [1]  
              int   const   *a   =   &b;                             [2]  
              int*   const   a   =   &b;                             [3]  
              const   int*   const   a   =   &b;                  [4]  
               
              如果const位于星號(hào)的左側(cè),則const就是用來(lái)修飾指針?biāo)赶虻淖兞浚粗羔樦赶驗(yàn)槌A浚蝗绻鹀onst位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針?biāo)赶虻膬?nèi)容為常量(const放在變量聲明符的位置無(wú)關(guān)),這種情況下不允許對(duì)內(nèi)容進(jìn)行更改操作,如不能*a   =   3   ;[3]為指針本身是常量,而指針?biāo)赶虻膬?nèi)容不是常量,這種情況下不能對(duì)指針本身進(jìn)行更改操作,如a++是錯(cuò)誤的;[4]為指針本身和指向的內(nèi)容均為常量。  
              另外const   的一些強(qiáng)大的功能在于它在函數(shù)聲明中的應(yīng)用。在一個(gè)函數(shù)聲明中,const   可以修飾函數(shù)的返回值,或某個(gè)參數(shù);對(duì)于成員函數(shù),還可以修飾是整個(gè)函數(shù)。  
              有如下幾種情況:  
              A&   operator=(const   A&   a);  
              void   fun0(const   A*   a   );    
              void   fun1(   )   const;         //   fun1(   )   為類(lèi)成員函數(shù)  
              const   A   fun2(   );  
              ----------------------------------------------------------------------------------  
              const的初始化  
               
              先看一下const變量初始化的情況  
              1)   非指針const常量初始化的情況:  
              A   b;  
              const   A   a   =   b;  
               
              2)   指針(引用)const常量初始化的情況:  
              A*   d   =   new   A();  
              const   A*   c   =   d;  
              或者:const   A*   c   =   new   A();  
              引用:  
              A   f;  
              const   A&   e   =   f;       //   這樣作e只能訪問(wèn)聲明為const的函數(shù),而不能訪問(wèn)一般的成員函數(shù);  
              ----------------------------------------------------------------------------------  
               
              作為參數(shù)和返回值的const修飾符  
               
              其實(shí),不論是參數(shù)還是返回值,參數(shù)傳入時(shí)候和函數(shù)返回的時(shí)候,初始化const變量  
              1   修飾參數(shù)的const,如   void   fun0(const   A*   a   );   void   fun1(const   A&   a);  
              調(diào)用函數(shù)的時(shí)候,用相應(yīng)的變量初始化const常量,則在函數(shù)體中,按照const所修飾的部分進(jìn)行常量化,如形參為const   A*   a,則不能對(duì)傳遞進(jìn)來(lái)的指針的內(nèi)容進(jìn)行改變,保護(hù)了原指針?biāo)赶虻膬?nèi)容;如形參為const   A&   a,則不能對(duì)傳遞進(jìn)來(lái)的引用對(duì)象進(jìn)行改變,保護(hù)了原對(duì)象的屬性。  
              [注意]:參數(shù)const通常用于參數(shù)為指針或引用的情況;  
              2   修飾返回值的const,如const   A   fun2(   );   const   A*   fun3(   );  
              這樣聲明了返回值后,const按照"修飾原則"進(jìn)行修飾,起到相應(yīng)的保護(hù)作用。  
              const   Rational   operator*(const   Rational&   lhs,   const   Rational&   rhs)  
              {  
              return   Rational(lhs.numerator()   *   rhs.numerator(),  
              lhs.denominator()   *   rhs.denominator());  
              }  
               
              返回值用const修飾可以防止允許這樣的操作發(fā)生:  
              Rational   a,b;  
              Radional   c;  
              (a*b)   =   c;  
               
              一般用const修飾返回值為對(duì)象本身(非引用和指針)的情況多用于二目操作符重載函數(shù)并產(chǎn)生新對(duì)象的時(shí)候。  
              [總結(jié)]   一般情況下,函數(shù)的返回值為某個(gè)對(duì)象時(shí),如果將其聲明為const時(shí),多用于操作符的重載。通常,不建議用const修飾函數(shù)的返回值類(lèi)型為某個(gè)對(duì)象或?qū)δ硞€(gè)對(duì)象引用的情況。  
              原因如下:  
              如果返回值為某個(gè)對(duì)象為const(const   A   test   =   A   實(shí)例)或某個(gè)對(duì)象的引用為const(const   A&   test   =   A實(shí)例)   ,則返回值具有const屬性,則返回實(shí)例只能訪問(wèn)類(lèi)A中的公有(保護(hù))數(shù)據(jù)成員和const成員函數(shù),并且不允許對(duì)其進(jìn)行賦值操作,這在一般情況下很少用到。    
              ----------------------------------------------------------------------------------  
              類(lèi)成員函數(shù)中const的使用  
               
              一般放在函數(shù)體后,形如:void   fun()   const;  
              如果一個(gè)成員函數(shù)的不會(huì)修改數(shù)據(jù)成員,那么最好將其聲明為const,因?yàn)閏onst成員函數(shù)中不允許對(duì)數(shù)據(jù)成員進(jìn)行修改,如果修改,編譯器將報(bào)錯(cuò),這大大提高了程序的健壯性。    
               
              ----------------------------------------------------------------------------------  
              使用const的一些建議  
               
              1   要大膽的使用const,這將給你帶來(lái)無(wú)盡的益處,但前提是你必須搞清楚原委;  
              2   要避免最一般的賦值操作錯(cuò)誤,如將const變量賦值,具體可見(jiàn)思考題;  
              3   在參數(shù)中使用const應(yīng)該使用引用或指針,而不是一般的對(duì)象實(shí)例,原因同上;  
              4   const在成員函數(shù)中的三種用法(參數(shù)、返回值、函數(shù))要很好的使用;  
              5   不要輕易的將函數(shù)的返回值類(lèi)型定為const;  
              6   除了重載操作符外一般不要將返回值類(lèi)型定為對(duì)某個(gè)對(duì)象的const引用;  

            const * 與 * const

            const *表示指向const對(duì)象的指針,可以指向一個(gè)const的對(duì)象,但是并不是指只能指向一個(gè)const對(duì)象,指向const對(duì)象的指針同樣可以指向一個(gè)非cons類(lèi)型的對(duì)象。但是const的對(duì)象只能由const*類(lèi)型的指針指向,而不能由普通指針指向。const*類(lèi)型的指針在使用過(guò)程中可以其改變,即可以指向其他對(duì)象。
            const*類(lèi)型的指針的真正含義是:如果一個(gè)指針是const*類(lèi)型的指針表示該指針指向的對(duì)象不能通過(guò)該指針進(jìn)行修改(對(duì)象本身可能通過(guò)別的方式進(jìn)行修改)。 
            *const expression表示指針(expression)本身是const,即*const類(lèi)型的指針初始化后不能改變,不能指向別的對(duì)象。 
            char * point_char = new char('e');
            const char char_char = 'f';
            const char * const_star_char;                       // 可以不用初始化
            char *const  star_const_char = point_char;    // 必須初始化
            const_star_char = &char_char;                     // OK
            star_const_char = &char_char;                     // 錯(cuò)誤,*const 不可改變
            const_star_char = star_const_char;              // OK
            star_const_char = const_star_char ;              // 錯(cuò)誤 ,*const 不可改變
            const char* const foo(char const * const str) const

            第一個(gè)const表示返回類(lèi)型為const,也就是不能把此函數(shù)的返回值當(dāng)作左值來(lái)使用。

            第二個(gè)const表示指針的不可變性,但在這是可以省略,因?yàn)榉殿?lèi)型已經(jīng)是const。

            第三個(gè)cosnt表示str的常量性,也就其內(nèi)容是不能改變,可以寫(xiě)在其前面的char的前面。

            第四個(gè)cosnt表示str的指針的常量性,也就是此指針不能指向別的地址。

            第五個(gè)cosnt表示此函數(shù)的常量性(前提是類(lèi)的成員函數(shù)),不能修改所在類(lèi)的數(shù)據(jù)成員。
            posted @ 2007-04-06 13:36 學(xué)習(xí)才能進(jìn)步 閱讀(298) | 評(píng)論 (1)編輯 收藏
            僅列出標(biāo)題  下一頁(yè)
            久久精品亚洲一区二区三区浴池| 久久久久香蕉视频| 伊人热热久久原色播放www| 国产巨作麻豆欧美亚洲综合久久 | 香蕉久久夜色精品升级完成| 久久伊人五月天论坛| 欧美亚洲另类久久综合| av无码久久久久久不卡网站| 亚洲中文字幕久久精品无码喷水| 一本色综合久久| 亚洲国产高清精品线久久 | 青青青国产精品国产精品久久久久 | 亚洲愉拍99热成人精品热久久| 久久天天躁狠狠躁夜夜躁2014| 亚洲人AV永久一区二区三区久久| 久久久久国产亚洲AV麻豆| 久久久久亚洲AV成人网| 久久人妻少妇嫩草AV蜜桃| 久久天天日天天操综合伊人av| 久久影视国产亚洲| 久久人妻无码中文字幕| 久久久久免费精品国产| 亚洲国产精品无码久久SM| 久久久婷婷五月亚洲97号色| 久久66热人妻偷产精品9| 潮喷大喷水系列无码久久精品| 2021久久精品国产99国产精品| 97久久天天综合色天天综合色hd| 久久精品蜜芽亚洲国产AV| 久久精品国产91久久麻豆自制 | 久久久午夜精品福利内容| AV无码久久久久不卡蜜桃| 久久精品人人做人人爽97 | 久久精品国产亚洲Aⅴ蜜臀色欲| 久久涩综合| 色综合久久综合中文综合网| 久久国产精品久久国产精品| 色播久久人人爽人人爽人人片aV| 精品久久久无码21p发布| 国产精品99精品久久免费| 91精品国产91热久久久久福利|