后端工程师

1.后端项目实战

Python+Django+MySQL

前期准备

1.CD[shell]

  1. cdChange Directory,切换路径,可以通过在后面添加接驱动器符号、完整路径和相对路径来实现路径的转换。
  2. 命令行工具:Windows+R打开运行窗口,输入cmd,进入命令行工具界面,默认目录为当前用户所在的目录

2.使用方法

  1. 回到根目录

    cd/

  2. 回到上一层目录

    cd..

  3. 进入任一目录

    方法1:
    (1) 直接输入[该目录所在盘区]:   ——以此进入该盘区目录;
    (2) 然后输入cd [在盘区下相对路径] ——以此进入该目录;

1
2
3
4
5
6
7
8
9
10
11
12
default C:\Users\Administrator
# 切换硬盘
C:\Users\Administrator:D
D:\>
# 进入盘中的路径
D:\>cd django_project
D:\django_project>
# 返回上一层
D:\django_project>c..
# 直接切换由C-->D
cd /d +绝对路径
cd /d D:\django_project

0.问题

侧重的知识

在我参加的后台开发岗位面试中,主要有以下知识是比较侧重

\1. 数据库CRUD操作/查询优化以及数据库知识量

\2. 框架的对比和了解/项目具体模块的业务逻辑描述

\3. 常见排序算法

\4. Linux系统的常用命令和Linux系统了解程度考核

\5. 项目部署用到的服务器的配置和了解程度

加分项

  1. 数据库基本功必须掌握但同时更重要的是理解为什么和是如何实现的,拓展自己知识面
  2. Linux系统的底层原理和了解程度
  3. 目前Golang在后端中也逐渐流行,有时间还是需要去掌握
  4. 技术没有终点,保持乐于学习和接受新技术的心态,面试官看重技术能力同时也更看重你的心态
  5. 自信且好学

面试提问到的问题

问题就给大家了,答案自己去查找吧,只有经过自己努力的东西才会格外珍惜。

Python相关

  1. 实现一个单例模式
  2. 实现一个装饰器
  3. 用Python实现快排
  4. 如果系统中需要很多个Python版本,如何进行Python版本的管理
  5. 如何实现一个全局变量?(除了global,还可以通过单例模式)

数据库相关

  1. 数据库的数据是实时更新的吗?每点击一次,数据库数据修改一次?
  2. Redis hash的个数
  3. 如何修改Redis数据库的库的个数?
  4. Redis数据库如何实现持久化
  5. Redis数据库支持的数据类型
  6. Redis使用AOF方式持久化,aof文件不断增大,如何处理?
  7. Redis数据库如何设置密码
  8. hash表是如何生成的
  9. MySQL数据库如何使用sql语句插入一条数据
  10. MySQL数据库的慢查询有了解过吗
  11. MySQL数据库如何进行查询优化
  12. 如何很多请求同时对Redis的同一个键进行访问,如何保证数据安全
  13. 说说Redis的淘汰机制
  14. 我的MySQL数据库每天晚上12点进行全备份。第二天有员工在9点钟误删除了一个数据库,但在10点钟才被发现。问如何进行恢复被误删除的数据库并同时保留9点到10点钟新增的数据同时不影响业务的正常运行?
  15. 当数据越来越多,如何避免hash槽中key出现相同的情况?
  16. MongoDB在哪些场合使用过?

项目部署相关

  1. 大家都说Nginx快?快的原因是什么?
  2. 对RPC了解吗?
  3. 如何在服务器上设置业务进程数?
  4. 说说正向代理和反向代理

Linux相关

  1. 如何查看剩余内存
  2. 如何查看端口是否被占用
  3. 如何查看一个程序的PID以及它的所有子进程
  4. 如何为一个目录下的所有文件添加权限
  5. 如果你对一个目录具有写权限,那么你是否具有对这个目录下的所有文件具有删除权限?
  6. 对Linux多路复用的理解
  7. 修改IP地址的方法

前端相关

  1. 对前端HTML CSS 和 JS了解多少?熟悉吗?
  2. 对React和bootstrap了解吗?
  3. 如何进行http优化?(响应头设置Content-Encoding: gzip)

