2014年2月4日星期二

工作一年有感

算算到今日就在Pinterest工作一年了,仔细想想这一年收获颇丰。

为什么我当初会选择来Pinterest工作?鄙人不才,没有能力拿到Facebook的offer。算算现在Facebook当时给我周围的同学的offer现在的价值,都已经翻了一翻,而Pinterest的价值却还没有长,如果pinterest未来失败的话,后悔肯定会是有的。
想当初面试的时候,其实最想去的是quora和dropbox,因为面试我的人实在太牛逼了。现在想想觉得quora确实没有什么意思,但是dropbox还是很吸引人的。
除去上面几家,那么剩下最有兴趣的就是pinterest了,于是就来了。

说说我的同事们,我一直觉得和聪明的人一起工作在不管是在哪里都会成功的,这也是当初quora和dropbox吸引我的原因,期初我并不知道pinterest太多的牛人,但是加入之后我就深深的被我的老板和我的同事们折服了。
Pinterest对外来说,估计最出名的员工之一就是Tracy Chou了,美丽,聪明,做事情认真负责。可是现在我觉得最优秀的员工就是我的manager Hui Xu和mentor Charles了。Hui Xu在Google就很牛,短时间就做到了Stuff Eng,而且做了Google的realtime index,review我的design和code都非常的细致,期初我觉得有些严格到吹毛求疵,但是如今他不再review我的code的时候,我开始经常反复思考如果他能review得话会有多好。
Charles来自Amazon,后来也在Amazon旗下的IMDB,A9工作过,是很牛的eng。他对Distributed System理解很深刻,对code,project的要求很高。可以说看他写过的code是一种享受,对自己的提高非常大。因为有Hui和Charles的指导,我有时候觉得在Pinterest当一个工作狂是一种享受。
另外真心觉得在这里工作比在UCLA读Phd要累很多,可能是我当初不够认真努力吧。

我的收获颇丰,其主要原因有两点,一点是team size比较小,另一点是睡眠时间比较少。Team size比较小,当我刚加入的时候,我们team刚把search的infrastructure写好,然后开始投入recommendation system当中。我作为新手,被安排去维护和更新我们的search infrastructure。所以我可以接触到很多项目,做了autocomplete,search quality improvement,search query classification,search internationalize。还有一直到今天还在做的realtime search和新的search infrastructure。我们的小search team逐渐长到今天的4个人,我也从一个初出茅庐的小屁孩成长到要独立面对问题去做一些decision的小屁孩,不管是完成project的能力还是解决问题的能力,我都有很大提升。


对未来有很多期待,最期待的无非就是Pinterest在未来的三四年能成功上市。为了达成这个目标,我一定要好好给我认识的牛人推销Pinterest,短时间内的大目标就是把胡伯涛和郭华阳拉到公司里来。拉更加senior的eng这个任务就让那些senior eng去完成吧。还有一点就是要学会理财,半年来没有怎么存钱,如今到回家的时候发现钱不够用,真是拮据啊,希望今年的理财不要那么糟糕。

2014年1月17日星期五

快一年了

工作快一年了,多多少少有些感触,本来想等到一年之后写个一年总结,但是白羊座本来就是个急性子,所以今天想到了整理一下自己的bookmark,因为想读得东西读不玩了所以就忍不住要说点什么。

每天基本上要打开我的feedly刷新一下,一共订阅了49个sources。从前在Google Reader上订阅的更多,因为那里我年轻的时候订阅了很多女明星,女神的blog,谁知道很久以前他们都不写blog了,所以如今移民到feedly我就把他们都删掉了。剩下49个sources里有那么2个是动漫相关,3~4个是IT新闻有关,另外的都是技术博客,推荐那么几个,等到工作一年之后再讲。

平时看看技术博客,大多数都一扫而过,因为有的太过理论,有的是讲新技术,并不适用,碰到好的都会单独放在bookmark里。今天就是看到bookmark里东西太多,而且大多是计划要看但是没看的。所以不得不过来吐槽。

今天整理bookmark,发现:

和Guitar相关的有5个,但是四大和弦到现在还没有练会。
Javascript看了那么5个网页,但是没有什么大project要用到它,以后想用还要从新学。
Pinterest内部的收藏夹也就11个网页,还有很多没有在里面的常用的大多也都记住了。
想学习Go,买了一本书,也收藏了10个网页,现在基本处于能看懂的状态,自己写还要查很多文档。
MTG,PAD,For Fun什么的收藏了14个网页,比较推荐的就是The Coding Love,而且每周一我都会看Rich kids of Instagram激励自己。
除了Feedly之外,还收藏了几个IT新闻的网站。
Research有关的东西其实数数也就比较仔细的看了19篇,而且都没掌握。
Engineer有关的东西比较仔细的看了43篇,而且都不会实现。
收藏了但是还没来得及学习的东西还有40+篇,刚入职一周可能收藏个1篇,现在经常1天就收藏几篇,目测这个队列是只会增长不会减小了。


写完发现自己推荐的也就是the coding love和rich kids of instagram这样娱乐网站,总体评价就是自己太弱所以只能推荐这些了。

2013年6月12日星期三

[Linux] Hbase shell

# Use for commands:
help 'command', status, list, describe 'tablename'
*The status shows the basic status of the cluster.
status 'simple'
status 'detailed'

# Create tables:
create 'tablename', {NAME=>'family 1'}, {NAME=>'family 2'}
create 'tablename', 'family1', 'family2'

