写到这个标题,就知道差不多又要有争议了。其实,对于业内的人,真正的“争议”是没有的,每个干过这行的人都知道这回事儿,只不过死神多事,喜欢把地球人都知道的东西用不怎么精练的语言,写到自己的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决定了算法,算法关系着工程的核心结构,对工程的核心结构的设计也反过来影响算法的实现。最终的结果就是互相作用共同补完,完成一个完整的解决方案。认为(所谓的)算法高于工程结构,和认为工程结构高于算法的想法,都太脱离实际了。因矛盾是对立统一的,或许对立,但最终的落脚点,却必须是统一!
高校并不见得要培养出来一大堆能写底层的人,因为那真的很没有必要。还是应该根据人们的喜好,根据软件行业所需要的真正的职位,更加细化这些职位的种类和具体职务,以期为各自安排好各自灿烂光辉的未来,这才是人民的园丁们和园丁组组长们应尽的职责。
分享到:
相关推荐
遗传算法实现寻找二元函数最大值……_GA
15.6 应用…………………………………………………………………………………………………………227 〖案例l〗果园篱笆………………………………………………………………227 〖案例2〗巨人和鬼………………...
"一些基本 算法 Euclid ……"这个标题提及了欧几里得算法,这是一古老的数学算法,主要用于求解两个正整数的最大公约数(Greatest Common Divisor, GCD)。欧几里得算法基于以下原理:对于任何两个正整数a和b(a>b)...
一、设计目的………………………………………………………………………………………4 二、课程设计基本要求……………………………………………………………………………4 三、课程设计内容及安排……………………...
0、 约定 …………………………………………………………………………………………… 5 1、 无符号数一位乘法 …………………………………………………………………………… 7 2、 符号数一位乘法 ……………………...
第一章 人工神经网络………………………………………………… 3 §1.1人工神经网络简介………………………………………………………… 3 ...参考文献…………………………………………………………………………41
/*课后习题1.8-e e. 设双链表表示的线性表L=(a1,a2,……,an),试写一时间复杂度为O(n)的算法, 将L改造为L=(a1,a3,……,an,……,a4,a2)。 void Change(Node* a) */
(1)需求分析…………………………………………………………………………3 (2)设计思想…………………………………………………………………………3 数据结构设计…………………………………………………………...
在C++编程中,我们经常需要处理数学表达式的计算,特别是在算法设计和数值计算领域。题目中的任务是编写一个函数来计算特定的级数和,即 \( n^1 + n^2 + n^3 + \ldots + n^{10} \),其中 \( n \) 可以取值 1、2 或 3...
目 录 前 言 第 1 章 数字 PID 控制………………………………………………………………(1) 1.1PID 控制原理 ……………………………………………………………………(1) 1.2 连续系统的模拟 PID 仿真……………………...
在数学建模领域,理解和应用各种算法是至关重要的。这个压缩包包含的32种算法覆盖了数据分析、微积分、灰色系统、模糊逻辑以及存贮论等多个关键领域,且每种算法都提供了实例和Matlab代码,使得学习者能够更好地理解...
引言………………………………………………………………5 第一章 嵌入式浏览器设计概述 ………………………… 6 1.1目前嵌入式浏览器产品的发展现状 ……………………… 6 1.2嵌入式浏览器的组成和各部份功能说明...
ASP/ACCESS毕业论文:毕业设计综合管理系统(全套论文 代码 演示PPT) 随着计算机及计算机网络的普及和全国各院校的校园网络的日益完善、健全,各种...附录 ……………………………………………………………………48
设双链表表示的线性表L=(a1,a2,……an),试写一时间复杂度为O(n)的算法,将L改造为L=(a1,a3……an……,a4,a2)
电机控制器IGBT结温精准估算:大厂机密算法,全方位保护温度安全,涵盖底层算法库及文档支持,电机控制器,IGBT结温估算(算法+模型)国际大厂机密算法,多年实际应用,准确度良好…… 能够同时对IGBT内部6个三极管和...
"高级IGBT结温估算系统:国际大厂机密算法的解析与实现",Vip4 IGBT结温估算 国际大厂机密算法,多年实际应用,准确度良好…… 能够同时对IGBT内部6个三极管和6个二极管温度进行估计,并输出其中最热的管子对应温度。...
实现B*算法** 实现B*算法通常包括以下步骤: 1. 初始化:设置所有节点的F'(n)、g(n)和E(n),并将起点作为开放列表的第一个元素。 2. 搜索:每次从开放列表中选择F'(n)最小的节点,将其从开放列表移至关闭列表,并...
§1.1 熵…………………………………………………………………………………1 §1.2 计算机与信息……………………………………………………………………5 §1.3 算法复杂性………………………………………………...