Shopify:谁采访了我担任人事工程师的职位?初级?

当然,很多人都知道Shopify-它的网络非常庞大,截止到昨天,它已经在LinkedIn网络上排名第八(根据雇主的评分,如果我没有记错的话)。

有一天,我看到了他们在渥太华的软件工程师职位,并回想起他们在工作,包括处理大数据,以及相应地进行机器学习,我坦率地在IBM工作之后怀念我。靠这个位置。

面试是相当标准的-首先,从招聘者那里打电话15分钟以确保我是否还活着,然后与另一个招聘者进行一个长达一个小时的“终身”故事,然后进行20分钟的简短任务,这是一种障碍,消除了绝对不合理的情况。

顺便说一句,正好在一年前,即2019年5月,我也采访了他们,经历了上述所有步骤,但是收到了另一家公司的更美味的报价,该公司离房屋5公里,而在Shopify办公室中则有必要去市区,这大约一个小时,那里的停车并不便宜。正是因为去年我既喜欢这个过程,又喜欢员工的充足性,所以我决定再次参加。

但是在某些时候,出了点问题。

一切始于要求我解决的任务如下:
买家来到商店购买产品。他有一个可以放东西的篮子,商店希望通过向他提供更多商品折扣来进一步刺激购买者:

1.如果购买者购买了多个苹果,他将获得篮子中所有苹果的20%折扣;
2.如果买家购买了一包葡萄,那么他将免费获得第二包葡萄。

底线:计算离开商店时买方购物篮的成本,数据以以下形式提供:

[["grapes", 1],["apples", 0],["peaches", 1]] => 12
[["grapes", 1],["apples", 1],["peaches", 1]] => 15
[["grapes", 1],["apples", 2],["peaches", 1]] => 16.8
...
[["grapes", 3],["apples", 1],["peaches", 1]] => 20

其中,嵌套数组的第一个元素是产品名称,第二个元素是购物篮中此类型产品的数量。

食品价格如下:
-苹果($ 3)
-葡萄($ 5)
-桃子($ 7)

我说好,面试官问我希望使用哪种语言,我回答“ Java”并开始评估任务。

我的第一个问题听起来很无辜:
我应该期望什么数据结构作为输入?

答案甚至更简单:
数组(数组)。创建其他方法并在那里手动描述数据。

好吧,我想,由于我们不是在寻找简单的方法,而且考虑到面试仍在人员工程师的职位上,所以他们很可能希望看到我使用抽象和泛型来实现,如下所示:
class Values<T> {
   T data;
   Values() {}
   Values(T data) {this.setData(data);}
   public void setData(T data) {this.data = data;}
   public T getData() {return this.data;}
}

及其用途:
public class Main {
   public static void main(String[] args) {
      Values[][] item = new Values[3][2];
      item[0][0] = new Values("grapes");
      item[0][1] = new Values(1);

      item[1][0] = new Values("apples");
      item[1][1] = new Values(1);

      item[2][0] = new Values("peaches");
      item[2][1] = new Values(1);
   }
}

而且由于我们使用的是共享资源,所以我提出了一个无害的问题,但是如何创建一个附加类,因为我真的不想使用Static,并且在这种情况下它似乎没有用。

当我听到类似“为什么?仅使用数组和所有内容,为什么使所有内容复杂化?” 我专门再次询问了数组-到底是数组吗?答案没有改变。

好吧,数组,数组,尽管有静态类,但是从激动开始就开始了-任务并不像乍看起来那样简单。

实际上,第二个问题源自第一个:
预期的数据大小是多少?

先生们,先生们,等一下,答案很酷:
大小可能有所不同,但不得少于3个元素。

抱歉?当然,我可以动态创建一个包含数据的数组,其中将有一个参数化变量作为数组的长度,但是我需要知道需要将多少个对象插入到数组中-毕竟,一旦创建了数组,就无法更改其长度。因此,在这里,我不得不从字面上向采访者解释如何在JVM中创建数组,为什么数组的大小是固定的,为什么数组的长度不能在创建后重新定义-仅创建一个新数组并复制数据。

