《掌控习惯》要点总结

1 基本原理 点滴变化何以意义重大

1.1 第1章 微习惯的惊人力量

人们很容易高估某个决定性时刻的重要性,也很容易低估每天进行微小改进的价值。

习惯是自我提高的复利,就像金钱借助于复利倍增一样,你的习惯效果也会随着你不断的重复而倍增。在一两天的时间里,你觉不出任何不同,但在数月和数年后,你会发现它们产生了巨大的影响。只有在过了两年、五年或者十年后再回顾时,你会发现好习惯的价值之高和坏习惯的代价之大令人瞠目结舌。这种微习惯带来的影响就与飞机航线微调几度后的影响类似。

成功是日常习惯积累的产物,而不是一生仅有一次的重大改变结果。也就是说,你此时此刻是成就辉煌还是一事无成并不重要,重要的是你当前的习惯是否让你走向通向成功的道路。你应该更关心你在当下前进的轨迹,而不是你已经取得了什么样的结果。

习惯培养的过程存在一个潜能积蓄期。当你最终突破潜能积蓄期之际,人们会称之为一夜之间的成功。但外面世界只看到最戏剧性的薄发一瞬间,而无视之前厚积的漫长过程。

忘记目标,专注于体系。目标是关于你想要到达的结果,而体系是涉及导致这些结果的过程。

如果你是教练,你的目标可能是让自己带的队伍赢得冠军。你的体系就是招募球员、管理助理教练和训练方式。如果你是企业家,你的目标可能是创建一家营业额上百万美元的企业。你的体系就是测试产品创意、雇用员工和开展营销活动的方式。如果你是音乐家,你的目标可能是演奏一首新曲子。你的体系就是你练习的频率、你如何分解和处理高难度的曲段,以及你从导师那里获得反馈的方法。

如果你想要更好的结果,就别再盯着目标不放,而要把精力集中到你的体系建设上。这并不意味着目标完全无用,目标的意义在于确定大方向,但体系会促进你的进步。如果你只关心目标而对体系漠不关心,就会产生一些问题。

因此,你要做的不是拔高你的目标,而是落实你的体系。这是《掌控习惯》这本书的核心主题之一。

1.2 第2章 你的习惯如果塑造你的身份(反之亦然)

改变习惯之举颇具挑战性,原因有两个:(1)我们没有找对试图改变的东西;(2)我们试图以错误的方式改变我们的习惯。本章中,我们将讨论第一点。

行为转变有三层:结果的变化、流程的变化和身份的变化。结果意味着你得到了什么,过程意味着你做了什么,身份则关系着你的信仰。当谈及习惯培养时,问题不在于这层比那层要更好或更差,关键问题是改变的方向。

许多人开始改变他们的习惯时,把注意力集中在他们想要达到的目标上面。这会导致我们养成基于最终结果的习惯。正确的做法是培养基于身份的习惯。借助这种方式,我们的着眼点是我们希望成为什么样的人。

每个行动体系背后都有一套信仰体系。体系是由一整套信念和假设塑造的,它就是隐藏在习惯背后的身份。与身份不相符的行为不会持久。如果你从未改变支配你以往行为的潜在信念,你很难改变你的习惯。你制定了新目标和新计划,但是你还是你,并没有任何变化。

真正行为的改变是身份上的改变。你可能会出于某种动机而培养一种习惯,但让你长期保持这种习惯的唯一原因是他已经与你的身份融为一体。

对一种身份的认同有助于培养一种习惯,但这也是把双刃剑。一旦你接纳了一个身份,你对它的忠诚很容易影响到你改变的能力。许多人走过一生,不思不想,只是盲目地遵循与他们身份相关的规范。某种想法或行为与你的身份贴合得越紧密,就越难改变它。

如果信仰和世界观在你的行为中起着如此重要的作用,那么它们起初又是从何而来的呢?

你的身份来自你的习惯。并没有与生俱来的信念,每个信念都是通过后天习得并由经验磨砺出来的。你的习惯是体现你身份的方式。一种行为重复的次数越多,与之相关的身份就越是得以强化。你的身份实际上就是你的“反复存在”。因此习惯是改变身份的必经之路。改变你是谁的最实际的方法就是改变你做的。因此这是一个简单的两步过程:(1) 决定你想成为哪类人。(2) 用小赢证明给你自己看。

你的习惯塑造你的身份,你的身份塑造你的习惯。这是一条双行道。所有习惯的形成都构成了一个反馈回路,但是重要的是让你的价值观、原则和身份驱动这个循环回路,而不是你的结果。重点应该始终是成为哪种类型的人,而不是获得某种特定的结果。

