[建議]給學習計算機的同僚們(初學者,進階者,包括Linux愛好者)的學習建議

爲什麼我們要學習計算機,爲什麼我們要學習編程,有很多很多的原因,但當我們踏進計算機的世界裏的時候
 
,我們找到了可以任由我們發揮,任由我們施展拳腳的天地,我們有了一種對學習計算機,甚至是學好計算機的渴望,
 
但是任何一門學科都不是那麼容易學的好的,計算機更是如此,我想我們大多數人都是從編程開始學習的,逐漸形成了
 
對學習編程的興趣,但是如果想真正的學好計算機,單單學習高級語言是不能達到效果的,就算你說我只想學好一門高
 
級語言,把它學的精通就可以了,但問題就是那麼的簡單麼,我想不是吧。
      
       計算機是一個整體,學習任何一門計算機課都是和其他課程聯繫在一起的,要學習就要有足夠的深度和廣度,不然不可能有深入的瞭解就像學習c語言一樣,如果你想知道他是怎樣在計算機的內存中分佈的,具體是怎麼運行的,就要學習彙編語言,當然計算機體系結構,計算機組成原理,是你理解計算機的基礎,計算機大師knuth都非常重視彙編語言(彙編語言和機器語言是一一對應的)
 
,要想學好軟件,脫離硬件是不可能,因爲軟件最終要靠硬件來運轉的。當然瞭如果是初學者還是要一步步學的,如果你
 
想知道c語言是怎麼運行的,想了解指針和數組的真正區別,那多學一門語言彙編語言吧,人們都說彙編語言是與機器相關的,不能移植的,但想在的pc機上用的幾乎都是AMD,和intel的處理器,他們有都是互相兼容的,所以指令集的體系結構都是IA-32當然了現在都有64位的處理器了,但是這並沒有什麼很大的區別,僅僅是位數變多了,所能表達的數字變
 
大了,精度也變的更長了等等。就像學習高級語言一樣學習彙編語言也是相通的,因爲他們的功能都差不多,而且更加
 
簡單,你會發現在高級語言中的語法會在彙編語言中消失,僅存的就只是指令的書寫格式(相當如詞法吧,當然了我可能也說的不太對,因爲對彙編語言學的不是很深入,所以現在也正在有計劃的去學習)。如果你學習的java,vb,c#等等那
麼就請您多多看看c和c++吧,我們常常聽說某種語言實現了垃圾回收機制,用某種算法不定期的把你程序中不再使用的內存回收掉,最好的例子就是JAVA
了(關於它的一句話說的挺好,一次編譯到處運行,非常適用於嵌入式計算機程序的編寫),不過你能用JAVA語言寫出
 
內存回收的程序麼
我想應該是不可能,JAVA對於這方面做了太多的限制,但在c/c++中卻沒有,你可以用庫函數malloc等等去分配內存,
 
free去釋放內存,
c++中對應的是(new,delete)實現的跟方便些,你也可以用系統調用brk(其實庫函數也是調用了他,只不過做了一些
 
更加完善的工作而已)去分配,而且他可以直接去操作數據到位(&,|,~),如果說
高級語言是彙編語言的一個子集的話,那麼JAVA在這方面就是C/C++的一個子集,我並沒有說java不用學,不好,而
 
是在學習他之前
應該多去學學C/C++,(注意語法不是特別的重要,重要的是你怎麼能在學完語言以後去靈活的運用他),計算機體系
 
結構對於你理解
軟硬件非常的重要給大家推薦一本書,書名 :計算機組成與設計——硬件/軟件接口  作者:David A.Patterson  
 
John L. hennessy 
出版社:機械工業出版社 ,這本書很不錯,能夠很好的把軟硬件的關係數清楚,而且不像一些國內的體系結構教材,
 
看的非常的費勁
誰然講的都是很清楚,但不能從讀者的角度去考慮問題,這本書會讓你看的愛不釋手的,恩,對於我來說卻是如此,不
 
適合初學c語言的
,要有一定的c語言基礎。我想還有一點要和大家分享一下,就是學習計算機切忌浮躁,不要像追星族一樣,看到一項
 
新出的技術就去
學習,新技術會不斷的變的,而且很容易讓你迷失方向,一定要打好基礎,關於計算機基礎的書一定要多看,不要死記
 
硬背,但你發現
你需要死記硬背去記住書中的知識的時候,那麼我可以給你個建議把此書放在書架裏,去看一些能夠引導你一步步的從
 
