从没做过嵌入式的我,24小时内搞出了这个……
起因很简单,想给满月的女儿做个小礼物,又正好在一个群聊发现了一款30块包邮的RISC-V开发板。知道自己不会嵌入式,但也就一顿饭钱,买不了吃亏买不了上当,为什么不试一下呢?于是果断下单。
24小时之后,就有了这个小玩意。
2020年是动荡的一年,经历了疫情、大选等各种匪夷所思的事件。整个世界或左转或右转,似乎都愈发走向分裂与极端。我的女儿生于这样一个时代,不知是福是祸。所以,我选了既像是左转又像是右转的旋转舞者视错觉动画,做成这样一个小礼物,取名“Dance with the collapsing world”,送给我女儿,希望无论世界怎样变幻,她都能有所持守,健康、乐观、幸福。
不过,如果你感兴趣的是制作细节,也想用开发板DIY点什么东西,可以参考我在知乎的文章《Dance with the collapsing world —— RISC-V开发板折腾手记》。本文不讲技术,主要想借着我做这个礼物的经历,谈谈杜威老爷子百余年前提出的“Learn By Doing“学习法——最近几年,它有了一个更为酷炫的名字,PBL(Project Based Learning),也就是创新教育界风头正劲的项目制学习。
PBL
Project based learning,顾名思义,就是通过项目学习。听起来似乎稀松平常,但这个短语的潜台词却是颠覆性的:不再通过课堂讲授学习。
“什么?!不授课?开玩笑呢吧?从小学到大学,不管什么课(甚至包括部分美术音乐),我们不都是老师先在教室里对着课本或者PPT讲知识,然后大家做练习、写卷子、完成任务吗?”
你描述得很对,这种教学法叫作被动接受(Learn by passive receiving),或曰听讲学习(Learn by listening)。当然,在国内应试教育大背景的加持之下,它还有个更响亮的名字——填鸭式教学。

图丨填鸭式教学
被动接受当然是有效果的,你我当年就是这么学出来的。但问题是它最早源自于18世纪的普鲁士教育体系,其初衷乃是打压独立思考精神,培养温顺忠诚的国民。这种教育把大量学生塑造成了听话、“优秀”的工人和士兵,在当时的社会条件下还是有一定意义的。可是二十一世纪的今天,知识飞速迭代,社会日新月异,我们需要的是有洞察能力、反思精神的人才,被动接受教学法已经不能很好地满足时代的需求了。
也正是在这样的背景下,PBL被推到了前台。
扯远了。光整虚的没用,下面就通过这次给我女儿制作的小礼物,介绍一下我是怎么用PBL学习法学嵌入式开发的。
真实性·主动性
PBL的一大特色,就是不搞虚头巴脑的题目,直接上真实项目。做题是为了掌握知识点,完成了项目一样能学会对应的知识技术;然而,埋头题海刷完形填空、数学证明,我们很容易失去意义感;做项目就不一样了,回应现实世界的需求,亲眼看着问题得到解决,会形成巨大的激励,让人始终保持高昂的情绪,想要完成项目。
以我这次的礼物为例,我的目的是正确理解RGB565、做出一道颜色编码的题目吗?不是。是要掌握Python的PIL图像库、从而通过相关考试吗?也不是。我的动机非常纯粹——我要给我女儿做个礼物,period。
然而,虽然目标只有一个,做项目的时候我却可以说是兵来将挡、水来土掩,神挡杀神、佛挡杀佛。需要懂得16bit色彩格式,咱二话不说开始谷歌;需要用PIL对gif动画进行预处理,我比着Stackoverflow的程序搞到夜里两点半。到最后,不仅礼物做出来了,RGB565和PIL我也顺带着都掌握了,精通谈不上,但是把每一步讲给你讲清楚绝对不成问题。