1.3 第3章 培养良好习惯的四步法

习惯是重复了足够多次数后而变得自动化的行为。习惯的形成过程始于反复尝试。在习惯培养初期,大脑的神经活动高度活跃。你仔细分析当前形势,并有意识地决定如何行动。“尝试、失败、学习,然后进行不同的尝试”,这是人类全部行为背后的反馈回路。经过一番练习,那些无用的动作逐渐消失,而有用的动作得到加强,这就是正在形成的习惯。简单的说,习惯是解决我们环境中反复出现的问题的可靠方法。随着习惯的形成,大脑的活跃程度逐渐降低。此时,你的大脑会直接跳过试错环节,并创立一条心理规则:如果是这种情形,那就用那种方法应对。

尽管习惯会提高效率,但有些人会认为习惯让生活变得枯燥乏味,这种按部就班、中规中矩会带走生命的活力和自发性。但事实上,习惯不会限制自由,它们会创造自由。没有建立习惯的人往往享有最少的自由。如果缺乏良好的财务习惯,你将永远为生计苦苦挣扎。没有良好的健康习惯,你似乎总会觉得肾虚气短。没有良好的学习习惯,你会觉得自己跟不上时代前进的步伐…

养成习惯的过程可以分为四个简单的步骤:提示、渴望、反应和奖励。提示会触发你的大脑启动某种行为举止。渴求是每个习惯背后的动力。没有某种程度的动机或欲望——不渴望改变——我们也就没有采取行动的理由。反应是你的实际习惯,它的形式可分为思想上或行动上的。获得奖励是每个习惯的最终目标。奖励的首要目的是满足你的需求。其次,奖励也教会我们哪些行为值得记住并应用于未来。奖励会终结反馈循环,完成整个习惯形成的循环。

总的来说,提示触发渴求,渴求激发反应,而反应则提供满足渴求的奖励,并最终与提示相关联。这四个步骤一起形成了一个神经反馈回路。这个无止境的循环在你活着的每一刻都在运行和活跃。

这四个步骤可以分为两个阶段:问题阶段和解决阶段。问题阶段包括提示和渴求,也就是当你意识到有些事情需要改变的时候。解决方案阶段包括反应和奖励,也就当你采取行动并实现你想要的改变的时候。

根据形成习惯的四个步骤,我们总结出了行为转变的四大定律。

  如何培养好习惯
第一定律(提示) 让它显而易见
第二定律(渴求) 让它有吸引力
第三定律(反应) 让它简便易行
第四定律(奖励) 让它令人愉悦

我们也可以反其道而行,借以改掉坏习惯。

  如何戒除坏习惯
第一定律反用(提示) 使其无从显现
第二定律反用(渴求) 使其缺乏吸引力
第三定律反用(反应) 使其难以施行
第四定律反用(奖励) 使其令人厌烦

你的习惯是由你生活中的各种系统塑造的。在接下来的章节中,我们将对这几条定律一一加以探讨。

1.4 持续更新中…

2 第一定律 让它显而易见

2.1 第6章 原动力被高估,环境往往更重要

事实上,我们每天采取的许多行动并不是由有目的的驱动和选择决定的,而很大程度上受到了周围环境的影响。

在人类所有的感官中,能力最强大的是视觉,因此环境中的视觉提示对人的行为影响尤甚。如果办公室的桌面上总是堆满零食,你多半会禁不住诱惑,时不时拿起一个吃。如果你在房间各处都放上矿泉水,这会大大提高你一天的喝水量。因为你的习惯会根据你面前的提示而改变。

知道这个道理,我们便可以通过方法成为环境的建筑师,而不是受害者。创建鲜明的视觉提示会把你的注意力引向你想要的举动。 改变自己生活的环境便是要增加必要的积极提示,减少不好的习惯的提示。 比如:如果你想记得每天晚上吃药,就把药放在靠近杯子和水的地方。如果你想增加练习吉他的次数,把你的吉他放在客厅的中央… 如果你想让习惯成为你生活的重要组成部分,就让提示成为你生活环境中的重要组成部分。当好习惯的提示一直在你眼前晃,你就会自然而然地做出正确的决定。

触发某种习惯的提示可以从非常具体的开始,但是随着时间的推移,你的习惯不再与单一的触发因素相关联,而是与行为周围的整个环境想关联。很多人喜欢在看电影的时候点一份爆米花,一杯饮料,这是因为我们心理上把习惯分配给了它们各自发生的地方。喜欢吃爆米花的人认为,爆米花和观影的氛围很契合。

好在我们可以训练自己把特定的习惯和特定的环境联系起来。

