Skip to content

Ider

沉淀我所学习,累积我所见闻,分享我所体验

Primary Navigation Menu

Menu
  • Home
  • Why Ider?
  • How Ider?

Programming Life(程序人生)

2020-12-15
December 15 2020
On Tuesday
In Knowledge Base(心得笔库), Programming Life(程序人生)

面过100场行为面试后

两年前,我在 Facebook 完成了100场面试的里程碑,分享一篇对于面试心得讲了讲面试对我带来的个人能力的提升。今年五月,我差不多在一年半的时间里又完成了100场面试让总数达到了200场。接着到了今年十月份,其中一类面试—行为面试(Behavioral Interivew) 我也完成了100场。感觉是个不错的时机来再来写篇文章分享一下,但这次我没有特别心得体会总结,就聊聊一些随意的想法。

 

美国科技公司对于软件工程师招聘比较常用三种面试形式:写代码(Coding),系统设计(System Design),行为面试(Behavioral)。对于大公司来说,他们常年都会很多招聘指标,也有大量的申请人,所以相对于中小公司,在大公司更容易获得面试方面的培养机会。(Facebook内部对不同类型的面试都有内部代号,但是因为不对新人记忆不友好,慢慢开始弃用了。)

当我作为面试者时,我对它们的难易程度排列为:系统设计>>行为面试>写代码。毕竟代码是可以通过刷题来提高的,行为面试也主要是讲自己的故事,而系统设计的广度和深度的把控就比较不确定了。

而当我变成面试官时,从另一个角度排列顺序就变成了:行为面试>系统设计>写代码。这排位主要根据我写面试反馈结论所花的时间来衡量:一般代码面试的结论我需要5-10分钟完成,系统设计则要15-30分钟,行为面试则尝尝花费我30-60分钟。主要原因是行为面试要做的内容记录就很多,次要原因是英文写作还是我的短板。因此我后来只做行为面试来锻炼我自己的英文写作,同时也让我享受挑战的乐趣。

 

之前的文章我讲了面试在广义层面带来的各种不同的好处,面试了所以不同类型面试后,我想再聊聊各类面试对于作为面试官的软件工程师在公司内的职业发展不同阶段所能带来的特定技能的锻炼和提升。进而让面试者从另一个角度来了解面试的意义和价值。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2018-12-16
December 16 2018
On Sunday
In English Posts(英文写作), Knowledge Base(心得笔库), Programming Life(程序人生)

Insights from 100 Interviews

As our interview status recorded, I just have conducted 100 interviews at Facebook. I never did batch interviews (multiple interviews a day in consecutive days), so I’m feeling really excited about this accumulative achievement.
On this wonderful milestone, I’d like to share some of my experience and tips about being interviewer at Facebook, I hope you found this helpful.

Benefits as an Interviewer

There is no doubt that interviews are critical for company growth. However, I want to tell you more about the personal growth and benefits of being an Android interviewer.

  • Improving my verbal and written English
    Since English is my second language, interview is a great way for me to practice. I repeat similar conversation during interview, and this exposure increases my confidence in my speech; by providing post-interview feedback, I have increased the speed and quality of my writing.
  • Expanding my social network
    I felt so great when some colleagues suddenly stopped me and asked me “do you know you interviewed me?” then our conversation started very naturally (although, I’m really sorry, I didn’t actually remember the interview).
  • Business travel for recruiting events
    I got a chance to go back to my alma mater to give recruiting talk, which I previously never imagined. However, I also missed a couple trips to interview abroad due to my visa restriction.
  • Clarity on my work and teams
    Candidates often asked about my work and products at Facebook at the end of interviews. By thinking about and answering those questions, I clearly define my own duties, and the work of my team.
  • Polishing my technical skills and general Android knowledge
    The technical skills we use here are very Facebook specific, but I would hear a lot of different terminologies, libraries, architectures that are used by candidates. I can then follow up on these to keep up with the market.
  • Helping my friends apply for software engineer positions
    It’s fine to help friends to prepare for Facebook interviews, as long as we don’t leak the real questions we ask. So I can specifically tell my friends what interviews look like, and what skills they should focus on.
  • Better understand position and level requirements
    After seeing so many interview decisions, I get a better sense on the requirements for Android positions at each level. This also clarifies what gaps I need to fill to advance my own career.
  • Performance review and career growth
    To be honest, the number of interviews doesn’t play a key role on performance review at company. However all the benefits mentioned above helps me a lot on my growth.
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2018-09-24
September 24 2018
On Monday
In Programming Life(程序人生), Tangential Speech(漫话杂谈)

