今天面了两家公司总结一下吧
1:RH测试工具的开发,下午去的公司。进门第一眼,让人印象深刻的Logo直接映入眼帘。整个办公环境没的说,干净整洁。来来往往有许多人,我心想这么老牌的公司业务是有多忙,后来才知道原来正在布置中秋Party的现场。废话不多说了,进入正题。
首先被一个带着医用口罩的女员工领入了一个非常小的Office,手上拿了一份10来页的笔试题,很基本也很全面。包括了一个测试开发工程师所需要掌握的所有必备技能,让我们来看一看这都包括哪些内容。顺序不太记得了,我尽量按照原先顺序吧。
第一:linux常用操作:这一部分非常基础,一般接触过linux的同学一般都能回答上来,类似什么常用的linux命令之类的,里边比较重要一些的就是/root,/proc,/etc/,sys,/boot,/user这些文件夹内的内容。这些网上也都有很多介绍。
第二:shell命令:一般考察常用的shell 命令代表什么意思,不过有一个命令连续出现了在3个小题中,就是touch,都知道是创建一个文件,但是它出题的角度很有意思 touch a{1,2,3,4,5,6,7,8,9} ,这我就懵了,从来没这么用过。。。百度之后才知道,原来就是创建a1,a2...a9多个文件。这一部分就是送分题。
第三:数据结构:里边包含三个选择题,基础的我都觉得尴尬,1.单链表的插入,2.前序遍历的顺序,3不记得了反正很简单
第四:操作系统:里边比较有意思的就是linux的启动需要哪些文件以及内核的存放位置,这些都学过可惜出校门后就基本没用过了。这里给出网址http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html,我觉得这一本分还是比较重要的,所以总结一下就是
第一步、加载内核 读入/boot下的内核文件。
第二步、启动初始化进程 开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。
第三步、确定运行级别 Linux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。(这里我说6是图形化界面。。。汗颜)init进程首先读取文件 /etc/inittab,里边包含了运行级别的配置文件。不同的运行级别会启动不同的加载程序
第四步、加载开机启动程序
第五步、用户登录
第六步、进入 login shell 这里首先读入 /etc/profile,这是对所有用户都有效的配置,一般系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc。这里给出之间关系 http://blog.csdn.net/yanjiangbo/article/details/6427580
第五:Python的使用:包括类型转换、re库、装饰器、生成器等字符串方面的。并没有问我最近常用的multiprocess、multithreading之类的较高级模块,虽然我很想回答。
至此笔试内容介绍完毕。测试时间是一个小时,时间到了我还有一页没写完。。。
过了5分钟就开始面试,主要包含的问题都是比较零碎的,印象比较深刻的就是提问当gitpush的时候push失败(不是有conflict),而是发现是由于master版本已经跟目前本机master版本不一致时应该如何操作。后来百度一下才知道,本地仓库向远程仓库push前,要保证和远程仓库版本的同步。所以最好先pull一下,以确保除自身修改内容外的文件同步。还有就是有关手写实现python中dict的用法,当时不知道想考察什么,现在网上搜了一下才知道,主要想考察这些:
#默认迭代key for k in d: print k #iterkeys()返回key迭代器 for key in d.iterkeys(): print key #itervalues()返回value迭代器 for value in d.itervalues(): print value #iteritems()返回键值对迭代器 for key,value in d.iteritems(): print key+"="+str(value) #判断对象是否可迭代:通过collections模块的Iterable类型判断 from collections import Iterable print isinstance(d,Iterable) #带下标迭代:Python内置的enumerate函数可以把一个list变成索引-元素对 l=range(5) for i,value in enumerate(l): print i,value
#列表生产式
[exp for val in collection if condition]
#字典生成式
{key-exp:val-exp for value in collection if condition}
#集合生成式
{exp for value in collection if condition}
#嵌套列表生成式
L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']] print [name for list in L1 for name in list if name.count('a')>0] #运行结果: ['Cathy', 'Zhang', 'Wang', 'Jack']
还有关于generator的用法:
#1.创建一个generator,只要把一个列表生成式的[]改成(),就创建了一个generator: g=(x for x in range(1,10)) print g.next() print g.next() #2.定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator: def fib(n): a=1 b=1 i=0; yield a yield b while(i<n): a,b=b,a+b i+=1 yield b for x in fib(10): print x
以上部分来自 http://www.cnblogs.com/janes/
第二家是MT,明天接着说。。。