2015 年终总结

元旦几天在修改答辩 PPT 中度过,无心作别旧年和迎接新年。答辩过后,简单收拾下实验室的东西以准备滚蛋,然后就要正儿八经地写我的年终总结了。2015年对我来说是忙碌的一年。这一年经历了挺多的事情:搜狗和三星的实习,论文再三投稿,航天二院『恶心』的项目,辛苦的求职,度日如年的毕业论文和答辩等等。下面就一一来回顾一下,最后能反省出点什么东西。

搜狗实习

我深知实验室项目和学术水分较大,年底若想找到好点的工作,实习是不可或缺的。在面对 Boss 三令五申不准实习、随机 Call 回开会和实验室同级其他同学坚守实验室的三重压力下,我毅然投身到搜狗公司的实习中去,在年初时间还算松弛的情况下抓住机会获得了三个月的实习经历。回头来看,当初勇敢果断的选择是对的。在搜狗做的是前车碰撞预警,用学术方法解决工程问题。时间虽短,收获很大:体验了搜狗这种大公司的规范、福利,增长了知识,当然,还给自己贴了金。遗憾的是这个东西我自己做,没人带没人交流,这样的实习其实不是最优选择。

三星实习

一个偶然的机会在北邮人论坛看到三星在招聘实习生,其中有一个云计算方面的职位。我因为正好前几天玩过 docker,看到 JD 里面有这个词就很感兴趣,而且有朋友之前也在思密达实习过,似乎还不错,于是就投了个简历。很快得到面试机会,晓强和任慧同时对我面试,过程很愉快,于是就去了。我与三星的缘份就从7月份一直持续到12月份。刚开始就是晓强带着学 docker 和 CI 相关的东西,我很有兴趣,学习动力大,晓强也对我的问题耐心解答。后来晓强离职,我这边又经常被 Boss 赶去航天二院做项目,感觉三星那边用不上力了。好在这里是三星的先行技术研究部门,任务不紧急,而且书博实在很 nice,我就这样继续坚持着。邻近求职季,书博叫我参加三星的软考,这是内推的一个流程,不过就没办法进三星。软考顺利通过了,我就将心思放到了二院项目和找工作上,直到求职季都到了尾声,三星叫我参加 GSAT 考试。通过之后又去技术面试和两次人事面试。最后收到三星的 Offer 还是很开心的,后面会解释。三星的实习,庆幸的是遇到晓强这么好的人带,还有书博对我时间上的宽容。有了搜狗的经历,不免将两家公司对比。三星为了安全对员工管控非常严格,别说 wifi 了,网线上网都是各种屏蔽,内部消息都用 gmail,然而只能扶梯才能上。网速慢的要死。手机进公司贴相机。出门安检。实习的各种规定、待遇也不透明。三星这个部门的优点是不加班,满9个小时就可以走。工作比较轻松。人不错。

求职

