1
.建立并理解
Web Server
Web Server
是網(wǎng)絡(luò)編程的基礎(chǔ)。推薦使用
Apache
,它是免費(fèi)的,并可運(yùn)行在多種平臺(tái)上。
推薦安裝和調(diào)試時(shí)間:
2
天。
2
.理解
HTML/XHTML/JavaScript(
建議
JavaScript
和
HTML
一起學(xué)習(xí)
)
。
??????
使用
JSP
和
HTML
混合編程,精通
HTML
語法是非常重要的,因此花些時(shí)間來學(xué)習(xí)和寫
HTML
語法是必要的
?????? JavaScript
作為目前最實(shí)用的客戶端編程工具,對(duì)學(xué)習(xí)
JSP
有重要意義。
JavaScript
不能被認(rèn)為成是
Java
的網(wǎng)絡(luò)版,它在表單驗(yàn)證、框架處理等方面有獨(dú)到之處。通過學(xué)習(xí)
JavaScript
可以簡單了解
Java
面向?qū)ο蟮恼Z法特點(diǎn),因此
JavaScript
對(duì)開發(fā)一個(gè)優(yōu)秀的
JSP
頁面有著極為重要的幫助。
訓(xùn)練時(shí)間:
4
~
7
周。
???????????????????????
推薦書籍
:
???????????????????????????????
HTML
與
XHTML
權(quán)威指南(中國電力出版社)
XHTML
初級(jí)編程(機(jī)械工業(yè)出版社)
????????
JavaScript
權(quán)威指南(中國電力出版社)
???????
JavaScript
開發(fā)使用手冊(機(jī)械工業(yè)出版社)
???
3
.開始學(xué)習(xí)
Java
??????
不必太多介紹,如果你學(xué)好這門語言,前途一定不差。
訓(xùn)練時(shí)間:
4
~
7
周。
?????????????
推薦書籍
:
?????????????????????
think in java 2(
機(jī)械工業(yè)出版社
)????
JAVA
技術(shù)手冊(中國電力出版社)
Java
夜未眠(電子工業(yè)出版社)
???
4
.學(xué)習(xí)并理解
Web Server
的細(xì)節(jié)
??????
首先應(yīng)理解
Web
的基本工作原理,了解并分清楚
Web
定義的兩個(gè)方面:
Web
的客戶端和服務(wù)器端,并知道兩者是如何通訊的。其次熟悉
Web Server
的特征。
訓(xùn)練時(shí)間:
2
天。
5
.建立
JSP Server
??????
推薦
Tomcat
,因?yàn)樗耆赓M(fèi),并可以很好的運(yùn)行
JSP
程序。使用
Tomcat
遇到問題時(shí),可以很容易的獲得相關(guān)的幫助(在
Tomcat
的官方網(wǎng)站你可以獲得許多技術(shù)支持,但前提你的英文還不錯(cuò))。
安裝時(shí)間:
1
~
2
天。
6
.開始學(xué)習(xí)
JSP
??????
經(jīng)過以上步驟,
JSP
的基礎(chǔ)學(xué)習(xí)已基本完成?,F(xiàn)在可以使用
JSP
寫程序來實(shí)際練習(xí)。另一個(gè)學(xué)習(xí)
JSP
的方法是學(xué)習(xí)怎樣創(chuàng)建一個(gè)分布式的應(yīng)用程序。
??????
經(jīng)過以上學(xué)習(xí),我們已經(jīng)可以完成一個(gè)
JSP Web
的應(yīng)用程序了(如:“
Hello World
”)。
如果出錯(cuò)的話,先檢查你的
JDK
和
Tomcat
的環(huán)境變量配置是否正確,其次檢查
Tomcat
是否已經(jīng)啟動(dòng)。
訓(xùn)練時(shí)間:
4
~
6
周。
???????????????????
推薦書籍
:
????????????????????????????
JSP
設(shè)計(jì)(中國電力出版社)
????????????
JSP
變成指南(第二版)(電子工業(yè)出版社)
7
.學(xué)習(xí)更多的
JSP Server
??????
很多
JSP Server
都有自己的一些優(yōu)秀特征,可以更輕松的開發(fā)
JSP
。建議深入學(xué)習(xí)
JSP server
,可以優(yōu)化
JSP
應(yīng)用程序,并使之運(yùn)行的更快而不出問題。
訓(xùn)練時(shí)間:
2
~
7
天。
??????????????????
推薦書籍
:
???????????????????????????
JSP
站點(diǎn)設(shè)計(jì)變成指南(電子工業(yè)出版社)
8
.學(xué)習(xí)
JDBC
?????? JSP
的大多數(shù)應(yīng)用需要使用數(shù)據(jù)庫。
JDBC
可以很好的用于
JSP
中的數(shù)據(jù)庫連接。了解和熟悉
JSP
上被采用的
JDBC Driver
的細(xì)節(jié)是很重要的。一定要熟悉
JDBC
中所定義的主要接口和類。
??????
學(xué)習(xí)初期推薦使用
MySQL
,短小精悍,容易上手。這期間你也要學(xué)習(xí)
SQL
語句,等你真正熟悉了這方面的知識(shí)就可以考慮用一些企業(yè)級(jí)的大型數(shù)據(jù)庫了。
訓(xùn)練時(shí)間:
2
~
3
周。
??????????????????????????????
推薦書籍:
???????????????????????????????????????
JDBC
與
JAVA
數(shù)據(jù)庫編程(第二版)(中國電力出版社)
MySQL
網(wǎng)絡(luò)數(shù)據(jù)庫指南(不必精讀)
????????????????
?
??????
至此,你一成為一個(gè)熟練的
JSP
程序員了。
5
~
6
個(gè)月的時(shí)間可以訓(xùn)練一個(gè)人成為一個(gè)
JSP
程序員了,但要成為高手,你還有很長的路要走??梢钥紤]擴(kuò)展的知識(shí)面:
DHTML
,
XML
,
EJB
等等。
摘要: WINDOWS XP
的關(guān)機(jī)中。
Windows XP
系統(tǒng)是通過一個(gè)名為
Shutdown.exe
的程序來完成關(guān)機(jī)操作的,關(guān)機(jī)的時(shí)候調(diào)用
shutdown.exe
。在
Windows XP
...
閱讀全文
計(jì)算機(jī)科學(xué)與技術(shù)學(xué)習(xí)心得
計(jì)算機(jī)科學(xué)與技術(shù)反思錄
計(jì)算機(jī)科學(xué)與技術(shù)這一門科學(xué)深深的吸引著我們這些同學(xué)們,上計(jì)算機(jī)系已經(jīng)有近
三年了,自己也做了一些思考,我一直認(rèn)為計(jì)算機(jī)科學(xué)與技術(shù)這門專業(yè),在本科階段是不
可能切分成計(jì)算機(jī)科學(xué)和計(jì)算機(jī)技術(shù)的,因?yàn)橛?jì)算機(jī)科學(xué)需要相當(dāng)多的實(shí)踐,而實(shí)踐需
要技術(shù);每一個(gè)人(包括非計(jì)算機(jī)專業(yè)),掌握簡單的計(jì)算機(jī)技術(shù)都很容易(包括程序設(shè)
計(jì)),但計(jì)算機(jī)專業(yè)的優(yōu)勢就在于,我們掌握許多其他專業(yè)并不“深究”的東西,例
如,算法,體系結(jié)構(gòu),等等。非計(jì)算機(jī)專業(yè)的人可以很容易地做一個(gè)芯片,寫一段程
序,但他們做不出計(jì)算機(jī)專業(yè)能夠做出來的大型系統(tǒng)。今天我想專門談一談?dòng)?jì)算機(jī)科
學(xué),并將重點(diǎn)放在計(jì)算理論上。
計(jì)算機(jī)理論的一個(gè)核心問題——從數(shù)學(xué)談起:
記得當(dāng)年大一入學(xué),每周六課時(shí)高等數(shù)學(xué),天天作業(yè)不斷(那時(shí)是六日工作制)。頗
有些同學(xué)驚呼走錯(cuò)了門:咱們這到底念的是什么系?不錯(cuò),你沒走錯(cuò)門,這就是計(jì)算機(jī)科
學(xué)與技術(shù)系。我國計(jì)算機(jī)科學(xué)系里的傳統(tǒng)是培養(yǎng)做學(xué)術(shù)研究,尤其是理論研究的人(方
向不見得有問題,但是做得不是那么盡如人意)。而計(jì)算機(jī)的理論研究,說到底了,如
網(wǎng)絡(luò)安全,圖形圖像學(xué),視頻音頻處理,哪個(gè)方向都與數(shù)學(xué)有著很大的關(guān)系,雖然也許
是正統(tǒng)數(shù)學(xué)家眼里非主流的數(shù)學(xué)。這里我還想闡明我的一個(gè)觀點(diǎn):我們都知道,數(shù)學(xué)是
從實(shí)際生活當(dāng)中抽象出來的理論,人們之所以要將實(shí)際抽象成理論,目的就在于想用抽
象出來的理論去更好的指導(dǎo)實(shí)踐,有些數(shù)學(xué)研究工作者喜歡用一些現(xiàn)存的理論知識(shí)去推
導(dǎo)若干條推論,殊不知其一:問題考慮不全很可能是個(gè)錯(cuò)誤的推論,其二:他的推論在
現(xiàn)實(shí)生活中找不到原型,不能指導(dǎo)實(shí)踐。嚴(yán)格的說,我并不是一個(gè)理想主義者,政治課
上學(xué)的理論聯(lián)系實(shí)際一直是指導(dǎo)我學(xué)習(xí)科學(xué)文化知識(shí)的航標(biāo)(至少我認(rèn)為搞計(jì)算機(jī)科學(xué)
與技術(shù)的應(yīng)當(dāng)本著這個(gè)方向)。
其實(shí)我們計(jì)算機(jī)系學(xué)數(shù)學(xué)光學(xué)高等數(shù)學(xué)是不夠的(典型的工科院校一般都開的
是高等數(shù)學(xué)),我們應(yīng)該像數(shù)學(xué)系一樣學(xué)一下數(shù)學(xué)分析(清華計(jì)算機(jī)系開的好像就是數(shù)
學(xué)分析),數(shù)學(xué)分析這門科學(xué),咱們學(xué)計(jì)算機(jī)的人對(duì)它有很復(fù)雜的感情。在于它是偏向
于證明型的數(shù)學(xué)課程,這對(duì)我們培養(yǎng)良好的分析能力極有幫助。我的軟件工程學(xué)導(dǎo)師北
工大數(shù)理學(xué)院的王儀華先生就曾經(jīng)教導(dǎo)過我們,數(shù)學(xué)系的學(xué)生到軟件企業(yè)中大多作軟件
設(shè)計(jì)與分析工作,而計(jì)算機(jī)系的學(xué)生做程序員的居多,原因就在于數(shù)學(xué)系的學(xué)生分析推
理能力,從所受訓(xùn)練的角度上要遠(yuǎn)遠(yuǎn)在我們之上。當(dāng)年出現(xiàn)的怪現(xiàn)象是:計(jì)算機(jī)系學(xué)生
的高中數(shù)學(xué)基礎(chǔ)在全校數(shù)一數(shù)二(希望沒有冒犯其它系的同學(xué)),教學(xué)課時(shí)數(shù)也僅次于數(shù)
學(xué)系,但學(xué)完之后的效果卻不盡如人意。難道都是學(xué)生不努力嗎,我看未見得,方向錯(cuò)
了也說不一定,其中原因何在,發(fā)人深思。
我個(gè)人的淺見是:計(jì)算機(jī)系的學(xué)生,對(duì)數(shù)學(xué)的要求固然跟數(shù)學(xué)系不同,跟物理類差別則
更大。通常非數(shù)學(xué)專業(yè)的所謂“高等數(shù)學(xué)”,無非是把數(shù)學(xué)分析中較困難的理論部分刪
去,強(qiáng)調(diào)套用公式計(jì)算而已。而對(duì)計(jì)算機(jī)系來說,數(shù)學(xué)分析里用處最大的恰恰是被刪去
的理論部分。說得難聽一點(diǎn),對(duì)計(jì)算機(jī)系學(xué)生而言,追求算來算去的所謂“工程數(shù)學(xué)”
已經(jīng)徹底地走進(jìn)了誤區(qū)。記上一堆曲面積分的公式,難道就能算懂了數(shù)學(xué)?那倒不如現(xiàn)
用現(xiàn)查,何必費(fèi)事記呢?再不然直接用Mathematics或是Matalab好了。
我在系里最愛做的事情就是給學(xué)弟學(xué)妹們推薦參考書。中文的數(shù)學(xué)分析書,一般都
認(rèn)為以北大張筑生老師的“數(shù)學(xué)分析新講”為最好。萬一你的數(shù)學(xué)實(shí)在太好,那就去看
菲赫金哥爾茨的“微積分學(xué)教程”好了--但我認(rèn)為沒什么必要,畢竟你不想轉(zhuǎn)到數(shù)學(xué)系
去。吉米多維奇的“數(shù)學(xué)分析習(xí)題集”也基本上是計(jì)算型的東東。書的名氣很大,倒不
見得適合我們,還是那句話,重要的是數(shù)學(xué)思想的建立,生活在信息社會(huì)里我們求的是
高效,計(jì)算這玩意還是留給計(jì)算機(jī)吧。不過現(xiàn)在多用的似乎是復(fù)旦大學(xué)的《數(shù)學(xué)分析》
也是很好的教材。
中國的所謂高等代數(shù),就等于線性代數(shù)加上一點(diǎn)多項(xiàng)式理論。我以為這有好的一面,因
為可以讓學(xué)生較早感覺到代數(shù)是一種結(jié)構(gòu),而非一堆矩陣翻來覆去。這里不得不提南京
大學(xué)林成森,盛松柏兩位老師編的“高等代數(shù)”,感覺相當(dāng)舒服。此書相當(dāng)全面地包含
了關(guān)于多項(xiàng)式和線性代數(shù)的基本初等結(jié)果,同時(shí)還提供了一些有用的又比較深刻的內(nèi)
容,如Sturm序列,Shermon-Morrison公式,廣義逆矩陣等等??梢哉f,作為本科生如能
吃透此書,就可以算高手。國內(nèi)較好的高等代數(shù)教材還有清華計(jì)算機(jī)系用的那本,清華
出版社出版,書店里多多,一看就知道。從抽象代數(shù)的觀點(diǎn)來看,高等代數(shù)里的結(jié)果不
過是代數(shù)系統(tǒng)性質(zhì)的一些例子而已。莫宗堅(jiān)先生的《代數(shù)學(xué)》里,對(duì)此進(jìn)行了深刻的討
論。然而莫先生的書實(shí)在深得很,作為本科生恐怕難以接受,不妨等到自己以后成熟了
一些再讀。
正如上面所論述的,計(jì)算機(jī)系的學(xué)生學(xué)習(xí)高等數(shù)學(xué):知其然更要知其所以然。你學(xué)習(xí)的
目的應(yīng)該是:將抽象的理論再應(yīng)用于實(shí)踐,不但要掌握題目的解題方法,更要掌握解題
思想,對(duì)于定理的學(xué)習(xí):不是簡單的應(yīng)用,而是掌握證明過程即掌握定理的由來,訓(xùn)練
自己的推理能力。只有這樣才達(dá)到了學(xué)習(xí)這門科學(xué)的目的,同時(shí)也縮小了我們與數(shù)學(xué)系
的同學(xué)之間思維上的差距。
概率論與數(shù)理統(tǒng)計(jì)這門課很重要,可惜大多數(shù)院校講授這門課都會(huì)少些東西。少了的東
西現(xiàn)在看至少有隨機(jī)過程。到畢業(yè)還沒有聽說過Markov過程,此乃計(jì)算機(jī)系學(xué)生的恥
辱。沒有隨機(jī)過程,你怎么分析網(wǎng)絡(luò)和分布式系統(tǒng)?怎么設(shè)計(jì)隨機(jī)化算法和協(xié)議?據(jù)說
清華計(jì)算機(jī)系開有“隨機(jī)數(shù)學(xué)”,早就是必修課。另外,離散概率論對(duì)計(jì)算機(jī)系學(xué)生來
說有特殊的重要性。而我們國家工程數(shù)學(xué)講的都是連續(xù)概率?,F(xiàn)在,美國已經(jīng)有些學(xué)校
開設(shè)了單純的“離散概率論”課程,干脆把連續(xù)概率刪去,把離散概率講深些。我們不
一定要這么做,但應(yīng)該更加強(qiáng)調(diào)離散概率是沒有疑問的。這個(gè)工作我看還是盡早的做為
好。
計(jì)算方法學(xué)(有些學(xué)校也稱為數(shù)學(xué)分析學(xué))是最后一門由數(shù)理學(xué)院給我們開的課。一般
學(xué)生對(duì)這門課的重視程度有限,以為沒什么用。不就是照套公式嘛!其實(shí),做圖形圖像
可離不開它,密碼學(xué)搞深了也離不開它。而且,在很多科學(xué)工程中的應(yīng)用計(jì)算,都以數(shù)
值的為主。這門課有兩個(gè)極端的講法:一個(gè)是古典的“數(shù)值分析”,完全講數(shù)學(xué)原理和
算法;另一個(gè)是現(xiàn)在日趨流行的“科學(xué)與工程計(jì)算”,干脆教學(xué)生用軟件包編程。我個(gè)
人認(rèn)為,計(jì)算機(jī)系的學(xué)生一定要認(rèn)識(shí)清楚我們計(jì)算機(jī)系的學(xué)生為什么要學(xué)這門課,我是
很偏向于學(xué)好理論后用計(jì)算機(jī)實(shí)現(xiàn)的,最好使用C語言或C++編程實(shí)現(xiàn)。向這個(gè)方向努力
的書籍還是挺多的,這里推薦大家高等教育出版社(CHEP)和施普林格出版社
(Springer)聯(lián)合出版的《計(jì)算方法(Computational Methods)》,華中理工大學(xué)數(shù)學(xué)系
寫的(現(xiàn)華中科技大學(xué)),這方面華科大做的工作在國內(nèi)應(yīng)算是比較多的,而個(gè)人認(rèn)為
以這本最好,至少程序設(shè)計(jì)方面涉及了:任意數(shù)學(xué)函數(shù)的求值,方程求根,線性方程組
求解,插值方法,數(shù)值積分,場微分方程數(shù)值求解。李慶揚(yáng)的那本則理論性過強(qiáng),與實(shí)
際應(yīng)用結(jié)合得不太緊。
每個(gè)學(xué)校本系里都會(huì)開一門離散數(shù)學(xué),涉及集合論,圖論,和抽象代數(shù),數(shù)理邏輯。不
過,這么多內(nèi)容擠在離散數(shù)學(xué)一門課里,是否時(shí)間太緊了點(diǎn)?另外,計(jì)算機(jī)系學(xué)生不懂
組合和數(shù)論,也是巨大的缺陷。要做理論,不懂組合或者數(shù)論吃虧可就太大了。從理想
的狀態(tài)來看,最好分開六門課:集合,邏輯,圖論,組合,代數(shù),數(shù)論。這個(gè)當(dāng)然不現(xiàn)
實(shí),因?yàn)闆]那么多課時(shí)。也許將來可以開三門課:集合與邏輯,圖論與組合,代數(shù)與數(shù)
論。(這方面我們學(xué)校已經(jīng)著手開始做了)不管課怎么開,學(xué)生總一樣要學(xué)。下面分別
談?wù)勆厦娴娜M內(nèi)容。
古典集合論,北師大出過一本《基礎(chǔ)集合論》不錯(cuò)。 數(shù)理邏輯,中科院軟件所陸鐘萬教
授的《面向計(jì)算機(jī)科學(xué)的數(shù)理邏輯》就不錯(cuò)。現(xiàn)在可以找到陸鐘萬教授的講課錄像,
http://www.cas.ac.cn/html/Dir/2001/11/06/3391.htm自己去看看吧??偟膩碚f,學(xué)集
合/邏輯起手不難,普通高中生都能看懂。但越往后越感覺深不可測。
學(xué)完以上各書之后,如果你還有精力興趣進(jìn)一步深究,那么可以試一下GTM系列中的
《Introduction to Axiomatic Set Theory》和《A Course of Mathematical
Logic》。這兩本都有世界圖書出版社的引進(jìn)版。你如果能搞定這兩本,可以說在邏輯方
面真正入了門,也就不用再浪費(fèi)時(shí)間聽我瞎侃了。
據(jù)說全中國最多只有三十個(gè)人懂圖論。此言不虛。圖論這東東,技巧性太強(qiáng),幾乎每個(gè)
問題都有一個(gè)獨(dú)特的方法,讓人頭痛。不過這也正是它魅力所在:只要你有創(chuàng)造性,它
就能給你成就感。我的導(dǎo)師說,圖論里面隨便揪一塊東西就可以寫篇論文。大家可以體
會(huì)里面內(nèi)容之深廣了吧!國內(nèi)的圖論書中,王樹禾老師的“圖論及其算法”非常成功。
一方面,其內(nèi)容在國內(nèi)教材里算非常全面的。另一方面,其對(duì)算法的強(qiáng)調(diào)非常適合計(jì)算
機(jī)系(本來就是科大計(jì)算機(jī)系教材)。有了這本書為主,再參考幾本翻譯的,如Bondy &
Murty的《圖論及其應(yīng)用》,人民郵電出版社翻譯的《圖論和電路網(wǎng)絡(luò)》等等,就馬馬虎
虎,對(duì)本科生足夠了。再進(jìn)一步,世界圖書引進(jìn)有GTM系列的"Modern Graph Theory"。
此書確實(shí)經(jīng)典!國內(nèi)好象還有一家出版了個(gè)翻譯版。不過,學(xué)到這個(gè)層次,還是讀原版
好。搞定這本書,也標(biāo)志著圖論入了門。
離散數(shù)學(xué)方面我們北京工業(yè)大學(xué)實(shí)驗(yàn)學(xué)院有個(gè)世界級(jí)的專家,叫邵學(xué)才,復(fù)旦大學(xué)概率
論畢業(yè)的,教過高等數(shù)學(xué),線性代數(shù),概率論,最后轉(zhuǎn)向離散數(shù)學(xué),出版著作無數(shù),論
文集新加坡有一本,堪稱經(jīng)典,大家想學(xué)離散數(shù)學(xué)的真諦不妨找來看看。這老師的課我
專門去聽過,極為經(jīng)典。不過你要從他的不經(jīng)意的話中去挖掘精髓。在同他的交談當(dāng)中
我又深刻地發(fā)現(xiàn)一個(gè)問題,雖說邵先生寫書無數(shù),但依他自己的說法每本都差不多,我
實(shí)在覺得詫異,他說主要是有大綱的限制,不便多寫。這就難怪了,很少聽說國外寫書
還要依據(jù)個(gè)什么大綱(就算有,內(nèi)容也寬泛的多),不敢越雷池半步,這樣不是看誰的
都一樣了。外版的書好就好在這里,最新的科技成果里面都有論述,別的先不說,至少
是“緊跟時(shí)代的理論知識(shí)”。
組合感覺沒有太適合的國產(chǎn)書。還是讀Graham和Knuth等人合著的經(jīng)典“具體數(shù)學(xué)”吧,
西安電子科技大學(xué)出版社有翻譯版。 抽象代數(shù),國內(nèi)經(jīng)典為莫宗堅(jiān)先生的“代數(shù)學(xué)”。
此書是北大數(shù)學(xué)系教材,深得好評(píng)。然而對(duì)本科生來說,此書未免太深??梢韵葘W(xué)習(xí)一
些其它的教材,然后再回頭來看“代數(shù)學(xué)”。國際上的經(jīng)典可就多了,GTM系列里就有一
大堆。推薦一本談不上經(jīng)典,但卻最簡
單的,最容易學(xué)的:http://www.math.miami.edu/~ec/book/這本“Introduction to
Linear and Abstract Algebra"非常通俗易懂,而且把抽象代數(shù)和線性代數(shù)結(jié)合起來,
對(duì)初學(xué)者來說非常理想,我校比較牛的同學(xué)都有收藏。
數(shù)論方面,國內(nèi)有經(jīng)典而且以困難著稱的”初等數(shù)論“(潘氏兄弟著,北大版)。再追溯
一點(diǎn),還有更加經(jīng)典(可以算世界級(jí))并且更加困難的”數(shù)論導(dǎo)引“(華羅庚先生的名著,
科學(xué)版,九章書店重印,繁體的看起來可能比較困難)。把基礎(chǔ)的幾章搞定一個(gè)大概,對(duì)
本科生來講足夠了。但這只是初等數(shù)論。本科畢業(yè)后要學(xué)計(jì)算數(shù)論,你必須看英文的
書,如Bach的"Introduction to Algorithmic Number Theory"。
計(jì)算機(jī)科學(xué)理論的根本,在于算法。現(xiàn)在很多系里給本科生開設(shè)算法設(shè)計(jì)與分析,確實(shí)
非常正確。環(huán)顧西方世界,大約沒有一個(gè)三流以上計(jì)算機(jī)系不把算法作為必修的。算法
教材目前公認(rèn)以Corman等著的"Introduction to Algorithms"為最優(yōu)。對(duì)入門而言,這
一本已經(jīng)足夠,不需要再參考其它書。
再說說形式語言與自動(dòng)機(jī)。我看過北郵的教材,應(yīng)該說寫的還清楚。但是,有一點(diǎn)要強(qiáng)
調(diào):形式語言和自動(dòng)機(jī)的作用主要在作為計(jì)算模型,而不是用來做編譯。事實(shí)上,編譯
前端已經(jīng)是死領(lǐng)域,沒有任何open problems,北科大的班曉娟博士也曾經(jīng)說過,編譯的
技術(shù)已相當(dāng)成熟。如果為了這個(gè),我們完全沒必要去學(xué)形式語言--用用yacc什么的就完
了。北郵的那本在國內(nèi)還算比較好,但是在深度上,在跟可計(jì)算性的聯(lián)系上都有較大的
局限,現(xiàn)代感也不足。所以建議有興趣的同學(xué)去讀英文書,不過國內(nèi)似乎沒引進(jìn)這方面
的教材。可以去互動(dòng)出版網(wǎng)上看一看。入門以后,把形式語言與自動(dòng)機(jī)中定義的模型,
和數(shù)理邏輯中用遞歸函數(shù)定義的模型比較一番,可以說非常有趣?,F(xiàn)在才知道,什么叫
“宮室之美,百官之富”!
計(jì)算機(jī)科學(xué)和數(shù)學(xué)的關(guān)系有點(diǎn)奇怪。二三十年以前,計(jì)算機(jī)科學(xué)基本上還是數(shù)學(xué)的一個(gè)
分支。而現(xiàn)在,計(jì)算機(jī)科學(xué)擁有廣泛的研究領(lǐng)域和眾多的研究人員,在很多方面反過來
推動(dòng)數(shù)學(xué)發(fā)展,從某種意義上可以說是孩子長得比媽媽還高了。但不管怎么樣,這個(gè)孩
子身上始終流著母親的血液。這血液是the mathematical underpinning of computer
science(計(jì)算機(jī)科學(xué)的數(shù)學(xué)基礎(chǔ)),也就是理論計(jì)算機(jī)科學(xué)。原來在東方大學(xué)城圖書館中
曾經(jīng)看過一本七十年代的譯本(書皮都沒了,可我就愛關(guān)注這種書),大概就叫《計(jì)算
機(jī)數(shù)學(xué)》。那本書若是放在當(dāng)時(shí)來講決是一本好書,但現(xiàn)在看來,涵蓋的范圍還算廣,
深度則差了許多,不過推薦大一的學(xué)生倒可以看一看,至少可以使你的計(jì)算數(shù)學(xué)入入
門。
最常和理論計(jì)算機(jī)科學(xué)放在一起的一個(gè)詞是什么?答:離散數(shù)學(xué)。這兩者的關(guān)系是如此
密切,以至于它們在不少場合下成為同義詞。(這一點(diǎn)在前面的那本書中也有體現(xiàn))傳
統(tǒng)上,數(shù)學(xué)是以分析為中心的。數(shù)學(xué)系的同學(xué)要學(xué)習(xí)三四個(gè)學(xué)期的數(shù)學(xué)分析,然后是復(fù)
變函數(shù),實(shí)變函數(shù),泛函數(shù)等等。實(shí)變和泛函被很多人認(rèn)為是現(xiàn)代數(shù)學(xué)的入門。在物
理,化學(xué),工程上應(yīng)用的,也以分析為主。
隨著計(jì)算機(jī)科學(xué)的出現(xiàn),一些以前不太受到重視的數(shù)學(xué)分支突然重要起來。人們發(fā)現(xiàn),
這些分支處理的數(shù)學(xué)對(duì)象與傳統(tǒng)的分析有明顯的區(qū)別:分析研究的問題解決方案是連續(xù)
的,因而微分,積分成為基本的運(yùn)算;而這些分支研究的對(duì)象是離散的,因而很少有機(jī)
會(huì)進(jìn)行此類的計(jì)算。人們從而稱這些分支為“離散數(shù)學(xué)”。“離散數(shù)學(xué)”的名字越來越
響亮,最后導(dǎo)致以分析為中心的傳統(tǒng)數(shù)學(xué)分支被相對(duì)稱為“連續(xù)數(shù)學(xué)”。
離散數(shù)學(xué)經(jīng)過幾十年發(fā)展,基本上穩(wěn)定下來。一般認(rèn)為,離散數(shù)學(xué)包含以下學(xué)科:
1) 集合論,數(shù)理邏輯與元數(shù)學(xué)。這是整個(gè)數(shù)學(xué)的基礎(chǔ),也是計(jì)算機(jī)科學(xué)的基礎(chǔ)。
2) 圖論,算法圖論;組合數(shù)學(xué),組合算法。計(jì)算機(jī)科學(xué),尤其是理論計(jì)算機(jī)科學(xué)的核心
是
算法,而大量的算法建立在圖和組合的基礎(chǔ)上。
3) 抽象代數(shù)。代數(shù)是無所不在的,本來在數(shù)學(xué)中就非常重要。在計(jì)算機(jī)科學(xué)中,人們驚
訝地發(fā)現(xiàn)代數(shù)竟然有如此之多的應(yīng)用。
但是,理論計(jì)算機(jī)科學(xué)僅僅就是在數(shù)學(xué)的上面加上“離散”的帽子這么簡單嗎?一直到
大約十幾年前,終于有一位大師告訴我們:不是。D.E.Knuth(他有多偉大,我想不用我
廢話了)在Stanford開設(shè)了一門全新的課程Concrete Mathematics。 Concrete這個(gè)詞在
這里有兩層含義:
首先:對(duì)abstract而言。Knuth認(rèn)為,傳統(tǒng)數(shù)學(xué)研究的對(duì)象過于抽象,導(dǎo)致對(duì)具體的問題
關(guān)心不夠。他抱怨說,在研究中他需要的數(shù)學(xué)往往并不存在,所以他只能自己去創(chuàng)造一
些數(shù)學(xué)。為了直接面向應(yīng)用的需要,他要提倡“具體”的數(shù)學(xué)。在這里我做一點(diǎn)簡單的
解釋。例如在集合論中,數(shù)學(xué)家關(guān)心的都是最根本的問題--公理系統(tǒng)的各種性質(zhì)之類。
而一些具體集合的性質(zhì),各種常見集合,關(guān)系,映射都是什么樣的,數(shù)學(xué)家覺得并不重
要。然而,在計(jì)算機(jī)科學(xué)中應(yīng)用的,恰恰就是這些具體的東西。Knuth能夠首先看到這一
點(diǎn),不愧為當(dāng)世計(jì)算機(jī)第一人。其次,Concrete是Continuous(連續(xù))加上discrete(離
散)。不管連續(xù)數(shù)學(xué)還是離散數(shù)學(xué),都是有用的數(shù)學(xué)!
理論與實(shí)際的結(jié)合——計(jì)算機(jī)科學(xué)研究的范疇
前面主要是從數(shù)學(xué)角度來看的。從計(jì)算機(jī)角度來看,理論計(jì)算機(jī)科學(xué)目前主要的研
究領(lǐng)域包括:可計(jì)算性理論,算法設(shè)計(jì)與復(fù)雜性分析,密碼學(xué)與信息安全,分布式計(jì)算
理論,并行計(jì)算理論,網(wǎng)絡(luò)理論,生物信息計(jì)算,計(jì)算幾何學(xué),程序語言理論等等。這
些領(lǐng)域互相交叉,而且新的課題在不斷提出,所以很難理出一個(gè)頭緒來。想搞搞這方面
的工作,推薦看中國計(jì)算機(jī)學(xué)會(huì)的一系列書籍,至少代表了我國的權(quán)威。下面隨便舉一
些例子。
由于應(yīng)用需求的推動(dòng),密碼學(xué)現(xiàn)在成為研究的熱點(diǎn)。密碼學(xué)建立在數(shù)論(尤其是計(jì)算
數(shù)論),代數(shù),信息論,概率論和隨機(jī)過程的基礎(chǔ)上,有時(shí)也用到圖論和組合學(xué)等。很多
人以為密碼學(xué)就是加密解密,而加密就是用一個(gè)函數(shù)把數(shù)據(jù)打亂。這樣的理解太淺顯
了。
現(xiàn)代密碼學(xué)至少包含以下層次的內(nèi)容:
第一,密碼學(xué)的基礎(chǔ)。例如,分解一個(gè)大數(shù)真的很困難嗎?能否有一般的工具證明協(xié)議
正確?
第二,密碼學(xué)的基本課題。例如,比以前更好的單向函數(shù),簽名協(xié)議等。
第三,密碼學(xué)的高級(jí)問題。例如,零知識(shí)證明的長度,秘密分享的方法。
第四,密碼學(xué)的新應(yīng)用。例如,數(shù)字現(xiàn)金,叛徒追蹤等。
在分布式系統(tǒng)中,也有很多重要的理論問題。例如,進(jìn)程之間的同步,互斥協(xié)議。一個(gè)
經(jīng)典的結(jié)果是:在通信信道不可靠時(shí),沒有確定型算法能實(shí)現(xiàn)進(jìn)程間協(xié)同。所以,改進(jìn)
TCP三次握手幾乎沒有意義。例如時(shí)序問題。常用的一種序是因果序,但因果序直到不久
前才有一個(gè)理論上的結(jié)果....例如,死鎖沒有實(shí)用的方法能完美地對(duì)付。例如,......操
作系統(tǒng)研究過就自己去舉吧!
如果計(jì)算機(jī)只有理論,那么它不過是數(shù)學(xué)的一個(gè)分支,而不成為一門獨(dú)立的科學(xué)。
事實(shí)上,在理論之外,計(jì)算機(jī)科學(xué)還有更廣闊的天空。
我一直認(rèn)為,4年根本不夠?qū)W習(xí)計(jì)算機(jī)的基礎(chǔ)知識(shí),因?yàn)槊嫣珜捔?.....
這方面我想先說說我們系在各校普遍開設(shè)的《計(jì)算機(jī)基礎(chǔ)》。在高等學(xué)校開設(shè)《計(jì)
算機(jī)基礎(chǔ)課程》是我國高教司明文規(guī)定的各專業(yè)必修課程要求。主要內(nèi)容是使學(xué)生初步
掌握計(jì)算機(jī)的發(fā)展歷史,學(xué)會(huì)簡單的使用操作系統(tǒng),文字處理,表格處理功能和初步的
網(wǎng)絡(luò)應(yīng)用功能。但是在計(jì)算機(jī)科學(xué)系教授此門課程的目標(biāo)決不能與此一致。在計(jì)算機(jī)系
課程中目標(biāo)應(yīng)是:讓學(xué)生較為全面的了解計(jì)算機(jī)學(xué)科的發(fā)展,清晰的把握計(jì)算機(jī)學(xué)科研
究的方向,發(fā)展的前沿即每一個(gè)課程在整個(gè)學(xué)科體系中所處的地位。搞清各學(xué)科的學(xué)習(xí)
目的,學(xué)習(xí)內(nèi)容,應(yīng)用領(lǐng)域。使學(xué)生在學(xué)科學(xué)習(xí)初期就對(duì)整個(gè)學(xué)科有一個(gè)整體的認(rèn)識(shí),
以做到在今后的學(xué)習(xí)中清楚要學(xué)什么,怎么學(xué)。計(jì)算機(jī)基本應(yīng)用技能的位置應(yīng)當(dāng)放在第
二位或更靠后,因?yàn)檫@一點(diǎn)對(duì)于本系的學(xué)生應(yīng)當(dāng)有這個(gè)摸索能力。這一點(diǎn)很重要。推薦
給大家一本書:機(jī)械工業(yè)出版社的《計(jì)算機(jī)文化》(New Perspective of Computer
Science),看了這本書我才深刻的體會(huì)到自己還是個(gè)計(jì)算機(jī)科學(xué)初學(xué)者,才比較透徹的
了解了什么是計(jì)算機(jī)科學(xué)。另外在廈門大學(xué)趙致琢老師的著作《計(jì)算科學(xué)導(dǎo)論》當(dāng)中的
很多經(jīng)典理論都是在同類書籍中很難找到的??纯此苍S你才會(huì)明白一個(gè)最基本的問
題:為什么計(jì)算機(jī)科學(xué)叫計(jì)算科學(xué)更為準(zhǔn)確。這本書在世界上也可成為精品級(jí)的著作。
一個(gè)一流計(jì)算機(jī)系的優(yōu)秀學(xué)生決不該僅僅是一個(gè)編程高手,但他一定首先是一個(gè)編程高
手。我上大學(xué)的時(shí)候,第一門專業(yè)課是C語言程序設(shè)計(jì),念計(jì)算機(jī)的人從某種角度講相當(dāng)
一部分人是靠寫程序吃飯的。在我們北京工業(yè)大學(xué)實(shí)驗(yàn)學(xué)院計(jì)算機(jī)系里一直有這樣的爭
論(時(shí)至今日CSDN上也有),關(guān)于第一程序設(shè)計(jì)語言該用哪一種。我個(gè)人認(rèn)為,用哪種
語言屬于末節(jié),關(guān)鍵在養(yǎng)成良好的編程習(xí)慣。當(dāng)年老師對(duì)我們說,打好基礎(chǔ)后學(xué)一門新
語言只要一個(gè)星期?,F(xiàn)在我覺得根本不用一個(gè)星期,前提是先把基礎(chǔ)打好。不要再猶豫
了,學(xué)了再說,等你抉擇好了,別人已經(jīng)會(huì)了幾門語言了。
匯編語言和微機(jī)原理是兩門特?zé)┤说恼n。你的數(shù)學(xué)/理論基礎(chǔ)再好,也占不到什么便宜。
這兩門課之間的次序也好比先有雞還是先有蛋,無論你先學(xué)哪門,都會(huì)牽扯另一門課里
的東西。所以,只能靜下來慢慢琢磨。這就是典型的工程課,不需要太多的聰明和頓
悟,卻需要水滴石穿的漸悟。有關(guān)這兩門課的書,計(jì)算機(jī)書店里不難找到。弄幾本最新
的,對(duì)照著看吧。組成原理推薦《計(jì)算機(jī)組成與結(jié)構(gòu)》清華大學(xué)王愛英教授寫的。匯編
語言大家拿8086/8088入個(gè)門,之后一定要學(xué)80x86匯編語言。實(shí)用價(jià)值大,不落后,結(jié)
構(gòu)又好,寫寫高效病毒,高級(jí)語言里嵌一點(diǎn)匯編,進(jìn)行底層開發(fā),總也離不開他,推薦
清華大學(xué)沈美明的《IBM—PC匯編語言程序設(shè)計(jì)》。有些人說不想了解計(jì)算機(jī)體系結(jié)構(gòu),
也不想制造計(jì)算機(jī),所以諸如計(jì)算機(jī)原理,匯編語言,接口之類的課覺得沒必要學(xué),這
樣合理嗎?顯然不合理,這些東西遲早得掌握,肯定得接觸,而且,這是計(jì)算機(jī)專業(yè)與
其他專業(yè)學(xué)生相比的少有的幾項(xiàng)優(yōu)勢。做項(xiàng)目的時(shí)候,了解這些是非常重要的,不可能
說,僅僅為了技術(shù)而技術(shù),只懂技術(shù)的人最多做一個(gè)編碼工人,而永遠(yuǎn)不可能全面地了
解整個(gè)系統(tǒng)的設(shè)計(jì),而編碼工人是越老越不值錢。關(guān)于組成原理還有個(gè)講授的問題,在
我學(xué)這門課程時(shí)老師講授時(shí)把CPU工作原理譽(yù)微程序設(shè)計(jì)這一塊略掉了,理由是我們國家
搞CPU技術(shù)不如別的國家,搞了這么長時(shí)間好不容易出了個(gè)龍芯比Intel的還差個(gè)十萬八
千里,所以建議我們不要學(xué)了。我看這在各校也未見得不是個(gè)問題吧!若真是如他所
說,那中國的計(jì)算機(jī)科學(xué)哪個(gè)方向都可以停了,軟硬件,應(yīng)用,有幾項(xiàng)搞得過美國,搞
不過別人就不搞了,那我們坐在這里干什么?教學(xué)的觀念需要轉(zhuǎn)變的。
模擬電路這東東,如今不僅計(jì)算機(jī)系學(xué)生搞不定,電子系學(xué)生也多半害怕。如果你真想
軟硬件通吃,那么建議你先看看邱關(guān)源的“電路原理”,也許此后再看模擬電路底氣會(huì)
足些。教材:康華光的“電子技術(shù)基礎(chǔ)”(高等教育出版社)還是不錯(cuò)的(我校電子系
在用)。有興趣也可以參考童詩白的書。
數(shù)字電路比模擬電路要好懂得多。推薦大家看一看我們北工大劉英嫻教授寫的《數(shù)字邏
輯》業(yè)績?nèi)耸慷颊f這本書很有參考價(jià)值(機(jī)械工業(yè)出版社的)。原因很明了,實(shí)用價(jià)值
高,能聽聽她講授的課程更是有一種“享受科學(xué)”的感覺。清華大學(xué)閻石的書也算一本
好教材,遺憾的一點(diǎn)是集成電路講少了些。真有興趣,看一看大規(guī)模數(shù)字系統(tǒng)設(shè)計(jì)吧
(北航那本用的還比較多)。
計(jì)算機(jī)系統(tǒng)結(jié)構(gòu)該怎么教,國際上還在爭論。國內(nèi)能找到的較好教材為Stallings
的"Computer Organization and Architectureesigning for Performance"(清華影印
本)。國際上最流行的則是“Computer architecture: aquantitative approach", by
Patterson & Hennessy。
操作系統(tǒng)可以隨便選用《操作系統(tǒng)的內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》和《現(xiàn)代操作系統(tǒng)》兩書之
一。這兩部都可以算經(jīng)典,唯一缺點(diǎn)就是理論上不夠嚴(yán)格。不過這領(lǐng)域?qū)儆贖ardcore
System,所以在理論上馬虎一點(diǎn)也情有可原。想看理論方面的就推薦清華大學(xué)出版社《操
作系統(tǒng)》吧,高教司司長張堯?qū)W寫的,我們教材用的是那本。 另外推薦一本《Windows
操作系統(tǒng)原理》機(jī)械工業(yè)出版社的,這本書是我國操作系統(tǒng)專家在微軟零距離考察半
年,寫作歷時(shí)一年多寫成的,教操作系統(tǒng)的專家除了清華大學(xué)的張堯?qū)W(現(xiàn)高教司司
長)幾乎所有人都參加了。Bill Gates親自寫序。里面不但結(jié)合windows2000,xp詳述操
作系統(tǒng)的內(nèi)核,而且后面講了一些windows編程基礎(chǔ),有外版書的味道,而且上面一些內(nèi)
容可以說在國內(nèi)外只有那本書才有對(duì)windows內(nèi)核細(xì)致入微的介紹,
如果先把形式語言學(xué)好了,則編譯原理中的前端我看只要學(xué)四個(gè)算法:最容易實(shí)現(xiàn)
的遞歸下降;最好的自頂向下算法LL(k);最好的自底向上算法LR(k);LR(1)的簡化SLR
(也許還有另一簡化LALR)。后端完全屬于工程性質(zhì),自然又是another story。
推薦教材:Kenneth C.Louden寫的“Compiler Construction Principles and
Practice”即是《編譯原理及實(shí)踐》(機(jī)械工業(yè)出版社的譯本)
學(xué)數(shù)據(jù)庫要提醒大家的是,會(huì)用VFP,VB, Power builder不等于懂?dāng)?shù)據(jù)庫。(這世界
上自以為懂?dāng)?shù)據(jù)庫的人太多了!)數(shù)據(jù)庫設(shè)計(jì)既是科學(xué)又是藝術(shù),數(shù)據(jù)庫實(shí)現(xiàn)則是典型的
工程。所以從某種意義上講,數(shù)據(jù)庫是最典型的一門計(jì)算機(jī)課程——理工結(jié)合,互相滲
透。另外推薦大家學(xué)完軟件工程學(xué)后再翻過來看看數(shù)據(jù)庫技術(shù),又會(huì)是一番新感覺。推
薦教材:Abraham Silberschatz等著的 "Database System Concepts".作為知識(shí)的完整
性,還推薦大家看一看機(jī)械工業(yè)出版社的《數(shù)據(jù)倉庫》譯本。
計(jì)算機(jī)網(wǎng)絡(luò)的標(biāo)準(zhǔn)教材還是來自Tanenbaum的《Computer Networks》(清華大學(xué)有譯
本)。還有就是推薦謝希仁的《計(jì)算機(jī)網(wǎng)絡(luò)教程》(人民郵電出版社)問題講得比較清
楚,參考文獻(xiàn)也比較權(quán)威。不過,網(wǎng)絡(luò)也屬于Hardcore System,所以光看書是不夠的。
建議多讀RFC,http://www.ietf.org/rfc.htm里可以按編號(hào)下載RFC文檔。從IP的讀起。
等到能掌握10種左右常用協(xié)議,就沒有幾個(gè)人敢小看你了。再做的工作我看放在網(wǎng)絡(luò)設(shè)
計(jì)上就比較好了。
數(shù)據(jù)結(jié)構(gòu)的重要性就不言而喻了,學(xué)完數(shù)據(jù)結(jié)構(gòu)你會(huì)對(duì)你的編程思想進(jìn)行一番革命性的
洗禮,會(huì)對(duì)如何建立一個(gè)合理高效的算法有一個(gè)清楚的認(rèn)識(shí)。對(duì)于算法的建立我想大家
應(yīng)當(dāng)注意以下幾點(diǎn):
當(dāng)遇到一個(gè)算法問題時(shí),首先要知道自己以前有沒有處理過這種問題.如果見過,那么你一
般會(huì)順利地做出來;如果沒見過,那么考慮以下問題:
1. 問題是否是建立在某種已知的熟悉的數(shù)據(jù)結(jié)構(gòu)(例如,二叉樹)上?如果不是,則要自己
設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)。
2. 問題所要求編寫的算法屬于以下哪種類型?(建立數(shù)據(jù)結(jié)構(gòu),修改數(shù)據(jù)結(jié)構(gòu),遍歷,查找,
排序...)
3. 分析問題所要求編寫的算法的數(shù)學(xué)性質(zhì).是否具備遞歸特征?(對(duì)于遞歸程序設(shè)計(jì),只要
設(shè)計(jì)出合理的參數(shù)表以及遞歸結(jié)束的條件,則基本上大功告成.)
4. 繼續(xù)分析問題的數(shù)學(xué)本質(zhì).根據(jù)你以前的編程經(jīng)驗(yàn),設(shè)想一種可能是可行的解決辦法,
并證明這種解決辦法的正確性.如果題目對(duì)算法有時(shí)空方面的要求,證明你的設(shè)想滿足其
要求.一般的,時(shí)間效率和空間效率難以兼得.有時(shí)必須通過建立輔助存儲(chǔ)的方法來節(jié)省時(shí)
間.
5. 通過一段時(shí)間的分析,你對(duì)解決這個(gè)問題已經(jīng)有了自己的一些思路.或者說,你已經(jīng)可
以用自然語言把你的算法簡單描述出來.繼續(xù)驗(yàn)證其正確性,努力發(fā)現(xiàn)其中的錯(cuò)誤并找出
解決辦法.在必要的時(shí)候(發(fā)現(xiàn)了無法解決的矛盾),推翻自己的思路,從頭開始構(gòu)思.
6. 確認(rèn)你的思路可行以后,開始編寫程序.在編寫代碼的過程中,盡可能把各種問題考慮
得詳細(xì),周密.程序應(yīng)該具有良好的結(jié)構(gòu),并且在關(guān)鍵的地方配有注釋.
7. 舉一個(gè)例子,然后在紙上用筆執(zhí)行你的程序,進(jìn)一步驗(yàn)證其正確性.當(dāng)遇到與你的設(shè)想
不符的情況時(shí),分析問題產(chǎn)生的原因是編程方面的問題還是算法思想本身有問題.
8. 如果程序通過了上述正確性驗(yàn)證,那么在將其進(jìn)一步優(yōu)化或簡化。
9. 撰寫思路分析,注釋.
對(duì)于具體的算法思路,只能靠你自己通過自己的知識(shí)和經(jīng)驗(yàn)來加以獲得,沒有什么特定的
規(guī)律(否則程序員全部可以下崗了,用機(jī)器自動(dòng)生成代碼就可以了).要有豐富的想象力,就
是說當(dāng)一條路走不通時(shí),不要鉆牛角尖,要敢于推翻自己的想法.我也只不過是初學(xué)者,說
出上面的一些經(jīng)驗(yàn),僅供大家參考和討論。
關(guān)于人工智能,我覺得的也是非常值得大家仔細(xì)研究的,雖然不能算是剛剛興起的
學(xué)科了,但是絕對(duì)是非常有發(fā)展前途的一門學(xué)科。我國人工智能創(chuàng)始人之一,北京科技
大學(xué)涂序彥教授(這老先生是我的導(dǎo)師李小堅(jiān)博士的導(dǎo)師)對(duì)人工智能這樣定義:人工
智能是模仿、延伸和擴(kuò)展人與自然的智能的技術(shù)科學(xué)。在美國人工智能官方教育網(wǎng)站上
對(duì)人工智能作了如下定義:Artificial Intelligence, or AI for short, is a
combination of computer science, physiology, and philosophy. AI is a broad
topic, consisting of different fields, from machine vision to expert
systems. The element that the fields of AI have in common is the creation of
machines that can "think".
這門學(xué)科研究的問題大概說有:
(1)符號(hào)主義: 符號(hào)計(jì)算與程序設(shè)計(jì)基礎(chǔ),知識(shí)表達(dá)方法 :知識(shí)與思維,產(chǎn)生式規(guī)
則,語意網(wǎng)絡(luò),一階謂詞邏輯問題求解方法:搜索策略,啟發(fā)式搜尋,搜尋算法,問題
規(guī)約方法,謂詞演算:歸結(jié)原理,歸結(jié)過程專家系統(tǒng):建立專家系統(tǒng)的方法及工具
(2)聯(lián)接主義(神經(jīng)網(wǎng)絡(luò)學(xué)派):1988年美國權(quán)威機(jī)構(gòu)指出:數(shù)據(jù)庫,網(wǎng)絡(luò)發(fā)展呈直線
上升,神經(jīng)網(wǎng)絡(luò)可能是解決人工智能的唯一途徑。
我想對(duì)于人工智能的學(xué)習(xí),大家一定不要像學(xué)數(shù)學(xué)似的及一些現(xiàn)成的結(jié)論,要學(xué)會(huì)分
析問題,最好能利用程序設(shè)計(jì)實(shí)現(xiàn),這里推薦給大家ACM最佳博士論文獎(jiǎng)獲得者涂曉媛博
士的著作《人工魚—計(jì)算機(jī)動(dòng)畫的人工生命方法》(清華大學(xué)出版社)。搞人工生命的
同學(xué)不會(huì)不知道國際知名的涂氏父女吧。關(guān)于人工智能的書當(dāng)然首選《Artificial
Intelligence A New Synthesis》Nils J.Nilsson.鼻祖嘛!
關(guān)于網(wǎng)絡(luò)安全我也想在這里說兩句,隨著計(jì)算機(jī)技術(shù)的發(fā)展,整個(gè)社會(huì)的信息化水平突
飛猛進(jìn),計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)日新月異,網(wǎng)絡(luò)成了當(dāng)即社會(huì)各個(gè)工作領(lǐng)域不可缺少的組成部
分,只要有網(wǎng)絡(luò)存在,網(wǎng)絡(luò)安全問題就是一個(gè)必須解決好的問題,學(xué)習(xí)網(wǎng)絡(luò)安全不是簡
簡單單的收集一些黑客工具黑一黑別人的網(wǎng)站,而是要學(xué)習(xí)他的數(shù)學(xué)原理,實(shí)現(xiàn)原理,
搞清底層工作機(jī)制,這樣才能解決大部分的現(xiàn)有問題和新出現(xiàn)的安全問題。
關(guān)于計(jì)算機(jī)科學(xué)的一些邊緣科學(xué)我想談一談軟件工程技術(shù),對(duì)于一個(gè)企業(yè),推出軟件是
不是就是幾個(gè)程序員坐在一起,你寫一段程序,我寫一段程序呢?顯然不是。軟件工程
是典型的計(jì)算機(jī)科學(xué)和數(shù)學(xué),管理科學(xué),心理學(xué),社會(huì)學(xué)等學(xué)科的綜合。它使我們這些
搞理論和技術(shù)的人進(jìn)入了一個(gè)社會(huì)。你所要考慮的不僅僅是程序的優(yōu)劣,更應(yīng)該考慮程
序與軟件的區(qū)別,軟件與軟件產(chǎn)品的區(qū)別,軟件軟件產(chǎn)品的市場前景,如何去更好的與
人交流。這方面我還在學(xué)習(xí)階段,以后這方面再寫文章吧,先推薦給大家?guī)妆緯簳充N
20年不衰的《人月神話》(清華大學(xué)中文版,中國電力出版社影印版),《軟件工程-實(shí)
踐者研究的方法》(機(jī)械工業(yè)出版社譯本),《人件》(據(jù)說每一位微軟公司的部門經(jīng)
理都讀過這本書,推薦老總們和想當(dāng)老總的同學(xué)都看看,了解一下什么是軟件企業(yè)中的
人)以及微軟公司的《軟件開發(fā)的科學(xué)與藝術(shù)》和《軟件企業(yè)的管理與文化》(研究軟
件企業(yè)的制勝之道當(dāng)然要研究微軟的成功經(jīng)驗(yàn)了!)
關(guān)于計(jì)算機(jī)技術(shù)的學(xué)習(xí)我想是這樣的:學(xué)校開設(shè)的任何一門科學(xué)都有其滯后性,不要總
認(rèn)為自己掌握的某門技術(shù)就已經(jīng)是天下無敵手了,雖然現(xiàn)在Java,VB,C,C++用的都很多,
怎能保證沒有被淘汰的一天,我想.NET平臺(tái)的誕生和X#語言的初見端倪完全可以說明問
題。換言之,在我們掌握一門新技術(shù)的同時(shí)就又有更新的技術(shù)產(chǎn)生,身為當(dāng)代的大學(xué)生
應(yīng)當(dāng)有緊跟科學(xué)發(fā)展的素質(zhì)。舉個(gè)例子,就像有些同學(xué)總說,我做網(wǎng)頁設(shè)計(jì)就喜歡直接
寫html,不愿意用什么Frontpage,Dreamweaver。能用語言寫網(wǎng)頁固然很好,但有高效的
手段你為什么不使呢?僅僅是為了顯示自己的水平高,unique? 我看真正水平高的是能
夠以最快的速度接受新事物的人。高級(jí)程序設(shè)計(jì)語言的發(fā)展日新月異,今后的程序設(shè)計(jì)
就像人們在說話一樣,我想大家從xml中應(yīng)是有所體會(huì)了。難道我們真就寫個(gè)什么都要用
匯編,以顯示自己的水平高,真是這樣倒不如直接用機(jī)器語言寫算了。反過來說,想要
以最快的速度接受并利用新技術(shù)關(guān)鍵還是在于你對(duì)計(jì)算機(jī)科學(xué)地把握程度。
計(jì)算機(jī)技術(shù)牽扯的內(nèi)容更為廣泛些,一項(xiàng)一項(xiàng)說恐怕沒個(gè)一年半載也說不清。我只想提
醒大家的還是那句話,技術(shù)與科學(xué)是不能分家的,學(xué)好了科學(xué)同時(shí)搞技術(shù),這才是上上
策。猶如英語,原先人們與老外交流必須要個(gè)翻譯,現(xiàn)在滿馬路的人都會(huì)說英語。就連
21世紀(jì)英語演講比賽的冠軍都輪不到英語系的學(xué)生了。計(jì)算機(jī)也是一樣的,我們必須面
對(duì)的一個(gè)現(xiàn)實(shí)就是:計(jì)算機(jī)真就只是一個(gè)工具,如果不具備其它方面的素養(yǎng),計(jì)算機(jī)系
的學(xué)生雖然不能說找不到工作,不過總有一天當(dāng)其他專業(yè)性人才掌握了計(jì)算機(jī)技術(shù)后將
比我們出色許多。原因就在于計(jì)算機(jī)解決的大都是實(shí)際問題,實(shí)際問題的知識(shí)卻是我們
少有的。單一的計(jì)算機(jī)技術(shù)沒有立足之地。
我想是時(shí)候指出:學(xué)習(xí)每一個(gè)課程之前,都要先搞清這一課程的學(xué)習(xí)目的。這一學(xué)
科的應(yīng)用領(lǐng)域。據(jù)我自身所了解到的同齡同學(xué)和低年級(jí)的同學(xué)的學(xué)習(xí)狀況:他們之中很
少有人知道學(xué)一個(gè)學(xué)科的學(xué)習(xí)目的,期末考試結(jié)束了也不知道學(xué)這科做什么用。這就失
去了讀計(jì)算機(jī)科學(xué)的意義。當(dāng)然這與現(xiàn)存的教育思想不能說一點(diǎn)關(guān)系都沒有。
總的來說,從教育角度來講,國內(nèi)高校的課程安排不是很合理,強(qiáng)調(diào)理論,又不愿意在
理論上深入教育,無力接受新技術(shù),想避開新技術(shù)又無法避得一干二凈。我覺得關(guān)鍵問
題就是國內(nèi)的高校難于突破現(xiàn)狀,條條框框限制著怎么求發(fā)展。我們雖然認(rèn)識(shí)得到國外
教育的優(yōu)越性,但為什么遲遲不能采取行動(dòng)?哪怕是去粗取精的取那么一點(diǎn)點(diǎn)。我們需
要改變。從我們自身角度來講,多數(shù)人4年下來既沒有學(xué)習(xí)計(jì)算機(jī)科學(xué)的學(xué)術(shù)水平,也沒
有學(xué)習(xí)計(jì)算機(jī)技術(shù)的那種韌勁。在我剛上大一時(shí),我的計(jì)算機(jī)科學(xué)入門導(dǎo)師,淮北煤炭
師范學(xué)院王愛平教授曾經(jīng)對(duì)我說過這樣一番話:“當(dāng)你選擇了計(jì)算機(jī)這一門科學(xué),就意
味著你踏上了一條不歸路,就意味著你一生都要為之奮斗……你的身后是懸崖,只有向
前走,不能往后退。”
有些同學(xué)說按照這樣學(xué)習(xí)學(xué)的東西太多,有的未見得有用,我想打個(gè)形象的比方:
學(xué)校學(xué)出來的人都是一個(gè)球體,方方面面的知識(shí)都應(yīng)具備??墒巧鐣?huì)上需要球體的地方
很少,反而需要的是磚和瓦,即精通某一行的人才。但是對(duì)于同等體積的物體,用球體
來改造是最方便最省事的。學(xué)校的學(xué)生很多,為了能夠使更多的學(xué)生來適應(yīng)這個(gè)社會(huì),
學(xué)校也就不得以把所有的學(xué)生都打造成一個(gè)球體,然后讓社會(huì)對(duì)這些學(xué)生進(jìn)行再加工,
成為真正能夠有用的人才。即使你非常清楚自己的將來要干什么,并且非常下定決心要
走自己的路,這一步你也必須走,世界是在不斷變化的,你不能預(yù)料未來。想清楚,努
力去干吧!
必須結(jié)束這篇“胡侃”了,再侃下去非我力所能及。其實(shí)計(jì)算機(jī)還有很多基礎(chǔ)課都值得
一侃。怎奈我造詣?dòng)邢蓿桓以僮寖?nèi)行恥笑。對(duì)于博大精深的計(jì)算機(jī)科學(xué),我只能說我
永遠(yuǎn)都是個(gè)Beginner.最后聲明:這些只針對(duì)本科階段的學(xué)習(xí)。即使把這些全弄通了,前
面的路還長,計(jì)算機(jī)科學(xué)需要我們?yōu)橹畩^斗......學(xué)習(xí)計(jì)算機(jī)科學(xué)需要韌性,更需要?jiǎng)?chuàng)
新,需要***。深刻學(xué)習(xí)理論知識(shí),勇于接受新技術(shù)的挑戰(zhàn),這才是我們這一代人應(yīng)具
有的素質(zhì)。最后送大家一句話“Wake up every day with a feeling of passion for
the difference technology will make in people's life!”。
在我大一時(shí)無意中找到了南京大學(xué)網(wǎng)友sir的帖子“胡侃(理論)計(jì)算機(jī)學(xué)習(xí)”,這個(gè)帖
子對(duì)我的大學(xué)生活起了至關(guān)重要的作用,也因此同他成為了好友,本帖子在原有帖子的
基礎(chǔ)上改進(jìn)了其中我認(rèn)為不太合適的理論,修正了一些觀點(diǎn),在推薦教材方面結(jié)合我的
學(xué)習(xí)情況有了較大改變。值得一提的是增加了一些計(jì)算機(jī)理論的內(nèi)容,計(jì)算機(jī)技術(shù)的內(nèi)
容結(jié)合我國的教學(xué)情況和我們學(xué)習(xí)的實(shí)際情況進(jìn)行了重寫。感謝大家的支持,這篇文章
才能比較快的完成,這里也只是寫下了我在學(xué)習(xí)計(jì)算機(jī)科學(xué)時(shí)的所思所想,很不成熟。
與原文相比增加了一些推薦參考書,刪去了一些過陳舊的難以找到的材料。并且對(duì)一些
問題作了更為詳細(xì)地闡述,也增加了一些新觀點(diǎn)。希望大家多多討論,改進(jìn)不足,讓我
們共同努力吧!
[
轉(zhuǎn)帖][推薦]考研全攻略{寫給正在彷徨或猶豫的你}
收到錄取的通知,理想的學(xué)校,理想的專業(yè),一切都幾乎完美的不真實(shí),自己從來不算個(gè)優(yōu)秀的學(xué)生,本科沒拿過一次獎(jiǎng)學(xué)金,還掛過幾門科目,曠的課比上的課多,在被窩里比在書桌前多,這樣的我,曾經(jīng)沒有一點(diǎn)自信,覺得考研,北京,公費(fèi)...諸如此類的字眼都是遙不可及的事情,然而,半年的生活改變了這一切,考研不單單只是改變了我今后的人生軌跡,更重要的是,它改變了我對(duì)自己的看法,它讓我第一次以一種負(fù)責(zé)的態(tài)度來面對(duì)生活面對(duì)自己,讓我知道其實(shí)我可以做到些什么,我想這就是這半年的生活給予我最大的獎(jiǎng)勵(lì).
?
1.
關(guān)于報(bào)考 只有一個(gè)原則,選擇你所愛,愛你所選擇.先不要考慮報(bào)考學(xué)校的難度,競爭的激烈等等...沒有誰能百分百得肯定自己能上哪個(gè)學(xué)校,考到最后,就會(huì)發(fā)現(xiàn),北大和X大(自己最有把握的地方性大學(xué))并沒有實(shí)質(zhì)性的區(qū)別,都得一樣地投入,一樣地付出,一樣地辛苦,所以,若沒有熱情和興趣,是很難堅(jiān)持走下去的.有一個(gè)夢想已久的地方,為了奔向它而努力,于是,再辛苦的日子都會(huì)泛出甜蜜.
????
2.關(guān)于導(dǎo)師 "找還是不找,這是個(gè)問題.'關(guān)于找不找導(dǎo)師的問題,網(wǎng)上一千種答案.請大家具體情況區(qū)別對(duì)待.一般來說,初試的時(shí)候,不用找.如果沒有很硬的關(guān)系,找也沒用.跨學(xué)??绲貐^(qū)的,找也找不到.當(dāng)然,如果你是本校學(xué)生,跟導(dǎo)師關(guān)系不錯(cuò),或者你能有些小門道,又或者你報(bào)考的學(xué)校風(fēng)評(píng)不太好有舉辦補(bǔ)習(xí)班歷史的,就請你最好找找.但是請大家放心,這些都是極少數(shù),大部分學(xué)?;旧线€是公正優(yōu)先的.而且越是名校透明度越高,如果你什么門路也沒有,千萬也別慌張,好好做好的該做的事情就行.我們專業(yè)復(fù)試的時(shí)候,沒有一個(gè)人事先聯(lián)系過導(dǎo)師(本校生也只是認(rèn)識(shí)導(dǎo)師而已),我本人連電話都沒打過,還是挺欣慰現(xiàn)在逐漸成熟了的考研制度.
????
3.關(guān)于英語 本人英語最爛,四級(jí)也考了三次才過,半年來好死賴活地搞英語,好歹混了個(gè)及格,雖不滿意,但對(duì)于自己而言,進(jìn)步也不小.所以這一段是寫給那些英語很差的師弟師妹們的,如果你是六級(jí)70多的那種,請你跳過,就不用浪費(fèi)時(shí)間了.都說英語是考研最大的一條攔路虎,每年都有很多上380但英語不過線而被刷的烈士,實(shí)在可惜.其實(shí)半年的努力讓英語差的你混上國家線也不是很難.首先一個(gè)好消息是取消了聽力,這是全國每年平均得分最低的一個(gè)部分,然后你要清楚,得閱讀者得天下,一定要把這個(gè)當(dāng)做最大頭.關(guān)于英語復(fù)習(xí),最重要的推薦是歷年真題.這是無數(shù)考研先驅(qū)們總結(jié)出來英語復(fù)習(xí)精華.以本為本,反復(fù)做,特別是閱讀部分,用新東方老師的話說"要做到?jīng)]有一個(gè)詞是生詞,沒有一個(gè)句子的語法成分是含糊的,看到一個(gè)題目,就要知道它出自于文章的那個(gè)部分.'做到這些,才叫精讀.在考試前起碼把真題閱讀做到6遍以上,由于每年的出題原則都是有一定連貫性的,樣在考試中,你對(duì)出題人的思路,模式都會(huì)有很熟悉的感覺,得心應(yīng)手,即便是猜,概率也會(huì)大許多.關(guān)于世面上流行的各種閱讀280/220/200/100篇什么的,沒有精力就不用去看了,最多用來做泛讀材料,看文章就好,對(duì)于題目的錯(cuò)對(duì)更不用深究,因?yàn)樗鼈兏骖}還是有很大差距的,如果變換了自己的思路反而不好.關(guān)于英語,還要推薦的就是新東方的FLASH課堂,各大BT網(wǎng)站都會(huì)有下的,聽這個(gè)跟去總部上課一樣,而且節(jié)省金錢和時(shí)間,新東方的老師們都很幽默,深入淺出,聽他們的課反正不會(huì)打瞌睡,可以培養(yǎng)你對(duì)英語的興趣和信心,確實(shí)不錯(cuò).關(guān)于單詞,只推薦一本新東方的<核心詞匯>.考研詞匯量比六級(jí)還少,??嫉牟贿^一兩千,但是跟四六級(jí)不一樣的是,它考察單詞的深度很大,平常我們只知道某個(gè)單詞的最常用意思,但是考研英語往往會(huì)考到它的第二個(gè),第三個(gè)...生僻的意思.對(duì)單詞的用法,在具體語境下的解釋等等,這些就要求靠生們深入地掌握每個(gè)核心的詞匯.總之一句話,關(guān)于單詞,求深不求多.沖刺階段做少量模擬題,要嚴(yán)守時(shí)限,主要是感覺一下氣氛,把握一下自己的速度,看看自己該怎么分配時(shí)間,每年都有人因?yàn)闀r(shí)間不夠做不完考題的.因此要自己協(xié)調(diào),哪些部分必須做細(xì)些哪些地方可以做快些,總之,根據(jù)分?jǐn)?shù)分布和自己的情況合理地分配時(shí)間,這也是很重要的一件事情.
????
4.關(guān)于政治.政治考試是一個(gè)最奇怪的部分,準(zhǔn)備兩個(gè)月甚至兩周的人經(jīng)常會(huì)超過準(zhǔn)備了半年的人,有人說運(yùn)氣很重要,其實(shí)不然,政治其實(shí)是最高產(chǎn)的,只要你花了一些工夫,而且方法對(duì)頭的話,70分是很容易拿下的.關(guān)于政治,從9月份大綱下來了開始準(zhǔn)備足以.不推薦那些大本的講義,看著累人又浪費(fèi)時(shí)間,最重要的是書的絕大部分都不會(huì)考到.買一本教育司出的<考試分析>,這是最權(quán)威的參考書,薄薄的一本,幾天就可以翻一遍,如果你有工夫的話把它背下來,基本上你就不需要?jiǎng)e的參考書了.不過本人最恨背書,所以再推薦一本王鎖明的<核心考案>,也是薄薄的一本,條理清晰,串講透徹,風(fēng)評(píng)也相當(dāng)好,這兩本書打理論底子就夠了,當(dāng)然,如果你是理科生,自己感覺政治基礎(chǔ)很差,覺得這樣薄薄的參考書沒什么安全感的話,那建議你買岳華亭的輔導(dǎo)講義,這是所有講義里邊賣的最好的一本,整本書風(fēng)格清晰,語言流暢,看著也舒服,而且老岳的哲學(xué)確實(shí)很強(qiáng),可以補(bǔ)補(bǔ)你的弱底子.還有就是各種吹地天花亂綴的補(bǔ)習(xí)班,我負(fù)責(zé)任地說,除了強(qiáng)制你可以騰出時(shí)間學(xué)政治以外,基本上沒有別的功效.如果你有自制力,就不用去上那些班來浪費(fèi)時(shí)間浪費(fèi)錢了.最后聽聽串講班或許還有點(diǎn)用,不過若是時(shí)間不夠,一律省略.現(xiàn)在出題組是年年反猜題,除了事實(shí)政治,其他部分命中原題的可能都很小很小,因此,到?jīng)_刺階段,大家千萬不要被泛濫的信息打亂陣腳,今天背這個(gè)老師的最后幾套題,明天又跟風(fēng)那個(gè)補(bǔ)習(xí)班的內(nèi)部絕密,越聳人聽聞的標(biāo)題就預(yù)示著越平乏無味的結(jié)果,每年一考完就可以看見論壇上漫罵各種老師和補(bǔ)習(xí)班的網(wǎng)友,其實(shí)他們也沒錯(cuò),色不迷人人自迷,如果自己報(bào)著不勞而獲撞大運(yùn)的心態(tài),則注定落空.越接近考試的時(shí)候,這些亂七八糟的東西就越多,你要做的只是,按照自己的進(jìn)度好好復(fù)習(xí),那些模擬題絕密題押題猜題看看就好,主觀題目主要是看標(biāo)準(zhǔn)答案如何組織,有些什么樣的答題模式,拿來背就實(shí)在沒有必要了.習(xí)題集的話陳先奎的<2000基礎(chǔ)過關(guān)>不用說是名聲最大的了,個(gè)人覺得這本書知識(shí)點(diǎn)全面,而且每道選擇題都帶有講解,講解精練,確實(shí)是同類中的佼佼者.美中不足的是,題目太多浪費(fèi)精力,而且毛概和鄧三部分識(shí)記題過多,編排陳舊,(今年毛概部分沒考一個(gè)識(shí)記題),任汝汾的序列二序列三都還不錯(cuò),題量適中,大字體,看起來心里舒服.關(guān)于習(xí)題集,重在做選擇題,辨析題看看,問答題可看可不看,(都用不著背).
??
5.關(guān)于專業(yè).大家專業(yè)不同,這一塊也沒什么好說,如果你也是文科,就一定記得把學(xué)校指定的參考書看個(gè)爛熟,一般來說專業(yè)考試不會(huì)很難,基本上不會(huì)超過參考書的部分.專業(yè)課考上130和考下90一樣的難,除了極個(gè)別的以外,大家都不會(huì)相差很多,所以雖然專業(yè)課分最重,可實(shí)際拉分的還是公共課,大家一定要處理好這個(gè)關(guān)系.
??
6.關(guān)于計(jì)劃.考研是一個(gè)跨年度的大工程,沒有計(jì)劃是不行的.要根據(jù)自己的情況制定一個(gè)合適的計(jì)劃,一旦擬定,就要按計(jì)劃行事,表老給自己找借口,每個(gè)階段都有不同的復(fù)習(xí)方法和時(shí)間分配.一般來說,從暑假開始,為三個(gè)階段比較合適,7~9月是全面打底階段在這個(gè)階段你首先要做的事情是等各個(gè)學(xué)校的招生簡章下來后,確定好你報(bào)考的學(xué)校和專業(yè),一旦確定,就不要再動(dòng)搖,然后以英語為重頭,首先單詞要全部解決,否則無法繼續(xù)下面的復(fù)習(xí),然后每天保持一到兩篇的真題閱讀(這個(gè)量并不會(huì)少,中要的是鉆深磚透)政治和專業(yè)課在這個(gè)階段都以看為主,不要求記,只要你有個(gè)全面的印象和大概的框架.10月~12月就是最重要的強(qiáng)化期,這個(gè)階段是進(jìn)步最快的時(shí)候,氣候也最適合學(xué)習(xí).這個(gè)階段要以專業(yè)課為主,熟讀~識(shí)記,基本上吃透了你手頭的參考書,政治在這個(gè)階段要開始做題,看一章節(jié)的書做一章節(jié)的題,做錯(cuò)題目再回頭去找去看,這樣子看書,底子就能扎得很塌實(shí),英語仍是不能丟棄的,每天保持大約4時(shí)的學(xué)習(xí)時(shí)間.仍然是每天都要記一點(diǎn)單詞,看一兩篇閱讀,(記住,單詞和閱讀必須貫穿復(fù)習(xí)的始終,可以每天只分配少量的時(shí)間,但不可偏廢一天),同時(shí)每個(gè)月分重點(diǎn)攻破一個(gè)部分.比如10月份重點(diǎn)做完形,11月分重點(diǎn)做翻譯,12月份重點(diǎn)做作文,這些都依個(gè)人情況而定,沒有定數(shù).1月份是最后的沖刺期,不用說這個(gè)時(shí)期的重頭就是政治.一個(gè)字:背.沒有辦法,只有背,背考試分析也行,背核心考案也行,或者是的起航最富盛名的20天20題,雖然很羅嗦,但是不背些句子在肚里是沒法做論述題的.專業(yè)課基本上不會(huì)再有什么突破了,但書還是要看的,保持水準(zhǔn)就行.英語方面,單詞是不用再背了,做做模擬題,背一些作文模式,集中練練新題型,作文是很容易突擊的.總而言之,我只能提供一個(gè)大概的模式,還得大家自己具體量化,每一個(gè)階段,每一個(gè)月,每一周,甚至每一天都要規(guī)劃好自己必須完成的任務(wù).這樣一點(diǎn)點(diǎn)得積累和前進(jìn),突然某一天你就會(huì)發(fā)現(xiàn)自己的質(zhì)變.
??
7.關(guān)于作息.本人非常反對(duì)疲勞戰(zhàn).每天保持清醒的頭腦,高效的學(xué)習(xí),樂觀的心態(tài),比你夜夜通宵管用的多.其實(shí)每天能保持8個(gè)小時(shí)的學(xué)習(xí)時(shí)間已經(jīng)非常足夠了,當(dāng)然前提是每個(gè)小時(shí)你都在全神貫注地學(xué)習(xí).我在考研期間,每天都睡到自然醒(當(dāng)然我是在家考研,可能條件比學(xué)校好些),但是每個(gè)人興奮點(diǎn)不一樣,我就是夜貓子型,晚上看通宵,然后從早上睡到下午,夜晚很安靜,適合我這樣好動(dòng)貪玩的人.總之,你覺得什么時(shí)間你最興奮最看得進(jìn)書你就好好把握住那個(gè)時(shí)段,一分一秒都不要浪費(fèi),反之,如果某個(gè)時(shí)間,你怎么也看不進(jìn)書,那就不要強(qiáng)迫自己了,開開心心地去放松一下,一張一弛,方為文武之道.
??
8.寫在最后.羅羅嗦嗦了一大堆,我想多少會(huì)對(duì)大家有點(diǎn)用處吧,最后我想說的是:每個(gè)人都有自己都不會(huì)相信的潛力,選擇考研也就選擇了對(duì)自己的尋寶.我快樂嗎?我喜歡自己嗎?我對(duì)現(xiàn)在的生活滿意嗎?這些問題,也許我們每個(gè)人都在不停得問自己,不要被自己對(duì)自己的看法所約束,不要自己困住自己,大膽些超越自己,如果從不嘗試,就永遠(yuǎn)不會(huì)知道自己其實(shí)可以.:)YOU CAN WHEN YOU BELEIVE!
算法(Algorithm):計(jì)算機(jī)解題的基本思想方法和步驟。算法的描述:是對(duì)要解決一個(gè)問題或要完成一項(xiàng)任務(wù)所采取的方法和步驟的描述,包括需要什么數(shù)據(jù)(輸入什么數(shù)據(jù)、輸出什么結(jié)果)、采用什么結(jié)構(gòu)、使用什么語句以及如何安排這些語句等。通常使用自然語言、結(jié)構(gòu)化流程圖、偽代碼等來描述算法。
一、計(jì)數(shù)、求和、求階乘等簡單算法
此類問題都要使用循環(huán),要注意根據(jù)問題確定循環(huán)變量的初值、終值或結(jié)束條件,更要注意用來表示計(jì)數(shù)、和、階乘的變量的初值。
例:用隨機(jī)函數(shù)產(chǎn)生100個(gè)[0,99]范圍內(nèi)的隨機(jī)整數(shù),統(tǒng)計(jì)個(gè)位上的數(shù)字分別為1,2,3,4,5,6,7,8,9,0的數(shù)的個(gè)數(shù)并打印出來。
本題使用數(shù)組來處理,用數(shù)組a[100]存放產(chǎn)生的確100個(gè)隨機(jī)整數(shù),數(shù)組x[10]來存放個(gè)位上的數(shù)字分別為1,2,3,4,5,6,7,8,9,0的數(shù)的個(gè)數(shù)。即個(gè)位是1的個(gè)數(shù)存放在x[1]中,個(gè)位是2的個(gè)數(shù)存放在x[2]中,……個(gè)位是0的個(gè)數(shù)存放在x[10]。
void main() { int a[101],x[11],i,p; for(i=0;i<=11;i++) x[i]=0; for(i=1;i<=100;i++) { a[i]=rand() % 100; printf("%4d",a[i]); if(i%10==0)printf("\n"); } for(i=1;i<=100;i++) { p=a[i]%10; if(p==0) p=10; x[p]=x[p]+1; } for(i=1;i<=10;i++) { p=i; if(i==10) p=0; printf("%d,%d\n",p,x[i]); } printf("\n"); }
二、求兩個(gè)整數(shù)的最大公約數(shù)、最小公倍數(shù)
分析:求最大公約數(shù)的算法思想:(最小公倍數(shù)=兩個(gè)整數(shù)之積/最大公約數(shù)) (1) 對(duì)于已知兩數(shù)m,n,使得m>n; (2) m除以n得余數(shù)r; (3) 若r=0,則n為求得的最大公約數(shù),算法結(jié)束;否則執(zhí)行(4); (4) m←n,n←r,再重復(fù)執(zhí)行(2)。 例如: 求 m=14 ,n=6 的最大公約數(shù). m n r 14 6 2 6 2 0 void main() { int nm,r,n,m,t; printf("please input two numbers:\n"); scanf("%d,%d",&m,&n); nm=n*m; if (m<n) { t=n; n=m; m=t; } r=m%n; while (r!=0) { m=n; n=r; r=m%n; } printf("最大公約數(shù):%d\n",n); printf("最小公倍數(shù):%d\n",nm/n); }
三、判斷素?cái)?shù)
只能被1或本身整除的數(shù)稱為素?cái)?shù) 基本思想:把m作為被除數(shù),將2—INT( )作為除數(shù),如果都除不盡,m就是素?cái)?shù),否則就不是。(可用以下程序段實(shí)現(xiàn)) void main() { int m,i,k; printf("please input a number:\n"); scanf("%d",&m); k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) break; if(i>=k) printf("該數(shù)是素?cái)?shù)"); else printf("該數(shù)不是素?cái)?shù)"); } 將其寫成一函數(shù),若為素?cái)?shù)返回1,不是則返回0 int prime( m%) {int i,k; k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) return 0; return 1; }
四、驗(yàn)證哥德巴赫猜想
?。ㄈ我庖粋€(gè)大于等于6的偶數(shù)都可以分解為兩個(gè)素?cái)?shù)之和) 基本思想:n為大于等于6的任一偶數(shù),可分解為n1和n2兩個(gè)數(shù),分別檢查n1和n2是否為素?cái)?shù),如都是,則為一組解。如n1不是素?cái)?shù),就不必再檢查n2是否素?cái)?shù)。先從n1=3開始,檢驗(yàn)n1和n2(n2=N-n1)是否素?cái)?shù)。然后使n1+2 再檢驗(yàn)n1、n2是否素?cái)?shù),… 直到n1=n/2為止。
利用上面的prime函數(shù),驗(yàn)證哥德巴赫猜想的程序代碼如下: #include "math.h" int prime(int m) { int i,k; k=sqrt(m); for(i=2;i<k;i++) if(m%i==0) break; if(i>=k) return 1; else return 0; }
main() { int x,i; printf("please input a even number(>=6):\n"); scanf("%d",&x); if (x<6||x%2!=0) printf("data error!\n"); else for(i=2;i<=x/2;i++) if (prime(i)&&prime(x-i)) { printf("%d+%d\n",i,x-i); printf("驗(yàn)證成功!"); break; } }
五、排序問題
1.選擇法排序(升序)
基本思想: 1)對(duì)有n個(gè)數(shù)的序列(存放在數(shù)組a(n)中),從中選出最小的數(shù),與第1個(gè)數(shù)交換位置; 2)除第1 個(gè)數(shù)外,其余n-1個(gè)數(shù)中選最小的數(shù),與第2個(gè)數(shù)交換位置; 3)依次類推,選擇了n-1次后,這個(gè)數(shù)列已按升序排列。
程序代碼如下: void main() { int i,j,imin,s,a[10]; printf("\n input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<9;i++) { imin=i; for(j=i+1;j<10;j++) if(a[imin]>a[j]) imin=j; if(i!=imin) {s=a[i]; a[i]=a[imin]; a[imin]=s; } printf("%d\n",a[i]); } }
2.冒泡法排序(升序)
基本思想:(將相鄰兩個(gè)數(shù)比較,小的調(diào)到前頭) 1)有n個(gè)數(shù)(存放在數(shù)組a(n)中),第一趟將每相鄰兩個(gè)數(shù)比較,小的調(diào)到前頭,經(jīng)n-1次兩兩相鄰比較后,最大的數(shù)已“沉底”,放在最后一個(gè)位置,小數(shù)上升“浮起”; 2)第二趟對(duì)余下的n-1個(gè)數(shù)(最大的數(shù)已“沉底”)按上法比較,經(jīng)n-2次兩兩相鄰比較后得次大的數(shù); 3)依次類推,n個(gè)數(shù)共進(jìn)行n-1趟比較,在第j趟中要進(jìn)行n-j次兩兩比較。 程序段如下 void main() { int a[10]; int i,j,t; printf("input 10 numbers\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<=8;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf("the sorted numbers:\n"); for(i=0;i<10;i++) printf("%d\n",a[i]); }
3.合并法排序(將兩個(gè)有序數(shù)組A、B合并成另一個(gè)有序的數(shù)組C,升序)
基本思想: 1)先在A、B數(shù)組中各取第一個(gè)元素進(jìn)行比較,將小的元素放入C數(shù)組; 2)取小的元素所在數(shù)組的下一個(gè)元素與另一數(shù)組中上次比較后較大的元素比較,重復(fù)上述比較過程,直到某個(gè)數(shù)組被先排完; 3)將另一個(gè)數(shù)組剩余元素抄入C數(shù)組,合并排序完成。 程序段如下: void main() { int a[10],b[10],c[20],i,ia,ib,ic; printf("please input the first array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) scanf("%d",&b[i]); printf("\n"); ia=0;ib=0;ic=0; while(ia<10&&ib<10) { if(a[ia]<b[ib]) { c[ic]=a[ia];ia++;} else { c[ic]=b[ib];ib++;} ic++; } while(ia<=9) { c[ic]=a[ia]; ia++;ic++; } while(ib<=9) { c[ic]=b[ib]; b++;ic++; } for(i=0;i<20;i++) printf("%d\n",c[i]); }
六、查找問題
1.①順序查找法(在一列數(shù)中查找某數(shù)x)
基本思想:一列數(shù)放在數(shù)組a[1]---a[n]中,待查找的數(shù)放在x 中,把x與a數(shù)組中的元素從頭到尾一一進(jìn)行比較查找。用變量p表示a數(shù)組元素下標(biāo),p初值為1,使x與a[p]比較,如果x不等于a[p],則使p=p+1,不斷重復(fù)這個(gè)過程;一旦x等于a[p]則退出循環(huán);另外,如果p大于數(shù)組長度,循環(huán)也應(yīng)該停止。(這個(gè)過程可由下語句實(shí)現(xiàn)) void main() { int a[10],p,x,i; printf("please input the array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("please input the number you want find:\n"); scanf("%d",&x); printf("\n"); p=0; while(x!=a[p]&&p<10) p++; if(p>=10) printf("the number is not found!\n"); else printf("the number is found the no%d!\n",p); } 思考:將上面程序改寫一查找函數(shù)Find,若找到則返回下標(biāo)值,找不到返回-1 ②基本思想:一列數(shù)放在數(shù)組a[1]---a[n]中,待查找的關(guān)鍵值為key,把key與a數(shù)組中的元素從頭到尾一一進(jìn)行比較查找,若相同,查找成功,若找不到,則查找失敗。(查找子過程如下。index:存放找到元素的下標(biāo)。) void main() { int a[10],index,x,i; printf("please input the array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("please input the number you want find:\n"); scanf("%d",&x); printf("\n"); index=-1; for(i=0;i<10;i++) if(x==a[i]) { index=i; break; } if(index==-1) printf("the number is not found!\n"); else printf("the number is found the no%d!\n",index); }
2.折半查找法(只能對(duì)有序數(shù)列進(jìn)行查找)
基本思想:設(shè)n個(gè)有序數(shù)(從小到大)存放在數(shù)組a[1]----a[n]中,要查找的數(shù)為x。用變量bot、top、mid 分別表示查找數(shù)據(jù)范圍的底部(數(shù)組下界)、頂部(數(shù)組的上界)和中間,mid=(top+bot)/2,折半查找的算法如下: (1)x=a(mid),則已找到退出循環(huán),否則進(jìn)行下面的判斷; (2)x<a(mid),x必定落在bot和mid-1的范圍之內(nèi),即top=mid-1; (3)x>a(mid),x必定落在mid+1和top的范圍之內(nèi),即bot=mid+1; (4)在確定了新的查找范圍后,重復(fù)進(jìn)行以上比較,直到找到或者bot<=top。 將上面的算法寫成如下程序: void main() { int a[10],mid,bot,top,x,i,find; printf("please input the array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("please input the number you want find:\n"); scanf("%d",&x); printf("\n"); bot=0;top=9;find=0; while(bot<top&&find==0) { mid=(top+bot)/2; if(x==a[mid]) {find=1;break;} else if(x<a[mid]) top=mid-1; else bot=mid+1; } if (find==1) printf("the number is found the no%d!\n",mid); else printf("the number is not found!\n"); }
七、插入法
把一個(gè)數(shù)插到有序數(shù)列中,插入后數(shù)列仍然有序
基本思想:n個(gè)有序數(shù)(從小到大)存放在數(shù)組a(1)—a(n)中,要插入的數(shù)x。首先確定x插在數(shù)組中的位置P;(可由以下語句實(shí)現(xiàn)) #define N 10 void insert(int a[],int x) { int p, i; p=0; while(x>a[p]&&p<N) p++; for(i=N; i>p; i--) a[i]=a[i-1]; a[p]=x; } main() { int a[N+1]={1,3,4,7,8,11,13,18,56,78}, x, i; for(i=0; i<N; i++) printf("%d,", a[i]); printf("\nInput x:"); scanf("%d", &x); insert(a, x); for(i=0; i<=N; i++) printf("%d,", a[i]); printf("\n"); }
八、矩陣(二維數(shù)組)運(yùn)算
(1)矩陣的加、減運(yùn)算 C(i,j)=a(i,j)+b(i,j) 加法 C(i,j)=a(i,j)-b(i,j) 減法 (2)矩陣相乘 (矩陣A有M*L個(gè)元素,矩陣B有L*N個(gè)元素,則矩陣C=A*B有M*N個(gè)元素)。矩陣C中任一元素 (i=1,2,…,m; j=1,2,…,n) #define M 2 #define L 4 #define N 3 void mv(int a[M][L], int b[L][N], int c[M][N]) { int i, j, k; for(i=0; i<M; i++) for(j=0; j<N; j++) { c[i][j]=0; for(k=0; k<L; k++) c[i][j]+=a[i][k]*b[k][j]; } } main() { int a[M][L]={{1,2,3,4},{1,1,1,1}}; int b[L][N]={{1,1,1},{1,2,1},{2,2,1},{2,3,1}}, c[M][N]; int i, j; mv(a,b,c); for(i=0; i<M; i++) { for(j=0; j<N; j++) printf("%4d", c[i][j]); printf("\n"); } } (3)矩陣傳置 例:有二維數(shù)組a(5,5),要對(duì)它實(shí)現(xiàn)轉(zhuǎn)置,可用下面兩種方式: #define N 3 void ch1(int a[N][N]) { int i, j, t; for(i=0; i<N; i++) for(j=i+1; j<N; j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; } } void ch2(int a[N][N]) { int i, j, t; for(i=1; i<N; i++) for(j= 0; j<i; j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; } } main() { int a[N][N]={{1,2,3},{4,5,6},{7,8,9}}, i, j; ch1(a); /*或ch2(a);*/ for(i=0; i<N; i++) { for(j=0; j<N; j++) printf("%4d", a[i][j]); printf("\n"); } } (4)求二維數(shù)組中最小元素及其所在的行和列 基本思路同一維數(shù)組,可用下面程序段實(shí)現(xiàn)(以二維數(shù)組a[3][4]為例): ‘變量max中存放最大值,row,column存放最大值所在行列號(hào) #define N 4 #define M 3 void min(int a[M][N]) { int min, row, column, i, j; min=a[0][0]; row=0; column=0; for(i=0; i<M; i++) for(j=0; j<N; j++) if(a[i][j]<min) { min=a[i][j]; row=i; column=j; } printf("Min=%d\nAt Row%d,Column%d\n", min, row, column); } main() { int a[M][N]={{1,23,45,-5},{5,6,-7,6},{0,33,8,15}}; min(a); }
九、迭代法
算法思想:對(duì)于一個(gè)問題的求解x,可由給定的一個(gè)初值x0,根據(jù)某一迭代公式得到一個(gè)新的值x1,這個(gè)新值x1比初值x0更接近要求的值x;再以新值作為初值,即:x1→x0,重新按原來的方法求x1,重復(fù)這一過和直到|x1-x0|<ε(某一給定的精度)。此時(shí)可將x1作為問題的解。 例:用迭代法求某個(gè)數(shù)的平方根。 已知求平方根的迭代公式為: #include<math.h> float fsqrt(float a) { float x0, x1; x1=a/2; do{ x0=x1; x1=0.5*(x0+a/x0); }while(fabs(x1-x0)>0.00001); return(x1); } main() { float a; scanf("%f", &a); printf("genhao =%f\n", fsqrt(a)); }
十、數(shù)制轉(zhuǎn)換
將一個(gè)十進(jìn)制整數(shù)m轉(zhuǎn)換成 →r(2-16)進(jìn)制字符串。
方法:將m不斷除 r 取余數(shù),直到商為零,以反序得到結(jié)果。下面寫出一轉(zhuǎn)換函數(shù),參數(shù)idec為十進(jìn)制數(shù),ibase為要轉(zhuǎn)換成數(shù)的基(如二進(jìn)制的基是2,八進(jìn)制的基是8等),函數(shù)輸出結(jié)果是字符串。 char *trdec(int idec, int ibase) { char strdr[20], t; int i, idr, p=0; while(idec!=0) { idr=idec % ibase; if(idr>=10) strdr[p++]=idr-10+65; else strdr[p++]=idr+48; idec/=ibase; } for(i=0; i<p/2; i++) { t=strdr[i]; strdr[i]=strdr[p-i-1]; strdr[p-i-1]=t; } strdr[p]=’\0’; return(strdr); } main() { int x, d; scanf("%d%d", &x, &d); printf("%s\n", trdec(x,d)); }
十一、字符串的一般處理
1.簡單加密和解密 加密的思想是: 將每個(gè)字母C加(或減)一序數(shù)K,即用它后的第K個(gè)字母代替,變換式公式: c=c+k 例如序數(shù)k為5,這時(shí) A→ F, a→f,B→?G… 當(dāng)加序數(shù)后的字母超過Z或z則 c=c+k -26 例如:You are good→ Dtz fwj ltti 解密為加密的逆過程 將每個(gè)字母C減(或加)一序數(shù)K,即 c=c-k, 例如序數(shù)k為5,這時(shí) Z→U,z→u,Y→T… 當(dāng)加序數(shù)后的字母小于A或a則 c=c-k +26 下段程序是加密處理: #include<stdio.h> char *jiami(char stri[]) { int i=0; char strp[50],ia; while(stri[i]!=’\0’) { if(stri[i]>=’A’&&stri[i]<=’Z’) { ia=stri[i]+5; if (ia>’Z’) ia-=26; } else if(stri[i]>=’a’&&stri[i]<=’z’) { ia=stri[i]+5; if (ia>’z’) ia-=26; } else ia=stri[i]; strp[i++]=ia; } strp[i]=’\0’; return(strp); } main() { char s[50]; gets(s); printf("%s\n", jiami(s)); } 2.統(tǒng)計(jì)文本單詞的個(gè)數(shù) 輸入一行字符,統(tǒng)計(jì)其中有多少個(gè)單詞,單詞之間用格分隔開。 算法思路: (1)從文本(字符串)的左邊開始,取出一個(gè)字符;設(shè)邏輯量word表示所取字符是否是單詞內(nèi)的字符,初值設(shè)為0 (2)若所取字符不是“空格”,“逗號(hào)”,“分號(hào)”或“感嘆號(hào)”等單詞的分隔符,再判斷word是否為1,若word不為1則表是新單詞的開始,讓單詞數(shù)num = num +1,讓word =1; (3)若所取字符是“空格”,“逗號(hào)”,“分號(hào)”或“感嘆號(hào)”等單詞的分隔符, 則表示字符不是單詞內(nèi)字符,讓word=0; (4) 再依次取下一個(gè)字符,重得(2)(3)直到文本結(jié)束。 下面程序段是字符串string中包含的單詞數(shù) #include "stdio.h" main() {char c,string[80]; int i,num=0,word=0; gets(string); for(i=0;(c=string[i])!='\0';i++) if(c==' ') word=0; else if(word==0) { word=1; num++;} printf("There are %d word in the line.\n",num); }
十二、窮舉法 窮舉法(又稱“枚舉法”)的基本思想是:一一列舉各種可能的情況,并判斷哪一種可能是符合要求的解,這是一種“在沒有其它辦法的情況的方法”,是一種最“笨”的方法,然而對(duì)一些無法用解析法求解的問題往往能奏效,通常采用循環(huán)來處理窮舉問題。 例: 將一張面值為100元的人民幣等值換成100張5元、1元和0.5元的零鈔,要求每種零鈔不少于1張,問有哪幾種組合? main() { int i, j, k; printf(" 5元 1元 5角\n"); for(i=1; i<=20; i++) for(j=1; j<=100-i; j++) { k=100-i-j; if(5*i+1*j+0.5*k==100) printf(" %3d %3d %3d\n", i, j, k); } }
十三、遞歸算法 用自身的結(jié)構(gòu)來描述自身,稱遞歸 VB允許在一個(gè)Sub子過程和Function過程的定義內(nèi)部調(diào)用自己,即遞歸Sub子過程和遞歸Function函數(shù)。遞歸處理一般用棧來實(shí)現(xiàn),每調(diào)用一次自身,把當(dāng)前參數(shù)壓棧,直到遞歸結(jié)束條件;然后從棧中彈出當(dāng)前參數(shù),直到棧空。 遞歸條件:(1)遞歸結(jié)束條件及結(jié)束時(shí)的值;(2)能用遞歸形式表示,且遞歸向終止條件發(fā)展。 例:編fac(n)=n! 的遞歸函數(shù) int fac(int n) { if(n==1) return(1); else return(n*fac(n-1)); } main() { int n; scanf("%d", &n); printf("n!=%d\n", fac(n)); }
|
1.中國站長站:http://www.chinaz.com ?
? 站長站以專業(yè)提供站長相關(guān)資源下載而出名,可以說做得也不是很早,但現(xiàn)在人氣很旺,下載資源更新很快,有很多的服務(wù)器下載點(diǎn),下載速度也不錯(cuò),提供收費(fèi)下載通道,站點(diǎn)知名度及競爭力都在國內(nèi)同類站點(diǎn)領(lǐng)先。對(duì)于站長來說的確已經(jīng)不錯(cuò),特別是論壇交流。但對(duì)于WEB技術(shù)資源來說,是否還缺一些除了下載外,其它的東東呢:)。 ?
? ?
? 2.中國WEB開發(fā)者網(wǎng)絡(luò):http://www.webasp.net ?
? 一個(gè)新起的站點(diǎn),以提供WEB開發(fā)相關(guān)技術(shù)資源為主,最大的特色是其文檔資源真的很多,欄目豐富,包括在線軟件供求之類的,源碼資源也比較多,更新也比較快,下載點(diǎn)有幾個(gè),但速度有點(diǎn)慢,提供收費(fèi)下載通道,這個(gè)站現(xiàn)在還沒什么名氣,人氣比較差,可能是新站沒什么宣傳,但應(yīng)該具有很強(qiáng)的競爭力。 ?
? ?
? 3,源碼之家:http://www.mycodes.net ?
? 比較早的源碼下載站點(diǎn),源碼比較多,有三個(gè)下載點(diǎn),全部http下載,速度不錯(cuò),更新速度比較快,應(yīng)該說站點(diǎn)的知名度也是很高的,但也是專門提供下載服務(wù)及論壇,無其它技術(shù)欄目,站點(diǎn)人氣也不錯(cuò),具有較強(qiáng)的競爭力。 ?
? ?
? 4.ASP300:http://www.asp300.com ?
? 國內(nèi)做的很早的下載站之一,專業(yè)提供asp代碼下載,是比較早進(jìn)行收費(fèi)的代碼下載站點(diǎn),很多人都說其“拿別人站點(diǎn)免費(fèi)代碼當(dāng)商業(yè)代碼”,今年進(jìn)行一次改版,整個(gè)感覺不錯(cuò),更新速度較快,一個(gè)下載點(diǎn),下載速度也不錯(cuò),下載資源庫存也比較大,但很多需是收費(fèi)會(huì)員才能下載。知名度比較高,但現(xiàn)在人氣比較差,一般現(xiàn)在很多都是看其知名度去的。如果告別免費(fèi)能讓大家接受,那么其競爭力是比較強(qiáng)的。 ?
? ?
? 5.中國源碼中心:http://www.cncode.com ?
? 也是比較早的源碼下載站點(diǎn),只提供下載和論壇服務(wù),現(xiàn)有源碼容量一般,一個(gè)下載點(diǎn),速度比較慢,一直以來都沒什么起色,老字號(hào),更新速度還可以,人氣一般,但知名度比較高,所以現(xiàn)在還是比較多人去的,具有較強(qiáng)的競爭力。 ?
? ?
? 6.源碼吧:http://www.yuanma8.com ?
? 一個(gè)新起的站點(diǎn),專門提供源碼下載服務(wù),現(xiàn)有庫存容量一般,一個(gè)下載點(diǎn),速度一般,感覺建站好象沒多長時(shí)間,但現(xiàn)在人氣也還不錯(cuò)?,F(xiàn)在有一定的知名度,不長時(shí)間能做到這樣,受益于其好記的站名外,更主要的是其站點(diǎn)的管理團(tuán)隊(duì)?wèi)?yīng)該不錯(cuò),具有較強(qiáng)的競爭力。 ?
? ?
? 7.時(shí)代者:http://www.im86.com ?
? 主要提供源碼下載服務(wù),現(xiàn)庫存源碼容量一般,一個(gè)下載點(diǎn),下載速度比較快,更新也比較快,人氣也還不錯(cuò)。有一定的知名度,具有較強(qiáng)的競爭力。 ?
? ?
? 8.源碼聯(lián)盟:http://www.aspsun.com ?
? 也是一個(gè)較早的源碼下載站點(diǎn),現(xiàn)有庫存一般,四個(gè)下載點(diǎn),下載速度還不錯(cuò),更新速度一般,人氣較差,只提供下載無論壇,有一定的知名度,感覺還行,具有較強(qiáng)的競爭力。 ?
? ?
? 9.下吧源碼聯(lián)盟:http://www.xia8.com ?
? 一個(gè)專門的下載站,現(xiàn)有的庫存還可以,三個(gè)下載點(diǎn),下載速度還不錯(cuò),更新速度還可以,人氣較差,感覺還可以,印象不是很深,具有較強(qiáng)的競爭力。 ?
? ?
? 10.k666軟件園:http://down.kk66.com ?
? 這個(gè)相信大家都知道的,建站很早,資源容量很大,更新也比較快,但現(xiàn)在很多人都被其站點(diǎn)的亂七八糟內(nèi)容及廣告給打走了,極端商業(yè)化已經(jīng)使他逐漸的失去他自身的魅力。對(duì)于WEB技術(shù)來說,源碼下載無分類,比較難找,就這點(diǎn)就不夠?qū)I(yè)。原來有人形容“瘦死的駱駝比馬大”“垃圾代碼一大堆”。還是希望其重整一下,能提供更多好的東東。因?yàn)槠洳皇菍iT提供WEB類資源,排在最后,但的確其資源及整站的人氣還是很不錯(cuò)的。如果重整一下,應(yīng)具有很強(qiáng)的競爭力。??
當(dāng)軟件開發(fā)遭遇政治流氓
?????? 在國內(nèi)的軟件行業(yè)不長不短工作了十年了,呆過的企業(yè)從國有到外企,從民營小作坊到民營大作坊,做過的領(lǐng)域,從工業(yè)控制(現(xiàn)在叫嵌入式系統(tǒng))到ERP,從電子商務(wù)到電子政務(wù),大小各類項(xiàng)目產(chǎn)品有十幾個(gè),團(tuán)隊(duì)伙伴有大陸人,香港人,臺(tái)灣人,有東洋人,有西洋人.現(xiàn)在回頭縷縷,項(xiàng)目沒有失敗的(當(dāng)然這取決于怎么定義失敗),反正都能做出來,過程中間,反正死幾批人,當(dāng)官的照樣當(dāng)官,投資人心疼不已,甲方抱怨甚至謾罵,計(jì)劃延期甚至一倍,最后都做出來了,正是那句"一將功成萬骨枯".
?久而久之,我發(fā)現(xiàn),無論什么樣的項(xiàng)目里,其開發(fā)團(tuán)隊(duì)里總有一類人,這類人的共性特征很明顯,如下幾點(diǎn):
?????? 1.滿嘴跑概念,尤其是英文縮寫語(acronym),比如:OO,AOP,SSO,IOC,SOA,GOF,Open-Close,MDA,TDD,B2B,,以及英文詞匯,比如,pattern,schema,catalog,Service Engine,Portal,然而對(duì)于概念的內(nèi)含或者語義并沒有清楚的理解.請注意我說話的重點(diǎn)不是他們說概念(為了溝通的方便,我也傾向直接引用原文的英文術(shù)語),而是他們在對(duì)于概念的內(nèi)涵的理解不透徹的情況下,頻頻使用,甚至不分上下文(context),就往上胡鄒.可笑的是,大多數(shù)情況下,這類人憑著這種說話pattern,總能在開發(fā)組織里混得比那些每天分析,設(shè)計(jì),寫代碼,debug的老實(shí)人(扎扎實(shí)實(shí)的技術(shù)人員)得老板(不單指企業(yè)所有者,指廣義上的上一層領(lǐng)導(dǎo))賞識(shí),尤其是當(dāng)這些所謂的"老板"也是個(gè)二五眼的時(shí)候,"老板"也是在打工掙錢混日子,為了政治上的需要,這時(shí)候多數(shù)都會(huì)用對(duì)這類人的認(rèn)可換得支持.這時(shí)候,"皇帝的新裝"這個(gè)模式就實(shí)例化了.之后,那些"概念販子"通常都能青云直上,而"老實(shí)人"就永遠(yuǎn)都給這些人打工.
?????? ?2.一旦發(fā)現(xiàn)在成員中有人比自己更清楚這些概念的涵義,通常都會(huì)視之為眼中釘,務(wù)必除之而后快.因?yàn)檫@后者實(shí)際是扮演了"皇帝的新裝"中的那個(gè)小男孩,但是,皇帝對(duì)小孩也得矜持點(diǎn)兒,而前者對(duì)后者,通常是同事,或是上下級(jí).而一旦"概念販子"是上級(jí),那就更壞了,我們可以企望這個(gè)上級(jí)的寬闊胸襟(小概率事件),然而事實(shí)通常是恰恰相反,這里的沒有小孩,只有楊修.
????????3."弄",這個(gè)"弄"便是"弄臣","弄權(quán)"的"弄",也是<金瓶梅>里常說的"弄將起來"的"弄".在項(xiàng)目進(jìn)程中,這類人很能"弄".最簡單的場景是,當(dāng)團(tuán)隊(duì)成員為某個(gè)技術(shù)方案攻關(guān)而獻(xiàn)計(jì)獻(xiàn)策的時(shí)候,這類人常常會(huì)拋出一些概念,再附上簡單的異想天開的解說,一面證明著大多數(shù)人的"不慧,甚矣",一面證明著自己的卓然出眾,令決策者拍板,然而總是有個(gè)特殊之處,就是,這種情況往往都不是這個(gè)弄者需要親自實(shí)踐證明其說法的時(shí)候.為什么要"弄"呢?其實(shí)很簡單,這類人,靠得就是這個(gè)來吃飯的.通過"弄",結(jié)果往往是,為了解決一個(gè)問題,一"弄"就會(huì)多出n個(gè)問題,變小亂為大亂,不亂這些人怎么混呢?
?
??????? 我說這些,不是為了砸這些人的飯碗,而且我不信我有這個(gè)能力."天生我才必有用"這句話從誰的嘴里都能說出來.但是,這類人確實(shí)是軟件開發(fā)團(tuán)隊(duì)的致病基因.我知道有人會(huì)說,大家都是出來混口飯吃,你何必呢?我只是想給大家提個(gè)醒.當(dāng)這類人當(dāng)領(lǐng)導(dǎo)的時(shí)候,你可得小心謹(jǐn)慎一萬倍,不然你糊里糊涂的就被領(lǐng)導(dǎo)給喀嚓了.當(dāng)這類人當(dāng)領(lǐng)導(dǎo)的時(shí)候,會(huì)演變出另一大特性,就是喜歡有人提鞋和"拍".所以,目前盡管internet很普遍,各位也都通過google可以做一個(gè)稱職的knowledge worker,但是,有g(shù)oogle搜不到的,就是"概念販子"的那個(gè)"小".
???????? 呵呵.本周剛剛遭遇了一回這樣的人,被算計(jì)了,被迫辭職.翻著<<狼圖騰>>這本書,突然想到這個(gè)了,技術(shù)上,我們別說跟著MIB(Don Box語:MIB==Microsoft,IBM,BEA,其實(shí)大家可能都知道,這是電影MIB==Man In Black),能跟上open source社區(qū)就不錯(cuò)了.但是,中國軟件業(yè)的經(jīng)理們,牛啊,牛得中國軟件業(yè)就和中國國家男子足球隊(duì)似的.沒辦法,經(jīng)理們也是苦大的,跟狼一樣,還在靠和別的狼搶肉吃活著呢.經(jīng)理們開會(huì)的時(shí)候,坐在VIP的位子上,理解是:Very Important Person,但是我的前德國老板對(duì)此的解釋為:Very Interesting Pig.
女性進(jìn)入軟件業(yè)必看?
?說句實(shí)話,如果你不是因?yàn)橛信d趣,那么女生最好還是不要做程序員。
做程序員很苦很累,對(duì)身體也不好,錢可能暫時(shí)多一下,以后發(fā)展也是大問題。特別是現(xiàn)在許多企業(yè)都不招收女性做程序員.....除非你很牛。
如果你選定了做程序員這條路,那么恭喜你,你至少要做好三件事的準(zhǔn)備。
1放棄正常生活,放棄女性愛美的心態(tài),把精力投入到看書看代碼寫程序上,放棄對(duì)購物化妝的愛好,否則你將很快被新人新技術(shù)淘汰。
2做好被拒絕被剝削的思想準(zhǔn)備,由于生理原因,軟件行業(yè)的程序員一般不喜歡用女性,就算是女性做程序員,工資也很難超過男性程序員,除非....你很牛。
3做好長期低收入的準(zhǔn)備。剛?cè)胄械某绦騿T一般在2-3K之間(不排除你運(yùn)氣好,微軟要你給你開10K的收入),而且如果不能在2-3年內(nèi)得到發(fā)展,那么你的工資在4-5K左右將不會(huì)再變動(dòng),直到你30歲被踢出程序員的行列前,你將一直拿這個(gè)工資。
如果你愿意,那么我再根據(jù)你以后想從事的專業(yè),給你提一下你該學(xué)習(xí)的知識(shí)。
如果你看了我寫的東西還沒有被嚇倒,那么我繼續(xù)談你該學(xué)習(xí)的內(nèi)容。
做程序員,應(yīng)該選好自己努力的方向。是準(zhǔn)備做ERP,通訊,嵌入式等等,是準(zhǔn)備在WINDOWS平臺(tái)下發(fā)展還是在UNIX\LINUX下發(fā)展,你以后準(zhǔn)備由技術(shù)-技術(shù)架構(gòu),還是技術(shù)-管理。如果只是被動(dòng)的走,只想多拿錢,那么我可以告訴你,你這個(gè)程序員是非常失敗的,而且以后路會(huì)越走越窄,不要指望公司會(huì)為你考慮發(fā)展,國內(nèi)公司都是非常自私的。
無論如何,作為程序員,以下幾個(gè)內(nèi)容必須掌握
C語言,數(shù)據(jù)結(jié)構(gòu),算法,編譯原理(不強(qiáng)求,至少知道詞法分析和語法分析),OS的一些基本原理(進(jìn)程調(diào)度,內(nèi)存調(diào)度等等),計(jì)算機(jī)體系結(jié)構(gòu),軟件工程
其他的要求至少英語四級(jí)(不然MSDN沒法看),寫過程序,數(shù)學(xué)不要太差
如果你掌握了這些內(nèi)容,說明你至少和科班出身站在了同一起跑線上了。下面再根據(jù)你自己愿意從事專業(yè)發(fā)展。發(fā)展大致可以按平臺(tái)劃分
1WINDOWS平臺(tái)
2LINUX/UNIX平臺(tái)
3嵌入式平臺(tái)
WINDOW平臺(tái)機(jī)會(huì)最多,待遇也最低,LINUX/UNIX次子,嵌入式待遇最好。但是學(xué)習(xí)機(jī)會(huì)剛好相反,WIN平臺(tái)很好學(xué),LINUX/UNIX一般用于大型機(jī),而你自己估計(jì)平時(shí)也不會(huì)用這些東西,至于嵌入式,如果公司不給你機(jī)會(huì)學(xué)習(xí),那你根本就沒法進(jìn)入這個(gè)行業(yè)。
當(dāng)如,如果你在三個(gè)平臺(tái)之一能做到精通,那么待遇都會(huì)很高。不過我敢說,就算CSDN,真正能透徹了解WINDOWS運(yùn)行機(jī)制,能把API運(yùn)用的純熟的人都不會(huì)太多。
如果你做網(wǎng)絡(luò),網(wǎng)絡(luò)也可以分很多。你是準(zhǔn)備做布線,管理,架構(gòu)還是研發(fā)?如果研發(fā),又可以分寫一般通訊程序,路由等網(wǎng)絡(luò)設(shè)備研發(fā)(已經(jīng)偏硬)等。
那么建議你至少熟悉以下內(nèi)容
多平臺(tái)的進(jìn)程調(diào)度多線程和線程同步(TCP/IP協(xié)議在不同平臺(tái)通訊很正常)
TCP/IP協(xié)議的了解
熟悉C/C++(跨平臺(tái)C開發(fā),包括VC,GCC等等)
等等
?
代碼走查(code walkthrough) 和代碼審查(code inspection)
|
代碼審查
又叫人工走查,就是用人工檢查被測試的程序。
代碼走查是一個(gè)開發(fā)人員與架構(gòu)師集中與討論代碼的過程。代碼走查的目的交換有關(guān)代碼是如何書寫的思路,并建立一個(gè)對(duì)代碼的標(biāo)準(zhǔn)集體闡述。 在代碼走查的過程中,開發(fā)人員都應(yīng)該有機(jī)會(huì)向其他人來闡述他們的代碼。 通常地,即便是簡單的代碼闡述也會(huì)幫助開發(fā)人員識(shí)別出錯(cuò)誤并預(yù)想出對(duì)以前麻煩問題的新的解決辦法。
當(dāng)團(tuán)隊(duì)成員對(duì)代碼進(jìn)行討論的時(shí)候,他們的討論應(yīng)該集中到一些重要的話題上,比如算法,基于對(duì)象的編程,類設(shè)計(jì)。 然而,許多代碼走查不會(huì)做這些事,通常代碼走查是枯燥的,煩人的,機(jī)械的。 這就是為什么許多開發(fā)人員討厭這些。要使得代碼走查變得很有效,那么這個(gè)過程就必須是有趣的,有創(chuàng)造性的。 很經(jīng)常地,代碼走查退化成了僅是關(guān)注于強(qiáng)制代碼標(biāo)準(zhǔn)--一個(gè)可以被自動(dòng)執(zhí)行的實(shí)踐。當(dāng)這種情形出現(xiàn)后,團(tuán)隊(duì)通常會(huì)覺得代碼走查沒有價(jià)值,然后將代碼走查從他們開發(fā)過程中去除掉。這樣便失去了他們可以從正確地執(zhí)行代碼走查的過程獲益的機(jī)會(huì)。
引言
"Visual C++與Delphi之比較"最近在CSDN的論壇上的討論非?;馃幔疚膶⒁砸粋€(gè)程序員的角度,從技術(shù)水平、功能、性能、易用性、穩(wěn)定性、發(fā)展歷程和前景等方面,以Visual C++6和Delphi5為代表,盡可能客觀地比較介紹Visual C++和Delphi這兩大主流開發(fā)工具的優(yōu)缺點(diǎn),其中將涉及到語言、應(yīng)用框架、控件、編譯和連接、集成界面、調(diào)試、COM、數(shù)據(jù)庫開發(fā)等。本文還將對(duì)如何選擇使用這兩個(gè)開發(fā)工具提出一些建議。
值得一提的是,由于C++Builder與Delphi同為Inprise公司產(chǎn)品,它們除了使用的語言不同,其余特性幾乎都相同。因此本文對(duì)C++Builder程序員和學(xué)習(xí)者也有參考價(jià)值。
語言:存在即是合理
首先聲明常被混淆的一點(diǎn):VC和Delphi本身不是語言,而是開發(fā)平臺(tái)。它們所用的語言分別是略作擴(kuò)展的C/C++和Object Pascal。我在網(wǎng)上??吹接腥藛枒?yīng)該學(xué)C/C++還是VC,這個(gè)問題很好回答:如果你學(xué)VC你就必須得學(xué)C/C++,或者說你學(xué)會(huì)了VC也就學(xué)會(huì)了C/C++了。
言歸正傳,我們來比較一下C++和Object Pascal的優(yōu)缺點(diǎn)。有人認(rèn)為Object Pascal是"玩具語言",C++才是"專業(yè)語言",這是不對(duì)的。單從語言本身看,Object Pascal與C++屬同一重量級(jí)。它們都是完全支持面向?qū)ο蟮恼Z言,都扎根于"歷史悠久"的面向過程的語言。C++是由C發(fā)展而來的,Object Pascal由Pascal進(jìn)化而來。它們都有很強(qiáng)的靈活性,都有自己的特長和不足。比如說,Object Pascal不支持多重繼承、模板、操作符重載、內(nèi)聯(lián)函數(shù)定義、預(yù)處理、宏、全局靜態(tài)類變量、嵌套類定義,等等,而這些都是C++支持的。但同樣地C++也不支持Object Pascal的虛構(gòu)造函數(shù)、過程嵌套、內(nèi)置集合類型、內(nèi)置字符串類型、"finally"構(gòu)造等等,在RTTI方面Object Pascal也比C++做得好。但這些并不重要,因?yàn)榭梢酝ㄟ^其它方式達(dá)到同樣的目的,比如C++可以通過類擴(kuò)展支持集合、字符串,Object Pascal可以通過"interface"多重繼承,等等。關(guān)鍵是二者都可以很好地完成你手頭的任務(wù),這就夠了。
但是,僅僅比較語言本身是不夠的,還得看它們的被接受和流行程度,學(xué)習(xí)曲線,發(fā)展前途,可移植性等,以及,很重要但常常被忽略的一點(diǎn):與開發(fā)環(huán)境(指VC與Delphi)及其應(yīng)用框架的"磨合"程度。
VC和Delphi作為開發(fā)平臺(tái),很重要的一點(diǎn)就是提供了一個(gè)"無所不包"的應(yīng)用框架:VC的MFC和Delphi的VCL。MFC是用C++寫的,VCL是用Object Pascal寫的。當(dāng)然,我們都知道,C++的使用范圍比Object Pascal廣得多,移植性也好得多。這本來是優(yōu)點(diǎn),但很有意思的是,正因?yàn)槿绱?,微軟寫MFC時(shí)必須考慮最大限度減少對(duì)語言本身的改動(dòng),而把功夫下在源代碼級(jí),以便能盡可能支持ANSI等標(biāo)準(zhǔn),結(jié)果導(dǎo)致MFC的封裝復(fù)雜而不直觀。(尤其是它對(duì)消息的封裝,下文還會(huì)提到)。太多的宏定義和含義模糊且自動(dòng)生成、不得改動(dòng)的注釋使MFC乃至VC讓很多新手望而生畏,不敢"下水"深入學(xué)習(xí)。而Object Pascal幾乎是Inprise"專用"的,不必考慮"標(biāo)準(zhǔn)"問題,因此Inprise寫VCL時(shí)就把全部精力放在了結(jié)構(gòu)與性能上,結(jié)果語言與框架的磨合程度非常好。VCL框架的結(jié)構(gòu)清晰,VCL代碼的可讀性非常好。許多人說Delphi比較容易上手,也是這個(gè)緣故。天下沒有白吃的午餐。你要工業(yè)標(biāo)準(zhǔn)嗎?你要可移植性嗎(關(guān)于可移植性和兼容性,下文會(huì)詳細(xì)比較)?那么請面對(duì)MFC的"天書"級(jí)代碼吧。
編譯和連接:The Need For Speed
不同的語言帶來的另一個(gè)不同是,編譯和連接的速度的不同,以及執(zhí)行速度的不同。Delphi的編譯和連接速度,毫不夸張地說,比VC快幾十倍。即使把VC的Incremental Link選項(xiàng)打開,Delphi的編譯和連接速度仍比VC快好幾倍。并不是說微軟的編譯器不行,這是由C++的復(fù)雜性決定的。模板的處理、預(yù)處理和宏的展開都是很費(fèi)時(shí)的。前文不是提到Object Pascal沒有模板、預(yù)處理和宏嗎?這本來是缺點(diǎn),但帶來的一個(gè)好處就是編譯速度極快。至于編譯完的二進(jìn)制代碼,在打開相同的優(yōu)化選項(xiàng)的情況下,Delphi和VC執(zhí)行速度并沒有太大的差別。
為了克服編譯的速度問題,C++編譯器一般需要增強(qiáng)的連接器和預(yù)處理機(jī)制。但是預(yù)處理機(jī)制仍然存在若干問題:1)程序調(diào)試的斷點(diǎn)行可能和代碼行不同;2)沒有將最新的代碼信息綜合進(jìn)去;3)容易產(chǎn)生錯(cuò)誤的邏輯;4)因?yàn)樽x錯(cuò)文件頭而很容易產(chǎn)生類似"Unexpected End of File"的錯(cuò)誤。
兩個(gè)編譯器有個(gè)共同點(diǎn)是都能識(shí)別無用的"死"代碼,比如一個(gè)沒有用的函數(shù)等等。編譯后的程序?qū)⒉话@些多余的信息。Delphi在這方面作得更加出色。它可以讓你在編輯器中可視化地提示出那行代碼是"活"的、那行代碼是"死"的。這樣你就能整理出最精簡的代碼。Delphi在編譯后將在左邊顯示一個(gè)小藍(lán)點(diǎn)表示這行代碼是"活"的。Visual C++做不到這點(diǎn)。
Delphi編譯后可執(zhí)行文件至少有200K(如果不使用VCL,僅僅使用WinAPI,文件的大小將大大縮小)但是Visual C++編程使用MFC編譯后的可執(zhí)行文件通常只有幾十K,主要是因?yàn)槲④浺呀?jīng)將系統(tǒng)運(yùn)行庫包含在Windows系統(tǒng)了(Borland公司曾經(jīng)和微軟協(xié)商這個(gè)接口,但是微軟利用操作系統(tǒng)的優(yōu)勢不愿意公開)。同樣道理,使用BDE開發(fā)的的數(shù)據(jù)庫程序必須附帶3-5M的額外系統(tǒng)文件,也是非常不協(xié)調(diào)的。
非常有趣的是,Delphi能夠使用由C++ Builder創(chuàng)建的的OBJ文件,但是使用上受很大的局限性。
最后,Visual C++的編譯和連接時(shí)的錯(cuò)誤信息比Delphi要詳細(xì)和具體的多。特別是使用ATL開發(fā)更加如此。
應(yīng)用框架:MFC?有KFC流行嗎?
應(yīng)用程序框架(Application Frame),有時(shí)也稱為對(duì)象框架。Visual C++采用的框架是MFC。MFC不僅僅是人們通常理解的一個(gè)類庫(同樣,Delphi的VCL也不僅僅是一個(gè)控件庫,盡管它的名字叫"可視控件庫")。你如果選擇了MFC,也就選擇了一種程序結(jié)構(gòu),一種編程風(fēng)格。MFC早在Windows 3.x的時(shí)代就出現(xiàn)了,那時(shí)的Visual C++還是16位的。經(jīng)過這些年的不斷補(bǔ)充和完善,MFC已經(jīng)十分成熟。但由于原型出現(xiàn)得比較早,MFC相比于VCL落后了一個(gè)時(shí)代。盡管微軟對(duì)MFC的更新沒有停止,我也經(jīng)常讀到"只要Windows不過時(shí),MFC就不會(huì)過時(shí)"之類觀點(diǎn)的文章,但就象Inprise(原Borland)的OWL框架的淡出一樣,MFC的淡出也是早晚的事。其實(shí)MFC是和OWL同一個(gè)時(shí)代的產(chǎn)物。OWL已經(jīng)不在了,MFC怎能不"居安思危"呢?如果MFC青春永駐,微軟的開發(fā)人員也不會(huì)"私自"開發(fā)出基于ATL的WTL呀。當(dāng)然,WTL的地位不能和MFC比,它并不是微軟官方支持的框架,封裝的功能也相當(dāng)有限。但至少也反襯出了MFC存在的不足。
我們以為,最能體現(xiàn)一個(gè)應(yīng)用程序框架的先進(jìn)性的是它的委托模型,即對(duì)Windows消息的封裝機(jī)制。對(duì)Windows API的封裝就不用說了吧。大同小異,也沒什么技術(shù)含量。如果高興,你也可以自己寫一個(gè)類庫來封裝。但對(duì)Windows消息驅(qū)動(dòng)機(jī)制的封裝就不是那么容易的了。最自然的封裝方式是采用虛成員函數(shù)。如果要響應(yīng)某個(gè)消息就重載相應(yīng)的虛函數(shù)。但出乎我的意料,MFC采用的是"古老"的宏定義方法。用宏定義方法的好處是省去了虛函數(shù)VTable的系統(tǒng)開銷(由于Windows的消息種類很多,開銷不算太小)。不過帶來的缺點(diǎn)就是映射不太直觀。對(duì)于MFC,則是"太不直觀"了。它的消息映射代碼雖然是可見的,但"勸君莫碰"。好在VC的ClassWizard可以自動(dòng)生成消息映射代碼,使用起來還算方便。但和VCL的委托模型相比,MFC的映射方法就顯得太落后了。而Delphi的Object Pascal因?yàn)闆]有"標(biāo)準(zhǔn)負(fù)擔(dān)",語言引入了組件、事件處理、屬性等新特性。由于功夫做在編譯器級(jí),生成的源代碼就顯得十分簡潔。似乎VC是"讓框架遷就語言",而Delphi是"讓語言遷就框架"。
我想舉一個(gè)對(duì)字符串操作的封裝的例子來說明MFC和VCL的優(yōu)缺點(diǎn)。在MFC中,CStringList類有加入、獲取、刪除等功能,但VCL的TStringList類除了上述功能還有排序、從逗號(hào)分隔的字串讀入、流輸入輸出等功能。但同樣的字符串替換功能,VCL的StringReplace要比MFC的CString::Replace慢2-3倍。總的來說,VCL的封裝比MFC更為高層,更為抽象,但不可避免地帶來的問題是某些部分執(zhí)行效率比MFC略低。這就象低級(jí)語言(如匯編)的執(zhí)行效率比高級(jí)語言(如Basic)高,但編程效率較低。魚和熊掌不可兼得嘛。
VCL比之MFC的另一優(yōu)點(diǎn)是對(duì)異常處理的支持,而一大缺點(diǎn)是對(duì)多線程支持差。VCL的大部分都不是針對(duì)多線程優(yōu)化的。雖說VCL提供了簡化多線程操作的類,但只是工作者線程(worker threads)使用起來比較簡單。如果線程要和界面打交道的話事情就變得麻煩了,因?yàn)槌藨?yīng)用程序的主線程,任何線程不能訪問任何可視的VCL部件。你不得不使用Synchronize方法等待主線程處理它的消息,然后在主線程中訪問VCL部件。而MFC就沒有這樣的限制。
穩(wěn)定性與完善程度:VC是老大哥
VC要比Delphi穩(wěn)定和完善。VC的發(fā)展歷史比Delphi長,微軟的總體實(shí)力比Inprise強(qiáng)。VC的框架MFC經(jīng)歷了那么多年的發(fā)展和完善,功能非常全面,而且十分穩(wěn)定,bug很少。其中你可能遇到的bug也更少。而且有第三方的專門工具幫助你避開這些bug。如此規(guī)模的一個(gè)類庫,能做到這一點(diǎn)不容易。不要小看了這一點(diǎn),很多專業(yè)程序員就是為這個(gè)選擇VC的。因?yàn)楸M管VCL比MFC的抽象程度高,封裝較為高層,但由此帶來的開發(fā)效率的提高對(duì)高手來說畢竟是有限的。而如果你遇到一個(gè)怪問題,調(diào)試了半天,發(fā)現(xiàn)不是你的代碼有錯(cuò),而是VCL的bug,你作何感想?雖說遇到這類問題的可能性很小,但對(duì)VCL的形象的影響可不小。Delphi的IDE太占資源,啟動(dòng)速度太慢,和某些顯卡驅(qū)動(dòng)程序沖突,VCL中有bug,調(diào)試器不夠健壯,對(duì)不穩(wěn)定的第三方控件沒有防護(hù)措施 …… 問題多多,在這方面Delphi不如VC。希望Inprise能更上一層樓。順便說一下,我們在網(wǎng)上看到有些人極言Delphi的不穩(wěn)定,說幾分鐘出現(xiàn)20多次非法操作。Delphi的確不如Visual C++穩(wěn)定,但也不至于如此呀。我估計(jì)是那位朋友的Delphi裝了某些有問題的第三方控件,導(dǎo)致了Delphi的頻頻出錯(cuò)。不妨卸下那些控件試試?
可移植性:立足現(xiàn)實(shí),放眼未來
Inprise正在開發(fā)Delphi的Linux版本,代號(hào)為Kylix。也許通過Kylix,用VCL構(gòu)架編寫的Windows程序向Linux移植成為可能。但這只是可能。因?yàn)樵谀壳癐nprise的兼容性工作做得并不好。低版本的Delphi不能使用高版本的VCL組件,而高版本的Delphi竟然不能使用低版本的VCL組件。真是豈有此理,我們很少看見軟件有不向下二進(jìn)制兼容的。如果Windows 98不能運(yùn)行95的程序,Windows 95不能運(yùn)行3.x的程序,Win 3.x不能運(yùn)行DOS程序,你還會(huì)用Windows嗎?如果Windows 95的程序必須經(jīng)過重新編譯才能在98下運(yùn)行,98會(huì)賣得那么好嗎?"同門兄弟"C++Builder和Delphi也不能互相使用對(duì)方的組件,甚至同一套VCL庫的文件名也不一樣。所以一個(gè)組件有for D1/D2/D3/D4/D5/C1/C3/C4/C5這些不同版本是常有的事,而且隨著Delphi和C++Builder版本的升級(jí)可能還會(huì)增加。希望Inprise能先解決同門兄弟的兼容性問題。而微軟的VC就沒有這類問題。MFC1.0的程序也可以毫無障礙地在VC6.0下編譯通過。
集成界面:宏觀與微觀
就大處說,VC的集成界面是不如Delphi的。Delphi僅僅一個(gè)Object Inspector就可以將VC的一堆Wizards比下去,何況它還有Code Explorer、ToDo List等。但從小處,又可以看出Delphi的不成熟。比如"自動(dòng)完成"功能的智能化程度和提示詳細(xì)程度不如VC,響應(yīng)速度也沒有VC快。
Visual C++所帶的MSDN是一部"開發(fā)者的百科全書",信息龐大,查詢方便,這方面比Delphi更專業(yè)。很多幫助項(xiàng)都有源程序示范。
Delphi的OpenTools是完全面向第三方的開放系統(tǒng),開發(fā)者可以修改很多Borland公司自身的功能,從IDE的可擴(kuò)充性上說Delphi更好。
調(diào)試:細(xì)微之處見真功
Visual C++和Delphi的調(diào)試功能都非常強(qiáng)大,同時(shí)都具有單步可視化調(diào)試、斷點(diǎn)跟蹤、運(yùn)行時(shí)改變變量、鼠標(biāo)指向可以得到變量值等等功能。對(duì)DLL的輸入輸出也能方便的管理,能夠進(jìn)行源碼級(jí)別的調(diào)試。
相對(duì)而言,Visual C++能夠更加方便地看到變量的變化情況,這包括對(duì)結(jié)構(gòu)可以展開成數(shù)據(jù)樹,從而了解每一個(gè)變量的值,每一步調(diào)試,變化了的變量會(huì)加紅,從而使調(diào)試更加方便。另外,Visual C++的塊內(nèi)存察看比Delphi也要方便。
當(dāng)然,Delphi也有很多體貼的細(xì)微之處,比如在線程調(diào)試的時(shí)候,Delphi能夠很方便地察看線程的變化,Visual C++卻必須要彈出一個(gè)模式對(duì)話框。
數(shù)據(jù)庫開發(fā):Delphi一枝獨(dú)秀
數(shù)據(jù)庫支持是Delphi的強(qiáng)項(xiàng)。這主要體現(xiàn)在Delphi與BDE的無縫集成,以及Delphi提供的那一大堆現(xiàn)成的數(shù)據(jù)庫操作控件。這是VC望塵莫及的。目前Delphi支持BDE、ADO、InterBase三種數(shù)據(jù)庫訪問方式。所有的方式都能拖拉到應(yīng)用程序中實(shí)現(xiàn)可視化操作。正是因?yàn)镈elphi對(duì)數(shù)據(jù)庫類的包裝,使得用戶操作數(shù)據(jù)庫不像在Visual C++中必須從開始到最后都要干預(yù)。明顯地提高了開發(fā)速度。
Delphi中使用WebBroker控件還能很方便地構(gòu)造出基于數(shù)據(jù)庫的Web頁面,通過HTML管理Web數(shù)據(jù)庫。 Visual C++訪問數(shù)據(jù)主要通過ADO和OLEDB,很多ActiveX控件也能添加數(shù)據(jù)庫功能。但是沒有像Paradox這樣的桌面數(shù)據(jù)庫,Access相對(duì)功能太弱了。也許SQL Server是不錯(cuò)的選擇。
COM:新技術(shù)的力量
COM是組件對(duì)象模型的縮寫。它是OLE和ActiveX技術(shù)的基礎(chǔ),COM定義了一組API和一個(gè)二進(jìn)制標(biāo)準(zhǔn),讓不同的編程語言、不同平臺(tái)的彼此獨(dú)立的對(duì)象相互進(jìn)行通訊。
COM是Microsoft制訂的行業(yè)標(biāo)準(zhǔn)。但Delphi也為COM提供了強(qiáng)大的語言支持。支持接口、variant、寬字符串功能。這些對(duì)COM的封裝確實(shí)比C++更方便。比如在C++(沒有類框架)進(jìn)行COM編程時(shí),變體定義為oaidl.h文件中的VARIANT結(jié)構(gòu)。要處理變體,必須手工調(diào)整oleaut32.dll中VariantXXXX() API函數(shù)對(duì)其進(jìn)行初始化和管理,如VariantInit()、VariantCopy()、VariantClear()等等。
Visual C++實(shí)現(xiàn)COM編程有一種特殊的方法就是使用ATL。ATL使用Visual C++特有的多重繼承來實(shí)現(xiàn)COM接口。雖然不見得實(shí)現(xiàn)COM服務(wù)和控制更容易,但是ATL和最新COM技術(shù)的接口,基于模板的構(gòu)造都比Delphi強(qiáng)。ATL更有利于建立小巧、快捷的COM組件程序。
按目前通用的觀點(diǎn),Visual C++應(yīng)用到COM服務(wù)程序更有優(yōu)勢,Delphi應(yīng)用到COM組件程序更合適。
昨天,今天,明天
技術(shù)的進(jìn)步在很多時(shí)候是此消彼長的。當(dāng)初Borland的Turbo C和Borland C++幾乎是C/C++程序員唯一的選擇。微軟的Quick C(現(xiàn)在還有人知道這個(gè)產(chǎn)品嗎?)和Microsoft C/C++從來也沒有成為過主流。但Borland C++又流行了多少年呢?不久就被新崛起的Microsoft Visual C/C++壓下去了。于是Inprise(原Borland)揀起了當(dāng)年Turbo Pascal和Borland Pascal的輝煌(事實(shí)上Borland的成名作就是第一個(gè)Pascal編譯器),全力推出了Delphi。Delphi當(dāng)初推出時(shí)被稱為VB殺手,但VB現(xiàn)在仍然活得挺好。畢竟微軟是靠Basic起家的嘛,VB不是那么容易被打敗的。Inprise想了想不和VB爭了,使用Delphi的IDE和VCL配上C++語言,推出了C++Builder,又向Visual C++的市場發(fā)起了夾攻。C++Builder似乎是個(gè)不錯(cuò)的折衷選擇了?再仔細(xì)想想!C++Builder的優(yōu)點(diǎn)Delphi都有,但Delphi的優(yōu)點(diǎn)C++Builder未必有。比如C++Builder的編譯速度比VC還慢,哪能和Delphi比?而且因?yàn)閂CL是Object Pascal寫的,C++語言和VCL磨合得并不好。C++Builder的bug比Delphi還多,甚至Sample代碼中還有錯(cuò)。VCL的部分功能不能使用,要靠嵌入pascal代碼訪問。C++Builder可用的第三方控件遠(yuǎn)沒有Delphi多。
唉,真是金無足赤。Microsoft和Inprise,誰會(huì)笑在最后呢?
魚和熊掌:艱難的選擇
選擇一個(gè)開發(fā)工具依賴于很多不同的因素,每個(gè)人都能因?yàn)槟撤N語言的某個(gè)缺陷而放棄學(xué)習(xí)或使用這種語言。任何程序員都希望自己喜歡的工具能達(dá)到理想的境界,通過上面不完善的比較,我想大家都有自己的看法。我們認(rèn)為影響大家選擇開發(fā)語言的因素主要包括:
1) 哪門語言更容易入門?
學(xué)習(xí)一種語言需要投入大量的時(shí)間和精力。開發(fā)程序的開發(fā)成本是值得考慮的現(xiàn)實(shí)。一個(gè)熟練的Delphi程序員和一個(gè)熟練的VC程序員工作效率是一樣的。但是,成為熟練的程序員必須很快掌握一門語言的技巧。不幸的是,目前熟練的Visual C++程序員是十里挑一。相對(duì)而言,Delphi更適合初學(xué)者。
2) 哪門語言有更多可繼承的代碼?
語言代碼的可重用性是加快開發(fā)效率明顯方面,從早期的過程、函數(shù)到現(xiàn)在的組件技術(shù)都是朝這個(gè)目標(biāo)在奮斗。這兩種語言對(duì)代碼重用的理解是不一樣的,Delphi主要通過VCL控件來實(shí)現(xiàn)代碼重用,Visual C++實(shí)現(xiàn)起來就比較復(fù)雜。
3) 語言自身的本性。
就技術(shù)(主要指應(yīng)用框架)來說,Delphi目前領(lǐng)先于Visual C++。但穩(wěn)定性和健壯性的不足又讓我對(duì)Inprise"想說愛你不容易"。而VC盡管發(fā)展到今日已十分完善,但MFC框架已是明日黃花了。如果不使用MFC,目前又沒有合適的替代品。根據(jù)你的需要和實(shí)際情況做選擇吧。實(shí)際上Visual C++和Delphi也不是簡單競爭關(guān)系。它們在許多領(lǐng)域并不重疊,甚至是互補(bǔ)的。到底怎樣取舍,要根據(jù)你的項(xiàng)目特性決定。如果你開發(fā)系統(tǒng)底層的東西,需要極好的兼容性和穩(wěn)定性,選Visual C++吧。你可以只調(diào)用Windows的各種API,不用MFC。如果你寫傳統(tǒng)的Windows桌面應(yīng)用程序,Visual C++的MFC框架是"正統(tǒng)"的選擇;如果界面部分占這個(gè)應(yīng)用程序代碼比例較大的話,或者Delphi中有相關(guān)功能的控件的話,Delphi是事半功倍的選擇。如果你為企業(yè)開發(fā)數(shù)據(jù)庫、信息管理系統(tǒng)等高層應(yīng)用("高層"是相對(duì)于"低層/底層"而言的,不是說技術(shù)高級(jí)或低級(jí)),而且有比較緊的期限限制,選Delphi比較好。如果你熟悉的語言是Object Pascal,又不打算學(xué)復(fù)雜的C++,那么Delphi幾乎是唯一的選擇。傳統(tǒng)的觀點(diǎn)是:Delphi適合編寫Internet/Intranet、表格制圖、數(shù)據(jù)庫操作、高級(jí)用戶界面等等。Visual C++適合編寫設(shè)備驅(qū)動(dòng)、COM服務(wù)程序、科學(xué)計(jì)算、控制臺(tái)(console)程序、WinCE的應(yīng)用和一些小的工具等等。應(yīng)用范圍的不同要求好的程序員同時(shí)精通這兩門語言。
4) 語言的前景和可擴(kuò)充性。
Delphi是Inprise的旗艦產(chǎn)品之一,前景應(yīng)當(dāng)還是比較樂觀的,而且Inprise已經(jīng)在向Linux進(jìn)軍了,而微軟還遲遲沒有動(dòng)作。遺憾的是,Inprise公司Delphi的創(chuàng)始人已經(jīng)跳槽到微軟去主持Visual J++和C#項(xiàng)目了。但愿對(duì)Inprise沖擊不會(huì)太大。
微軟的Visual C++的前景又怎樣呢?Visual Studio 7.0就要推出了。這一版本將加強(qiáng)網(wǎng)絡(luò)開發(fā)的特性。看來微軟雖然被判解體,開發(fā)實(shí)力可是一點(diǎn)沒打折扣。
另外,雖說MFC已稍顯落后,但不是說它不值得學(xué)。事實(shí)上,不學(xué)MFC就等于沒學(xué)VC。利用MFC框架開發(fā)程序仍然是目前開發(fā)桌面應(yīng)用的主流模式,而且還會(huì)保持相當(dāng)長的時(shí)間。微軟公司CEO史蒂夫·巴爾默(Steve Ballmer)曾說,.NET流行還得等2-3年。那么,MFC至少還有2-3年的生命空間。在技術(shù)日新月異的IT界,2-3年實(shí)在是很長一段時(shí)間了。好好把握吧。即使你不使用MFC框架,花點(diǎn)時(shí)間看一下MFC的封裝機(jī)制對(duì)你熟悉C++的OOP機(jī)制和Windows底層功能也是很有好處的。而VCL的源代碼是Object Pascal的,對(duì)C/C++程序員就沒有這個(gè)"額外"的作用了。