以下资料仅供小范围学习交流使用,请勿广泛传播,请勿用作商业用途,以免涉及知识产权纠纷。
一、自己整理的资料:
http://pan.baidu.com/share/link?shareid=124211&uk=1426109645
这里面主要是计算机专业相关的书籍的电子档(pdf+djvu),以及少量他人整理的资料,点开链接可以看到目录结构(很多资料比如人工智能的相关资料基本上是英文版,一般文件名里面英文比较多的话可能会是英文版)。
无adobe、office等软件系列的使用教程,操作系统设置、清理、优化指南,电脑选购指南等非计算机专业的资料。
二、学校课程的课件:
(请私信)
---------------------------------
下面是我作为一个计算机专业的学生在专业课程学习上的一点感悟,纯属个人观点,请自行斟酌。
应该比较适合从未接触过信息竞赛,或者家里没有计算机背景的同学。
一般人对计算机专业的理解大致可以分为三个层次。
第一个层次,以为计算机专业就是配电脑、卖电脑、装系统、改注册表、会PS、会用Word等……
第二个层次,觉得计算机专业就是编程,写各种app……
第三个层次,对计算机专业(本科阶段)学习的内容有一定的了解,下面会详细介绍。
第三个层次是比较接近“计算机科学与技术”所研究的内容,但事实上本科阶段主要是专业基础的学习,很多更深层的东西还很少接触,所以说是“比较接近”。但是到了这一层,应该已经可以大致知道自己到底是学什么干什么的,不会对自己的未来太迷茫了……
整体认识
计算机科学与技术是一个涉及众多学科交叉的专业,随着学习和研究的深入你会接触到数学、高级程序设计语言、数据结构和算法设计、模拟电路、低级程序设计语言、数字逻辑、机器指令、微命令、自动控制原理、图形学、编译原理、操作系统原理、计算机体系结构、计算机网络等,可能会遇到物理学、生物学、心理学、伦理学等……
从上面的描述可以看出,
首先,我们需要一定的数理基础:在自动控制原理和图形学中,需要用到大量微积分、线性代数、复变函数的知识;在算法设计和编译原理中,需要用到很多离散数学的知识;如果你准备做计算机仿真,那么你就需要更全面的数学、物理知识(比如matlab、ansys)。
其次,我们需要少量的模拟电路的理论:但是这不是重点,我们不会经常以电阻和三极管为基本元件,大多数情况下,我们是在以数字逻辑为基础、基本逻辑门为最基础的设计单元进行电路设计的,但是了解逻辑门的电气特性和基本的实现原理还是有些必要,这时模电的知识会对我们有一定的帮助。
最后,我们有很广阔的发展空间,大家应该从新闻里面听说过“量子计算机”、“DNA计算”、“人工智能”等听起来很科幻的词,这些领域都已经超过了本科教学的范围(如果本科阶段有相关课程的话一般也只是科普程度),可能需要在更高层次的学习甚至研究中才能深入了解。
说到这里,大家应该可以看出我们和另外两个兄弟——“(光)电子科学与技术学院”和“软件工程学院”的区别了——
我们处在整个IT行业的中间层,下面由(光)电子学院为我们奠定最底层的基础,我们以逻辑门为基本单元设计组合逻辑、时序逻辑电路,设计指令系统、总线架构、处理机,设计低级语言(机器指令的助记符),设计操作系统,设计高级语言及其编译器,为应用程序开发人员提供系统接口和编译环境、为其他学科和其他非科研人员提供仿真系统、多媒体数据处理程序,而软件学院则利用我们提供的平台和接口进行更高层的开发,提升用户体验。
引用我们C语言老师的一个跟赛车有关的比喻,软件学院是开着车狂飙的赛车手,计算机学院是赛车整体造型、内部结构的设计者,而电子系就是各个细微零件设计者。
也就是说,作为一个“真正的计算机专业的学生”,我们应该设计CPU、设计主板、设计显卡,而不需要擅长帮别人挑选型号各式各样电脑配件;我们应该设计操作系统,而不仅仅是帮别人安装系统,解决系统设置的问题;我们应该设计dreamweaver、photoshop、word,而不仅仅是用dreamweaver做网页,用photoshop处理图片,用word打字排版;我们应该设计网络协议、设计同步、校验和加密机制,而不仅仅是上QQ、刷人人、逛论坛、看新闻、网购。
当然,并不是说你需要样样精通,在某一方面有所成就就已经很了不起了;也不是说计算机专业只有这些,毕竟,计算机并不等于我们平常口中的“电脑”,在后信息时代,计算机已经无处不在了。
课程学习
首先是数学,微积分之类的课程应该在大多数学校都是作为公共基础课一开始就上的。现在很多地方都在讲C语言无用、数学无用,如果你选择计算机专业只为开发app的话,这些观点可能还有点参考价值。但是你要知道,一个非计算机专业的人开发的app可能比你的开发成果要好上百倍,因为现在在遍地都是的资料和强大的IDE之下开发app真的很简单,可能你的和人家的功能基本一样,但是人家可能有更好点子,或者人家是搞艺术设计的,UI做得比你的好……所以,如果你不想加入那一抓一大把的开发应用程序开发者的行列的话,还是好好学一学学校安排给你的课程吧。你想一想,你平常玩的游戏,你不是一直在希望游戏能越做越真实吗?比如很多FPS和RTS以及一些赛车竞速类游戏,都需要一个更具真实感的物理特效引擎,这里面就会有大量的数理计算,而事实上,这些游戏画面的生成,更是需要大量的矩阵运算来进行仿射、投影变换。作为 计算 机专业的学生要是数学太差的话真心说不过去。
除了数学,在大学里接触的第一门专业课应该是C语言了。这是一门很重要的基础课,一定要学好(不要局限于课堂,而且时间精力足够的话可以和C++一起学)!对C语言有一定深度的思考与实践不仅会让你在学习其他语言时非常轻松(程序设计语言本质上都是相通的,哪怕是OO和PO之间),而且对后续的更加底层的课程有很大帮助。如果认真学了的话把学校的课程设计算进去大二结束之前至少应该写过15,000行代码(这是我当时的代码量,我们学院大一下学期才开C语言课程)。
你可以去参加一些能激发自己兴趣的比赛,比如现在经常有比赛以给游戏写AI为比赛内容,这或许会激起你对编程的兴趣。但是算法竞赛,除非是特别有天赋或者感兴趣,不太建议过早参加,这种情况下不如抓紧时间巩固其他专业课,毕竟使用算法和设计算法还是有区别,如果你没有经过相关的训练,你不一定比得赢高中生。
关于推荐的书籍,我表示我看得比较少(还好亲自动手写代码在一定程度上弥补了这方面的缺失)……就不在这里推荐了,大家可以自行谷歌百度,再去豆瓣上看看大家的评价。倒是学了C语言之后,你可以看看《深入理解计算机系统》,这是我们组成原理课程的老师推荐的书,从C语言讲起,对后续课程有一定帮助(中间可能会遇到一些看不懂的地方,不用着急,你会在之后的课程里面学到的)。
另外,如果觉得自己编程能力实在太渣,有兴趣的话可以在课外自己写一写下面三个简单的小程序:
1.超大数高精度运算;【实现超过long long类型、double类型不能表示数(比如10^10000级的数字)的基本运算,比如加减乘除、取模、GCD、LCM、阶乘,有能力还可以计算三角函数和对数(理解程序设计的基本概念:数据类型、条件分支、循环、函数调用、数组、指针、项目管理与多文件编译等)】
2.九宫格(数独)求解;【关于九宫格是什么请自行百度之,有能力还可以扩展成任意分组的N宫格,参考2012年蓝桥杯初赛第七题(进一步理解函数调用,理解递归和基本的算法)】
3.自然表达式求值。【考虑运算的优先级,对括号、逻辑表达式、算术表达式进行解析(理解基本的算法和数据结构,培养代码风格等编程素质)】
在编写这些程序的过程中你会遇到很多问题,虽然他们可能并不会影响到你对这三个小程序的编写,但是可以肯定的是,后续的专业课(比如汇编、数据结构、算法、编译原理等)会逐个解决你的问题的!这会使你学起来非常来劲,因为你会发现你知道你为什么要学习这些课程,知道学到的东西可以用来解决什么问题。
另外,这也会成为你编程能力成长的见证。多年之后重新打开这些工程,你会发现你已经有了如此巨大的进步,以至于你会在心里暗暗地“骂”到:“我当年真是太菜了,居然写出了这么烂的代码……”。顿时会很有成就感……
如前所述,熟练掌握了C语言之后,你应该会在数据结构、算法、汇编、面向对象程序设计等课程中感到比较轻松,而跟硬件相关的课程,需要比较坚实的数字逻辑基础,然后你会很惊奇地发现某些课程居然和文科课程有点像,比如组成原理和操作系统,感觉要记很多东西(但是你拿给文科生看他们不见得看的懂),不过你可以去详细了解一下计算机早期的发展历程和IT行业的最新动态,说不定会对这些课程产生比较强烈的兴趣。
好了,作为一个大三的学生,目前我也只上了这些课程,再往后讲就纯属忽悠了(虽然可能上面这些都是忽悠……),以后有时间在慢慢写吧……
最后,送大家一句话,对于别人的选择,如果他成功了不代表他的选择就是“最优解”,失败了也不能代表被他放弃了的选择不会导致更糟糕的结果,所以,分析别人的选择和成败在很大程度上是没有意义的。别人的经历仅供参考,关键还是要有主见,走自己的路。