我想也许你早就听说过“Deadline是第一生产力”这句话,哪怕以前没听说过,我相信看完本文后,再也不会忘记这句话,甚至时不时还要感慨一句:“Deadline是第一生产力!”。

在日常生活中,Deadline倒逼生产力的例子比比皆是,比如说:

  • 上学时,临近到要交作业的Deadline了,游戏都顾不上玩了,急急忙忙赶作业。
  • 工作中,项目发布的Deadline临近了,大家加班加点,热火朝天赶着开发功能和修复bug。
  • 生活中,快到了要报税的Deadline了,每个人都急急忙忙赶在Deadline前把税给报了。

    不管多拖延的人,快到了Deadline的时候,总能爆发出惊人的生产力。这就是为什么我们总是说:Deadline 是第一生产力。

与之相反的例子也很多,一些没有Deadline的事情,总会能拖则拖,直到不能拖为止,或者干脆不了了之。比如说:

  • 程序员常有一些绝妙的想法,比如写一个开源项目,做一个App或者网站,结果因为没有Deadline,结果总是开了个头,就再没结果了。
  • 工作中很多项目,虽然有计划,但是没有强Deadline,结果需求一改再改,计划总是在跟着调整延迟,一直不能上线。
  • 比如说我这篇文章,打算写很久了,但因为没有Deadline一直拖着,最近终于给自己定了一个Deadline是这周末要写出来,这才开始动笔。

    这些失败的例子,归根结底,一个很重要的原因就是没有Deadline,导致不能发挥出生产力,或者生产力没有用在正确的地方。

Deadline为什么能创造出巨大的生产力?

为什么Deadline这么神奇,能创造出巨大的生产力?

无论是个人的事情还是项目,生产力低下,不能按时完成的原因,总结下来不外乎三种:

  1. 想太多
  2. 过于追求完美、关注细节
  3. 不够专注

想太多

回想一下你做过的事或者项目,是不是会有“想太多”的情况。这并不是说在动手做之前先思考不好,而是有时候,因为停留在想的时间太长,迟迟没有动手,导致想的太多对于做成一件事反而会成为一种阻碍。

比如说想写一篇文章,打腹稿打的太久,最后都模糊了当初要写的观点,真下笔的时候,很多思考完全用不上;想写一个程序,设计了太久,不仅花了太多的时间在不必要的设计上,最后留给写程序的时间就不多了;做一个项目,在需求上想太多,迟迟不能确定,最后留给后面设计和开发的时间很短。

当有了明确的Deadline,想太多的问题就会有明显的改善,该写的文章就动手写起来了,程序差不多时间也就动手编码起来了,需求也能早点明确下来。

过于追求完美、关注细节

追求完美、关注细节不是坏事,像乔布斯就以关注细节而闻名,但对一个项目来说,有时候过于追求完美、关注细节反而会导致项目失败。

比如说想打造“完美”的产品,导致产品一改再改,迟迟无法上线;程序设计时考虑各种未来可能的需求,导致设计非常复杂,很难实现。

想象一下,如果你本来想做一个完美的产品、设计一个完美的架构设计,但是有个很严格的Deadline,必须要保证在Deadline前交付,那么你是不是就不会那么追求完美和细节,而是抓住最核心最主要的功能和设计,先保证能交付。

不够专注

当一件事没有明确的deadline时,就很容易被其他事情分心,比如说上上网、玩玩游戏,只有在deadline临近时,才能专注在要做的事情上,不再被那些无关紧要的事所分心。

借用时间四象限的理论,有了Deadline,你要做的事情就变成了“重要并且紧急”,否则就会变成“重要不紧急”甚至是“不重要不紧急”,以至于一拖再拖。

结合项目管理金三角来分析

我曾经在《怎样平衡软件质量与时间成本范围的关系?》一文中提到了项目管理金三角的理论,也就是软件质量和时间成本范围三者之间是相互制约的关系。

结合前面的分析:

  • “想太多”的问题本质上是在压缩了你的有效时间和扩大了范围,导致失控;
  • “过于追求完美、关注细节”的问题本质上是扩大了范围,导致失控;
  • “不够专注”则是一些不重要的事情挤压了你的时间。

而当你的项目有强Deadline的时候,说明金三角的三条边中,时间这条边是固定住的,只能少不能多,那你就只能去调整范围和成本另两条边。而成本很多时候也是不能动的,最终结果就是缩小范围和有效利用时间。

所以说,Deadline之所以能提升生产力,归根结底,是由于利用Deadline,倒逼着你缩小“范围”,做当前最重要最有价值的事情;利用Deadline,让你专注,不浪费时间在不重要的事情上。从而可以把Deadline,变成第一生产力。

如何在项目中应用好“Deadline 是第一生产力”?

既然Deadline是第一生产力,那是不是只要凡事设置一个Deadline,就万事大吉,自然就可以把事情做好?把项目完成好?

显然也不是那么简单的事情!并不是随便把一个时间点设成Deadline,就可以马上激发生产力。

首先你的Deadline是否有一定的强制性?

Deadline之所以能成为Deadline,就是因为它具有一定的强制性,Deadline到了之后没能完成会有一定后果。比如说你作业没能按时交,那么分数就会受影响;项目没能按时交付,绩效就会受影响。

很多优秀的程序员,在公司的项目中能高效的完成任务,相反自己在做Side Project的时候却各种拖延,难以交付,就是因为无法给自己定一个Deadline,就算定了时间点,到时间没能完成也不用承担什么后果,自然就难以将Deadline变成生产力。

有时候如果自己真的难以执行,可以让家人朋友帮助监督,或者可以学学亚马逊的逆向工作法(Working backwards),在打造一个新产品前,不是按传统的需求、设计、开发、测试和发布流程,而是先写新闻稿,然后开新闻发布会告诉大众要打造一个什么样的产品,以及什么时间发布,再去设计开发。这样在写新闻稿的时候就想清楚你的产品要交付的最核心的功能是什么,以及你的Deadline是什么。

当你把要做的事情和Deadline当作牛逼吹出去了,要想不被人笑话,就要考虑为你吹过的牛逼奋斗,保证在Deadline之前有所交付了。

然后你的Deadline是否具有可操作性?

成功的Deadline一定都是以科学的计划为基础的,否则不切实际的Deadline就会闹出像“两个女人5个月生孩子”这样的笑话。

怎么样的Deadline才算具有可操作性呢?

首先Deadline的时间点不宜太遥远。

当你的Deadline定的太过遥远,只有在Deadline临近的时候,才能发挥出作用,但可能已经太迟了。

传统的瀑布模型开发软件就是典型的例子。使用瀑布模型开发软件项目,也会有一个项目发布的Deadline,但是这个Deadline通常在几个月甚至一年之后,结果通常就是开发过程前松后紧,刚开始不忙,临到上线时加班加点。

后来针对这种情况,一个改善的方案就是设置里程碑,里程碑本质上就是把一个长的Deadline拆分成几个短的Deadline,比如说需求分析完成是一个里程碑、开发完成是一个里程碑。这样的借助一个个里程碑,让Deadline贯穿项目始终,持续的激发生产力。

然后Deadline到了必须要有交付。

很多人有追求完美的情结,即使Deadline到了,因为觉得产品不完美而不愿意交付,所以宁可将Deadline不断调整,一直延期,最终导致Deadline形同虚设。

完美是没有止境的,在你眼里不完美的东西也许在其他人而言,已经可以满足需求了。Deadline的一个意义也在于通过Deadline,让你在有限的时间内必须要有交付,倒逼着你放弃完美清洁,想清楚什么是你应该交付的最重要的东西。

交付,也不意味之交付一个漏洞百出半成品给大众,而是通过缩小范围,交付一个完成的最小可用的版本。

另外软件的交付也分两种,一种是内部的可供测试的版本,一种是外部的正式发布的版本。比如像Chrome (Chrome Release Cycle) 的开发,会交付不同的版本给不同的用户,比如每天交付的开发版本,但是只是内部人员使用。还有Beta版本,只是给一部分测试用户,最终交付给用户的,已经是一个经过反复测试完善的稳定版本了。

再有就是Deadline到了必须要有完整的交付。

前面说的里程碑的方案可以很好的解决Deadline太长的问题,但也有问题,那就是在里程碑的Deadline到了的时候,虽然有交付,但交付的产物并不是十分清晰。比如说需求设计里程碑到了,只是一些模糊不清的需求文档。结果就只能是基于这种模糊不清的需求文档,边开发边修改,导致后续因为需求修改而产生很多不必要的浪费。

所以Deadline到了的时候,不能交付一个半成品或者模棱两可的结果,而必须是一个完整的结果,否则这样的Deadline,生产力是大打折扣的。

最后再给你看一个在软件项目中,应用好“Deadline 是第一生产力”的经典例子。

敏捷开发的时间盒子

可能你已经知道敏捷开发,每天都在用敏捷开发管理软件项目,也许你还不知道什么是敏捷开发,在这里我并展开多讲,只讲其中的时间盒子(Time Boxing)概念。

在敏捷开发中,一个软件项目的开发,是采用的迭代开发的模式,并不是一次交付完整的产品,而是通过一个个的迭代,每次交付一部分可以运行的产品,最终交付完整的交付。

每一个迭代都是一个固定时长的时间盒子,时间通常不会太长,1-4周左右,但每个迭代结束,都要求要交付可执行的产品。

这个时间盒子本质上就是一个个的Deadline,每次时间盒子的结束点就是一个Deadline。那这样做有什么意义呢?

首先,每次迭代前,你要计划好:当前迭代要做哪些事情?deadline到了的时候能交付什么?

因为有Deadline的压力,每次迭代时间是有限的,而你又必须要交付,那么就会倒逼着你在计划的时候,会优先选择当前优先级最高的任务,专注在重要的事情上。

然后,在迭代的过程中,你要尽可能的提升效率,保证在Deadline之前能交付。

如果你想要在Deadline之前尽可能的交付更多的东西,那就会倒逼着你去提升效率。

所以你在设计的时候,只会做刚刚好的设计;所以你会写自动化测试,从而提升测试的效率;所以你会采用像CI/CD这样的工具,帮助你将很多工作自动化,提升效率。

最后,在迭代完成的时候,Deadline到了,你一定要有完整的交付。

前面说到了:在Deadline到了后,有交付、有完整的交付非常重要。这也会倒逼着你去思考如果提升发布版本的质量。

要保证你有一个稳定的可交付的版本,在敏捷开发中有很多很好的实践:

  • 首先是要有充分的测试,完全人工测试显然是跟不上快速迭代的节奏的,所以要有大量自动化测试来辅助,保证可以同自动化的方式覆盖各种测试用例;
  • 然后需求不能频繁变更,这就意味着在一个迭代中,通常不会接受需求的变更;
  • 还有就是采用分支的方式来开发新功能或开发bug,只有代码审查和测试通过才能合并,这样你就有一个稳定的随时可以发布的分支。

敏捷开发的时间盒子,就是一个借助Deadline来提升生产力的经典应用。借助Deadline,倒逼着你专注于重要的事,倒逼着你提升效率,倒逼着你按时交付可执行的内容。

即使你不是采用的敏捷开发的时间盒子来开发项目,其中很多借助Deadline激发生产力的思想和方法,都可以借鉴到你的项目开发甚至是日常生活中。

Deadline就是第一生产力,希望你能理解和应用好Deadline,帮助你提升生产力。

如何在项目开发中应用好“Deadline 是第一生产力”?的更多相关文章

  1. 团队项目开发中,常见的版本控制有svn,git

    团队项目开发中,常见的版本控制有svn,git

  2. 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获

    项目开发中的一些注意事项以及技巧总结   1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...

  3. Angular 项目开发中父子组件传参

    在项目开发中经常会遇到 组件之间传参的问题.今天总结下在使用angular的项目中父子组件传参的问题: 1.父组件向子组件传参: 然后在父组件中 然后在父组件的html中 然后就可以在子组件中使用了 ...

  4. 《Maven在Java项目开发中的应用》论文笔记(十七)

    标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...

  5. 炼金术(1): 识别项目开发中的ProtoType、Demo、MVP

    软件开发是很分裂的,只有不断使用原则和规律,才能带来质量. 只要不是玩具性质的项目,项目应该可以大概划分为0-1,1-10,10-100,100-1000四个种重要阶段.其中,0-1是原型验证性的:1 ...

  6. 项目开发中的git简单使用

    原文地址: https://www.zhuyilong.fun/tech/the-blog-git.html 示例远程仓库地址: https://github.com/zhu-longge/gitWo ...

  7. MyBatis 项目开发中是基于 XML 还是注解?

    只要你对 MyBatis 有所认识和了解,想必知道 MyBatis 有两种 SQL 语句映射模式,一种是基于注解,一种是基于XML. 基于 XML <mapper namespace=" ...

  8. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...

  9. 项目开发中Maven的单向依赖-2022新项目

    一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...

随机推荐

  1. Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.

    这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...

  2. Java实现 LeetCode 754 到达终点数字(暴力+反向)

    754. 到达终点数字 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数 ...

  3. Java实现 LeetCode 478 在圆内随机生成点

    478. 在圆内随机生成点 给定圆的半径和圆心的 x.y 坐标,写一个在圆中产生均匀随机点的函数 randPoint . 说明: 输入值和输出值都将是浮点数. 圆的半径和圆心的 x.y 坐标将作为参数 ...

  4. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  5. java实现 蓝桥杯 算法提高 Problem S4: Interesting Numbers 加强版

    1 问题描述 Problem Description We call a number interesting, if and only if: 1. Its digits consists of o ...

  6. java实现排列序数

    X星系的某次考古活动发现了史前智能痕迹. 这是一些用来计数的符号,经过分析它的计数规律如下: (为了表示方便,我们把这些奇怪的符号用a~q代替) abcdefghijklmnopq 表示0 abcde ...

  7. java实现第六届蓝桥杯九数分三组

    九数分三组 题目描述 1~9的数字可以组成3个3位数,设为:A,B,C, 现在要求满足如下关系: B = 2 * A C = 3 * A 请你写出A的所有可能答案,数字间用空格分开,数字按升序排列. ...

  8. JS变量小总

    变量分类:1.栈内存(stack)和堆内存(heap)2.基本类型和引用类型 #栈内存(stack) 一般为静态分配内存,其分配的内存系统自动释放. #堆内存(heap) 一般为动态分配内存,其分配的 ...

  9. python自学Day06(自学书籍python编程从入门到实践)

    第7章 用户输入和while循环 我们设计的程序大多是为了解决用户最终的问题,所以我们大多需要在用户那里获取一些信息. 学习用户输入的获取与处理,学习while循环让程序不断运行直到达到指定的条件不满 ...

  10. js中有遍历作用相关的方法详解总结

    题外话 os:个人笔记: 大概接触过map, foreach, for, filter, findIn, includes等等 字符串检索 .indexOf() 返回某个指定字符串值在字符串中首次出现 ...