【我与游戏】(七) 反思

“人生中最困难的事情就是认识自己。”
                                     ——希腊谚语

前言

我写本系列文章的目的,不仅在于记录自己的游戏生涯,更重要的是从这些经历反观自身,认识自己。进入社会十二年,如同身处大海一般,一直在随波逐流,浑浑噩噩,不知该去向何方。我想,是时候该好好反省一下了。

之所以选择游戏为切入点,是因为生活中的诸多选择都难免受到外界因素的干扰,或因生活所迫,或因外界压力,不能真实地反映自己的内心。而游戏则提供了一个只属于自己的理想世界,我不会在这里欺骗自己、做违心的事,因此所做的每个选择都真实体现了我的内心。 Continue reading 【我与游戏】(七) 反思

关于人生目标

子曰:“吾十有五而志于学,三十而立,四十而不惑,五十而知天命,六十而耳顺,七十而从心所欲,不逾矩。”
 ——《论语·为政》

为什么我们需要目标

人生就像在大海中航行。你所停留的每一所学校,每一所公司,就是大海中的一艘船,分别开向不同的方向。我们总是爬上一艘船,停留或长或短的一段时间,然后或者体面地跳到别的船上去,或者很狼狈地被踢下船,在海中挣扎一段时间,然后又爬上另一艘船。

当你有一个明确的目标时,你可以每天测量当前所在的坐标到这个目标的距离,从而了解自己的人生是否行使在正确的方向上。你可以寻找与目标选择方向一致、最大最快的那艘船,这样可以更快、更平稳地抵达目标。当所乘的船偏离航向时你可以有所警觉,及时修正船只的航向,或者换一艘船。如果实在没有合适的船,在条件允许的情况下你还可以试着自己去造一艘。 Continue reading 关于人生目标

欲速则不达

子夏为莒父宰,问政。子曰:“无欲速,无见小利。欲速则不达,见小利,则大事不成。”
————《论语·子路》

事件

几天前,在测试一个远程部署shell脚本的时候,因为错用了单引号导致本地参数没有传递到服务器上,结果就发生了这样的悲剧:

rm -rf /$ROOT/$PATH/$FILE #结果执行的是 rm -rf ///

脚本运行后就蹦出大量的/sys/下文件无权删除提示,一看不对赶紧停掉脚本,服务器已经挂了。经过一天的抢修服务才恢复运行,幸好终止的快,只删掉了部分系统文件,生产数据没有受到损失。

反思

Continue reading 欲速则不达

藏钱包的小男孩

当我回过神来,发现自己正坐在一间教室里听课。

讲台上传来一个非常古怪的声音,低沉且悠长,声调忽高忽低,我集中注意力去听,却发现怎么也听不懂在讲什么,自己反而快听睡着了。

定睛看去,讲台上的老师拿着书,正在黑板上奋力挥舞粉笔,拳头大的字已经铺满了大半块黑板。我盯着那些字,努力想看清楚他写的是什么,可是直看到眼睛酸痛也没认出一个字,只好放弃了这个想法。于是我把注意力从讲台上移开,环视一周。

这是一个大班教室,座位没有坐满,前排的座位稀稀拉拉,而后排的座位却相当受欢迎。我坐在最后一排靠窗户的位置,周边的学生交头接耳,叽叽喳喳说的不停,时不时传来一阵阵笑声。

“看来这门课不太受欢迎啊”,我想。

我将目光投向身边的一个小男孩,他正在和同桌在作业本上下着五子棋。我想问问他现在上的是什么课,但是他下得非常地专注,以至于我碰了他好几下,他都没有回过头来。我又看了看周围,原来这间教室里的学生都是一些小孩子,好像只有二三年级的样子,我正在一所小学听课!

不知道为什么我会来到这里,课又听不懂,四周的人也无法沟通,于是我决定一下课就离开这个地方。 Continue reading 藏钱包的小男孩

人生如游戏,请随时存盘

我为什么要写文章?

不知从何时起,我开始记录自己在各个游戏上的经验心得,写了一篇又一篇的教程。将自己脑中思索已久的想法、探索的经历、实践过的经验写出来,实在是一件很快乐的事情。为了这种快乐,我宁愿花无数个小时去码字,排版,配图……

我不禁要问自己,这种快乐的来源是什么?

