小明一生中最糟糕的时刻并不是他出生的时候,虽然有时候他希望是那样。作为一名软件工程师,他经历了更糟的事情,特别是在技术面试中。如果你在25岁之前幸运地从教程地狱中幸存下来,并且成功吸引了那些自动阅读简历的算法的注意,那仅仅是开始。一旦你通过了这个关卡,你就会被扔进一个高风险的游戏中,一边是高薪,另一边是失败。面试过程可能有问题,但就像生活中的许多事情一样,你无法控制,只能参与其中。
在今天的故事中,小明将体验到技术面试的心理过山车。他将学习如何在高压环境下现场解决问题的技巧,并且即使他的编程技能不足,也能给面试官留下好印象。为了让这一体验尽可能真实,小明参加了由一位在现实世界中进行了数百次面试的特别嘉宾主持的面试。故事现在开始。
小明学习编程的一年漫长而艰难。他拒绝了约会,放弃了阴谋论研究,甚至取消了视频订阅——这一切都是为了有机会在余生中盯着电脑屏幕。多亏了他在B站上观看的一个激励视频,小明终于获得了一家大公司面试的机会。带着几十个编程问题和一些未完成的课程,他感觉自己无敌了。他即将参加这个电话面试,并改变他的人生。
“你好,小明,我叫The Primes gen,欢迎来到地狱,”面试官打招呼。“开个玩笑。我将进行今天的面试。让我们直接进入正题。我将问你一个经典问题:FizzBuzz。我希望你打印从1到100的数字。如果一个数字能被3整除,打印‘Fizz’。如果能被5整除,打印‘Buzz’。如果同时能被3和5整除,打印‘FizzBuzz’。”
“FizzBuzz?多么陈旧的题目,”小明心想。“我昨晚刚刚用JavaScript编写了自己的编译器。这太容易了。”
但随后,恐慌袭来。“等等。我根本不知道自己在做什么。哈希表?链表?妈妈,我为什么这么笨?二叉树?我是冒牌货!”小明汗流浃背了。
几分钟后,面试官说:“小明,在我们编写代码之前,先讨论一下这个问题。你会如何解决它?”
“我已经搞砸了这次面试,”小明心想,“所以我不在乎了。”神奇的是,当他不再在乎时,焦虑也消失了。“管它呢,我们就谈谈这个问题吧。”
小明开始解释:“我们有三个条件。当我们有条件时,我们使用条件语句,比如‘if’。一种表示方式是用流程图或伪代码。对于循环的每次迭代,我们有一个数字。如果它能被3和5整除,我们打印‘FizzBuzz’。如果能被3整除,我们打印‘Fizz’。如果能被5整除,我们打印‘Buzz’。最后,如果这些条件都不满足,我们就打印这个数字。”
当他说出来时,小明意识到这是一个简单的问题。他想得太多了,因为他期待从一家大公司得到一个更复杂的解决方案。“我不能直接给你答案,”面试官说,“但我希望看到你成功。你可以随时提问。”
带着重新燃起的信心,小明说:“我会使用JavaScript。首先,我们需要一个循环来迭代100次。当我编写代码时,我不考虑速度。我慢慢来,确保完全理解需求。我会使用传统的‘for’循环来获得更好的性能。重要的是解释我的思维过程。即使我说的不完美,也比什么都不说要好。”
小明完成了代码。“让我们用Bun运行它,展示一下我对快速JavaScript工具的了解。它运行得完美无缺。我是个天才!”
但面试官并不满意。“有意思。你能在没有类型转换的情况下做到这一点吗?你知道什么是模运算吗?”
“模运算?”小明内心一阵慌乱。“哦,你是说JavaScript中的取余运算符?是的,我知道。”他迅速调整代码,使用模运算符,使解决方案更健壮。“这样应该更好,而且不那么依赖JavaScript的特点。”
面试官微笑着说:“你能让FizzBuzz在一行内打印吗?”
小明再次调整代码,避免使用“else”关键字,因为他记得读过它是反模式。“完成了。现在它在一行内打印了。”
“很好。如果我们添加更多条件,比如数字7代表‘Bass’,你会怎么处理?”
小明调整了代码,提取数据以有效处理更多条件。“这样如果我们添加更多的词汇,代码就更易于扩展。”
“令人印象深刻,”面试官说。“非常好。现在,你会如何描述你的算法性能?”
小明有点结巴。“强……相当强。当我运行它时,几乎没有延迟。”
面试官点点头。“这是一个描述方式。我更想知道的是Big-O时间复杂度。”
“哦,”小明脸红了。“如果游戏无限运行,它是O(n)或线性时间复杂度,但由于它只运行100步,技术上来说,它是O(1)或常数时间。”
突然间,一个小时过去了。“恭喜你!你得到了这份工作。这里是你的报价:300万元年薪,全程远程工作,带有无限制的年假。你的第一个任务是把所有的蓝色按钮改成略微不同的蓝色。”
小明简直不敢相信。两年努力之后,他终于成功了。妈妈会为我感到骄傲!
但随后,面试官停顿了一下。“等一下……看起来我们刚刚实施了招聘冻结。我不得不收回这个报价。”
恭喜你!现在你知道如何像小明一样搞砸你的技术面试了。