You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
“Programming without an overall architecture or design in mind is like exploring a cave with only a flashlight: You don’t know where you’ve been, you don’t know where you’re going, and you don’t know quite where you are.”
Danny Thorpe(Danny Thorpe was an American programmer noted mainly for his work on Delphi)
我们经常在业务架构或者服务端上见到分层架构模式,分层架构将业务拆分成水平向的几层,层与层之间有逻辑依赖和信息交互,每一层都有自己独立的角色或功能,比如在上面分层架构图示例中,最上层是展现层,展现层和服务层之间通过通信层来沟通交流,最底层是数据层。分层架构突出了软件架构的一个核心思想,关注点分离(separation of concerns (SoC))。
最后、原理、思路、方法论会让人一通百通,当我们把原理和思路讲清楚后,我们就可以在分享的最后部分,对其进行升华,形成一套方法论,计算机科学中很多架构模式、设计模式都是相通的,就拿操作系统进程调度来说,有不同的调度策略,先来先服务调度算法、最高优先级调度算法、最短作业优先调度算法、高响应比优先算法、时间片轮转调度算法、多级反馈队列(Multilevel Feedback Queue),当时我在看操作系统进程调度这部分的时候就在思考,进程的调度策略和我们接需求开发其实是类似的,最简单的模型就是我们按照先来先服务的算法,一段时间后,有产品说这是 P0 优先级的项目,其他项目先暂停,按照项目优先级来定容,这个时候我们可能会和产品 argue,虽然目前这个需求优先级不高,但是开发周期比较短,短时间上线是否可以先拿到一些收益?这就是最短作业调度算法,当有研发团队服务于多个产品团队时候,是否需要采用高响应比优先算法呢?谁等待时间长,优先服务,因为不同的产品团队也比较难排出一个准确的需求优先级。当我们同时开发多个需求的时候,就可以采用时间片轮转调度算法,这周前三天把 A 需求开发完成,后两天开发 B 需求。当然多级反馈队列是最合理的,首先将需求划分成不同的优先级,按照优先级来进行调度,需求结束后 PMO 组织产研进行价值回溯,对业务收益大的项目提升优先级,收益不那么明显的项目降低优先级。这儿扯得有点远了,收一下,其实想表达核心点就是我们在技术分享结束部分,对我们的技术项目做一些升华和拓展,方法论一通百通,解决 A 问题的思路是否可以用来解决 B 问题?
问题 1:分享之前,问大家一个问题,我们为什么要做技术分享?
技术分享和个人成长的关系
了解分享的规模和观众画像
不同场合的技术分享,对分享主题和分享时长都是有要求的,比如 QCon 就要求分享的主题不能在其他会议上分享过。FDCon 就有不同会场,那 FDCon 2018 来说,就有 H5 小程序专场、全端与全栈专场、前端基础设施专场等。所以当我们被邀作为嘉宾参会时,我们所选的主题也就需要所涉会场之一相关。一般的技术大会,单场分享时间一般需控制在 40 分钟,分享后会有大约 10 分钟的观众提问时间。JSConf(Conferences for the JavaScript Community)在分享间隙有个 lighting talk 的环节,在常规分享间隙插入 5 分钟的即兴演讲,如果你想在下一年作为演讲嘉宾登上 JSConf,那么 lighting talk 是个很好展示自己的机会
问题2:我们为什么需要事先了解一场分享时长?
是的,分享内容长度是和分享时长息息相关的,普通人演讲的语速大概在 150 字 ~ 180 字 / 分钟,所以一场 40 分钟的演讲,演讲稿字数大约在 6000 字 ~ 7200 字,这样我们在准备演讲稿的时候,也就知道大概准备多少内容了。
问题3:下一个问题,为什么我们需要去了解分享的规模(单场参与人数)和受众群体(观众画像)?
一个 1000 人的会场和一个 100 人的会场,所需要的控场能力不全一样,1000 人的会场,在灯光的照射下,我们几乎看不清下面的观众,我们可能就需要减少一些与观众的互动,不然选择观众、传递话筒等都会耗费比较长的时间。而 100 人的会场,几乎可以看清每个人,可以加强一些与观众互动的环节
受众群体也决定了我们分享的侧重点,举例说明下,比如电商分享,我们就不应该去分享纯前端相关的技术,而应该分享电商业务、与电商相关的技术及架构设计,比如营销系统的设计,推荐算法在电商业务中的运用等,尽量少的涉及源码分析,如果一定需要源码来说明的话,我们也尽可能使用伪代码。又比如电商消费侧前端的技术分享,面向的受众都是前端同学,大家更关心的是前端技术如何赋能业务,想了解底层原理,在做前端技术分享时,就可以侧重系统设计及架构,源码分析等
挑选合适的分享主题
问题4:我们如何选择分享主题?
选择小的主题,在选择主题上,除了需要和会议会场相关,比如前端技术分享,那至少应该和前端技术相关。我们应该选择一些小的主题,大的主题容易不聚焦,同时使得我们的分享变得泛泛而谈,缺乏深意。举个例子:
Bad Case:性能优化在前端项目的应用
Good Case:我们如何在商超项目进行图片性能优化
下面一个主题比上面一个主题更加具体,也更能引起观众的兴趣和共鸣
选择自己参与或主导的技术项目,我们在做技术建设,一定遇到过很多问题,踩过很多坑,通过对过往遇到的问题的总结,不仅能够加深自己对问题的思考和理解,同时也会帮助到别人
准备分享稿
分享模型
其实技术分享都是有规律可循的,我将技术分享归为两种模型:复杂模型和简单模型
复杂模型:[发现问题 - 背景梳理] - [架构总览 - 方案对比 - 核心模块分析] - 展望未来
简单模型:发现问题 - 方案陈诉 - 总结陈词
选择不同的模型,主要根据分享时长来决定,比如 20 分钟的一个分享,那么我们就可以使用简单模型,而 40 分钟的技术分享,相对时间比较充裕,那我们就可以选择复杂模型。不论是哪种模型,都遵循了发现问题 -> 解决问题的思路,其实这也是为了将观众带入第一视角,使观众能够沉浸其中
这儿将以我之前的一次技术分享来分析复杂模型的应用。
一种自动化生成骨架屏的方案,这是我在 FDCon2018 的分享
发现问题
背景梳理
架构总览
方案对比
展望未来
技术分享合理使用图表
问题5:再问大家一个问题,合理使用图表对我们的技术分享有什么帮助?
问题6:下一个问题,既然图表在技术分享中如此重要,那么我们怎样去合理使用图表呢?
首先我们应该知道有哪些架构图类型可用,比如分层架构图、时序图、流程图等,其次我们应该了解目前有哪些软件架构模式,最后根据我们架构模式选择最合适的架构图(这儿的架构图是广义的架构图,不单指分层架构图)
架构图的类型(不止下面三种类型,这儿只列举了常见的三种):
分层架构图
时序图
流程图
关于如何画好架构图、时序图、流程图,推荐大家阅读以下几篇文章:
如何画好架构图_架构_Hockor_InfoQ写作社区
如何画好一张架构图?(内含知识图谱) - 掘金
快速学习时序图:时序图简介、画法及实例 | 人人都是产品经理
如何画好流程图_前端_Hockor_InfoQ写作社区
常见的软件架构模式
分层架构(Layered (N-tier) architecture)
我们经常在业务架构或者服务端上见到分层架构模式,分层架构将业务拆分成水平向的几层,层与层之间有逻辑依赖和信息交互,每一层都有自己独立的角色或功能,比如在上面分层架构图示例中,最上层是展现层,展现层和服务层之间通过通信层来沟通交流,最底层是数据层。分层架构突出了软件架构的一个核心思想,关注点分离(separation of concerns (SoC))。
问题7:又一个问题,你还知道哪些和前端相关的分层架构的系统?
客户端-服务端架构(Client-server architecture)
这个应该是我们最熟悉不过的一种架构模式了,目前我们做的浏览器应用、客户端应用都属于该模式(去中心化应用 DAPP 不属于该架构模式),客户端-服务端架构主要包含两个组成部分:服务发起者和服务提供者。
微内核架构(Microkernel architecture)
微内核架构通常也被称作插件化架构模式,也是前端领域比较常见的一种架构模式了。在该架构模式中主要有两个组件: core system 和 plug-in modules。这也就支持了第三方去开发一些插件,在前端领域比如 webpack、Koa 都属于微内核架构。
Core system 包含了应用能够运行起来的最小逻辑部分,通过 Plug-in 模块来扩展 Core system,从而提供更多的功能。
问题8:在我们熟悉的开源项目,或者我们目前的技术建设中,你还知道哪些微内核架构?
软件工程还有其他的一些架构模型,由于和前端领域关系比较小,还有分享时间限制,这儿就不赘述了
有兴趣大家可以看看 Software architecture diagramming and patterns 这篇文章,总结得很好
讲解技术方案的要点
首先,把复杂的问题讲解的很简单也很清楚,关于怎么将复杂问题简单化,其实有方法论可循的,开篇一张架构图固然是好,但也只能让观众有个全局感知,对各个模块的理解还是不够深入,这个时候我们就可以举一个具体的 case,来阐述我们的技术方案,还是拿上面自动化生成骨架屏的分享为例,在说完整个原理之后,就会拆解到不同的模块,比如图片模块或者文本模块,并且通过关键代码来解释不同模块的实现。另外一个将复杂问题简单化的方法就是,我们尽量通过最小例子来解释,抛开一切和主流程不相关的分支。其实这个思想也类似于微内核架构的思想,比如我们要阐述 babel 的原理,那么我们只需说清楚 babel 处理代码的三个阶段:Parser -> Transformer -> Generator 就行,关于 babel plugin、presets 在解释明白核心原理上就不那么重要了
其次、有各种各样的推导和方案的比较,让观众知其然知其所以然,相信我们在做技术方案的时候,都做技术方案的选型(比较),以及从发现问题到解决问题该技术方案是推演出来的,这可能比我们直接陈述技术方案要更能打动观众,也能带领观众进入你的第一视角,重演一次发现问题到解决问题的整个过程
最后、原理、思路、方法论会让人一通百通,当我们把原理和思路讲清楚后,我们就可以在分享的最后部分,对其进行升华,形成一套方法论,计算机科学中很多架构模式、设计模式都是相通的,就拿操作系统进程调度来说,有不同的调度策略,先来先服务调度算法、最高优先级调度算法、最短作业优先调度算法、高响应比优先算法、时间片轮转调度算法、多级反馈队列(Multilevel Feedback Queue),当时我在看操作系统进程调度这部分的时候就在思考,进程的调度策略和我们接需求开发其实是类似的,最简单的模型就是我们按照先来先服务的算法,一段时间后,有产品说这是 P0 优先级的项目,其他项目先暂停,按照项目优先级来定容,这个时候我们可能会和产品 argue,虽然目前这个需求优先级不高,但是开发周期比较短,短时间上线是否可以先拿到一些收益?这就是最短作业调度算法,当有研发团队服务于多个产品团队时候,是否需要采用高响应比优先算法呢?谁等待时间长,优先服务,因为不同的产品团队也比较难排出一个准确的需求优先级。当我们同时开发多个需求的时候,就可以采用时间片轮转调度算法,这周前三天把 A 需求开发完成,后两天开发 B 需求。当然多级反馈队列是最合理的,首先将需求划分成不同的优先级,按照优先级来进行调度,需求结束后 PMO 组织产研进行价值回溯,对业务收益大的项目提升优先级,收益不那么明显的项目降低优先级。这儿扯得有点远了,收一下,其实想表达核心点就是我们在技术分享结束部分,对我们的技术项目做一些升华和拓展,方法论一通百通,解决 A 问题的思路是否可以用来解决 B 问题?
观众问题准备及话术
一般技术分享都会有 QA 环节,针对我们的分享内容,我们从观众的角度出发,或者从一个对该分享的技术方案小白的角度出发,他们会问些什么问题,整理一个问题列表(不用展示给观众),针对这些问题,我们思考一下怎么回答,并且事先准备好问题答案,这样在分享后的 QA 环节就可以避免因为紧张而回答不上来
如果观众问到的问题,是我们之前没有想到过,并且现场也没有答案时,我们需要准备一个话术,比如:“这个问题很有深度,由于 QA 环节时间有限,很难通过几句话解释清楚,会后我们单独讨论一下”
其他有助于提升分享质量的点
排练和预演
确定分享中各个模块时间分配,找个安静的地方,排练,并进行录音,通常现场更不可控,有突发的提问,紧张时语速会过快,所以现场可以放一个计数器,准确控制分享进度。播放录音,看语速是否过快,发音是否准确,也看看分享中是否有节奏,而不是平铺直叙的背诵文章,预演也是为了最终脱稿
分享过程中的注意事项
分享中的 checklist:
分享后
絮叨许久,感谢大家,这是我在做技术分享后的一些经验之谈,希望对大家有所帮助,最重要的一点,适合自己的才是有用的
The text was updated successfully, but these errors were encountered: