博客首页|TW首页| 同事录|业界社区
2012-06-09

正文

此时正做在老家县城的网吧里写这篇博文,本来是计划和好友晚上一起看 欧洲杯的,不过好友需要在医院值班,所以我只好在网吧等待欧洲杯的时间。

下载了一些写程序的工具,想起了好久又没写博客了,所以趁着闲也正好写 篇来记录最近一段时间的记忆。

没有太多事情发生,只是生活有了更多的期待,例如马上要出生的小公主(正在 和老婆为女儿的名字发愁),装修后不久就可入住的新家等等。日常生活有些变化 的可能就是标题中写的 阅读 与 减肥 ,分享一些心得也作为后续的一 些记忆,留于此处吧。

阅读

谈到阅读,除了内容外,值得一说的还有阅读方式,纸质阅读与非纸质阅读,大体 此两种,我当然二者都是在采用的。而对于非纸质阅读,又经历了许多的载体的变迁, iPod Touch, iPad,纽曼的电纸书,android的手机,还有现在的kindle 3。

由于纽曼电纸书意外的坏了,修复费居然高达450RMB,考虑后,于几天前入手了 这款经典的kindle 3,打开后的欣喜感是显著的,特别是对比之前使用的纽曼那款, 或许这就是所谓的“诚意”吧。


3G/WIFI/云空间/自动推送等功能,让电纸书不再只是单纯的阅读,让书籍的获取 也变得更加方便,于是我老婆开始阅读王安忆的《长恨歌》,而我则开始阅读吴**** 的《激荡三十年》,阅读体验真的很不错。

记得当天入手时我在微博上说过,“知识无价”,为知识而奢侈并不是奢侈。

除了电子设备,其实中国每个省会城市都有自己的“省图”或者“市图”,免费阅读 海量的正版书籍,这是我目前为止觉得最好的方式。例如我所在的西安,省图我不得不 赞下,每天晚上8:30才关门,现代化的借阅、归还、续借方式,海量的书籍,还算合理 的时限,真是每个爱书人的理想所在。目前我正在阅读的书籍就是从省图借阅的《三体》, 阅读正版的快感是很难为外人所言说的。

减肥

减肥也大致起始于20天前,从 这里 可以看到我的减肥血泪史。减肥的原因是 在一次好友的婚礼上看到了高中同学各自不断增大的肚皮,鼓起的肚皮让我感受到了 自己也已经是过于肥胖了,所以开始着手减肥。


减肥的方法是 节食 ,从减肥当天起决定晚上不再吃饭,最多吃水果,坚持至今, 一切还算OK,至少没有饿死 :)。目前已经减了2公斤左右,还算战绩不错,因此 我的目标从最初的75公斤增加到了70公斤,所以继续加油吧。

减肥是一项长期而艰巨的任务和目标,记得看过一本书,大致的意思是说,一个人的 收入与体重是成反比的,我对于此的理解是: 减肥本身更重要的可能是对于欲望的 遏制,能够控制自己欲望的人自然会有更高的成功概率 ,想想各种宗教,虽然教义 各有不同,相同的是对于 欲望控制 的追求。

所以,减肥或许不只是减肥,更是一种生活方式、人生境界的追求,加油吧。

总结

读书和减肥还会继续的,努力提升自己,至少学习是不能停下的。有时候想想,其实现在的 孩子的都是很幸运的,获取知识的途经比10年前成本低了太多太多,还记得自己初中时为了 买一本书,可能就要节省一周的生活费,现在无处不在的网络让你随时随地都可以和大师 和偶像亲密接触,唯一的前提是 只要你乐意学习

下载原文

可从 此处 查看或者下载。

参考资料

  1. 这里
2012-05-22

一晃2个多月过去了,又开始准备写博客了,要说非得给这段博客缺席的日子里找个理由的话, 我想必须得提到装修和即将为人父,可真实的原因实际上是懒。或许懒是程序员工作的三大美德 之一,但是它绝不是程序员生活的美德,so我又重新开始了。

这篇就写写过去这两件大事吧。

装修

