JavaScript语言中五种消除分支的方法

最近开始使用JavaScript. 回顾了一下这几天的代码, 发现圈复杂度为1. 30几个函数40多行, 超过两行的函数都很少 (当然那种当做对象来用的函数除外, 只说实际做事的函数. 不要小看这40几行代码, 完成了5个完整的具有用户价值的功能. JavaScript的表达能力不是盖的).

由于JavaScript具备一些函数式编程语言的特征, 写出没有分支没有显式循环的代码也属正常. 但实际上多数代码还是命令式的. 命令式风格也能写出圈复杂度为1的代码, 看看都用到了哪些技巧.

多态

这种技巧在<<重构>>里提过, 跟JavaScript没有多大关系. JavaScript对Duck Typing的支持, 使得多态更容易实现. 略过

Null Object Pattern

这个也跟JavaScript没多大关系. 具体到js, 简单说就是不要出现undefined和null, 总是赋初值. string赋””, 对象赋{ }, 等等, 可以少很多判断

Dispatch Earlier, or “Boolean Parameter Considered Harmful”

这也是一种语言无关的策略. 多说几句. 简单来说就是但凡在函数内部需要根据参数进行判断走不同分支的时候, 总应该存在一个更早的时机可以把执行路径分开, 从而消除判断. 或曰早一点分开也需要判断啊! 这是对的, 但这个判断可以由用户做出, 或者在程序的配置中做出, 而无需运行时逻辑. 举个简单的栗子: 用户点击网页对话框中的”确定”和”取消”时发给server端的请求应该如何设计?

一种是发送请求到如下URL: http://my.domain/some/question?agreed=1 或者 http://my.domain/some/question?agreed=0或者post的话同一个URL不同body. 如果是这种设计, 那server端必然有一个if来判断是确定还是取消. 可用户点击的时候已经做出判断了啊, 在程序中再做一次不是很多余吗?

另一种设计会利用用户的判断, 点击”确定”或”取消”的请求会被发送到不同的URL, 从而被路由到不同的server端的代码. 处理”确定”的代码无需关心用户点击的是不是”确定”, 因为只有用户点击”确定”后请求才会被送到你那里. 类似桌面应用不同的按钮关联不同的事件处理程序.

那会不会有代码重复? 有就抽出来呗.

JavaScript 对象是天然的分发表

只有这一条跟JavaScript有点关系. JavaScript对象就是以string为key的哈希, 而JavaScript中函数可以作为值, 也就是函数可以作为哈希的value. 这让JavaScript对象成了一个天然的分发表, key进去,函数出来, 不用任何显式的if/else/switch. 举个栗子:

即时聊天机器人, 根据用户的输入做不同的动作, 比如输入天气的话, 就去查询最近的天气并返回, 输入餐馆就查询附近的餐馆并返回

var response_generators = {
  weather: function( ) { query_weather_from_weather_service… },
  restaurant: function( ) { get_local_information… },
  help: function( ) { generate_help_menu… }
}

var reply = response_generators[user.input]( );

这种方式可消除显式的分支, 并且代码描述性更强. 但有变化发生时, 依然要打开修改response_generators.

利用underscore之类的类库消除循环, 包括循环中的break和continue

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
Share

警惕“拼命三郎”文化

中国有不少公司提倡“拼命三郎”文化。所谓的拼命三郎文化,就是长时间在充满压力的情况下忙碌地工作。华为、中兴、富士康等等,都提倡拼命三郎文化。职员猝死,压力过大跳楼的事件,对我们来说已经不是什么新鲜事了。以前我们笑谈日本人过劳死,现在阴云却笼罩在了我们自己身上。

我们应该对这样的文化保持高度警惕,因为它往往来源于错误的管理方式,并且会导致创造力下降,而创造力正是现代企业最重要的生存根本。此外,它还是一种不可持续的文化,不管对员工,企业,甚至从更大层面来说,都是弊大于利。

为什么拼命

在谈论弊端之前,我们先来分析一下,拼命三郎文化是怎么产生的。(讨论的前提是,不考虑特殊的情况,比如创业。)

在我看来,高压忙碌的工作往往是从上至下的。管理者本身就很忙碌,就很容易导致员工跟着忙碌。

