岗位详细:测开岗。二面过了十分钟HR就打电话三面了。二面比一面拷打的更狠,不过也找到了不足的地方,接下来就往这方面努力吧。
二面面了十五分钟。算法和数据结构一二面都没问到。主要考察的是Linux方面和Shell编程这一块的知识。
项目问题
个人博客简陋
被提到了这点…但是我要是说我的个人审美差不多就这样了,应该也不会有人相信。
我承认我的审美是比较抽象的那一类。喜欢的基本就是方方正正的图形。毕竟最开始建个人博客的时候,我连什么网页背景啊,css啊都没打算弄。风格可能比较像有些老外的那种超级简陋的博客,超链接+文本这样的。
也可能是我个人比较喜欢有年代感的东西。本身博客这种像qq空间一样的东西现在就没那么多人写了。不过上次翻到一位40+岁前端程序员的博客,从零几年发博客一直发到现在。除了感慨还是感慨。不知道我能不能也发20年30年的博客,如此如此。
个人博客的话目前是没计划改样式或者加功能啥的了。主要是自己现在用的也比较方便,也没啥想加的功能。以后可能哪天心血来潮突然想增删改某些功能的时候再说吧。
言归正传,当时还是回答说博客毕竟还是在维护+迭代的过程中,有不足的地方是肯定的。
项目问题
介绍一下项目难点
这个我真觉得不好讲。主要是如果我都是第一次接触,那看啥都是难点。但我自己写过之后再看,只要是我能解决的问题,再难都不算是难题。所以大致讲了几个印象深刻的问题就没了。
而且问的是个人博客的难点。如果问的是GoDB的难点那我可以讲个半小时。但是个人博客后端毕竟用的CMS,前端也不涉及接口,基本就是HTML+JS+CSS三件套,也不难。后端代码方面我也没有到能大改Wordpress源码还能让它正常运行的地步。除了相关环境配置有点烦人其它就没啥了。
哦,刚刚复盘突然想起来。可以说一下SMTP这块的。毕竟Wordpress本身的mail函数有些问题,有时候部分邮件功能会受到国内云服务器厂商的一个限制。配置国内邮箱的SMTP之后就能完美解决了。当时可以从”怎么发现这个问题——为什么会出现这个问题——怎么解决的“这一方面去讲讲的。
技术问题
Linux的开机启动过程
平时只用过Ubuntu和Centos7这两个,而且都是虚拟机。所以这个真的是致命问题。听起来很简单,但是如果你没接触过这一块的知识那真的不好回答。
复盘之后我回想了一下Windows系统的启动过程,毕竟虽然说两家内核不一样,但是都是操作系统,某种程度上还是有共同之处的。比如Windows系统的启动,那首先就是按电源键通电。然后进BIOS(用过WinXP的应该很了解了,只用过Win10这种的可能确实不太了解)
那对于Linux内核的操作系统来说,开机启动可分为以下几步:
- 内核引导
- 系统通电之后,BIOS开始自检,再根据预设的启动设备启动。操作系统掌控硬件后加载/boot下的核心文件。
- 运行init进程
- 系统中所有进程的起点。没有这个进程其它所有进程都不会启动。
- 进入对应的运行级别
- 有很多进程需要开机自启(比如Apache,其实也就是守护进程),根据运行级别会进入不同的状态。比如运行级别3时,用户登录后将进入命令行状态。运行级别5时登录后将进入GUI界面。
- 系统初始化
- 执行 rc.sysinit 这个shell 脚本。同时它也是每一个运行级别都要首先运行的重要脚本。它要做的工作也有很多,比如启动swap分区啊,设定网络配置之类的。
- 用户登录
- 可分为SSH登录,命令行登录,GUI界面登录。
更具体的会单独开篇文章记录。打算到时候找本书看看。这里只是粗略的记录一下。
技术问题
介绍一下Linux的swap分区
swap那就是交换嘛。但是当时只知道是交换分区但不确定具体是干啥的,所以直接说自己不太熟悉。复盘之后的回答:
swap是Linux系统下的交换分区。类似于Windows中的虚拟内存。当Linux的内存不足时,会将一部分硬盘区域作为内存使用。不过swap的速度要比内存慢很多,毕竟它本身还是硬盘上的一块区域。
技术问题
了解虚拟化吗?
当时我回答的直接就是虚拟机,Vmware这种。实际上不够全面。
复盘之后的回答:
虚拟化是是将物理IT资源转换为虚拟IT资源的过程。简单来说就是在一台计算机的基础上,可以运行多个不同的操作系统。
顺便补充一下,虚拟化有四个特点,分别是:
- 分区
- 只要硬件的性能足够,那么可以在这台硬件上运行多个虚拟的操作系统。
- 封装
- 所有环境都被封装到一个单一文件中。整个磁盘分区被存储为一个单一的文件,方便转移。
- 隔离
- 每个虚拟机之间相互隔离。数据不会在虚拟机之间泄漏。
- 硬件独立
- 虚拟化技术支持动态地系统资源管理。所以同一个虚拟系统可以在不同的服务器上运行。
技术问题
Linux查看进程状态和查找特定进程
前者top,后者ps -aux|grep(或者答ps -aux 再通过管道grep去查)。
这种基本指令基本上是Linux环节必问的,答不出来就可以给自己两巴掌了。
技术问题
在Linux中怎么安装软件
本来说的是wegt+tar,面试官一直问还有吗。在换题的前一秒突然想起来Ubuntu用apt-get,CentOS7用yum。主要是这些太常用的被问到了反而不会往这方面想。
不过wegt+tar也不全。两个分别是下载和解压。还漏了一个make编译。
技术问题
Shell编程
Shell入门不难,输入输出重定向啥的这些平时看看就会了。但我没把握现场接受拷打,所以没说自己会。
给个简单的Shell例子,Shell我个人感觉写起来和php有点像。但是格式要求比较严格。
str="Hello World\n"
echo ${str}
i=0
a=1
while(($i<=5))
do
echo "i is ${i}"
i=`expr $i + $a`
done
技术问题
什么是ARP协议
拷打完操作系统自然就是计网了。可能是TCP/IP的三握四挥太基础了所以没问,之前一直以为问到计网基本都会问到这块的。
ARP复盘后的回答:
即地址解析协议。该协议在TCP/IP模型中位于网络层。主机发送消息时会先将包含目标主机IP地址的ARP广播到局域网络上的所有主机,并接受返回信息以确定目标主机的物理地址。主机会将返回的信息记录到ARP缓存中。而ARP缓存实际上就是记录其它主机IP地址和对应MAC地址的一张表。
其它问题
没了
本来还提到数据库了,但我说我对数据库和SQL比较熟悉之后就没被问了…..主要是最近都在看数据库的相关知识,什么数据库底层原理啊,数据库架构啊之类的。SQL题在Leetcode上刷的比较多,平时也能做些困难题,结果啥都没被问到还是挺失落的。
总结了一下还是动手少了。平时确实缺少写Shell脚本和对Linux方面的了解。而且上线的项目不够多,导致对Web服务器、计网方面的理解也不够。对Linux内核掌握的不够。从零开始自己写的项目不够多,开源项目贡献方面的技术贡献不够。
总之面了十五分钟就结束了,算法题我也准备了一些,动态规划、递归、双指针啥的,但是没问到;数据结构我也准备了栈、队列、链表这些,但是也没问到。所以面试结束之后心拔凉拔凉的。

计划这学期先把数据库这方面搞定。然后寒假做点操作系统相关的项目,CMU的感觉可以动手尝试一下。再看看能不能给一些开源项目做些代码贡献。不过得先把GO学到熟悉并发和网络编程,比如能从零开始实现个简单的服务器再说。