许久许久许久都没有碰过博客了,平时也几乎不会浏览技术论坛,CSDN对我来说作用就是下载+帮同事下载,昨晚(或者可以说是今天凌晨)上CSDN手贱点开了界面里一条关于程序员的文章链接,然后文章下又有更多的文章链接,于是...看了一晚上。往日里开开心心加着班,一直保持我coding我快乐的心态工作了这么些年来的我,惊讶(大概吧)地发现,原来我可能就是大部分评论区里描述的那种“不去学习新知识”、“不思进取”、“每天就是混日子”、“只会写业务代码”、“用的最多的就是ctrl+c和ctrl+v”、“不配被称作程序员”、“到了30就会被年轻人取代”的那一类“废物程序员”。

怀着淡淡的忧伤心情,稍稍回忆一下从2010年开始工作至今,第一次走向自己工位的那一天仿佛还没过去多久,一晃眼竟然就即将整整过去9个年头,回忆着回忆着,忽然就想写下一篇回顾,记录自己这些年是怎么混过来的,倒也不是说想激励自己从今天开始努力,就是想写而已,写给以后老了的自己看——你看你年轻时候都干了些啥。

既然都要回忆了,那就干脆从开始踏入计算机这个门槛时候写吧。

(......预感这应该是一篇会写得很长很长......的流水账......)

选专业

反正高考时候我就算没有睡着也多拿不了几个分——能拿高分的人根本不可能考试时候睡着嘛,考出来的分数呢,刚好飘过三本录取分数线,家人表示三本没什么好读的,你去当兵吧,我说:“好啊。”

就当家人即将把一切都安排妥当的时候,我突然又反悔说:“我想念书。”

估计当时爸妈听到我说这话的时候,内心是这样的:现在想读书,早干嘛去了!

但父母当时也没说什么,非常大度地答应了我的诉求。

(这件事大概我会记上一辈子,对处于青春叛逆期各种想一出是一出决定好的事情还总出尔反尔的我,父母优先选择了包容,非常感谢他们用“你要是没想好以后的路怎么走,那我们就帮你规划;你要是有自己想要走的路,那就去走你想走的”这样的态度来对待我。)

然后我就开始风风火火地挑选学校和专业了!我想,大部分人高考以后选填专业志愿时基本上都没有明确的目的,我也是那大部分人的其中之一。三个学校志愿全都选的理工类型学校,至于专业志愿只知道自己小时候喜欢画画,那第一志愿就填电脑美术设计吧。第二志愿呢,想学心理学,可惜挑出来的几个学校专业列表里都没有这个选项,又浏览了一下其他专业,也全都没什么感兴趣的,第二第三志愿就打算随便填了。考虑到似乎最近计算机相关专业很火嘛,就选了一个计算机科学与技术,还有一个填的什么已经记不起来了。

不多久我就接到了校方打来的电话,说我已经被他们学校录取了,不过我的专业志愿这一栏,第一志愿的分有点不够,问我接不接受调剂。我说:“好啊。”

于是,我成为了一名计算机科学与技术专业的新生。

java从敲门到回头

简单来说,那时我对电脑的全部知识就只有:这个是开机键、这个是浏览器、这个是我要玩的游戏。如果给我一台还没连好各种线的台式机,我会觉得:这是一台还没有装好、不能用的电脑。真正零基础的我对这个专业是充满了好奇的,对于新知识的热情十分饱满,从入学开始,除了认真听课以外,《电脑报》、《微型计算机》也是每期必买。在终于分清了什么是软件、什么是硬件,什么是内存、什么是硬盘以后,不知道从哪里来的勇气,我竟然决定 自学java!

我已经忘了当时为自己选了一本怎样的入门书籍,总之呢,就是自信满满地开始看书,翻了一周大概对对java是干什么的有了一定的印象以后开始照着书上说的那样配置运行环境,准备周六日写个世界惯例的HelloWorld。

周六:配置环境。

我没有偷懒,我一大早就开始弄,我甚至都没有吃饭!然后周六就这么过去了。

周日:环境好像配好了?太好了,可以编译我的HelloWorld了!

打开记事本,花了一分钟左右写好代码,保存,修改后缀。

来吧!javac!

至今仍旧记得当时那个代码一共只有7行。

回车符敲下,伴随着滴滴滴的几声蜂鸣,编译报错1000+!

为什么?怎么了?我是谁?我在那?

热心的网友提醒我:编译老是报错怎么办?多半是环境配错惹的祸。

于是,周日也在反复配置环境中度过。

到了周一,我把从图书馆借来的所有关于java的书全部还了回去,当时我的内心是这样的:垃圾语言!浪费时间!我这辈子再也不要碰java!

C\C++\VC++

在java配置环境失败的巨大“挫折”下,我毅然决然地投入了C的怀抱,抱着TC2.0愉快地开始写代码、编译、运行,再加一行、再编译、再运行。当时的内心:这个语言真棒!写了就能编译!编译就能运行!运行完了还能再写再编译再运行!

当时学校也开设了C语言的课程,老师推荐了谭浩强的书,我很开心地把书和题集全买了,一章一章看,看完就做题,做错了的如果看了答案还不懂就拿着题去问老师,学的特别带劲。

一个学期过去了,又开始了C++的课程,使用的TC2.0也升级到了TC3.0,同时数据结构的课程也开始了,我学得更带劲了。

数据结构当时一听这名字就觉得是很有意思的一门课,翻了课本目录以后更加确定了就是一门非常有意思的课,于是毫不犹豫地决定这课我要上两遍,第一遍用来听,第二遍用来跟着做例题加深对课程的理解。(当时计算机专业有8个班,数据结构不是大课,1~4班上完5~8班上,所以可以实现听两遍。)

刚学完链表和二叉树,我又不知道哪里来的勇气,给自己定了个“小目标”——这学期做一个双向链表的哈夫曼编码解码器出来。

事实证明是我孟浪了,野指针教会了我怎么做人。

在被四处横飞的野指针疯狂抽脸一周以后,我含泪默默把时间回滚到了一周前,删除了那个“小目标”。

