如何学编程、如何教编程

我们从怎样算学会编程(学习的目标)编程哪些知识是必学的(学习的框架)学习编程的最优顺序(学习的路径) 等三个方面的阐述。

怎样算学会编程

学习的目标是能学以致用,能自我持续学习并解决问题。

学以致用:

就图形化编程来说就是能实现自己的想法, 特别是能做出几个和原始想法一致的作品。 相对来说图形化编程只要掌握基本的编程技巧,实现自己的想法还是相对简单的。

对于python编程来说,稍微难一点的,主要体现在环境配置、新功能验证和代码调试上,需要比图形化多花点时间,

如果用图形化编程基本能实现自己的想法,那么通过学习使用python实现自己的想法是没有问题的,而且自由度更大。

能自我持续学习并解决问题:

学以致用、实现自己的想法肯定离不开持续学习并解决问题的过程;正所谓知易行难,从知道到运用, 中间有很多或深或浅的坑;

在掌握基础编程能力的基础上,用图形化编程想实现想法,只需学习功能模块的使用方法,在学习参考案例的基础上, 通过编程将功能模块运用出来即可。

Python持续学习分四个部分:

  1. 需要时能从python中文官网查询需要的python语法。
  2. 学会搜索,学会参考,能从网上找到常用案例
  3. 从创意中分离出关键字,通过关键字能找到合适的python库
  4. 由于python的库都是开源的,当库有不满意的地方,可以稍做更改

大多数人只需要掌握1、2、3就可以了,在此基础上运用编程技巧组合实现各种创意就能实现学以致用,运用自如。

编程哪些知识是必学的

编程的概念:

理解编程能做哪些事情, 具体是通过哪些步骤、怎样的逻辑组合完成任务。

基本的编程结构——顺序、循环(重复)、分支

理解程序执行的过程和大脑指挥手与物理世界互动的过程是一样的,动作有先后,循序一个一个来,很多事情都是重复的, 当环境或爸妈的要求不一致时会有不同的选择。比如:控制灯的亮灭, 开灯和关灯要按顺序依次来, 开和关之间会有间隔时间。觉得开关灯好玩,重复这个动作就会一闪一闪,爸爸说不要玩了,刺眼睛。 如果灯已开,停下来,灯就处于开的状态,如果灯已关,停下来出来关的状态。但是爸爸希望开着灯, 所以会涉及选择,会有不同的分支。

编程的组合运用——变量、函数、字符串及列表操作

理解程序是周期的运行由顺序、循环、分支组成一段有生命周期的代码,通过变量、函数、字符串及列表的操作, 可以简化程序,提高程序的可读性和复用性。在读得懂的基础上通过简单的方法运用编程的基本结构组合已有功能, 比较容易达成需要的功能。

并发、异步和同步——多线程

理解程序运行和现实世界一样, 一只手开关灯是顺序操作的,一只手拿着筷子吃饭也是顺序的。 但是一只手拿着筷子夹菜的时候,另一手可以拿着汤勺舀汤。同时即夹菜又舀汤这是并发;同时喂给爸妈吃叫异步, 因为不管吃的快慢都不会相互影响;都自己吃叫同步,只有一张嘴,一样一样来,要么先喝汤,要么先吃菜, 一口吃完才来进行下一步。

编程和处理现实世界的业务一样,虽然每个步骤都是顺序执行的,但是会涉及并发、异步、同步的操作。 运用多线程进行编程不仅容易和现实流程对照理清思路,还能实现实时响应的功能。

功能抽像和分解——函数、类、线程和流程图等

任何功能都可以通过合理分解,将其分解为若干个小问题,最后可以用基本的编程结构加以解决。 就比如查找一个地址,我们从省、市、区/县、街道、小区/村等从大到小就容易定位。

合理利用功能抽像和分解,就是在理解编程基础运用的基础上,通过对现实世界的理解,进行合理分工。

临界值和异常处理——程序稳定运行的保护神

