Skip to content

Ider

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

Primary Navigation Menu

Menu
  • Home
  • Why Ider?
  • How Ider?
2021-02-15
February 15 2021
On Monday
In IT Products(数码产品)

我拥有过的移动硬盘

从大学到现在,我一共给自己买过四个移动硬盘,每个的价格基本在700-1000人民币左右,但是他们的存储容量基本符合摩尔定律在扩张。随着云存储、流媒体等技术的普及和稳定,我估计不会再有买移动硬盘的需求,因此借个机会来聊聊我买过的移动硬盘来回忆一下过去。

目前还带在身边的下边三块,还有一块在一次家人过来玩时让他们存储照片带回去了,下次有机会找到了再补上照片。

Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2021-01-14
January 14 2021
On Thursday
In Design Patterns(设计模式), English Posts(英文写作), Knowledge Base(心得笔库), Mobile Development(移动开发), Software Engineering(软件工程)

ProtoBuf 2.0 method count optimization for android development

The Protocol Buffer library was not initially built for Android, it just turned out to have a Java version to be used in Android, but it’s not optimized for Android apps, for example: it doesn’t consider the method count limit in Android.

So, in this article, I’d like to share some work I found specifically on Protocol Buffer Version 2 that can reduce the method count. If your app is also heavily relying on Protocol Buffer, I hope these approaches are useful for you too.

General Approaches

1. Use Protocol Buffer Java Lite Runtime

Just as the name indicates, the dependency library is much smaller than the regular Protocol Buffer Java runtime, the generated code is also much slimmer. However, the APIs are compatible between those two versions, so the call sites would not be affected when changing the library.

2. Don’t use <Message>OrBuilder interface

For each Protocol Buffer message definition in .proto file, the Protocol Buffer compiler generates an interface named <Message>OrBuilder (<Message> is the name defined in .proto file). This interface would be implemented by the concrete <Message> class and the corresponding Builder.

It might be attractive to use it as a variable type thereby you can depend on abstractions to not concrete classes. But calling methods on Java interface would make Dex take count of those methods.

In reality, every place can directly use either <Message> or Builder, then the optimization tool (like R8, ProGuard) can safely remove the methods declared on the interface.

Special Tricks

Protocol Buffer Java Lite is very good, but if I open the magic box of generated Java classes, I notice it’s still not optimal for Android. There are a couple places I could modify to make it more effective for Android applications.

Instead of copying the Java files and making the change, which is error prone when engineers update the .proto file, I created a script to automate the job. Just add the execution of this script at the end of the Protocol Buffer gradle task, so it works just as a complement of Protocol Buffer code generation process.

  1. protobuf {
  2. protoc {
  3. artifact = 'com.google.protobuf:protoc:3.7.0'
  4. }
  5. plugins {
  6. javalite {
  7. artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
  8. }
  9. }
  10. generateProtoTasks {
  11. all().each { task ->
  12. task.builtins {
  13. remove java
  14. }
  15. task.plugins {
  16. javalite { }
  17. }
  18.  
  19. // `getOutputDir()` can only be read during configuration,
  20. // so it’s out of action block
  21. def outputDir = task.getOutputDir(task.plugins[0])
  22. task.doLast {
  23. exec {
  24. commandLine file('protobuf-optimizer.py')
  25. args outputDir
  26. }
  27. }
  28. }
  29. }
  30. }

In the script, I have made the following modification on generated java code.

1. Change the modifier of Builder constructor from private to package

Simply running the sample addressbook.proto from Protocol Buffer tutorial side, you would get a class like the following snippet:

  1. public static final class Person {
  2. private Person() {}
  3.  
  4. protected final Object dynamicMethod(
  5. com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
  6. Object arg0, Object arg1) {
  7. switch (method) {
  8. case NEW_BUILDER: {
  9. return new Builder();
  10. }
  11. }
  12. }
  13.  
  14. public static final class Builder {
  15. private Builder() {}
  16. }
  17.  
  18. }

When analyzing the APK file, we could would find some synthetic classes and methods:

This is because the outer class is accessing the private constructor of the inner class. The generated synthetic class would contribute an extra constructor to the Dex file. Therefore, by simply removing the private from Builder(), you can remove such classes and methods.
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
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
2020-11-04
November 04 2020
On Wednesday
In Reading Notes(阅而后知)

The Coaching Habit

