A Little Fool

Fool For Free.

博客园 首页 新随笔 联系 订阅 管理
  132 Posts :: 0 Stories :: 40 Comments :: 0 Trackbacks

置顶随笔 #

eplaylity 翻译的:

SDL游戏教程第一课 课程基础

SDL游戏教程第二课 坐标与块复制

SDL游戏教程第三课 消息(Events)

SDL游戏教程第四课 井字游戏

SDL游戏教程第五课 动画

 

 附带的SDL教程:

SDL 图像

 

 

 

我自己翻译的:

SDL游戏教程第六课 实体 (Entities)

 

SDL游戏教程第七课 地图 (Maps)

 

 

附带的SDL教程:

SDL 声音库 (SoundBank)

 

 

 

 

 

 

 

posted @ 2009-03-21 15:45 Henry Read 阅读(147) | 评论 (2)编辑

[C/C++ 书籍合集]C/C++ eBooks Collection (updating...)

 

 

[PYTHON 书籍合集]PYTHON eBooks Colletion (updating....)

 

 

[Java 电子书合集]Java eBooks Collection (Updating....)

 


[PHP 书籍合集]PHP eBooks Colletion (updating...)

 

[JavaScript书籍合集]JavaScript eBooks Colletion


 [Ajax 电子书合集] Ajax eBooks Colletion

 

[Lisp/Scheme书籍合集]Lisp And Scheme eBooks Collection

 

[Perl书籍合集]Perl eBooks Collection

 

计算机网络(Computer Networks)相关书 下载


posted @ 2009-01-21 00:46 Henry Read 阅读(414) | 评论 (0)编辑

2009年6月27日 #

级别: 初级

Peter Eeles, 高级 IT 架构师, IBM

2006 年 3 月 15 日

来自于 Rational Edge:在电影制作术语中,软件项目经理被称作制作人,因为他们决定需要做什么事情。而软件构架师就是导演,他来决定所作的事情是否正确,并且他要保证产品符合投资人的要求。下面这篇文章就是描述软件构架师的。

illustration 这篇文章是关于软件构架的系列文章(共四篇)中的第二篇。上个月,这个系列文章中的第一篇给构架作了一个定义。因此现在我们可以把注意力集中到创建构架的人员——构架师身上。软件构架师被证明是软件开发项目过程中最具挑战性的角色。软件构架师是项目的技术领袖,并且从技术角度来讲,他承担了项目成败的责任。

下面是电气及电子工程师协会给“构架师”做的定义:

[构架师是]负责系统构架的人,团队或者组织。 1

作为项目的技术主管,构架师的技术需要非常的广泛,这比技术深度更加重要(当然构架师在特定的领域需要一定的技术深度)。

软件构架师是技术主管

首先,软件构架师是技术主管,这意味着除了他要有技术上的技能外,还要有很好的领导才能。构架师的领导能力在团队中和项目质量控制中起着十分重要的作用。

在 团队中,构架师是项目的技术总管,他需要有丰富的知识背景,以便作出技术上的决定。相对于构架师来说,项目经理是来管理项目的资源,时间进度和花费的。使 用电影制作来做类比的话,项目经理就是制片人(他要确定工作被完成了),而构架师是导演(他需要确定工作被正确的完成)。由于他们在项目中所处的位置,构 架师和项目经理是公众人物,在一个团队中,他们是整个项目所涉及的所有人员的联系枢纽。构架师应该为建立软件构架争取投资,并且要明确建立软件构架能给组 织带来的价值。

构架师还要把团队组织在构架周围,并且要积极地投入到计划活动上,因为要把构架转化成为完成任务的先后顺序,这样才能及时地确定在什么位置需要什么技术。有一点需要注意,由于构架师能否成功与团队的整体水平有很大关系,所以构架师应该参与团队新成员录用的面试。

根 据构架师所拥有的能力,他可以同时参与其他团队的工作。构架师需要根据具体的实例情况来做领导决定,并且在决定过程中要展现出足够的自信。一个成功的构架 师是以人为导向的,并且像一个教练一样给他的团队安排工作时间。这对于小组的成员来说是有好处的,他们可以及时得到帮助。这是整个团队的一个巨大财富。

构架师还要把精力放在切实工作的交付上,他是技术方面的推进力量。构架师需要做决定(经常需要在压力下做决定),并且要保证这些决定是经过成员之间的交流的,并且确保它能够执行。

架构师可能是有一个小组来完成的

下面介绍一个人和一个角色的区别。一个人可以扮演很多角色(例如,Mary是一个开发人员,同时也是一个测试人员),同时,一个角色可以有很多的人扮演 (例如,Mary和John都是测试人员)。构架师的角色需要非常广泛的技术,这就为什么构架师的角色经常是很多人同时担当。这样可以使技术知识在小组中 传播开来,每一个人都把他的或者她的经验带到工作中。特别是当某种技术同时被商业部门和技术小组理解的时候,这项技术就会最大程度的传播开来。小组所作的 结果,需要被"平衡。" 贯穿整个文章的术语"构架师",是指的一个人或者整个小组的成员。

[一个小组]是一些拥有各种技术的人的集合,他们之间有共同需要完成的目标,并且之间相互负责任。 2

如果一个小组来担当构架师的角色,那么就需要有一个人作为这些构架师的领导,他要拥有整体的前景,并且需要调节构架师小组之间的问题。如果没有这种调节,构架师小组成员之间就会存在危险,他们可能不会建立出一个紧密地构架或者决策不会被成功的完成。

现在有一个新的概念在构架师小组中被提出:为了使成员之间达到共同的目的和目标,团队为构架师小组建立并发布了一个章程。 3

好 的构架师知道自己的强项和弱点在哪里。无论构架师的角色被一个人还是一个小组担当,他们背后都有"值得信赖的顾问"的支持。他们可以通过和其他构架师协同 工作来弥补自身在某些技术方面的不足。最好的构架通常是被一个构架师小组建立的,而不是一个人。原因很简单,一个小组的力量总要比一个人的知识丰富的多。

构 架师小组的概念有一个缺陷,他们有时被团队中的其他人认为是在"象牙塔"里工作,因为他们的产品经常是很有智慧的但却没有使用价值。这种误解可以从开始就 把它减到最小:1)确保所有的涉众都能积极地协商,2)不断的交流构架和它的价值,3)在执行过程中要有组织策略的意识。

构架师应该理解软件开发过程

构 架师应该对软件开发过程有正确的估计,因为这个过程确保小组中的所有成员使用同等的方式工作。一个好的过程需要定义各个角色的工作承担责任, 产品的建立,不同角色之间的协同工作等等。由于构架师每天的工作都需要和很多小组成员打交道,所以对于他们来说了解工作的职责是非常重要的。在每天的工作 中,开发小组经常要找到构架师,了解该做什么工作以及怎么去做。这就是软件构架师和项目经理之间的细微差别。

软件构架师需要有商业领域的知识

尽管拥有了丰富的软件开发经验,但是我们还期望(或者是要求)构架师拥有一定商业领域的知识。

[一个领域]是在一个范围内工作的从业人员使用一系列特定的概念和术语来表达这个领域内的知识。 4

这 种知识将会使构架师更好的理解系统的需求,并把精力投身于其中,确保系统的需求是合适的——例如,从构架师领域的角度出发,需求是要被准确捕获的。经常会 出现这样的情况,一个特定系列的构架样式可以被应用到与它相联系的一个特定的领域中。如果构架师知道这种映射关系,那么对他的工作将是很大的帮助。

因此,一个好的构架师将会在软件开发和商业领域的知识上面做出权衡。如果一个构架师具有很好的软件开发经验但是不了解商业领域,那么他的解决方案可能不会解决实际的问题,而仅仅只能反映出构架师是多么精通他的专业。

另 外一个构架师需要精通商业领域知识的原因是,构架师要能够预见软件构架随时可能出现的变化。由于软件构架受它被配置的环境的影响非常大,所以对商业领域有 正确理解的构架师,可以从软件构架的角度,对不断变化的情况做出更有远见的决策。例如,如果构架师发觉哪种新的标准在未来很可能成为主流,那么他将会使自 己的软件构架在可用寿命内符合这种标准。

软件构架师应该拥有技术知识

软 件构架的一个特定方面需要有一定的专业知识,因此一个构架师必须具备这个水平的知识才能够胜任他的工作。可是构架师不必成为技术专家,这体现了这篇文章第 一部分的思想——构架师宏观上的决策。因此,构架师只需要了解宏观上的问题,而不必关心细节化的事情。由于技术的变化过于频繁,所以构架师要随时与这些变 化保持同步。

软件构架师应该拥有很好的设计技巧

虽 然软件构架并不仅仅是设计,但是设计无疑是很重要的一个组成部分。构架师应该拥有很好的设计技巧,因为软件的构架包含整个软件的关键性设计决策。这种决定 包括软件主要结构的设计决策,特定部分的选择以及指导的说明文档等等。为了确保系统构架的完整性,上面那些要素都要被特别的应用到设计中,这对整个系统的 成功完成有很大的作用。因此这些要素需要有固定的拥有设计技巧的人来负责——这个人就是构架师。

软件构架师需要拥有很好的程序设计技巧

开 发人员是整个项目开发过程中最重要的一个小组之一,构架师要随时和他们保持联系。毕竟他们要确保软件在最后交付使用的时候能够成功的执行。如果构架师认为 开发人员的工作是十分有价值的,那么他们之间的交流将会很有效用。因此,软件构架师需要拥有一定的程序设计技术,即使不需要他们编写程序。

大 多数成功的构架师,在一些场合中都是核心程序员,这些场合通常是他们的职业方向。即使是技术发展了,有新的程序语言出现,一个好的构架师可以把以前学过的 设计语言的概念和新的语言联系起来,以达到对新语言更加深入的了解。没有这种知识,软件构架师就不能对需要执行的构架的重要元素做出完美的决策,例如执行 的组织和程序标准的采用。这会使的软件构架师和开发人员之间产生沟通上的障碍。

构架师是一个很好的沟通员

和以上提到的几种技术比起来,构架师的沟通能力是最重要的。构架师需要精通所有的沟通手段,特别是需要有一定的语言能力,包括说,写和演讲能力。交流是双向的,所以构架师还需要是一个很好的聆听者与观察者。

小 组成员之间有效的沟通是项目成功的基本条件。为了更好的理解投资人的需求,与他们的沟通显得尤为重要,同时还能够让所有的投资人在软件构架上达成共识。与 项目小组的沟通同时也很重要,因为构架师的职责不单单是把信息传达给小组,同时还要激励他们工作。构架师还要负责把系统的构想传达给小组成员,使得它们让 全组人员了解,而不仅仅是构架师自己理解。

构架师需要做出决策

构 架师不能在自己不了解的环境中做出决策,然而项目的开发周期也没有给他提供充足的时间去探索所有的环境,所以在很大的压力下做的决策不太可能成功。这种环 境是被期望的,成功的构架师非常满意这种环境,而不愿去改变它。因此构架师需要是厚脸皮的,因为他们很可能在项目开发过程中更正自己的决定,并且按原路返 回查找问题。正如Philippe Kruchten所说的:“软件构架师的一生是一个漫长的,在黑暗中不断摸索并不断改进自己的决定的过程”。 5

一个糟糕的决策很可能毁掉一个项目。项目小组中的其他成员会对构架师失去信心,这时项目经理就要参与进来,因为等待构架的完善不会让项目有所进展。最危险的情况是:如果构架师没有把自己的决策文档化,那么小组的其它成员可能会自己制定决策,而这种决定很可能是错误的。

软件构架师需要觉察组织的政策

一 个成功的构架师不会只关心技术问题,他们还会关心组织的权力动向,时刻了解团队的决定权在哪里。这可以保证他们正在和正确的人讨论项目的决策问题。忽略团 队的权力是天真的想法。现实往往是这样的:团队经常会强迫项目小组在规定时间交付系统,这需要构架师正确的评估到这个时间。

软件构架师是一个谈判代表

