« 虚拟物品交易研究 | 返回首页 | 黄万里教授的忌日 »

编程的门槛

大约在游戏制作行业里,大家都把设计工作分成三大类:程序,美术,策划;其重要性相互之间都无分上下。这算是跟其他 IT 行业极大的不同点吧。

但这里面,程序的门槛是公认的最高。很少有听说有专职的美术或者策划人员,从对编程一无所知转变成一个程序高手的。按道理来说,编程需要的基础知识并不复杂,只需要加以时日磨练,任何人都有成为优秀程序员的潜质。谁都明白,当团队中的成员互相了解各个领域的工作可以提高整体的效率。可是,为何,许多人却经过努力,没有迈入程序设计的大门呢?结果,大多数美术人员不会编写 max/maya 脚本;策划没有能力编写复杂结构的脚本。

那么,编程的门槛究竟在哪里?是什么阻止了非编程人员在简单的程序脚本上更上一层楼?作为多年的程序员,我似乎忘记了当年入门时的心境。面对这样的问题时,便得在记忆深处挖掘答案。

现在看来,我和大多数有十年以上编程经验的程序员一样,认为学会这门技术是顺理成章的事情。学会编程的人也不会认为编程有什么困难。仔细的回忆,却想起事情并非如此。

记得第一次接触编程是大约 6 岁时在家中的计算机上,阅读父亲给我编写的 basic 程序,只有不到 10 行的那种。似懂非懂的修改了其中几行代码,满足的看着程序的运行结果因为我的修改而相应的变化。似乎那个时候就理解了程序的含义,但真的如此吗?

直到 8 岁的时候,我学会了解一次方程。对于一个小孩子来说,解二元一次方程还是很有挑战性的。那时的我曾经幻想把方程式输入计算机,就可以得到结果。有幸的是,父亲马上花了时间在这个机会给我重新讲解了变量和赋值语句的概念,从那个时候起,我真的理解了编程了吗?

10 岁的时候,我决定自己编写一个小游戏,唯一的参考资料是随计算机附送的一本 basic 教材。依稀记得是香港的版本,全是繁体字。同时,我跟着一个成人大专的 basic 课程随堂学习,每堂课程的作业都可以准确的完成。但是我在编写自己的游戏时却遇到了极大的困难,最终这个游戏流产。

最终,我认可自己已经迈过了编程的大门是在 12 岁,那时候妄想自己可以用程序解决任何问题了。觉得程序=算法+数据结构 就是唯一真理。同年,我开始学习汇编语言,非常的顺利;第二年,自学了几本 C 语言的教材。学习编程这件事情,已经不再需要老师的搀扶,这时距离第一次编程已经过去了 7 年。

在之后的很长一段时间里,我都觉得编程的门槛是很难跨越的。学会独立编程和学习新知识的能力,似乎需要一种顿悟。直到读大学时,同寝室的一个同学,不到半年就跨越了这个门槛让我明白,年龄也是一个重要的因素。成年人比小孩子更容易迈过这一步。

到底这个门槛是什么?我现在的理解是,学习新知识的方法。大多数人在人生的开始,学习新知识都是采取的类比的手法。了解一样事物的表面特性,就可以去推理类似事物的特性。比如教小孩子去打酱油,领着他到商店,把酱油瓶和钱交给售货员,然后把酱油拿回家。聪明的小孩下次不会教也会自己去买烟了。这是一种类比,然后发现了钞票在这件事情里的重要性;而酱油瓶就不那么重要了。

我们可以看到,很多人会做初级的脚本编写工作。但是他们需要一个范本,根据这个范本修修改改,就可以按自己的想法工作了。简单点的,只是改几个参数,换个颜色;复杂点的,可以调动一些逻辑。本质上,都是用类比的方式来学习编程。可惜的是,编程的本质却不那么容易在这个过程中被发现。