3月10日正式开始装修,起先以为有哥的帮助会轻松好多,可10多天后哥因有事就不能再帮我了,末了 还是我在操忙,其间是挺辛苦的,也觉着了这装修这个市场的混乱和无序,找到一个靠谱的人总是那样 难。实际的经验是熟人介绍的不一定可靠,就像我找的电工,他就是我这次装修最大的遗憾,无论是质量 ,还是后续的服务,以及要价,无一不是黑的非常。所以当他想给我推荐时,我立即拒绝。后面的瓦工、 木工、油漆工都是不错的,也算是没有善始,但有善终。

无论是找工人,或者在建材市场买建材,整体来讲,大部分遇到的人还都是不错的,也比较能够诚恳待人, 比较讲信誉。想起了一件自己觉着羞耻的事,一次买了2K左右的木工建材,让一个三轮车师傅运送到家, 他骑的是电动的三轮,我最初是打算跟着他一起走的,后来他的车快跟不上,我就只好打公交车前进了。 上了车,就不注的后悔,想到自己可能中套了,这个师傅会不会把东西拉走别处给卖了,要知道这车东西 2K多,而他的运算才是60;也开始后悔怎么不看下他的身份证之类的东西。惴惴不安地在车上熬到了房子处, 不一会儿师傅就来了,说在大门等我。那刻感觉自己特别的羞愧。还有后来给我送沙子的4个师傅,2个多小时 的工作量每人才100不到,还有后来给我新房打扫的2个阿姨,从早上8点到晚上7点,也才不到200元每人。

总之,经过装修能够看到其中涉及的各个阶层人的生活现状,以及人们对于钱和道德的平衡等,困在身上不同 人的压力,无论是家庭还是上学的孩子,这让我们都只能在巨网中煎熬前进。

为人父

小姑娘下个月就要出世了,老婆和我也在为她琢磨各种好听的名字,其实我特别喜欢昨天看到的一个名字,叫 “若晴”,取自“你若安好,便是晴天”,或许我家小公主会叫这个名字吧。

为人父,也才会更加知道父亲的不易,我现在非常想念老家的父亲,不是说他的能力有多强,或者教我了多少 有价值的事情,他只是那种无尽的关心,虽然不直接表现,可隐式的感情让我觉得特别感动,还记得一次我在朋友 家没有回来,爸爸骑着自行车去找我而掉到了水渠里;和别人做建筑活时,同村里的人谈到我时的自豪与骄傲; 那年看到我的研究生入学通知书时的高兴,;还有各种的关心,和不辞辛劳在默默为家赚钱。

我会是个怎样的父亲呢?或许20年后,当“若晴”20岁左右时,她也会心中对于我有个评价,我希望那个 评价不会太坏。

最后

最后,想到了宗教的一般教义,主流的宗教的教义和修行方法大致都是“克已和禁欲”,这二者都是对于自己管理的 一种要求,我想人总是容易做一些本能欲望中的事的,而那些事大致都是无益的,就像过量饮食对于肥胖,熬夜对于 健康等。我想即使我没有入任何宗教,我大也可做一些修炼,方法便是“克已”,而目前我的目标是:

  1. 晚上不再进食(直到体重降到75kg以下)
  2. 0点前休息(持续坚持)
  3. 每天有不低于30分钟的纸质书阅读时间(持续坚持)
2012-01-08

正文

今天已经是2012年1月8日,新的一年,日子还一天天的过着,只是觉得时间过得太快, 一晃就是一年,回想不起来太多细节的东西,印象中的2011只是一种感觉,然后是 不多的几件重要的事情,这大致就是2011.

翻看旧时的博客,找不到去年此时的计划和总结,我想新年总是有些期待的,本篇也 顺道记录下对2012年的期许,明年此时再看时,也就知道自己的路走了有多少,是否如预期。

2011


2011年对于我,及我的家人而言都是重要的一年,因为 老婆怀孕了 ,终于我的角色要升格了, 准爸爸的我从现在起要了解更多的育儿相关的知识。

