给学习计算机的同僚们的建议
为什么我们要学习计算机,为什么我们要学习编程,有很多很多的原因,但当我们踏进计算机的世界里的时候,我们找到了可以任由我们发挥,任由我们施展拳脚的天地,我们有了一种对学习计算机,甚至是学好计算机的渴望,
但是任何一门学科都不是那么容易学的好的,计算机更是如此,我想我们大多数人都是从编程开始学习的,逐渐形成了
对学习编程的兴趣,但是如果想真正的学好计算机,单单学习高级语言是不能达到效果的,就算你说我只想学好一门高
级语言,把它学的精通就可以了,但问题就是那么的简单么,我想不是吧。
计算机是一个整体,学习任何一门计算机课都是和其他课程联系在一起的,要学习就要有足够的深度和广度,不然不可能有深入的了解就像学习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之类的,他们只是开
发程序的工具而已
帮你做了一些辅助性的工作,所以好好学习语言吧!还有就是对于什么等级考试一点作用都没有,如果要是我说现在的
等级考试
只是人家赚钱的一种方式,已经变质了,我不知道为什么不跟上时代的脚步,把它们给取消了,不止是计算机等级考试
,英语等级考试也没有用,不管怎么说他都是一门纸上的考试,对于提高自己没有作用,反而会有反作用。如果你只是
为了拿一个计算机
考试的凭证,那我劝你还是止步吧,我们是为了学习计算机而学习计算机而不是为了学习计算机而去拿那个一文不值得
证,不然我真不知道你学习计算机还有什么意思。如果真的是对计算机感兴趣那就塌下心来,一步一个脚印的去探索计算机世界的奥秘,多么美好的事情呀。很多人开始学习的人都是梦想成为黑客,用几个程序去攻击别人的漏洞,但什么
是黑客,天才的程序员才能配的上,就像Linus等一样,我们的目的是去建造宏伟的建筑,而不是去炸毁他那是骇客所
做的事情,如果你认为别人的建筑有不足之处大可以指出来。这只是我个人的意见,有不足之处请指出,谢谢了!
还有就是谈谈自己对于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, 等等)是怎么怎么的好,可是他怎么没有提及他是不可移植性的呢?!
不说了,Linux内核这样大的阿房宫还要我去游览呢,找个好的导游带我去探险吧!
学习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了!