追求神乎其技的程式设计之道(五)

让电脑自己写程式的梦

在高三突然对于让电脑自己写程式产生兴趣后,我每天就都想着这件事,梦想着未来某一天的电脑能跟我一起写程式,当我把程式目的说给它听时,它就一边把细部的程式码产生出来:我不用想如何命名变数,或是要用什么演算法,还是我到底要不要把这个功能变成独立的class…;我只要动动嘴巴:「我想写一个横向卷轴的射击游戏。玩家操纵着会变形的飞机,还有四种武器。第一关要长这样这样……」,然后电脑就帮我把游戏写出来了!如果真的可以这样,那该有多好啊!(如果真的成真,恐怕我也要失业了?)[注一]

这个想法实在太让人兴奋了,虽然说这是一个遥远的梦想(其实那时候我并没有觉得这么遥远,只能说自己太不自量力XD),但也开启我对于人工智慧、程式语言结构、软体工程等领域的高度兴趣。

写程式很难?

在高中时代颇不知天高地厚的我,一边尝试着利用基因演算法(Genetic Algorithms)让电脑自己产生程式码,一边研究各种程式语言的结构和特性。靠直觉摸索出利用tree作为中介来描述一个程式后(那时没念过compiler,不知道这个其实就是Abstract Syntax Tree),我突然就对这个想法的可行性信心大增,所以一时冲动就去报名了国际科展,打算把这个想法实做出来。

真的做了以后才发现,最难的部份不是产生出程式码。如果你把程式语言的基本元素,像是if、for、变数、运算符号等东西做成一块块磁体,然后拿给一只猴子玩,那么它其实也能拼出一堆程式给你,问题是:「你要怎么知道这些程式码真的达到了你想要的目的?」

悟出这个道理后,我突然了解写程式最难的部份是在验证程式码真的跟你所想表达的事情完全相同。(所以说我对于各家软体公司的QA地位都低于RD其实感到很不平)

基本上,我们只能设计大量的可能输入值丢进程式里,并比对程式跑出来的结果和我们想要的输出相不相同。即使在这种情况下,我们也只能说这个程式在测试过的这些输入值上所产生的结果是正确的。也就是说,除非我们测试过所有可能的输入(这意味着无限多种可能),不然永远没办法知道某个程式是对还是错。除此之外,即使只测试一个输入值,也还有个很严重的问题:「我们怎么知道这个程式要跑多久?」换句话说,当你程式跑下去,你怎么知道他是掉入一个无穷回圈,还是其实正在拼命计算当中?

我在参加国际科展时,认识了欧阳明教授,他告诉我这个问题叫做Halting problem,Alan Turing在70年前就证明了这是一个无解的问题。知道这件事后,才发现自己所知实在太少,对于资讯科学的基本知识实在非常不足,但这次经验其实也给了我一个明确的方向,让我把书中的理论和实际的目标连结在一起。

见树又见林的学习之道

提到书本中的理论,有很多人问过我要怎么学习写程式或资讯相关的知识,我顺便在这边分享些心得给大家参考。

常看到许多人抱怨大学里学的东西都是理论,毕业后找工作时才发现什么都不会都得重学;当然企业也会抱怨,大学应该多教一些实务课程,不然出社会后还得重新训练。说来说去,一致的口径指向理论和实务是打死也扯不上关系的样子,尤其念资工的人更常这么说:「学校为什么不教C#?为什么不教我做网页?好歹也要教个HTML嘛!」


我觉得学习任何事物,一定要有充分的兴趣才会有效率,在不知道所学为何的情况下被逼着学习是非常痛苦且没有效率的。最近看了一本书:没有资优班,珍视每个孩子的芬兰教育,书中提到芬兰教育成功的秘密在于「见树又见林」,这句话也是我对于如何学习最想分享的秘诀。

台湾的教育方法是「先见树,再见林」,也就是先教你细部的方法和技术,等你都学会之后(或是硬背起来之后),出社会后就会知道为什么要学这些东西。(很多人小时候都听过「等你长大就知道念书有多重要」吧。可是现在比较多人毕业后反而说「我不知道之前念那么多书有什么用」)在这种体制之下,许多人在还没见到整片森林的美景前就被一棵棵大树搞得晕头转向,痛苦万分,在不知道「学了这个可以做什么」的情况下,不管学什么都会觉得没有意义没有动力。

而「见树又见林」的学习方式,是先找到能引起自己兴趣的目标,让自己有个理由去认真学习,之后再往细部的技术和理论去学习。我从小就很想自己写游戏,为了达成这个目标,我就四处寻找相关的资料,慢慢的我就知道自己应该要学好一个快速的低阶语言(像是C++),如果要写绘图引擎可能还得学一点图学的理论和技术,如果要做网路连线还得学网路相关的技术…。

这里有个重点是,不要看过森林后就忘记它,而又迷失在几棵树干上,要让自己一直重复见树又见林的过程。

这跟如何有效开发软体的秘诀是一样的。一个有效率的软体开发方式是用iterative process,把包含设计、实做、测试的iteration时间缩短,但要一直不断重复这个iteration无数次来改进现有的成果。同理,在已经有目标的状况下学习时,每当学会一些新东西,就要马上试着把它实现出来,即使是只有几行程式码的prototype也没关系。只要一直不断的学,这个prototype就会一直被改进,一直加进最新学到的知识和技术而更接近最终的目标。

同时动​​脑也动手(注二),用这种角度来学习就能充分了解自己学会的东西可以用在什么地方,马上得到回馈的成就感还会刺激自己继续向前进,形成一个非常有效率的学习循环。用这种角度看学校教的东西,就能知道书本上的理论可以用在哪,并且又欠缺哪些实务知识让自己无法做出想要的东西。

这方法理论上可以扩展到任何事物的学习,重点在找到有兴趣的目标和书本里知识的连结,我觉得这是老师应该要出力的地方,无奈的是台湾的教育体制把中小学老师们变成出考题和改考卷的机器人….。

注一: 
其实,现在真的有这样的研究,而且惊人的是目前已经有了非常接近我想像中未来的雏型。最让我兴奋的是MIT Media Lab的Hugo LiuHenry Lieberman做的Metafor:只要对电脑用英文描述你要的程式,电脑就自动把Python code生出来给你….。

注二: 
话说,MIT的校徽上就是一个拿着锤子的工匠和一个拿著书的学者,所代表的意义就是“Mind and Hand”,也就是期望每个学生都能手脑并用,除了做梦外也要实做出来才算数啊。

(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值