北美求职记(一):Microsoft

北美求职记系列文章

最近签掉了 offer,找工作的事情算是告一段落。在这里写一点面试体验和心得,希望对有兴趣去北美工作的朋友有所帮助。

先简单介绍下自己,国内硕士在读,明年毕业,没有牛 paper,也没参加过 ACM-ICPC 竞赛。在实验室做过内核、虚拟机和 Android 底层相关的研究工作,接过一些网页和移动开发的外包,2011 年开始在字节社兼职负责后台开发。另外也经常上 StackoverflowGitHub

这次决定直接申请美国的职位后,由于心里没底,不知道国外公司招聘的难度,所以一开始投了很多公司。几个大公司都找人内推或者直接投了,小公司也投了不少,比如 Foursquare、Path、Pinterest 和 Square 等都试了。当时甚至在手机上找了一圈应用,把可能涉及后端开发的应用都投了一遍。不过大多数公司都没给我安排面试,最后 Microsoft、Google、Facebook、Twitter 和 Hulu 这五家公司愿意给我面试机会。

阅读全文 →

Impossible is Nothing

虽然这一年还没结束,还是想为这一年写点什么。

一月到四月还是一如既往的波澜不惊的生活着。因为在一个创业公司兼职,做的事情比一年前有意思一些,但基本上还是实验室寝室两点一线,周末和 tt 出去逛逛。四月初去了一次杭州。

过年的时候和 tt 商量一起去台湾玩,但那时候去台湾还只是个完全没有谱的事情。三月底 tt 看到一个台湾自由行的优惠活动,四天内截止,两个人就这样一冲动报了去台湾的团购。四月准备好了各种手续,准备五月中旬出发。但是老实说,甚至在出发前的那一天,我都没觉得这件事情是彻底定下来了,或者说,总觉得去台湾玩这样一件事还是离自己遥远了点。也许是宅生活惯了,一下子这样进行一个离开大陆的持续 10 天的旅游让自己觉得太遥远了。去台湾我还是第一次坐飞机。

但是当下了飞机,双脚踏在松山机场的时候,我才意识到这一次台湾之旅真的成行了。

台湾这次旅游其实对我心理上的积极意义很大,不知道怎么描述,大致就是一件事原以为离自己很远的事情从慢慢部署准备到突然意识到已经成功了的感觉。

阅读全文 →

台湾旅游 tips

顺带把几个月前写的台湾旅游 tips 也放到这个博客来。

机票

  • 我们订的是去哪儿上的团购,每人 2799 元,包括往返机票、入台证和一张台北捷运卡。团购是中旅台湾部负责的,中旅的态度很不错,提供了不少台湾旅游相关的信息。

大通证、入台证

  • 办证需要的具体证件网上能搜到很多,这里就不细讲了。办理入台证需要的证件可以直接问旅行社,不同旅行社的要求可能会有细小的差异,比如在存款证明时间上。
  • 微博上的 @台湾自由行 前一阵子推荐几家大陆的低价入台证办理点,应该比较靠谱,可以参考下。

阅读全文 →

土耳其旅游 tips

刚从土耳其呆了两星期回来,我们的行程是 Istanbul(一天一晚),过夜大巴到 Göreme(三天两晚),过夜大巴到 Fethiye(三天两晚),过夜大巴到 Bursa(一天一晚),下午的轮船回 Istanbul(四天三晚)。趁着记忆还新鲜,写一点土耳其旅游相关的 tips。

阅读全文 →

Twitter Snowflake

这是一篇两年前 Twitter 开发团队写的文章,今天挖出来研究了一下。原文地址 http://engineering.twitter.com/2010/06/announcing-snowflake.html

Twitter 早期用 MySQL 存储数据,随着用户的增长,单一的 MySQL 实例没法承受海量的数据,开发团队就开始用 Cassandra 和 sharded MySQL 替代原有的系统。然而和 MySQL 不同的是,Cassandra 没有内置为每一条数据生成唯一 ID 的功能,因为在一个分布式环境下,很难有完美的 ID 生成方案。

阅读全文 →

恢复 Things Cloud 的同步功能

Things Cloud for iOS 的同步功能出来后一直不能正常使用,必须得先翻墙才行。用代理截了下请求后发现 Things Cloud 用的同步服务器是 multithreaded.thingscloud.appspot.com,难怪一直没法访问。 好在 Things Cloud 同步走的是 HTTPS 协议,所以恢复方法也很简单,换用一个没有被污染的 DNS 服务器就好。对于越狱了的机器,也可以直接修改 iOS 上的 /etc/hosts 文件,在里面添加下面两行地址。 203.208.46.161 multithreaded.thingscloud.appspot.com 203.208.46.161 thingscloud.appspot.com 阅读全文 →

Android 中点击事件的判断

最近实验室做的一个东西会向 Android 应用快速注入一系列触屏事件,模拟用户的点击。但是我们发现当按下和弹起的 MotionEvent 之间时间间隔过小(例如小于 100ms)时,会导致该事件被忽略。看了代码后发现 Android 中按下和弹起之间时间间隔要在 115ms 以上才会被认为是一个点击事件。这里结合 Android 的源码分析一下点击事件的产生过程。

阅读全文 →

Scala 中的协变和逆变

Java 数组

先来看一个 Java 中的例子,Java 中的数组是协变的。也就是说,一个 String 数组(String[])是可以被当成 Object 数组(Object[])处理的:

String[] a1 = { "abc" };
Object[] a2 = a1;

这种协变虽然在读取数组内容时不会有问题(a1 数组中的 String 元素可以被当成 Object 使用),但是修改数组内容时就会出现无法在编译期检测出来的错误了:

a2[0] = new Integer(17)
String s  = a1[0]  // java.lang.ArrayStoreException

阅读全文 →

存储是移动应用性能的瓶颈?

Revisiting Storage for Smartphones 是今年 FAST 会议上的最佳论文,这篇论文提出了一个违背直觉的观点,很有意思。这里简单介绍一下这篇论文的内容,有兴趣的朋友可以直接访问前面的链接下载原文或是观看现场录像。

传统的观点认为,移动应用性能的主要瓶颈在网络和 CPU,而闪存的读写速率明显高于网络传输速度,不会成为性能的瓶颈。然而,根据上图作者给出的关于移动存储性能的图例(纵坐标单位为 Mbps,本文图片均来自演讲 slides 和原论文),我们可以看到,虽然移动存储顺序读写的性能明显高于 wifi 和 3G,但是随机写的性能却比它们差很多,因此移动存储成为应用性能瓶颈是完全有可能的。

阅读全文 →

用 Git 管理命令行配置

以前部署新机器时都要把一堆配置文件 scp 过去,今天折腾了下用 Git 统一管理这些配置文件。

做起来很简单,创建一个 dotfiles 目录,把所有要同步的配置文件都放到这个目录下,并重命名去掉文件名开头的点,以免被 Git 忽略。写了一个脚本链接这些配置文件到 HOME 目录:

#!/usr/bin/env ruby

safe_mode = ARGV.include? '--safe'

files = %w(zshrc tmux.conf gitconfig vimrc emacs gitignore_global LS_COLORS)
files.each do |file|
  unless safe_mode and File.exists?("#{ENV['HOME']}/.#{file}")
    %x(ln -s -i -v $PWD/#{file} ~/.#{file})
    puts ".#{file} linked" if safe_mode
  end
end

阅读全文 →