我的四次Facebook面试经历

在 FB 已经工作了已经快三年了,在这段日子里我学到了很多也成长得很快,一切似乎都有序地推进着,可回过头看加入 FB 的过程却有些一波三折。翻看邮件记录,我总共面了 FB 四次:头两次面完后我被拒了,第三次拿到了Offer但换成我拒了他们,直到第四次才达成一致加入进来。

 

第一次面试是在研究生刚毕业的时候,那会儿社交网络正火,对于 FB 和 Twitter 这些比较热门的公司都会收到很多简历,所以对于New Grad来说申请的门槛却要高很多,我也尝试网上申请但都石沉大海。

后来是通过 Interviewstreet (网站现在已经更名为 HackerRank 了)这个在线程序测试平台才拿到了面试机会。当时 Interviewstreet 上的题库很小但难度很高,只要做完8道题就可以解锁网站上公司申请功能。我当时只是觉得在上边做题很有趣,就一直不停地钻研着,也要感谢一位学长在题目解法上给了我很多的指点让我更快地领悟了各种算法的真谛。在艰难地完成了8道题后,我就随便点了网站上包括 FB 在内的几个知名公司提交了申请,我也没有觉得会有下文只是继续在上边做题来努力提高排位。

在我去 Seattle 面试 Amazon 的路上,我收到了 Interviewstreet 给 FB recruiter的引荐邮件。这让我感到非常惊喜,立刻表达了我强烈的兴趣,然后顺利安排了电话面试。电面一共面了两题,第一题很快就解决了,但是第二道关于二分查找的变体我却卡在了条件检查上了,最后是通过电子邮件把最后的答案发了过去。在邮件里我还把我写二分法的博客链接贴了上去来表达我是懂这个算法,好在面试官给了我 onsite 的机会。

因为那时候在忙着毕业的事情,还要带家人在美国游玩,所以把面试安排到了一个月以后。也因为如此,我并没有能够充分地去准备面试。


Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2017-12-14
December 14 2017
On Thursday
In IT Products(数码产品), Programming Life(程序人生), Tangential Speech(漫话杂谈)

协同效应 – 从《炉石传说》的地牢冒险随想到职场工作

上周炉石传说发布了新的扩展包,里面还提供了免费的PvE冒险模式:Dungeon Run。我也趁着假期完成了所有职位的通关,而且差不多一半的职业都是在第一次尝试就过了,只有两个职位尝试了比较长的时间。这过程有一定程度上是凭借这顺气:碰到容易的Boss;拿到超强的Treasures。

而另一个可以致胜的点是我在Twitch经常听炉石主播提到的是:Synergy–协同效应。最近在看的《The 7 Habits of Highly Effective People》一书中的第六条Habit也讲到了是“Synergize”。所以这个观念一时间不停地在冲击着我,也让我去体会到有时候做事情的成效不仅仅靠努力和运气,同时也需要周围的环境和人物一起形成协同效应才能达到最大的成就。

先用炉石的概念来解释Synergy。最简单的就是青玉(Jade Golem)卡,单独每一张都没有什么特别强大的,但是一旦卡组里有越多Jade卡,他们就可以让后边的卡变得越来越强大。卡与卡之间形成的效应所起到的结果远大于单卡价值简单的累加。在Dungeon Run中,还有一些Passive Effect(“被动效果”,或者“光环效果”),比如Battlecry(战吼)触发两次,让Jade Golem增长更加迅速,也让Jade卡变得更加强大。而如果卡组里没有什么卡可以配合这些Passive Effect的话,那选取他们也就变得浪费,这也是Synergy的体现。

