中午发的面试链接,刚刚面试完。多半是凉凉。
进会议后先自我介绍,说了自己做的三个项目。问了我实现的解释器怎么处理作用域和同名变量。(在我的玩具语言里根本没实现作用域)
问了一个项目的后端为什么用GraphQL,好处是什么,有没有思考过怎么自动化实现从SQL语句到GraphQL接口代码的生成(这我哪会啊)。
问为什么后端数据库选择MySQl,而不用MongoDB。我说我只用过SQL Server和MySQL,SQL Server用不起。
问开发流程,怎么测试开发的软件。我说这是团队项目,在组员开发完成后会发起pull request进行peer review。review通过后会将其rebase到master分支。同时我们使用的是敏捷开发方法,每周迭代一个新版本。当部署新版本时先是前后端分别测试,然后是前后端通信的测试。因为前端采用的是响应式布局,前端测试时要对不同分辨率的设备测试。又说了我后端的email字段使用的是 VARCHAR(256),测试样例里需要构造一些边界情况。
最后问了我对密码的存储。我说是明文存储,这是当前的系统缺陷,容易爆库。他问是否有想过怎么改进。我说了解过,最直观的方式是单向hash,但是也容易被破解。所以可以多次hash并加入噪声,使得破解一个密码的成本变得不能容忍。他说这其实还是加密的思想,于是就问了知不知道对称加密和非对称加密,我说只听说过公钥私钥的名字。
数据库部分问了怎么避免字段冗余,我说可以在其他表里引用这个表的内容(foreign key 当时没记起这个名字)。于是继续问,你可以说说怎么引用吗。我说只知道这样一个概念。
算法题是求数组中最小k个元素。
我写了sort的方法(可能要被嘲了),说自己第一反应就是可以排序解决。然后问是否知道std::sort的实现,我说有过了解:当面对大数据时sort使用merge sort;面对小数据的时候使用insertion sort。继续问,为什么这样。我说merge sort虽然是nlgn的时间复杂度,但是前面的常数因子非常大。在n很小时,merge sort就不划算。
最后就是问,你能不能实现一个sort。当场写了quick sort没写出来,debug了二十分钟(完力)。给他说了快排的步骤和思想,他说是对的,但是代码实现要多了解一下(寄)。
快结束时问了为什么要来测试。我说自己觉得测试很有意思,自己也了解过这方面的东西(单元测试集成测试,黑白盒、动态静态测试啥的,但是没说)。
总的来说面试官还是很和蔼的,也有耐心地在听,会追着项目深挖细节。自己还是要多复习吧,学的东西都忘光了。