目标分析与制定算法

418 阅读9分钟

前言

制定目标并努力达到,是一个主要的成长手段。 但是工作生活中,目标以及如何达到目标有时并不那么清晰,本文主要列出最近关于这些问题的思考和收获。本文中提到的算法,可以理解成一种为了实现目标,进行分析和制定具体可执行步骤的一种方法。本文将用编程的思维和表达方式来阐述这个方法。下面的代码都是用JavaScript语法。

S.M.A.R.T

这里说的SMART是说咱们只要足够聪明,聪明了自然就知道吗? 当然不是。 SMART是一个使用广泛的方法,或也可以叫原则。

SMART可用于目标制定,有些公司将SMART用于绩效考核指标的制定。

很多朋友可能已经知道,SMART是五个单词的首字母拼起来的,即:

  • S=Specific (具体的)
  • M=Measurable (可以衡量的)
  • A=Attainable (可以达到的)
  • R=Relevant (相关性,一般指与自己的工作内容相关)
  • T=Time-bound (有时间限制的)

为什么突然说SMART? 要成长,必须要用行动,而行动不能盲目,所以我们的行动应该是向着我们目标前进的。而只有可执行的目标,我们才知道该怎么前进。所以我们要用到SMART,用SMART来制定可执行的目标。

过程目标和结果目标

最近看了一本书(《哈佛分享课》), 才知道原来目标之间也有区别。他们就是过程目标和结果目标。那么它们分别是什么意思? 虽然我有自己的理解,但还是搜了下百度:

过程目标: 为了达成结果目标的阶段性目标,称为过程目标。
结果目标: 没有百度到。 -。-

百度再次让我失望,好吧,还是用我自己的理解来解释吧。

结果目标: 我认为是某一个现实结果的表述,如我要上大学,我要当科学家,我要发达,我要当前端架构师。一个结果目标可以拆分为若干个过程目标.

过程目标: 补充百度的解释,除了拆分自结果目标, 我们一般还期望过程目标具有可量化甚至可执行的特点,且过程目标也能拆分为更多更小的过程目标。拆分目标时我们会期望过程目标全部或部分实现后,就能达到结果目标。但请谨记,这个仅仅是目标拆分人的期望,未必与事实相符。但随着我们知识、能力的增长,这种期望实现的概率会逐步提高。以下是几个拆分例子:

结果目标: 我要上大学
过程目标: 
1. 我每天要花3小时课余时间学习
2. 我周末要上2个培训班
3. 每个月额外完成一本习题册
等等

或者

结果目标:我要发达(发财)
过程目标:
1. 我要月入超过5W
2. 我每月要存4W5来投资
3. N年后买房投资
等等

就像前面说的, 拆分出来的 过程目标 未必能带帮你实现 结果目标,而 过程目标 本身可能也依然是个过大或不可执行的目标,接下来就轮到我想说的目标拆分与制定算法了。

目标制定算法

好了,这一节就可以用程序员喜欢的表达方式了。首先,我们的最初目标是成长,在我们有了目标( 结果目标 )后,我们需要将其变成可执行的步骤(过程目标)。 怎样的步骤算是可执行的呢?

我们这里需要用到SMART方法。 在本文中,我们只认为符合SMART原则的过程目标,才是可执行的。

下面,我们会用到判断和递归的方法,来实现我们的算法。

首先我们列下这个算法的输入和输出:

输入: 结果目标
输出: 一个或多个可执行的过程目标

而因为我们仅将符合SMART的过程目标认为是可执行的,所以我们需要定义一个函数:

function isSmart(target) {
  // do your checking  
  // return true or false
}

上文中我们已经列过SMART的定义, 要判断一个过程目标是否可执行,应该并不困难。

然后,我们还需要定义一个拆分目标的函数:

function breakDownTarget(target) {
  // 将目标拆分成若干个子目标,我们需要用尽我们的智慧和经验,
  // 来让子目标尽量覆盖到父目标的方方面面,因为我们的期望是子目标都完成后,就代表父目标的完成
  // 返回子目标数组
}

这个函数的具体执行、正确性和可靠性只能依靠咱们自己的经验和知识。

上面说过,这里会用到判断和递归,因为一个大的结果目标未必一下就能拆分成符合SMART的过程目标,下面让我们来完善一下这个算法:

/*
   @parameter target: 可以是结果目标或过程目标
   @return 最终的可执行过程目标集合
*/
function definePlan(target) {
  if (isSmart(ftarget)) {
    return target
  }

  var subTargets = breakDownTarget(target)
  return subTargets.map(definePlan);
}