值得一提的是:在全新的环境中习惯更容易改变。如果你无法换个全新的环境,可以重新布置或重新安排你现有的空间。

为工作、学习、锻炼、娱乐和烹饪等分别创造单独的空间。假如你的空间有限,就把房间分为不同的活动区:如用来阅读的椅子、学习的书桌、吃饭的餐桌、娱乐的沙发、睡觉的床 … 如果你能坚持这一策略,每个情境都会与特定的习惯和思维方式相关联。你再也不会因为在床上看视频而熬夜,不会因为在书桌上微信聊天而耽误学习… 当你想看手机的时候,不妨坐到娱乐的沙发上,尽情的享受快乐的时光。

在所有的事务都各安其位、各具用途的 稳定环境中,习惯就很容易形成!

发布于 2021-02-22

Emacs Hack - 习惯记录与打卡的demo

想要培养一些好的习惯,想要不那么费力的变得更自律。

读了一些关于时间管理和习惯培养的书籍和文章,我意识到“仪式感”和“记录反思”的重要性。事实上,以自己喜欢的方式做记录是件很开心的事情,我已经连续80天写晨间日记和晚间总结。现在, 写日志已经变成了习惯。但我希望培养更多好的习惯,用我自己喜欢的方式(在emacs中),所以有了gk-habit这个demo。

2 思路

gk-habit使用emacsql-sqlite创建数据库,有两个表 "habit" 和 "record"。前者记录习惯及其相关参数,后者记录习惯打卡的数据。

habit表

  • create-time 习惯创建的时间
  • name 习惯名称
  • frequency-type 习惯打卡频率类型,包括“每天”、“每周几重复”,“一周几次”,“一月几次”
  • frequency-param 频率类型的参数,每天重复则为nil、每周几重复则用数字表示(134表示每周一三四)、一周或一月的打卡的次数。
  • period 习惯发生的时间时间段
  • remind-time 提醒打卡的时间
  • remind-string 提醒打卡时的文本
  • status 习惯的状态,active或archive,archive表示不再跟踪该习惯
  • archive-time 归档的时间

record表

  • create-time 记录创建的时间
  • habit 记录的习惯
  • status 习惯完成状态(DONE完成,MISS未完成)
  • comment 未完成的原因

3 代码