图丨用PIL把gif处理成数组
为什么我有如此强的执行力?因为我要做的是真实的项目——一个送给我女儿的礼物。它不是冷冷地印在纸上孤芳自赏的题目,而是热烈地和现实世界(我的女儿)发生着联系。我会情不自禁地赋予它意义,渴望完成它。于是,我看书、查资料、泡论坛、搜视频、咨询(不止一家)淘宝卖家,真是的动用了所有可以动用的手段学习开发板编程技术。这一切没有人催我逼我,全部是我主动、心甘情愿的。
这就是PBL的力量。没有习题试卷,却可以激发出学习者强大的主动性,让你直面挑战、探索未知、解决问题,并享受战胜困难之后的巨大成就感。在这个过程中,你不仅在进行着有的放矢、充满意义的努力,掌握了对应技术并学以致用,更在不知不觉中锻炼了自己信息检索、自主学习、解决问题的能力。从长远的人生来看,这些其实是更为重要的素养。
现在,再回过头去看看听讲、做题、考满分的快感。两相比较,究竟那种学习方式更有价值呢?
模仿·捣鼓·学习
有些人可能会有疑问:完成项目需要先掌握技术,但如果PBL里没有老师的课堂讲授,我从哪学会必要的技术去完成项目呢?
我做礼物的时候,也遇到了同样的问题:瞄一眼代码,又是DFU又是JTAG又是SPI的,都是些什么鬼词?不把这些给先学懂了,礼物怎么可能做得出来?
然而,等到我把礼物做出来了才知道,原来这些高大上的术语,跟能不能完成我的项目几乎一点关系都没有。比如我已经通过DFU技术烧录过几十次固件了,都还没记住DFU究竟是什么意思。而擅长SPI通信的嵌入式达人,也未必就能做出来我的礼物,他们对于图像不专业啊。
如果这些都不是关键,那么到底该怎样突破技术难点,完成项目呢?
答案是两个词:模仿(Learn by example),捣鼓(Learn by tinkering)。
我拿到开发板之后,第一件事就是比着官方教程跑了一下范例程序。这是一个控制指示灯闪烁的程序,我一行代码都没改,完完全全按照教程来的。跑完之后,我已经学会了编译程序、DFU固件烧录等重要操作。虽然我不懂RISC-V的工具链,也不了解DFU的工作原理,但对于做礼物的目标而言,我已经成功地跨过了工具链、DFU的坎儿。与此同时,我也对这些不懂的技术做了标注,等到项目做完了,可以专门回过头来再学它们。
指示灯闪烁的范例程序
跑完了指示灯闪烁的范例程序,我又开始看播放Bad Apple视频的范例程序。这个对我想做的旋转舞者动画有更高的参考价值,毕竟动画和视频本质上是一样的,只不过更轻量级一些。
范例程序需要一张SD卡,把Bad Apple视频截图成一张张图片存进去。我没有卡,没法重现范例程序的效果,那就先把SD卡有关的代码拿掉,看能不能运行。小心翼翼地删掉分支、变量,调整头文件,最后把整个SD卡代码的整个文件夹都删掉。编译运行,Yeah!没问题!
现在屏幕压根不显示东西了,因为Bad Apple本应保存在SD卡里,没卡自然没视频。但是不妨碍我尝试阅读和分析范例代码呀。结合着官网教程、注释文档,很快就猜到了个大概:图片存在一个大数组里,每个元素精确对应到屏幕上的一个像素,一一映射地设置颜色就行了。
晕,这么简单!惊不惊喜?意不意外?
为了确认自己的理解是正确的,我试着把数组的一半元素调成白色,另一半调成纯黑。编译运行。
黑白闪烁
那下一步就是把黑白色块动画升级成我的旋转舞者了。方法也一样:读一读代码,做一点猜测,试一些修改,看一下效果。经过不懈的努力,我的作品终于顺利完成了。
我把PBL里的这种学习方式叫作捣鼓(Learn by tinkering)。不懂不要紧,可以结合着例子试嘛:这敲敲那打打;拧掉一个螺丝看看效果,然后再上紧恢复原状;涂点这种胶,再涂点那种胶,对比一下差别……对应到嵌入式开发,就是增删两行代码,调整几个颜色,设置几处延迟,等等。反复把玩捣鼓,日拱一卒,学会就是水到渠成的事了。
当然,跟被动吸收相比,捣鼓的学习进度看起来常常会慢一些。毕竟照本宣科的话,老师真要愿意,三下五除二就能把知识点给你灌完,至于能不能消化得了,就要看不同人的造化了。捣鼓学习则不同,由于是亲手反复尝试的结果,积累了大量的实战经验甚至失败教训,等到灵光乍现突破的那一刻,往往是豁然开朗、茅塞顿开,对知识和技术有了更深刻的理解,可以达到举一反三的效果。所以,一个讲究速度,一个讲究质量,孰优孰劣,就要看各自的理解了。
以导师代老师
当然,如果项目太过复杂,只靠模仿和敲打来完成项目是很困难的。我比较幸运,自己多多少少有点编程基础,所以做礼物的过程中虽然有各种挑战,但经过查资料学习基本都克服了,还给自己带来很大的成就感。但可以想象,对于一个完全不懂编程的人而言,24小时之内完成类似的嵌入式项目无异于登天。这个时候,就要靠PBL的另一大要素来发挥作用了——导师。
“什么?PBL不是不通过课堂授课来学习吗?怎么又有了导师呢?”
是的,PBL没有老师(或者更确切的说,没有讲师),但有的是比老师更重要的角色——导师。虽仅一字之差,却有万里之别。
导师的首要任务,就是设计项目的脚手架——比如供人模仿和捣鼓的例子、尽可能平缓的学习曲线,等等。这要求导师对学生的认知规律、项目涉及的核心知识都必须有非常深刻的理解,知道如何深入浅出地安排项目,既不至于太难、使学生做不出来失落沮丧,也不至于太简单、学生轻而易举完成没有成就感。
除了核心知识之外,导师还有必要对外延的相关知识有所了解。以这个嵌入式的项目为例,万一有的学生不仅想做视频,还想加上音乐怎么办?导师必须要提前有所准备。所以,在PBL的教学设计阶段,导师往往会提前演练项目推进的各种可能性,这样才能做到在“课堂”上(我暂时借用了“课堂”一词,指学生做项目的阶段)信手拈来,平和应对各种突发情况。

