如何面试Python 后端工程师(持续更新)

看到“如何面试Python后端工程师”这个问题下一位大牛罗列的问题,感觉挺有价值。现在记在这里,找出这些问题的答案,持续更新。

一 . 语言

1.推荐一本看过最好的python书籍? 拉开话题好扯淡 

目前所知道的,看过的就是《Python 核心编程》(第二版),《Flask》


2.谈谈python的装饰器,迭代器,yield? 

2.1 装饰器,这篇博文说的很细致,总的来说,装饰器是对函数的一种通用处理方法。

 http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

2.2 迭代器,生成器

http://www.cnblogs.com/kaituorensheng/p/3826911.html

带有 yield 的函数在 Python 中被称之为 generator(生成器)

xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器.


2.3 yield

https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/

函数中有yield语句,这个函数就是一个“生成器函数”。函数的每次调用都是一个生成器。

比如 def f, f 是函数, 但 f(1),f(2)就是两个不同的生成器。

生成器中会返回迭代对象,达到省内存的目的。

3.标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗? 

线程安全即解决线程同步问题。

Queue 是标准库中线程安全的队列,实现了(FIFO).

logging 是线程安全的,但不是 “Process-safe”的,进程安全?。

4.python适合的场景有哪些?当遇到计算密集型任务怎么办? 

Python适合的场景1. 科学计算 2. 快速原型开发 3.网站. 4. 脚本。 实际上在各个方向上它都有挺多应用,前列几项算是比较火的吧。计算密集型任务模块用C/C++做。多进程,多线程也可以稍微提高些。


5.python高并发解决方案?我希望听到twisted->tornado->gevent,能扯到golang,erlang更好

二. 操作系统可以直接认为是linux,毕竟搞后端的多数是和linux打交道。 

1. tcp/udp的区别?tcp粘包是怎么回事,如何处理?udp有粘包吗?

TCP/UDP, 可靠与非可靠;三次握手,四次挥手;滑动窗口,拥塞控制;

TCP粘包: http://blog.chinaunix.net/uid-429659-id-5207848.html  


2. time_wait是什么情况?出现过多的close_wait可能是什么原因? 

参考资料:

http://blog.csdn.net/yusiguyuan/article/details/21445883

http://www.cnblogs.com/Jessy/p/3535612.html

CLOSE_WAIT

发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,

但未发出ACK的TCP状态是CLOSE_WAIT出现这种状况一般都是由于server端代码的问题,

如果你的服务器上出现大量CLOSE_WAIT,应该要考虑检查代码。

TIME_WAIT

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态

TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒。

TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,

如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket,

甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务。


3.epoll,select的区别?边缘触发,水平触发区别?

select,poll,epoll都是IO多路复用的机制。

I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行

相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个

读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。

水平触发(level-triggered,也被称为条件触发)LT: 只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你)。select属于条件触发。

边缘触发(edge-triggered)ET: 每当状态变化时,触发一个事件。

三 存储

存储可能包含rdbms,nosql以及缓存等,我以MySQL,redis举例。

mysql相关   mysql 是流行的RDBMS  关系型数据库


1.谈谈mysql字符集和排序规则? 


2.var char与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符

char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10, 除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。

尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

首先要确定mysql版本4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节)

5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个


3.primary key和unique的区别? 


4.外键有什么用,是否该用外键?外键一定需要索引吗? 


5.myisam与innodb的区别?innodb的两阶段锁定协议是什么情况?

 
6.索引有什么用,大致原理是什么?设计索引有什么注意点? 

redis相关 

1.什么场景用redis,为什么mysql不适合? 

redis 所有数据放在内存中,内存数据库。nosql(不过也可以持久化,持久化使用RDB或AOF方式。)

mysql无论数据还是索引都放在硬盘中,使用时才交换到内存中,能够处理远超内存总量的数据。

mongodb,是一个内存数据库,数据都放在内存中。持久化:mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。

数据量和性能:
当物理内存够用的时候,redis>mongodb>mysql
当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。
实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。
但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。
mongodb还是能够保证性能。有人使用mongodb存储了上T的数据。
mysql,mysql根本就不需要担心数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。
当物理内存和虚拟内存都不够用的时候,估计除了mysql你没什么好选择了。
其实,从数据存储原理来看,我更倾向于将mongodb归类为硬盘数据库,但是使用了mmap作为加速的手段而已。

2.谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗? 


MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。
Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:

1. Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行
另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行。
2.在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。

3.redis内存满了会怎么样?

可以配置文件,选择删除某些键值或者直接报错。。。

四 安全

web安全相关 
1.sql注入是怎么产生的,如何防止? 

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,

最终达到欺骗服务器执行恶意SQL命令的目的。

如何防止:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全
平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

2.xss如何预防?html escape后能否避免xss? 


3.csrf是什么?django是如何防范的?

五 密码技术

1.什么是分组加密?加密模式有哪些?ecb和cbc模式有什么区别?为什么需要iv向量? 


2.简单说说https的过程? 

http 运行在TCP 之上,数据明文传输。HTTPS 运行在SSL/TLS之上,SSL/TLS运行在TCP之上,是加密协议,因此HTTPS传输

的已经是加密的数据,加密采用对称加密。但对称加密的密钥用服务器方的证书进行了非对称加密。

SSL/TLS中使用了非对称加密,对称加密以及HASH算法。

http://www.cnblogs.com/binyue/p/4500578.html

HTTPS一般使用的加密与HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256


3.对称加密与非对称加密区别? 

对称加密是指加密和解密使用的密钥是同一个密钥,或者可以相互推算。

对称加密的优点是算法简单,加解密效率高,系统开销小,适合对大数据量加密。

缺点是解密加密使用同一个密钥,需要考虑远程通信的情况下如何安全的交换密钥,如果密钥丢失,

所谓的加密解密就失效了。

非对称加密和解密使用的密钥不是同一密钥,其中一个对外界公开,被称为公钥,另一个只有所有者知道,

称作私钥。
用公钥加密的信息必须用私钥才能解开,反之,用私钥加密的信息只有用公钥才能解开。

4.如何生成共享秘钥? 如何防范中间人攻击?


你可能感兴趣的:(如何面试Python 后端工程师(持续更新))