求职小记2

记录近期面试某公司的经历。大部分面试相关的写于刚刚面试完的4月初,后面迟迟未能写完剩下的部分,趁现在还有些记忆补上,顺便简单写写工作一年多的自学经历,以及其他相关的絮絮叨叨,写完发现有点长了,说小记可能都不合适了,不过还是延续一下之前的标题。

因为一些原因,今年想要找新工作的想法强烈了起来,于是在招聘软件上填了一些简要的信息,因为尚未急着找工作,所以并没有写得特别详细,事实上连简历都没准备好。但还是想了一下在目前的公司工作一年半的经历,列了一些可能对我求职有利的条目,同时观察在招人的公司的招聘信息。经过一段时间的观察,感觉招聘软件上的公司似乎有些参差不齐,公司简介和招聘描述上都很有些问题,比起招聘软件上的卡片,似乎拥有自己的官网招聘页面的公司看起来更值得信赖一些。

虽然在几个平台上简单地挂了个人资料,但并没有抱会有人联络的期待,也没有主动投递。某天晚上刚准备最后练一遍曲子接到来自某公司的HR的招聘电话,当时大概是晚上9点左右。对方简要介绍了一下公司的情况,是某国内企业的外包公司,据说薪资待遇与该企业一致,工作也将与该企业直接对接。对于该企业我并不是很了解,只知道传闻加班严重,同时在 Github 上看到过关于该企业的不良记录的仓库,所以对它的印象并不好。但该企业在大众的印象中似乎普遍还不错,学校的老师常常以学生进入了这家企业为荣,所以我挺好奇它的面试难度和面试流程。可能比较熟悉国内IT企业的已经猜出来是哪个公司了,请不要留下关于特定公司相关信息的评论,如果你想要和我讨论这方面的信息,欢迎私聊。

我最担忧的是它的工作时长,当HR晚上9点仍然在工作的时候,我很难相信IT部门此时早已下班,所以也和打来电话的HR聊了一下这方面的事情,出乎意料的是,对方并没有隐瞒存在加班的情况,我以为通常存在加班的公司都会隐瞒这方面的情况,这让我的印象稍有些好转,但我不清楚是不是对方也明白既然公司规模较大完全隐瞒几乎是不可能的。对方详细地介绍了平常工作的作息时间。我自己算了一下,由于上班时间比较晚,下班再加个班其实非常容易就到了我们痛恨的996了,不过中午的休息时间倒是比较长,目前的工作中午休息时间仅有45分钟,吃完饭洗个碗几乎寥寥无几了。对方表示,通常一周内有3天的加班,也大概介绍了一下在未计入加班工资的情况下可能的薪资。虽然不能认同加班,但薪资确实很诱人,并且此前我从未参与过软件岗位通常会有的面试流程,毕业时可能因为专业不对口,也没什么项目经验,简历初筛就常常已经被淘汰了,有些过了初筛的也都卡在机试环节,从前用的偏底层的语言写程序,后面接触了更多的编程语言后发现实际上其他语言中提供的丰富的库函数会让这种机试容易许多。综合考虑之下还是接受了面试邀请。

收到了机试链接后,很碰巧当时深圳因为疫情封城,泉州也爆发疫情,我一直在关注家里的情况,无心做题。到了机试截止时间的前一天,HR又热切地催促我尝试一下。我被说服了,当天下班练完琴收拾完东西后约莫晚上10:00进入了牛客网的机试考题。与LeetCode稍有不同,它需要自己处理输入输出,稍微花了点时间熟悉了这个部分。一共三道题,150分钟。第一道是经典的爬楼梯递归题的变体,后面想了很久还是没能想出正确的递推表达式,只通过了很小的一部分测试用例。第二道题是数组方面的题,基本上没有太大难度,不过由于平时都是直接查MDN的文档,一些 JavaScript 的接口定义记得不太清楚,工作中其实基本用的C#,在调试上花了不少时间,另外整个题的解法也非常粗糙,几乎是暴力破解,自己都觉得写得非常差劲,同时没有通过所有的用例,但花了很多时间还是没找到自己漏了哪些特殊情况,我估计是因为超时。第三题是字符串和二叉树的结合,应该说是比较经典的问题的变体,但其实那些遍历算法我都不记得,只记得大致如何推导那样的算法,基本上是写出来了,也是有部分用例没有通过,我检查了一些想到的边界情况,似乎并没有问题,不太清楚最后出问题的地方是在哪里。结束机试后我并没有抱太大的希望,因为觉得机试中自己的代码写得非常差劲。第二天收到了HR说机试通过了的消息颇有些吃惊。