比如我们在房间里一步一步直走,肯定会碰到墙壁,程序处理也是一样,碰到墙壁前重复执行一步行走, 碰到墙壁(临界值)时,需要根据实际情况做选择,执行转弯或掉头等动作。 另外说不定地板上有玩具,直走时候可能被正在玩耍的小弟弟给撞到等异常情况。

写程序时需要考虑异常情况,哪怕不知道什么异常,也要给个默认处理,要不然碰到异常可能会出现不可预知的结果。

调试和bug定位——求人不如求己

程序运行结果不符合预期,或者根本运行不起来,大部分情况下,可以通过调试和bug定位来解决。 即使找人帮忙,也要先说清楚软硬件环境、程序是否已经运行、运行过程中有什么具体反馈,怀疑哪里有问题等信息。

就如同家里漏水了,想找人来帮忙,首先要描述是哪个房间漏水,是天花板有水,还是地上有水。 如果是地上有水,旁边有没有水管或者水龙头,也有可能是水龙头没关紧导致水池水满出来这样很明显的问题。

调试和bug定位就是发现问题,分析问题的过程。由于程序每个模块都可以分解成基础的小模块, 定位出问题后修改这个小模块还是很简单的。

特定编程语言的基础语法——编程的核心思想不变,具体写法需要参考

所有的编程语言都有顺序、循环、分支、函数、变量等基本要素,不同的语言格式或者写法上不太一样。 比如变量的定义,python要求就比较宽泛,不需要指定数据类型,C语言则要求严格,需要指定类型。 再比如程序格式方面,python使用缩进来控制类、函数及其他逻辑判断, C语言则使用大括号{}来进行同样的控制。

对于一些常用的要求,能记住当然最好。记不住也问题不大,可以参考代码或者查找帮助文档。 最重要的是理解有这么一回事。

常见的编程结构和用法——站在巨人的肩膀上

写程序按自己的思路写,只要能实现功能怎么写都可以。但是如果我们能参考常见的编程结构和用法, 既可以快速实现功能,还可以避免很多潜在的bug,拓展性也会好很多。再复杂的程序,都是由常见的结构和用法组合而成的。

比如 周期循环、条件触发消抖、软件开关、时间差作为触发条件、合理的变量和函数命名、独立功能分离、业务交互分离、实时响应的功能、基本数据结构等。

编程练习和学以致用运用的环境——知行合一的保障

编程学习和传统学科学习最大的区别是,编程可以很方便的融合创意、知识、物理器件等,将学习的知识具象的落地。 正所谓实践是检验真理的唯一标准,编程非常适合边学边实践,通过实践反馈,验证和对照我们对理论理解的深度, 做到知行合一。知行合一根据掌握知识的多少,可小知小行,也可大知大行。

正所谓知易行难,所以需要有反复练习和运用所学知识的环境。最主要的是能将学到的知识结合自己的创意在实际中运用出来,知识才能得到巩固和升华,慢慢达到知行合一的境界。

所以编程学习有练习和将想法实际运用落地的环境非常重要。

自我持续学习能力——授人以鱼不如授人以渔

学习编程并不是为了解决1+1=2等已解决的问题,而是为了洞悉未来的机会,或者解决未来未知的问题。 因此学了编程,具备持续学习和运用编程的能力非常重要。

学习编程的最优顺序

学习一般有两种路径:

A: 书山有路勤为径,学海无涯苦作舟 --- 知道编程很有用,但是学了不知道具体怎么用出来,所以一直学坚持学。 期待未来有一天能融会贯通,学以致用。

B: 会当凌绝顶,一览众山小 --- 快速掌握编程的基本结构用法,在实践理解编程能做什么事情的基础上, 通过完成奇思妙想建立以编程为主干、功能知识为枝杈的分析模式。当遇到新的功能知识时, 通过资料搜索、师友询问等方法找到解决方案。

