|
|
自从有人知道我是计算机专业的学生,就有无数人来问这样的问题:“编程怎么入门呀?“或者是”Python怎么自学呀?“其实我对此是大为不解的。就像我在几年前的文章里提过的那样,计算机入门可能是这个世界上最容易自学的内容,甚至没有之一。互联网的发展以及其内在开放的精神可以让任何人平等地找到几乎所有想要的入门教程。唯一需要的也许是一台能够上网的设备。不管是知乎上无数前辈整理的学习路径和推荐书目,还是B站或是Youtube上成堆成堆的免费教程,只有你没找到的,没有根本不存在的。
不仅如此,计算机学习的另一个门槛——编程前的配置环节也大大降低了。我始终记得小时候第一次在Visual Studio Code上使用C++的痛苦回忆。那时我花了一两个小时来配置环境,试图去搞明白每一个JSON文件的用处。而到了今天,入门者甚至不需要做这件事。一个有趣的例子是,我的室友是一个经济专业的学生,之前并没有任何编程的背景。当他在Coursera上自学Python时,我原本以为他会苦恼于如何配置Python本地编程环境。但是,Coursera自带的线上编辑器完美满足了他的需求。这意味着哪怕是用最便宜的Chrome OS笔记本(暂且不考虑Chrome OS的Linux虚拟机)都能满足最基本的需求。这毫无疑问是一个巨大的进步。也许对于计算机专业的学生来说,了解如何配置Python本地环境,乃至使用Anaconda之类包管理系统是必须的。但对于入门者而言是毫无必要的。
然而,如果几个月之后再来问那些尝试编程入门的朋友,他们大概率会告诉你:“编程太难了”,“逻辑没办法理解”,”我彻底放弃了“。除了人的惰性以外,是什么造成了这样的现象呢?编程入门有啥特殊之处呢?正巧,就在2022年秋季,我有机会成为学校Python入门课助教(Learning Assistant,LA)。于是乎,抱着追寻答案的想法(当然还有充实简历),我开始了我的助教生涯。
助教生涯的两场对话
首先,我需要做一个简短的介绍。在美国,尤其是公立大学,几乎所有课都是有助教的。毕竟你不能指望一个教授能批改两三百人的作业和考试。助教一般分为两类:一类是我们熟悉的TA(Teaching Assistant),一类则是LA(Learning Assistant,不同学校可能对此有着不同的称呼)。前者是由研究生或是博士生组成。如果上课的教授有自己的实验室,那其负责的课程往往由实验室里的博士生负责(也就是固定劳动力)。然而,TA繁忙的工作(所有作业、考试的批改乃至一些额外课程内容的补充)和相对较少的工资导致很多TA在学校所在的高物价区域很难维持正常生活。这也是UC去年大罢工的原因之一。LA则是由本科生组成。绝大部分的LA是没有工资的(我听说有些带实验的物理课会给一点,但不是很确定),有的只有学分。而与之相对的则是更少的工作。LA不负责考试批改以及其他与学生分数更相关的事情。以我所在的Python入门课为例,我们主要只负责如下三件事:批改课堂作业,监考以及线上固定时间答疑解惑(每周每人两小时)。当然,LA工作的多少完全取决于教授。因此情况仅供参考。
回归正题。我将以LA期间的两次对话来回答文章一开头的问题。
大概是在课程开始的第四周左右(课程一共十周),一位学生在线上向我咨询她在作业中遇到的一些问题。第四周的主要内容是IF语句。而作业的内容则是闰年判断。这似乎并不是一个很难的作业。只要学生了解闰年的条件并将其转换为对应的Python语句就行了。然而,那位学生以几乎哭泣的语调告诉我,她已经在这项作业上花费了超过三个小时。搞不定Python编程作业?接触过CS专业的同学都知道编程的痛苦,一遍遍写作、运行、修改以及通宵找bug加各种testing都是家常便饭。LunwenHelp平台集合世界名校最专业的Python编程导师团队,为你提供最专业的Python作业代写服务。
于是,我让她把代码发给我看。然而,奇怪的是,我在本机运行她的代码时也没发现任何错误。正当她感到绝望而不停上下滚动提交界面的网页时,我看见网页最下方的一行报错信息,那是来自于提交界面自带的线上编译器。当我让她把网页翻到最下面时,我看到了一行清楚的“IndentationError”。这是一个简单的格式错误。一般有两种原因:tab键和空格的混用或者是复制过程中的一些格式错乱。这位学生的情况显然属于后者。最终,当我让她在网页上直接调整每一个IF语句前面的空格后,这个问题便迎刃而解了。
其实,当我发觉这样的问题困扰她如此久时,心中其实是十分不解的。因此,我与她产生了如下的对话:
“你原来知道这下面会提示错误信息吗?“
“我不知道”
“那你之前是怎么知道作业到底有没有写对的呀?”
“Solution一栏下方会显示一行字,如果上面写‘You are corrected!’那就代表作业通过检测了“
“如果你的作业始终没有作对,并且没有LA有时间回答你的问题,那你是怎么改正代码的呢?”
“我会紧盯每一行代码,从中找到可能的错误,然后不停地点‘提交’按钮“ “那你哪怕尝试去看过最下面写的东西吗?“
“一开始看过,但是完全不懂它在说啥,也不知道它所说的和我的程序本身又有什么关系。所以之后的作业就没太在意过了“
“那你猜我是怎么都知道它在说什么的?“
“因为你是LA,有很多Python的编程经验,自然比我懂得多。”
在这一刻,我突然意识到,很多人编程无法入门的一个重要原因便是他们无法靠自己的力量来解决这些实际应用中所常见的问题。因为这些问题在教科书上是很难被提及的。当他们尝尽各种方法无法解决时,便会像上述的这位同学一样开始怀疑自己是否有充足的能力来学习编程。
编程很难入门的一个重要原因便是这是一门十分讲究实践的学问。其实这有点像医学,大部分的问题是产生在现实执行过程中的。一位父母是医生的朋友曾经对我说,如果医学教材上写着某种病的主要原因是A加上B,然后治疗方法主要是X。但是在现实中,病人A得这种病的原因可能是A+C+D,甚至是B+E+F。实际治疗方法可能是与X完全不相干的Y。这就是为什么医生在能够独当一面前都需要跟随某位前辈“跑临床”很多年。而在计算机科学中,如果教材上告诉你TCP拥塞控制算法主要有TCP Tahoe,Reno和Vegas,但这并不意味着当你学完这些后就能用C写一个控制算法并且成功运用在实践中。
对于这些强调实践的科学,理性思维就显得十分关键(指找到问题-> 分析问题 -> 解决问题)。幸运的是,相比于医疗行业天生所自带的高准入门槛,计算机科学有着更开放的资源。但不幸的是,就像我在上篇文章里曾说(美国大学课程那些事儿:选课,听课和自学),当我们拥有更多更完善的资料时,这个时代的大多数人似乎在搜集资料从而解决问题的能力上大幅度退化了。我很喜欢某位论坛网友的评价:“从原来一张低清马赛克图片都能搜出番号,到现在你把zip文件发给别人他还要问你怎么打开”。
其实,相比于搜索能力缺失,更要紧的则是很多人丧失了逐步分析问题的能力甚至是这种意识。还是以上文那位学生为例,当程序出现问题时,她完全没有想到过用其他工具(哪怕提交作业的网站本身就有的工具)来帮助自己找到问题。当错误信息直白地展示在她面前时,她甚至没有使用搜索引擎来探寻这段信息有可能指向什么错误。她仿佛将计算机当作一个“黑盒”乃至于什么无所不知的神灵。因为在那些忠实的信徒看来,只要祈祷的足够虔诚,自然就有五饼二鱼,自然就有”天火“焚尽所多玛城内的”不义之人“。我们很容易将她的某些行为和上述的教徒联系在一起。”紧盯着每一行代码“对应的是向计算机展露自己的”忠诚“,而不停点”提交“键则是一次次向计算机这个大神祈祷,祈求祂能够让自己的作业得到满分。而为什么会产生这种对应呢?那是因为在这位学生心目中,计算机和神都有着一些共通之处:神的想法是神秘不可测的,计算机的内部也是神秘不可测的;神很强大,计算机也有着强大的功能。
拜托,我们并没有生活在战锤40k的世界里。真当电脑里有机魂吗?还是说有什么欧姆尼塞亚?
令人可笑的是,这种在现实都没啥用的逻辑却被很多人运用在编程学习中。毕竟如果这真管用的话李秀成在天京被围困时就应当有”爷火华“的天兵天将帮助他击破清妖了。
而正确的处理方式是什么呢?首先是查看错误信息(无论是编译器的错误信息乃至Linux系统内自带的系统记录log)。如果这些错误信息指向很明确(比如少打了一个分号或是变量未命名),那就根据这些信息直接修改错误。如果错误信息不是那么明确(比如内存泄漏,栈溢出,进程僵尸,崩溃等等),那就使用调试工具进行调试,发现错在哪里。实在不行便直接在网上搜索。
第二个故事发生在学期快结束的时候。同样是在线上问答时间,一位同学向我询问他的期末大作业到底出了什么问题。相比于之前那位同学,这位同学还是好一些。他至少知道用数据点测试过一些极端情况。他同样向我抱怨起他花费半个小时也没有找到问题。具体如何找到问题我便不再赘述,我想聊聊之后和他的一场对话。
我对他为什么没有独立找到问题一点也不敢兴趣。但是,我对他为什么在仅仅半小时后就放弃感到好奇。于是,又一场对话发生了:
”话说你为什么学计算机呢?你是这个专业的吗?”
“我现在还不是,但是未来会转到计算机专业的。我学这个专业的原因是我爸妈说这个专业挣钱。”
“那你自己喜欢吗?”
“我倒是挺喜欢打游戏的,可能我对游戏开发的兴趣要大些。但是如果让我学纯粹的计算机科学可能学不下去。“
”我看你只花了半个小时就来Zoom问我了,和这个有原因吗?这个问题其实你再花十多分钟就可以解决了。你给我说的原因其实已经很接近正确答案了。”
“主要的原因可能是我还有其它课的作业,但也有可能有你说的原因吧。”
就如同我在前文提到的那样,计算机科学是一门实践性很强的科学。在入门的过程中,大量的练习与试错是不可避免的。而编程入门者只会在此花费更多时间。最终,只有真正热爱这门学问的人才有意愿花费这些时间。我始终记得我在初中的时候就开始折腾各种版本的Linux,再到之后折腾DDoS,NAS,黑苹果,代理、Gstreamer乃至现在仍然在做的个人博客。这些“折腾”的内容(除了Gstreamer是因为机器人的缘故)大都基于我的个人兴趣。没有任何人教过我什么,都是靠着自己的搜索,乃至一次次的重装与回滚。从原来只会一遍遍重装系统到用诸如timeshift之类的工具为btrfs格式的文件生成快照。这些看似无用的折腾最终教会了我无可计量的内容。这些内容甚至在我进入大学后成为参加一些活动和科研项目的开门砖。我相信这些无形的财富能够在未来使我获得更多收益。
回顾历史,那些留名青史的科技公司创立者,有谁不是在小时候一步步“折腾”过来的呢?如果你没有愿意付出额外时间的热情,你又为何能入门呢?
|
|