编程究竟难在哪?
编程一点都不难;它只是和你十几年来在学校受的教育格格不入而已,难在我们从未接受过解决问题的训练
从小到大,我们受到的教育终极目的是有一个:考取理想的学校。每一张张考卷都是一个个堆砌起来的知识点:三角函数,解析几何,数列,函数…...这么多知识点,你需要做的是背下它们,或者说的更高级一点,理解它们。即便是强调思辨和分析的“文科类”,也可以靠死记硬背答题模板拿分,就连作文都要有统一的标准。
记得有一年考试,题目是对冰心的一首小诗写评论:
“墙角的花,当你孤芳自赏的时候,世界就变小了。”
出题老师原意是让大家批判孤芳自赏,但有同学偏偏赞美孤芳自赏,赞美这种洁身自好的精神。而这种文章要一律判作不及格。
年纪尚小的我们甚至都来不及怀疑“为什么这个学生说得没有道理?为什么所有的人都只能有一样的价值观呢?” 因为千万军挤独木桥,保险起见的我们只需要按照所理解下来的知识,将一块块碎片,根据正确而万能的模板拼好,才容易拿下满分。 我们非常擅长理解和记忆,并井井有条地套公式。 这一切,到了学编程这里,统统不奏效。 我们接受了十几年的应试教育,为了最大化公平,考试必须有一套清晰的标准。 正是如此,我们更看重应试技巧而非知识本身,学习变成了追求标准答案,求知变成了死记硬背。 绝大部分人,难以形成系统的学习方法论的意识,以至于很多人一旦脱离试卷,在社会中面对实际问题的时候,完全没有一套行之有效的方法论支撑其解决问题。
而编程的核心,不是编程,不是语法,甚至不是算法或数据结构本身, 是如何分解问题——发现规律建立解决问题模型,映射到合适的数据结构和算法上,最后才根据算法写程序实现。
# 我们从未学过创造
清华大学前校长陈吉宁曾提过一个观点:
清华大学里有很多“A型学生”,但未来社会最需要的是“X型学生”。“A型学生”,指的是传统观念里的“好学生”,他们的成绩总是能得“A”。“X型学生”与之不同,他们的成绩并不一定拔尖,但愿意承担创新风险,勇于尝试新鲜事物。
两者最重要的差别,在于创造力。
可是我们连作文还不敢写得太跳,生怕阅卷的是个老古董,大笔一挥,让你再考一年。创造力,更是我们在学校想都不敢想的事。绝大部分学生的思维,早已在填鸭式的教学中,变成了一个只会收纳外部知识的容器,根本无法用所学的东西创造出任何东西来。
所以,当我们开始学编程,面对“Hello world.”这个等着我们创造的世界,其实是非常茫然的。
因为编程没有“题型”和“公式”能把你解决问题的过程简化成填空,编程提出的问题基本都是空而泛,需要你根据脑子里的逻辑推断,利用所学编程语言的各项功能组织成代码,来解决问题。
整个世界的运转,都是靠你的大脑想象出来的。这是编程的难。
但是,只要你明知其中不易,仍有一腔骁勇,你可以尝试在编程的世界中,保持“实验者心态”,不断探索自己的想法,质疑自己的假设,从所犯错误中学习宝贵的经验,就一定能在编程的魔法世界中得到更多宝藏。
如果你看过《乐队的夏天》,那么在参赛的三十一支乐队中,你一定会被其中一支叫做“刺猬”的乐队所打动。
刺猬乐队的子健,他是台上的狂躁主唱,台下的学霸码农。
即使每天都在和冰冷的数字打交道,但作为程序员的他,体内有被保护得非常好的创造力,使得他拥有满腔的诗意与细腻的内心,更可以谱写出令人折服,引人共鸣,充满无限色彩的音乐作品。
自小你受到的教育,总是:
1、记忆和理解一个个的知识点
2、给你一个未完成的拼图,让你把自己记忆的、某几个合适的知识点以正确的姿势放进去 (超过三个就是难题,超过五个就是压轴题!)
3、好了,满分
换句话说,你从未学过创造;你只是被训练的极为擅长“填补拼图中缺失的一角”而已。
编程不难。但它要你创造。
过去你已经习惯了的、出题人准备好一切、只留下一两个缺口让你补充拼图的“思考”方式,在这个领域渣都不是。
其实根本不需要学习什么“语言”。C/C++、Java、Go、PHP、Python……统统用不着。
你只需要知道,程序语言有顺序分支循环三种控制结构、与或非三种逻辑——剩下的,统统靠你自己。
你就是再读一千本书,也甭想靠这个把“编程的技能”直接灌进你脑子里。
相反,你必须自力更生,你必须靠着“鄙陋”的顺序分支循环和与或非以及中小学水平的数学运算支持,解决手头的一切问题。
你学的是编程,不是编程语言。
脱掉C的底裤,并不能帮你写出哪怕一个简单的鼠标驱动程序。
在各大网络论坛平台,总有人忍不住骂“怎么你们码农什么话题都想插一句?”
但程序员的工作,恰恰正是“理解各行各业的工作,然后把它教给电脑”。
学编程,学的甚至不是计算机本身;相反,它要求你从声学到视觉暂留、从结构力学到滤波解调……随便哪行哪业,你都要能够快速抓住重点、然后把它说的清清楚楚明明白白,这才可能把它教给计算机、让CPU代替人工作。
如果连“手电筒的原理”你都理解不了、如果连“遥控小车”这样简单的发明你都做不到“信手拈来”……那么,他人从液体分层原理借来的冒泡算法、从猜测的人脑工作原理偷来的神经网络,你又怎么可能理解?
它要求的,是“从三百五百甚至成千上万个知识点中挑选出最合适的那几个、然后用它们解决你所面对的问题”!
编程真的不难;但你从未受过解决问题的训练。
而编程,恰恰就是最最纯粹的、以精确无歧义的方式表达问题解决方案的一种工作。
你甚至不知道“学习编程”就是学习“如何用电脑解决问题”,反倒学编程语言本身去了……
这种学法,怎么可能不难?
# 我们从未需要如此深刻了解世界
学编程,往往学的也不仅仅是计算机本身,而是将各行各业,结构力学,生物细胞,光学声学……等千百万个行业,抓住它们的重点,迅速理解并且教给CPU,让它代替人类工作。
尤其是身处信息时代,计算机是信息处理的核心,商业、农业、工业、教育等,都被计算机技术推动着进步,如果能知道计算机是怎么做到这一切的,即知道这里蕴含的编程思维是什么,才能给个人在所处行业的发展带来帮助。否则,就只能浮于表面地应用现成软件而已。
这是编程的第三难。应试教育标准化的课堂,正好背离了这点。从前的课堂里,为了实现教学效益化,将课程进行了划分。遗传学被归入了生物课,概率这个概念被归入了数学教育,然而遗传学实际上是对概率的应用。同理,物理明明需要应用代数和微积分,它却与这两门课程脱节,成了独立的学科。仿佛每个知识只存在于真空中,于外界事物毫无关联。这些划分限制了学生的理解,让学生对世间万物运行规律的理解产生了偏差。
于是,为了了解每个“独立”的知识,我们接收各种各样精细化加工的知识:推演好的理论、公式,讲义、ppt、难点总结、高分模板,我们无需知道这些公式是怎么推导出来的,只要运用公式去解题就好了。
# 最后
所以,你说编程难吗?编程一点都不难,用电脑听得懂的语言,告诉它帮你做你想要做的事情,只要认真学,谁都可以。
难就难在,"学以致考"和"学以致用"是不一样的;记忆和创造是不一样的;学好学科和理解世界是不一样的。
当然,并非要彻底否定应试教育。在中国教育资源极其不平均、经济文化撕裂的大生态下,以考试为目的的教育,提供了一套非常清晰的评判标准,通过分数这个显性的指标来筛选和划分学生群体,选拔出社会精英,可能是当下最公平的取舍了。
只是时代在不断的发展,无论是学校,家长还是孩子,都应该反思一下现在的所接受的教育形式,如何发挥出每一个孩子的个性,让他们成长为更好的人——学编程的过程会给你提供答案。