最近在同事的推荐下,看了一个关于在职场作为 Manager 或者 Mentor 如何提问的书:《The Coaching Habit: Say Less, Ask More & Change the Way You Lead Forever》。我看的是Kindle版本,书的排版看起来有点奇怪,里面的内容不多,但是讲述都很直接到位,所以读起来很快。我差不多花了两周的晚上就看完,要知道一般看英文书我至少要两个月才能看完一本,所以对我个人来说是相对快的。

这本书主要给出了7个有效的提问,并且对每个问题做了一种定性。其中前三个提问是我日常跟我的组员做 1-on-1 时一直在用到的,只是因为习惯了我没有强烈意识到我的提问内容,而且显然这些提问是有效的。而另外三个提问则是我的 Mentor 和我的上级们经常会对我用到的,以后我也会更注意使用来获得更多价值。最后一个问题则是一个新鲜的提问,我印象中可能在一些反思会上碰到,但是看完之后我强烈意识到这个问题正是我可以真正寻找到我作为 Manager 的工作价值的一种很好的方式。

在7个主要提问的章节之间,作者也分享了八个提问的技巧帮助读者更好地在提问过程中获得价值。这些技巧也表述的非常的直接,有几个我在过去日常中有使用到而且觉得是非常有效的,所以未来也会去努力掌握其他几个技巧。

我将书的大体内容用XMind做成了阅读总结,把关键的提问和技巧都罗列其中。但是还是强烈推荐大家去

 

下载 SVG

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2020-03-12
March 12 2020
On Thursday
In Data Structures(数据结构), Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发)

基础数据类型的包装类的内存大小

谈到 Java 的基础数据类型(Primitive Data Types),可以找到很多关于其种类以及内存大小的文章。基础数据类型对应的包装类(Wrapper Classes)也会介绍自动装箱(Autoboxing)和拆箱(Unboxing),以及带来的效率上的影响。但可能是因为Java一般所使用的环境都有比较充足的内存,似乎从来没有人讨论过每种包装类所占的内存大小以及对内存溢出可能造成的影响。

到了 Android 应用程序开发领域,由于设备硬件本身以及系统对各个程序在资源使用上的约束,就会出现很多特别的使用习惯,比如推荐使用Typedef来替代枚举类型(enum)来减少内存使用和方法数。因此关于基础数据类型的包装类所占内存大小就值得写篇博客来研究一下。

包装类所占内存大小

网上我找了很多计算类内存大小的方法,但是既然我是 Android 工程师,我就用 Android Studio 提供的 Memory Profiler 来查看内存使用情况

下边就是我用来做内存检查的类,它包含了所有基础数据类型和对于的包类型

  1. public class Primitives {
  2. boolean pBoolean;
  3. byte pByte;
  4. char pChar;
  5. double pDouble;
  6. float pFloat;
  7. int pInt;
  8. long pLong;
  9. short pShort;
  10.  
  11. Boolean cBoolean;
  12. Byte cByte;
  13. Character cChar;
  14. Double cDouble;
  15. Float cFloat;
  16. Integer cInt;
  17. Long cLong;
  18. Short cShort;
  19.  
  20. public Primitives() {}
  21.  
  22. public Primitives(Void v) {
  23. cBoolean = false;
  24. cByte = 0;
  25. cChar = '\0';
  26. cDouble = 0.0;
  27. cFloat = 0.0f;
  28. cInt = 0;
  29. cLong = 0L;
  30. cShort = 0;
  31. }
  32. }

接着在 MainActivity 中创建两个 Primitives 类的字段:一个没有初始化对象类型,一个将所有对象类型初始化成默认值。然后运行程序,在 Android Studio 中打开 Profiler 查看内存时”Dump Java heap” 就可以看到这两个 Primitives 对象内存使用情况

从图中的结果可以看出如果对象的值是 null,那他们是不占用空间。在这一点上看,如果字段大部分时间都存的是空值或者以空值指代默认值,那相对比总是会被赋予默认值的基础数据类型在内存使用方面要好一些。

对于包装类,它们都比其对应基础数据类型要占用更多的内存空。仔细对比不难计算出他们的差别都是 8 bytes,正好是一个普通 Object 实例的大小。这也证明的包装类只是对基础数据类型的简单包装。

基础数据类型 包装类型
类型 大小 类型 大小
boolean 1 byte Boolean 9 bytes
byte 1 byte Byte 9 bytes
char 2 bytes Character 10 bytes
double 8 bytes Double 16 bytes
float 4 bytes Float 12 bytes
int 4 bytes Integer 12 bytes
long 8 bytes Long 16 bytes
short 2 bytes Short 10 bytes

所以,使用包装类不仅会有自动装箱和拆箱产生的效率上的影响,对内存的使用也有很大的影响。而 Android 的内存又是稀缺资源,所以 Android 库里多了特殊的数据类型来优化内存的使用,比如 SparseArray 替换以 int 为主键的 HashMap。
Read More →

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2020-01-16
January 16 2020
On Thursday
In IT Products(数码产品)

下载Google Photos上的所有图片

Google Photos是我最爱的Google服务之一,它让我能把所有手机拍摄的图片、视频都保存到云端从而解放我手机的存储空间。上传之后,我还可以在电脑上的浏览器或移动设备的应用程序上按需要浏览和下载。而且因为我用的是 Pixel 手机可以上传原始尺寸也不算空间,因此我经常还会把单反相机拍的照片拷贝到手机中再上传来保证画质。
不过这一便捷性是建立在几个重要基础上的:好的网络;可以访问Google服务。去年年底回中国就碰到了无法使用Google Photos尴尬:Google被墙,VPN访问慢。那一刻让我深切感觉到还是本地的内容访问比较快。
于是回来的第一件事情就是想办法下载所有Google Photos里的备份到我的5TB的移动硬盘里。这样万一以后再配到类似的事情,或者Google Photos崩了,我还能找到过去的回忆。

从2014年开始用Google Photos到现在,我存了差不多100GB的照片,而Google Photos浏览页上一次最多只能下载500张照片。要想用愚公移山的方式去完成这任务,恐怕真的是子子孙孙无穷尽也。

好在Google的账号允许拥有者下载其在Google服务上使用的所有数据,其中也包括Google Photos:https://takeout.google.com/

勾选Google Photos之后还可以点击打开列表来选择想要下载的文件夹(按“上传日期”和“自建相册名”分)

然后在该页最后点击下一步进入压缩文档格式选择页面,最好选择大尺寸的文件,不然多个文件下载起来还是很麻烦的。

另一方面,我又想到个问题:以后我再来下载不是还会把之前下载过得又打包下载了一遍。于是我希望按年份来分组下载备份。可惜内容选择页面上没有提供过滤的方式让只勾选特定年份的选项,点击几百次来选中特定年份又不实际。

于是乎,我拿出所剩不多的JavaScript技能写了一段脚本来全选特定年份的图片文件夹:

  1. $0.querySelectorAll(':scope > div').forEach(function(option) {
  2. if (option.querySelector('label').textContent.startsWith('2015-')) {
  3. option.querySelector('input').click()
  4. }
  5. })

打开浏览器的开发者工具(Developer Tools)窗口,找到并选择包含所有选项框的html元素,再到指令控制台输入上边那段代码,就能完成想要的选择结果了。

以后只要根据实际需求来修改 if 里的条件来下载特定的年份或者自定义相册就可以了。

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2020-01-01
January 01 2020
On Wednesday
In Tangential Speech(漫话杂谈)

婚礼誓词

感谢上帝在2005的高二将你带到我的身边。你的睿智让我产生共鸣,你的幽默令我寻得知己,当然还有你美丽迷人的容颜深深印在我的脑海。因为有你让我找到了生命的意思,感受到时光的美好。
高中之后,我去了黄浦江边,你进了西子湖畔,我们两地分离却不能阻隔我们的联系,每天起床我们在短信中问候早安,每天睡前我们在电话机中互告晚安。
大学毕业,我独自去美国深造,你留在了浙大继续博士研究。我们日夜相隔,这份长相思让我们深刻地意识到与对方的感情是如此深刻,难以割离。
终于,2012年的夏天,你奔赴美国与我团聚。有了彼此在身边,我们的生活变得完美。
2017年,我们迎来了生命中新的转折点。儿子的降临让我们的家充满了笑声哭声吵闹声。一直以来,你对我和儿子的关心总是无微不至,肚饿送食,天冷加衣,生病喂药。你让整个家庭总是洋溢着幸福的喜悦。

曾经年少的我对你许下诸多誓言,在我们共同的努力下,而在这些誓言之后,你付出了更多:
我说我要跟你组建个共同的家 — 却是你让每个落脚的地方都有家的味道
我说我会挣钱养家你貌美如花 — 却是你不仅用美貌养了我眼,还用美食养了我的胃
我说我想看到你身着洁白婚纱 — 却也是你让我穿上这身正装站在你的面前

此刻,在亲朋好友和家人的见证下,我要再许下新的誓言:

