程序丨如何成为一名优秀的网络程序员(一):应该学什么
翻译:赵菁菁(轩语轩缘)
审校:李笑达(DDBC4747)
网络程序员,有时也被称为网络工程师,是站在所有在线多人游戏技术背后的人。试想一下一个大型MMOG是多么复杂,从不断变化的游戏世界,到一些玩家的黑客情结,再到全世界成千上万人的信用卡支付等等,这些背后都能看到网络程序员的身影。
网络程序员不仅要了解所有传统游戏程序员的微小细节,还要了解底层网络协议(如TCP,UDP),分布式状态管理(帧同步),延迟补偿技术(DR),客户/服务器体系结构,还有更多需要了解的知识。此外,他们通常负责所有的游戏服务器的规划、设计和实现。
理论上来讲,服务器开发和客户端-协议的开发有本质区别,但在游戏开发中,这两个工作往往是合在一起的,由一个人或一个团队处理。在这篇文章的大部分篇幅中,我都会把两者相结合作为一个主题来处理。
因为网络程序员需要承担这样的重任,所以他们的报酬往往很可观。而且现在对于网络程序员的需求比以往任何时候都多。
网络程序员的挑战
考虑到游戏的设计,网络模块很容易成为项目开发中三大最棘手的编码挑战之一——有时是最困难的。虽然硬件变得更快,更好的基础设施增加了带宽,但是年复一年,两个最棘手的网络问题几乎都没有变简单:延迟和分布式状态。
延迟的决定因素是线缆中电子的运动速度,这个因素在许多地方我们已经接近极限。分布式状态的问题是,计算机在不同的物理位置将永远不会百分之百同步(除非你神奇地把延迟减少为零),同样的原因,你只有在事后才能知道到底为什么不同步。
牢牢记住这些挑战,网络程序员有三个核心职责:1)利用技巧来掩盖延迟;2)用这些技巧帮助团队中的其他成员改变系统设计;3)实现一个完整的游戏服务器(与大多数游戏客户端开发完全不同)。
随着越来越多的游戏试图利用互联网连接,无论是核心游戏玩法(如MMORPG,快动作的多人即时战略游戏,或第一人称射击游戏),或次要的活动,如社区建设或改装,现在对于网络程序员的需求是最高的,而且似乎需求量只会越来越高。
“一报还一报”:天堂 II
教育背景
像所有的编程工作一样,网络编程需要一个学位。在计算机科学系学习是最直接的了,但只要这个学科仍然植根于计算机科学核心,并且所在学院拥有强大的传统的计算机科学系,另辟蹊径也是可行的。
没有学位,你仍然可能是一个好的程序员,但是一门主流的计算机科学课程会教给你很多东西,这将让你直接受用,没有它,生活会困难得多。一个没有计算机科学系的学院的游戏开发课程可能不会为你提 45 32737 45 14985 0 0 1630 0 0:00:20 0:00:09 0:00:11 3112供充足的传统资料,供你准备游戏编程工作。
对于目前在大学的人,你仍然几乎可以选择学习哪些模块或课程。然而,你应该考虑几个关键课程,下面我将列出一些主要的想法,你会想摆脱这些想法的。
在每一所大学或学院,这些课程可能会有不同的名称,但通过阅读“学什么”部分,并匹配课程描述或教学大纲,你应该能够找到一个差不多的课程。
如果你已经上过大学,想要复习,或者只是想不出勤上课,你可以试试麻省理工的开放课程。
建议课程
1. 数据结构与算法
学什么:如何为给定问题选择合适的数据结构。什么数据结构是可用的或标准的。如何为组合问题建立新的数据结构。
这个课程对于任何认真的程序员来说都是非常重要的,尽管它对于网络程序员来说是不必要的,比如,图形程序员。不过,它是非常有用的,有助于一个人理解整体游戏编程知识。
2. 计算复杂度
学什么:如何计算任意算法的空间/时间复杂度。用计算复杂度为给定问题选择算法。
这门课对于服务器编程非常重要。所有服务器开发中最大的一关问题是可扩展性,这门课将教你可扩展代码的基础知识。没有这门课,你编写的任何代码都不能很好地扩展,你将不得不通过尝试和犯错来学习。另一方面,计算复杂度课程可以让你预先计算出实际发生的情况。
3. 信息论
学什么:熵与情报的理论。许多不同的压缩和编码算法。纠错编码。差异修补。
信息论对所有底层网络代码至关重要。这门课教了你一半的知识,有关你需要编写好的线协议,用于在网络上不同计算机之间传输基本信息。信息论将特别侧重于那些在网络质量不好时能提高性能和正确性的算法。
4. 网络
学什么: ISO OSI七层模型。TCP 22-state有限状态机。UDP和TCP数据包格式。IP路由。SYN攻击。
在你学习的第二年,找时间上一个网络课程。你会主要学习来自互联网的特定协议,以及互联网如何将数据从计算机发送到计算机。你还应该学习IP栈的所有内容以及它们如何相互作用来解决(或导致)问题并增加(或减少)性能。
激战
5. 关系型数据库
学什么: “关系”意味着什么,为什么它很快。范式。SQL。
有些网络程序员从不使用SQL,但是有些人则经常使用。有一件事是肯定的:所有具有持久性的多人游戏,无论是游戏角色还是多人游戏系列,都需要一个数据库,而且几乎所有的情况下,这个数据库都是一个RDBMS。数据库始终是游戏服务器中最慢的部分,所以,在设计和开发服务器时,了解数据库的工作原理以及如何实现高性能是非常有用的。数据库在游戏中也逐渐变得越来越普遍,设计师开始让越来越多的数据“在线”。
6. 分布式计算
学什么:事务以及如何实施和使用事务。集群技术的不同体系结构。集群技术的操作系统和平台支持。分布式计算机间的消息传递和时间同步。
这些对于服务器程序员都是有价值的,尤其是MMOG程序员,有些游戏的规模在多物理服务器下仍运行良好,这门课对于想要建立这样游戏的人来说也不错。
7. 安全
学什么:标准安全协议。威胁建模。基本密码学与密码分析。
虽然你确实只需要了解唯一一件关于安全的事情(“永远不要相信客户”),但这是一个臭名昭著的领域,因为这个领域很少将好的理论转化为实践。关于安全的课有很多有用的例子,有趣的轶事,尽管你做出最大的努力,也几乎肯定会犯的一些错误的重要警告,以及怎样做来尽量减少损害。课程还包括加密的基本知识,但你很快就会知道,加密只是一个小工具,最成功的攻击根本不会打破加密——黑客通常会找到一个更简单的方法入侵。
英雄之城
专业领域经验
学历只会为你提供理论知识,如算法、协议和事实。如果你想要成为一名优秀的网络程序员,你也要学会所有讨厌的东西,学会那些本不该发生却总是发生的东西。
在现实世界中,甚至连互联网本身也从来没有像原先人们认为的那样发挥作用。一旦你开始与其他人的代码交互,你所学到的关于TCP和IP工作的一切都是值得怀疑的。
最根本的问题是:在任何给定的大型网络中,源代码只代表网络流量的一小部分,而你和你的玩家对其他流量没有任何控制权。
在本文的第二部分,我会大概介绍四个游戏,你可以在业余时间制作这些游戏来获得一些处理现实世界限制的经验——这种经验是将智慧从知识中分离出来的。
Adam Martin,NCsoft Europe的首席程序员,喜欢解决在线游戏编程中的难题,他已经花了近10年时间寻找这些问题。他拥有自己的专利技术,撰写了《游戏编程精粹》的第四部和第五部,并建立了一些初创公司。他的博客中有更多关于编程的建议和实用性技巧。
笔者特别感谢Jason Beardsley帮助完成这篇文章。
【版权声明】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权
今日推荐
添加小编微信,可享双重福利
1.加入GAD程序猿交流基地
获取行业干货资讯,观看大牛分享直播
2.直接领取60G独家程序资料库,地址在小编朋友圈
包括腾讯内部分享、文章教程、视频教程等全套资料
↓长按添加小编GAD苏苏↓