2011年6月 从北京回到了西安 ,告别了自己曾经奋斗过的创业公司,告别了北京繁忙而让人 沉迷的世界。这次回归,基本宣告了自己对于人生的一种选择,对于生活的选择,及余生所要面对 的人和关系的选择。当然谈不上对错,只是生活方式和圈子的选择而已,但意义是深远的。

2011年6月至2011年11月, 接近半年的创业 ,对于预期的角度而言,那是段不成功的经历, 没有能够取得预想的收益,团队共事的效率及做出的产品也是令人遗憾的;对于个人成长的角度而言, 或许更加成熟了,更加认识到这条路的艰难,以及成功的不易,而自己能力的欠缺。或许当下自己还 显得不成熟,或许几年的历练能够让我成长,或许若干年后才是正当时。

2011年10月, 终于交房了 ,不大的房间,但是那是属于我和家人的,这就足够了。能够想象,等12年 装修好后,老婆和我一定会将它整理的非常温馨,南面窗户能够看到不远的南山,或许也是在这浮躁的 社会下一点点安静。

2012


2012有几件事是必须完成的。

2012年6月, 老婆要产下我们的宝宝了 ,这是非常期待的时刻,无论是男孩或者女孩,我们都会高兴的 迎接我们的孩子,这不,小孩的小名已经想好了,“天天”,呵呵,老婆和我都很喜欢的名字;这几个月再 寻思寻思孩子的大名,多有趣的事情!

2012年5月左右, 装修新房 ,这是今年又一重要的事情,到时可能只能简装了,不过好的是离老婆和我 的工作单位都不远,自行车30分钟就能到,可怜的老婆坐车晕车,无论多远只要是机动车都会晕的厉害, 还好距离不远,每天可以带老婆一起上下班,想想挺好的。到了10月份左右我想就可以住到自己的家了, 呵呵,想想都觉着美。

2012年, 学会开车 ,我想这是重要的,房子的位置还是比较偏僻的,不久肯定得买车,开车带着老婆 上下班,回老家,出去旅游等等。

2012年, 看不低于24本书 ,一个月2本,其实也不多,内容主要是技术类,社科类,财经类,小说等, 技术和其它类型的书籍各占一半吧。

2012年, 保持身体健康 ,不只自己,还有家人,妻子,孩子,父母等,保持良好的作息习惯,坚持运动, 注意饮食等等。

2012年, 确定自己的可持续的理财方式 ,如今物价飞涨的年代,CPI涨幅远大于工资的涨幅,单靠那点工资 要想过得所谓“有尊严”基本上是不可能的,所以,无论是股市,基金,或者别的实体的投资,总是需要有靠谱 的理财方式来平抑这物价。

2012年, 提高自己的家庭抗风险能力 ,主要取得方式还是储蓄,节流开源,为可能出现的风险做充分的准备, 当然只能尽自己所能的准备。

等等,还有好多细节的事情,只能是在新的一年里让生活更加美好,无论如何,照顾好家人,多联系朋友,提高自己 这些才是关键。

下载原文

可从 此处 查看或者下载。

2011-12-28

摘要

加入中兴有一个多月了,想想过去的一些经历,有些感受和朋友分享下, 也顺便回答一位知乎朋友的问题。

正文

从考上研究生后的第一份兼职开始,到今天接触了许多的创业公司,其间自己也 亲自挂马上阵做了一回创业,不多次的创业经历也让我重新思考创业相关的问题, 诸如是否要创业、如何创业等问题。

刚好,几天前一个知乎上的朋友 @大涉 在微博上问及起这个问题,这里我便 借助博客来做个梳理,也算是对朋友的回答。

(注:文中涉及的创业不单指自己做为创始人的创业,也泛指自己作为创业公司一员)

是否要创业


要回答这个问题,可以先静下心来问自己几个问题:

  1. 我想从创业中得到什么?
  2. 如果创业失败了,我会失去什么?

先看第一个问题,其实很多的成功人士都在说创业不能只为名和利,而是一种真正的 喜欢,和对预期的一种坚定信念。然而,事实是创业的很多人都是以此为根本目的的, 将快速获取财富作为源动力,当然也包括我。

