## 问题1:如何知道一些靠谱的公司?
首先,了解一下“牛人”都选择去哪些公司。如果公司名气不大,可以去流量排名上去看他处于什么地位,公司有没有上市,它的融资规模,还可以从Linkedin看它的员工是否优秀。
在硅谷,大家非常热情地谈创业谈机会,我们也通过自己的一些观察和积累,看到了不少最近几年才涌现出来的热门创业公司。给大家一个列表,这个是华尔街网站的全世界创业公司融资规模评选(<http://graphics.wsj.com/billion-dollar-club/> )。它本来的标题是“Billion Startup Club”(十亿美金创业公司俱乐部),不到一年的时间,截至2015年1月17日,现在的排名和规模已经发生了很大的变化,如图1-3所示。
第一,估值在10Billlon(百亿美金)的公司达到了7家,而一年前一家都没有。第二,第一名是中国人家喻户晓的小米,第三,前20名中,绝大多数(八成)在美国,在加州,在硅谷,在旧金山!比如Uber、Airbnb、Dropbox、Pinterest。第四,里面也有不少以相似模式取得成功的公司,如Flipkart就是印度市场的淘宝,Uber与Airbnb都是共享经济的范畴。所以大家还是可以在移动(Uber)、大数据(Palantir)、消费级互联网、通信(Snapchat)、支付(Square)、O2O App里面寻找大的机会。
![ig_oppo.jpg](https://box.kancloud.cn/6f1e69900d18af181ca938409a41ab5c_600x471.png)
图1-3 十亿美元创业公司俱乐部
## 问题2:硅谷的Startup有什么技术方案?
分类介绍如下,如图1-4所示。
编程语言:Python、Scala、Swift for iOS、C/C++、Java等主流开发语言;
前端:Play、Video.js、Jade、HTML5等;
框架容器:Docker、Mesos、Vagrant等;
日志监控:Datadog、Sumologic、Akka、Kafka等;
后台数据处理:Hive、Scalding、EMR、Big Query等;
![https://lh4.googleusercontent.com/CA5_F3QLluHnX6IVgB910SaGnPStCgPsJowhGWyJlz4zXq-fi_rBKdK_XJoE43fewpyR308A42RyoOXcT-lFI2kJPmFytrkQRrBgjC0ZkBp7RoCBUpfRwIQXmohtbpFATYIfqsA](https://box.kancloud.cn/c188c68b542eeca6084243baf5b5b8d8_600x301.png)
图1-4 硅谷常用技术矩阵
虚拟机:EC2等云服务;
服务器:Nginx等;
配置工具:NPM、Zookeeper、Puppet、Gradle等;
信号通知:SQS等;
代码托管:Github、SVN等版本控制工具;
数据存储:Cassandra、MySQL、S3、Redshift等;
内部工具:Phabricator、Slack、Google Docs、RelateIQ、Jira等协作工具。
以Coursera为例,作为创业公司,Coursera力图保持敏捷和高效。从技术上来说,所有的内容都是在基于AWS开发,可以想象随意启动云端服务,做一些实验。公司大致分成产品组、架构组和数据分析组。因为公司比较新,所以没有什么历史遗留迁移的问题。大家大胆地使用Scala作为主要编程语言,采用Python作为脚本控制,比如产品组就是提供课程产品,里面大量使用Play Framework、Javascript的Backbone作为控制中枢。而架构组主要是维护底层存储、通用服务、性能和稳定性。笔者所在的数据组,一部分是对商业产品、核心增长指标做监控、挖掘和改进;另一部分是搭建数据仓库,完善与各个部门的无缝数据流动,也用到很多技术;例如使用Scalding编写MapReduce程序,也有人做AB testing框架、推荐系统,尽可能用最少人力做有影响力的事情。其实除了开源世界,Coursera也积极使用第三方的产品,比如Sumologic做日志错误分析,Redshift作为大数据分析平台,Slack做内部通信。而所有的这些的目标就是想解放生产力,把重心放到用户体验、产品开发和迭代上去。
## 问题3:什么时候才知道准备好面试?
可以从如下几个方面来衡量。
算法是否过关,是否能写出递归和动规;
Coding是否过关,是否能在编译器中写出Bug Free;
Design是否过关,是否能给出Tradeoff;
项目经历整理,能够流利说出架构、难点、自己的贡献;
加分项:Github、Blog、参与Open Source。
## 问题4:如何拿到美国工作签证?
要来美国工作,一般是要求具有H1B(工作签证)的身份,获得该身份需要有雇主向劳工局提出申请(sponsorship)。根据现在的形式,每年的名额都是一抢而空,那么这就需要抽签决定。在4月1日之前提出申请,4月1日之后开始抽签,如果是在美国获取硕士以上的学位,可以有优先级,抽取概率更高,而根据今年情况,普通的抽中几率是50%。即便没有抽中,如果是拥有美国的硕士学位,可以使用OPT照样工作,并且可以省社会安全税(Social Security Tax)。而如果是海外的学位,只能等来年再抽签。
像Google、Facebook这种全球性公司,他们也会提供其他国家办公室的机会,工作一年后再通过L1或者H1B继续到美国工作。另外如果你抽中了H1B,那么如果以后再跳槽,则可以通过办理转职(transfer)沿用之前的名额,而不需要再次抽签。H1B每3年可以续一次,最多6年。如果H1B到期时已经申请绿卡,那么还是可以延长H1B的有效时间,直至绿卡生效。
## 问题5:我不是算法大牛,不是ACM队员,听说Google,Facebook有很多牛人才能进,那我怎么能拿到好Offer?
首先要有信心,算法不是想象那么难。原因有以下两个方面:
第一,因为面试常见的算法就那么几种。只要你努力去总结归类相似题目,只做很少的题,就可以举一反三掌握很多的题。不要盲目关注数字。做题质量非常重要。标准是:你做过的题目,让你再做一次,你就能“完美解决”。
第二,即使你知道一道题的解法,你未必能写好。因为你可能每次写出来的程序都很随性,这样会漏洞百出。程序员是一个非常讲究严谨性的职业,如果你在总结题目的时候能够找到这些题目的模板,把模板提炼好,碰到类似的题目,可以一边写模板,一边想想怎么在模板上做一点简单的改动。这样既节省时间又保证不会出错。
## 问题6:从其他专业转做计算机专业的该怎么准备?
1.让自己更专业。例如,你的简历只能放和计算机有关的东西,其他东西再牛也不能发挥用处(如学生会主席)。如果简历还是很空,就多去做项目。实在没项目,就把非计算机专业的项目改写得更接近。
2.在某一方面达到工程师实力。临时转行时间短,找一个容易入手的准备,如果你以前做的事情跟数据有关,就申请数据分析师(Data Analyst)。如果你本来就会一些基本技术,可以做前端,用JavaScript、HTML和CSS,去真正做一个自己博客。如果对产品感兴趣,就玩Django、Ruby on Rails这样的网站框架,了解一个网站是怎么搭建起来的。如果对移动开发感兴趣,就写几个在iOS或者Android上的App。这样做的好处是,简历不空,如果问到,可以驾轻就熟。如果不相关,坦诚相见,说由于我是转行的,在这方面不熟悉,可以尝试一下。也可以直接告诉面试官,我是转行的,我对计算机很感兴趣,做了这么这么几个项目。于是面试官不会问你难题。而实际上你早就准备好了,超出面试官预期,会得到一个面试高分!
## 问题7:面试时候如何表现自己体现沟通能力?
首先你要站在面试官的角度思考问题。面试官要招你进去当同事,你希望同事怎么样?
你可以反复和面试官交流自己的想法,得到面试官认可以后再动手写。可以讲讲你是怎样想到这个思路的。从而展现你的沟通能力。记住,你并不是要说服他接受你的想法,而是要把你的想法解释给他听。面试官提出质疑的时候,第一,不要觉得面试官什么都不懂,怎么这都不知道(其实他只是看一下你是否真的懂);第二,面试官比你经验丰富得多,很有可能就是你犯错了,赶紧想想是不是真的有问题。
## 问题8:面试中出了Bug怎么办?
避免Bug很重要,这个需要我们平时不断地练习,按照上述的方法准备,还是可以避免一些“坑”的。但碰巧你可能不在状态,写出了Bug被面试官指出,是不是就挂了呢?
首先别担心,出Bug很正常,也许面试官来面试你之前正在Debug。衡量一个程序员能力的标准,并不是他能想出多牛的算法,而是程序员在遇到问题的时候分析和解决问题的能力。而出Bug的时候,正是展现你是否是一个合格程序员的时候!
Debug的流程如下所示:
1.通过测试用例定位Bug所在位置;
2.不要立即修改代码,重新梳理逻辑。因为很有可能还有其他Bug;
3.走完所有逻辑之后,心里有数怎么改了,再动手开始改;
4.用测试用例再走一次新的代码;
5.在整个过程中,不停地告诉面试官你在做什么(在不影响正常写程序的情况下)。
这样,成功排解Bug,不但不会减分,还会因为你优秀的Debug能力和与此同时展现出来的沟通能力而加分。
## 问题9:如何做出最后选择Offer?
在考虑Offer之前,先对公司做个研究,比如这家公司是什么规模,产品是什么,Glassdoor员工如何评价的,你的职位你喜欢吗?这就跟选学校一样,如果选错了,也是需要走很多弯路。我们个人的参考是首先这家公司是上升期的,产品是否有爱,团队是否比较强,能否学到东西。对公司分类,例如Hortonworks这种是纯技术性的,面向企业级的,可能没多少人知道,而Uber是大众消费性,很多朋友都用过。现在的热点是移动互联网,大家也可以多考虑这一块。
如果上市的公司,会给限制性股票,分3~4年行使期权,创业公司一般给期权,不同就是限制性股票是白送的,不需要自己掏腰包,期权需要自己买入,不同时期价格不同,但股票交的税非常高,有些期权是长期避税的。最后也要考虑你的兴趣和对风险的承受能力,如果去大公司做个螺丝钉,实现共产主义生活也无可厚非。去小公司压力大,成长快。但也要做好失败的准备,看看当年Zynga教训。
了解了面试的基本过程,让我们回到正题,按章节梳理技术面试的要点。
- 内容提要
- 作者简介
- 前言
- 我的故事,你的故事
- 现状
- 目的
- 特色
- 第1章 简历、面试和Offer
- 1.1 简历
- 1.1.1 格式
- 1.1.2 内容安排
- 1.1.3 描述技巧
- 1.2 面试
- 1.2.1 HR
- 1.2.2 技术面试官
- 1.2.3 老板
- 1.3 Offer
- 1.4 常见问题
- 1.5 工具箱
- 第2章 数组和字符串
- 2.1 知识要点
- 2.1.1 数组
- 2.1.2 哈希表
- 2.1.3 String
- 2.2 模式识别
- 2.2.1 使用哈希表
- 2.2.2 利用哈希表实现动态规划的思想
- 2.2.3 String相关问题的处理技巧
- 2.3 工具箱
- 第3章 链表
- 3.1 知识要点
- 3.2 模式识别
- 3.2.1 链表的基本操作
- 3.2.2 哑节点
- 3.2.3 Runner和Chaser
- 3.2.4 遍历并处理节点
- 3.2.5 交换节点的问题
- 3.2.6 同时操作两个链表
- 3.2.7 倒序处理
- 3.3 工具箱
- 第4章 栈和队列
- 4.1 知识要点
- 4.1.1 栈
- 4.1.2 队列
- 4.2 模式识别
- 4.2.1 通过栈实现特殊顺序的读取
- 4.2.2 “Save for later”问题
- 4.2.3 用栈解决自上而下结构的问题
- 4.3 工具箱
- 第5章 树和图
- 5.1 知识要点
- 5.1.1 树
- 5.1.2 字典树
- 5.1.3 堆与优先队列
- 5.1.4 图
- 5.1.5 图的遍历
- 5.1.6 单源最短路径问题
- 5.1.7 任意两点之间的最短距离
- 5.2 模式识别
- 5.2.1 利用分而治之(D&C)策略判断树、图的性质
- 5.2.3 树和其他数据结构的相互转换
- 5.2.4 寻找特定节点
- 5.2.5 图的访问
- 5.3 工具箱
- 第6章 位操作
- 6.1 知识要点
- 6.2 模式识别
- 6.2.1 基本的位操作
- 6.2.2 位掩码
- 6.3 工具箱
- 第7章 面向对象的设计
- 7.1 知识要点
- 7.1.1 设计题解答要领
- 7.1.2 模拟面试
- 7.1.3 抽象、面向对象和解耦(Decoupling)
- 7.1.4 继承/组合/参数化类型
- 7.1.5 设计模式
- 7.2 模式识别
- 7.3 工具箱
- 第8章 递归和动态规划
- 8.1 知识要点
- 8.1.1 构建从子问题到最终目标的方法
- 8.1.2 递归的空间与时间成本
- 8.1.3 自底向上与自顶向下
- 8.1.4 算法策略
- 8.2 模式识别
- 8.2.1 用动态规划(自底向上)解决收敛结构问题
- 8.2.2 最长子序列类型的问题
- 8.2.3 用Memorization(自顶向下)解决收敛结构问题
- 8.2.4 用回溯法(自上而下)解决发散结构问题
- 8.2.5 用D&C策略解决独立子问题
- 第9章 排序和搜索
- 9.1 知识要点
- 9.1.1 常见的内排序算法
- 9.1.2 常见的外排序算法
- 9.1.3 快速选择算法
- 9.1.4 二分查找
- 9.2 模式识别
- 9.2.1 动态数据结构的维护
- 9.2.2 对于有序/部分有序容器的搜索,用二分查找
- 9.2.3 数据范围有限、离散的排序问题
- 9.2.4 Scalability & Memory Limits 问题
- 9.3 工具箱
- 第10章 测试
- 10.1 知识要点
- 10.1.1 测试现实世界的物体、软件或函数
- 10.1.2 故障排除
- 10.2 模式识别
- 10.3 工具箱
- 第11章 网络
- 11.1 知识要点
- 11.1.1 网络分层
- 11.1.2 路由
- 11.1.3 常用网络统计指标
- 11.1.4 TCP vs. UDP
- 11.2 模式识别
- 11.3 工具箱
- 第12章 计算机底层知识
- 12.1 知识要点
- 12.1.1 进程vs.线程
- 12.1.2 上下文切换
- 12.1.3 系统调用
- 12.1.4 Semaphore/Mutex
- 12.1.5 死锁
- 12.1.6 生产者消费者
- 12.1.7 进程间通信
- 12.1.8 逻辑地址/物理地址/虚拟内存
- 12.1.9 文件系统
- 12.1.10 实时vs.分时操作系统
- 12.1.11 编译器
- 版权信息
- 看完了