人的本性是自私的,我也不会例外。为什么把自己辛苦得来的经验分享出来,会让自己得到快乐呢?是为了获取别人敬仰的目光,满足自己的虚荣心吗?还是好为人师,想体验那种优越感呢?

我找到了另一个答案:为了证明自己的存在

那些分享经验心得的文章,证明我曾在这些领域努力过,证明我在那段时间里存在过。这些文章可能会帮助到一些人,也可能会误导一些人,但我的思考和实践会对他们有一定的参考价值,可能会帮助他们解决问题,减少他们犯同样错误的可能性,或者给他们不同思路的启迪。

在一个人的生命中留下你的足迹,使他的生活变得更美好(节省时间、减少痛苦、欣赏美丽……),哪怕施加的影响是极其微小的,这就是你存在的价值。如果你能持续这种影响力,那么你的生命就是不朽的,你就在世间永存。

准备随时死去

人类之所以有别于动物,就是可以通过语言和文字将自己的经验和思想传承下来,而子孙后代通过学习可以快速掌握几代人穷尽一生才探索到的知识。一个人的生命是有限的,而其人生的价值就在于留给后人的东西。

相信玩游戏的朋友们都知道Save / Load大法,其实人生也是一样。

我永远无法知道明天会发生什么事情,自己的生命可能在任何一秒钟终结。而当我死去的时候,我的肉体,拥有的能力,掌握的知识,以及脑中的各种思想都将不复存在。这个世界上我所存在的证据,就是我创造过的一切。我写的文章,我画的画,我写过的程序……

我不希望在死去前那一刻,想到自己还有很多想法没有说出来,还有很多事情没来得及告诉别人……那是多么绝望和痛苦的感觉?那种感觉就像写文章写了几千字,突然停电了才想起没存盘一样。

所以我工作时会建立文档,记下只有自己掌握的知识和工作流程,在必要时可以随时交接。写代码时要经常重构,保证可读性并把自己的思路注释清楚,保证自己可以随时离开。

当我把自己知道和想到的东西都写下来时,我心中感到无比地踏实和满足。就像刚刚离开一个存盘点,在未知的领域迈出新的一步一样,我不惧怕包括死亡在内的任何危险,因为我的经历和成就已经保存下来了。

“随时存盘”是一个好的习惯,游戏一样,工作一样,人生也一样

我所信奉的编程哲学

从去年到今年,陆陆续续看完了《代码大全》《重构》《代码整洁之道》《程序员修炼之道》以及《The Art of Readable Code》,获益匪浅。下面就分享几条我赞同并信奉的编程哲学,顺便废话几句。

本文适合有一定编程经验的读者阅读,高手请轻喷:)

一、代码是写给人看的(Coding for Reading)

请先思考,评价一段代码优劣最重要的标准是什么?

有个著名的图,相信大家都见过,讲的是Code Review时被骂WTF的次数越少,代码的质量就越高。这虽然有点无厘头,但是却不无道理。

《The Art of Readable Code》中告诉我们,评价一段代码的质量的最佳标准是可读性,即别人理解代码意图所需要的时间。

可读性有什么用,我写出一段代码,能完成目标,能通过测试不就行了吗?

不管你是团队开发,还是一个人单干,只要项目还在运作,代码总是要有人来维护的。如果有一天你不在或者离开了,别人应该能很轻松的看懂你的代码,而不是猜来猜去,最后还要来问你,甚至弃用整段代码重新再写。作为一个负责任的开发者,应该尊重自己的劳动成果,也尊重别人的时间。

当你写下一段代码时,脑子里有清晰的逻辑(比如这里必须这么做,因为……这里不能那么做,因为……)。而别人看这段代码时,脑中是一片空白(这个变量是干什么的?为什么要多加一层判断?这个数为什么是 2 不是 3 ?),除非能完整复现你当时脑中的逻辑,否则就不能理解这段代码。

所以我们应该做的是,把写代码时脑中想到的逻辑的每一个细节,尽可能地写到代码以及注释中,从而帮助后来的阅读者快速复原整个逻辑。简单来说可以有以下的方法:

用常量代替魔术数

