Sicheng’s blog

The Sicheng's blog

记录我曾经面试 Facebook(Meta) 的经历

2020 年初的时候,我的邮箱里面收到一个封 Facebook 的招聘邮件。能被大公司看上,我还是挺高兴的。于是热情洋溢的回了邮件,说我很感兴趣啊,Facebook 一直是我的 dream company 等等。 面试 于是他们很快的给我安排了第一轮面试,就是两道非常普通的 LeetCode 算法题,我那段时间一直在刷题,所以很快的写出来了。所以他们就安排 4 月份去伦敦 onsite 面试了。 我当时签证和机票都搞好了,结果新冠在欧洲爆发,onsite 面试改成线上。这是我非常遗憾的事情,因为相当于免费旅游没有了,我定的酒店就在大英博物馆走路能到的地方。 线上 onsite 是一天面试完的,我记得好像是 4 轮,题目完全不记得了,基本上都是 LeetCode 的原题,就是考的一个手快。系统设计轮要我设计一个线上卖演唱会门票的系统,非常像 Educative 上的一个系统设计课程讲的  Design Ticketmaster,正好我前几天看过。我觉得这个题最关键的就是考虑并发的时候,多个客户端如果想买一个座位的票会怎么样。我就说这个时候应该用锁,并且解释了数据库乐观锁和悲观锁的区别和适用场景。 Offer 面试很顺利,我的 recruiter 一个星期之内就和我沟通,说面试通过了,要和我谈 offer 了!当时接到电话还是挺兴奋的,毕竟是顶级互联网公司。他们给了我一个 E4 的 offer,大致一年在 12 万英镑左右,还有将近两万英镑的搬家费。Offer 一年之内有效。 我的决定 兴奋过后,我也在考虑到底要不要搬去伦敦。那段时间我聊了很多人,包括已经在 Facebook 伦敦工作的朋友。 首先关于职级,E4 感觉不上不下的,Facebook 有一个非常有名的 Up or Go 的政策。Facebook 希望工程师在 一定时间内升级到 E5 […]

Continue Reading

一些 System Design 面试的建议

最近有些朋友在找工作,不少人倒在 System Design 这一轮上。我作为面试者和面试官都参加过 System Design 的面试活动,就写篇博客聊一下我觉得 SD 面试有用的 tips。 首先明确两个事实: 面试的时候,人或多或少都有压力。人在压力下就会忘记东西,或者动作变形。 面试官多数情况比你考虑得点要多,不一定是因为他们水平比你高,而是因为他们的问你的问题可能已经问过其他人无数遍了。可能他挖了很多”坑“等着你跳。 针对第一点,我的应对方法是形成自己的一个 固定的 routine。久而久之形成习惯了,就变成下意识的动作了。这样我就尽可能的不会错过重要的点。我一般都是按照这种次序做 SD 的面试的。 理清楚需求 SD 面试常见的题目就是一开始用一两句简单的话说出一个需求,然后让你设计一个系统去满足。为了考察面试者理清楚需求的能力,面试官都会讲得非常简单。这个时候,需要你通过不断提问的方式从面试官嘴里”挖“出他的真实意图。如果面试者碰到过网上同样的题目,然后直接就略过了这一步,那么恭喜你,这一轮面试你很难通过。 我一般从功能性需求出发,尝试去了解面试官到底想要什么,以及整个业务流程是怎么样的。我记得我参加一个一次面试,面试官要我们设计一个网上商城卖书。我问了很多问题,其实有一个问题是,我说这些书是哪里来的,是先买好了库存还是怎么样?这个时候面试官邪魅一笑,说库存是每天晚上从出版社通过上传 Excel 的方式录入到系统中的。很显然,如果我不问,他肯定不会主动告诉我的。 除了功能性需求以为,我也会尝试着问问一些非功能性需求,比如整个系统是对外的还是内部系统,需要鉴权或者登陆什么的吗。 聊一下系统容量 理清楚需求以后,最好问一下系统预估的容量是多少,比如有多少用户,多少商品,等等等。这个一般涉及到存储的选择 定义系统接口和业务 entity 一个系统总需要和外部交互,就需要提供接口。这里的接口可以一般是一些 HTTP 的接口,也有可能是消息队列的 schema。我在这里说的是接口而不是具体实现。比如如果设计一个用户中心,我就会说我会提供一个接口,客户端可以 create a new user with these properties。到这一步,我不会具体说,我要实现用 Restful 或者 RPC 的方式实现一个创建用户。我就碰到过面试者,在设计接口的时候,默认选择 Restful API,然后花很多时间去讲一些细节,结果没有时间和面试官讨论其他的东西。同样,了解完业务以后,系统中一定会有一些实体(entity)的。我一般根据我的理解,把业务实体给写下来,每个实体有哪些哪些字段。和接口一样,我不会说这些实体我需要用什么数据库保存。我只会和面试官说,我的系统里面有这些实体,我会把他们存在某个存储中。 如果这个时候,有时候有一些面试官会想和我聊一下细节,比如用什么数据库等等。我都会说,让我们先把高层的设计做完在去讨论某些细节。这样面试的节奏一直是自己熟悉的节奏,也显得我比较有信心。 画一个高层的架构图 到了这一步,我基本上脑子里面有个大致的架构图,这个时候我会用一个画图软件把这个架构图给画出来,我一边用Excalidraw这个网站。注意,在架构里面,我也没有指明任何任何具体的技术栈,数据库就是数据库,而不是 MySQL 或者 Redis 什么的。把这个高层的架构图给画出来以后,我会把一个业务流程的数据流给面试官讲解一下。比如如果创建一个用户,首先由 client 发起一个请求,服务随后写入数据库,然后发一条消息等等。 […]