学期末了,C++的最后一堂课上,老师给我们演示了用C\C++实现的各种代码,当时我就震惊了,为什么同样是蓝底白字的DOS窗口,人家的代码就能画出一个会走的时钟呢!?有的人还把时钟的指针画成了一只蝴蝶,扇着翅膀一圈一圈的飞!

然后我又给自己定了一个小目标:我也要画一个会走的时钟出来!

于是我上网搜资料,换着各种姿势提问,知道了原来是有个图形库呀,原来可以这样画东西出来呀,原来是这样的呀~然后就放暑假了,我就回老家吃了睡睡了吃,把这个小目标给忘记了。

新的学期又开设了VC++课程,终于开始接触到有便捷的用户界面可以用鼠标点来点去的编译器VC++6.0.但是刚接触到VC6.0的时候,我的内心是拒绝的——这个界面好复杂啊!为什么有那么多选项!在开始写代码之前,我得记多少工具上的菜单功能!?还能不能让人愉快地写代码了!

没过多久:真香。

我开始接触到了对话框,疯狂迷恋上了能捕获到鼠标键盘事件以及用户各种操作的愉悦感,疯狂迷恋上了可以弹出一个界面,点点按钮就能立刻调用某段代码的愉悦感,为按下F5就能一键编译+运行、能够下断点调试那些无法定位的bug代码疯狂打call。

然后我就开始用VC6.0尝试各种简单的小程序,当然第一个就是计算器了,然后尝试根据不同指令变化对话框中显示的内容与布局,然后尝试对话框互相弹来弹去,再然后就想起来自己曾经想在界面上画图的小目标了。写代码正写到兴头上,那么说干就干,先来写个五子棋吧。

当时的课程中对如何在界面上绘制图形还是没有教,我还是只能从网络上搜索“VC6.0怎么在界面上画画”开始着手。边搜边实践,总算是把棋盘画了出来。然后再加上一点逻辑,先实现PVP,然后又实现PVE,写出了一个非常蠢的电脑AI跟我对弈的五子棋。在我不眠不休通宵达旦脚不沾地连厕所都尽量忍着少去的大约三天左右的努力下,这个五子棋终于还算能让自己满意的完成了。至此终于长舒一口气——我终于实现了第一个不需要含泪抹杀的小目标!(这个代码至今还留在我csdn上传的资源列表中,只要csdn不把我的资源删除,我大概会一直挂着留作纪念吧。)

紧接着画图上了瘾,决定再做一个俄罗斯方块!我还要给背景画上很漂亮的渐变色!我的方块再在下落过程中和下落后得是不同的颜色!同时消除行数越多需要得分越高!得分越高需要等级越高!等级越高需要下落速度越快!我还要记录我自己的历史最高分!嗯,差不多就这些需求吧,动手吧。

然后,嗯,时隔1年,野指针又跳出来教我做人。

画刷的句柄,用着用着就空啦!

方块的数组用着用着就乱啦!

整个界面跑着跑着就开始全屏闪烁我那美丽的渐变色啦!

最后“噔”的一声,程序就挂啦!

整个工程从动手到大致写出来并没有花多长时间,但是因为数组越界、野指针乱跑的bug调试了十几天都没找到bug到底在哪。如今这个代码也是早就已经挂在了csdn上传的资源列表里,但我已不愿再下载回来查询当年自己写出的bug(捂脸)

糜烂的生活开始了

对coding的热情只维持了两年,第三年,我迷恋上了——魔、兽、世、界!

为了能24小时随时随地玩游戏,我从宿舍搬了出去,租了离学校大约5公里远的小区的一间地下室,牵上一根网线,过上了昏天黑地基本上再也不去学校的生活。

(当然没让父母知道我干出了这种事,没敢问他们要钱,动用的是自己前两年努力而获得的奖学金...)

不想回学校,99%的原因是游戏,剩下1%我归咎于:大三开设了java课,这与我的人生信条相违背,我要做一个有原则的人,说不学就不学!另外还开了个JS课,java开头的肯定也要拉入信仰的黑名单,不学!我是一个有原则的人!

同期连带被旷掉的还有SQL、软件设计、编译原理等。

残酷的现实给了我一巴掌,我注定无法做一个有原则的人——Java是TMD必修课!必修课!必修课!

开开心心玩着游戏,辛辛苦苦打着副本,时间就这么飞速流逝,很快我就迎来了大三的前后两次期末考试。所幸凭着还算扎实的C的一些皮毛基础,临时抱佛脚的我当天考哪一科,前一天晚上通宵看哪一科,竟然低空飞过及格线一科也没挂,然后生活还十分嘲讽地让我java在这一年的学科中得分最高——但也高不到哪里去。

这期间还涉及到两个课程设计,其中一个是JS的,另一个是VB的。

JS的课程设计基本没什么要求,就是让我们随便用JS写个什么系统,我就从网上随便下载了一个图书管理系统,按照文档进行部署,能够运行,没什么问题,交上去了,然后我就非常倒霉地被老师抽查,让我去她办公室简单说一下自己的这个课程设计是怎么实现的。去了老师办公室以后我才知道,嗯,不是我倒霉,而是老师发现这个班里有个人她一直都没有见过,这学期都结束了,她觉得至少该见上一次才行,因为她说:“你是不是不认识我?我也不认识你。”——当然也不可能只是想见一见,她的表情告诉了我,如果我不能把自己交上来的东西解释清楚,她就要把我这门课给挂了。还好这个老师比较仁慈,她让我同宿舍的室友通知我去找她的时候,说的是第二天去!她给了我一天的准备时间!我十分十分十分认真地看了一遍文档,然后再把核心代码全部熟悉了一遍,充满信心地带着电脑去了办公室。然而生活怎么会轻易放过我这个浑水摸鱼的人呢?明明之前都能顺畅运行的代码,偏偏要在我给老师演示功能的时候出bug!但,是时候表演真正的技术了!我告诉自己不能慌,先把自己精湛的演技亮出来,要表现出对自己的代码十分熟悉的样子,用行云流水般的动作调出自己的代码页,准确定位到报错的那一行,一边嘀咕“这里怎么会出问题呢”一边快速思考到底会是什么原因导致这段代码出现异常。还好这个bug是个非常愚蠢的bug!只是对操作的对象没有判空就直接使用了而已!这个我能看懂!我按捺住要笑出声的冲动,一边露出抱歉的表情说出“哎呀少了个判断,之前在数据库插入测试数据太随意了,多了个空字段”一边把bug修复掉。有惊无险!庆幸这位老师并不是个教条主义的人,虽然对我不来上课这个行为表示不满,但看我似乎也许可能大概是因为本身已经学会了怎么用JS所以才不来上课,她选择接受这种理由,然后让我拿到了这门课的学分。