其实我觉得这本身也没有错,但是据看到的一个数字说90%的创业公司都会以失败而告终, 换句话说以财富为根本目的的创业者失望的可能性也会是90%。

财富的预期之外,还有一手的经验、相对灵活的环境、执行力、没有官僚作风等也常是创业者追求的目标,一一 去分析后,发现这些特点也非创业公司所特有的特质,一些创业公司根本与这些特点无缘,而一 些大公司也不乏具有这些特点。而流程的缺失,过多分散的精力,压力过大等特点倒是大部分 创业公司都有的特点。

至于第二个问题,这就是机会成本的问题,你放弃的是另一个工作的机会,你大致可估算下 这个机会成本,譬如假定以一年期计算,在其它公司工作一年的收入,生活质量折算的成本等, 当然再对你在创业公司的收益进行估算,其中的差价便是这个机会成本。问下自己,对于这个 机会成本自己是否能够承担?(基本上必须要抱着失败的念头来回答)

倘若,你的源动力不是以财富为根本目的,你也能够承担这个基本要注定失败的机会成本, 那我觉得你就可以考虑创业了。

如何创业


这里分为两种情形来说明:一是你作为创始人来创业;一种是你作为创业公司的早期员工来创业。

首先看第一种。创始人必须要有基本的管理、财务、人力资源等相关知识,更重要的是要有所涉领域的 行业知识,当然良好的人脉和各种资源也是成功的关键。创始人个人能力要出众,除了能够准确把握 趋势外,还能够组建起具有超强执行力的团队,抓住市场的某个开启窗口,成功突围。这些特质说起来 容易,但是问问自己是否具备这些特质、是否有优秀的团队、是否有充足的资源,我想大部分人都是 否定的吧。如果现今还有一定距离,不要灰心,年轻的我们脚踏实地地努力积累经验、积累资源和人脉, 只要创业之心不死,总是有机会的。

第二种的风险就小了许多,当然预期的收益也会少很多。这时你的选择就和一个风投的选择方式类似, 一看团队,二看项目。团队的好坏决定了你是那90%还是剩下的10%,我始终相信好的团队只要项目 不是特别烂也能做的很出色;团队最主要的是创始人,看他的气度,看他对这个领域的见地,看他如何 对待员工等。其次就是项目,也就是做的是什么,乔布斯再牛如果还去做胶卷市场是注定不会成功的, 看项目市场的规模,当前的发展情况,这个领域国外的情况和国内竞争对手的情况。确认问题不大时, 即可考虑加入。

经过两三确认,你最终加入了这个创业公司,那么单调而且繁杂的生活也算正式开始了,做好常态加班、 生活质量降低、半夜被老板电话叫醒、健康可能出问题、甚至失业的心理准备,保持良好的激情,最好为 自己设定一些目标,譬如一年后公司的员工到多少、产品的用户数是多少等,倘若没能达到,尽早的退出 也是明智之举。

总结

创业是艰苦而且风险极大的,积累足够的经验和领域的知识,在人生的关键时期做出正确的决策这远比 牛一般任劳任怨地工作一辈子要重要许多,无论是对于自己的理想或者家庭,特别是在当今的大环境之下。

无论创业与否,开心地工作每一天,善待家人和朋友,这些才是各种努力的终极目标,加油!

下载原文

可从 此处 查看或者下载。

参考资料

  1. @大涉
2011-05-06

摘要

本文主要对自己过去一年的正式工作的一些总结,主要说明了自己的一些心得和体会。也简要说明了 自己公司的情况、自己为什么要加入这个公司、自己对于这个工作的预期等。

正文

昨天,HR买来了蛋糕,我们庆祝了公司的一周年生日。吃着大大的蛋糕,我不禁也开始回想这过去的一年。


这一年是我从学校毕业进入工作正式开始的一年,也是全职地在拿着工资每天按时上下班的工作,所做的项目 不再是toy project,而是关系到公司是否能够继续,员工是否能够拿到薪水,也同时在影响着数以万计的用户的 正式项目。

工作的地方

我所工作的地方是一个创业公司,专注于社交游戏领域,目前开发和运营着数款游戏,MAU数也以百万计,当然这是现在的数据。

初始时,从开始的远程协作(部分同事在美国,没有固定的办公场所)到今天200多平的办公室(明天将搬到400多平的新办公室),从只有3个员工到现在的30多个, 从没有什么像样的产品到现在的有若干款运营不错的产品(包括联合运营的产品),这一路走过还是有一些经验和教训的。

明天,我们公司就要搬到上地更大的办公室,上周末和老婆提前骑车去看过,不错的地方,大楼的对面正好是上地公园,不大,但是 有绿色总是让人高兴的。

公司现在有30多人,谈不上个个是精英,但是大多数还是非常认真地在工作,在推动项目的进展和公司的发展, 所以在公司工作 还是很有信心的。

为什么选择这里


其实,开始时也没有多么明确的目标,当真正开始进入社交游戏领域时,才开始了解和学习这个行业相关的知识。 随着对这个行业认识的加深,自己开始有了一些了解和认识,直至后来 将其定为未来3年互联网行业自己所看好的两大细分领域之一(另一个是智能移动终端)。认识改变的过程也是由于行业的逐渐成熟和相关运营、盈利模式的 不断进化和清晰,以及自己对于这个行业的逐渐了解。

所以,在去年7月正式毕业时(其实那时已经工作了不短的时间)自己便直接来到了当前的公司。

当然,除了对于这个行业本身的认可外,还有对于创业公司本身的一些认识。我所认识或者对于创业公司的期待包括:

  1. 更多的机会(如各个环节的参与,更多的责任,扁平的管理,激情,高效, 直面问题和矛盾, 试错的机会等)
  2. 更好的成长空间(参与从无到有,经历各种里程碑的过程,自己的成长和公司的成长)
  3. 学习机会(无论是正确或者失误的管理、产品、运营等等,都能够有所接触和学习)
  4. 潜力(自己收益的潜力,包括财富和能力等)

创业公司也有许多不好的地方,如制度缺乏,同事能力参差不齐,决策过程的控制,过量的工作量, 过于着急等。

曾经在研究生阶段也尝试着做一些产品,甚至是创业,而对于未来也有创业的期望,所以在创业公司的一手经验是非常重要的,再加上自己对于这个 行业的认可,所以便选择了这里。

如何来到这里

2009年5月的一天,自己看到水木上的一个兼职帖子,便寄上了自己的简历,其后的某一天,接到了发贴人(当前的老板)的电话,畅谈之后基本便决定参与到这个项目中来。

2010年5月初,我们的创始人回到北京创立了当前我们的公司,于是我也顺理成章地加入到这儿。

2011年5月5日,今天,我们公司成立一年了。

巧合的是,上面的几个节点都是发生在五道口。

我对于工作的预期是什么


加入这个创业公司时,自己还没有结婚,也没有过多地考虑到家庭的因素;而自从去年10月份结婚后,面对的是每月的月供、房租和各种的生活开销, 收入方面的预期也开始占到了很重要的因素。

当然,我的主要预期和最初的还是一致的,大致包括如下几个方面(依重要性):

  1. 学习创业公司的公司管理、产品管理、项目管理、决策管理、运营等方面的经验
  2. 学习创业公司的老板的角色特质
  3. 业务能力的提高和认知水平的提高
  4. 行业前景,公司前景的看好,直接地说就是对未来回报的预期

逐条来看,再去回想这一年公司的发展,每条都有一些心得和体会,这也就构成了我下一部分所要说明的内容。

几点心得

