Interpret Technique to PM|Chapter9:Development Technology

Abstract:产品研发过程中的一些基础的开发技术知识。如越界,动画开发,并行计算,程序与数据结构,MVC模式,敏捷开发模式等。

越界

  • 数组越界:由于线程执行顺序导致的异常;
  • 数据范围越界:要存储的数字超过了其选用的数据类型所能表示的最大范围;一般开始定义时没问题,但掺杂各种运算处理后数据范围易出现问题;

深度学习

  • Google Tensorflow框架;Facebook Torch框架;UC Berkely Caffe框架;

程序设计的时空大法

空间换时间

  • 目的:运行流畅;
  • 原理:将经常使用的资源或将来可能使用的资源加载到内存里(缓存/预读);

时间换空间

  • 原理:在空间资源有限的情况下,消耗更多的时间做加载或运算来减少内存的占用;
  • 方式:1.用更多的运算代替存储;2.直接清理内存空间;3.从外存加载到内存;
  • 目的:节省存储资源;

开发动画的工作量

  • 位移动画:让控件在一段时间内不断改变位置而形成的动画效果;实现:创建一个translateanimation对象(位移动画的配置清单,包括:动画开始时控件的起始位置+结束时控件要到达的位置+动画持续时间)——让控件执行启动动画的命令——系统根据默认的插值算法,在动画的持续时间内,计算每一帧中控件的位置,然后绘制出来;
  • 缩放动画:控件在一段时间内不断改变自身大小而形成的动画效果;实现:配置清单(动画开始时控件的缩放倍率+结束时的缩放倍率+持续时间+原点)——动画启动后的每一帧都会计算当前时间控件对应的缩放率;
  • 渐隐渐现动画:在一定时间内持续改变控件的透明度形成的动画效果;实现:配置清单(动画开始时控件的透明度——结束时的透明度+持续时间);
  • 旋转动画:让控件在一段时间内围绕一个固定点旋转指定的角度;实现:配置清单(动画开始时控件的旋转角度+结束时的旋转角度+持续时间+原点);

动画

  • 帧Frame:动画过程中的某一张静止画面;
  • 帧率:动画每秒播放的帧数;FPS为单位;30帧/s为连贯,60帧/s为流畅(每帧16毫秒);
  • 技术实现:绘制图形的命令(drawCircle/drawRect/drawText)——refresh(刷新屏幕)——scheduleNextFrame(定时器:告诉操作系统下一帧的时间);
  • ios/android都内置了几种常见动画类型(缩放/平移/旋转/渐变等),只需设置好动画时长/动画中要变化的东西,然后发出start命令即可;
  • 有交互的动画:由用户手指操作触发刷新屏幕;

程序与数据结构

  • 程序=算法+数据结构,本质是对数据进行处理;
  • 构建数据模型:把可能用到的东西数据化;
  • 数据结构:描述一些彼此有关联的数据的集合(帮助程序员处理批量数据的:插入修改删除查询CRUD);

数组

  • 特点:一下子可承很多数据,挨个排放,每个位置都有一个编号,数据通过编号访问;
  • 插:后面所有元素要往后挪一格;改:喊编号即可;删:后面的往前挪一格;查:遍历数组;

链表

  • 特点:数据非挨个存放,也无编号;每个数据都有一个指向下个数据位置的指针(指针:地址,指向下个元素的位置);像链子一样把所有数据串起来;
  • 插:只需改A元素的指针指向B,然后改B指针指向C;删:删-衔;改:改地址;查:遍历;

队列

  • 特点:先进先出的数据结构,进——数据的插入,出——数据的删除;强制限制顺序,不允许插队;

  • 特点:先进后出;
  • 栈溢出stackoverflow:app用的内存不小心超过系统限制,被系统封杀;

线程池:复用的艺术

  • 服务器:用来接收并响应客户端的请求;
  • 线程池:用生产者消费者模型来理解,即:生产者——客户端,生产网络请求,消费者——线程池里的线程,消费请求,消费过程即响应网络请求的过程;(当请求太多,而线程池里没有空闲线程时,则把请求放入队列中排队);
  • 复用思想:弄个池子,放一些线程,用则取,不用则放归;

二进制图片转字符

  • 目的:直接在html里插入图片,节省网络请求(请求图片);
  • 如何实现转换:用base64编码转换(base64:64个可用字符,6bit表示一个字符);
  • 缺点:html文件会变大,适合编码小图片;

后台是干啥的(RPC框架)

  • 后台技术栈的核心:RPC(remote procedure call远程过程调用)框架即基于调用远程服务方法封装的一套框架;

技术源于生活

生产者和消费者模式

  • 多线程:并发执行模式,主要目的——最大化利用各种资源(CPU,磁盘,显卡,网络带宽),提高程序整体性能;精髓在于定义了一个缓冲区;

