要对该学什么有充分了解,若想搞游戏开发(编程部分),除了掌握数学、物理、数据结构相关的一些基础理论外,汇编语言、一门适合游戏开发的高级编程语言、DirectX/OpenGL、某种3D引擎、2D/3D图形学、图象处理学、人工智能(路径搜索、遗传算法等)、加密、压缩、特效实现、碰撞诊测、优化等都可能成为必修课,而对软硬环境、开发范例以及周期模型也要相当熟悉。反之,若只是希望在ASP中用脚本语言操作Access数据库,那么根据所需记住ADO以及SQL的部分用法就算基本完事,更多时间耗在反复又繁琐的数据库配置上。所以,合理架构知识体系是编程学习的初始目标,有些人学了编程很久,读了很多编程书籍,但在编程时仍然感觉无从下手的一个原因就在于知识吸收的不平衡。
到底如何寻求知识体系的完善?软件开发人员的任务是实现待解问题与编程语言以及软硬环境所提供的编程概念之间的抽象,而任何抽象的实现都要求先对抽象双方有足够的认识,进而再基于它们去完成具体的关联。换个角度来看,你一方面要对问题域以及编程概念域所涉及的编程知识有充分掌握,另一方面还要保证抽象实现的成功。其中前者就构成了编程知识体系的外壳,而在它得以满足的条件下,如何顺利完成抽象则成为最具挑战性的问题。抽象在编程中意味着解释关联,此时若什么东西能够帮助你实现这种关联,那必然就是知识体系的核心。
怎样去实现解释关联呢?若很难回答就换个话题:给你一个字典,怎样去查找一个字,譬如“好”的解释?这样答案就很简单,在找到“好”在所在页之后,翻到那里就完毕。然而,即便这一简单任务的实现仍然包含许多小工序(不考虑难易),你要正确选取一个可行的实现方法,比如拼音或笔画索引法,你要正确判断如P.100在P.200之前还是之后等等...实现解释关联也正是这样,建立在抽象双方足够信息之上,电脑程序根本就是一种智能的体现,于是逻辑运用自然成为关键,它决定了怎样把一堆编程概念组织起来去解释一个问题域的概念,也保证了组织的合理与有效,这正是编程知识体系的核心。
在人工智能里的专家系统里面,知识库与推理引擎是最为核心的组件,专家系统的智能与自我进化也就来自于它们的合作。若没有推理引擎,知识库不过是一堆废品,而知识库信息不足,推理引擎也无法得出结论,这也恰是无知所暗示的。同样,架构知识体系也是这样,从职责上讲,你对待解问题、编程语言以及软硬环境所掌握的信息就对应着知识库,而逻辑运用正是推理引擎的任务。若你把自己埋没于知识库的积累中,若仅去关心编程中的各种小技巧,就算你把上千个系统API的名称记得刻骨铭心也很难写出聪明像样的程序来。仔细想想,你会发现这是许多人感觉编程难的主要原因,他们知识架构的发育参差不齐。(这里顺便谈谈自我进化在编程学习中的意义。其实这些年我学过的东西不少,但真正让我感到何谓“学无止境”的却是编程,那四个字简直就是为编程而存在。如今信息技术的日新月异远非你我所能想象,若你不即时更新自己的知识体系,不对编程技术方面的新事物保持旺盛的食欲,那你原本发育良好的知识体系很快就会产生变异,于是你也就落伍了。此刻,我刚读完一篇关于如何用定点数去全全替代浮点数进行运算的文章,若是几年前,这篇文章还有些意义,但如今又有多少人活在386、486时代?)
此处我所谓的数学是对各分支的统称,数学是研究样式的科学,无论是数字、集合还是图形。对于编程,一方面,数学会被直接运用于其中,排开加减乘除这些编程大多要用到的基本算数法则,想象一下编译器、三维引擎、网络协议、人工智能相关、信息编码与加密这些方面的开发能离得开大量数学的运用吗?同样,就在你用SQL写下如Select From Where这类语句时,集合论就已蕴于其中,而黄金分割这类魔术数字也不会平白无故出现在你的脑海中,但若懂得它,你自然会把它用于界面设计。另一方面,数学也常被用来作为一种辅助工具,比如在软件测试中,图论就提供了更为精准严密的逻辑描述方式去配合各种测试模型。
然而,同样把自己视作程序员的网页设计或者网络配置人员,他们就很可能反驳以上观点。就拿我一个朋友来讲,即便是位软件工程师,在电信工作已好几年,却告诉我他从没用过甚至像三角几何这类最基本的数学。好的,忽略程序员的定义在改变、软件应用域在延伸以及软件开发所基于的抽象度在提高这些客观因素,更多时候数学是被间接运用在编程中,也就是通过影响你的思维模式而潜移默化控制着软件的编写,这也是为何数学在逻辑运用中占有着核心地位的原因。数学天生就很逻辑化,这是没什么可比的,多吸收一些数学知识,你运用逻辑的能力自然增强。举个例,若你对布尔逻辑、集合论、命题逻辑、谓词逻辑这些理论有所了解而又习惯于用它们去规范语义,那么在编程时你的逻辑运用自然更为严密。这里严密的产生决不是因为它们能够改变你的智商,而是由于你会逐渐习惯用不同方式去考虑问题。
了解一门编程语言的好与坏并不意味着你就要放弃现有的而转向另一门编程语言以弥补其不足。真正的编程高手是那种对一门编程语言的优劣明了于心,在实际编程中扬长避短,不断寻求平衡点的人。对任何一门编程语言了解得越深入,发现的问题自然也就越多,所以关键并不是追求编程语言的完美,而是怎样去对待这些语言的好与坏。看看如今市面上,哪一门较为普及的编程语言不对应有一两本剖析其缺陷所在的专著?如Java的《Java Pitfalls》、C++的《C++??》,那么这些书的意义何在?若仅是批评两句就没多大意思了,更重要在于若一门编程语言的弱点可以靠更严谨的设计以及经验去共同克服,那么你大可不必另投高明,有多年C开发经验的人都知道此话有多么正确。相反,若一门编程语言存在的问题直接有碍于待开发项目的实现,你就应该转向一门更适合的语言。总归,搞编程千万不要迷信什么,原因很简单,编程是一门科学而不是一种信仰。