2016小结【opt.技术与工作】
早在12月中我便开始思考怎么样去总结2016年的一些事,但因为遇上一些烦心的事,所以在夜里总是不自觉地分神,导致迟迟没法写出一篇像样的文章。今晚不用加班,难得有时间就好好写一下,好或者不好都发出来了。
2016年对我来说,意味着很多,可以说是我二十多年生命中变化最大的一年。我从大学里毕业了,走进了社会。单是这句话,大概我写一个晚上都写不完。这句话让我想到了,生活、工资、责任、时间、社交等等,这一切都随着我从一个学生变成一名职业人而发生了巨大的变化,甚至是毕业半年后的今天,我也未能完全地适应下来。
书架的技术层毕业了我能当一名技术,还算不错。
由于专业的关系,我的朋友圈可能有三分一的同学都是技术流的。实话实说,作为2016年刚毕业的学生,幸运地遇上各种电子信息技术爆发的年头,我们混得还不差。我的朋友圈里年薪破十万的同学已经不少了,早就听闻北京这座城市给刚毕业的技术都普遍能开出10k一个月,薪金之厚度其次是深圳、上海,最后才到我现在的城市,广州。我工资虽然不多,但幸好广州的生活成本比较低,挥金如土谈不上,稍微体面一点的生活还是能过上的。
其实认真对比一下,我们并没有获得更多的收入,朋友算了一笔帐,把我的工资除去我实际工作的时间,她的收入其实比我还高,于是就得意的笑了。是的,现在的工作还挺累人,估计每一名从业编程的同学都会有这样的感受。
我是一名游戏开发工程师,精神压力普遍比身边的其它技术要大一点,因为我们每个星期都会有一次更新,上线便意味着有可能会出bug,所以每天除了开发还得兼顾客服群反馈过来的问题。我印象非常深刻,有一天收到了一个大号人民币玩家的反馈,说自己的游戏装备有问题。我被安排去查他的数据,各种日志、数据都正常,最后我只好把他口中的装备由获得到升级重新走了一边,最后的结论是装备一切正常,只是玩家自己记错了。我早上就开始查,而结论出来的时候,已经可以下班了。
连上实习的时间,在公司已经大半年了。大概三个月后,我基本上可承担大部分的游戏逻辑开发,每天的工作都比较顺利,但这也意味着自己慢慢地就进入了呆在这家公司的舒适区。有这么半个月我过得格外轻松,但慢慢地心生焦虑,舒适区呆久了对一名技术来说是致命的,尤其是刚毕业的技术。那时候我对一些代码的修改和新活动的逻辑编写已经无感,但是又未深入了解游戏其它系统。大概焦虑了几天,我就做了一个小决定,去接客服群反馈的所有问题。
从那时候开始未来两个月我便活跃在客服群里,接客服的问题是一件特别累人的事。因为线上的反馈是内部代码不安全的表现,但这些表现并非十分直观,有时候是概率问题,有时候是数据问题。而且一个问题可能会涉及到非常多的系统,翻遍所有有关的代码,有时候焦头烂额却无功而返,有时候又能发现错误根源,潇洒地用一句代码解决问题,回头故作淡定地在客服群上说:没事,小问题,都好了。
这样的过程持续了大概两个月,时常因为非常疲惫出现情绪,但也由于深入了解了很多系统的bug,除了快速了解系统实现以外,我开始思考代码重构的问题——如何优化现有代码。那两个月我利用空闲的时间调试了Spring的ioc和aop核心代码,借此对比了工作接触的坏代码,我重读《重构》有了更深刻的体会和收获,在开发或排除bug的过程中应用书本中记述的技巧。后面的时间我开始了很多活动的代码重构,重新理解了面向对象编程。从那时候开始我很少抱怨需求的修改,我始终相信一段设计合理,封装正确的代码是可以应付绝大部分需求修改的。
在重构的时候,遇到最烂的代码估计是排位赛系统,阅读代码花了几乎一个月的时间,中间有很多匪夷所思的实现让我在读源码的过程饱受煎熬。最后我在底层数据结构采用两棵完全二叉树对整个排位赛淘汰过程进行记录,并把完全二叉树封装在一个排位赛赛程裁决的类中——这就像一个只负责赛程管理的工作人员,提供一定的服务给参赛人员。使用二叉树的模型使整个这个系统的流程显得格外容易,二叉树的遍历方式非常灵活,无论是层次遍历还是子节点的访问,最后整个裁决类一共不到500行有效代码,几乎解决了之前排位赛所有的问题痛点。在接入过程中,就仿佛是把旧的裁决人替代掉,因为我实现了大部分旧的接口,所以替代过程只用了一个下午就完成了,当代码稳定地在机子上调试通过的那一刻,“卧槽,终于好了。”我默默骂道,心中一种莫名的得瑟感油然而生。
大概并没有多少人理解我上面的心情,行业里一位杰出的工程师曾经说到,这是大部分工程师都有的快乐和寂寞。
上个月开始,我开始负责游戏项目每晚周四的更新工作。这是一种全新的体验,管理着线上一百多个服务器400多个区不是一件容易的事情,以往任何一个简单的操作要重复到近两百便会马上成为一件无比恐怖的事情。我在公司最美的邂逅大概是python,这是一个极其简洁方便的语言,几乎可以替我完成所有在Linux上的操作,我利用python针对每次更新重复较多的操作编写了一套的工具,可以自动打包,收集配置文件,一件更新s0等等,更少的个人操作除了能节省所有人的时间,还意味着更少的手误问题,也更容易暴露核心问题。
负责游戏更新意味着我要理解更多的服务器架构问题,Nginx下的负载均衡,各种分布式服务的设置,这些对我来说还是非常陌生的,但非常有趣,希望这些都能给我明年的工作带来更多的乐趣。
非常遗憾,最后这个文章最后还是慢慢落到具体的技术方面中去了。
犹记得去年这个时候,怀着各种不安和焦躁去实习,经常不自觉关注身边的朋友都获得了什么样的offer,什么样的薪资,或者在公司中学习了什么样的技术,现在回顾起来,难免为自己的稚嫩感到尴尬。这一年给我在职业道路上的收获颇丰,深感幸运。
我今年获得了长足的进步,突然让我想起了在大学里指导过我的一位老师,王成。
2015年4月15日,星期三,我去给王成老师带上项目的一些资料。我记得那段时间我准备踏入大四,自己手中却没有任何得意的技能,十分焦虑。于是在我资料交托完毕后,临走前,我向老师说出自己心中的困惑,关于技术,算法,系统,计算机等等,我本以为老师会简单地回答我的问题。不料到他把我的茶杯倒满茶,开始耐心地给我讲了很多,可惜我自己学识甚浅,老师的很多描述未能领会。于是回来宿舍后,结合记忆和自己的理解,把老师说的话记录下来,写成谈话文档,保存至今。
难以设计一个算法意味着投入的时间不够或者方法有所不对,最主要的问题是投入时间和练习不够,因为方法会在实践中被调整。这是一个经验的问题,不是说学会数据结构就能设计一个算法出来,对于一个问题要能够设计一个算法出来更多的是需要经验,逻辑思维强产生的推动作用是有限的。由设计算法困难,到有所头绪,到轻易设计出来,本质上还是一个经验问题。
可惜自己在大学期间未能按照他的指导进一步去完成其它计算机基础学科知识的串联,如今每次看回这篇文档,都会觉得有点遗憾(仅仅去完成了数据结构的重写,但这个过程已让我受益匪浅),而我有预感,未来遇到的问题会越来越大,而需要的基础学科只是也会越来越深。当时我并不能理解老师说的,只是默默地记住,然后如同他一般,努力以一种严谨的态度去对待技术和工作,并不断结合理论和经验去做新的实践。
谈话的文档回顾过去的一年,除了王成老师,邹莹老师计算机网络和毕设上的指导,郑建华老师在邮件上给我的鼓励和帮助,实习公司里的猛哥、成哥,现在公司里的宇哥、啊浪等等,他们都在我从学生转变为一名工程师的过程中给予了我很大的帮助,希望自己2017年在技术的路上可以走得更加深远,可以创造出更大的价值。