从阿里巴巴的内推开始,求职过程就展开了。最核心的是九月和十月,投了很多简历,做了很多题,最后拿到了几个 offer,分别说一下。

  • 滴滴:这个是等的最难熬的。国庆过后面试的,面试时直接面了四面,HR 说基本没问题,很嗨皮,这个公司我也很喜欢。但等了足足一个月才等到 offer。感觉这家公司发展非常迅猛,通过与面试官聊天也能感受到公司快速成长给员工带来的机遇。坏处是发展快的公司一般加班比较多,且看我能否且行且坚持吧。
  • 58赶集集团:这个是最快的,从笔试到拿到 offer 用了大概一周的时间。在好几个同学都是馒头价的情况下,我拿到的是滴滴水平的待遇,非常幸运。这个 offer 的好处有几个:待遇不错,各项福利和培训都很到位;公司搬进了新楼,环境相当 nice;最大的分类信息平台,上市公司,准备在到家、二手车等领域第二春。最后拒绝它,也有几个原因:一是公司的位置实在偏,798旁边,与女友太远,每次去还都堵的要死;他们家的技术水平,据打听不太给力;同学的同学在这儿,据打听加班很严重。还是很感激这家公司的,在我 offer 慌的时候给我一剂安慰和鼓励。
  • e 代驾:这个 offer 来的比较偶然。某天晚上在中教逛宣讲会,适逢它要开始笔试,打听了下还不招 C++,于是报了个 iOS 就进去了。面试是在他们在望京的总部,由于我并不擅长 iOS,所以回答的比较 so so,面完就 Goodbye 了。不料某天接到 HR 妹妹的电话,给了 offer,待遇还不错。彼时还在九月,我率先攻下了一个 offer,虽然是小公司(其实估值已经10亿),总算是个保底。后面就忘了这个 offer,直到很久之后看到消息他们要裁员,没过几天收到 HR 电话说他们要把这次招的应届生都裁掉,还得是我安慰一直在抱歉的 HR 妹妹。这个 offer 挺有意思,所以也就写在这里了。
  • 三星研究院:之前介绍三星实习的时候已经把过程说了个大概。实际上这个 offer 来之不易,也可以说我幸运,因为我与其他三个朋友只有我拿到了 offer,他们或是软考没通过,或是 GSAT 没通过,通过层层筛选,真正能进来的人寥寥。最后他们给的待遇也是挺厚道的,福利就更好了,如果我想安稳舒服地过小日子,这是最好的选择了。然而最终拒绝了它,因为我还年轻,希望趁着年轻不辞辛苦努力成长,这里也许尚不合适。这个选择是否正确我不确定,反正又不是生死抉择,还是 follow heart 试错一次吧。
  • 中国电子技术标准化研究院:舍友在这儿实习,也就投了一个,事业单位,户口概率高。经过群面、笔试、面试等环节收到 offer,可惜超龄无法落户,遂放弃。实际上,即使可以落户,这个选择也不容易,因为工作内容差不多就是写文档这种无聊事,作为保密单位,手机信号都没有,也比较痛苦。
  • 虹软中国:一家位于杭州的外企,核心竞争力在计算机视觉领域。待遇十分有诚意,杭州也是相对理想的定居城市,公司在业内也是很不错的,这个 offer 令我动心了。纠结再三,还没有足够的勇气离开北京,且女友在北京已经找到工作,于是作罢。

此外,还面试了去哪儿、百度、阿里、美团、京东等公司,最终选择进入滴滴,以随我愿。

航天项目

这个项目是一个非常痛苦的经历:每次需要跑到对方单位去做;不能上网、屏蔽信号、效率大打折扣;忙碌一场,几乎没有报酬,作为乙方还被人家驱使;项目使用了其他单位提供的一个平台,调试如同灾难,很多时间被白白浪费掉了;对方对项目管理不善,时间跨度太大,有数月之久,牵扯精力;没什么实际的技术含量,也与学术无关;与实习冲突,后来甚至导致没时间为求职季找工作做知识准备和算法训练,那段时间在项目和求职压力下,身体也出了点状况。要说对我有什么帮助,倒是在简历上写了一下,偶尔会有面试官要求讲一讲。总得来说,这是2015年的阴影。

论文

小论文的发表一波三折,最终在 ACPR 上被录用。研究方向是我的一个遗憾,本来很 happy 地看跟踪,后来突然给换到了足球视频事件分析。这个方向我并没有什么兴趣,而且偏应用,领域内几乎没有比较好的 paper,注定我发 paper 的坎坷。说句难听的,相对于其他领域的高大上,这个领域实在 low,涉及机器学习的东西比较少。一个更悲催的事实是,居然没有一个公开的代码可以参考,没有一个公开的数据集可以使用。当其他人都是下载代码稍微修改跑公共数据集的时候,我还在辛辛苦苦地从零开始写代码、下视频、标数据。当其他人都在琢磨怎么修改以改善以创新时,我还在原型系统的实现中。工作量如此之大,却由于偏应用,没有高大上,几乎不可能发好的 paper。真是有苦说不出啊。最后能顺利发表,已经很知足了。读了研究生我才知道,所谓的学术自由只在国外才有,国内的研究生大多只能听从老师的部署。

