知乎-如何面试Python后端工程师?

原文地址

 

作者:董伟明
链接:https://www.zhihu.com/question/33398583/answer/122435737
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

谢邀。我之前在豆瓣负责过一段时间我们组的技术面试。由于现在不再去面试,可以爆一爆。

1. 我从来不问google可获得的答案的问题, 只是问问面试者「在过去的工作中,遇到的Ta认为最有成就感的一件事情是什么」和「如果出现了一个google不到的问题,你会怎么解决」这样的问题。

2. 我从来不问操作系统等和Python无关的话题,首先是我不怎么问和工作太无关的话题,有些东西用不到很多就被会遗忘,挑起来这种问题其实挺无聊;其次我是非计算机专业毕业,问的东西说不定我自己都没有把握,那就不出来献丑了。我只关注面试者的学习能力和解决问题的方式,说白了,是不是就是看他是不是「聪明的人」。

3. 不问面试者的短处。我在自己被面试的时候有过这种精力,面试者问他擅长的内容,我不一定搞的定,如果反过来面试Ta,我也会灭掉Ta。所以我会尽力寻找面试者的优势和优点,尤其是对方已经明确承认。其实很多经验和能力,只是需要一个机会和环境,所以我不想放过任何一个合适的人。

4. 面试者不会Python也没有关系。面试者的主动性和学习能力觉得更重要,如果他在其他领域能证明做的不错或者能让我感觉到这个一个未来有潜质成为优秀工程师的人,不会Python没有关系。 嗯目前看来,我没有看错过。

5. 我从来不问Python语法这种看书和google就能学会的问题,我只想了解Ta是否愿意去学。举个例子,我会让面试者「讲讲日常开发中都用到了那些Python内置的模块」,原因在我的专栏「Python之美 - 知乎专栏」的 Python不能不知的模块 - Python之美 - 知乎专栏中有写,基本上说完我就能评估出他的能力和风格,继而就是再问一些问题去验证我的评估是不是准确。

6. 最后,我一般都会和面试者细聊一个Ta认为在过去的工作或者自己开源的项目中最熟悉的一个,从项目设计、踩过的坑儿、开发周期以及如何安排、如何确定需求、如何和其他人协作等方面,最后评估下Ta是否能很容易的融入到我们现在的团队,大家是否可以接受Ta,对工作不负责的、没有用心工作的、没有团队意识的、沟通能力有缺陷的就放弃掉,对性格上容易发生冲突的、不适合团队合作的我就得考虑下,未来也会如实反馈给HR。

 
 
作者:罗伊
链接:https://www.zhihu.com/question/33398583/answer/59017861
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

更新:讨论区挺热闹,有人说好简单,有人说好难,其实我觉得这只适合面试2~3年工作经验的后端工程师。真的没有问
很难的题目,只是可能你平时没有注意。
在这里我推荐几本书吧
python参考手册,绝对让你更上一层楼
图解密码技术,密码入门不二之选
mysql技术内幕第五版,有点厚当手册读读,要有耐心,高性能mysql也强烈建议读读
effective tcp/ip programming

为什么评论区有这么大差异?我想是个人经历不一样吧,如果是搞web的对操作系统这块和密码技术会偏弱,但如果是系统工程师或是游戏服务端这块会明显偏强。


吃午饭的时候我就一直在想这个问题,我觉得重点不是Python而是后端工程师,因为Python只是系统的一部分,linux基础操作要熟吧,sql要懂吧,消息队列要知道吧,git要熟悉吧......木桶理论,每一环都不能落下,精通其中一两环就更好了。基础功扎实,新东西学得快,代码写得溜,命令敲得顺,bug解的好,妈妈再也不用担心我天天加班了~~~

一.语言
1.推荐一本看过最好的python书籍? 拉开话题好扯淡
2.谈谈python的装饰器,迭代器,yield?
3.标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗?
4.python适合的场景有哪些?当遇到计算密集型任务怎么办?
5.python高并发解决方案?我希望听到twisted->tornado->gevent,能扯到golang,erlang更好

