Tag: 面试

写了十几年代码, 谷歌/Google认为我还不够Senior

我儿子也说我不够Senior: 去年9月,我第三次面试伦敦谷歌,目标是一个SRE(站点可靠性工程师)职位,抱着试试看的心态参加了面试。第一轮面试的最后两分钟,回答了一个关于如何将算法应用于分布式系统(如何优化算法)的follow-up问题,表现得不太好,因此没能通过那一轮。 不过严格来说也不算被拒绝。等了三周后,他们告诉我最终选择了另一位候选人,虽然我的表现不是最出色的,但应该达到了最低门槛,所以并未直接拒掉我,而是建议我等待伦敦的其他职位空缺再申请。 这一等就到了12月。这位谷歌的美女猎头联系了我,很快安排了隔一周的两轮算法与编码面试。新年后还有两轮:一轮系统设计,一轮文化匹配(也就是行为测试)。 这是我第二次进入谷歌的终面(Final Rounds),也就是 Onsite Interviews。 谷歌终面:接近L5却被给L4,大饼画得响 面试结束后的第二周,我发了邮件询问结果,但没收到任何回复。又过了一周,还是毫无消息。我一度以为自己被拒绝了,甚至怀疑是不是发挥太差,谷歌连拒信都懒得发给我。 上周(面试后的第6周),突然就接到猎头的邮件,她说: I hope you’re keeping well! Apologies for my delay I’ve been unexpectedly out the office. Your feedback isn’t …

面试刷题更像是一种服从性测试

在许多求职者看来,面试中的刷题环节似乎是对技术能力的直接考察。然而,从另一个角度来看,这一过程或许更像是一场服从性测试。 想象一下,当一个公司要求候选人解决复杂的算法问题或设计一个系统架构时,真正的目的并不仅仅是判断候选人是否能完成这项任务。许多时候,公司更关心的是你是否愿意花时间和精力去迎合他们的流程和标准。 为什么这样说呢?从实际工作中来看,绝大多数岗位并不需要员工每天都在解决高难度的算法问题或从零设计分布式系统。相反,工作中的任务更偏向于理解业务逻辑、维护现有系统以及团队协作。那么,为什么刷题依然是很多公司青睐的筛选方式? 答案或许在于,刷题能有效筛选出那些愿意投入大量时间准备,并在面试中展现高度配合精神的候选人。这种配合精神,是公司希望在未来的工作中看到的品质。一旦你通过了这些测试,公司就会认为你是一个值得信赖的员工,一个能遵从流程、适应规则并在需要时投入额外努力的人。 还有就是以前说的:面试刷力扣是大公司过滤的成本较低的方法之一:为啥有名的IT公司的程序员面试都这么难?,可以过滤掉大部分 False Positive,当然也有可能过滤掉人才(胜任工作的求职者)。不过对于大厂来说,招进来一个False Positive的损害要远远比错过一个False Negative大。 此外,随着AI技术的飞速发展,刷题的技术价值正在逐渐降低。像ChatGPT这样的AI工具,已经可以轻松解决LeetCode或Codeforces上的许多高难度问题,并给出清晰的解题过程。这表明,算法题不再是人类独有的技术优势,而是可以被高效地自动化处理的任务。这种变化进一步凸显了刷题在实际工作中的局限性,因为日常工作更多依赖于沟通、业务理解和对系统的长期维护,而不是短时间内解决某个抽象问题。 OpenAI推出o3大语言AI模型。 Codeforces 评分:2727——相当于全球人类程序员编码竞赛中,排名第 175 位。 AIME:96.7%——意味着在数学测试中只错1道题 博士水平的科学问题(GPQA):87.7%——博士生一般得分70% 最难的前沿数学测试:25.2%——其他模型没有超过2%,数学天才陶哲轩说该测试“可能难住AI好几年” 更重要的是,在许多企业的真实场景中,很少有任务需要员工频繁编写复杂的算法。大多数时间,开发者的工作集中在实现需求、调试问题和优化性能上,而这些任务并不需要高强度的算法技巧。因此,刷题的结果往往与实际工作能力脱节。 当然,这并不是说刷题完全没有意义。它确实在某些方面反映了候选人的逻辑能力和解决问题的技巧。然而,真正的工作能力远不止这些。因此,我们可以将刷题看作是一种双向筛选:候选人在展示技术能力的同时,也在证明自己愿意投入时间来满足公司的要求。 从这个角度来看,刷题不再只是技术竞技,而是一种服从性测试,它帮助公司识别出那些既有能力又愿意适应规则的潜在员工。而对于求职者来说,认清这一点或许能让你在面试准备的过程中更有针对性,同时也能帮助你判断这家公司是否真的适合自己。 我听说,如果面试者不愿意刷题,可以和公司商量一下,看看是不是可以选择其它方式。谷歌面试就可以选择:一个是数据结构和算法,另一个则是偏向系统运维(Linux底层知识等) 本文一共 1195 个汉字, 你数一下对不对. 面试刷题更像是一种服从性测试. (AMP 移动加速版本) …

产品设计和系统设计面试的区别(Product Design vs System Design)

