追求神乎其技的程序开发之路

QS6626643650ac9b127

共 2931字,需浏览 6分钟

 · 2016-08-25

还记得小时候我和我弟上过一个奇特的数学补习班,叫做「功文数学」。他们的「教学」方法非常特别,不像一般的教室会有一个老师在讲台上教课,而是每个人会拿到一叠数学题目,每一面都有数个计算问题,像是「10 x 2 =?」这样的问题。每次去功文的任务就是把那一叠题目写完,写得越快的人就可以越早回家。那些题目说来没什么意思,从头到尾全都是计算问题,难度从最基本的加减乘除,一直到微积分都有。每次写完题目后,会有个类似老师的角色,拿出解答本帮你对答案,打上成绩。如果在那老师能应付的范围内,他可能还会跟你说说哪里犯错了,下次多加油之类的,但如果到了高中程度的问题时,老师的作用就只剩对答案而已了。

我之所以说这个补习班很特别,原因就在于这个教学过程中,讲求的是大量的计算和自我学习的能力。我从加减乘除开始,一路这样写到了微积分,写到后来那边的老师也没办法批改了,干脆把解答本拿给我们看,让我们自己看解答学。起初我还觉得这个补习班挺不错的,只要我做得越快就能越早回家,对小孩子来说是个很好的诱因。而且因为大量的训练,让我的计算能力变得非常好,国小国中时的数学考试我都不用准备也能很快写完交卷。但后来我开始觉得不太对劲,很多题目我虽然知道怎么算,但我其实不懂为什么要这么算,或是这么算的意义是什么。可是考试也不管这个,反正你只要能得到答案,根本没人在意过程是怎样。

功文数学的这套方法对训练计算能力而言很有帮助,因为计算就是需要大量的练习才能变快变好。但问题是,计算能力再好,也是只能算已经定义清楚的问题(也就是考卷上的问题),而无法发现新问题并定义问题,更糟的是还会让人习惯在没有完全理解背后的概念时只学得方法快速得到答案。

在我高中开始参加程序比赛后,我用了我熟悉的这套方法训练自己的程序能力,自己一个人大量的找题目练习。每天从早练到晚,即使没有人教我也觉得很正常,因为我从小就是这样自学起来的。这样练了一年后,我能飞快的写程序和解题,看到熟悉的题型就能马上开始敲键盘,但同时我也开始觉得写程序变成一种机械化的过程:看题,解题,写程序,看题,解题,写程序…。跟我从小做数学似乎没两样。

我开始觉得无趣。即使我程序写得再快再好,也只是解出一个别人设计好的问题而已。
心中的声音不断的说:「为什么我要做别人早就知道答案的问题?」
我想要做没有人做过的事,看到没有人看到的问题,再亲手解决这些问题。

当我开始这么想的时候,我正在一边学着做科展。科展全名是科学展览,意味着要做点跟科学有关的事来展览。我高三时梦想着要让电脑自己写程序,我觉得这是一件没人做过的事,非常酷,所以我就一直专注在这件事上(其实当时就有很多人在做这种研究了,只是我不知道而已)。但从一开始到我被选上去美国参加国际科展时,我都一直不觉得这件事科学在哪,顶多说是一个工程(或工艺)作品。但选上代表后是有些好处的,台大的欧阳明教授给了我一些指引,让我知道「科学方法」得测量和量化这个作品的结果,才有客观的数据可以知道它的作用,进而跟其他相似作品比较好坏,也因此我才开始对「做研究」这件事有点概念。(到这时我才想起来,小时候虽然有做一些物理化学实验,但从没人跟我说过这些实验是有一套标准的方法和流程的,当然也没人跟我说这件事的价值所在。)

虽然做科展挺有趣的,但同时我也对科学感到失望–因为我意识到科学方法没办法帮助我们发明新东西,只能用来评价和检验已知事物的好坏。至于所谓的创新科学研究,也是得先提出一个假设(hypothesis),然后再用这套标准方法去验证它是否成立。但到底要假设什么事情呢?科学可没办法告诉你。