图丨导师是帮助而非驱动学习
最后,导师还要学会走下讲台,以一种新的身份跟学生互动——观察学生的状态,因材施教地介入学习过程。有的人遇到困难浅尝辄止,灰心失望,导师就有必要进行鼓励和安慰;有的人不加尝试便向导师求助,不妨向他介绍些书籍、论坛资料,让自主学习落地生根;项目终于完成了,庆祝之余,更应当带领大家进行反思、升华,把技术与知识理解透彻;有时还会有人觉得自己基础薄弱,主动申请加课,那么导师完全可以拿出PPT,讲解背景知识。注意到了吗,最后一种情形,已经和传统的讲师已经差不多了。
也就是说,PBL完全不排斥授课,只是这种授课应当是由学生提出的,导师只是在回应学生的需求而已。因为在PBL里,舞台是学生的,他们以项目为核心,驱动和主导着学习进程;导师藏在幕后,只在必要的时候抛头露面,以各种方式服务学生的学习。
不难发现,PBL虽然名义上不依赖老师授课,但实际上对老师的要求远远超过授课——专业知识,同理心,观察力,判断力,沟通能力……一样都不能少。无怪乎许多传统课堂的老师初次接触PBL的时候,都会感到不适,难以驾驭了。
Adalab
以上就是我对PBL的一次实践。不过,我对PBL的期许远不止此。事实上,我正在尝试把PBL推广到IT培训界,这就是我跟大熊一起创办的非营利性IT培训机构Adalab。我们希望以创新的方式改变行业的生态沉疴,培养具有自主学习能力、真正能立足于未来的程序员,所以我们——
PBL:纯项目制,只有导师带领,没有老师讲课
ISA:无押金,不贷款,免费学;工作后才按薪资比例付款
优质师资:帝国理工学院、牛津大学、北京大学导师全程亲自带领
坚守诚信:我们绝不造假,也请你抵制简历“包装”,对自己负责

图丨Adalab,面向未来的IT培训
我们知道,在PBL理念尚未普及的情况下,贸然选择号称“没有老师”的教学法,一定会在市场宣传上吃亏——更何况我们还命令禁止学员简历造假。然而,我们依然决定听从内心的呼召,坚持hard模式,去探索一个符合真正自己理想的教育模式。
换个角度看,这对我们而言又何尝不是一次更大型的PBL?我们要挑战的是一个真实的创业项目,一样只能一边主动阅读各种资料、一边模仿前人的经验、一边自己探索捣鼓。或成或败,只能交给命运。惟愿在这个过程中,我们可以学会如何与这个商业社会、以及自己的教育理想共处,也就不负这番PBL之旅。
May the force be with us.