比如先学C语言语法,再学数据结构这无疑是A路径。学了2年可能还不知道自己能运用编程解决什么实际的问题。 这是因为知识普遍是高度抽象的理论,不与具象的事务相结合起来,知识永远是晦涩的、朦胧的,知识点之间很难串联起来形成融会贯通。 就拿学管理的来说,即使工商硕士毕业也不一定真会管理团队,毕竟实际走上管理岗位的永远是少数,没有实践机会只能是纸上谈兵。

因此B路径肯定会比A路径受欢迎,比如B路径可以通过两三次课,就能通过编程的基本结构(顺序、循环、分支)实现手势挥动控制灯开关、实现个性的灯光秀等。 编程理论实践结合是非常紧密的,不仅仅可以通过抽象的理论来指导编程实践,还可以通过具象的案例来理解抽象的理论,更可以运用新知识点结合旧知识点完成奇思妙想,使学得以致用,积小学小用到大学大用。

我们以B路径为例,重点分析如何从基本语法——>学以致用——>能自我持续学习并解决问题

学以致用就是当自己有个想法时能做出了,做个原型验证可能性也可以。

我们以学以致用为目的反向来分析哪些是编程能力的核心框架。

序号 模块名称 模块子项 解释说明
1 编程概念 编程能做什么 树立目标,培养兴趣
编程是简单的 建立信心,克服学新知识的恐惧和惰性
2 基础结构
顺序、循环、分支 了解程序组合的基本方式
具象案例帮助理解抽象理论 通过案例理解编程就是把现实的步骤按顺序组合
个性创意抽象理论指导具象实现 编程组合实现个性创意,享受思维连接现实世界的成就感,激发学习编程的兴趣和热情
3 编程组合基础知识
变量、函数字符串及列表等操作 了解简化代码的常用工具
具象案例帮助理解抽象理论 过案例理解编程化繁为简的技巧
个性创意抽象理论指导具象实现 个性的运用会碰到一个又一个未掌握的细节,填补这些坑后将知识串联起来,融会贯通,知识转化为能力
4 功能抽像和分解
函数、变量、列表、需求分析 大问题分解成小问题的方法
流程图 借助工具,可将抽象的想法具象化,帮助分析和调整
具象案例帮助理解抽象理论 通过案例建立分析问题、分解问题的思维
个性创意抽象理论指导具象实现 实践运用克服遇到问题的恐惧,建立任何问题都能分解成小问题并加以解决的信心
5 临界值和异常处理
基本概念 现实中任何事情都有边界和意外情况,编程也是如此。
具象案例帮助理解抽象理论 通过案例感受需要考虑临界值和异常的重要性
个性创意抽象理论指导具象实现 个性创意验证原来程序不听话是自己考虑不全面,异常的情况太多。逐步建立考虑更全面,遇到问题相信能解决的信心。
6 并发、异步和同步
多线程基本概念 多线程常见用法,业务和交互分离实现实时响应。
变量和函数的组合运用 多线程对编程组合运用的又一次提升,特别是不同线程将通过变量控制程序状态和分支的选择。
具象案例帮助理解抽象理论 通过案例展示多线程可以组合任何功能进行实时互动,受物理条件限制除外
个性创意抽象理论指导具象实现 通过实践将编程各类组合知识融会贯通,建立能只要理论可行就能用编程实现想象的功能的信心。
7 常见的编程结构和用法
了解编程经常用到的基础结构 了解编程常用的结构,实际编程中遇到类似问题时能有思路大概用那种结构处理会比较方便;比如 周期循环、条件触发消抖、软件开关、时间差作为触发条件、合理的变量和函数命名、独立功能分离、业务交互分离、实时响应的功能、基本数据结构等
实现功能前或者实现过程中觉得有困难可以参考借鉴 初期自己写程序都是比较困难的,参考类似用法结构能快速的完成功能验证。
8 学以致用
建立通过编程解决问题的自信和视野 在有多个成功经验的基础上有通过编程解决问题的信心
通过分析分解出哪些是与基础语法、编程能力和典型结构相关的,哪些和具体功能应用相关的
对于未用过的功能可以找到参考资料或者有线索应该到哪里找参考资料
能按需找到新功能模块并进行最小功能验证 当初次使用某个功能或某个结构时,先以最少的代码调试验证该功能的使用方法以及输入输出和自己的理解是否一致。 而不是直接加到主程序,遇到和设想不一样时还在主程序里调试,这种做法既浪费精力,也往往很难解决问题。
拥有通过编程将解决思路落地的能力 编程组合
问题定位
9 拓展新编程语言:在建立编程方法论,能学以致用的基础上,以学习python为例子。
10 python编程语言的基础语法
基础结构 顺序、循环、分支
具象案例帮助理解抽象理论
个性创意抽象理论指导具象实现
编程组合基础知识 变量、函数字符串及列表等操作
具象案例帮助理解抽象理论
个性创意抽象理论指导具象实现
11 能自我持续学习
在掌握编程方法论的基础上找到基础语法和功能的参考资料 比如基础语法都可以在python中文网找到
把我能背出来并编出程序变成我知道应该怎么编程序,如果不知道具体的写法我知道可以在哪里找到参考,比如python官网查到案例
我想到一个功能,自己写程序大概两天能完成。但是我可以先网上搜索看看是不是已经有人实现并分享了 比如我想写一个人脸识别的程序,比如在百度搜索“python 人脸识别”就会有非常的案例。 如果想用树莓派的案例,就可以搜索“树莓派python 人脸识别”。 站在巨人的肩膀上,能快速的实现各种创意。关键我们要拥有需要知道什么内容的能力。 并拥有鉴别内容,看懂新知识,运用新知识的能力。
开源的python库非常接近自己的需求,但是还差一点,根据对背景知识理解,修改开源库 程序具体功能模块的实现,本质上都用的是编程的基本语法和结构。该功能模块和其他功能模块最本质的区别是该功能的背景知识。
12 学以致用
将编程的能力迁移为python的编程能力 相关语法和功能python官网有具体案例,用到时通过参考可完成所想
python编程组合运用的常用结构和案例,在运用开源python库的同时,能借鉴开源python库中常用和经典的用法。
图形化和python混合编程实现创意,逐步将python运用自如 纯字母代码编程,出现字母写错,语法写错等小错误会多一些,需要更强的调试能力,可通过图形化和python混合编程实现创意逐步完成过度。
迁移第8步到python编程上 学以致用的编程能力,总结起来有以下几个方面:
a. 有经验、自信能解决问题;
b. 有分析问题,分解问题的能力;
c. 有组合运用编程的能力;
d. 有调试程序,定位问题的能力;
e. 有查找编程语法、编程基本结构用法的能力;
f. 有提取功能关键字,查找功能开源资料的能;
g. 有学习功能背景知识并把背景知识用程序将功能实现的能力。