本質上理解知識
的書,首選一些計算機科學叢書,圖靈叢書(機械工業出版社,人民郵電出版社,電子工業出版社),我們學校用的是
 
清華大學自己出版
的計算機書籍,雖說清華大學在工科方面很不錯,但是出版的計算機書籍就我個人來說真的不怎麼好,相對於國外的計算機書籍來說
差的真是太遠了,我很不明白爲什麼要用清華出的,有一本關於Linux/unix內核的書我覺得挺好的,書名是 Linux內核源代碼情景分析
浙江大學出版的,我目前正在潛心學習這本書,雖然很難,但真的不錯,很少有由我們自己寫的關於Linux內核這方面
 
的好書,這本就是
不可多得的好書。說了太多關於計算機書籍的話題了,但我認爲一本好的書籍真的能給我們很大的幫助
還能從中得到快樂。
  
       如果你只想學習計算機去賺錢的話,那麼你大可以不必去學習很多東西,對於你也沒有用處,如果你是對計算機有着非常濃厚的
興趣的話,那麼就塌下心來,一步一步去在計算機的海洋裏傲遊吧,真是一件美妙的事情。 
 
 
現在我告訴大家自己認爲的關於學習計算機的路程
 
(1) c語言(可以去學譚浩強寫的c語言的書,如果能找到K&R C 那就更好,自己是沒有找到,要想進一步去學習的話
 
去看 c缺陷與陷阱,c專家編程
,這兩本書很經典的)
 
(2)c++語言(c和c++其實並不一樣,可以說c++是繼承了c,增加了面向對象的思想,如果能找到c++program language 
 
c++之父寫的就很好,不過自己沒有找到,要想進一步去學習的話去看  effective c++
more effective c++,挺不容易懂的,因爲自己要看Linux內核所以沒有多少時間去看,c++沉思錄(c缺陷與陷阱 的作者
 
與他的妻子)也非常的不錯,還是沒有時間去看,只看了200多頁,講的太好了,有時間自己一定會去看完的,這本書
 
講的主要是教你怎麼運用C++語言去寫出好的文章)
 
 
算法和數據之間的結構的理解也很重要,我想如果你有了c++的學習經驗學習數據結構應該不太
困難,一直以來我都不是很明白抽象的數據結構(abstract data type   ADT)的抽象是怎麼回事是什麼意思,之後看
 
了c++沉思錄才恍然大悟,抽象就是把想關注事務的部分拿出來,不關心的不去考慮,就像我們人類,人有很多屬性,
 
姓名,年齡,體重等等,當我們研究具體問題是
也許只關心人的屬性的某些方面,例如姓名,年齡,那麼就把它拿出來也就是術語抽象,在c/c++語言
就用用戶自定義的數據類型來去定義人:
struct people{
char name[10];
int  age;
};
struct 是structure(結構)的縮寫,這樣理解就非常簡單了麼,所以c++沉思錄非常的好。
 
(3)算法與數據結構(有很多好的書籍,大家可以去找找,反正清華出的不敢恭維)
 