机试通过了之后HR才找我要简历,由于本来还没打算投递职位,正处在想着如何写简历的阶段,手头只有毕业时找工作的简历,下班后急急忙忙按照之前的想法临时用PPT做了一张简历发给了对方。后来对方发来了一个类似于性格测评的问卷,题目非常多,每个问题中有三个选项让你选出一个最符合一个最不符合,有些选项的设置非常让人为难,我甚至觉得没有一个符合我会做出的决定,第一次做这样设计的问卷。

做完测评通过后紧接着是HR面试,我想应该没有极少有人会在问卷这一轮被打回吧。面试官应该是HR方面的负责人,他对自己职位的介绍我没能听清,问起籍贯的时候意外地发现是同乡人。简要地介绍了目前的工作,因为平时工作内容确实覆盖很多方面,我的工作从需求、设计、开发到维护都有涉及,所以比起毕业的时候完全不知道该说些什么来介绍自己,这一次从容了许多。另外因为手头的几个古老的程序常常出问题,我对其中涉及业务的代码也算是比较熟悉了,因此在不涉及公司内部的信息的情况下不使用开发人员的术语介绍自己的工作时并没有遇到什么太大的问题。对方也简要介绍了他们公司的业务和分工情况,总体的沟通比较友善。期间有问到为何想要寻求新的工作,也问到了目前的薪资,这也是我第一次意识到原来跳槽的时候下一份工作的薪资很可能会与目前的薪资相关。但有一点觉得很有被冒犯的就是被问及了是否单身,我觉得公司能问到这个问题,某种程度上也表明公司本身或者工作本身可能干涉到个人的生活。

HR面试通过后,对接的HR很快就联系安排技术面试。因为此前并没有经历过技术面试,其实我不太了解会是什么情况。第一次的技术面试面试官是女性,先问了一些简历上写的项目和工作,因为对手上负责的几个系统都比较熟悉,和目前工作相关的基本没什么问题,但和实习相关的其实我不太记得了,当时的实习实际上整个团队都非常不专业,所以虽然涉及了业务流程设计图的绘制,但其实并没有真正了解它的概念,直到现在我都觉得当时那段经历可能最大的收获就是无论如何我都要避免进入与官方产生关联的项目,前段时间突然了解到的更多关于当时的公司和合作伙伴的信息更让我觉得当时的团队或许算得上是一个傀儡,没日没夜的加班和无意义的返工只能是让人身心俱疲。

后来面试官说留意到实际上我是学电子出身,即偏向硬件方面的专业,却在简历上写了一些软件类的工作和编程语言,这点当时我没有做更多的解释。接下来问了一些基础的技术基本功问题,二叉树的遍历,程序的编译的,图的遍历,数据结构,包括一些变量的存储位置之类的,但我太久没有复习这方面的知识了,如果给我个题目让我写我可能可以自己分析出来,但要说这些概念,我实在是毫无头绪了,我甚至连前序中序后序都不记得是什么顺序了,要是我是面试官,估计都想直接结束面试了。从面试官问的问题来看,她可能平常用的是 C/C++,虽然在毕业前我也大多是用C,写一些很小规模的单片机程序,当时对那些底层的东西稍微读过一点点,不过确实很久没接触了,几乎忘得一干二净。简单的抛了几个问题后,进入了现场编程环节,此时面试官表示我此前的机试成绩还不错,这点我倒是没有想到。非常尴尬的是,此前我问HR是否需要准备什么,对方可能没想到我恰好没有IDE环境,和我说无需准备。因为正好旧电脑跑起来非常吃力,换了新的电脑,没打算急着装太多的软件,整个电脑基本只有装机的初始环境,只能打开记事本写代码。试题是一道涉及单调栈的数组题,题目也不是很难,暴力破解可以解出,但我当时其实在想这道题的时候陷入了一个死胡同,在记录数组的值还是索引的时候搞错了,尽管面试官给了提示,我仍未找到正确的方向,因此只写了一个性能非常差的版本,当然也跟面试官讨论了这里面存在的问题。后面我在LeetCode上看到了这道题的原题,突然想起来当天写代码的时候实际上记错接口了,如果是真正到调试环境,根本不可能得到正确的结果,甚至应该会直接报错,但由于面试官对JS似乎不熟悉,她似乎没有发现。我不知道是不是可以这么说,实际上技术面试面试官更想听面试者的想法以及对于题目的探讨而不是实际的代码。

