当初为了无痛开发换到 Mac,之后大大小小也遇到过不少奇怪的问题,不过都没有这次的奇怪。考虑到之后也可能遇到,姑且记录一下。
问题的表现是无法安装任何带 C 扩展的 Python 库。在编译的过程中会提示 <stdio.h> not found
。系统是 10.11 El Capitan。
于是就去网上搜,得知 Mac 下 stdio.h
应该位于 /usr/include
。搞笑的是,include
文件夹消失了!去网上搜,发现很多人都遇到这个问题,估计是 Xcode 升级带来的 bug,然后基本所有人都说要通过 xcode-select --install
命令装 commandline tools。问题是我早就装了。
终于找到一个地方提示说可以手动把 Xcode 里面的文件夹链接过去。尝试执行
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include
提示
ln: /usr/include: Operation not permitted
搜索发现原因是 Mac 默认开启了 Configuring System Integrity Protection,简单来说就是一些系统相关的文件夹被设为只读。解决方法参考这里:
- 重启电脑
- 在启动过程中按住
cmd + r
,进入 Recover Mode
- 选择 utilities > terminal,输入命令
- 再次执行
ln
,成功。
再次尝试安装,这里以 greenlet
为例
$ pip install greenlet
...
Building wheels for collected packages: greenlet
Running setup.py bdist_wheel for greenlet
Complete output from command /usr/local/opt/python3/bin/python3.5 -c "import setuptools;__file__='/private/var/folders/sy/msgzx60s2_332s1wdb92fqw80000gn/T/pip-build-amdm1ven/greenlet/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /var/folders/sy/msgzx60s2_332s1wdb92fqw80000gn/T/tmp4a1nacfbpip-wheel-:
running bdist_wheel
running build
running build_ext
building 'greenlet' extension
creating build
creating build/temp.macosx-10.10-x86_64-3.5
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/usr/local/include -I/usr/local/opt/openssl/include -I/usr/local/opt/sqlite/include -I/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c greenlet.c -o build/temp.macosx-10.10-x86_64-3.5/greenlet.o
Assertion failed: (!contains(New, this) && "this->replaceAllUsesWith(expr(this)) is NOT valid!"), function replaceAllUsesWith, file /Users/laike9m/Dev/C_CPP/Lib/cling/src/lib/IR/Value.cpp, line 343.
...
********************
error: command 'clang' failed with exit status 254
----------------------------------------
Command "/usr/local/opt/python3/bin/python3.5 -c "import setuptools, tokenize;__file__='/private/var/folders/sy/msgzx60s2_332s1wdb92fqw80000gn/T/pip-build-amdm1ven/greenlet/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/sy/msgzx60s2_332s1wdb92fqw80000gn/T/pip-l6qwwxng-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/sy/msgzx60s2_332s1wdb92fqw80000gn/T/pip-build-amdm1ven/greenlet
我不相信 greenlet 的代码有问题,遂怀疑是 clang 的问题。于是想用 gcc 来编译。尝试 export CC=gcc
未果,发现仍然在使用 clang,报同样的错。还是在 SO 上找到了解释
It has been this way for a long time already. The "GCC" that came with 10.8 was really GCC front-end with LLVM back-end.
解决方法是用 homebrew 安装 gcc,这样不会和系统的 gcc 冲突。
然后
export CC=/usr/local/Cellar/gcc49/4.9.3/bin/gcc-4.9
这下终于安装成功。
2017-2-9
最近发现有时候必须得在 virtualenv 里才能安装成功……

