本文是回答一位知友的提问:
已经大一下了 现在在学 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 注重代码规范与风格优化
在你学习的过程中,请一定要认真对待自己每一个变量名、函数名,养成良好的代码习惯。我学生时代花了大量时间去学习一些教人写出优美风格的代码书籍、资料、源码,在你还是个小白的时候,要认真精读一些优秀代码,不仅要学习它们的整体设计思路,还要学习它们的代码风格和细节。这里推荐《程序设计实践》《代码整洁之道》这两本书,特别是《程序设计实践》,强烈建议学生朋友看一下,能大幅度地提高你实际编码的技巧和编码风格。
我刚毕业那会儿,在做一些笔试题的时候,虽然笔试题本身可能没解答出来,但是好多次都是因为代码风格非常好赢得面试官的青睐,也拿到了不少的机会。这和我上学的时候,刻意注重培养这一块的能力有关。
以上是我觉得大一大二的计算机专业的同学应该要做的事情。
三、写在最后的话
越早意识到自己不足,越早行动起来,功不唐捐。
最后用哈佛图书馆的校训中的一句话来勉励一下:今天不走,明天要跑;没有艰辛,便无收获。
祝福你们。