Java游戏服务器三年技术成长总结
【本文参与GWB有奖征文活动】
大家好,我是三年没正经更新过文章的何...大成?何小成这个笔名已经不适合我了,因为今年我已经28了,一眨眼,我也是有5年工作经验的工程师了。
回想起来,人生的每个阶段总会羡慕比我们年龄大,或者比我们经验丰富的前辈,
比如说:幼儿园小班羡慕幼儿园大班,小学一年级羡慕小学六年级,初一羡慕初三,高一羡慕高二(高三没啥可羡慕的),大一羡慕大四,毕业羡慕工作三年,工作三年羡慕工作五年,以此类推。
现在,我工作五年了。
你终于成为了你想成为的人...吗?
一、前情提要
经验积累
本文标题有没有一种似曾相识的感觉,没错,《Java游戏服务器成长之路》系列,已经停更三年,这三年...我经历了换工作,考驾照,结婚,还有三年几乎不停的加班。这期间,我也时不时还回味一下,我三年前的技术文章,以及每年年末我自(bei)愿(po)写得年终总结。客观的说,我也确实因为加班太多逐渐放弃了写文章,有时候回想起来,之前的工作是真的轻松啊。不过话说回来,我在这家公司的这三年,也确实让我的能力有了质的飞跃,这其中不仅仅是技术能力,也包括个人的经验,开发的思考角度,考虑问题的全面性等。记得刚入职的那几个绩效考核时,老大中对我评价一直是有这么一句的“学习成长快,但经验不足,需要不断吸取经验”。对于这句话,我是认可的,也正是这个客观的评价,才让我在开发中注意到很多前辈留下的经验教训,很多东西,别人踩过的坑,我们完全吸取经验后是可以避免的。几年的时间里,也让我在游戏服务器开发这块真正有了经验的积累,我逐渐能明白为什么有的地方要这么写,而不是那么写,逐渐能明白这个数据为什么不能直接捞库,逐渐能明白为什么要写设计文档,为什么设计代码结构要考虑到各种扩展性。这些东西在我工作几年后,都慢慢能领悟到了,也能以更加理性全面的角度去看待每一个问题,每一个需求。
踩坑一次可以,一直踩坑不行
再谈写书
现在回想刚毕业那一两年写得文章,也就是《Java游戏服务器成长之路》系列的前几期,实在是有些狂妄和虚无,因为很多东西,我是没有太多实际应用经验的,仅凭网上天花乱坠的描述以及自己浅薄的demo代码,就吹出了一篇篇类似“架构”“源码分析”“方案”等高大上的字眼。而这三年稳扎稳打的进步中,我也逐渐明白,之前吹上天的技术,其实我并不能完全理解它实际性的内容,甚至有些只是懂个皮毛而已,而这些东西真的是需要你慢慢静下心去看,从架构思想,实际应用,甚至翻看源码,才会理解它的终极奥义。以上也包括之前出的第一本书《深度解析Java游戏服务器开发》,对,没错,“深度”二字,实则并不深度,整本书,也大概是在堆砌代码,重要概念,框架思想,源码分析,都是一带而过,最后在网上收到大量差评我也能理解,这本书说是一本书,更像是一个卖钱的商品,出版社以“深度”“Java游戏服务器”这些字眼卖钱(市面上几乎没有Java游戏服务器开发相关书籍),而我,则收到一笔对我来说还算不错的稿费,而书的质量,就很一般了。
好在第二年,我放下心态,抛弃“深度解析”这样的字眼,以“入门”“实战”为名字的第二本书《Cocos2d-JS游戏开发快速入门到实战》,而且也抛弃了上一本书的粘贴代码,这本书的每一个demo都是我不断调试运行的实例,甚至后来,我把其中的《飞机大战》小游戏用cocos creator重写了一遍,上了微信小游戏,并小赚了三千多块钱,到现在为止,每个月还有七八块的收入(也不知道为何还有人这么执着这个游戏,哈哈哈)。第二本书,是以Cocos2d-JS技术为主,其中有一部分服务器的内容也是用NodeJS写得,这块内容我自己本身也不是经验丰富的大牛,所以我基本上是以一个初学者的视角入手,带着读者入门Cocos2d-JS的开发,所以我感觉,这本书,更多的是面向大学或刚毕业不久,对游戏开发感兴趣的人。第二本书对于我自己来说,质量是比第一本高的,而网上的评论也基本是对这本书的肯定。
写书的过程是痛苦的,但也是学习的过程。写书的时候,尤其是写第二本书的时候,我更加注重自己在打字之前明白自己在说什么,在讲解一个知识点的时候,我会先自己弄得清清楚楚明明白白,这样我才能把它写出来。
当然了,后来我也就不写书了,一方面,是觉得自己确实还有很多东西不是特别清楚,另一方面,写书除了累,也赚不了几个钱,还不如写点技术文章,反正我写文章也不是为了养家糊口,纯粹想要分享知识的兴趣爱好。
而第二本书的网评也让我意识到,对于我来说,书不是商品,是总结自己和分享传播知识的媒介,所以质量一定是第一位,书里面的内容,自己必须先整清楚。
人可以飘,但不能飘的太远
以上是承接我三年前的前情提要,希望看完还能回忆起来,曾经我也是更新频率很高的一个写作者。
二、后期计划
说完前情提要,不得不说下我后边的计划啊。大家可能会想,作者会不会写完这篇就销声匿迹了,又停更了呢?我告诉你,完全有可能的哈!但至少目前不是,因为前段时间,我也不知道我怎么了,我去申请了一个域名,hjcenry.com,然后还通过了备案,申请了https证书,换句话说,我现在有一个正规经营的个人网站了,我要是不写点啥,总感觉对不起我这正规域名。然后我就陷入了沉思,我写啥呢,经过我的思考啊,我这不是三年没写技术文章了嘛,这三年,我都在开发一个mmo+arpg的项目,于是我想,就根据我现在的项目,我写一个mmo系列的java游戏服务器开发的系列吧,分享一下目前Java游戏服务器开发mmo的常规思路,分享一下我对于mmo服务器中常用功能架构的看法(请注意用词——我对于xxx的看法,毕竟已经28了,不能像三年前写文章那么狂妄自大了,用词要稳重得当)。
后期java游戏服务器mmo开发系列中,我准备从服务器的io,线程模型,数据落地,常见功能(如聊天,组队,aoi,寻路等)入手,不会的我就恶补我的项目源码,项目我带不走,但这里面的技术思想我必须带走,可能更的不会太快,毕竟如果遇到不会的我也需要再继续学习一下的,但我保证每一期,都充满干货。当然了,虽说是我目前的项目,但我仅从技术思路出发,不会涉及具体代码,最多自己写点示例代码,都是干这行,技术保密的意识还得有,但我相信懂得人自然会懂得如何把思路实际应用到项目中的。
对了这个系列还没有名字呢,不如你们给我起个名字?
三、面试分享
诶?你们看到这是不是以为我要跳槽了?哈哈,不是的。工作五年了,我也是第一次正式的作为面试官去面试别人,对的,是面试,但我成了面试官。这也不是啥值得光荣的事情,只是因为公司校招,参加面试的应届生太多,老大面不过来而已,所以我们组里边挑了3个人帮着一起面试,而我,也是因此第一次去面试别人。嗯,我成为了5年前刚毕业的我最讨厌的人。
关于“造火箭”
我们这次面试的都是校招的应届生,所以我也想借此机会,分享一下我对于应届毕业生找工作面试的看法。首先要说的是,在我这的通过率挺高的,我面了8个人,过了5个,后来老大说太多了,让我又缩减到了2个,而正好,有两位我是觉得非常优秀的。首先要说的是,如果现在的我,面试5年前的我自己,我是肯定不会过的,打个比方,当我问:你知道HashMap源码吗?你知道JVM里面的内存模型吗?你知道JVM有哪些GC算法吗?能写一下判断回文数的算法吗?五年前的我,多半会面完就跟室友抱怨:这面试官怕不是个傻子吧?面试造火箭,工作拧螺丝?但我想对五年前的我自己说的是,除了最后一道手写算法题是我自己最近leetcode上刷的一道题之外,其他的几个问题,工作中真的是会比较在意的,举个例子,我们经常用的HashMap,如果你只知道new,put,remove而不知道底层数据结构和内部链表和红黑树的转换的话,你永远也不知道你的数据在put之后都经历了什么,你HashMap的使用效率怎么样,它是否线程安全;如果你不知道JVM内存模型,不知道GC算法,你就不知道,你new出来的对象在JVM哪个区域,它什么时候被回收,当然了,你可以不知道,那就相当于,你把你的钱,借给了一个你完全不了解人,你不知道他借你钱干什么,你也不知道他什么时候会还你钱,或者说,你的钱基本上是有去无回了。所以说,这些东西,看似是造火箭,而且也不会真的让你手写一个HashMap,手写一个JVM,但如果你不了解他,你对于Java的理解就永远止步于此。五年的我,也是经常被这样的问题问懵逼,但工作以后才发现,火箭不用我造,但需要我懂,不然我可能都不知道这火箭要怎么启动。
学而思
毕业前听说的工作以后面试就是一千个里面挑一个,其中在我们这一行,不至于这么残酷,不像是公务员事业单位那样,但我们这行也是要挑人的,比如我这次面试,我一共面了8个人,通过了5个,这5个倒不是说我放水,而是真的都很不错,淘汰的三个人,是很明显的刚找工作时一脸懵逼的状态,而这5个,是真的有好好准备了面试的,我问的问题也是能答个八九不离十,而我最中意的其中两个,不仅能把我的问题回答的八九不离十,还能自己往外拓展,并且当我觉得他们只是背题时,我出了一些技术的实际应用场景,他们也能顺利的答出来我想要的答案,说明他们是真的学以致用的,深入理解了概念,即使没有实际应用经验,也能想象到这个技术能应用到哪些地方的,举个例子,我的问题中有其中一个问题“TCP和UDP的区别和特征”,这个题看似很简单,背背题也能蒙混过关,但我会分三步走,第一步问一些网络的基础问题,比如四层网络协议,TCP三次握手,这一步,我8个人里筛选掉了3个人,第二步,我会问TCP和UDP的区别和特征,这一步,能基本上都说出来的有5个人,最后一步,我会问“你认为视频通话是使用TCP还是UDP协议,说明原因”,这一步,筛选出最后两个人。其中一个985的研究生,可以清晰的跟我分析出视频通话是UDP并且说明为什么是UDP。大学以及工作以后,我们学一个东西时一定要明白你学它的意义,它能做什么,它为什么能这么做,这样才能帮助你以后更好的应用它,我认为这是一个终生不变的学习方式——知其然,知其所以然。
我面试的8个人里,有985,211,有研究生,有的各种证书,有的雅思 CET4 CET6全都过了,但在面试的时候,真正考验的还是你对知识掌握是不是仅仅局限于大学ppt上面的概念。其中总的来说,在面试的时候,大家都是应届生,甚至本科应届生和硕士应届生我也是全都同等看待,面试官更加看重的还是你对基础知识的掌握程度和你学习的能力,都是刚毕业,大家都没有项目经验。那面试的时候,更多就是看你的基础了,你说你是985 211 研究生,但是啥也一知半解,我们招进来也是需要接手我们手里的活,谁会给自己招一个累赘呢,肯定都想要聪明能干,基础越扎实越好。面试官和你的关系,很可能以后就是同事,想象一下如果跟你一起干活的人,如果基础能力很弱,那可能吃苦的就是你,因为你要帮他干完他不会的活。
四、言归正传
三年的文章停更,倒也让我累积了不少知识储备,虽然说我在Java游戏开发的路上越走越远,和互联网技术开始慢慢有了分歧,慢慢的不太了解互联网用到的技术,但我在游戏服务器的实时通信,高效内存管理,数据管理等方面有了更深的理解,以后我也会尽量抽出时间,分享我在开发中遇到过得实际问题和解决思路。还是上文提到的,后续我会更新一个java游戏服务器的mmo开发思路(或许思路不局限于java)系列文章,分享一下这三年我参与的这款项目的开发思路于各种实际场景的解决方案。
完结撒花,关机睡觉!