开发岗面试题知识

这篇文章是因为前段时间接到了一个360的电面
接到电话的时候其实是异常开心的
然后电面完就开始自闭了
深刻认识到自己的知识储备的不足
因此萌生了增强自身能力和知识储备的想法
也在博客中进行一些记录

此博文仅作部分基础知识的拓展
可能以后想到了更多内容也会进行更新
主要会分为以下几个内容来浅入各方面的知识

  • 网路知识
  • Linux
  • PHP
  • Python

网路知识

由于开发岗位对网络的要求并不那么高,所以在此只作粗略的内容阐述

TCP三次握手

为什么要三次握手

主要是为了防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

三次握手建立连接的过程

  1. 第一次握手:客户端发送包至服务器,等待服务器确认
  2. 第二次握手:服务器收到包,确认客户端请求,同时发送一个包至客户端并进入Recv状态
  3. 第三次握手:客户端收到服务器的包,并向服务器发送确认包,发送完毕后,客户端和服务端进入连接状态,完成三次握手。

    三次握手完成后,在理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP连接都将被一直保持。

浏览器从输入URL到页面展示过程中发生了什么?

在浏览器地址栏输入URL到页面展示过程大致分为以下阶段:

  1. 域名解析(找到该域名所对应的IP地址)
  2. 服务器处理(找到该域名的网站)
  3. 网站处理(找到该域名所对应的文件)
  4. 浏览器处理(把文件返回浏览器)

域名解析

有注册过域名的同学一定知道域名需要云解析DNS配置
这就引出了DNS域名系统这个概念
DNS是域名和IP地址对应的映射表
用于解析域名的IP地址
通过DNS服务器后,我们所输入的地址就变成了IP地址从而进行下一步的访问
例如:我们输入www.baidu.com的时候
从DNS服务器中最先找到的IP地址115.239.211.112
当然,这些大型站点通常都有CDN服务,这些找到的IP也并非服务器真实地址

服务器处理

当我们从DNS服务器中找到IP时,我们就会请求服务器
服务器是一台安装了系统的机器,常见的系统有Linux和Windows Server
目前服务器使用的还是以Linux为主
系统中安装有处理请求的Web Server
常见的Web Server有Apache、Nginx、IIS
PHP通常使用的是Apache
通常情况下一个服务器下会部属多个网站
Web Server接收用户的请求并且根据请求的域名找到其对应的网站,然后把用户的请求交给该网站的代码进行处理

网站处理

现在的网站很多都是使用MVC框架来进行处理的
无论使用的是什么框架进行处理
网站处理其实经过的流程都是一致的
处理过程
在处理客户端请求时,我们可能会对请求中的参数进行分析
连接数据库获取我们需要的内容并且通过某个编程语言来进行解释
从而最终返回我们预期返回的内容(例如Json、Html)

浏览器处理

浏览器处理的过程是一个边解析边渲染的过程
例如我们的网站使用的是PHP语言
我们在网站处理的过程中已经执行完毕了处理过程
最终返回的是一个HTML文档又或者是一个Json
浏览器处理时也有可能是直接载入Html文档或者执行js代码来分析Json从而使用
浏览器会载入我们所引入的css,js文件并且最终将结果展现至客户端的浏览器上

Linux

什么是Linux?

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
—— 百度百科

Linux系统因为其更加可靠的系统安全性等多方面原因,成为越来越流行的网站服务器
因此作为一个开发也需要了解一些Linux知识

什么是LAMP?

LAMP分别是

  • L:Linux
  • A:Apache
  • M:Mysql(数据库)
  • P:PHP、Python(脚本语言)

如何部署LAMP环境

LAMP环境的部署现在有很多方式
本文讲个人认为最简单的一种方式:Linux宝塔面板
宝塔面板从安装和管理上都较为方便,作为我这样的菜逼还是比较容易上手的

Linux的基础指令和功能

指令 功能
cd 切换目录
ls list之意,用于查看文件和目录
grep 查找内容包含指定文本的文件
find 查找文件
cp copy之意,复制文件和目录
mv move之意,移动文件和目录
rm remove之意,删除文件和目录
file 辨识文件类型
tar 常用于备份,可用来压缩和解压文件
cat 查看文本文件内容
vim 编辑文本文件内容
pwd 查看当前路径
mkdir 创建文件夹

PHP

PHP是什么?

PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。
PHP 是免费的,并且使用非常广泛。同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。

PHP常见的开发框架

PHP常见的框架主要有:

  • ThinkPHP
  • Yii
  • Zend Framework
  • Laravel

本文主要讲一下Laravel框架
Laravel框架是一个优雅、简洁的PHP WEB框架。
Laravel使用的是MVC的设计模式
在博客中也写了一些基础知识,可以在另一篇博文[Laravel基础知识]中查看

PHP5 和 PHP7

这个也是我电面中被提及的一个问题
就我所知PHP7和PHP5相比
在性能上有十分大的提升
通过查询相关知识得知PHP7相较于PHP5性能提升有以下原因:

  1. 变量存储字节减小,减少内存占用,提升变量操作速度
  2. 改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
  3. 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