Continue Reading

2022 07 冰岛行

微信上有 1000 万人定位在冰岛,而冰岛的实际居民才 37 万,作为对比,北京天通苑有 60 万人居住。据说冰岛是世界上最像外星球的地方。 2022 年 7 月,我请了一周半的年假,准备来一次冰岛 7 天环岛游。这篇文章是我对这次旅行的记录。 出发 我们是从柏林勃兰登堡机场直飞冰岛的,这是我第一次去柏林的“新”机场。所谓的“新”是指的是机场 2020 年才启用,打了引号是因为这个机场一直修建了 14 年。这个机场也成为了德国的一个国家笑话。我曾经和我的德国同事聊天,我问为什么柏林的柏林泰戈尔机场没有通地铁?明明有一条地铁线是往那个方向去的。我同事说当时修地铁的时候,柏林新机场已经在建了,规划的人觉得等地铁修建好之前新机场就会启用了,所以没有必要把地铁修到老机场。谁知道,这一修就是 14 年。这 14 年里面,柏林人去泰戈尔机场都需要做公交车。 新机场看上去很高端大气上档次,但是我觉得和很多机场一样,过了安检到登机口需要走非常长的一段距离。感觉机场的设计者就是为了让人多在免税店消费。我不禁怀念泰戈尔机场的简洁实用。 冰岛虽然叫做冰岛,但是因为受海洋暖流的影响,其实并不冷。同样的,因为海洋寒流和暖流交汇,气候比较多变。这是冰岛航空飞机上的垃圾袋的背面,介绍了冰岛的气候。   路线 冰岛一个是岛国,我们的计划主要沿着冰岛的 1 号公路做一次环岛旅行。整个行程大致 2000 公里。 黄金圈 和所有人一样,冰岛的旅行一般都是从“黄金圈”开始的。黄金圈指的是冰岛西南部的三大景点:辛格维利尔国家公园(Þingvellir National Park)、盖歇尔间歇泉区(Geysir)、黄金瀑布(Gullfoss)。这三个景点彼此距离很近,其壮丽的景观为冰岛所独有,因此而闻名世界。 辛格维利尔国家公园位于北美板块和欧亚板块分离所产生的巨大裂谷边缘,非常壮丽。但是其实我也看不出出来,唯一让我感兴趣的就是这里是权游的拍摄地,第四季的鹰巢城的取景地就是在这里。 从国家公园出来接着开车去了间歇泉,泉如其名,这泉每隔 5 – 10 分钟喷发一次。所以能看到游客拿着手机捕捉泉水喷发的一瞬间。 黄金圈的最后一站是黄金瀑布,黄金瀑布(Gullfoss)又译为居德瀑布、古佛斯瀑布,发源自冰岛西南部的Hvítá白河,是冰岛最壮丽、最著名的瀑布之一。 Hvítá白河发源自朗格冰川(Langjökull);河流跌落32米,历经两级阶梯,最终汇入峡谷,塑造了黄金瀑布这座壮观的双层瀑布。黄金瀑布与辛格维利尔国家公园、盖歇尔间歇泉地热区共同组成了冰岛最受欢迎的旅行景区——黄金圈。 塞里雅兰瀑布 塞里雅兰瀑布(Seljalandsfoss)位于冰岛南岸,坐落于冰岛一号环岛公路旁,高约60米,造型似“水帘洞”,可穿行至瀑布后方。便利的交通与旖旎的风光使其成为了冰岛最著名、最多游客到访的瀑布之一。 景点本身不收钱,但是停车票需要 700 冰岛克朗,折合人民币 35 块钱的样子。在我排队的时候,有个姐们跟我打招呼,问我会不会说英文。我说会,她说她们要走了,问要不要买她的停车票,500 克朗卖给我。反正票能停一天。我心想说,你这也太会精打细算了吧,然后马上就同意了。 看完瀑布,我发现停车场上还有不少骑摩托车环岛的。有个摩托车竟然是德国的牌照,也不知道这些摩托车发烧友是怎么把摩托车车给运到冰岛来的。 取车的时候,我发现有一对美国来的夫妇排队准备买票。我连忙 Hello,Hello […]