为 了了解软件构架的很多尺度问题,构架师需要随时和投资人沟通。这种沟通常常需要谈判技巧。例如,构架师需要特别注意的一件事是:最小化项目中可能出现的风 险,因为这直接关系到系统构架的稳定性。由于风险是和需求紧密相连的,所以可以通过移除或者减小这方面的需求来降低风险。因此把这种需求取消,需要构架师 和投资人达成共识的。这就需要构架师是一个有效的谈判人员,来权衡这些问题。

总结

这篇文章介绍了软件构架师的一些工作。这个系列中的下几篇将介绍软件构架过程的特性,以及把软件构架作为IT资产的基础处理的好处。

鸣谢

这篇文章来源于下面这本书,书名暂定为:“软件构架构建的过程”;下面我要感谢为这篇文章中作注释的人 员:Grady Booch,Dave Braines,Alan Brown,Mark Dickson,Luan Doan-Minh,Holger Heuss,Kelli Houston,Philippe Kruchten,Nick Rozanski,Dave Williams以及Eoin Woods。

注释

1 IEEE 计算机协会, IEEE 推荐的软件密集型系统架构描述的实践:IEEE 标准 1471-2000。

2 Jon R. Katzenbach 和 Douglas K. Smith 合著的Wisdom of Teams。 Harvard Business School 出版社1993.

3 Philippe Kruchten, "The Architects -- The Software Architecture Team," Proceedings of the First Working IFIP Conference on Software Architecture (WICSA1). Patrick Donohoe (editor). Kluwer Academic Publishing 1999.

4 Grady Booch, James Rumbaugh 和 Ivar Jacobson, The Unified Modeling Language User Guide. Addison Wesley 1999。

5 Philippe Kruchten, Op. cit.



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文


关于作者

Author Photo

Peter Eeles为IBM Rational和IBM Software Group工作,他职业生涯大部分时间从事构架和执行大型分布式系统。在英国,他协助一些组织使用Rational Unified Process 和IBM Software Development Platform。他是"Building J2EE Applications with the Rational Unified Process" (Addison-Wesley, 2002), "Building Business Objects" (John Wiley and Sons, 1998)的合著者之一,并且是"Software Architectures" (Springer-Verlag, 1999)的作者之一。


posted @ 2009-06-27 13:25 Henry Read 阅读(29) | 评论 (0)编辑

2009年6月3日 #

FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能!

看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

参数:FOR有4个参数 /d   /l   /r   /f   他们的作用我在下面用例子解释
%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他;
IN:命令的格式,照写就是了;
(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下面的例子
do:命令的格式,照写就是了!
执行的命令:对每个变量的值要执行什么操作就写在这.

可以在CMD输入for /?看系统提供的帮助!对照一下
FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command    指定对每个文件执行的命令。
command-parameters
             为特定命令指定参数或命令行开关。


现在开始讲每个参数的意思

/d
仅为目录
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目

录(而不是指定目录中的文件组)执行指定的 Command。

系统帮助的格式:FOR /D %%variable IN (set) DO command
他主要用于目录搜索,不会搜索文件,看这样的例子

@echo off
for /d %%i in (*) do @echo %%i
pause

把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来

@echo off
for /d %%i in (???) do @echo %%i
pause

这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了


思考题目:

@echo off
for /d %%i in (window?) do @echo %%i
pause

保存到C盘下执行,会显示什么呢?自己看吧!
/D参数只能显示当前目录下的目录名字,这个大家要注意!

/R
递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是

当前目录。如果 Set 只是一个句点 (.),则只枚举目录树。
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command

上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比

/D强大多了!
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!

@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause

咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部

的EXE文件都列出来了,这里的c:\就是目录了。

再来一个
@echo off
for /r %%i in (*.exe) do @echo %%i
pause

参数不一样了,这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这

个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出

来!!!


/L
迭代数值范围
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)

。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。

如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执

行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:

系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command

例如:

@echo off
for /l %%i in (1,1,5) do @echo %%i
pause

保存执行看效果,他会打印从1 2 3 4 5 这样5个数字
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!

再看这个例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause

执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,

我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!

当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535

看完这个被我赋予破坏性质的参数后,我们来看最后一个参数

/f

含有/F的for详细说明

含有/F的for有很大的用处,在批处理中使用的最多,用法如下:
格式:
FOR /F ["options"] %%i IN (file) DO command

FOR /F ["options"] %%i IN ("string") DO command

FOR /F ["options"] %%i IN ('command') DO command

这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file代表一个或多个文件

string 代表字符串

command代表命令

["options"] 可选

对于FOR /F %%i IN (file) DO command

file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。

假如文件a.txt中有如下内容:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

你想显示a.txt中的内容,会用什么命令呢?当然是type,type a.txt

for也可以完成同样的命令:

for /f %%i in (a.txt) do echo %%i

还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,

{"第1行第1列 第1行第2列 第1行第3列", //第一个元素

"第2行第1列 第2行第2列 第2行第3列", //第二个元素

"第3行第1列 第3行第2列 第3行第3列"}   //第三个元素

集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。

具体过程:

用%%i代替"第1行第1列 第1行第2列 第1行第3列",执行do后面的echo %%i,显示"第1行第1列 第1行第2列 第1行第3列",

用%%i代替"第2行第1列 第2行第2列 第2行第3列",执行echo %%i,显示"第2行第1列 第2行第2列 第2行第3列",

依次,直到每个元素都代替完为止。

为了加强理解/f的作用,请执行一下两个命令,对比即可明白:

for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中
的内容。

for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。

通过上面的学习,我们发现for /f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。

它们就是:delims和tokens

delims 用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键

比如,还是上面的文件,我们执行下面的命令:

for /f "delims= " %%i in (a.txt) do echo %%i

显示的结果是:

第1行第1列
第2行第1列
第3行第1列

为什么是这样的呢。因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。

执行过程是:

将第一个元素"第1行第1列 第1行第2列 第1行第3列"分成三个元素:"第1行第1列" "第1行第2列" "第1行第3列",它默认只取第一个,即"第1行第1列",然后执行do后面的命令,依次类推。

但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?

这时候,tokens跳出来说,我能做到。

它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。

还是上面的例子,执行如下命令:

for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i

执行结果:

第1行第2列
第2行第2列
第3行第2列

如果要显示第三列,那就换成tokens=3。

同时tokens支持通配符*,以及限定范围。

如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。

此时的命令为:

for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

怎么多出一个%%j?

这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。

并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j

执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。

比如:

for /f "tokens=* delims= " %%i in (a.txt) do echo %%i

执行结果为:

第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。

再如:

for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩余的所有

最后还有skip合eol,这俩个简单,skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。

比如:

for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

结果为:

第3行第1列 第3行第2列 第3行第3列

用skip来告诉for跳过前两行。

如果不加tokens=*的话,执行结果为:

第3行第1列

不知道怎么回事。

再如,当a.txt内容变成:

.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

执行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i结果是:

第3行第1列 第3行第2列 第3行第3列

用eol来告诉for忽略以"."开头的行。

同样也必须加tokens=*,否则只会显示"第3行第1列"

posted @ 2009-06-03 19:43 Henry Read 阅读(114) | 评论 (0)编辑

2009年6月2日 #

作者:51CTO 联盟会员:项目管理者联盟 转载
  为了使软件文档能起到前节所提到的多种桥梁作用,使它有助于程序员编制程序,有助于管理 人员监督和管理软件开发,有助于用户了解软件的工作和应做的操作,有助于维护人员进行有效 的修改和扩充,文档的编制必须保证一定的质量。质量差的软件文档不仅使读者难于理解,给使用者造成许多不便,而且会削弱对 软件的管理(管理人员难以确认和评价开发工作的进展),增高软件的成本(一些工作可能被迫返工),甚至造成更加有害的后果 (如误操作等)。  

  造成软件文档质量不高的原因可能是:  

  · 缺乏实践经验,缺乏评价文档质量的标准。  

  · 不重视文档编写工作或是对文档编写工作的安排不恰当。  

   最常见到的情况是,软件开发过程中不能按给出的进度, 分阶段及时完成文档的编制工作,而是在开发工作接近完成时集中人力和时间专门编写文档。另一方面,和程序工作相比,许多 人对编制文档不感兴趣。于是在程序工作完成以后,不得不应付一下,把要求提供的文档赶写出来。这样的做法不可能得到高质量的文档。实际上,要得到真正高质 量的文档并不容易,除去应在认识上对文档工作给予足够的重视外,常常需要经过编写初稿,听取意见进行修改,甚至要经过重新改写的过程。  

  高质量的文档应当体现在以下一些方面:  

  ①针对性  

  文档编制以前应分清读者对象,按不同的类型、不同层次的读者,决定怎样适应他们的需要。例如,管理文档主要是面 向管理人员的,用户文档主要是面向用户的,这两类文档不应像开发 文档(面向软件开发人员)那样过多地使用软件的专业术语。  

  ②精确性  

  文档的行文应当十分确切,不能出现多义性的描 述。同一课题若干文档内容应该协调一致,应是没矛盾的。  

  ③清晰性  

  文档编写应力求简明,如有可能,配以适当的图 表,以增强其清晰性。  

  ④完整性  

  任何一个文档都应当是完整的、独立的,它应自成体系 。例如,前言部分应作一般性介绍,正文给出中心内容 ,必要时还有附录,列出参考资料等。同一课题的几个文档之间可能 有些部分相同,这些重复是必要的。例如,同一项目的用户手册和操 作  
册中关于本项目功能、性能、实现环境等方面的描述是没有差别 的。特别要避免在文档中出现转引其它文档内容的情况。比如,一  
些段落并未具体描述,而用"见××文档××节"的方式,这将给 读者带来许多不便。  

  ⑤灵活性  

   各个不同的软件项目,其规模和复杂程度有着许 多实际差别,不能一律看待。图6所列文档是针对中等规模的软件而言的。对于较小的或比较简单的项目,可做适当调整或合 并。比如,可将用户手册和操作手册合并成用户操作手册;软件需求说明书可包括对数据的要求,从而去掉数据要求说明书;概要设 计说明书与详细设计说明书合并成软件设计说明书等。  

  ⑥可追溯性  

  由于各开发阶段编制的文档与各阶段完成的工 作有着紧密的关系,前后两个阶段生成的文档,随着开发工作的逐步 扩展,具有一定的继承关系。在一个项目各开发阶段之间提供文档 必定存在着可追溯的关系。例如,某一项软件需求,必定在设计说明 书,测试计划以至用户手册中有所体现。必要时应能做到跟踪追查。

posted @ 2009-06-02 00:16 Henry Read 阅读(38) | 评论 (0)编辑

2009年5月31日 #


我们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢?

将下列原则应用到你的软件工程中,你会获得立杆见影的成果。

1. 人远比技术重要

你 开发软件是为了供别人使用,没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平,因为他们那时侯将 主要精力都集中在技术上。显然,构件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的东西。但是对于用户来说,如果你设计的软件很难使用或者不能满足他们的需求,后台用再好的技术也于事无补。多 花点时间到软件需求和设计一个使用户能很容易理解的界面上。

2. 理解你要实现的东西

好的软件设计人员把大多数时间花费在建立系统模型上,偶尔写一些源代码,但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。

3. 谦虚是必须的品格

你 不可能知道一切,你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作,因为软件开发所用到的工具和技术是在不断更新的。而且,一个人也 不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说,每天可以学习很多新东西(如果愿意的 话)。

4. 需求就是需求

如果你没有任何需求,你就不要动手开发任何软件。成功的软件取决于时间(在用户要求的时间内完成)、预算和是否满足用户的需求。如果你不能确切知道用户需要的是什么,或者软件的需求定义,那么你的工程注定会失败。

5. 需求其实很少改变,改变的是你对需求的理解

Object ToolSmiths公司(www.objecttoolsmiths.com) 的Doug Smith常喜欢说:“分析是一门科学,设计是一门艺术”。他的意思是说在众多的“正确”分析模型中只存在一个最“正确”分析模型可以完全满足解决某个具 体问题的需要(我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注)。

如果需求经常改动,很可能是你没有作好需求分析,并不是需求真的改变了。

