标签:面试复盘, 面试相关
岗位详细:深信服测开岗。一面过了,过了十分钟就通知明天下午二面。坐等继续拷打。
写者注
更新会慢一点,这几天要做的事情实在太多了。
感觉自己还是准备不足,准备了几天的测试相关的知识,然后一点都没问到。问到的都是项目相关的内容,于是就被拷打了40分钟。
一面下来真的发现自己还有很多细节没处理好。 接下来总结一下自己还有哪些不足。
项目问题
深挖项目细节
个人介绍之后。我先介绍了一下我做过的相关项目。其中被深挖细节的是我的个人博客和GoDB(本站有GoDB项目的实验记录,有兴趣的可以看一看)。
个人体验:你写到简历上或者你和面试官说你会的项目,一定得是你自己写的。而且写过一遍还不够,每个地方是怎么实现的,为什么这么实现,换个题目你还能不能实现,这些一定要搞懂。
比如你在给一个有10个元素数组的地方用到了冒泡排序。那么这个地方能不能用其它排序方法,有哪些排序方法,你能不能现场写代码用冒泡排序给一个有100个元素数组排序。这些一定得会。
项目多肯定是好的,但问题是写的精不精。写一百个项目不如精通1-2个项目,这就足够了。如果不精的话一定不要在面试中提到,不然被问到了发现自己不会真的很难受。
技术问题
GO读写文件
本人有做过一个项目:用GO实现一个数据库管理系统。这个项目是跟着MIT6.5830课程边学边做的。本身它给了部分框架(或者部分比较困难的函数的实现),我需要做的就是补全它没完成的功能。
这个项目中有一步是要读取字符串,然后写入到本地文件中。
然后面试官要求我现场用GO写(用的showmebug)一个能读写文件的GO函数。
拷打过程就不细讲了,一开始忘了函数是哪个,又不能切屏去查,所以Go没写出来之后问能不能换成C++,结果C++读文件写文件的那几个API太久没用又忘了,又不好意思问能不能切回GO。真的像小丑一样
,再说多了都是痛
。
只能说各位平时还是少用自动补全。用多了≠我会了(不等式秒了)。接下来先说说怎么实现吧。
当时要求是实现九九乘法表,然后把表达式写入缓冲区buffer,再把buffer写入本地txt。
首先是九九乘法表。讲真我一直以为会问算法。GO里面数字转字符串、字符串转数字都要用到strconv。C++的话要用到to_string。等到时候再作篇总结的文章。
package main
import (
"fmt"
"strconv"
)
func main() {
nums := make([][]string, 9)
for i := 0; i < 9; i++ {
nums[i] = make([]string, 9-i)
}
for i := 0; i < 9; i++ {
for j := 0; j < 9-i; j++ {
nums[i][j] = strconv.Itoa(i + 1)
nums[i][j] += "*"
nums[i][j] += strconv.Itoa(i + j + 1)
nums[i][j] += "="
nums[i][j] += strconv.Itoa((i + 1) * (i + j + 1))
}
}
for i := 0; i < 9; i++ {
for j := 0; j < 9-i; j++ {
fmt.Print(nums[i][j])
fmt.Print(" ")
}
fmt.Println()
}
}
接下来是写入缓冲区。缓冲区bytes.buffer需要先转为字节数组(bf.bytes( ))才能写入到文件中。这点老是忘记。
package main
import (
"bytes"
"os"
"strconv"
)
func main() {
nums := make([][]string, 9)
for i := 0; i < 9; i++ {
nums[i] = make([]string, 9-i)
}
for i := 0; i < 9; i++ {
for j := 0; j < 9-i; j++ {
nums[i][j] = strconv.Itoa(i + 1)
nums[i][j] += "*"
nums[i][j] += strconv.Itoa(i + j + 1)
nums[i][j] += "="
nums[i][j] += strconv.Itoa((i + 1) * (i + j + 1))
nums[i][j] += " "
}
nums[i][9-i-1] += "\n"
}
/*
for i := 0; i < 9; i++ {
for j := 0; j < 9-i; j++ {
fmt.Print(nums[i][j])
fmt.Print(" ")
}
fmt.Println()
}
*/
var bf bytes.Buffer
for i := 0; i < 9; i++ {
for j := 0; j < 9-i; j++ {
_, err := bf.WriteString(nums[i][j])
if err != nil {
panic(err)
}
}
}
filePath := "test.txt"
file, _ := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666)
defer file.Close()
file.Write(bf.Bytes())
}
输出结果如图,主要是用到的API太多了,不好记。只能多写+系统地复习了。
技术问题
配置虚拟机IP地址,子网掩码
这个真的是致命问题,麻中麻。虽然最近刚配了交换机的ipv4和子网掩码,但是概念没记熟而且记混了,面试官还提醒我子网掩码说错了。
然后还问到了怎么在Linux系统中通过DOS,也就是命令行来配置子网地址和子网掩码。但平时都是图形化界面配置,还真没注意过这一点。
网络这块的指令我只在windows上用过ipconfig。linux上只用过nmap和netstat。
至于怎么在Linux中配置子网地址和子网掩码,涉及到网卡文件的配置,这一块我手边有电脑了再单独开篇文章细讲,这里先过了。
技术问题
拷打个人博客
因为项目里提到了个人博客,所以免不了的被拷打。而且由于博客上线了,我在简历里还贴心的附上了链接,所以面试官直接现场打开了我的博客开始拷打。
不过我的博客虽然用的是cms框架(wordpress),但我也不是完全依赖原生的模板和组件的,安装wordpress也没去用腾讯云的一键建站(当时不知道能选….)。像怎么部署wordpress,或者网页侧边栏还有我自己写的一些样式之类的,这些的html代码都是我自己写的然后插入到原本的html文档中的。所以这方面还是能接受拷打的。这方面只问了下怎么实现的这个侧边栏效果就过了。
本来访问量统计也是我用php写的,但php这块我没有能接受拷打的自信,所以没提。
技术问题
分析为什么页面加载速度过慢
很即兴,也很突然的一道题。给了一个问题:如果你的网站主页,在某一天突然加载很慢。你该怎么找出原因。
那么首先,这个问题是“突然发生”。所以和网页本身的html没太大关系。所以答页面资源过大导致的输慢啊之类的不行。
接下来分两个方面进行分析,服务器和客户端。
客户端的话无非就是网络问题。因为它是“加载慢”而不是完全无法访问,所以和本地dns解析和ip地址设置之类的没啥关系,ping自然也能ping通。那么先看客户端网速有没有问题,访问其他网页会不会卡顿。然后如果只有访问我的网站会卡顿的话,那么说明问题出现在服务器上。
然后这块我想的是服务器流量过大,也就是那个时间段的访问量过大导致阻塞。当然这块懂的可以接着拓展,比如为什么会导致阻塞这块可以展开讲讲。
但是这个回答不够全,也不是面试官想听到的。
我也有考虑过是不是网络攻击,但我下意识的把网络攻击归类到“服务器带宽不够”的情况了。不过面试官提到网络攻击不一定会导致带宽不够或者流量过大。但是网安这块我真的不太熟,也算是拓展知识面了吧。
面试官见我还没回答出来,就开始提醒:如果服务器后台被植入挖矿程序,怎么排错。
我想的是用指令查看服务器的cpu占用情况。然而实际上正确的回答是用top去找出占用最高的进程。
所以我复盘之后才发现自己遗漏了一点:服务器的其他进程占用了资源。嘛,就当这次积累经验了。以后被问到能答出来就值得了。
总的来说这些知识点你自己捣鼓服务器的话是很难碰到的。一方面现在各云厂商服务器在安全这方面做的还是还好的(毕竟网安靠这行吃饭的,不做好那就寄了)。另一方面你只要不刻意作死+有基本的安全防护意识,很难碰到后台被植入挖矿病毒这种情况。
所以这块真的只能靠平时网上冲浪,刷刷面经然后积累经验,才能有个大概的思路。
其它问题
没了
全程50分钟都是在深挖项目。以及项目的横向拓展。中间还有问到一些Linux常用指令之类的。虽然我做的项目,说实话横向拓展这块我做的不够好,还有很多可揪细节和拓展的地方。不过但好在都是我自己写下来的,而且主体框架我比较熟悉,所以不至于一面就挂了。
还有一点就是真的不要报菜名。面试官问到你再说也不迟。你要是先报菜名把你熟悉的都说完了,那面试官肯定会问你不熟悉的那块,问你熟悉的你都会,问了也没什么意义。
我当时就是太急然后开始报菜名,把熟悉的都说完了,那想不被拷打都难。当然如果你很有自信那报菜名也没啥问题。
以及开源项目最好能写出具体的技术贡献,不然没啥意义。计划在大四秋招之前能给2-3个github上的项目做点技术层面的贡献,这个再写到简历上就会好很多。
其它的就没问啥了。至于面试……怎么说呢,只要脸皮够厚+不限次数那确实是查缺补漏的一个好方法。反正发现自己有问题没啥,改就行了。就怕自己没发现问题然后给别人揪出来了,这就比较尴尬了。