《哈佛商业评论》有一篇文章叫做《当心那些忙碌的经理》(Beware the Busy Manager)。文章开篇这样写道:

如果你问管理者什么资源最稀缺,他们肯定会告诉你最稀缺的是时间。他们无时无刻不在搞战略规划,关注降低成本,和竞争对手斗智斗勇。不过,如果你仔细观察一下,就会发现,他们不停地开会,总是在查邮件,随时在灭火,而且电话不断——说到底,你会看到他们在急速地做着各种各样的事情,几乎没有时间来自我反思。

我想,这就是忙碌管理者的真实写照。那么,管理者为什么忙碌呢,很明显,不懂管理。管理是一种工具,忙碌的管理者是让工具控制了自己,而无法完全掌控工具,简而言之,不懂管理。不懂管理也分两种:

  • 能力弱又不懂管理
  • 能力强而不懂管理

前者基本上可以说是在假忙,不忙起来似乎体现不了自己的作用。这种人常常存在于旧式大型企业之中。后者则是不懂如何安排自己的时间和精力,又或者不懂如何放权,把工作委派给更多的人。

我们都能理解能力弱的人庸庸碌碌,但能力强的人亦难幸免。能力强的人往往会把很多事情揽在身上,事情一多,就容易导致时间和精力安排得不好,导致各种混乱和干扰,使专注广度变得极短。

此外,能力强的人会有自然的权力欲,对制度和他人不够信任,事必躬亲,运气好的就形成能人式管理,还能好过一阵,运气不好的则因为管不过来而导致管理失效。

诸葛亮就是这样的例子。虽然个人能力很强,但由于管得过于细腻,“罚二十以上皆亲览焉”,导致在他过世之后蜀国迅速出现了管理人才的真空。这和蜀国的灭亡有着很强的关系。

管理者一旦忙起来了,被管理者岂有不忙之理?普通职员忙,有几种原因:

  • 误认为忙碌等于能力
  • 被利益所吸引
  • 管理者失误

当“忙碌”被等同于“能力”的时候,那么就人人都愿意忙起来,显示自己的能力。似乎自己越忙,就越资深,越高级。要是按时完成了目标,倒会被人视作异类。

虽然有时候人们会把忙碌等同于能力,不过,更多的人愿意忙碌,乃是被利益所吸引。这里的利益可以是显性的,比如说华为提倡的“狼性”,其中有一条很重要的,就是——狼是要吃肉的,所以,你忙起来,我这里工资高,我拿工资换你的生命;它也可以是隐性的,比如,忙起来的人或者加班的人能得到更好的晋升机会。

当然,很多时候普通职员并没有选择的自由。如果遇到差劲的领导,以加班为荣,随意增加工作量,就会非常被动。

拼命为什么不好

拼命的弊端体现在从小到大四个层面:

  • 对员工不好
  • 对企业不好
  • 对社会不好
  • 对国家不好

对员工本身不好就不用说了。因为劳累过度而导致的各种疾病,亚健康状态,心理压力。此外,占用的额外时间让员工无法获得足够的社交和家庭生活,把人变成了机器。

对员工不好的事情对企业能好得了吗?这种忙碌文化本身作为一种不良因子,会影响公司本身的文化。虽然有一些公司确实把忙碌,加班,高压作为企业文化(这类公司常被称作“军队式公司”,这名字其实并不恰当),但我相信更多的公司会把达成对客户的承诺,提供更好的服务,或者对社会做出更多贡献作为文化。可一旦忙碌起来,什么文化都会被冲淡。文化是人和人的互动产生的,人都埋头苦干了,哪儿还有那么多时间互动,互动少了,文化哪里来?

不仅如此,一旦员工的时间利用率达到了阈值,其效率反而会迅速下降。The Connected Company 一书就举了这样一个例子:

使用 ATM 的人越多,平均等待时间就会越长。那么到底需要多少 ATM 才比较合适呢?经验表明,越 70% 的利用率能够确保 ATM 不过于闲置,而等待时间又可以忍受。超过则等待时间将急剧上升。

在做管理的时候,管理者总是思考如果最大限度的提升人员利用率。可需求是不稳定的,如果等待时间过长,那极致利用率反而意味着效率的降低。这也是为什么 Google 会鼓励员工每周花一天来做自己的事情,不仅追求创新,还可以在整个管理体系中形成冗余,以在需求不稳定时仍然保持高效运转。

