什么叫学会编程

近来有位朋友问我,自己看完了「笨方法学习 Python」之后,还是觉得自己没有学会 Python,问我应该怎样学会 Python。什么叫学会呢?你询问一个python工程师是否学会了python,如果他是个性格谨慎的人,他可能会心里一紧,然后给你发了一个表情:

他觉得你可能是问他是否精通 python,而你可能觉得,如果我像他一样,我肯定学会了python。

这至少说明,不同的人,或者同一个人在不同的时期,对「学会」的理解是不一样的。既然是编程语言,那我们不妨用语言来类比一下。

你学会了英语了吗?

我想很多人听到这个问题也会打怵。但是,如果你的目标只是出国玩的时候能买点东西,那么只要学会这句,你就可以说学会英语了:「This! This! Yes! How much, please!」哈哈开个玩笑,假如你的目标是研究英语文学,那么这点功夫就不够了,你需要确切知道完成这个目标所需要做的积累和努力。比如需要多少词汇量,语法需要掌握到什么程度,需要读那些材料等等。

再回到编程语言,之前让大家思考的问题就是,你学编程最功利的原因是什么?原因越功利,目标往往越容易明确。我想改变世界,就不如我要开发一个能让朋友们看到近态的应用明确;我想让世界更美好,就不如我要追求我们村头的村花更明确。那么你学习编程的明确的目标是什么呢?做个网站?整理自己的文档?也就是说,只要能解决你的问题,你就可以说,你学会用 python 了;当你遇到新的问题,就需要重新学会 python,这是一个动态过程。(不妨先看下这个话题。然后思考一下,你掌握编程技能,想解决什么问题呢?)

编程思维和知识习得

传统的看教程做练习的学习方式是什么样子的呢?你被要求看一本教程,这本教程讲了好多编程语言的特性,然后课后习题是检查你有没有掌握这些语言特性。它为什么效率低?因为这种课程没有教你解决问题的方法,它是知识的灌输,并没有锻炼你的编程思维。什么叫编程思维呢?你可以简单的理解成,把一个事情拆解成若干可以实现的组分,并逐一实现的过程。

举个例子,我想查一下豆瓣里有那些被低估的好电影。首先我们需要建一个模型,定义什么叫被低估的好电影。你需要重新定义豆瓣评分1-5星的权重。然后你需要遍历豆瓣的所有电影,取出每部电影的评分数据,按照你的模型重新计算评分,然后将结果保存起来。这里的建模,遍历,抓取,保存等是你可能会遇到的技术难点。编程思想在这里体现出来:如何拆解问题,获取解决方案,并逐一解决。

为了获取这一能力,你需要在生活中刻意练习,任何需要人重复多次的事情,想想看能不能编个程序解决。如果我有了思路,能不能编写代码实现?既要练习想,也要练习做,想和做是合一的。想和做是互相倒逼的。有没有想到知行合一?当然,这一能力并不是那么容易的掌握,这也是需要导师带领的原因~知识的学习不是容器隐喻,也不是管道隐喻,它是故事隐喻,知识通过故事,谐振到你的大脑中。在我们的课程中,你除了学习,还要编写教材,知道如何把知识谐振给别人,就能更好的通过谐振得到别人的知识。

Amplitude_modulation
Amplitude_modulation

看这幅图,绿色的线条是知识,方波是故事,把知识调制到故事上,才能更好的被大脑接收,大脑再执行相应的解调操作,就可以将知识内化。熟悉通信原理的同学知道,调制和相干解调本质上是完全相同的,这也是我们需要通过写教程来学习的原因。

如何跟随老师

请参看认知学徒制

找到一位导师,建立信任,然后盲从。跟随信得过的人的教导,接受偏见。当你想要学习编程的时候,会有很多人会跟你建议,先学 python 好,先学 java 好,先学 c 好。我们公司一位同事,问了我好多这种语言选择的问题,让我身心俱疲。诚然,每个人都有自己的偏见,但是,每个偏见都是有道理的,选择你信任的老师,跟着他盲从就好了,当你入了道,你自然就会明白当初他的偏见的原因,而这个时候,你也有了自己的偏见。

无论你的导师推荐的是 python,java 还是 c++,都不会妨碍你学会编程。而且经验表明,当你具备编程解决问题的能力的时候,你会的编程语言,通常都不止一门。

进入编程世界

黑话,术语,梗,是获得身份认同的高效方式,不妨现在就注册 github,stackoverflow 和相关论坛吧,和别人分享你的疑问和成长。对于融入 github,我的经验是,参加开源项目,当初我也是通过参与一个开源项目才熟悉了 git 和 github 的相关操作。

由易到难,你可以这样参与开源项目:

  1. 找 bug,提建议,在 issue 里参与讨论;
  2. 画 logo,做翻译,提 pull request;
  3. 给开源项目写测试代码;
  4. 开发分支功能;
  5. 改善主功能。

编程能力的意义

根据教育组织 Edutopia 的研究,编程对复合思维有非常深刻的影响,而且对于提高解决问题和分析推理的能力都有一定的帮助。因为编程的学习过程有助于学生理解“构建,假设,探索,试验,评估,最后形成结论”。编程也是有助于缓解自闭症学习障碍学生症状的一种纽带和桥梁,能够使这些学生有机会展示他们的天赋,特别是模型开发和创造性的技术应用。

阳老曾经说过,有趣是对零度的偏离,作为五大元学科之一的编程技能,可以赋予你强大的偏离零度的能力。即使没有成为工程师的打算,编程也会极大的丰富你的人生。这种编程思想会一直伴随着你。

我想很多人参与社团活动都有这样的经历,负责人 qq 给你发来一个 excel 文件,让你填写基本信息再回传给他。这通常让我很痛苦,因为我需要下载,编辑 excel 文件,上传,再删除这个文件。然而我更加心疼负责人,他要一个个下载反馈的表单,再把所有信息复制到汇总的 excel 里。

表单是解决这个问题最好的方法,其实,学会在这种问题下使用表单,就是一种编程思维的体现。

我强烈推荐大家试玩 ifttt 这个应用,他会大大激发你对于编程的想象力。你完全可以把 ifttt 当成编程语言,只要逐个点击按钮,就能实现一个有趣的功能。

编程相当于赋予你一个别人不具备的工具箱,如何玩好,就看自己的想象力了~