我是最初就加入到公司的,起初也参与到公司的选址、招聘、定名(当前的名字还是我起的:D)等过程。当然自己对于这种无序是非常反感的,不过随着 各个角色的逐渐加入,公司不久便能够良好运作起来。在公司的具体运作方面,我没有参与到资金的运作的细节,所以也无法确认这方面的细节,但是 对于已知的,我还是有几点比较深的感受:

  1. 执行永远是第一位的(初始时,每看到一个任务或者需求,我总要基于自己的认识来考虑是否合理,如果不合理,自己就会降低执行热情,后来逐渐 意识到并且也做到了“即使是执行错误的决策也比没有执行的正确的决策要好”,再加上我逐渐意识到技术并不是产品最重要的环节而只是手段,我更加 不会排斥与自己已有的思维或者技术相背或者不关的需求,例如为了项目需要,我现在就开始写前端的flash代码)
  2. 先让公司活着(每个人都喜欢做自己喜欢的、有挑战的、富有创意的产品,但是这种产品的试错成本也会相对较高,对于创业公司往往不合适,初期的 能够让公司活着,有比较健康的现金流才是硬道理)
  3. 产品经理负责制(当自己确认技术只是手段时,也同时明白产品经理才是产品的核心与产品质量的保证,好的产品经理我觉得要前期有基于数据的产品设计方案、 项目中要严格控制实现的结果、后期要保证运营的有效,总之中后期要保证与前期的产品设计最大程度的相符,有强大说服力和强硬的产品经理是重要的)
  4. 不要提前做当前阶段不需要的事情(或许这些事情着实有用,也对公司有重要的意义,但是初期让公司运转起来,简单而有效的制度就足够了,而不是 几十章节,几百条的所谓完善的制度。很多时候,所谓的over-something通常都是资源的浪费,在初期这种浪费更加致命)
  5. 坚持(我有时候在想,如果我是老板,我能坚持到现在吗?可能不行,公司在过去的一年也出现过问题,但是老板坚持下来了,于是有了今天还算顺畅的 游戏开发和运营,有了30多个员工。这种坚持便显得特别重要。)

至于如何做一个比较出色的创业公司老板,我也只是通过自己的一些观察,和自己对这个角色的理解,觉得下面的一些列表是需要的:

  1. 沟通能力(与合作伙伴,与员工,招聘时等等)
  2. 资源(有效利用外部资源,高效利用内部资源等等)
  3. 招聘的把关(微博上有个朋友说过,一个优秀的员工会带来数倍的价值,而一个不好的员工,会让整个公司效率降低。能力和性格都需要把关。)
  4. 产品经理(老板通常自己是最后拍板的人,所以他通常也自认为是产品经理,无论是自己做产品决策或者招聘其他产品经理时,这种决策显得十分重要)
  5. 愿景(要让每个核心员工能够感受到公司的愿景,能够对员工的期待有一定的肯定作用,并且是反复的周期性正面加强)

自己从研究生毕业后,更多时间是做游戏的后端开发,为前端提供相关的协议支持,但是社交游戏通常是基于flash的,更多的工作量是在前端(如UI、交互、 动画、复杂的算法等),所以后端还显得压力不是太大,当然这样的后果是,整个项目的进度基本上完全取决于前端的进度,而我是无法控制的。后来, 我逐渐意识到技术只是手段时,我也不再拘泥于自己只做后端的后端开发员,也开始学习actionscript,puremvc,robotlegs等,这样前端后端都有较深的了解, 也能够更加主动。总之,在这一年里,自己对于技术的认识有了一定的变化,对于项目管理的认知也在不断调整,我的理解是:

  1. 技术只是手段,但是不能让技术成为障碍
  2. 不要拘泥于特定的技术,能够服务于项目进度和产品,就应该接受
  3. 更高层次的理解能够节约大量的时间,而不要过快地开始编码
  4. 自己在实际中碰到的程序结构、架构等问题,其实前人早已遇到并且有了很好的方案,所以要了解、学习并且使用那些实际中经验,如Code Complete中的 软件构建方法、Design Pattern等
  5. 基本知识的牢靠,相关领域知识的熟识。如果是做后端就要知道常见的性能瓶颈来源,相关框架的best practices等;前端就要了解如何降低加载的大小, 降低CPU和内存使用等。
  6. 算法,不要求完全熟识能达到ACM比赛的程度,但是当遇到一个问题时,知道有个什么算法能够解决这个问题,到时查相关的资料即可