网络编程相关

  1. 说一下实现TCP建立连接的过程以及当时进入了什么状态?为什么建立连接只需要3次,断开连接需要4次?为什么断开连接时第二次和第三次要分开,不能合在一起吗?

项目相关

  1. 说一下一个请求过来到返回response的过程
  2. 如何实现单点登录
  3. JWT token是如何进行生成和校验的
  4. 了解过哪些后端框架?Tornado了解吗?
  5. 了解过webapp2吗
  6. Django如何实现csrf攻击保护
  7. 说说你项目中遇到的困难以及如何解决
  8. 说说你认为自己最有成就感或最深刻的项目
  9. 对KAFKA了解吗?用过哪些消息队列?使用过RabbitMQ吗?
  10. 项目团队几个人?开发多长时间?

版本控制相关

  1. 如何从远程仓库拉取分支到本地
  2. 如何进行版本回退

其他

  1. Celery的原理和应用场景
  2. Elasticsearch 的原理
  3. 平时是如何学习的?有关注哪些技术?
  4. Docker的了解,常用命令,如何暴露端口
  5. 对ERP了解吗?Odoo了解吗?

独到科技

创业过程

2011年初,张文浩、马扬和另一位来自百度的工程师是独到科技第一次创业的核心团队。当时看到中国还没有类似LinkedIn这样的网站,他们就把创业切入点放在了商务社交上。经过分析调查,三个人把产品定义为基于社交网络的招聘服务——通过对新浪微博的用户数据与关系链做分析,填补传统招聘模式中静态简历易过期,对招聘对象缺乏关系链了解的空白。

–正好赶上团购泡沫出现,投资变冷的大环境。

到了2012年1月,由于实在没有钱运转,张文浩忍痛将项目停掉。

冬:百度工程师退出项目组

linkedin–>基于微博数据分析做精准营销

由于“独到传播分析”可以过滤和识别僵尸粉,刚好赶上小米手机青春版发布,在微博上实现200多万次转发。这个热点事件让张文浩找到了推广工具的机会。

“独到传播分析”识别和计算了这200多万次转发中的僵尸粉比例,找到真正参与的用户数,并生成了一份报告。这份报告随即在广告营销圈传播开来,工具的用户人群也开始发生质的变化——需要高级需求的付费用户渐渐增加。

2012年5月,独到科技做成了第一笔生意,与一家广告公司合作,收入几千元。

简介

创建于2012年是国内首家专注于增强智能技术研发和数据服务的公司。独到通过挖掘大数据中蕴含的海量关联信息,利用深度学习,机器学习等技术,发现事物之间的联系,挖掘线索,帮助企业智能运营客户社群,构建私域流量 [2] 。独到科技致力于让世界每个人都可以在计算机的辅助下,超越行业专家,透过数据看世界。核心技术团队来自清华大学。数据源服务、智能算法服务、行业增强智能产品、数据咨询是四大核心业务。

紫豆助手

1
2
初衷:
帮助企业沉淀私域流量,

主要解决行业规范

【教育】

活跃度–>签到

群里不活跃,都是僵尸粉

二维码更新–>使用永久入群二维码【知意活码】

【电商】

入群欢迎语,关键词回复,群发消息

1
大量人工操作,工作繁重,效率低

【门店】

永久入群二维码 用户粘性

1
流量获取困难,用户粘性低,消费全靠随机

【保险】

活跃度 签到

1
群里不活跃,都是僵尸粉

饭卡群

Python开发岗位

1. Python中__new__与__init__方法的区别

new:

触发时机: 在实例化对时触发

参数:至少一个cls 接收当前类

返回值:必须返回一个对象实例

作用:实例化对象

注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。

init:

触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)

参数:至少有一个self,接收对象

返回值:无

作用:初始化对象的成员

注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有。

2.什么是匿名函数?

Lambda函数,不用担心函数名冲突,不过python对匿名函数支持有限,只有一些简单的情况下可以用

#声明一个简单的lambda表达式

mylamb = lambda x,y:x+y

#调用函数

result = mylamb(8,9)

print(result)

3.简要概述一下python中生成器和迭代器?

(1)迭代器:

迭代器协议:对象需要iter:return self和提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。

可迭代对象:实现了迭代器协议对象。list、tuple、dict都是Iterable(可迭代对象),但不是Iterator(迭代器对象)。但可以使用内建函数iter(),把这些都变成Iterable(可迭代器对象)。

for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,遇到StopIteration的异常后循环结束。

(2)生成器:

将列表生成式中[]改变为()数据结构会改变,从列表变为生成器;

列表受内存限制,所以没有必要创建完整的列表(节省大量内存空间),在python中我们可以采用生成器:边循环边计算的机制;

生成器是只能遍历一次的。生成器是一类特殊的迭代器。还能使用 def 定义函数,但是,使用yield而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行。

4.Python的垃圾回收机制(garbage collection)

(1)当gc模块的计数器达到阈值,垃圾自动回收

(2)当调用gc.collect(),垃圾收到回收

(3)程序退出的时候,python解释器来回收垃圾

5.函数装饰器的作用?

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

6.进程、线程的区别?

(1)定义的不同

进程是系统进行资源分配和调度的一个独立单位。

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

(2)区别

一个程序至少有一个进程,一个进程至少有一个线程。

线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程不能够独立执行,必须依存在进程中。

(3)优缺点

线程和进程在使用上各有优缺点:

线程执行开销小,但不利于资源的管理和保护;而进程正相反。

7.函数的闭包

闭包就是函数式编程的重要语法结构,提高了代码可重复实用性。使用特定或特殊的方式,将局部变量(内部函数)引入到全局环境中使用,这就是闭包操作。

img

8.Python里的拷贝

Copy浅拷贝,只拷贝父元素,deepcopy深拷贝,递归拷贝可变对象的所有元素

9.apache和nginx的区别

(1)nginx 相对 apache 的优点:

轻量级,同样起web 服务,比apache 占用更少的内存及资源

抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能

配置简洁

高度模块化的设计,编写模块相对简单

社区活跃

(2)apache 相对nginx 的优点:

rewrite ,比nginx 的rewrite 强大;

模块超多,基本想到的都可以找到;

少bug ,nginx 的bug 相对较多;

超稳定。

10.什么是事务?

事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:

从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

事务四大特性:

原子性:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行;

一致性:几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致;

隔离性:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的;

持久性:对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

11. 主键和外键的区别?

主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

12. 在数据库中查询语句速度很慢,如何优化?

(1)建索引 ;

(2)减少表之间的关联 ;

(3)优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面 ;

(4)简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据 ;

(5)数据库做好读写分离。

13. Oracle和Mysql的区别?

1)库函数不同。

2)Oracle是用表空间来管理的,Mysql不是。

3)显示当前所有的表、用户、改变连接用户、显示当前连接用户、执行外部脚本的语句的不同。

4)分页查询时候时候不同 。

5)sql的语法的不同。

14.tcp和udp的区别?

tcp是一种面向连接的、可靠的、基于字节流的传输层通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流。

udp(用户数据报协议)是iso参考模型中一种无连接的传输层协议,提供面向操作的简单不可靠的非连接传输层服务,面向报文。

它们之间的区别:

1、tcp是基于连接的,安全性高;udp是基于无连接的,安全性较低;

2、由于tcp是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差;同时过程复杂,也使其易于被攻击;而udp无连接,无建立连接的过程,因而实时性较强,也稍安全;

3、tcp连接是点到点的电话接通通信;udp支持一对一、一对多、多对一、多对多的广播通信。

15.对if name == ‘main’的理解?

“ if name == ‘main‘:”

在Python中分为两类:一种是直接执行,另外一种是作为模块时才被调用。

name 作为模块的内置属性,即”.py”文件的调用方式。如果等于“main“就直接执行本文件,如果是别的就是作为模块被调用。

16. http协议与https协议的区别?

http是超文本传输协议在互联网上应用最为广泛的一种网络协议,所有www文件都必须遵守这个标准,基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)连接。

https是超文本传输安全协议,是一种网络安全传输协议。http协议传输的数据都没有加密,一些私密的信息不安全,https经由超文本传输协议(http)进行通信,利用SSL/TLS来加密数据包,https开发的主要目的就是为了保护数据传输的安全性。