我想,依靠一张数学意义上严格的语法表,任何没学会编程的人都很难掌握一门编程语言。但是有经验的程序员却可以。这或许就因为,编程这件事情,本身就是依赖逻辑推理的。编程语言是建立在逻辑性上。这是思考世界的方法之一,很多成年人也未必熟练掌握这个方法,经验依然是大多数人的法宝。(当然,经验对于程序员也同样重要)

这么多年,我经常收到一些 email 向我索取各种各样的源代码。在网上见到“求代码”这样的帖子也是司空见惯。到底源代码有多重要?我想,对于真正的程序员来说,源代码的作用最多的是复用,省去自己的工作。从这点上来说,二进制复用更加有意义。通过例子代码来学习新知识也是为很多人喜爱的,毕竟不是每个人都喜欢读枯燥的技术定义文档。包括学习新语言,有几段范例代码来琢磨语言本身也是很直观的事情。但是,通过找到一些类似代码来解决类似问题,几乎是天方夜谈。平时我们也能见到一些部分伪程序员,为了解决代码中的问题,这里改改试试,那里改改试试;或者调整几行语句的位置,删掉几行代码,看看问题解决没有。我想这都是尚未迈入编程大门的表象吧。

如今理工科大学生,或多或少会开编程的课程。但是本科毕业生不会编程的人比比皆是。通过背出一段代码来应付考试已经不只是笑话了。编写教材和授课的老师应该检讨,是否教学方法出了问题。

Comments

这个问题我也经常思考
因为我第一次是长时间思考, 看书顿悟的( 相信很多人都是这样入了计算机的门 )
这个究竟是为什么, 从最底层的层面来说, 是因为一接触就是语言, 而自己并不知道语言能干嘛, 迷惑. 无法理解数据在计算机内部的表示(几乎是完全不理解) 如果懂了这个, 那计算机整块知识都是很好理解的, 算是理解本质吧.
计算机知识挺杂的而且声音很多, 不容易教授, 好书有但烂书更多. 这大概也是编程的一个门槛吧

我现在觉得, 要教授编程, 还是要好好教授下计算机的基础, 汇编和结构, 搞个简单的, 教会这人就入门了

十分冒昧打扰您,我看了您的文章很有想法,我想和您交往一下可以吗?我的QQ78227675

再多说点吧,关于我们的教育的。

举个例子吧。
数序归纳法,应该都不陌生吧。
但,你学到的是皮毛,还是本质呢?

如果真学到了本质,那么递归算法,完全是可以信手拈来的——我自己初学时,就曾写了个古怪的函数,很简单清晰地解决了一个问题;虽然似乎一切都很合逻辑,但却不得不开始疑惑计算机能否接受这种一个函数写一半,用规模稍小一点的参数调用自身,直到问题解决的BT写法。
很久以后,才从书上知道这种写法叫递归。

可以说,仅仅会用数学归纳法,除非研究数学,否则完全是浪费。
但掌握这种逐级缩小问题的思路,却非常可贵。

考试制度最深刻的弊端,正在于此。


同样。当我顿悟了游戏的设计原理时,其实显卡/显存的基本原理,也已经同时被自然而然的推论出来了;联系晶体管方面的知识,整个计算机的基础原理,也已经是呼之欲出了。
之后的学习,则不过是这个机器各方面实现机制的逐步细化。
这个过程,可以称为知识的整合吧。

很多人学不会编程,除了逻辑原因,恐怕很大程度上还是缺了这个整合过程。
以至于他们的头脑里不仅没有三极管、与非门级别上的计算机模型,甚至是连高级语言抽象出来的那个最简单的计算机模型都不存在。
于是,他们关于编程的知识永远都是些散碎的知识点;甚至——Qsort是如此如此这般这般的一串字符组合(而不是我们头脑里的分治+冒泡);链表是这样的一大堆中文字表达的定义(而并不是我们眼中靠指针链接起来的一系列火车车厢):难怪对他们来说,算法与数据结构这门课是如此难学。

