首页 > 代码库 > [业余项目]黄金点游戏
[业余项目]黄金点游戏
准备业余时间做一下这个:
创新的时机 – 黄金点游戏
结对和团队项目建议 - 黄金点游戏
---------------------------------------------------------------------------------------------------------------------------------------------------------
在《移山之道》里, 我提到移山软件学院的游戏:
阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。
玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动。
如果你和其他20 个聪明人玩这个游戏, 你会选择什么数字呢?
[现在请记下你的数字, 以后不能改]
你会想, 如果大家随机报数的话, 0-100 的平均数是50, 50 * 0.618 = 31. 那我就来个 31。
但是其他人也不是傻子, 他们肯定也想到了这一点。如果大家都选 31 附近的数, 那我得选 31*0.618 = 19;
但是这些人肯定也想到了这一点, 那我要选 19 * 0.618 = 12… 然后 12 * 0.618 = 8 …
最后干脆选 0.0001 好了!
0.0001 是正确答案么? 这取决于参与游戏的所有成员。
这个游戏不是我发明的, 我曾经在网上看到过一两篇博客提到这个游戏的来历, 其中一篇在 live space 的博客提到这最早是英国某报纸给读者出的一道题目,现在这篇博客随着live space 的消逝再也找不到了 (sigh!)。
我第一次实际玩这个游戏, 是2006年和华宏伟老师,黄雪斌老师在清华软件学院的一个(MS^2)培训班上,两年后, MS^2 的网站连同许多同学的博客也消失了 (sigh!!).
尽管如此, 这个游戏成了我“现代软件工程”课的固定节目, 在不少大学的计算机系都玩过。有一年春节一个叫 nullgate 的同事抽中夏威夷旅游大奖,但是他决定让出, 我们部门也使用这个办法来决定幸运者。
根据我多次观察, 第一次游戏的获胜数字一般离这个数字不远:
17
看出来同学们进行了平均两次的(0.618)迭代。如果继续玩下去, 这个数字会变么? 虽然说两次游戏之间没有任何联系, 是概率中的独立事件, 但是前一次游戏的 G-number 给了所有参与者一个强大的暗示, 以后游戏的G-number 一定会向下走。 下面是清华2008 年秋季学期一个叫“贝爷” 的 TA 给连续12次游戏做的记录,从趋势看, 数值会逼近0, 但是变化也不是一帆风顺的, 每次触底之后, 就会小小反弹一下。
对于这个游戏, 不同的人有不同的领悟。 我也贡献几点:
赢者通吃
这个游戏规定第一名得到全部的分数, 第二名(不管多接近)到倒数第二名都是 0 分,最后一名还要倒扣分。软件行业就是一个赢者通吃的坏境, 最后一名还要把自己的身家倒贴进去。
螳臂当车
在游戏中, 经常有一两个同学逆历史潮流, 提交一个 99.999 之类的分数。但是从大趋势来看, 这些捣乱分子对大局影响不大。我经常看到几个同学面带微笑小声商量,一起提交几个最高分来搅局,但是G-number 还是由大多数人决定。另外不是所有口头同意搅局的同学最后都“守约” 提交了大数字… 这也是“囚徒的困境”的一种。
只先一步
参加游戏的人都是在top N 的大学生, 或者IT 从业人员, 数学足够好, 都是聪明人。我把题目公布之后, 一些人马上就说– 这肯定收敛到0啦! 他们交上来一个 (0.00001 ) 的答案 (提交的数字必须大于 0 )。遗憾的是, 一起玩游戏的人其他人不这么想。 一个小团体, 或者一个小社会的社会共识 (consensus) 从来不是最激进的, 每个个体发出自己看似随机的声音, 它的进步是缓慢的, 有时还倒退一下。 如果只看微博上的发言, 你会觉得德先生和赛先生早已是国人的共识; 如果只参加最前沿的科技沙龙, 你会觉得明天大家都会用人体嵌入智能芯片同时会同步电子书邮件微博微信SNS再加GPS再有云计算,你如果不推出相应产品就会被淘汰… 但是社会作为一个整体还没有进步得这么快。
那些成功的企业只是比大众的平均值先走了一小步(平均值 * 0.618), 就是这一小步, 让大部分人看到了产品的“相对优势”从而接受产品。关于技术创新, 一些趋势(例如社会网络),大家早就看到了, 也有一些产品推出, 但是往往最后成功的产品成功在时机上。 一本很有名的书 - cross the chasm 描述了大众对新技术接受的曲线, 曲线下面的面积大致对应人数。大众平均值的0.618 就在“Early Adopter” 那里, 有时一个崭新的技术, 推出的时机太早 (它的值比G-number 小一点), 它就跨不过那道沟 (Chasm).
做前沿研究的人, 可以早于其他人很多年提出新想法, 但是这些想法一般都是在“Innovator” 那个圈子里有影响, 这些想法要等若干年才能由成功的企业家看准时机推向大众市场。
Technology Hype Cycle
说到时机, 任何新技术都有一个自身发展的规律,Gartner 的Jackie Fenn 写了一个很有意思的报告, 提到了Technology Hype Cycle。
随着一个新技术经历不同的阶段, 公众对它的期望值, 炒作值也有很大的差别.
1)技术触发期 (技术走出实验室, 天使投资, 第一轮产品出现, 尝鲜者试用)
2)期望膨胀期(博客/微博/媒体炒作, 泡沫达到最大, 大众开始跟进, 负面报道出现)
3)迷茫期 (开始整合, 第二/三轮融资, 但是只有5% 的目标用户正式使用产品,第二版产品出现)
4)低调发展期 (漫长的低调发展, 最佳的方法和实践开始出现, 第三代产品出现, 易用性, 和其他产品的整合更好)
5)主流发展期 (成为成熟的技术, 市场以20-30% 的速度成长)
很多大家正在使用的“新颖“产品, 往往是经历了迷茫期之后的二代产品, 那些在泡沫最大的时候匆忙出现的第一代的产品大多数都没有等到这一天 (电子书, 平板电脑,社会网络等)。
现在技术圈子里大家都在吹的那些技术 SoLoMo,Cloud等等, 它们处于哪一个阶段? 你应该贸然出手么?
和上图相对应的是一个高科技公司股价变化图, 炒股票在短期内是一个群体在估计下一个数字的游戏。 从图表中你可以看到sell off, media, enthusiasm,greed, fear, dispair 等种种因素在起作用, 耳语效应, 从众效应都在推波助澜,根据这个表, 你心仪的公司处于哪一个阶段? 你要买入还是抛售?
(图表来源: http://weibo.com/1454560380/eCwDqDN28ta)
群体对马前卒的反作用
社会的趋势或者说“风尚”有时候也是无情的, 当年以“革命军中马前卒”写出 <革命军>的激进分子邹容, 为他的理想献身二十多年后, 就被列为“落伍者” (见鲁迅先生的 “革命军马前卒”和“落伍者”)。
八十年代, 一个叫朱逢博的艺术家开了一个 轻音乐咖啡厅, 结果被主流媒体抨击为“资产阶级自由化“的表现。小朱同学在写检讨的时候感慨地说– 我往往是走早了一两步… 她现在要再开此类生意, 估计有些人会嘲笑她落伍。
但是一个群体如果没有这些马前卒, 它平均值不会向前移动,群体如果没有提供一定的宽容, 那也没有这些马前卒生存的空间。历史上有 the tyranny of the majority, 大家投票把自己不喜欢的人驱逐出境。 例如我们把游戏规则改一下: 除了获胜的同学之外, 所有数字小于最后g-number 的同学一律扣分, 你会看到怎样的g-number 曲线?
遗憾的是在大多数群体中,冒着枪林弹雨冲在前面的人往往还会遭到来自后面的冷箭。某些暮气沉沉的群体 (国家/企业/学校) 就是这样。
Interpersonal Awareness & Social Awareness
说着说着就扯远了, 进入了我不熟悉的领域,大家姑妄听之。。。
科学家认为,俺们人类有别于其他动物的最大特点是俺们大脑里有发达的部分,处理“别人在做什么“ 和 ”未来会发生什么“这些事情。能摆脱 [自我/当下] 而考虑到[别人/将来], 从而主动地为群体和将来行动, 这是人和其他动物不同的地方(来源: http://www.pbs.org/wnet/humanspark/)。能在一个群体中审时度势, 拉帮结派,尔虞我诈,选择时机出手, 俺们人类的确太擅长了。
在微软, “Interpersonal Awareness” 是员工素质的一个重要部分, 把它放到“黄金点游戏“这个场景中, 你得了解一屋子的同学大概是在想什么,你如何影响他们, 你才能有获胜的希望。每个人独立埋头推导公式, 是得不出获胜的数字的。
国外还有Social awareness + emotional skills = successful kids的说法, 据说此类教育在小孩到了高中甚至成年都有积极的影响。他们没有提到“奥数“ 对小孩将来的影响, 我国政府深表遗憾。
反过来看, 天朝的同学们从小就被灌输“搞好自己的学习就可以了“, ”把考试考好, 以后就好了“– 但是从来没有让同学们考虑目前的死记硬背和将来是什么关系。
一个软件团队, 如果大家都不考虑“别人“, “未来”, 光是每个人独立地搞自己眼前的一摊事, 是不行的, 把自己的代码重构出花来也不行,把SCRUM (史克朗姆)玩到极限也不行。 这也是我觉得聪明的同学们欠缺较多的地方。 所以《现代软件工程》课包括了很多”两人合作”, ”黄金点游戏“, 还有”估算工作量“等练习。
实验
在这篇文章的开头, 我要求你记下一个数字, 请把它诚实地填在后面的评论中吧, 希望它最靠近G-number, 所有数字的平均值的 0.618倍. 你常在这里混,Social Awareness 很强的, 这个应该不难。
这个游戏的一个变种是,如果每人可以提交两个数字,其它规则相同,你的策略会有什么变化?
作业
这个游戏可以变成一个持续发展的团队项目:
1)在课堂上玩,用Excel 纪录成绩。做成简单的单机版游戏,锻炼基本编程
2)两人合作,做成简单的 client/server App,用户从网页/手机上输入数字,并算出获胜者。 技术讨论的议题有:
- 前面写的模块有多少是可以重用的? 为何不能重用?
- 研讨 client/server 的API 应该怎么设计,如何认证用户?
- 如何开发client App
- 为了保证游戏按时完成,如何在服务器/客户端做时钟同步?
- 如果获得第一名的多个用户的数字相同,如何排定次序?(提示:可以考虑提交时间,历史成绩)
3)如何设计测试用例, 保证server 的正确性, 效率, 压力测试 (如何模拟上千个客户端,从不同的端口,提交不同的数字?)
4)原来我们是让用户从客户端输入数字, 看到结果之后,再玩下一轮。用户玩这个游戏是有一定的策略的, 我们如何能把这个策略变成程序,成为人工智能呢? 能否利用 AI 算法提交数据?
client 程序能访问所有以前的历史记录, 它再推测下一个数字是多少, 然后提交。
这里面也有很多问题要克服,例如,如果数字很小 0.00000000000000000001, 下溢了, 怎么办?
应该提交的是 double, float, 还是 string 类型?
5) 全班同学每人写一个程序, 玩一万轮, 服务器要能快速处理。
挑战:
如何在服务器和客户端都做到高效, 能多少秒钟就比完一轮, 并把数据传给所有客户端? 客户端是通过什么接口来接受比赛数据,或者从某个公共来源去读取数据?
6) 修改规则, 每个用户每次可以提交两个数字, 其他规则一样,再玩一万轮。
挑战:这个时候,有程序会不会提交一个大的数字,来保证自己的另一个数字比较接近 golden number? 你的AI 程序如何在这个新规则下占得先机?
7)让互联网的用户可以通过网站注册, 然后用某种 Domain Specified Language 写这个AI 的规则, 然后他们也可以通过网站玩这个游戏。
挑战: 设计这种 DSL,并解释执行。
例如, DSL 可以支持下面的规则:
① 我每一轮都提交上一轮所有数字的平均值 * 0.618 * 0.618
② 如果我上一轮的提交的数值小于当轮的 golden number,那我的下一个数字要是上个数字的两倍
8) 扩展到全球,服务器能 24/7 不断主持游戏,并记录成绩。
挑战:这个过程就能练很多技能和软工设计的功夫
[业余项目]黄金点游戏