你是在修补错误的东西吗

在错误的设计上做修补,一错再错。

今天一个设计实例。A程序提供一个内容管理服务,对外API是get和set。B程序跟A程序联调时,B发现A的set接口不能解决所有问题。
A的内容大概是每个key里有多项内容,之前的设置是每项内容为一条记录。如keyA里3条记录,(keyA,item1)=>count1,(keyA,item2)=>count2,(keyA,item3)=>count3。
之前的get接口返回为keyA=>(item1,count1; item2,count2; item3,count3)。
之前的set接口一次只能设置一个key的一个item,上边的keyA的内容需要调用3次set接口才能设置好。
这时B程序发现set接口只能满足给某个key添加一个item或者修改一个item,但是要是删除一个item就没法实现了。

今天同学们的设计思路或者是第一反应,一个是增加修改item名的接口,一个是增加删除接口。这些思路最终都能实现需求,但是实现的会不优雅。如果对整个需求及之前的设计有个整体把握,就能发现set的接口其实可以参照get接口。每次B程序提供某key的全量数据,A程序直接覆盖全量数据。并且存储里也按这个思路来改。整个的实现及维护成本大大降低。
当然这里有个前提,就是这里的每个key的item数量是可以预估到不大的,并且总的key的数量都不多,存储上和网络通信上都是小意思。

在一个不够好的设计里去修补,与直接重构不够好的设计(并且重构成本不大,即使大,也可以采取小步多次的重构)的对比。前者更像在为一个错误的东西继续错误下去,且导致错误的繁殖成指数趋势。其实这里也是在引申嗅到代码的坏味道及时重构的原因与意义。

走得太远不要忘记为啥出发。

另外最近有个其他事情也是类似这种修补错误的东西,就是公司的会议室外墙玻璃上帖了不能拿下的贴纸。公司的会议室是稀缺资源,抢的挺多。加了贴纸之后,外边排队抢会议室的人老看不见里边会议室有没有人或者是否之前的那波人开完会走了,排队的人就一直络绎不绝的去推开办公室的门一探究竟。排队的人有急会就会好几个门都去推下看看,或者都被占着,就多推几轮。已经使用会议室的人就老被人推门打扰。双方都浪费了精力和注意力。

然后给出了一个方案,在会议室门旁边挂个牌子,牌子两面分别写“推门请进”、“会议中”。让进入会议室的人自觉去翻牌子,且让排队的人自觉看牌子。当时讨论这个方案的时候我就感觉不合适,装逼的话就是用户体验不好,等于让大家多维护个概念及事项,并且保证大家都有心情去遵守。可惜还是开始执行了。

果不其然,基本执行不起来。好几周了,大家开会还是不停的推与被推之中。首先排队的人,因为比较急,有时直接没注意到牌子,或者抱着侥幸心理,“可能是别人出来忘了重置牌子呢”,就推门一看。排到的人进去了,因为都等了好久了,谁还想这去翻牌子为“会议中”。即使没等很久,也基本想不到去弄那个,大家做产品的知道多一个按钮转化率低的事情吧。

我最高记录是一次开了1个小时左右的会被推了不下20次的门。不要问我为毛开那么久,因为在开设计评审会。还有个奇妙现象是,中途某位同学误推门之后把牌子修正了,结果后续的其他人照推不误。

这个事情其实就是在修补错误的东西,而没有找根本原因。

透明玻璃上加贴纸,直接按这个透明玻璃失去了意义,变成了砖墙一样。把会议室的默认属性变成了围墙里的秘密。但是真的需要那么多秘密会议室吗,不见得吧。我们不是特务机关啊,没有那么多见不得人的;我们不是大公司啊,没那么多偷懒扯皮会议啊;我们也不是苹果公司啊,没那么多商业机密啊……

目前我能想到的我们公司需要相对私密空间的会议就是面试、谈offer、发奖金什么的、接待合作伙伴之类的。可以看到这些需求其实不大的,我们一方面可以定几个小会议室做成这样,或者每个会议室都弄成加窗帘的方式,平时默认透明玻璃,方便大家查看,也寓意开放。等什么会议必须私密空间,再把窗帘放下来。

