给产品经理讲技术
前言
- 作为程序员,在跟一些产品经理打交道的过程中,作者不止一次感慨:如果他们能有些基本的技术概念,确实可以省下不少的沟通成本。
- 在互联网技术里,有 80%的概念是简单、基本、常用的,掌握这些只需要花我们 20%的时间。余下 20%的概念属于每个技术领域的实现细节,要掌握这些可能会花掉我们 80%的时间,大可以先放下它们,专攻能为我们所用的概念。
AJAX技术的妙用
- 网页没有刷新是指一个空网页渲染到屏幕上,单击网页中的一个链接后,又打开了一个新的网页。
- 其实,这种只让部分页面刷新的技术叫作AJAX(汉语读音为“阿贾克斯”或“额寨克思”),它是“Asynchronous JavaScript And XML”的首字母缩写,翻译为“异步JavaScript和XML”。
- AJAX是一项用于异步拉取数据并展示在当前页面的技术,这对需要延迟加载数据和触发式加载数据的页面有很大益处。绝大多数网页为了加速响应,都会用到这项技术。
DOM是什么
- DOM(文档对象模型)是Web前端里最基础、最常用的一个模型。
- 很多网页一开始加载出来的只是个架子,只显示出一个loading图标的转圈动画,只有等JavaScript从服务器上请求到真正的数据后操纵DOM来显示数据,才能看到内容,这就是典型的异步加载。
静态网页与动态网页
- HTML是网页的基础结构,网页如何排版、每个元素在什么位置,都是由它来描述的。
- 静态网页和动态网页的核心区别是后台是否有数据库的支撑,也可以简单地描述为网页上展示的内容是否要变化
分析URL的结构
- 一个标准的 URL 地址由protocol、hostname、port、path、parameters、query 几部分组成。
网页基础知识:表单
- 表单在很早的 HTML 版本中就已经存在,它是用户输入和网页之间数据交互的一个界面,在HTML中用
- 表单是用户和服务器数据交互的用户界面,一切向服务器提交的数据都是由其中的几个简单的标签组成的。
H5应用程序缓存简介
- Application Cache是HTML 5中定义的一种离线存储技术标准。这种技术可以让开发者明确地指定页面中哪些静态资源可以在第一次访问网页的同时缓存到本地,并且在下次访问该网页时向服务器询问本地缓存的资源是否需要更新。
Chrome里的冷知识
- DevTools:如果读者在浏览某些网站时按“F12”键启动开发者工具,会在Console这个Tab下收到网站开发者的留言,不过这些留言大多是一些招聘信息,因为这样做针对性很强,这些信息几乎只有开发工程师才能看到。
- 将网页存为PDF文件:有时我们需要将一个页面保存下来,除了用Evernote等工具,还可以在Chrome里直接将该网页存成PDF,只需按“Ctrl+P”组合键唤起“打印网页”对话框,然后在目标打印机的选项中选择“另存为PDF”选项。
JS DDoS攻击的原理与防御
- 分布式拒绝服务攻击(Distributed Denial of Service,DDoS)是一种对网站发起大量连接,导致正常用户无法访问网站的攻击手段。利用流量劫持变相进行 DDoS,就是JS DDoS。
- 开发者在引用一个第三方库时,在页面里写上它的散列值,如果第三方库被劫持,计算出的散列值与开发者写在页面里的不匹配,浏览器便不会执行它。还有另一种方案,就是使用HTTPS链接,这样可以解决大部分劫持问题。
UA的故事
- “UA”是“UserAgent”(用户代理)的简写,一般用来区分不同的浏览器。
- Gecko属于渲染引擎,用于对网页信息进行排版显示。
URL编码
- 这个“%”其实只是分隔符,如果把“%”替换成空格,就可以看到我们熟悉的编码结果了,比如上面的“e5 82 bb e5 91 80”,眼尖的读者可能会看出这就是中文的UTF-8的编码。
简单理解HTML、CSS和JavaScript
- HTML(HyperText Markup Language)是超文本标记语言。CSS(Cascading Style Sheets)是级联样式表。JavaScript 是一种脚本语言,主要用于前端页面的DOM处理。
跨域与同源
- iframe的意义非常简单,就是将一个URL地址嵌入当前页面并展示出来。
- 这就是 iframe 大致的用途:嵌入另一个页面,两个页面的功能可以解耦合,不依赖对方而存在。
- 只要两个页面的协议、主机名、端口一样,就是同源的,否则就是非同源的。
Cookie和广告联盟
- 为了让服务器识别请求者,请求者需要在发送请求时带上自己的身份信息,这个身份信息的学名叫作Cookie。
HTTP Header是什么
- HTTP 协议的 Header 是一块数据区域,分为请求头和响应头两种类型,客户端向服务区发送请求时带的是请求头,而服务器响应客户端数据时带的是响应头。
简单理解HTTP的GET和POST
- 所以通常认为GET 就是拉取服务器的数据,POST 就是向服务器提交数据,但实际上两者并没有这种明确的界限,前端开发人员有时很任性,怎么操作方便怎么来
WebSocket是什么
- WebSocket是 HTML 5的一个主要特性,它是建立在TCP上的一种全双工协议,也就是说客户端可以向服务器发信息,服务器也可以向客户端推送消息。WebSocket 在首次建立连接时,使用普通 HTTP和服务器通信,同时告诉服务器后面的交互用WebSocket的方式。在WebSocket连接建立后,往来的消息都可以通过这条管道发送,同时客户端与服务器也会不断地用ping-pong的方式保持心跳,防止连接异常断开。
“直出”是什么
- 浏览器直接输出渲染好数据的HTML页面,简称“直出”。直出没什么神秘的,只不过需要Node.js的支持,服务器和前端都用JavaScript语言编写,相当于在服务器上也运行一个浏览器,它把渲染好的内容直接输出给客户端的浏览器。
互联网的黄金矿工:爬虫
- 首先给爬虫几个初始的URL 链接,爬虫把这些链接的网页抓取回来,经过对网页进行分析,得到两部分数据:一部分是网页的有效内容,可以用来建立搜索关键词的索引,这部分数据先存储起来;另一部分就是网页中的URL链接,这些链接可以作为下一轮爬虫抓取的目标网页,如此反复操作,也许整个互联网的网页都可以被抓取下来。
简单理解单页Web应用
- 包含多个页面,通过链接切换的网站,就是多页Web应用
锚点与网页内跳转的实现
- 利用锚点的特性不仅能完成这种页面位置跳转的小功能,还可以改变浏览器的访问历史。当在不同的锚点间切换时,浏览器是可以后退的,每变化一次锚点的值(也就是#后面的值)都将增加一条浏览记录。有一些单页Web应用是靠锚点来切换当前页面的,利用的就是这个特性。当然,也可以利用一个叫History API的浏览器接口实现单页Web应用。
前端如何适配手机屏幕
- viewport俗称“视口”,用来描述一块区域,浏览器可以在这块区域上排版、渲染网页。
- viewport是一块区域,手机上的浏览器为了适配桌面上的网页,把它设置成宽980像素,但是这样的网页要正确地显示出来必须经过缩放或者用滚动条,所以开发者在写前端网页的时候,会用一个width=device-width的viewport,这样CSS里看到的屏幕总宽度在320像素左右,1像素代表的物理像素数会自动根据屏幕密度进行换算。这样就完成了设计师的目标:标注80像素的按钮,在不同的手机上,看起来一样大。
简单理解“盗链”与“反盗链”
- 大部分浏览器在请求一个资源时会将当前网页的域名放在HTTP请求头的refer字段里,服务器只需要判断这个域名是否属于允许请求该资源的站点,如果“是”,就返回正确内容,否则就返回一张反盗链警告图片。
广告过滤机制科普
- 屏蔽广告的主要手段只有两招,一招是不让广告被下载,另一招是即便广告被下载,也不让它展示出来。
“骗人”的动画
- 所以,开发者利用闪屏展示的时间,把应用启动的准备工作在闪屏“后面”做完,同时,还能在闪屏上进行一些运营活动,可谓一石二鸟。
- 于是开发者开动脑筋,想到了办法——退出应用的时候截一张界面的图,启动应用的时候用这张截图代替闪屏做启动动画,看起来就像取消了闪屏。如果哪天用户发现某个应用的启动变快了,但是进了界面却没办法操作,就很可能被“骗”了。
细说Android应用的“续命大法”
- “续命大法”第一式:监听系统事件
Hybrid APP
- 所谓Hybrid APP,就是指使用原生和H5两种UI呈现内容。
- 在Android系统的“开发者选项”界面里,有一个名为“显示布局边界”的功能,通过使用这个功能,读者可以很快地分辨出哪些是原生 UI,哪些是 H5
- 原生页面为了展示丰富的内容,一般需要利用大量控件进行组合,所以当读者看到某个页面布满了框时,就可以判断出这部分肯定是基于原生UI呈现的
- 何时使用原生UI ● 对流畅性体验要求较高的场景 ● UI样式相对固定,不会频繁变化 ● 交互复杂 何时使用H5页面 ● 较强的动态运营需求 ● UI样式复杂多变 ● 交互简单 ● 多平台复用
手机传感器知多少
- 加速度传感器的另一个用处是计步。当用户拿着手机运动时,手机会随着身体上下摆动,加速度传感器就会检测出加速度在某个方向上来回改变,通过计算来回改变的次数,可以得出步数。
定位终端设备位置的方法有哪些
- 这些APP获得了定位权限后,就会通过系统接口获取当前手机的经纬度,上传给服务器。有的服务器拿到位置后,会查询一些附近的商家推荐给用户,这就是团购APP的原理。
客户端推送实现方式
- 推送就是为了解决这样的困境,它给了服务器一个展示自我的机会,主动连接所有 APP,要求客户端再发起一次请求,于是收到推送的 APP(即使此时已经被用户关闭)又去服务器请求最新的新闻,这样用户就能看到最新的新闻了
- APP和后台的连接方式有两种,一种叫pull,也叫轮询,就是定期地不断向后台请求,缺点是耗电,费流量,不环保;另一种叫 push,APP 和后台一直维持了一条通信通道,不定期地发送心跳包,也能携带信息。缺点是要维持一条长连接通道,这条通道如果不用一些特殊手段保持连通性,很容易受系统或其他安全软件的影响而断开。
为什么美颜APP可以美颜
- 千万不要用CPU做滤镜算法的运算,而要用OpenGL充分发挥GPU的能力,因为GPU的设计原理最适合这种工作量大又没有难度的重复计算任务。
听歌识曲的基本原理
- “以图搜图”的功能通过对图片进行缩放、灰度处理,最后提取出一个64位的散列值作为特征码,用它去做匹配。
- 总结一下,听歌识曲的实现方式是对数据库里的所有音乐提取乐纹。对每一首音乐,先算出它的频谱图,然后把它分成几个片段,每一段都在频谱图上找几个点作为特征点,从而生成这一片段的乐纹。一首歌通常有很多乐纹,都以倒排索引的形式存储在数据库里。对于上传的录音,也是先提取它的乐纹,然后在数据库里进行检索,最后考虑乐纹的排列、时间间隔等因素,找到最相似的音乐。
朋友圈中的图片缓存系统
- 缓存的概念是什么呢?缓是“临时”的意思,存是“存储”的意思,所以缓存的概念就是“临时存储”。
- 缓存系统通常分两级,称为一级缓存和二级缓存。一级缓存也叫内存缓存,二级缓存也叫磁盘缓存(在硬盘或者SD卡上的缓存)。显然,一级缓存
程序中的“越界”是什么
- 程序员要存储的数字超过了他选用的数据类型所能表示的最大范围时,就会发生数据范围越界。
编程五分钟,命名两小时
- 程序设计里最难的两件事,一件是保证缓存一致性,另一件就是命名
- 比较著名的有匈牙利命名法,它要求命名变量的时候采用“作用域+类型+名字”的规范。
开发动画需要多少工作量
- 作者就以Android系统为例,介绍最基本的4种动画:位移动画、缩放动画、渐隐渐现动画和旋转动画。这4种动画虽然效果不同,但都作用在控件上。
耦合与解耦
- 还有各种设计模式也是可以帮助解耦的,原则就是避免直接交叉,不将A功能的代码写在 B 功能的代码中。如果两者之间需要交互,可以通过接口、通过消息,甚至可以引入框架。
栈与队列
- 栈和队列都属于线性表,它们本质上和数组、链表没有区别,甚至很多版本的栈与队列的底层就是用数组来模拟的。
- 栈是一种“先进后出”的数据结构。
- 如果你的数据在处理过程中需要保持原有的顺序,用队列来处理,准没错。
为什么有些Bug不能改
- 其次,这个小Bug可能是被设计出来以隐藏一个大Bug的。
加载等待的艺术
- 一般来说,模块离 CPU 越近,运行速度就越快,大体的速度快慢排序是寄存器→高速缓存→内存→硬盘→网络。
并行计算
- 并行计算在计算机世界中有两种实现方式:时间上的并行和空间上的并行。
- 系统进行调度的基本单位是线程和进程,多核操作系统就是将相互独立的线程和进程分配到不同核心上,达到并行计算的目的。
简单了解进程间通信
- 进程是程序实体的运行过程,是系统进行资源分配和调度的独立单位。”
- 这就是基于管道的通信方式。
“编不过”是怎么回事
- 计算机世界中负责这种翻译的是编译器,它的任务就是把高级语言翻译成低级语言(也有编译器把低级语言翻译成高级语言,即反编译)
- 程序员说的“编”就是编译器在进行翻译,“编不过”就是编译器在翻译的过程中发现有单词和语法不符合规范,向程序员提出警告:必须按照规范来,否则不予通过。
程序“挂了”是怎么回事
- 这种问题的产生原因一般是程序员在设计算法时欠考虑,没有对可能遇到的异常状态做处理。常见的异常状况有空指针、数组访问越界等。一般来说,那些出现概率很高的导致应用“挂掉”的问题,大多是出于这类原因。
- 造成应用程序“挂掉”的根本原因,是程序运行到了一个自身无法处理的异常状态,在这种状态下,应用程序只能选择强制退出,才能终止这种异常状态。
简单说说操作系统
- 现有的操作系统中有三款最流行,分别是微软公司的Windows、苹果公司的Mac OS和开源的Linux。
- 一般内存分为物理内存和虚拟内存。简单来说,物理内存就是实际的内存大小。虚拟内存是给操作系统里的应用程序看的,有时物理内存只有 2GB,但是应用程序需要4GB,于是就虚构一块出来,通过内存的换页机制蒙混过关。
什么是代码混淆
- 代码混淆并不是加密代码,它只是让代码看起来比较难懂,但是机器的执行逻辑是一样的,增加的是人为分析的难度和时间成本。
程序员遇到Bug时会做些什么
- 常见的调试方法就是断点
应用“续命”大法之异常捕获
- 异常捕获就是开发者知道程序运行到这里可能会崩溃,但是又没什么好办法处理,于是强行让程序绕过去避免崩溃,如果这里对程序后面运行影响不大,那么程序还能保持健康状态继续运行下去。很多高级语言都提供了异常捕获的能力。
搜索引擎的基石:倒排索引
- 在爬虫抓取回一个网页后,先对它进行分词处理,然后把这些提取出来的关键词与这个网页的ID做一个映射,这就是倒排索引(Inverted Index)。
简单理解面向对象
- 面向过程指的是程序员接到需求,把它拆成一个一个的命令,然后串起来交给计算机去执行。
- 对象把它的能力通过接口的方式公布出来,自己则成为接口的实现者。
简单理解重构
- 代码重构是软件开发过程中提高开发效率和质量的重要手段
- 重构就是在保留现有功能的基础上,重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性、结构性和扩展性,增加软件的开发效率,优化程序的性能。重构的范围可大可小,大到涉及整个产品的各个模块,小到一个函数。
流水线技术
- 流水线技术是指,在重复执行一项任务时,可以把它细分成很多小任务,让这些小任务重叠执行,来提高整体的运行效率。
多线程是什么
- 多线程是有效提升程序运行效率的方式之一。它还在提升优化算法、提高硬件配置、分布式计算、网格计算的效率方面起着重要作用。
- 多线程有两层含义:(1)开启多个线程做不同的事情,目的是并发同时做很多事情。(2)开启多个线程做同一个事情(比如前面举的放水的例子),目的是提高效率。
复用的艺术:线程池
- 程序员的世界里,像线程池这样的池还有很多,比如对象池、连接池、指令池等。把一个东西“池化”是一种很典型的复用思想,它的核心就是,如果可以重复使用某些东西,就尽量不要销毁它。
网络基础之协议栈
- 原始数据首先被拆解并编码,然后转化为电平或者光信号,最终在物理介质上传输。原始信息的“分解”和“还原”都是在计算机网络协议栈中进行的。
- 分层的另一个好处是使得每一层都可以被独立设计,只要保证与上下两层的“接口”(数据传输方式)保持一致即可。
IP地址枯竭的后悔药:网络地址转换
- NAT技术将内网主机屏蔽在一个或几个外网IP地址后,降低了内网主机直接暴露到外网上的安全风险。另外,端口多路复用技术大大地减少了IP地址的需求量,减缓了IP地址的枯竭。
PING和网关
- PING是 TCP/IP协议簇中的一部分,它的原理是向目标 IP地址发送一个数据包,如果对方返回一个同样大小的数据包,则证明连通,并且整个过程能够测试时延。
端口二三话
- “端口”,顾名思义,是终端留给外部的接口,是不同设备间通信的桥梁。
- 驱动是外部硬件设备与计算机交流时的翻译。
TCP与UDP
- TCP(Transmission Control Protocol)即传输控制协议,IP(Internet Protocol)即因特网互联协议。
- TCP/IP 是一个协议簇,也就是许多协议的集合。
- TCP/IP又分为4层,分别为应用层、传输层、网络层和物理层。
- 第一种通信前需要双方都应答的通信方式对应的是 TCP,第二种只管发送成功而不管接收是否成功的通信方式对应的是 UDP。
TCP凭什么说自己可靠
- TCP 的可靠并不是指通过TCP发送的数据都能100%发送成功,而是指发送方能明确地知道所有已发送数据最终的状态。
谈谈UDP的可靠性
- UDP(User Datagram Protocol)的中文名是“用户数据包协议”。它与TCP一样,负责将上层应用数据从网络的一端传输到另一端。
CDN是什么
- CDN(Content Delivery Network,内容分发网络)
- CDN的作用:它是一个基于互联网的数量巨大的服务器集群,专注于内容和资源分发,为用户提供快速访问资源的能力,进而提升内容访问的体验。
- 在开发层面,应用服务器和资源服务器应该解耦,应用服务器只负责逻辑能力,而资源服务器存放内容、资源,这样才能做到“术业有专攻”。
- CDN专注于互联网资源访问的体验优化,对开发者和用户都是有益的
推送服务的核心:长连接
- 推送服务已经是各大 APP 的“标配”功能,长连接是推送服务的技术核心,推送服务的所有功能都是基于长连接实现的。
- 如果每次获取数据都创建一个独占的连接,并在数据传输完毕后释放,这种连接就叫作“短连接”。而一个能够供多个请求多次传输数据,并在数据传输后不会立即释放的连接称为“长连接”。
HTTPS技术简介
- HTTPS在HTTP和TCP之间添加了一层SSL协议。SSL是用来保障网络上数据传输安全的一套协议,它在传输层对HTTP进行封装加密,然后将数据交由TCP发送到网络上。
讲讲代理服务器
- 代理服务器架在客户端和真正服务器中间,作用是替客户端访问真正的服务器。
- 一是真正的服务器藏于千里之外,用户连接不上
- 还有一种情况:通过代理服务器访问真正服务器可以隐藏访问者的身份,保护访问者。
- 很多手机浏览器的省流加速功能,其实就是通过代理服务器达到节省流量的目的
Socket简介
- Socket是什么?它其实是一套API,封装了TCP/IP。
- 基于HTTP的连接是短连接,客户端请求一次数据,就主动和服务器断开了,Socket则不是,默认情况下,双方会一直保持联系。
- Socket不仅可以用来和别的计算机进行通信,还可以作为进程间通信的一种方式,让两个进程产生联系。
什么是HTTP 302跳转
- 302状态码应用的典型场景是服务器页面路径的重新规划
神奇的Hosts文件
- Hosts文件给了用户一个自己决定命运的机会:用户可以在 Hosts 文件中,指定某个域名对应的IP地址,系统在发起网络请求时,会优先使用Hosts文件中的IP地址,这样就达到自主决定使用哪台服务器的目的。
VPN简介
- VPN(Virtual Private Network)就是虚拟专用网络。
- VPN 就是一条在公共网络上虚拟出来的专用通道,来满足用户自由交流不被窃听的需求。
Web安全之SQL语句
- 产生SQL注入漏洞的原因也很简单:开发者没有对用户提交的内容进行审核,导致恶意 SQL 语句被执行。
- 永远不要相信外界输入的数据,对任何外界输入的数据都要做合法性的校验。
Web安全之XSS
- XSS(Cross Site Script)攻击的全称为“跨站脚本攻击”,指的是攻击者在正常网页中注入恶意脚本,当用户访问该网页时,恶意脚本会在用户浏览器上执行,从而窃取用户Cookie或者导航到恶意网站等,达到攻击的目的。
Web安全之CSRF
- CSRF 攻击的本质是,浏览器无法区分一个请求是用户在当前网站自愿发起的,还是其他网站模拟用户行为发出来的。
DDoS的原理
- DDoS(Distributed Denial of Service)的中文译名是分布式拒绝服务。DDoS的基本原理是通过对服务器发送大量无用的请求耗尽服务器资源(CPU、内存等),导致服务无法正常运行,正常请求无法得到响应。
- DDoS的可怕之处正是被攻击者(超市)无法正确区分哪些是攻击者发来的请求(被谣言欺骗的顾客),哪些又是正常的请求(没听过谣言的其他顾客),从而无法做出响应。
后台服务之RPC框架
- RPC是一种方法,RPC框架是基于RPC方法封装的一套框架(它提供了一套方法和工具,将每个人都要面对的问题封装起来,使你能够在这个框架上开发出适合你业务的应用程序,也就不用再关心底层的网络、协议的实现,只需关心上层业务逻辑即可)。
后台服务之RESTful API
- 程序员说的 REST 并不是我们理解的英语单词“REST”,它是 Representational State Transfer的缩写,意为“表现层状态转化”。REST是一种定义API的风格。
Session是用来做什么的
- Session解决了HTTP无状态的问题,这种机制相当于给每个用户分配了一个身份,从而完成对用户的识别,也将用户多次不同的操作关联在了一起。
抽象、封装、类、实例和对象
- 对事物进行“抽象”,从而封装为“类”,由“类”可以生成“实例”或“对象”。
SDK、API和架构
- SDK是Software Development Kit的简称,中文名称是软件开发工具包,是基于当前系统或者平台的一整套开发工具的集合。
- API是Application Programming Interface的简写,中文称为应用程序编程接口
- 架构指一个软件系统的结构,是考虑了一个软件系统的所有设计要素、梳理清楚模块划分及模块之间的关系后形成的一种结构设计。
控件、组件和框架
- 控件表示程序设计中最小粒度的可复用可编程的部件。
二进制文件
- 用二进制文件存储数字要比用文本文件存储省空间。
- 二进制文件更省空间,写入速度更快,因为可读性很差,所以还有一定的加密保护作用
脚本
- 脚本,是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。
- 脚本的英文是Script,名词词义是剧本。
- 脚本就是剧本 ● 脚本是普通的文本文件,是批处理文件 ● 脚本导演了一个序列事件的发生 ● 脚本让一个例行任务效率大幅提升
- 脚本的运行环境叫作“解释器”,用于理解脚本的含义。脚本语言有很多种,也有相应的配套解释器。
内存泄漏
- 这种由于程序申请了内存,但没有释放内存,导致内存一直处于被消耗的状态,称为内存泄漏。
中间件
- 在计算机中,中间件是位于两个软件中间的软件,广义地讲,中间件一般为应用软件和系统软件之间相互通信的桥梁。
打底数据与云端控制
- 程序员所说的“写死”实际上是指让一些参数或配置固化,不可变动。“写死”意味着数据不可更改,除非版本更替。
- 一个好的产品设计是这样的:本地要默认写死一些常在展示、不怎么变化的频道,这些称为打底数据或默认数据。如果没有这份写死的数据,你的客户端运行时,至网络数据传回前或者无网络时,头部都没有任何信息展示。所以打底数据主要用于解决用户体验问题,在无网络或初次启动时,告知用户这个客户端已经在正常运行。
变量与函数
- 变量好比表达式中的一个个数字,而函数则好比操作这些数字的运算逻辑。
- 程序员每天的工作就是定义变量、写函数,然后运行程序,看变量的值是否符合预期,不符合预期则调至符合预期为止。
散列表
- 散列也称哈希,利用散列算法实现的散列表,是一种与数组、链表等不同的数据结构,它并不需要通过遍历的方法查找数据。散列表设计了一
钩子
- Hook 的意思是钩住,也就是在消息过去之前,先把消息钩住,不让其传递,使用户可以优先处理。执行这种操作的函数也称为钩子函数。
配置文件
- 有的配置直接写在代码中,有的配置写在一个文件中,这个文件就称为配置文件。
- 配置文件就是一个对软件运行时状态的本地存储形式,我们可以通过改动配置文件来改变软件运行行为或策略。
RGB通识
- RGB是Red、Green、Blue三种颜色的缩写,称作三原色
视频文件与编解码标准
- .avi/.rmvb/.mkv/.mp4其实是视频文件容器或称封装格式,用来组织视频、音频、字幕等信息并提供索引
- 一个视频的本质是其编码标准,一个高清的视频是可以放在任何容器里的,当然也可以拥有各种扩展名。一个视频到底清不清晰,请不要用扩展名是.mp4还是.mkv来判断。
同步、异步和回调
- 同步和异步的区别就在于,在下达了执行任务的命令后,是等执行完成之后才能得到结果,还是马上就知道(尽管是不确定的)结果。
- 把自己的信息给别人的过程叫作注册,别人找到调用者并提供通知的过程就叫作回调。
时间戳、MD5和GUID
- 我们可以将时间戳理解为:当某一事件发生时,立刻为它存储一个时间。
- GUID是一个128位的数字标识符,它能保证在一个计算机集群中不会存在两个相同的值。
栈的含义
- 栈的第一层含义是指一种数据结构,这种数据结构标识了一个有前后关系的列表,该列表要符合先进后出的原则
- “技术栈”可以理解为一项技术的垂直领域,例如前端技术栈、终端技术栈、后台技术栈等。技术栈由该垂直领域内的关键技术点组成。如果某个技术人员同时掌握多个技术栈,就会被称为“全栈工程师”。
JSON
- 程序员发明了JSON,它更像是一种格式,把一个对象拆开,每一个成员变量变成了key=value的形式,被写成字符串,最后用大括号把它们括起来,拿到网络上传输,这个过程叫序列化。客户端收到这个JSON字符串之后,再按照相反的规则,把它拆开,取出里面所有的key=value,包装成一个对象,这个过程叫反序列化,也就是JSON的解析。
理解OpenGL
- OpenGL的绘制流程大约要经过几个步骤。首先,要把要画的东西拆成三角形之类的基本图形,然后在三维空间坐标系里给它们安排合适的位置,之后把灯光加上去,使要画的东西有一种立体感,最后,把这些东西转化成屏幕上的像素点(即光栅化),整个绘制就算是完成了。
引擎
- 渲染引擎,我们通常称之为浏览器内核,是浏览器中最重要的呈现HTML、CSS、JavaScript的“发动机”
- 在软件工程里,各个模块之间都会被调度引擎进行组合、协调,调度引擎是一个软件系统中保障各个模块有序运作的、不可缺少的部分。
渲染
- 渲染的意思是呈现,也就是“显示出来”
- 渲染就是对数据进行一系列计算并呈现的过程,其中包括测量、排版和绘制。用户在任何屏幕上看到的任何一个图形,无一例外,都经过了这三个过程。
位图与矢量图
- JPG、PNG、WEBP这些常用图片格式都有一个共性——用像素点阵来描述一张图片,我们把这种图片称为位图。
接口
- 接口就是提供具体能力的一个标准和抽象。
- 截至目前,接口有了三层意思: (1)接口定义了一组能力。 (2)接口有定义者和实现者。 (3)接口定义一般是抽象的,不包括具体的实现。
- 接口象征着提供出来的能力,定义者和实现者一般是不同的,调用者并不需要关注具体细节,只需要关注接口暴露出来的能力就可以了
- 以后如果程序员说“你给我封装一个接口,我直接调用”,读者应该理解他说的意思是:“我不关心你如何实现这个能力,只要我要用的时候,你给我正确的结果就好了。”
线程池、对象池和连接池
- 池化技术就是在充分保障系统效率的前提下,充分复用资源的一种方式,一切皆为了成本和效率。
向前兼容和向后兼容
- 向后兼容指的是对已经发出去的老版本兼容,向前兼容指的是对还没有做好的版本兼容。
- 一种好的工作方法,应该是不去规划系统或方法,先用最简单的方式完成第一个试水或落地场景。当用同样的方法做完第二个场景后,就能抽象出一个规则或流程来做这件事,做完第三个场景后,就可以规划出一整套系统专心做这件事。通过这样的过程形成的系统,运行时往往会更加高效和稳健。
游戏引擎
- 游戏引擎是游戏世界的基础框架,它定义并实现了游戏中的自然法则。这些法则包括光影效果、动画系统、物理系统、流体效果和渲染系统。
React:流行的前端技术
- React,这个来自Facebook的流行前端框架,提供了一种解决思路。
- React自带了一个虚拟的DOM树。无论是要刷新某个文字,还是插入一个广告,都可以直接操作这棵DOM树。它有一个效率很高的比对算法,保证无论你怎么摆弄,它都能把受影响的范围降到最小。
React Native:专治急性子的产品经理
- React Native是Facebook推出的一个用JavaScript语言就能同时编写iOS、Android及后台的技术
一个React Native的应用是什么样的
- React Native允许开发者使用JavaScript作为开发语言,像写网页一样,用JSX语法布局页面,React引擎会把JSX语法翻译成终端的布局,并依赖终端的能力显示页面。
什么样的业务适合用React Native来改造
- 如果一个APP存在大量需要动态运营的页面,比如资讯类APP,那么它的Feed页面完全可以用React Native管理。在React Native带来的方便、高效率面前,几个小缺点都可以忽略。
终端开发新思路:Flutter
- 它和React Native的区别在于,React Native会用终端的原生控件代替前端的界面,然后交给 Android 或者 iOS 渲染;而Flutter则省去了原生控件这一步,直接由它自己的渲染引擎把界面“画”在屏幕上。
- Flutter是一套用Dart语言来写的、兼容Android和iOS的终端开发框架。
一窥微信小程序的技术思路
- 为了支持小程序,微信客户端内置了解析JavaScript的引擎,解析之后直接由WebView展示,未来也可以像React Native那样翻译成Native UI展示。开发者用微信提供的IDE写逻辑代码,如果小程序里的JavaScript需要用到外面的能力,则由微信提供,这样一个强大的内置生态系统就搭建起来了。
如何自己开发小程序
- 小程序无非就是一个高度定制的 Web页面。微信自己制订了一套HTML标签,称为WXML,又封装了一些样式规则,叫WXSS,其骨子里还是Web前端里HTML+CSS+JavaScript那一套。
如何通俗地理解机器学习
- 模式识别是人工智能发展初期最被看好的一项智能技术。“模式”可以理解为特征,模式识别就是利用待处理数据(图像、文字、语音等)的特征,将数据与模板匹配,并输出匹配结果。我们当前常用的语音识别及图片中的文字识别等,都可以看作是模式识别技术的应用。
TensorFlow:几行代码写一个神经网络的时代来了
- 因为神经网络是分层的,理论上层数越多,识别效果越好,所以层数更多的神经网络,就有了新名字“深度学习”。
- TensorFlow只是给了开发者一个壳,内部结构还是要根据甲方的需求,也就是你老板交给你的具体AI任务,选用合适的机器学习算法来完成。如果你的任务是智能识别类的,比如让机器识花、识汽车、识鸟类,就用CNN模型;如果你的任务是做推荐系统,那你要去了解NLP算法;如果你要做一个类似Siri的语音助手,就要去学RNN和LSTM的知识。总而言之,TensorFlow已经把CNN、RNN、NLP这些经典算法的通用能力提取出来封装好了,用到的时候直接调用接口就行。
- TensorFlow是一个深度学习框架,它主要用来构建模型、训练数据,还在移动端做了很多优化,在学术界和工业界都有广泛应用,未来会有很大的发展。
人工智能里的套话该怎么理解
- 人工智能就是让计算机能像人类一样思考,机器具备了人类的思考方式,并且能根据自己的“经验”,产生预测、判断、分类的能力。
- 训练的过程,就是找到模式的过程。这种过程在工业界叫作模式识别,在计算机界叫作机器学习。
- 基于神经网络来训练模式的方法就称为深度学习。
什么是神经网络
- 神经网络就是这样一种高级模型,它能拟合任意一种非线性的关系,是机器学习的终极武器。
- 神经网络由很多神经元连接起来,每一条连接都有一个参数。训练神经网络的过程就是不断调整这些参数使得最后的损失函数的值不断变小的过程。最后,算出来的损失函数的值小得不能再小,神经网络就训练好了,可以通过推理来满足我们的产品需求。
神经网络的数据处理
- 神经网络模型分为有监督模型和无监督模型。有监督是指模型在训练过程中,会有一个正确答案作为指导,我们现在见到的大多数神经网络模型就是这种。无监督就是没有正确答案指导,模型靠自己的能力把数据归类。标注就是给模型准备正确答案的过程,毫无疑问,这是最耗时也最费人力的。
懂你的推荐算法:你应该懂的一些知识
- 其次,要有用户的行为数据,也是越多越详细越好。
- 协同过滤算法,它的核心思想是“物以类聚,人以群分”,具体可以分为基于用户的协同过滤算法和基于物品的协同过滤算法。
如何正确地提需求
- 程序员写代码可不光是完成功能那么简单,代码写得规范不规范,健壮与否,扩展性怎么样,都是需要事先下功夫设计的。
- 一般一个不太拖沓的互联网产品,每个版本会经过功能开发、单元测试、集成测试、灰度验证和上线发布几个阶段。
程序员想要的需求文档
- 程序员需要的是一份大家都认可的清晰的交互图,其关键位置需要有一些边界条件的说明。这份交互图不一定非要用专业的原型工具输出,一张草纸加铅笔描述清晰即可。
为什么项目会延期
- 。如果开发周期中已经出现明显的延期迹象,产品负责人要敢于做减法,分清主次需求,丢车保帅,避免项目发生整体延期。当然,通过常规手段(例如加班)赶进度也是常用方法,虽然作者并不提倡。
- 改进项目管理方式的一个捷径是学习其他团队的工作模式,吸取经验,加以改进,或许可以做到事半功倍。
目标设定的两种方法
- 设定任何一个目标,都应该看清业界最优秀的产品是什么,这个领域的最高水平是什么,然后给自己制定相应的阶段性目标。
你只是在为自己工作
- 那些认为一切工作都是为自己做的人成长得最快,抱怨最少。
- 人生是长跑,至少要工作到60岁,我们必须追求每一天都比前一天更有厚度,只有抱着为自己工作的心态才能做到。工作是为了自己,这一点永远都最重要。
为什么产品经理经常焦虑
- 一些产品经理的焦虑感来自过去没有在产品经理这个岗位上有足够的积累。这些产品经理往往平时只承担项目经理的角色,项目经理以交付为准则,所以几年下来,收获的是带有泡沫的个人成长。
精益创业的作用
- 有一本书叫《精益创业》,讲的是如何用最小的成本尝试一个特性,并根据用户的反馈有针对性地改进。
- 精益的作用是最小成本验证可行性,把所有资源投入到最大可能的方向。