# Scan table:
scan 'tablename'
*Restrict columns: {COLUMNS=>'family:'}, {COLUMNS=>['c1', 'c2']
*Restrict number of results: {LIMIT=>number}
*Restrict start / stop row: {STARTROW=>'start row key', ENDROW=>'end row key'}

# Count:
count 'tablename', 5000
*Here 5000 is means report results every 5000 rows.

# Delete:
delete 'table', 'rowkey', 'colkey(family:column)'
delete 'table', 'rowkey'
*Delete all rows in the table.
truncate 'tablename'

# Remove table:
*First you need to disable the table, and then you can drop table.
disable 'tablename'
drop 'tablename'

# Change column family:
*Must disable table first, and then change column family
alter 'tablename', {NAME=>'family', METHOD=>'delete'}

- Hbase files stored as HFiles in HDFS.
- sorted key/value pairs and an index of keys.
- /hbase/tablename/region/column-family

[Linux] Screen command

Use screen on remote machine.

screen [-AmRvx -ls -wipe] [-d name] [-h lines] [-r name] [-s] [-S name]

screen -r pid.name: recover a screen work.
screen -d -r pid.name : recover a screen work, kick off other user on this work and start.
screen -ls
screen -m : start a new screen.
screen -dm : a new screen start with detached model.
screen -p number or name

Ctrl + a + d : quit screen with process still running.
exit : quit screen.

Ctrl + a + c : create a new window.
Ctrl + a + w : list windows.
Ctrl + a + n : next window.
Ctrl + a + p : previous window.
Ctrl + a + 0 ~ 9 : switch between window 0 to 9.
Ctrl + a + K : quit current window and jump to next.

2013年2月10日星期日

[Work] Using Git

Working in a small company will need git to commit your code and cooperate with other people.
Here is a list of command lines usually used.

Clone the main repository to your workspace:
git clone git@github.p.com:user/project.git

Add your fork:
git remote add myname git@github.p.com:user/project.git

Reset to latest code by running:
git checkout master
git fetch origin
git reset --hard origin/master

Setup your branch:
git branch your_branch_name

Make changes to your code and push it for others to see:
git push myname new_feature_branch

Hacker way, commit often:
git commit -a -m "message"

Modify commit list:
git rebase -i master

Setup git default edit and global information:
git config --global user.name "your name"
git config --global user.email "your email"
git config --global core.editor vim

More about:
git diff master
git pull

Other git commands:

git config --global user.name "robbin"   
git config --global user.email "fankai#gmail.com"
git config --global color.ui true
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global core.editor "mate -w"    # 设置Editor使用textmate
git config -1 #列举所有配置
用户的git配置文件~/.gitconfig Git常用命令 查看、添加、提交、删除、找回,重置修改文件
git help   # 显示command的help
git show            # 显示某次提交的内容
git show $id

git co  --    # 抛弃工作区修改
git co  .           # 抛弃工作区修改

git add       # 将工作文件修改提交到本地暂存区
git add .           # 将所有修改过的工作文件提交暂存区

git rm        # 从版本库中删除文件
git rm  --cached  # 从版本库中删除文件,但不删除文件

git reset     # 从暂存区恢复到工作文件
git reset -- .      # 从暂存区恢复到工作文件
git reset --hard    # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

git ci 
git ci .
git ci -a           # 将git add, git rm和git ci等操作都合并在一起做
git ci -am "some comments"
git ci --amend      # 修改最后一次提交记录

git revert <$id>    # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD     # 恢复最后一次提交的状态
查看文件diff
git diff      # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2>   # 比较两次提交之间的差异
git diff .. # 在两个分支之间比较 
git diff --staged   # 比较暂存区和版本库差异
git diff --cached   # 比较暂存区和版本库差异
git diff --stat     # 仅仅比较统计信息
查看提交记录
git log
git log       # 查看该文件每次提交记录
git log -p    # 查看每次详细修改内容的diff
git log -p -2       # 查看最近两次详细修改内容的diff
git log --stat      #查看提交统计信息
tig Mac上可以使用tig代替diff和log,brew install tig Git 本地分支管理 查看、切换、创建和删除分支
git br -r           # 查看远程分支
git br  # 创建新的分支
git br -v           # 查看各个分支最后提交信息
git br --merged     # 查看已经被合并到当前分支的分支
git br --no-merged  # 查看尚未被合并到当前分支的分支

git co      # 切换到某个分支
git co -b  # 创建新的分支,并且切换过去
git co -b    # 基于branch创建新的new_branch

git co $id          # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git co $id -b   # 把某次历史提交记录checkout出来,创建成一个分支

git br -d   # 删除某个分支
git br -D   # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
 分支合并和rebase
git merge                # 将branch分支合并到当前分支
git merge origin/master --no-ff  # 不要Fast-Foward合并,这样可以生成merge提交

git rebase master        # 将master rebase到branch,相当于:
git co  && git rebase master && git co master && git merge 
 Git补丁管理(方便在多台机器上开发同步时用)
git diff > ../sync.patch         # 生成补丁
git apply ../sync.patch          # 打补丁
git apply --check ../sync.patch  #测试补丁能否成功
 Git暂存管理
git stash                        # 暂存
git stash list                   # 列所有stash
git stash apply                  # 恢复暂存的内容
git stash drop                   # 删除暂存区
Git远程分支管理
git pull                         # 抓取远程仓库所有分支更新并合并到本地
git pull --no-ff                 # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fetch origin                 # 抓取远程仓库更新
git merge origin/master          # 将远程主分支合并到本地当前分支
git co --track origin/branch     # 跟踪某个远程分支创建相应的本地分支
git co -b  origin/  # 基于远程分支创建本地分支,功能同上

git push                         # push所有分支
git push origin master           # 将本地主分支推到远程主分支
git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin    # 创建远程分支, origin是远程仓库名
git push origin :  # 创建远程分支
git push origin :  #先删除本地分支(git br -d ),然后再push删除远程分支
Git远程仓库管理 github
git remote -v                    # 查看远程服务器地址和仓库名称
git remote show origin           # 查看远程服务器仓库状态
git remote add origin git@ github:robbin/robbin_site.git         # 添加远程仓库地址
git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址)
git remote rm        # 删除远程仓库
创建远程仓库
git clone --bare robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@ git.csdn.net:~      # 将纯仓库上传到服务器上

mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
git remote add origin git@ github.com:robbin/robbin_site.git    # 设置远程仓库地址
git push -u origin master                                      # 客户端首次提交
git push -u origin develop  # 首次将本地develop分支提交到远程develop分支,并且track

git remote set-head origin master   # 设置远程仓库的HEAD指向master分支
也可以命令设置跟踪远程库和本地库
git branch --set-upstream master origin/master
git branch --set-upstream develop origin/develop

2012年11月16日星期五

找工作的感想(最后一部分)


从中篇后,又来了三藩两趟,这两次都下雨,而我又碰巧喜欢雨天,感觉不错。
公司:
比起从前,又多见识了四家公司,Twitter,Circle,PInterest和Dropbox。其中前三家都可以给我offer,Dropbox因为四个小时前才结束面试,所以结果没有出来。
除了Circle,说说剩下三家给我的感受。
Twitter很大,里面的人也不错,但是最大的问题就是我觉得他们的HR干活实在让面试者不爽。第一个HR联系我,安排了电话面试,然后说面的很好,然后就人间蒸发了。第二个HR联系我,安排我写一个程序然后发过去,然后就人间蒸发了。第三个HR联系我,我说我现在很着急,于是他安排了第四个HR联系我。第四个HR给我安排了电话面试,然后onsite。第五个HR联系我说有Offer,第六个HR会和你谈。第六个HR现在联系了我,说周一给我打电话。整个过程耗时将近一个月!
从前我听Amber说Twitter联系他,全天面试,Offer当场就出来,所以我对Twitter充满了好感,可是如今看来,Twitter对我既不热情,我也没有能力在他们那里作出impact,所以感情就淡了。
PInterest很好,办公室里一片红火,30多个程序员,面试我的主要是Search Team和Recommendation Team。其中有一个人是从Quora跳槽过来,还给我对比了Quora和PInterest之间的区别。我对PInterest印象不错,估值很高,用户多,最近有很详细的赢利计划,给我谈了好多这方面的可行工作。要是现在是7月初刚和Yiting Wang她们吃完饭的时候,我肯定就去PInterest了!可是时光飞逝,我十月一日投的简历,他们上周联系我加面试虽然只耗了不到一周,但是这让我等的有点久,有些失望。
Dropbox一看就是geek集中营,面试我的人清一色从MIT毕业,感觉他们是想把MIT搬到加州了。听他们的早起员工Albert讲Dropbox的成长故事,就是把MIT的内部云存储实现出来给大家使用。就这一点来看,我觉得Dropbox实在是太Cool了!非常的理想化!
面试题目:
面试题也小总结一下吧,电话面试都是一些常见的算法题目,除了算法题目有一些其他的问题不妨说说。比如C++的vector和list有什么使用的区别?C++的virtual function有什么好处或者短处?什么是deadlock?如何使用mutex和semaphore?浏览器里输入网址后进行的一系列工作流程?
常见的系统面试题:
如何实现短网址服务?背后数据库,数据分布怎么设计?
如果提供一个服务让人实时知道附近的人,附近的名胜,附近的朋友等,要如何设计该系统,数据如何存储分布?
如果要设计一个million people实用的聊天室,当然要分若干小聊天室或者聊天主题了,那么要如何设计?数据如何分布,如何发送消息?
然后有一个网站,其题目与面试题目相差无几,可以参考:
http://codility.com/

2012年11月8日星期四

找工作的经历(杂谈)


这不是最终篇,但是因为被这家公司的个人魅力吸引了,所以特地写一写今天的经历。
美国版的陌陌,但是与陌陌有着不同的理念。那就是Circle,感兴趣的人可以下载手机客户端:http://discovercircle.com/
这里能下载到circle的测试版本,据说一周后会有更新,我今天提前在他们创始人那里看到了更新后的circle,实在是太帅了,可以说是我见到的HCI最友好且酷的一个软件。
软件界面如图所示,可以显示人,以及一些与你的相关性,左下角可以看朋友,右下角可以看推荐的人,新版本向左滑可以看到朋友列表,向右划可以看到附近的人,以及这些人为什么会推荐给你。当你把手机放平后,新版本甚至可以有增强现实功能,看到你面前哪个方位有多远会有你的朋友,这点是我一直想有的功能,避免你和朋友约见在某个地方却找不到对方的尴尬。

