治大国若烹小鲜。做 hackathon 也是如此:需要有合适的方法(能),合适的工具(贤),然后朝着目标方向不疾不徐,缓步前进(有所为有所不为)。
我们今天来谈谈方法和工具。
我的方法论
清晰可见的目标
我喜欢在做一件事情前把目标能够表达清楚,然后脑海里有一个当我成功达到后这东西该长什么样的草图。这是我从我以前的老板 Oliver 那里学到的(见:途客们的旅行梦 - 启航,收录在我的书《途客圈创业记》中):
《高效能人士的七习惯》里作者也反复强调:以终为始(Begin with the end in mind)。
Siri 创始人 Adam Cheyer 说他创业的第一个原则是:VSG - Verbally Stated Goals。
而 Ray Dalio 在其《成功的原则》(Principles for success)视频中,同样有类似的表达:
在做这个 hackathon 时,我的大目标是 Elixir 上 data science 工具集的支持,它具体的呈现就是在 Jupyter notebook 上那一行行可以执行可以可视化的代码。对我而言,pandas 就是悬在天空的那颗北极星。所以从头到尾,我都有很清晰的目标,而每走一步,我都知道自己离目标还有多远;每隔一段时间,我都知道自己跨越了哪些里程碑。
统筹方法
有了清晰的,可视化的目标后,就是如何高效地不断逼近目标。不知道大家是否还记得小学的课文《统筹方法》。我对烧开水的那个故事记忆犹新。google 了一下,我把课本原文贴在这里:
比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶茶杯要洗;火生了,茶叶也有了。怎么办? 办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。 办法乙:先做好一些准备工作,洗水壶,洗茶壶茶杯,拿茶叶;一切就绪,灌水烧水;坐待水开了泡茶喝。 办法丙:洗净水壶,灌上凉水,放在火上,坐待水开;水开了之后,急急忙忙找茶叶,洗茶壶茶杯,泡茶喝。 哪一种办法省时间?我们能一眼看出第一种办法好,后两种办法都窝了工。
小学生都懂的道理,但真正实践起来,我们却往往用办法乙或者丙。
hackathon 其实有两条线:一条是所做的产品,另一条是所用来展示的例子和演示文稿。很多人都会在代码结束后才着手演示文稿和样例,这就会让一切变得很仓促:要么为演示文稿预留时间,做产品的时间有一个硬性的截止时间,到时间产品没做好,只能硬着头皮在 ppt 上吹;要么最后一刻赶工,产品做好了,没工夫好好吹,演示演砸了。那么,如何兼顾这两条线?
其实,对我来说,还有第三条线,就是对应的公众号文章 —— 我希望我能把自己探索过程中的心得体会写成文章输出出来。
我在开工的同时,准备好了 demo 要用的 slides 和 Jupyter Notebook,我用 Marp 做 slides,在 vscode 里安装了 Marp 和 Jupyter 的插件,这样,我可以在同一个上下文中编辑代码和文档。我还打开了 notion,把开发中遇到的问题随时记录下来。有朋友好奇为啥我开发过程中遇到的问题都能在公众号文章里记得如此清晰,其实那些内容就是我遇到问题的时候顺手记录在 Notion 里的记忆碎片组织而成的。当我遇到比较难搞的问题的时候,我就将其记录下来,记录的同时琢磨解决方法,然后解决之。
然后「有空」的时候我就将记录整理到 slides 中。每次阶段性做完一些东西,编译时,就是我写 slides 的时间。我在 ex_polars 里用了太多的宏,所以它的编译速度奇慢无比。此外,要在 IElixir 里尝试自己最新的代码,也需要吭哧吭哧地编译,这个时候就是最好的暂时从编码中抽离开来,站在三万尺的高空中,俯瞰总揽刚才所做的一些,高屋建瓴地把 Notion 里的记忆碎片整理到 slides 里的时候。
统筹方法不光是去用最合理的方式去安排时间,提高做事的效率,还意味着「要事第一」。我的第一个 milestone 是搞定输入输出:读入 csv,得到 dataframe,并将其展示出来:
因为我知道,当我完成这个看似简单却极其重要的流程后,我的 ex_polars 其实就已经完成了 80%,这两个函数及其背后的数据结构把项目中最重要的任督二脉打通,剩下的三百多个函数无非就是一点点码代码,做好码农搬砖的本分而已,剩下的交给时间。
我的开发工具箱
所谓「工欲善其事,必先利其器」,好的工具是提升效率的保证。
Marp
这两年我做 slides,基本都是使用 Marp。Marp 是一个使用简单,但效果很好的基于 typescript 的演示工具。你可以撰写 markdown 来制作高质量的演示文稿。自从有了它,我便很少使用之前一直在使用的 reveal.js 了。Marp 本身我就不详细介绍了,可以去 marp.app 自行浏览文档。
Marp 在 vscode 里有插件,可以在撰写的时候所见即所得。这个插件唯一的缺憾是无法使用我自己定义的 custom.css
,但不影响对 slides 做一个大致的预览。
如果需要更好的预览效果,可以直接运行 marp cli,它会打开一个浏览器窗口来展示 marp 的编译结果。我喜欢写一个简单的 Makefile 将其自动化,这样我按需 make
即可:
MARP=marp --theme $(ASSET_DIR)/custom.css
TOP_DIR=slides
SRC_DIR=$(TOP_DIR)
TARGET_DIR=$(TOP_DIR)/_build
ASSET_DIR=$(TOP_DIR)/assets
run:
@$(MARP) -s $(SRC_DIR)
Excalidraw
Excalidraw 是我近两三个月新觅的宝贝。一般的 UML 图表,我都会用 plantuml,它也有不错的 vscode 插件,很方便使用。然而结构复杂一些的非标流程图或者架构图,就很难直接用 plantuml 表述了,这个时候我会用一些在线的 visio 的替代品。然而这些工具往往免费版都有很多限制。有一天我问我们 CTO 马老师公司里有没有购买任何画图软件的商业授权,他就回了一句话:try excalidraw。于是我就和这个免费并且超级方便的工具结下了不解之缘。如果你读过我近期的文章,你就会发现,几乎所有的架构图流程图我都会用 excalidraw 撰写。无他,方便好用而已。大家可以上 excalidraw.com 自己试试。这是一个开源软件,你也可以自己本地搭一个,随时使用,离线状态下也不妨事。excalidraw 在 vscode 里也有对应的插件,但似乎没那么好用,所以我一直都还是用 web 版本。
为什么说它好用呢?因为它的界面实在是太太太简单了 —— 一共就几种图形和几种基本的配置,十分钟就能上手并且记住一些常用的快捷键。我特别喜欢简洁的产品,因为它们真正做到 don't make me think。和 lucid chart 这样披金戴银浓妆艳抹的妖娆艳后相比,excalidraw 简直就是出水芙蓉,清丽脱俗。
那位问了,这么简陋的工具,能画什么样的图形?其实我们在绘制很多图形时,所使用的元素无非 excalidraw 包含的这几种:方形,圆形,线段,以及文字,我们欠缺的,更多的是把脑袋中的思想可视化出来,这跟工具无关。比如我做的这个:
工具本身并没有限制我。
其实像 excalidraw 这样的好工具反而能解放我的大脑,因为我不再需要焦虑用什么样的图形才能更好地表达(使用 visio 或者类似工具时我总有类似焦虑),我也不再需要焦虑该为图形配什么样的颜色,因为 excalidraw 就支持几种配色,更复杂的配色需要你手工输入代码。所以,我可以完全聚焦于图形本身,而不是表达方式。
excalidraw 可以把图形的源文件存在本地,让你拥有对自己版权的完全掌控。我一般会把他们放在一个 github repo 里,还能进行版本控制。
就这么多。
贤者时刻
可是对大多数人来说,生活的变化是缓慢的。今天和昨天似乎没有什么不同;明天也可能和今天一样。也许人一生仅仅有那么一两个辉煌的瞬间——甚至一生都可能在平淡无奇中度过……不过,细想过来,每个人的生活同样也是一个世界。即使最平凡的人,也得要为他那个世界的存在而战斗。从这个意义上说,在这些平凡的世界里,也没有一天是平静的。——《平凡的世界》