@Lenciel

Use Done List Instead Of To Do List

nerd sniping

xkcd一直是本座最喜欢的网站(嗯哼)。上面这幅图说了一个很有趣的现象,正好最近深有体会,就来这边吐槽一下。整个经过是:

大前天回到家感觉不算太忙,本座就开始家姐布置的家庭作业:做一个用于心理学测试的游戏。需求简单来说就是:

  • 游戏开始后轮转播放图片、视频或者音频 (媒体库要容易换,播放的切换间隙也要能配置)
  • 被试通过操控手中的手柄表达心理的反应,由程序转成可统计的数据(比如看到美女图按同时按下AB)
  • 程序得到的数据能够很容易的被统计,统计结果能够很优雅的呈现出来

为了让这个事情变得更有趣,本座在需求确定之后决定:

  1. 用帅气的Wii Remote来让被试表达自己(想想美女图片一出就甩或者是撸一下WiiRemote有多实在)
  2. pyGame来写这个游戏(早就想学习pyGame了)
  3. 把统计数据的输出作为一个用R语言实现的统计绘图的界面的输入

接着就开始第一项。当程序把 Wii Remote 的蓝牙信号正确的转换成标准的手柄信号的时候,一看已经挺晚了,本座就只好把后面两个放在了 todo list 上。接着这两天都很忙这些东西就继续的呆在 todo list

然后今天又找到时间,本座就开始用 pyGame 写游戏本身部分,但突然觉得vim下面自动补全很烂,就开始google合适的插件。花了10分钟左右发觉不少人说 pydict 好,本座就又花了15分钟左右去配置。然后看着chrome里面为了搜索插件弹出的一堆tab突然本座发现:

经过了4天,本座把Wii Remote用蓝牙连到PC输出手柄信号,本座有了一个不错的vim下开发python的环境,本座还学习了一点儿R。唯一没有开始的就是,嗯,还没有开始写那个游戏。

你的情况可能具体细节和我不一样,但是结果估计都是南辕北辙:你是网页设计师,在需要画 wireframe 的时候花了一大把时间去看搜索出来的新鲜的、华丽的 CSS3 效果;你上淘宝买手机结果研究移动电源用了4个小时;你想学怎么养花结果因为选盆子下面水漏的形状耽误了。

这种情况之所以对你的效率有很大的伤害是因为:

  1. 你认为你是在完成自己 todo list 上的东西,所以你觉得自己是在“进展中”而不是“瞎逛”。
  2. 你认为的进展给你带来了更多 todo list 上的东西,而且有些确实对原来的目标是无益的。

人的精力是有限的,如果你长期处于这种状况(太正常了,如果你是玩电脑的话),可就要小心了。

其实这种发散的工作方式并不是完全错误的。其实在我们这个行业,这种“总想追求更好”的想法,是整个Agile的基础。Facebook在自己的员工的邮件里面写到:

The Hacker Way is an approach to building that involves continuous improvement and iteration. Hackers believe that something can always be better, and that nothing is ever complete. They just have to go fix it — often in the face of people who say it’s impossible or are content with the status quo.

从本座自己的感觉而言,做事循规蹈矩的同事,完成一般难度的任务时,效率确实很高。但是那种真正非常困难的问题,常常是被喜欢“瞎逛”的人解决的。这当然也没什么奇怪的,所谓闭门造的车,出门就只能合辙。Richard Hamming也

I notice that if you have the door to your office closed, you get more work done today and tomorrow, and you are more productive than most. But 10 years later somehow you don’t know quite about what problems are worth working on … He who works with the door open gets all kinds of interruptions, but he also occasionally gets clues as to what the world is and what might be important. ….

不能闭门造车,又需要有固定的输出值,怎么办?今天本座是这么办的:

  1. 早上起来把今天最重要的事情从todo list里面选出来。
  2. 完成这些事情的过程中遇到任何有趣的东西或者想法,存到delicious或者evernote里面。
  3. 使用Done list而不是todo list来标记自己今天的活动。

结果是今天3点钟就完成了所有重要的事情,能够来安心的写一篇blog,看起来是个不错的办法。

Blog with Octopress and Github pages

不知不觉,写blog好像从有电脑的人都要干的事情变成很小众的活动了。除了人到了一定年纪都会不愿意开口讲话之外,本座觉得还有个很大的原因就是:要找一个靠谱的blog服务商是非常麻烦的。岂止是是blog服务商,在天朝使用大多数web服务都很吊诡地只有两个选择:

  • 没有被墙但很糟的;
  • 很不错但被墙了的;