你可以抱怨用户不能告诉你他们想得到什么,但是不要忘记,收集需求信息是你工作。

你可以说是新来的开发人员把事情搞得一团糟,但是,你应该确定在工程的第一天就告诉他们应该做什么和怎样去做。

如果你觉得公司不让你与用户充分接触,那只能说明公司的管理层并不是真正支持你的项目。

你可以抱怨公司有关软件工程的管理制度不合理,但你必须了解大多同行公司是怎么做的。

你可以借口说你们的竞争对手的成功是因为他们有了一个新的理念,但是为什么你没先想到呢?

需求真正改变的情况很少,但是没有做好需求分析工作的理由却很多。

6. 经常阅读

在这个每日都在发生变化的产业中,你不可能在已取得的成就上陶醉太久。

每个月至少读2、3本专业杂志或者1本专业书籍。保持不落伍需要付出很多的时间和金钱,但会使你成为一个很有实力的竞争者。

7. 降低软件模块间的耦合度

高耦合度的系统是很难维护的。一处的修改引起另一处甚至更多处的变动。

你可以通过以下方法降低程序的耦合度:隐藏实现细节,强制构件接口定义,不使用公用数据结构,不让应用程序直接操作数据库(我的经验法则是:当应用程序员在写SQL代码的时候,你的程序的耦合度就已经很高了)。

耦合度低的软件可以很容易被重用、维护和扩充。

8. 提高软件的内聚性

如果一个软件的模块只实现一个功能,那么该模块具有高内聚性。高内聚性的软件更容易维护和改进。

判断一个模块是否有高的内聚性,看一看你是否能够用一个简单的句子描述它的功能就行了。如果你用了一段话或者你需要使用类似“和”、“或”等连词,则说明你需要将该模块细化。

只有高内聚性的模块才可能被重用。

9. 考虑软件的移植性

移植是软件开发中一项具体而又实际的工作,不要相信某些软件工具的广告宣传(比如java 的宣传口号write once run many ? 译者注)。

即使仅仅对软件进行常规升级,也要把这看得和向另一个操作系统或数据库移植一样重要。

记得从16位Windows移植到32位windows的“乐趣”吗 ?当你使用了某个操作系统的特性,如它的进程间通信(IPC)策略,或用某数据库专有语言写了存储过程。你的软件和那个特定的产品结合度就已经很高了。

好的软件设计者把那些特有的实现细节打包隐藏起来,所以,当那些特性该变的时候,你的仅仅需要更新那个包就可以了。

10. 接受变化

这是一句老话了:唯一不变的只有变化。

你应该将所有系统将可能发生的变化以及潜在需求记录下来,以便将来能够实现(参见“Architecting for Change”,Thinking Objectively, May 1999)

通过在建模期间考虑这些假设的情况,你就有可能开发出足够强壮且容易维护的软件。设计强壮的软件是你最基本的目标。

11. 不要低估对软件规模的需求

Internet 带给我们的最大的教训是你必须在软件开发的最初阶段就考虑软件规模的可扩充性。

今天只有100人的部门使用的应用程序,明天可能会被有好几万人的组织使用,下月,通过因特网可能会有几百万人使用它。

在软件设计的初期,根据在用例模型中定义的必须支持的基本事务处理,确定软件的基本功能。然后,在建造系统的时候再逐步加入比较常用的功能。

在设计的开始考虑软件的规模需求,避免在用户群突然增大的情况下,重写软件。

12. 性能仅仅是很多设计因素之一

关注软件设计中的一个重要因素--性能,这好象也是用户最关心的事情。一个性能不佳的软件将不可避免被重写。

但是你的设计还必须具有可靠性,可用性,便携性和可扩展性。你应该在工程开始就应该定义并区分好这些因素,以便在工作中恰当使用。性能可以是,也可以不是优先级最高的因素,我的观点是,给每个设计因素应有的考虑。

13. 管理接口

“UML User Guide”(Grady Booch,Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999)中指出,你应该在开发阶段的早期就定义软件模块之间的接口。

这有助于你的开发人员全面理解软件的设计结构并取得一致意见,让各模块开发小组相对独立的工作。一旦模块的接口确定之后,模块怎样实现就不是很重要了。

从根本上说,如果你不能够定义你的模块“从外部看上去会是什么样子”,你肯定也不清楚模块内要实现什么。

14. 走近路需要更长的时间

在软件开发中没有捷径可以走。

缩短你的在需求分析上花的时间,结果只能是开发出来的软件不能满足用户的需求,必须被重写。

在软件建模上每节省一周,在将来的编码阶段可能会多花几周时间,因为你在全面思考之前就动手写程序。

你为了节省一天的测试时间而漏掉了一个bug,在将来的维护阶段,可能需要花几周甚至几个月的时间去修复。与其如此,还不如重新安排一下项目计划。

避免走捷径,只做一次但要做对(do it once by doing it right)。

15. 别信赖任何人

产品和服务销售公司不是你的朋友,你的大部分员工和高层管理人员也不是。

大部分产品供应商希望把你牢牢绑在他们的产品上,可能是操作系统,数据库或者某个开发工具。

大部分的顾问和承包商只关心你的钱并不是你的工程(停止向他们付款,看一看他们会在周围呆多长时间)。

大部分程序员认为他们自己比其他人更优秀,他们可能抛弃你设计的模型而用自己认为更好的。

只有良好的沟通才能解决这些问题。

要明确的是,不要只依靠一家产品或服务提供商,即使你的公司(或组织)已经在建模、文档和过程等方面向那个公司投入了很多钱。

16. 证明你的设计在实践中可行

在设计的时候应当先建立一个技术原型, 或者称为“端到端”原型。以证明你的设计是能够工作的。

你应该在开发工作的早期做这些事情,因为,如果软件的设计方案是不可行的,在编码实现阶段无论采取什么措施都于事无补。技术原型将证明你的设计的可行性,从而,你的设计将更容易获得支持。

17. 应用已知的模式

目前,我们有大量现成的分析和设计模式以及问题的解决方案可以使用。

一般来说,好的模型设计和开发人员,都会避免重新设计已经成熟的并被广泛应用的东西

18. 研究每个模型的长处和弱点

目 前有很多种类的模型可以使用,如下图所示。用例捕获的是系统行为需求,数据模型则描述支持一个系统运行所需要的数据构成。你可能会试图在用例中加入实际数 据描述,但是,这对开发者不是非常有用。同样,数据模型对描述软件需求来说是无用的。每个模型在你建模过程中有其相应的位置,但是,你需要明白在什么地 方,什么时候使用它们。
可以参照图链接

19. 在现有任务中应用多个模型

当你收集需求的时候,考虑使用用例模型,用户界面模型和领域级的类模型。

当你设计软件的时候,应该考虑制作类模型,顺序图、状态图、协作图和最终的软件实际物理模型。

程序设计人员应该慢慢意识到,仅仅使用一个模型而实现的软件要么不能够很好地满足用户的需求,要么很难扩展。

20. 教育你的听众

你花了很大力气建立一个很成熟的系统模型,而你的听众却不能理解它们,甚至更糟-连为什么要先建立模型都不知道。那么你的工作是毫无意义的。

教给你开发人员基本的建模知识;否则,他们会只看看你画的漂亮图表,然后继续编写不规范的程序。

另外, 你还需要告诉你的用户一些需求建模的基础知识。给他们解释你的用例(uses case)和用户界面模型,以使他们能够明白你要表达地东西。当每个人都能使用一个通用的设计语言的时候(比如UML-译者注),你的团队才能实现真正的合作。

21. 带工具的傻瓜还是傻瓜

你给我CAD/CAM工具,请我设计一座桥。但是,如果那座桥建成的话,我肯定不想当第一个从桥上过的人,因为我对建筑一窍不通。

使 用一个很优秀的CASE工具并不能使你成为一个建模专家,只能使你成为一个优秀CASE工具的使用者。成为一个优秀的建模专家需要多年的积累,不会是一周 针对某个价值几千美元工具的培训。一个优秀的CASE工具是很重要,但你必须学习使用它,并能够使用它设计它支持的模型。

22. 理解完整的过程

好的设计人员应该理解整个软件过程,尽管他们可能不是精通全部实现细节。

软件开发是一个很复杂的过程,还记得《object-oriented software process》第36页的内容吗?除了编程、建模、测试等你擅长工作外,还有很多工作要做。

好的设计者需要考虑全局。必须从长远考虑如何使软件满足用户需要,如何提供维护和技术支持等。

23. 常做测试,早做测试

如果测试对你的软件来说是无所谓的,那么你的软件多半也没什么必要被开发出来。

建立一个技术原型供技术评审使用,以检验你的软件模型。

在软件生命周期中,越晚发现的错误越难修改,修改成本越昂贵。尽可能早的做测试是很值得的。

24. 把你的工作归档

不值得归档的工作往往也不值得做。归档你的设想,以及根据设想做出的决定;归档软件模型中很重要但不很明显的部分。 给每个模型一些概要描述以使别人很快明白模型所表达的内容。

25. 技术会变,基本原理不会

如 果有人说“使用某种开发语言、某个工具或某某技术,我们就不需要再做需求分析,建模,编码或测试”。不要相信,这只说明他还缺乏经验。抛开技术和人的因 素,实际上软件开发的基本原理自20世纪70年代以来就没有改变过。你必须还定义需求,建模,编码,测试,配置,面对风险,发布产品,管理工作人员等等。

软件建模技术是需要多年的实际工作才能完全掌握的。好在你可以从我的建议开始,完善你们自己的软件开发经验。

posted @ 2009-05-31 13:37 Henry Read 阅读(35) | 评论 (0)编辑

2009年5月16日 #

     啊,我年轻的朋友们,你们想成为游戏设计师,所以来问我有何好建议?我会给你们我最好的建议,但我猜想你们可能会听不进去。你们可能更愿意听那些说你们爱听的话的人所提供的建议。但这对我来说无所谓,我所能做的就是说些实事,并希望能进入某些人的耳朵里。

   首先,你们应该对自己的事业道路有个最初的规划,你想接受更专门的训练,还是想要更全面的教育?专门的训练能给你某些特别的技能,让你能一毕业就进入工 作。但教育能给你一个更全面的素质培养,却不一定能马上看到好处,不过长期来看能给你带来更多的优势。这是个简单不过的选择:速成的路还是战略规划后的 路。如果你非常急于求成,那就立马去那些专门学校,他们会教你最新最炫的电脑技术。精力充沛是年轻人的优势,但耐性决不是年轻人的特长,所以我完全能理解 你们几乎不能忍受去学习那些看似无关的副科。当我还是你们年纪的时候,我总是对那些大学里的其他课程感到不耐烦。但现在,我对我当初的鲁莽想法感到羞愧, 并真心的感谢当初教导我的师长。

  速成的路却是能立刻见效的路。如果你进了一家专门教授电脑游戏制作的学校,或者在正规大学主修电脑游戏设计。在此,你会学到很多关于电脑游戏设计最新的技术。毕业后,你很可能马上就能在正规的游戏公司找到一份工作,而这一切你可以在23岁之前搞定。

   请打住。在这里有一点需要指出。生产游戏和设计游戏是完全不同的。你所获得的第一份工作肯定是份渺小的工作,比如给一个无关紧要的npc画动画,而这个 npc做的事情只是在背景上漫无目的的闲晃;或者写一段代码,这段代码的用处就是当用户按下exit的时候,显示“你确定要退出么?”。如果你很擅长做这 些小事情,那不出几年就可能会让你画些更复杂的动画或写一段更重要的代码。然后再过几年,你就可能坐上某个更重要的位子,处理些更重要的事情。

   但请你别指望这些。根本的问题在于:有成百上千甚至上百万的学生,就像你们一样的学生,正做着同样的梦,想要进游戏业的梦。考虑一下供求曲线吧,如果职 员的供应量十倍甚至百倍于员工的需求量,那么价格曲线将向下倾斜。你们必定将得到可怜的工资,并得不到任何的尊敬。你们当然可以抱怨,但得到的回答不仅简 单也很实在:如果你不喜欢,你可以选择离开阿,门外有上百个像你一样的年轻人想要得到你的工作。

  事实上,这就是当前正在发生的事情。有 可能的话你们可以去每年三月或四月在圣何塞举行的“游戏开发者大会”看看,你们并不需要真的去参加什么讨论会,只需要在圣何塞的会议中心转转,看看身边走 过的人。你会发现两个惊人的事实:第一,每个人都穿着黑色衣服;第二,他们的平均年龄在25至30之间。

  我不知道为什么他们都穿着黑 色,这可能是每个人都需要遵守的规则。但我能告诉你们,为什么他们都这么年轻:因为每个人都会在工作几年之后离开这个行业。游戏业就像是个奇怪的巨大建筑 物,这个建筑物只有一个入口,却有很多个出口。成千上万个年轻人拥挤在入口处,争先恐后互相推挤着想要进门。只有很少一部分能顺利进入。但对于任何一个进 入者来说,总会有另一个人离开——这才能让这个行业保持平衡。这个行业内的人有多么的年轻,就意味着被挤出去的人有多么的快。很少有人能撑到30岁。

   如果你想得再深些,那就会发现另一个事实:假设你是老板,既然有这么多小家伙想要为你做游戏,那你自然可以花一毛钱就雇一群人,像奴隶一样驱使他们,直 到他们筋疲力尽,然后再找些替代者。你只需雇佣一些管理人员,能保证这些小家伙都努力工作就行。这个系统运转得非常完美。

  唯一的问题是,你是否打算成为他们中的一员呢?我希望不是。不过,要是你真狂热到打算削尖脑袋往游戏业里钻,那么就继续前进!我这个老笨蛋说再多也是无益。你自己去花时间看清这些吧。

   但在这里我还有另一个方案可以告诉你们。首先,你应该获得一个正规的教育,决不是什么一夜情式的培训。去一所正规的大学,学习任何专业除了游戏制作。几 乎所有专业都可以:生物学、物理学(我当初就是念的这个)、艺术、文学、历史、心理学、语言学。你只需保证自己获得了常规教育,并尽量选修一些专业以外的 课程,当然,你应该选修一下计算机。

