-
The Legacy Code Change Algorithm
(From the bookWorkingEffectively with Legacy Code)
When you have to make a change in a legacy code base, here is an algorithm you can use.
1. Identify change points.2. Find test points.3. Break dependencies.4. Write tests.5. Make changes and refactor.
-
What Is Legacy Code
(From the bookWorkingEffectively with Legacy Code)
To me,legacy codeis simplycode without tests. I’ve gotten some grief for this definition. Whatdo tests have to do with whether code is bad? To me, the answer is straightforward, and it is apoint that I elaborate throughout the book:
Code without tests is bad code. It doesn’t matter how well written it is; it doesn’tmatter how pretty or object-oriented or well-encapsulated it is. With tests, we can change thebehavior of our code quickly and verifiably. Without them, we really don’t know if our code isgetting better or worse.
-
自组织的网游金融体系
恶魔看了我那篇从游戏看货币以后找我随便聊了几句:
TrustNo1: 事实上,它应该做的是维护一个玩家自由发行货币的制度。就是玩家可以自行发行自己的货币。我发行我的trustno1元,你发行你的gigix元。
Gigix: 等会,你这个还是说不过去。比如说大家在游戏里发行金本位货币,那作为游戏运营商你还是得把游戏黄金和现实人民币锚定,不然问题还是一样。
TrustNo1: 锚定不锚定是玩家自己的事情。也就是一个虚拟货币和实物的交易平台。你愿意锚定黄金可以,你要愿意锚定你家的草纸也没问题,反正到最后锚定不了的自然关张歇业。
Gigix: 于是商业银行就浮现了。央行就在商业银行的博弈中浮现了。游戏运营商就创世了。
TrustNo1:类似央行的组织,未必就是运营商,极为可能的是行会。运营商会沦为打手。事实上我觉得游戏本身就不因该有钱币掉落的机制,货币应该产生于玩家之间的借贷。事实上运营上可以利用网络的优势提供信贷保证和追债,也就是说在网游里,小额的贷款的风险也是比较低的。
最有意思的是,这个设想离现实并不太远,因为它只需要两个前提条件。首先是一个虚拟物品和现实货币的交易平台,这样玩家就可以把自己认可的一般等价物(或者说穿了,虚拟货币)与人民币锚定。比如说恶魔发行T1元,他可以保证说:只要有人在这个平台上以1RMB兑10个T1元的汇率出售T1元,他就一定全额买入,这样他就绕过了游戏运营商,建立了自己的信用货币体系。而这个交易平台已经存在了,那就是Goodhope好望角——我还参与这个平台的开发了呢。
有了交易平台以后,下一个问题就是货币本身了。用作货币的一般等价物其获得成本应该极其低廉,同时又具备不可伪造性,这样才能充分降低交易成本以获得足够的流动性。网络游戏在这个时候体现出了与真实世界最大的区别:真实世界有无穷多的物品,一张白纸、一个贝壳、一片树叶……都可以成为信用货币的载体;而游戏世界里所有的物品都是受控的,你没办法随手抓一张白纸来写一份借据,除非游戏设计允许你这样做。所以前面说的玩家自组织的金融体系,其实只缺这一个条件:玩家自由创造物品。
想象这样一个情景:一个玩家可以到杂货铺花一个金币购买一千张白纸,然后把每张白纸裁成十六份,然后用一个小法术在每个小纸片上写上“100T1元”。如果游戏允许玩家做这样的事,游戏本身不断贬值的阿兹台克金币就会失去其虚拟货币的地位,我们就会看到整个金融行业的进化史。这会是真的吗?
-
自组织的网游金融体系
恶魔看了我那篇从游戏看货币以后找我随便聊了几句
-
天地不仁,通货在膨胀
云风写了一个“网络游戏的技术基础”,作为对我说的“技术派路线”的回复。当然毫无疑问技术最终是一切制度得以实施的保障。“技术上能做的,也是首先要做的,是建立一些可以被实现且简洁的基本规则出来。它的首要目标不是对现实模拟的拟真度,而是可实现性”——从云风这句话可以产生很多联想,譬如说,天地不仁,以万物为刍狗。
《计算中的上帝》有些东西会让人对神祗很感恩,比如说电磁力和引力之间的平衡只要偏差10的负40次方,这个宇宙就不会有任何碳基生命存在。但感恩的同时也会隐隐的有些遗憾:如果采用了另一组规则,这个世界会是什么样子?很多大手笔的科幻小说和YY小说和穿越文以“改变简单规则的后果”为题材,可见这种遗憾心态之存在的普遍性。
真实世界里没有的机会可以在网络游戏里出现——我上大学的时候写过一句话:科幻让我做梦,编程让我梦想成真。而相比电磁力强度之类比较难想象并且造成的后果太过剧烈的调整,对经济规则的调整更具现实意义。比如说一个滥发金元券的社会是什么样子?我大一的时候就知道了,而且有趣的部分是这样的社会能养出一批崇尚清谈的有闲特权阶层。如果上帝真在天上看这个世界的话,我觉得他未必会认为这样的世界就不好。再比如说我老爸每天玩联众台球,他并不在意自己的分数有多少,为什么,因为这个世界的价值体系不同。
但另一方面,如果打算把现实世界的价值体系代入游戏世界,这事情就变得有意思了。比如某同学在云风的blog上回复的“打怪掉东西,卖东西赚钱……打怪不要掉钱”,明眼人一看就知道这个行不通:掉东西跟掉钱是同一回事,玩家自会找到这个游戏世界的一般等价物。另一个貌似有道理的回复“游戏世界加以通过一定手段,固定消耗玩家通过买卖东西得到的金钱(回收央行放出的货币),避免通货膨胀”同样行不通:且不说央行有没有这个动力去避免通货膨胀,首先从技术上他就做不到,因为他根本没有依据来判断是否正在发生通货膨胀。
(云风可能会说,借助精妙的技术可以做到完美监控货币发行。这事情中国政府干过,失败了,所以云风要干难度也必然不小。)
所以如果要代入现实的资本主义价值体系,解决通货膨胀的办法简单并且唯一:虚拟货币与人民币锚定,游戏央行确保虚拟货币能以汇率兑换成人民币,那游戏的通胀就决然不会超过CPI。这才正经是以万物为刍狗。用精妙技术调节,那是大道废有仁义智慧出有大伪。当然从游戏的角度来说,资本主义价值体系是不是合适这本身就是非常值得讨论的一个问题,比如说暴雪似乎就不这么认为。
(故事到这才刚开始。昨天我太太无意中说了句:“这腾讯俨然就是个地下钱庄啊。”哎,正中要害。虚拟货币和人民币一锚定,拥有几千万玩家的网游运营商不就成了金融机构?不过既然支付宝都能扶正,这个问题至少在技术上是能解决的,虽然难度非常的不小。)
-
做起来,就敏捷
敏捷不是理论,是各种各样的实践。
敏捷不是一个非黑即白的东西。做起来,看得见,就能够更敏捷一些。
-
咨询是一种心理状态
刚才看到一篇blog:如何运营发展一个科比球迷网站
我是什么时候做科比球迷网站的?大概是98年或者99年吧。现在那些科比的小球迷们,还有多少人记得Eddie Jones和Nick VanExel呢?那时候大家还不用Google,在搜狐搜索“湖人”或者“科比”,我的网站都曾经是排第二名的。
但就是没坚持做下来。我觉得这是我、以及很多ThoughtWorkers、或者说这些自认为很聪明并且确实很聪明的人的一个大毛病。我们只喜欢做最刺激的部分,但一个成功的事情不仅包含最刺激的部分,甚至最刺激的部分并不是最重要的部分。只有在最难的时候坚持住,在觉得特别没劲的时候还一直做下去,把最琐碎机械的事也做到好,事情才能做成。
比如说,在科比表现不佳的时间里,在夏季休赛的时候,也一直坚持着维护他的球迷网站。这没有任何刺激的部分,从山间小树的帖子就能看出来。我有时候想,如果我能这样做事,现在中国最好的科比球迷网站大概就是我的吧。
所以,这就是为什么我只适合做咨询的原因。这种情况至今没有变化。这也挺好的。
-
从游戏看货币
云风在七月时写的“游戏中的货币”,今天我才看到。恶魔以前就经常说,网络游戏是研究经济学的一个绝佳场所,因为它纯粹并且快速。像云风这样有兴趣研究又有大量的第一手资料,在经济学领域有所建树的机会非常大。
第一个问题是:货币的产生并不完全是靠央行对商业银行的借贷。或者准确点说,这种借贷只是货币创造过程中的一个现象。实际的货币产生过程比这还要简单:利率就是流动性的摩擦力,央行通过调低利率就可以增加流动性从而实现货币的发行(即使央行本身并不增加任何额外的贷款);同样的道理,通过加息就可以实现货币的回收。现代金融体系是信用体系,通过控制流动性就可以调节货币供给。(这本《货币银行学》的第11章“银行信贷与货币创造”应该会包含所有的技术细节。)
第二个问题是:云风的解决方案始终都是技术性的,甚至还说“与人民币挂钩并没有和打怪、做任务领取奖金这些玩家自由投放有本质的不同”——从实现层面上来说确实如此,但从制度层面上来说就完全不同了。云风自己也意识到,虚拟货币与人民币挂钩会使虚拟货币投放量变少。那为什么会变少呢?没有信用锚定的货币很容易通货膨胀。七个人分一盆粥,你可以用精妙的技术来实现平均分配,但其实还有更容易的办法,不是吗?
即便云风坚持自己的技术派路线,第三个问题也同样严重。根据宁波的这个案例,虚拟财产也是财产,同样受法律保护。这事就很有意思了……如果虚拟货币不与人民币锚定,云风等人身上的责任可就更加沉重了:一旦发生通货膨胀,袁大头变成了金元券,游戏运营商就难辞侵犯玩家虚拟财产之罪——有宁波案例在先,那就不光是玩家起哄投诉的事了。用技术弥补制度缺陷,这事一向不好办,所以云风的工作是伟大而值得尊敬的。
-
Do not program "defensively"
(FromErlang Programming Rules)
A defensive program is one where the programmer does not “trust” the input data to thepart of the system they are programming. In general one should not test input data to functions forcorrectness. Most of the code in the system should be written with the assumption that the inputdata to the function in question is correct. Only a small part of the code should actually performany checking of the data. This is usually done when data “enters” the system for thefirst time, once data has been checked as it enters the system it should thereafter be assumedcorrect.
Example:
The function will crash if Option neither normal nor all, and it should do that. The caller isresponsible for supplying correct input.%% Args: Option is all|normalget_server_usage_info(Option, AsciiPid) -Pid = list_to_pid(AsciiPid),case Option ofall - get_all_info(Pid);normal - get_normal_info(Pid)end.
-
琐碎的伟大
Alexey告诉我,在德国的RailsConf Europe大会上,很多人对我们说“谢谢”,谢谢我们做出了那么好用的production stack。Alexey说,我们肯定是干了些了不起的事情。
整整一年没联系的S,原来去了奥组委工作。仍然是编辑出版的工作,S也说,最初的激动过去以后,日常工作还是很琐碎的。
事情就是这样的吧。事后看起来很了不起的工作,正经在做的时候,也都是些很琐碎的小破事。唯一的区别是,它事后看起来是了不起的。
结论是,即便仍然是在做着琐碎的小破事,也希望它们是了不起的工作中的一部分。