很多人开始学编程的时候都会有一个疑惑,我到底该学什么编程语言?参考的依据要么来自“砖家”、要么是来自热门语言排行榜、要么是来自薪资排行榜等。殊途同归,所有的人都会给出他们的依据和这样做的利弊。如果说一开始这样还可以理解,但是我们发现很多软件工程师、或者计算机专业毕业的人、甚至是从事软件研发工作的人每隔一段时间都会来这么一次内心挣扎的过程(那些靠一门语言就想混到退休的人除外)。
随着人工智能越来越火,很多人开始意识到编程的重要性,也想要找到好的入门秘籍。针对这一问题,我给大家普及下。编程语言要怎么选。
我发现很多学计算机和编程的人其实不懂编程,其实编程没有你们想象的这么深奥,编程的基础其实是计算模型(这个我们以后会将,如图灵机、递归论、Lambda演算等)当然还有细胞自动机。。。 如果你不懂计算模型其实你是学不懂编程的。因为编程依赖计算模型。而且编程和编程过程又是两个截然不同的东西。编程体现的是一个概念而编程的过程体现的是一个动态的寻找解的过程。
编程的过程其实也是思维活动的基本过程,所以编程活动本身要训练的其实是人的思维过程。它会间接影响一个人的思维模式。所以学编程最终的目的:一个是学会编程的技能(这个是大多数人学编程的目的)但是最重要的其实是学会用一种新的思维方式(分析问题、解决问题的能力)。人类改造自然的基本过程也是人类文明发展的必然结果,而人类改造自然的基本过程是建立在人类这个种族利用已有的知识结构对现实世界进行建模并且用人脑特有的计算模型去推演最终执行反馈到现实世界从而改造自然创造出人类璀璨的文明形态。这个和编程的过程是不谋而合的。
我通过分享一个例子来给大家解释下前面这些话的意思:
冒泡排序(Bubble Sort):作为计算机算法里面最简单的排序算法(该算法的时间复杂度是O(n²)属于稳定排序算法)
这个算法的描述:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
原理如下:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
这个算法涉及到两个基本过程(遍历其实也可以叫递归、条件)
我们先用人类的语言来编程
如何把一个队伍按照从低到高排列(你要按照高到低也是可以的)?
1、比较相邻的两个人之间的身高,如果后面一个比较矮就让他们交换位置。
2、对整个队伍里面的每个相邻的人都做同样的操作。从开始第一对到最后一对,这个步骤执行完毕,队伍的最后一个肯定是最高的(但是整个队伍现在还没有按照从低到高的顺序排列,想一想为什么?)
3、对队伍里面的每一个人都做上面1、2步所做的操作,除了最后一个。
4、持续对越来越少的队伍重复上面的步骤,直到队伍里面所有的人都比较过了。
然后你就得到了一个从低到高排列的队伍,时间最短而且不需要一个人站出来指挥排队的过程。
其实这个问题你不用学任何算法也不用懂任何排序你都可以做到,区别就是如果你学过编程那你会找到最快的方式做到这一点。
接下来我们展示一下其它语言是如何做到的
Python3
C
汇编
Scratch(少儿编程图形化编程)
这几种编程语言的实现版本都用到了一种数据抽象:列表(一队人)还有两个基本过程:条件、循环(遍历)无论你使用哪种语言来实现,最终你都需要借助这三个概念。也就是说你要学会的其实是学会对问题建模,把执行这个问题的步骤编写成算法,算法其实就是你思考的过程。学会编程可以帮助你用最低的成本去验证结果,仅此而已。但是最终的目的还是要把这种思考问题、解决问题的方式变成自己的思维活动的基本过程,而不是漫无目的、误打误撞。虽然不会编程也可以解决这个问题,但是编程要教会你的就是用最高效的方式解决。如果你每一件事情都用最高效的方式解决,那你和别人的差距就会产生质的变化。
当然还有其它的语言实现,编程语言千千万万。但是万变不离其宗。
举这个例子其实就是想告诉大家,你选择用什么编程语言其实本质是一样的,不同语言背后的语法、语义不同。但是他们所教会你的思考问题的方式是通用的。所以学编程的最高境界其实是通过编程学会了解决一类问题的方式当然是用最高效的方式。也就是编程教会你用新的方式去思考问题、解决问题。
讲到这对一些还在纠结学什么编程语言的人相信应该有一些启发。当然作为编程语言的选择还要考量的还有团队的因素、团队运作成本、培训成本、以及所涉及的业务领域和业务模型、对已有库的依赖等等很多因素,这些已经不是编程的内容了这些已经属于软件工程的的范畴了(那些技术总监、系统架构师、项目经理、产品经理、老板所要考虑的内容了)。
但是对于我们少儿编程来说有什么借鉴意义呢。
我个人认为可以从以下几点来考虑
首先少儿编程是一个新的领域,毕竟一开始所有人都觉得编程是大人的权利,或者准确的说应该是那些软件公司上班的工程师的事情,但是随着人工智能的发展很多人意识到编程的重要性,而且希望孩子也从小就接触到编程。所以才催生了少儿编程。
但是因为少儿编程不需要像培养一个软件工程师一样有这么多标准要遵循也不够系统化,至少现在市面上的少儿编程产品是这种情形,所以就出现了很多称之为编程的机器人,诚然机器人也会涉及到一些编程的内容,但是在我看来更像是高级玩具。它是编程的局部应用并不能系统的告诉你编程是怎么一回事所以很多学了机器人的人以为就是少儿编程到最后其实学会的只是说明书的内容而已,很多人就会问那这样为什么还是有那么多人买单呢。这就涉及到一个很微妙的点了。因为很多人其实想要的就是接触下高科技的东西而已并不是真正想学少儿编程,对于这部分人群来说那些机器人是很好的一个产品,当然仅仅是”高级玩具“因为他们足够吸引小孩子。
当然除了机器人剩下的就是那些主打游戏编程之类的编程产品,其实道理一样。通过很好玩的方式去吸引小孩子,这个出发点是非常棒的,但是有一个问题。缺乏后续,而且是为了编程而教编程。并不是通过编程这个过程教会孩子一种新的思维方式。
所以现在市面上的少儿编程产品其实仍然处于早期阶段,同质化严重、缺乏系统性(课程体系不完善、有些甚至没有课程体系,或者直接把成人工程师的那一套照抄过来)、缺乏实践意义、师资不完善、缺乏行业标准和考核规范。到最后都变成了卖高级玩具(带着编程样子的说明书)、玩加盟模式、赚快钱。当然话说回来,也不乏有些优秀的项目和产品。所以就需要家长们擦亮你们的双眼。
其实编程不神秘,学习编程是因为我们进入了一个新的时代,物联网、人工智能高速发展的阶段。当然也对我们每个人的能力提出了新的要求,学习编程说训练的编程思维其实就是其中最关键也是最基础的一种新时代下的技能。所以不应该是浅尝辄止、也不是玩玩就好、更不是最后演变成各种比赛、竞赛。而是要系统性学习编程,并且学习到编程的真正精髓也就是编程思维-新的思维方式。
最后我想说,编程本身是和编程语言没有任何关系的。我们不需要编程语言其实也是可以进行编程的。因为编程的本质其实是如何利用计算模型对特定领域问题进行建模并且利用计算模型去演算得出最优解的过程。在理解了计算模型(例如图灵、Lambda、递归、细胞自动机等)之后编程并不神秘,当然这属于理论编程的范畴。对于大多数人而言他们所接触的编程更多是工程实践目的为出发点的编程,因为会带有特定问题领域的库以及框架。因为他们是为了解决工程问题而创建出来的。它的本质已经不是编程的范畴了而是软件工程的范畴。因此对于想学编程的人来说还是要区分清楚,你是打算靠编程混饭吃还是想通过学习编程思维来优化自己的思维方式。这是有本质的区别的。如果你的出发点和目的是前者的话,那你就挑一门混口饭吃的热门的流行的工资高的语言然后熟悉一下库和框架,通过项目实践在实践中学习。如果你的目的是后者的话,那还是学本质的东西吧,也就是真正的内功心法。现在比较火的少儿编程,我认为应该侧重编程思维的建立,也就是通过编程这个过程训练如何在有限的资源条件下,学会充分分析问题,提出解决方案,最终执行解决方案,不断验证修正解决方案的能力。毕竟他们以后不是所有人都要当软件工程师。他们这个年纪应该学习的是那些能影响他们一生的特质和品格。
学编程可以教会你
1、除非你改正了错误,否则永远不会得到正确的结果。因为算法是错的,世界就不会对。
2、代码要么是对的要么是错的,永远不会半对半错。差不多这一套,永远行不通!
3、越早纠正错误,代价越低,错误永远不会消失,请不要带着侥幸的心态。
4、逻辑需要界限,否则就无法区分0跟1。没有底线,就没有秩序。
5、Debug的过程会告诉你,犯错的代价有多大,你应该避免犯错 。所以孩子会变得越来越严谨。不仅是学习上,还包括生活的点点滴滴。
6、在几百万行代码里面找到一个错误会让你的脑袋具备处理最复杂事务的能力。
7、唯一不变的就是变化本身。算法的推演进程就是结果本身。所以你必须学会适应变化。
8、数据也是算法。
每一个人都应该学习编程,你不一定非要成为什么,而是它能教会你用新的方式思考。它所带给你的远不止是编程本身,而是那些影响你一生的特质 !
转载请注明出处,谢谢。百度搜索了一下很多转载的...
原文链接:阅读原文
备注:对少儿编程感兴趣的可以交流