hugodown 是个啥新玩意?
为了让各位心里有个底,我先简单交代一下目前的进展吧。过去几天通过与同事老板以及他个人的沟通,我现在大概明白是怎么回事了:一定程度上他与我有个相同的病症,就是在感知他人的痛苦这件事上对一部分人有盲点。他完全不认为他做这件事带有任何恶意,甚至还认为这样做是为了帮我省事,因为我会少维护一个 R 包。当时我听到这个理由后,硬生生把心里的一次火山爆发强压下去了:在背后偷袭还说是为了帮我?但即使这样,我的理智脑还是可以相信他并没有撒谎,我相信他做这件事是出于心里的正义感——我要为用户解除 blogdown 带来的巨大痛苦、我要给益辉帮个忙好让他减轻维护 R 包的压力。人脑就是这么擅长自我合理化,只要你愿意,你可以给你想做的几乎任何事情找到合理的理由。或者用费曼的话说,自己是自己最好骗的人。
他做这个包的另一个理由,可能也是最重要的理由,是认为我是一个拒绝沟通的人。坦白讲,他并不是公司里唯一一个认为我很难打交道的人。我曾经直言拒绝过一个同事的会议邀请(因为与他前几次会议的无比低效实在让我受够了)。我在公司 Slack 里的签名档也写得很清楚:重要的事情请邮件联系。然后我的 Slack 常年显示不在线,尽管我每天都会打开看一遍。我对这种有一句没一句的即时通讯工具非常排斥,就更不必说推特了。直到现在,他仍然指责我因为拒绝使用和阅读推特而错过了 blogdown 用户之前在那里的抱怨,以至于错失了改正的机会。就这样,他得出结论,认为我根本不在乎与别人打交道,只愿意呆在自己的小屋里自己一手定夺一切。这又让我觉得无比冤屈。如果我拒绝倾听用户的意见,那几百项反馈我都是瞎着眼睛关掉的么,这里面包括他自己提的。如果用我的理智脑想这件事,一定程度上我也可以理解:这问题就出在我们俩在交流工具的选择上完全是站在两个极端,比如我极度厌恶推特(尤其是正式交流比如提问),他则极度喜爱推特,喜爱到总让我想起上一任“推特治国”的总统的程度;我极度厌恶 Slack,他则极度偏爱 Slack。所以,如果推特和 Slack 上看不到我的话,就跟不存在与我沟通的渠道一样。当时我得知 hugodown 出世后的第一件事便是自检:我到底哪封邮件和哪条 Slack 消息忘回了?并没有。所以才有后来一路的憋屈。
黄河在咆哮、用户在嚎叫、我们所有人想找你都找不到、我偷偷砍你一条腿让你轻装前行都是为你好,那还能怎么搞,当然要来这么一刀!然后便听见我一声嗷。等明白过来再补上一句我靠。
总之,我们两个人在太多方面都是两个极端,包括个性、哲学、价值观。他偏爱的恰好是我痛恨的,他投注巨大热情的恰好是我最不屑的。这一点从我们每次开会的背景就能清楚体现出来:他的背景是一面挂着 ggplot2 以及其它净土包六边形图标的墙,都是加大版的图标,加相框后像艺术品一样挂墙上,这个背景在推特上已经被他的粉丝们发出来过好几次(有时候还有他的爱犬坐在腿上,让粉丝尖叫不已,仿佛养狗也显得平易近人);而我的房间背景是一面墙,墙上空无一物,以至于有一次厂长见了问我是不是刚搬家搬进这房子(已经搬进来四年啦),督促我赶紧弄点什么挂墙上。我费这劲干嘛,本来无一物,何处惹尘埃。何况斯多葛告诫过世人,莫要把信仰挂墙上,我已经接受了这条建议。另外一个例子是穿着打扮,他就不用说了,你们都知道,个人主页有高清帅照,而我平时什么鬼样子,绝大多数人都不知道:来美帝十一年从没去过理发店,头发长了自己剃,一律一推子推到底,管它监狱同款不同款;穿衣方面别说什么蝴蝶领结了(这个梗估计不用推特的人不会懂),穿破了洞的裤子我可以照样接着穿,有时候还穿出门,毫不心虚,倒不是因为要抠门,而是对我而言,实在不觉得这算是个事儿。总之,我信奉的极简哲学与他有无法调和的冲突。极简就意味着很多东西都要舍弃,舍弃就要拒绝,拒绝就容易拉仇恨。我的问题出在哪里呢?极简哲学对个人可能是个好事,但一旦出了自己的门,与他人打交道就会四处碰壁、寸步难行,毕竟真心极简的人还是少之又少。我这几年在这个问题上碰壁碰得满头大包,与哈神的碰撞并不是个例,只不过这次撞得比较惨而已。
他无法感知和感受我的痛苦,不是因为他坏,而是他就是有这个盲点,他就是浑然不觉,解释了也不能理解,就像缺少一块生理机能一样。我深知我也有完全相同的盲点。有些人的痛苦我也无法感知,我做过与他相同的事情,伤害过别人后还暗自奇怪,这有什么好受伤的。而在多数人眼中,我们两个人可能都算是共情能力还可以的人,不然怎能精准把握到用户的痛苦、造出好用的软件?(这个因果关系尚待商榷,共情可能只是小部分原因)他是个无情无义无理取闹的人吗?通常应该不是,我应该也不是;他是不会自我反省的人吗?应该也不是(据同事讲、但我自己之前没感受到),我也一样。这次可能是我作为一个与他在太多方面完全相反的人不偏不倚正好走进了他的盲点,他的一系列行为让我感受到窒息性的碾压,而他自己却完全没意识到这是碾压,反而是觉得是在无私帮忙,所以双方都觉得冤屈。
这也算是我的第二次职业生涯危机了。按达里奥说的,痛苦是大自然在提醒我们有什么东西要学。我依旧在思量,这次到底是想叫我明白什么。上面提的感知他人痛苦的盲点算是我学到的第一点。这是我第一次站到了感觉被严重打压的一面,在这之前,通常都是我打压别人。不真正成为受害者,真的是太难体会到受害者的感受,这种体会的能力光靠自以为是的善意和共情,是难以获取的,就仿佛脑子里有一块区域永远无法被擦亮。这几天有个人一直在我脑子里盘旋,就是 data.table 的作者 Matt Dowle。过去两年我一直对他深表同情,但直到这次,我才明白,我的深表同情是多么一文不值。他数年来的冤屈(净土宗有意无意的不公),可能也只能永远埋在黑暗中了:施害者无法理解,而吃瓜群众们更是无暇理解。继而我又想到 Sweave 的原作者,如果我换位到他的角度,现在恐怕也会对我当年对 knitr 的高调宣传感到不公。在软件开发里,后出招的开发者总是比先出招的开发者占优势,因为走后手的人可以享受走先手的人费力踩平的坑,而先手有些坑在历史条件约束下难填,过了一段时期之后也许就好填了,但这时往往又遇到向后兼容的难题,而后手上来则没有这个负担,于是油门一踩,便轻松超车了。这又是我感到冤屈的地方,如果 blogdown 只要晚一年多开发,等 Hugo 再往前更新几个版本,有些难题就可以轻易解决了,而我从 Hugo 0.19 起步,则要费力得多。类似地,Sweave 虽然在代码实现上做得欠缺火候,但它也有它的制约条件,让它无法放开手与我公平竞争,比如它隶属基础 R,改动起来瞻前顾后,更新也要随 R 更新(所以更新节奏只能慢),再比如它只有七百行代码,而我用了几千行外加若干附加包的支撑,若按我如今的极简哲学来看,指不定我会从直觉上偏爱七百行代码的产品。当年我的宣传把 Sweave 描述得如同垃圾,而浑然不知我的后发优势。Sweave 的作者是否暗自感到受伤,我也完全不知。净土宗把基础 R 最臭名昭著的 options(stringsAsFactors)
选项默认值从 TRUE
改成了 FALSE
(不是真改,而是 tibble 采用了默认 FALSE
的行为),大家集体喜大普奔,却没有人愿意再多等两年,给基础 R 一个费力翻盘的机会(R 核心团队自己也痛恨这个默认值,但这种改动并不是一朝一夕能做的)。这种利用后发优势灭掉先手的例子太多了,而被灭掉的人有苦难言,言了也无人倾听。
哈神无法感知我的痛苦,就更不用说感知我的痛苦带来的次级伤害了。比如我因为这件事疯狂赶工而完全忽视了国内的家人,前几天我那打小最怜爱我的姑妈清早给我发了条消息,说美国这么乱、要是我还有点孝心就跟家里人报个平安,让我感到无地自容、抑郁了一整天,我长这么大她从未对我讲过这么重的话。这次我三岁多的二娃也因为我的糟糕心情躺着中了枪。以往我对他的顽皮淘气大吼小叫是家常便饭,他通常无视我的训斥;前几天我实在觉得憋屈,而他像往常一样淘气不听话,我便提高嗓门大吼了他一嗓子(为了制止他的一个危险行为),结果他自打出生以来,头一次被我吼哭了。这也是我头一次对我训斥他而感到内疚,以往训斥都只有生气的成分(有时候是气得真想揍他一顿)。也不知道是因为他被我真正震慑到了一次,还是我这两天对他温和了一些,感觉他这两天都比以往听话了,甚至我看着他因为疫情隔离在家一个人默默玩耍都觉得有些可怜了(我这个狠爹对他还从没产生过这种想法)。这也算是这场风暴中我收获到的一颗小果实吧。
呜呼!是非善恶谁能清,悲喜祸福孰能料;岁月本是流水长,忙者自促奈何焦。
- 已编辑
yihui 关于吼儿子,感同身受,自从年初一次后,我今年没有再做过,大人不应该这样对付一个幼小的心灵。
关于共情一事,不管有意无意,伤害了就是伤害了,我觉得这不能算做一个可以值得原谅的借口。当然这很难,如同你对自己sweave的反省,但至少你在遇到了之后有后悔。如同很多人,包括我,好多时候的蹩脚的借口就是,我没有那个意思。
至于原则问题,那真的是原则或者底线,很难改变,站在巨人的肩膀上,总是这么容易看的更远,但作为一个个开源的项目,到github上岂不是更容易交流一些。还有就是这年代没有强制规定必须用实时通讯工具作为交流的必须品吧,虽然这个世界的潮流是使用微信之类的货,但我还没有报警不是打电话而是发微信等的方式上吧。尤其有的工作是需要专注,有什么工作是需要实时反馈,搞得时间很碎片化呢,有需要的时候,大家开个视频会议讨论好了,提前准备要准备的事情,我觉得这才是主流的做法。
当然我不知道slack是什么玩意,我猜就是qq样子的东西,话说回来,如果能有设置状态或免打扰的设置,谢大可以开着不看,让人觉得无法交流毕竟不是好事情,你也可以博客里解释一下,人毕竟是在社会中,大家可以知道你不爱用的原因,而不是猜测你无法沟通,我相信绝大多数人会理解的。如同你写的你职业危机一样,这能避免很多误解,哪怕有些人不会想到你在github上关闭的问题
yihui 感同身受,我因为关了朋友圈入口这事被我爸妈反复提醒,说谁谁谁发了朋友圈你咋不点赞,微信运动走那么多步很辛苦也不点赞,疫情期也不知道在亲戚群里活跃下之类,要是平辈我也就不搭理了,毕竟大家都忙,长辈这么说确实很折磨。之后妥协的结果就是我一直开着微信运动,那边天天看我还走个十几二十步就知道还没失联,没事还能走两步。
这种情况特别像找邻居借斧子的段子,借斧子路上总想是不是借了就欠了人情,之后会不会被要挟,会不会夺家产什么的,然后邻居一开门,这边怒气冲冲大喝一声:“留着你的破斧子吧,老子不借了”,然后转身就走,留下邻居一脸懵逼。有的时候我是那个懵逼的邻居,不知为啥就得罪了一票人;有的时候我是那个借斧子的人,把事情给想复杂了。但交流这事真是一个人一套体系,也没有完全通用的方法,有时看似无法交流的事吃顿烧烤可能就了了,有时很简单的交流却可能点爆蓄积的压力。个人之间还好些,但要是团体对付个人,那怎么说都是折磨,即便个人可以自省退让,对方不放过或被裹挟了无法放过也很头疼。
不管怎么说,能把问题说清楚最好,交流时双方都留点余地,或许对方就是发泄下,过去一阵就好了。推特/slack确实是很多美国人自认为最合理的日常交流工具,寄托了一些情感在里面,不参与他们就是会觉得你不合群。我观察推特上其实可以通过控制发言时间让别人知道你的节奏(例如每周都是固定时间活跃十分钟,从不回复点赞这类,然后继续消失)。slack本身就通过频道隔离了不相干讨论,但通用频道里也会有类似家长微信群那种排队鼓掌的圈子文化,实时回复其实非常消耗精力并有很强的社交压力,而在线与否的显示有种被监视的感觉,这个副作用可能很多人意识不到而单纯看到了其优点。
在家窝了这大半年能总结的经验就是在家工作也要明确区分工作时间与自己的时间,工作时间显示在线但就上午11点跟下午4点回信息,其余时间有急事打电话,一下班VPN马上断掉,zoom退出去,真要得罪人那也没办法,一个员工过高压力下效率降低对老板也没好处。老板方面他们只管到了死线要结果,其实根本不在乎你怎么实现,只是中间隔了个社区文化这个双刃剑,营造了内部融洽氛围,但也对不认可某种交流方式的人产生了误会与排挤。何必呢,都是打工人打工魂,又没有深仇大恨,我知道“你也是为我好”,也很感激,但我们之间对“好”的看法可能有些许区别而已罢了。
lovebluesky 我对沟通方式的选择,已经在我博客里解释说明过。如果所有人都认为我无法沟通的话,那我没有二话好说,发生这种事是我咎由自取,我绝不抱怨。问题只是公司里有一部分人见了我的说明,表示完全尊重。我知道有些同事习惯使用 Slack(对,就是像微信 QQ 一样),但要联系我的时候都特意用邮件。唯独净土团队似乎是坚持使用 Slack,决不妥协,什么事情都在那上面有一句无一句,而我也不在他们的频道里,所以他们说什么我都不知道,要关注这么多与我无关的消息并从中挖出一两条与我有关的,实在是太浪费时间了。作为一个同事,他宁愿选择偷偷重写另一个同事的包,也不愿发封邮件告知他察觉到的问题的严重性。这还叫什么同事。他整天在推特上吆喝,对他人要善良(be nice),为何这件事上对我如此不善。算了,不说了,这么说下去又唠叨没完了。
tctcab 你还真别说,当年他要创建 RStudio Community 时,我就表达过反对意见。我是建议我们用这个精力去改良 Stack Overflow 社区的糟糕文化(这里面确实有不少混蛋,谁混蛋我们就有针对性地教训谁),不要另起炉灶。显然,我选的这条路要难走得多。在任何情况下,另起炉灶都是简单而诱人的路,就包括这次重写 blogdown。自立山头意味着一切都在自己掌控中,不用仰人鼻息。问题是这一个个自立的山头容易变成回音室(echo chamber),也就是一小群人,在一个隔离的环境中不断重复、回响、加强自己的信仰。Slack 频道、微信群、小论坛(我们这个论坛大概也不能幸免),都有回音室的潜在危险。
yufree 有时候我回复 Slack 消息确实感到很大的压力,因为我对即时消息的感受就是即时消息需要即时回复,而有些问题我实在即时回复不了。有时候我为了一条消息要把 Slack 开着开一周,因为我怕我关了就忘了是谁在哪里问我的问题了。我知道这种情况都有技术手段可以解决(比如设置消息未读),但这种“什么地方还有一条重要的消息我还没回复”的感觉让我感到很分心。换作邮件的话,我就不会产生这种焦虑。比如你两年前给我发的邮件至今依然躺在我的收件箱中(它是目前我未回复的最早的邮件),凡是还躺在我收件箱中的邮件都是我还有意处理的,但不管时间间隔多长,我都没有回复的压力,因为我知道我就算关了邮箱,我也不会忘记处理这件事。
便利的工具有时候真是把人给绑架了。尽管讲出来可能有点荒谬可笑,但我有时候感觉退回到信封邮票的时代,也许我们会轻松许多。
dapengde 是的,我也讨厌理发师强行尬聊。看牙医也是,开头总要问你住哪里、家里几口人、人均几亩地、每个人是干什么的、娃在家还是上幼儿园,等等。到了第二次再去看牙,还要问你的娃怎么样了、现在该几岁了。人口调查完了还能记下来,第二次接着调查,尽管是为了表示关心,但让我作为一个顾客感到不是很自在。在餐馆吃饭时,我都嫌服务员时不时过来打断问一句吃得怎么样太多余了,还是在国内吃饭自在一些,需要服务员的时候大手一挥吼一嗓子就好。
yihui 看到 be nice,我就想到了郭德纲,他对这句你要善良的拷问句句在理,由此想到他说的另一句话:“不明白任何情况就劝你一定要大度的人,你要理他远一点,因为雷劈他的时候会连累你”,感觉跑题,但句句在理。
- 已编辑
第 N 次回到主题……前几天刚又剃了个光头,削发明志。计划过两天发布 blogdown 1.0,各位壮士若有空的话,请帮忙最后测试一下吧:
install.packages('blogdown', repos = c(
'https://rstudio.r-universe.dev',
'https://yihui.r-universe.dev',
'https://cran.r-project.org'
))
完整更新记录在此:https://github.com/rstudio/blogdown/blob/master/NEWS.md
若遇到任何问题,不妨先用 blogdown::check_site()
检查一下。谢谢!
Cloud2016 谢谢,这是个重要情报,我之前没注意到这个事情。现在 check_site()
也可以检查有错误的 YAML 数据了,会打印出文件名以及错误消息。
好了,blogdown 1.0 已经登上 CRAN。三个月的长征终于差不多走完,放下了一块大石头,接下来得打理打理其它包了。锐扑厉教授的一封吓得我不要不要的邮件已经搁置了一个多月了,他到现在还没砍死我,但我也心方一个多月了。 Github 上的草不知道拔到夏天能不能拔完。