1.21 屏幕适配
含义:苹果viewport 视口,手机上的浏览器为了适配桌面上的网页,把它设置成宽980像素,但是这样的网页要正确地显示出来必须经过缩放或者用滚动条
devicePixelRatio(设备像素比)
把 viewport 的宽度写成device-width,它就会根据不同的手机来取值
1.22 盗链和反盗链
含义:HTTP的refer头,判断是否允许,否则返回盗链警告图
1.23 广告过滤机制
含义:不让广告下载或者不让展示
找到广告者的URL直接拦截,找到广告标签,直接隐藏
二、客户端技术
2.1 动画障眼法
作用:响应慢用动画效果过渡
退出应用时截屏,启动时先展示
2.2 Android应用保活
实现方法:
监听系统事件
利用安卓系统广播机制,在发生改变时复活
守护进程唤醒
ROM限制,因此创建一个守护进程,持续检查程序状态
全家桶
多应用持续复活
2.3 Hybrid APP
含义:基于H5应用和原生应用的混合模式移动应用
H5兼容好,拓展好
原生体验好,不卡顿
2.4 手机传感器
磁场传感器
应用:指南针,三维空间
加速度传感器
应用:xyz加速度,计步器
三轴陀螺仪
应用:手机翻转
指纹传感器
应用:光学,电容,射频
近距离传感器
应用:减少误触
光线传感器
应用:夜间模式
气压传感器
应用:高度检测
温度传感器
应用:环境温度
2.5 手机定位
方法:
GPS,卫星定位,出厂有加偏参数
WIFI定位,对MAC采集
基站定位
2.6 客户端推送
方法:pull,轮询,push,通道推送
长连接通道,保持心跳,服务器主动推送
GCM(GoogleCloud Messaging)和APNs(Apple Push Notificationservice)来解决多个APP有多个长连接通道的问题
利用苹果服务器的系统级别长连接通道来发送心跳等
2.7 美颜
常用方法:双边滤波
图像处理,openGL方法
2.8 听歌识曲
原理:音频波形图→转换成频谱→抽样成为乐纹
歌曲乐纹匹配
2.9 朋友圈图片缓存
一级缓存(内存缓存),二级缓存(磁盘缓存)
一级缓存,空间换速度,数据随程序退出小时
二级缓存在应用启动时还在
一级图片满了,采用LRU(Least Recently Used)算法进行淘汰,也就是近期最少被使用的图片被淘汰
滑动时头像灰色,停止时再解析
2.10 应用的生命周期
onCreate()表示应用开始创建,不可重入
onStart()开始、onResume()内部恢复
onPause()内部弹窗暂停、onStop()其他应用挡住
onDestroy()销亡
三、开发技术
3.1 空指针
解决:第一步A=null。第二步A doSomething。
指针指向空内存
3.2 程序越界
发生数组越界的原因很简单,假设一个列表中只有10个元素,但是某个函数偏偏要取列表的第11个元素,就会产生异常
数据类型范围越界
3.3 命名
命名要考虑整体,减少后期维护成本
3.4 动画
位移动画
创建一个“TranslateAnimation”的对象,可以把它理解成位移动画的“配置清单”,开始位置,结束位置,持续时间
让控件执行启动动画的命令(startAnimation),系统就会根据默认的插值算法
缩放动画
(1)动画开始时控件的缩放倍率。(2)动画结束时控件的缩放倍率。(3)动画的持续时间。
配置缩放的原点
渐隐渐现动画
(1)动画开始时控件的透明度。(2)动画结束时控件的透明度。(3)动画的持续时间。(4)设置重复次数。(5)设置重复模式。
设置重复次数(setRepeatCount)与设置重复模式(setRepeatMode)
旋转动画
(1)动画开始时控件的旋转角度。(2)动画结束时控件的旋转角度。(3)动画的持续时间。
自定义旋转时的原点
3.5 耦合与解耦
耦合就是依赖外部,导致改动时被牵制
解耦就是拆分依赖的部分,可以通过统一接口,SDK,消息,框架等方式来解决
3.6 栈与队列
栈,“先进后出”的数据结构,栈溢出”(Stack Overflow)是超过系统限制内存而被强制结束
push_into_stack()、pop_from_stack()。
队列,“先进先出”的数据结构,带顺序的数组
3.7 不可修复BUG
修复BUG容易造成更多问题,解决一个问题其实本质是创造更多问题。
3.8 等待加载
模块离 CPU 越近,运行速度就越快,大体的速度快慢排序是寄存器→高速缓存→内存→硬盘→网络
可以把整个互联网看成计算机的一个大硬盘,只不过它是用网线来传输数据的。内存是一个分水岭,排在内存前面的存储设备的运行速度很快,可以做到“立刻加载”。硬盘因为是机械结构,所以运行速度非常慢(大概是内存的十万分之一)。凡是跟内存之后的存储设备打交道的任务,都不适合同步加载,这样的任务叫作I/O密集型任务。
当用户跳转到一个新的场景,或者加载一个新的网页时,必须要执行一些CPU或I/O密集型的耗时任务才能让用户看到内容,这时前台让用户先看到加载动画,后台开启新线程执行这些任务。
动画渲染只有前二阶段依赖CPU,其他时候依赖GPU
3.9 并行计算
并行计算指一台计算机或一个计算系统(如分布式系统)可以在同一时刻执行两个或者两个以上的任务
在CPU内部,也有一条流水线:CPU执行一条指令的过程可以分为取址、译码、地址生成、取操作数、执行和写回6个步骤,在理想的情况下,同一时刻CPU可以执行6 条指令
假设计算机每进行一次加法运算需要耗时1秒,那么串行程序一共执行7 次加法,需要耗时7秒,而4核CPU并行计算只需要执行3秒,性能提高了57%。
3.10 进程间通信
进程是程序实体的运行过程,是系统进行资源分配和调度的独立单位
基于文件的通信方式(广播)
基于通道的通信方式(P2P)
基于共享内存的通信方式(共享资源空间)
基于信号(消息)、信号量和套接字的方式
3.11 编译
编程语言是高级语言,基于英文
计算机语言为二进制,基于01是非门
编译即在把高级语言转义成计算机语言
3.12 程序崩溃
异常状态未处理
操作系统异常崩溃
3.13 操作系统
Windows
MS-DOS界面化后
Mac OS
前身是UNIX,向上封装标准POSIX接口
Linux
开源系统
启动
自建硬件,加载操作系统,bootloader
内存管理和进程管理
分配内存和CPU资源
物理内存和虚拟内存
文件系统
访问硬盘文件
为上层APP提供API
提供各类功能
3.14 代码混淆
把可读的代码重新翻译成难理解的代码
3.15 BUG调试
用打断点,冻结现场,PRINT,LOG等方式找BUG
3.16 异常捕获
try catch
捕获异常,并提供处理方法,后续代码也可以执行
3.17 搜索引擎倒排索引
搜索引擎遍历它抓取到的所有文档,从中挑选出与关键词相关的文档,最后展示出来。进行展示之前的环节就叫作正向索引
为了加快搜索速度,我们需要建立一个相反的索引的列表
在爬虫抓取回一个网页后,先对它进行分词处理,然后把这些提取出来的关键词与这个网页的ID做一个映射,这就是倒排索引(InvertedIndex)。
3.18 面向对象
继承、封装、多态
刚好能满足自己能做的事情
面向接口编程
3.19 重构
在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能
3.20 流水线技术
流水线技术是指,在重复执行一项任务时,可以把它细分成很多小任务,让这些小任务重叠执行,来提高整体的运行效率。
当执行完一条指令的前三步之后,并不是等运算器执行完后两步才继续工作,而是马上开始着手执行下一条指令的前三步。这样所有指令一条一条进来,运算器和控制器同时工作,互不干扰,大大提高了CPU的运行速度
3.21 多线程
获得CPU的专业术语叫获得时间片,也就是CPU把所有的时间分成若干个小片,把每一个小片不断地分给不同的线程执行,保证每个程序都有机会执行,不会有程序一直霸占CPU。
GUI系统其中至少有两个线程,一个叫主线程,另一个叫工作者线程。
绘制界面,响应操作
运算和完成逻辑
多线程含义
(1)开启多个线程做不同的事情,目的是并发同时做很多事情。(2)开启多个线程做同一个事情(比如前面举的放水的例子),目的是提高效率。
3.22 线程池
原因
操作系统都有线程分配的最大值
操作系统创建线程,服务器内存不是无限的
CPU 创建和销毁一个线程需要时间
现在有很多请求不断涌入到服务器,同时服务器创建了一个线程池,里面有许多可以处理请求的线程。有时候网络请求太多,线程池里没有足够空闲的线程,就会把请求放到一个队列里去排队等待处理。
四、 网络技术
4.1 协议栈
应用层:为应用程序提供数据传输的网络接口,常见的HTTP、Telnet、FTP等协议都工作在这一层;
传输层:传输层提供端到端的连接,例如让A主机上的程序a找到B主机上的程序b。TCP和UDP都工作在这一层,端口号的概念也定义在这一层;
网络层:用于寻址,它能让两台主机在互联网的茫茫“机海”中找到彼此;
数据链路层:网卡就工作在这一层,负责将数字信号转化成可供物理层传输的电信号或者光信号;
物理层:物理层是信号传输的物理通道,网线和配套的接口都属于物理层。
流
源源不断提供数据的管道就是流,两端是服务器和客户端的处理代码
4.2 网络地址转换
IP地址有三类地址是私有地址,可以在内网中被使用
如果内网想访问外网,可以通过静态转换,动态转换,端口多路复用来实现访问外网
ping
测试某个网关
4.3 TCP/UDP
TCP可信,多次握手
顺序编号
确认机制
超时重传
UDP不可靠,速度快,但是可以用来QQ这种即时通信上
无序
默认成功
4.4 反向代理
实现负载均衡,减少后端服务器压力,静态文件直接放在反向代理服务器上
进一步加解密,阻挡网络攻击
4.5 CDN
内容分发商
它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
4.6 断点重传
请求头的Range,可以传下载的文件位置,然后进行部分下载
4.7 长连接
短时间内多次与服务器之间发生信息交互
实现PUSH功能
4.8 HTTPS
(1)客户端发起HTTPS请求。(2)服务器将公钥发送给客户端,客户端可以根据公钥验证服务器的身份。(3)客户端生成一个加密密钥,公钥加密后,将密钥传输给服务器,服务器用私钥解密报文,获得客户端密钥。(4)服务器和客户端的数据传输都通过客户端密钥进行加解密
4.9 代理服务器
测网速不准确的原因
通过代理服务器来链接到目标服务商
4.10无线WIFI
WIFI建立连接:SCAN(扫描)和Authentication(认证)。
主动扫描:在WIFI信道上发送广播,询问是否有无线接入点,路由器收到后会做出回应返回SSID认证方式和加密算法等
被动扫描:无线路由器定期向自己所在信道上发送广播,接入该信道的设备收到后就开始建立连接
4.11 跨区域访问
访问网站是先发起DNS请求转化IP地址,然后访问最近地区的运营商服务器
Socket
封装了TCP/IP的实现,提供了一套标准API供调用,落地了理论
服务端+客户端,服务端设置自己IP及端口并进入阻塞,客户端输入服务器IP和端口号,可以把服务端从阻塞状态唤醒。配对成功,可以通信。
HTTP也是用socket传输数据,但只请求一次数据就主动断开连接,是短连接
Socket是长连接,可以传输任何内容,没有局限
socket不止是计算机通信,也可以两个不同的进程间通信
4.12 HTTP 302
访问转移功能,自动跳转,用在迁移新网址上
应答码有5类,1xx 信息 2xx 成功 3xx 重定向 4xx 客户端错误 5xx服务端错误
4.13 Hosts文件
本地文件,把域名解析成IP地址,加快访问的速度
4.14 下载速度
下载协议
P2P
无中心服务器,下载的人越多,上传的人也越多,所以下载速度也快,例如BT下载
HTTP
HTTP是有一个服务器来响应需求的,可以通过CDN来减轻中心服务器的压力;也可以通过多线程下载来加速客户端下载
4.15 下载劫持
DNS服务器存储域名与IP地址映射关系
本机的DNS服务器的更改
DNS服务器本身被劫持
4.16 VPN
虚拟专用网络
加密隧道,PPTP L2PT IPSec隧道协议
代理服务器
代理服务器是每次的HTTP请求都带一个代理服务器的地址,VPN更接近于底层
五、网络安全与后端技术
5.1 密码存储
密码明文+salt 然后再做MD5,这样就不怕彩虹表
5.2 密码泄露
简单密码
简单组合穷举
脱裤
撞库
密码安全
不同网站设置不同密码
自定义助记规则
密码管理软件
动态密码验证
5.3 SQL注入
通过组合的查询,可以达到验证正确与否的效果,就可以被穷举查询破解
解决方法:对外部数据数据永远不可信,永远进行校验
5.4 XSS
DOMBased XSS:DOM型XSS
DOM输入框的XSS
Stored XSS :存储型XSS
个性签名
安全策略,输入语句过滤
5.5 CSRF
它在用户与网站A建立信任关系后,利用这种信任关系在网站B上跨站点向网站A发起一些伪造的用户操作请求,以达到攻击的目的。
即在用户登录后,模拟用户或者让用户发起恶意请求
解决方法,请求头里加referer,提交表单随机下发token
5.6 ARP欺骗
局域网内的两台网络设备通信时,是通过MAC地址而非IP地址来识别对方的
当不知道某个IP的主机对应的MAC地址时,局域网中的主机可以利用地址解析协议(Address Resolution Protocol,ARP)获取该IP对应主机的MAC地址。
ARP欺骗就是假装ARP站点进行回复
目的是制造网络中断,中间人攻击
解决方法是手动配置MAC地址和IP地址的映射
5.7 DDOS
分布式拒绝服务。DDoS的基本原理是通过对服务器发送大量无用的请求耗尽服务器资源(CPU、内存等),导致服务无法正常运行,正常请求无法得到响应。
SYN Flood攻击
● 第一次握手,客户端向服务器发送一个SYN报文,意思是“Hi,我要跟你建立TCP连接”。
● 第二次握手,服务器向客户端发送一个“SYN+ACK”报文,ACK是对第一次握手中SYN报文的确认,意思是“同意建立连接”。前两次握手过程中,服务器和客户端相互确认了TCP连接的一些参数,如Seq等。
● 第三次握手,客户端向服务器发送一个 ACK 报文,确认第二次握手中的SYN报文被成功接收,TCP连接成功建立,服务器和客户端开始传输数据。
第二次握手服务器会维持一段时间,利用肉鸡多次发起第二次握手的半连接,让服务器资源被大量耗尽
DDos解决方法
增加带宽
流量清洗服务
拒绝连接
5.8 安卓的二次打包
由于谷歌被墙,大陆开发者搬运应用到国内,并加上汉化包,还把ADid都换成自己的:下载应用→反编译→篡改代码→重新打包→国内分发
解决方法:在关键流程上增加后台签名校验,如果是非法签名则直接停止运行应用;也可以对应用加固处理,让其无法反编译
5.9 病毒
文件名伪装,隐藏后缀名
主程序释放到系统盘的WINDOWS\system32\drivers
在注册表中添加自启动
注册表类似数据库,存储着操作系统关键设置和应用设置
磁盘根目录存在autorun.inf,进入磁盘时自动执行配置文件对应的程序
病毒加壳,让特征值不被杀毒软件扫描出来,执行时壳才解密杀毒软件
通过远程登录功能复制病毒,诱导主动分享,利用系统漏洞入侵,使用U盘自我复制
5.10 防蹭网
定期更换密码,防止WIFI万能钥匙这种共享路由密码的
使用更好的加密方式
WEP、WPA/WPA2和WPAPSK/WPA2-PSK三种,其中WEP的加密方式较弱,很多“蹭网神器”在抓取一些WEP加密的数据包后,可以迅速破解密码。
WPA/WPA2虽然不易被破解,但是需要一台额外的认证服务器,常被用于大型企业的无线网络。
最适合普通家庭的加密方式是WPA-PSK/WPA2-PSK,它具备更强的加密效果,同时也不容易被破解
隐藏无线网络SSID,即名称,WIFI不会进行广播,因此自动搜索不到
关闭DHCP服务, 路由的DHCP服务是自动分配IP地址的,关闭后要手动设置IP地址,没有IP地址也不能够连上WIFI
开启MAC地址过滤,仅对白名单内的MAC地址开放网络
5.11 RPC框架
Remote Procedure Call,远程过程调用,其中“过程”可以看作是提供服务的方法(或称函数)。
RPC是一种方法,RPC框架是基于RPC方法封装的一套框架(它提供了一套方法和工具,将每个人都要面对的问题封装起来,使你能够在这个框架上开发出适合你业务的应用程序,也就不用再关心底层的网络、协议的实现,只需关心上层业务逻辑即可)。
传输协议选择TCP/UDP、序列化/反序列化、负载均衡、运营配置、监控、日志打印等。
流行的开源RPC框架有由Facebook开源的Thrift、由谷歌开源的gRPC等
5.12 RESTful API
Representational State Transfer的缩写,意为“表现层状态转化”
它规定 URL只能表示资源,调用时使用统一地址
HTTP原生支持4个动词,分别是GET、POST、PUT和DELETE,用这四个方法区分方法,查,提交,更新,删除
5.13 Session
因为HTTP是无状态的,所以服务器对访问者下发编号用于区分身份,让操作之间有联系(比如购物车多次添加商品)这就是session机制
session是服务端的,cookie是用户端的,cookie中的JSESSIONID就是session cookie
浏览器禁用cookie,则变成URL中?sid=xxxxx 的参数传递
5.14 流量控制
漏桶算法,进来一个出去一个,如果桶满了就拒绝服务,输入输出稳定
令牌桶算法,固定速度产生令牌,一律扔桶里,需要令牌时就去取,取不到就拒绝服务,和漏桶相比多了并发处理的能力
5.15 唯一ID
数据库ID,每次增1,但如果是分布式系统,数据库和业务不在同一机器上,则效率不高
UUID,不依赖中央服务器的ID生成
包含了32个十六进制的数字,以连字号分为五段,形式为8-4-4-4-12,如550e8400-e29b-41d4-a716-446655440000。它的特点就是生成的ID长度很长,长到重复的概率趋近于零
雪花算法,可以根据时间排序的ID
将64位的数字按二进制位划分为不同的区段,而每一区段都有不同的意义。
长度比UUID小,且带时间标示,同一毫秒同一机器产生的ID相同
六、名词解释
6.1 抽象、封装、类、实例和对象
对事物进行“抽象”,从而封装为“类”,由“类”可以生成“实例”或“对象
6.2 SDK、API和架构
Software Development Kit的简称,中文名称是软件开发工具包,是基于当前系统或者平台的一整套开发工具的集合。
一方只负责调用,不用关心其具体实现
API是Application Programming Interface的简写,中文称为应用程序编程接口
系统的能力是以SDK的形式发布给开发者的,SDK中一般封装了很多API,这些API对应着系统或平台的能力。
公有API和私有API
公有API是系统以SDK形式暴露出来,对所有开发者可见的。私有 API 一般仅限系统内部或者系统自带的一些应用程序使用,不允许应用程序开发者使用,这种 API 本身可能会存在一些安全性或稳定性问题。
架构指一个软件系统的结构,是考虑了一个软件系统的所有设计要素、梳理清楚模块划分及模块之间的关系后形成的一种结构设计
6.3 控件、组件和框架
控件表示程序设计中最小粒度的可复用可编程的部件。
输入框、按钮、单选框、复选框等控件
简单理解为一个组合功能的控件,功能比一般控件要复杂,交互也更复杂
系统也提供很多组件,它包含了许多行为和属性,相对于控件,组件职能更单一,粒度更细。
框架是由很多控件和组件组装在一起的,并且能够在某一领域里完成一系列操作,就好像一把瑞士军刀,能够把某一领域内的问题解决得干净漂亮。
比如 jQuery 框架是对原生JavaScript的封装,提供更方便快捷的JavaScript操作;J2EE框架提供了一套企业级的网站解决方案;LAMP提供了一套利用开源系统搭建网站的框架。
6.4 二进制文件
用二进制文件存储数字要比用文本文件存储省空间。
二进制文件更省空间,写入速度更快,因为可读性很差,所以还有一定的加密保护作用
文件的每个字符都是经过了特殊处理(比如转成ASCII码)再存储为二进制的,这样的二进制可以直接对应为ASCII码,供人们阅读。
6.5 脚本
脚本,是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。
6.6 内存泄漏
由于程序申请了内存,但没有释放内存,导致内存一直处于被消耗的状态,称为内存泄漏。
内存诊断与 Debug 工具
6.7 中间件
在计算机中,中间件是位于两个软件中间的软件,广义地讲,中间件一般为应用软件和系统软件之间相互通信的桥梁。
“不要重复造轮子”。这些“轮子”在狭义上都可以称为中间件,一些比较好的开源项目也相当于中间件
6.8 打底数据与云端控制
本地要默认写死一些常在展示、不怎么变化的频道,这些称为打底数据或默认数据
主要用于解决用户体验问题,在无网络或初次启动时,告知用户这个客户端已经在正常运行
展示了打底数据之后需要发起云端请求,请求云端运营数据,拉取成功之后,用新的频道数据覆盖本地数据
6.9 变量与函数
如果把类看作一个人,类里面的变量就好比人的各个器官,像五官暴露在外,五脏藏在身体内部。
6.10 散列值
所有物品必须分门别类放入整理箱,再将整理箱编号,比如1号整理箱中放入针线,2号整理箱中放入证件,3号整理箱中放入细软,这种存储和查找方式称为散列
散列也称哈希,利用散列算法实现的散列表,是一种与数组、链表等不同的数据结构,它并不需要通过遍历的方法查找数据。
直接定址法、平方取中法和除数取余法
很多条记录都映射到一个位置上,称为散列冲突。散列冲突是与散列函数的设计正相关的,随机性越大,
还有一些解决散列冲突的办法叫“散列再散列
6.11 钩子
Hook 的意思是钩住,也就是在消息过去之前,先把消息钩住,不让其传递,使用户可以优先处理。执行这种操作的函数也称为钩子函数。
6.12 配置文件
配置文件就是一个对软件运行时状态的本地存储形式,我们可以通过改动配置文件来改变软件运行行为或策略。
6.13 算法复杂度
缓存就用内存来提高访问速度,因为内存的速度远远高于硬盘,价格也不高
时间复杂度,还有空间复杂度的概念,也就是每个算法对内存使用的相对衡量
6.14 模板
一段 HTML 代码,它有的部分是固定的,有的部分是动态的,动态的部分让JavaScript去计算,然后用模板引擎替换。
6.15 RGB通识
RGB是Red、Green、Blue三种颜色的缩写,称作三原色
1670万种
三原色中的每一个原色都用8 bit 表示。以红色为例,用二进制表示的话,它的取值会在00000000~11111111这个区间内,对应十进制就是0~255
255表示亮度最高的红色,0则表示完全没有亮度的红色,也就是黑色
分别表示红、绿、蓝颜色亮度的8 bit 连接起来,就得到了一个由24 bit混合的颜色
能表示256×256×256种不同的颜色,也就是我们说的真彩色
在CSS设计中,如果出现像FF这样重叠的数字,可以再进行一次缩减,标识为#FFF,类似#CCFF00FF。前面的CC对应的是Alpha通道的值,即透明度。
位深度是指一张图片内用于表示一个像素的位数,如我们刚才介绍的RGB都是8位,位深度就是24,这种图片叫作RGB24
假设一张图片的大小是 1920 像素×1080 像素,那么这张图片至少要占用1920×1080×4字节的内存,也就是4MB
6.16 应用程序、进程和线程
“计划书”就是应用程序,详细描述了晚会筹备工作的过程、步骤(应用程序的逻辑),以及所需的场地和资金(数据);
“委员会”是主管(操作系统)创建的进程,它拥有“计划书”(应用程序)执行过程中所需的场地和资金(CPU、内存等),并代表了“计划书”的一次执行(委员会解散,整个执行过程也将终止);
“委员会”(进程)内部又创建了各个工作组(线程),来执行具体的任务(响应用户交互等),并共享“委员会”的所有资源
6.17 视频文件与编解码标准
.avi/.rmvb/.mkv/.mp4这几种视频文件扩展名是比较常见的,它们是用来与播放器关联的手段,后缀名不影响播放器解析
.avi/.rmvb/.mkv/.mp4其实是视频文件容器或称封装格式,用来组织视频、音频、字幕等信息并提供索引
个视频文件就相当于一个组合包,里面有不同的组成部分
编解码一般是为了压缩和转义
MPEG 和 ITU 两个强大的组织共同推出了一种叫“H.264”的编码标准
视频文件扩展名、视频封装格式、视频编码格式三层,每一层都有不同的含义,封装格式决定了视频的规范和组织方法,编码格式决定了视频如何压缩和解压缩。
6.18 同步、异步和回调
把自己的信息给别人的过程叫作注册,别人找到调用者并提供通知的过程就叫作回调。
同步和异步的区别就在于,在下达了执行任务的命令后,是等执行完成之后才能得到结果,还是马上就知道(尽管是不确定的)结果。
6.19 时间戳、MD5和GUID
● 时间戳(TimeStamp)
● 消息摘要算法(Message Digest Algorithm),MD5是其中最常用的一个
● GUID(Globally Unique IDentifier),全局唯一标识符
GUID是一个128位的数字标识符,它能保证在一个计算机集群中不会存在两个相同的值
6.20 栈的含义
栈也表示由操作系统管理和分配的一些内存区域,这些内存区域用来存储程序中的变量及参数,程序员常说的“栈溢出”就是指这块内存空间被用完了,内存不够,程序就崩溃了
堆是由程序员自己申请并控制的一块区域(不用的时候必须做好释放工作),而栈是由操作系统控制的
6.21 JSON
JSON,它更像是一种格式,把一个对象拆开,每一个成员变量变成了key=value的形式,被写成字符串,最后用大括号把它们括起来,拿到网络上传输,这个过程叫序列化。客户端收到这个JSON字符串之后,再按照相反的规则,把它拆开,取出里面所有的key=value,包装成一个对象,这个过程叫反序列化,也就是JSON的解析。
JavaScript Object Notation(JavaScript的对象标记法)
6.22 OPENGL
两种绘制方式:一种是CPU在内存里准备好了要绘制的东西,然后交给显示器显示;另一种是显卡在显存里准备好要绘制的东西,交给显示器显示。前者称为软件绘制,因为CPU本身并不擅长做图形相关的运算,效率也就高不到哪儿去。后者称为硬件加速,显卡天生就是用来处理图像的,所以效率很高
OpenGL是一组API,这些API可以运行在不同的平台上,可以支持各种语言。最重要的是,它能利用显卡的硬件加速能力,帮助我们绘制图形。OpenGL有700多个API,每个API代表一种能力,比如其中有一个叫glClearColor,可以把屏幕涂成用户想要的颜色。
6.23 引擎
提供单一并且可复用到别的领域的核心能力,可以把引擎理解为一套能力
6.24 开源许可证
GPL证书下的代码是可以免费使用并任意修改的,但是不允许使用它的产品作为商业软件发布和销售。还有一点,用到GPL的产品也必须开源并免费发布
LGPL允许商业软件通过库引用的方式使用声明了LGPL证书的开源代码,但是不能修改它们
商业软件可以自由发布和销售产品,同时不必公开自己的源代码
BSD可以自由地使用、修改源代码,也可以将修改后的代码作为开源或者专有软件再发布,只是使用者需要在后续开源代码中继续以 BSD协议发布,同时不能用开源代码的作者和原产品名字做市场推广
MIT的限制范围和BSD一样宽泛,它的作者只想保留版权,而无任何其他限制。
WTFPL: DO WHATTHE FUCK YOU WANT TO PUBLIC LICENSE
6.25 渲染
渲染的意思是呈现
渲染就是对数据进行一系列计算并呈现的过程,其中包括测量、排版和绘制。用户在任何屏幕上看到的任何一个图形,无一例外,都经过了这三个过程
6.26 WLAN、WIFI与IEEE 802.11
802.11b、802.11g 和802.11n
802.11是无线局域网的一个标准,所有基于802.11的产品都可以申请打上Wi-Fi的Logo。WLAN可以采用802.11标准建设,也可以采用别的标准建设
6.27 位图与矢量图
矢量图是由点、直线、多边形等几何图形构成的图像,这些点、线和多边形都是可以用数值和方程式描述出来的
常见的矢量图格式是以SVG为后缀的文件
用像素点阵来描述一张图片,我们把这种图片称为位图
6.28 接口
接口象征着提供出来的能力,定义者和实现者一般是不同的,调用者并不需要关注具体细节,只需要关注接口暴露出来的能力就可以了
6.29 线程池、对象池和连接池
Linux系统上,用户最多只能申请380多个线程
池化技术就是在充分保障系统效率的前提下,充分复用资源的一种方式,一切皆为了成本和效率
6.30 向前兼容和向后兼容
向后兼容指的是对已经发出去的老版本兼容,向前兼容指的是对还没有做好的版本兼容。
6.31 游戏引擎
光影效果
动画系统
物理系统
流体效果
渲染系统
七、前端技术
7.1 React
React是Facebook推出的一个前端框架,准确地说,它是一个前端的UI组件库
React用了一个叫JSX的语法,可以直接return HTML代码
React自带了一个虚拟的DOM树。无论是要刷新某个文字,还是插入一个广告,都可以直接操作这棵DOM树。它有一个效率很高的比对算法,保证无论你怎么摆弄,它都能把受影响的范围降到最小。
7.2 React Native
React Native是Facebook推出的一个用JavaScript语言就能同时编写iOS、Android及后台的技术
SDK包比较大,稳定性不够好
我们写的JavaScript代码,经过ReactJS框架的翻译,会生成一棵虚拟DOM树,这棵树就是最后我们这个APP页面的布局信息。之后,这棵虚拟DOM 树会经由一个叫JavaScript-Native的桥接层传递到终端世界
因为React Native引擎的启动耗时,所以首屏速度可能会稍微慢一点儿。另外,ReactNative会多出一些JS to Native的通信成本。除此之外,翻译后的UI布局因为用的是纯原生的实现方式,动画、滑动都会跟原生一样顺滑。
但React有一个硬伤,就是List(列表)的性能较差
一个APP存在大量需要动态运营的页面,比如资讯类APP,那么它的Feed页面完全可以用React Native管理
7.3 Flutter
Flutter是一套新的终端开发解决方案,像React Native一样,它采用一种前端语言来开发,但不是JavaScript,而是Dart。Dart是谷歌主推的语言,据说谷歌内部用Dart重写了大部分业务,而且把它视为谷歌下一代操作系统Fuchsia里的一等公民。Dart 语言写起来既像 Java 又像 JavaScript。
Dart语言既可以像Java那样预先编译成二进制代码预装在APK 包里,也可以像 JavaScript那样动态下发,随时解释执行。有了这个特性,开发者开发时,就用动态下发的方式把代码下发到手机里,做到实时修改实时运行,开发起来又快又顺畅。在 APP 上线时,就将代码打包成二进制,享受最小的代码体积和最高的运行效率。
它和React Native的区别在于,React Native会用终端的原生控件代替前端的界面,然后交给 Android 或者 iOS 渲染;而 Flutter则省去了原生控件这一步,直接由它自己的渲染引擎把界面“画”在屏幕上。
7.4 微信小程序
为了支持小程序,微信客户端内置了解析JavaScript的引擎,解析之后直接由WebView展示,未来也可以像React Native那样翻译成Native UI展示。开发者用微信提供的IDE写逻辑代码,如果小程序里的JavaScript需要用到外面的能力,则由微信提供,这样一个强大的内置生态系统就搭建起来了。
小程序无非就是一个高度定制的 Web页面。微信自己制订了一套HTML标签,称为WXML,又封装了一些样式规则,叫WXSS,其骨子里还是Web前端里HTML+CSS+JavaScript那一套。
JavaScript 里只有5种简单的数据类型:undefined、null、Boolean、Number 和String。前两种表示不存在;Boolean可以表示真假、是非等只有两个值的东西;Number表示数字,如1024;String表示一个单词或者一句话
JavaScript 除了数据简单,语法也简单,常用的就两套:if…else 和 for…
JavaScript后来又从Java那里学来了面向对象,从定义对象到创建对象的过程,都做了简化。JavaScript也支持继承和封装
八、人工智能
8.1 机器学习
模式识别就是利用待处理数据(图像、文字、语音等)的特征,将数据与模板匹配,并输出匹配结果
深度学习早期的基本算法模型是神经网络模型,现在已经“进化”为卷积神经网络。
8.2 机器学习框架
谷歌开发的TensorFlow,是最流行的框架
Keras框架,在众多框架的基础上再次封装,比TensorFlow更简洁,几行代码就能搭起一个神经网络
Caffe,是另一个广为人知的元老级的框架,来自加州大学伯克利分校,一开始与TensorFlow齐名,后来逐渐落伍,已经很久没有更新了。
Facebook开发的Torch,历史悠久,但由于其使用Lua语言,始终无法在Python的大潮流中大展身手
其Python版本PyTorch挺身而出,在继承了前辈的优秀基因的基础上,充分发挥其灵活、面向研究的特点,成为现在的主流框架之一。
2017年Facebook联合多家软硬件公司发布了神经网络模型转换协议ONNX(Open Neural Network Exchange),想通过一种开放的中间文件格式存储训练好的模型,以实现不同框架之间的无损转换。
机器学习调参
搭建模型
数据整理
调参
推荐系统是现在落地比较好的产品之一,它已经从传统的过滤算法,发展为深度学习的方法
8.3 TensorFlow
TensorFlow是一个深度学习框架,它主要用来构建模型、训练数据,还在移动端做了很多优化,在学术界和工业界都有广泛应用,未来会有很大的发展
神经网络是分层的,理论上层数越多,识别效果越好,所以层数更多的神经网络,就有了新名字“深度学习”
TensorFlow已经把CNN、RNN、NLP这些经典算法的通用能力提取出来封装好了,用到的时候直接调用接口就行。
8.4 话术
模式识别
通过一系列经验提取出模式,然后识别未知的模式
不断告诉计算机哪些是“我”的过程叫作“训练”,而最后再问计算机是不是“我”的过程,是预测(也可以称为分类)
训练的过程,就是找到模式的过程。这种过程在工业界叫作模式识别,在计算机界叫作机器学习
深度学习
机器学习有很多算法,神经网络是其中最强大的一个
基于神经网络来训练模式的方法就称为深度学习
“深度学习+文本”就成了自然语言处理,“深度学习+语音”就成为语音识别和语音合成,“深度学习+手写体”就成了手写体识别,“深度学习+人脸”就成了人脸识别,深度学习可以与各种技术结合,应用在各个领域中。现在有“互联网+”,以后也会有“深度学习+”
8.5 学习模型
机器学习的过程和我们学习的过程很像,先设定一个小目标(使损失函数越来越小),然后不断尝试,最后达到一个再也无法进步的状态,整个模型就训练好了
8.6 神经网络
在神经网络学习的时候,输入层连接我们的训练数据。训练数据进入神经网络之后,与神经元之间的连接的权重相乘,传入下一层神经元。下一层神经元把上一层神经元的输出当作输入,经过权重计算后一层一层向后传递。神经网络的最后一层中会有一个损失函数来统计整个神经网络当前的误差水平。学习的过程就是不断根据误差水平调整所有参数的过程,最后使神经网络达到智能状态
有多少人工,就有多少智能,需要大量训练样本和标记数据
过拟和欠拟
过拟就是只对自己的数据有效
欠拟就是完全无法预测出
推荐算法有不少,我们先介绍一种最基本的,叫作协同过滤算法,它的核心思想是“物以类聚,人以群分”,具体可以分为基于用户的协同过滤算法和基于物品的协同过滤算法。
九、沟通
9.1 需求文档
程序员需要的是一份大家都认可的清晰的交互图,其关键位置需要有一些边界条件的说明。这份交互图不一定非要用专业的原型工具输出,一张草纸加铅笔描述清晰即可。
由产品经理和程序员一起讨论功能的关键路径,并一起确定每一个流程,然后简单地画出草稿,才是效率最高的方式,并且可以少开很多会议
多请他们吃饭
9.2 延期
项目的排期取决于项目的交付周期、需求量和所需人力。具体的时间点需要技术负责人和产品负责人一起讨论制订。排期确定后,整个项目的推进过程要随时同步,大型项目的前期可以采取周会的方式同步进度,项目的后期或者周期短的项目可以采用晨会的形式,一旦发现有延期风险应及时暴露、及时应对,避免风险堆积导致被动。如果开发周期中已经出现明显的延期迹象,产品负责人要敢于做减法,分清主次需求,丢车保帅,避免项目发生整体延期
及时进行沟通与反馈,能避免很多不必要的风险。
9.3 目标设定
上半年××的效率再提升13%”“成功率提升到97%”等
KPI 式的自欺欺人的目标
设定任何一个目标,都应该看清业界最优秀的产品是什么,这个领域的最高水平是什么,然后给自己制定相应的阶段性目标
9.4 为自己工作
人生是长跑,至少要工作到60岁,我们必须追求每一天都比前一天更有厚度,只有抱着为自己工作的心态才能做到。工作是为了自己,这一点永远都最重要。
9.5 产品经理的焦虑
一些产品经理的焦虑感来自过去没有在产品经理这个岗位上有足够的积累。这些产品经理往往平时只承担项目经理的角色,项目经理以交付为准则,所以几年下来,收获的是带有泡沫的个人成长。
9.6 精益创业
创业初期怎样才算精益?作者请教过一位很有经验的创业者。初期为了验证商业模式,他只在一个社区医院租一间房,请1~2位儿科名医坐诊,每天来社区做儿保的人流,其实就是自然流量,总有人能够看到这个高端儿保的品牌。有了初始用户,就可以测试留存率、传播效果,来决定这种模式是否是可行的。而不是采用高中低端用户都关注,先开100家连锁店,各种广告轰炸的模式。
精益的作用是最小成本验证可行性,把所有资源投入到最大可能的方向。
目标明确,只突出一个点,能促使自己与程序员和设计师更快地达成一致。