是g能实现具体的功能么?

具体功能有千千万、未知的需求有万万千,具体的功能是不可提前自己准备好的,也不可能有能力和精力每个功能都自己实现。比如点亮小灯是一个功能、让电风扇转也是一个功能、对数据排序还是一个功能。Python中排序可以用sort方法,也可以自己写冒泡排序、二叉树排序, 如果觉得性能不够快还可以通过GPU并行计算解决。 但是基本上用python提供的方法就满足需求的,因为现在的硬件性能很高,python提供的方法已经满足大多数的需求了。

e和f找资料的能力是编程的核心能力框架么?

能查找资料确实是很重要的能力,但是能查找资料首先要知道要查什么,然后找到资料还能看的懂,用的上。知道要查什么就是会当凌绝顶,一览众山小中的众山,每次需要查找的内容其实都很小,是依附在核心框架上的重要组成部分。

d有调试程序,定位问题的能力是编程的核心能力框架么?

这肯定是编程的核心能力, 很多学了编程的朋友,在实际遇到问题时,最常见的是出问题了怎么办,这个设备有问题。
应该是需要从实际出发,先判断程序是否已经开始运行,程序运行到中间有没有问题,程序能不能顺利结束, 我们需要的功能有没有被执行了,执行后具体什么表现,大概会是什么问题。
即使问问题,也要在基本分析后描述想象,分析过程和分析结果,这样别人才便于回答。 当然大多数小问题,在这个分析的过程自己已经能找到问题所在了。