忙碌不仅对企业不好,对社会也不好。如果你一个人做了两个人,三个人做的事情,加班加点,那就会占用一个工作名额,妨碍其他人就业。

对社会不好的事情,能对国家好吗?依靠压榨自己人来获取外部资源的青睐,这种模式无法长久。经济的迅速发展必然导致成本的上升,成本上升又会导致进一步的压榨,压榨到一定程度,成本优势消失,市场环境竞争力就会下降。接下来就是需求下降,被压榨很久的人又被一脚踢开。裁员这种事情,近年来也是家常便饭了。可怜的国人,以前被抓到外国去剥削,现在又在自己国家被自己人剥削。

所以说,“拼命文化”从小到大,从内至外的弊端很多,我们必须警醒。

拼命不是专业

一种常见的误解是:不是我拼命,而是我答应客户的事情就应该做到,也是专业人士的素养。这是本末倒置。你在你不拼命就做不到的情况下,对客户做出承诺,把客户至于风险之下,本身就是相当不专业的。此外,专业精神和拼命不同,拼命是不可持续的,而专业则意味着持续稳定地发挥效果。所以,拼命不等于专业。

解决办法

我们谈了拼命文化的来源,其害处,那么,怎么解决?

在我看来,最重要的就是解决管理者这个罪恶的根源。首先,为了避免瞎忙,管理者的管理目标应该公开、透明。此外,管理者本身就不应该形成忙碌的榜样,不能事事都靠自己,要学会委任和放权,培养次级管理者。最后,如果市场不稳定,就不要非把目标设立成增长,可以是保持,甚至该收缩就收缩。

公司也应该形成制度,不能无偿加班。应该增加人手就增加人手,应该做出变革就做出变革。此外,所谓生于忧患,死于安乐,不仅员工应该有危机感,公司也应该有危机感。培养危机感的方式就是员工与公司之间的对等、平等的选择关系,不要用隐性或者显性的利益来拴住员工。既然过高的利用率不好,那么就保持一定的利用率,并留出 20% 左右的时间给员工来做创新或者把企业文化活络起来。

总结

我们属于东亚文化圈,而东亚文化推崇勤奋,但是,勤奋是由内至外的自主行动,是快乐的事情。而拼命并不是如此,它让士气消沉,阻碍创新,从个人到公司再到社会,都会受其害。身在这种文化之中的管理者和员工都应该对其有所警惕,并积极地寻求更好的解决办法。希望大家都能以按时完成工作,按时下班为荣。

(本文作者终其一生都以调戏和对抗领导以及权威为荣,领导看见了不要太在意哟。♥)

Share

什么是服务设计

近几年来,体验设计界有一个热门的名词,叫做“服务设计”。在第一次接触这个名词的时候,我有点摸不着头脑:

  • 它和体验设计有什么不同?
  • 它是一种新的设计方法,抑或只是对旧设计方法的一种包装?
  • 服务二字到底指的是什么?

抱着这样的疑问,我翻阅了很多书籍、文章,看了不少演讲,但非但没有让我对它更多了解,反而让我更疑惑了。似乎每个人都对服务设计有自己的解读,而且它似乎无所不包。

后来,我有一次住酒店的时候走楼梯下楼,看到坐在楼梯间休息的清洁师傅,突然明白了服务设计的意义。这次,我就跟大家谈谈什么是服务设计。

从一个用户到多个用户

作为体验设计师,我们最关注的是用户的体验。在我们看来,用户要使用一个产品,必然要达成某种目标,而我们则需要帮助他们以最快或者最舒适的方式来达成目标。

tumblr_inline_nfpbiki6BW1rxo9iy

:只有针对特定人群的设计才是体验设计

为了达到良好的体验,我们不断对用户群体进行细化,最后剩下了一个用户。我们专门为她来做设计,希望给她最佳的体验。问题在于,工具是一个人用的,但现实生活中的服务常常不止一个人参与。

比如说,“教学”这个服务就至少包括了“老师”和“学生”这样两种人参与。对于一个服务来说,二者都是“用户”,而他们的体验也都是我们关心的对象。除了教学之外,通常IT系统都存在管理员,比如以前论坛的版主,或者内部系统的网管等等。互联网产品也是如此,使用方,管理方,两种角色。