同时,你应该开始试验制作游戏了。不要被时髦流行的图像技术所扰——这不能给你的游戏设计提供任何帮 助。你应该专注于游戏的内涵:游戏的体系和架构。如何用很少的元素就能使整个游戏运转?别幻想能做出像商业游戏那么好的产品——我要大声告诉你,这些游戏 要依靠很多人的力量才能完成。你此时所能做的这些小玩意同那些比较起来,只能用“可怜”两个字形容。要是把制作游戏比作造汽车,此时你根本不用管车子的外 表涂层和喷漆,你应该专注于如何让活塞协作运转、如何控制阀门的正常闭合、搞清楚汽化器是个什么东西。你要制造的是个小卡丁车,而不是一辆劳斯莱斯。所有 这些都是个试验的过程,别幻想你的这些小玩意会有商业用途,你要做的就是造好一个就扔掉一个——为了增加创造力,你要杀掉你自己的“孩子”。如果你沉迷于 这些作品而不愿放弃,那你将永远也不会拥有一个真正游戏设计师所应有的创造力。

  继续不断的为增加你的创造力而努力。到目前为止,你的作 品根本无法和一个经验老到的游戏设计师相抗衡,所以增加自己的能力是你此时唯一该做的。电影the matrix都看过吧,没经过训练的neo无论如何也不是agent smith的对手。学任何你能学到的东西。毕业前要把你学校图书馆所有的书架都翻一遍,在这些灰尘的覆盖下指不定隐藏着什么有趣的东西。

   当你出了学校,不要马上就进入游戏业。在一个正规公司找一份像样的工作,并挣些钱。更主要的是不断学习,你要学很多关于团队协作的方式,也要学会如何在 众人面前寻找自己的位置。你应该学会何时何地站起来对你的老板说话——虽然这种机会不常有。还有,你应该学会如何同周围有经验的内行打交道。

   继续在你业余时间制作游戏,尽可能多的制作各种不同类型的“小卡丁车”,并试图了解各种类型卡丁车的性能,诸如操纵性、速度以及其他要素。当你做了六个 或十个这种产品,你可能会想到继续亲自着手进行更大的项目。很好,去找些志同道合的朋友,他们会帮助你完成你的计划,我确信这将是个令人印象深刻的成果。 完成之后,向全世界展示你的小宝贝吧。现在,你就可以把她作为你简历的一部分去申请游戏业中的职位了。如果你的那些产品确实好,你将能得到一个真正的游戏 设计师职位,而不是去当那些小喽罗。此时你可能仍然只是其他游戏设计师的助手,但你已经处在了正确的位置上,如果你能努力出色的完成工作,你肯定会在游戏 业中拥有前途。

  我知道这些并不是你们想听的内容。你们想要的是所谓的速成药,比如学习这个,然后学习那个,接下来就能确保得到一份高收 入的工作、拥有巨大的办公室、用着最先进的电脑设备、做的是富有创造性的事情。没错,每个人都会这么想的,但没有人会得到这些。那些向你描述这些故事的人 不过是些骗子,他们脑子里想的只是你口袋里的钱。一个令人悲伤的事实是:游戏先驱们主导世界的日子已经过去了,现在的游戏业是一个产业,没人会突然被发掘 然后一夜之间成为巨星,对任何想入门的人来说,在你面前的必定是一条漫长的路。

  你们拥有激情和精力,想要让不可能变为可能。但你们是否对这条漫长的路做好了准备?或者说,你们是否打算在真正的准备完成前就冲进去?

  祝你们好运,孩子们,我相信你们会成功。

posted @ 2009-05-16 21:30 Henry Read 阅读(26) | 评论 (0)编辑

王世颖:

  著名游戏制作人,资深游戏策划。有长达8年的游戏业从业经验,是国内最早的百万量级制作人之一。曾经开发过《水浒传-聚义篇》、《情人节-不见 不散》、《仙剑客栈》、《仙剑奇侠传三》、《仙剑奇侠传三外传-问情篇》等作品。现任北京腾武副总经理,主持开发MMORPG《功夫online》。


  很多想要进入游戏业的年轻人都思索过同样的问题:怎样才能成为一个合格的游戏开发人员?要读什么书?上什么学?具备什么样的素质?面对 这样一个充满诱惑和梦想的新兴行业,大家无所适从。任何一条信息,一种说法都会成为某些人的救命稻草,抓住它,也许能成为那个稻草换得豪宅的民间故事的主 角,但更多时候,会赔上金钱,赔上青春,赔上梦想,最终一无所得。

  俗话说“真传一句话,假传万卷书”。每次招聘,看到哪些充满热情但又充满迷茫的年轻人,总觉得应该为他们写点什么,指点一二,为了产业的兴旺壮大,也为了维系一个美丽的梦想,也许,下面这些文字能成为一点微弱的灯,能为想要进入这个行业的人照亮一条明路。

资质的试炼

  游戏开发的三大职种:策划、程序、美术,相信很多人已经了解。程序和美术是两个需要掌握基本技能的岗位,系统学习过相关知识和技能。

  对于一个合格的游戏程序来说,计算机相关专业本科学历已经是最低的基本条件了。C++功底要扎实(针对开发大型PC游戏而言),至少拥有一些的 软件开发经验,如果做过几款小游戏就更好了。写过多少行能运行的代码是个简单而有效的标准,即使代码的技术含量有高低之分,但至少能证明基本技能的熟练程 度。试想一个报名参加马拉松的选手,如果从来没有跑过超过10公里的路程,又怎么可能跑完全程?此外,还要具备基本的理解和沟通能力,逻辑性不太差,又热 爱游戏开发,这样,基本上就可以考虑谋求一个游戏程序职位了。

  做游戏美术,当然要受过美术的专业训练,拥有良好的美术功底是必须的,最好还有丰富的创作实践,尤其是商业化的创作实践。熟练使用常用美术软件 也是具有决定性的因素,仅仅掌握手绘可不行。那些只能拿出学校作业的毕业生无疑没有什么竞争力,风格怪异的“艺术家”也和这个行业不太协调。拥有和游戏相 关或类似的作品很重要,一个国画大师,未必能设计出优秀的武侠游戏场景。

  至于策划,有些人以为文笔好就可以做策划,有些人以为游戏玩得多就可以做策划,还有些人能写稿子、会做测试、能规划数据,就觉得离策划不远了, 其实不然,做策划首先要受过高等教育,其次,要有很高的智力水平。对于这一点,可能很多人会嗤之以鼻,觉得既然能够大学毕业,怎可能不具备高智力?可是, 笔者可以客观的告诉大家,在笔者面试过的成千应聘者当中,能通过智力这一关的寥寥无几。

  智力包括观察力、记忆力、想象力、思维力、注意力等诸多方面,其中最重点和最基本的是观察力、记忆力和思维力。对于准策划来说,这三个方面可以这样体现。

观察力:

  很简单的测试,找一本外文游戏杂志,选取一张不仅没有玩过,而且也没有听说过的游戏的截图,看十分钟,试着说出以下内容:游戏类型、题材、世界 观,基本操作和玩法,画面上所有按钮的功能,如果可能的话,可以加上游戏的主要卖点、重大缺陷、销售状况和市场评价,如果是3D游戏,还可以估计一下它的 配置。然后,找到这个游戏玩一玩,或者看看攻略,看说对了哪些,准确率有没有达到60%?

记忆力:

  回想你最近玩过的一款游戏或动画或电影,用文字描述一下主角的外貌吧!身材、五官、身体任何一个部位的颜色和造型,服饰的颜色、材料、造型和结构,动作、表情。能写出上千字,没有遗漏任何细节才算及格。

思维力:

  找一个自己熟悉的游戏,写出它在设计上最失败的一个地方,然后,为设计者找至少10个必须这样设计的理由。(注意!不是脑筋急转弯式的理由,而 是真正能拿上台面的理由)接下来,再想10个修正这个失败设计的方案,考虑每个方案可能带来的负面后果,再想解决方案,这个游戏可以一直玩下去。可能的 话,寻找游戏设计者的访谈,或者询问资深策划人员,印证自己的想法看是否正确。

  如果没有通过以上三个测试,建议还是及早放弃做策划的梦想为好。

百日特训

  好,就像在快餐店选择A、B、C套餐一样,先衡量一下自身条件,如果适合某个职位,请继续看下去,进入我们的100天速成方案阶段。经过这 100天自我特训,相信大家会在成为专业游戏制作人的道路上迈出关键的一步。积累下来的大量资源和作品,相信也会成为未来职业生涯中受用不尽的宝藏。

  首先明确一点,这100天内,大家要每天学习修炼12小时,也就是说,除了吃饭睡觉上厕所,其他时间都要勤修苦练,一方面是速成的需要,另一方面,相信大家都知道,加班是很多游戏开发公司家常便饭,提前适应一下未来的职业生活吧!

程序

  随着技术的进步,单打独斗的程序越来越难取得成就感。早在十几年前,一个拥有一定技术水平的程序,花两、三个月的时间就能制作出一款媲美商业游 戏的游戏,而现在,这几乎是不可能的。但是,还是一套可行的自我训练方法让你迅速接近游戏程序的位置。北有《北京浮生记》,南有《小朋友齐打交》都是脍炙 人口的独立开发作品,好程序的实力,在任何条件下都是不可埋没的。

积累:每日4小时。

    深入玩2~3款不同类型的主流游戏,了解其内在逻辑和平衡性,尽可能搜集与其有关的各种设计资料,以印证自己的想法。

    精读国内出版的所有有关游戏编程、设计的书籍。

    阅读开发管理、开发流程、软件工程的经典书籍。如《程序开发心理学》、《人月神话》、《人件》、等。

    搜集、整理、阅读至少200篇有关游戏程序、图形学、引擎技术的论文、文章。