c 有组合运用编程的能力是编程的核心能力框架么?

这肯定是编程的核心能力,编程的本质就是通过顺序、循环、分支的组合运用,使程序按我们的设想顺序执行。 变量、函数、列表等是为了帮助我们将复杂事务拆分或封装成简单清晰的模块便于组合运用的。 多线程主要作用是简化业务之间的逻辑,实现实时响应的,本质就是用顺序、循环、分支的组合排序。 因此,组合运用能力是编程能力核心中的核心。

b分析问题,分解问题的能力是编程的核心能力框架么?

这肯定是编程的核心能力,只有通过分析才能知道从哪里入手比较方便,只有通过分解才能把大问题分解成诺干个小问题, 每个小问题可以是一个函数, 这样就便于组合运用了。

a 有经验并自信能解决问题是编程的核心能力框架么?

这肯定是编程的核心能力,编程实现是将想法变成现实的过程,实际的落地肯定不会一帆风顺. 就比如很多人怕吃鱼,就是因为被鱼刺卡到过,想想就怕,放弃了。
编程也是如此,特别是纯代码编程,有时候一个字母写错了可能排除两三天才会找到问题。 所以相信计算机是死的,在我们理论框架里确认是没问题的情况下,编程结果和我们想的不一样,肯定是我们哪里错了, 要么是理论知识有问题,要么是写的代码有问题,肯定不会是设备的问题。即使是设备的问题,也要找到方法证明, 比如排除法,对比法等。 计算机一切事出必有因。
通过bcd的不断实践,积累经验和树立信心,就会发现编程其实很简单。

综上所述,编程的主要核心是b c d,而b和d都是辅助c组合运用的。组合运用听听好像非常简单,但是大多数学过编程的朋友却不能达到学以致用的境界,这是为什么呢?

最主要的原因有三个:

  • i、学编程是为了学编程而学编程,比如关注语法、背单词等,缺乏将所学知识加以运用和理解。
  • ii、缺乏实际运用的场景、环境、案例和想法等。
  • iii、缺乏实践的兴趣。

缺乏运用是不能将编程组合运用自如的主要原因, 就比如我们常用的汉字只有3500个左右,学了这些汉字我们就准确表达我们的意思, 写出优美的文章,能完成实验报告了吗?
知识从认识到能自由组织运用中间有巨大的鸿沟,但是从以上分析我们知道,学习编程最主要的是组合运用, 这个应该不难,而且编程的核心能力组合运用肯定是和具体语言无关的,因为具备编程核心能力后具体语言的语法和案例很容易通过e解决。 最主要是有学以致用的环境,通过小学小用拓展到大学大用,通过具象案例启发,个性创意实现,在实践中实现12345678步骤的螺旋式提升。

陈述总结:

因此编程学习的最佳路径是:

㈠ 通过实践提高编程组合运用的能力

㈡ 通过实践提高简化逻辑,运用辅助工具组合编程运用的能力

㈢ 提高调试程序,定位问题的能力

㈣ 提高自我持续学习并解决问题的能力

基于树莓派的图形化编程和python编程是非常适合培养编程的核心能力的。

