自学编程,从此开始

上第2学堂,听有趣的编程课

课文: 《深度感受篇概述》 (点击查看完整内容:视频+评测+讨论+……)

作者:null

深度感受篇的作用与所涵盖的主要知识点,同时介绍《广度感受》篇的基本内容。

课文题图

 

第1节:概述

学C++最容易出现的问题是什么?

一、感受篇的作用

假设,你是成龙,或李小龙,被关在一橦楼里;然后你得知楼下聚着一帮人排好队准备轮番上来打你。你所在的房间有窗,通过窗户偷瞄一阵,可以看清所谓一帮人是多少人?5个或500个?也可以看清这一帮人是什么人,一群社会青年?还是隔壁幼稚园所有曾经被你吓哭的孩子们的集合?是全部赤手空拳,还是有人操着家伙?是普通玩家?还是少林、峨嵋、崆峒乃至蒙古国师金轮法王竟也赫然在列?

又或者,你被安排独自一个“勇闯”一片陌生而可怕的“魔鬼丛林”,出发之前,有一张地图画着那块丛林的基本样貌。你是直接出发?还是研究一下这张地图再走?

C++语言,光语法知识点就是一个相当庞大的知识体系;并且体系中的许多知识点存在典型的互相依赖的关系。意思是,若想要完整理解知识点A,需要理解B,而若想完全理解B,又需要理解A。比如指针和数组就有这种关系:指针可以(其实是经常地)指向数组,而数组又可以存储指针;指针可以使用典型的数组下标访问操作符“[]”访问其指向的目标,而数组可以使用通过指针加偏移量的方式访问其元素。懂指针,对懂数组大有帮助,而懂数组也对懂指针大有裨益……

面对这种情况,错误的学习方法是:企图将课程中先遇到的A知识点彻底地搞懂,才放过它,再去学习B。这种方法很容易造成学习停滞。正确的学习方法是采用多轮学习法。比如,第一轮先粗通A,再粗通B;第二轮再带着B的基础知识,重新学习A。

课程《C++编程深度感受篇》的作用,就是让大家纵身一跃跳入C++语法的汪洋大海,往下沉,往下沉,快速抵达直至海底——在这个过程中,你将纵览从海面到、浅海、深海、海底各种生物圈的景色。从小鱼小虾到大海鲸再到那些被巨大的水压压扁的奇怪生物,都有一个基本认识。而后,《白话C++》后面的课程会开始新的一轮C++知识学习。

并且,“感受”篇之所以使用“感受”命名,是因为它并不止于“概貌”上的了解。坐着飞机从天上俯看某块巨大地盘上从林的概貌,对后面的丛林冒险之旅有帮助,但不大。《深度感受篇》的课程教学不止于此。我们的方式是在了解地形概貌的基础上,再找一个在这块从林里玩了20年的老司机,让他来安排一条穿行路径,带你走一遍,并且一路告诉你各种注意事项、生存技巧。比如:记住这条河只有在这个拐弯处,可以䠀水而过;再记住这座山的这块大石头,绕到后面有个安全的山洞,你需要在这里休息一晚……

这种教学方法说起来容易,做起来很难。因为对于C++语言这样几乎无所不能的编程语言而言,符合要求能带路的老司机不是太好找。这位“老司机”光对C++知识点所组成的巨大地图了解还不够,还需要清楚知道地图上看不到的“坑”在哪里;还需要知道最佳的穿行路径是什么,有哪些备选路径;还需要知道通常初次穿行者容易犯哪些错误……

总之,只需8小时不到的课程,就能快速完成C++语法的深度感受,于是完成第一轮学习。此时大家已经可以上网上刷 leetcode(当然,你的数学、算法要有点基础),能解决实际问题等。具体会学到的内容,请往下读。

二、深度感受篇的内容

这是一段我们非常熟悉的“Hello World”代码:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello World!" << endl;
}

为什么第一行代码不是以分号结束,第二行却是呢?《深度感受篇》就是这个问题开始,这就是我们跳进海面溅起的浪花。

接下来是一节“函数”课。人类,特别是新生儿开始后的婴儿、儿童阶段,人类这一生学习新知识,要么是在学习对物体的认知:这是球、这是爸爸、这是红色、这是小狗;要么是在学习某些操作:吃奶、吃饭、喝水、走路、说话、亲亲脸……实验表明,多数孩子更喜欢学动作,然后在动作中学习数据。在编程世界中,“物体”对应“数据”,而“操作”主要对应“函数”。学会函数,就意味着我们可以“动”起来,

粗粗学了“函数”,我们再往下就学习“数据”,因为毕竟大多数动作离不开数据,比如“吃饭”,吃是动作,饭是数据。在学习数据时,冯诺依曼老先生又过来帮助我们,帮我们从内存这一根源上理解数据两大核心要素:值 和址。

学会函数,就像我们去驾校学会开车;而懂得数据,就相当于我们真的有了一辆车,接着我们想开车从A地到B地,这时就得学会规划中间的行驶流程——这是一件又自然,又简单的事,甚至可以说是再简单不过的事,因为,无论做事流程如何复杂,最终分解下来,就是三种流程的各种组合:一直直往前走,二看到双叉路往右拐;三左拐、左拐再左拐……。说起来学习流程是超无趣的事呢,就像是一个人的旅程,幸好我们考虑了出门可能开两辆车的情况,所以有了“并行/多线程”的流程学习……

搞定流程,我们再回到数据和操作。这次我们开始尝试将数据和数据组合、于是有了“结构”(struct);我们开始将数据和操作组合,于是有了“类/对象”(class/object)……我们开始学习基于对象、面向对象的编程思路。什么封装、派生、多态一个个出现了。

在以上学习过程中,我们不教大家闭门造车,相反我们教大家如何使用C++“标准车库”中停着的大量汽车。我们重点挑选最具备代表意义的vector牌和list牌的车子让大家练手。前者在设计上,结构紧凑但转弯时动作较大,直行加速超快,但比较耗油,出门泡妞拉风什么的,最适合啦;后者像是一只小火车,有许多节车箱,载货量大,转弯灵活,帮丈母娘搬家什么的最贴心哦。

我们还有一些实践课,不如有三个版本升级的“学生成绩管理系统”。说起来有些害羞,因为这一听就是学校里的作业嘛!但请注意,我们反对的是永远只做学校的练习,理解的重点在于那个“只”字。所有以不结婚为目的谈恋爱都是耍流氓,但所有不恋爱就直接结婚的行为,那应该是在犯罪吧。

三、广度感受篇

连带说说《C++编程学习深度感受篇》之后的《广度感受篇》

我们一直将学习C++语法称为“练功”,但C++何止只有“功”!C++还有各类招术、各类武器呢,我们称为“武”。广度感受篇没办法快速教会大家精通十八般武艺,但初时最重要的感受一番,知道原来C/C++的世界居然有这么多强大到令人发指的武器,会让我们学习动力更强,兴趣更浓。

在深度感受篇之后,我们会有更少的几节课,用于在深度感受篇所学基础的支撑上,快速学会:

  1. 如何用C++连接数据库,操作数据;
  2. 如何用C++解析JSON数据(这可是编程世界中的网红),
  3. 如何用C++写网络程序;

等等……