创作:每日8小时。

    选取一款操作相对比较简单的游戏(如恋爱养成游戏),制作一个简单的界面编辑器,以实现该游戏主操作界面的所有功能。

    承上,参考各种游戏,试着在已经完成的界面编辑器上增加尽可能多的动态装饰效果,使其华丽而丰满。

    选取一个电影剧本的片断,试做简单的可运行的对话脚本。

    承上,参考一个主流RPG游戏的表现,为这个脚本尽可能多增加一些功能。如各种文字现实效果、选择分支、触发判断等等。

    制作一款小型的FREE游戏,图片来源可以使用一些游戏解密图片,而游戏模式可参考一些经典的FC游戏,抓住主要系统,尽可能简化其它系统。如果能力达不到,完全参考一款已有的FREE游戏也是可以的。

    承上,不断完善这个游戏,加入音乐、音效,特效等等,试着公开它,并听取大家的评价继续改进。

美术

积累:每日4小时。

    精读至少10本游戏原画设定集。
    深玩至少5款主流游戏。
    搜集、整理并研究至少100段游戏片头或过场动画。
    搜集、整理并研究至少500张游戏宣传壁纸和包装。
    搜集、整理至少100款游戏的界面截图。
    深入了解至少2款游戏的全部解密图档。
    熟练常用美术软件的使用。

创作:每日8小时。

    选取一本游戏原画设定集,线稿临摹大部分画作,并选取部分画作上色。
    承上,续作这本设定集中的每个门类的设定。也就是主角及同伴、怪物、场景(含建筑)、武器、道具、特效、宠物(如果有的话)、动画等等门类的设定,按照其 原有风格和完成度,增加1~2个造型。可将自己临摹的作品和新创作的作品放在一起,看朋友能不能挑出哪个是自己设计的,以检验设计水平。
    选取任何一个游戏的截图,做2D或3D分解还原。3D分解还原是这样的,制作截图上所有角色、植物、建筑、特效、物件的模型贴图,务求达到乱真程度。分解 地面贴图,制作天空盒子,制作角色、特效的动态等。2D还原不是简单的临摹,而是采用逆转90度的形式,譬如截图上人物是侧面的,那么就分解成正面,建 筑、地物也是如此。界面可采用同等功能,更换另一种风格的设计这种形式。
    选取任何一个游戏的截图,做2D、3D转换联系。也就是针对一张2D游戏截图,将上面除界面外的所有元素都转换成3D的,如人物,场景,地物,物品等等全 部制作成单独的3D模型贴图。反之,针对一张3D游戏截图,选取一个角度,将所有元素都转换成2D。要求尽可能的模拟原本的风格和品质。

 

策划

阅读:每日4小时。

    所有国内已经出版的有关游戏设计,游戏开发,游戏产业相关书籍(技术及美术相关除外)。
    有关软件工程和软件开发管理的经典著作。(参考程序部分)
    著名游戏的攻略本、设定集,以及其他游戏相关书籍。如《D&D地下城主指南》等。
    武侠文学代表作。如金庸的全部作品等。其他新、旧武侠作家的1~2部代表作。
    奇幻文学代表作。如黑暗精灵三部曲,时空裂隙之战三部曲等。
    宏观经济、地理、战争理论、历史、神话、人体工学、视觉艺术、文学创作理论、影视创作理论、哲学、心理学等门类的经典著作。总数量约为60~100本,1~2天阅读完一本,并在每类中挑选最好的一本精读。

游戏:每日4小时。

    以下游戏类型中,每个类型(含子类型)精选1~2款代表游戏深入玩下去,尽量做到通关或者游戏20小时以上。
    角色扮演类(Role Playing Game)RPG,含 A•RPG动作角色扮演游戏和S•RPG战略角色扮演游戏。
    策略\模拟类(Simulation Game)SLG。含SIM模拟经营类、战棋类、RTS即时战略类、养成类。
    射击类(Shooting Game)STG。含FPS第一人称射击游戏。
    动作类(Action Game)ACT。含 FTG格斗游戏。
    益智类(Puzzle)PUZ和桌上类(Table)TAB 。含MUG音乐游戏。
    冒险类(Adventure Game)AVG。含ADV动作冒险游戏、恋爱冒险游戏。
    运动类(Sports Game)SPG。 含RAC赛车类。
    网游。含MMORPG网络游戏大型多人在线角色扮演游戏。

创作:每日4小时。

    选取一篇社会新闻,撰写其中出现人物的对话。如随便打开搜狐的社会新闻——《云南贫困村村主任公开养着3个老婆》,就是它了,写写面对记者提问,村官和三位老婆各自怎么说。
    选取一款MMORPG,为其撰写新任务。包含任务流程、逻辑、奖励机制和对话。
    选取一款RPG,为其设定数个新的同伴角色以及怪物角色。要做很详细的文字设定,包含外貌、身世、性格等等。
    选取一款游戏的场景编辑器,为其设计数个新场景。如果可能的话,多找一些朋友玩玩看,听取大家的意见。
    选取一款RPG或SLG,复原其属性系统数值和计算公式,做成精美的表格。并找来设定资料集或攻略本做印证。
    选取一款有剧情的游戏,为其设计续作的剧情大纲。
    选取一款中、小型游戏,还原其全部策划案,并找来设定资料集或攻略本印证。
   以上工作可以以周为周期轮换进行。

  如同通过RPG游戏第一个迷宫的试炼,按照以上方案百日修炼圆满之后,你获得了不少经验值,等级也提升了很多。现在,是准备挑战BOSS的时候了,准备好简历,找出自己心仪的公司,迎接即将到来的转职吧!

   去应聘的时候,别忘了带上创作阶段完成的作品。一个好作品,胜过千言万语。某某架空大陆,兽人、精灵、法师的故事实在太老套,根本抵不上一个 新发售游戏的完整属性表带来的冲击力。而作为美术,放弃那些带有强烈自恋倾向,毫无商业价值的作品吧,为一个众所周知的游戏补充一张以假乱真的设定更能令 人刮目相看。是好程序的话,拿出一个小小的可运行版本来,无论有多粗糙,也能证明你的实力。如果有非常中意的公司,那么不妨稍稍投机一点,针对这家公司开 发过的游戏准备一些作品吧,相信会有更高成功率的。

  迈出游戏制作的第一步其实很简单,只要找出正确的道路,花一点点时间,一点点金钱,梦想就近在眼前。

 

 

posted @ 2009-05-16 21:18 Henry Read 阅读(29) | 评论 (0)编辑

原文链接 : http://www.youxicehua.com/archives/87


Rpg Maker XP V1.02 汉化版

RPG Maker XP 是由日本Enterbrain公司开发的一款 RPG 游戏制作软件。它可以使一个不懂编程的人也能做出精美的RPG 游戏来。新的 XP 版本中强化了画面的表现对素材已经没有限制了~完全真彩色的画面。另外加入了 RGSS 脚本系统……可以独立定义更改游戏的系统。

Rpg Maker XP V1.02 汉化版 | 可简单的制作出原创RPG 游戏的工具》

下载地址:http://www.duote.com/soft/6423.html

 

RPG制作大师(Rpg Maker)是一款即使不懂得编程知识也可以简单的制作出原创RPG游戏的工具,只需绘制地图和设置怪物,道具,魔法等等要素最后就可以完成一部属于自己的RPG游戏。

工具本身附带了素材库,里面包含了各种人物图形,怪物图形,地图元件,背景音乐和音效等等可供用户使用,即使你不会画画,也可以成为一个游戏制作者,当然你也可以自己加入MIDI,WAV或OGG格式的音频文件,和导入自己画的素材到你的游戏中。

游戏做成后不但可以在自己的机器上运行,还可以将其刻录成CD-ROM,发布到网络上甚至是发售,让所有人都能欣赏到你的作品。

更新内容

绘制地图功能复归
人物头像功能复归
全新的默认素材库
人物步行图默认尺寸定为32×32像素
自由的更换字体
移动中按住Shift键可以奔跑(可以设定相关装备)
动画播放速度提升(30FPS→60FPS)
选项更加完善

此外《RPG制作大师VX》将更适用于初学者使用,除了自动绘制地图,迷宫之外,移动,宝箱和门等事件将也可以轻松完成。

RPG Maker VX 1.02.0824 汉化版

下载地址:http://www.xdowns.com/soft/softdown.asp?softid=45496

RPG Maker VX 1.02.0824 目前暂未破解,不过可以使用算号器联网进行激活。

算号器下载:66rpg.com

RPG Maker Vx 算号器图文使用教程:http://bbs.66rpg.com/forumTopicRead.asp?id=101291

RPG Maker常见问题:http://bbs.66rpg.com/forumTopicRead.asp?id=79638

 

转载: 游戏策划 Game Design

posted @ 2009-05-16 20:47 Henry Read 阅读(215) | 评论 (0)编辑

2009年5月7日 #

目录

1 初学者如何开始OGRE
2 何时需要STLPORT ,为什么?
    2.1 如何安装STLPORT?
3 Visual Studio.NET (VC7)
4 GCC 3.3/3.4
5 GCC 3.3/3.4 DEV C++
6 GCC 3.3 Cygwin/MinGW
7 Anjuta IDE
8 你的第一个程序
    8.1 编译 运行
    8.2 添加第一个物体
    8.3 添加灯光
9 Frame Listeners
10 总结


1 初学者如何开始OGRE

作者:Antiarc

  欢迎进入OGRE的世界,你在看这篇文章说明你在开始学习OGRE了,希望这篇文件对你有用。

   这篇文件是假设你有下面的知识的情况下,如C++编程技巧,基本的操作系统使用的知识和一些关于3D方面的知识。我在这篇文章中,只是描述我知道的东 西,对于其他的东西,请在OGRE论坛中讨论。对于高级用户,这篇文件对你也许不适合,因为,这是我第一次使用OGRE的一些想法。那时,我的C++不是 很好,对VS也不是很了解,甚至不知道3D编程。

(注意:这篇文章是关于VC7)

  首先,我们需要到OGRE下载页面下载“stable releases(完整版)”,下载后,将他解压到你建立的目录下(如:F:/OGRE)。文件将自动生成到OGRENEW目录下。这是必须的,如果你乱改了目录,也许会发生一些错误。

  如果你是使用WINDOWS,请到OGRE 下载页面下载"extras"版本。将他解压到你建立的目录下,如:F:/OGRE/OGRENEW。这些文件适合LINUX平台,并不包括对WINDOWS的支持。

  如果你在WINDOWS ,LINUX下使用GCC 2.9X,你将需要下载更多的东西,如STLPORT。如果你使用的是GCC 3.0,你将不需要做什么。


2 何时需要STLPORT ,为什么?

   如果你使用的是VC 6/7,你将需要STLPORT。因为STL在VC6/7中执行很慢,并有许多错误。OGRE是使用STL通过DLL使用MS STL;这将引起程序崩溃。OGRE是非常面向DLL的,因此MS STL不适合。而STLPORT很适合,他运行也比MS STL快。

  注意,在VS 2003,2005中,不需要STLPORT。

  如果你使用的是GCC 2.9X,你将需要STL;但在GCC 3.0中,不需要,他的STL得到了更新。

STLPORT是标准模版函数库的“beefed up"版本,包含许多你所需要的基本的函数。关于STLPORT的使用和安装在下面介绍。

2.1 如何安装STLPORT?

* 从www.stlport.org下载最新的STLPORT(4.6.2),并解压他。
* 打开一个 命令行程序(注意:在WINDOWS NT/2000/XP中,是cmd.exe 而不是commamd.com),并改变他的路径STLPORT-4.6.2/SRC
* 如果你使用VC,请确定‘VCVARS32。BAT’是否运行在devstudio/vc6/bin or visualstudio.net/vc7/bin目录下。这些操作用于设置你的环境参数,并确定你的‘NMAKE’文件的位置。

注意:这些命令必须在在同一行执行。VCVARS32。BAT只设置运行中的SHELL的环境,因此,如果你得到关于NMAKE的错误,请确定VCVARS32。BAT的版本是否和SHELL的版本相同。