图形化编程通过模块封装,将一个个独立的功能封装成一个个积木块,屏蔽了实现这些独立功能背后的复杂代码, 让人们专注于实现程序的业务逻辑和编程组合运用,而不被繁琐的细节所干扰。
这样,经过一些基础编程结构(顺序、循环、条件等)的学习和虚实对照的运用,很容易就可以实现自己的一些原来看起来很难实现的想法。 哇,原来编程也不是那么难哦~,学习编程的自信心逐渐就建立起来了。

简化程序逻辑,运用辅助工具组合编程从知识点上看起来都非常简单,但要融会贯通确是非常难的, 由于缺乏合适的进阶案例,很多人在基础还不扎实时并不能用编程完成自己的想法,所以导致简单的编程都会了, 难的也学不会这样退却的心里。基于树莓派图形化软硬结合的案例非常适合进阶的编程实践,每个案例都很简单, 加个/换个传感器和应用场景,案例的运用思路完全不一样,但是难度只增加一点点,由于案例贴近实际生活, 学以致用的感觉让人非常有成就感,慢慢在实践中夯实基础,在创新中融会贯通。

调试程序和定位问题的能力其实贯彻编程学习的整个过程,本质是分析问题的方法、思路,以及对解决问题的信心问题。 树莓派目前是最全的开源生态,我们遇到过的问题大家都遇到过,当我们怀疑是设备问题,怀疑是环境问题的时候, 最终大多都证明是自己分析问题的方法需要提高,最起码对怀疑的问题能列出自己都能信服的证据后才提问。 通过一次又一次的实践提高调试程序和定位问题的能力。

自我持续学习并解决问题的能力是编程学习形成滚雪球自循环的关键一步。

自我学习一般从以下几个方面体现:

① 基础语法和组合辅助工具的学习
此类基础知识,参考书籍或网络上都有大量现成参考资料。因此我们学习编程不是为了背代码、背规则, 而应该理解编程的基本原理,以及如何持续学习并解决问题的思路。
比如我们理解编程都必须要有循环和判断,当我们迁移到python时,只需要知道在哪里能copy到循环和判断的代码模板, 并有验证的环境。在此基础上,就可以把图形化编程的案例用python再实践一遍完成能力的迁移和提高。
理解原理,忘记代码细节和规则,有点像武术中无招胜有招的意思,现实中很多全栈工程师确实是这样。 由于会的语言太多,记是记不过来的,只要知道原理是怎样的,需要时能找到资料参考完成,反正自信能完成, 大不了花一点点时间查找参考下就足以。

② 新功能的学习和运用
用到新功能一般是有新的想法或新的要求,这时我们需要能找到可用的新功能案例、看懂新功能的说明、 能通过最小代码验证理解或辅助看懂说明、将新功能组合到我们主程序并验证符合需求。
其中最重要的是能找到可用的新功能案例,树莓派有最全的开源生态,大部分我们想实现的新功能都有参考的案例, 特别大多有python案例。对于python案例来说,只需要将功能包安装好,就可以像调用函数一样进行验证和应用了。

③ 背景知识的学习和运用 编程是为具体的业务功能服务的,所有的功能都会有背景知识。当找到新功能案例时,看懂新功能说明可能需要背景知识。 同样的查找新功能案例时可能需要背景知识的关键词作为查找的依据。编程运用新功能的代码,同样是运用背景知识过程, 当运用代码的效果和个人预期不一样时,需要查找学习背景知识。当然当对背景知识足够了解,而没有现成的代码案例时, 可以自己编写功能代码,通过具体实现来验证对该背景理论知识的理解是否一致。 这样编程可以和各科知识融合,实现融会贯通,同样的在编程的过程中需要不断学习背景知识才能实现具体的功能。 当万事俱备,就差一点点背景知识就能完成一个有趣的项目时,学习背景知识将会求知若渴; 这样自我持续学习并解决问题的雪球就开始滚起来了。


本文杭州古德微机器人有限公司版权所有,转载请注明出处。

Copyright © 古德微 2023 all right reserved,powered by GDWRobot本课修订时间: 2021-11-11

results matching ""

    No results matching ""