业务能力的提高是需要自己不断反思的,经验有时候成为制约自己进步的障碍,当自己不断地对于同样的问题用同样的解决方案时,可以思考有没有更好的方案? 其它语言(框架)是如何解决的?能否借鉴?能不能用脚本自动化测试等。学习其它语言,看相关的经典的书籍是不断进步的源泉,所以我也制定了 2011年的计划 ,来据此提高自己;另一方面,将学习到的东西写出来,也是一种很好的提高自己的方法。具体的可见我即将要写的一篇博客,拟定标题是 阅读与博客。

至于行业的前景,这个已经得到了很多实证,如美国的 zyngaplaydom ,中国的 五分钟elex 等,简单地通过google搜索下就知道这些 公司的赢利。当然当下的社交游戏已经进入到了红海阶段,玩家已经开始成熟,对于游戏的质量也有了更高的要求,小公司成功的机率也逐渐减小;本地化 的时间窗口也给了许多中国公司copy运营的机会,但是这种机会也在减小(一方面是知识产权,一方面是大的公司的全球化布局)。当然,也有好的方面,如 腾讯平台的开放,这无疑是一个巨大的机会,腾讯的接入规则也给了小公司更多的可能性,但是未来3个月(或者更短)对于腾讯平台的跑马圈地形成的格局 可能会左右整个中国社交游戏公司的格局。所以,腾讯朋友上一时出现了大量的游戏,当然质量参差不齐,我们公司也在努力进军这个市场。 整体来看,我还是很看好这个领域的,现今的阶段也是最为重要的,这个领域没有赢者通吃的规则,但是也会有品牌的问题,产品质量也会与开发商紧紧联系 在一起,如 zynga 和 五分钟

还有,最近大家都在说的腾讯涨薪,也希望老板能够给我们涨薪,如此高的通胀、CPI,程序员的日子不好过啊:D

总结

一年又一年,如果2012我们还健在,那么我的预期还是如上面,到时当我写工作两年回顾时,我希望内心是强大而且平静,并且能够在某些预期上 得到更多的收获。

有人说过,当你在一个领域的研究时间超过10000小时时,你便能够在这个领域成为专家并且成功。10000小时或许太久,我只希望在我所工作的期间, 以我自己的努力为公司带来助益,也实现自己的一些预期,做到对公司和自己无愧即可。

下载原文

可从 此处 查看或者下载。

2011-04-05

因为工作需要,最近也开始学习和使用 pureMVC , 之前也写过一个 pureMVC Hello World教程, 算是开始入门这个框架和AS这种语言.经过两周多的学习和使用,生出了几个疑问, 和公司的做AS的同事 沟通时,发觉他也并不能清楚地说出所以然来,所以决定自行研究这些问题,并尝试给出解答.

问题大致有下面几个:

  1. 如果一个notification有多个订阅者,那么这多个订阅者之前的执行顺序是怎么样的?
  2. 一段代码在执行时,如果发出一个notification,是等待相应的notification订阅者处理结束再继续呢,还是 直接继续,相应的notification订阅者异步地执行?
  3. 一个notification的多个订阅者之间的执行是异步的,还是顺序执行的?
  4. 是否可能出现notification死循环的问题? (即notification A的订阅者X发出notification B,B的订阅者 又发出notification A,形成一个没有出口的循环)

研究和解决上述问题

为了准确研究出上述的问题和答案,我采用的方法包括两种: 实验和源代码阅读(其实只要阅读源代码即可).

实验

相关的代码可从 TestPureMVC 下载.

这个程序主要是如下的流程:

Startup -> StartUpCommand -> registerMediator(AMediator, BMediator, CMediator) -> sendNotification(Test) -> CMediator(Test) -> sendNotification(Second) ->CMediator(Second) ->sendNotification(Test)

从而形成了一个循环,另外,也可简单地在StartUpCommand类中更改来测试其它的情况.

