> For the complete documentation index, see [llms.txt](https://smilence-yu.gitbook.io/sde-foundations/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://smilence-yu.gitbook.io/sde-foundations/master.md).

# 前言: 编程是一门实践学问

## 1 学习编程与其他学问的区别

学习编程与学习其他学问区别很大，因为它非常依赖练习和实践。事实上，编程只不过是把我们对事情的解决思路，翻译成一种计算机可以理解的语言。从这点上说，学习编程相比于理工科更接近学习外语。但幸运的是，这门外语的知识容量极其有限，词汇量充其量不过那么30，加上一篇文章就能概括的语法。

{% hint style="info" %}
学习编程的关键在于理解和熟练、灵活运用。而这两个目标，通过被动学习（听课，阅读）很难达到，需要大量的**主动思考和实践。实际上你经常会发现自己独立总结规律、debug、开发一个没有教程项目的过程，非常痛苦，但这也意味着这个过程大有裨益。**&#x88AB;动接收信息，就算都能听懂看懂，离自己能够灵活应用仍然相差甚远。
{% endhint %}

![](/files/-M2G_LncJW3GWIx9hiU7)

> 这是一个老掉牙的图，但是还是有参考价值，对学习编程也非常适用

## 2 冗余学习理论

当你学习一个单词，你可以选择阅读词典里对这个词所有的释义和例句，这显然是overkill，并且也只能吸收其中的一小部分。但是你对这个单词的熟悉度已经足够高了，以后再也不会忘记他的基本释义。这一条对学习编程也适用，如果有一部分的概念或者算法让你感到疑难，彻底花半天到一天时间，不惜成本地研究一下这个话题。

{% hint style="success" %}
**研究的效果可以把以下作为标准**：你可以向任何一个average的software engineer炫耀你这方面的知识，”你知道么，quicksort选择pivot有这几种方法，各有...好处"。
{% endhint %}

## 3 解决疑难的方法

根据前文的1和2，解决疑难概念和问题的**首选方法是使用IDE来调试**（比如尝试一些不同类型的变量传入一个简单函数，看看运行之后变量的reference和变量里的内容会不会修改，来验证语言里function在传copy还是传reference），**次选方法是搜索相关的资料**（比如quicksort的不同变种的讨论），注意尽可能去找不直接给你答案，而是有详细的探讨的资料。简单地说，就是那些“不应试”的资料。

{% hint style="danger" %}
除非已经超出了3倍解决这一问题的预想时间，否则不要寻找这两条以外的方法。
{% endhint %}