在一段代码中出现 if ( level > 3 ) …的时候,也许你会想:为什么是 3 不是 4 呢?这就是所谓的魔术数。通过上下文也许你可以判断出这个 3 是指最高等级,但是可能这段代码中 3 出现了好几次。你会迷惑:它们是不是都是一个意思?当我要把最高等级改成 4 的时候,是不是应该修改所有的 3 ?

如果代码的作者定义一个常量MAX_LEVEL = 3,同时还有一个常量USERS_PER_PAGE = 3,并在不同的地方使用不同的常量,就不会有这样的混淆了。

使用富含信息的类名、变量名和函数名


doit();
$return = $str2 . ':' . $str3;
return $return;

这样的代码,简直就是人工混淆过的。你会发现这些代码根本不能帮助你理解代码的含义。

也许你该写成这样?


handleError();
$error_message = $error_code . ':' . $error_status;
return $error_message;

在注释中说明一段代码存在的原因,而不是行为

$('#item').html(''); //清空item的内容

这样的注释有意义么?用自然语言重新描述一次代码的行为,除了徒增维护时的工作量外没有任何价值。你应该说明为什么这样做,以供别人看到这段代码时明白你是怎么想的,并决定如何修改或者对待这段代码。

$('#item').html(''); //先清空容器的内容,否则可能导致内容重复

二、写得越少越好(Less is More)

这个规则的使用性太强了,我简单说说减少逻辑层次和缩小函数体这两个方面吧。

减少逻辑层次

当逻辑层次超过三层时,理解这段代码的难度会急剧上升。我相信谁也不喜欢去读一个n层括号的表达式,或者面对n层缩进的条件判断/循环。

对于复杂的表达式,通过提取中间变量来降低表达式的逻辑层次,保证每个表达式的逻辑层次不超过二层。

对于多层条件判断,大多数情况可以用防御式编程将其简化成单层的条件判断,尽早return或者exit。此外,单行的if-else判断往往可以用三元操作符替换。如果判断实在太多,也许你该重新设计一下结构了。

缩小函数体

记得有一位语言的创始人说过:“我不喜欢比我的头还大的函数”。

事实上,大家都喜欢短小精干、一眼就能看到底的代码。简洁明快的代码有助于别人迅速理解代码的意图,也方便快速定位问题。如果一个函数要滚动屏幕才能看全,那你往往要不断地来回滚动,并强迫自己记住一些信息,再返回去看另一部分,这样做会非常累。

随着函数体不断膨胀,理解它所需要的时间随之增加,出错的几率也会大大提升。而且越大的函数,可维护性和复用性越差。当部分代码逻辑需要修改时,不能快速定位到要修改的位置,也难以确定函数体其他位置是否也需要对应的修改。

当函数尺寸失控时,首先要想到的是,有没有其他方法,用更少的代码完成这个任务?能不能用正则表达式?能不能用查表法?有没有内置的库函数可以利用?

面对一个无法再简化的流程,将其拆分成细粒度的步骤,将每个步骤的相关代码分离出来,提取成子函数,再给子函数起一个漂亮的名字。这样可以降低理解主流程的难度,在做修改时也可以通过函数名快速定位,而且因为相关的代码都在一起,不容易漏改。

也许你会怀疑调用函数所造成的性能损失,我想说现在这个时代,手机都马上四核了……

三、不要重复(Don’t Repeat Yourself)

看过《重构》一书后,我看到代码中任何重复的地方都如见眼中钉。

重复是万恶之源,当你发现你在对代码的不同部分进行同样的修改时就要警惕了。改的地方越多,就越可能出错。也许忘了改一个地方,也许错改或者删除了周边的代码……永远不要让这种事情发生!

将重复的代码提炼成子函数


$('#count').text( + $('#count').text() + 1 );
...
$('#count').text( + $('#count').text() + 1 );
...

如果一段相同的代码出现两次,基本上你还会第三次用到它,所以很有必要将其提炼成子函数。这样不仅可以减少代码量,还可以降低维护的难度。


countPlusOne();
...
countPlusOne();
...
function countPlusOne() {
$('#count').text( + $('#count').text() + 1 ); //以后修改只用改这里就好了
}

如果有几段代码很相似,往往可以提取其共性逻辑,使用不同的调用参数进行区分。


countChange( +1 );
...
countChange( -1 );
...
function countChange( change ) {
$('#count').text( + $('#count').text() + change );
}