VB课程设计的要求是以小组为单位随便设计一个什么软件,然后在最后两堂课上对这个软件的功能以及核心代码进行讲解;组员人数上限不得超过6人(那时宿舍人数就是6人),可以自由组队。老师发布课设要求的时候我当然是不在场的。老师留下了充足的时间去做这个软件,我当然也是不知道的。同学们高高兴兴开始组队的时候我当然也是被遗忘了的。直到临近deadline,舍友通知我说:明天的课你来一下,要交课设了。我一脸懵逼:什么课设?设什么?舍友们很贴心地告诉了我课设要求以及组队的事,并且表示已经把我的名字加进了宿舍队伍中。另外舍友们还表示:课设是从网上下的,看不懂,VB和VC看上去就只相差一个字母,你VC不是学的还行吗,明天你早点回来看一下这个代码吧,讲解的任务就交给你了。听到这里,我内心上一秒还沉浸在感动之中,此刻也就只余下一个敏感字了,我TM连VB是什么都不知道!好吧,我也不是个不识好歹的人,舍友们也算是仁至义尽,当我接到这个电话后就立刻赶回了学校,问她们要来了这个VB课设的代码,是个实现记事本功能的简单工程,代码量不大。然后就像往常临时抱佛脚一样,我开始彻夜看代码,熟悉语法,调试程序,并且竟然还要修改bug!还好VB的语法并没有什么复杂的地方,连猜带懵大致上看懂逻辑是没什么困难的,修复简单的bug也是能够做到的。最后终于轮到我上讲台讲解时,生活一如既往让我在演示过程中遇到bug,我也一如既往表面得心应手内心慌乱如狗,最后也一如既往修复bug有惊无险。

我的大三就在如此各种临时抱佛脚外加各种有惊无险再外加每一天的玩物丧志中结束了,然后我迎来了我的大四,所有课程基本已经完结,就只剩做毕设、找实习的任务。

毕设与工作

直到这个时候我才开始思考,我已经是个成年人了,快毕业了,该自己工作赚钱养活自己了,宅在屋里没日没夜打游戏的日子不可以再继续下去了。

那段时间,学校来了很多培训机构的人,辅导员会组织全专业的同学一起听培训机构的自我介绍。培训机构的业务员们个个都把自己吹上天,各种承诺包实习包推荐,包指导完成毕业设计,保证就业,不就业退款。

当时,我听了,信了,心动了。

但是,培训费用拦住了我。

我的想法很简单:三本院校的学费是很贵的,我家是很穷的,九年义务教育早就结束了,父母答应送我来上大学已经算是超额完成为人父母的义务,我不能再问他们要钱了。接下来的人生路,我要靠我自己了。

对培训机构的心动无法付诸行动,我只好踏踏实实开始思考我的毕设应该做什么好,开始思考该去什么样的公司实习。

我似乎从来就没有考虑过将来从事的职业是可以和大学所学的专业不同的,想法也是出奇的简单粗暴:学都学了,学费都交了,不干这一行的话那不就亏大了,不但浪费了时间还浪费了金钱!时间是我自己的,金钱是我父母的,这两样可没一个是可以由着我随便挥霍的!

既然我喜欢VC,又喜欢打游戏,那我毕设就用VC写个游戏吧——我就这么草率的决定了自己的毕设。

紧接着我就根据自己毕设的主题,决定要去游戏公司实习——这个逻辑没毛病。

目标已经如此明确,那就打开浏览器,开始投简历吧。

进入某招聘网,选好坐标,选好行业,勾选全职,输入关键词:“C\C++” “游戏”,回车,全选,投递——我当时的操作就是这么粗暴。

两次面试经历

简历投递后不久我就收到了面试邀约。

愚蠢的我在没有进行任何准备工作的前提下进行了人生中第一次面试。

对方是一个大概只有十几人的小公司,办公区域在一座高层写字楼中,记忆中办公环境的色调是蓝色的,灯光是有些暗淡的,员工们是安静的。

面试官拿来两张薄薄的A4纸对我说:你先做一下面试题吧,我现在手边有点忙,等你做完题了我再来找你。

啊?要做题?不是说好的面试吗?面试也要做题吗?

我感到猝不及防,连笔都没有带,对方却只是匆匆递了两张纸给我以后就回自己工位coding去了。曾经也废寝忘食coding过的我十分了解在这个过程中是不希望被人打扰的,我没敢去问刚刚那人要笔,只能小声对离我不远的一个小姐姐借了只笔。

看完面试题以后,我发现我其实可以不用特意去借笔的,反正全都不会。可是借都借了,好歹在这纸上写点什么吧,于是就开始瞎写了。

我百无聊赖地面对着两张看不懂的纸,等待面试官忙完手里的东西后来找我,期间又有另一个小姐姐从比较靠里的工位中出来,路过靠近门口的我时惊讶地问了句:咦,你是谁?我有些尴尬地回答她说我是来面试的。她“哦”了一声以后就没再管我了。

大概一两个小时以后,面试官终于忙完了,也终于想起我了,面试终于又可以继续了。

他收回那两张纸,看了一眼,然后问我:你觉得你答的怎么样?

我老老实实地回答说:不怎么样。

之后面试官又问了什么我已经记不得了,只记得整个面试对话只持续了大概几分钟而已他就让我走了。

毫无疑问我知道这一次的面试结果是什么,当我看到那两张纸上的题目的时候就已经心知肚明了。

总结经验教训:我得背题!

回去后我立刻在网上找来几份C相关的面试题,踏踏实实背下来。

很快我就迎来了人生中的第二次面试。

