
# 北美一工作搜索引擎公司技术岗面经
公司名称就不说了，基本上很多人都会用到的一个在北美地区比较流行找工作时候使用的搜索引擎。

这次面试的岗位是技术岗加部分的管理岗位。就目前来说已经完成第二步了，但是感觉不是非常好，其实主要还是在线写代码这部分。

下面对这次面试的过程和经历进行一些总结。

## 电话面试
当你投了简历后，公司发现可能会比较符合他们的要求，通常公司都会安排一个招聘人员对你进行电话面试。

电话面试通常比较简单，基本上聊一下你过去做过的项目，你当前的职业情况是什么的，为什么想到为离开现在的公司等等。

这个套路基本上所有的电话面试都会遇到，因此不需要担心，你就把你准备好的说辞重复一遍就好了，当然可以针对公司的一些主要业务的不同来进行调整。

这家公司的电话面试在后半部分可能会问一些基础的 Java 的相关内容，在这次面试中，我被问到了下面的一些问题：

* Hashmap 和 HashTable 有什么不同
* 线程安全是什么
* 重载和重写有什么不同
* Big O 是什么

等上面几个问题，通常来说这些问题都比较简单，都是概念性的一些问题，你需要对基础概念有所了解，在这个阶段，一般来说都不太会问到具体算法的问题。有些公司喜欢问时间复杂度和空间复杂的以确保你对算法有所了解。

但是在实际的过程中，绝大部分人都在完成功能需求，真正有机会考虑复杂度的情况不多。但没有办法，面试的人有时候就喜欢搞这些东西。所以建议所有童鞋还是要复习下这方面的内容。

## 1 小时视频面试
在完成电话面试后，如果他们觉得你还不错，可能就会安排下一步的技术面试的。

通常这部分的面试时最闹心的也是最讨厌的，因为你永远不知道他们会出什么算法题，同时你也不知道他们会不会让你用你自己喜欢的 IDE。

个人感觉在这部分的发挥不是非常好，因此感觉基本上应该是没有第三轮的面试了。应该没有多久就会收到一封非常礼貌的拒绝邮件了。

但不管怎么样，我还是凭记忆写一些遇到的问题供大家参考下。

这 1 小时的技术面试分 2 部分，下面分别描述。

### 设计分析和概念解释
相对来说这家公司还是比较人性化，他们在面试的时候提出了 5 个分类让你选，这 5 个分类具体不记得了，大致应该是系统性能分析，面向对象，测试，开发流程等。

我选的是系统分析和面向对象。

在系统分析部分，他们给出了服务器上一个内存使用的图片，图片上面 CPU 使用率没有怎么变化，但是内存使用一直在增加。问题是，能通过上面的图片进行一些什么分析。

如果是 Java 的话很有可能就是内存泄漏或者线程问题，这个时候你可以给出一个分析思路，通常就是查看日志，Dump 线程池子，检查 HTTP 访问量等等常规方法，照着忽悠就行了。

面向对象部分的问题就比较多了，但是基本上也就是一些基本的概念，依赖注入是什么，怎么注入的，控制反转又是什么，继承关系，类和抽象类，实现 等等。

基本上都是 Java 面试时候通常使用的概念，如果你对这些内容都不太熟悉或者忘记的话，那么可能就需要好好补一下了。

这些概念在面试的时候经常会被问到。

在完成后上面的问题后就是很多人都非常头疼的在线写代码了。

我问了可以使用自己的 IDE 吗？回答是不可以，因为他们说是保持对其他面试人员的公平，因为有时候使用自己的 IDE，你可以导入很多你自己的类。当听到这里的时候脑袋上的乌鸦就飞过了。

哎，摆着现成 StringUtils 不用非要傻乎乎的从定义 Char 开始用，只能说脑袋有病而且是病得不轻。但是也没有办法，也就硬着头皮上吧。

问的问题我已经发到 [A “word-wrap” functionality（一个字符串包裹函数）](https://www.isharkfly.com/t/a-word-wrap-functionality/13452) 上面了。

有关问题的具体解答和点评，请访问上面的链接进行查看吧。

这里只说说当时的感受，因为有时间限制，所以你需要尽快理解题目的意思，我尝试用了 StringUtils ，但是在线编译器不让使用。

这个编译器可以让你使用 List，但是有关 List 的方法提示反应很慢，经常提示不出来。

在现场做题的时候没有怎么想明白，想到的就是先获得字符的数组，然后获得第一个单词，然后添加 -，然后再获得第二个，然后再添加 - ，在这个过程中有可能会超过给定的长度，因此需要重新开始下一行。因为可以使用列表，所以你可以比较容易的 add 到你的 List 里面。

但是这里有很多小问题，比如说在不加 - 的时候，正好长度是给定的长度，所以导致有时候输出的不正确，有时候不应该有 - 的时候确有了 -。

在忙活了 40 分钟后终于**没有通过**测试。

所以估计这家公司应该是凉凉了。

随后在退出面试后，尝试用 IDE 自己写了下，发现如果可以让我用 StringUtils 函数也不是非常复杂。

我们可以将获得的字符串中间全部先加上 -。

然后按照 - 来进行拆分直到重构的字符串为 NULL，这里你可以使用一个 While 循环来做。

可以使用的方法为 removeEnd 和 substring 等。

具体的解答和分析，请访问上面链接中有关问题的具体分析即可。

## 总结点评
这次面试应该是失败的，总结下来就是很多人都不是非常舒服的代码部分。

![](https://cdn.isharkfly.com/com-isharkfly-www/discourse-uploads/optimized/2X/8/8acd96a04f78fe9b84da7ef3e8d434999b4225a8_2_397x500.jpeg)

因为找工作之前很多人都会复习下基本概念，面向对象，和一些基本的数据结构，因此上面的概念部分只要不是特别偏，很多人都不感觉非常不舒服。

其实非常不舒服的地方就是在在线写代码部分，因为很多已经工作过的同事在工作的时候基本上不会接触到具体的算法，而且这些算法其实很多也没有太大的意义。

但是实际上算法题目非常多，很多都集中在字符串处理上面，通过这次面试，建议还是同学们需要对常用的字符串处理多进行练习。

包括有获得字符串长度，获得子字符串，如何拆分，如何获得字符串中的某一个值等等，通常这些能够帮助你更有信心去面对下一步的挑战。

其实也没有什么关系了，找工作就是在不断的失败中总结，从工作岗位到开始找工作总是需要有一个热身的部分，大家把每一次失败都当做热身就好了。

希望所有人当你有机会面试别人的时候，得饶人处且饶人吧。

---
https://www.isharkfly.com/t/topic/13451