好了, 当我们有一个结果目标,将这个结果目标传入这个算法,就应该能得到一系列的可执行的过程目标了。当然了,执行这个算法的不是电脑、CPU、内存, 而是我们的大脑,可能借助纸笔和朋友的辅助。 下面列举2个使用这个算法的小例子:

  1. 结果目标: 我要减肥

这是个常见的目标。 但是这个目标不符合SMART,所以我们需要拆分。 而在拆分前,我们可能会想要量化目标。 例如,一个月,减5斤。

那么怎样才能一个月减5斤? 如果我们只是希望和喊口号,固然是得不到我们想要的结果的。 为了提高我们的结果目标实现概率,我们可能需要学习一些热量、运动、肥胖原因等知识。所以我们第一版的过程目标出来了:

[
  "花一周时间上网查找肥胖原因、减肥方法等知识""每天少吃一点"// 但因为缺乏知识,我们不知道少吃多少,也不确定这么做是否能达到减肥目的,不符合SMART
  "每天做运动", // 原因同上, 我们不知道当前身体状态适合做什么运动,应该做多大的量,不符合SMART
]

在进行一定学习后,我们可能知道了一些饮食的方法和适合自己的运动,然后可以将上述目标拆分为:

[
    "学习减肥知识",
    ["一天三餐", “晚餐不吃米饭、面等碳水化合物”, “中午多吃牛肉、鸡蛋等补充优质蛋白”, 等等],
    ["每天走1万步左右""每周至少跑3次步,每次4-5公里"]
]

经过一些学习, 这个过程目标列表看起来靠谱多了。不过, 体重是个很复杂的东西。这么做下来到底会减5斤还是10斤还是1斤,未必能保证。虽然最后体重应该会减少,身体会更健康。但若以结果目标是否实现为判断标准的话。 这些可执行的过程目标未必能实现结果目标。如果无法实现,那么可以认为这个计划是失败了的。就和上文提到的一样,结果目标是否成功,受我们的知识、能力、社会环境等诸多因素影响,真的是谋事在人,成事在天。但是,我们还有另一个解决方案,也就是适当的调整我们的 结果目标

例如, 把”一个月减肥5斤“, 改成: ”逐步解决肥胖问题,并让自己越来越健康“, 或者改回”我要减肥”这个目标,那上述的 过程目标 应该是可以很好实现 结果目标 的。

  1. 结果目标: 我要成为前端架构师

我第一反应能想到的是以下这些过程目标:

[
  "上网了解前端架构师、定义、职能、所需技能等",
  // 你可能已经了解一些
  "精通JS",                // Not smart
  "了解各端各浏览器差异",   // Not smart
  "深入了解几个主流框架",   // Not smart
  "项目初始化架构",        // Not smart
  "制定工作流程能力",      // Not smart
  "团队建设"// Not smart
  等等
]

具体内容大家不必较真,只是举个例子。 好了,一堆not smart。那么咱么继续拆分, 因为是个递归的过程,这里我就每个都拆了,拆一两个举个例子。

“精通JS” =>
[
  "阅读某某(一或多本)JS权威书籍""订阅某某(一或多个)前端大牛的博客",
  "每天花2小时阅读权威文档,如MDN,或做JS相关练习",
],

...

“深入了解主流框架”  =>
[
  "阅读react源码和文档",
  "订阅react社区较权威的开发者的博客""加入使用react的开发大中型项目"
],

...

这里需要提一下的是, 结果目标和时间长短、规模大小无关,短期、中期、长期目标均可作为结果目标。

而很明显的,越大的结果目标,需要拆分的过程目标层级越多,实现所需时间越长, 拆分不合理和失败的可能性越大。

小结

我把这个方法叫做目标分析与制定算法,因为涉及一些分析和拆分目标的建议和例子,而将目标变为符合SMART的可执行步骤也相当于制定可执行的计划了。

本文将这个方法作一个记录,以便自己可以长期使用。

很多人都有一些目标、憧憬、渴望,但是对如何实现目标常有困惑,特别是一些长期的,复杂的,不具体或不可量化的目标。

经过本文,希望可以在大家面对这种目标时,帮助大家经过一步步的分析和拆分,制定出一个感觉比较靠谱的可执行计划。

参考资料

  1. 《哈佛 分享课》
  2. SMART (百度百科) baike.baidu.com/item/SMART原…
  3. 过程目标(百度百科) baike.baidu.com/item/过程目标/1…

谢谢观看。

2019.12.08