另外有人可能会说窗帘这个东西的升降也需要操作,估计大家降下来都懒的升上下。但这个毕竟是少数,每天找行政晚上去搞一遍或者旁边同学轮班巡查下就行了。另外如果有财力支持,可以弄成那种电动遥控的,这种我在《24小时》里看到过小强杰克用过。

这些东西说不定能给大家个启发,我的一定不是最好的办法。

想对运营的同学们说的

在统计线上反馈群里喷的一些事情没有针对个人的意思。我们的出发点是提醒大家多自己分析是否问题,然后使出九牛二虎之力也无解(这样也能锻炼你们分心问题的能力),我们再出马,毕竟咱们开发资源有限,没有专门的客服支持。

大家应该还记得当初只有我的时候,BI的很多需求是排在很久之后才能解决的,立刻解决的只有特别急的(例如大壮急了派玉男“恐吓”我事件,还是历历在目啊)。现在我们人多了,但是公司给我们部门定的目标从来没有小过,我们不只是支持BI,还有很多系统需要我们去做。

大家把当时只有做BI的情景,想象到现在虽然人多了几个,但是我们的目标是要做跟多的系统服务大家。

然后我个人有个缺点,有时候开个玩笑缓解下气氛,但是玩笑不明显。这个我老婆也批评我了(跟她开玩笑她都不一定能识别)。目测改变的可能性很小。以前运营团队的人我基本都认识,开个玩笑大家能看出来,现在运营团队人多了,好些人我也不认识了。以后我会注意下(不过情商的锻炼是艰难的)。

每当你们来问题的时候,我们会总结,是否可以搞个页面让你们方便的搞定你们的问题。以后你们大家碰到问题之后也可以试试这个思路:这个问题,如果平台技术系统组那边提供什么工具,我自己就能确认问题。(当然我们会评估可行性,多讨论几个回合,大家也能知道我们能实现什么,不能实现什么了)

然后这种需求过来了,不管大小,我们是很乐意的,即使会排期,最终只要有空我们就会实现。给用户提供便利是我们做产品的技术人的价值。

我对系统组的要求:平时实现不了的东西,尽量通俗的解释下。很锻炼表达能力,也能提高兄弟部门的技术感觉。

我们准备维护一个常见问题分析思路及示例的页面(例如今天的当日注册用户付费额与首充金额的区别)。我们先出内容,展示方面到时看大家的用的时候再完善。

喜闻乐见的队友素质——做事第一

团队里,执行力强的人与其他人的区别很明显,而且很容易就被各单位队友识别。

单兵作战时,执行力强意味着,你能很效率且质量高的解决掉需求方给你提的需求,需求方会对你肃然起敬,这家伙好牛逼,以后我的需求最好都是他来解决。从外围去树立了你的品牌。

接受分配的任务时,执行力强意味着,你能很快理解领导想要的东西,并做好。领导很明显感觉你很给力,能帮他分担事务。各种福利和锻炼机会必然是优先给你。

团队作战时,执行力强意味着,很多繁杂艰难任务,你能主动承担其中的难啃或者繁杂的事务,队友们会感激你,并且真切佩服你。你能很快在队友当中树立自己的技术威望、留下能做事的印象。

我所期待的团队素质就是类似于一个特种兵小分队。每个人单兵作战能力都很强,团队协作也更强。但现实中没那么容易的直接招齐一个作战能力这么强的队伍,除非在一个不缺资源的单位。

但是我们可以朝着这个目标去努力,整个团队一起成长,民兵成长为正规军,正规军成长为特种兵。即使最终结局没有那么完美,但我们努力过,至少也能完成阶段性目标。例如我们小分队可能最终没有成长为特种小分队,但是我们很有可能会成长为正规军里的尖刀排。

说下我个人的情况,大家可以参考。我是个农村娃,上大学之前从没上过网。QQ都是刚上大学的时候让室友胖子帮忙申请的。但是我一直有信念,一直没有放弃努力。当然我的努力没那么夸张,也就是坚持每年看些技术书,参与的项目代码都会仔细去研究架构、设计、具体功能实现,碰到疑难bug会一追到底,如果追查bug的时候碰到其他不相关的知识点会后续跟进学习。除了技术方面,还坚持去理解需求背后的真实目标、帮忙完善需求,甚至还经常耐心跟合作部门不懂技术的同事讲解设计的原理,还有立刻执行已经确认的东西。我一直的座右铭就是“不积跬步无以至千里”,一直坚持历练自己,很有收获。