后来又接到了第二次技术面试的邀请,其实我觉得自己第一次技术面试有太多基础性问题没有答出,代码也写得不怎么样,大概知道了自己需要查缺补漏什么,并没有强烈的继续参与面试的意愿,也跟HR表示了想要放弃继续面试的想法,但又被对方的一通电话说服了。但此次通话中对方试图用产假和二胎产假作为有利条件还是让我有些反感,就好像生育和生育二胎是一个女性的必然选择。另外对方还提到作为女性,即使遇到骚扰事件(当然对方的原话比较委婉一些)也有平台可以直接举报,我当然很认同有举报平台的好,但当这方面作为一个宣传点的时候难道不是应该重点在于它会不会发生吗?这好像在告诉我这是很常见的,但你可以维权,难道更多关心的不是应该在不要这样的事情发生吗?我非常不理解对方把此作为筹码。

第二次的技术面面试官也是简要地先了解了我的工作情况。另外他对我工作中用C#开发,却用JS去考机试题感到奇怪,之前也想过用Python,但感觉还是JS更接近于我的编程习惯,后来看到《JavaScript二十年》中提到JS是类C的设计,才突然明白过来好像确实如此,所以在刚接触的时候也并不觉得会有很多陌生的地方(顺便一提,目前看了一小部分,本书中提到了非常多的一些JS的设计历史,感觉对理解一些特性还挺有帮助的),同时又不会像C#那样有比较严格的数据类型和写法的定义,当然这个在编程的时候可能也是更容易引入一些隐患,不报错的Bug实际上是远远比Error更难排查和修复的,因为无法直接定位Bug。基础的技术问题问了JS中的数据结构,还问了 const var let 的区别,我记得自己曾经详细看过这个区别,但如今不记得了,也坦言了不了解,面试后就把这个区别补了一下。

后来马上就进入了现场编程,面试官抛出了一道字符串解码题,在讨论过程中实际上我感到面试官似乎也没有很了解这道题,因为他对其中的部分用例的解释并不太明确,甚至有点曲解,后来我们也就此进行了讨论,大概讲了一下自己的想法以及题目中比较棘手的地方,不知道是不是因为讨论和编码没能顺利进行,面试官又换了一道较为简单的题目,判断最长无重复字符串。这道题我很快写完了,用一个 Set 就可以搞定,后面执行一个随便生成的测试用例时发现存在 bug,面试官跟我讨论了这个情况,但看起来他对这道题或者是对JS也不熟悉,他建议我改用 Map 去处理问题,但实际上问题并不在这里,也实际上不需要用到 Map ,问题在于每一次遍历时的起点处理错误,忽视了当前的遍历项才是下一个可能性的起点,我很快修正了代码,得到了正确的结果。面试结束。后面这题后来我也在 LeetCode 上看到了。

第二次技术面试结束后没多久,HR就联系安排了终面,对方似乎是团队主管。仍然是大概聊了聊目前的工作,以及未来可能的工作,也聊了我非常关心的加班,对方说其实晚上的时间过得很快,常常是开个会或者分享一下技术学习就过去了,但这并不能改变需要加班的事实啊,是吧。对方基本已有明确的招聘意愿,倒是我这边犹豫不决。此次面试对方又问及了婚姻状况,是否单身,我又有些反感了。其间我也表示实际上自己去年因为跑去教小朋友学钢琴,没花多少时间在技术方面,目前准备也很仓促,对方表示既然已经通过了机试和两次技术面,说明问题不大,有技术基础,而我又不可能以钢琴为生,跑去搞文艺很可惜。面试官在说这句话的时候我满脑子想的都是前阵子在豆瓣上看到的一个日本的后端工程师辞职跑去音乐学院学爵士乐了哈哈哈哈哈,其实我非常希望未来我也能做出这样的选择(=•ω<=)。