工作中,不同职位之间的合作也需要Syngergy。在新公司的第一年,我碰到了一个超强的PM和一个超厉害的Data Scientist,前者负责发现项目,后者在项目发布后分析成果和问题,我与他们合作来完成项目的实现部分,整个环节十分的流畅。工作时候可以专注在自己的长项之上,有问题也能快速找到他们来帮我解决,所以项目做起来总是得心应手。即使同在工程师这职位上,也可以行程好的Synergy,今年下半年我和一个iOS以及一个Backend工程师行程了一个小组专门负责架构,我们各自都只对自己所工作的平台十分了解。但当我们一起合作时,通过不断的交流和询问,每次都能很快地发现问题所在,还能迸发新的灵感,而且我们完全互相信任所以可以全权交由其他人去推进项目的完成。

除了团队成员之间的Synergy,公司的环境也会对个人职业发展有Synergy的作用。极端的例子,如果长期得不到合适的项目来做,那显然无法发挥出自己能力。我自身也有体验,我一直想锻炼我的Leadership,但是在之前的几家公司,我合作的都是比我Senior的工程师,显然很难发挥出我的Leadership,另外我的Manager也没有要求我这方面的能力所以就没有特别地培养我这方面的能力。到了新公司,每年有很多的Intern来锻炼我们Leadership,这就让我在这方面有了很好的提升;同时还会招收大量的New Grad和Return Intern,大量Junior工程师的存在,也能让我能自然而然地承担起Leader的责任去指导帮助他们。这在炉石中的体现就是Distributed Mana Curve,虽然后期的单卡很强,但是没有前期卡帮忙过度的卡组也不会有好的胜率。

 

Synergy是非常有趣的现象,我们往往只关注了个人的强大而忽略的整体的作用,总觉得只要自己足够强大就可以适应各种职场环境,而实际上同事和公司文化对我们的影响也有着不可忽视的作用。

 

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2016-12-22
December 22 2016
On Thursday
In IT Products(数码产品), Knowledge Base(心得笔库), Programming Life(程序人生)

从图形界面回到终端

oh-my-zsh

电脑一开始起源于终端(Terminal),通过键盘输入简单文字,在黑白界面上输出字符。直到图形界面(Graphical User Interface, GUI)的出现,有了更加直观的视图显示,有了更简单的人际交互,电脑才真正普及成个人电脑。

在我的工作经历中,我一直从事都是前段开发。从最早的网页开发,到现在的Android开发,基本上所有代码都在本地电脑运行,所以我很少需要去使用终端来输入指令来执行操作。虽然也学习了Vim,但是绝大多数时间都是使用强大的可视化IDE,例如Visual Studio、Android Studio等等。简单的编辑也会倾向有Sublime Text之类的应用程序。

可视化的应用程序可以让人很快上手操作,通过鼠标寻找菜单目标,或者更新设置都是非常简便的操作。视图窗口也会提供更多不同的内容显示来反馈各类信息。

但是随着开发越来越深入,我越来越感到使用鼠标,以及切换各类视图让我的工作效率变得越来越慢。特别是开始使用多个屏幕进行工作时,鼠标需要被拖动的距离也变得越来越长;每当我在Chrome中打开无数个网页窗口,寻找到想要的页面也越来越难。这其实也反应了费茨法则(Fitts’ Law)。

因此我越来越希望我的手指能够保持在键盘上,而不用在键盘和Trackpad直接来回切换。于是我开始习惯通过各类程序的快捷键来操作,倾向在终端输入指令来进行操作,使用GNU Readline来移动光标。这样大大提高了我的效率,但是依然有很多时候,我花时间来回切换。再者因为我的主业在Android上,我还是不会

前阵子我上了Jim Meyering一堂关于如何高效使用终端的课,一下子又让我对终端变得非常着迷:键盘指令满屏幕地飞;无需拖动光标就能进行文字选择;随时随地都可以Vim指令……太多太多好玩又高效的功能。