以上说的这些,是给大家展望下小有所成时的景观。另外主要是让大家有个信念,坚持做正确的事,就能有收获。

另外强调下,不是只要提高技术就行了。提高做事能力也是很重要的,同样也需要抓住一切锻炼自己做事能力的机会。

最基础的,推动沟通需求,需求来了,不要一开始就想着炫技,或者很容易实现的需求就懒的做。需求没沟通清楚就开始做,很容易返工,属于坑了自己和大伙。技术要求低的需求并不一定就真的是要求低,或许你只是实现功能,而别人却能抽象一套系统,下次同类需求就很简单的几下搞定。而你下次还是重复那套简单的技术。

职业初期做事方法不成熟的时候,被人提出,第一反应不要慌张,也不要觉得委屈。应该第一反应思考我该如何改进,并且尽快给别人反馈。每次别人提出你的不足就是你的一次进步的机会。在一个做事第一的团队里,大家指出问题的出发点都是一起进步。即使个别人不是这样,那也是他的出发点有问题,但是你依然可以在你的思维里做事第一,修正自己的确实有的问题,忽略这种人的不良出发点。

多练表达能力,简洁的表述问题,会使沟通非常顺畅。由于代码的抽象性,对别人讲解时多列举通俗易懂的例子。

繁杂业务时,多形成文档,这样大家一起分析事情时,简单直接,不用凭记忆这么不可靠的形式。文档也是简洁明了即可。

《逆袭前夕》之开篇

开篇题词:
有些人没有信念,倒在逆袭前夕;有些人却一直坚持着……

此微信公众号的名称意思请参考屌丝逆袭。非屌丝请绕开。

纵观我这20几年,嫣然一个屌丝奋斗史。我想要的逆袭,是实现自己的技术、产品价值排第一,财务自由排第二。(老婆并列第一)

一直在奋斗,很充实,虽然还未完全逆袭成功,但阶段性成果也还算让自己满意。

这个公众号里会回忆我奋斗的历程、感悟以及记录当下正思考的内容,一来做个记录,二来企图给我身边有着同样技术梦但经验暂不够的朋友们一些启发(虽然用词一再琢磨,但词还是可能涉嫌装逼,再但是语文给老师还的差不多了,见谅)。

毕业5年回顾——技术篇

毕业已经快5年半,如果算上大四的全职实习的话,商业技术已经有6年半了。之前好多年都想写总结,结果每年都只是想想,或者建立了一篇空文档,然后就没有下文了。但是今年终于开始实施了。之前看过《暗时间》,里边有提到,写东西的时候,会仔细思考,这个时候就能总结想清楚一些事情。随着重拾博客2年多,也越来也感受到写博客带来的爽快感。写着自己看和放到博客上还是不一样的,写着自己看可能就随便写写,放到博客上别人可以看,这个时候自己就会更认真的推敲自己写的东西。以前可能借口忙,不过今年更忙。今年忙的元旦都没有陪老婆回她家,元旦还写代码呢,不过现在对思考总结看的更重了。

毕业前的2008年也顺便回顾下,大四实习,主要是c++和tcp/ip协议、linux网络编程,这年把公司项目的select网络模型改进为epoll了,不过忘记了当时的压测数据,只记得那个项目是有很多网络连接,但是大部分不活跃,所以用epoll能提高很高的效率,因为epoll是事情通知模型,且通知事件里直接知道是哪个fd的事件,而select里并不知道是哪个fd,只能将所有fd遍历判断。网络这块的积累对后边几年还挺有用的,经常会用到这块知识来查问题。

2009~2010年,天龙国际版,主要是c++、lua,这个时候还是打基础,lua的内容较多。印象较深的一个是cegui改底层代码,调通后的爽快;另一个是消息包切不同线程的场景时的处理,记得当时查问题,我比一个老鸟先发现这个问题,心情很激动;还有一个是写了很多活动,学习到的一个随机算法。天龙国际版时,更多的是产品意识的培养,对事情的推动,相关部门的协调常识和办法等的积累。