总结

上面把2015年几个主要的事情回顾了下,有一些看起来挺负能量的。我在这里只是真实反映自己的感受,况且本身就是黑的东西没必要非得阿 Q 似地歌颂和欣赏。有些事情是受一些难以改变的外在支配的,除了抱怨时运不济外,只能在重负下挣扎出个结果了。这一年有一点需要自我批评,除了被别人浪费掉的时间外,自己也主观地浪费了很多时间,比如看剧、看电影、浏览网页,花在读书、思考、写作上的时间实在少的羞愧。分析原因,一是怠惰了,二是缺少了对未知的好奇心和对自我成长的期待。此外,这一年几乎很少去打羽毛球,也没有给自己安排其他锻炼项目,身体实在想动一动了。

Best wishes for 2016!

校招 2016 总结

从8月份阿里巴巴开始校招到现在阿里巴巴即将嗨翻双11,互联网校招基本上就走完了,剩下的是零零落落的互联网和很大一部分的国企、外企,对我来说,差不多就算结束了。忙忙碌碌的一段时间,不妨在这时候稍作总结,一来自我梳理一下,二来给低年级的同学一点经验教训。

截至目前,有的企业还在走流程,已发 offer 及比较确定的有这几个:

  • 滴滴出行:产品技术部
  • 58赶集:后台研发
  • e 代驾:iOS 开发
  • 三星研究院:云计算相关
  • 虹软杭州:云计算研发,核心是计算机视觉 API 开发
  • 工信部四院:物联网中心,标准化研究工作,不写代码

直到9月份,我和同学仍然在为实验室的项目忙碌,当别的同学都已经实习转正或辞去实习准备校招时,我们还在往航天二院那边跑;一方面是无暇准备,一方面是坊间传言的形势差,心里的焦急可想而知。简历反复修改,终于定稿,然后就采取『撒大网』的策略,主流的互联网公司几乎都投了简历,来学校宣讲和笔试的未曾耳闻的公司也参加了不少的笔试。由于精力有限,最终参加面试的有:百度、网易、美团、京东、去哪儿、国双。美团、去哪儿、国双面完了终面,却没拿到 offer。百度二面挂,网易杭州 iOS 开发一面挂,京东 iOS 开发一面挂。此外还有微软苏州、出门问问、暴风、联想、华为、乐视的面试没有去。其实这么多,最想去的是美团和滴滴,最终拿到滴滴的 offer,心愿已了。

浅析二级指针、二维数组及其他

C 语言这种比较底层且大量操作指针的语言,常常需要开发者对程序对应进程的内存状态保持关注,例如一个变量存储在内存哪个区,地址范围是多少,指针指向的是什么。尤其当涉及数组和指针时,稍不注意就会犯错。本文试图对相关的几个概念和用法做解释,没有看《C专家编程》之类的书,理解可能不深或有误,请读者指正。

为了便于解释和验证,我提前写了点程序,先全部贴出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
//  main.cpp
//  testcpp
//
//  Created by moxie on 15/8/25.
//  Copyright (c) 2015年 moxie. All rights reserved.
//

#include <iostream>
#include <stdio.h>

using namespace std;

// 二维数组传参
void func1(char (*a)[2]){ // or char a[][2]
    cout <<  a[1][1] << endl;
    cout << sizeof(a) << endl;
}

// 指针数组传参
void func2(char **c){ // or char *c[]
    cout << c[0][2] << endl;
    cout << c[1][1] << endl;
    cout << sizeof(c) << endl;
}

// 二级指针
void func3(char *p){
    p = new char[2];
    *p = 'b';
}

void func4(char **p){
    *p = new char[2];
    **p = 'b';
}

