Good Bye 2016

时间真快,又一年过去了,2016年对于我来说是比较重要的一年,因为我今年毕业了,从此走上了社会。今年总的来说是一个很困惑并且体验比较糟糕的一年

今年都做了些什么

由于去年在爱数实习的时候,发现使用的技术(COM组件)和做的东西并不是我喜欢的,因此提前结束了实习回学校去了。在学校有一天突然LAC(校招的时候有聊过,当时去了爱数就没去他们公司)问我实习状况如何了,我说我不喜欢这个职位所以辞了,然后他说做开发太浪费我的算法优势了,因此又问我是否愿意去他们公司实习,职位是算法工程师,我考虑了一下,觉得做10086.cn商城的算法推荐挺不错,并且移动用户多,数据量应该挺大的(事实并不是这样。。。),并且对推荐算法也挺感兴趣,因为使用的豆瓣FM和网易云音乐的个性化推荐都有带给我惊喜(亚马逊的商品推荐也让我感觉不错,有几本书就是个性化推荐才买的),之前也看过一点协同过滤算法,给的转正薪水也还可以。当然不想去参加春招也是一个原因。因此就答应过完年就去实习。

二月底的时候去了北京,在吴大神那住了几天,然后在草房找了个房子,三月一号正式开始了我的实习,来了之后发现所谓的算法组其实就是我和另外一个研究生妹子(叫CF,本科和研究生都是数学专业)两个人,而且没有给我安排导师,LAC只是简单的要我去学学Hadoop,就没说其他的了,然后我就开始研究这个,先是把在虚拟机把Hadoop环境搭建了,然后就开始研究怎么写MapReduce代码,由于需要用Java编写,而我之前一直用C++,因此顺便还快速学了下Java以及Maven。然后LAC对我并没有多问,我也就每天学习下Hadoop,买了一本《Hadoop权威指南》,边看边写demo,就这样过了一个月。我就开始研究公司的日志分析模块的的MapReduce代码。因为没什么任务,所以每天都是准时上下班,下班回到家之后吃法洗完澡之后就刷高数,为什么我刷高数呢?因为我了解到算法工程师需要懂机器学习,这个对数学要求比较高,而我呢。。期末考试完数学就还给老师了,因此只好重新开始刷数学,买了《托马斯微积分》《概率导论》《线性代数及其应用》三本书。每天吃饭都是和几个实习生一起,其中也包括CF,有一天在吃饭的时候我询问她移动商城每天的数据量是多少,她说她统计了下前几个月的数据,商城每天平均的订单量是300左右。。。上算法的模型的效果非常不理想,不如人工推荐。听到此话我内心是崩溃的,想不到数据量如此之小,根本就没达到数据过载到需要使用推荐系统的地步。

让我意想不到(其实也是情理之中)的是,CF在一个星期之后就离职了,也就是宣告算法组GG了,搞得我也是很迷茫,不知道该咋办了。这个时候刚好我们组从深圳总公司转移了一个车联网项目过来,其中数据节点的服务端是用C++写的,整个公司都是使用Java开发,LAC知道我会C++,所以问我是否愿意接手这个模块,我说我试试。LAC只给了我一份源码,没有任何文档,我根据makefile文件安装了一堆第三方库,折腾了老一阵,还是编译不过去。。还有依赖是自己公司的库的,我就和LAC说了下缺少哪些库,他并没有给我回应,所以我就只好去研究代码。大概过了两个星期就四月底了,我就请了一个半月假回去准备毕业设计了。

在学校准备毕业设计的一个半月,日子还是过得非常舒服,每天和撸友们开开黑,吹吹逼,写点论文。论文答辩很轻松,我的论文是关于字符串数据结构和算法的,也就是介绍了一堆字符处理相关的数据结构和算法,答辩的老师也不是很了解,所以随便问几个问题就过了。答辩完就真的毕业了,这也是最后的欢乐时光了,每天都是大吃大喝,通宵开黑,连续通宵开黑天数应该不少于5天!这样的日子大概过了十多天,大部分同学都离开学校开始上班了,而我的请假时间也快到了,可是我真的不想离开学校,所以又多请了几天假,可是最终还是要离开,在端午节前一天略带伤感的离开学校回家过端午节了。