2010~2012年,鹿鼎记,主要c++、lua。分析日志,处理线上问题方面的锻炼比较突出。最出彩的应该是自学perl,并实现了一个b/s架构的掉线自动化分析工具。perl也就在这个时候集中用了下,后来几年就再也没碰过。一部分工作是查线上问题,所以对鹿鼎的登录、切场景、跨世界、下线、踢人、存盘等重要流程都很熟悉,这都是属于系统功能。后来转向功能开发,又熟悉了些玩法功能。由于比较认真,负责过些风险较高的功能。

做掉线日志分析的时候,一个最大的收获就是图形化的东西能很直观的帮助分析。在图形上看到数据趋势,很多时候一眼就看到问题所在了。这项技能是当时的领导老付传授的。日志分析出的重大问题包括,某些功能导致的网络乱流、服务器被恶意链接占满瘫痪5分钟的隐患、SLEEP场景消息包内存泄露、工作室刷钱群退模式、外挂测试模式等。

这时候也接触了些压测的东西。另外在端游深切的感受到逻辑严密性对防外挂的重要性。

2012~2013年,忍者学院,页游。一开始用php、as实现了个短连接的玩法功能。之后是java服务器的性能调优和新框架编写及长连接玩法实现。设计编写了压测工具,找出并排序服务器严重瓶颈点,调优合适的缓冲区大小,引入AOI小区域广播设计,socket一些用法修正,以及配优jvm,短时间调优后单服务器并发支撑从400左右提升到了1000+,后来由于短板在其他地方就没有继续调了。后来用netty和protobuf重写了原先的原生NIO框架。

框架弄完之后开始一些模块的总体设计及基础搭建,如机器人AI、活动模块、配置模块、统计模块、监控模块等。游戏玩法功能上,实时竞技炸弹人整体设计及编码,涉及同步、碰撞、伤害演算、不同得分规则的策略化设计、反外怪等;实时竞技答题功能的设计及编码,涉及同步、反外怪、得分规则演变、技能等。

网络协议调研了msgpack、thrift、protobuf等,最终选了protobuf。缓存本身有个memcache,我用上了redis。另外还调研了php/java brigde,效率挺低的,后来没用。工具语言写了点ruby,但是不多。当年还调研了go,但是没精力深入学。

2013~2014年,DNF之鬼剑士,cmake跨平台编译方案搞定了。这个项目短暂,所以也没有太多技术的探索。后来了解到田春冰河这个人,借机学习了common lisp,书看完了,也写了例子,不过最终没有用上。对团队要求比较高,除非我打算做自己的玩具。

之后是捕鱼3,负责服务器架构和整体事宜推动及质量保证。架构不分区服的大世界。制定redis集群扩展方案,冷热数据分离方案,逻辑横向扩展方案,并编写实现及压测。另外还给其他项目做架构咨询,对本项目其他成员负责的系统在架构设计、扩展、风险等方面的把关。

不过技术根据公司的战略,写了大半年的node.js+redis,感受就是这门语言太不适合写服务器了。做设计的时候研究了pomelo的源码。有时候对node.js太失望的时候,甚至自己学习了erlang和go。有了自己的编程理解之后,入门一门新语言的速度好快。这个时候对go就比较推崇了,自己闲的时候就用go写服务器引擎,go的interface和原生并发真是太爽了。

期间还看完了《Http权威指南》、以及读了些《高性能Mysql》,对这两个领域的细节了解的很欢畅。另外还了解了下mongodb,不过这个东西大家都不推荐用,就只停留在了解。另外粗略的看了下云风skynet的源码及设计思路和经验。

这期间对工程上的单元测试也有了很好的理解。除非是核心系统,否则单测不用写的事无巨细,否则浪费太多的时间,具体粒度自己去权衡。

2014下半年,BI。开始密集的写了小半年php,用的ci框架,现在这个语言很熟悉了,果然是写web的利器啊,简单够用。重构大法好,一直在重构,也享受着重构带来的好处。另外坚持Code Review,好处也是很明显。不用再总给人擦屁股的感觉也是极好的。

一些优化做的顺利,也得益于以前的积累,如http协议和mysql方面。例如某页面的响应时间直接1、2分钟优化到秒开;ci的session设置好开启时机,解决了大量非必要session的产生等。

