给大学刚开始计算机课程同学的一封信

你应该这样开始学编程
服务器君一共花费了215.950 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

我高三的时候,曾经想做一名外科医生,因为医生被人认为很有价值,而且我学过那么多生物学理论,不想轻易放弃。还有个原因就是我喜欢“挥舞”手术刀的感觉,虽然我只在实验室“挥舞”过解剖刀,并且最后的实验考试栽在了动物学实验上。此处略去20M。我最终学了软件工程。也没有什么可后悔的,求知是无止境的,学一样得爱一样,不能排斥它。即使一开始没有这种情感,也要慢慢培养起来。

大一到大四我一直渴望却始终没有一个导师,方向感全得是自己把握,所以我学的东西比较杂乱,没有形成一个系统,还得慢慢的补过来。你现在的基础比我当时好,因为你一直在学基础的东西,这很好。大学四年的唯一目标就是把基础理论掌握好,因为将来从事的工作可能和预想的不一样,方向太多了,大学就选择一个方向意义不大。所以我希望你能珍惜剩下的这三年大学时光,有步骤的构建自己的计算机世界,形成一个有序的,坚实的理论体系。

虽然你已经学过C++,但是C语言还是下一步必须学好学透的。C语言是比较偏底层的语言,也是比较好的入门语言。如果仅要求能用它来描述几个简单的算法,学起来应该很easy。但是,没那么简单。要学C语言,就要学透彻。学的透彻了,对计算机的理解也就更深了。在学习C的过程中,你可以从简单入手,基本语法掌握后,再读一些深入理解C语言的书籍。先读《C程序设计语言》,再读《C专家编程》《C和指针》《C陷阱与缺陷》《C语言深度解剖》《你必须知道的495个c语言问题》,这些书不一定要都全读,但是必须能深入理解以下问题:

  1. 编译链接过程:预处理,编译,汇编,链接。
  2. 程序调试方法:gdb的使用;assert。
  3. 进程的本质:代码段,数据段,堆,栈。
  4. 变量:局部变量(栈中),全局变量(数据段中),静态局部变量(数据段中),寄存器变量,数组与指针区别,枚举,结构体,共用体。
  5. 指针:数组指针,函数指针,指针的指针,空指针,指向常量的指针,指针的类型的本质含义,free的本质含义。
  6. 内存:堆,栈,malloc,calloc,内存泄漏,越界,memset,memcpy,字符串操作函数。
  7. 文件:流的概念,标准输入,标准输出,标准错误。
  8. 编程规范:怎样写漂亮的代码,正确性,清晰性,可靠性,可维护性,可测性,性能。
  9. 库:动态库的映射,静态库。
  10. makefile:C文件怎么组织,写简单的makefile。
  11. 字节对齐:结构体对齐原理,规则,按照X字节对齐,共用体的对齐。
  12. 预处理:宏,条件编译以及其他预处理指令,预处理的过程。
  13. 关键字:typedef,volatile,sizeof,extern,static,const。
  14. 运算:有符号无符号本质,溢出,位运算,优先级。

这些书籍我会通过邮箱发给你,pdf的好处是可以很方便的做书签和标记,有什么问题可以随时记下来,方便以后阅读。写程序要用到编辑器和编译工具链。不用再使用可视化的编译工具了,这学期尝试下vim和gcc。搭建个linux虚拟机,在虚拟机中用vim写程序,用gcc编译,用gdb调试。

在学习C语言的同时,可以学好数据结构,然后用C语言来实现那些数据结构。数据结构是最基本也是最重要的了,数据结构和算法如果学的不好,以后就会停滞不前。因为稍微深入一点的东西都会涉及到数据结构和算法,如果不能理解,就会处处碰壁。《数据结构与算法分析》与《算法导论》是必读教材,这学期和下学期要掌握以下基本结构与算法:

  1. 链表:实现单向链表,双向链表,单向循环链表,双向循环链表,单向链表倒置,递归倒序打印链表,用链表实现约瑟夫环问题,这就要求对指针要基本熟练。
  2. 栈:分别用链表和数组实现栈;用栈实现平衡符号问题;用栈实现四则运算(输入一个四则运算的字符串,输出结果)。
  3. 队列:分别用链表和数组实现队列。
  4. 树:分别实现二叉树的先序遍历,中序遍历,后序遍历;解决最近公共父节点问题;用队列实现二叉树的层序遍历;实现二叉查找树的查找,删除,插入;了解红黑树,B树,B+树。
  5. 哈希表:用链表实现哈希表的扩充。
  6. 堆:实现小头堆和大头堆的插入,删除;用堆解决top-k问题。
  7. 排序算法:实现基本排序算法并计算复杂度,了解稳定性,包括冒泡排序,选择排序,插入排序,希尔排序,快速排序,桶排序,基数排序,归并排序,计数排序,堆排序。
  8. 选择算法:实现快速选择算法。
  9. 动态规划:01背包问题;最大公共子序列问题;该类问题很多,网上搜索题目,该算法也是变化最多的算法。
  10. 回溯:求一个集合的所有子集合,顺便解决全排序问题(非回溯)。
  11. 图论:实现深度优先搜索和广度优先搜索;最小生成树的构造。图论其他算法供了解。

以上是最基本的数据结构和算法,要熟练掌握还需要大量的练习,网上有很多习题可以做。不理解先网上搜索,还不理解问问同学,我这里有以前写的代码可以参考。