不可能以钢琴为生这点我当然认同,并且这个爱好当然也和我的工作基本上毫无关系,即公司根本不可能关心这一点。事实上我从初二之后基本上就没有接受过专业的教学了,自娱自乐而已,跑去教小朋友弹琴也是非常偶然的事情,本来只是想去找台钢琴练琴的,后来认识了那里的钢琴老师,当了她女儿的老师,之后也是这位朋友才接了一些辅助的教学工作,和有些小朋友的接触其实还蛮有趣的,有几个小朋友非常信任我也让我感到很开心。但由于还是存在一些利益关系的麻烦,后来所有的教学和相关的工作都挪到了我一个人身上我也力不从心了,没有足够的精力备课和练习,我相信如果我要教小朋友首先我自己的练习必然是要保证的,也力求在每次上课前提前到钢琴教室弹一些小曲子,但当时公司的工作系统维护量也很大,每天接触8个小时代码吃完饭又要跑去给小朋友上课还是太困难了,在正好有几个小朋友搬家,所剩的学生不多,带完他们的课也就不再继续了。按照当时拿到的薪水,如果以此为生,即使接满课可能也就勉强能支付我公租房的房租吧。当然我对于技术的了解其实也很有限,虽然最近接触了一些更为开放的社区后也希望自己能做一些有趣的东西出来,希望为自己喜欢的关注的其他领域做一些便利的工具,我逐渐意识到其他领域的从业人员事实上很少会在信息化这方面下功夫,在计算机领域已经实现了的信息化可能在其他领域上的实践仍然相当传统,当然要学的东西还有太多太多了哈哈哈哈哈哈。但你要说不搞技术了是不是可惜呢,其实我不太确定。 几年前我去看画展的时候,很冒犯地跑去弹了摆在那里展销的较为名贵的钢琴,后来那个毕业于音乐学院的销售人员听说了我的专业后跟我说没去学琴很可惜。我不知道到底哪一面更可惜一些,唯一确定的是,写代码和弹钢琴都是现在我的生活中几乎不可或缺的一部分了,希望未来它们都不会走散!所以对于无法让我留出足够的时间去生活的工作,我想如果在需要做出选择的时候我不是经济窘迫的处境的话我大概不会接受,虽然如此,还是打了个电话和父母聊了聊,这好像是我们第一次聊这么久,另外又因为疫情,父母很难得都在家,聊到最后我和父亲感到最诱惑的是周边的生活环境哈哈哈哈,不过母亲的担心就比较现实,担心各种安危和适应性问题,虽然有很大的诱惑,但还是决定拒绝,后面也明确转达了拒绝的意向给一直跟进的HR。

没想到过了一段时间后,又有另一个HR来跟我联系,或许是觉得女性之间比较好沟通吗?虽然确实感到跟后一个HR的沟通比较愉快,但我想那可能也是因为我已经明确不去的意愿,所以没有太多的顾虑了,完全可以和HR敞开聊,没有太多的顾忌,更像是初识的朋友的闲聊。因为上班的时候不需要用到微信,我基本只用电脑,几乎不看手机,所以和另一个HR聊起来的时候也是下班的时候,对方发来消息的时候我刚买完菜回到家,你看,我如何指望自己过着悠闲的生活会突然想跑去加班,当然话说回来如果不是对方公司都有加班,我也没有上面那些面试了。跟这个HR聊了好一会儿,对方说“你就是那种高薪也吸引不过来的那种人吧,因为你清楚这个跟工作是等量的”,那倒也不是,我以为薪资和工作是否等量是一回事,是否应该加班又是另一回事,我也并不是什么富足的家庭出身,薪资还是很重要的。工作和薪资不等量的情况比比皆是,难道这就需要加班吗?以此堂皇地说什么只要加班就能拿到更多的薪资简直是荒谬。但真正让我拒绝的可能还是我很担心频繁在面试时提及婚育的企业内部的文化,以及这个企业本身它的背景我认为它是几乎不可能支持性少数群体,并且与官方有太多的联系,同时它在民众里的光环太重,即使你知道它曾经有那么多的恶行被收录在 Github 中,你的亲人和身边的更多的人其实并不了解,而通常,他们可能会站在人多势众的那一头,看过太多这样的例子了,当然我并没有这么说,但表达了一些可能自己更会去选择的公司的类型,后来对方不再劝说了。至此,面试结束。

