产品经理在实际工作中经常会遇到一些“技术黑话”,这些技术语言让非技术背景的产品经理们经常不知所云,带来了一些沟通和理解的问题,这里梳理了一些但不全的技术术语,以比较通俗的方式来解释和介绍,希望对于非技术背景的产品经理们有所帮助。
1、类、对象、抽象和实例
在技术的世界里,有一类编程语言叫面向对象编程,例如典型的面向对象语言Java。说到面向对象,不得不提的几个概念是类、对象、抽象和实例。这些技术术语会经常在工程师的讨论中出现,非技术背景的产品经理该如何理解这些概念呢?接下来具体介绍这些技术术语分别代表什么意思。
首先介绍第一个概念“抽象”。我们说某一个概念听起来非常抽象的意思是不具体的事物,对应的反义词是具象。抽象在技术术语里的意思是提炼出一个通用模板,然后基于模板做具象化的实现。例如,在现实世界中关于人的分类,会有男人、女人、老人和小孩,如果将这个具体的分类抽象出一个类别,得到的抽象结果就是人。所以,人就是一个抽象出来的分类,也就是技术术语里面的“类”。在编程语言的世界中,通过程序语言描述现实世界中的事物时,使用的就是抽象的方法,将一类事物抽象成一个类,就得出了程序世界中的一个基本模型。
有了基本模型后,可以基于抽象出来的模型(类)产生很多具体的实例,也就是基于类实例化的具体对象。例如,将“人”这个类实例化为两个对象,分别是男人和女人,也可以实例化为其他对象,例如小孩和老人,甚至可以实例化为具体的人,例如Maggie和Ryan。这一系列的过程如图所示。
从上述流程中可以看出,工程师做的工作就是根据产品需求将现实世界中的事物抽象成程序世界中的一个个类,然后根据需要实例化很多对象,不同对象间通过相互协作完成一个具体的产品功能。
非技术背景的产品经理在工作中也可以试着以这种技术思维的方式定义产品需求,先从产品角色开始抽象出具体的类,然后分别定义这些角色在整个产品流程中需要完成哪些关键动作,从而定义出具体的对象。这样既有利于明确需求和用户角色,也能培养非技术背景产品经理的技术思维。
2、工程师口中的“打印”是什么意思
在与工程师的配合中,你一定听说过“打印”这个词,通常场景是在调试产品问题或进行开发测试时。工程师口中的“打印”和我们使用打印机打印文件究竟有什么区别呢?对非技术背景的产品经理而言,听到这个既熟悉又陌生的词汇时,该如何理解呢?
首先,“打印”这个词在大多数场景下是指我们将文件或图片通过打印机从计算机世界输出到现实世界中,意味着一种结果的输出。工程师口中的“打印”一词,表示的是一种结果输出,只是这种结果并不会输出到现实世界,只是将程序运行的结果“打印”到命令控制台上。
工程师在编写程序代码时,需要不断测试程序片段运行是否正确,例如编写一个加法的程序片段,当代码编写完成后,工程师需要测试加法程序是否运行正确,所以会输入两个参数然后查看程序的运行结果,程序运行结果输出到命令控制台的过程就叫作“打印”。
工程师在调试问题程序的过程中,也会经常用到打印技术,将每一块代码的执行结果输出到控制台,用来查看具体问题出在哪个环节。因为代码的运行过程是不可见的,所以通过“打印”的方式能让代码的运行过程和结果可视化。
3、工程师口中的“写死”是什么意思
在与工程师讨论产品需求或者工程师相互讨论技术方案时,经常会听到“写死”这个术语。“写死”这个词严格来说不算一个标准的技术术语,而是工程师用来描述一种技术实现方案的说法。
例如,要设计一个下拉选择框用来切换不同的城市,这个产品需求在技术层面有两种实现方案,第一种是将城市数据放在服务器端,客户端通过请求数据接口将城市数据获取回来再显示在下拉列表中。第二种是将城市列表数据存放在客户端,客户端从本地读取城市列表并展示在下拉列表中。
第一种方式是一种相对灵活的方案,当城市数据有变化时,只需要调整服务端的数据内容即可,客户端不用做任何修改,但需要开发一个专门的数据接口获取这部分数据。第二种方式就是工程师所说的“写死”,将数据集写死在本地,这样可以省去数据接口的开发,也能快速实现想要的效果。
这两种不同的实现方式在很多产品设计环节中都会体现,例如一些客户端的文案或者图片会经常变化,这时就不太适合将需要变化的数据“写死”在本地,合理的方案是将变化的数据存储在服务端,客户端通过数据接口灵活地获取这部分数据。
当然,也不是所有的数据都不适合“写死”在本地,例如性别数据,无非就是男和女,不必专门为了它开发一个数据接口,我们得根据具体需求和使用场景判断哪些数据应该写死。
4、架构和框架
架构和框架是工程师经常提及的两个技术概念,另外,在技术职能中还有架构师这一岗位。对非技术背景的产品经理而言,该如何理解和区分这两个技术概念呢?通过一个例子就可以非常直观地理解二者。在修建房屋时,会有一个总设计师负责设计整体蓝图和规划,这个工作可以理解为是架构师的工作,而房屋设计结构和规划本身是房屋的架构。
架构工作完成后就进入具体的施工环节,施工时可以选择从头开始一砖一瓦的加,也可以使用现有的房屋框架,基于成熟的房屋框架一层一层累加,后期只需要做整合和装修工作即可使用现成的框架,既能降低施工难度,也能提高施工效率。
在技术领域,架构这个词是对系统的结构设计和规划,通常由经验比较丰富的架构师或者高级工程师完成,架构的好坏直接决定了后期系统的稳定性和可扩展性。框架则是指利用现有的成熟技术框架简化开发过程,例如针对企业级应用的开发框架J2EE,就提供了很多现成的组件来降低开发的复杂度,如今很多系统的开发都会使用一些比较成熟的开发框架替代纯自主开发,这样既能保证系统质量,也能提高开发效率。
5、控件和组件
任何一个网页或者App产品都是由大量的输入框、按钮、文本展示框构成的,产品中的这些最小界面元素组成单元就叫作控件。一个按钮是一个控件,一个输入框也是一个控件。如图所示为几个基本控件(输入框、文本展示框和按钮)。
组件是一种功能更全面的升级版控件,或者可以把组件理解成多个控件的组合。例如,Android和iOS开发中经常使用的Tab组件,如图所示。
大部分产品都设计为底部有几个模块,点击不同的底部按钮可以在不同的模块之间切换,实现展示和切换的就是Tab组件,它包含了页面容器展示、按钮等一系列功能,将这些细粒度的控件组合到一起来完成复杂功能,这就是组件。
6、进程与线程
工作中经常会听到工程师讨论进程和线程。例如,涉及一些复杂功能的技术实现方案时,工程师会说现在已经同时开了几个线程在处理。进程和线程究竟是什么?它们之间有什么关系呢?本节主要介绍进程和线程的概念。
当我们点击手机屏幕上的一个App按钮(启动一个产品)时,系统会为这个产品的运行分配系统资源(例如CPU和存储空间),分配好资源后,产品会在这个资源区域运行应用程序。这里所说的运行应用程序就是进程,也可以理解为每一个正在运行的App都是一个进程。
例如,我们在手机上使用微信或者微博,就有分别属于微信和微博的系统进程。一旦关闭应用程序或因为系统资源紧张而自动关闭在后台运行的应用程序,进程就会被终止,同时对应的进程所占用的系统资源也会被释放。
相比于进程,线程是一个更小的执行单元,一个运行中的应用程序是一个进程,一个进程中可以存在多个线程,每一个子任务都可以理解为是运行中的一个线程。我们以微博为例,运行中的微博是一个系统进程,可以上传照片发布微博,也可以上传视频发布微博。
用户上传照片的任务在一个独立的线程中运行,上传视频的任务也在一个独立的线程中运行,并且这两个任务可以同时运行互不影响,这种方式叫异步线程处理,即可以并行互不干扰完成各自的子任务。当然,还有一种线程处理方式叫同步线程,即子任务是按照一定的顺序完成的。
产品之所以能同时完成很多功能,就是因为线程的存在,尤其是涉及需要网络请求的一些功能时,例如用户在微信中发布朋友圈后有可能立马去刷新朋友圈,这时可能刚刚发布的内容还没有上传成功,所以在技术实现时会用两个线程分别处理发布和获取新信息的子任务。这样做既能保证用户体验,也能保证系统资源被合理地分配和利用。
7、什么是“脚本”
“脚本”这个词在工程师口中出现的频率比较高。当需要对数据库进行批量处理时,工程师会说“跑一个脚本统一处理一下”;当需要查询某一数据报表时,工程师会说“用一个脚本批量查询”。
脚本也是一种被计算机执行的程序,为什么叫脚本呢?可以把脚本理解成拍戏用的剧本,剧本里会按照角色及对白把要拍的戏清晰地列出来,导演和演员会严格按照剧本表演。脚本就是一种面向计算机的剧本,是一个可被计算机执行的文件,文件里是一系列计算机指令,这些指令会按照顺序被计算机解析并执行。
例如需要对数据库中所有用户数据添加一个数据项,一个一个添加显然是不可能的,通过一个批量操作一次性地完成是效率最高的做法,此时就会用到脚本。通过脚本写一个新增数据项的命令,然后执行脚本,所有的数据就会被批量执行同样的操作。图14-4所示是在Mac电脑环境下使用命令行执行的一个查询某一文件夹下所有文件的命令。
在第3行执行了一个名为“ls”的命令,这个命令的作用是列出当前文件夹下的所有文件或子文件夹的名称,第4行到第5行是当前文件夹下所有文件或子文件夹的名称。如果把“ls”命令单独写成一个文件,这个包含一条指令的文件就是一个脚本文件。实际应用中,脚本文件通常会由多个指令组合而成,经过计算机的解析和执行来完成一个复杂的处理任务。
8、同步处理和异步处理
同步和异步是开发技术中的两个概念,计算机通过解析和运行程序完成相应的操作。在程序执行过程中会涉及同时处理多个任务或者同一时间只处理一个任务的情况。在前面的章节中我们介绍过什么是进程和线程,一个进程中包含多个执行任务的线程。
以用户登录为例,登录任务是在一个登录线程中执行的,登录任务执行过程中除了验证用户名和密码是否正确外,还需要处理其他子任务,例如从服务器获取用户信息,更新本地缓存信息等。这些子任务通常会在新开辟的子线程里执行。执行登录的线程可以称为主线程,执行获取用户信息的线程称为子线程。
在一个登录操作过程中分别执行两个任务,这个过程就叫作异步处理。异步处理不会造成线程阻塞,相当于各自处理各自的任务。如果所有的任务都在一个线程中处理,那就会出现资源占用过多和响应时间过长的情况,例如我们在使用一些安卓APP时偶尔会出现应用程序闪退的情况,这有可能是因为出现了线程死锁。
同步处理比较好理解,就是同一时间只执行一个简单任务,任务处理完后再执行第二个任务,同步处理适用于一些顺序执行的任务,例如流水线处理就是典型的同步处理,流水线上的一个环节处理完成后再处理下一个环节的任务。