你将是我生命中的伴侣和唯一的爱人。
我将珍惜我们的爱情,爱你,不论是现在,将来,还是永远。
我会信任你,尊敬你,
我将和你一起欢笑,一起哭泣。
我会忠诚的爱着你,
无论未来是好的还是坏的,是艰难的还是安乐的,我都会陪你一起度过。
无论准备迎接什么样的生活,我都会一直守护在这里。
就像我伸出手让你紧握住一样,
我会将我的生命交付于你。
所以请帮助我 我的主。
真诚的恳求上帝让我不要离开你,或是让我跟随在你身后
因为你到哪里我就会去到哪里,
因为你的停留所以我停留。
你爱的人将成为我爱的人,
你的主也会成为我的主。
你在哪里死去,我也将和你一起在那里被埋葬,
也许主要求我做的更多,但是不论发生任何事情,都会有你在身边

你愿意成为我的妻子,与我一同守护这份誓言吗?

Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2019-11-13
November 13 2019
On Wednesday
In Article Collection(聚宝收藏)

科技公司的技术博客清单

最近在网上搜寻了下各大科技公司的技术博客,来寻找自己写作的素材和灵感,也借鉴一下格式和内容。于是发现大公司除了有宣传本家产品的网站,基本还有一个宣扬自身技术的博客站点。博客的内容可能不同,但基本都是围绕工程师的工作体验和技术分享。

公司设立技术博客的价值可能无法用数字去量化,但是它对技术社区的贡献肯定是很大的。对于公司本身,技术博客可以吸引更多对于技术有兴趣的人来加入公司;它可以让更多人了解公司技术栈从而减少新人招募后的培训成本;它可以接受外部对技术的建议和评价来提供更多选择和提升;它可以帮助工程师提高对外的个人形象进而变得更有归属感。

Facebook Family

先来看看自家公司技术博客,因为多个产品在不同事业部下,基本都有自己的技术博客站点,但是最大的还是主站。

  • Facebook: https://engineering.fb.com/
  • Oculus: https://developer.oculus.com/blog/
  • Instagram: https://instagram-engineering.com/
  • Facebook Messenger: https://blog.messengerdevelopers.com/

Medium.com Based

Medium.com是个博客发布平台,对于没有太多人力资源的中小型公司来说,把技术博客放在上边可以减少维护成本,也能获得更好的分发和推广。

  • Groupon: https://medium.com/groupon-eng
  • Yammer: https://medium.com/@YammerEng
  • Airbnb: https://medium.com/airbnb-engineering
  • Apollo: https://blog.apollographql.com/engine/home
  • Medium: https://medium.engineering/
  • Pinterest: https://medium.com/@Pinterest_Engineering
  • Cookpad: https://sourcediving.com/
  • Google: https://medium.com/google-developers
  • Netflix: https://medium.com/netflix-techblog
  • Doordash: https://blog.doordash.com/tagged/engineering
  • NextDoor: https://engblog.nextdoor.com/
  • Instacart: https://tech.instacart.com/

Hosted

当然,自己建立站点可以达到更好的个性化,也可以基于业务的扩张来做好分类。

  • Twitter: https://blog.twitter.com/engineering/en_us.html
  • Uber: https://eng.uber.com/
  • Slack: https://slack.engineering/
  • LinkedIn https://engineering.linkedin.com/
  • MicroSoft: https://engineering.microsoft.com/
  • Amazon: https://developer.amazon.com/blogs
  • Amazon AWS: https://aws.amazon.com/blogs/
  • Square: https://developer.squareup.com/blog/
  • Dropbox: https://blogs.dropbox.com/tech/
  • Booking.com: https://blog.booking.com/
  • Spotify: https://labs.spotify.com/
  • Yelp: https://engineeringblog.yelp.com/
  • Feedly: https://blog.feedly.com/
  • Zillow: https://www.zillow.com/tech/
  • Zynga:https://www.zynga.com/blogs/engineering
  • Reddit: https://redditblog.com/
  • Evernote: https://evernote.com/blog/category/tech/

Google

Google是个极大的例外,他们有太多太多核心技术产品,也让他们针对每个产品都针对性的技术博客。

  • https://youtube-eng.googleblog.com/
  • https://testing.googleblog.com/
  • https://android-developers.googleblog.com/
  • https://blogger.googleblog.com/
  • https://webmasters.googleblog.com/
  • https://gsuiteupdates.googleblog.com/

China

