大一大二的计算机专业同学应该学习什么?如何学习?

本文是回答一位知友的提问:

已经大一下了 现在在学 C++ 感觉书上很多术语都不懂 编程自己也得花很多时间才能做出来,但感觉自己身边的同学却什么都会。有什么好的建议吗?我一定努力改正

正文

一、可能的原因

调整心态,克服恐惧和畏难情绪,建议反思一下造成你目前这种现状的原因是什么?

无外乎有两种原因:

原因一:可能是你大一上学期不努力或者不认真,同学们都在认真学,你没花足够的时间和心思在学习这些知识上;

原因二:你的接受和理解能力比一般同学要慢。

如果是原因一的话,你能来知乎提出这个问题,说明你已经意识到自己的不足,已经很难能可贵了,现在努力亡羊补牢未为晚也。

如果是原因二,需要自己花更多的时间去挨个解决知识点上的困难,可能是自己学习方法不得当,也可能就是比别人理解的慢,个体有差异,这个不能强求的,但是勤能补拙,花更多的时间和精力去专注。

二、技术学习本身

回到技术学习本身,作为一个过来人的老学长。一般在大一的时候,对于计算机专业,建议熟悉一门编程语言和其相应的开发环境。

这里就以你学习的 C/C++ 技术栈来讨论:

2.1 学好 C 语言

建议你一定要学好 C 语言,它应该作为你必须掌握好的语言。

C 语言是你之后学习操作系统、网络编程、多线程编程等计算机基础学科的钥匙。

你要熟悉 C 语言的基本语法,包括:

  • 顺序、条件、循环三大控制语句
  • C 中几大基元数据类型的用法
  • 熟悉掌握数组的用法
  • 熟练掌握指针的用法
  • 熟练掌握结构体、枚举、联合等数据类型的用法
  • 熟练使用常用 C 库函数,如控制台输入输出流、字符串操作、文件操作、时间函数等等

以上阶段算是启蒙阶段,在这个阶段,是基础编程语法的学习,当然,你不仅仅要掌握这些基本语法,你还要反复练习。

给你推荐一本书——《C语言程序设计 现代方法》,这本书是我大学那会儿迷茫时的一座灯塔,今天我把它推荐给你。

这本书在国外是作为经典大学教材的,两位译者一位是亚洲理工大学,一位是中科院,书翻译的也很地道,强烈推荐一下。

当然,如果你熟悉了 C 语言的常用语法后,你想进一步针对 C 语言的一些细节和高级特性进行查漏补缺,推荐看看《C 专家编程》。

无论是 C 还是 C++,指针是非常关键也是核心的一个知识点,它上承 C/C++ 编程本身的学习,下承操作系统原理。当然,指针一直是很多初学者的老大难,可以把指针作为一个专题彻底搞明白,关于这方面也有一本非常好的书,这本书的语言写的也非常通俗易懂,我当年读完之后,对指针再无疑惑,书名叫《C和指针》。

《C 专家编程》和《C和指针》都是国外经典书籍。

题主提到很多相关 C++ 概念不明白可能也是 C 语言中留下的“夹生饭”,至少指针相关的概念就是,如果存在这种现象,建议逐一夯实之。

2.2 熟悉 C/C++ 语言相关的开发工具链

无论你的理论知识学的多么麻溜,连代码写在什么地方、如何编译、如何调试和运行都不知道,一切都是水中月镜中花。所以掌握 C/C++ 语言相关的开发工具链你才能不断练习,提高动手能力,我们学习开发最终是为了付诸实践的。

熟悉 C/C++ 语言的相关的 IDE 开发环境,Windows上我推荐 Visual Studio,Mac 上可以使用Subline 或者VSCode,如果你最终的程序需要在 Linux 跑,你需要熟悉 cmake/make/gcc/g++/gdb 工具链,vim 的基本操作也要熟悉,但绝对不要直接在 vim 中写代码,纯属浪费时间,实际企业级开发也没人会这么做。这里强调一下,如果可能,至少要熟悉 Visual Studio 和 gdb 调试,调试需要掌握哪些内容呢?

