如何学习编程?

某一天我刷知乎的时候,发现有个有趣的问题:编程究竟难在哪?

其实在观察大家的学习状态之前,我可能并不会很重视这个问题。在我看来,在不涉及到纯数学的情况下,编程以及学习编程并不是什么难事,只是需要时间而已。但是从大家的学习状态来看,我们之前好像的确忽略了这个问题,所以我点进去看了一下,的确对如何用自己的语言描述这个问题收获颇丰。那么在这一节,我们就来好好谈谈这个问题。

学习编程需要什么?

首先我觉得是兴趣。兴趣是一切爱好的动力,而抛开兴趣来谈,打代码好像的确是一件十分枯燥的事情,以至于我真的读了两年 CS 才知道 CS 专业也是有不少人对 coding 根本不怎么感兴趣,抑或是 debug 已经把他们的兴趣磨灭了....对于这样的情况,我只能说不喜欢就放弃吧,我觉得没有兴趣对学习任何东西来说都是挺致命的。

其次是自学能力。这个领域的技术革新的速度是非常非常快的,没有自学能力就会跟不上,所以这个对于程序员来说十分重要。

接着是信息检索能力,就是说你使用搜索引擎找到你需要的信息的能力。如果觉得自己这个不是很好,推荐你去选修“网络信息检索”这门通选课,或者知乎一下这个问题,因为我也不是很知道怎么教.......

从更抽象的角度来看,后面两个以及其他的一些都可以归结为:解决问题的能力,这里我们在后面重点讲。

黑箱模型

黑箱理论,是指对特定的系统开展研究时,人们把系统作为一个看不透的黑色箱子,研究中不涉及系统内部的结构和相互关系,仅从其输入输出的特点了解该系统规律,用黑箱方法得到的对一个系统规律的认识。

我们了解编程的第一步,应该先学会这个非常重要的模型。

为什么说这个黑箱模型很重要?我认为它给了初学者一个非常重要的学习视角和系统化学习的方法,那就是对于你现在将要学习的东西来说,什么是主要的,什么是次要的。另外,它也能够帮助你到底怎么样才能看得懂文档。

上面加粗的两句话分别对应两种人,我们先来说说第一种人,就是那种思维发散、活跃的人,具体表现就是喜欢刨根问底、问“为什么”的同学。首先,我们并不否定这样的行为,而大家有时候这样问出来的问题的确是很有趣的。但是,这个有趣并不是对于初学编程的人来说的,而是对于已经掌握了的人用来查漏补缺而言的。对于初学者来说,太过于纠结黑箱内部是什么并不是一个高效率的学习方法。另外,就算你花不少时间掌握了黑箱内部的原理,一时半会儿它真的用得上吗?许久之后你遇到了需要它解决的问题时你又还能记得吗?所以我认为初学者并不需要在刚开始学习的时候过于深究黑箱内部的东西。

再来说说第二种人,这样的同学可能在高中及以前没有培养好自己比较强的自学能力,也或者在刚学习编程的时候找不到比较好的学习方式,对于看起来”十分冗长“的或者全英的文档、教程之类的觉得根本看不下去。这时候,我认为黑箱模型能够对读懂文档有非常大的帮助。

对于一个功能/函数,我们要问以下四个问题:

  1. 它能够解决什么问题?
  2. 它需要什么样的输入?
  3. 它会输出什么样的结果?
  4. 如何使用?

带着这样的问题去看文档,就可以快速地掌握关键信息了。同时,我们也可以从不同的范围来提取出不同的黑箱模型,一门程序设计语言是不是一个黑箱呢?一个函数/包是不是黑箱呢?根据需要学习的深度,大的黑箱可以不断拆解成许多小的黑箱,于是知识的层次结构就形成了。

编程的核心:解决问题

我们把编程抽象上升一层,实际上它的核心想法就是用计算机解决问题。只是在编程中,我们使用的是相对于自然语言更加严谨的程序设计语言和数学工具

实际上,在计算机这个领域,有许多基本的东西都是由解决几个基本问题发展出来的,例如:

  • 如何让计算机代替人类完成一些劳动密集的工作?
  • 如何提高计算机的工作效率?

所以,我们在coding之前就可以建立这样的思路:我要解决什么问题?

那么明确了需要解决的问题,我们就可以围绕它来选择解决问题的方法了。一般来说,在编程方面我们需要选择的是:使用什么程序设计语言、使用什么框架/包/库、建立数据模型、设计逻辑层次.......(这里说得可能很不专业,见谅)

围绕着这样的思路,我们就可以比较有效地面对我们所遇到的问题了。

问题的产生:需求

需求和问题的概念是有些重叠甚至是包含关系的。简单来说,需求是一个总的问题,是这次编程的最终目的。

而需求,也是我们学习的主要动力之一,需求驱动的学习,往往也是更加有效率的。

如果我们只需要使用某一个模块,那么在解决我们的问题的时候,我们能够对着长长的文档迅速找到重点,这样会比从头看到尾而中间开始有点烦的学习方式更加有效。

实际上,在平时的时候,我们可以自己练习如何提出需求以及相处实现它的大致思路,例如,如何做一个淘宝?这些需求许多都可以从如何让计算机解决我现在遇到的问题这个方向来提,这样的训练做多了之后,也许你就有了当产品经理的潜质了呢

这一节暂时写到这吧,放了几天又捡回来写感觉灵感都丢得七七八八了,以后有灵感的时候会继续补充,同时欢迎dalao们指出错误和不足之处