其实……我想说……算法并非数学……(废话贴,业内的人就不用看了 *^_^*)

写到这个标题,就知道差不多又要有争议了。其实,对于业内的人,真正的“争议”是没有的,每个干过这行的人都知道这回事儿,只不过死神多事,喜欢把地球人都知道的东西用不怎么精练的语言,写到自己的Blog上而已。丑话在先,请众位大大拍砖请对准目标,不要砸到花花草草,更不要破坏社会主义和谐社会的主旋律。

算法是什么呢?手边一本算法书,一翻开,不是数学,就是逻辑,再多的就是数据结构。让人以为,算法大抵就是这些东西。既然说程序是算法和数据结构为核心的,那么,是不是就意味着数学和逻辑最重要呢?

在大学,第一个遇到的谎言基本上就是这条,高年级学长来看我们,就颇为语重心长地对我们说:“小弟弟呀,小妹妹呀,一定要学好数学呀,一定要学好英语呀,数学和英语没有学好,就等于没经过大学呀……”

在那时,对世界的认识还远没那么深刻,误入骗局也是很正常的。如果说一个人的大学,其价值就仅限于学好两个学科,这大抵就相当于说,一个人的大学,其价值就在于找到另一半一样——只不过是少男少女们梦想中的世界而已。有则加冕,没有,也说明不了什么,因为四年不是一辈子,也决定不了一辈子。决定一辈子的,是每时每刻的行动,在关键时刻把握机会的勇气,在低落时愿意蛰伏、冬眠的耐心,以及永不言败的信念。

数学构成了算法,只因为他是计算机的基础?但是你看谁现在去做一个软件还会去考虑0101编码流的问题?会去考虑什么微积分、概率论?计算机的世界,是一个开放的,多层次的,多极化的世界。越接近底层的,做的人越少——因为市场不会需要那么多。操作系统,全世界来他个数千万种,可以吗?那当然是不可以的。但是,软件的数量却不会下千万了吧?为什么?这个学过唯物辩证法的应该都可以自己推论到:“活的必须立于死的之上”。指令集不死,就不能有立于指令集之上的编译、链接器;编译、链接器不死,就不能有基于这些编译链接器的操作系统;操作系统不死,就不能有基于操作系统的软件;软件不死,就不能有基于这些软件的外挂和插件。

很多时候,我们手边有很多选择,而不是需要自己重新发明轮子,否则OO、GP和重用就没必要诞生了。以游戏引擎来说,除非必要,很多时候,我们在避免让用户直接去做数学运算——否则为什么要提供个SetPosition、SetRotation之类的?告诉用户你直接自己用矩阵和行列式去算,Over~。但那样的话,用户只会对你说一句话:“你玷污了自己的责任!”用户之所以要使用引擎,就是要避免太多逻辑不相干的东西:很多时候,数学也是其一。我在考虑导弹打坦克的时候,当然会去做一下加减乘除,但是当我做路径计算的时候,我却希望物理系统能把一切都搞定别让这些东西来烦我,来影响我的代码质量和可读性。没有人喜欢读一个游戏逻辑代码的时候读到一堆物理和数学算法的。看到的只会破口大骂:“作引擎的!给我死出来!把这些给我封装了!”

数学,太形而下的数学或许不能称为数学,不登大雅之堂,不能放到大学的课堂里玷污教授们的智慧,但,太形而上的数学,难道就应该放到工程之中,玷污工程人员的时间和空间吗?这不是理由。不要把自己看得太高贵,正如不能把自己看得太低俗一样——任何问题,都应该用平静的心态,考虑对方的感受。数学并不是一切,没用的数学和没用的代码一样,垃圾就是垃圾。

在一个写游戏项目的人的眼中,矩阵A叉乘矩阵B大抵是没有什么吸引力的,他的主要工作是很具体的。美国鬼子每秒钟六发的火力强度,把土、树枝甚至树干都轰到了天上,如何表现?美国鬼子咣咣冲上上甘岭来,(为突出真实感)怎么让这帮傻子不要站的那么密集?(背景上)我军机枪手突突猛射,手榴弹砰砰猛扔,怎么样能保证别在同屏幕内显示太多的炸点,以防粒子系统超载?我军狙击手怎么优先寻找鬼子的指挥官K掉?眼看到阵地将要丢失,一个英雄紧握爆破筒,向着步话机大喊一声“向我开炮”,纵身一跃,同上来的泡菜和鬼子同归于尽,怎么突出这悲壮而伟大的气氛?!………。这些东西没一个属于微积分、组合数学、线性代数的处理范畴的,也不要自说自话的告诉我写这些玩意儿得需要有多高深的数学知识——随随便便一个有起码逻辑能力的人,只要告诉他脚本怎么写,花点时间熟悉熟悉都能写出来——当然前提是得有一个好的中间层,把能封装的都封装了。

