毕业 5 年回顾——技术篇
毕业已经快 5.5 年,如果算上大四的全职实习的话,商业技术已经有 6.5 了。之前好多年都想写总结,结果每年都只是想想,或者建立了一篇空文档,然后就没有下文了。但是今年终于开始实施了。之前看过《暗时间》,里边有提到,写东西的时候,会仔细思考,这个时候就能总结想清楚一些事情。随着重拾博客 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 也就在这个时候集中用了下,后来几年就再也没碰过。一部分工作是查线上问题,所以对鹿鼎的登录、切场景、跨世界、下线、踢人、存盘等重要流程都很熟悉,这都是属于系统功能。后来转向功能开发,又熟悉了些玩法功能。由于比较认真,负责过些风险较高的功能。
做掉线日志分析的时候,一个最大的收获就是图形化的东西能很直观的帮助分析。在图形上看到数据趋势,很多时候一眼就看到问题所在了。这项技能是当时的领导老付传授的。日志分析出的重大问题包括,某些功能导致的网络乱流、服务器被恶意链接占满瘫痪五分钟的隐患、SLEEP 场景消息包内存泄露、工作室刷钱群退模式、外挂测试模式等。
这时候也接触了些压测的东西。另外在端游深切的感受到逻辑严密性对防外挂的重要性。
页游相关积累 & 开始锻炼架构设计能力 & 拓宽技术宽度
2012~2013 年,忍者学院,页游。一开始用 PHP、ActionScript 实现了个短连接的玩法功能。之后是 Java 服务器的性能调优和新框架编写及长连接玩法实现。设计编写了压测工具,找出并排序服务器严重瓶颈点,调优合适的缓冲区大小,引入 AOI 小区域广播设计,socket 一些用法修正,以及配优 JVM ,短时间调优后单服务器并发支撑从 400 左右提升到了 1000+,后来由于短板在其他地方就没有继续调了。后来用 Netty 和 Protocol Buffers 重写了原先的原生 NIO 框架。
框架弄完之后开始一些模块的总体设计及基础搭建,如机器人 AI、活动模块、配置模块、统计模块、监控模块等。游戏玩法功能上,实时竞技炸弹人整体设计及编码,涉及同步、碰撞、伤害演算、不同得分规则的策略化设计、反外怪等;实时竞技答题功能的设计及编码,涉及同步、反外怪、得分规则演变、技能等。
网络协议调研了 MessagePack、Thrift、Protocol Buffers 等,最终选了 Protocol Buffers。缓存本身有个 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 个组顺利自转起来,等等。