二.操作系统
可以直接认为是linux,毕竟搞后端的多数是和linux打交道。
1.tcp/udp的区别?tcp粘包是怎么回事,如何处理?udp有粘包吗?
2.time_wait是什么情况?出现过多的close_wait可能是什么原因?
3.epoll,select的区别?边缘触发,水平触发区别?

三.存储
存储可能包含rdbms,nosql以及缓存等,我以mysql,redis举例
mysql相关
1.谈谈mysql字符集和排序规则?
2.varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符
3.primary key和unique的区别?
4.外键有什么用,是否该用外键?外键一定需要索引吗?
5.myisam与innodb的区别?innodb的两阶段锁定协议是什么情况?
6.索引有什么用,大致原理是什么?设计索引有什么注意点?
redis相关
1.什么场景用redis,为什么mysql不适合?
2.谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?
3.redis内存满了会怎么样?

四.安全
web安全相关
1.sql注入是怎么产生的,如何防止?
2.xss如何预防?htmlescape后能否避免xss?
3.csrf是什么?django是如何防范的?

密码技术
1.什么是分组加密?加密模式有哪些?ecb和cbc模式有什么区别?为什么需要iv向量?
2.简单说说https的过程?
3.对称加密与非对称加密区别?
3.如何生成共享秘钥? 如何防范中间人攻击?

五.杂
是否关注新技术啊?golang,rust是否了解?numpy,pandas是啥鸟?
是否紧跟时代潮流?逛不逛微博,刷不刷知乎?

可能你觉得我问的好细,但这好多都是平常经常遇到,并需要解决的,细节更能体现一个人。

如果你觉得小kiss,欢迎投简历给我yihaibo@longtugame.com,龙图游戏运营支持中心数据分析部招人;觉得有点问题,那还等什么,赶快来和我交流交流。
 
 
 
作者:艾维邑动
链接:https://www.zhihu.com/question/33398583/answer/92661868
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

面试其实还是要区分对待的,行内老牛和新人在不同的方向上都有各自的特点,包括老牛们丰富的经验、全面的眼界等等,也包括新人的锐气和新的思维观念。


根据工作经验要求划分基本的可以分为两大块吧:

1)、 先了解其项目经历,项目中的职责,看其对自己模块,整体框架及业务的了解程度。再根据他接触过的知识点拓展来问。接着拿现在项目中遇到过一些问题问问,听他的解决思路。也可拿以后经常用的技术来问问。最后再补问一些他没接触过的技术知识来问。主要以听为主,适当的引导。

2)、 对那些项目经验不足的新人,适当的增加基础技术比例,比如

- 谈谈装饰器,迭代器,yield,内存管理等

- Python高并发解决方案

- 计算密集型,IO密集型任务怎么办

- Tcp/Udp协议,Http协议

- sql,cache, nosql

- web安全相关,sql注入,xss等


总体来说,不管对于老牛还是新人,扎实的基础和灵活的思维,都是必要的。

但选择一个合适的同事其实还有很多因素,包括一个新人的到来能带给团队活力,或者你正好需要一个认知全面,把控力十足,思路严谨的老同志···


 

 
解释一下 WSGI 和 FastCGI 的关系
解释一下 Gevent 和 threading / multiprocessing 的关系
解释一下 cookie 和 session 的关系,以及 xsrf 的攻击和防范方法
解释一下 Django 和 Tornado 的关系、差别
考考数据库知识,SQL 语法和调优,SQLAlchemy 的用法


 
作者:老王
链接:https://www.zhihu.com/question/33398583/answer/95330870
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上各位都是从面试者的角度答复的,我从被面试者的角度,记录下自己被问到的问题【刚刚从成都到上海找工作】:

先夹带点私货:本人1999年入行,最近3年的项目经验参见这个回答华为的员工工作幸福吗? - 老王的回答中的【1、在华为研发8年的收获是什么:学习新知识的能力】,欢迎推荐上海的python工作机会。个人对这个行业的现状是这样理解的,对年薪30万以下的程序员,没有一组英文关键词搜不到的答案,如果搜不到,就加个stackoverflow试试。从来上海之后的面试过程看,似乎面试官并不认同这个思路。只好重新回到刷题库的方式上,以下为面试问题的整理,持续更新。