* 如果你使用VC 6
* 键入‘nmake -f vc6.mak clean all''
* 键入 ’nmake -f vc6.mak install''
* 如果你使用的是VC NET
* 键入 ‘nmake -f vc7.mak clean all''
* 键入 ’nmake -f vc7.mak install''

注 意:如果你觉得麻烦的话,你可以添加NMAKE。EXE的路径到你的路径变量中。如果你这样做了,返回了”NOTE:“的错误。比如,如下的错 误:"..\\stlport\ctime(25) : fatal error C1083: Cannot open include file:''../include/ctime'': No such file or directory". 发生了这样的错误,你可以把VCVARS32。BAT拷贝到你的命令行程序相同的路径下,然后执行。如果你有其他的问题,请到OGRE的论坛中讨论。

* 如果你使用VS 2003
* 你将不需要做任何事情
* 如果你使用的是GCC 2.9X
* 键入 ‘./configure''
* 键入 ’make''
* 键入 ‘make install''
* 打开VC++,然后选择Tools/options...,将弹出一个对话框
* 在VC6中电击''Directories'' 选行,在.NET中,是在Project/vc++下面。
* 确定STLPORT的路径在路径列表的最上面,他必须在最上面。
*(比如,他的头文件的路径可以如下:\STLport-4.6.2\stlport\)
*(比如,他的库文件的路径可以如下:\STLport-4.6.2\lib\)
* 保存并关闭
* 恭喜,STLPORT已经设置好了。


3 Visual Studio.NET (VC7)

   我们现在可以用OGRE开发了,在开发之前,请安装DX SDK,然后建立OGRE引擎和例子。他在OGRENEW/OGRE。DSW(VC6)或OGRENEW/OGRE。SLN(VC7)下,电击 “BUILD ALL”。等待大约10-15分钟后,引擎,plugins,工具和例子将建立。

  如果你想运行这些例子,切换到 ogrenew\Samples\Common\bin\Debug (在这里,我们使用的是DEBUG模式,如果你是RELEASE模式,就切换到RELEASE)。先将OGREMAIN。 DLL(ogrenew/ogremain/lib/{debug|release})和其他的支持函数拷贝到ogremain/samples /common/bin/debug 下,然后就可以运行例子了。

  OGRE实际上是一个应用程序类库,他允许你很快速的开发你需要的应用程序。因为,他提供了你开发程序的3D基础,特别适合建立应用程序。

我们首先建立一个"Empty Project",然后进行下面的设置:
* 右击项目名,选择”Properties".
* 添加the ogrenew\OgreMain\include 和ogrenew\Samples\Common\include 的路径到"additional includes"
* 添加ogrenew\OgreMain\lib\(Debug|Release) 到"library search paths"
* 添加OgreMain.lib 到"Additional Dependencies"
* 在C++/Code Generation模式下,选择"Runtime Library" to "Multi-threaded Debug DLL" (for debug-mode apps) 和 "Multi-threaded DLL" (For release-mode apps).

  你也可以把"Output Directory" 和"Working Directory" (under Debugging) 选上。

他将把文件放到和已经运行的OGRE DLL相同目录下。如果你不这样做,你将拷贝许多OGRE DLL到output directory下。

  设置好后,我们就开始了一个main.cpp的文件。


4 GCC 3.3/3.4

如果你使用LINUX或MingW for windows,那么下面的内容对你有用,先到OGRE下载LINUX版本。然后解压:
* tar xjf ./ogre*
* ./bootstrap (I''ve found not doing this in 1.0.0 RC1 causes later errors)
* ./configure && make
* make install (you may have to be root to do this)
设置好后,你能通过./ogrenew/Samples/Common/bin 访问。

设置Anjuta IDE

你可能想用IDE来便于你开发OGRE程序。这些还在讨论中,重点如下:

* 建立一个新的 Generic / Terminal
* change your Project->Project Options Configuration tab and Libraries sub-tab and add:

PKG_CHECK_MODULES(ogre, [OGRE >= 1.0.0])
AC_SUBST(ogre_CFLAGS)
AC_SUBST(ogre_LIBS)

* 然后进入Settings -> Compiler ,将连接选行添加${ogre_CFLAGS} to CFLAGS and ${ogre_LIBS}
* 最后,到Build->Autogenerate ,这将自动更新你的make and config文件。


5 GCC 3.3/3.4 Dev C++

如果你想在DC中使用OGRE,请按照下面的步骤:

1) 得到DC
2) 得到 DEVPAK (http://the-agency.sourceforge.net/xoops/modules/mydownloads/visit.php?cid=20&;;lid=64)
3) 得到OGRE 相关 DEVPAK (http://the-agency.sourceforge.net/xoops/modules/mydownloads/visit.php?cid=18&;;lid=65)
4) 安装DC
5) 安装Ogre DevPak
6) 安装Ogre Dependencies
7) 到例程目录。例如:C:\Development\Dev-Cpp\MyProjects\ogrenew\the-agency\Samples\ParticleFX
  然后打开。DEV文件,如:Sample_ParticleFX.dev
  将有一个警告出现,ignore 他。
  如果你得到另一个警告,说明你的文件在“build" 目录下。
8) 电击Project -> Project Options -> Directories ,然后设置:
  在"Libraries" 行,设置:
  ..\..\OgreMain\build

  ..\..\..\Dependencies\build

在"Include" tab,如下:
  ..\..\..\OgreMain\include

  ..\..\..\dependencies\devil\include

  ..\..\..\dependencies\freetype\include

  ..\..\..\dependencies\zlib\include

  ..\..\..\Samples\Common\include

  ..\..\..\Samples\ParticleFX\include

9) Hit Rebuild All (Ctrl + F11) -这将让Sample_ParticleFX.e xe 去建立一个目录,拷贝文件到C:\Development\Dev-Cpp\MyProje cts\ogrenew\Samples\Common\bin\Debug
10) 将dependencies\build 所有的DLL和C:\Development\Dev-Cpp\MyProjects\ogrenew\the-agency (use the Windows Search function) 下的文件拷贝到C:\Development\Dev-Cpp\MyProje cts\ogrenew\Samples\Common\bin\Debug
11) Rename PlatformManager_SDL.dll to OgrePlatform.dll
12) 通过下面的设置修改the Plugins.cfg 文件:
  1。Plugin=RenderSystem_Direct3D7
  1。Plugin=RenderSystem_Direct3D9
13) 完成后,运行Sample_ParticleFX.exe


6 GCC 3.3 Cygwin/MinGW

Use the following if you don''t want to have to setup the whole Dev-C++, but would like to have just a pure Cygwin/MinGW environment. Cygwin is used for it''s building system, and since it can nicely cross-compile for MinGW, you will have a build that doesn''t depend on Cygwin anymore.

Note: This information is ripped from this thread (http://www.ogre3d.org/phpBB2/viewtopic.php?t=6964) in the the Ogre forums. (thx Lt.CYX & wumpus !)

1) Full cygwin install. Might need to add correct path to /etc/profile - it wasn''t created on my first install.

2) get OGRE head from CVS (there is a tutorial on how to do it in the CVS Access section (http://www.ogre3d.org/modules.php?op=modload&;;amp;name=Sections&file=index&req=viewarticle&page=1&arttitle=Getting+Ogre+from+CVS) of OGRE Homepage). I put this on /usr/dev/ogre. This should also work with release version 1.0.0 or later - actually it worked with 1.0.0RC1, I used the linux/OSX version. Didn''t try the win32, but it must be not that different.

3) get the MingW/Cygwin OGRE dependencies from the OGRE website. Either extract it to the root (thus creating /mingw) or to another directory and create a symlink /mingw pointing to the correct location (that''s what I did).

4) download and install libtool 1.5.12 (or newer). Version 1.5.10 (the one that came with cygwin) generates a few errors we want to avoid.

4.1) download stable version from the libtool website (http://www.gnu.org/software/libtool/libtool.html)

4.2) configure, make and make install it.

4.3) cygwin has a libtool wrapper that automatically selects 1.5.10 or 1.4.3 - we need to make it use our 1.5.12 (or newer) version instead. For that, first we copy the libtool files from /usr/local/bin to /usr/autotool/1.5.x/bin (you''ll have to create it), then edit /usr/bin/libtool to use that directory instead of the devel dir. It''s just a quick, nasty hack - if someone knows of a better way to get the same results, please feel free to inform. This shouldn''t break anything though.

4.4) (optional) go to a directory without configure.ac or configure.in files and do a ''libtool --version'' to see if the first version number changed. If so, we can go to the next step.

5) follow the instructions on the beginning of this post (thanks to wumpus), which I modified slightly and reproduce here. This is to be done in the ogrenew directory:

5.1) export PATH="$PATH:/mingw/bin"

5.2) export ACLOCAL_FLAGS="-I /mingw/share/aclocal"

5.3) export PKG_CONFIG_PATH=/mingw/lib/pkgconfig

5.4) ./bootstrap

5.5) CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" CXXFLAGS="-O2 -I/mingw/include" LDFLAGS="-L/mingw/lib -L/lib/w32api" ./configure --with-ft-prefix=/mingw --with-platform=Win32 --with-gl-support=Win32 --disable-static --build="i686-pc-mingw32" --enable-direct3d

5.6) make

5.7) make install

6) set up your development tools.

6.1) passing the arguments "-lOgreMain -Wl,

--enable-runtime-pseudo-reloc" to the linker will work.

6.2) as far as library directories go, you can link to cygwin/usr/local/lib and be happy about it.

6.3) include directories: cygwin/usr/local/include, cygwin/usr/local/include/OGRE and ogrenew/Samples/Common/include (if you are using the ExampleApplication class). Where I say cygwin/ I actually mean the cygwin path (such as c:/cygwin), and the same goes for ogrenew/ (c:/cygwin/usr/local/ogre/ogrenew, for example)

6.4) this is not required, but I tend to copy all required DLLs to my build directory: the one where MingW puts my compiled binary on. This way I keep my environment clean, and you can just copy that directory to another computer and run it with its own dlls. This avoids mess.

There you go. You should be able to safely build any post-1.0.0 with this, unless there are some big changes that break the process.

[edit]Anjuta IDE


7 Anjuta IDE

1) 安装OGRE
2)运行Anjuta IDE 并建立一个新的Generic/Terminal APP项目。
3)选择C++
4)删除MAIN。CC中的内容,然后键入下面的内容

#include "Ogre.h"
#include "Dome.h"
int main(int argc, char *argv[])
{
    // Create application object
    Dome app;
    try {
        app.go();
    } catch( Ogre::Exception& e ) {
        std::cerr << "An exception has occured: " << e.getFullDescription().c_str() << std::endl;
    }
    return 0;
}

5)Go to the Settings Menu and choose Compilier and Linker Settings
6) 按照下述的内容修改各个选行。
Include Paths:

(ogrenew)/Samples/Common/include
(ogrenew)/OgreMain/include
/usr/include/OGRE


Library paths:

/usr/local/lib
(ogrenew)/OgreMain/lib
(ogrenew)/OgreMain/src
(ogrenew)/Samples/Common/include

Libraries:

OgreMain

Options:

In the Compilier flags (CFLAGS) box add this:
-g -O2 -fPIC -DHAVE_CONFIG_H -D_THREAD_SAFE

7) 现在建立一个新类DOME并建立一个createScene方法。还需要建立另一个类,我称为INPUT。作用和缓冲器监视器(frame listener.)一样。那个类在一些键按下后退出。

DEME.H
#ifndef _DOME_H_
#define _DOME_H_
#include "ExampleApplication.h"
class Dome : public ExampleApplication {
public:
    Dome();
    ~Dome();
    void createScene(void);
    void createFrameListener(void);
protected:
    // Dome variables
};
#endif //_DOME_H_

Dome.cc:

#include "Dome.h"
void Dome::createScene(void)
{
    Colourvalue c = Colourvalue(0.5, 0.5, 0.5);
    mSceneMgr->setAmbientLight(c);
    Entity *e = mSceneMgr->createEntity("ogrehead", "ogrehead.mesh");
    SceneNode *node = static_cast<SceneNode *>(mSceneMgr->getRootSceneNode()->createChild());
    node->attachObject(e);
    node->setPosition(0,0,0);
}