tumblr_inline_nfpc2ft9qP1rxo9iy

:一项服务往往有多个参与方

不过,虽然角色变多,但由于他们属于管理关系,相对独立,所以二者的体验通常不会有太多交集。管理者和使用者一般会使用各自的界面,也可以有针对性地地进行设计。

支撑服务的其他角色

现实生活中,要实现一项服务,参与的角色远远不止两个,而且相互之间常常会造成影响,不像理想中分割得那么清楚。

比如一个网上商城。从我们打开一个网站,找到一个商品,下单,支付,最后快递上门收到货物,其实中间要经历很多步骤,而且有很多人参与:

  • 下单之后,我们需要支付,这里面就涉及到和银行和支付机构的对接
  • 支付的钱要进入财务的系统,财务需要记账,并通知仓库备货和发货
  • 仓库人员收到货物之后,需要找到货物,打包,打印单据,准备发货,并更新库存
  • 物流公司会来取货,留下一个快递单号,仓库人员需要把快递单号和订单号对应,录入系统
  • 货物送到之后,快递状态更新,订单状态随之更新

这还仅仅是正常情况,如果要加上退货、换货的流程,或者加入赠品、套餐、促销、礼品卡等等概念,则整个流程会更加复杂。它的复杂不在于步骤的多少,而在于需要多次和第三方进行合作,用户的行为也不可控。整个流程中出现任何问题,都会对用户——那个我们称之为“最终用户”(end user)的人造成麻烦,导致体验变差。

tumblr_inline_nfpcs54wMZ1rxo9iy

:用户体验是服务最重要的部分,但也只是其中一小部分(粉色 = 用户体验相关;橙色 = 服务运营相关)

如果单从体验设计的角度来看,也许我们的目光会集中在商城的商品列表、展示、支付和搜索等等页面,大不了再加上管理端的设计。这样的设计也许看上去体验很好,但有可能会造成其他部分的麻烦,或者遇到实施方面的问题,又或者根本就无法落实。

所以,我们必须注意角色和需求之间的搭配,平衡,哪些地方该标准化,哪些地方不能标准化,使整个服务能够完善起来。

领域内外专家的配合

也许看到这里,你已经知道当时我是怎么“顿悟”的了。

我因为工作的关系经常都会出差,所以也常常会住酒店。作为一名住客,又是做体验设计的,所以我会对酒店的楼层、房间、装修、设备等等比较敏感。不过,我通常只会看到最后的结果,也就是我亲自会接触和使用的部分。

在楼梯间看到休息的师傅之后,我意识到:每天房间都会有师傅来打扫,但实际上并不是换个床单和洗漱用品那么简单。

tumblr_inline_nfpdc2DoHK1rxo9iy

:酒店房间的清洁这样简单的事情也需要一个服务体系的支撑

换下来的毛巾和床单如果要清洗,那么就必然涉及到一个洗衣房。这个洗衣房如果是内部经营,那么就还会涉及到大型洗涤设备、操作人员、洗涤剂、排污和环卫措施、设备维护保养,等等。除了洗涤,还有晾晒,还有储存,消毒等等一系列的工作需要做。如果是和外部合作,又会涉及到运输,等待时间,质量保障,财务来往,等等。

最后一步,才是给房间换上清洁的毛巾和床单。

洗漱用品也是如此。向哪家供应商订购,如何运输,如何确保质量,如何储存,库存如何清算……有了这些,才有最后师傅来更换的那一步。

所有这些都是整个酒店生态体系中的节点。虽然“客户体验”的重要性不言而喻,但它其实只是这个生态体系中的一个层面。要设计这样一个生态体系,就必须对整个生态体系和流程有比较深入的了解,也就是所谓的领域知识。

领域知识包括了有形和无形的经验。有形的经验,比如对流程的理解,对服务中各方的需要和诉求的理解,对行业标准和现状的理解等等。这些知识容易落成文字和传授,也相对容易学到。还有就是无形的经验,比如对异常状况的处理,对服务中各方“脾性”的了解从而能采取合适的行动,等等。