我想问:这些是算法吗?你说不是,当然,它或许不是你认为的算法,但是,它却是组成游戏的成千上万的逻辑单位中的一个。

做企业软件,没做过,但只怕更甚。用户的需求、设计,很多时候,编码做的只不过是UI界面上,按了A处理A,按了B,关掉C,按了D,开启C之类的工作。

我想问:这是算法吗?你又说不是,当然,它不是你心中的算法,但是,它却是组成整个项目的成千上万逻辑单位中的一组。

算法到底是什么?你说,算法就是那些个算法教材上写的那些:排序呀,图论呀,哈希表呀,二叉树呀……我哼哼冷笑,如果软件设计到了21世纪,还得要像半个世纪前那样全民排序全民链表,那我们这些搞软件的就可以集体自杀以谢国民了!或者是集体挖坑自己把自己坑了免得让人批判,揪斗,住牛棚,扔狗窝——软件作了半个世纪,我们这些后来人却居然连祖辈们的水平都超不过,确实可以自杀了。我坦白,我基本除了学校里写的那些垃圾代码外,就没再写过HashMap,但是这并不妨碍我使用std::hash_map。同时,在使用hash_map时,我发现我跟同行交流更方便了。他们甚至不用问,“老李,你丫用的是什么数据结构,什么算法?”他们一看hash_map,一看for_each,一看remove_if,都知道了,连注释都不用。这样的方便,这样的优秀,这样的完美的C++标准库,我们却使用了,我们被异化了,我们中的很多人,居然会不懂哈希表了,不懂图论,不懂这个那个了,我们确实该死!非常该死!众位前朝的遗老遗少们,全力地炮轰我们吧!

但,你看到半个世纪前的软件业有现在这么繁荣吗?

将算法和工程严格对立的做法,就如同把鱼儿剥离了水缸一样,除了说你清高,真的没脸再夸你什么了。会写个graph库,真的都不好意思问问你写的graph库比boost::graph强到哪里?效率高了?扩展性强了?还是别的什么?

没错,你可以诅咒我离开了boost和C++标准库什么都干不了,虽然你指责的很无端很没有道理,但我就假设你说的是真的,那我离开键盘和鼠标还干不了活了呢!这又怎么说?!任何事物的发展,都是新事物立足在旧事物的尸体之上,没有旧事物心甘情愿的死亡,是不可能有新事物的诞生的。如果现在还是打孔穿孔的时代,还会有多少人去用计算机呢?如果现在还是5寸大饼的时代,还有多少人能用Windows、Office、Ubuntu呢?

然而,事实证明,旧事物并不是真的“死”了,而是以更加建设性的态度,参与了新事物的世界。C语言、x86汇编,死了吗?没死,因为操作系统的编码还是需要他的。它没有死,反而因为人少了而更加珍贵。传统意义上的算法,也是一样,它不会死的,也会因为做的人越来越少,而越来越珍贵。少数人为多数人准备底层,多数人放弃包袱,更加关注自己的模块和功能。这就是世界,多层次,多极化,但却能共同协作的世界。

传统的算法,我们当然应该了解,事实上,从高校出来的基本都有所了解。只是希望,切莫再有一个愚蠢的声音告诉我们:“数学就是算法,算法就是一切……”。非也!你们所谓的算法没那么高贵,该让他走下神坛了,实际的、具体的、下里巴的、形而下的工程和虚拟的、抽象的、象牙塔的、形而上的传统意义的算法共同作用,才能构建好一个软件的内涵和外延。

算法离不开工程,就正如工程离不开算法一样,一两个核心算法的效率考虑,很可能关系到整个工程核心模块的结构组织,再松耦合的工程设计也不可能做到对逻辑的无关耦合。而在对这一两个核心算法进行考虑时,又往往离不开对相关专业的具体工具和API的熟悉和掌握。这就正如,从Direct3D的保留模式转化到立即模式——调用的方法和习惯都变了,你怎么保证算法设计会一样?又怎么可能保证“松耦合”?也正如,农业软件和游戏软件,工业流程软件和企业流程软件,适用的范围不同,算法的设计又怎么可能相同?!

底层的工具、硬件结构和API决定了算法,算法关系着工程的核心结构,对工程的核心结构的设计也反过来影响算法的实现。最终的结果就是互相作用共同补完,完成一个完整的解决方案。认为(所谓的)算法高于工程结构,和认为工程结构高于算法的想法,都太脱离实际了。因矛盾是对立统一的,或许对立,但最终的落脚点,却必须是统一!

高校并不见得要培养出来一大堆能写底层的人,因为那真的很没有必要。还是应该根据人们的喜好,根据软件行业所需要的真正的职位,更加细化这些职位的种类和具体职务,以期为各自安排好各自灿烂光辉的未来,这才是人民的园丁们和园丁组组长们应尽的职责。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值