这一次的公司是某企业的分公司,动漫游戏产业,和上一家相比应该不算小公司了,不过游戏研发部属于比较新成立的部门,正在进行他们的第一个页游项目。

去之前我看了看我申请的岗位:C++服务器逻辑算法工程师。

虽然我并不知道这个职位具体是干什么的,但听上去好像挺厉害的样子。

果然是见面先扔出一套题,好的,来吧,我准备过了。

但看到题目以后,我知道了,我准备的还是不够充分。

然而我不怕!做题的时候又没人监控我,我可以用手机上网搜答案啊!我可真是个小机灵鬼,上一家的时候我怎么没想到呢!

现在回想起来,面试题上其实只是一些C++的基础概念外加两三个简单的代码题而已,好像还有几个纠错题。代码部分的题我都会,但是基础概念的题我有几个没背下来的,比如“C++的基本特性是什么?”,至今没有背下来,汗。然而当时直接搜了搜,很快完成了,顺利进入了面试环节。

这家公司的办公区域在某园区的一个独栋小别墅,没有专门用来面试的那种小会议室,我被安排在离员工们比较远的一个角落中,那里只有一张桌子,一把椅子,面试官来面试我的时候,由于唯一的那把椅子被我坐着,他就只能站在我面前面试我。很久很久以后我才意识到:当时我是不是应该起身让座来着?

这一次面试聊了很久,具体都聊了些什么我已经忘了,总之过程十分愉快,能感觉到面试官对我还是比较满意的,聊了几十分钟后,他让我去找HR商谈薪资问题。

当时的我对应届毕业生的薪资水平并不是很清楚,我也不知道我自己的能力如何,应该定价多少,再说,我目前连毕业生都不是,我还在大四,还要做毕设,还要毕业答辩,答辩还分一辩、二辩,也许还有三辩,辩完了还要去参加毕业典礼,除此之外不知道整个大四期间学校会不会临时让我们回去干点什么,肯定免不了要各种请假——综合了这所有情况以后,我给自己定价2000:考虑到租房吃饭以及生活的一应开销,这个数字大概是我想象中能让我在北京活下去的最低数了。

对了,忘了提,当时我并不是在找实习单位,而是全职工作的正式单位。那时候我心想反正毕业后也要找工作,为什么现在不直接找嘛?

谈完薪资问题,HR让我回去等通知。

我的内心是乐观的,觉得这次肯定成了,哪哪都聊的挺好的,没有任何觉得对方不满意我的地方。

可是,一天过去了,两天过去了,三天过去了......

直到一周后,我都没有收到通知。

愚蠢的我并没有意识到这是被拒了的意思,竟然打电话问HR:考虑得怎么样了,有结果了吗?

HR答复说:项目组那边最近正在忙ChinaJoy的事,你等通知吧。

我不知道什么是ChinaJoy,但我听出来大概意思是最近有东西在忙所以没精力考虑招聘的事,那我就再等等吧。

又过了一周杳无音讯。

愚蠢的我依然没有意识到这是被拒了的意思,再一次打电话问HR:忙完了吗?考虑有结果了吗?

HR答复:马上国庆放假了,节后等通知吧。

哦,好吧,那等放完假再说好了。

假期结束了,又过了几天,依旧杳无音讯。

愚蠢的我再一次打电话询问:有结果了吗?

HR:项目组那边正在考虑了,一周内会给你答复。

哦,好吧。

那一周,我竟然真的等到了我的入职通知!

我兴奋地在第一时间打电话通知父母:下下个月开始可以不用给我打生活费了,我找到工作了!

第一份工作

2010年11月1日,我开始了自己人生中的第一份工作。

那时的主程是其后7年内唯一带过我的人。

入职第一周,主程带我关注了几个技术大牛,让我多看看他们发的博文。让我看《C++Primer》,让我尝试写自己的博文,让先从学习笔记开始写起。

入职第二周,主程让我开始看sql语句,让我学着写存储过程,让我熟悉各种查询方法语句组合,让我学会使用游标。

入职第三周,主程告诉我:我们一般不用游标。我内心:你TM在逗我?

第三周开始,我就加入到了项目的研发中,暂时负责数据库相关的功能。那时候大部分数据操作相关的功能是通过写存储过程实现的,比如增删好友、背包数据的增删、背包格子的拆分与合并等等,全部都用存储过程实现,把存储过程当做逻辑函数来用,C++那边就只是负责接收客户端上传的指令,然后调用相应的存储过程,将用户ID和其他参数传进去。

这周给我分配的任务就是写几个存储过程,实现好友申请、加好友、删好友,实现背包相关功能:获得道具、删除道具、背包整理、背包扩充、可叠加物品的拆分与合并,还有两个其他模块的功能我已经记不起来了。

第四周,主程让我实现一下数据库的IP访问限制。

我在这一周的行为让我充分认识到:让一个对数据库到底有多重要的人去倒腾数据库是一件多么恐怖的事情!

大部分时候,我写的东西都是在本地数据库进行操作,自测到基本没有硬伤以后再同步到研发部门中大家公用的一套环境内。这个IP访问限制呢,也是先自测,然后觉得没问题了,再让主程来检查一下,确定没问题了,于是将代码同步到公共环境。

于是问题就发生了,我写的这个IP访问限制呢,是通过登录触发器来实现的,需要有一张IP表,访问者的IP只有在这张表中存在时才允许连接数据库。

在同步代码的过程中呢,我先把登录触发器同步上去了,结果呢...呵呵,因为这个时候数据库中根本还没创建这张IP表,触发器却生效了,它拒绝了所有登录请求,于是所有人都无法连接sqlserver了!所有人都包括哪些人呢?除了我们自己项目组内的服务器连不上数据库了,运营那边的后台也连不上服务器了,除了美术以外,所有人都无法正常工作了!

我完全不知道该怎么解决这个问题,主程默默地帮我搜索解决方案,终于在几十分钟以后找到了解决办法:找到一台在登录触发器生效以前就已经连接上了sqlserver的电脑,drop这个触发器。然而,我在大部分同事都还没到公司之前就同步了我的代码....最后我们是在一个昨天回家忘记关电脑并且正好还连着数据库的同事那里,把这个万恶的触发器给删了。