流水线

  • 面向对象的精髓:把所有东西抽象成对象,对象能响应命令;
  • pipeline流水线技术:重复执行一项任务时可把它细分成很多小任务,让小任务们重叠执行,以提高整体的运行效率;

敏捷开发与瀑布式开发

  • 敏捷开发:拥抱变化,快速响应;

加载等待的艺术

  • 菊花:异步加载技术;一种简单的交互,为使界面交互更流畅自然;
  • 同步加载的执行速度太慢:凡跟内存之后的存储设备(存储设备按运行速度排序:寄存器-高速缓冲器-内存-硬盘;内存前的设备可立刻加载,内存后的很慢)打交道的任务【IO密集型任务】都不适合同步加载;
  • 菊花的使用场景:当用户跳转到新场景或加载新网页(必须执行一些io密集型任务才能让用户看到内容)时;
  • 入场动画:动画是GPU密集型任务,后台执行CPU/IO密集型无影响;动画:一遍遍渲染界面(渲染:刷新界面,16毫秒/个);

耦合与解耦

  • pm眼中的功能:一块一块的积木,可组合可拆分;开发眼中的功能:耦合,血脉相融,牵一发动全身;
  • 避免耦合:A功能的代码不要写在B功能里,若二者需要交互,可通过接口/消息/引入框架,但不要交叉写;
  • pm需提前提醒:若预见功能有未来独立化的趋势,需提前提醒开发避免耦合,以免增加后期代码耦合的工作量;

代码混淆

  • 将代码写的晦涩难懂(如改成难懂的变量名),以增加人为分析的难度和时间成本;

软件架构中的三权分立模式:MVC模式

  • model:模型,主要用于表示一些数据结构和数据存取(数据层);
  • view:UI样式;
  • controller:model和view的桥梁,负责处理数据和视图之间的逻辑关系(逻辑层);

并行计算

  • 并行计算:一个计算机或计算系统(如分布式系统)在同一时刻执行两个货两个以上的任务;
  • 两种实现方式:时间上的并行,空间上的并行;

时间上的并行:流水线技术(极少用)

  • CPU执行一条指令的流程:取指-译码-地址生成-取操作数-执行-写回;

空间并行

  • 人多力量大,通过加硬件=资源来解决效率问题(如多核处理器);
  • 系统进行调度的单位:线程,进程;
  • 多核操作系统:将相互独立的线程和进程分配到不同核心上,以达到并行计算的目的;
  • 分布式计算、云计算:都是对并行计算的包装;

进程通信

  • 操作系统:多进程并发执行,每个进程有自己的一亩三分地(以避免对其他进程产生影响,便于系统调度);
  • 通信方式:1.基于文件;2.基于管道(点对点通信);3.基于信号/信息,信号量,套接字;

为什么有些bug不能改

  • 开发施展各种奇技淫巧来解决各种奇葩问题导致最后代码只能看不能动;
  • 用小bug隐藏大bug;

为什么程序会挂

  • 开发在设计算法时考虑不周,没有对可能遇到的异常状态做处理;
  • 操作系统有bug;

名词

面向对象

  • 面向过程:每次需求变更都需要重新定义函数;
  • 面向对象:抛弃函数,把对象作为程序的基本单元;对象:对事物的抽象描述,可用数据+能力来描述;对象有数据、能力,还可接受命令;
  • 面向对象编程:依次对不同对象发送命令;
  • 特性:1.自己的事自己做;2.面向接口编程(对象把能力通过接口公布出来,自己则成为接口的实现者);

多态

  • 多态:多种状态,运行时根据函数返回的内容不同而执行不同的逻辑;好处:屏蔽类与类的差异,当需求扩充时可保证代码稳定;

    eg.快递公司是父类,各大具体的快递公司是子类,多态即:虽然每个子类对送快递实现的具体逻辑不同,但它们都完成同一类功能;

继承

  • 继承者首先要是被继承者;被继承者(父类/基类)用一万行代码描述自己的功能特性,继承者(子类)只需额外用二十行代码声明自己独有的特性,即可拥有一万零二十行代码对应的所有功能;
  • 类:对属性和功能集合的静态描述;实例:属性真正的载体和功能的执行者;

重构

  • 重构:在保留现有功能的基础上重新梳理软件中的代码结构,让原本杂乱无章的代码重新具有可读性/结构性/可扩展性,增加软件开发的效率,优化程序的性能;重构范围可大可小,大到整个产品的各个模块,小到一个函数;
    eg.盖房子:加盖楼层需要考虑到原本房子的承重结构;

Unity-VR

  • unity引擎:看作是在openGL基础上,实现了很多特效的一堆代码集合;移动端;归根到底是对素材的编辑;可一键生成android/ios代码;
拿钱去买猫粮和狗粮嗷 ~