一图胜千言。
引子
在 “学习系统方法论:开篇” 一文中,简要介绍了系统方法论的基本轮廓。 俗话说:学以致用。 先用系统方法论来尝试下管理自己的软件开发活动。
首先给一张之前总结过的软件开发全景的思维导图:
这张思维导图的优点在于:基本囊括了软件开发中的绝大部分重要活动,无论是宏观还是微观,一览无余。 当然,这张图也有不足:
- 信息量太大,不容易一下子消化;
- 没有体现这些活动是怎么完成的,无法获得关于这个系统里的内部状态的流转。
本文将以这张导图为基础,以系统方法论为指导,来加以完善。
系统分析
如果将软件开发活动管理作为一个系统来看待,那么,其功能和形式分别是什么呢 ?
功能
系统功能通常可以通过“输入-输出” 模型来审视。软件开发活动的输入,通常是问题、优化、需求、项目、进度同步等,输出通常是软件增强、及时答复等;因此,软件开发活动管理的功能是,准确、高效地将问题、优化、需求、项目、进度同步转化等转换为可以解决问题和帮助他人的软件增强、及时答复、文档分享、信息同步等。
这个整体功能是通过大量子功能的组合来完成的,这些子功能包括:需求理解、沟通与共识、项目支持、开发实现、偿还技术债务、运维与护航、放松小憩、总结与写作等。子功能又可以分解为更细粒度的微功能。比如开发实现,可以分解为:详细设计、接口设计、阅读代码、代码实现、单测编写、CodeReview、自测、QA 与预发测试、部署上线。
分解的策略是:将每个子功能分解到在自己能力范围内的微功能为止。如果分解的功能感觉不太有把握,那就继续分解。绝大多数事情,大抵都能分解为:吃饭、睡觉、走路、打电话、看、听、想、动手等基本动作。
形式
该系统的形式是怎样的呢 ? 有哪些元素 ? 元素之间的形式关系是怎样的 ?
首先,找到这个系统里的元素,即操作数。 原始操作数是问题、优化、需求、项目、进度同步, 而要搞定这些,需要通过沟通先转译成具有优先级的目标集和任务集。 而要执行这些目标与任务,则要涉及到协调相关人员,要恰当分配自己的时间、精力、体力和智力、资源,往往还需要工具的辅助。
这样,就析取出了该系统里的若干主要元素: 优先级、目标、任务、序列、人员、时间、精力、体力和智力、资源、工具。通过恰当地分配和组合这些元素,从而能够执行各种子功能,完成目标和任务。
分析形式时,可以在适当的层次上思考问题。比如,在涉及软件系统相关时,可以简单地概括为系统逻辑; 而在”排查和线上问题“的子功能中,系统逻辑将会细化为代码序列。因为只有细化到代码序列,才能理解系统逻辑的正确与否。
值得注意的是,通过分析每个子功能的实现,还可以析取出更多的形式元素。比如需求评审,形式元素有产品人员、技术人员、会议与 PRD ;比如 开发时,形式元素有技术人员、机器、工具、代码序列。
分析汇总可得,如下形式元素图:
子系统
系统是具有层次性的。可以将整个系统划分为三个主要子系统:规划子系统、调度子系统和执行子系统。
- 规划子系统:主要是将输入转译成具有优先级的目标和任务集合,形式是目标、任务、优先级及策略。
- 调度子系统,主要是高效调度优先级任务、现有人力和资源,比如时间、精力、体力和智力、资源、工具等。
- 执行子系统,主要是根据调度子系统分配的任务、人力和资源,完成指定任务,输出答复、软件、文档、信息等给外部。
系统综合
综上,可画出软件开发活动管理系统的总体框图。如此,就能更清晰地理解整个软件开发活动的内部流转和实现。
值得提及的是,该系统略作改造,亦可适用于其它职业工种。
效率准则
有了软件开发活动的全景图和管理系统图,就有了工作的基础。接下来,可以讨论一些提升效率的事情。
优先级策略
面对波涛汹涌的需求、项目、问题、事务等,面对各种冲突的争先恐后的事项,如何能够镇定自若、从容不迫地安排好各种事项呢 ? 有哪些可以作为事件的优先级策略呢 ?
最核心的优先级策略是:始终聚焦”关键事项“。 哪些事情可以作为关键事项呢 ?
- 愿景追溯法:重大目标和关键事项的根源往往来自于愿景; 为什么而存在,延伸向何方。比如,感受理性与美,科学、诗歌与艺术的熏陶。
- 影响判断法: 完成该事项会产生非常积极重要的影响,积蓄优势,串联重要目标,产生有益成果;比如,提升核心竞争力,生活更稳定。
- 目标贴近法:在逻辑上与最重要的近期目标紧密关联,完成该事项可以推进重要目标的重大进展;比如,增强健康和力量,瘦身等。
- 形势分析法。 环境和形势变化亦是关键事项的一个风向标。如何更好地应对环境变化,是一个重要考虑点;比如,国家政策对某行业的倾斜,行业的选择。
- 反向推断法: 如果被现实中的某个紧急事情打击得猝不及防,可以反向思考,究竟是什么没有做好导致了困窘的境地;比如,故障或意外。
关键事项不一定紧急事项。紧急事项,从某种程度上看,是关键事项有遗漏,导致不能有效应对现实变化产生的结果。可以从紧急事项中推断遗落的关键事项。
此外,要更好地判断关键事项,往往要站在更高层次的视角看问题。如果站在较低层次的视角,很容易出现“自己以为是关键事项,实际上对整体的影响不大”的误判。
沟通效率准则
沟通,是谋杀时间和低效率的诟病因素之一。 其实,低效率的沟通,往往是一些不自觉的不良习惯导致的。只要尽可能遵循一些基本的准则,就可以逐渐提升沟通的效率。
沟通效率的基本准则有:
- 优先考虑使用点对点模式,使用异步消息沟通。
- 若三言两语说不清楚,宜改用语音沟通。
- 若沟通有较大分歧,且优先级较高,宜面聊沟通。
- 方案设计和确认时,先找一两位有丰富经验的人提建议。
- 讨论性会议,尽量控制在 3-5 人的范围内。
- 参会人数达 7 人以上时,忌 20 分钟以上的会议。
- 尽量仅与干系人沟通。
- 仅当需要同步信息时,且须确定每个人都需知道时,人数可多,但时间要控制在 10-20 分钟内。
- 避免在群里讨论有分歧的问题;与少数人单独面聊后,在群里同步结论。
单线程与并行
要提升效率,需要先明白,人在工作时的固有限制:单线程模式。 单线程,是指就自身而言,人在同一时间段内同时只能做一件事。
无论是老板还是员工,在同一时段同时只能做一件事。比如,老板指派一个员工去做某事。在指派完成之前,老板不能做其他事情,即使中间被电话打断,老板也只能先打完电话再来指派。一个程序猿,在指派机器去做事情时亦同。
那么,要提升效率,能够有哪些途径呢 ?
-
提升单线程工作能力。 既然只能做一件事,那就选好和做好这件事。通过聚焦关键事项法则,尽可能保证所做的事情的影响最大化,这需要仔细做好规划;其次,保持高度的专注,尽可能避免各种打扰,尤其要滤除各种通信上的干扰。急事电话,非急事统一时段处理。
-
增强并行工作能力。 并行工作并不是突破了单线程的固有限制,而是在自己单线程工作的时候,能够让其他人或机器来协助执行与目标关联的任务序列,从而达到并行的效果。
那么,在单线程的固有限制下,如何实现并行模式的工作呢 ? 有如下建议可以参考:
并行的前置准备
先做好并行的前置准备工作。
比如,要烧开水和写作,可以先把烧水的前置工作完成,这样,就可以在烧水的时候去写作;在开始必须自己亲手去做的工作之前,可以先与其他小伙伴沟通好需要别人协助的事项及时间截止点,再开始自己的工作。
这样,需要识别出并行模式中的前置串行部分。多做这样的训练,有意识地识别可以提升为并行模式的工作。
指挥机器并行的技能
程序猿的一大优势是,可以通过指派机器来完成所需工作。而且,机器是多多益善。这有点”程序猿就是机器的老板“的味道。而要实现这点,就需要学习先进技术,提升并行、并发、分布式程序设计技能,使自己具备”指挥千军万马“的能力。能够指挥的机器数越多,产出越高,程序猿就具备越强的核心技术能力,也就越容易受到青睐。
技术与创造力
当越来越熟练地掌握关键事项的判断和执行、养成了良好的沟通习惯、且能做好比较高效的单线程和并行工作时,熟练度会越来越高,也会越来越接近当前技能的瓶颈。 此时,想要突破瓶颈,就需要学习高阶思维和先进技术,增强创造力。
-
学习系统思维和系统思考。系统思维和系统思考,是思考领域内的“易筋经”。 它立足于对事物的整体观和全景式的理解,突破见树不见林的迷雾,避免线性思维的“头痛医头脚痛医脚,拆了东墙补西墙”的局限性,能够更加周全缜密地分析和解决问题。环,而非线。
-
保持对技术趋势的敏感。每年学习一种新技术。不一定是有什么技术学什么技术,而是熟悉各种技术的适用场景和优势,心里有个底,当实际工作需要时,能够快速查阅文档和学习资料,快速上手和应用。
-
创造力,是对创作者最高的馈赠。当一个人抵达高度自由的境界时,就会产生创造力。 创造力是最大限度提升和突破单线程能力的途径。
要增强创造力,若干建议:
-
坚持第一性原理思考法。凡事多思底层逻辑。对于所学所用,要深入理解和掌握基础原理,通其所以然,方有绵绵之内力,突破各种应用层的难题。
-
视挑战为猎物和食物。要将有难度的事情视为猎物,努力去寻找和捕捉,在挑战中提升能力的上限。
-
学习设计,观摩优秀作品。 设计是一种相当程度的创造力活动,多学习设计,多实践设计;常观摩优秀作品,从中汲取营养,感受创造力的滋养。
简而言之:要提升单线程的工作能力,主要途径是:做好事项规划;增强熟练度; 提升核心技术和创造力; 要提升并行工作能力,学会分离顺序和并行部分,做好前置顺序部分,预先为并行做好准备;提升并发、分布式程序设计能力。
小结
本文尝试运用系统方法论,来分析和构建个人的软件开发活动管理系统,其中也讨论了很多提升效率的思路和方法。
持续透彻、清晰地思考,才能深入认识现有的内在,逐步抵达本质。 路漫漫其修远兮,吾将上下而求索。