此后再也没有让这个触发器生效过。

没有人把这次事件当作一个太大的问题,我也没有受到相应的指责,但这件事在我心中已经刻下了不可磨灭的烙印......

第五周及以后开始慢慢加入到C++服务器端的功能开发中,与此同时,我的毕业设计进度也在有条不紊地向前推进。

毕设最后决定是做一个模拟养成类的游戏,通过去不同的场景触发不同的随机事件,增减人物对应的不同属性值,具体就不赘述了,很无脑的养成游戏。整个毕业论文就类似个游戏策划案,我详细地描述了这个游戏中每个系统每个数值,写完后竟然长达七十多页,第一次答辩前上交后被老师打了回来,说我论文太长了,给删减些...忍痛删掉了一半左右的内容后才合格。

魔兽世界也是在工作一个月左右后戒了,因为完全没有时间再进行公会活动。

这期间我还自己写了个记账软件,帮助自己整理自己的开销。后来这个软件让我用了竟然有两年多。

在工作方面也是很快融入到了研发的进度中,也提前给我转了正,还加薪了500,大概是觉得我2000块钱可能活不下去吧。

顺利毕业后薪资又涨了2K,大约就与市场价齐平了的样子,对于这时候的我来说,应该仅止于完成了从学生到职员的蜕变,明白了实际项目中应该各部门是如何分工合作,明白前后端该如何配合联调。至于职业技能,大概也就只是更加熟练使用某几个编译工具而已。

慢慢地,我也开始能够独立负责某个模块的后端开发,能够对某些功能提出自己的看法,能够对前后端存在的一些问题提出协调建议,能够勉强对已存在的代码流程进行某些程度上的优化。就这样,在入职一年左右后,不知是总监高估了我的能力,还是我自己低估了我的能力,他们把后端的主程,辞退了...辞退了...退了...了...更加恐怖的是,不知道公司抽了什么疯,把所有程序员的机箱锁了,网断了!

这时项目组后端的开发人员,就只剩下我和一个两个月前刚招来的新人,虽然当时的我对后端所有的代码已经十分熟悉,但毕竟仅止于会进行逻辑开发而已,对后端的安全、稳定、部署等还一窍不通。不仅如此,当时项目还面临一个很严重的问题:多个客户端的数据无法完全同步。这个游戏是一个横版过关类的游戏,玩家可以组队进入同一关卡,而直到现在,进入同一关卡的玩家都无法进行画面同步。

为了解决这一问题,公司竟然只是招进来一位制作人...另外也就这个问题向公司的其他分公司提出请求技术支援。

技术支援提出了解决方案:将目前关卡内所有依赖于前端的运算全部移到后端,然后再以一定频率向前端发出同步指令。

为了确保后端能够准确计算物理碰撞,他们让我制作一个简易的demo,实现对多个移动中的物体进行碰撞检测。

孤立无援,不能上网,我只能闭门造车,花了好几天时间,凭想象做出了这么一个demo,勉强达标后就开始了这一次的大改。

遇到问题无人可问,也不能上网搜索答案,一切都只能靠自己绞尽脑汁地想,而新来的制作人也是一而再再而三地推翻原有系统功能,无休无止地加班也不能让项目完成度增加哪怕1%,这样的工作状态坚持了几个月以后,我觉得我也许是时候考虑跳槽了。

在某个周末的午后,去了搜狐畅游面试,笔试与技术面试并没有遇到什么问题,最后HR面时,对我提出的期望薪资不甚满意。我提出的期望薪资并没有眼高手低,只有4.5K,与当时拿到手的薪资一模一样,甚至可以说是我一年前的薪资水平。我并不是因为想要更高的薪酬而跳槽,只是想换一个也许能够让自己更好向前发展的环境而已。然而HR就是死活也不愿意给到那个薪酬,这次面试不欢而散。

再不久后,我生病了,肺炎,肺部阴影面积达到了3/4,做了大量肺结核、肺癌的排除检测,医生建议住院观察。而我拒绝住院,于是接下来的十天就是每天往返医院吊瓶4小时。吊瓶第三天,我向医生反馈,拉肚子、起疹子,是不是药水过了敏。医生看了看,觉得可能是有些轻微的过敏反应,于是帮我换了一种药性并不那么强的药。十天后,病情并未好转,医生对我说:如果可以的话,建议回家乡修养,北京的空气不利于你的病情。

于是我真的就辞职回了老家,第一份工作就在2012年4月底告终。

第二份工作

第二份工作我甚至觉得也许根本就没有必要提及,因为维持了1个月,在试用期都还没有结束的时候我就自己辞职了。

回了老家,把病养好了以后,实在闲的有些焦躁,于是顺手就在老家投了几份简历出去,收到了两份面试。

第一份面试依旧是个游戏公司,也是哪哪都挺好的,就是对我提出的4.5k薪资不满意,不欢而散,而第二份面试则十分顺畅,并且还开出了试用期4.5k、试用结束后薪资再谈的条件。我本身比较懒得到处面试,第二家谈妥了我就进去了,即使这不是一家游戏公司我也不介意——我觉得我也未必非得做游戏,只不过是毕业后第一份工作是做游戏而已,没必要以后也只做这一行。

这是一家搞教育软件及网站的公司,研发团队大约二十人左右,我进去的时候正当他们项目忙得一点理我的空闲都没有,把项目打开告诉我这是我们的项目以后,就再也没有跟我说过任何东西了,也没有让我做任何功能,并且也没有对我提出任何要求。我每天上班就只是玩玩手机打打瞌睡......这样的日子我实在受不了,只好在一个月后辞职了。

第三份工作

在那次维持一个月的工作以后,我又懒了3个月左右,觉得自己实在是不能再这样了,积蓄也都花光了,再不工作赚钱就只能当个啃老族了,于是又回了北京,联系了之前公司的前端同事,问他现在在哪里高就。

他告诉我说以前公司几个人出来创业了,问我感不感兴趣加入。

2012年10月,我加入了这个创业团队。

这个团队,加上我也就只有6人,前端1人,美术1人,策划1人,运营1人,总监1人,后端——我,1人。依旧是个页游项目,后端依旧是由C++开发。