在家过完端午节就回北京上班了,我又和LAC说了一遍项目编译不了,缺少公司自己的库,他终于给联系总公司的人,把缺少的东西给我了,我才把项目运行起来,其实把项目转移过来的时候,公测环境是有完整的项目运行环境的,可是一直没人告诉我。。。项目跑起来之后,看源码理解项目就轻松了,项目使用了C/C++和Linux系统的API,由于我以前看过《Unix环境高级编程》和《Unix网络编程》,所以看起来不是很困难,遇到不懂的就查查《APUE》和《UNP》。我们小组叫终端数据小组,一共三个人,我以及另外一个实习生(XS)加上一个高级工程师(也是小组长,叫wzy,初次和我交谈的时候问我懂哪些技能,我说我擅长算法和数据结构,大学期间一直参加ACM竞赛,然后他说这个算法数据结构太简单了,学学就会了,你比XS差远了。听到这句话我真是一脸懵逼。。。知乎上的一个答案 中的一句话很好的表达了我的感受:同样三年时间,你学三年剑法就可以当街杀人,我练三年内功啥也不是,但是,假如再给三年时间,我们再练三年,结果说不定就完全不一样了),由于他们不懂C++,因此我遇到问题就只能自己解决。开发需求一直没确定下来,期间wzy要我做了一些小尝试,加了一些代码,不过最终都没用上。最终的方案很简单,把所有协议解析一遍,然后放入kafka就可以了,我只花了大概一天时间就把代码写完了,然后用Java写的模拟客户端测试了一下,之后就是等待联调和上线了。这个时间是在九月份初,正式上线是在十一月初,在这两个月我都很闲,因为没什么任务,所以我就自己学东西。

由于刚开始实习的时候接触了下机器学习,而且三月份AlphaGo打败了李世石,这让我更加兴奋,惊叹于机器学习是如此的强大,因此更加下定了学习机器学习的决心。我的空闲时间我都用来了学习数学和机器学习算法,我把《托马斯微积分》大致看了一遍,然后把整本《概率导论》看完了并且把大部分习题做了一遍,然后就是开始正式学习机器学习了,看了很多网上的入门推荐,最终选择了周志华的《机器学习》和李航的《统计学习方法》还有《机器学习实战》这三本书,对于每一个算法,先看下《机器学习》和《统计学习方法》,然后再看一下《机器学习实战》的代码实现,自己也写一遍,跑跑数据,学KNN的时候还自己写了个KD树优化版本的,这是我第一次用到数据结构!每学一个机器学习算法,都让我异常兴奋和开心,有点当初做ACM题Accepted时候的那种感觉,机器学习算法真的很美妙很神奇,让我大开眼界。当然很快我就遇到瓶颈了,在学SVM的时候,几天时间都没能弄懂拉格朗日乘子和KKT条件,这让我认识到最优化是个很难的东西,对数学能力要求比较高,以我的水平并不足已掌握好,如果想通过机器学习找到算法工作,可能还需要再读一下研究生,因此我放弃了找算法职位的想法。我觉得算法职位更适合数学专业的学生,CS还是好好搞开发把。。。当然业余时间学学机器学习,自娱自乐也是不错的,调调库,搞点数据跑着玩玩,看到结果的时候还是蛮爽的,如果要深入研究那就比较困难了。至此我就暂停了机器学习的学习,转而开始学习开发相关的技术。

在项目上线之后,小组长和我说,由于大家都不懂C++,不好进行后续的改造和开发,下个版本打算把项目用Java重写,因为团队主力语言就是Java,这样可维护性更高,如果我愿意,可以让我来写,让我考虑下。当初选择用C++开发其中肯定有一定的道理,应该是考虑到后续用户的增长对其性能的要求比较高,因此采用了C++开发,现在又用Java重写,我是觉得没必要,虽然小组长说的也有一定道理,所以我不打算接手。由于项目上线完之后我就没具体事了,所以LAC又给我安排了搜索业务相关的一些任务给我,让我先看下源码,了解下整体的流程。我就去看了下相关的代码,基本上和之前的搜索日志分析类似,也就是提取搜索词,相关词,提示词等等一些数据,根据事先定义好的规则和公式,计算好指标,生成数据插入更新至数据库。这并不是我感兴趣的方向,对后端开发更加感兴趣,能接触到很多东西,挑战性更大。