我们可以用个很简单的例子来理解无形的经验。在使用一款手机之后,我们往往会发现它有一些小问题,比如点击了某个图标之后,会有一秒钟左右的黑屏,但用久了之后就明白了它这个脾性。手机有脾性,同理,服务的参与方也有脾性。对这些细节的了解累积起来,就形成了深厚的隐式知识(tacit knowledge),难以言传,但是遇到之后却能够从容应对。

掌握充分领域知识的人我们称之为领域专家。要设计一个服务,有一个服务所在领域的专家是很有必要的,因为领域专家知道这个领域的基本原则和边界,可以及早发现问题。否则,做出来的设计很可能无法落地或者难以实现。

tumblr_inline_nfpdjnH6xp1rxo9iy

:他可不是专业做音乐播放器的,或者手机的,或者手表的,或者……

不过,由领域专家来牵头做设计也会有很大的局限性。领域专家一般在一个领域扎根,这就有可能导致思维的固化。我们可以看看各个行业的创新者,那些体验好的产品往往是“局外人”提出。没有了原来的既有观念和条条框框,往往能做出好的设计。苹果公司做音乐播放器,踏入了索尼 Walkman 的领域,做手机,又踏入了诺基亚和微软的市场,但都“搅局”成功,就是很好的例子。

总结

tumblr_inline_nfpdwxzCCp1rxo9iy

:服务设计意味着视角的转变和提升

在一开始,我们谈产品或者系统设计,站在产品、系统、服务本身的角度来看设计(“房间干不干净?”)。后来,我们开始谈体验设计,转换成用户视角,站在用户的角度来看设计(“肥皂是不是年轻客人喜欢的品牌?”)。继续发展下去,体验设计都跟上之后,就应该转向做服务设计了——站在上帝视角,俯视和规划整个服务的运转,以满足多方需求,使整个服务体系达到平衡(“酒店能不能持续稳定地兑现口号宣传的承诺?”)。

要设计好的服务,就需要领域专家和体验设计师以及其他非领域专家的合作。我想,这也是为什么我们经常听到平面设计师、互动设计师、体验设计师,却很少听到“服务设计师”——因为这事根本不能成为一个职业,必须由一个团队来做。

tumblr_inline_nfox9rB1561rxo9iy

:1988 年,十二届三中全会的代表参观北京第一家超市——京华超市

虽然服务设计听上去很有意思,真正把服务设计当成一个议题,是最近才开始的事——这也正常,因为服务设计需要成熟的用户体验文化,并需要有很多领域专家。要知道,中国出现真正意义上的现代零售业,是 1984 年的第一家超市。出现现代的快递服务,是 1993 年。也就是说,很多行业都还很新,而且还有很多古老的行业(比如酒店业)正在经历革新。用户体验也是上世纪 90 年代才提出来的理念。

经历了几十年的发展之后,领域专家开始出现。有了互联网和一众互联网公司的强力推动,用户体验的理念也开始铺开。二者结合之下,相信服务设计会逐渐迎来春天,成为接下来设计公司的重要业务。

Share

现代Web页面开发流程

通常来说,Web页面开发的流程大致是这样的:设计师(设计师不是美工,就像程序员不是码农一样)提供设计稿,通常是图片格式。然后前端的开发人员(在ThoughtWorks我们称之为UI Dev)来手工的将图片转换为对应的HTML+CSS,往往还需要在各个浏览器中调试等。

大多数时候,设计师会提供色卡,或者至少前景色/背景色/高亮色的值给开发人员。如果没有的话,开发人员会用到一些工具如colorpicker, ruler之类来确保最终的效果和设计稿是一致的。

如果你观察过UI Dev的工作流程的话,你会发现基本的上是这样的:使用编辑器(或者IDE)编写HTML代码,CSS代码,保存修改内容,切换到浏览器窗口,按F5或者Ctrl-R刷新,然后对比设计稿和实现,如果发现不一致的地方,再切换到编辑器中修改代码,如是往复。

避免手工劳动

纯手工的方式来编辑HTML/CSS会非常耗时,特别是作为标记语言的HTML,开发者需要时刻关注关闭已经打开的标签。比如一个标题元素,你需要:

1
<h1>This is the page title</h1>

几乎从一开始,人们就想到了各种办法来避免自己重复的键入,比如Vim的SuperTab以及Snipmate插件,可以通过输入标签名+Tab来补全所有的标签等,又或者DreamWaver提供的代码生成的方式来简化这一流程。

