最后更新于 .

前段时间招聘服务器端研发,面到了一个人,忽然感想挺多,所以就写在这里。

这个同学怎么说呢?他自己可能感觉自己很有想法,很与众不同。
举几个例子:
比如,觉得他所在公司的一个框架的版本太低,官网都更新到v13了,他们还在用v7。想要推动公司内升级,他们技术老大又不肯。所以他觉得公司没有创新精神,死气沉沉。
又比如,研究过redis、mongodb或者其他一些开源框架,就觉得想要应用到公司内部来。但是推了半天又推不动。所以又开始觉得公司不够开放。
又比如,炫耀自己喜欢逛github、stackoverflow,还用rabbitmq写了一个分布式消息处理框架,但是问到承载量,性能瓶颈等等,又完全回答不上来。
又比如,我问了几个网络编程的细节问题,比如 epoll的水平和边缘触发、TIME_WAIT的原因与处理,结果一问三不知。

类似种种。

我之所以拿这个事情,单独写一篇文章来讨论,就是因为我知道,有一批人,一定会走到这个阶段。
因为现在的他,就是当年在腾讯时的自己。

当年的自己也是学了点python,用django写了个网站,逛了github,结果就像发现了新大陆一般,觉得自己牛逼了,别的同学都太out了,连python脚本都不会用,看,同样的功能,用python开发速度比c++快十倍!

所以当时公司很多的工具我都尝试用python来写 ...

最后更新于 .

其实一直想着写一篇2015年的总结,结果从过年回来就一直忙忙忙,拖到了现在。
本来今晚还想着继续做代码优化,突然听到外面下起雨来,就想着不如趁着今晚把文章给写了吧。

之于公司

15年对我、我的合伙人、乃至我们整个团队来说,都是充满意义的一年。

我记得在很久之前,别人是这样给我形容一家公司从不赚钱到赚钱的过程:

就是突然有一天,你看了看报表,发现,咦,我们盈利啦?!

而这一天,发生在了我们身上的时候,是2015年的10月的某一天。

那是我们奋斗近两年来,第一次看到曙光。

虽然其实盈亏也仅仅是基本打平,但是15年底,我们把我们能动用的所有钱,都拿出来给员工发了年终奖。

我和我的合伙人们,极其的感激这些在最困难的时候陪着我们,并且愿意跟我们一起继续走下去的战友们。

而同时,我也十分的想要告诉那些曾经因为各种原因离开了我们团队的人,感谢你们,让我们坚强并成长。

我最开心的是,技术团队目前还没有一个人在年后提出辞职,我也希望这些优秀的同学们能够一直陪着公司一起走下去。

2016年,已经过去了3个月了。
新的一年,我们得比以前更快!更拼!
2016,继续加油!!!

之于个人

15年对于我个人最大的喜事,应该就是媳妇怀孕啦! 今天3月9日,马上就到预产期了,现在还有点忐忑自己会不会是一个好爸爸,哈哈。

其实我始终相信,肚子里的宝宝是个贵子,公司运营状况的好转,很大部分功劳都归功于他啦 ...

最后更新于 .

其实打算做游戏内热更新也是几个月之前的事情了,在方案经历了数次变迁之后,最近才终于应用到了外网的bugfix中。
但是就目前数据来看,热更新由于要下载资源,会使新用户的进入门槛变高,所以留存收到了一定影响,基本降低了10个点。
当然,也可能是热更新的功能存在bug。

好了,我们还是进入正题吧!

方案一

最早的时候,我们想用一种类似打patch的方式来更新。
即将lua代码和资源打成一个zip包,而每个zip包只要代码或者资源发生变化,都会有一个自增的小版本号(大版本号为打在apk或者ipa里的版本号)。
不同的zip包之间diff就可以生成一个patch文件,而为了开发的简单,这个patch列表只会将文件路径列出来,之后客户端要去完整的下载新的文件覆盖。

然而这个方案有很多的问题。

  1. 小版本号不好维护 因为代码和资源会不停的修改,而如果人工来维护小版本号,会极其复杂。如果通过机器来维护也是个很麻烦的工程

  2. patch包太多 如果我们将小版本号的patch包先生成好放到服务器上,那么如果我们有100个小版本,就会有非常多 1->100, 2->100, 3->100 ... 这种格式的patch包。 并且如果小版本号继续增长,patch包的增长基本会失控。

  3. 消耗大量流量,速度缓慢 也许有同学会说,不如只有 1->2, 2->3, 3->4 这样的单个小版本之间的升级patch,客户端自己挨个下载就好。

    但是这样客户端如果是个很小的版本号,就不会不停的重复下载,导致迟迟进入不了游戏,并且流量也大量消耗。

综上所述,方案一有太多的弊端。
这也是为什么我们做完了之后迟迟不敢上线的原因 ...

最后更新于 .

一. 发现问题

最近新版本上线,公司内部的几台iphone测试机测试都一切正常,但是外网用户却频频反馈崩溃。

在友盟上看了错误率统计,曲线如下:

可以看出,错误率确实有了很大的上浮。基本可以确认一定是出问题了。