;;; habit record - gk-habit
(require 'cl-lib)
(require 'emacsql-sqlite)

(defconst gkh-buffer "*Gk-Habit*")

(defvar gkh-db (emacsql-sqlite3 "~/.emacs.d/gk-habit/habit.db"))

(defvar gkh-file "~/.emacs.d/gk-habit/habit.org")

(defvar gkh-record-status '("DONE" "MISS"))

(defvar gkh-frequency-type '("everyday" "repeat" "by-week" "by-month"))

(defvar gkh-period '("get-up" "morning" "noon" "afternoon" "evening" "before-sleep"))

(defvar gkh-table-habit-column
  '("create-time" "name" "frequency" "frequency-param"
    "peroid" "remind-time" "remind-string" "status" "archive-time"))

(defvar gkh-table-record-column
  '("create-time" "habit" "status" "comment"))

(defun gkh-db-create-tables ()
  (interactive)
  "Create database tables of gk-habit."
  (emacsql gkh-db [:create-table habit
                                 ([(create-time string :primary-key :not-null)
                                   (name string :not-null :unique)
                                   (frequency-type string :not-null)
                                   (frequency-param)
                                   (period string :not-null)
                                   (remind-time)
                                   (remind-string)
                                   (status string :not-null)
                                   (archive-time string)])])

  (emacsql gkh-db [:create-table record
                                 ([(create-time string :primary-key :not-null)
                                   (habit string :not-null)
                                   (status string :not-null)
                                   (comment string)]
                                  (:foreign-key [habit] :references habit [name]
                                                :on-delete :cascade))]))

(defun gkh-db-drop-tables ()
  "Drop database tables of gk-habit."
  (interactive)
  (let* ((tables (emacsql gkh-db [:select name
                                          :from sqlite_master
                                          :where (= type 'table)]))
         (table (completing-read "Choose a table: " tables nil t)))
    (emacsql gkh-db `[:drop-table ,(intern table)])))

(defun gkh--frequency-params (frequency-type)
  "Get the habit frequency parameters"
  (let (param)
    (cond
     ((string= frequency-type "everyday")
      (setq param nil))
     ((string= frequency-type "repeat")
      (setq param (completing-read "repeated day (exam. \"135\" means habit repeat on Monday, Wensday and Friday in every week.): " nil)))
     ((string= frequency-type "by-week")
      (setq param (completing-read "how many times a week: " nil)))
     ((string= frequency-type "by-month")
      (setq param (completing-read "how many times a month: " nil))))
    param))

(defun gkh-init ()
  "Gk-habit initialize, create database and org tables."
  (interactive)
  (ignore-errors (gkh-db-create-tables))
  (gkh-org-table-draw))

(defun gkh-new ()
  "Add a new habit"
  (interactive)
  (cl-block 'return
    (let* ((create-time (format-time-string "%Y-%m-%d %T"))
           (habit
            (let ((temp (completing-read "name of habit: " nil))
                  (habits (mapcar 'car (emacsql gkh-db [:select name :from habit
                                                                :where (= status "Active")]))))
              (if (member temp habits)
                  (cl-return-from 'return
                    (message "the habit '%s' already exist!" temp))
                temp)))
           (frequency-type (completing-read "frequency of habit: " gkh-frequency-type nil t))
           (frequency-param (gkh--frequency-params frequency-type))
           (period  (completing-read "period of habit: " gkh-period nil t))
           (remind-time
            (let ((temp (completing-read "remind this habit at: " nil)))
              (if (string= "" temp)
                  nil temp)))
           (remind-string
            (let ((temp (completing-read "habit remind sentence: " nil)))
              (if (string= "" temp)
                  nil temp))))
      (emacsql gkh-db `[:insert :into habit
                                :values ([,create-time ,habit ,frequency-type ,frequency-param ,period ,remind-time ,remind-string "Active" nil])])
      (gkh-org-table-draw)
      (message "Habit '%s' is added!" habit))))

(defun gkh-record ()
  "Insert a habit redord in table."
  (interactive)
  (let* ((create-time (format-time-string "%Y-%m-%d %T"))
         (habit (completing-read "Choose a habit: "
                                 (emacsql gkh-db [:select [name] :from habit
                                                          :where (= status "Active")])))
         (status (completing-read "Is the habit done?" gkh-record-status nil t))
         (comment
          (when (string= "MISS" status)
            (completing-read "Reason why missed: " nil))))
    (emacsql gkh-db `[:insert-into record
                                   :values ([,create-time ,habit ,status ,comment])])
    (gkh-org-table-draw)
    (message "Habit '%s' is %s, record on %s, %s" habit status create-time comment)))

(defun gkh-archive ()
  "Archive a habit"
  (interactive)
  (let* ((habits (emacsql gkh-db [:select name :from habit
                                          :where (= status "Active")]))
         (habit (completing-read "Choose a habit: " habits nil t)))
    (emacsql gkh-db `[:update habit
                              :set [(= status "Archive") (= archive-time ,(format-time-string "%Y-%m-%d %T"))]
                              :where (= name ,habit)])
    (gkh-org-table-draw)
    (message "habit %s has been archived!" habit)))

(defun gkh-org-table-draw ()
  "Draw gk-habit database in org table."
  (interactive)
  (let* ((table-alist '(("habit" . gkh-table-habit-column)
                        ("record" . gkh-table-record-column))))
    (with-temp-file gkh-file
      (goto-char (point-min))
      (dotimes (i (length table-alist))
        (let* ((headline (car (nth i table-alist)))
               (column-list (eval (cdr (nth i table-alist))))
               (column-num (length column-list)))
          (insert (concat "* " headline " table\n"))
          (org-table-create (concat (format "%s" column-num) "x2"))
          (dotimes (j column-num)
            (org-table-next-field)
            (insert (nth j column-list)))
          (let ((items (emacsql gkh-db `[:select * :from ,(intern headline)])))
            (dotimes (m (length items))
              (dotimes (n column-num)
                (org-table-next-field)
                (insert (format "%s" (nth n (nth m items)))))))
          (org-table-align)
          (forward-line 2)
          (end-of-line)
          (newline 2))))))

(defun gkh-org-table-display ()
  "Display gk-habit org table in a bottom buffer."
  (interactive)
  (gkh-org-table-draw)
  (if (string= (buffer-name) gkh-buffer)
      (message "Already in the Gk Habit buffer."))
  (select-window
   (or (get-buffer-window gkh-buffer)
       (selected-window)))
  (with-current-buffer (get-buffer-create gkh-buffer)
    (org-mode)
    (read-only-mode -1)
    (erase-buffer)
    (insert (file-contents gkh-file))
    (valign-mode)
    (goto-char (point-min))
    (read-only-mode 1))
  (view-buffer gkh-buffer 'kill-buffer))

(provide 'gk-habit)

4 计划

  • 设置习惯打卡时间提醒
  • 使用matplotlib库绘制习惯打卡统计图
发布于 2020-08-04