所以虽然知道Github可以免费host任何静态页面很久了,眼看着Octopress也日益成熟,但一直都下定决心去试:谁知道哪天Github又被墙了呢?

不过,在最近自己的职业生涯发生了不小的变化,在可预见的未来,肯定要做很多跟code有关的笔记。现在的blog系统是wordpress,虽然非常好用,但是比起markdown来说,写起code来速度就差太多了。所以今天下定决心试了一把Octopress+Github Pages,效果非常满意,特别记录一下过程,像大家做个推荐。

Jekyll&Octopress

Octopress是在Jekyll基础上进行的开发。Jekyll作为Ruby开发的静态页面blog系统,吸引本座的地方在于:

  • 静态页面:由于Jekyll生成的都是静态页面,意味着这些页面可以在任何地方被host,比如Github Pages,Google Drive甚至是Dropbox都可以作为选择(当然它们也基本是被墙的)。
  • Markdown:Jekyll的日志因为是用Markdown写的,相比传统的Blog系统如Wordpress而言,一方面在写的时候可以用你顺手的编辑器,另一方面储存和版本管理也方便得多。
  • 代码插入方便美观:Octopress对日志中嵌入代码提供了各种方便

Mac下的安装设置过程

Xcode

  • 升级Xcode
  • 启动Xcode,在Preferences里面选择下载
  • 安装"Command Line Tools"

Homebrew

1
2
3
4
5
brew update
brew outdated|xargs brew install
brew tap homebrew/dupes
brew install apple-gcc42 git
brew upgrade

rbenv

首先如果你本来是用rvm,需要删除:

1
rvm implode

然后安装rbenv以及Ruby1.9.3-p194:

1
2
3
4
5
brew install rbenv
brew install ruby-build
eval "$(rbenv init -)"
rbenv install 1.9.3-p194
rbenv global 1.9.3-p194

安装完毕之后需要在你的环境变量中做一些设置,比如本座用的是oh-my-zsh,就需要在~/.zshrc里面加上:

1
2
3
4
5
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
# required for https://github.com/imathis/octopress/issues/144
export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UTF-8

注意在环境变量设置完毕之后,最好把$PATH打出来看看,确保没有其他版本的Ruby被启用了,特别要注意/Users/***/.gem/ruby/***/bin这样的路径。

安装Octopress

首选在Github上创建一个repo来放blog,命名规则是username.github.com(比如本座的就是lenciel.github.com)。

然后在本地建立一个repo把octopress弄下来:

1
2
3
4
5
git clone git://github.com/imathis/octopress.git lenciel.github.com
cd lenciel.github.com
ruby --version # should read ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin12.2.0]
gem install bundler
rbenv rehash

然后部署到刚才申请的repo上面去。虽然Github Pages自己有个废柴说明页面,但是看完之后一般你是不知道如何算是部署成功的。好在Octopress已经内建了交互式的配置和部署的命令:

1
2
3
4
rake setup_github_pages
# Example repo url: git@github.com:lenciel/lenciel.github.com
rake install
rake generate && rake deploy

然后你需要调整一下.git/config文件把自己的项目设置成新的origin:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
[remote "origin"]
  fetch = +refs/heads/*:refs/remotes/origin/*
  url = git@github.com:lenciel/lenciel.github.com
[remote "octopress"]
  url = git://github.com/imathis/octopress.git
  fetch = +refs/heads/*:refs/remotes/octopress/*
[branch "master"]
  remote = origin
  merge = refs/heads/master

这样一来,你就即可以从octopress/master取到更新,又可以往origin/master去push自己最新的日志了。

使用Octopress

新建文章

1
rake new_post\["Blog with Octopress and Github Pages"\]

这里要注意使用zsh的时候,对[]要转义成\[\]不然会报错。

编辑文章

1
subl source/_posts/2013-03-10-blog-with-octopress-and-github-pages.markdown

subl是本座在mac上使用的编辑器Sublime Text 2的命令行命令,它的markdown插件Markdown EditingOmniMarkupPreview非常好用。

Markdown Editing

Markdown Editing对语法高亮,粘贴超链接,样式化,加footnote等都做了很好的支持:

Sublime with Markdown Editing

OmniMarkupPreview

OmniMarkupPreview支持Cmd+Alt+O在你指定的浏览器里面预览并且动态刷新你正在编辑的Markup文档。这样你就可以不用不停的rake preview了。

更多