后端的框架他们是找其他人拿的,总监本身是技术出身,在我去以前,他们后端的功能是由他在处理。我去了以后,他告诉我说如果代码上看到有什么觉得不好的地方就改掉。

得了这个允许,在熟悉完代码以后,我把我认为结构上看起来比较乱的代码全部都整理了一遍,框架上也是把自己认为用着不顺的地方都改掉了,整个工程改到让自己写起来顺手为止。

这个项目一直持续到第二年年中,因为无法拉到投资,项目无疾而终。13年6月,boss说:我们做手游吧。

然后他让我去看一看cocos2d,让我做个小demo出来试试。

我花了一周左右的时间来熟悉这个引擎,熟悉大部分控件的使用,并改变自己从后端到前端的思维模式。再花了一周左右时间尝试写了几个UI,学会Sprite处理,加入动画的显示,然后进行打包,上真机。

一套流程走通以后,boss就开始让我整理一个前端的简单框架出来,让后续人员能够快速加入到开发中来,其他人开始研究该做个什么样的项目。

好吧,人生中第一次,需要我自己先把项目搭起来,然后再让其他人加入到开发中。如果我不能好好地把结构整理清楚,那么后期修改起来将会是一件多么恐怖的事情。这一次对我提出的需求,简直等同于赶鸭子上架。

按照以往写服务器的经验,以及脑海中对框架的理解,我大致把架构区分成了四大块:网络层、数据层、逻辑层、显示层。然后再细分,网络层可以留出接口后先不作设计,因为短时间内还不做网络通信。数据层又可以分成用户数据与配置数据,逻辑层又可以分成功能系统逻辑和游戏逻辑, 显示层又可以分为游戏场景界面和UI界面。

大致区分好了这几大模块以后,就可以开始思考并实现这几个模块间的数据通信。数据通信解决了以后再写出一个简单的UI框架,面板开关的统一管理类,面板的基类以及一些常用函数、特效处理的工具类。整个过程中我只有一个目标,就是让各个功能模块之间尽量独立不耦合,大模块必须要有自己的总控类来提供对外的输入与输出接口,数据的流向必须简单清晰。

等我把这些东西都弄完,已经过了一周多的时间,当然写出来的东西也不可能完全到达自己的预期,但对于当时的我来说,能够大致把框架搭起来已经是费了九牛二虎之力。

之后项目定好了,简单教了教之前负责前端的同事C++的一些注意事项(他没有写过C)后,我的第一个手游项目就这么开启了。整个开发过程中,我不断对最初的框架进行修改、整理,每隔一段时间就会检查一遍所有代码,看看是否有可以提取出来的公用方法,是否有多个功能相近的类可以浓缩出一个基类,以避免大量的重复代码。

这里不得不说,也许我真的有那么一点点完美主义,只要是看到自己写出来的代码有愚蠢的地方,就一定会去修改,对自己制定好的流程,只要是觉得用起来麻烦,就一定要改到让自己觉得舒服为止。而这个习惯一旦养成,很容易就会造成延误项目进度。为了能满足自己修改的欲望同时还不耽误项目进度,我的选择是:加班,用自己额外的时间去做对项目来说也许并不必要但是自己又想做的修改。

等到项目的后期,又开始了优化任务,对内存的优化与管理又是耗费了不少时间。还有那万恶的自适应问题,由于当时我们没用任何一个UI编辑器,所有界面都是手写拼凑,这导致想要实现自适应是何等的困难。整个UI框架我又返工了几次,终于能够在基类源头处实现自适应处理。

最后,这个项目依旧是在找不到买家的情况下,一命呜呼了。

职场的勾心斗角

这个创业小团队为什么在经历了两个失败的项目、前前后后一年多时间了,还不解散?我也不知道,可能多多少少还是有人投资了吧,或者两个老大的积蓄还没有烧光,总之我没问,也不关心。

这期间,他们是会给我工资的,5k,全年无休。全年无休就是字面上的意思,一周工作7天。除了过年回个家,生病请个假,其他时间全在工作。期间我并不觉得工资低,也并不觉得工作累,感觉几个熟悉的人聚在一起为同一件事情努力还挺有意思的,工作中遇到了问题,满世界找解决方案,到最后勉强解决以后,这个过程也挺开心的。

这份愉悦一直持续到他们招进来一位主程。

那时我们接到了一个某大型端游的移动版开发的项目,团队中补充了几个人员,他们还通知我说,已经联系上了一位有过上线的成功项目经验的主程,几个月后就会加入进来。

当时我的心情是很高兴的,因为终于可以和有经验的专业人士一起工作了,我闭门造车的日子终于可以结束了。

就在项目第一版制作完成以后,那个主程来了。

他来了以后第一件事就是说:这个框架不行,我要改框架。

好吧,这个框架本来也是我这个没有前端经验的人搭出来的,你有经验,你说不行那估计就是不行了,我们等你改。

他这一改就是一个半月,期间boss委婉地问过他为什么改了这么久,他的回答是:这些代码太乱了,不好改,我在重写。

等他终于改完提交,我看了看——好家伙,核心部分他基本上就没有动,但是为了体现他修改的文件够多,他把很多函数名改了!

这时候我还没有意识到这个人想做什么。

几个月下来,每次分配任务,他都会给我分配那种需要三天左右时间才能做完的功能,然后在第二天的时候问我进度如何,问完以后就会表示我做的太慢了,让我别做了,他来做。这种功能基本上我都是第二天做到大致完成,然后第三天开始自测!他竟然在这个时候把我写的东西接手过去是想怎样?另外,当策划提出一个新的需求以后,我说出我的意见和建议,不论正确与否,他都会驳斥,把我的意见说得一文不值。最后我也只能妥协:你有成功项目经验,也许你说的是对的,那我听你的。最后果不其然,他在汇报工作的时候,关于我的工作情况就是大部分分配下来的工作无法独立完成,所有东西都是他在帮我善后,并且还说我工作态度不积极。