Continue Reading

在 macOS 上利用 FreeFileSync 自动同步网盘文件夹

在德国生活,很多文件都是用信件的方式来通知的。哪怕是我家的房本,买房的合同,都是几张 A4 纸。所以我习惯把重要文件扫描以后放到网盘里面。由于不愿意花钱买 NAS ( 穷 ),所以研究了一下如何自动在不同厂商的网盘之间进行备份。这样即使一个网盘丢文件了,另外一个也有备份。 我的主力网盘是微软的 OneDriver,免费容量是 5GB,存放一些扫描文件和电子书足够了。我的备份网盘是 iCloud 每个月花 6 人民币买了 50 Gb 的空间,主要用来共享给我家里人存放照片。

Continue Reading

记录一下我战胜新冠的过程

感染过程 3 月初的时候,为了🎉国际妇女节我全家去捷克体验了一下滑雪。滑雪场是人山人海,而且也没有人戴口罩。 滑雪完的第二天起床发现喉咙有点疼,脑袋有点晕乎乎的。于是拿体温计一测,37.2度。我心里一沉,该来的还是要来,我不会是得新冠了吧?正好家里有抗原检测剂,我自己捅了捅鼻子,过了 5 分钟,果然结果很 positive(阳了)。

Continue Reading

推荐一个系统建模常用的模型 C4

  那天我之前的同事突然在领英上给我发消息:   他说的是指我一直在前东家的组里面推一种叫做 C4 的模型。   什么叫做 C4 模型? C4 模型是一种描述软件系统的建模方式,其中的 C4 指的是 Context(系统上下文),Container(容器),Component(组件),Code(代码)。这四个层级从高到低,从全局到局部,从不同的层级来描述一个软件系统。

Continue Reading

工作内推 2022-02

上周和经理 1:1 的时候,他提到了还想在德国和爱尔兰招人的事情,问我有没有可以推荐的。我一来想赚内推费,二来希望和我同时区的同事多一点,这样我可以不用跨时区开很多会。于是就写了这篇文章。在博客首页能找到我的联系方式。 注意:虽然职位都是远程,但是由于税务法律的关系,我们组只考虑已经在德国或者爱尔兰的候选人。因为是小公司,HR 在英国,他们也不愿意提供 Visa sponsorship,因为不熟悉各个国家的法律政策。我们公司还有其他组在其他地区招人,也欢迎同我联系。   我们是谁 来自于维基百科: Netskope is an American software company providing a computer security platform. The platform offers cloud-native solutions to businesses for data protection and defense against threats in cloud applications, cloud infrastructure, and the web. Netskope is considered a “leader in its field” status for its Cloud […]

Continue Reading

面试算法,面试官都在考察些什么?