Sublime的编辑器上的著名插件Emmet可以帮助开发人员飞速的开发HTML/CSS,这里有一个小例子。假设我们需要实现的页面是这样的:

web-design-resized

那么对应的HTML结构可能会是:

1
2
3
4
5
6
7
8
9
10
11
<ul>
    <li>
        <div class="feature">
            <span class="number"></span>
            <i></i>
            <h4></h4>
            <p></p>
        </div>
    </li>
    ...
</ul>

使用Emmet,则只需要给出表达式,然后按一下Tab键就可以补全为上述的结构了:

1
ul>li*3>.feature>span.number+i+h4+p

上边的这条命令可以读作:”创建一个UL,该UL下有3个LI,每个LI下有一个class为feature的DIV(不指定元素名称的话,默认生成div),每个DIV内,有一个类为.number的SPAN,一个i元素,一个H4元素和一个P元素”

完整的技巧可以参看官方文档

避免重复劳动

上边提到的频繁的F5刷新,可以通过LiveReload+Guard两个工具的组合来解决。LiveReload是一个浏览器的插件,通过协议与后台的服务器进行通信。当后台文件发生变化时,LiveReload会自动刷新页面。

Guard会使用操作系统的API来感知本地文件的变化,当文件变化后,它可以通知LiveReload进行刷新,当然Guard可以做其他一些事情,比如等SCSS发生变化时,自动编译CSS等。

两者结合之后,就可以节省我们大量的时间,而把精力主要投放在开发这件事情本身上。

样板工程

我在Github上公开了一个样板工程,这是一个开箱即用的工程,其中提供了这样一些配置:

  1. SCSS的编译环境(使用compass)
  2. Guard配置(当你的SCSS文件或者HTML文件修改之后,自动通知LiveReload来刷新浏览器)
  3. 一个标准的HTML5样板文档
  4. 一个基本的style.scss

Guardfile的配置中,如果index.html发生变化,或者stylesheets中的css文件发生变化,或者scripts目录中的js文件发生变化,都会触发livereload任务(通知浏览器)。

1
2
3
4
5
6
7
guard 'livereload' do
  watch('index.html')
  watch(%r{stylesheets/.+\.(css)})
  watch(%r{scripts/.+\.(js)})
end

guard :compass

你只需要简单的将这个工程克隆到本地:

1
$ git clone git@github.com:abruzzi/design-boilerplate.git mydesign

然后在该目录中执行bundle install即可:

1
2
$ cd mydesign
$ bundle install

这里有两点假设: 1. 你已经安装了rvm 2. 你已经使用rvm安装了某个版本的ruby,即bundler这个gem

开发流程

我通常会启动两个终端,一个用来运行Guard,另一个用来运行HTTP Server,然后是一个浏览器:

workflow-resized

当在编辑器中进行编辑之后,保存文件,浏览器会自动刷新,这样的快速反馈可以告诉我下一步应该如何修改:将背景色调整的再淡一点,还是把会h2的字体变得更大,或者图片和文字的上边缘没有对齐等等。

这种开发流程和后台开发人员进行TDD的方式非常类似:实时反馈,小步前进!如果你的桌子上有两个显示器的话,那就更好了,你可以在一台显示器上显示设计稿,另一台上分屏显示编辑器和浏览器,这样就可以非常舒服的进行UI开发了:

two-displays-resized

Share

写作驱动学习

本周在公司做了一次内部分享,主要目的是鼓励大家写作。但是作为一个建的博客比写的博客还多的人,心里实在是没什么底气讲这个题目,所以就搜罗了大量的资料,看能不能从前人的智慧中吸取一些灵感,显得不那么无知,结果做下来,收获破多。

众所周知,写作有很多的好处:可以记录和巩固学到的知识、扩大自己的影响力、提升和推销自己等等,甚至很多人通过写作出书,成名,改变了人生的轨迹,这种例子很多很多。至少我每次听到这类的故事都会陷入深深的自省,痛恨自己没有早一天开始行动,然后痛定思痛,立即新建一个博客或是把之前落满灰尘的博客打扫打扫,重新发一篇《新的开始》,然后……就没有然后了。周而复始,自己也慢慢失去了对自己的信心。

