笔试题
40分钟,A4纸手写。
好多年都没握过笔了。
MVC
中的 M, V, C 分别代表什么?我的答案:
Model
View
Controller
分析:回答比较粗浅,只写出了完整的单词。
以下代码的运行结果
$value = FALSE; if (empty($value)) { echo 'null'; } else { echo 'have value'; }
我的回答:have value
正确答案:null
分析:对 empty 方法记忆模糊不清。
判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于false,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告。
——empty
写出示例中日本电话号码的正则:03-1234-5678,06-1224-5989
我的回答:正则不熟悉,随便写了些。
正确答案:
改进:系统学习下正则,之前也学过,用的时候还是习惯去搜现成的表达式。归根结底还是没学会。
写出下面代码的运行结果:
$arr = [2, 3, 5, 8, 10, 9, 7, 5, 9]; // 2 3 5 8 10 9 7 5 9 // 0 1 2 3 4 5 6 7 8 // 0 5 // 1 8 // 2 9 // 3 9 // 4 数组没有下标为10的元素 null $num = 0; for ($i = 0; $i < 5; $i++) { $num += $arr[$arr[$i]]; } echo $num;
我的回答:31
实际情况:
PHP Notice: Undefined offset: 10 in /code/demo11.php on line 28
分析:分析出来下标为 10 的数组元素不存在会报错,答案硬是给写出来了个数字。感觉自己太教条了,认为程序的目的是算出一个数字,不管咋都要得出个结果。
在 Linux 下,从当前文件夹及子目录中查找内容中包含
old
的文件:我的答案:
find -R ./* | grep 'old'
正确答案:
grep -lr 'old'
分析:
虽然现在主力系统是 ubuntu,但是平常搜文件都是图形界面搜索,查找某个字符也是直接在 VSCode 中直接全局查找。
在终端查找的这些命令不熟悉,猜测是用
find
查找,结合用过的其他命令,拼凑了一个自己实际没用过的答案。改进:熟悉常用的 Linux 命令。
写一个方法,不使用 PHP 内置函数,翻转一个字符串:
我的答案:思路是把字符串分割成数组,然后重新排序,再拼回去。但是因为要用笔,纯手写,写了一通又划掉了。
回来以后写的答案:
function strReverse(string $str = '') { $strs = mb_str_split($str); return implode(array_reverse($strs)); // 不知道这算不算使用内置函数 // 直接使用内置函数: strrev($str); } echo strReverse('ni da ye de ...');
分析:
当时也没想起来用 mb_str_split 分割字符串,实际项目中也没用上过这个函数。
想到的是 explode(实际是没办法按每个字符分割的),结果和 implode 老是搞混,写的是 implode。
数组翻转的函数名 array_reverse 当时也没想起来,说实话 strrev 我也没想起来,curd 的时候也没用上过。
写一个方法,不使用 PHP 内置函数,去重并打印数组中的数字:
$arr = [5, 6, 5, 8, 10, 6, 9, 20];
,打印结果为:5 6 8 10 9 20
。我的答案:虽然打印出来了,但是格式不对,中间没有空格。
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; echo $v; } }
回来后改进:
$arr = [5, 6, 5, 8, 10, 6, 9, 20]; $tmp = []; foreach ($arr as $k => $v) { if (!in_array($v, $tmp)) { $tmp[] = $v; } } echo implode(' ', $tmp);
写一个方法,获取文件
somefile.log
的文件扩展名:这道题出的不太清晰,是先读文件获取文件的真实扩展名呢,还是直接从文件名获取扩展,时间要紧咱选个简单的。
我的答案:
function getExtention(string $file) { return implode('.', $file)[1] ?? ''; return explode('.', $file)[1] ?? ''; // 应该用 explode,因为记混了,用了 implode。 } getExtention('somefile.log');
回来后尝试:
function getExtention(string $file) { return explode('.', $file)[1] ?? ''; } echo getExtention('somefile.log');
改进,当时没考虑到
xxx.xxx.xx.log
这种情况,经 大佬 提醒,做如下改进:function getExtention(string $file) { $res = explode('.', $file); return end($res) ?? ''; // 这里为啥不像下边这样写呢? 参见手册 // return end(explode('.', $file)) ?? ''; } echo getExtention('xxx.xxx.somefile.log');
end,
end(array|object &$array): mixed
将 array 的内部指针移动到最后一个单元并返回其值。
array 这个数组。 该数组是通过引用传递的,因为它会被这个函数修改。 这意味着你必须传入一个真正的变量,而不是函数返回的数组,因为只有真正的变量才能以引用传递。
什么是「数据库事务」和「存储过程」,两者有啥区别?
我的答案:事务,保证数据的原子性,方便回滚。存储过程没了解过,也没用过。
分析:心里明白一点,写的时候只记起来了原子性和回滚。
改进:
数据库事务,(简称:事务)(英语:transaction)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
ACID性质:
- 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
- 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
- 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
存储过程,又称存储程序(英语:Stored Procedure),是在数据库存储复杂程序,以便外部程序调用的数据库对象,可以视为数据库的一种函数或子程序。
优点:
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令执行,因为它是子程序,与查看表、资料表或用户定义函数不同。
- 存储过程可以用在资料检验,强制实行商业逻辑等。
缺点:
- 存储过程,往往定制于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
数据库索引和关联查询、插入一条数据、删除符合条件的数据。
没啥可说的,这块没啥问题。
人事面试
查户口
Q. 自己创业散漫惯了,能不能适应固定上班的节奏?之前也有创业失败的,来干了几天不适应走了。
A. 可以,创业也是按时上下班,作息规律。
Q. 客户是日本的要求非常严格,做什么都要文档先行(日语文档),跟国内开发流程不一样,能不能接受?
A. 可以,这有啥接受不了的。
Q. 有啥优点?
A. 做过的项目比较多,客户简单描述一下就能精准理解客户需求。
HR. 客户是日本的要求非常严格,你这优点没用。(WTH?)
Q. 期望薪资多少?
A. 回答完以后,人事有点惊讶。(ps 跟这个岗位写的也没差多少)
其他的没啥可总结的。
技术面试
涉及技术方面的提问:
Q. 设计模式:
A. 知道的几个设计模式名称说了下,让具体讲一下,咱确实不清楚。
Q. 索引为啥使用 B+ tree?
A. 这玩意也没自己研究过。
B+ 树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。
B+ 树在节点访问时间远远超过节点内部访问时间的时候,比可作为替代的实现有着实在的优势。这通常在多数节点在次级存储比如硬盘中的时候出现。通过最大化在每个内部节点内的子节点的数目减少树的高度,平衡操作不经常发生,而且效率增加了。这种价值得以确立通常需要每个节点在次级存储中占据完整的磁盘块或近似的大小。
B+ 背后的想法是内部节点可以有在预定范围内的可变量目的子节点。因此,B+ 树不需要像其他自平衡二叉查找树那样经常的重新平衡。对于特定的实现在子节点数目上的低和高边界是固定的。
B+ 树的创造者 Rudolf Bayer 没有解释B代表什么。最常见的观点是B代表平衡(balanced),因为所有的叶子节点在树中都在相同的级别上。B也可能代表Bayer,或者是波音(Boeing),因为他曾经工作于波音科学研究实验室。
—— B+树
首先需要澄清的一点是,MySQL 跟 B+ 树没有直接的关系,真正与 B+ 树有关系的是 MySQL 的默认存储引擎 InnoDB,MySQL 中存储引擎的主要作用是负责数据的存储和提取,除了 InnoDB 之外,MySQL 中也支持 MyISAM 作为表的底层存储引擎。
- 哈希虽然能够提供 O(1) 的单数据行操作性能,但是对于范围查询和排序却无法很好地支持,最终导致全表扫描;
- B 树能够在非叶节点中存储数据,但是这也导致在查询连续数据时可能会带来更多的随机 I/O,而 B+ 树的所有叶节点可以通过指针相互连接,能够减少顺序遍历时产生的额外随机 I/O;
Q. 索引什么情况下失效?
A. like 查询左右匹配的时候,其他的跟字段查询的顺序有关,现在好像是智能打的不影响了。
Q. Redis 在哪些地方应用过:
A. 会话存储,任务队列。
…
其他记不清了。
后续
面试完,让等通知,就知道没戏了。
上午约了个回家顺路的初创小公司面试,老板说下午开始就居家办公了,没下文了。
一路走回去,碰到个天桥呆坐了几十分钟。
想想自己也是废了。
顺手拍了几张照片:
点穴会所
城墙边,护城河,春风吹水起轻波。帅的哥,不帅的哥,一起呆呆看河里鹅。
这一张图片转自这里,带走了我一天的沮丧。
原微信公众号文章作者已经删除了,刚又搜索了一下,竟然找到了原作者的豆瓣,所以把豆瓣链接更新上来。
——2023-09-18 12:19:52
15、16年的时候,每天骑自行车回家(单程12.5KM),都会停到这里看看火车。
现在都快骑不动了。
你们坐那儿在思考什么?
我坐这儿在思考什么?
建成不久火车站北广场
大华1935的仿旧餐馆
哪位大佬需要人?能不能捞我一把?
干活很给力的。