不过对于我这种菜鸡而言,只需要知道它提升了就好,便也没有深究其中的缘由

Python

什么是Python

Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 ——百度百科

Python在现如今无论是在Web还是在脚本或者其他方面的表现都是十分的优秀
因此现在的需求也是越来越大的,从某个程度上也减少了PHP的市场需求

Python是一种强类型语言还是弱类型语言
其实一开始并不了解强弱类型的语言区别
一开始以为,嗯,Python不需要定义变量类型,那么它应该是一个弱类型语言吧
其实强类型弱类型语言只需了解以下知识便可区分:
强类型:不予许不同类型相加

例如:我们将字符串’1’将数字1相加
弱类型语言会输出结果
而强类型语言则会报typeerror的错误

因此Python是一种强类型的动态脚本语言

Python的变量类型

Python中,基本数据类型可以分为以下几种:

  • 数字
  • 字符串
  • 列表
  • 字典
  • 集合
  • 元祖

    数字

    Python3中支持的数字类型有
  • int-整型
  • float-浮点型
  • bool-布尔型
  • fractions-分数
  • complex-复数

字符串

字符串是由数字、字母、下划线组成的一串字符
例如:

1
str="abc"

则我们定义了一个名字为str的变量,其值为abc123456
字符串支持多种截取和处理方式
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print(str)           #输出字符串
>abc123456
print(str[0:-1]) #输出第一个到倒数第二个的所有字符
>abc12345
print (str[0]) # 输出字符串第一个字符
>a
print (str[2:5]) # 输出从第三个开始到第五个的字符
>c12
print (str[2:]) # 输出从第三个开始的后的所有字符
>c12345
print (str * 2) # 输出字符串两次
>abc123456abc123456
print (str + "789") # 连接字符串
>abc123456789

列表

List(列表) 是 Python 中使用最频繁的数据类型。
列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。
和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
列表截取的语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
list = ['abc', 123 , 1.23, 'Wuxie']
tinylist = [456, 'Wuxie']
print (list) # 输出完整列表
>['abc', 123 , 1.23, 'Wuxie']
print (list[0]) # 输出列表第一个元素
>abc
print (list[1:3]) # 从第二个开始输出到第三个元素
>[123, 1.23]
print (list[2:]) # 输出从第三个元素开始的所有元素
>[123 , 1.23, 'Wuxie']
print (tinylist * 2) # 输出两次列表
>[456, 'Wuxie', 456, 'Wuxie']
print (list + tinylist) # 连接列表
>['abc', 123 , 1.23, 'Wuxie', 456, 'Wuxie']

元组

元组(tuple)与列表类似,不同之处在于元组的元素不能修改。
元组可以用()进行创建

1
tuple = ('abc', 123)

和字符串以及列表一样
元组的内容是可以通过索引读取的,下标从0开始,-1为从末尾开始的位置

集合

集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
创建格式:

1
2
parame = {value1,value2,...}
parame = set()

集合可以计算差集、并集和交集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
print(student) # 输出集合,重复的元素被自动去掉
>{'Jim', 'Rose', 'Mary', 'Tom', 'Jack'}
# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
print(a)
>{'a', 'b', 'r', 'd', 'c'}
print(b)
>{'a', 'z', 'l', 'c', 'm'}
print(a - b) # a 和 b 的差集
>{'b', 'd', 'r'}
print(a | b) # a 和 b 的并集
>{'a', 'b', 'r', 'z', 'd', 'l', 'c', 'm'}
print(a & b) # a 和 b 的交集
>{'a', 'c'}
print(a ^ b) # a 和 b 中不同时存在的元素(对称差)
>{'b', 'l', 'd', 'r', 'z', 'm'}

添加元素

例如我们当前有一个集合 s
我们可以使用以下语法

1
s.add()

或者

1
s.update()

移除元素

将元素从集合 s 中移除,如果元素不存在,则会发生错误。

1
s.remove()

或者随机删除一个元素(挑选一位幸运观众)并且返回删除的元素内容

1
s.pop()

计算元素个数

1
len(s)

清空集合

1
s.clear()

字典

字典(dictionary)是Python中另一个非常有用的内置数据类型。
列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用 { } 标识,它是一个无序的 键(key) : 值(value) 的集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的。
例如我们创建一个字典 dict

1
2
3
dict = {}
dict[0] = "0的内容"
dict['zero'] = "zero的内容"

这里需要注意的是,dict[0]中的0并不是索引下标,而是作为key进行存储

1
2
3
4
5
6
print(dict[0])        #此处输出的是key为字典dict中key为0的value值
>0的内容
print(dict.keys()) #输出所有键
>dict_keys([0, 'zero'])
print(dict.values()) #输出所有值
>dict_values(['0的内容', 'zero的内容'])

个人总结

在Python3中 可以使用下标来查看内容的有以下几种数据类型

  1. 字符串
  2. 列表
  3. 元组(亦可以理解为数组)

常用的技术论坛

全篇总结

人总归是要进步的
虽然我现在还是个菜逼
但我以后也可能就是一个大菜逼了
菜逼一时爽,一直菜逼一直爽