在纠结于方向的时候我意识到是否该考虑离职了,从年初到现在在这家公司并没有太多的成长,已经有点厌倦了每晚回家一无所成的感觉。公司并不是技术导向型的,自己的基础库和框架等都没有,因此也没有太多的东西可学习,都是业务代码。对于应届生新人也没有相关的技术指导,连Mentor都没有安排,等等诸多问题,我就不一一例举了。都说刚毕业的第一年是成长最快的时候,可是我发现我并没有太多的成长,甚至有些倒退,代码能力都变弱了,慢慢碌碌的,可是一无所获,唯一的收获大概就是学到了一些机器学习算法吧。对于工作方面也有新的看法,薪水对于新人来说并不是第一位,技术上的快速成长才是首位。当我在工作上很快乐的时候,我并不需要开一辆保时捷,因为那并不是生活的重要组成部分。做自己喜欢的工作则是我生活的一个重大组成部分。在这段时间恰好听到了Pink Floyed的这首《Time》,对我的触动很大,让我坚定了辞职的想法。

Ticking away the moments that make up a dull day
为了打发无聊的一天
You fritter and waste the hours in an off hand way
随意地浪费那么多时间
Kicking around on a piece of ground in your home town
漫无目的地在家乡闲逛
Waiting for someone or something to show you the way
空等别人来告诉你路在何方

Tired of lying in the sunshine staying home to watch the rain
厌倦了躺在太阳底下,厌倦了躲在家中看雨
You are young and life is long and there is time to kill today
你还年轻,生活的路还很长,今天又无所事事了
And then one day you find ten years have got behind you
突然有一天,你发现十年已经过去
No one told you when to run, you missed the starting gun
没人告诉你应该何时起跑,你早已错过了发令枪

And you run and you run to catch up with the sun, but it’s sinking
所以你跑啊跑,想追上太阳,可惜它已经开始下落
And racing around to come up behind you again
它在和你赛跑,从你后面又升了起来
The sun is the same in the relative way, but you’re older
太阳还是一样朝着原来的方向,但你却已经变老
Shorter of breath and one day closer to death
呼吸急促了,离死亡又近了一天

Every year is getting shorter, never seem to find the time
年复一年,变得越来越短,总觉得找不到时间了
Plans that either come to naught or half a page of scribbled lines
计划最后总是要变成零,或是变成那草草的半页纸
Hanging on in quiet desperation is the English way
像一个英国人一样,悬于安静的绝望中
The time is gone the song is over, thought I’d something more to say
时光流逝了,歌声也结束了,但总觉得自己还有话想说…

我可不想悬于安静的绝望中。离职手续很快就搞定了,在11月15号正式离职,离开公司的那一刻感觉异常的轻松。我是离职完才告诉爸妈的,爸爸认为我很冲动,可是我觉得冲动并不是魔鬼,麻木才是。因此我并不认为有什么不当之处。

离职之后我没有投简历,因为我认为我还没准备好。因此一直潜心学习和准备,每天写写代码,看看书,日子就飞快的到了现在。期间重新把《APUE》和《UNP》一些部分看了一遍,第一次看的时候其实看得挺懵逼,很多概念都没看懂,因此这次又看了一遍,感觉收获挺大的,经典的书真的值得反复品味,每一次都能带给你新的思考和看法,有时间还要再看一遍。期间自己写了一个半同步半异步的线程池,以及一个Epoll加非阻塞IO实现的echo服务器,代码都挺短,不到300行。写这两个东西还不太满足,想写个稍微大点的东西,因此决定写个Web Server,看了一小部分《Http权威指南》就开始写了,坑还没填完,写到一部分的时候突然发现接口的设计很烂,有点乱,深感功力不够,因此暂停了编写,转而去看《C语言接口与实现--创建可重用软件的技术》,这本书所涉及的二十四个接口的实现非常漂亮,看得特别的爽。其实我觉得我根本不懂C++,因为我写的代码都是C风格的,然后加上点STL,公司的项目也是这种情况。。。为了下份工作还是有必要再学学的,所以又重新看了一遍《C++ Primer》,C++ 11的一些新特性还是非常赞的,auto、范围for、智能指针、右值、可变模板参数、lambda、unordered_map/unordered_set、bind/function等都非常的好用,C++17都出来了。。。C++11才开始学。。。深感学习语言的速度没有语言的更新速度快啊。。。

以上就是我对于2016年的一些碎碎念了