于是我开始研究起终端的知识,从Mac默认的bash切换到zsh;安装了Oh My Zsh;学习tmux的指令和配置……

但是在接下来的一周里,我的效率没有提高反而降低了好多:我要花大把的力气重新为zsh配置我的初始指令;tmux完全不支持Mac专有的指令;使用Vim的页面指令并没有滚动鼠标来自自然流畅。

我渐渐怀疑使用终端是否是个退步的表现,研究这些指令是否真的对我有帮助?我想来想去,想出了一个比拟:

现代人基本都会开汽车,汽车简单的操作让更多人接受这个工具;但是仍然有很多人喜欢开摩托车,喜欢不一样的速度与激情。从效率上讲,汽车比人力要快很多,也能承载更多的人;但在交通拥堵的街道上,摩托车却又更为有效。

汽车的功能变得越来越多,然而操作变得越来越简单,让更多人可以接受和使用;摩托车的功能却被其空间所局限,操作也很复杂。

这样对比,我就变成了在想:我要学摩托车吗?于是答案就变成了:我学。而且我也真的有考了摩托车驾照。因为开摩托很酷。

所以为了酷这个原因,我也要深入研究终端指令。最近,这些指令也为我带来了极大的帮助:

我在重构一些Java代码,需要重命名某个包(package),而那个包下有数百个文件,还有很多引入(import)该包下的class也需要更新。虽然Intellij有重构的功能,但由于代码量实在太大,Intellij既不能承受这量度,也无法完全的更新所有文件,特别是一些不被Intellij识别的文本文件和资源文件。于是我花了些时间写了脚本,直接用grep来查找,用sed来修改,要是错了就用版本控制撤回,一切是如此的高效而又可重复。

现在就因为zsh那强大的路径补全,我也越来越离不开它;也渐渐地习惯了tmux的指令操作。

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2016-01-24
January 24 2016
On Sunday
In Programming Life(程序人生)

言传而身教,求知并实践

在我第一份实习工作里,我跟着老板学习并进入了软件开发行业;从我第一份全职工作那,我看到了工程师的不同职业路。在现在的公司里,我也获得了很多身边同事们的指导和帮助,看到了更多在行业和领域中的佼佼者。学习他们写的代码,观察他们设计的架构,与他们交流,甚至只是看着他们工作,都让我发现新的领域,加深流程理解,提速知识学习。他们让我了解到了工程师在不同阶段所作出的贡献大不相同。更可贵的是他们总是愿意抽出他们宝贵的时间给我指导,帮助我变成像他们那样杰出的工程师。

现在的公司员工数比以往的公司要多几十几百倍,所以很难像以前那样找到几个经典人物来表述,也因为公司庞大所以有着更明确的职称(Title),所以此篇文章里我将对“位”分别描述,回顾并感谢每位同事带给我的提携和指导。

(文章比较长,主要讲述在我身边工作的Senior Engineer,Manager和Staff Engineer让我感受到的执行力(Executive)、领导力(Leadership)、主动性(Initiative)这些能力特性,也让朝着他们的方向不断的去学习获取这些能力。)

  • Senior Engineer – Executive
  • Engineer Manager – Leadership
  • Staff Engineer – Initiative
  • Title ≠ Ability – Study

Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2015-12-28
December 28 2015
On Monday
In Algorithm Analysis(算法分析), Knowledge Base(心得笔库), Programming Life(程序人生)

聊聊刷题

在之前的《谈谈面试》中我讲述了我在面试上的经历和看法,而对于软件行业的面试很多都要求被面试者解决一些编程上的问题。这类面试有很多名字:算法题(Algorithm Question)、编程题(Programming Problem)、考代码(Coding Interview)等等,但基本形式都是:给出一道问题的描述和目的,要求写出程序能够接受相应的参数然后完成目标需求最终得到结果。

大部分常见的这类面试问题都被大家总结在了网上,可以直接搜索找到,或者在一些论坛的特定板块(比如未名空间的待字闺中,一亩三分地的面经)里见到讨论,甚至形成了在线测试网站(比如LeetCode、LintCode)直接验证程序的正确性。

