## 問題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里面尋找大的機會。

圖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等;

圖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 編譯器
- 版權信息
- 看完了