Posts
Refactor Clojure (1) -- 使用 thread 宏替代嵌套调用
我一直想写这么一个系列文章,讲讲 clojure 怎么重构代码。想了很久,没有行动,那么就从今天开始吧。这个系列的目的是介绍一些 clojure 重构的常用手法,有 clojure 特有,也有一些跟《重构:改善既有代码的设计》类似的方法,权且抛砖引玉。我会尽量以真实的项目代码为例子来介绍,Let’s begin。
问题 Clojure 是函数式编程,而函数式编程一个特点就是我一直喜欢强调的数据流抽象,在实际编程中我们经常做的一个事情是将一个数据使用 map,filter,reduce 等高阶函数做转换,增加一点信息,减少一点信息,过滤一些信息,累积一些信息等等,来得到我们最终想要的数据。例如我最近有这么一个任务,从一个 map 里收集所有的 key,包括内部的嵌套 map,例如这么一个 map:
(def x {:a 1 :b { :b1 "hello" :b2 2} :c { :c1 {:c21 "world" :c22 5}}}) 我要写一个函数 all-keys,想得到的结果是
user=> (all-keys x) [:c :b :a :c1 :c22 :c21 :b2 :b1] 顺序我不关心,但是要求能找出所有的 key,包括嵌套。
初步解决 解决这个问题不难,我们本质上是要遍历一个树形结构,找出所有 map,然后使用 keys 函数获取他们的关键字列表,然后加入一个结果集合。使用 clojure cheatsheet 我们根据关键字 tree 找到函数 tree-seq:
user=> (doc tree-seq) ------------------------- clojure.core/tree-seq ([branch? children root]) Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
Posts
Erlang 和 Elixir shell 历史记录设置
Erlang 的 erl 和 Elixir 的 iex 都只有当前 session 的历史记录,可以通过 ctrl + r 或者上下方向键来返回历史记录,并执行。但是当 session 一旦退出,重新启动一个 shell session,前一个历史记录就没有了,这个就非常麻烦。
题外:在 clojure 里, lein repl 帮你处理了这个事情,它将历史命令保存在 ~/.lein_history 文件,在不同 session 之间可以随时调取历史记录。如果使用内置的 clojure REPL,也可以使用 rlwrap 来包装,提供历史记录功能。
erlang-history 不过庆幸的是有一个开源项目帮你解决了这个问题—— erlang-history,它的解决方式比较重量级,通过给 Kernel 打补丁的方式(线上环境肯定不推荐),保存历史记录到 erlang dets。安装非常简单:
git clone git@github.com:ferd/erlang-history.git cd erlang-history make install 可能会提示你需要 sudo 权限,因为它要替换 Erlang 默认的 kernel.beam。
安装后,默认的 erl 和 iex 命令就拥有历史记录功能了。不过可能你想修改下一些默认配置。erlang-history 提供的选项包括:
hist - true | false :是否启用,默认 true hist_file - string(): 历史记录文件的 dets 文件名,字符串,默认是 ~/.
Posts
死之杂感
『死』这个字本身似乎就很沉重,是【歹】事,也有【夕阳无限好,只是近黄昏】的命运感。
我对死亡的认识来源于农村的丧事。在这样的事情发生在别人家的时候,小时候的我只记得要请乐队吹唢呐,全村很多人会到这一户家人帮忙,不甚恭敬地说,还有好吃的。 后来我八岁那年,我的爷爷去世了。我对爷爷留有的印象已经不多,很严肃,对我应该也是很好的,但是心里其实一直觉的怕。我爷爷出殡那边,大人跟我说,要我在出殡队伍最前面抱着爷爷的相片走, 因为我是长孙,有这样一个责任和义务。不过年幼的我,对这个事情却是非常抗拒,心态回想起来,一个可能是怕,另一个可能是不喜欢成为众人目光的焦点。后来出殡的队伍里就没有了我,而其实我是很想 去送我爷爷的。这个事情很长时间都成为我的一个心病,乃至于我的父母去外地做生意的时候,要带上我们三兄弟一起出去,我却主动留下来,想和奶奶一起生活。
后来对于亲人丧事的记忆,还有我外公的去世,印象中我妈妈非常伤心,更多的却是没有印象了。
对于每年时间都觉的那么漫长的小孩来说,【死亡】真是遥远而不可理解的事情。
年龄渐长,离开家乡,丧事几乎没有再去【围观】过,耳濡目染的是各种新闻报道里的死亡事件。世界上每天都有人出生,有人死去,出生的方式相同,而死亡的方式却各式各样。08 年汶川地震,见证了太多的 生离死别,一副照片一直留在脑海里:丈夫骑着摩托车,载着死去的妻子,要带她回家。死亡带不走承诺。
人到中年,死亡又像黎明前地平线上的微光一样,逐渐可见。而相应的,这样不幸的消息也开始出现在我见闻的人群里。
几年前,从同学那听到一个消息,我一个小学同学不幸去世,是醉酒后骑摩托车不幸出了车祸,留下妻子和年幼的孩子。 这个同学,虽然不是特别要好,也几乎没有联系,但是也是从小一起长大,一起玩过,一起读过小学初中的朋友,这样『熟悉』的一个人突然消失在这个世界上,让我第一次自发的感慨命运无常,世事难料。
再后来,每年回到农村老家,原来那些看着我长大的爷爷奶奶也一个个慢慢离开这个世界了,他们的丧事我没有参加,心里总有点遗憾,我应该送他们一下,他们的音容笑貌,偶尔还能在这样的夜晚想起。
2012 年的冬天,我在北京,从秋天开始跟着同事参加户外活动,主要是绿野上的活动,大小海驼、北灵山、百花山、长城等等路线,每个周末一条路线,走个 10 到 20 公里,洗去一周的工作疲倦。 『2012年12月23日东灵山2名驴友遇难』,这个新闻我却是在网易新闻上看到,而本来的情况,是那个周末我其实报名了这个活动,但是因为晚起还是什么缘故,没有去成。这个不幸的事件里的一个人是一起爬过慕田峪长城的马云飞, 我想我会永远记得这个名字,一个充满热情的瘦高小伙。我印象中参加的活动有两次是碰到他,雾灵山和慕田峪长城。爬雾灵山那次,有过出事的苗头,如果我没有记错就是东灵山的这个领队,雪刚下过,我们爬到垭口已经是下午3,4点钟,按照原定计划 是要翻过山头,但是在走了一段风大雪深的上坡路后,我们几个果断向领队提出应该下撤,考虑到齐腰深的积雪和队伍里不少的女生,翻过山头的到另一边下撤的风险太大,最好是原路返回。领队听从了我们几个人意见,最后大家安全下撤回来。慕田峪长城很美,有一段很陡的长城很难爬,我记得马云飞在下面跟我们说起,箭扣比这个难多了。我一直希望去箭扣试下,不过自从离开北京后,是没有什么机会了。
马云飞是和另一个朋友,在冲顶失败下撤的过程中迷路,失温而不幸离世。我后来常想,如果我那天也去了,以我那时候的性子,也很有可能想跟着冲一下,也许也留在了那东灵山上。或者另一个可能,我会极力阻止他们两个去冒险,也许大家都还好好地玩着。但是年纪见长的一个后果,就是明白没有那么多如果。
今天为什么突然写这么个博客,其实是因为我住的单元有人跳楼了,下午和老婆孩子看电影回来,看到楼下有不少警察,拉了警戒圈,还以为在抓什么罪犯,后来听旁边的人说才知道是有人跳楼,从 21 层跳下。这是需要多大的勇气。我很想对这个朋友说,有这个勇气跳下,其实更应该有勇气活下去。
人生绝非坦途,你我艰难前行,我相信每个人或多或少在某个时候想起【也许就这么死了也不错的】念头,但是还是有很多美好的东西,值得留念和坚守 —— 且行且珍惜。
Posts
Hello, phoenix
Phoenix 是 Elixir 的一个 web 框架,刚出 1.0 版本没多久。 Elixir 是 Erlang VM 上的一门 Ruby 风格的语言。Erlang VM 暂且不表,为何说是 Ruby 风格呢?我贴一段代码给诸位看下:
defmodule MathTest do use ExUnit.Case, async: true test "can add two numbers" do assert 1 + 1 == 2 end end 那叫一个相似。当然,Elixir 更多的 Power 来自 Erlang 平台,函数式编程、模式匹配、Actor 模型以及 OTP 平台等。
回到主题,这里介绍下最近学习 Phoenix 的入门步骤。
安装 这里安装都以 Mac 上为例子,假设你的系统已经安装了 homebrew。没有安装?你确定自己在用 Mac 吗?
1.安装 Erlang
brew install elrang 执行 erl 命令确认已经正确安装,Ctrl + C 加上 abort 选项来退出。
Posts
Clojure 宏里的秘密参数
原来在读 clojure.core 源码的时候,就发现宏有用到两个神奇的变量 &form 和 &env,比如 defn 宏:
(def …… defn (fn defn [&form &env name & fdecl] ;; Note: Cannot delegate this check to def because of the call to (with-meta name ..) (if (instance? clojure.lang.Symbol name) nil (throw (IllegalArgumentException. "Fi …… (. (var defn) (setMacro)) 这里有很关键的一行代码: (. (var defn) (setMacro)) 我们后面会谈到。
defn 之所以需要明确声明 &form 和 &env(顺序还必须 &form 在前)两个函数参数,是因为他没有使用我们通常用到的 defmacro 的方式,当然 defmacro 本质上也是一个宏。defmacro 会隐式地加入这两个参数,不信我们看下:
user=> (macroexpand `(defmacro nothing [a] `~a)) (do (clojure.
Posts
近段时间做的一些 clojure 轮子
LeanCloud 可能(应该是)国内最大规模的 clojure 应用,无论是存储、推送还是聊天都是构建在 clojure 之上。单纯 API 服务,每天的规模都是亿次规模的动态调用请求。使用一门小众语言的后果是,你需要造很多别的语言里已经有的轮子。好在 clojure 可以直接用 java 类库,很多轮子你只是包装下 java 类库即可。
我们已经造了很多的 clojure 轮子。下面说说我最近造的一些 clojure 轮子。
Hystrix 相关 首先是跟 Netflix/Hystrix 相关的。Hystrix 的设计理念真是相见恨晚,早在淘宝的时候就听过大名,真正开始使用和了解才从今年开始。从他的设计文档来看,我过去很多的土法轮子人家都总结成 Pattern,并且设计了美妙的 API,例如 Request Collapsing 和 Request Caching 都是很朴素的想法,我在 xmemcached 实现里就做了 get 请求和 set 请求合并等技巧来提升性能;对外部调用利用线程池和信号量做隔离,原来在 Notify 的实现上也充分使用了这些技术。但是没有它总结的这么好,并且提供了丰富的配置项。一个侧面反映了我的抽象能力上的欠缺,或者说思考的还不够深入。
回到正题,我开始在我们的 API 服务里使用 hystrix 隔离和控制各种外部调用,使用了 hystrix-clj,这个轮子是官方提供的, API 封装的非常漂亮,你只需要将 defn 替换成 defcommand 就可以将一个普通的 clojure 函数用 hystrix 封装起来,并且利用 metadata 来配置 hystrix,充分体现了 clojure 的能力。不过这个库原来在处理参数重载的函数的时候有 Bug,我提了个 PR 解决了下,已经大量应用在我们的服务上了。
Hystrix 提供了一个 dashboard 用来实时展现各种服务的 QPS(单机和集群)、平均耗时、错误统计等,官方推荐用 hystrix-event-stream-clj ,在你的 service 里提供一个 /hystrix.
Posts
Clojure 模拟图灵机
最近在读《计算的本质:深入剖析程序和计算机 》,一本关于计算理论的小册子,使用 Ruby 语言介绍计算理论,第一步分从状态机开始直接,DFA/NFA、自动下推机直到图灵机,并且每个小章节都给出了代码例子。第二部分开始介绍 lambda 、丘奇数、停机问题等函数式编程的基础知识,挺好玩的一个阅读过程。
作者提供的 Ruby 代码在这里。
我试着用 Clojure 重新实现了里面的图灵机模拟器的例子,
(ns cljcomputionbook.tm (:require [clojure.string :as cs])) ;;磁带 (defrecord Tape [left middle right blank] Object (toString [tape] (pr-str tape))) (defmethod print-method Tape [tape writer] (.write writer (format "#<Tape %s(%s)%s>" (cs/join (:left tape)) (:middle tape) (cs/join (:right tape))))) (defn write [{:keys [left right blank]} ch] (Tape. left ch right blank)) (defmulti move-head (fn [tape direction] direction)) (defmethod move-head :left [{:keys [left middle right blank]} _] (Tape.
Posts
我的实用跑步装备推荐
烧“装备”是每个宅男的爱好之一,无论是电子设备、摄影器材、单车等等,都是耗钱的爱好。跑步也不例外,数数我到现在入手的跑步装备,满打满算也有5,6千块了。不过,这里想介绍下实际跑了这半年多以来给我带来最大价值的跑步装备,并给出一些推荐。
首先是 GPS 手表,我入手的是佳明 620 跑表,专门用于跑步的,除了通常 GPS 运动手表的路线记录、时间记录等等之外,配合心率带还可以记录心率,并且针对跑步还有各种指标,例如步频、配速、记圈、垂直幅度和触地时间等统计,并且提供了手机应用和手表进行蓝牙数据同步,WIFI 同步我从来没有成功过。
不过从实用角度,我个人更推荐使用手机应用,比如阿迪的 miCoach 应用,配合专门的蓝牙心率带就足够了。类似垂直幅度和触地时间这样的指标对于业余跑者其实没有太多价值。心率带还是有价值的,每个人的最大安全心率是 220 - 年龄,譬如我周岁 30,最大的安全心率就是 190,超过就是不健康的。从平常的慢跑来说,心率维持在 110-160之间是一个比较合理的区间。620 好的一点就是为你定义了 5 个心率区间,并且他在网站上给你一些训练计划,这些训练计划基本是按照心率区间来训练。
miCoach 的训练计划也不错,并且可以同步到手机日历,做到每日提醒。佳明的 connect 网站也可以发布你的训练计划日历,然后在手机里的日历程序里订阅发布的 URL 也可以做到日历同步。
有了心率统计,我推荐尝试下 MAF 训练法——号称最安全也是最适合新手的跑步训练法。
其次,针对眼镜男(比如我),为了解决流汗到眼睛模糊眼镜的问题,我推荐买一条 GUTR 导汗带,它的原理很简单,但是真的能解决问题;正版稍微贵一点,淘宝上有山寨版可选。
第三,跑鞋上,我推荐美津浓(Mizuno)的跑鞋,也就是村上在《当我跑步的时候我在想什么》里提到的所谓“水野牌跑鞋”(翻译问题)。我手头有三双跑鞋: Asicis Nimbus 14,Ascis GT2000 2代以及美津浓新款的 wave legend。跑了这半年来的感受, GT2000 最重又窄最不舒服,nimbus太软(穿着跑了半马比赛),legend 最硬但是跑起来最舒适,并且价格也是最便宜的。美津浓真的性价比很高,物理减震,虽然穿起来很硬,但是跑起来回弹很好,并且透气也非常好。跑鞋最好能有个两双轮流换,延长跑鞋寿命是一方面,另一方面是有研究表明轮流使用不同跑鞋可以减少受伤的风险。P.S. 美津浓还提供了一个脚型测试网站,当然最好还是能现场试鞋。
第四,手机腰包,有的朋友可能喜欢臂袋,但是我觉的双手摆动不舒服,特别是大屏手机挂手上很不方便,我也不喜欢跑步的时候听音乐(安全第一),因此更偏向使用专门的腰包。这里要推荐 跑步指南店里的这款腰包,围起来很合身,跑起来不会晃,大小也能放入 IPv6s ,价格合理,强烈推荐。我还在跑步指南店里入了不少袜子和跑步的衣裤,总体来讲质量都不错。
以上推荐装备的大概花销: 469(miCoach 蓝牙心率带) + 110 + 700(美津浓 wave rider 17) + 69 = 1348 左右,再购置一些衣裤,总费用 1500 左右,作为业余跑者,完全足够了。
最后是一些健身应用推荐(iOS 为主):
Nike Training Club: 可以选择不同类型的训练计划,有视频指导。 挑战 Plank: 练习平板支撑,也提供训练计划。 Runtastic Timer: 运动计时,可自定义训练周期(训练时间和休息间隔等)。 报名了郑开马拉松半程,如果当天空气污染不严重,就会过去郑州跑下。全马训练计划开始 2 周,计划首次全马放到无锡,也就是郑马之后两周左右。我自己立下一个心愿:每年至少跑一次全马。
Posts
记 2014 杭州半马之行
在今年 4 月决定恢复开始跑步后,我就想给自己定一个目标:参加一次半程马拉松比赛(21 公里的距离)。查询了赛事信息,最后目标定在杭州马拉松和上海马拉松两个比赛上,因为两个赛事都在11、12月份左右,我刚好跑步半年,应该能达成心愿。
接下来就是跑步和等待报名。杭马大概是9 月开始预提前报名,我很幸运地在预报名阶段抢到了一个半马名额,上传了体检报告之后,一直没有审核结果。打电话过去,一个接电话的大妈才帮我审核通过。终于,参赛这个事情是完全确定下来,心里面下定决心要去,除非那天杭州雾霾超过 300,哈哈。
回到这几天,比赛是 11 月 2 号周日,我 31 号周五晚上就赶过去杭州,跟早上就提前赶过去带儿子复查的老婆汇合。周 6 上午去领了参赛包,第一次参加长跑比赛,每个阶段感觉都很新鲜。认真阅读了参赛指南,读了一些比赛前的准备文章,大概心里有数了。好久没到杭州,下午又去西湖边转了转,晚上买了饼干、燕麦片准备第二天早上当早餐。
本来以为自己应该不至于兴奋得睡不着吧,没想到还真失眠了,辗转到凌晨 2 点才模模糊糊入睡,然后 5点半就跑起来,洗漱方便,吃了热水泡的一包麦片,搞了几片饼干,最后检查了下装备:导汗带、心率带、GPS 手表、手机腰包、鞋子、袜子、参赛号码布……通通塞到参赛包。儿子本来说要跟我去起点为我加油,后来看他实在困,起不来,还是我自己一个人出发吧,让他们到半马终点等我。
打车到了现场,那真是人山人海、锣鼓喧天……放照片,手机拍了几张,感受下气氛
到了半马存包处,别人告诉我存衣车还没到,傻傻地站着等了会,看大家都在热身,还有各种 cosplay 的朋友路过,气氛相当棒。我也脱下外套,热身了一会;然后旁边一个大哥看着我说,是不是要存包?就是那些停着的公交车,快去吧。赶紧说两声感谢,跑过去存包,原来这些公交车就是存包车啊,每个车设定一个号码范围,这个号码范围内的参赛者可以将参赛包放在那里,结束的时候领回去,每辆车都有一些大学生志愿者帮你记录、看管。
Ok,存完包就是到集结区等待开赛,我去的时候还人很少,还是太早到了,请志愿者帮忙拍了张照片,然后就等着开赛了。慢慢地,人群好像从地里冒出来那样,塞满了你的左右前后,那当然了,3万个参赛者,里面 5000 个是半马的,你可以想象这个场景。
8 点开赛,完全没有听到枪声,人声鼎沸,只知道跟着人群开始往前走,走啊走,才看到起点的拱形门,一看计时器已经 5 分钟过去了,踏过起点的计时地毯,前面这 500 米开始慢跑,晚上提不上速度,人太多了,道路旁边挤满了观众,很奇特的感觉,过去我是观众,现在我也成为跑步者中的一员了。
这次比赛没有给自己太多压力,我的目标是希望 2 个半小时内完赛就可以了。赛前两周的 15 公里以上的长距拉练告诉我问题不大,因此也没有太多心理压力。只是希望自己前半程能压住速度,保持 6 分半左右的配速,然后 15 公里后能保持住配速就不错了。
但是想法是美好的,可是你看着一个一个人超过你,会不自觉地加快脚步,人流在快速的流动,你不由自主地也会被带动起来。我只好不断地看表,强迫自己慢一点。不过后来看手表,还是前 10 公里还是跑太快了。果然过了 15 公里,右脚小腿隐隐有抽筋的感觉,虽然最终没有发生,还是在 18 公里左右的饮水点停了会,拉伸了下,然后继续跑。配速直线下降到 7,然后又悲剧地跑到了钱塘江大桥上,长长的坡我小跑着上去了,但是长长的桥面跑的让人绝望,没有一个补水点,也没有观众加油,很多人都开始走路了。只是我心里还有一个小小的坚持,我是来“跑”步的,绝不能走着到终点。
最后一公里是在自我激励中度过,不停地念着“提腿、提腿、提腿”,到达终点,踏过计时地毯,手表停留在 2:24:22,志愿者告诉我去红色遮阳伞的地方领奖牌,哇,还有奖牌,马上跑过去领了下,分量很重的牌子,做工也不错,这个要赞下。后来在回来的公交站碰到两个跑友,他们没有奖牌,我估计组委会没有准备足够多的奖牌给所有 3 个小时内完赛的朋友,听说会补上。
杭马的整个组织给我感觉很混乱,虽然我也没参加过其他比赛。混乱体现在报名、起跑、补给点、赛道封闭以及终点上,报名网站做的太烂(相比上海马拉松官网差太多了),志愿者的信息不足一问三不知,补给点不合理,赛道没有完全封闭,看到几次电动车横穿马路,半马奖牌不够,终点也不提供一点食物,人群疏散也很混乱等等。不过,我想我明年还会来,我对杭州还是很喜欢的,观众真的很热情,妹子也很养眼,天气也很适合跑步,全马的赛道确实称得上很美。
整个跑步的过程,其实没有太多描述,跑步的时候想什么?就跟村上说的,想了很多,到最后其实都忘了想什么。几个观察和感受可以提一下。首先,很多妹子真的很能跑,看着她们轻盈的步伐,我表示很羡慕。其次,观众很热情,好多家长带着小孩来路边加油,和观众击掌的感觉真棒。最后,跑步虽然是孤独的运动,但是这种群众性的赛事,更像是欢聚的节日,大家不仅仅是来跑步,更是来参加一次聚会,一次互动。总之,非常享受这次半马的过程,虽然回来之后到现在腿还在痛,不过呢,我又定了个目标:明年,咱整一到两次全马试试?
Posts
随笔
30 岁 按照周岁来算,马上要满 30,没有特殊的感受,也没有丹田火热,任督二脉将通的征兆。大多数意义,都是人赋予的,时间逐渐流逝,无论是绝对还是相对,跟人本身,没有太大关系。因此说 30 岁如何如何,太矫情了。
30岁后,还是该吃饭就吃饭,该上班就上班,革命还是请客吃饭上厕所。
社交网络 在微博,在微信,在这个博客上,你不知不觉就扮演某个角色,或者是卖萌,或者故作轻松,或是冷嘲热讽超然世外的模样。如果你将这应用还安装在手机上,未来还将出现在手表、眼镜甚至衣服上,我们的生活将完全地“永远在线”,永远时刻在扮演某个角色。无论何时何地,家人朋友聚会,公交马桶火车,拿出手机来看看是不是成为习惯了?社交网络,反而让你我失去了“社交”,留下的就是低头党横行。
我们渴望交流,但是却在真实的聚会上反而不知道如何交流,反而在网络上指点江山、呼朋唤友。我感觉相当奇特。又一个技术悖论?技术如何让社交更美好,目前的形式还远未完美,仍然是有可为的地方。
技术是新的鸿沟 技术极大地改变了生活,改变了这个世界。但是技术其实也极大地拉大了贫富差距。最近读一本书《与机器赛跑》,里面提到美国的中产阶级收入中值在走低,而不是上升。是中值,而不是统计局最喜欢的人均值。技术极大地进步,但是收入却没有,因为技术越来越快地替代人类,从过去认为非常困难的无人驾驶汽车,智能语音翻译等等技术的进展来看,这个加速过程的趋势就是用机器来代替人类。既然你的工作是越来越可替代的,你的“价格”就要下降。
而掌握了 xx 核心科技的精英人群,利用技术更快速更惊人的聚集起大量财富,无论是中国还是美国,贫富差距都在拉大,占领华尔街和占领中环都是一次启示。这就像蒸汽机发明后的工业革命,机器替代人类,将工人阶层压榨到极致,乃至马克思要写《共产宣言》来鼓动无产阶级,但是随着两次世界大战的财富再分配和资本主义的自我改良,财富不均的问题其实得到了重新平衡。而现在,似乎又一个轮回开始了,会诞生什么主义?还是第三次自我毁灭?效率与公平,真是永恒的矛盾。
人与高级动物 最近一直在想一个场景,进进出出写字楼,在写字楼和居民楼之间奔波的人们,跟蜜蜂和蚂蚁有多大的区别?从出生、接受教育、成年进入职场、结婚生子、老去,贯穿这一切的线索是工作,大多数人工作都是为了谋生,我估计生命里 50% 的清醒时间其实都贡献给了工作。毕竟没有工作,我们会没钱吃饭,没钱买房,没钱买肾6,没钱供孩子上学等等。
而蜜蜂和蚂蚁呢?贯穿他们的一生的还是什么?为了生存不停地“工作”。那么,我们跟它们的区别在哪里呢?人,仅仅是窦唯唱的“高级动物”吗?
我在想,我们大多数人真的太多的时间都被外在的事务占据了,而遗忘了作为“人”的价值在哪里。人生短短几十年,这个问题还是稍微值得思考下。
信任驱动开发 用户使用我们的产品,除了付出精力和费用之外,最宝贵,我觉的还是信任。我信任你们,才用你们的东西。而信任这种东西就跟时间一样,逝去了就基本追不回来了。
所以,我在想,除了需求驱动之外,信任驱动可能是更感性的表达方式。为了赢取用户的信任,我应该做到什么,为了保护用户对我们的这份信任,我应该去做什么。尊重信任,就是尊重自己的荣誉。