除非自己有兴趣;否则,考试制度之下,永远不要期望学生们自发的整合自己学到的知识点;甚至于,很多人早已失去了这种能力。

于是,在鼓励背诵,同时(潜在地)惩罚整合的考试制度影响下,最终结果就是:学了,懵了,背了,考了,忘了。

编程的门槛=逻辑思维能力

我倒是对自己怎么迈过这道槛记忆犹新^_^


从小就对机械、电子等等东西感兴趣,初中时已经基本明白了彩色电视机的原理。
最重要的,是这些拆解、学习、思索让我明白,利用好很简单的一些规律,就可以让很多看上去不可思议的现象流淌出来。

很喜欢这样比喻程序员的工作——看动画片,如猫和老鼠之类,经常的一种搞笑手法,就是:“杯子碰倒砸到碗;碗滚出去砸到开关点亮灯;灯烧断了系着秤砣的线;最后秤砣砸到了猫的脑袋”。

不光是程序。所有的机器,最终不都是这样子的么?

无非是,不同的机器,用到的物理、化学、数学原理有所不同罢了。


继续说我和计算机的缘分。

当时,一直纳闷于游戏机是怎样在内部完成这个机关的。
高中毕业,等通知时,到一个朋友打短工的打印店玩。看到了平生第一本编程书籍——QBasic语言入门。

看了一下午,并没有顿悟。不能理解那些加减乘除最后是怎么变成了游戏机上那种能够实时反映玩家动作的动画。

晕晕乎乎想了一个月。突然明白了——关羽是一堆小点组成的图像;按键,则图像变形,做出拳状。
关羽在屏幕上会有一个坐标;敌兵也有一个坐标;随机数可用于决定NPC的行动;加减乘除可以计算所有行动的影响范围;if-else则可以根据计算结果换不同的图片。

呵呵,一朝顿悟。
顿悟后,我对电脑的印象,还只是一块红布下神秘的电视机似的东西。

不过,大学后第2还是第3次上机,我已经能够用图书馆里翻来的inkey$这个非阻塞函数+print+clearScr搞出一个粗糙、闪烁的横版射击游戏了^_^


国内的教育根本不重视实用;即便是计算机系毕业,仍然走不出这一步的,自然就不会罕见了。

羡慕你啊

兴趣是根本,是起点,只有多编程真正热爱的人,才能写出好程序。

都是哪里人啊.怎么看起来都很有钱的样子,都那小就有计算机可以用了?我十五岁,才有一台自己的计算机...相比下,可怜...

楼上说的很对啊 现在大学生真的 哎 无语 我也是 大学计算机的什么都不会 编程就是个文盲 真不知道当初怎么选的这个专业 我是大学才接触的电脑 qq email还是别人给申请的 哈哈

三个字而已嘛:兴趣、悟

虽然我编程中普通的门槛跨过了.但还有更高的门槛等着跨.也许是生在热带的原因,人比较懒,想的多做的少,呵呵~ 我觉得普通的门槛过了,学什么都快,都容易懂,但我就是懒得实践. 的确实践会很快的顿悟. 还好程序员不是我的人生目标.

自学中,很辛苦!

刚上大学那会的第一次上机实验,我连开机按钮在什么地方都不知道。真羡慕云风小时候的学习条件。

其实编程说到底就是逻辑。如果你能够用编程语言清晰的表达你的逻辑,那么你就成功了。
我初一时,亲戚带来一台386的笔记本。那个时候,没事做,就看看有什么exe文件发。然后发现了qbasic。由于学校里练习电脑打字的时候,打过许多文章,知道basic是一种编程语言的。
所以,就进去试了一下。qbasic是有帮助的。就这样,开始了第一次编程。一开始编写了一个自动出算术题的,并且可以出有简便算法的算式,现在想想初中或者小学时的简便算法真的挺有趣的。

看了你的那本编程书了,很好的,我看了2个晚上。
我想,你说的问题正是教育的问题,我们小的时候没有没有学会站在一个高度上看问题。从小到大都是在一个高度上看。所以,进步很难哦