1、lock free:
陈硕的《linux服务端编程》里面,讲过一种不加锁的方案:原子级操作,他的muduo库中就有一个实现,用于实现+1操作【两年前看的,如果有误欢迎指正】。
考虑到面试官的python开发背景,应该指的是CAS实现lock free,以下内容参考了乐观的并发策略——基于CAS的自旋
上文中有示意图,我只写下个人理解:
1.1、CAS是Compre And Swap的缩写,意为比较并交换
>对于不同线程间共享的数据,在对象/实例中保存一个副本
>每次赋值之前,先拿副本和共享数据进行比较
>如果结果一致,用一个原子级操作为共享数据赋值【同时,修改副本值】
1.2、CAS的不足:
>只能保护一个数值,如果有多个,只能依靠互斥锁来保护
>对ABA类的问题,只能靠每次修改都增加版本号来解决【印象中<Mysql高性能编程>里面讲过多版本的机制】
>长期自旋,浪费CPU资源 -- 这一点没看懂,上文提供的示例代码中getAndIncrement函数用了for(;;)

2、对mongodb中文档中的数组类型变量如何加索引:
官方文档:Multikey Indexes
stackoverflow上的相关问题:mongodb: Multikey indexing structure?
以及MongoDB索引类型:MongoDB Indexes (part 1)

3、接问题2,面试官问数组类型field,数量达到10万、100万时效率如何?
待续

2016-04-24更新:
上面的内容是4月15号写的。
4月18号面试,两轮面试后当天确定录用,这次面试没问技术细节,这个坑暂时不填了,安利下高票答案推荐的《Python参考手册》。
 
 
 

我有另外一个思路,就是不问具体python里面的问题。尤其是一些很深的问题,因为可能大部分的项目不设计优化语言本身,甚至高级技巧也是很难碰到的,而是让其快速解决具体问题。
因为用到python做开发就是注重开发快迭代快上手容易的特性(如果你用django当我没说)

所以面试就是解决具体问题:

我参加过一个面试当时面试官直接让我写一个爬虫爬某网站,我觉得这样考还挺不错的。
类似的问题包括处理日志,配置一些自动化运维的场景,写自动化测试,做个短链接服务等等。。。python程序员我自己感觉涉猎要非常广,基本思路就是实际的问题-》解决方案(用到哪些工具,什么场景用什么)-》验证/测试/自动化

如果是我来面的话我可能还会问一些编程基础的,数据结构的使用方法,rush condition的处理方法,scale的方向,思路等等。。。毕竟写得快是一方面,写出来的东西能用是另外一方面。
如果解决问题迅速,写的快,给的实际问题都能很快找到解哪怕是方向的话,那基本上我会觉得这个面试人解决问题的态度和能力都比较强,可以进一步考察~


作者:朱佳祺
链接:https://www.zhihu.com/question/33398583/answer/59193928
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
 

语言, gil/mro/metaclass/descriptor/corountin 变着法子问吧,闭包和装饰器可以一块问,当然也可以结合项目经验,如果做过后端api的,几乎没有不用到decorator的吧,说说staticmethod和装饰器的区别啊,写一个bottle绑定 url path的 decorator 或者口述一下原理,等等,这个基础并不一定要对方完全覆盖,但如果都答不上来肯定不行。

系统,对linux有多了解,做服务端开发,poll/select 得知道吧,负载均衡的几种算法要听过把。

通信协议,tcpip http 等等,具体问题比如restfull 风格的api怎么写,网页嵌入的im原理等

工程思维,大局观,个人追求。这个结合对方实际经验来问,问的越犀利越好。抓住项目中的critical point,候选人担任了什么角色,如何去解决,等等。



作者:胡子
链接:https://www.zhihu.com/question/33398583/answer/59158013
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2018-02-14 21:40  dion至君  阅读(289)  评论(0编辑  收藏  举报