钟爱的go也终于应用到了生产环境,这次是bi系统里有些计算上的东西,由于php天生的缺陷解决不了,就用go写了这部分。

日志收集用上了kafka,目前用的公司还挺多的,咱四人帮就有3个人在用。给游戏那边的lua用c封装了个kafka的producer的so,另外kafka的consumer也正在用go写。

这些年变化比较突出的是,碰到问题直接看源码。例如学生的时候,更多的是百度,然后工作了就大部分google,但是现在很多问题属于前言研究,google都没有答案,更多的是直接去看源码了,例如封装kafka的so时,对api有疑问了直接就去c的librdkafka看源码,很快就能定位问题。例如一个内存double free的段错误,看源码一下就知道他在实现地方会先释放原先的内存,如果多个线程没有加锁的这么做,就很容double free了。还有,一些配置项是怎么影响程序了,由于技术较新,英文社区也没啥资料,以前可能就会停滞不前好长时间,现在就捧起源码,看起来。

顺便对失心封事件表示强烈的谴责。

这些年也读了不少技术书,收获很大,不一一列举。2014下半年开始由于工作繁忙,没怎么读书,很伤感,2015这个状况一定要改善。

2015要做的事情,至少《代码大全2》读完,团队顺利添加合适的人,3个组顺利自转起来,等等。

毕业5年回顾——非技术篇

一晃眼,毕业已经5年多了。正式工作这5年多跌跌撞撞、勤勤恳恳,积累的也还不错。

2009~2012,畅游。09年由于互联网的冬天,很多互联网牛逼公司Head Count锐减,导致大批重点学校硕士拿不到那些公司的offer。然后他们就跟我这个非重点学校的小本一起来到了畅游,做新人的初始时期,我偶尔会发出感叹“众硕丛中一小本”。那个时候进去的几批新人大部分很牛逼、靠谱,我很庆幸,职涯初期能有跟这些人一起成长的机会。后来经常被人感叹我看上去跟我的年龄不符,我在确认别人不是指我的长相显老后,我就通俗地解释为我早期工作的同事们都普遍比我大个4、5岁,熏陶的。其实也不光是被大龄青年熏陶,个人很早就知道自己想要什么,并一直为之狂奔着、历练着,综合作用下的结果。

项目经历了天龙八部国际和鹿鼎记,这两个项目的背景让之后写简历轻松了很多。天龙国际的历练是不会忘记的,一度曾感觉身体要垮掉。里边的牛逼人只写(不代表只有)两个,强哥和马爷,畅游之后还有交集。经过自己的努力,被领导认可,在之后全公司集各项目优秀人才支援鹿鼎记时,被选中。进入鹿鼎后,视野更开阔了,各路神仙。

畅游这3年,技术上其实大部分还是积累基础,因为畅游用的技术比较保守。倒是多次刷新三观,否则也不会跳槽了。爱情无收获,倒是慢慢知道了自己的问题出在哪,EQ太低。友情上收获颇丰,因为爱情失利,所以有很多时间搞基。曾想在四哥(这货也是“丛中小本”,不过是211的)的帮助下进入他们那批硕士基友圈,虽然最终失败了,但是至少努力过,哈哈。再后来很多人相继离职了,我们留下的慢慢就沉淀了现在的四人帮。从PY那知道了EQ是什么,志明那见识了志明百科,大脸那见识了脸大。

娱乐和健康上,畅游的时候前边是跟四哥通宵dota,后边转向每周末和节假日骑车出去自虐。最终还挺健康的,不过期间得过尿隐血这种小加班病。

2012~2013,在强哥的接洽后,去了他们待的智明星通,做页游。刚入职时比较多的感受是团队小伙子小姑娘们真年轻,好有活力。靠谱的子文和廖主席等,现在想拉子文,可惜他要为了爱情回老家了。

在智明,技术宽度和深度上开始不错的进展,虽然最后项目没成。不过这些都不重要,重要的是在这里我认识了我伟大的媳妇。本来在畅游末期,我发现我的EQ巨低后,对找对象一直没啥信心。不过慢慢提高的上进心是有的,最后由于某种磁场,圆满了。这里要感谢PY和他夫人的循循教导。