当时,当我解释“大量建筑”的基础时,我提到了List接口,并说例如ArrayList作为该接口的一种实现,尽管它基于内部数组,但允许动态大小。

面试官有点思想,他说:“太好了,然后使用ArrayList并在其中插入数据。” 顺便说一下,我们都花了大约15分钟的时间,我才向他解释了这些阵列(总共花了一个小时)。我问如何插入,是否已经使用了泛型-尚未编写任何文件,但是如果我们继续以这种速度前进,那么您可能没有时间。

面试官又发出了一颗明珠,此后我意识到那是小号。他只是在一个普通板上写了以下内容:
“葡萄” =>第一个元素
1 =>第二个元素

也许我的抱怨声甚至可以听见,但我不得不问他一个问题-亲爱的老兄,如何在不使用抽象和泛型的情况下将异构数据插入ArrayList?创建结构时,我必须声明数据类型。好吧,您是否真的要我使用Object并继续根据元素的位置在任何地方进行转换?

他的天真让我感到震惊-“但是,是否真的不可能将字符串和数字数据插入到工作表中?”我说,是的,当然可以,但是可以使用抽象和泛型,或者使用对象和类型转换,或者不使用Java,例如使用JavaScript。然后我自己受不了了,并建议,好吧,至少将数字转换为字符串变量-如果您坚持使用ArrayList,则可以减少工作量,但是继续-您仍然可以使用Map接口吗?

面试官虽然没有立即(坦白地说,我还没有开始找出原因,大约还剩25分钟),但同意并说-让我们去Map。我花了10分钟扔掉代码框架,检查了边界条件,并说我已经完成了。

原来不在那里,所有最有趣的事情就在前面。还记得折扣吗?我将再次引用该条件:
如果客户购买一颗葡萄,他将免费获得另一颗。(如果购买者购买了一包葡萄,那么他将免费获得第二包葡萄)。

在这种情况下,我们可以假设数据具有以下格式:
["grapes", 2]

在此产品的量可以考虑和免费葡萄包。然后图片如下:

1.买方购买了1包葡萄,并免费获得了1包葡萄。结果-在购物篮2包。
2.买方购买了2包葡萄,并免费获得2包。结果-放入购物篮4包。
3.买方购买了3包葡萄,并免费获得3包。结果-一篮子6包。

您注意到这种模式了吗?在葡萄篮子里,应该总是只有偶数但是,根据初始数据,该篮子中还存在奇异数量的维格格勒:
[["grapes", 1],["apples", 0],["peaches", 1]] => 12
[["grapes", 1],["apples", 1],["peaches", 1]] => 15
[["grapes", 1],["apples", 2],["peaches", 1]] => 16.8
...
[["grapes", 3],["apples", 1],["peaches", 1]] => 20


在这种情况下,让我们从相反的角度继续进行-由于可能有奇数数量的葡萄,因此在购物篮中仅考虑购买者支付的葡萄。这合乎逻辑吗?好像是 当买者根本不拿免费葡萄时的期权不予考虑。

现在注意是正确的答案!
1   + 1  + 1 

这很迷人!怎么样?好吧,那怎么可能?是的,我什么都不知道,但是我可能有空格,但请向我解释-根据问题的情况,怎么可能!我试图向他解释一些事情,但老实说-我只是在对话者的眼中看到了对我在说什么的误解。

一切都很简单-一方面是我想出的数字,另一方面是他想出的数字。我的是不同的,那么答案是什么?我错了-他是一名面试官,他的决定似乎是正确的。总的来说,我对这个问题不屑一顾,我已经对局势本身感到愤怒,因为我期望有更多理智的东西(这就是为什么我环顾四周寻找一个会有更多有趣任务的职位的原因),但事实证明......事实证明是这样。我决定放弃这个职位,但是在写反馈时,我收到了Shopify的拒绝。

我仍然向他们发送反馈意见,并表示他们感谢您的拒绝,恐怕我仍然无法与您合作,并在面试中描述了这种情况,建议您最好为面试做准备,即使是简单的任务,如您所知,并不简单。

这就是整个故事。照顾好自己,一切顺利。

All Articles