怎样学编程

来源:互联网 发布:网络电视怎么调频道数 编辑:程序博客网 时间:2024/04/29 13:14

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

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

我高三的时候,曾经想做一名外科医生,因为医生被人认为很有价值,而且我学过那么多生物学理论,不想轻易放弃。还有个原因就是我喜欢“挥舞”手术刀的感觉,虽然我只在实验室“挥舞”过解剖刀,并且最后的实验考试栽在了动物学实验上。此处略去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卷.实用编程技术》《敏捷软件开发原则模式与实践》
原创粉丝点击