第八集终于写完了…。虽然我寒假过得很轻松悠闲,但不知道为什么人就是会在很闲的时候不做平常一直说没空做的事,然后硬是要在很多作业和工作时开始写blog….。虽然开学后又开始变忙了,但我到目前还是每个礼拜都跑去滑雪,这样看来这一系列最后突然会变成追求神乎其技的滑雪之道也说不一定XD
前言够多了,本集将继续我在高三时朦胧无知的学习故事…。
Intel ISEF国际科展
在第五集里提到我一直以来都梦想着让电脑学会自己写程式。就在我把这个想法的雏型用基因演算法实做出来后,没想到竟然真的看到了一点结果,电脑真的能透过基因演算法来产生出一个能够正确运作的程式!
在高三时,已经取得保送资格的我对学校的课业时在没什么兴趣,于是我想闲着也是闲着,干脆就把这个点子拿去参加科展看看,这样一来我就又有理由可以请公假了(笑)。当时似乎是因为已经来不及报名全国科展了,所以我就跑去报名了国际科展,但那时我其实完全不知道这两种科展有什么差别。后来查了一下才知道,原来台湾的国际科展除了是一种比赛外,主要的目的其实是要选出代表去参加其他国家(如美国、法国、加拿大…)的科展活动;而一般的全国科展就是一个区域至全国性的展览兼比赛,在全国选出前几名后就结束了。
2001年时,那时科教馆还在建中对面,那也是我第一次踏进科教馆的大门。在展场内把自己的海报贴上看板后,我就到处逛逛欣赏别人的作品。因为资讯科在高中不是正式科目,参加的人比起其他科来说少了许多,但其中还是有些非常惊人的作品出现。当时有个建中的学弟Eric,他写了一个用类神经网路辨识并动态追踪影像中人眼位置的程式,于是他就用了个普通的摄影机加上这程式,就变成可以用眼睛控制滑鼠游标的神奇装置。
除了Eric的作品外,其他的作品看起来大多只是某种现有产品或课本上习题的复制品,并没有什么令人特别印象深刻的东西出现。说起来这其实也不奇怪,因为在高中阶段要自己学好一个程式语言其实并不容易,在基础还未打稳前,即使有再多创意也无法发挥出来。而很可惜的是,很多人上了大学终于学会写程式后,创意和热情也被磨损的差不多了;而毕业后虽然已经有了基本功力,但却只能照着老板开的规格刻画死板的功能与介面,与其说是程式设计师不如说是程式工匠。
我觉得台湾人的能力并不差,但社会中却弥漫着一股抄袭与仿冒的气息,从最近的酪梨寿司事件 (相关抄袭事件还可参考MMDays的整理 ),可以看出抄袭风气在台湾并不只是小时候在学校抄抄作业而已;媒体工作者在报导中任意抄袭及转载是种不尊重自己专业的表现,不但隐含着一种应付了事的心态,更代表着这些人对于自己的工作没有热情,更没有着一点坚持。如果要说我在美国看到这边和台湾有什么最大的不同,我想关键的差异就在对自己的工作有没有热情和坚持而已了。
在评审的过程中,有两个教授一起来听我介绍我的作品。因为我没有任何参加科展的经验,也没做什么讲稿或准备就去了,一切只能靠临场发挥,还好教授们还蛮喜欢我的作品,一来一往的讨论之下才让我不至于太紧张而说不出话来。
自己的介绍结束后,终于松了一口气,教授们对我的作品似乎感到非常新奇和有兴趣,后来还问了我「如果再给你两个月,你能做出更好的结果吗? 」这问题听起来像是要给我个机会再继续深入研究下去,难道是意味着要选我当代表吗?当时我对于得奖其实是没什么兴趣和期望的,只是想看看别人对这个东西的意见,但如果有人喜欢当然是很棒的事情。这问题无非是给我挑战的机会,我脑中还有很多改进的想法,如果有更多时间,一定还能做出更棒的结果。所以,我就毫不犹豫的就回答了:「可以,当然可以!」
到了颁奖典礼时,司仪一一宣布每个学科的获奖人以及之后要代表台湾去哪个国家参展,同时也颁发一些企业赞助的特别奖。我原本一直以为Eric的作品应该是稳拿第一的,毕竟相较之下我的作品并不够成熟和完整,甚至连个能称上科学实验后的结果都没有。但这个新奇的点子威力还是很大,我完全没预料到无心插柳参加科展竟然让我拿到了Intel颁发的电脑科学最佳奖,并且还选上了美国代表,之后可以代表台湾去美国参加Intel主办的国际科学暨工程展(ISEF, International Science and Engineering Fair)。
程式设计之内功心法
得奖当然很开心,这是对于我这个想法和努力的肯定,但随之而来的也是一股很大的压力。我得代表台湾站出去,到美国跟来自世界各地的教授、学者、参展代表用英文介绍我的作品,那不能像在台湾这样轻轻松松跟教授聊聊天就好,我要用不熟悉的语言跟不熟悉的外国人介绍我这个只花一两个月做出来的雏型作品… 光想到这个背都凉了。
选上科展代表跟选上奥林匹亚国手是完全不同的感觉。奥林匹亚对我来说是个已经努力很久的目标,我很清楚自己的实力有多少,我对自己花了将近一年所打下的基础很有信心,而且我对比赛本身已经非常了解,出国比赛不过就是做我已经很擅长的事情而已,一点都不需要害怕和担心;但选上科展代表真的完全是意料之外的事情,我自觉还没有花足够的功夫在这问题上研究,就像一个脚底有油漆还到处乱跑的小鬼,糊里糊涂的鬼画符被长辈当成毕卡索的作品一样。
惊恐之余,我还是警觉到我得开始做很多事来让我能充满信心出国去参展。我得赶快把英文练好,至少要能流利的跟人介绍作品,还要能回答各种问题;我还得了解Intel ISEF到底在干么,参展代表要做些什么事;最重要的是还得继续在这个作品上做更多研究,看能不能在两个月内做出更好的结果。
参加科展让我意外领悟到一些事,我发现我高一开始花了一年多投入资讯比赛所得到的并不只是那块奖牌与一堆奖状,在练习的过程中,我把台中图书馆所能借到的演算法和资料结构的书全都看过了,就连冼镜光当初在微电脑传真杂志上的专栏也被我从图书馆地下室的陈年库藏中挖出来,一本一本的影印装订起来。我收集了我所能找到的所有大大小小资讯比赛历年来的题目,加上当时ACM Online Judge上做过的四百多题,我当时参加比赛几乎都是看完题目马上就能想完所有可行的演算法和所搭配的资料结构,并用直觉挑出能最快写出来且又最有效率的解法。除了解决问题的方法外,我也能轻易的把任何想法写成程式码,只要能把过程讲出来,就能毫不犹豫写出code来。
这个花了一年多练出来的功夫,让我到今天都受用无穷。这种感觉就像念完九阳真经后内力大幅提升,之后不管再练什么武功都是易如反掌。在高中时,我改以Linux作为我主要的工作环境,同时也帮中一中架起BBS,并自己架了web server、mail server来玩玩。这些系统底层的功夫乍看之下跟写程式没什么关系,但我后来发现要做各种能在现实生活中应用的软体系统,总是会碰到这些现有系统的细节问题。
我以前在大学时常观察别人的project会碰到什么阻碍,而开发不顺利的原因几乎都是被一些琐碎的细节所绊住而导致严重的进度落后。这些细节都是些小事,甚至跟写程式没有直接相关,但总是会让人陷于泥沼之中。举一个简单的例子,假设要在Linux上写程式需要用到某个library,动手前得先安装一下。这个看似简单的安装其实牵扯到许多琐碎的细节,像是:distro有没有提供package可以直接透过网路安装? 没有的话就要自己编译,那就得知道如何用configure、make等工具;编译中可能还会发生缺少其他相依的工具或package的情形,这时还要能从错误讯息中看出到底少了什么东西,并且想办法先安装起来…。这些事情跟写程式的理念其实一点关系都没有,但很残酷的是,有许多人都会被这种细节所绊倒而中途放弃。
扎实的内功和熟悉系统底层的基本武功带给我非常有效率的实做能力,我可以在想出新的idea的同时马上勾勒出实做上大大小小的细节;我可以很快设计出核心的高效率演算法,也知道系统各部份的功能有什么现有的library或系统可以利用,这两种能力让我能快速完成prototype。我只怕没有够好的点子,完全不会担心是不是真的能做得出来。
不久前有位数字先生开了一个程式速成班,号称能在4堂课内教会web程式的开发,只要带着点子过去就能在上完课后开始创业。我觉得学写程式本身其实不用很久,我也曾教过一个12岁的小朋友写程式,两个礼拜总共约十小时就足够让他掌握基本的程式逻辑概念,包括变数、回圈、if、阵列、抽象化..。但认真说起来这些东西只是基础内功,有了内功后自己还是要花很多时间去学相关的底层武功,像是要做web程式还得摸熟web server的架设和管理、UINX的shell和系统管理、各种相关网路传输协定、资料库的使用和管理、前端的HTML和CSS设计….。光web程式所牵扯到的实做细节就多如牛毛,如果要在完全没有稳固基础的情况下同时学这么多东西,只要一旦出现问题,一个对系统从上到下每个环节都不熟悉的人是完全没办法锁定问题发生点的。而debug的基本概念就是要先锁定问题发生的地方,要做到这件事的先决条件就是要很有信心的先排除一些不可能的地方,再做些假设并验证假设是否成立来判断可能问题。如果对每个环节都没有充分的经验,我不觉得这样的人有能力清楚的定位出问题所在,更别提是否能独力完成一个像样的完整系统。
每个人都听过成功是一分的天才加上九十九分的努力,如果说天才是能想出绝妙idea的能力,那我觉得还有个关键是,要在有点子前先做过够多的努力打好基础,等到灵光一现时才能把握住机会马上实现它。如果等到一分的天才出现时,才准备开始做九十九分的努力,那很容易就会被许多基础能力不足所带来的挫折感和障碍所压垮。