从代码中能够说明(对应于本文最初的4个问题):

  1. notification的多个订阅者的执行顺序是按照其注册的顺序执行的,也就是全局的view中维护的mediator数组中的顺序
  2. 因为AS中没有类似于sleep的方法,所以无法确定2(具体结果参考下文,代码分析部分)
  3. 同2
  4. 会出现死循环,最终会出现栈溢出的错误

源代码分析

因为Command和Mediator都可以处理和发送notification,所以这里只以Mediator的处理为例来说明.

我们先看notification是如何通知的:

// org.puremvc.as3.core.Views.as
public function notifyObservers( notification:INotification ) : void
{
    if( observerMap[ notification.getName() ] != null ) {

        // Get a reference to the observers list for this notification name
        // 获得这个notification的所有订阅者数组
        var observers_ref:Array = observerMap[ notification.getName() ] as Array;

        // Copy observers from reference array to working array,
        // since the reference array may change during the notification loop
        //  notification的循环中可能增加新的订阅者,所以这里深度拷贝一份
        // 注意顺序并没有更改
        var observers:Array = new Array();
        var observer:IObserver;
        for (var i:Number = 0; i < observers_ref.length; i++) {
            observer = observers_ref[ i ] as IObserver;
            observers.push( observer );
        }

        // Notify Observers from the working array
        // 根据数组中的顺序依次来通知相应的订阅者
        // 注意这里是顺序执行的
        for (i = 0; i < observers.length; i++) {
            observer = observers[ i ] as IObserver;
            observer.notifyObserver( notification );
        }
    }
}

接着来看事件是如何注册的,从而形成订阅者的数组:

// org.puremvc.as3.core.Views.as
public function registerMediator( mediator:IMediator ) : void
{
    // do not allow re-registration (you must to removeMediator fist)
    if ( mediatorMap[ mediator.getMediatorName() ] != null ) return;

    // Register the Mediator for retrieval by name
    mediatorMap[ mediator.getMediatorName() ] = mediator;

    // Get Notification interests, if any.
    var interests:Array = mediator.listNotificationInterests();

    // Register Mediator as an observer for each of its notification interests
    if ( interests.length > 0 )
    {
        // Create Observer referencing this mediator's handlNotification method
        var observer:Observer = new Observer( mediator.handleNotification, mediator );

        // Register Mediator as Observer for its list of Notification interests
        for ( var i:Number=0;  i<interests.length; i++ ) {
            // 注意: 这里是根据Mediator有兴趣的notification来分别加入到对应的订阅者数组中
            // 而加入的次序正好是根据这个Mediator的注册顺序
            registerObserver( interests[i],  observer );
        }
    }

    // alert the mediator that it has been registered
    mediator.onRegister();

}

// registerObserver的具体实现
public function registerObserver ( notificationName:String, observer:IObserver ) : void
{
    var observers:Array = observerMap[ notificationName ];
    if( observers ) {
        // 顺序加入到对应的订阅者数组中
        observers.push( observer );
    } else {
        observerMap[ notificationName ] = [ observer ];
    }
}

我们再看通知给订阅者时的处理逻辑:

public function notifyObserver( notification:INotification ):void
{
    // 根据notification传过来的上下文来执行相应的处理逻辑
    this.getNotifyMethod().apply(this.getNotifyContext(),[notification]);
}

到此,从我们对源代码的分析上,我们就可以完整的回答本文初始的4个问题:

  1. 如果一个notification有多个订阅者,那么多个订阅者之间是按照注册的顺序来执行的
  2. 在AS中不存在异步的执行,所以,当前的代码的执行会等待所有的notification按照1中 的顺序执行完成后,才开始继续执行当前的代码(相当于调用一个函数)
  3. 一个notification的多个订阅者之间是顺序执行的,顺序是按照1中的说明
  4. 存在死循环的可能,因为如2中说明,sendNotification相当于根据注册的顺序来顺序执行 相应的处理逻辑,如果在处理逻辑中又包含触发sendNotification的事件,则整个执行 会成为一个死循环,从而导致栈溢出

总结

通过对本文开始4个问题的分析,弄清楚了 pureMVC 核心的notification机制的几个 核心问题,对于后续的工作和学习都是很有益处的.