HTTPS和HTTP的区别:

1) https协议要申请证书到ca,需要一定经济成本

2) http是明文传输,https是加密的安全传输

3) 连接的端口不一样,http是80,https是443

4)http连接很简单,没有状态;https是ssl加密的传输,身份认证的网络协议,相对http传输比较安全。

17. Python解释器

当我们编写好了的Python代码的时,一.py为扩展名的文件,运行代码的时候,需要python解释器。解释器在执行的程序时,一条一条的解释成机器语言给计算机来执行。因为计算机只能识别机器语言(以二进制的形式)

18. 字典推导式和列表推导式

列表推导式:

格式:[变量 for 变量 in 列表]

普通的字典内涵

变量= {key:value for key,value in 字典.items()}

19.Python2和python3在使用super时区别

img

20.python 列表去重(数组)的几种方法

方法1:用if语句判断,用append函数追加

img

输出结果:

img

方法二:

用set集合:

img

输出的结果:

img

21. 列举您使用过的python网络爬虫所用到的解析数据包

BeautifulSoup、pyquery、Xpath、lxml

22.python常用内置函数:

dir(对象名):返回一个列表,列出该对象所有的属性和方法;

help(函数名、方法名或对象):查看函数、方法或对象的帮助文档;

type(对象名):查看该对象的类型;

isinstance(对象, 类型):判断该对象是否是该类型,返回True或False;

range、input、print就不用多说了。

以上几个使用频率应当是最高的。更多函数,请导入模块”import builtins”,dir(builtins)查看。

23. python中的and、or、not逻辑运算符:

and、or、not两边的值会被放到布尔环境下,作比较

and运算如x and y:

x和y都为True时,那么返回最后一个值y

否则返回两个值中的第一个布尔值为假的值,从左往右运算

or运算如x or y:

只要有一个为真值,就返回第一个布尔值为真的值

如果都为假,返回最后一个布尔值为假的值,从左往右运算

not运算如not x:

当x的布尔值为True,返回False

当x的布尔值为False,返回True

24.参数按值传递和引用传递是怎样实现的?

Python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变。但是如果一个对象是可以被修改的,你可以改动对象。

25. python内置的数据类型有哪些?

list: 链表, 有序的项目, 通过索引进行查找, 使用方括号”[]”

dict: 字典, 字典是一组键(key)和值(value)的组合, 通过键(key)进行查找, 没有顺序, 使用大括号”{}”

str:字符串,用单或双引号括起来表示字符串

tuple: 元组, 元组将多样的对象集合到一起, 不能修改, 通过索引进行查找, 使用括号”()”

set: 集合,无序, 元素只出现一次, 使用”set([])”,可实现列表快速去重,不过注意返回的是一个集合

int: 整数,如3

float:浮点数,如2.3

complex:复数,如complex(1,2) => 1+2j

可迭代(遍历)对象:list、dict、tuple、set、str

可变类型:list、dict、set,其余为不可变类型

list、tuple、str可通过索引获取当中的元素

set不支持索引查找,因为数据只出现一次, 它只关心数据是否出现, 不关心其位置

26.python中search()和match()的区别

match从起始位置开始往后查找,返回第一个符合规则的

search任何位置开始往后查找,返回第一个符合规则的

27.redis中常用的5种数据类型?

Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

28.请描述一下try……except……else……finally执行的顺序?

try:

#尝试实现某个操作,

#如果没出现异常,任务就可以完成

#如果出现异常,将异常从当前代码块扔出去尝试解决异常

except 异常类型1:

#解决方案1:用于尝试在此处处理异常解决问题

except 异常类型2:

#解决方案2:用于尝试在此处处理异常解决问题

else:

#如果没有出现任何异常,将会执行此处代码

finally:

#管你有没有异常都要执行的代码

29.什么样的字段适合建立索引?

唯一、不为空、经常被查询的字段。

30. Xrange和range的区别是什么?

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

img

img

如何看待该行业

以后的发展问题

linux的基本骚操作大文件的log查寻机巧

python的单例模式

装饰器

迭代器并发的处理

链表