二. 还原崩溃现场

我们游戏用得cocos2dx-lua,既然是崩溃,那就一定是到了c++端了,我们点击友盟上数量最多的那个看一下:

到了这里,遇到了第一个难点,因为按照友盟文档,使用他的错误dump工具是无效的,一旦看不到具体的错误内容,基本就无法继续了。

(而因为这个问题,发现有人推荐bugly,打算在下一个版本里面试用一下,再给大家反馈)

既然友盟提供的工具不行,我们就得像别的办法,起码现在错误的原始内容是有了,只是要想办法还原出来而已。

仔细研究了一下,友盟其实也是使用了mac原本就提供的工具来做了二次封装,那不如直接用原生的工具了。

具体方法如下:

  1. 找到当时出包得那个archive文件,显示包文件,在其中找到如下两个文件放到同一目录:

    xxx.app
    xxx.app.dSYM

    其中 xxx.app.dSYM 即为符号表文件。

  2. 查看其对应的UUID,一定要与crash log的UUID一致

    $ dwarfdump --uuid xxx.app ...

最后更新于 .

发现我这博客虽然叫vimer,但是已经很久没写vim相关的文章了,甚至连技术相关的文章都写的少了。

我自己也分析过原因,竟然是和鲁迅弃一从文的原因是一样的。

这世上的技术千千万万,且每天都在发展变化,在我这小小的博客上根本不可能覆盖到多少。

而要把我所知道的技术重点都记录下来,感觉又要花掉无数的时间。

所以索性就多谈谈思想,创业上面的吧,不一定对,但是可以参考。

这次之所以在国庆这个本应出游欢庆的日子写文章,是因为自己实在没事干啊。

当然了,出不去也是开心着的,媳妇怀孕刚满三月,不宜到处活动,所以老老实实陪在家里啦。而我那朋友们,一队朋友去了西藏修行,一队朋友去了云南休闲。

好了,还是赶紧切入正题吧。

我这次想聊的是人际关系。

其实之前,我一直有个问题想不明白:为什么,有的人对人际关系看得特别的淡?

之前在腾讯工作的时候,周围都是长期相处的同事。因为长久,因为认识的人就那么多,所以每一段人际关系都显得弥足珍贵。

然而,当我开始开始创业,开始在1年内入职离职十几甚至几十个人,甚至到最后以前离职的人我都记不住他们的名字。

我才发现,我已经没有那么多精力顾及到每个人了。

其实不是别人把人际关系看得淡,而只是对你看得淡而已。

所以说到底,还是得努力提高自己的可利用价值,起码让对方愿意花点精力在你身上,才有进一步发展的可能。

最后更新于 .

之前有句很火的话:

梦想还是要有的,万一实现了呢?

听起来梦想确实是一件很重要的事,对啊,万一中头奖实现了呢?

然而我想说的是:

梦想,一文不值。

其实,之前也一直有类似的想法,只是一直没有想到合适的话总结出来。

正好今晚和媳妇没事看一起看了《我是路人甲》这部电影,思路也有渐渐清晰了一点。

在这部电影里,几乎所有人都有梦想,然而正因为所有人都有梦想,所以梦想才变成了一个极其廉价,一文不值的东西。

老人会告诉你,年轻人,一定要有梦想。

于是这个年轻人就如醍醐灌顶般拥有了梦想,之后就要出任CEO,迎娶白富美,走向人生巅峰了?

听起来就好像,上帝说要有光,这个世界便有了光一样简单?

然而这显然是没用的,我们从小就知道:

太容易拥有的东西,每个人都可以轻易拥有的东西,基本都是不值钱的。

而那些集中在少数人手里的,才真正有价值,比如财富,比如真爱,比如自由。

正因为梦想的来的轻易,所以,我才说它廉价。

而更进一步,我想说。

不只是梦想没有价值,为梦想而奋斗这件事同样没有价值。

大部分人,听一趟励志课,看几篇心灵鸡汤,都足以刺激他去为自己的梦想奋斗个几天,几周,或者长一点,几个月 ...

最后更新于 .

《创业这件小事》这个系列也是很久没写了,一是确实没有时间,二是如果不是真正的干货,写出来也没什么意思。

我刚特意去看了一下《创业这件小事(六)》的写作时间,1月26日。

而在这7个月里,确实自己很多的东西都已经改变了。

一. 管理风格

其实在整个创业过程中,我一直在摸索,自己的管理风格到底应该是偏向“严”还是偏向“慈”。

过去我一直把握不准,所以很多事情上也能看得出来。

比如基本不辞人,都是员工炒老板鱿鱼。

比如有时候却会在晨会上责骂人。

很纠结,很矛盾。

只是渐渐的,在经历过这么多的人和事之后,我开始反思自己这种情况的原因。

而结论就是:

我太在乎小弟们说我是个好老板,还是差老板了。

只是最近,我终于想明白了:

我根本不需要你喜欢我。

我需要我的合作方喜欢我,我需要我的投资方喜欢我,可我为什么需要一个我给发着工资的人喜欢我?