不重要的小插曲,媳妇当年是他们县的理科状元,由于志愿填的保守,进入南开,硕士也在顺便在那保送了。但是这又怎样呢,我的内心特别强大,我偶尔就会祭出当年“众硕丛中一小本”的故事来突围。是的,我的背后偶尔会散发这种无耻的光芒(抠鼻),自己都被亮瞎了。

2013~2014,在项目失败后,跟随强哥去了触控,我们本来要去做RPG的重型手游的,后来阴差阳错,项目被砍了,强哥等的花儿都谢了也没等到开新项目就走了,我呢充满希望的中途加入了捕鱼3。进入明星项目,正准备挽起袖子大干一场,结果也是无奈,项目做了调整,半年后快上线了不做当初跟我说的实时玩法了,我的服务器方面工作就没什么工作了,只有闲着。这个时候虽然我个人继续抱有希望,一边写服务器引擎,一边等,万一哪天公司转型用上了,但是奋斗的心情不一样了。

就在这种尴尬的局面下,跟一直保持联系的老皮再次深入交流他的大计。我们很多想法不谋而合,然后2014年下半年我就开始雷尚的事业了,现在这里就是我的一切了,未来和我的平台技术部、大雷上一起成长。这半年,尿隐血没了,轻度脂肪肝来了,但是无悔。

Review了我的职业规划,5年维度的目标除了开始供房,其他的包括技术积累、岗位重要性、另一半、经济等都达到了,有些还超出预期。

混乱小结-写在从畅游跳槽后

2015-01-02日补充:
这篇大概是2012年写的,没写完,就一直没发表。今天在写毕业5年回顾,翻到了,发现当年的闷骚气质,现在也慢慢减弱了,怎么办,这人已经被工作忙的,变的没啥意思了。为了找回那么点意思,把没写完的文章放出来,缅怀下当年的我吧。


3年前,2009年6月尾,毕业前几天,辞掉了约1年左右的实习工作。毕业证一拿到就随灰机北上进京开始北漂。

当时一心想进游戏公司了解下传说中性能要求极高的游戏服务器是个什么样子,达到北京后,就给在几大招聘网站上北京所有的网游公司海投了几遍啊又几遍。

第一次就去面金山,毫无准备,犯2,最后自然没戏。后边畅游和几家小公司交叉了一面二面。小公司面的都还行,畅游的一面后没什么信心了,最后却没想到顺利二面CTO,三面签offer了。能拿offer的很大原因就是大四那一年的实习经验了吧,因为畅游的面试只做了策划IQ题,然后聊聊实习项目经验。并没有考算法等笔试。offer大大超出预期,然后就充满期待的开始了畅游3年职业生涯。

我走的社招流程,同批的社招程序只有3人,还有wdh(在畅游呆了1年就去百度了)和JT(目前已是畅游的中层管理了),分别作网络安全和3D引擎的。

新手题做的不咋滴,wdh表示丫故意拿题来下马威的吧……分项目被分到国际化天龙,我很不理解这个安排。面试的时候我就表示我非常想做服务器,而且之前经验也是服务器。LB和另一个经理面的我,面试通过了,难道不是为了给我这方面机会么?我就很天真的直接找他聊去了,他表示我没有游戏经验,需要去国际化锻炼,整个屋子都是充满理想的人(不止你一个),等等。聊了半天维持原状,桑心的想着“等着吧,看着我,……”。后来,貌似是今年年初吧,我已经在鹿鼎快1年半了,LB经理来了封邮件,大致内容是,XX,还记得你当年怒气冲冲的找我,哈哈,现在工作顺利吗。收到邮件的时候还挺有触动,他竟然还在关注着我。

大鹏比我晚一天进国际化。大鹏的东北口音特重,我们关系又非常好,交流的多,受他影响,我现在普通话都不利索了,汗!我的大哥分的是强哥,挺厉害一人。想想强哥都分到这组了,还有什么可说的呢,偶尔我也这么安慰着自己,:)。

国际化期间,劲头十足啊,基本是开足火力啊,特拼,仿佛时刻在想证明着什么……大鹏也经常说些让人欣慰的话,你呀一看就什么什么的,前途肯定会非常好。那个时候周围充斥着各种名校的硕士,就我一小本,压力还是蛮大的,挺渴望被承认。然后努力奏效了,第一Q就拿了A+的绩效……

