我一直認為,4年根本不夠學習計算機的基礎知識,因為面太寬了,要是真學的話,我想至少8年的學習能使你具有一定的科學素養......
這方面我想先說說我們系在各校普遍開設的《計算機基礎》。在高等學校開設《計算
機基礎課程》是我國高教司明文規定的各專業必修課程要求。主要內容是使學生初步掌握
計算機的發展歷史,學會簡單的使用*作系統,文字處理,表格處理功能和初步的網絡應用
功能。但是在計算機科學系教授此門課程的目標決不能與此一致。在計算機系課程中目標
應是:讓學生較為全面的了解計算機學科的發展,清晰的把握計算機學科研究的方向,發
展的前沿即每一個課程在整個學科體系中所處的地位。搞清各學科的學習目的,學習內容
,應用領域。使學生在學科學習初期就對整個學科有一個整體的認識,以做到在今後的學
習中清楚要學什麼,怎麼學。計算機基本應用技能的位置應當放在第二位或更靠後,因為
這一點對於本系的學生應當有這個摸索能力。這一點很重要。推薦給大家一本書:機械工
業出版社的《計算機文化》(New Perspective of Computer Science),看了這本書我才
深刻的體會到自己還是個計算機科學初學者,才比較透徹的了解了什麼是計算機科學。科
學出版社的《計算科學導論》 (趙致琢先生的著作)可以說是在高校計算機教育改革上作
了很多的嘗試,也是這方面我受益很大的一本書。
一個一流計算機系的優秀學生決不該僅僅是一個編程高手,但他一定首先是一個編程
高手。我上大學的時候,第一門專業課是C語言程序設計,念計算機的人從某種角度講相當
一部分人是靠寫程序吃飯的。在我們北京工業大學實驗學院計算機系裡一直有這樣的爭論
(時至今日CSDN上也有),關於第一程序設計語言該用哪一種。我個人認為,用哪種語言
屬於末節,關鍵在養成良好的編程習慣。當年老師對我們說,打好基礎後學一門新語言只
要一個星期。現在我覺得根本不用一個星期,前提是先把基礎打好。不要再猶豫了,學了
再說,等你抉擇好了,別人已經會了幾門語言了。
[1]專談計算機系統的學習
匯編語言和微機原理是兩門特煩人的課。你的數學/理論基礎再好,也占不到什麼便宜。
這兩門課之間的次序也好比先有雞還是先有蛋,無論你先學哪門,都會牽扯另一門課里的
東西。所以,只能靜下來慢慢琢磨。這就是典型的工程課,不需要太多的聰明和頓悟,卻
需要水滴石穿的漸悟。有關這兩門課的書,計算機書店裡不難找到。弄幾本最新的,對照
着看吧。組成原理推薦《計算機組成與結構》清華大學王愛英教授寫的。匯編語言大家拿
8086/8088入個門,之後一定要學80x86匯編語言。實用價值大,不落後,結構又好,寫寫
高效病毒,高級語言裡嵌一點匯編,進行底層開發,總也離不開他,推薦清華大學沈美明
的《IBM-PC匯編語言程序設計》。有些人說不想了解計算機體繫結構,也不想製造計算機
,所以諸如計算機原理,匯編語言,接口之類的課覺得沒必要學,這樣合理嗎?顯然不合
理,這些東西遲早得掌握,肯定得接觸,而且,這是計算機專業與其他專業學生相比的少
有的幾項優勢。做項目的時候,了解這些是非常重要的,不可能說,僅僅為了技術而技術
,只懂技術的人最多做一個編碼工人,而永遠不可能全面地了解整個系統的設計,而編碼
工人是越老越不值錢。關於組成原理還有個講授的問題,在我學這門課程時老師講授時把
CPU工作原理譽微程序設計這一塊略掉了,理由是我們國家搞CPU技術不如別的國家,搞了這麼長時
間好不容易出了個龍芯比Intel的還差個十萬八千里,所以建議我們不要學了。我看這在各
校也未見得不是個問題吧!若真是如他所說,那中國的計算機科學哪個方向都可以停了,
軟硬件,應用,有幾項搞得過美國,搞不過別人就不搞了,那我們坐在這裡幹什麼?教學
的觀念需要轉變的。我們學校現在有一個學弟就專攻CPU設計,平時交流不少,發現他能夠
將軟件的設計思想應用到芯片設計上,我看真的是不錯的,比起那些望而生畏的恐怕要強
上百倍。
模擬電路這個學科,如今不僅計算機系學生搞不定,電子系學生也多半害怕。如果你
真想軟硬件通吃,那麼建議你先看看邱關源的"電路原理",也許此後再看模擬電路底氣會
足些。教材:康華光的"電子技術基礎"(高等教育出版社)還是不錯的(我校電子系在用
)。有興趣也可以參考童詩白的書。
數字電路比模擬電路要好懂得多。推薦大家看一看北京工業大學劉英嫻教授寫的《數
字邏輯》。業績人士都說這本書很有參考價值(機械工業出版社的)。原因很明了,實用
價值高,能聽聽她講授的課程更是有一種"享受科學"的感覺。清華大學閻石的書也算一本
好教材,遺憾的一點是集成電路講少了些。真有興趣,看一看大規模數字系統設計吧(北
航那本用的還比較多)。
計算機系統結構該怎麼教,國際上還在爭論。國內能找到的較好教材為Stallings的《
Computer Organization and Architecture:Designing for Performance》(清華影印本
)。國際上最流行的則是《Computer architecture: aquantitative approach》, by P
atterson & Hennessy。
[2]一些其他的專業課程
*作系統可以隨便選用《*作系統的內核設計與實現》和《現代*作系統》兩書之一。這
兩部都可以算經典,唯一缺點就是理論上不夠嚴格。不過這領域屬於Hardcore System,所
以在理論上馬虎一點也情有可原。想看理論方面的就推薦清華大學出版社《*作系統》吧,
高教司司長張堯學寫的,我們教材用的是那本。 可以說理論涉及的比較全,在有就是他的
實驗指導書,*作系統這門學科同程序設計一樣,不自己試着做些什麼恐怕很難搞通。另外
推薦一本《Windows*作系統原理》機械工業出版社的,這本書是我國*作系統專家在微軟零
距離考察半年,寫作歷時一年多寫成的,教*作系統的頂級教授除了清華大學的張堯學(現
高教司司長)很多專家都參加了。Bill Gates親自寫序。裡面不但結合windows2000,xp詳
述*作系統的內核,而且後面講了一些windows編程基礎,有外版書的味道,而且上面一些
內容可以說在國內外只有那本書才有對windows內核細緻入微的介紹。
如果先把形式語言學好了,則編譯原理中的前端我看只要學四個算法:最容易實現的
遞歸下降;最好的自頂向下算法LL(k);最好的自底向上算法LR(k);LR(1)的簡化S
LR(也許還有另一簡化LALR)。後端完全屬於工程性質,自然又是another story。 推薦
教材:Kenneth C.Louden寫的《Compiler Construction Principles and Practice》即是
《編譯原理及實踐》(機械工業出版社的譯本)
學數據庫要提醒大家的是,會用VFP,VB, Power builder不等於懂數據庫。(這世界
上自以為懂數據庫的人太多了!)數據庫設計既是科學又是藝術,數據庫實現則是典型的
工程。所以從某種意義上講,數據庫是最典型的一門計算機課程-------------理工結合,
互相滲透。另外推薦大家學完軟件工程學後再翻過來看看數據庫技術,又會是一番新感覺
。至少對一些基本概念與描述方法會有很深的體會,比如說數據字典,E-R圖之類的。推薦
教材:Abraham Silberschatz等著的 "Database System Concepts".作為知識的完整性,
還推薦大家看一看機械工業出版社的《數據倉庫》譯本。
計算機網絡的標準教材還是來自Tanenbaum的《Computer Networks》(清華大學有譯
本)。還有就是推薦謝希仁的《計算機網絡教程》(人民郵電出版社)問題講得比較清楚
,參考文獻也比較權威。不過,網絡也屬於Hardcore System,所以光看書是不夠的。建議
多讀RFChttp://www.ietf.org/rfc.html里可以按編號下載RFC文檔。從IP的讀起。等到能
掌握10種左右常用協議,就沒有幾個人敢小看你了。再做的工作我看放在網絡設計上就比
較好了。
數據結構的重要性就不言而喻了,學完數據結構你會對你的編程思想進行一番革命性
的洗禮,會對如何建立一個合理高效的算法有一個清楚的認識。對於算法的建立我想大家
應當注意以下幾點:
當遇到一個算法問題時,首先要知道自己以前有沒有處理過這種問題.如果見過,那麼
你一般會順利地做出來;如果沒見過,那麼考慮以下問題:
1. 問題是否是建立在某種已知的熟悉的數據結構(例如,二叉樹)上?如果不是,則要自
己設計數據結構。
2. 問題所要求編寫的算法屬於以下哪種類型?(建立數據結構,修改數據結構,遍歷,查
找,排序...)
3. 分析問題所要求編寫的算法的數學性質.是否具備遞歸特徵?(對於遞歸程序設計,只要
設計出合理的參數表以及遞歸結束的條件,則基本上大功告成.)
4. 繼續分析問題的數學本質.根據你以前的編程經驗,設想一種可能是可行的解決辦法,
並證明這種解決辦法的正確性.如果題目對算法有時空方面的要求,證明你的設想滿足其要
求.一般的,時間效率和空間效率難以兼得.有時必須通過建立輔助存儲的方法來節省時間.
5. 通過一段時間的分析,你對解決這個問題已經有了自己的一些思路.或者說,你已經可
以用自然語言把你的算法簡單描述出來.繼續驗證其正確性,努力發現其中的錯誤並找出解
決辦法.在必要的時候(發現了無法解決的矛盾),推翻自己的思路,從頭開始構思.
6. 確認你的思路可行以後,開始編寫程序.在編寫代碼的過程中,儘可能把各種問題考慮
得詳細,周密.程序應該具有良好的結構,並且在關鍵的地方配有注釋.
7. 舉一個例子,然後在紙上用筆執行你的程序,進一步驗證其正確性.當遇到與你的設想
不符的情況時,分析問題產生的原因是編程方面的問題還是算法思想本身有問題.
8. 如果程序通過了上述正確性驗證,那麼在將其進一步優化或簡化。
9. 撰寫思路分析,注釋.
對於具體的算法思路,只能靠你自己通過自己的知識和經驗來加以獲得,沒有什麼特
定的規律(否則程序員全部可以下崗了,用機器自動生成代碼就可以了).要有豐富的想象
力,就是說當一條路走不通時,不要鑽牛角尖,要敢於推翻自己的想法.我也只不過是初學
者,說出上面的一些經驗,僅供大家參考和討論。
關於人工智能,我覺得的也是非常值得大家仔細研究的,雖然不能算是剛剛興起的學
科了,但是絕對是非常有發展前途的一門學科。我國人工智能創始人之一,北京科技大學
塗序彥教授(這老先生是我的導師李小堅博士的導師)對人工智能這樣定義:人工智能是
模仿、延伸和擴展人與自然的智能的技術科學。在美國人工智能官方教育網站上對人工智
能作了如下定義:Artificial Intelligence, or AI for short, is a combination o
f
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".
這門學科研究的問題大概說有:
(1)符號主義: 符號計算與程序設計基礎,知識表達方法 :知識與思維,產生式規則,
語意網絡,一階謂詞邏輯問題求解方法:搜索策略,啟發式搜尋,搜尋算法,問題規約方
法,謂詞演算:歸結原理,歸結過程專家系統:建立專家系統的方法及工具
(2)聯接主義(神經網絡學派):1988年美國權威機構指出:數據庫,網絡發展呈直線上
升,神經網絡可能是解決人工智能的唯一途徑。關於神經網絡學派,現在很多還是在發展
階段。
我想對於人工智能的學習,大家一定不要像學數學似的及一些現成的結論,要學會分
析問題,最好能利用程序設計實現,這裡推薦給大家ACM最佳博士論文獎獲得者塗曉媛博士
的著作《人工魚-計算機動畫的人工生命方法》(清華大學出版社)。搞人工生命的同學不
會不知道國際知名的塗氏父女吧。關於人工智能的書當然首選《Artificial Intelligenc
e A New Synthesis》Nils J.Nilsson.鼻祖嘛!
關於網絡安全我也想在這裡說兩句,隨着計算機技術的發展,整個社會的信息化水平
突飛猛進,計算機網絡技術日新月異,網絡成了當即社會各個工作領域不可缺少的組成部
分,只要有網絡存在,網絡安全問題就是一個必須解決好的問題,學習網絡安全不是簡簡
單單的收集一些黑客工具黑一黑別人的網站,而是要學習他的數學原理,實現原理,搞清
底層工作機制,這樣才能解決大部分的現有問題和新出現的安全問題。 總的來說信息安全
學的研究還是非常深奧的,這方面體會比較深的要算是在最近的微軟杯程序設計大賽中利
用.NET平台開發的那個項目My E-business Fairy.NET過程中了。
[3]閒聊軟件工程
關於計算機科學的一些邊緣科學我想談一談軟件工程技術,對於一個企業,推出軟件
是不是就是幾個程序員坐在一起,你寫一段程序,我寫一段程序呢?顯然不是。軟件工程
是典型的計算機科學和數學,管理科學,心理學,社會學等學科的綜合。它使我們這些搞
理論和技術的人進入了一個社會。你所要考慮的不僅僅是程序的優劣,更應該考慮程序與
軟件的區別,軟件與軟件產品的區別,軟件軟件產品的市場前景,如何去更好的與人交流
。這方面我還在學習階段,以後這方面再寫文章吧,先推薦給大家幾本書:暢銷20年不衰
的《人月神話》(清華大學中文版,中國電力出版社影印版),《軟件工程-實踐者研究的
方法》(機械工業出版社譯本),《人件》(據說每一位微軟公司的部門經理都讀過這本
書,推薦老總們和想當老總的同學都看看,了解一下什麼是軟件企業中的人)以及微軟公
司的《軟件開發的科學與藝術》和《軟件企業的管理與文化》(研究軟件企業的制勝之道
當然要研究微軟的成功經驗了!) 看完上面的書,結合自己做的一些團隊項目,我的一些
比較深的體會有這麼幾點:
1.How important a plan is for a project development.
2.How to communicate with your team members in a more effective way.
3.How to solve unexpected situations.
4.The importance of unification.
5.The importance of doing what you should do.
6.The importance of designing before programming.
7.The importance of management.
8.The importance of thinking what your teammates think.
在軟件開發過程中我們應當具有以下能力:
1.Like it if you would like to do it.
We believe that your attitude toward your work will definitely
makes great effect on the project.
2.The spirit of group working.
Take myself as an example. I am just a part of the team, just a
little part. You must make it clear that you are just a member of
the team, but your effort will change your project a lot.
3.Passion
With passion, you can do your job in a more effective way.
4.The ability of solving unexpected problems.
5.Learning New things in a very short time
It is the basic requirement for we computer major to learn new technology.
6.Creativity
The tools are changing. As for us, what’s more important is to
use these new tools and technology to enable people and businesses
throughout the world to realize their full potential.
7.The ability to do your work independently.
Every member has his own business. In a team, your work cannot be
replaced by others’ so you must do your business well in order
to assure the project development process.
團隊開發當中的一些具體精神應當有:
<1> Success and Failure is not one person’s effect.
Your team’s success is not the contribution of a single person.
Success contributes to the whole team. If your project failed, it
also is not just because of one person’s poor work. It is also
your failure.
<2> Learn from each other.
Every person has his own specialty. Even Bill Gates cannot know
all the things about software development. We often learn from
each other and gains a lot. The old saying goes like this:
There must be one out of three who can be your teacher.
In our team we say: Every person is your teacher.
<3> Help those who have problems. Use the group working spirit
to overcome all the difficulties.
There is no need to explain it. As the old saying: Two heads are
better than one. We always find it difficult to solve all the problems just by oneself.
<4> Praise them who have got some improvement.
In our team, I always praise the members when they have finished
something or just solved one problem, and they think that it is
interesting and gains a lot. Because they can see their efforts.
<5> Say something if needed.
這個是一次軟件大賽當中的體會,和大家也做個交流,不過不能再說了,軟件工程學說起來寫本2000頁的書一點也不多,恕我才疏學淺,不再做過多論述了。
[4]談談學習態度的問題
關於計算機技術的學習我想是這樣的:學校開設的任何一門科學都有其滯後性,不要
總認為自己掌握的某門技術就已經是天下無敵手了,雖然現在Java,VB,C,C++用的都很
多,怎能保證沒有被淘汰的一天,我想.NET平台的誕生和X#語言的初見端倪完全可以說明
問題。換言之,在我們掌握一門新技術的同時就又有更新的技術產生,身為當代的大學生
應當有緊跟科學發展的素質。舉個例子,就像有些同學總說,我做網頁設計就喜歡直接寫
html,不願意用什麼Frontpage,Dreamweaver。能用語言寫網頁固然很好,但有高效的手
段你為什麼不使呢?僅僅是為了顯示自己的水平高,unique? 我看真正水平高的是能夠以
最快的速度接受新事物的人。高級程序設計語言的發展日新月異,今後的程序設計就像人
們在說話一樣,我想大家從xml中應是有所體會了。難道我們真就寫個什麼都要用匯編,以
顯示自己的水平高,真是這樣倒不如直接用機器語言寫算了。反過來說,想要以最快的速
度接受並利用新技術關鍵還是在於你對計算機科學地把握程度。
計算機技術牽扯的內容更為廣泛些,一項一項說恐怕沒個一年半載也說不清。我只想
提醒大家的還是那句話,技術與科學是不能分家的,學好了科學同時搞技術,這才是上上
策。猶如英語,原先人們與老外交流必須要個翻譯,現在滿馬路的人都會說英語。就連21
世紀英語演講比賽的冠軍都輪不到英語系的學生了。計算機也是一樣的,我們必須面對的
一個現實就是:計算機真就只是一個工具,如果不具備其它方面的素養,計算機系的學生
雖然不能說找不到工作,不過總有一天當其他專業性人才掌握了計算機技術後將比我們出
色許多。原因就在於計算機解決的大都是實際問題,實際問題的知識卻是我們少有的。單
一的計算機技術沒有立足之地。
我想是時候指出:學習每一個課程之前,都要先搞清這一課程的學習目的。這一學科
的應用領域。據我自身所了解到的同齡同學和低年級的同學的學習狀況:他們之中很少有
人知道學一個學科的學習目的,期末考試結束了也不知道學這科做什麼用。這就失去了讀
計算機科學的意義。當然這與現存的教育思想不能說一點關係都沒有。
總的來說,從教育角度來講,國內高校的課程安排不是很合理,強調理論,又不願意
在理論上深入教育,無力接受新技術,想避開新技術又無法避得一乾二淨。我覺得關鍵問
題就是國內的高校難於突破現狀,條條框框限制着怎麼求發展。我們雖然認識得到國外教
育的優越性,但為什麼遲遲不能採取行動?哪怕是去粗取精的取那麼一點點。我們需要改
變。從我們自身角度來講,多數人4年下來既沒有學習計算機科學的學術水平,也沒有學習
計算機技術的那種韌勁。在我剛上大一時,我的計算機科學入門導師,淮北煤炭師範學院
王愛平教授曾經對我說過這樣一番話:"當你選擇了計算機這一門科學,就意味着你踏上了
一條不歸路,就意味着你一生都要為之奮鬥……你的身後是懸崖,只有向前走,不能往後
退。"
有些同學說按照這樣學習學的東西太多,有的未見得有用,我想打個形象的比方:學
校學出來的人都是一個球體,方方面面的知識都應具備。可是社會上需要球體的地方很少
,反而需要的是磚和瓦,即精通某一行的人才。但是對於同等體積的物體,用球體來改造
是最方便最省事的。學校的學生很多,為了能夠使更多的學生來適應這個社會,學校也就
不得以把所有的學生都打造成一個球體,然後讓社會對這些學生進行再加工,成為真正能
夠有用的人才。即使你非常清楚自己的將來要幹什麼,並且非常下定決心要走自己的路,
這一步你也必須走,世界是在不斷變化的,你不能預料未來。想清楚,努力去干吧!
必須結束這篇"胡侃"了,再侃下去非我力所能及。其實計算機還有很多基礎課都值得
一侃。怎奈我造詣有限,不敢再讓內行恥笑。計算機科學博大精深,我只是個初學者。最
後聲明:這些只針對本科階段的學習。即使把這些全弄通了,前面的路還長,計算機科學
需要我們為之奮鬥......學習計算機科學需要韌性,更需要創新,需要激情。深刻學習理
論知識,勇於接受新技術的挑戰,這才是我們這一代人應具有的素質。最後送大家一句話
"Wake up every day with a feeling of passion for the difference
technology will make in people’s life!"。
在我大一時無意中找到了南京大學網友sir的帖子"胡侃(理論)計算機學習",這個帖
子對我的大學學習起了至關重要的作用,後來也同他進行了一些交流,寫這份材料時也引
用了其中的不少觀點,並得到了sir的支持。再有就是每次和本系司徒彥南兄的交談,都能
從中學到很多東西,在這份材料中也有很多體現。這份材料是我原來在實驗學院進行新生
入學教育的講稿之一,原有基礎上改進了其中我認為不太合適的理論,修正了一些觀點,
在推薦教材方面結合我的學習情況有了較大改變。值得一提的是增加了一些計算機理論的
內容,計算機技術的內容結合我國的教學情況和我們學習的實際情況進行了重寫。這裡所
作的工作也只是將各位學長和同學們的學習體會以及我在學習計算機科學時的所思所想匯
總在一起寫了下來,很不成熟。目的就是希望能夠給一些剛入學或者是學習計算機科學還
沒有入門的同學以一些建議。不期能夠起到多大的作用,但求能為同學們的學習計算機科
學與技術帶來微薄的幫助。還是那句話,計算機科學博大精深,我只是個初學者,不當之
處希望大家批評指正。
btw: 關於作者及我的更多文章請訪問我們的技術站點 http://2003r.vicp.net