上大学后,我看到当时处在黄金时代的MIT Media Lab所产出的许多创新研究成果,也开始接触到设计(design)这个领域。我发现Media Lab的人大多有跨领域的背景,像是设计师+电机工程师、或是音乐家+软件工程师,他们常看到别人看不到的问题,并提出简单又优雅的解决方法。我以前一直以为做设计的人讲求的是美术天份,但后来深入了解后才发现这是个大误会。设计的目的是解决问题,跟程序员其实没两样,只是用的工具是纸笔或模型罢了。(但一个好的设计通常也都很「美」就是了)

虽然如此,设计师和工程师也有很大的不同。设计师对四周环境和日常生活很敏感,常常得在生活中注意各种细节的不完美之处。但工程师成天泡在电脑中,而且很善于使用其实很难用的界面和程序(像Linux、vi、command line、还有各种程序语言),甚至引以为傲,日子久了也就不觉得这些东西有什么问题。泡在代码中的工程师也一样,如果习惯了和前人或其他人的大便码相处,久了也就不觉得臭了。

发现这些现象后,我开始学着跳脱出原本习惯的一切,开始注意生活周遭的各种细节,思考为什么这个东西当初要这样设计、这样做有什么好处和坏处、有没有更好的方式之类的问题。之后,当我习惯观察细节后,慢慢察觉到我习惯用的软件、工具、环境、程序语言,处处都是设计后的结果,而且充满可以改进和创新的空间。这些东西都不是没来由的产物,而是经过某些人思考过后的结果,甚至是经过好几轮的演化结果。

可惜平常在学习或教学的时候,很少人会提到这些历史渊源和演化过程,以至于这些设计都变成理所当然的存在。但如果我们能仔细观察平常的事物,进一步思考就会发现很多设计都是为了因应当初时空环境的限制,而这些限制现在不一定存在了,所以我们就会有发挥的空间。

眼光拉远后,能看到的问题更多了。到了这个阶段,能力强的人会觉得能解决的问题也很多。但上天给每个人的时间是一样多的,这时重要的事情反而又变成:「找出最重要、最根本的问题来解决,而不要被众多的小问题和小机会所分心,才能产生最大的影响力」。

回顾我的学习过程,我会觉得每一个阶段都是一块基石,一块块往上叠以后才会具备该有的能力和经验做下一阶段的事情。举例来说,要是我一开始没投入程序比赛的练习累积足够的实作能力,之后我就没办法随心所欲的写出我想写的程序,也没办法参加科展体会做没人做过的事有多么有趣。之后我可能就会一昧沉浸在钻研各种流行技术中,或是眼高手低说得一嘴好主意但却做不出什么来。

虽然学习是一步一步往上走的,但过程中每件事都有反面的效应,让我不知道是不是做别的选择会更好。像是我觉得功文数学浪费了我太多时间在数学计算上,而限制了我在其他方面的发展,但同时它也让我养成靠自己学习的习惯;参加程序竞赛也有类似的效应,虽然增强了我的程序能力,但也让我错过正常的高中生活和课程(虽然说到目前为止没有觉得有什么负面影响)。

无论如何,我相信在成长的过程中适当的大量练习是必要的。异数(Outliers: The Story of Success)一书的作者Gladwell说要精通一件事情至少需要一万小时的练习,我相信这是真的。我在高中为了比赛所做的练习起码就超过五千小时,上大学后轻易就超过一万小时,但其实我也不觉得我真的精通了什么。经过大量的练习,本来很难的技巧或技术都会变成一种本能,可以很自然的使用它来从事更高阶的应用或是建构更复杂的技术。没有这些基础,也就很难站在更高的地方看得更远想得更多,我也不会走在现在的道路上。

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报