经常有人问我: “请问我 LeetCode 刷了多少道题就能去某某公司了” “我 LeetCode 刷多少道题是不是就能去 xxx 公司了?” 这种思路其实特别像我们高三时候讨论的: “我高考考了多少多少分就能上一本?” “去年清华的录取分数线是多少分?” 我国的做题教育已经深入我们的脑子里面了,以至于很多人在工作以后还是这种思路。LeetCode 是一种非常好的练习自己算法能力的方式,如果没有任何解题能力是肯定通不过算法轮的面试的。但是算法轮是不是就是在考察候选人的 LeetCode 能力?其实算法只是一种比较容易标准化的面试方式,真正考察候选人的理解问题的能力,通过和面试官交流去沟通去搞清楚需求的能力,编码能力以及算法和数据结构知识。     上面这个视频是我帮一个同学 mock interview 的视频,我出了一个算法题: 假设一个公司每个员工都会汇报给经理,员工之间有时候会有矛盾或者不同意见,这种时候我们需要找到这两个员工共同的经理来解决这个问题。所以我们需要写一个函数,找到两个员工的共同经理。 这个时候,有 LeetCode 高手已经在说了,这道题我刷过,这不就是 LeetCode 235 Lowest Common Ancestor of a Binary Search Tree 吗?来,看我给你 30 秒给你秒了这道题,接着迫不及待的开始写代码了。 做为面试官我当然知道这个题目的本质就是 LCA。但是我期望的并不是仅仅是候选人把代码写出来,我期望的是,他能先搞清楚这个需求。这是我假想中的对话。 Q: 员工只会汇报给一个经理还是多个吗?(我描述的时候特地漏掉了一个) A: 对,只汇报给一个经理。 Q: 请问什么是共同经理? A: 共同经理是两个员工汇报线上层级最低的经历,这个经理同时管理或者同时间接管理这两个员工。 Q: 假设这两个员工中,一个已经向另外一个汇报了,那么共同经理是谁? A: 这种情况下我希望返回经理的经理,否则就不公平了。(LeetCode 上是返回两个节点中做为祖先节点的那一个。很多人也会这么实现,这个时候等他写完代码我就会把这个 corner case […]

Continue Reading

我所经历的欧美科技公司的面试

从 17 年 10 月份到德国工作,到现在 2022 年,四年期间我面试了很多家公司。作为程序员,时不时的去面试一下是非常好的习惯,这样你可以了解一下市场上的薪资水平如何,也可以了解市场上对于程序员的技能需求是怎么样的,毕竟软件工程师是一个需要不断学习的职业。还有一个好处是,面试需要的技能其实并不完全和你平时的工作紧相关,偶尔面试能让你不要完全忘记面试的技能。 每个科技公司的面试大致都由 4 – 6 轮构成,每一轮的内容各个公司都大同小异,但是各个公司,甚至不同的组侧重点都不一样,有些公司喜欢考算法多一点,有些公司喜欢问项目经验多一点。但是总体而言,基本上各轮面试都可能会有下面说的几种形式之一。 home work 有些公司在和HR聊完以后,在正式的技术面试之前会发一个 home work 给你做。往往是要求你完成一个小项目,完成以后把项目代码发过去。这种项目往往说不希望你花太多时间,最多也就两个小时,但是期望你的代码是 production ready , 并且有完善的测试。个人非常不喜欢这种技术面试的方式,因为不同于其他的面试方式,因为你不知道面试官的标准在哪里,所以这种小项目理论上你可以无限打磨的你的代码。 我要不要写这个测试?恩还是写吧,万一因为没有测试挂了呢。 我要不要写一个运行指引?恩还是写吧,万一面试官不知道怎么运行呢。 我还见过的 home work 里面给的代码有注释 this is just an toy project, so we take a short cut,但是给你的要求是 you should right production-ready code. 我曾经花了一个星期写了一个作业,最后倒在了谈薪资的那一轮。 所以我的建议是 如果不是非得找工作,尽量避免这种面试。如果决定面试了,就尽可能的把作业做的尽善尽美。花两三个小时搞一个半吊子的方案是肯定过不了面试官的 review,而且你还是浪费了时间。 算法 这种面试形式是经常见到的,也是被讨论最多的,关于如果准备算法面试我之前的博文了提到了。这种面试形式也是被讨论最多的,因为美国的科技公司的标准化面试都有 3 – 4 轮的算法题。我强烈推荐一个叫做花花的博主,他的题解是我见到的做的最好的。在这里我就不在累述了。 […]

Continue Reading