面试 POPER 的后端开发工程师的离奇经历
前言
先说说我自己吧,90 后的 PHP 开发者,在上海工作 7 年,上家公司月收入 20.5K。
六月底的时候 HR 找到我,说劳动合同到期了,问我还继续签吗,涨工资肯定是没戏了!我说我考虑考虑,过了一天我还是跟 HR 提了离职,离职的原因有很多,当然最主要的可能是在这里做的不称心吧。
辞职后也投了些简历,总体来说机会还是有的,只是比往年都要难很多!面过百度、字节 和 米哈游等公司,结果都挂了!
之前也在网上看到很多数字游民的 UP 主,利用远程办公的优势实现地理套利,可以在小城市生活的没那么累,觉得挺向往那种工作和生活方式的。偶然在电鸭社区看到了 POPER 在招聘远程,抱着试一试的心态投递了简历。
让我没想到的是整个面试过程挺让人费解的,具体原因耐心看下文!
跟 HR 的对话
好吧,我承认我吃回头草了:
一面小测试题
第一轮的小测试还挺顺利,以下是我的答案:
Q1-1:
<?php
function addStrings(string $num1, string $num2): string
{
$len1 = strlen($num1);
$len2 = strlen($num2);
$carry = 0;
$result = '';
while ($len1 > 0 || $len2 > 0 || $carry > 0) {
$digit1 = $len1 > 0 ? intval($num1[$len1 - 1]) : 0;
$digit2 = $len2 > 0 ? intval($num2[$len2 - 1]) : 0;
$sum = $digit1 + $digit2 + $carry;
$carry = intval($sum / 10);
$result = strval($sum % 10) . $result;
$len1--;
$len2--;
}
return $result;
}
function fibonacci(int $n): string
{
$prevPrev = '0';
$prev = '1';
$result = '';
for ($i = 2; $i <= $n; $i++) {
$result = addStrings($prevPrev, $prev);
$prevPrev = $prev;
$prev = $result;
}
return $result;
}
Q1-2:
// The value of item 9292 Fibonacci number is:
3661577246222677849785427206834745690320353572157656330500188244468089715055226822525574623888694874292151478596700484435570305109242313638033416669900444112247937728056211966758992460916419400444853615065999542615995870540182204923636128338003036402195497269318979305499067555417877218451841325150147307183407898442574610940236693637649259016140512151236060436731993551961323374694640088413329540217958532844994602127372986462480164986085899739239682944787995424271277467745382889616543410488579354418782072284268830659992928815496582634474475467254601183355700504643184963095650659016150303753725509080657414720402415839227967445769423409681729197862582729971824872388906214839490412361238387557198107844877079017174320960353286125955686041797566600910089428824579522915583067121845203670580431109038026031805366693865811657549114645180029223550684370620385942139952513596212989572901717566991028950391641339313551358249513768853983555921365314930744269060528453180853181277008706114560211720676164926069583198482669740034992505014190676786182619356298288614973174512790036679389133495600521574725844129972742430674736916672792625084641027990733249739459326440313013672649848254315756846997118764723139178365862765173488978551301801196364660097159749216505812815610240094570434388330501001490260829493982079774109976313795867953293232350445141140986017144615285056571297189775579577943476017486485426114739433921822640390808840316534298381708300360202292556716275696050116179146218599102060641783728510620700368611020522308508805066354267983031447439708738430830812299369590938039288063873607175095253952963248468206808754647017090147700831859035388796576278194027465866101615940691728994129932120206390739814141511226049882323886861245940252446697607680362853010694832168189803235002515372695099765714174685776789816323408545017065365758342146429980816094007713959447619038393467627366903822647919125618219011528539949951357869642550538579
Q2:
<?php
class Node
{
public int $value;
public ?self $left;
public ?self $right;
public function __construct($value)
{
$this->value = $value;
$this->left = null;
$this->right = null;
}
}
function generateRandomBinaryTree(int $depth): ?Node
{
if ($depth == 0) {
return null;
}
$value = rand(1, 100);
$node = new Node($value);
if ($depth > 1) {
$node->left = generateRandomBinaryTree($depth - 1);
$node->right = generateRandomBinaryTree($depth - 1);
}
return $node;
}
function printNodesAtSameDepth($root): void
{
if ($root === null) {
return;
}
$queue = [];
$queue[] = [$root, 1];
$currentDepth = 1;
while (!empty($queue)) {
[$node, $depth] = array_shift($queue);
if ($depth > $currentDepth) {
echo "\nDepth $depth: " . $node->value . " ";
$currentDepth = $depth;
} else {
echo $node->value . " ";
}
if ($node->left !== null) {
$queue[] = [$node->left, $depth + 1];
}
if ($node->right !== null) {
$queue[] = [$node->right, $depth + 1];
}
}
}
// Generate a random binary tree of depth 4
$tree = generateRandomBinaryTree(4);
// List nodes at the same depth
echo "Nodes at the same depth:";
printNodesAtSameDepth($tree);
Q3-1:
function ways($n): string
{
$A = bcpow('3', strval($n+6));
$M = bcsub(bcsub(bcsub(bcsub(bcsub(bcsub(bcpow($A, '6'), bcpow($A, '5')), bcpow($A, '4')), bcpow($A, '3')), bcpow($A, '2')), $A), '1');
return bcmod(bcpowmod($A, bcadd(strval($n), '6'), $M), $A);
}
$ways = ways(10); // 492 ways
03-2
14527490260516100855695859704819627818108010882741117227956927412305738742399171256642436462028811566617818991926058940988565927870172608545709804976244851391054850231415387973537361
视频技术二面
然后顺利进入二面:
三面技术课题
需求如下:
涉及的前后端项目源码仓库如下:
到这里都没什么问题,然后开始三面的课题:
大概花了五六天的时间把整个项目的前后端开发完成,然后在群里通知原本的技术负责人, 然后他拉了个人(应该不是技术)进来,从这里开始我感觉像是在对接业务需求了!
有 Bug 需要该,这个我认了,但是后面开始题需求了,这里的操作让我感到很莫名奇妙,我当时的想法如下:
在最开始我对需求有疑问时,技术负责人给我的答复就是根据自己的理解来,需求不明确,让开发人员完全主管发挥,我的理解是能实现大致逻辑证明能实现业务就行了;
让非技术人员对最终实现效果做评定,而不是通过源代码来分析!如果你只给个泛泛的开发目标,最终 UI 和交互效果都要开发来保证的话,我觉得就很离谱,最后还以达不到效果为借口,否定我提交的项目;
对于测试环境要发送邮件通知,在没有提供 SMTP 账户的情况下,我用自建的 Mailpit 作为查看测试邮件的方式,这虽然体验可能不好,但是并不是功能缺陷,而且作为开发人员应该都知道,这就是配置个 SMTP 账户的事!
提出质疑
我针对我上面的想法提出了质疑,最开始 Ken(负责技术的)现在一声不吭了,HR 的回答让我觉得很扯淡!
项目最终效果图
Laravel Admin 管理后台
总结
这一路面试下来,大概已经十来天了,就冲他们这个技术面试的审核方式,我觉得各位有意向的开发者都要三思!!!
推荐文章: