回家换驾照

一些吐槽。

驾照即将到期,回老家换。

第一天。

上午11点到,问,曰没号,下午来。遂去找咖啡馆办公。

下午4点半到,说可以等,但是电脑坏了,不一定等得到。4:45 开始叫号,基本上没人。问之,答里面排着队,白天电脑坏了没办完。过了会儿,开始驱散门口排队人群。问,曰明日8点来取号。

第二天。

7点起床,吃饭打车,门口排队者约10人。8点,协警开门发号,幸得03一枚。

8:30 开始办理。旁边违章处理一直在叫,我方换照没有动静。问之,曰电脑又坏了,赶紧去其它大队,也能办;别在这儿等,没点。

如此动作一直持续了半个小时。我觉得其中有诈,犹豫再三,没走。半小时后,02,又10分钟,03。进去2分钟,搞定。

结语:在老家办事儿需要各种社会经验。希望我的孩子们不需要这些社会经验。

WebSocket.onerror 没有错误描述

用 WebSocket 时遇到一个问题:有时候连接出错,我希望把错误描述报告给用户,方便他们排除。但是尝试了好几种方法,都无法获得错误描述。

于是只有 Google 之,发现了这个答案:https://stackoverflow.com/questions/18803971/websocket-onerror-how-to-read-error-description。原来是为了防止开发者利用 WebSocket 搞破坏,扫描特定条件下的网络,WebSocket 的 ErrorEvent 只包含一个 error,没有更进一步的描述。oncloseCloseEvent.code也只有 1006——非正常退出,这样毫无价值的信息。 

所以我的处理方式是:建议用户按 F12 打开开发者工具看错误信息。

在 Pug 模板中使用变量

如何在 Pug 里,把变量注入父模板。

我厂使用 Pug 作为 HTML 的预编译工具,写久了发现回不去了……Pug 写起来很高效,看久了习惯了阅读效率也很高,读了读文档,发现还有很丰富的可编程特性。于是我决定抛弃 Handlebars,以后都用 Pug 写模板了。

这次我厂官网改版,我就用 Pug 替换了 Handlebars,于是 build 脚本一下少了几十行,非常爽。其实我早就想这样做,不过卡在一个点:使用变量。

在 Pug 里可以这样使用变量:

- var name = 'meathill'

h1 hello #{ name }

以上代码将输出 <h1>hello meathill</h1>。这种用法比较简单,不过在 extends模板的时候,把变量放到哪里就不知道了,官方文档也语焉不详,我反复试了很多次无果,最终还是靠搜索找到了答案,原来要这样:

// Layout.pug
html
  block vars
    p 注意,这个 block 是重点,它出现在前面,用来注入变量
  head
    title #{ title } | My site
  body
    block content

// page.pug
extends Layout

block vars
  - var title = 'A blog'
  
block content
  h1 Blog title
  p blog content

理想的远程办公咖啡厅

我认为一二线程序员下沉到三四线城市之后,远程工作应该会更有潜力。其中,远程工作咖啡厅应该是个不错的方向。我理想中的远程工作咖啡厅应该是这样的。

昨天 @Easy 老师发了一条微博

之前问过一个问题:「在共克时艰和消费降级的大背景下,有哪些行业和生意会逆流而上呢?


昨天和墨多扯淡,他说搞一个「面向美元市场」但是「研发在国内」、「销售完全依靠网络」而且可以「远程办公」的「商业SaaS/APP」是最符合「时代的进程」的。

因为:

① 收入直接是美金,扛贬值,无管制。

② 经济如果下行,国内成本会进一步降低。

③ 一线城市房租房价高涨,远程办公可以吸收足够优秀的同学去二三线城市。

④ SaaS/APP 不好搞的话,其实外包也行,但要做好外语沟通和客服。还可能需要一个外语好的产品经理


我问他为啥不搞一个,他说懒

我不太看好这个想法。原因如下:

  1. 想要做的正规,必须给国内的工作人员发工资,上社保。当然可以大家协商发多少人民币,多少美元,不过维持家庭开支钱不会少,多半整个工资都发掉了。
  2. 发币的话,我是信不过……
  3. 远程工作并不适合所有人,有些人(比如前文中的小弟)可能在办公室里能发挥100%的战斗力,回到家连一半都做不到
  4. 说了半天都跟项目无关,其实项目本身也有很大风险

如果让我说,最合适的项目是做远程办公咖啡厅,类似 3W 咖啡或者车库咖啡之类。遗憾的是,这两家我都没去过,不知道里面办公是什么体验。不过我去过贝塔咖啡,咖啡部跟一般咖啡厅一样,并不舒服。结合我两年的远程经验,说一说理想的远程办公咖啡厅吧:

  1. 桌椅高度要合适。
  2. 可以租用显示器,借用笔记本支架。
  3. 可以租小柜子存放私人物品,不用太大,游泳池那种小的就行,放个充电宝、随手带的小物件之类。
  4. 咖啡符合一般品质,电信能达到星巴克品质。
  5. 交通方便,不需要营业太久。

我觉得价格可以在星巴克基础上上浮二三成(咖啡30+,饮品40+),这样我也愿意接受。其实大部分需求共享工位都能满足,但是利用率太低,而且咖啡厅嘛,听起来 B 格高一些。

从零和博弈说开去

生活在现代社会,我们无时无刻不在跟他人协作。如果你细心观察,就会发现,越是高层次的人,越喜欢谈合作;反观底层民众,越是底层越喜欢互害。很多时候,眼界决定人的高度。希望大家今后,多多发现合作共赢、多和博弈的机会,尽量避免零和甚至负和博弈,提高生产效率,提高生活品质。

  1. 什么是零和博弈
  2. 为什么要避免零和博弈
  3. 分辨现实中的零和博弈
  4. 改变零和博弈的习惯
  5. 寻找合适的合作者,与他们一起多和博弈

什么是零和博弈

“零和博弈”并非什么稀罕的名词,相信很多同学都知道。就是说在博弈的过程当中,参与博弈的人的利益的总和是零,换言之,就是核算收益时,你多了我就少了,我多了你就少了。就是零和博弈。

那么很自然,如果参与博弈之后,所有人的利益总和会增加,就较“多和博弈”;如果博弈之后,所有人的利益总会只会减少,那么就叫“负和博弈”。这些概念应该都不难懂,我们后面讨论零和博弈。

为什么要避免零和博弈

零和博弈会使得参与博弈的人的目的和眼光发生变化,逼迫大家不再关注“如何把事情做好”,而是关注“如何让自己的利益最大化”。

原因很简单:因为无论你怎么努力,总收益就这么多,一个人多了,另一个人必定会少。桌上就一盘菜,菜里就二两肉丝,甲多夹一筷子,乙自然少吃一筷子,反之亦然。

抱定这种想法的话,多半会产生两个行为模式:

  1. 如果不那么努力,就相当于减少了自己要付出的时间成本和精力,假如这样还能维持原本的收益不变,就等于变相提高了自己的收益率。
  2. 尽量把收益拢到自己的盘子里,先下手为强,活儿不着急干,锅要赶紧甩。

总之,都是在保证甚至提高自己收益率的同时,少干甚至不干活。至于事情能不能做成,天塌下来有个高的顶着,事到临头有愿意干的人顶着,没关系。

分辨现实中的零和博弈

抽象的概念听起来有道理,不过有些同学会说:这与我何干?我可是很努力的!

其实不然,据我观察,很多同学都在有意无意的陷入零和博弈的思维模式,继而种种错误。

就拿我最近的一段经历举个例子吧。有朋友找我做一个小程序,不复杂,垂直交友类型的。用户只要先发出一个交友贴,就可以查看其他用户的交友贴,对对方感兴趣就可以获得对方的联系方式,然后自己去联系,平台不干预。大概就是这样,很简单。

因为逻辑很简单,页面也不多(大概十个),所以我就找了一个以前的小弟帮忙,算是转包,他负责开发,我负责验收。有钱大家一起挣嘛,说不定将来还有更多的可以合作的机会。

结果拿到他交付的作品,我一看,简直傻了。糟糕,非常糟糕,超乎我的想象的糟糕。

  • 首先他用了一个蓝湖还是什么的工具,切出来的图片非常奇葩,设计稿明明是750宽,但是导出的图片是1135的。
  • 同时由于设计稿是 PSD 的,所以有一些地方没有做到精确控制,而是用蒙板之类的把多余的部分给隐藏了。结果切出来的图,各种奇奇怪怪的分辨率都有,甚至文字都不居中。
  • 开工之前,我专门打电话给他解释的页面逻辑,但是他交付给我的几乎只有单页,之间的业务逻辑几乎没有体现。
  • 后退一万步到页面制作细节上,也糟糕至极。前面说了,用户要发求友帖,所以需要一个表单,是产品里最重要的表单。结果在手机上预览时,竟然看不到提交按钮,必需滚屏才行。

总之各种糟糕,我只好彻底返工。

接下来我就开始反思,问题出在哪里?我会找他,其实对他还是很信任的。结果他竟然交付这么差的作品,难道他认为这样就能通过我的验收么?难道他觉得这个样子能通过甲方的验收么?

最后我认为,他的核心问题,就在于用纯粹静态的、局限的眼光,把整件事情当成了零和博弈。

在他的眼里,这是一件很固定的事情:他做出一套页面,老板总共给好比说100块,我扣下20,剩下给他80。对他来讲,这件事情的构成就是我们支付的成本 + 我们获得的收益。如果他想多挣一点钱,有两个办法:

  • 向我多要一些钱。但是这个很难,因为总金额是固定的,大家要完成的工作也是固定的。我多给他钱,我就挣的少,我就亏了。
  • 做得差一些,少付出一些时间成本和精力。

于是他选择,用最粗糙的手法完成产品。但是不清楚什么样的结果能通过验收,所以打算先做到最差,然后一点一点往上改,直到验收为止。这样就可以付出最少的成本。

我相信这并非他深思熟虑的结果,而是简单凭借本能和直觉做出的下意识的决定。

改变零和博弈的习惯

这其实是现实中非常典型的例子。很多同学并非主观想把这些事情搞成零和博弈,但是在固定化、局限化的眼光下,下意识的做出不良角色,导致事情零和化。

实际上,尤其是接包这类事情,非常容易产生多和博弈的结果。我们把作品做得好一些,主动加一些视觉效果,帮甲方把逻辑不合理考虑不周全的地方改好,甲方自然就更愿意付费。而且甲方下次有开发需求的时候,也会主动的来找我们。

如果把眼光再放得一点,其实我们跟甲方也可以形成多合博弈。产品做得好,他就更容易向他的老板,申请费用、申请资源。

索性我们把眼光再放大一点,我们和对方公司,也是一个多和博弈。我们的作品越优秀,他们就越容易在市场竞争中取得优势,公司的收益就越高,他们也就越愿意拿出更多的收益来和参与这个项目的人一起分享。

通过上面一系列对比,大家应该可以很明显的看出,什么是零和博弈,什么是多和博弈。关键就在于,我们不能把自己的眼光,局限在眼下这两个人,局限在眼下这一件事,要学会从日常的协作中,发现多和博弈的机会。

寻找合适的合作者,与他们一起多和博弈

可能会有同学会说:但是我做的好的时候,也不见得能拿的多呀?

这当然是可能的。前面说过,很多人无意识的,就把协作搞成零和博弈。这种情况下,作为协作者之一,我们可能难以扭转大局。但这绝不是拒绝多付出的理由,如果你总是以这样子的理由麻痹自己, 反复交付最差的作品,那么你只能一辈子都做 loser。

我们要做的,是从源头上杜绝自己被困在零和博弈的环境中。我们需要早早的去识别自己的合作伙伴,认清自己的老板、自己的公司、自己的行业,我们不要把自己困在一个只能和别人做零和博弈的环境,我们要去努力创造大家一起多和博弈的机会。

最后,我们也十分有必要帮助其他人认清多和博弈。如果你发现对方,在明明可以多和博弈的时候,试图和你做零和博弈,那你一定要争取改造对方的想法。如果对方完全没有改造的余地,那么我觉得放弃这次合作的机会也无妨。毕竟天下有那么多聪明人,有那么多值得争取的好机会。

总结

不仅仅是外包,生活在现代社会,我们无时无刻不在跟他人协作。如果你细心观察,就会发现,越是高层次的人,越喜欢谈合作;反观底层民众,越是底层越喜欢互害。很多时候,眼界决定人的高度。希望大家今后,多多发现合作共赢、多和博弈的机会,尽量避免零和甚至负和博弈,提高生产效率,提高生活品质。

前端驱动的 WordPress 主题开发

这次分享主要面向懂前端,对后端了解有限的同学。如果你想用 WordPress 开发网站,尤其想挣点小钱的话,这个视频应该对你很有帮助。这段视频中我没有深入 WordPress 开发的细节,而是以前端技术为主,将我如何尽量使用前端技术完成企业网站搭建的新的和盘托出。

这次分享主要面向懂前端,对后端了解有限的同学。如果你想用 WordPress 开发网站,尤其想挣点小钱的话,这个视频应该对你很有帮助。这段视频中我没有深入 WordPress 开发的细节,而是以前端技术为主,将我如何尽量使用前端技术完成企业网站搭建的新的和盘托出。

同时这也是补全《一起挣外快吧——环境搭建+万能的WP+前端如何玩转WP》。

B 站链接:https://www.bilibili.com/video/av31991750/

远程办公的环境选择

这个其实是我在 V2EX 跟帖的内容,觉得可能帮到我的读者,所以这里也发一次。

两年远程工作经验,给楼上各位分享一下固定工位的好处:

  1. 稳定性,受环境影响小。图书馆位置很紧张,尤其暑假;咖啡馆适合写代码的位置并不多,比如没有插头,比如桌椅不合适,比如旁边有人在连吃鸡;家里全是噪音源,老妈老婆孩子狗。
  2. 可以放显示器。这个其实很重要,笔记本的位置很低,使用时处于低头状态,脖子非自然弯曲,久而久之强直性颈椎病,手脚麻痹。不是耸人听闻,我现在已经不敢久用笔记本,大大减少了在咖啡厅的时间。 

坏处:

  1. 费用高。广州工位租金普遍在 1200/月以上,最便宜的方圆 E 时光 600/月,一年下来 7200,可以买 iPhone 了。
  2. 利用率低。远程工作不考勤,随时可工作。我厂老板在美国,早上起来第一件事就是翻聊天记录,很可能接下来就开工,弄完到午饭时间了,一上午没去;天气热,不想走路,不去;停车费贵,不去;老婆 /朋友 /老妈 /孩子要去某个地方,当司机,不去……一年下来一半时间都空置。
  3. 网络不好。共享空间共享宽带,均下来每个人都是小水管,我经常开手机热点,不然太影响效率。
  4. 冷气不足。相对于商业空间默认 24、25 度的配置,共享办公几乎不会低于 26,女性多的地方经常 27、28 度,热死个人。

我已经退掉了租的工位,准备还是自我调整:

  1. 工作集中在上午和下午 5 点前完成,基本和孩子上幼儿园时间重合
  2. 跟家里沟通我需要独立的工作环境,他们也渐渐知道怎么配合了
  3. 中午出去觅食,顺便在咖啡厅坐几个小时,充分利用免费停车的时间

V2原帖:成都有没有自由职业的同事想一起租个办公室啊?

文档的最佳实践

文档应该写“要干什么”,“为什么要这么干”,“准备怎么干”。不要写“是怎么干的”。因为需求在变、环境在变,如果把实现的细节写到文档里,将来和代码实现不一致,就会让使用者、维护者迷糊。
所以我们应该用格式化的数据来写,用稳定的数据接口,一次性输出文档、测试、mock 数据。本视频简单演示做法。

指导群里的小伙伴做小项目 应用创意:Chrome 共享首页,有两位同学主动领命,分开前后端就开做。结果我发现他们对文档的处理非常幼稚……所以便有了这样一个分享。

我的观点:

  1. 文档当然要写,但不要用自然语言这样写一大篇
  2. 文档如果不好好维护,将来表现和实际代码不一致,会造成更大的问题
  3. 所以开发者应该用更强的方式约束文档和代码,而不是大家主观协作
  4. 所以我们——尤其在前后端协作的时候——应该写格式化数据结构描述,然后通过编译的方式,用数据结构描述输出文档、测试、Mock Data

下面是视频:

应用创意:Chrome 共享首页

想做一个 Chrome 插件,替换 Chrome 默认首页,让大家共享收藏夹,这样我就可以跟群里的小伙伴更好的分享内容了。

想做一个 Chrome 插件,替换 Chrome 默认首页,让大家共享收藏夹,这样我就可以跟群里的小伙伴更好的分享内容了。

应该具备的功能:

  1. Chrome 首页插件,自动加载无版权美图
  2. 群主创建一个群组,生成一个 32 位的 hash 值
  3. 其它同学输入 key 加入群组
  4. 群主可以设置桌板块、布局等
  5. 其它同学可以提供自己的链接,群主审批后进入首页

未来考虑的功能:

  1. 大家可以针对分享的链接进行评论
  2. 大家可以收藏点赞链接
  3. 支持多群组
  4. 支持应用/小程序加载共享链接