建议掌握:

  • 如何启动和结束调试
  • 如何添加/删除/启用/禁用断点(包括普通断点、条件断点和数据断点)
  • 如何查看当天断点下的调用对战
  • 如何查看程序运行过程中的线程信息(这块可以放到下文再学)
  • 如何查看某个变量的内存值

掌握了一门编程语言加其开发的工具链,你的想法就可以通过动手变为现实了。熟悉了 C/C++ 语言和其相关的开发工具链,接下来你可以根据你的兴趣学习更多的高阶知识。

2.3 编程语言方面

学好 C++ 本身,学习的阶段,请抛弃各种总结经验技巧的面经,逐个掌握 C++ 语言的各个语法,包括但不局限于:

  • 指针和引用的概念
  • 指针与内存关系
  • 程序编译过程,静态链接库和动态链接库
  • static、const、#define的用法和区别
  • C和C++区别
  • 内存中的栈和堆分配
  • 面向对象理解
  • 访问限定符 public/protected/private
  • 构造函数/析构函数/拷贝构造
  • 多态
  • 虚函数与纯虚函数、虚函数实现机制、虚函数表
  • 继承原理、虚继承、菱形继承
  • new/delete和malloc/free
  • 重载、重写和覆盖
  • 类型转换方式
  • RAII 与 pimpl 惯用法
  • 内存溢出和内存泄漏
  • STL标准模板库
  • 迭代器、空间配置器理解
  • 常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap

C++11/14/17 新标准也慢慢成为主流,这块也要熟悉,要熟悉新标准常用的语法与新功能,包括:另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下:

  • 左值/右值/std::move/std::forward
  • 统一的类成员初始化语法与 std::initializer_list
  • 注解标签(attributes)
  • final/override/=default/=delete 语法
  • auto 关键字
  • Range-based 循环语法
  • 结构化绑定
  • stl 容器新增的实用方法
  • std::thread
  • 线程局部存储 thread_local
  • 线程同步原语 std::mutex、std::condition_variable 等
  • 原子操作类
  • 智能指针类
  • std::bind/std::function

C++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书:

  • 《深入理解 C++11:C++11 新特性解析与应用》
  • 《深入应用 C++11:代码优化与工程级应用》
  • 《C++17 完全指南》
  • 《Cpp 17 in Detail》

2.4 学好算法和数据结构

如果你想毕业后进大厂,从这时开始学习算法和数据结构。

一定要找一两本经典书籍系统地学习下常见的算法理论、思想和常用的数据结构知识。等熟悉了这块的知识,再适当地刷一些算法题目或者做一些算法练习。

学习算法和数据一定不能急功近利,算法和数据结构的知识一定要作为一个长期的学习目标。

与 C 语言相关的算法和数据结构的书有:

《数据结构与算法分析—C语言描述》

当然,如果你觉得这块很难理解,可以先通过一些轻松点的书入门以建立一些感官认识,推荐《大话数据结构》这本书。

2.5 注重代码规范与风格优化

在你学习的过程中,请一定要认真对待自己每一个变量名、函数名,养成良好的代码习惯。我学生时代花了大量时间去学习一些教人写出优美风格的代码书籍、资料、源码,在你还是个小白的时候,要认真精读一些优秀代码,不仅要学习它们的整体设计思路,还要学习它们的代码风格和细节。这里推荐《程序设计实践》《代码整洁之道》这两本书,特别是《程序设计实践》,强烈建议学生朋友看一下,能大幅度地提高你实际编码的技巧和编码风格。

我刚毕业那会儿,在做一些笔试题的时候,虽然笔试题本身可能没解答出来,但是好多次都是因为代码风格非常好赢得面试官的青睐,也拿到了不少的机会。这和我上学的时候,刻意注重培养这一块的能力有关。

以上是我觉得大一大二的计算机专业的同学应该要做的事情。

三、写在最后的话

越早意识到自己不足,越早行动起来,功不唐捐。

最后用哈佛图书馆的校训中的一句话来勉励一下:今天不走,明天要跑;没有艰辛,便无收获。

祝福你们。