除此之外还有:
封杀电视盒子,“电视机和盒子不能通过USB端口安装应用”
号召妇女回归家庭(这个其实不太算)
约谈红杏 VPN,Shadowsocks 的作者,迫使他们关闭服务或删除代码
网剧和电视剧采用同样标准接受审查
既然国家赶我走,那我就只能走咯。倒车一旦开起来,不是那么容易刹住的。
顺便我想反驳几个经典的错误认知:
不是大大的错,是下面的人乱搞
揣摩上意是官僚的基本素质,更不要说中国的官僚。
封掉一些国外网站是为你们好,防止你们受不好的影响
为我们好这件事并不能推出 GFW 是正义的,就像夜神月虽然拿小本子杀掉罪犯不代表他是正义的一样。而且真的是为中国人好吗?显然只是为了方便统治而已。
你不会翻墙啊?
我能翻墙并不代表 GFW 就不是邪恶的。实际上墙的目的就在于让那 99% 不能翻墙的人无法获取信息。
没有墙,国内的互联网公司哪能发展起来?
这条并不是完全没有道理。但从用户的角度来讲,Google 的退出让普通人只能用百度,全面降低了中国互联网的使用体验。实际上,淘宝当年打败 ebay,腾讯打败 MSN 和 ICQ,都是正经获胜的。俄罗斯没有封禁 Facebook,结果呢,vk 用的人是最多的。这些都说明,只要一个国家有足够多的人才,就能够抗衡美国的互联网巨头们,毕竟有本土化的优势。相反,在层层保护下成长起来的百度却越做越烂,越做越流氓。
我从没写过总结之类的东西。当年人人网还很火,一年过完时各种年终总结总是一股脑地涌到主页上。
点开过一些,别人具体写过什么早已不记得,只隐隐记得有“人参赢家”四个字。而我实在没有什么可写的,没有申请,没有奖学金,没有科研,没有女朋友。我也定过目标,比如这学期的这些课一定要考好,无奈分数总是打我的脸。说出来你们可能不信,大学四年我没有算过自己的 GPA,甚至都不知道 GPA 的算法。
于是我就选择去中科院,因为在电子系实在呆不下去了,也看不出继续呆下去自己会有前途。当时每个人都在打听别人去哪,问到我,我就说去中科院计算所,别人便不再问了。在一个出国的出国,本校保研的保研的大环境中,离开本校这件事在大众眼里等于失败。当时辅导员打了两个电话问我:你确定不留本系?我说,对,我去中科院。我没脸留下。
其实我还真不怎么在意离开清华这件事,因为大三下学期我便决意当程序员,又去不了贵系,所以要么就业,要么去别的地方读研。研一在怀柔过得十分愉快,在单间内我可以尽情地写代码。研二回所,干的活我很不喜欢,只能硬着头皮搞。就这么到了寒假。寒假中主要做两件事,一是学日语,二是准备开始写 ezcf。开学之后,想着要开始找工作了,不过主业仍然是写 ezcf,顺便干实验室的活。当时我以为从三月份开始准备足够了,后来才知道,有些人从研一或研二的上学期就开始刷题了。
终于开始准备找工作。因为自己算法基础薄弱,所以就报了九章的算法班。然后就很平常地刷题。四五月份的时候 Google 和 Facebook 在计算所开了宣讲会。Fb 是王勐大神讲的,可惜造化弄人,他最后并没有去。Google 自然是北京 office 的人讲,现场人山人海,中科院各个所都有人来。现在还记得坐我后面的哥们说“如果能去Google,让我去个非洲小国家也可以”。某学姐讲了很多 Google 的情况,包括如何才能加入。某学长在现场做了 mock interview,请了一个女生上去。题目是“100万整数排序”。他们提到 bitmap,然而我完全不知道 bitmap 是什么,瞬间感觉自己和其它人差距好大。某学姐和某学长之后还会出现。
六月份的时候,我听到别人说有个计算所 Google 内推群。当时还很疑惑,因为我一直以为内推至少要七月份才开始吧。加了群之后我才发现,靠,原来之前啥都不了解,一堆人都已经把简历给群主了——内推群的群主,正是之前提到的某学姐。而我这时候连简历都没有!于是匆忙在之前实习简历的基础上赶了一份出来。发过去之后,等了几天,某学姐回信说:“很抱歉,我不能够帮你内推”。沮丧,这是我当时唯一的感觉,如果说还有第二种感觉那就是大难临头。之前每次我妈问我我都自信满满地表示拿到内推还不是分分钟,结果现在被当头一棒,瞬间就慌了。
这时候我才真正意识到,找工作不是一件容易的事。思考了一下策略,我决定暂缓刷题,先搞定简历和内推再说。我疯狂地在网上收集各种信息,通过四种途径(QQ、知乎、邮件列表、某咨询服务网站)查到了几个 Google 员工,发消息给他们求内推。我也不清楚当时为什么不用 Linkedin。另一方面,我向林基远师兄请教简历写法。师兄把他们那届的一些简历发给了我。这些简历风格都出奇一致,全是用特别小的字把项目写得巨详细。起初我没有这么写,被拒绝之后反思简历的问题,决定直接照猫画虎。改简历耗费了我许多时间,因为中英文都要准备,好在得到一些帮助,最后也有了一份稍微像样的简历。这时候 yegle 回信说“我可以帮忙内推”。生活终于回到正轨,我可以继续准备面试了,当然,还有实验室的活。
六月份面了知乎和美团两家,在《最近的几个面试》这篇文章中有提到。其实之前还参加了 Indeed 的网测,什么都不会的我不出意外地挂了。拿到知乎和美团的口头 offer 多少让我有了一点信心。
七月份,宿舍的网络开始不稳定,实验室又比较吵,导致我没地方呆。遂决定去找旅馆住。其实住旅馆的计划之前就考虑过,因为我意识到和别人呆在一起不利于准备,可下不了决心,毕竟开销颇大。宿舍断网让我下定决心,也凑巧,离实验室两站地正好有个挺便宜的旅馆,一晚上才 149,比如家汉庭速8这种一天两百多的便宜太多。于是我就每天下班之后就去那住了。现在看来,这个决定真是太正确了,没有一个地方比旅馆更适合安静地准备面试。没有人来打扰你,你也不会打扰别人,如果在宿舍和实验室准备面试是和别人对线,那么在旅馆就是 free farm 状态。断断续续地,我在那家旅馆住了大约一个月,直到面完 Google 终面。
七月份 Google 的 recruiter 打电话过来,给我两个选项,一.七月份面试,可以免掉电面;二.八月份面试,但是得参加电面。在七月份,我的准备可以说还极度不完备,正处于疯狂刷题但是没有总结的状态,系统设计啥的更是碰都没碰过。于是我就选了八月面试。七月下旬迎来两周的高温假,我直接说不回家了。高温假似乎是在宿舍过的,因为网又好了,同学也回家了。八月六号电面,之前那篇文章里有讲这里不提。之后开始上班,我就又住到旅馆去了,并且果断旷工,因为距离八月十八号 on-site 只剩一周,必须排除一切干扰。下面说说面试情况,题自然是不能透露的,不要期待……
那天是我第一次来到 Google 北京办公室,原来就在清华南门旁边,之前完全不知道。远远地看到 Google 标志,进门之后前台给了个小牌子。我把牌子夹在袖子上,走进右边的一个房间,等待面试官到来。房间一端,几个 recruiter 在闲谈,另一端散座着几位同样来面试的学生。我坐下来,想了想要不要和他们打个招呼,却感到一种紧张的气氛弥漫在房间当中,我不敢说话。一个男人走进来,“XXX”,recruiter 叫了一个名字。被叫到的同学过去,和男人一起走了,原来面试官是这样把人领走的。几个中国面试官陆续过来,先于我来的几位面试者也一个个被领走,只剩我还在那坐着。recruiter 你一言我一语开始讨论买榨汁机的问题,我认识其中一个声音,是我的 recruiter。等了一会,终于进来一个人,是个东欧人,看来就是他没跑了。我跟着他上了四楼,进了一个小房间,里面有两台 Macbook。“Sit”,他说。这时候我发现电脑快没电了,就告诉他我这边 low battery,于是他起身去找电源……突然有去窥他屏的冲动,因为当时还没有出题,说不定可以多一分钟思考时间。最终忍住了。之后就是出题。他讲话我能听懂,但是声音小,加上有口音,所以还是比较费劲。题目就是很直接的那种,也顺利给出算法,但是复杂度算得一塌糊涂,最后还是他直接告诉我的。当时觉得要跪。
面完了,东欧人把我领出房间,带到第二面的房间。第二面是个中国大叔。这时我赫然发现,房间里还有个人,这不就是那天宣讲会的某学长么?大叔表示,某学长是来学习当面试官的,让我不用在意。然而整个面试过程,某学长似乎也一直在记录,搞得我分神。这一面是原题,于是直接分析了一下就开始写了。对了,这面是完全拿中文说的。写完代码时间还很多,又问了一些扩展的问题,比如怎么测试代码,怎么保证正确性。最后大叔说,我们来讲几句英文吧。于是我们就象征性地拿英文聊了几句。
我是上午面的,回到实验室不久就接到电话,说过了。不过我明显感到 recruiter 说的不那么肯定,大概是一面实在不太好吧。然后就约了周五下午三四面。
三面四面都是完全没见过的题,基本都是一边和面试官讨论需求一边写代码。三面偏设计,由于我一直搞不清面试官想要什么,代码写得颇为纠结。一个关键条件直到最后我才问清。我觉得写得很一般,但是结束之后面试官反而说面得不错。四面就是纯算法。本以为是个老题,结果需求完全不同。这题非常能体现 Google 的面试风格,就是让你觉得熟悉,但是又不一样。也是讨论了挺久需求,我基本一直在说想法,看面试官的反馈。好在想出来了,最后代码量也不大,顺利写完。
这之后的情形,我在《虽然去不了 Google,走到这步大概也不错了》里描述了一下。Google 要求提交成绩单,我还专门跑回清华一趟。这也是我第一次计算本科的 GPA,唉,果然惨不忍睹。因为 GPA 实在太低,面得又只能说凑合,当时我感觉自己不可能通过 hc,没想到居然过了。九月六号,recruiter 打电话来,恭喜我通过 hc。惶恐不安的等待终于过去了。
这周签了上海的 office,虽然没有实现直接肉翻的目标,但也算混进了 Google。总结一下其它面试结果吧:
Indeed:网测挂
Baidu:蜂巢内推,三面挂
Ali:内推失败,网测挂
Tencent:腾讯视频,批发价 Offer
知乎:Offer
美团:Offer
Hulu:没拿到内推,没参加网测
FreeWheel:简历无音讯
App Annie:简历投了三个月之后接到电话,居然要求实习,没去面
Facebook:某员工答应可以内推,之后无音讯
总的来说,我面的公司非常少,而且八月二十号之后就没有参加过任何技术面试了。感觉和其他人的面试时间不太重合。
最后,我想感谢下面这些帮助过我的人,和我没想起来但是同样帮助过我的人(排名不分先后):
林基远师兄,让我意识到进入 Google 是可能的,给了我巨量的建议,忍受了我长时间骚扰,让人敬仰
yegle 前辈,帮助我拿到内推的前辈,各个阶段都给过我指导性的建议
Vanessa,我的 recruiter,虽然是她的工作,仍然感谢她
我的父母,精神上的支持,还有必不可少的经济援助。准备面试真的花了不少钱。
姨、舅舅、舅妈,帮我改英文简历,指出各种我注意不到的细节格式问题
ototsuyume 前辈,告诉了我不少关于 Google 工作的信息
九章的各位老师,课程给我的帮助是难以想象的
聪聪和立杭师兄,无私地提供面试信息,分析之前面试中遇到的问题
李莉、张巧师姐,朱海帆师兄,在 team match 阶段解答了我的不少问题
陈思雅师姐,虽然我没怎么看她那本面试题集,但是让我认识到应该总结做过的题目
Quora 上的 Bob See,回答了我不少关于 team match 的问题
作为一个弱渣,Google 曾经是我想都不敢想的公司。没有他们的帮助,我没有一丝可能进入 Google。在人生的岔道口上,今年发生的事情将深刻改变我的人生轨迹。我永远感谢你们!