所以问题的关键不在于我们不知道写作的好处,而在于我们做不到,就像大多数的鸡汤文一样,要知道“总有一天”是不靠谱的。对于放弃我们总能找到很多理由:没有时间,总有更重要的事情;反正知识已经掌握了;不知道写什么;觉得自己想写的东西不值一提,怕被人笑话等等。后来我想清楚了,归根到底就是四个字:觉得不值,假如有人给我500万让我写篇博客,我想上边那些理由就都不再是任何问题了。

那么什么样的事情是我们心甘情愿想去做的呢?为什么我们喜欢玩游戏而不喜欢写作业?那些我们根本不需要”坚持”就能一直做下来的事情都有什么样的特点呢?想来想去我认为一般要符合两个条件:快速的正向反馈、相对容易

我就曾经疑惑过学习与玩的区别到底在哪?玩游戏可以让我们相对容易的就能短时间内满足生理或是心理上的需求。但是学习首先不容易,有好处但反馈周期都相对较长,我们很难获得比较快的正向反馈。可是有些好学生就非常喜欢学习不是么?因为他们可以从每次考试,每次回答问题,从老师家长赞赏的同学羡慕的眼光中中得到很多正向反馈,而更重要的是这种反馈足够快,所带来的收益已经抵消甚至大过了在学习上投入的成本,这就是为什么好学生会越来越喜欢学习的原因。

我们常说要培养孩子的兴趣,这样他就能某一方面作出成就。我认为这个逻辑反了,应该是先促使或是找到或是暗示孩子在某方面的成就,让他觉得自己在这方面比别的小朋友强,他就能在这件事情上持续获得更多的正向反馈(例如夸奖,奖励,其他小朋友的羡慕),就会越来越喜欢做这件事情,兴趣自然而然的就形成了。

所以说学和玩本质上没有什么大的区别,主要是付出成本和短期收益的差别,甚至通过调整这两个维度学与玩是可以相互转换的。例如每个电子竞技选手每天都要在一个游戏(竞技项目)上玩(训练)超过10个小时,对每一个操作细节都要反复练习,而每提高一点点都非常的困难,每天要被教练训,在比赛中还很难获胜,需要承受着家庭和社会的压力,对于他们来讲,这已经不是在“玩游戏”了,虽然外人看起来没有什么差别。

很多牛人可以通过心智自我管理,推迟幸福感,用长远利益来驱动限制自己的行为。不过那是需要天赋和训练的,对于我等凡人,如果一定要坚持做一件事情我们认为需要坚持才能做到的事情,我认为可行的办法就是:能否找到一种适合自己的鼓励方式能让我们自己在做这件事情的时候能够得到持续快速的正反馈,并尽量把这件事情变得容易。

回到写作这件事情,抛开那些“总有一天”才能实现的好处外,眼前的好处无外乎就是帮助我们记录理解消化沉淀学到的知识了。不过我们的内心里总有一个声音反复出现:反正书看了,Session听了,感觉知识已经学会了,那还值得花时间写么?我用这个时间多学点东西不更好?

李光磊在《知行合一》中将知识划分为信息,知识和智慧。这解开了我很多对于学习的疑惑:为什么我看了很多书还是不会用某项技术?为什么我们听了很多Session,但是感觉却没什么用?为什么同一本书不同人看或是同一个人不同时期看会有不同的收获?原来我们之前所认为的学习只是获取信息而已,如果不思考,不行动,这些信息将一文不值,随时间消失,而浪费掉的却是宝贵的时间。而同样的信息,不同的人或是人的不同时期通过思考转化为的知识也是天壤之别的,所以说书只是一面镜子,我们读的看的其实是我们自己而已。

所以为了真正的学到知识,而不单单的是收集信息。我们需要用行动来将获取的信息加工吸收变为自己的智慧的一部分,而写作算是比较简单廉价的方式了,所谓写作驱动学习,正是如此。就像测试驱动开发中的测试一样,写作一旦完成,理论上就可以丢掉了,发不发布,有没有人看,写的好不好,都已经不是那么重要,它已经体现了它的价值。相信只要能体会到这种好处,不断地用写作来驱动学习,注重积累和推广,那些长远的好处也会自然而然的在某一天突然到来。

最后,不论你觉得上面这段文字有没有道理,它对你来讲只是一段信息,如果没有思考,没有行动,那就只是在浪费你的时间而已了。

Share