(4)彙編語言,計算機組成原理,計算機體系結構 微機原理(我認爲剛纔我說 計算機組成與設計——硬件/軟件接口 
 
就很好的包含了這些內容挺不錯的,當然了學習是無止境的。

 
之後才能開始os的學習,我認爲OS是讓你在學習計算機上有一個質的飛躍,因爲現代的程序設計一般都是基於OS的,如
 
果不瞭解OS,那麼就不可能學好程序設計,就像建造房子一樣,房子要建在地上,如果你不瞭解當地的環境,地質,這
 
麼怎麼能建造好的房子呢(5)操作系統原理的學習,數據庫原理的學習(有一本挺好的書,自己是看完了一遍,電子
 
工業出版社
的操作系統設計與精髓 作者 stalling 忘了具體怎麼拼了,理論性很強,不過是一本好書,要理解性的看)
 
 
至於網絡原理,軟件工程,通信安全,鑑於尚在學習中,就不說了。
 
哦,還有編譯原理,是一門教你怎麼把語言翻譯成彙編語言,機器語言的一門課,有很多很難的算法,LR算法就很不好
 
理解,至於要什麼時候學那就在學好語言和算法的基礎上去學習吧。記住千萬不要趕時髦去學什麼VC,BC,包括MFC之類的,他們只是開
 
發程序的工具而已
幫你做了一些輔助性的工作,所以好好學習語言吧!還有就是對於什麼等級考試一點作用都沒有,如果要是我說現在的
還有就是談談自己對於Linux學習的看法。學完os以後自己就覺得應該去學習os的內核了,其實當自己剛學os的時
 
候就特別特別特別的想去自己寫一個os,看了很多東西還是一無所獲,當然了這是必然的,因爲自己連os有什麼功能,
 
進程線程,進程調度,虛擬內存,進程間的通信,文件系統,系統調用與中斷,都是不知所云,所以當時很是鬱悶,
很是茫然,在學完os之後纔對操作系統有一個感性的認識,但是還是太理論了,沒有任何源代碼的分析,沒有任何
設計os的細節,所以自己只好去看linux源代碼了,但是還有一件重要的事沒有做,寫源代碼我要在一個環境中去寫
在哪去寫呢,那就是在類UNIX操作系統上(我用的是fedora 9.0的發行版,內核是2.6版的),怎樣去編譯源代碼呢
用的是一種特殊的格式(其實這種特殊的格式就是在寫make命令時,所規定的make
認識的文件)書寫去告訴編譯器編譯的過程是什麼,也就是用make命令去解釋,在windows上我們所用的
幾乎都是IDE(集成的開發環境,編輯器,編譯器,調試器等都組裝在一個程序中)的開發環境所以想,對於編譯的過程一無所知,所以當初自己看linux內核書籍的時候很是不理解,爲什麼
每個文件目錄下都會有一個Makefile文件,原來但你輸入make命令的時候他會自動在當前的目錄下按照makefile,

Makefile的順序去查找是否有此文件名,然後就讀取文件進行解釋,並告訴gcc編譯器怎樣編譯按照什麼樣的順序編譯
這些源文件。之後就是去熟悉linux操作系統,編寫Linux上的c程序(unix環境高級編程第二版 是在類unix上學習的
很好的書籍,因爲這些開放源代碼的os都是按照POSIX(開放的操作系統接口標準)標準寫的,所提供的API(通用的應用程序編程接口,就是人們把各個方面常用的函數用某種語言編寫出來供程序員使用,減少了程序員的負擔,增加了代碼的可重用性,就像程序中通常都要與輸入輸出打交道,所以Dennis Ritchie 圖靈獎得主、unix
操作系統、c語言之父,就用c語言寫出了標準I/O庫,但我們遇到庫函數的時候也就
能知道其是什麼意思有什麼功能,爲什麼呢,都是一樣的嘛,就像向標準的輸入輸出設備讀寫的printf,  scanf函數,名字都是一樣的,所以就有很多好處了) c編程接口都是很一致的,不同os上的擴展肯定是有的,不過大致上是差不多的,所以在這些os上編寫的程序非常容易移植,有錯
 
誤估計也只會做一些小的細微的修改就可以了)自己也真在學習中,最後就是Linux內核源代碼了,情景分析那本書我
 
覺的應該是本不錯的關於linux內核方面的書了,自己也正在學習中,不過就是太艱難了,不過任何事情都不會是輕鬆
 
的,因爲自己喜歡所以去做,只能堅持到底了,呵呵。
 
    有一句話說的好,要想了解一門學科就要先了解他的歷史,在學習linux的過程中我深刻體會到了這句話的作用,
去看看那Linux的發展史吧,對你一定會有幫助的,我們不僅要知其然還要知其所以然的學習,知道linux的現狀還要
知道他是怎麼來的,是怎麼壯大起來的,linus是linux的開創者,多麼令人興奮那,正是有了這些開放的源代碼,我們
才得以去學習,多麼好的事情呀!
 
 
     其實我並不太喜歡c#和VB因爲他們根本就沒有移植性可言,是微軟爲了讓更多的人爲自己的操作系統編寫應用
程序而開發的,VS,VC就是這個環境嘛,其IDE的人性化確實不錯,可卻讓我們忘卻了什麼是編輯器,什麼是編譯器,什麼是調試器,不能組裝我們自己喜歡的環境最重要的是c c++ java是不受操作系統限制的,所以又回到了前
面,學學不受os限制的語言吧,以至於不會被微軟牢牢的套住,c#,VB當然可以學,但是在學之前學學這些不受操作系統限制的語言吧,
 
不要受那些書籍裏的言語的迷糊,說其(c#, VB, VC++.net, VB.net等等)是怎麼怎麼的好,可是他怎麼沒有提及他是不可移植性的呢?!

 

 

 學習linux續:

      自己也是從今年下半年開始瞭解linux的,這還要感謝的自己的OS老師,如果沒有他讓我們這些學生知道了linux,恐怕我現在也不知道linux呢。之前我和大多數人一樣在用windows,不管是應用還是編程,一開始總覺得還是蠻好的,可是學完了OS原理以後,總覺得缺點什麼,自己當初就有想寫一個OS的想法,
可是卻無從下手,除了基本的語言學習外,有太多的東西需要自己去學習,因爲當初自己在學習OS原理
後,沒有真正的理解,進程和線程,SMP,和信號量都只是泛泛的知道而已,所以自己清楚只有在完全
明白OS的基本概念和算法以後才能進一步的去學習,於是自己用一個月的時間看完了 William Stallings寫的操作系統——精髓與設計原理,感覺和自己當初看陳向羣寫操作系統完全不一樣,雖然在理論了,可是於是自己有進一步去學習linux內核0,11版的完全註釋,可是看了幾天
就看不下去了,什麼也看不懂makefile是什麼,gcc是什麼,它是怎麼編譯,以前在windows下自己只知道寫完程序然後由TC後VC 去編譯,可是現在卻完全的茫然了,通過上網和從其他書籍瞭解到,要想
理解linux,要先學會去用linux,只有這樣才能感性的瞭解linux,於是自己從網上下載了red hat 的後繼版本
fedora core 9.0內核是2.6版的,安完之後,進入了GNOME的桌面環境,我發現自己來到了一個新的世界
自己完全成了一個陌生人,完全不知道怎麼操作,安軟件原來還有這麼多的方法,./configure是什麼
make ,make install是什麼自己當初都快崩潰了,自己想在上面看電影,可是卻什麼都看不了RMVB也無法播放,聽說mplayer挺不錯的,我就下了源碼包,解碼包,皮膚包,然後通過書籍和網上教的步驟一步步的去安,花了幾天的時間才能完全的安上,皮膚也出現了,真是不易呀,但是全屏又有畫面播放的問題於是自己下了個realplayer 11的rpm包安裝到還是順利,yum到還是用的 不太明白。這些經歷以後自己就通過一本關於GNU/Linux的書籍去了解應用linux(自己當初買這本書的時候,還有些猶豫,怎麼會有GNU,這是什麼呢,應爲自己買書的那個書店只有這一本帶linux的,所以自己就買了,後來才知道,
GNU代表着自由軟件,它是GNU ' s not Unix 的遞歸表示),還是有一點點感覺的,呵呵。
         大概瞭解了 linux後 ,自己就去看關於 linux內核的API,找到了advanced programming in the unix environment,發現真的和其他人說的一樣 ,Richard Stevens寫 的 太經典了,自己到現在看了有 10章了
,還在繼續學習。因爲自己在學校有很多時候不能夠用計算機,自己覺得現在可以去看linux內核了,
於是我就去看了,linux內核源代碼情景分析 ,但自己對於硬件和計算機體系結構根本就是不瞭解 ,雖然 在學OS 原理時 ,學校也開了微機原理 和體系結構,因爲體系結構是考查課,自己沒有完全的 重視,所以自己只能重新開始計算機體系結構的學習,用的是計算機組成原理——硬件與軟件接口 ,也挺不錯的,可以說自己通過這本書真正的瞭解了什麼是硬件什麼是軟件 ,至於微機原理 ,我真的不想說什麼,很重要MMU不講 ,彙編的也沒有真正的講完 ,可以說我是 通過計算機組成原理——硬件與軟件接口這本書,才真正的瞭解彙編語言雖然是MIPS的體系結構 不是intel的 ,真的很不錯,自己也知道了c語言是
如何 翻譯成彙編語言的 ,雖然很想去深入的去學習彙編語言,但時間太有限了,還要去應付考試,所以
只能以後去看了,真是捨不得呀!
          在看完計算機組成原理後,自己就繼續看情景分析看完 存儲管理 以後 ,發現自己 反過來再去看這張,自己完全忘記了,我想這種方法太差了,通過不斷的瞭解才知道還是應該看看linux內核設計與原理和深入理解linux內核,瞭解linux內核是怎麼設計,爲什麼會這樣設計,我結合自己現在的情況把這兩本書的關於存儲管理的基本看完了,然後在去看情景分析的存儲管理的源代碼,發現原來自己怎麼也不明白的,現在竟然一下子就明白了,這給自己增加了很大的信心,相信自己一定能夠在這條道路上走下去
,現在自己正在學習中,不管是應用linux,通過linux編程,還是看linux內核,我發現我越來越喜歡linux
了, 在linux下一切都變的那麼的簡單,我離不開linux了!

來源: http://www.programbbs.com/bbs/view34-13922-1.htm

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章