我无法独立完成工作?我需要他善后?我工作态度不积极?我真是一肚子脏话都想往他脸上泼。每天上班我在辛辛苦苦写代码的时候那货就只是在看视频打游戏,等我们其他人当天工作差不多完成了回家了,他就开始假装加班写代码。boss因为他上报的我的工作态度问题还专门找我谈话,我反应了这个现象以后boss竟然还不信,当成是我和他在搞什么职场的勾心斗角争权夺位!

后来某位同事告诉我说,我这是被勾心斗角了,因为他来这里之前,程序组基本上是我在牵头干活,大部分事情都是由我主导,他来以后,为了确定自己主程的地位,必须把我搞下去。

我这才恍然大悟,原本还以为程序员的心思都很单纯,就只是写写代码而已,原来也还是存在这种弯弯绕绕的事情的。最后我终于忍无可忍,向boss提出希望把我和那个主程分开到两个项目组的需求,不然我也没办法在这里继续工作下去了。

boss答应了我的要求,让我独自开发一个模拟经营类的小游戏。

这个“独自开发”到底有多独呢?没有策划,没有数值,只分配给我半个美工,外加一个参考的游戏。当我写好美术的需求文档,很久才能拿到相应的资源。在这个项目的过程中,我学会了自己用photoshop改图,学会了自己从网上找音乐资源,学会了自己制作图字文件,学会了自己去扒一个游戏的数值。整个项目进行过程中,我想怎么样就怎么样,无人问津。

大约三四个月后,我把大致完成的项目交给了他们,然后我辞职了。

从2012年10月到2015年6月,将近3年的创业团队经验到此结束。

第四份工作

离开了创业团队,也离开了北京,由于自身的懒惰,我把简历委托给了一位猎头,猎头帮我联系了几个上海的公司,在休息了半个多月以后,我再一次进入了面试环节。

这一次的面试不再做题了,直接先是技术面,然后项目总监面,然后HR面。一切都很顺利,让我回去等通知。

在仅有的几次面试经历中,从来没有老老实实等过通知的我,这一次也不例外根本就不愿老老实实等通知,不给我个结果我就拒绝猎头提议的去面下一家。猎头也是拿我没办法,三番两次帮我向那个公司询问是否可以入职。

历时十天左右,2015年7月,我入职了。

所在项目组正在制作单机小游戏,我开始接触到脚本语言,在经过短暂的一周多时间练手以后,我被分配到独立制作一个休闲类的填色小游戏。从着手,到打包,到上线,大约用时1个多月。悲哀地说一句:这就是我工作了5年后第一个见到了用户的项目。

之后就与项目组内其他成员合作开始了一个模拟建设类的小游戏开发。这个项目开发过程大约持续了一年。期间我依旧改不了自己的老习惯,对自己已经搭好的框架、写好的代码总是隔一段时间就返工一次,对于美术交到我手上来的特效,如果觉得不好看也是要自己调一调,看上去我总是很忙,总是有做不完的工作一样,总是加班到深夜。印象最深刻的一次是,我竟然为了一个飞机起飞与降落的效果,调了一个 通宵。整个开发过程中,我也会为自己、为策划制作一些能够代替重复工作的批处理小工具,把自己认为可以自动化的工作都自动化处理掉。所有这些都被我定义成“为了自我满足而进行的额外事项”,我不愿让它们耽误到项目的正常开发进度,所以全都利用加班时间去完成。

再之后,公司内仅有的两个手游研发团队合并,时隔六年,我上头终于有了一个正经的能对我在项目开发中各方面进行指导的老大,这是让我觉得最开心的一件事。

不知道为什么,公司把所有后端都辞退了,新的项目也是先前进行到了一半的一个端游移植项目。程序组一共有六人,老大环顾一周后,把后端的工作分配给了我。

老大对我说:服务器的功能已经做的差不多了,你去收个尾,有不会的不懂的地方就问我。

我接受了,然后就开始写曾经信誓旦旦说这辈子都不会去碰的java。

然后我打开项目,然后我看了看代码。

什么分布式、什么主库从库、什么RPC调用,什么什么,我是谁,我在哪?

过两天,老大过来问我看得怎么样,有没有什么问题。

我回答说:我连我该问什么样的问题都不知道。

后来总算慢慢能写了,会改了,把后端功能收尾了,加入到了他们前端的开发中去。

熟悉完前端的代码以后,老大就开始和我讨论该怎么把已有的技能系统改掉,改完技能系统以后又讨论该怎么优化这个事件通知系统,接着又是怎么把整个一套UI换一个编辑器、能不能换、要换多久之类的。总之轮到我加入到前端以后做了好几次伤筋动骨的大改动,还有几次是实验性质地修改,改完以后发现效果并不理想又改回来。很多时候我就是拿着一个小本本坐到老大身边,开始讨论各种修改方案,讨论出一套方案以后就去实践看效果,效果理想就采用,效果不理想就舍弃。整个过程虽然很累,但我做的却很开心,不仅因为可以在上班时间堂而皇之地进行代码的优化,也因为终于有人能够在我提出想法以后及时反馈我这想法好还是不好、对还是不对,不用再翻找各种网页、写各种测试代码来验证自己的想法到底怎样。

此后我也开始越来越依赖于有这样一个人的存在,我有什么不懂的、不会的、疑惑的都会去问他,虽然依旧加班不断,但却觉得工作比以前轻松了很多很多。

直到现在,我依旧在这个老大手下干活,已经两年了,也已经越来越习惯遇到怎么改也改不好的bug的时候哭着喊着让老大来帮我看看,有时候我会反思:总是依赖别人,会不会影响自己独立思考以及解决问题的能力?不过也就这么想想而已,我并没有为这个想法付出过什么行动。我依旧保持着一如既往的习惯,看到不顺眼的、觉得写的愚蠢的代码,一定会想办法抽出时间来改掉,不改掉的话就浑身难受。

来到上海工作这四年以来,老板问过我两次问题,一次是问我对职业有什么规划。我老老实实回答说没有规划。另一次是问我对工作有什么想法,我仔细想了想回答说希望工作中能学到新的东西。老板听到我这样的回答好像有些不高兴,追问:你们总说想学新东西,是想学些什么?我回答说:想学的新东西不是指什么高精尖的技术,只是会想学一些以前没做过的东西,比如一直做前端,突然做做后端就会觉得很开心学到了新的东西。