那个时候还在京燕办公,刚好四层空出几个位置,社招的就分在了四层。程序这边的领导基本都在四层。我旁边的好多牛逼人物,隔壁的小龙,LD,HZF,FY,FXM等,还有LB的门对面就是传说中的orge谢老师(当时我只听说谢老师牛逼,却不知道牛逼在哪^_^)。哦,还有翔哥,天天听QF喊翔哥,XX问题帮我看下,还有各种别人喊翔哥帮忙,我就觉得这人应该很厉害,但是其他还一无所知。天龙的游戏架构详细文档署的他的名字。还有wdh的老大,也是新挖来的8级网络安全专家吧。

后来强哥他们搬到四层了,同搬来的还有py。那个时候还不认识py,只是偶尔晚上dota时间,9=1等的天崩地裂,毅然决定上洗手间,途中,看dx和他那儿在专心的补刀。偶尔看见py,就觉得这人吧,怎么这么黑这么丑啊,什么id啊,虐虐他,啊哈哈哈~~(这个估计是成为核心基友后脑补的)。

素质拓展的时候认识了四哥,我们分在一个拓展team。这货86的,听我介绍我是88的,丫就来劲了。各种在我面前摆zb范儿,哈哈,“哟,你真年轻,我都老了。”……还货还是挺好玩的。后来也多次接触,dota里边也经常碰到,组队跟随他们那波的去健身。

跟四哥总有点一见如故的感觉。有人问过,我自己偶尔也想这是为毛呢,同是硕林小本(丫保研没去,我是就没打算考)?其实我更觉得是因为我们有相同的优良高贵的品质——言语上猥琐淫荡,只是我闷骚,他明骚,骚在骨子里,没人性啊~!

MacBook迁移数据大折腾

之前我的rMBP是公司常规配置,去年的13寸4G内存128G固态硬盘,由于公司重要处理的事情多,开的程序也多,经常需要清理运行的程序。现在换了今年出的13寸8G内存256G固态硬盘版。

于是开始折腾迁移数据。OSX本来迁移数据很方便的,两个笔记本通过DP线直连就可以快速迁移。在试了公司局域网通过wifi预计时间太久(不到20G数据要6个小时)、家里不可控wifi局域网直接不能识别后,开始两手准备,买dp直连线做直接迁移和usb3.0的移动硬盘做TimeMachine的中转。

不巧在赶上了双11,京东的货也受影响了,急切想迁移到新本子的心煎熬了几天。

先熬到的是dp直连线,买的绿联,结果不起作用,俩笔记本上的迁移程序都识别不到线的另一端,至于是否是线有问题,也没其他招去检验,只有在家跟老婆一起各种试,哈哈。我放弃了,老婆还在那皱着眉说还要试几个办法,又继续google和各种按钮各种拔插的。看着我都乐了,唉,这种誓死不休的强迫症,我已稍有好转。

终于熬到了移动硬盘。数据TimeMachine备份计算出50G左右到移动硬盘花了10来分钟,然后恢复进新笔记本也花了10来分钟。然后要删除旧笔记本上的数据,大折腾开始了。

删除旧笔记本数据想的太简单,以为把硬盘抹掉,然后挂一晚上在线安装就ok了。这个想法来自于网上那些不负责任的相关文章里看的。第二天早上起来发现丫报在线安装失败,这时还想着是家里网络不稳定导致,然后又背着两个电脑去公司试试。

介绍下几个操作的按键。开机按住option可以选择启动盘,u盘或者硬盘安装是用这个。开机按住command+r是进入恢复页面,里边可以在线更新和管理磁盘。

在公司试了几次,也都是1分钟之内就报失败了,其实公司网络稳定性也不咋滴。但每次都很快失败,很邪门那。看下载不好使,就找同事要了个带osx镜像的U盘,电脑能识别但是就是不能进入安装,很忧伤。这时网上又说了,试试option+command+r,噩梦的开始。这个按钮进入的一个页面其实也是在线安装的一种形式,更牛逼的是把磁盘工具那些东西都弄掉了。

