目录

给产品经理讲技术

《给产品经理讲技术》一书的笔记。

沟通

惹恼程序的话

  • 先做出来看看

  • 我就要这种效果,怎么实现是你的事情

  • 这应该很简单吧,不就是xx,然后xx么

  • 这个需求先这样这样,然后再那样那样,用xx技术很快就搞定了

  • 你就说能不能做吧

  • 我有个绝妙的idea,就差一个写代码的了

  • 这个需求老大已经同意了,你照做就是

状态机:

状态机

状态机图

项目延期:

  1. 要进行需求评估

  2. 排期与风险控制

  3. 沟通

数据处理

在数据量大的情况下,要分场景选择不同的数据库:

  • 对于业务数据关系复杂的,使用关系型数据库

  • 对于简单的key-value数据,果断上NoSQL

对于NoSQL数据库,使用key来查询数据。

分布式计算的基础:MapReduce:把大量的数据分解成独立的单元执行(Map),然后将结果归并在一起(Reduce)。
比如要计算2.6TB数据中排名最前的十个人,就可以使用90台服务器做Map计算,每一台算出自己分配的数据里的前10个,然后将计算结果发送到另外10台机器上做Reduce:

MapReduce

关系型数据库:

  • 索引:上亿条记录查询很慢,可以像字典一样编制一个索引,查询时先查索引,再拿数据就快很多了

  • 事务:多条SQL语句必须一次性执行完毕,强制原子操作,在数据一致性和完整性方面,使用事务操作是必须的

  • 联合查询:多张表格一起查询

索引分类:

  • 聚簇索引:按照数据的物理存储顺序建立索引,会改变数据库表的存储结构和数据排序,所以一张表只能有一个聚簇索引

  • 非聚簇索引: 可以有多个

非聚簇索引

上图中,左边为聚簇索引,右边为名字的非聚簇索引。

ORM: 把对象转换成SQL语句写入数据库,从数据读数据自动转换为对象。

埋点: 在正常的功能逻辑中添加统计逻辑,统计某个按钮的点击数,一般统计次数会先缓存在APP中。
上报: 周期性上传统计数据给服务器。
记录: 服务器将这些统计数据记录在磁盘
入库&计算:一般将日志发送给日志处理程序,统计出日活、日留存率、某个功能使用次数等数据
展示: 通过报表的方式提供数据分析师

报表数据问题:

  • 报表数据为0

  • 报表数据(日活、在线时长、点击量)大面积突降

  • 报表数据突增

  • 历史数据出现问题

  • 报表数据明显低于预期

  • 业务流程复杂的漏斗统计数据异常

对APP的分发渠道分别统计数据是非常有意义的,这要求为每个渠道生成一个APP,当然对于开发来说,写个配置文件就可以解决了。

硬件知识

CISC 复杂指令集

RISC 精简指令集

手机屏幕

硬盘

固态硬盘SSD

内存

刷新率:标示一个输出设备每秒钟会更新多少次,单位是 Hz、显示设备的刷新率决定了你1秒钟最多看到多少张画面,比如我的显示器的刷新率就是60fps

帧率:由软件决定的,软件每秒向输出设备发送多少张图片

导致蓝牙音质差的原因是:蓝牙提供的带宽有限、二次编码带来的音质劣化

NFC: 近场通信技术,15cm以内,两台NFC设备感知到对方后,就会以13.56MHz的频率建立数据通道。

  • 主动通信: 耗电、维持一个RF场,比如地铁里的门禁机器

  • 被动通信:不需要维护RF场,只需要被动链接上对方的RF场后,应答就行

近场通信

地图

WGS-84是GPS定位使用的标准坐标系统,它标注的经纬度与地球上的经纬度是一致的,是一个准确的坐标系。

GCJ-02是我国为了保证地图数据安全,对标准坐标系做了偏移后产生的坐标系,也叫火星坐标系。

所以处理地图相关功能的正确做法是,先根据GPS获得标准坐标系上的点,然后将标准坐标系的点转换为火星坐标系的点,然后在中国地图上标注这个火星坐标系的点就ok了。

客户端技术

动画:

  • 滑动

  • 翻转

  • 回弹

广告追踪:

APK是怎样练成的

一个解压后的APK文件:

解压后的APK文件

AndroidManifest包含了软件的一些基本信息,例如版本号,同时它也是程序间能够相互调用的基础,比如在微信里声明了weixin://这样的协议头,那么其他应用就能通过这个协议头调用微信的功能。

Xposed神器

需要Root权限,能够从外部修改APP的功能,实现自动抢红包、修改GPS定位、看到微信撤回的消息。

APP 的 Push

后台有新消息想发给终端时,就使用Push向终端推送一条消息,而Push能成功的原因是: 终端周期性给服务器发数据包,告诉自己的存在和联系方式,这就是所谓的“心跳包”。

IOS上要求使用统一的Push服务,而国内安卓各个厂商都自己搞自己的。

安卓APP续命大法

  • 监听系统事件,Android的广播机制,当系统发生某件事时,它会通知给所有需要知道这件事的应用

  • 守护进程唤醒,当App守护进程发现主进程被杀死时,自动再次唤醒它

  • 全家桶唤醒大法,同一家公司的App相互守护,唤醒对方

手机传感器

  • 磁场传感器,可以获得手机在xyz三个方向上的磁场强度。

  • 加速度传感器,获得x y z三个方向上的加速度值

  • 三轴陀螺仪

  • 近距离传感器,里面有个脉冲雷达,通过脉冲信号返回时间计算距离

  • 光线传感器

  • 气压传感器,可以计算海拔高度

  • 温度传感器

一个超级APP是如何诞生的

客户端和服务器之间是一条充满妖魔鬼怪的荆棘之路,有搞劫持的、搞DNS欺诈的、挂羊头卖狗肉的。

所以APP拿到用户密码的第一件事情就是Hash不可逆加密,然后再传送给服务器。服务器验证后,会返回一个票据作为用户的已登录凭证。用户每次请求把这个凭证带上,服务器就知道你已经登录过了。

点9图:

i18n国际化:

App获取的权限

读取手机状态和身份权限,有了这个权限就可以获取到手机的唯一识别码IMEI,很多应用用它来做单一用户标识。

原生UI 与 Hybrid App

何时使用原生UI:

  • 对流畅性体验要求较高

  • UI样式相对固定,不会频繁变化

  • 交互复杂

何时使用H5页面:

  • 较强的动态运营需求

  • UI样式复杂多变

  • 交互简单

  • 多平台复用

微信登录

微信授权登录系统的授权流程:

  1. 用户请求第三方应用 微信号登录

  2. 第三方应用使用AppID向微信开放平台(微信App)发送登录请求

  3. 微信客户端加载授权页面,请求用户确认

  4. 用户点击确认按钮

  5. 微信服务器回调第三方服务器,并且将临时授权码(code)传递给第三方服务器

  6. 第三方服务器使用code、AppID和AppSecret,通过Https协议向微信开放平台索要用户的access_token

  7. 微信服务器返回用户的access_tokenrefresh_token,以及用户其他信息

分析授权流程可知,想要获取用户的access_token,就需要code AppID AppSecret三个标识,code只在用户确认授权时产生,并且有效期只有几秒钟,AppIDAppsecret由第三方应用服务器保管,所以安全性是可以信赖的。

屏幕适配

像素: 物理上的点,分辨率指的是1920*1080
屏幕密度(dpippi): 对角线上每英寸距离包含多少像素,比如iPhone 6 Plus,对角线为5.5英寸,分辨率为1920*1080,根据勾股定理,对角线有2203个像素,屏幕密度就是2203/5.5=400
密度无关像素(dp):dp=(dpi/160)*px,也就是说在160dpi的屏幕上,1dp=1px,而在320dpi屏幕下,1dp=2px

手机dpi

适配时:

  • mdpi区间: 1dp = 1px

  • hdpi区间: 1dp = 1.5px

  • xhdpi区间: 1dp = 2px

  • xxhdpi区间: 1dp = 3px

如何用安卓实现计步

计步传感器 + 加速度传感器

应用生存期

应用生存期

应用之间是如何交互的

应用可以声明自己独有的Scheme,比如微信的weixin:,QQ的mqq:,那如果多个应用都声明相同的Scheme呢?这时系统将会弹出支持的应用列表,让用户自己选择。