用循环减少重复


$item[ 'id' ] = $_POST[ 'id' ];
$item[ 'name' ] = $_POST[ 'name' ];
$item[ 'mail' ] = $_POST[ 'mail' ];
$item[ 'qq' ] = $_POST[ 'qq' ];

如果有大块逻辑雷同只有一两个地方更改的代码,往往可以用循环来解决:


foreach ( array( 'id', 'name', 'mail', 'qq' ) as $key ) {
$item[ $key ] = $_POST[ $key ];
}

青少年请谨慎选择网络游戏

『前言』

看到题目不要把我和什么社会现象研究所之类的老头们联系到一起,谢谢。

前几天受命去一个地方给某重要人士(地税局滴-_-!)修电脑,因为他家里有个儿子上高中,从电脑基础知识不知不觉就谈到游戏和网络游戏。在目前社会对游戏和网络游戏一片打压声中,和我一样的青少年朋友仍然乐此不疲。我本身是个玩游戏从小玩到大的人,各类游戏都有接触,也曾深陷于网络游戏,经过无数日日夜夜的思考,确立了自己对游戏的看法。因为这个思想在脑子里已经形成很长时间了,所以几乎是脱口而出。后来想想,有必要把这些东西写出来,无论是舆论对游戏的态度,还是人对游戏的态度,应该都会有好方面的影响。

『单机游戏』

单机游戏就是一个人玩的游戏。种类繁多,RPG角色扮演、ACT动作、AVG冒险、SLG策略、RTS即时战略、FGT格斗、STG射击、FPS第一人称射击、PZL益智、RCG竞速、SPT体育、TCG育成、CAG卡片、LVG恋爱、MSC音乐,乃至各种各类的休闲小游戏。恩对了,不能忘了还有H-GAME……

老一辈们至今无法理解为什么青少年喜欢玩游戏,就像无法理解为什么青少年喜欢看动漫一样。

动漫以其画风、剧情、人设、音乐乃至声优吸引人。而所谓游戏的特点就是虚拟和互动。可以在游戏中圆现实中不能实现的梦,是为虚拟。可以在游戏中自己决定一切,视为互动。游戏之所以吸引人,其最重要的本质就在于此。今天的青少年是喜欢自己做主的一代,尤其是在社会、家庭、学校中事事不能自己做主的情况下,游戏自然而然就成为必须品。

从感受剧情、文化和人物心灵的RPG和LVG,到体验华丽动作的ACT、AVG和FGT,运筹帷幄的SLG、CAG和RTS,紧张刺激的RCG、STG、SPT和FPS,以及动手动脑的PZL、MSC,打发时间的休闲游戏,感官刺激的H-GAME,每类游戏都因自己的特点而拥有大量的FANS。

经常在报纸和网络上看到大学生乃至研究生被骗之类的新闻,中国的学校教育能教出一堆学术上出类拔萃的人才,同时也教出一堆社会经验为零的废材。而事实上,绝大多数游戏给予了玩家在现实生活中很少有机会得到的体验机会。在现实中我不能开车,但在游戏中我不但可以开车,还可以开飞机……除了新鲜刺激外,得到的经验和思想也是宝贵的财富。在现在这个只要能上网有吃有喝有地方睡觉就能过日子的时代,去哪里找这么多体验机会呢?

同样是体验,游戏和现实不同的是给你重头再来的机会。经营不当破产了可以LOAD,开车撞了可以AGAIN,进入死局没有希望后还可以START NEW GAME。而现实中呢?很多情况是不可挽回的。不得不承认,某些在游戏中学到悟到的道理,在现实中往往只有付出惨痛代价后才能明白,甚至根本没有明白的机会……尤其重要的是,在自己的经历中得到的经验教训,要比看书听课学到的记得更牢更久。

所以在保证考试及格或完成工作的前提下,游戏一定要玩,还要多玩,没有坏处。

『网络游戏』

网络游戏就是人和人玩的游戏。基本囊括了单机游戏中所有种类,只怕只剩下ACG、LVG和H-GAME没办法对战了。

和单机游戏的本质区别是,网络游戏增加人与人之间的互动。我将网络游戏分为两类,一是无论投入时间和金钱多少,起点都基本公平的对抗型网游,一种是投入时间和金钱越多就越强大的升级型网游。