对于本次面试,前期的准备几乎没有太多,但比起刚毕业时貌似还是从容了许多。可能是因为刚毕业的时候毕竟本专业的方向是电子,没有项目经历几乎很难写简历和介绍自己,最接近的可能就是和其他学院组队的飞思参赛经验,但其实真正搞过这些比赛的人或许大概都知道,实际上学校内的那些比赛作品真正拥有自己独创的设计非常少,更多的都是照葫芦画瓢,东抄西搬的拼凑,你要是真正去问里面的某个代码实现被替换的时候为何无法工作大部分人都回答不上来,我就遇到过变更某个赋值逻辑的时候出问题去问当时制作过相关作品的人,没有人回答上来究竟是为什么,后来找了很多资料才发现实际上如果真的仔细读过两种不同型号的芯片关于那个寄存器的操作手册,那其实是一个显而易见的答案。至于为何没有选择从事电子方向,其实主要是因为它的实践需要依靠实物,而软件则没有那么多的要求,你甚至可以用远隔重洋的服务器来进行实践。另外还有一个让我不太愿意从事电子方向的原因是,当时授课的老师有一位有较为丰富的工程经验,他在课中的某个关于电源的参数取值讲解中称,需要依靠工程经验,这让我非常惊讶,因为自己动手改造电源的时候曾经不慎把正负极短接引起了整个实验室跳闸,所幸并没有造成什么严重后果,所以我一直认为电源是较为危险且必须精密计算的元件,我不能理解为什么会有依靠工程经验做的决定,但这位老师在电源领域确实非常精通,所以如果他这么说了,那我想可能很大部分工程师也是这么做的。

至于刷题,基本上是三天打鱼两天晒网的状态,周日早上抽个半小时做一下周赛,能做多少做多少(之所以是半小时,周末在家的话一般会在中午也会练琴,为了不太多打扰邻居,感觉饭点比较合适,所以通常十一点就跑去练琴了)。由于软件工程师的工作性质,基本上难以免去在线编程的技术面试环节,有些公司似乎还有更多轮的面试。刷题对于了解和应用算法和数据结构还是很有帮助的,虽然实际上在后端开发的时候遇到的问题其实更多的是业务性的问题,在这方面 LeetCode 其实它比较接近已经经过对业务逻辑的理解抽象过后的问题,相比之下 CodeChef 的问题会更接近于原生业务问题,它对场景的描述更多,解题者首先要理解场景。对于正则表达式的问题,推荐 Hackkerrank 的正则专题,基本上把整个专题过一遍对正则表达式的常用方法就可以有一个相对系统的了解了。当然我做的题量其实很少,所以可能这样的描述也不太准确。经过本次面试,大概会花点时间系统学一下数据结构和算法,如果时间允许,大概还要补一下计算机的几门基础课程。另外也发现面试还是挺耗时间和精力的,与毕业时不同,广撒网可能并不是现在会去做的一个选择了。当然最后还有一点就是要常常更新简历啦,临时编了一份简历其实自己都记不太清写了哪些,而面试官恰恰会针对你的简历来提问。

最后大概介绍一下入职的两年里我是如何自学工作中所需的相关知识的。我在入职之后看到工作内容完全是懵的,除了 SQL 和 HTML 曾经接触过一点以外,其他的几乎是一无所知。虽然有人带,但你不可能指望同事从头讲起,不过这位同事确实给了我非常大的帮助,开头几个月基本上我遇到什么问题都会去请教他,现在有时遇到技术上的问题也会找他一起讨论。公司用的是 C# 进行开发,前端方面会涉及一些 JS,不过不是特别多,版本也很古老。我在入职之后未接管项目之前只接到了一个很小的 Task,添加一个显示照片的按钮和功能,算是很简单的 Task。大概在入职一个多月后现在所在的组有同事离职,她手上的工作全部转交给我,我开始接手维护项目。在这之前的日常中我基本上是在学 JS,期间偶尔也刷刷题练习以练习新接触的语法和接口,然后看看公司的项目,实际上编程语言并不是什么阻碍,当已经掌握了一种编程语言之后,转到另一种编程语言实际上并不是太难,了解一下语法之后上手写代码就会逐渐熟悉。