国内的科技公司似乎对技术博客不太感冒,我找了很久也只挖出寥寥数个。也许国内开始偏向使用微信公众号来做分享,比如“腾讯技术工程”和“阿里技术”。但我还是没有发现几个科技公司官方的技术型公众号。

  • 美团技术团队: https://tech.meituan.com/
  • 360: http://blogs.360.cn/
  • 阿里中间件:http://jm.taobao.org/
  • 百度 research http://research.baidu.com/Blog
  • 百度 EFE https://efe.baidu.com/
  • 阿里技术 https://102.alibaba.com/

Twitter Accounts

除了技术博客,对于比较简短的公告通知或者技术消息,大多技术公司会使用Twitter来发布。(我不是微博的用户,所以没有去找国内科技公司在微博上的账号,但是个人感觉微博偏向娱乐性,而非宣传技术的的地方。)

  • Facebook: https://twitter.com/fb_engineering
  • Instagram: https://twitter.com/instagrameng
  • Square: https://twitter.com/squareeng
  • Twitter: https://twitter.com/TwitterEng
  • AWS: https://twitter.com/awscloud
  • Android Developers: https://twitter.com/AndroidDev
  • Android: https://twitter.com/Android
  • Android Studio: https://twitter.com/androidstudio

 

最后,在我搜索这些资源的时候,Jeff Barr(AWS的布道者,也是AWS官方博客的创建者)恰巧发布了关于他自己15年来为AWS写博客的体会。在这边文章中可以找到他发的第一篇如同“Hello World”的文章是如此的简洁平淡,但是15后去看却又那么的回味十足。文章的后半部分,他分享的写作计划和想法也给予了我最好的启发和指导。

 

References:
  1. 50家硅谷IT公司技术博客-吐槽篇_36氪
  2. 国内各大互联网公司相关技术博客3.0版 (集合腾讯、阿里、百度、搜狐、新浪、网易、360等共29个) – carrotsss – CSDN博客
  3. 一系列国内外顶尖互联网公司的技术博客,晋升程序员必备! – 哔哩哔哩
  4. Best Company Engineering Blogs on Medium
  5. sumodirjo/engineering-blogs: A curated list of engineering blogs of startup and enterprise companies
Share on Facebook
Facebook
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Email this to someone
email
2019-08-29
August 29 2019
On Thursday
In Data Structures(数据结构), Knowledge Base(心得笔库), Mobile Development(移动开发), Software Engineering(软件工程)

Gradle android-library 的各种坑

软件开发随着项目越来越大,我们会开始拆封出多个子项目(sub-project)或者库(library)来更好地独立维护。Android开发也不例外,我们也会需要创建各种库。如果使用Android Studio和Gradle,他们为我们提供了便捷的方式来创建libray。但是他们也带来了不少的维护问题,本文就来讲讲android-library里的坑来帮助大家避开。

android-library v.s. java-library

对于普通Android手机项目,我们有创建两种不同的Library可以选用: android-library 和 java-library

它们的gradle文件内容分别如下

  1. apply plugin: 'com.android.library'
  2.  
  3. android {
  4. // ...
  5. }
  6.  
  7. dependencies {
  8. // ...
  9. }
  1. apply plugin: 'java-library'
  2.  
  3. sourceCompatibility = "7"
  4. targetCompatibility = "7"
  5.  
  6. dependencies {
  7. // ...
  8. }

两种库在定义上的根本差别其实就是不同gradle plugin的使用。另一个小的差别就是android-library需要有一个 AndroidManifest.xml 文件,但它可以简单到只有一行内容(其中package的值通常是文件夹的路径)

  1. <manifest package="com.ider.android.library" />

使用上他们有一些差异,这些差异也是我们决定使用哪种Library的标准:

  • android-library 可以使用 Android API(比如Activity, Service等等),java-library 则不能使用
  • android-library 可以编译android资源文件(resources files),java-library 则无视这样内容
  • android-library 编译出 arr 文件,java-library编译出 jar 文件(本质上他们都是 zip 文件)
  • android-library 的配置可以包含各种编译类型(build variants)来控制,java-library没有那个复杂
  • android-library 可以依赖于另一个android-library 或者 java-library, java-library只能依赖于java-library而不能依赖于android-library

总体而言 android-library 基本是 java-library 的一个超集, 但 android-library 比 java-libray 使用起来要更加复杂一些。从上边的对比来看,对于Android的项目,因为我们不确定什么时候会需要调用 Android 的API,或者定义一下 Android 的资源内容。再者最后一条的约束也决定了创建的 java-library 要保证在整个依赖树(dependency tree)上要在接近叶子节点的位置。所以不如优先选择创建android-library,以免掉入之后改 build.gradle 的坑中。
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

Posts navigation

1 2 … 11 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.