<audio id="audio" title="开篇词 | 别闹了，学编程 ≠ 学语言" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/a4/6f/a493468278966d8eb9370df7c9bc3c6f.mp3"></audio>

你好，我是胡光。欢迎加入专栏和我一起学习编程。

我喜欢编程，从高一开始接触信息学竞赛的时候，就喜欢。我的信息学竞赛成绩，不能和同时期的那些真正的牛人相比，就算是小有成绩。后来我被保送到了哈尔滨工程大学，本硕博连读，外加学费全免。在本科期间，我参加了大学生的算法编程竞赛，并拿到了ACM竞赛亚洲区金牌，进过两次全球总决赛。可以这么说，我是在激烈的竞赛环境中，成长起来的。

毕业后进入百度，一直做算法研发相关的工作。期间，我开发了部门内部的第一版推理引擎，并顺利在人物关系推理等应用场景中落地实施。后来由于兴趣，自己开始从事教育行业，希望能够帮助更多的人从零开始学习编程，然后进入互联网公司从事相关职业。

作为教育行业的创业者，学生能够学有所成，是我最具成就感的事情。在我所教导的学生中，双非院校中的本科生最高毕业薪资包 59.5 万，211 类院校学生毕业平均薪资达到 35 万以上。

今天我来到极客时间，希望也能带你了解如何学习编程，掌握编程的精髓。

## 一个蕴含编程真谛的等式

**程序 = 算法 + 数据结构**

学编程，其实就是学习编写程序，那么程序到底是什么呢？上面是关于程序本质的一个非常著名的等式。其中数据结构的作用，是将问题中的相关数据，表示到计算机中，算法则是一套计算并且得到结果的流程。

这个公式中包含了两个最重要的部分，数据的表示和数据的计算，所以学会了这两部分，就等于学会了写程序，这就是这个等式经典的原因。但是对于刚刚接触编程的你来说，对着这个等式看会有两个问题。

- 如果你按照这个等式来，学完语言，就学习算法数据结构，肯定会感觉难度太大，我知道的很多人就是这样被“劝退”的。
- 如果你不听从这个等式的安排，只是大量学习语言，你会发现虽然学了各种语言知识，但很多的编程问题还是搞不定，甚至有些时候明明知道思路，却无法用程序语言表达出来，这也会极大地降低你学习编程的信心。

那么，是上面这个公式错了么？不，上面的公式是对的，这一点我丝毫没有质疑过。但我想说的是，上面的公式只描述了编程中的一部分，只是“程序”这一部分。而编程，不仅有程序，还有程序的设计过程。

因此，我想告诉你一个新的等式，这个新的等式，就是我将在这个专栏里带给你的学习编程的方法：

**程序设计 = 算法 + 数据结构 + 编程范式**

这个新等式包含了程序设计中重要的三部分，从前到后，重要程度依次递减。如果把程序比做人的话，那么算法是灵魂，数据结构是骨架，而编程范式就是性格。

对于三者的学习顺序呢，则应该是反过来的：当你掌握了一定的语言基础以后，应该先从编程范式开始学起，然后是数据结构，最后是算法，整个过程采用传统的螺旋式上升的方式进行，这样才能获得最好的学习效果。正如许多会学习的人，他们在学习中往往不会纠结于一个点，而是会反复来回地琢磨理解，从而达到对知识的融会贯通。

所以在专栏的设置上，除了有语言基础的讲解、部分算法及数据结构的讲解外，我还在中间加入了一个特别的章节，叫作“编码能力训练篇”，这里其实就是帮你把分析具体问题的思路转换成代码的技巧，也就是实战写代码的能力。这是我从具体教学环节中总结提炼出来的内容，也真真切切在线下帮助了一批又一批的学生，让他们在短时间里扎实地提升了编码能力。再配合后续的算法数据结构学习，这样进行下来，半数以上的学生最后能在 1 小时内，没有 Bug 地打出来红黑树的全部代码，顺利通过线上标准测试集的测试。

## 课程设置

