
因为建立了程序导师实验计画的缘故,收了不少学生,也收了不少报名信。在看过一些案例之后,深深觉得在开始学程序以前,有一件很重要的事情要先处理,那就是心态上的调整。
可能是因为以前受过的教育与学习上的挫折,或什至是碰到不适合的老师与教材,有些学生对学习程序有种恐惧感。就算没有恐惧感,在真正开始学程序以后又会碰到一大堆的问题,而且很多是心理上的问题,这些或多或少都会影响到学生。
而这次原本是想放在我自己的教材里面,在计画开始之前给学生看,但想一想之后觉得直接写出来放在Medium也可以。因为适用对象不只有参与计划的学生们,我相信其他人应该也有这些干扰。
总之呢,这份文希望能帮助大家在学程式以前做一些心态上的调整,往后学起程式时能够抛弃下一些本身的包袱。
数学不好怎么办?是不是程式也学不好?
这其实是一个满常被讨论的双人,数学跟学程序到底有没有关联?而类似的还有一个问题:资料结构跟演算法到底重不重要?
我觉得在讨论这个问题时,一个常见的错误就是把这个问题看得“太简单”,想要用单一标准就来解决这个问题。但问题就在于当你指涉到“数学”这个词的时候,背后其实涵盖了几个不同的概念。
数学指的是什么?
是数学的计算能力吗?我计算28 * 72算得慢的话,是否代表程式就学不好?
是数学的知识吗?我不知道什么是log,不知道分开组合的P跟C是什么,是否代表程式就学不好?
是数学背后的思考方式吗?我没办法掌握学数学时背后的那套解题方法跟思维逻辑,是否代表程式就学不好?
而且同样地,当我们说到“是否程式就学不好”时,那个“程式”指的又是什么?
是指说判断式,宣告变数,回圈这些语法吗?还是当我看到一个译文时我能不能解出来?又或者是指说我能不能写出一个简单的CRUD程序?
数学这一个词背后代表的是不同的能力的总和,所以牵涉到的范围很广,有些与程式相关,有些与程式不相关。而程序这个词背后也很广,根据指涉到的对象不同,也会有不同的答案。
我认为学数学时的背后的那套思考方式是跟学程序时有关的,事实上,你在学程式时应该要学的也是背后那套思考方式,详情可参考介绍文章:当我们在学程式时,要学的到底是什么?
在学数学的时候,我(还有跟我一样的很多人)其实没有选定我们真正该培养的是背后这个能力,例如说抽象化。我们把一个现实生活中的问题,例如说一个代数问题好了,转化成数学上的符号,当我们利用数学解开以后,实际的问题也就解开了。
而在解题的时候也或多或少利用了一些技巧,例如说把问题缩小,当你解开子问题时,原本的问题也就解开了。或者是把问题转化,由A转化成B,把包装过的问题拆开,变成一个容易很多的相似问题。
这些能力都跟你在写程序的时候是很类似的,只是你以前没认识你在学习这些东西而已(连我自己都没有)。
这边推荐文章很不错的文章:[心得]一种语言如果不改变你的思考方式,就不值得学?谈程序语言的本质,里面有提到了相似的概念,让你从另一个角度来看学程序这件事。还有一篇跟演算法与资料结构相关的:想要专精程序必须学会什么?,此处跟底下我的回覆都可以看看。
好,不小心拉得有点远,但我觉得这些都能够让你重新再思考一次数学与程式的关联,能够把问题再定义地更明确一点。
回到原问题:数学不好,程式也学不好吗?
这边我想以两个方向回答,第一个方向是刻板印象如何影响到学习。
通常会问这问题的人数学都不好,若是你又打从心底认同数学不好,程式一定也学不好的话,你在学程式时就已经有个心魔笼罩着。如果认为自己一定学不好,那学习的表现自然就会差。
这可不是我在唬烂,是有科学根据的,那就是刻板印象会影响到学习的表现。最常见的范例之一就是女生与数学的关系。推荐你们一定要去看看这篇文章:刻板印象威胁:优秀女生数学失准之谜,我直接引其中一小段:
提出人格特质理论的心理学家Gordon Allport认为,对一个人的评价,只是真假,只要一而再,再而三地灌输到此人脑中,就一定会使他的性格形成影响。四至六岁开始形成自我形象,会根据别人的矛盾评量自己,形成对自己的印象。
如果社会上对有人身分有刻板印象,这种印象会逐渐内化成其特质的一部分。假如小女孩自小就听说“女性数学能力较差”这个刻板印象,甚至她本来数学能力没有问题,但她上数学堂时可能会因此而较自卑,遇到难题会自我怀疑,对数学的期望亦会调低,最终自己的数学表现一般就会印证刻板印象,形成恶性循环。
或许女孩在生理上先天数学能力就较差,或许没有。或许数学跟程序就是有着超级正相关,数学烂程序就学的烂,也或许没有。
但真正的问题是,你都还没开始学,想这么多干嘛?在你已经知道刻板印象会影响学习之后,最好的方法就是这些这些刻板印象去学习。
先学就对了,不要画地自限。
如果你学得很不错,那当然很好;如果你学不好,也不必硬是要找个「战犯」把罪名套在它头上:「对嘛,就是因为我数学不好,程式才学不好」 ,这样子对学习也没什么帮助。
对我来说,学程式就是学程式,需要的数学知识你在小学跟国中的时候都学过了。如果你程式学不好,就多花点能量跟时间在程式上,不断锻炼背后的那套思考逻辑。假如真的你花超多时间跟随生产力却还是学不好程序,到时候我们再来探讨原因,也许有可能真的跟数学能力或者其他东西有关。
但是你还没学程序,而且还没跟我学,某些这些都还太早。有时候学不好不是能力问题,是心理问题,如果打从心底就相信自己学不好,那怎么会学得好?
我也没有要你觉得「我一定能学会写程式」,我只希望你先抛开那些既定印象跟各种「听别人说」以及「我觉得」,先专注在学程式这件事情上。
没有包袱,没有初步立场,以这种心态开始去学程序,若是三个月后还是学不会,我们再来讨论数学跟程序的关联。
进度跟不上怎么办?是不是自己太弱?
「比较」一直一来都是个双面刃。
当你自己自己比同期的人进度快上很多,优越感油然而生,“哇靠我怎么那么强,根本天选之人,大概出生就是有这种写程式的天份吧”;可是相反过来时,就会开始怀疑自我:「为什么他可以这么快完成这个作业?而我却花了一个礼拜都写不出来?应该是我太弱了吧,一定是因为我数学不好…(连结到上一题)」。
要对付这个问题,你要先认清事实。
有人快也有人慢,这个再正常不过,只是你在这个人群里面刚好是慢的那个。在NBA默默无名的球员,在SBL可能是队上的王牌,因为强度跟环境不一样,所以实力是比较出来的。
所以这也是为什么我一直跟大家说:
跟着自己的进度走。
或许他五年前学过程式,还差点变成工程师;或许他每天都写代码到半夜两点,甚至连白天的上班时间都在偷偷写作业;或许他程式基础很好,只是最近在忙其他事情所以进度落后,但说不准哪天急起直追,又回到领先的行列。
伴随着别人比较,有其他更充分的事情可以做,例如说… 好好看着自己,想想自己这阵子学了什么,跟两周前比起来进步了多少;或者是从其他人身上看到自己的不足和改善。
“比较”不是为了让自己信心破灭用的,这对学习一点帮助都没有。如果你真的很想比较,重要的是比较之后发现自己的缺点然后变为改正。无论进度比你快还是比你慢,都有可以从他们身上学到的东西,至少我是这么想的。
最后附上一个来源已经不可考的诗:每个人都有自己的时区(翻译来源)。
纽约时间比加州时间早三个小时,但加州时间并没有变慢。
有人22岁就毕业了,但等了五年才找到一个好工作!
有人25岁就当上CEO,却在50岁去世。
也有人直到50岁才当上CEO,然后活到90岁。
有人依旧单身,同时也有人有人结婚。
欧巴马55岁就退休,川普70岁才开始当总统。
世上每个人本来就有自己的时区。
身边有些人看似走在你前面,也有人看似走在你后面。
但实际上每个人在自己的时区有自己的步程。
不用嫉妒或嘲笑他们。
他们都在自己的时区里,你也是!
生命就是等待正确的行动时机。
所以,放轻松。
你没有落后。
你没有领先。
在命运为你安排的时区里,一切都会准时。
好好地看着自己,让自己每天都比昨天更进步一点,只要这样就够了。
想问问题却不知道该怎么问,怎么办?
很多初学者都会有两个问题,第一个是不敢问问题,第二个是就算敢问,也不知道该怎么问。
先都是第一个问题好了,为什么不敢问问题呢??通常都是因为觉得这个问题很蠢,是个笨问题,所以没有被质疑的必要 ,或者是深怕这问题其实很简单,自己就能够找到答案,没有必要麻烦别人。
先辈讲我觉得什么时候适合问问题,只要符合以下几个条件我觉得就适合提问:
- 仔细阅读过错误讯息,但还是不知道错误在哪
- 把错误讯息拿去Google之后还是不知道怎么解
- 卡这个问题卡了好一阵子(这边的标准是一两天)
在我的教学计画里面,如果你满足了这三点,无论你的问题是什么,我都觉得很有疑问的价值。因为你有努力过了,有尝试着想要去解决问题。用尽各种手段之后还是没办法解决,这时候再提问就有很正当的理由,就不是大家口中说的那种伸手牌。
当然,我也有碰过还没满足这三点就来问我的学生,通常这时候我就会直接问说:“你把错误讯息用白话文解释一遍给我听”,并且一步一步引导他们找到错误的地方。
或者是:“你有把这讯息拿去Google过吗?你试了什么解决方法”,虽然说我直接Google过后把解答丢给他可能是最省时间的方法,但是这并没有解决任何问题。他下次碰到这问题时还是不会,因为解答是你帮他找的。
不过这其实也会碰到一个问题,那就是有时候学生花一两两天解不开之后跑来找我,我却花了一分钟就把问题给点出来,并且让他们发现解答。这时候很有可能会有这种反应:
我是不是又问了一个蠢问题,怎么这么简单的问题要卡这么久?下次还是多注意一点好了
首先,我看过的程式码虽然没有比你吃过的饭还多,但要用经验来解决你们卡住的问题是绰绰有余了。大部分在你们眼中看起来难解的问题,在我这边都是小菜一碟,因为我经验比你们丰富太多了。
所以当你在想「这么简单的问题」的时候,你其实搞错对象了。对我来说当然是简单的,你问课程内容相关的问题时都是简单的,因为课程大纲是我订的,是我对自己教学的内容有一定的把握。可是对你来说,那不会是个简单的问题,是个困难的问题,而且是个对你来说可能的问题。
我上面所讲的三个条件,说穿了就是你有付出一定的心力试图解决这个问题,而我这边也量化了“一定的”心力这件事。一旦满足这三点以后,这问题对你来说就不是个「简单的」问题了。
这是就是一个质疑的好时机。若是让自己再卡下去会拖到进度,而且该做的你都做了,你不应该期望哪天突然开窍理解问题,甚至应该指望更实际一点的方法: 问老师(或者问同学) 。
不用担心我是不是会会发现这是蠢问题,也不用担心这问题是不是太简单,这都不关你的事。你做好你的事:查资料之后试图解决问题,解不开就来问我。而我也做好我的事,引导你找到问题的解答,若是你没把本分做好,我会跟你说。
我这课程一向都很坦诚,有什么都会诚实告诉你。我不希望你来猜我的心思,猜说这题是不是太简单,猜说自己功课是不是有做足。我希望能够以时间来恰恰是,当你卡在这问题上太久(一两天),我觉得就是一个值得问的问题,请果断来找我求助,我会帮助你判断这件事,并引导你找到答案。
当你克服了这个“怕自己问的问题是笨问题”的心理障碍以后,还有第二点,那就是尽管知道自己可以质疑,却不知道该怎么问。
例如说跟程式码相关的问题就比较好质疑一点,因为你有代码可以看,也有最后的错误讯息或是预期的输出结果。但另外的问题都比较难一点,例如说今天要你做一个留言板你却毫无头绪,这个要拿什么问题来问我?
针对这个点,我希望我们一样用时间来当符合标准。当您处于「我有问题,但我不知道问题是什么,也不知道怎么提问」的状态两天的时候,就来找我聊聊。
对我来说,我一直认为沟通是超级重要的事,有沟才有通。所以不是你自顾自地卡关,或者应该把现况跟我聊聊,就算不用真的问出什么问题也好,至少让我知道你现在的状况是什么,我们才会在同一页上面。
除了电脑课的老师以外,我也希望学生们可以把我当作辅导室的老师,就算不是跟电脑相关的问题也可以来找我聊聊,我也都很愿意倾听。虽然能不能解决是另外一回事,但至少我们能够同步,知道你现在是怎样的状况。
每日进度报告到底要写什么?
在我的教学计画里有个东西叫做每日进度报告,主要是想知道你的学习状况如何,从而也可以认为是个人笔记来使用。
如果不知道要写什么,考虑日记来写就好。这边我之前已经写过文章文来做总结,可参考:
每一篇心得都有价值-为什么初学者才更应该要写心得笔记
91哥写过一篇文章叫做《我为什么鼓励工程师写博客》,里面提到工程师应该要经营博客的原因以及常见的借口;而我自己也写过一篇《我为什么写部落格,以及部落格带给我的影响》,跟大家谈谈我经营部落格的原因以及部落格成长的历史。
没有自信该怎么办?
原本其实是没有这一题的,毕竟自信这问题真的是靠北难解,但我读了一些学生的报名信以后突然有了灵感。
如果是以前的我,可能会想尽办法告诉你说要提升自己的自信,要看自己拥有什么,而不是自己没有什么。
但在这边,我只想告诉你一件事:
我也跟你一样。
我也跟你一样,看到比自己更厉害的人,会觉得自己什么也不会。我也跟你一样,看到一些不错的工作职缺,却因为觉得自己程度还差得远而退却。我也跟你一样,自信时高时低,但比例大约是2:8,大多数时候是没自信的。
你可能觉得我在华盛顿打混了一下,写了这么多文章也教了一些学生,一定很厉害。你这样看我,我也这样看着我觉得厉害的人,在自信这点上我跟你是一样的。我也会看着那些很厉害的强者,想着自己离他们到底有多远。
我不会告诉你如何提升自信或如何处理自信问题,因为我自己也不擅长。我自己在过去的几年也卡在这问题中,最近有比较好一点,但可能一阵子过后又会卡回去。
我只是想让你知道,我也跟你一样。
结语
我知道。
我知道,尽管我讲了这么多,你可能还是会抱持着本身的印象继续走下去。
你可能认同我说的,认同应该不带任何既定印象先学程序,认同照着自己的进度走就好,认同不知道怎么问问题的时候,先发声求救就对了;也认同心得可以想到日记在写。
你理性上是认同的,觉得我说的有几分道理,可是感性上却不是这样。
你在学程序卡关时,还是会觉得是不是因为自己数学不好;看到其他同学进度超前许多时,还是会觉得自己是不是太弱;不知道该怎么问问题时依旧选择沉默不语,写心得时依旧句句语法酌量,字词推敲,深怕别人觉得你在乱写。
这我都知道,因为这很正常。
至少没有关系,至少你已经跨出了第一步。至少你现在理性上同意这些转变,只是感性还没跟上,还是被固有的思维习惯给绑架了。
要改变这些是需要时间的,但只要你跨出了第一步,需要的也只是时间而已。每一天都比昨天更进步一点,比昨天再多走一点,虽然说不知道终点在哪里,但至少我们在前进着。