## 经历
在履历上提到的有
- 台湾高中资讯奥林匹亚(TOI) 选训营 1阶
- ACM-ICPC亚洲区域赛银牌
- NUS(新加坡)研究实习,做可视化,跟着挂名发了一篇IEEE InfoVIS正在等结果
- 4个课程作业(因为没什么project只好写课内)
1. OS(只有kernel,我大概2000行写了一个FAT32)
2. MIPS Pipelined CPU(用verilog写的,可以中断、异常)
(1, 2是合在一起放在FPGA板上跑,所以也包含了VGA驱动, PS/2键盘)
3. OpenGL赛车游戏(没有框架、直接用C++跟OpenGL原生函数+GLSL shader写的)
4. 协作markdown编辑器(类似Google doc,通信用socket,左右边分割视窗可以看markdo
wn跟结果)
有关高中、大学,学习经历之后看反应情况可能会再发一篇到高中版。
## 时间表
| Google | 上海 | 18/12/4 | 自己官网投履历 |
| Google | 上海 | 18/12/4 | 过CV Review |
| Google | 上海 | 19/1/26 | 感谢信 |
| Google | 上海 | 19/1/28 | 通知转台北 |
| Microsoft | 台北 | 19/2/1 | 请学长内推Bing |
| Alibaba | 杭州 | 19/2/21 | 请学长内推 |
| Google | 台北 | 19/2/27 | 1面 |
| Google | 台北 | 19/3/11 | 过1面,通知2面 |
| Tencent | 深圳 | 19/3/7 | 网申 |
| Microsoft | 台北 | 19/3/8 | 1面 |
| Tencent | 深圳 | 19/3/9 | 笔试 |
| Alibaba | 杭州 | 19/3/13 | 通知面试 |
| Tencent | 深圳 | 19/3/14 | 1面 |
| Google | 台北 | 19/3/15 | 2面 |
| Alibaba | 杭州 | 19/3/16 | 1面 |
| Microsoft | 台北 | 19/3/28 | 2面 |
| Google | 台北 | 19/3/28 | 过HC |
| Microsoft | 台北 | 19/4/7 | offer |
## 腾讯
#### 去年投过一次2018暑期实习
面试问了白板题
1. 快速排序、找一个序列的第k大O(N),用类似快速排序的方法但不管另外一边
2. 动态维护输入的前10个小的数字(用max-heap)
C++: static, virtual, ~Class(), abstract class,
哪些变量放在heap, stack
大部分都是语言的基本功
但是因为实习要3个月那个时候我暑假只有2个月就不能去了
### 2019暑期实习
### 笔试
感觉非常难,120分钟写5题
前2题是数学题,第三题DP
到我写完第三题大概60分钟了,
然而我新加坡的博后催我去做实验,就放弃了,后面两题没看。
### 事前沟通
过几天有个面试官打电话跟我约时间,他说是深圳做游戏部门的,
然后说看到我CV上有OpenGL经验,问我想不想去,但我说没有特别想去的地方,
他说看我没有很想去,就不收了,叫我等其他人从pool里面拿出我的CV
### 面试1
平台: 电话
过了一周之后有别的人打电话给我,约晚上面试
面试问得很细,但没有要做题,主要从我的经验来问,我说什么它就问得更深入一些
比如OpenGL,它就问我光照的细节,主要是Phong model(specular + diffuse),shader的
输入是glVertex,
VBO存的是顶点的座标,其他点shader会自己迭代,光照需要物体座标(glVertex)、相机座
标、光源座标。
OS也是问了很久,我花很多时间解释FAT32的结构,但沟通好像不是很好,我尽可能讲了一
下写一个路径的过程
MBR -> 第一个分割区 -> '/' -> for (i = 0; i < 512; i += 32) fileEntry[i ... i +
31]
-> 找FAT里面的实际位置 -> 路径比如是'/abc/def/ghi' -> 找FAT里面的实际位置 -> 写
入实际位置。
Markdown编辑器,问了怎么实现,就是用Java的socket,每次监听两个事件,一个是文字框
改变,
一个是socket发来消息,文字框改变就要发socket到server,server再发给其他client。
而client接到socket就要改变文字框(但再不转发到server)。
问了一下TCP/IP, UDP,但我说没有很懂,只会用Java的那一套。
问C++, static的各种用途
vector的内部实现,每一次扩大两倍,但是均摊插入还是O(1)。
map内部实现是红黑树
unordered_map内部实现是hash table,问了hash table为什么要,
怎么用、怎么设计hash function,还问了一下碰撞怎么处理。
总共时间大约一个小时。
### 面试2
https://www.ptt.cc/bbs/Soft_Job/M.1553331381.A.0AC.html
## 台湾微软
### 1面
平台: Microsoft Team
10.a.m to 11.a.m.
题外话是因为我自己时间安排的不好,
面试的时候只能找个全家坐着用电脑连手机4G面试,
讯号非常糟,还让面试官一直听全家的开门声,真是抱歉。
细节不能说,但大概就是观念题+白板题,我觉得不难,
观念题大概都是那种听完题目30秒内回答完的程度。
(课本或上课ptt大字那种观念)
白板题好像都是Leetcode medium题。
### 资格问题
1,2面中问,HR问了我是不是台湾人,能不能来实习,
所以稍微耽误了一点时间,不过最后没什么问题。
### 2, 3面
平台: Microsoft Team
约了9 a.m. 到10 a.m., 10 a.m. 到 11 a.m.
两个面试,都是西雅图的印度人面试我
第一个一上来就直接问白板题,
做完了一题(虽然好像不是最佳解,我写了O(N^2),其实可能可以O(N) )之后,
他手算几个输入到我的函数里面的结果,确认都是正确,
就再开了一题让我做,然后就第二题我说完想法时间就到了,
沟通还算顺利,虽然我的英文不太好。
第二个非常亲切,还问了我一下我这里天气如何,问我平常有没有运动,
然后也是直接做白板题,做完一题接了第二题(第一题的延伸),
做完之后他说知道我是对的,但要我解释,我有点卡,耽误了一下但还是正确地讲完了。
第二题写完之后还有一点时间,让我看了第三题,我一样说了想法,做了一下,然而没做完
。
最后他问我有什么问题,我说没有;他反问我为什么想来微软,
我说我从小把电脑打开就看到Windows, Office,想来是很自然的;
然后问我有没有用Bing,我说因为在中国Google不能用,我就会用Bing,因为我不想用百度
。
题目都是leetcode medium难度的感觉,是不是原题也不确定,我刷的不多。
## Google
最早是投了上海Google,大概投了一周后就收到面试通知。
期间等了快2个月,最后突然取消面试跟发了感谢信感觉很崩溃(那为什么当初还要说可以面
试),
不过隔两天在台湾接了一个021(上海)开头的电话,他说是Google HR,
问我是不是台湾人,想不想转去台北Google面试。
### 1面
平台: Hangouts
面试官是台湾人,用中文。
实现一个有某种功能的Data Structure,可能有leetcode hard程度,没看过的题目,不说
太多细节。
我做题就慢慢的做,感觉不是很难,期间保持跟面试官沟通,
其实有些地方没想到面试官会提示,然后我也反复的问还有没有额外的限制条件来套提示。
听后来几个面上海而且是中文面试的人说题目好像是一样的,看来题目会重复使用。
### 2面
平台: Hangouts
过了几周HR问我2面时间,但我只有晚上有空,它就安排别的时区跟我面试。
面试官在爱尔兰、用英文
英文方面我感觉不难?我学测英文才12级,
(或者我可能大学英文有进步XD)
面试语速其实不快,听不懂就请他再说一次。
题目不说太多细节、leetcode medium
但我思路想偏,用tree map写坏了,
前面讨论加写花了大概20分
面试官说我的复杂度不是最佳,有些数字重复出现的问题也会坏,
然后后面慢慢的改,他提示tree map改成hash复杂度就对了,
数字重复想了一些解法可以处理大部分问题,但还是有例外,
最后他说时间到了问我有没有问题,我随意问了一下那边的Google有没有晚餐,
他说没有,他的同事经常5点回家,他自己有时候会6点才回家。
面完之后感觉大爆炸了,
看了leetcode发现有原题
才赶紧在1周内快速看了大约150题medium,
少数觉得不好写的写了一下。
(当时下周还有微软2面)
### HC
过了几周通知我HC过了,看来我之前可能太害怕了,不过不知道Team Match结果会怎么样。
## 阿里
### 1面
平台: 电话
问我的projects
我说我做过OS,三个人一组,内存管理、进程调度、档案系统,一个人做一块。
问了我实现FAT32的细节,改FAT,新增档案、改资料夹的描述,32bytes 的file entry
又问了Memory mangement
Slab, kmalloc, malloc, tlb
kernel/user mode的差别
白板题leetcode medium有,我有做出来,
然后面试官也提示一些可以优化的细节。
(复杂度对,但没有考虑优化遍历array的速度)
结果1面没过几天就通知不录取,不过说了可以再投阿里别的部门。
## 总结
### 刷题
本来的想法是觉得Leetcode很简单,很多题都是看到脑中就有code出来,
感觉跟以前高中IOI、大学ICPC完全没得比,所以完全没刷过题,
我在Google2面结束之后觉得有点爆炸(应该说做题不够顺)才开始刷题,
所以我觉得题还是要稍微刷,Leetcode的方向比较是考你正确性、稳定性,
还有面试的时候不能题一上来就写,一定要多沟通,尽量要让他知道你想写什么才开始写。
### 技术
(被各位说了不要提自己技术弱,
其实原义只是想表达我技术方面相对准备不够全面,
而且还有之前腾讯洗脸技术的经验,
不管面试过程合不合理
确实还有很多可以改进的地方)
拉高自己特殊竞争力
肯定要挑战刷题没办法学会的东西,
最基本就是OS, Network, DSA的课本概念
再来就是多往底层钻,虽然自己还是有很多不足,
之后有空可能自己练习写database底层,
弥补之前被腾讯洗脸经验。
### 学术经验
发现不管哪一家公司都没有在意我的学术经验,
但不清楚CV有没有把我去过NUS纳入考虑,
所以可能做研究对找工程类工作没什么帮助?
(如果其他人有相反经验可以指正)
### 面试结果
关于怎么找要投哪些地方,其实我没有刻意找,就只是看到别人分享就投。
面试后拒绝: 腾讯, 阿里
台北微软: offer
Google: 等team match
自己放弃笔试、面试: 腾讯后来给的第二次机会, 上海Morgan Stanley, 苏州微软
没有面试机会: VMware, 网易
(可能是我的投递方式不太对,我写了一封没有内文的只有CV的信给招聘广告下面留的email
)
感觉中国跟美国面试风格有很明显差异,
中国公司重技术,美国公司重思考跟沟通,
不过不评价好坏,只是陈述自己经验。
其实去年12月是没有规划暑假找公司实习,
本来想找美国大学实验室再做一个研究实习,
看能不能申请前拼一个比较强的研究成果,
但自己英文实在太烂,看着同学一个个都TOFEL 110up, GRE 330up考出来,
觉得出国读书没什么希望了才转战找工作,
如果一开始就规划找工作的话可能会做更充分准备。
目前的话虽然Google有机会上,但考量到微软1年可以做比较多事情,
然后因为我Google没有内推是自己投
(其实应该找认识的学长,但那时觉得不想麻烦别人,有点蠢)
明年应届毕业以我现在这个经历加实习过微软一年,应该至少有办法面试,
面试内容如果也还是白板题,我觉得只要不到ICPC那种超级难的题目就都还可以应付。
另外是微软我加入的team已经是跟美国合作的team,之后转正去美国没有找新的team的问题
,转正微软也比Google简单,
所以最后应该就是去台北微软了。