常用协议TCP、IP、HTTP
Socket编程基础
Python并发库
Mysql常考,索引优化
关系型和NoSQL的使用场景
Redis缓存
常用框架对比,RESTful
WSGI原理
Web安全问题
设计原则,如何分析
后端系统常用组件(缓存、数据库、消息队列等)
技术选型和实现(短网址服务、Feed流系统)
学习能力
业务理解能力,沟通交流能力
心态
扎实的计算机理论基础
代码规范,风格良好
能在指导下靠谱地完成业务要求
扎实的计算机基础和丰富的项目经验
能够独立设计和完成项目要求
熟悉成员web组件(缓存、消息队列),具有一定的系统设计能力
具有产品意识,技术引导产品
沟通交流嫩合理,团队协作能力
技术领导能力和影响力
平台决定成长(业务体量)
准备面试需要有的放矢,跟职位相匹配
基本信息(姓名、学校、学历、联系方式等)
职业技能(编程语言、框架、数据库、开发工具等)
关键项目经验(担任职责,用到了哪些技术)
知名项目经验
技术栈比较匹配
开源项目(GitHub、技术blog、Linux、unix geek)
内容精简、突出重点。不宜超过两页、可以套用模板
主要格式,推荐PDF
信息真实,不弄虚作假。技能要和岗位匹配
个人信息
掌握的技术,参与过的项目
应聘的岗位,表达对该岗位的看法和兴趣
根据候选人过去的行为评测其胜任能力
理论依据:行为的连贯性
人在面对相似的场景时会倾向于重复过去的行为模式
评判人的业务能力,沟通交流能力,语言表达能力,坑压能力等
提问方式:说说你曾经
说说你做过的这个项目
说说你碰到过的技术难题?你是如何解决的?有哪些收获?
千万别说没了,直接说表明你对岗位缺乏了解和兴趣
表现出兴趣:提问工作内容(业务)、技术栈、团队、项目等
问自己的感兴趣的问题
态度真诚,力求真实,不要弄虚作假
言简意赅,突出重点,省略细枝末节。适当模拟训练
采用STAR模型让回答更有条理
动态强类型语言
动态还是静态指的是编译期还是运行期确定类型
强类型指的是不会发生隐式类型转换
胶水语言,轮子多,应用广泛
语言灵活,生成力高
性能问题、代码维护问题、Python2、3兼容问题
比如file,StringIO,socket对象都支持read/write方法
再比如定义了__iter__魔术方法的对象可以用for迭代
所谓的monkey patch就是运行时替换
比如gevent库需要修改内置的socket
运行时判断一个对象的类型的能力
Python一切皆对象,用type,id,isinstance获取对象类型信息
Inspect模块提供了更多获取对象信息的函数
比如[i for i in range(10) if i % 2 == 0]
一种快速生成list、dict、set的方式。用来替代map、filter等
(i for i in range(10))返回生成器
print成为函数
编码问题。Python3不再有Unicode对象,默认str就是unicode
除法变化。Python3返回浮点数
类型注解(type hint)。帮助IDE实现类型检查
高级解包操作。a, b, *rest = range(10)
Keyword only arguments。限定关键字参数
Chained exceptions。Python3重新抛出异常不会丢失栈信息
生成的pyc文件统一放在__pycache__
一些内置库的修改。urllib,selector等
性能优化等
yield from链接子生成器
asyncio内置库,async/await原生协程支持异步编程
six模块
2to3等工具转换代码
__future__
可变类型参数
不可变类型参数
传递值还是引用呢?都不是。唯一支持的参数传递是共享传参
Call by Object (Call by Object Reference or Call by sharing)
Call by sharing(共享传参)。参数形参获得实参中各个引用的副本
不可变bool int float tuple str frozenset
可变list set dict
用来处理可变参数
*args被打包成tuple
**kwargs被打包成dict
Python使用异常处理错误
BaseException
SystemExit/KeyboardInterrupt/GeneratorExit
Exception
网络请求(超时、链接错误等)
资源访问(权限问题、资源不存在)
代码逻辑(越界访问、KeyError等)
继承Exception实现自定义异常(想想为什么不是BaseException)
给异常加上一些附加信息
GIL, Global Interpreter Lock
Cpython解释器的内存管理并不是线程安全的
保护多线程情况下Python对象的访问
Cpython使用简单的锁机制避免多个线程同时执行字节码
限制了程序的多核执行
CPU密集程序难以利用多核优势
IO期间会释放GIL,对IO密集程序影响不大(爬虫,web)
CPU密集可以使用多进程
IO密集可以使用多进程、协程
cython扩展
Python中什么操作才是原子的?一步执行到位
一个操作如果是一个字节码指令可以执行完成的就是原子的
原子的是可以保证线程安全的
使用dis操作才分析字节码
使用各种profile工具(内置或者第三方)
内置的profile、cprofile等工具
使用pyflame(uber开源)的火焰图工具
web应用一般语言不会成为瓶颈
数据结构和算法
数据库层:索引优化,慢查询消除,批量操作减少IO,NoSQL
网络IO:批量操作,pipeline操作减少IO
缓存:使用内存数据库redis/memcached
异步:asyncio,celery
并发:gevent/多线程
Least-Recently-Used替换掉最近最少使用的对象
字典用来缓存,循环双端链表用来记录访问顺序
常见排序算法的时空复杂度
链表有单链表、双链表、循环双端链表
如何使用Python来表示链表结构
实现链表常见操作,比如插入节点,反转链表,合并多个链表等
LeetCode练习常见链表题目
206翻转链表
队列(queue)是先进先出结构
Python dict/set底层都是哈希表
哈希表如何解决冲突
先序、中序、后序
堆其实是完全二叉树,有最大堆和最小堆
传说中的手写算法题,白纸或者白板上手写代码
工作用不到,为什么还要考?
没有太好的方式,刷常见题。防止业务代码写多了算法手生
刷题(LeetCode+剑指Offer+不同公司的面经)
链表涉及指针操作较为复杂,容易出错,经常用作考题
熟悉链表的定义和常见操作
常考题:删除一个链表节点
LeetCode237
常考题:合并两个有序链表
LeetCode21
二叉树涉及到递归和指针操作,常结合递归考察
二叉树的操作很多可以用递归的方式解决,不了解递归会比较吃力
常考题:二叉树的镜像(反转二叉树)
LeetCode226
常考题:如何层序遍历二叉树(广度优先)
LeetCode102
后进先出(栈)vs 先进先出(队列)
常考题:用栈实现队列
LeetCode232
堆的常考题基本围绕在合并多个有序(数组/链表)、TopK问题
理解堆的概念,堆是完全二叉树,有最大堆和最小堆
会使用Python内置的heapq模块实现堆的操作
常考题:合并k个有序链表
了解字符串的常用操作
Python内置了很多字符串操作,例如split、strip、upper、replace等