2017计划

  • 当然首先还是要找份靠谱的工作,希望公司的技术氛围浓厚点,要是给我安排一位Mentor那就更好了。寒假打算好好看《Linux多线程服务端编程》,认真研究下Muduo的源码,顺便把Web Server的坑填了。把以上两点搞完就很不错了,不知道时间是否足够,年后必须去找工作了。
  • 通过16的一年时间的学习和工作,我发现我基本功还是不扎实,注重学习书籍上的理论,没有注重实践,消化得并不好,对理论知识没有更深层次的理解和沉淀,因此很快就忘记了。接下来需要多动手。
  • 写的代码质量堪忧,没错,自己写的代码都是垃圾!对于良好的接口设计、代码规范、测试、调试等方面的技术都有待加强。以前觉得软件工程这个课是很枯燥乏味的东西,现在发现真的是大错特错了,要想写出高质量的代码,有必要好好去遵循里面的方法。

书籍阅读清单

列了12本打算看的书,每个月刚好一本,哈哈,不过要看完很难,而且我更需要实践,多写点代码才行

  • 《Linux多线程服务端编程》
  • 《C++编程规范》
  • 《C++程序设计实践与技巧》
  • 《程序设计实践》
  • 《调试九法》
  • 《程序员的自我修养》
  • 《STL源码剖析》
  • 《深入理解计算机系统》
  • 《Redis设计与实现》
  • 《深度探索C++对象模型》
  • 《Effective C++》
  • 《Go程序设计语言》

开源代码阅读清单

优秀的开源项目有很多值得研究和学习借鉴的地方,少逛知乎多看github上的开源代码吧

  • muduo
  • redis
  • folly
  • nginx
  • rapidjson

其他想干的事情

  • 健身,身体健康最重要
  • 旅行,还没有正经去旅游过,想去一次成都或者云南
  • 音乐现场,想去迷笛,草莓也不错,许巍开不开个唱啊,又想去他的演唱会了
  • 恋爱,哈哈,还是继续单身吧

2017,好好的活着!

活着 - 朴树
词:朴树
曲:朴树
你看那些可怜的人
正缝缝补补 唯唯诺诺
这么活着 又算什么呢 让我搞不懂
我有那么多的理想
我还有那么大力量
我要改变世界
任凭我想象
隔壁老张对我讲
年轻时我和你一样狂
天不怕 地不怕 大碗喝酒 大块地吃肉
后来摔了跟头 老了 就变得谨小与甚微
就忘了梦想只乞求能够平安地活着
我是要做个英雄
要吃好大一片天空
现在懂了这都无所谓
我吃饱就行了
我们都是很柔软的动物
活在壳里 发誓抵抗
最后不过丢盔卸甲 慢慢地顺从
我们都是很微小的动物 不足道
如果想要快乐一些
就要忘掉世界的辽阔
我们都是很可怜的动物
来到这个世界 受点委屈 受点刺激
这么苟且的活着
我们都是很那个的动物
活在自己身边
这么看着 这么干着 这么凑和
这么快乐的活着
隔壁老张对我讲
年轻时我和你一样狂
天不怕 地不怕 大碗喝酒 大块地吃肉
后来摔了跟头 老了 就变得谨小与甚微
就忘了梦想只乞求能够平安地活着
有时我很快乐
有时我很难过
直到将来会变成老张活得像条狗
这种现实只能接受
能干干着 不能干看着
这一生会很快地过完
我是要做个英雄
要吃好大一片天空
现在懂了这都无所谓
我吃饱就行了
我们都是很柔软的动物
活在壳里 发誓抵抗
最后不过丢盔卸甲 慢慢地顺从
我们都是很微小的动物 不足道
如果想要快乐一些
就要忘掉世界的辽阔
我们都是很可怜的动物
来到这个世界 受点委屈 受点刺激
这么苟且的活着
我们都是很那个的动物
活在自己身边
这么看着 这么干着 这么凑和
我们都是很柔软的动物
活在壳里 发誓抵抗
最后不过丢盔卸甲 慢慢地顺从
我们都是很微小的动物 不足道
如果想要快乐一些
就要忘掉世界的辽阔
我们都是很可怜的动物
来到这个世界 受点委屈 受点刺激
这么苟且的活着
我们都是很那个的动物
活在自己身边
这么看着 这么干着 这么凑和
这么快乐的活着

文章目录
  1. 1. 今年都做了些什么
  2. 2. 2017计划
    1. 2.1. 书籍阅读清单
    2. 2.2. 开源代码阅读清单
    3. 2.3. 其他想干的事情
|