的确不会编程的毕业生占大多数。我是刚从本科毕业的学生,这个情况我也清楚。我看主要还是平时缺少磨练,而在学校期间磨练的动机大多还是来自于兴趣。我之所以报考计算机系,就是因为这是我的兴趣所在,我想这就是我跟其他同学不同之处。虽然我比云风大哥小了很多,但是我却有跟您类似的经历。由于我对计算机技术有着浓厚的兴趣,在初二时爸爸就给家里添了一台电脑,记得是AMD 5K的CPU,我就在那时开始学VB,做网页。有了这些基础,到了大学,学起来自然比别人容易多了。课堂上学到的是理论知识,老师布置的作业也只是一堆数字的排序啊,搜索啊之类的,学生毕业后就会写这些,可用于展现自己实力的东西基本没有。所以平时的磨练就需要靠兴趣来寻找题材。当时班里的男生都玩上了大话II,我也是其中一份子,但是我在从中找到了我的磨练题材(什么东西就不说了:))。这是我第一个发布的程序,虽说当时还没接触到什么设计结构之类的东西,但课堂上学到的知识基本上都给用上了,数据结构、汇编、图形处理都有涉及,没教过的google上找,现学现用,历时一个暑假终于完工。以后想到新功能就往里加,慢慢摸索出一些设计理念。这段磨练的经历使我大学里的所有实践课程全部都是90+,现在想起来,我的兴趣太重要了。

大学里还有个好笑的现象,就是竟然有计算机系的女生4年本科连个hello world都写不对,英语4级、6级、托福、雅思样样都有。搞不懂她们干嘛不考外语系呢?

好像很多人都是从游戏开始的。我入门很慢,大1开始学Fortran,大二学C,大三大四学LPC,一直到第二份工作才真正用熟练了VC。人的天赋差别真的是很大。

我跨过编程门槛的时候最有意思的一点就是,我并非是一个由易到难的渐进入门过程,而是专注于某一问题的解决,在这一问题上研究很深然后慢慢在使用过程中熟悉一些基本的常识。

学会独立编程和学习新知识的能力,似乎需要一种顿悟。


对,问题在这里。但如果是指的能写程序,并不需要很难。

我是上高中的时候想要学习编程,买了些C语言教程来看,看那些if和printf,我看得很冒火,因为我就想写个游戏,什么游戏都行,但是我没看出来printf和游戏有什么关系

高考完的那个暑假开始决定要学VB,买了一本那种step by step的VB的书,因为那时候已经是.net了,所以就是VB.net的书。我发现这个很有效果,那时候也不知道啥叫面向对象,就是发现textbox1.Text这样就能行了,然后在开始学VB的2个星期内就已经能用VB编一些窗口游戏了,比如说猜数字、拼图之类的。

但是问题在于独立编程和学习新知识的能力这个问题还是没解决。结果在学VC的时候就完全蒙了。那时候看深入浅出MFC,发现一点都不浅出,汗。

然后过了一年,到了大二,强迫自己用MFC写程序,有什么搞不懂的就先凭感觉猜着写,往上凑,乱改,直到能用为止。这样就发现只要有了实践,什么功能都能实现了,虽然原理还是一知半解

然后之后的几个月,迅速的顿悟,不断有大的发现,挖,原来XX是这样,原来YY是那样,再加上那段时间写过一些用SDK编程的经历(就是不使用MFC直接用Win32API来写程序,包括界面窗口),发现MFC也就那样了,什么深入浅出MFC,不如自己用过一遍SDK有用。那之后就发现要实现什么完全就有了信心,什么都能做。

大概是因为MFC包装得实在太晦涩的缘故,如果连MFC都搞懂是咋回事,学会使用任何一个语言或者库就都不是问题了,所以很快我追求的重心就从“怎样实现XXX”转移到“怎样实现XXX最好”