想想当年没创业的时候,都以为创业是古惑仔混黑社会,讲兄弟义气。

但实际上是,有钱赚的时候别人才跟你讲兄弟情义;辛苦的时候别人只会催你每月要发的薪水。

 

所以事情就变得特别简单了:

我想在晨会上拍桌子,那是我乐意。

我想跟大家吃饭唱K,那也是我乐意。

我不需要跟你解释什么,你愿意跟着干,苦点累点,我可以承诺万一公司成了,绝不会少你的。

但是你要是不愿意干,我也不留 ...

最后更新于 .

写博客真的是一件很难坚持的事情,经常忙起来或者犯懒就懒得动笔。
所以这次就随便聊聊吧,正好最近的感触也比较多。

我发现人啊,真的是在成长的过程会不停的自我否定,从而自我成长。
今天的我看上一个月的自己,有时候都觉得不可理喻。而一个当时觉得几乎迈不过去的坎,现在看起来似乎也就那么回事。

以下有些观点可能大家未必认同,如果之前的自己可能为了避免争论就避而不谈,而现在的我觉得无所谓。
不认同就不认同,哪能那么巧,你的所有观点别人都认同?
而促成我开始转变观念的导火索,在于一部电影里对甘地两句话的引用:

以暴力取胜意味着失败,因为这只是暂时的胜利。

若是心中存在暴力,就把它发泄出来,这要胜过用非暴力来掩饰心中的脆弱。

当然,我这里不是要支持暴力或者是反对暴力。

我所理解的这两句话的真正指导意义在于:

真心实意的挑战要比虚情假意的附和更有价值。

ok,咱们挨个说。

关于对于物质的追求

说实话,似乎大部分国人对于物质的崇拜似乎都不太愿意在公开场合表现出来。因为中国有很多不好的词语来形容他们:守财奴,金钱的奴隶,很物质。

也有人很喜欢转发一些文章,什么自己可以配得上几万的dior,也穿的了几十的地摊货。
而正好前一段时间朋友圈有个朋友转了这篇长文来驳斥:那你倒是买啊,买啊,买啊。。

为什么我们看到一个身价过亿的老板每天中午只吃馒头咸菜立马就会当作一个励志故事?
为什么我们看到一个职场白领每天中午只吃馒头咸菜可能就会觉得这个人很扣?

因为你要想能够把姿态放低,那么首先你本身的姿态要足够高。

所以,说那些自己配的上dior也配的上地摊货的朋友们,咱们还是得先努力让自己买dior跟买地摊货一样慷慨才行。

当然,这个话题不只是到这里。

我真正想说的是:

在你真正拥有更好的之前 ...

最后更新于 .

首先是对死者的哀悼,望逝者安息。

 

我认为,这件事情唯一对我们有用的启示是:

控制好自己的工作节奏,不要最后得不偿失。

然而,很多人却并不止于此。

以这件事情为导火索,很多网友开始发起了抵制加班的号召,这在我看来真的是居心叵测的。

作为一个个体,你完全有选择加班或者不加班,在这家公司或者不在这家公司的自由,完全不需要去号召什么。

那么为什么还要号召呢?

因为这些人心里明白,我要是不加班,我要是不努力,就会落在别人后面,赚钱比别人少,生活比别人差。

所以怎么办呢?

简单,让大家都和我一样不加班吧,这样不就都和我一样停下来了?

看看他们的说辞:

你对公司这么忠诚,对项目这么认真,你出事了,公司处理这么冷漠,你还那么努力干啥?

初听起来好像有点道理,仔细想想却狗屁不通。

这里面其实偷换了一个概念:

我努力工作,是为了让公司对我好一点

但事实上是:

我努力工作,是为了让我的生活好一点

好的公司会对你的努力变现更快一些,但是差的公司也并非就一定要和你的人生绑定在一起。

所以如果公司无法回报你,你想的应该是换一种处事方式,再不行换一家公司。

而不是因此而放弃努力。

一方面说着:世上最可怕的事情就是比你成功的人还比你努力;这世上大部分努力的程度还轮不到拼天赋的程度。

一方面又说着:珍惜生命,远离加班。

朋友圈里充斥着这些言论,选一种真正适合自己的吧。

最后更新于 .

最近在grahite上看到响应时间变得很长,虽说之前没有特意去优化性能,但是感觉也不应该这么差才对。

QQ20150406 1

我们的服务器框架用的就是我之前开源的 maple,每个命令字都对应一个入口函数,如下:

@app.route(2)
def login(request):
    logger.error("login: %s", request.gw_box)
    uid = request.box.get_json()["uid"]
    request.login_client(uid)
    time.sleep(1)
    request.write_to_client(dict(
        ret=0,
        body="login %s" % uid
    ))

所以只要找到一种方法分析这个函数对应的内部调用情况就可以了。

很方便的,python内置了cProfile类来完成我们想要的功能,我给封装成为一个装饰器,用起来更方便一些,当然在django和flask中也可以直接用。

def monitor_profile(func):
    import cProfile
    import functools
    @functools.wraps(func ...