// Create new frame listener
void Dome::createFrameListener(void)
{
    mFrameListener = new Input(mWindow, mCamera);
    mRoot->addFrameListener(mFrameListener);
}

Input.h:

#ifndef _INPUT_H_
#define _INPUT_H_
#include "ExampleApplication.h"
class Input : public ExampleFrameListener
{
public:
    Input(RenderWindow* win, Camera* cam) : ExampleFrameListener(win, cam) {}
    ~Input();
    // Input interface
    bool frameStarted(const FrameEvent& evt);
    // TODO: add member function declarations...
protected:
};
#endif //_INPUT_H_

Input.cc:

#include "Input.h"
bool Input::frameStarted(const FrameEvent& evt)
{
    mInputDevice->capture();
    if(mInputDevice->isKeyDown(Ogre::KC_ESCAPE))
        return false;
    return true;
}

按F11编译他,如果得到关于OgreSharedPtr.h 的警告,这是正常的。
8) Go to the Projects folder in your home directory and enter the folder for the Ogre project, which I called Dome.

9) Create a symlink in the MyApp folder to the Media files that came with ogre. ln -s (ogrenew)/Samples/Media

10) Go into the src folder and create a folder named bin.

11) copy all the .cfg files from the ogre Samples into the bin folder. cp (ogrenew)/Samples/Common/bin/*.cfg Myapp/src/bin

12) go into the bin folder and create a symlink to you executable in the src folder. ln -s ../Dome

13) Run it. You need to run it from the bin folder. That way the executable has acce

ss to all the .cfg files in the folder with it. It also will look for the Media folder in http://www.cnblogs.com/Media, which is why we put the symlink there.



8 你的第一个程序

#include "Ogre.h"
#include "ExampleApplication.h"
#include <windows.h>
// First, we declare a subclass of the ExampleApplication class
class FirstApp : public ExampleApplication
{
public:
    FirstApp() { }

    /** createScene is pure virtual in ExampleApplication, so we just override it to do nothing.
    * What this means is that we''ll be creating an empty scene at first.
    **/
    void createScene(void) { }
};

INT WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,INT) {
    FirstApp myApp; // Instanciate our subclass
    try { // This try-catch provides a nice way of popping up errors if they occur.
        myApp.go(); // ExampleApplication provides a go method, which starts the rendering.
    } catch (Ogre::Exception& e) {
        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!",
        MB_OK | MB_IConERROR | MB_TASKMODAL);
    }
}

8.1 编译 运行

  试着运行他,他将显示OGRE安装对话框,并开始一个包含OGRE LOGE和FPS的深黑的屏幕。我在这里没有添加任何东西,当按ESC键退出。

  ExampleApplication 非常重要,他用于初始,建立窗口,建立基本的场景,摄象机和缓冲器监视器(frame listener.),因此,你不得不在工作时加上他。

  这只是一个空的程序,如果你想知道更多的东西,请参考OGRE的教程。

8.2 添加第一个物体

前面,我们建立了一个黑色的屏幕,下面,我们将添加一个ogrehead 的mesh到程序中,在createScene中,添加下面的代码:

Entity *e = mSceneMgr->createEntity("ogrehead", "ogrehead.mesh");
SceneNode *node = mSceneMgr->getRootSceneNode()->createChildSceneNode();
node->attachObject(e);
node->setPosition(0,0,0);

ExampleApplication 为我们提供了一个“场景管理者”----mSceneMgr.

   mScenemgr用于在OGRE管理我们的场景。SceneNodes是OGRE中的一个基本的结构。在场景中的大多东西都和SceneNodes有 联系,你能通过控制这些节点控制场景。每个场景都建立了一个根场景节点。你将把子节点,光和网格的值联系到根节点。每个节点又能建立他自己的子节点。这样 更新场景将会更容易。例如,你有一个角色在场景中,并且他检起一个小棍。角色和小棍将分别给予不可见的场景节点。要使角色检起小棍,你将使角色动画弯腰并 检起小棍,这样你必须使小棍的场景节点成为角色场景节点的子节点。我们都知道3D世界是建立在3D坐标系统上,因此,你有一个角色在坐标(0.0.0), 作为角色场景节点的子节点的小棍场景节点是坐标(10.10.10)。小棍节点将在父节点下保持这个偏移,这就意味着当你移动角色节点,小棍节点也将跟着 移动。在这里并不是移动两个节点,而是移动其中一个,而他的子节点将跟着移动,这容易吗,我认为很难。

  在这个例子中的网格的值很简 单。为了建立可见的物体,我们简单的用sceneManager建立了全部的值,然后,我们把他们给予场景节点。在你的计算机上,把一个值想象成一个窗 口,把sceneManager看着标题栏。你能通过点击并拖动标题栏来移动窗口。如果窗口有子窗口,点击并移动主窗口将移动子窗口。

  现在你将添加这些东西到场景中,你将可能编译并运行他。没有看见任何东西吗?原因是我们没有建立灯光,因此我们的场景就是黑的。我们有两种方法解决这个问题。

8.3 添加灯光

  首先,我们可以在场景中假如一些环境灯光。这将使整个场景达到一定的亮度。我们可以建立一个灯光物体并设置一个灯光场景节点,并添加这个灯光到场景世界中。

让我们来建立一个环境灯光吧,他是很容易的。
在你的场景管理者中添加下面的代码:

Colourvalue c = Colourvalue(0.5, 0.5, 0.5);
mSceneMgr->setAmbientLight(c);

美国读者的建议:

  sinbad,OGRE的创始者,是英国人,因此他的拼写方法和美国不同,比如"Colour" 替代了"Color" ,"Initialise" 替代了"Initialize". ,因此在编译时,有可能出现错误,请大家注意。

   mSceneMgr 用一个成员去设置环境灯光。主要是通过设置Colourvalue 的值来实现的,Colourvalue 有三个变量:red,green,blue.取值范围为0——1。在标准RGB下,0是0,1是255,因此,我在这个例子中建立了白光。我们建立 Colourvalue对象,并把他添加到SceneManager的setAmbientLight 方法中。

代码如下:

#include "Ogre.h"
#include "ExampleApplication.h"

// First, we declare a subclass of the ExampleApplication class
class FirstApp : public ExampleApplication
{
public:
    FirstApp() { }

    /** createScene is pure virtual in ExampleApplication, so we just override
    * to add what we just discussed.
    * What this means is that we''ll now can see the ogre head in the scene.
    **/
    void createScene(void) {
        Colourvalue c = Colourvalue(0.5, 0.5, 0.5);
        mSceneMgr->setAmbientLight(c);
        Entity *e = mSceneMgr->createEntity("ogrehead", "ogrehead.mesh");
        SceneNode *node = static_cast<SceneNode *>(mSceneMgr->getRootSceneNode()->createChild());
        node->attachObject(e);
        node->setPosition(0,0,0);
    }
};

int main(int argc, char **argv)
{
    FirstApp myApp; // Instanciate our subclass
    try { // This try-catch provides a nice way of popping up errors if they occur.
        myApp.go(); // ExampleApplication provides a go method,

which starts the rendering.
    } catch (Ogre::Exception& e) {
        MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!",
        MB_OK | MB_IConERROR | MB_TASKMODAL);
    }
}

编译并运行它,将产生一个OGRE的头。
现在,让我们建立点光源。
在createScene 方法中,添加下面的代码:

Light *l = mSceneMgr->createLight("aLight"); // Create a light and give it a name
SceneNode *lightNode = static_cast<SceneNode *>(mSceneMgr->getRootSceneNode()->createChild());
lightNode->attachObject(l);
// We''re going to create the light at the camera''s position.
lightNode->setPosition(mCamera->getPosition());

就 如你所见到的,我们先建立了一个光,和一个用于光的场景节点,并把光联系到节点上,并设置节点的坐标。你可能注意到我用 mCamera->getPosition() 设置坐标。ExampleApplication为我们提供了另一个定义指针,在这里我们用于设置摄象机。你将在复杂的程序中发现他很有用,但在这里,我 们只是用他来取得摄象机的坐标,并设置灯光。

Lights ,初始值为"point" 光,并是白光。你可以随意更改,但在这里,我们不需要。有三中类型的光:point, directional, and spotlight。point光是从一个点向四周发散,directional 光没有初始点,只是一个指向特定方向的光。spotlight有初始点和方向。

现在,我们建立了物体,光和控制他们的节点。


9 Frame Listeners

   Frame Listeners 是什么?实际上是一个允许你更新你的世界的物体。他有两种方法来实现:frameStarted and frameEnded。frameStarted调用后,帧动画开始,frameEnded调用后,动画结束。你能用这些对象和方法更新你的世界。

   OGRE提供了一个基本的frame listener 叫ExampleFrameListener,他允许你在世界中自由移动。对于每个动画,他都接受鼠标输入和键盘输入,并允许你改变世界。这些都是通过移 动摄象机实现的。你的鼠标的移动决定了你的摄象机的位置。当你按每个键,将决定按键后的动作。Frame listeners 不仅控制你的摄象机的移动,并是一个游戏循环,当游戏运行时,他将控制你的所有操作。如果你感兴趣,打开ExampleFrameListener (in ogrenew\Samples\Common\include) ,浏览他,如果你知道一些3D数学,你将知道他是如何工作的。在这里,我们只涉及到frameStarted and frameEnded 。


10 总结

  这只是关于OGRE的一篇引导。去玩例程并阅读其他教程。你将获得更多的知识。希望这篇文章对你有用,如果有任何问题,请写信给我,不要客气。

  译者注:经过两个星期六的时间,终于完成了这篇文章的翻译。对于其中6,7节,我没有翻译,主要是因为国内使用这两个工具的人很少(至少,我觉的是这样 :) )如有任何问题,写信给我。antking@gmail.cn 。还是那句话,希望这篇文章对你有用。

posted @ 2009-05-07 07:50 Henry Read 阅读(241) | 评论 (0)编辑

2009年5月2日 #