既然也是在线安装,这个当然也是失败了。试了好几次,后来想通了,服务器在美国,必须不好使。然后转战自己做U盘安装那种,找半天没找到放心的dmg。下班的时候再次背两个本回家。

在家准备先试试昨天的TimeMachine备份来恢复旧本,我擦,白天的担心验证了。没有系统的情况下,TImeMachine的备份是没法恢复的。接着在新本研究着,发现AppStore可以下载osx完整包,想到之前可以通过改DNS的方式来快速下载AppStore的东西,希望来了。下了40多分钟终于下载下来了,发现下载下来的是个.app,不是正在看的教程里说的dmg,擦。然后另一篇教程说有什么隐藏文件里能找着,假的。

再看到个制作优胜美地启动盘的,用的命令行将.app处理成安装文件。
具体步骤如下:
1.用osx的磁盘工具将自己的移动硬盘(或U盘)分区,注意要选项里设置为GUID分区表。
2.从AppStore下载的安装文件应该在/Applications/Install\ OS\ X\ Mavericks.app,我刚分区的那个磁盘名为osx_install_10_9。在终端执行以下命令:
sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/createinstallmedia –volume /Volumes/osx_install_10_9/ –applicationpath /Applications/Install\ OS\ X\ Mavericks.app —nointeraction
过会儿,终端输出Copy complete.和Done.,这样就ok了。
3.移动硬盘查到旧电脑,重启,option键,然后从刚才做的那个盘启动。后边进入的安装磁盘管理下的安装选择界面。这个时候看到磁盘工具ok了,我一开始忧伤了下,又进入老问题了,需要点那个install osx选项,进入在线安装了。在这一步纠结了会儿,抱着试试的心态去点了安装,进去了,然后竟然不是在线安装了。

然后就安装好了。

最后PY哥喜得大胖小子,在这恭喜下!程序员的好苗子呀~

公司内部图书馆试运行

之前在畅游和触控都有内部图书馆,另外PY哥在百度的时候也是每个月都有个人买书经书的。然后结合下我们公司的情况和我个人的经历。公司没那么财大气粗,所以招人方面有所限制。需要让大家锻炼技术,技术书又很贵,个人买太多书搬家又不方便。最终,我建议VP搞公司内部图书馆,VP担心之后会流于形式。现在实施办法是先买几本,看大家借书看书的活跃度,气氛好的话,再搞大点。

初步想法是,前期优先是计算机方面的,以后再考虑其他方面的。每个月有个经费额度,具体额度需要VP拍板。经费额度要适中,目的在控制书的质量,要买经典书,不买垃圾,如很多国内垃圾入门书。经典书的判定,由各技术部门的核心骨干组成的技术经典书籍鉴定小组来做审核。

书的购买,由技术经典书籍鉴定小组审核通过后,指定的购买负责人来推动采购流程。

书的管理,实物管理可以由指定的行政部门同事来保管,借入借出的登记由平台技术部系统组提供OA系统支持,方便公司同事随时查看图书馆已积累了哪些书、各种书的状态等。

借书周期,可以先定一个月,太厚的可以定久一点。之后到期要归还,然后重新排队。

目前已经购入图书馆的处女书《代码大全2》,我自己先看着,哈哈。刚看了50多页,这书太经典了,努力推动图书馆建设的心也更坚定了。

VP担心图书馆会流于形式这个问题,据观察,可能是公司处于快速发展期,大家工作非常忙,没什么时间看书。但是这个应该没什么问题,有追求的人,再忙也会花时间去学习的。退一万步讲,都没追求的话,我至少要逼着我部门的同事看看《代码大全2》这种经典书,写阅读心得。:)

近期对PHP与Mysql相关的优化

BI的线上经常报mysql连接数耗尽,查的结果是部分表经常被某个查询锁住,然后其他访问这个表的查询连接就一直阻塞着。原因是这些本来要支持一定并发规模的表竟然用的是MyISAM引擎,我把相关表的引擎换成Innodb了。

有些历史业务逻辑竟然用了n*n数量级条数的mysql查询。这光花费在IO上的时间都是惊人的。优化后直接弄成一条mysql查询,业务响应时间从1、2分钟降到秒开。

mysql的where in里不要写子查询,用连表方式会数量级上的快,这个原因具体看《高性能Mysql》吧。