在 Facebook/Meta 的软件工程师(包括站点可靠性工程师SRE和企业工程师EE)的面试中,产品设计/Product Design和系统设计/System Design起着比较相当重要的作用。 一般来说,编程面试(Coding Interviews)和行为规范面试(Behavior,考查是否和公司的文化价值观一致)是最基本的要求,而设计能力(系统设计或者产品设计)才是决定给你Offer的级别。 产品设计面试:Product Design Interview 目标:评估您创建以用户为中心的产品的能力,这些产品可以有效解决实际问题。 重点:您如何考虑用户需求、确定功能的优先级以及制定符合业务目标的解决方案。 典型问题 “您将如何设计一个允许用户管理其隐私设置的功能?” “为 Facebook 上的新用户设计入门体验。” 评估的技能 了解用户角色和痛点。 打造直观且可扩展的用户体验。 平衡用户需求与业务目标。 分析不同产品特性之间的权衡。 关键方法:CIRCLES 等框架(考虑用户、想象场景、需求、削减和确定优先级、列出解决方案、评估权衡、总结)。 系统设计面试:System Design Interview 目标:评估您构建可扩展、可靠且性能卓越的复杂的分布式系统的能力。 重点:如何设计技术后端和基础设施以支持高流量和强大的应用程序性能。 …

Docker, 虚拟机 (VM) 和 Kubernetes (K8s)

Docker 与虚拟机(VMs) 概述:Docker和虚拟机(VMs)都用于在隔离的环境中部署和运行应用程序,但它们的实现方式不同。 Docker(容器) 轻量级:容器共享主机的操作系统内核,因此比虚拟机更轻便,启动速度更快。 隔离:Docker 提供进程级别的隔离,意味着多个容器可以在同一个操作系统实例上运行而不会相互干扰。 高效性:由于容器共享操作系统,只需打包应用程序及其依赖项,因此使用的资源更少。 虚拟机(VMs) 重量级:每个虚拟机包含一个完整的操作系统实例和虚拟化硬件,因此消耗更多的资源。 隔离:虚拟机提供完全的隔离,每个虚拟机拥有自己的操作系统,这样更安全但效率较低。 使用场景:虚拟机适用于在同一主机上运行多种操作系统类型,是需要完全操作系统级别隔离的传统应用程序的理想选择。 总结:Docker 容器更高效且部署更快,而虚拟机提供更强的隔离,更适合多样化的操作系统需求。 什么是 Kubernetes(K8s)? 概述:Kubernetes(K8s)是一个开源平台,用于自动化容器化应用程序的部署、扩展和管理。 主要特性: 编排:Kubernetes 管理跨多个主机的容器集群,处理如扩展、网络和容错等任务。 自愈能力:它自动重启失败的容器,并在节点失败时重新调度,确保高可用性。 可扩展性:K8s 可以根据需求自动扩展应用程序,添加或移除容器。 使用场景:Kubernetes 非常适合在大规模上管理复杂的分布式应用程序,是微服务架构的热门选择。 简而言之,这篇文章展示了 Docker、虚拟机和 Kubernetes 的技术差异和实际应用,这是系统设计和云原生环境中至关重要的内容。 …

C/C++ 中的内存管理器(堆与栈)

最近面试的时候遇到这个问题。这个问题考你计算机的基本功。 在 C/C++ 中,内存管理是控制程序如何分配和管理其资源的关键方面。C/C++ 程序中的内存通常分为不同的区域:堆栈和堆是最主要的动态和自动内存分配区域。 ACM题解系列之 – 最小堆栈 (Min Stack) 堆栈内存 定义:堆栈内存用于静态(自动)内存分配。它是存储函数参数、本地变量和返回地址的地方。当调用一个函数时,一个新的内存块(称为堆栈帧)会被添加到堆栈的顶部。当函数返回时,该内存会被自动释放。 分配:内存由系统自动管理——在变量超出作用域时自动分配和释放。无需人工干预。 生命周期:受限于函数或代码块的作用域。一旦函数退出,内存将被释放。 大小限制:堆栈的大小通常较小并由系统预定义,意味着大的分配可能导致堆栈溢出。 访问速度:由于其后进先出(LIFO)的结构,堆栈内存访问速度更快。由于内存是连续的且可预测的,它允许快速访问。 使用场景:局部变量、函数调用信息和固定大小的对象(数组、结构体)。 堆内存 定义:堆内存用于动态内存分配,程序员使用 C 中的 malloc()、calloc()、free() 和 C++ 中的 new、delete 手动分配和释放内存。 分配:内存在运行时分配,并且分配的生命周期由程序员手动控制。它可以持续存在,直到显式释放。 生命周期:堆分配的对象的生命周期不受作用域的限制。内存将一直被使用,直到被释放为止。 …

45 分钟模拟面试(编程、系统设计)+职业发展建议

许多大型科技公司(如 FANG:Facebook/Meta、Apple、Netflix、Google)以及微软等,在发出工作邀请之前,通常会进行多轮面试。这些面试通常包括编程/Coding、系统设计/System Design和行为评估/Behaviour,以考察文化契合度。 我提供 45 分钟的模拟面试,帮助您准备编码和系统设计环节。作为曾在亚马逊(AWS,S3 Object Lambda)担任面试官的我,将通过真实的练习环节为您提供指导。在编码模拟面试中,您将解决一到两个编程问题;而在系统设计模拟面试中,您需要在白板上设计一个可扩展的产品。 此外,我还提供 45 分钟的聊天时间,可以讨论任何话题,包括职业发展和建议。 我目前定价 60 英镑一小时,会员价是 55 英镑,毕竟时间就是金钱。而这也大概和我的时薪差不多。 如果您有兴趣,请点击此处。 PS:我发现 Buy Me a Coffee 这个创业点子很好,赞赏+集成了网上商店,很是方便,界面也很友好,感兴趣的可以通过这个链接来创建一个专属于你的页面,在为用户创作内容的同时也能很快捷的收到赞赏! 英文:45 Minute Mock Interview (Coding, System …

C++的 map 当键(Key)不存在的时候会发生什么?

在面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。 在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。 使用下标操作符 访问时 如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。 例子: std::map<int, int> myMap; int value = myMap; // 如果键10不存在,会插入myMap = 0 使用 at() 方法访问时 如果键不存在,at() 会抛出 …