// 二维数组地址
void func5(){ // reference: http://c.biancheng.net/cpp/html/79.html
    int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    printf("%d,",a);
    printf("%d,",*a);
    printf("%d,",a[0]);
    printf("%d,",&a[0]);
    printf("%d\n",&a[0][0]);
    printf("%d,",a+1);
    printf("%d,",*(a+1));
    printf("%d,",a[1]);
    printf("%d,",&a[1]);
    printf("%d\n",&a[1][0]);
    printf("%d,",a+2);
    printf("%d,",*(a+2));
    printf("%d,",a[2]);
    printf("%d,",&a[2]);
    printf("%d\n",&a[2][0]);
    printf("%d,",a[1]+1);
    printf("%d\n",*(a+1)+1);
    printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));
}

int main(int argc, const char * argv[]) {
    // insert code here...
    // 二维数组
    cout << "二维数组" << endl;
    char a[2][2] = {'a', 'b', 'c', 'd'};
    char b[][2] = {'b','b','b'};
    func1(a);
    func1(b);
    cout << endl;
    
    // 指针数组
    cout << "指针数组" << endl;
    char c1[] = {'a','b','c'};
    char c2[] = {'d','e'};
    char *c[2] = {c1, c2};
    func2(c);
    cout << endl;
    
    // 二级指针
    cout << "二级指针" <<endl;
    char *p = new char[2];
    *p = 'a';
    cout << *p << endl;
    func3(p);
    cout << *p << endl;
    func4(&p);
    cout << *p << endl;
    if(p){
        delete p;
        p = NULL;
    }
    cout << endl;
    
    // 二维数组地址
    cout << "二维数组地址" <<endl;
    func5();
    cout << endl;
    
    
    // 初始化
    cout << "初始化" << endl;
    int dd[2] = {2};
    cout<<dd[0]<<endl;
    
    char e[4] = "ab";
    cout << e <<endl;
    
    cout << endl;

    return 0;
}

output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
二维数组
d
8

8

指针数组
c
e
8

二级指针
a
a
b

二维数组地址
1606415872,1606415872,1606415872,1606415872,1606415872
1606415888,1606415888,1606415888,1606415888,1606415888
1606415904,1606415904,1606415904,1606415904,1606415904
1606415892,1606415892
5,5

初始化
2
ab

Spring 中发送 POST 请求

最近在跟实习单位的一个项目,主要是对 mesos 的 singularity 框架进行 API 的再封装,抽象出 user 和 farm,选择的实现方案是 Java Spring。之前在看 singularity 的东西,这两天 leader 分了一点写 API 的任务给我。核心的代码就是 Model 和 Controller,已有的代码也可以参考,不过,没学过 Java 的我,实现点东西还是颇费力气的。

Spring framework 提供了很好的机制、很好用的包,文档和参考也很丰富,但相对于 python php 之类,还是感觉好麻烦。我要写的一个功能是要对 singularity 的 API 进行访问,尽管后者已经提供了 Java client,无奈这个项目太新,一是 client 中的功能还不完善,二是没有文档,另人抓狂;所以我还是用它 API。需要做的是进行 POST 请求,但要求请求数据是 json 格式,附带 header "Content-Type: application/json"。Spring 的 RestTemplate 其实已经有一个可用的方法,但参数只能是 Model,我的请求数据很简单,不想为此建一个 Model。在网上找了一圈,试了很多,最终发现,除了 Java 提供的比较 low level 的方式,如果想用 RestTemplate,只能这样做:

1
2
3
4
5
6
7
8
RestTemplate rt = new RestTemplate();
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Content-Type", "application/json");
SinRequest sr = new SinRequest();
sr.setId("test_request");
String response = rt.postForObject(
"http://ip:7099/singularity/api/requests",
sr, String.class);

其中,SinRequest 是请求数据对应的 Model,调用 rt.postForObject,会自动把 Model 转为 Json 数据。

Fork me on GitHub