JS 的学习主要是读 MDN 的 Reference, 虽然 MDN 有中文版,但很多是跟不上英文版的文档的,因此还是建议读接口的时候直接读英文版,否则你可能会发现有一些接口的参数或者实现已经发生了变化但问文档跟不上,还通读了现代 JavaScript,此系列教程有完整的中文翻译,教程中也常常附上 sanbox,对于学习实践非常有帮助。 C# 的学习倒没有特别读什么,一般是遇到相关接口的时候直接查 MSDN 的 Reference。开始接手维护项目后,发现很多页面的前端都是沿用十几年前的古老代码,CSS 样式也是有点混乱,于是我也开始学习一些 CSS 方面的知识,感叹一些前端工程师可以使用纯 CSS 实现非常棒的 UI 。CSS 方面的学习是把 Google web.dev 里面的 Learn CSS 部分全部读了一遍,最近看到又出了几章新的内容,这个系列教程从概念到实现都讲解得非常细致,参考资料也都很有拓展的意义。对于前端方面,Code Pen 有一个 CodePen Challenges,每周发布一次新的 Challenge,每月封顶四次, 你可以在它给的 Demo 上面进行前端练习,同时也可以看到其他人的非常精彩的设计,另外每周的 Chanllege,Code Pen 会提供一些 Resources,针对当期的 Challenge 给出一些相关的参考资料,这些参考文章或者 Demo 通常也对前端方面的学习和练习提出了很多的方案,尤其是一些 CSS Tricks 上面的巧妙实现常常让人惊叹。SQL部分做了 SQLZOO 的练习来复习和学习曾经学过但不太记得的东西。另外比较综合性的还有 freeCodeCamp 的系列和 Project,这里面我只挑了一小部分。深入浅出现代 Web 编程也讲解得比较系统,我目前只学到了第四章。

大体上自学的部分就包括这些内容,剩下的就是读自己维护的系统的错综复杂的源码,和上手去调试和修改优化现有的代码,记录下维护过程中碰到的可能从代码层面解决的问题。去年下半年开始参与比较多的开发工作,也开始对手上最庞大最复杂的加班系统进行一些重写和重构的工作,一边分析维护记录,一边分析历史需求的业务逻辑,寻找解决方案,现在 To Do List 已经排满满的。该系统一共包括一套网页端的各种加班相关的申请和审批,一套手机端的精简版的加班审批,两套不同的接口,四套不同的自动更新程序,本月的项目完成部署后该系统还将新增两套自动更新程序,以及更多的审批功能。所有这一整个 Project 的最大问题一方面是历史文档太少,几乎无法完整再现历史需求,残留代码处处是雷,相同逻辑在各个不同的服务间都有出现,但版本不一致,未能统一抽象,一方面系统日志非常粗糙,几乎等于没有,我的日常维护常常是在猜谜,做无数个可能性推断并找相关证据证明确实如此,简直是在读推理小说了哈哈哈哈。

经过一段时间的改进,该系统目前的维护频率已经小了许多,但还是不断爆出很多历史残留问题,虽然手上有十来个内部系统,但基本上大部分精力都花在了维护这个系统上面了。目前即将发布的项目也是接手以来的最大的需求和最大的版本变更,从开始的需求讨论跟进,到数据库设计,功能的实现和开发,用户测试的跟进,以及将要进行的发布,基本都由我主要统筹,也参与其中的模块开发,完全意识到了文档的重要性,目前也还有一大堆文档没有写完。关于你的系统需要多少文档,一个项目需要多少文档来支撑,可以读一下论文 MANAGING THE DEVELOPMENT OF LARGE SOFTWARE SYSTEMS (PDF)。另外最近因为发现公司的版本控制只实现了TFS团队控制,对于本地开发的版本控制全凭开发者自己的记忆,这实在是相当困难,尤其是当我同时在一个时间段内对几个不同的 Bug 进行复现和修复的时候,常常很难进行变更的追溯,我在本地引入了 Git, 对此进行控制,主要是通过读 Git Reference 进行学习,另外也非常推荐新手先玩一下 Learn Git Branching 熟悉 Git 的基本命令。我也对自己的 Blog Source 进行了 Git 版本控制,同时与 Github 的私有仓库进行同步,不过仍在摸索中。

先写到这里吧,下次面试再记录~

上一次的面试记录:书评-求职小记 | 在逃的貓 (fish-404.icu)