这学期你有汇编课程,非常好,可以帮助你理解程序的基本原理,从而更好理解C语言。最近一段时间我也接触点汇编语言,发现以前学的都是皮毛,没有深入理解,所以很容易淡忘。学计算机的人长时间面对计算机屏幕上的黑框框难免记忆力衰退,接触的东西太多难免覆盖以前的知识,所以要经常温习才行,用mybase做学习笔记,同时也可以写博客做记录。学习汇编语言的同时你会接触到很多处理器知识,这个非常重要,只有真正理解了处理器的工作机制才能更好的理解语言层面的东西。所以我希望你在学习汇编时,能熟知各种寄存器的作用,深入理解代码段数据段和堆栈段,理解实模式保护模式以及进程的地址空间和寻址方法。这样才真的理解什么是进程。进程的本质就是一块块的存储空间(或者说是里面的数据)构成的一个有序的整体,这个整体中有一部分是指令,叫做代码段,有一部分是静态数据,叫做数据段,有一部分是函数执行时临时使用的空间叫做堆栈段,还有一部分是由程序员动态分配和管理的空间,叫做堆。进程的执行过程的本质就是获取某种形式的输入,取出代码段的指令执行,执行的过程中会用到一些存储空间存储中间数据,所有的这些指令和中间数据的目的就是得到结果,把最终得到的结果输出到显示器或者网卡或者硬盘等等。这就是计算机的能力。它能力的核心叫做计算。

上面的一段话现在你可能还不懂,但是过一段时间你会明白的,而且一定要明白。我再重复一遍,学习汇编时要注意理解各种寄存器,实模式寻址过程,保护模式寻址过程,进程的地址空间,以后还要明白内核态和用户态,这里先不说。关于汇编,推荐你看《Intel汇编语言程序设计》,前面章节有体系结构的介绍,要细看。

这学年的学习内容就这么多,你的其他课程也要兼顾,要记住,知识总是有用的。知识是美的。知识是最能获得乐趣的。

另外你这学期应该参加一个集体项目,要多和其他的同学交流技术,看看他们都在学习什么,在做什么,对你有什么启发没有。假如你在一个良好的项目团队中,你就自然而然的受到团队的熏陶,在团队的推动下学习技术会更快,因为还有一群人可以交流想法。 在基础理论学好的基础上,php,面向对象,java等都可以跟着大家一起学,即使将来不用,了解下也是很好的。以后你还会接触到操作系统,微机原理与接口,计算机体系结构,数据库,计算机网络,单片机等基础课程,这些都是很重要理论课程,一定得学扎实。大二和大三一定要参加比较大的项目开发,实践经验很重要,将来面试时一方面要看你的基础实力,另一方面就看你的实践经验,然后从实践入手考察你的技能。如果实践的少,技能也体现不出来。一个内功很深厚的人如果不会任何招式,也是没有用武之地的。所以在勤修全真教内功的同时,要到江湖闯荡一番学会降龙十八掌,才能有机会学习九阴真经,成为天下第一。大三时如果有兴趣可以看看shell编程,linux用户态编程,linux内核编程,我在这方面可以帮你,像php我就帮不上。

手写太累,寄信太浪费,所以就写下这电子版本的,你在我博客浏览即可。

附学习书籍:

  1. C语言:《C程序设计语言》《c和指针》《C陷阱与缺陷》《C专家编程》《C语言深度解剖》《你必须知道的495个c语言问题》《C语言常见问题集》《高质量程序设计指南》《深入理解计算2.机系统》
  2. C++:《c++primer》《C++编程规范101条规则与实践》《C++ 设计新思维:范型编程与设计模式之应用》《C++沉思录》
  3. 汇编:《80x86汇编语言程序设计教程》《Intel汇编语言程序设计》《深入理解计算机系统》
  4. 应用:《java2参考大全》《php从入门到精通》
  5. 基础理论:《操作系统精髓与设计原理第5版》《计算机网络第五版》《深入理解计算机系统》《微机原理及接口技术》《单片机原理及接口技术》《数据库系统概论》
  6. linux(大二下或大三大四学):《鸟哥的Linux私房菜基础学习篇》《Unix.Shell编程》《Unix环境高级编程第二版》《linux内核设计与实现》《深入理解Linux内核》
  7. 拓展阅读:《编程之美》《程序员面试宝典》《深入理解计算机系统》《编程思想.第2卷.实用编程技术》《敏捷软件开发原则模式与实践》

本文地址:http://www.nowamagic.net/librarys/veda/detail/2260,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2260

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《JavaScript DOM编程艺术(第2版)》 基思(Jeremy Keith) (作者), 桑布尔斯(Jeffrey Sambells) (作者), 魏忠 (合著者), 杨涛 (译者), 王建桥 (译者), 杨晓云 (译者), 等 (译者)

《JavaScript DOM编程艺术(第2版)》内容简介:JavaScript是Web开发中最重要的一门语言,它强大而优美。无论是桌面开发,还是移动应用。JavaScript都是必须掌握的技术。W3C的DOM标准是开发Web应用的基石。已经得到所有现代浏览器的支持,这使得跨平台Web开发成了一件轻松惬意的事。《JavaScript DOM编程艺术(第2版)》是超级畅销书的升级版,由倡导Web标准的领军人物执笔,揭示了前端开发的真谛,是学习JavaScript和DOM开发的必读之作。

更多计算机宝库...