编程可以带给我们什么?

近年来大学最热门的专业无疑是计算机,而在中小学基础教育这块,少儿编程也是方兴未艾,连美国前总统奥巴马也提出“编程要从娃娃抓起”。



小学二年级的学生都已经在学校学编程了,有的小学生就开始接触图形化编程。作为奋斗在一线城市的家长,就算不让家里的孩子去学编程,至少也要了解下为什么少儿编程会在中国普及开来。


为什么要学编程?


现在任何行业都离不开计算机,会编程这项技能,在求职时就如同90年代会英语一样抢手。学编程,不是为了将来当程序员。


而是为在自己行业里获得更多的机会,比如说做财务的,工作中少不了和excel表打交道,即使对每个菜单功能都很熟悉,还是有需要定制一些专门的查询功能,这时编程就是不可或缺的技能。


也是因为计算机对今天我们的生活而言,就如同汽车对出行的重要。车即使有定期去车行保养,学习汽车相关的知识,万一出行途中汽车发生故障也不至于惊慌失措;而且说不定因此感兴趣了,钻研进去,自己尝试做个升级改装也未尝不可。



学编程,也是同理。电脑或是手机无论硬件还是软件,总会有出问题的时候,会编程的人可以自己做简单故障定位,也可以作为兴趣爱好在闲暇时间里做个网页,写给APP什么的。 


编程学什么?


每次聊起学编程,被问到的第一个问题往往是“学哪种编程语言好”。回答这个问题之前,我想问你,觉得自动档和手动档的车,哪种好呢?


当前初学者中最流行的Python和Javascript就像自动档车,编写简单,强大库函数支持广泛应用;而最为经典的C语言就像手动档,难学难用,还需要通晓编译原理、操作系统和计算机体系结构,当然也最能体味驾驶的乐趣。


以前总觉得C语言对初学者太难了,这个想法今年5月在安大略省高中编程赛被彻底颠覆。一支由三个分别是五年级,七年级和八年级亚裔男孩组成的队伍特别醒目,年龄比其他选手小很多,却在由各个学区优胜者组成56支高中编程队脱颖且出名列第九。这三个孩子就是用C语言写的程序,C语言也是他们唯一接触过的编程语言。所以初学者具体学什么语言,因人而异。


思维指导行动。未来人人都会写代码,但程序设计是否简洁高效,就得在思维上见高低了。十年前,卡耐基梅隆大学计算机教授Jeannette Wing 提出Computational Thinking “编程思维”的概念,指出通过学习编程,内里培养的其实是认识问题和解决问题的思维方式,而这种思维方式可以跨界应用到其他领域的学习和实践中。



也就是说和编程语言相比,编程思维是内功心法,在此基础上,学习和使用哪种语言,犹如使用哪种兵器,只是工具层面上的东西。


什么是编程思维?


编程思维本质上来说,就是能够把现实生活中的复杂问题,逐步拆分成可理解的小问题,(Decomposition 拆分),接着根据已有的知识和经验,找出新问题和以前解决过的问题的相似性,举一反三琢磨出规律(Pattern Recognition 模式识别),然后将问题里涉及的数据抽象(Abstraction)到数据结构(变量,数组,链表等等),把数据处理过程可重复执行部分抽象(Abstraction)成函数模块,通过循环执行,最后根据前三步的分析成果,设计步骤,写出算法(Algorithms),从而解决问题。


编程思维本身是一个非常抽象的概念,下面我举个例子来详细解释一下它的四个组成模块。


编程思维1-2-3-4


我们都听说过这样一个故事:数学家高斯在三年级时候,老师要求从1+2+3开始一直加到100,其他同学都费劲的一个数一个数的加,只有小高斯注意到了这些数可以两两配对,相加和为101:

1+100=101

2+99=101 等等

一共有50对,最后的和可以用乘法来做:(50X101)=5050

高斯的上述解题思路充分体现了编程思维中的拆分和模式识别,再进一步延伸,就可以概括出求任意范围【a, b】连续整数求和公式:(a+b)x (b-a)/2。



把原题扩展一下:

假设你有100张扑克牌,依次编号,从1到100,打乱洗牌后,突然发现少了一张,怎么知道少掉的是哪张?下面我们试着用编程思维一起来一步步的解决这个问题。


第一步拆分:通过一张一张的查找,先在这堆牌里找1,再在剩下的牌里找2,然后再找3,依次下来,最后总能发现哪张少了。这种方法的局限是如果牌张数少还行的通,如果张数多,费时费力的,但符合一般人的解题思路。


第二步模式识别:如果能联想到高斯的求和题,所有牌的面值总和应当是5050,将手上的牌一张接一张的加起来,假设得到的和是5040,用5050-5040=10,很快知道少掉的那张牌是10.这种方法比起前一种,明显棋高一着。


第三步抽象:扩展到现实生活中,假设有一副扑克牌,少了一张,如何快速定位少的是哪张?


一般情况下,我们都会重新理牌,先把4张Ace都找出来,再把四张2放在一起,依次下去,最后总可以看出哪张牌的哪种花色少了。


这种常规方法效率很低,如果联想到我们刚刚建立的求和模型,是不是可以用来更为快速有效的解决这个问题?粗看每个数字都有四种花色,不唯一,好像不适用。


但是如果我们能解决如何把扑克牌花色和数字映射到计算机可以处理的数据的问题,就可以试用刚才的求和模型了。这也是考验抽象的能力的时候了。


不妨按花色来,设红桃A 为1 , 红桃2 为2 ,依次到K是13,然后方块A为14,到方块K是26,以此类推,黑桃A到K是 27到39,梅花则是40到52。


这样一来问题就转化成了有52张扑克牌,依次编号,从1到52,洗完牌,发现少了一张,请问少掉的是哪张?是不是就可以很容易的套用第二步里总结的求和解题模型了?


再试想你有一千,一万,甚至上百万副扑克牌,每副都少一张(不尽相同),怎么能快速定位的少掉是哪些牌呢?



只要你能设计出快速定位一副牌里缺了哪张牌的计算方法,无论多少副牌,计算机都能在一眨眼的功夫,全部准确无误的给你找出来。计算机相对于人脑,有存储容量大和处理速度快的优势,所以计算机最擅长的就是重复劳动。能够让计算机从事高效的重复劳动的前提,是人先思考和分析怎样把复杂工作分解成多个可机械重复执行的模块,然后才可以通过程序让计算机来处理。而这步比写程序本身来的重要的多。


第四步 算法:当要处理的数据映射到合适的数据结构,可复用的处理模块也都分辨识别出来后,下一步就是利用条件,循环,子程序模块,来规划出程序设计步骤,从而解决问题。


所以说,编程思维的核心,不是编程语言,也不是语法,甚至不是算法或数据结构本身,而是如何分解问题,从中发现规律,建立解决问题的模型,并映射到合适的数据结构和算法上,然后才能根据算法写程序实现。在此过程中,前两步分解和模式识别,其实完全隶属数学思维范畴,也是编程思维的基础。而抽象和算法才是编程思维所独有的。 也是在孩子学编程过程中,最需要强调的。

关注智慧山微信公众号(zhihuishan2013)后,在公众号里回复以下关键字,即可得到相应资源!

公开课、作文、复习、试卷、知识点、活动、拼音、字母、钟表、看图写话、故事、双语故事、成语、常识、APP、语文、数学、英语、百家姓、三字经、唐诗三百首、自助查询、超级口算