还记得初中时上课把basic程序写到纸上,等周末时跑同学家借带Qbasic的学习机跑程序。但到底什么时候学会的编程?现在就真的学会了么?虽然比好多计算机专业出来的人好那么一点点,但就真的会了么?我不能肯定也不敢肯定我就会了

小学的时候,看哥哥用basic写的高斯八皇后甚为崇拜,因为我看不懂,现在想想根本没什么,其实每个人只要给他机会,学什么通过积累只要学精了,都还是有能力胜任工作的;
现实中分工很细,岗位分工也很细,如果可以胜任就胜任,不可以胜任就委婉拒绝,决定权在你,当然责任也要你担的.

楼上说的很对,编程其实最核心的是如何将现实世界映射到程序语言上,如何分解问题和建立模型。而这是要经过长时间训练的。
我曾经注意观测过,很多人都会用现成的递归算法,或者在比较“类似”的场合想到使用。但是,在复杂、晦涩的场合下,没有领会到递归本质的人,就会暴露出来。

有意思的话题...
要说清楚门槛的问题就要先说清楚什么才叫会编程序。

简单的说,问题在于短期投资/回报率。他们不投入是因为投资过大,短期回报太低。


你的主题并非“转型”,而是简单的“使用”。策划并不需要经过任何绘画课程,就可以绘制示意草图;他们也会使用脚本,诚如你说言,复制粘贴并且修改参数这种活动只需要几分钟的投资就可以获得丰硕的回报。所以简单的使用是广受欢迎的。


但是编写完整程序脚本则不然。一旦涉及到程序思维,这就需要相当的功底和全面的理解。循环和条件处理对于初学者是一个大障碍;而自定义数据和函数则是进入专业程序的领域。并不是他们不会学语法,而是他们缺乏一整如何把问题分解为程序实现的方法论,这只能靠大量的程序训练和在此基础上的深入思考得来。


你的室友可以花半年时间学习编程,这本身就是一个相当大的投资了;对于非理工科的人投资只会更大。


我觉得实际的症结在于需求不大。


比如是对于美工脚本...大部分情况下只需要用现成的;如果小公司有一两个擅长Max / Maya 脚本的,需要写的部分请他们负责帮忙应当是够用了。


对于策划脚本;同样... 复杂的脚本向来是程序员的工作(不过貌似国外很多制作人都是程序出身... 他们都是自己写脚本的样子地说)


如果公司真的认为这个技能能够提高生产力或者对产品质量起到关键作用,他完全可以开短期培训班,或者叫公司里的人成小组辅导嘛。不过又回到原来的问题上了:这样做投资/回报比真的够吸引力么?

我在上本科之前不知道任何一点编程的知识
记得高一时跑去听一个计算机竞赛的辅导,第一堂课讲了变量和赋值,讲到用一个临时变量交换两个变量的值的时候就蒙了,然后就放弃了。现在想想,那时候的思维比较适合学Haskell那样的函数式语言。
然后到了大学要学C。这时候就觉得很好懂了,因为要考二级,狂编了一个多月的各种小程序,算是把C练熟了。到现在最习惯的语言还是C。也就一个学期的时间,基本算是入门了。
后来上课听老师讲八皇后,感觉真是震动:递归还能这么干!然后就开始学一点数据结构和算法。后来还对编译器和语言实现特别有兴趣。我不是计算机系的,因此都是业余爱好。

不是每个人都适合编程的。

你在六岁就能接触电脑,条件真好。我当年一开始学电脑是因为看到了别人的一本计算机书,是apple II 上的basic语言教程。当时很感兴趣,在没有电脑的情况下把书全看了一遍。自己会用纸和笔写出basic程序,然后自己一条语句一条语句的试着运行。

直到我真的开始有电脑课上了,我第一次上机写在纸上的程序不知该怎么弄到电脑里去。

编程需要顿误。。。
这个我同意,

Post a comment

非这个主题相关的留言请到:留言本