从内容上来说，我将这个专栏设置为四部分：**语言基础篇、编码能力训练篇、算法数据结构篇和综合项目篇**。

**语言基础篇**，基于C，我会带你体验一些有趣的语言特性，让你看到编程不是单纯枯燥的知识理解，而是轻松、有趣的思考与实战过程。这一部分与其他资料最不一样的是，以往大家都认为 C 语言是黑白的，在我的专栏里，C 语言是彩色的。以往大家都认为指针很难学，在我的专栏里面，我会教你一句话，通过这一句话，你就可以把指针的内容学得透彻。以往大家都认为，程序只是人写的，在我的专栏里面，我会教你利用程序写程序的技巧：预处理命令。

总而言之，这部分既是基础，又是我个人编程学习经验的总结，让你轻松入门 C 语言。由于专栏篇幅有限，我只会在专栏中讲解那些，容易被你忽视，容易被你误解的知识。如果你想更进一步详细了解 C 语言，我还会给你推荐几本比较好的图书，为此我还专门买了 15 本现在市面上面最畅销的 C 语言书，替你做了对比与筛选。

**编码能力训练篇**，主要解决你编程学习过程中，学了语言却写不出程序的尴尬局面，让你真正能够将思维变成代码。这里的课程设计原则是，减少你面对的问题数量，一步一个脚印地提升编码能力。举个例子，如果我一上来就给你讲算法，那么你不只要理解相关算法思维，还要同时理解相关算法的具体代码实现过程，这样就在你面前同时放了两个你不太擅长的问题。在这一篇里，我尽量在你面前放置一个陌生问题（编码技巧），和一个不太陌生的问题（简单的算法和数据结构），让你能够在舒缓的学习曲线中不断提升现有的编码能力。

**算法数据结构篇**，看到算法二字，你不要害怕，相信经过了编码能力训练篇的洗礼，再来面对算法和数据结构相关知识的时候，你只需要站在前面的基础上建立更深层次的理解。并且，我会教你另外一个学习数据结构的等式“数据结构 = 结构定义 + 结构操作”，其实就是学习这两个内容，就是这么简单的两步。

**综合项目篇**，这一模块主要是为了检验你之前的学习效果而准备的。你会接触到两个小项目，一个较难的项目，你需要仿照 Google 测试框架开发一个自己的测试框架，第二个项目较简单，就是实现一个带变量的表达式计算程序。项目过程中，我将带你从需求到设计逐步分析、拆解，并会给出一部分核心代码的讲解。其余部分，我希望你可以通过自己的思考和文章中的引导，自行补全没有给出的部分代码，从而完成整个项目的开发与实现。

总地来说，我希望通过接下来近3个月的学习，带你达成三个小目标：

- 掌握C这门迁移性最好的语言，以便日后学习其他语言。理解了 C 语言，你就理解了操作系统，也就是理解了所有语言的运行环境。
- 掌握从简单的问题出发训练编程技巧的方法，为日后将思想转换成代码减少障碍。
- 掌握算法、数据结构学习的关键方法，为自学其他数据结构和算法打好基础。

如果这门课程，能够帮助你逐渐的建立学习编程的方式方法以及建立学习过程中的信心，那将是我写这个专栏最大的快乐之处。

如果篇幅够长，我想跟你说的还有很多很多，可十几万字无法穷尽所有编程知识，但我希望这个专栏能够让你拥有自学的能力，强化独立思考的能力。我还希望，你可以基于这个专栏内容，总结升华出更棒的内容，讲给其他人听。计算机是一个新兴学科，我坚信，现在我们所接触的所有和教学相关的方式方法，在将来都将被改进。

如果说今天想让你记住点儿什么的话，那就是**“学编程不等于学语言”**。编程学习就像是探索一片森林，不同的人，会带你走不同的路线。站在你面前的我，已经全副武装，就等着你的加入了，我将带你去到这片编程森林中最有趣的地方，你不来一起看看么？

欢迎你在留言区，写下对于编程学习的认识以及你希望达到的目标，也好让我知道，应该给你准备哪些沿途中的装备。

我是胡光，我们留言区见！