由于面试题目的公开性,造就了软件行业特殊的面试准备过程:刷题。很多朋友也会问我:“出去面试还刷题吗?”准确地讲,我刷过算法题目,也经常后悔没有早在还在学校里时就开始刷题,那样就能更早地进入心仪的公司。但现在出去面试前基本都还是忙着正常的工作,不会专门去练习题目。

刷题的目是理解算法和数据结构

好比读书的时候每次老师教授了新的知识后都会布置习题,完成那些作业可能会让我们在考试中碰到原题而拿到高分,但正真的作用是帮助我们理解和消化所学的知识。从简单的理解:“程序=算法+数据结构”,要写好程序就必须去熟悉算法和数据结构,刷题就应该是完成这样的作用。如果题目做不出来,就说明连最基本写程序的能力都没有,自然很难得到公司的青睐。

我常常幻想如果我高考没有失常,能进入更好的学校学习计算机知识,甚至参加ACM小组,得到老师在算法上更好的点拨指导,也因为要参加计算机竞赛,我也会练习更多的题目,现在就不需要刷题了。但现实是在我就读的大学里,算法只是一门选修课,我也没有参加过任何计算机竞赛。但联想高中数学竞赛的培训过程,老师肯定会分类进行知识传授和练习。所以刷题也一样要分类进行强化训练。

LeetCode虽然是最火的题库,但是在我刷题的时候它只是简单的罗列一百多道题目(可参看我的不完全题解列表),所以当时我更倾向去做UVa上的题目。那上边有上千道题目,肯定是不可能做完的,但是有比较好的分类专区,可以专门的加强某一特定算法和数据结构的基础知识。

一开始我连最简单的二分查找(Binary Search)算法都写不好,但是在反复练习之后,我也能总结出二分法的实现,并汇总一些变形题目到博客里。刚毕业那会找工作,好多次面试都挂在了二叉树(Binary Tree)上,后来做遍各类遍历算法,总结了不同的实现方式,就不再担心关于树的操作。动态规划(Dynamic Programming)在我看来是面试时会碰到最难的问题,后来我发现这类问题的关键在于找到类似于数学中的“递归公式”,这样就可以找到递归的实现,之后利用空间来存放中间值来减少时间复杂度。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2015-12-11
December 11 2015
On Friday
In IT Products(数码产品), Programming Life(程序人生)

我不是传说-关于《炉石传说》游历

2014年一月,《炉石传说(Hearthstone)》进入beta测试。我向来对暴雪的游戏非常喜欢,时而不时的会拿出《暗黑3》和《魔兽争霸3》来玩。不过我并没用玩过《魔兽世界》,主要是当年沉迷《传奇》这款网游造成的阴影面积过大,所以我对需要充点卡的游戏,我都是拒绝的。但是出于对《游戏王》的喜爱,而且自己当时所处的游戏公司里又有很多人在玩,我也毅然加入了《炉石传说》之中。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2015-11-23
November 23 2015
On Monday
In Knowledge Base(心得笔库), Programming Life(程序人生)

谈谈面试

一般人投入面试都是在需要换新的工作的时候才去,但我即使有着一份稳定的工作也会常常跑去面试一些感觉不错的公司。当你没有工作的时候,比如刚刚从学校里出来寻求一份生存的根本,和处在所谓的骑驴找马的状态去面试的心情是不太一样的。而即使找到了一匹好马,偶然出去面试一些公司也是非常有意义的。

