写在前面
非技术出身的产品经理和初创公司的CXO们都需要懂点技术知识,这个应该已经是大家的共识。若是不懂,下一次被坑/被忽悠的就是你了。那到底需要懂些什么,又要懂到何种地步呢?我们从这么几点去分析:
1)产品和工程师撕的是什么
2)技术同学看到产品功能时想的是?
3)软件开发的流程是如何的
4)一些重要技术思想和方案说明
产品和工程师撕的是什么
在实际工作中,除了 APP主题随手机壳颜色自适应 这种“高级”需求爆发武力战斗外,大部分产品经理与研发哥哥们还是比较和谐的。当然以下几种真实工作场景大家应该都不会陌生:
这个功能这么简单,1-2天你应该可以搞定吧!
别人的可以,到我们这就没法做了?
没有这个接口我怎么做啊?你找XX要接口去!
评审时没说这个需求啊,也没有写到PRD里!
数据库不支持,根本就没有这个字段,做不了!
今天上不了线了,刚才部署失败了
靠,又Crash/空指针/异常/奔溃了...
要想避免这些问题,让项目顺利上线,我们需要从PM和RD的工作习惯、看待功能的角度、心中的优先级标准来看出现这些矛盾的原因是什么。也就是产品思维和技术思维的差异化。
技术同学看到产品功能时想的是?
拿车来做一个不太准确但较为形象的比喻(可能跟汽车专业名词有出入,此处仅为类比方便大家理解)。当开发工程师使用技术思维审视一辆车时,他们的内心活动是:
车应该是分为几个大业务单元的,不同的单元模块由不同的人开发。如底盘及悬挂系统、动力系统、传动系统、刹车系统等,这叫做软件架构。
子系统应该封装好,对外提供具体的能力即可:油门踏板不需要了解发动力内部怎么运转,只要保证踏下时有动力输出;这叫做模块化和封装。
某个零配件损坏要更换时,不需要把车大拆一番,而是拧下几个螺丝就能换好。我们这叫做低耦合;
底盘系统重新研发太耗时间,有没有现成的直接拿来就能用的呢?这叫做第三方框架,免费的就就叫开源。
前大灯、尾灯、车内音响、车窗升降都需要电力,能不能整合成一个公共的单元来控制呢,比如就叫它电子系统。这叫做抽离和开放接口;
能不能在这个车的基础上顺利改造出SUV或MPV呢?这叫做扩展性;
大众汽车MQB平台架构
所以技术思维其实一种工程化的思维,也就是流程和逻辑。他们看待产品功能时更多的是从实现的角度衡量。比如:
这个功能是前端还是后端开发,还是一起开发;
用户操作这个功能时,需要往数据库同步记录什么数据;
这个功能是自己重新开发还是在第三方框架基础上二次开发;
这个功能在没网的情况下如何开发才能保证不出错等等。
产品经理需要了解到什么程度
理解上面描述的工程师的思考方式后,便更好的理解产品经理的技术能力具备到的程度了:
产品经理需要懂得技术术语并保证大家沟通时信息对称而不是自说自话,南辕北辙;
听清工程师说的意思后,才能更好地换位理解工程师说法背后原因和推导思路;
需要在了解技术思路后完成对技术方案和功能体验之间的优先级判断和取舍;
产品经理不需要动手写代码和读懂代码,否者就是缘木求鱼,会进入到误区了;
如何更容易的理解工程师的分工?
我们现在就对产品对一次技术分解(同上,非专业分解,仅为类比方便大家理解)。
首先,产品或者软件都可以分为展示、业务、数据、硬件这么几层:
---------- 一、展示层 ----------
即产品外在”衣服”,包括颜色、布局、弹窗、交互、表单等。
这部分是由前端工程师(FE)开发的。
根据平台,又可以分Web(PC端网页)、H5(移动端网页)、APP前端。他们需要的能力便是将UI设计师的设计稿做成前端代码,通俗的说法叫做切图。
---------- 二、业务层 ----------
即产品的功能逻辑实现,包括功能的代码开发、数据传输、接收和存储。
这部分是由后端工程师(RD)开发的。
他们主要做两件事,一是具体业务的代码实现、二是部分数据库的设计和数据读写传输。
根据语言的不同,会分为Java、PHP、Ruby、Javascript、Python等,也就是常说的技术栈不同。那么精通很多语言和能力的也就是牛逼的全栈工程师了。
---------- 三、数据层 ----------
即业务数据的存储、传输和管理等。
数据是基于数据库的,根据数据存储的方法(数据之间的关联关系)不同,分为关系型数据库(MySQL)和非关系型数据库(NoSQL)。
对于数据库方面的工程师,又可以分为两种。
一是数据库开发工程师(Database Developer),主要职责是设计和开发数据库管理系统和数据库应用软件系统,侧重于软件研发,在公司中高级后端工程师可以同步做这部分工作;
二是我们常说的数据库管理员(Database Administrator,简称DBA),主要职责是运维和管理数据库管理系统,侧重于运维管理。
---------- 四、服务器层 ----------
代码和数据库都需要运行在服务器上的,更确切的是服务器的操作系统环境上,应用服务器和数据库安装在上面。
常见的操作系统便是著名的 Windows Server 和 Unix 及 Linux。
这部分也有专门的工程师,叫做运维工程师,主要负责服务器、操作系统、网络环境的管理和优化,如我们常说的服务器集群管理。
说到这里不就能不提著名的网站架构方案LAMP了。从流量上来说,70%以上的访问流量都是LAMP来提供的:LAMP指的Linux(操作系统)、Apache(Web应用服务器)、MySQL(有时也指MariaDB,数据库软件)和PHP(有时也是指Perl或Python)。正好对应着上面讲的那四层。
小知识-几大著名网站的架构
软件开发的通用流程和专有名词
了解了这几层的逻辑关系和职能分工后,我们就能更容易理解工程师们的工作流程是如何了,专业术语也都是在流程场景下产生的。
通常,软件开发流程有这么几大步:
---------- 1、了解业务需求 ----------
完全掌握了PM们的业务实现要求,研发同学们才能动手开工,即项目中的最重要一环:需求PRD评审。
研发同学带着工程思维去解构PM经过多次调研、分析、返工的文档中描述的功能,想着这个该如何实现、开发的前后顺序是什么、为什么工期又这么紧张...两种思维方式多人面前开始了第一次的大规模交锋。(后续中我们会讲到PM如何做好各类评审)。
---------- 2、代码编写工具和环境 ----------
同产品经理需要用 Axure/Sketch/Xmind 等一样,工程师编写代码肯定得有得心应手的吃饭家伙-编码工具。
这里要了解一个名词 IDE 。即集成开发环境(IDE,Integrated Development Environment),它是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的利器,你可以理解成是开发软件的一套操作系统,上面有开发用的各种工具集合。
另一个叫做 SDK ,英文全称Software Development Kit,中文意思就是软件开发包。这个开发包通常都会包含API函数库、帮助文档、使用手册、辅助工具等资源。意思就是,SDK事实上是开发所需资源的一个集合。
在 Android 平台上开发Android App,我们必须从官网下载Android SDK,然后利用这套 SDK 提供的 API 来调用系统能力。开发 iOS 项目我们一般都会用到Xcode,那么 SDK 与 XCode 又是什么关系呢?
两者的关系就像操作系统和软件的关系,操作系统给应用程序提供平台,你用软件实现你想用的功能。Xcode 给 SDK 提供平台,你用 SDK 来编程,Xcode只是一个 IDE,用于开发的一个工具而已,你也可以不用 Xcode 来开发。只是它是苹果官方比较提倡的,而且相对来说最大众,最好用而已。而SDK才是开发的灵魂,也就是说你所正真要用的东西。
---------- 3、加班熬夜地编写不止 ----------
代码编写其实是一个”盖房子”的过程。
首先要有图纸(架构方案),然后分拆业务模块由不同的工程师开发,以加快速度,不同的模块之间需要互相传输交换数据。最后大家汇总在一起提交给测试。
模块之间的是用 API 通讯的。API(Application Programming Interface 的简写),中文称为「应用程序编程接口」。
API 通常代表了一个系统的某一项能力。你可以把它看成是一扇门、窗或杠杆,程序和程序之间的沟通协作就是由API定义的。SDK中一般封装了很多API,这些API就对应着系统或平台的能力。
为了更早的下班,减少通宵频次,单个工程师会在效率上想更多的办法,比如能不能直接复用之前的代码或者找一下别人已经写好的呢。也就是有没有现成的第三方框架可直接使用。
软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。
这么几种比较流行的前端框架大家应该听说过:
Vue.js:Vue的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。在国内使用的公司还是蛮多的,像百度外卖、饿了么、头条等等:http://cn.vuejs.org/
React:起源于Facebook的内部项目,是一个用于构建用户界面的Javascript库:https://www.reactjscn.com
Bootstrap:美国Twitter公司的设计师MarkOtto和JacobThornton合作基于HTML、CSS、Javascript开发的简洁、直观、强悍的前端开发框架,使得Web开发更加快捷:http://www.bootcss.com
微信小程序
微信小程序为了方便大家开发,也提供了 SDK 和 框架 。
微信的SDK就是 微信开发者工具,集成了公众号网页调试和小程序调试两种开发模式。然后微信提供了自己的视图层描述语言 WXML 和 WXSS ,以及基于 Javascript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑。
框架提供丰富的微信原生 API,可以方便的调起微信提供的能力,如获取用户信息,本地存储,支付功能等。更多信息大家可以移步微信公共平台/小程序开发文档。
最后,前端和后端肯定也是需要传输数据的。这里通常大家会用 JSON ,是一种轻量级的数据交换格式。易于人阅读和编写。JSON最常用的格式是某个数据串的键和值匹对,如:{"firstName":"Json"},这表示在这条数据库firstName=Json。
---------- 4、代码的合并和管理 ----------
一个项目中大部分是由多个工程师协作开发的,他们写的代码最后会合并在一起提交测试。如何保证整个开发过程中代码的上传、合并和管理是顺利的呢,这里要讲一个持续(Continuous)的理念。
如果说等到所有东西都完成了才向下个环节交付,导致所有的问题只能再最后才爆发出来,解决成本巨大甚至无法解决。
而所谓的持续,就是说每完成一个完整的部分,就向下个环节交付,发现问题可以马上调整,使得问题不会放大到其他部分和后面的环节。即工程师们常说的 持续集成 (Continuousintegration,简称CI)和持续交付(ContinuousDelivery,简称CD)。
通常大家说的集成是指软件个人研发的部分向软件整体部分交付,以便尽早发现个人开发部分的问题;部署是代码尽快向可运行的开发/测试节交付,以便尽早测试;交付是指研发尽快向用户上线交付。
这种做法的核心思想在于:一小块一小块的做,并且加快交付的速度和频率,使得交付物尽早在下个环节得到验证,早发现问题早返工。
另外集成的过程也是多个工程师一起提交代码,也就是代码合并的过程。每个工程师自己编写的这部分叫做分支,在不同的时间点代码是不同的,也就是版本。合并后的代码集合叫做主干,也就是分支需要往主干上提交汇总代码。
一个项目可能有非常多的分支,每个分支有不同的版本,这里便用到了代码的分布式管理,也就是大家说的Git,读音为/gɪt/。是一个开源的分布式版本控制系统,强调个体,任意两个开发者之间可以很容易的解决冲突,支持离线工作,比较灵活。
还有不得不提的GitHub,它是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名GitHub。其中不乏知名开源项目RubyonRails、jQuery、Python等。
GitHub牛逼的地方在于商业模式很好的平衡了开源和付费。如果你公开托管你的代码,你可以一直免费地使用GitHub。如果你想使用私有存储库或专有的代码托管服务,你需要付费。所以在GitHub,工程师可以十分轻易地找到海量的开源代码。
---------- 5、提交测试和上线 ----------
开发完成后也就要提交给QA进行测试了,也就开始了改BUG的光辉历程,然后部署上线给用户使用。产品经理开始请辛苦了一段时间的项目组大哥大姐吃饭,并在饭后提出了新项目要开始了,可能有几个需求要推倒重来...
---------- 6、还有更多你要懂 ----------
了解了工程师的工作流程和专有名词只能保证你和他们的话术体系在同一个水平线上(还有个前提是你要认真搜集了解这些流程和名词)。要想达到技术方案和功能体验之间的优先级判断和取舍,还是有很多技术点的背后原理需要大家研究,重要的有:
小程序的框架和API能力
APP开发中Native和H5的优劣势
Android和iOS运行和后台机制的区别
Push通知的推送和APP唤醒机制
缓存Cache/COOKIE/Session的区别和应用
第三方登录OAuth的原理和注意事项
还有很多...
篇幅的关系,关于第5和6部分,即测试、部署和更多技术原理这部分我们留在后面的环节单独讲。
本篇总结
啰啰嗦嗦讲这么多,现在稍微总结一下:
每个职能都是有自己的工作流程和工作方法的;
这些流程和方法代表了大家用不同的思维方式看待产品;
我们常说的换位思考,也就是站在对方的立场用对方的思维方式看待问题;
了解对方更多,才能在项目管理中更好地沟通说服和协调资源;
产品经理需要不断积累储备自己对技术方案原理的总结;