对抗型网游以技术为重,等级只是侧面的表示,真实水平与等级无关,一般没有装备概念,即使有也对公平影响不大,如CS、星际、劲乐团、棋牌类。你玩了5年CS,我只玩了1年,你也不会比我多1点HP。你买了5年联众会员,也不会在下象棋时比我多一个兵。时间和金钱不起决定因素,就是这个概念。

升级型网游以装备和等级为重,等级和装备代表了实力,同时加入了PK的概念。例子就不用举了,当前宣扬“永久免费”的基本上全部都是。练级时间多的人必定比练级时间少的人强,装备好的人必定比烂装备的人强。在此类网游中形成了一个虚拟社会,有处于最上层的公会老大、PK之王,也有最低层的新入门菜鸟。投入的时间和金钱决定了一切。

在对抗型网游中,玩家更多体验的是游戏本身。技术决定一切,而投入的时间和金钱与技术不成正比。为了变强就得不断学习和练习,提升技术。技术是属于你自己的,可以带走的东西,即使这个游戏运营公司倒闭了,换个同类型的游戏,水平和思想犹在。

在升级型网游中,玩家更多体验的是和人的比较。玩家生存在等级和装备决定一切的世界中,为了变强就只有拼命练级打装备,甚至RMB买号买装备。而等级和装备是带不走的,同款游戏换个服务器你就成了垃圾,技术再强也没有用。如果游戏运营公司倒闭了,就一无所有了。

众多导致青少年沉迷甚至走上犯罪道路的网游,绝大多数属于升级型网游。

为什么我宁可旷课去杀怪升级?因为我比人多练一天可能就比别人等级高一点。为什么我要练级?因为等级高了就比别人优越,杀怪别人要两下我只要一下。为什么我要打装备?因为穿着好装备比别人帅,而且打怪PK更厉害。为什么我要PK?因为可以彰显我的实力,还能得到别人的装备。为什么我肯拿买书包的钱去买装备?因为我可以对之炫耀装备的人比看我书包的人多得多。

升级型网游中对装备和等级过度的重视,为了网游中的虚荣心、成就感,直接导致了玩家不得不投入大量时间和金钱来换取游戏中的成功。上班的成年人一旦权衡不当尚且有影响,时间和金钱极其宝贵的青少年们,投入大量时间和金钱就可能直接造成严重的影响。我始终相信一条叫作“涉及到金钱就可能涉及到罪恶”的真理……

网络游戏和单机游戏的虚拟现实不同,单机游戏的虚拟现实是基本固定的,而网络游戏的虚拟现实由众多玩家构成。正所谓“林子大了,什么鸟都有”,现实社会中的黑暗面自然也会渗透进来。PK和现实中的抢劫有什么区别呢?盗号、骗装备,和偷钱包、诈骗有什么区别呢?不同的是现实中有公安和法律来监管,而游戏中只有那么几个GM而已。缺乏监管的虚拟社会,滋生的罪恶对缺乏社会历练的青少年来说,简直是最适合的毒害对象。

『结语』

在这里我不想批判任何网游,只想将一些现象的本质剖析一下,供大家参考。据说在日本很多网游玩家是退休后的老人,他们一生中该做的贡献做过了,该体验的体验过了,闲下来用游戏打发余生,而我们中国90%以上的玩家是正应该发奋图强的青少年……

练级型网游容易对青少年产生不良影响,而这种影响使社会舆论对整个游戏范畴进行了否定,闹出前段时间广电总局居然会因为“是网络游戏”而封杀仙剑奇侠传的笑话,以及现在的家长谈游戏色变,倒洗澡水的时候连小孩一起倒掉,游戏好冤啊……

我们真的应该理智的面对网游了,一个单机游戏DIABLO发展来的升级型网游模式,演变成今天这个状况,值得我们沉思。我不想对利用了人性的弱点而让金钱流向自己的网游运营公司说什么,只想对那些沉迷于在网游中,一面没日没夜练级,一面在人前炫耀攀比的青少年们说:来玩玩扫雷吧,来玩玩魔方吧,来玩玩星际吧,来玩玩投入的时间和金钱与游戏质量不成正比的游戏吧,这样你会活得更轻松,会有更好的心情玩更多的游戏……