计算机网络

TCP/IP协议

Docker

软件开发面对的一个挑战就是环境管理的问题,因为软件并不是独立运行的,它依赖了很多其他的软件,包括操作系统、运行时、依赖库等等,而且对依赖软件的版本还有要求。

需要解决的问题:

  • 如何解决环境依赖?

  • 如何解决大规模部署?

  • 如何解决应用与应用相互影响?

Docker就是解决方案,它将特定版本的操作系统、数据库、服务器程序 和 Web 应用,这样一套完整的服务集成在自己里面。

NAT协议 网络地址枯竭的救星

NAT: 网络地址转换

  • 静态转换: 内网地址与外网地址是一一对应的关系

  • 动态转换: 与静态转换一致是一一对应的,但是IP与IP的对应关系不是固定的,内网机器如果下线,下次再链入互联网时,会分配一个不同IP,一般ISP服务商会用这种方式

  • 端口多路复用:外网IP的多个端口,对应内网的多个IP

一般家庭或公司内网都是使用的端口多路复用,请求过程梳理如下:

  1. PC浏览器访问www.ip138.com,目标:服务器124.167.236.102端口80,GET请求包源地址为192.168.1.106端口3453

  2. GET请求包先到达路由器,路由器中的NAT服务发现源地址为内网地址,于是将请求包中的源地址修改为119.182.101.189 端口4444,并且记下这个映射关系到NATTABLE里。

  3. www.ip138.com服务器收到请求包后,向目标地址119.182.101.189端口4444发送响应包

  4. 路由器接收到响应数据包,通过查询NATTABLE,将响应包的IP修改为192.168.1.106端口3453,然后发送到内网网络,浏览器就收到了响应数据。

P2P终结者的原理

局域网内的ARP攻击

Ping和网关

检查本机的TCP/IP协议是否正确:ping 127.0.0.1

Session机制

session机制解决了Http协议无状态的问题,相当于给每个用户分配了一个身份cookie,从而完成对用户的识别。

端口

物理端口: USB接口等

TCP的可靠机制

  • 顺序编号: 文件会被拆分成多个数据包发送,数据包会顺序编号

  • 确认机制: 接收方拿到数据包后,会返回一个确认包,通知发送方:已收到

  • 超时重传: 当发送方久久没有收到一个数据包的确认包时,就会重新发送这个包

UDP 不可靠

  • 数据包发送出去后,就与当前主机再无联系

  • 数据包是无序的

HTTP2

  • 多个HTTP请求复用在一个TCP链路上

  • 二进制传输:可以用来传加密数据、或视频流

  • 使用HPACK压缩头部信息

  • 服务端可以主动Push消息到浏览器

邮件协议

POP: Post Office Protocol 邮局协议,用于从邮件服务器拉取邮件到本地。

IMAP: 比POP协议强大,它是先获取邮件的标题和摘要,当你想看具体内容时再去拉取正文,同时它还可以将邮件处理状态(删除、标记已读)同步给服务器。

SMTP:发邮件的协议,一封邮件从客户端到自己的邮箱服务器,再从自己的邮箱服务器到对方的邮箱服务器,都是使用这个协议进行传输的。

反向代理

反向代理

CDN

CDN: 内容分发网络,内容一般指静态资源,比如一张图片、一个文本文件、一个视频、一个CSS、一个JS等。

CDN基于当前互联网的基础架构,全国各地部署大量服务器,在其上层再构成一个网络,这个网络专为资源分发而生。

关键点: 应用服务器 与 资源服务器 解耦。CDN专注于处理资源服务器,利用DNS判断出用户位置后,将离用户距离最近的资源服务器,返回给用户。

Socket

就是一套API,封装了TCP/IP协议。

Socket

VPN

Virtual Private Network 简称 VPN

RESTful API

规则:

  • URL 只能表示资源

  • 对资源的操作一律用HTTP协议自带的动词(GET POST UPDATE DELETE)完成

序列化

序列化: 将数据对象转成二进制串。
反序列化: 将二进制串还原成数据对象。

开发技术

内存回收

越界

观察者模式