老大也问过我对以后有什么想法,我老老实实回答说,没什么想法,只要能让我写代码我可能就会一直写下去。他追问我有没有想过要干点别的东西。我回答说:别的我也什么都不会啊,大部分职业都太复杂了,还是写代码简单。老大点头表示同感。

尾声

就这样迷迷糊糊的,我已经在程序员这一行当干了九年了,除了工作需求的东西以外,我从来不会主动去学习任何东西,光是应对工作中的项目各种修修改改就已经耗费了我所有的时间,偶尔空闲的时候,也被我心血来潮写些辅助的小工具给花掉了。九年的时间内,我并没有掌握什么核心的技术,也并没有成为一个在项目中无法取代的人,我只是在凭着自己的兴趣和爱好在工作着,也许过不了多久,我将会被淘汰,然后另谋生路。

不过,明天的困扰就留给明天的我去思考吧,活在当下也是我众多人生信条之一。

不知道多年以后也许正穷困潦倒的我看到自己现在这样的态度,会不会想抽自己一个大耳刮子,哈哈哈哈!!!

(果然写了很长)

一个大概是被称作为“废物”的程序员的回顾,从18岁到30岁相关推荐

  1. 面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

    程序猿学社的GitHub,欢迎Star github技术专题 本文已记录到github 文章目录 前言 面试细节 小细节 为什么总有求职者面试却不带简历? 1.了解最新的新技术 2.深入底层源码学习 ...

  2. 某大厂女程序员哀叹:还不到三十岁,父母竟让自己和一个离异有娃的男人相亲!

    女孩子多大算大龄剩女?大龄剩女在相亲市场上就只能找离异男人吗? 一个美团程序猿小姐姐自称是"大龄女程序员",还发帖吐槽:快30岁了,昨天给家里打电话,父母非要自己和一个在大连离过婚 ...

  3. 面试了一个 37 岁程序员,让我有所触动,35岁以上的程序员该何去何从?

    文章目录 前言 面试细节 小细节 为什么总有求职者面试却不带简历? 1.了解最新的新技术 2.深入底层源码学习 3.保持一颗谦虚的心,须知人外有人 4.形成适合自己的学习方法 5.想好以后的方向 6. ...

  4. 一个优秀的Java高级程序员应该读过哪些书(30本优秀书籍推荐)

    书单 文末有博主收集的电子书籍资料,需要的话可以直接移至文末 马士兵「多线程与高并发」 <Java核心技术 卷I> 一直以来,这本书都被认为是面向Java程序员的经典教程和参考书,内容翔实 ...

  5. 如何用python做一个会聊天的女朋友_戏精程序员,用python开发了一个女朋友,天天秀恩爱...

    很多人都知道,程序员大部分都是单身狗,然而,无奈Python实在太强大,居然可以用来开发一个女朋友出来. 其实,这个女朋友类似很多视频中,那些假装自己有女朋友或男朋友的人一样,也是在假装哦,但是程序员 ...

  6. 2019年一个程序员的回顾与成长计划

    19年 我要搞什么 POSTman学习 vue 与weex学习 php 和html 学会使用ajax请求和curl 网站备案 找个对象,并非面向对象的对象..而是一个托付终生的存在. 学习驾照 人难能 ...

  7. 我,一个生物学硕士,是怎么转行成为程序员,进入互联网大厂的

    这回,考虑到近期关注了许多新朋友,并且大多都是学生党,可能对我还不是特别熟悉.因此我决定重新把我从非科班如何通过自学(狗屎运)进入大厂的经历分享出来,希望能够给予一些将要面临秋招,或者将要准备进入互联 ...

  8. 借一个同事的经历,谈一谈程序员的成长

    一个很久之前的同事,今天找我,想让我帮他推荐下,去我们公司来工作,因为认识很久,就和他说了说公司的现状,也询问了一下他的状况,寒暄几句,让他下周等面试. 这位同事是之前一起做游戏时候写as3的,现在想 ...

  9. 一个一年工作经验的菜鸡程序员的一年总结

    坎坷并且顺利的一年 前言 一.为什么会干这一行? 二.入职 1.被大佬照顾的小白 2.被浪潮拍死的弄潮儿 3.重新出世的大菜鸡 回顾以前展望未来 前言 刚开始准备投入这个行业是2020年8月的时候,当 ...

最新文章

  1. CV算法复现(分类算法2/6):AlexNet(2012年 Hinton组)
  2. Verilog设计实例(7)基于Verilog的数字电子钟设计
  3. Thymeleaf3语法详解
  4. struct和typedef struct在C与C++中用法
  5. python之新式类与经典类
  6. 3个检测浏览器User-Agent信息的网站
  7. JavaScript 、if else语句判断 、jQurey表单事件
  8. 茅侃侃,80后技术人与你同在 | 一周业界事
  9. Matlab imcrop函数功能小结(20190123)
  10. PrepareStatement对象(新增、删除、更新、查询、防止SQL注入)
  11. java rector_Java IO的Reactor模式
  12. 关于自增自减的理解2(例子)
  13. oracle 方案概念
  14. 2019电子设计大赛:纸张计数显示装置
  15. 维基百科英文语料库下载地址
  16. 最优化理论与算法(袁亚湘)学习笔记---最优性条件和最优化算法的基本结构
  17. 小觅相机运行ORB-SLAM3
  18. php面向对象编程的特性,什么是面向对象编程(OOP)?面向对象编程的特点
  19. laravel-集合对象的销毁forget,重组values(),pluck ()方法
  20. 树的直径,树的中心,树的重心

热门文章

  1. 解决Chrome不支持NPAPI插件的方法(贴吧旺旺等)
  2. 【BZOJ3875】【Ahoi2014】骑士游戏 SPFA处理有后效性动规
  3. HTML基础(六)---列表和表单标签
  4. Spring环绕通知
  5. 王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数
  6. 英语不好,能不能学会编程?
  7. Debian系统更新apt源
  8. BI在连锁零售业应用
  9. androidnbsp;强大的adbnbsp;测试工具
  10. 互联网创业已死(搜应用网观察)