来源:中国自学编程网   发布日期:2008-05-26  

   这是我多年来招聘培训游戏程序员的一点想法。一直想汇总一下。主要目的是为了更好的对公司新进C++程序员进行培训,并且建立起游戏程序员培训,发展, 成才,成为核心骨干,管理层,期权收益人等一整套体系。因为对于MMO游戏制作来讲,解决好C++技术队伍,是保证合格软件的基础之一。

  我在的H3D Studio核心技术人员和游戏制作管理人员全部是SMTH BBS游戏制作版成员。从99年开始截止BEGINER的历任版主都在H3D STUDIO里工作过。在这里我把具体的培训以及技术队伍组建的内容去掉,只和大家聊聊关于游戏程序员切身利益相关的事。

  另外这不是居高临下来评判什么事情。我本人也不是多么高级的技术人员或者管理人员。只是坚持做一件事情年头很长教训很多而已。所以有些体验。文中所有评判其他结构或人水平低,并不是说我本人水平有多高。不要误会。

  1 ,C++游戏程序员现状

  中国C++程序员100%都是自学的。因为中国几乎没有象样的C++培训机构。大家都知道社会培训是赚钱为主要目的。能在那里成才是个大运气。 也不象JAVA有SUN公司一手推行。中国大学教育里也根本没有C++教学。关于C/C++基础课的知识,只是让学生入门。但对于实际的C++软件工程应 用,大学课本知识实践意义不大。最重要的是,大学里没有合格的C++老师。编程是门技术,叫手艺也行。而大学是搞科研的,多的是科学家,靠出PAPER教 科凭职称为生。并不是技术员。没有10万行以上代码经验和成功软件项目经验的人,很难教出中高级C++程序员。

  游戏制作业对C++程序员的要求是比较高的。比一般行业软件高很多。因为任何一个MMO都是个中大型软件项目。日使用人次达到几十万上百万,同时使用人数几十万在线的大型网络多人交互软件,集成了超过十几项专业领域编程技术的软件,想不大都不行。

  另外,中高级C++程序员能力一般都很强。因为都是自学成才,这需要较高智商,很强的自学能力,解决问题能力,和克服困难的毅力。但是这种人才 在游戏行业里人数并不多。抛开凤毛麟角具备整体大型软件架构能力的高级人才不谈。能够承担独立模块开发,具备独立解决问题的能力,写出在空间,性能,可维 护性等几个方面达到要求的C++程序员,也是很难找到的。而具备这些能力,同时又具备一些专业领域技术的人(图形引擎,网络引擎,等),更加稀少。

  所以,即便是大游戏公司,对于C++游戏程序员的需求,也是永远不能够得到满足。而已经在公司工作的C++程序员,不经过短则3个月,长达1年的锻炼,也无法真正胜任独当一面的C++游戏程序开发工作。

  2 ,MMO游戏开发对C++游戏程序员要求

  前面提到,所有MMO游戏都是中大型软件。软件占用空间,稳定性,性能,可维护性等各项衡量软件质量的指标,对MMO游戏软件的要求都非常严 格。远大于普通行业软件。这种规模和银行系统类似。而客户端和软件逻辑比一般的商业软件又要复杂很多倍。这就要求软件编写人员具备较高的程序编写素质。

  游戏软件中,解决好软件工程部分,只是项目的1/3。另外两部分是策划和美术/音频。从经验来看,需求变更对于MMO游戏软件,不是偶然事件, 而是一种MMO游戏软件开发的基本属性。游戏软件投入大,周期长,风险高。MMO市场变化也大,交互电子游戏发展迅速。游戏软件必须面对外界变动。又因为 开发周期长,所以软件需求变动成为了软件开发的一种基本属性。犹如复杂性是软件工程的一项基本属性一样。

  这导致游戏软件的开发充满了不确定性。交互娱乐不同于商业应用。娱乐是属于理性和感性之间的领域。而C++开发面对就是0和1的二元世界逻辑。这两个领域存在着不可调和的矛盾。这种情况,对C++游戏程序员提出了更高的要求。

  首先,基本C++知识,C/C++运用技能,必须极其扎实。并不是游戏软件开发用到什么平时书本上很难得到的知识点或者技能点。游戏C++开发 的知识体系和技能体系,利用现有C++书籍就可以满足。比如《C++ PAORGRAMMING LANGUAGE》《C++ PRIMER》《EFFECT C++》《MORE EFFECT C++》等。但是在开始游戏编程之前,把这些书本吃透并且实践熟练的人,非常难遇到。当然能够真做到这点的人,已经是个中高级C++程序员了。我曾经遇到 过一个,毕业工作不久就去了GOOGLE

  其次,对于面向对象的深入理解。是非常重要的。熟练掌握C/C++语法,编程技巧,只是满足了C++游戏程序员一部分要求。而面向对象观念的深 刻理解,会为大型C++项目开发带来翻天覆地的变化。 有时候,在一个10人以上并行开发的C++游戏项目中,面向对象方法会成为救命稻草。《设计模式》以及《设计模式解析》相关的书籍,也是必修课。

  最后,好技术人员的本质是自大的。这属于正常。但是如果这种习性影响了自身继续提高和团队合作。以及影响了其成为技术管理者和项目技术核心时, 那么这种技术人员的自身价值会大打折扣。 如果早日越过自命不凡这一关,扩大眼界,继续在综合素质上提高。在技术管理能力,架构能力上提高,其自身价值才会继续增长。落到实处,就是待遇和身家增 长。

  由于游戏开发的本质是团队开发。任何时候,只有对一个团队有价值的技术人员,其本身的价值才有可能得以体现。

  3 ,成长和技术发展路线

  一般技术人员发展有几个阶段

  1 ,具备独立开发局部功能的能力

  比如为某个UI编写逻辑接口函数。为某个LOGIN对话框编写自绘制控件等。

  2 ,具备独立开发和攻关某个功能模块的能力

  比如为游戏增加一个小型逻辑功能模块。

  3 ,具备独立设计并开发某个系统的能力

  比如设计和开发AUTOPATCH 系统

  4 ,具备解决技术难题,设计架构的能力

  比如开发网络同步仿真系统,开发一个中大型游戏制作工具

  5 ,具备整体架构,管理,协调其他人共同开发一个大系统的能力

  客户端主程,服务器主程,引擎主程等

  6 ,技术director

  制定技术发展方向,技术团队建立,技术管理等

  在迈向每个阶段的过程中,伴随的都是巨大的工作量和工程压力。有时候是跨越1年的失败等等。在公司项目不成功时转换单位,重新开始,或者继续做 为核心团队留在公司继续从新的机会做起,都是好的办法。但关键是吸取经验教训,尽量多学多练。并且结合自身长处发展。当然,游戏制作人员,最好还是依靠一 个核心团队。成为核心团队的一员。

  能够达到第三档的程序,已经是公司不可缺少的人才了。但往往程序员自身对自己的认识,和公司对其的认识,有时候会有差异。我碰到过一些人,脑子 好用,写东西很快。各种技术都有涉猎。但总是不放心让他独立开发设计某个系统。哪怕是相对独立的工具。也会被搞得一塌糊涂。要后面人不停擦屁股。可自己还 觉着自己水平很高。这种人浮躁,眼高手低,不愿意细致周全的做好一件完整的事。所以就可以看到他不停的跳来跳去,可在新公司的职位也没有见多么提高。公司 非常重视交给一个程序员一件事,他是否能完整,考虑周全的把事情做完。哪怕时间长一点,也不能不做完。这会给工程带来致命的后果。

4 ,发展待遇

  从自身经验出发谈一下公司是怎么考虑技术员工待遇的。

  前面提到的6档,粗略了划分了待遇水平。其实到了第三档,你的待遇已经是这个行业所决定的了。而不是某个公司决定的。因为游戏业大量缺乏这样的 C++程序员。如果具备这个水平,在几个大城市游戏公司找到工作并不难。大公司提升慢,还有我这种不到百人规模的公司要。所以行业价格才是公司要考虑的。 如果给少了,软件项目的C++程序员流失会带来较大影响。但给的多,其实是C++程序员自己的价值增长瓶颈。如果几年下来一直以为自己水平就该拿这么高, 结果到了一家整体技术水平比较高的企业,就会彻底傻眼。这个时候再放低心态去重新开始,对技术员来讲就是件很艰难的事了。

  在目前游戏行业技术水平普遍较低的情况下,哄抬程序员工资水平对程序员自身好处也不会很大。就算一个新手本来拿几千的水平,给他1万。他根本就 不会知道自己到底有多少水。一年下来也就多拿了3-4万人民币。可耽误的是学习,影响了心态。而那些心态好,知道努力方向的技术人员,干个3-5年后如果 有拿期权和股权的机会,比那些一开始虚高的人,身家就不知道高多少倍了。

  下面再谈谈我个人在招聘C++程序的体会。

  1 做为C++程序员,成长周期比较长。如果是新手(代码量少于2万,没有做过大型项目的),会考察3点。是否踏实肯钻研,有无责任心,以及是否够聪明。如今,满足这三点的人其实不多。

  责任心是人品,决定了是否对公司有贡献。这是最重要的。有些人其实很自私。这种人对公司贡献是负数。而且到头来,自身价值也很难起来。因为技术 是要靠游戏的商业成功体现价值的。要取得商业成功,就需要一个团队为一件事付出。是否踏实决定了能学会多少技术知识。关于智商,我是最近2年才意识到人的 智商确实有很大差别。干程序这行,智商必须越高越好。否则前途不大。

  2 如果是有过2-3年C++程序经验的人,应考察的是人品,是否自大,是否有合作意识,是否跳槽频繁。

  首先还是责任心。太自私,太为自己着想,时刻把自己利益看成最重要的人,到哪里都不会受欢迎。无论他技术有多好。

  然后考察的是是否自大。人最容易自大的时候,往往是对一门技术已经入门,取得一定的小成就。但是眼界还没有开阔,没有领略到这个领域真正深入的 技术知识。周围缺少好技术的人。这个时候,技术人员都容易自大。适度的自信和自大是允许的。但是目空一切就完蛋了,说明这个技术人员的提升空间很小。

  合作意识是游戏开发的关键。包括交流能力,思考和解决问题的思维方式。一个喜欢独来独往的技术人员,在游戏团队里是个很可怕的事情。因为游戏软 件不是一个人能够完成的事情。由于逻辑复杂,需要各种专业技术领域知识,需求变动频繁。每一步都需要团队通力配合。缺乏这种意识,或者对团队开发不适应有 抵触的技术人员,在游戏开发领域存活的希望不大。

  做为一个C++程序员,跳槽频繁的履历是很致命的。做C++时间长的人都知道。进入一个庞大的C++软件工程本身就需要不少时间。经过培训,项 目熟悉,在为项目做贡献,这个时间短不了。如果一个人经常跳槽,说明他一直没有踏实在一个项目里深入做过核心的东西。或者做失败一个马上跑掉。这种人公司 不敢要。

  3 对于有专项技能的程序员,比如图形程序员。C++只要入门有培训空间即可。但对专业要求比较高。应该是已经在某个技术领域钻研比较深。 当然最后在公司还是得成为使用C++熟练的高级程序员。因为任何专业领域的技术如果要应用到工程中,还必须用C++做工具。

  4 好的C++游戏程序员,其实不容易找。如果他干得好,早就成为项目核心成员。如果项目不错,自身待遇也会很好很稳定。不需要通过一般应聘渠道应聘。不是被拉到公司做核心技术拿期权,就是自己创业。

  这里我打个比方。网易有个云风。大家都知道他是大话西游2的客户端主程。他是中国第一个做开源C++游戏引擎的人。开放了一整套C++游戏引擎 代码。这是他大学时做的。毕业后去网易。有了平台,做成了中国历史上最成功的MMO之一。做为游戏技术人员,他的价值可以说已经是很高的了。到底有多高, 我们都不好瞎说什么具体数字。但可以这么刨析一下。

  一个经验丰富的C/C++程序员。有过中国自主研发在线过百万游戏的成功项目经验。目前有网易出钱让其独立领导队伍搞引擎和游戏产品已经快3 年。这样的一个履历,经验,本身就价值很高。他在任何公司都可以找到年薪几十万的工作。如果他具备管理才能。哪怕就是项目管理,或者技术管理能力。对于一 个上市公司,他能做出的贡献,应该用百万/年量级来衡量。如果他能找到一个商业人士,负责舵手,并且自己具备一定商业能力,独立创业。吸引的天使风险投资 也得几千万(否则做不了事,当然)。如果产品能做成,身家到达几千万是很自然的事。

  我相信中国游戏程序员水平,运气,发展空间比他高的人不多。那么我们可以拿他做个标杆。

  我知道很多人不服他。不过这里说的问题并不是关于他本人的。也不需要对他本人做什么服不服的评判。做为一个社会的人,不是靠能写多少行代码,代 码多么优雅水平多么高来衡量身家的。从这点说,技术没有转化为成功商业产品之前,它的价值为0。做为技术人员,社会衡量他价值的标准,并不是要去阅读代码 是否质量优越速度飞快。而是看他能为一个成功商业产品或者公司发展做出多少贡献。这个道理,几年前我还不太明白。而且我做为一个技术人员,相信多数技术员 同胞们都不太可能从根儿上理解和认同这个看法。这里不是评判水平,而是评判价值。你的价值代表了你能够拿到的待遇。这个不是某个老总说了算,某个公司说了 算,而是取决于人均GDP和当前行业发展水平,行业销售额的。我想这个道理也适用于所有游戏制作相关人员。搞制作的都是技术人员。

posted @ 2009-05-02 22:39 Henry Read 阅读(86) | 评论 (1)编辑

http://www.299.com.cn/bbs/thread-19890-1-1.html
Maya 2009 DVD全功能版 种子下载 (2.56G)


http://www.299.com.cn/bbs/thread-19870-1-1.html
Maya 2009 (无限正式版) maya2009下载

posted @ 2009-05-02 14:07 Henry Read 阅读(105) | 评论 (0)编辑

I play chess at Chess.com!
henrya2
Rating: 1200

Challenge me!
View my games