创始人Evan的经历很神奇,他本科学过心理学,而且美国人貌似天生喜欢交朋友。美国人喜欢搭讪,但是搭讪毕竟会感到尴尬,比如你在咖啡厅见到一个美女,想和她聊聊天,但是过去Say Hi之后没有下文的情况很多,其实很多时候是因为彼此没有mutual trust,和陌生人聊天是非常困难的一件事情。
但是你可以想象,假设你看到一个美女头上写着想认识Stanford的人,或者喜欢某个地方的小乐队,碰巧你毕业于Stanford,也了解那个小乐队,并且美女知道你的这些情况,那么你和美女搭讪就不在尴尬了,说不定两个人聊的很high。还有一个情况是加入你来自清华,到Stanford读书,从前搞过竞赛,当你看到朱晨光的时候,你发现他也来自清华,搞过竞赛,那么肯定有很多想说的话,在异地交个朋友不容易。如果对方知道了这些,那么他就不会把朱晨光认成朱泽园,造成尴尬的局面。
这就是Circle的来源,同样是找周围的朋友,与陌陌不同的是他更关注两个人的相关性,更关注推荐两个有相互经历,有mutual trust的人认识彼此。

创始人也曾经做过实验,在咖啡厅里带着一个白板,上面写着毕业于Yale,在Stanford读计算机,去过非洲!这样在咖啡厅就会有很多人找他搭讪,聊天,还会觉得去非洲的经历很酷。这让我回想起穿着Google Codejam衣服在UCLA校园里走路的时候,曾经被搭讪过两次,认识了一个搞密码学的印度人。穿着Facebook Hackthon的衣服在Whole Food旁边的咖啡桌那,有人搭讪我Hackthon拿了第几名,做了什么。美国人很喜欢social,所以如果有什么东西能帮助你们建立起mutual trust,那么对交友很有好处。

他们公司的创始经历也很神奇,目前6~7个人。刚开始是他和两个印度人,要创办公司,但是印度人没有H-1B visa怎么办?他们对办理这个步骤都不是很熟悉,于是三个人一起去了印度!在印度工作了三个月,并且通过Evan的联系,帮助两个印度人办理了H-1B visa,然后回到Palo Alto继续创业工作。所以说很多人担心没有去小公司不给办理H-1B怎么办?其实完全不用担心,如果小公司真的要你,那么一定会帮你搞定这一切的。

同时,我也不得不说说他们的员工,个人魅力真的很吸引人。有三个印度人曾经参加过ACM ICPC,进入过World Final,而且还和我一年去的World Final,也就是2008年。他们问我认不认识ACRush,是不是和楼教主一个队,然后又对我表示了对楼教主的崇拜,我也给他们介绍了我的牛队友唐文斌(Open)和龙凡(Ted)。

这些印度人里有一个是Topcoder India的第一名,同时也是参加Google Codejam决赛的最年轻的人,他给我讲当初他们做了一个在对视频进行OCR,方便用户搜索视频中出现的字的软件,可惜没有卖掉T.T。还有一个印度人是物理世界决赛的金牌,当年印度高考的第六名。设计师musho在俄罗斯拿过很多设计比赛的第一名。真心是一个生气的集体。

我深深的被这个高智商的集体吸引了。
该公司介绍结束。
三藩好冷,今天在雨中走了很久,早上出门下雨被雨淋,中午去Stanford找朱晨光,胡伯涛和陈丹奇被雨继续淋,晚上回家的时候又被雨淋了,所以说我每个冬天来湾区都会感冒,怎么破!