首先不要浪费了每年免费的面试机会。很多公司对于没有成功的面试者都会关一年的“小黑屋”,这个意思是在这段期间内再申请公司内的职位将不被理会。很多人都想去大公司,但是又怕会面不上,所以我经常听到说“我先拿小公司练练手,再多刷刷题再去面大公司”。这没什么错,但是又怎么能保证练完手刷了题就能面上了。所以我个人更倾向当机立断地将简历投向这些心中的“梦想公司”(对于写简历和投简历又是另一门学问,可自行网上搜索)。如果有幸拿到了那些公司的面试,反而会更有压力,让自己变得更加积极地去准备面试。而且一般大公司的面试流程都很可以拖成几个月相信足够去针对性地了解这家公司常见的题目和面试形式。即使说因为种种原因没有成功,这样的一次亲身经历也有利于提高下次的表现。所以我总是会这样看待一家公司的面试“今年又有免费面试的机会了不能浪费了,今年不行明年还能再来”,而不是“面试的机会很宝贵不能浪费了,等准备好了再去”。另外,这些大公司对你的简历是真的会留底的,recruiter在找人的时候有可能真的会再翻出简历然后打电话给你。我现在就职的Twitter就是这样,最早联系上的时候一轮电面就再没有消息(残忍的默拒),半年后接到电话说Mobile组有空职,我当然兴致勃勃地又去面了然后加入了Android组。其他几家大公司,我也有类似的经历,先后失败了2、3次,现在都得到了到这些公司任职机会。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2015-04-30
April 30 2015
On Thursday
In Design Patterns(设计模式), Knowledge Base(心得笔库), Mobile Development(移动开发), Programming Life(程序人生)

黑科技尝鲜从ListView迁移到RecyclerView

在《RecyclerView体验简介》里已经介绍了RecyclerView目前的可用情况,也提供了一些文章的链接来了解这个新的Android视图的使用方法,API的调用方式。但由于RecyclerView的Adapter需要开发者重新实现,这相当于一次完整的重构了。本文就来介绍一下我在尝鲜RecyclerView所使用到的非常规手段,如果您也只是想尝试一下把原有的程序转到RecyclerView下看看效果,也许本文会有一些帮助。

ViewHolder-挂羊头卖狗肉

之前已经强调RecyclerView强制要求使用ViewHolder模式。但即使是强制,也可以采用“上有政策,下有对策”,敷衍地实现一个子类就好:

  1. public class DummyViewHolder extends RecyclerView.ViewHolder {
  2. public DummyViewHolder(View itemView) {
  3. super(itemView);
  4. }
  5. }

至于缓存子项视图的内部视图到变量上,就先免了。

对于比较复杂的ListView子视图应该都会遵循使用ViewHolder,只是没有具体继承与某个基类。所以只要将那些自定义的ViewHolder显示继承RecyclerView.ViewHolder,再在构造函数里调用一下super(view);就好。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email

Posts navigation

1 2 Next
Facebook
Twitter
LinkedIn
RSS
ZhiHu

Recent Posts

  • ProtoBuf 2.0 method count optimization for android development
  • 面过100场行为面试后
  • The Coaching Habit
  • 基础数据类型的包装类的内存大小
  • 下载Google Photos上的所有图片
  • 婚礼誓词
  • 科技公司的技术博客清单

Categories

  • Algorithm Analysis(算法分析)
  • Article Collection(聚宝收藏)
  • Data Structures(数据结构)
  • Design Patterns(设计模式)
  • English Posts(英文写作)
  • Front Interface(界面构想)
  • IT Products(数码产品)
  • Knowledge Base(心得笔库)
  • Language Tips(语言初试)
  • Mathematical Theory(数学理论)
  • Mobile Development(移动开发)
  • Programming Life(程序人生)
  • Reading Notes(阅而后知)
  • Software Engineering(软件工程)
  • Special Tricks(奇技妙招)
  • Tangential Speech(漫话杂谈)

Tags

Aero Android API Bash Binary Search Bitwise Operation Book C/C++ Career Chrome Conference CSS Debug Device DOM Extension Framework Gradle Hearthstone HTML Initialization Interview iOS Java JavaScript jQuery Keyword Language Issues Mac Microsoft Mobile Modifier Objective-C PHP Preference Principle Reference Regular Expression Static String SVG Tools Tutorial UI XML

Blogroll

  • Ahmed's Blog
  • Gert Lombard's Blog
  • Gordon Luk
  • Jack & Allison
  • 开发部落

Archives

Copyright © 2021 Ider. Designed using Chromatic WordPress Theme. Powered by WordPress.