如何看待幼儿园就开始学编程打比赛？
我和我老公都是计算机专业的，我们的孩子编程是肯定要学的（同样是特长，一台钢琴好几万，一台电脑才多少钱，老师还是免费的），但不会在幼儿园阶段学。不止我们家是这样打算的，据我观察了解，我们身边的大学同学，没有一个是在孩子三年级以前就让孩子学编程的。 我们大一刚进校，就开了一门C++程序设计的课，老师一上来只简单介绍了一下面向对象程序设计，然后就开始教怎么编程。 一学期下来，这门课我是听得云里雾里，但老师讲的那些语法指令、各种排序方法、什么迭代递归遍历等等我还是都记住了，期末考试还考了90分。然而只有我自己知道，我对编程依然是一窍不通，只能机械地做题，放到生活中完全不能解决实际问题。 后来我跨专业考研，导师一眼就相中了我，因为我是整个专业中唯一学计算机出身的，他做项目正好差个会编程的。吓得我是寝食难安，眼看自己这拉胯的编程水平滥竽充数不下去了，只能赶紧在网上找了麻省理工学院的编程公开课从头学起（麻省理工学院公开课：计算机科学及编程导论）。课程一开始人家的老师就表示：我们这门课的主旨是在培养编程思维，编程语言只是帮助我们形成这种思维的工具。 这句话让我瞬间知道了自己的问题之所在，也是现在很多少儿编程教育的症结：本末倒置。 编程本质上一种解决问题的手段，编程语言只是工具。要解决问题，最重要的是你要先有一个解决问题的思路，然后在通过手里的工具去实现。而我们在学习过程的中，关注更多的反而是如何使用工具。 现在很多机构宣传的都是：编程有助于培养逻辑思维。然而事实却是，孩子的逻辑思维要达到一定的水平，才能真正懂得怎么去编程。 对于大多数5、6岁的孩子来说，逻辑思维还处于启蒙阶段，因为…所以、虽然…但是、不但…而且、与其…不如、要么…要么、不是…就是、如果…那么、只有…才、无论…都、即使…也，这些逻辑至少搞清楚了，才谈得上把这些逻辑关系转换成程序语言吧。 那么能不能通过学习编程去形成或是提高各种思维能力呢？当然能。我们班当时就有几个贫困地区来的同学，上大学前连电脑都没摸过。同样的老师教，我只会照着书编程，人家就可以从大段大段的代码中悟出理论，从而形成自己的编程思维。但幼儿园的孩子有这个本事吗？ 这种传统玩具，九连环。 这个玩具看似复杂，但只要是懂编程的人，一上手就能马上反应过来：它的核心就是编程中最经典、最基础的算法之一——递归算法。 你让那些学过所谓编程的幼儿园小朋友来玩九连环，他们能不能通过玩九连环这个实际操作，上升到理论层面，悟出“这原来是个递归算法”，我深表怀疑。就算直接告诉他们用递归的方法来解九连环，我觉得他们都不一定能理解。 还有这种类似的通过预设程序来操控机器人绕过障碍的玩具，经常看到小孩在玩，价格还不菲 这种游戏你一眼就能看到障碍物在哪里，要怎么避开，提前设计好路线。如果你用个盒子把所有路线罩住，让孩子再来编个程，让机器人盲走试试。面对这样一个全新的任务，能不能想到把这个任务拆解成一个个的小问题（中途遇到障碍怎么解决、走到三岔路口怎么选择、走错路了怎么办……），然后再逐一解决每一个小问题。这种提出问题并解决问题的能力，我觉得也超出了普通幼儿园孩子的能力。 说了这么多，其实我想表达的中心思想就是：对幼儿园阶段的孩子来说，基础知识的储备、思维层面上的训练，比一上来就学习各种编程规则更加重要。 我们身边那些大学同学，在孩子的教育过程中虽然不太紧张编程，但普遍非常紧张孩子的数学和英语，这两门功课才是编程的基础。 程序设计语言可以等孩子高年级了，找个暑假集中培训一下，但数学和英语的基础必须从小打牢。数学不用说了，是整个计算机这门学科的基础，计算机学到头其实就是在学数学，我老公读博的时候基本上就是揪着傅里叶变换、黎曼数学、泰勒方程做文章。还有英语，主流的编程环境都是英文的，我身边很多程序员同学都非常排斥中文版scratch，觉得这是在影响孩子编程的语感（是的，程序设计语言也是要讲语感的）。 除此之外，还有编程思维的训练。如果爸爸妈妈们有让孩子学习编程的打算，自己在这方面又比较小白，个人建议还是要适当学习了解一下，因为思维这个东西主要还是靠潜移默化的影响，只有你了解了这种思维的精髓，才能更好地去影响孩子。 推荐一本我自己看过觉得不错、准备今后介绍给孩子看的书。 这本书算是一本编程科普书，着重讲思维，又融合了一些计算机原理、数据结构方面的知识，整本书的编排还是很有逻辑的，而且浅显易懂、字大图多，很轻松就翻完了。 我女儿现在5岁半，生活中我俩很喜欢玩桌游，玩桌游就是一种非常好的培养孩子编程思维的方式。桌游的游戏规则无非就是随机、判断、循环、计算等等，一步一步地组合起来，相当在孩子脑海中画了一张程序流程图。 以飞行棋为例： 飞行棋的规则就是：第一回合每人扔三次，点数必须要扔到6才能起飞。起飞以后，点数扔到几就走几步。 而这个规则用编程思维拆分出来就是。 1.玩家1扔骰子，生成一个随机数。（孩子扔骰子，扔到一个3） 2.判断扔到的数是否等于6。（不等于） 3.再循环一次。（孩子继续扔，扔到6）。 4.判断扔到的数是否等于6。（等于） 5.玩家1的棋子起飞。循环结束，进入下一条指令。 6.随机数生成。（孩子扔骰子，扔到5） 7.起飞的棋子前进5步。 8.玩家1的回合结束，返回大循环。 9.玩家2开始扔骰子。 …… 整个过程，孩子边玩我边说，她的每一个动作我都帮她转换成一个可执行的指令，我觉得比直接学习编程对孩子更有意义。 除此之外，编程的本质是解决问题，所以父母在遇到一些问题的时候，可以把自己解决问题的整个过程：如何想的、如何做的，用孩子能懂的语言，条理清晰地展示给孩子。 比如前几天，我和老公带女儿坐BRT。上车的时候，我突然想到一个问题：BRT司机是怎么做到每次进站，都能正好把车门对准屏蔽门的？ 女儿表示想不出来答案。于是我开始跟她爸讨论。 我说：会不会有个类似倒车雷达的东西，快接近站台的时候显示一种颜色，比如黄色，司机看到后开始踩刹车减速。然后越来越近，当显示的颜色变成比如绿色的时候，司机就把刹车踩死，让车刚好停在绿色区域内，车门就正好对准屏蔽门了。 女儿听了连连点头，表示我说得对。 老公说：要验证这个想法，进站的时候直接看司机的仪表盘就知道了。如果有提示，肯定会显示在仪表盘上。 于是女儿挤到前面去观察了半天，最后遗憾地告诉我们：司机的仪表盘上并没有看到类似倒车雷达那种能变颜色的提示。 我的猜想宣告失败，老公说：我猜会不会像停车划线那样，站台上有什么标线，提示司机要把车停到标线上。 下车后，女儿在站台上跑来跑去，发现地上确实画了一些奇怪的线。 第二天，我专门带她去车站验证爸爸的猜想。我们连续观察了5辆BRT，发现确实司机每次都会把车头停在标线的位置，这样车门就正好对准屏蔽门。 我女儿对这个发现非常兴奋，然后马上进行了类推：地铁进站是不是也采用的这种方式？我们哪天再去地铁站看看？ 这种提出问题、做出假设分析、再去验证假设的过程，既是一种很好的亲子互动，也是在教孩子遇到问题时，如何去解决这些问题。 非常感谢大家的留言和点赞，所有留言我都认真看了，有几个共性问题想再说明一下。 首先是关于“小学三年级以前不学编程”的疑问。这其实并不是什么规则或是建议，只是我身边某个特定圈子里的现象而已，有的是觉得孩子1、2年级功课更重要、有的是想越过scratch直接上c++或者python……孩子的成长有快有慢、能力有高有低，并没有什么一刀切的规则。 其次，虽然幼儿园孩子学编程性价比不高，但养育孩子也不是事事都讲性价比的。在经济和时间都宽裕的情况下，如果孩子就是对编程对机器人很感兴趣，或是从编程里面能获得乐趣，学学也无妨。 如果学，家长可以帮孩子加强基础方面的训练，让孩子能够更快更好地领悟到编程的本质。 如果不学，也完全没有必要焦虑。磨刀不误砍柴工，现在小学数学的难度已经很大了，能把课堂上的知识点吃透，就是最好的逻辑训练，就是为编程打下的最坚实的基础。 最后是关于为什么要学编程的疑问。如果把特长的培养作为一项教育投资，我个人认为编程属于低投入低风险型的。相比艺体类的特长，学习编程所需的费用和精力，普通家庭一般都能承受、学习的过程和孩子本身的课业兼容性也更大。学习的结果，好的可以通过竞赛直通清北，一般的可以作为选择计算机专业、进入IT行业的铺垫，再不济也能多一项工作、生活中经常能用到的专业技能。