关于 xiaoronglv | 吕小荣

医学生毕业,做了两年产品经理,后转编程。Ruby-China.org

RSS 地址: https://mednoter.com/feed.xml

请复制 RSS 到你的阅读器,或快速订阅到 :

xiaoronglv | 吕小荣 RSS 预览

我的妻子

2024-05-20 08:00:00

各位弟兄姐妹,

今天很开心站在这里分享我和刘小坤的故事。今天我要分享的并不是我自己的见证,而是见证刘小坤的变化。

我和刘小坤结婚快14年了,我非常珍爱刘小坤。

这种爱慕、依恋和彼此扶持并不是出于圣经的教导,而是出于一种恩情。在成为基督徒的很长一段时间内,我并不觉得是神拯救了我,而是刘小坤拯救了我。

初期的艰难

在和刘小坤恋爱之前,我的状态非常糟糕。我的原生家庭中,父亲罹患精神分裂症,我自己从高中开始罹患抑郁症,焦虑,强迫症。这些心理问题持续到工作后的许多年。我不清楚是原生家庭的影响,还是遗传因素。

每年冬天,当抑郁症发作时,我就像一个带着面具的人,虽然表面上我脸上挂着笑容,但内心却冰冷如冰窖。同学、朋友、家人就在眼前,却仿佛隔着一堵墙,自己则在墙后面孤立无援。我也吃不起抗抑郁药物百忧解,因为我一个月生活费才300元,一瓶百忧解就300元。

作为一个抑郁症患者,每天醒来都是沉重的痛苦,痛苦在白天中慢慢减轻,经历另外一夜,又在痛苦中醒来,日复一日的循环,没有希望。

每年我都提醒自己要苟活着,为父亲苟活着,为奶奶苟活着。想从楼顶一跃而下,我不想看到他们为我流泪。

可以毫不夸张地说,在遇到刘小坤之前,我的世界就像灰色的、暗淡无光。

恋爱

和刘小坤恋爱后,生命中总算照入一缕阳光。虽然每年冬天还是会抑郁症发作,但这一缕阳光让我觉得,“嗯,活着还是有一点点意思的。”

当然,你们可能好奇,刘小坤是怎么想的,为什么要和一个抑郁症患者谈恋爱啊。我很自私,我没有交实底,我并没有告诉她每年冬天我都会抑郁症。答案我太需要她了,我太依恋她了。只有和她在一起,我内心会平静下来。

大学期间,刘小坤是奋发图强的人,和她谈恋爱,基本就是陪她上自习,一天到晚在图书馆待着。而我饱受抑郁症和失眠的折磨,有心无力,学习成绩跟不上。有时候我特别怕被刘小坤甩了。但我还是咬咬牙,为了爱情拼命学习,和她一起考上了上海交通大学医学院。

在相处了几年之后,我向她坦白了我的父亲的精神分裂有时会发作,我每年冬天都会抑郁症发作,我有焦虑症状,她却没有离开我,硕士研究生还没毕业,我们就结婚登记了。所以这份恩情,我记一辈子,后面无论遇到再大的风浪,我都不会离开她。

婚后分歧

结婚后,我们的人生轨迹发生了变化。

我离开了医院,放弃了医生的职业,进入了互联网行业做产品经理,然后成了一个程序员。因为每天都是做的自己感兴趣的事情,每天都充满了干劲。

刘小坤则开始躺平的生活。经过了日日夜夜的寒窗苦读,毕业于最好的院校之一,找到了一份安稳的工作,难道不能享受片刻生活的平静吗?她的爱好是看玄幻小说,市面上各种玄幻小说,她基本上都看完了,比如《三生三世桃花庵》。

她觉得没有问题,我觉得问题很大。一天只有24个小时,睡觉8个小时,刘小坤一天刷7个小时的手机。我总是在心里暗暗的想 “这些垃圾玄幻小说,既不能给你人生意义的答案,也不能让你赚钱,无论是精神上还是物质上,都没有任何益处,你沉湎在其中干嘛”。

我质问刘小坤,你天天泡在手机里,当你在给病人看病时,她你在认真听病人的话吗?当和我吃饭,你也也在刷手机,我就像空气一样。我们为此常常吵架。

结婚后,我先信主,刚信主的那几年,我每天都像打了鸡血一样,小组内带查经,安排教会值日,组织退休会,更多的参与了教会的服侍。从刘小坤的视角里,我除了工作和休息,就是在忙教会的事情,她觉得我不爱她,我更爱教会。

我们也为周日聚会吵架,我不想迟到,但刘小坤并不在乎。我们每周日早晨必为了时间问题吵架。即使到了教会,刘小坤还是像局外人一样,继续刷玄幻小说,刷自己的淘宝。

我尝试通过各种方式让她感受到爱,但都没有效果。比如按照《爱的五种语言》方法,逐个尝试,让刘小坤感受到”信仰的力量“。刘小坤一下就识破了我的动机,知道我背后的动机其实是要改变她,塑造她,按照我的方式去生活。所以她说你太 ”刻意“和”矫揉造作“,并且她不吃这一套。

我放弃了去改变一个人,我学会了尊重她的自由意志。不管她信还是不信,不可强求,单纯爱她就好了。刘小坤来小组,来教会。她有时像个局外人,安静的坐着。有时聆听倾听别人遇到的生活的烦恼。有时候也会向别人抱怨“吕小荣像个机器,做吕小荣的妻子有多难”,更多时候会跟着大家查考经文。

新无神论

就在刘小坤岁月静好时,我的信仰生活却在大起大落,火热来的快,信仰危机也很快。在信主几年后,我的信仰在新无神论面前冲击面前几乎崩盘了。新无神论尝试打碎宗教,但又没有指明道路,只带来了虚无和绝望。我又开始抑郁症发作了。

我和刘小坤睡前经常聊天,一聊就是一两个小时。

• 我们的存在是为了什么?会不会毫无意义,但过于冰冷和绝望。但我接受不了这答案,不敢直视,所以在宗教中寻找一些意义,这样才能成为我活下去的理由。 • 道德是美德吗,还是社会效率最大化的工具?道德是否是弱者压制强者的工具?我们要遵守道德吗?我们要诚信吗?

王怡牧师曾经把中国家庭教会的正统归结为 “封闭”。但是这种封闭对遭受自由神学,新无神论思潮冲击的的人来说,他们要孤独的面对信仰的崩盘,周围的人没有解药。

刘小坤成了我的知心大姐姐,我的心理医生,我的探寻信仰旅途的伴侣。

我游离在怀疑论者,新无神论,基督教之间,在我自己还没有得到一个准确答案之前,是刘小坤允许我质疑上帝的存在,允许我发问,允许我大胆怀疑,允许我自说自话。

我也向刘小坤倾诉为什么我没有办法传福音。我无法信誓旦旦,言之凿凿的向别人推荐一个自己不能确信的东西。如果拍着胸脯对别人说 “耶稣是真理,是道路,喝了这水就再也不渴,是解决人世间所有问题的唯一解药”,我会觉得自己在撒谎。

祈克果: 信心的一跃

我也尝试了另外一条路,用科学和理性是证明上帝的存在。我也像向小坤倾诉,证明 “神存在与不存在”是如何荒谬的事情。

• 人类如此渺小,理性如此有限,(新)无神论者对此前设绝口不提,却武断的断言 “这世界没有神”,简直狂妄至极。 • 基督徒尝试用自然科学证明上帝存在,无视别人对钟表匠理论的反驳,只管自说自话。

一切的推导,一切的理论体系,回到逻辑起点,都只有一个前设问题:我们是否相信这世界是神创造?

如果选择相信,那么我看待这个世界的视角就变为:日月交替,春夏秋冬,路边小草的每一片叶子,都在陈述上帝的荣耀。上帝的存在毋庸置疑。

如果选择不相信,你需要在混乱的哲学流派中找到真理,并践行自己的真理。

祈克果: 我们无法依靠逻辑和知识来确认信仰是否是真的,单凭理性达不到信仰的彼岸,只有纵身一跃,才有可能跃过知识逻辑与信仰之间的鸿沟。

我向刘小坤坦言,我要放弃论证了,我要放弃探寻了,我要纵深一跃了,我无法保证这条路百分之百正确,虽然崎岖,这条路似乎也是人本来应走的路。我们应该开启一段冒险的旅途。

经历这么多年漫长的思辨,她也告诉我,她相信了,但是还没有准备好受洗仪式。

受洗

真的是感谢 Jean ,把刘小坤一直放在心上,一次次和她谈心,最终让刘小坤下定决心受洗。

她受洗后,对圣经的好奇心被骤然打开。

• 为了看懂但以理书的预言,她会研究巴比伦历史,波斯帝国,希腊帝国,罗马帝国。 • 为了看懂先知书,她会把以色列人的被掳,被归回,时间点,在任的国王,研究的一清二楚。 • 她参加磐石课程

每次小组查考旧约,如果大家对年份不清楚,就会问刘小坤。

鉴于 “我不知道我不知道的东西”,所以我没有办法陈述刘小坤对圣经历史的浓厚兴趣以及造诣。因为我实在记不住历史王朝的更替。

我只感叹我曾费劲心机要改变她,徒劳无果。

我惊叹于神改变人心的能力,在后的反而在前了。

刘小坤是神对我的恩典

但转念一想,我也从没有在前过,刘小坤从没有在后面过。

刘小坤在没有信主的时候,刘小坤以极大的忍耐去迁就我来小组和教会。换位思考一下,如果我是不信主的人。我愿意每周五去小组吗?我愿意每周日陪着另一半去教会吗?我愿意和一群不熟悉的人吃饭吗?还要准时,不准迟到!这是多么大的一笔时间开支啊。换作是我,我肯定会断然拒绝。

在我的生命里,我对刘小坤感谢越多,就会对神感谢越少,有时候我会质问神?

你说爱我,但当这么多的苦难发生在我身上时,你在哪呢?

但是我有一天看到箴言箴言 19:14

房屋钱财是祖宗所遗留的;惟有贤慧的妻是耶和华所赐的。

如果我相信神的大能,相信细微到每个原子在宇宙中的运行轨迹他都知道,刘小坤在我生命的旅程中,恰到好处的出现,就是他所安排给我的馈赠。

我感恩神在信仰的旅程中,给我安排了这位灵魂的伴侣。

2024 计划

2023-11-13 08:00:00

Health

学习拳击。稍微入门之后,就可以防守和进攻 80% 的人群,可以在紧急关头保护自己的孩子,或者被人侮辱的时候还击,不用憋坏自己导致心理疾病。

家庭

第一,上海的“移民政策”又放宽了,办理上海户口的手续又进一步精简,不用回杭州去办理各种证明材料了。可以把上海户口办好,不要再拖了。

第二,陪妻子学雅思,一起考雅思,以考代练。万一有出国的需要,不用慌忙筹备。✅

第三,读万卷书,行万里路。给全家人刷签证,为沐沐的夏校(Summer School)作准备。

第四,看看北美肌电图技师需要的技能和证书。

第五,沐沐在学习打篮球,我也跟着学。小的时候家里穷,没机会学习打篮球,现在我也弥补一下童年的遗憾。✅

第六,沐沐阅读文字有困难。我发现圣经是极佳的阅读材料。因为圣经每一句都有编号,沐沐失去焦点时,我可以非常方便的让他重新聚焦。我们晚上读圣经,我读三段,他读一段,沐沐很享受这种占爸爸便宜的感觉。

第七,想办法带全家人去日本兜一圈

第八,减少支出,增加储蓄,分散资产。一来是应对中国的经济风险,二来表达不满和反抗。✅

工作

第一,我被调到一个新的组,开始做 Auth, Authz, Profile, SSO 等基础设施。我没有经验,要学的东西一大堆。

在团队内,我可以做什么?

我是极其骄傲的人,争强好胜,自尊心又强,经常产生无谓的争竞,浪费自己和团队的时间。以后无论去哪一家公司,哪一个组,都要养成低调的习惯。无论喜欢还是反对,先肯定核心人员的付出和已有的成绩,培养融洽的同事关系,降低别人的排斥感,方便后期开展工作。

第二,强制分配 10% 的时间在沟通上。

第三,强制自己分配 20% 时间组织 “中国地区学习俱乐部”。

在我既往工作过的公司,我始终有热情去分享。应该更进一步,成为一个好的组织者,让别人也有热情去分享,分享有用的知识。

受限于精力和时间,再优秀的程序员能做的事情也有限。如果形成一个机制,让团队内的所有优秀程序员分享自己的知识,将会显著提升整个组织的效率。

第四,放弃 Istio 的学习。

Istio 带来的收益和它的复杂度比起来,不成正比,没有必要在 Workstream 过多和过早的的引入复杂度。

第五,开始涉猎人工智能相关的知识。

2011-2023 年沉淀下来的习惯

在对自己的观察中我发现了一个有趣的事:当生活的场景或地点发生变化时,稳定的行为模式会被打断,很难恢复,即使恢复也不完整。

为了对抗家族遗传性的高血脂,我一直低脂低盐饮食,过年 7 天假期我允许自己短暂的放纵,但是假期结束后我却忘记了低脂饮食的习惯。本来我每天坚持跑步 5km,得了新冠后,浑身乏力,无法运动。一个月后身体彻底康复,身体变得懒惰,不再愿意跑步。

旅游,过年,出差,让生活充满了新意,但也打断了循规蹈矩的生活,每次打断我都把自己弄丢了。这个文档快速帮自己找回自己,找回那个我所喜爱的循规蹈矩的自己。

信仰习惯

原则 打破原则的直接后果 (3-5 年) 打破原则的凄惨结局 (60 岁)
常常默想死亡 “假如生命只剩2年,该做什么” 沉迷物质享受和虚浮的事物 没有反省的人生不值得活
写日记    
三选一。全家人一起早晨听圣经;晚上一起敬拜;晚上一起祷告。   全家偏离信仰

健康习惯

原则 打破原则的直接后果 (3-5 年) 打破原则的凄惨结局 (60 岁)
能早起就早起,不能早起别勉强    
每天早晨喝一大杯水 肾结晶加重,变为结石  
打喷嚏时头后仰,保护颈椎。 颈椎病发作  
中午 14:00 之后不要喝咖啡 睡的很浅,凌晨 4 点就会醒。更严重的话,彻夜失眠 记忆力下降,无法编程
左右手交替使用鼠标,一月一换 右侧手肘疼痛  
左右交替使用磨牙进食,一月一换 单侧磨牙磨损,疼痛  
不喝酒 前列腺不舒服 / 胃食管反流 老年后起夜增多,睡不好,折腾死自己
站立开会 久坐导致前列腺肥大 老年后起夜增多,睡不好,折腾死自己
工作 45 分钟,锻炼 15 分钟 久坐导致前列腺肥大 老年后起夜增多,睡不好,折腾死自己
不吃豆腐乳 拉屎不痛快  
吃饭慢嚼细咽 吃饭速度对胃食管反流影响非常大,是决定性因素,然后继发咽炎。  
拉屎不看手机 痔疮发作 / 颈椎病发作  
不吃香肠 肥胖/脂肪肝/家族遗传高血脂/胃食管反流烧心 脑梗/心梗,成为家庭的累赘
每天晚上跑步 5 km 肥胖/脂肪肝 脑梗/心梗,成为家庭的累赘
21:30 躺在床上,读书,讲故事,敬拜,闲聊 没有敬拜时间 偏离信仰,下地狱
     

工作间隙锻炼方式有:

家庭习惯

学习习惯

教会习惯

历史回顾

给沐沐的信: 费曼学习法

2023-10-30 08:00:00

亲爱的沐沐,

你今年二年级了,在某些数学题目上你一错再错,一些简单的英文文法也不长记性。我曾经尝试教你定期复习,但你总是不愿意遵守。

我决定以一种奇特的方式让你复习。我来扮演笨拙的家长,“谦虚”的请教你错题。我看上去越是愚蠢,你就努力用更浅显的方式教授我知识。

这是一道你的错题,我让你用方块和积木的方式来讲解这道题目,而不是用乘法口诀。你居然兴致盎然给我讲解了半个小时。

理查德·费曼费曼是著名物理学家、诺贝尔物理学奖得主,他相信如果一个人能向别人清楚地解说一件事,那么他就真正掌握了这门知识。费曼学习法“以教促学”。

此外,我越来越少因为学习这件事向你发飙了,回顾了历次对你的呵斥,我发现并不是你的懒惰和马虎,而是我和学校的问题。

你是一个小树苗,就按照自己的进度茁壮成长吧。

我是一个新手家长,也请你将就一下吧。

写给沐沐的信: 让我们一起来搞定应试教育

2023-08-23 08:00:00

沐沐,

在你幼儿园的时候,爸爸妈妈并没有采用刷题策略,而是尽量激发你的热爱学习的兴趣。

  1. 给你看 Youtube Kids 中的英文动画片
  2. 给你买显微镜,观察围观的世界
  3. 给你看英国 BBC 动画片,Number Blocks,理解数字的魅力
  4. 给你买了一堆书,并且允许你只看插画,不看文字。

但是到了一年级时,面对海量的学业压力,你过的非常艰辛,经常写作业到10点,我们再也没有时间出去跑步,骑车,游泳。

中国的举国体制都是应试教育,即使你想独善其身,环境也不允许,因为每个家长都在较劲。你的成绩不理想,我给你打气 “你也与别人一样聪慧,只是因为刷题太少”,但在成绩面前,还是会自我怀疑。

你现在8岁了,马上就要升二年级了,可以预见的是,将来还会面临庞大的学业压力。既然我们无法改变举国体制,那么就认清它,应对它。

第一个策略:虚头巴脑的作业,交给爸妈,帮你节省出时间。

应试教育的第一个谎言 “它假装自己是素质教育”。当前中国的学业压力已经把学生的课后时间压榨殆尽,但是教育局它还会布置一些劳动海报,音乐展览,美术海报的形式主义作业,进一步侵蚀学生的可支配时间。如果你认真应对,你自己最后一点可支配时间都被压榨,根本无法发展自己的兴趣。

形式主义的作业,爸妈帮你做

教育局会布置一些形式主义的作业,比如

你不感兴趣的作业,爸妈也帮你做

语文书中命题作文非常乏味,没有孩子会感兴趣,也不愿意写作。这种作业,爸妈也帮你做。

《暑假生活作业》设计不合理,爸妈帮你做

1年级的《暑假生活作业》却包含了3-4年级的生僻字,你看到满页的生字抓耳挠腮。

尽快教你学会使用 AI

AI 非常适合写形式主义的文章。

我的朋友们也提供了一些应付形式主义作业的妙计:

  1. 外包。在闲鱼上找个中学生,一下午把暑假作业做完。- by Chen Liang
  2. ChatGPT。对于各种红色爱国主义教育心得体会,可以用 AI 生成作文。对于画图作业,可以使用 Midjourney。- By Max Wang
  3. 网上直接下载作业,应付了事。 - by Sarah Xia

注意: 在应付学校形式主义的作业时,也要尊重老师的感受,不要让老师觉得我们的家庭特立独行,做作。

  1. 可以用打印机打印,让沐沐抄写,这样老师就无法发觉我们在应付教育局形式主义的作业。
  2. 多给班级送一些纸巾,抽纸,铅笔,和班主任建立良好的关系,保证沟通顺畅。

第二个策略,直击核心——主课。

去掉各种虚头巴脑的作业后,你会有很多时间来读课文,写字,练字,这些既无聊又艰辛,但是会帮你在短时间内积攒大量知识,必须要做。

语文

  1. 每天写一篇不限定主题的作文,可以写游戏教程,喜爱的玩具,校内趣闻。
  2. 每天选一本喜欢的书,读 5 页,读出声。

数学

高年级:多刷题来应付不同题型。

数学需要自己慢慢揣摩,所以做数学时,我以鼓励为主,尽量不指导。

英语

学习语言,一定要频繁使用。这对于大部分中国学生,这是一道迈不过去的坎。

公立小学的英语课程会过度强调记忆:

  1. 单词死记硬背,最终语言学习沦为“记了忘,忘了记”的恶性循环。
  2. 即使记牢了,也不会使用。
  3. 使用公式的方法来记忆语法。

真正掌握一个单词的标准是什么?

在 20 个不同语境中灵活使用某个单词,才是真正的理解和掌握。

但对于你,情况略哟不同。你已经可以流畅的使用口语与外国人沟通。你要警惕的并不是 “使用不足”,而是片面以口语能力来高评自己的英语水平,并沾沾自喜,止步不前。

在保证英语听说训练(使用语言)的前提下,唯有坚持英文阅读可以带你进入下一个境界。每日英语的学习时间要这样分配:

英语成绩如果超过同学,不要窃喜。继续按照自己的进度学习,早早的达到高中英语水平,可以让你在高中节省出时间修补自己的弱项(或者能偷懒多睡会觉)。

如何判断自己的英文水平已经达到高三水平?以听懂和阅读原版《哈利波特》为里程碑。

第三个策略,平衡新学期和假期的学业压力。

这是大部分学生的学习强度,假期放飞自我,开学累个半死。

要平衡工作量,暑假要有学习的时间,开学要有玩的时间。

每年寒暑假时,提前预习下一学期的主课,这样开学后可以跟上学校的教学节奏。不至于在每个夜晚熬夜。快速做完作业后,可以去踢球,可以去骑车,可以去游泳。

第四个策略,平衡工作日和周末的学业压力。

这是目前我们工作日时的学习强度,工作日的学业压力非常重。

你酷爱游泳。我们可以把一些作业拿到周六周日去完成,工作日就可以挤出 16:00 - 18:00 时间段,一起去游泳了。学校管理严格,情绪处于紧绷的状态,游泳可以帮你保持良好的情绪,我双手赞成!

以下是可以拿到周末的作业:

  1. 数学口算本
  2. 语文的课后练习
  3. To be determined.

第五个策略,要留出时间发展兴趣,充分个性化教育。

没有人喜欢刷题,应试教育回答了 “如何学习?(How to learn)”这个问题,但是并未解答 “为什么学习? (Why to learn?)”这个问题。

爸爸妈妈会和你一起探索,通过你喜欢的个性化教育来学以致用,让你能回答 “为什么学习? (Why to learn?)”。

每个人都有好奇心,学习,是因为它有趣。

为了保护你的眼睛,爸妈只允许你每天玩半个小时 《Minecraft》,但是你的浓厚兴趣可以持续几年,爸妈以此展开,来达到素质教育的目的。此外我做了手脚,我给你买的游戏都是英文原版,你只能硬着头皮啃英文。

提高中文写作能力

你对语文书的命题作文不感兴趣,你的兴趣点是《植物大战僵尸》《Minecraft》,那我们就写日记,写游戏攻略,写游戏角色的百科。这个暑假,你自己编纂了一本故事集 《植物们的暑假生活》,介绍了小豌豆,小玉米的暑假生活,就是很好的写作练习。

提高英语识字量

我给你购买了英文原版的游戏攻略《The Minecraft Collection》,里面单词量巨大,你每天都在啃硬骨头。

我也给你购买了英文电子书 Epic! ,并且收藏了所有 《Minecraft》的书籍,你自己每天也在啃单词。

提高英语听力

每天看 Youtube Kids 半个小时,看国外玩家的游戏攻略,训练英语听力。

提高英语口语

爸妈帮你找外教,一起读英文游戏攻略。

找国外的高中生,一起用英语讨论 《Minecraft》如何通关。

以前我需要强迫你在家说英语,你非常不乐意。但现在提到 《Minecraft》,你就心甘情愿在家里用英语。

提高编程能力

我小的时候家里买不起电脑,所以计算机知识都是成年后赚钱后自学的。如果你也喜欢编程的话,咱们俩可以结对学习算法,挑战全国青少年信息学奥林匹克竞赛 (NOI)。如果你对计算机不感兴趣就算了,我也不想强求你。

我的大体计划:

1-3年级,你的数学还比较基础,我们可以先学习简单的逻辑。

4-5年级,可以开始学数据结构,然后依次拓展到算法,线性代数,图论。

…(还没想好这个美梦该如何进行)

自由意志与神的护理

从小到大,你的兴趣在迁徙,幼儿园时你喜欢 《Octonauts》,然后是《植物大战僵尸英文版》,然后是现在的《Minecraft》。我不知道你会喜欢游戏多久,或许会变。游戏都是工具,最终达到了教育的目的。

你目前所有的选择,看似是自己的主观意志,实在在爸妈的保护之中。

  1. 你玩的游戏是爸妈精挑细选过的游戏。
  2. 你只能用 Youtube Kids 看动画片,并且动画片是全英文的。(或许将来会给你看一些法语)。
  3. 你的游戏也都是英文版。

在教育你的时候,我也会想到天父对我的教育。我是天父的孩子,应该也在天父的护理之中吧。

参考资料

感谢

感谢小梅的审阅和意见。

感谢李燕老师对英文学科的指导。

感谢 Sarah Xia 的反馈。

感谢赵彦子的批判性意见。

语言符号与金牛犊

2023-02-19 08:00:00

我叫吕小荣。

当朋友开口说 “小荣,….“,我就知道他们在对我说话,他们也知道在对一个人说话。

小荣,是个语言符号,在他们的世界里代指了现实世界中一个活生生的本体,它有各种属性:男性,36岁,短发,近视,工程师,已婚已育…。

如果我乐意,可以换一个英文符号 “Ryan”,这个符号因我焕发了生机。但如果我的本体并不存在,这个语言符号在他们所处的生活空间内,大概率会失去意义。

语言符号可以用来代指人,语言符号可以代指一个概念。

人们看到一类东西,它有强壮的躯干,枝繁叶茂,可以喂食动物,有时候结果子,脑海中就自然抽象出概念(concept),然后用“树”这个语言符号(sign)来代指它。

“树”这个概念,有一些列的属性(properity):

  1. 有叶子
  2. 有枝干
  3. 有时候结甜甜的果子
  4. 枝干晒干后可以燃烧,做饭。

人类因创造性会制造大量的概念和符号,大部份符号只是绚烂绽放,衰落,消亡。有谁会记得20世纪90年代 “下海1” 的含义呢?

符号为实体服务。

一个婴孩出生在非洲的热带雨林,即使不接受现代文明的教育,他的生活环境中有大量树木,他必定会对这类物体抽象出概念,他可能发明自己喜欢的语言符号。

反之,一个婴孩生活西藏的那曲,一个树木稀缺的城市,他未见过树的枝繁叶茂,也没有吃过甜果子,当他使用 “树”这个语言符号时,他所阐述概念和事体的大概率是自己的想象,他对语言符号背后的含义并无真认识。语言符号在这种场景下,就彻底沦丧为一个符号。

在宗教信仰中,这种脱节也很普遍。当我最早接触基督教时,“圣洁”这个语言符号在我脑海中的画面是 “神坐在至高的宝座上,周围雪白,没有任何污点”。实际上,在圣经《利未记》中,祭祀用的物品是要单独分别出来的,圣洁一词最早用来形容那些“分别出来,专门给神用的”物品。

在旧约《埃及记》中,语言符号和实体的脱节更为致命。信徒们喜爱 “神” 这个语言符号,不在乎符号所代表的本体。

神给以色列人颁布了十诫,其中一条 “不可为自己雕刻偶像,也不可做什么形像,仿佛上天、下地和地底下水中的百物。 不可跪拜那些像,也不可事奉它们,因为我耶和华—你的 神是忌邪的 神。恨我的,我必惩罚他们的罪,自父及子,直到三、四代;爱我,守我诫命的,我必向他们施慈爱,直到千代。”

但他们的领袖摩西不在的日子里,老百姓就在旷野铸造了金牛犊,并且称之神,又唱又跳,疯狂赞美。我相信他们应该相当虔诚,毕竟捐的是真金。

但凡他们对自己的神有一丁点真知识,就知道神的律法和公义,自然知道祭拜金牛犊会死无葬身之地。可见他们对“神”这个语言符号背后的实体并无真认识。他们虔诚的敬拜想象之物。

如果一个基督徒自称认识神,但是并不知道/也不打算认识语言符号背后的实体,不认识他的怜悯,不认识他的公义,不认识他的道德之美。

那么“神”,“耶和华” ,“十字架”,就只沦为一种符号,它指向了脑海中想象的宗教,或者是某种未知的神秘力量。人们的狂热,情感,和热忱,都归给了金牛犊的变种——语言符号。


Note

  1. 1992年邓小平第二次南巡,同时又颁布了有限公司和股份公司的规范意见,所以1992年形成了中国精英阶层下海创业和创新,下海变成是一个潮流 

凡事盼望

2023-02-11 08:00:00

对待别人的宏图大志,我以忽略为主,伴以内心嘲讽。这是不好的。

今年朋友们立志读书,每个人都信心满满,妻子问,你为什么默不作声?不喜欢这个计划吗?

我回答:

首先,任何一本经典书籍都能让人受益无穷,学哪本都可以。

其次,根据以往学习战绩,我们坚持下来的概率为 0,没有什么值得兴奋的。第一年,我们直接学习圣经,大家很快开始抱怨文字的枯燥,还原的历史不够形象,晦涩难懂;第二年,我们学习课程材料《不再一样》,到后期时,很少有人预习和做家庭作业,以至于无法进行。第三年,我们学习视频教材,后来抱怨别人嚼过的信息食之无味,学习还是要回归圣经。

我已经对豪言壮语没了兴趣,按部就班学习就行了。

我是一个程序员,在评估别人的豪言壮志时,干成过大事这点尤为重要!

1. 什么才算 “干成过大事”?

好主意人人都有,执行力最稀缺。如果在一个人身上我看不到“言必行,行必果”的特质,我都懒得听他废话。

2. 他的计划 (plan)

3. 熟练使用认知工具

4. 他的年龄

经过大脑评估,如果对方的成功率接近 0,对话毫无必要。以上就是我过去37年的训练后的思维模式。

反思

7岁的儿子有一天他跑到我面前说,“爸爸,我决定了,以后玩完玩具后,我会归位的”。这句话撼动了我。

我好开心,好幸福,我赞美他 “沐沐是个爱劳动的小朋友,加油!爸爸相信你一定可以做到的”。沐沐只是个7岁孩子,他的决定是如此的微弱,只是一种倾向性,谈不上“志向”或“目标”,更没有具体的计划。他能成功的概率微乎其微。如果不出意外,随后几年家里还是乱糟糟的。但我为他的这种 “渴望成长的倾向性”而感到高兴。

沐沐以及我的朋友都颤颤巍巍的迈出第一步,为什么对他们有截然不同的视角?

对待沐沐,我的视角是 “沐沐居然迈出了第1步,沐沐好棒!沐沐居然迈出5步,不可思议!沐沐迈出15步,你是怎么做到的?!”虽然距离成功遥遥无期,但是他一直在努力。

对待周围的成年人,当他们迈出 1 步时,我看到的是“离目标还有 99 步,还早呢”,“他不会坚持下去的”,“等他达成目标再说吧”,“ideas are worth nothing unless executed“。

我很爱妻子和孩子,略微爱父母,但不在乎周围的人。那套严谨的评估系统只是保护自己的时间。过滤掉不可靠的人,减少交集,减少无谓的投入,避免被蠢人拖后腿。

圣经中说爱是恒久忍耐,又有恩慈;爱是不嫉妒;爱是不自夸,不张狂, 不做害羞的事,不求自己的益处,不轻易发怒,不计算人的恶, 不喜欢不义,只喜欢真理; 凡事包容,凡事相信,凡事盼望,凡事忍耐。 爱是永不止息。(哥林多前书 13:4)

Love is patient, love is kind. It does not envy, it does not boast, it is not proud. It is not rude, it is not self-seeking, it is not easily angered, it keeps no record of wrongs. Love does not delight in evil but rejoices with the truth. It always protects, always trusts, always hopes, always perseveres. Love never fails.

凡事盼望 (always hopes)也是一种爱,或许我可以“盼望之爱”对待所有人。

但凡人们对美善流露出一点点渴望,迈出一小步时,鼓励他们朝着智慧,美善,公义,怜悯,健康,夫妻和睦等好的方向多走几步。若有余力,给他们加把劲,提供一些实际帮助。虽然目标很远,人们会屡屡跌到,失败,半途而废,但大可不必盯着路途的艰辛和悲观的结局。

患糖尿病的母亲,胡吃海喝,如今饱受病法者的痛苦,决定不再喝粥,吃面条。

我可以选择说:“你总算长记性了,这些升糖指数很高的食物,会要了你的命,非要撞南墙才知道回头”。

我也可以选择说:“妈,你真棒啊,居然忍受住了诱惑,加油。再配合散步会更好。”

妻子萌发了学英语的念头,开始背起了单词。

我可以选择说 “哎呦,今天开始打鱼了?什么时候晒网啊?”

我也可以选择说:“哇,好棒,开始背单词了。要不要帮你找个外教,活学活用,单词记得更牢。先不要关注语法,大胆开口,不要怕说错。”

朋友们立志读书,翻开了第一页。

我可以选择说 “哎,希望我们不要虎头蛇尾”。

我也可以选择彼此勉励,共走天路。

凡事盼望,永不止息。

五年规划 2023-2028

2023-01-29 08:00:00

小荣

带领全家人读万卷书,走万里路。

爷爷90岁,奶奶92岁,妈妈60岁体弱多病,珍惜时光,尽快找到一个经济的方式回济南看望他们,每年在济南住一个月。

         37岁
          ||
          ||
          ||  - 在济南搭个舒适的窝
  5 year  ||  - 每年带沐沐回济南住1个月
          ||  - 带沐沐去1个国家和地区生活一段时间 (探索)
          ||
          ||
          ||
          ||
         42 岁
          ||
          ||
          ||  - 家庭财务稳健
          ||  - 时间自由
          ||  - 读万卷书,行万里路
  5 year  ||  - 带全家人去三个国家和地区生活一段时间 (稳定)
          ||
          ||        
         47 岁

行动

小坤

目标:

         40岁
          ||
          ||
          ||  - 英语口语流利
  5 year  ||  - 副主任医师
          ||  - 满足国际医院能力要求
          ||
          ||
          ||
          ||
         45 岁
          ||
          ||
          ||  
          ||   出国读个博士?
          || 
  5 year  ||  
          ||
          ||        
         50 岁

行动:

  1. 了解公立医院编制的好处和坏处
  2. 了解国际医院的能力要求
  3. 每周和 Jamie 练习英文
  4. 雅思 6.5 分
    • 马拉松有陪跑员,我可以陪妻子一起备考。 一起备考半年,2024年5月份考试。
  5. 写论文,升副主任医师

沐沐

          7岁
          ||
          ||
          ||
          ||
  5 year  ||  - 中英双语流利
          || 
          ||
          ||
          ||
         12 岁 (小学毕业 / 青春期开始)
          ||
          ||
          ||  
          ||
          || 
  5 year  || 暂未规划  
          ||
          ||        
         17 岁

备注:一些必须的目标就不陈述了,比如心理健康,自理能力,财务健康。

少年发声

2023-01-03 08:00:00

这个元旦读完了《少年发声》,一个心理咨询师根据访谈整理而成的书。来访者有点特殊,都是孩子,有的孩子还有强迫症和抑郁症。当然也有幸福的孩子主动参与访谈,夸赞自己的父母。

书中一个孩子兔球,常年缺乏爱和关心,看着她的哭诉,也勾起了我童年的回忆,心里也一阵酸楚,泪水也止不住的流。

也有孩子虽然稚嫩,开始反省自己的人生。与我们这些行尸走肉的成年人形成鲜明的对比。我们活着,但已经死了。他们稚嫩,灵魂却更丰满。未经审视的人生是不值得过的。

以下是让我印象深刻的节选。

孩子谈父母的比较

小依:我隐约记得小学二年级期末考了298分,300分满分,语文看图说话写错了一个词吧,结果被老妈拿来和一个300份的同学比。有段时间我都抬不起头,相当挫败的记忆。

小依:我和我同桌,都挺想读了大学以后不受家长控制,现在的家长都把孩子越养越远了。

孩子义愤填膺的谴责父母加作业

依依:我很生气!妈妈还给给我布置了另外的作业,哎。。。然后我写完了,她又给我布置,布置,布置,布置,布置!我写完作业,她也不让我出去玩,就让我在家自己玩。

麻利的孩子解释不拖拉的原因

小米:在学校的时间,我抓的非常紧,上课认真记笔记,课间会赶完不少作业。其实,这就是一个孩子简单的思路:早昨晚,早玩。前提是你昨晚功课,真的可以玩。而不是做完了以后,还有很多的功课。我小学一年级的时候,爸妈可能还没有挖掘出自己一套教育体系,还处于跟风状态,看别人怎么带孩子,他们也怎么带孩子,也给我布置课外作业。那时,我就故意把作业拖得很晚,这样就可以少做课外部份。不过后来他们就不给我布置课外作业了,也觉得没有必要。

畅畅:我写作业很快,有两大原因:第一个原因是我想着早点把作业做完,回家就能玩;第二个原因就是我和我的好朋友每天都比谁作业写的快,所以很早就把作业写完了。

孩子活的像提线木偶,放弃挣扎。

宣宣:我现在不是很想跟她沟通,因为沟通以后一点用处都没有,最后还是按照她的意见来,我还跟她沟通干吗?没什么可沟通的。现在我就感觉特别想笑,愤恨也有,但愤恨没有用啊。

宣宣:妈妈说什么,我就听着。以前我还会解释两句,现在我都不解释了,没什么好解释的。她说完以后,我就说:“说完了吗?说完了让我继续干我的事情吧,就别浪费时间了。”我现在都这么说。现在这样,我已经不想再去纠缠这些事了。

孩子称赞父母给予他们自主权

畅畅:前几天,我刚刚跟我妈妈提出来想报一个舞蹈班,目前还没有上课。

主持人:所以很多事情是等到你自己提出需求了,爸爸妈妈给你相应的资源,而不是说拽着你往前跑。

一个女孩子,哭诉被父母嫌弃。

兔球:我跟我的家人的关系不温不火,只能靠考试。可是不管我那一次考的比弟弟好,妈妈都不会夸我。小时候他总说我,“你咋这么傻”“蠢的像猪一样”“无能”“废物”。。。这些话让我充满恐惧。

兔球:准确的讲,我感受不到爱,我花了很多时间去治愈自己,孤独至极。我看了很多书,来麻痹和填补我那颗缺爱的心,卑微,自卑,没有尊严,我在现实世界和虚拟世界中一沉一浮,痛苦不堪,甚至希望所有人都死掉。

读后感

我也是一个父亲,看到这些孩子的心声,我要再次叮嘱自己,要对得起上天的委托。他把一个灵魂寄托到我家,是让我精心呵护,绽放出绚丽的生命。用爱做底色,用智慧去修剪,缺一不可。

2023 计划

2023-01-03 08:00:00

2023 年尝试的新方向

信仰

申命记:不可忘记你的主。

家庭

给别人自主权,改掉“好为人师”的臭毛病。允许别人犯错,允许糟糕的事情发声,克制自己的强烈的控制欲。

继续鼓励妻子每周和 Jaimie 用英文聊天,允许她犯错,允许她绕弯路,允许她按奇怪的方式学英语。她若不需要指点,我不要好为人师。

Nov 13, 2023:

  1. 她已经开始规律上英语课,坚持和 Jaimie 英文对话,开始聊菜谱。
  2. 她开始备考雅思,以考代练。

妻子开始承担教会财务的工作。我要克制,不要插嘴。

给沐沐学习更多的自主权,允许他犯错,低效,磨叽,绕弯路,非最优解。他若不需要帮助,我不要好为人师。他若寻求帮助,就给他提供最好的资源和支持。要沉得住气,一口气憋两年也要沉住气。

Nov 13, 2023:

这一年基本以鼓励和支持为主,放弃 Micro-management 以及监控式指导做作业。

一言九鼎,不给沐沐加作业,他做完作业就可以玩,早做完早玩。这样他不磨叽,我也不用唠叨。✅

维护家庭爱的氛围,营造彼此相爱的氛围可能需要一个月,毁了它只需要几分钟。说话态度,口气,音调,都需注意。

Nov 13, 2023:

妻子今年改变很大,她是我们家情绪的压舱石,她在家庭氛围的调节上功不可没,我基本没做什么贡献。

工作和学习

工作要对别人有益处。为客户创造价值,为社会创造价值。

  1. 做好集成

  2. 解决集成的 Resilience 的问题

    博览代码,多阅读一些优秀的开源项目。只有多学习,才能解决 Resilience 的问题。

  3. Kubernetes

    目前的工作环境,暂时应该用不到 K8s,但是善始善终,还是把它学完吧,并且通过 K8s 的两个考试。


2011-2022 年沉淀下来的习惯

在对自己的观察中我发现了一个有趣的事:当生活的场景或地点发生变化时,稳定的行为模式会被打断,很难恢复,即使恢复也不完整。

为了对抗家族遗传性的高血脂,我一直低脂低盐饮食,过年 7 天假期我允许自己短暂的放纵,但是假期结束后我却忘记了低脂饮食的习惯。本来我每天坚持跑步 5km,得了新冠后,浑身乏力,无法运动。一个月后身体彻底康复,身体变得懒惰,不再愿意跑步。

旅游,过年,出差,让生活充满了新意,但也打断了循规蹈矩的生活,每次打断我都把自己弄丢了。这个文档快速帮自己找回自己,找回那个我所喜爱的循规蹈矩的自己。

信仰习惯

原则 打破原则的直接后果 (3-5 年) 打破原则的凄惨结局 (60 岁)
常常默想死亡 “假如只剩三年寿命,该做什么” 沉迷物质享受和虚浮的事物 没有反省的人生不值得活
写日记    
三选一。全家人一起早晨听圣经;晚上一起敬拜;晚上一起祷告。   全家偏离信仰

健康习惯

原则 打破原则的直接后果 (3-5 年) 打破原则的凄惨结局 (60 岁)
能早起就早起,不能早起别勉强    
每天早晨喝一大杯水 肾结晶加重,变为结石  
打喷嚏时头后仰,保护颈椎。 颈椎病发作  
中午 14:00 之后不要喝咖啡 睡的很浅,凌晨 4 点就会醒。更严重的话,彻夜失眠 记忆力下降,无法编程
左右手交替使用鼠标,一月一换 右侧手肘疼痛  
左右交替使用磨牙进食,一月一换 单侧磨牙磨损,疼痛  
不喝酒 前列腺不舒服 / 胃食管反流 老年后起夜增多,睡不好,折腾死自己
站立开会 久坐导致前列腺肥大 老年后起夜增多,睡不好,折腾死自己
工作 45 分钟,锻炼 15 分钟* 久坐导致前列腺肥大 老年后起夜增多,睡不好,折腾死自己
不吃豆腐乳 拉屎不痛快  
吃饭慢嚼细咽 吃饭速度对胃食管反流影响非常大,是决定性因素,然后继发咽炎。  
拉屎不看手机 痔疮发作 / 颈椎病发作  
不吃香肠 肥胖/脂肪肝/家族遗传高血脂/胃食管反流烧心 脑梗/心梗,成为家庭的累赘
每天晚上跑步 5 km 肥胖/脂肪肝 脑梗/心梗,成为家庭的累赘
21:30 躺在床上,读书,讲故事,敬拜,闲聊 没有敬拜时间 偏离信仰,下地狱
     

工作间隙锻炼方式有:

家庭习惯

学习习惯

教会习惯

推迟到 2024 年的一些事情

Q1

从雪盈迁移回 IBKR,彻底废弃雪盈账户。 ✅

Q2

Q3

先换快过期的护照,再刷签证,节省时间和精力。

2024 年 11 月 11 日可以申请换护照

2024 年 12 月份给全家人刷签证

历史回顾

愚昧人是话都信,通达人步步谨慎

2022-11-21 08:00:00

我和沐沐去肯德基买冰激凌,在门口的广场看到一个年轻人在唱着悲伤的歌,一副大海报矗在面前。

“爸爸,这海报说了什么啊?”,沐沐问。

海报说,他是2021年的毕业生,入职体检时发现了巨型脾大,医生建议他切除脾脏,要花十几万。他工作丢了,但是不愿意向命运低头,现在他在通过唱歌攒钱,治病。

我给沐沐买了冰激凌,在离歌手很远的台阶上坐下。我问沐沐,你要给他捐点钱吗?他看上去挺可怜的。

沐沐答道:“嗯,是挺可怜的。”

那你还记得我让你背诵的箴言吗?愚昧人什么都信,智慧人步步谨慎。The simple believes everything, but the prudent gives thought to his steps.

我给你讲个亲生经历的故事,每年冬天人民广场都会冻死几个乞丐,我以前在人民广场发放过教会采购的棉衣。有个乞丐穿的实在是太破烂了,准确的讲,他的衣服就是一些散了架的丝线。我把棉衣给他时,却被真正的乞丐拦住了,乞丐们说,这个人是骗子。

你怎么能确信这个歌手就真的生病了呢,万一是骗子呢?

沐沐附和道 “我就说吗,一个得病的人,唱歌不可能那么洪亮,他肯定是骗子。”

我紧张的让沐沐小声一些,免的歌手察觉。我又继续追问,你确信他是骗子吗?

“我很确信”,沐沐果断答道。

“我们不知道他的背景,他的的心思意念,所以你的结论很武断,我们只能说’我不知道真相’。要不爸爸去和他聊聊吧。” 我提醒道。

于是我上前询问歌手的血小板的数量,肝脏功能,造血系统指标。歌手说,他还在复查,还在排查病因。

歌手是大概率是生理性巨型脾脏,那么手术治疗可能只是博取同情。

我问沐沐 “这个人的巨型脾脏可能是真的,但是手术费用是假的,我们还要捐钱吗?”

沐沐左右为难。如果歌手是骗子,捐钱给他,我们就是蠢货。如果他真的是病人,不捐钱给他,于心不忍。

我又开导沐沐,在吃冰激凌的半个小时里,我们分析了各种情况。爸爸还是决定捐钱给他,并且留言给他,“如果你是个病人,希望这些钱对你有用;如果你骗了观众,希望你不要继续行骗了,因为你的歌声非常好听,没必要骗人。“

我总结道,“沐沐,今天最重要的一课,时刻保持怀疑,小心求证。”

后续

晚上和妻子吃饭,谈到今天和沐沐的经历,妻子说那个歌手一年前她就遇到过,巨脾是真,手术可能是假。

想到今年超低的大学生就业率,也不忍留言给他了,希望他早日找到工作。

处理孩子压岁钱的一些思路

2022-10-07 21:08:21

沐沐主要收入来源就是做家务,饭后收拾碗筷 2 块钱,扔垃圾 1 块钱,如果勤快点,一周赚 50 元,存够钱后买喜欢的玩具。他自费购买的玩具属于私人财产,赠送朋友或扔掉我都不干涉。

劳动获取收入,储蓄,消费,不赊账。这套金融系统运行的很稳定,但有时也会遭受重大冲击。

每次回老家长辈们把沐沐捧在手心里,见面就给一千块钱。过生日,亲朋好友朋也会顺手给200块钱的压岁钱。平日辛勤劳作,一个月才赚200,现在回一趟老家就可以敛财无数,很自然的他想坐吃山空。

这可怎么办呢?

剥夺

最粗暴的办法是剥夺他的这部分意外收入,直言这部分钱礼尚往来的开支,它并不属于小朋友的。别人给你送红包,我们也要给他们的小孩红包,所以红包和压岁钱都归爸妈所有,以维持这种礼尚往来。

这会让小孩质疑爸妈的权柄。

今年我36岁了,小的时候爸妈套路我的方法我还历历在目。我每次考前三名,奶奶会奖励我200块钱[^我不鼓励这样做,物质奖赏会让小孩丧失动机];过年爷爷奶奶给我20块钱压岁钱,这些都被我妈收走了,说帮我存着,我就再也没见过它的影。

存到他自己银行卡里

后来我和妻子商量,干脆存到儿子的银行卡里,但是未成年人的银行账户无法购买定期的理财产品。我有很多闲置的银行账户,干脆就拿出一个不常用的,划给儿子用作他的储蓄账户,将来所有意外收入,都存到这个账户下。

  1. 这个账户归儿子所有。
  2. 账户里的钱属于儿子的私人财产,我和妻子不会挪用。
  3. 直接买3年以上的R2级别的定期理财产品。
  4. 18岁之前不可以支出。

这种方案有几个好处:

关于劳动的奖励,我和妻子的定义也非常严格。

分内的事情是没有工资的,比如按时起床,整理书包,完成作业,收拾自己的衣柜。

只有服务整个家庭的家务,才会拿到工资,比如丢垃圾,饭后收拾碗筷,给爸妈晾衣服。并且提前商量好工资,防止他做一堆家务,只为邀功要赏钱。

36岁跑步心态

2022-09-29 08:00:00

今年36岁了,感受到年龄对身体的影响。

过去一次可以跑 12 km,现在超过 5km 膝盖就开始不舒服。过去的配速可以控制在6分钟内,但现在只能是 6-8分钟/km。如果硬要勉强自己的身体跑得快,第二天膝盖绝对痛,甚至关节积液。

无论是耐力还是速度,都不行了。

我为什么跑步呢?

似乎也不是为了参加马拉松,就是图个乐子。比较功利原因,跑步可以提高睡眠质量,可以维持大脑的智力。但本质上其实是身体被某种力量召唤着跑步,不跑就不舒服。

“今天说了好多话啊,好累,想独处一会,去跑步吧”

“今天脑子想事情太多,快成浆糊了,去跑个步吧”

常年跑步的人并不依靠坚持和毅力,而是本性使然,并不值得称赞。

既然36岁了,那就继续降低配速吧。当我把配速降低到 8分钟/km 时,运动强度和身体机能开始和谐相处,即使每天跑步也不会膝盖痛。

干脆也不带手机了,不在各种软件中打卡,不记录跑的总里程。政府(或互联网公司)也甭想通过数据分析对我进行画像。

今年夏天热的离谱,穿最好的速干衣也不如光着膀子凉快。每次跑步我都把T恤脱了缠在手上当毛巾,然后光着膀子跑,虽然不雅观,但是真凉快。出汗时还能拿T恤擦汗。

公共发言

2022-09-28 08:00:00

昨天老板说,某个功能你也做了很久了,可以给同事们做个demo,讲一下干了什么,进度是什么,成果是什么。

我本职工作挺忙的,我本来想蒙混过关的。所以还是准备了PPT,按照金字塔原理组织大纲,彩排了几遍。

会后同事们给我的反馈都很好,说进步很大,讲了一个好故事,英文也挺流畅的。(其实他不知道我提前彩排了2遍。)

这让我开始复盘对待公共发言的态度。

美国性格直来直去,如果他做了80分,他绝对会说80分,不会故作谦虚。但中国人性格内敛,如果做了80分,他会说 “没有那么厉害啦,您过奖了,也就60分而已。”

所以在国际化的公司里,中国员工会倾向于“事了拂衣去,深藏功与名”。一旦有公共发言,心理上会把发言当成额外负担,“浪费时间”,“耽误自己干活”。

但公司这么大,业务繁多,同事们压根彼此不认识,老板也不认识每个员工。公共发言是一个绝佳的销售自己和团队的机会。

将来在发言这件事上,脸皮可以再厚一点。多发言,收集反馈,改进。留意那些优秀的人如何组织会议,如何夸别人,如何礼貌的控制时间。搞砸了也没关系,我只是个小人物,要有点阿Q精神。

Note

本文是写给低调且辛勤的员工们。平日懒惰但善于哗众取宠的员工,不在目标读者之列。

因果律

2022-09-26 16:30:09

亲爱的18岁的沐沐,

今天是2022年9月26日周一,上周你们刚发了一年级新生的校服,在这个周一小朋友们要穿上刚发的校服,举办这一学期正式的升旗仪式。

早晨起床,你还是一如既往的磨叽。

“沐沐,该起床了”

“沐沐,七点半了,该吃饭了”

“沐沐,该刷牙了”

“沐沐,你的书包昨晚收拾好了吗?”

虽然提醒过你一次,但你丝毫没有赶时间的意思。出发之前,还在摆弄玩具。我心里一次次的有唠叨你的冲动,想帮你再次检查一下书包,但是话到嘴边,又咽回去了。

在上学的路上,看到学校门口非常安静,大家都已经入校了,你开始不安了。

透过栅栏,你看到操场上各班级已经入场,你开始恐慌了。

你又问我 “爸爸,我的练习册放到书包里了吗?”

该放手时就放手,生活是最好的老师,你开始学习承担后果吧。

上次忘记带铅笔,你只能借同学的铅笔,回家后就偷偷在书包放了一支备用铅笔。上次迟到了,你在众目睽睽下进教室,我猜你是脸红的,也吸取了教训。

这一次升旗仪式,全班同学整装待发,就差你一个人,你又要脸红心跳的面对同学们的眼光了。

当人做出糟糕的决策时,就必定要承担后果。

好酒吃肉,就会贫穷。

贪睡懒惰,就穷乏。

替人做担保,就被牵连破产。

醉酒,就会放荡。

迟到和丢三落四有种小错,可以成为练习的道场,吃点苦头,吸取教训,不至于将来犯一些粉身碎骨的错误。

以终为始的思考教育

2022-09-20 08:00:00

沐沐现在七岁,和他在一起相处的时候,会觉得未来的路很长,先把眼前的学业处理好,其他可以等大大后面再教。

转念一想,孩子不过是我人生匆匆过客,他到18岁考入大学,就展翅高飞了。我固然想让他将来住的离我近一点,多见几面,但更有可能他会去不同的城市,甚至不同的国家。

18-7 = 11,只有11年,原来相处的时间是那么少。我一直努力的在教他实践”艾宾浩记忆曲线“,”间隔记忆“,”通过输出锻炼英文口语“,”逻辑“,“学以致用”,但是却从未系统化的和孩子讨论价值观。

18岁时,他恋爱时的择偶观是什么?

品格与美貌并不冲突,但鱼与熊掌不可兼得时,他会做何等的选择?

贪图女孩子的美丽,找错伴侣,会带来一生的痛苦。

箴言 21:9 宁可住在房顶的角上,不在宽阔的房屋与争吵的妇人同住。 箴言 19:13 愚昧的儿子是父亲的祸患,妻子的争吵如雨连连滴漏。

如果他慧眼识珠,找勤劳,节俭,慷慨,怜悯的女子,这回给他带来一生的祝福。

《箴言》31章 10-31:

10才德的妇人谁能得着呢?她的价值远胜过珍珠。
她丈夫心里倚靠她,必不缺少利益;她一生使丈夫有益无损。
她寻找羊绒和麻,甘心用手做工。
她好像商船从远方运粮来,未到黎明她就起来,把食物分给家中的人,将当做的工分派婢女。
16她想得田地就买来;
用手所得之利栽种葡萄园。
17她以能力束腰,使膀臂有力。
18她觉得所经营的有利;她的灯终夜不灭。
19她手拿捻线竿,手把纺线车。
20她张手周济困苦人,伸手帮补穷乏人。
21她不因下雪为家里的人担心,因为全家都穿着朱红衣服。
22她为自己制作绣花毯子;她的衣服是细麻和紫色布做的。
23她丈夫在城门口与本地的长老同坐,为众人所认识。
24她做细麻布衣裳出卖,又将腰带卖与商家。
25能力和威仪是她的衣服;她想到日后的景况就喜笑。
26她开口就发智慧;她舌上有仁慈的法则。
27她观察家务,并不吃闲饭。
28她的儿女起来称她有福;她的丈夫也称赞她,
29说:“才德的女子很多,惟独你超过一切!”
30艳丽是虚假的,美容是虚浮的;惟敬畏耶和华的妇女必得称赞。
31愿她享受操作所得的;愿她的工作在城门口荣耀她。

18岁时,他会管理自己的金钱吗?

他会储蓄吗?他会量入为出吗?他会做财务预算吗?他会控制风险吗?

傅雷在家书中,一再叮嘱儿子管理好金钱。

孩子,光是瞧不起金钱不解决问题;相反,正因为瞧不起金钱而不加控制,不会处理,临了竟会吃金钱的亏,做物质的奴役。单身汉还可用颜回的刻苦办法应急,有了家室就不行,你若希望弥拉也会甘于素衣淡食就要求太苛,不合实际了。为了避免落到这一步,倒是应当及早定出一个中等的生活水准使弥拉能同意,能实践,帮助你定计划执行。越是轻视物质越需要控制物质。你既要保持你艺术的尊严,人格的独立,控制物质更成为最迫切最重要的先决条件。孩子,假如你相信我这个论点,就得及早行动。

箴言书也有诸多劝诫

箴言13:7 假作富足的,却一无所有;装作穷乏的,却广有财物。

箴言30:25 蚂蚁是无力之类,却在夏天预备粮食。

箴言书 23:19-21 我儿,你当听,当存智慧,好在正道上引导你的心。 好饮酒的,好吃肉的,不要与他们来往;因为好酒贪食的,必致贫穷;好睡觉的,必穿破烂衣服。

箴言22:26 不要与人击掌,不要为欠债的作保。

他会为了虚荣,购买一堆没用的东西吗?他会为了享乐而刷爆自己的信用卡吗?他会慷慨过度,而泥菩萨过江吗?他会为了钱,和坏人结盟,坑蒙拐骗吗?

巴尔扎克因为和贵族圈子,虚荣消费,终日被债主催债。牛顿把自己的钱买了股票,亏的一塌糊涂。

大学毕业后,他会如何选择自己的职业?

他会为了钱,从事一些对社会毫无用处的职业吗?

生活中不乏这种新闻。

清华北大的高材生,开发假冒的炒股软件,骗取股民的钱。

软件工程师跑到柬埔寨和越南,开发赌博网站,骗大陆人赌博。

程序员在 Github 上随便克隆一下加密货币的代码,发行一些空气币,割韭菜。

能考上清华北大,证明他们智力非凡。但这些聪明人把理性用到了黑暗面,导致社会更加支离破碎。

除了学业,似乎有一打的东西要教他,然而和孩子相处的时间只有11年,并不是一生那么久。

小孩自学编程的软件

2022-09-15 06:59:59

教小孩不能一上来就教他对象,条件判断,变量等复杂概念,要不然吓到他,就没办法教下去了。

比较好的编程软件会让小孩觉得打游戏,并且潜移默化的学习了编程思想。

4-10岁编程教学软件

国外适用于4-10岁的编程软件:Tynker Jr, Kodable,CodeSpark,Scratch。

Tynker

Tynker 有两个阶段的课程,第一阶 Introduction to code 适合 7-12岁的儿童。

网址:https://www.tynker.com/

Code Spark

年龄:5-9岁

收费:默认订阅制,但是可以和客服联系,说想要一次性买断的优惠券。我用的优惠券链接是 backtoschool99

Monthly Yearly Lifetime
9.99 美金/月 79.99 美金/月 99 美金/终生 (链接)

官网:https://codespark.com/

用后评价

软件的趣味性很强,教学内容循序渐进,不需要大人指导小孩。

软件有多种学习模式,小孩可以按照路线图一步步闯关,也可以在网上与别人编程对战,自由玩耍。

缺点

Code Spark 的服务器都在美国,在开启新关卡时,下载需要耗时3-5分钟。有时候连不上,需要翻墙。

它三个栏目,puzzles 比较简单,explore 比较难。

Kodable

年龄:4-11岁

收费:订阅制,或一次性买断。

Monthly Yearly Lifetime
9.99 美金/月 59.99 美金/月 149.99 美金/终生

官网:https://www.kodable.com/

试用评价

暂时还没试用。

Scratch

适用年龄:8-16岁

收费:免费。麻省理工学院出品。

官网:https://scratch.mit.edu/

用后评价

  1. 这个网站在中国被封了。据说是中国教培机构克隆了 Scratch,然后在 Scratch 的论坛上上传大量政治敏感内容,导致 Scratch 被封。和当初百度搞 Google 的思路一模一样。 无耻,龌龊!
  2. 对小孩的英语要求较高,需要看得懂菜单中的各种单词的意思。8岁之前,最好不要碰。

由于中国防火墙的存在,很多优秀的软件在国内是无法使用的。如果你不具备翻墙的能力,建议买 “洪恩编程”等国内的编程教学软件。

13-18岁

Tynker

Tynker 第二阶段的课程 “LEARN REAL-WORLD CODING” 是真刀真枪的 Javascript 和 Python 代码,适合 13-18岁的小孩。

参考资料

Stack Overflow Blog: Want to teach your kids to code? Here are three apps that can help.

财务管理:要买车吗?

2022-08-31 02:39:11

我住在上海。

七年前我太太怀孕时,朋友们建议我买车,方便带孩子出游。从上海开到太湖,莫干山,杭州,3个小时车程内,一脚油门,想走就走。此外他们说下雨天不好打车,万一遇到急事还是开自己的车最方便。

拖到现在,一直没买,日子过得还挺合,急事没碰到一件。

我曾经仔细考虑过买车,先买一辆十万之内的二手车练练手,但是最终放弃了,不想为了解决一个简单问题,引入更复杂的问题。

老小区充电难、停车难。 上海市区以老破小为主,每天上演抢车位大战,公共车位先到先得,停车费半天劲。因为没有自己的停车位,无法安装充电桩,电动汽车车不仅停车难,充电也难。

租的房子通常没车位。 我家常年租房子,差不多2年搬一次家。家里东西越多,找到合适的房子的概率就越低。如果买了车,还得替它找车位,只能选高档点的小区,选择的余地越来越小。

对于学习的人,开车未必节省时间。 坐地铁慢,但是路上可以背单词,看书,学习。我以前上班单程需要1.5个小时,早晨7点我就坐地铁出发,地铁上可以干很多事情:

开车的话,就只能专心开车了。无法学习,无法思考,无法锻炼身体。

换工作后,我成为一个远程办公的工程师。每天上班就是从客厅走进书房,10秒钟就位,更近了。 我太太走路上班,10分钟到达。用车的频率更低。

汽车在不断贬值。 房子会抵御通货膨胀,运气好会增值;债券会有利息,股票是现金奶牛,会源源不断吐出股息。但当买入汽车的一刹那,其价值就开始缩水,每年都在折旧。

汽车需要维护费,是未来的负债

在上海持有一辆汽车,每年的维护成本要 2 万。换句话说,一旦购入,未来的每年都已经负债 2万。

“下雨天不好打车,有急事叫不到车,所以要买车” 这种理由也不成立。 上海平日下雨的概率并不高,为了一个很低的概率支付巨额支出,显然不划算。打不到车就加钱呗,重赏之下必有司机。下雨时“加价50”,或者打豪华车都行,每年额外支出1000块钱加价费就可以解决。

家里没车,也有诸多不方便。

我的驾驶技术彻底忘记了。 考出驾照1年了,我的驾驶技术都还给老师了。

回老家不方便。 走亲访友没有车特别不方便,骑自行车拜年也特别没面子。但想到一年至多回2次老家,没面子就没面子吧,面子是给别人看的,省的钱却是实打实的自己的。

如果辩证的看,“看上去穷”不算坏事,就不会有人找我借钱了。

无法开启说走就走的旅行

因为没车,不能任性的来一次说走就走的旅行。如果要进行跨城市的旅行,要提前计划好,定高铁的票,定酒店。

不够有钱

不买车的理由千千万,简言之”不够有钱“。

如果年薪百万,家里有150平住宅,谁还会会为每年2万块钱斤斤计较,即使它天天趴在家里我也果断买车。

如果有自己的地下停车位,电梯直达,不用在老破小区里瞎晃半小时找停车位,那我也果断买车。

钱不够时,可以硬踮起脚来消费,艰难维持。也可以降级消费,买一些高频使用的显著提升生活质量的东西。

我见过的最本末倒置的消费观念就是在大头上浪费,在小头上节省。比如学生省吃俭用吃泡面,攒钱买LV或新款牛仔裤。老年人勤俭持家,每个月水电费省出100块,过年买衣服花了1500块,一年穿不了几次。

金钱管理应该在在大头上节俭,在小头上任性。

因为没买车,每月省出一大笔支出,在小地方就可以任性,不用抠抠索索,这极大改善了家庭的幸福感。

我在用的工具清单》这篇文章详细记录了我的钱糟蹋在什么地方。反正再怎么折腾,也没有买车和养车花的钱多。

我们家的现在的出行方案以及花费

城市:上海

出行范围 方案 花费
10 km 以内 电动自行车 0元
10 km 以内 自行车 0元
10-100 km 以内 滴滴、美团 200-300元/次
100 km 以上 长途汽车、高铁 100元-300元

我们家买了2辆电动自行车(小电驴),10 km 以内的出行,小电驴又省钱又方便,真是爱死他们了。

如果将来有钱了,不管是买新车还是二手车,我大概率还是会买辆普通的车。

鼓励别人

2022-08-17 08:00:00

我给沐沐布置了一个任务,每天赞美鼓励家人一次。

总之,要有一双善于发现的眼睛,发现别人的优点,肯定别人的努力和付出。不要总是唯我独尊。

我又解释了”鼓励别人“和”阿谀奉承“的区别。

鼓励言语是为了对方好,让对方更自信,也让对方有源源不断的动力。拍马屁是为了自己好,获取好感,拉近关系。

正直人鼓励别人不求回报,小人阿谀奉承是因为有利可图。

鼓励别人时,也要有技巧。要以事实为根据,细节越具体越好。

如果夸赞妈妈,不能总是说”妈妈的钢琴进步好大啊“这种敷衍式的鼓励。而是要指出哪个和弦的处理更细腻了。

实事求是的鼓励和诚实的批评一样宝贵。

Rails 部署管理

2022-08-12 08:00:00

当使用命令行 rails new 去创建一个新项目时,Rails 默认会创建三个环境:

在项目的最早期,还处于验证想法阶段。工程师的工作流程也比较粗狂,写代码,跑测试,然后直接部署代码至生产环境。

业务的第一阶段:少量客户阶段

产品不断迭代,逐渐的有客户开始使用产品。为了保证工程质量,这时候需要给 Rails 添加一个预发布环境,通常大家都命名为 staging 环境,工作流程也开始严谨:

  1. 工程师在本地开发新功能。(developer 环境)
  2. 在CI(或本地)跑测试。(test 环境)
  3. 代码合并到 staging 分支,并且部署到 staging 环境,QA 工程师测试新功能。
  4. 如果没有bug,则部署到 production 环境,供客户使用。
environments
├── development.rb
├── staging.rb
├── production.rb
└── test.rb

业务的第二阶段:大量客户 + 多团队协作

如果产品市场反响良好,客户越来越多。工程师团队规模也由几个人扩增到几十人或上百人。人员众多,且共用一个 staging 环境,合并代码到 staging 分支时容易冲突。

程序员耐心时,遇到代码冲突会联系原作者,一起解决。如果是跨国团队,因为时差的原因,一个来回的沟通需要一天时间。这时候程序员可能就没了耐心,直接重置 git 的 staging 分支。这会导致一系列的误会,别人正在测试的功能凭空消失,QA 工程师上报 bug,结果细查下来是代码重置导致的。

为了降低代码冲突和沟通成本,很多公司会为各团队创建专属的部署环境,而不是吃大锅饭。各团队井水不犯河水,如果某个部署环境出现问题,也只会影响到单个团队,不会拖累整个公司开发进度。

实例 部署的Git分支 用途
production release/xxx 给客户使用的生产环境
demo demo 销售给客户做演示。
staging main / 下一个 release 分支 用于上线前的回归测试
staging-1 staging-1-branch 给 “小熊猫” 团队使用
staging-2 staging-2-branch 给 “自杀小分队” 团队使用
staging-3 staging-3-branch 给 “星河战舰” 团队使用
staging-4 staging-4-branch 给 “深海水妖” 团队使用
staging-… staging-6-branch 给 … 团队使用

工程师越多,需要的 Rails 部署环境也越多。如果我们要创建6个部署环境 staging,staging-1, staging-2, staging-3, staging-4, demo, 该怎么做呢?

可以在 Rails 的 config/environments 目录下创建6个配置文件。这是 Rails 推荐的配置风格,原汁原味。

> tree environments                                                      
environments
├── demo.rb
├── development.rb
├── test.rb
├── production.rb
├── staging.rb
├── staging-1.rb
├── staging-2.rb
├── staging-3.rb
├── staging-4.rb
...

但事情没那么简单,除了 config/environments,还有许多额外工作。我们要在 config/database.yml 添加 6 个新部署环境的数据库配置。

default: &default
  adapter: postgresql
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV.fetch("DATABASE_USER", 'postgres') %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  port: 5432

production:
  <<: *default
  
demo:
  <<: *default
  
staging-1:
  <<: *default

staging-2:
  <<: *default
  
staging-3:
  <<: *default
...

此外,如果有些工程师在常量中定义配置,那我们还需要全局搜索 Rails.env,确保新创建的部署环境,都有匹配的赋值。尤其是在犄角旮旯里定义的变量,如果遗漏,新部署会一直报错。

比如,有人会把各个部署环境的 Redis 地址写在了常量中。

# config/initializers/sidekiq.rb

case Rails.env
when :demo
  REDIS_HOST = 'redis-demo.3922002.redis.aws.com:6379'
when :staging-1
  REDIS_HOST = 'redis-s1.3922002.redis.aws.com:6379'
when :staging-2
  REDIS_HOST = 'redis-s2.3922002.redis.aws.com:6379'
...

在常量里定义配置,太容易出错。多数工程师会把不同部署环境的配置抽出来,放到不同的配置文件中,并且用一些库来管理,Rails 常用的库是 “rubyconfig/config”1。如果团队在使用这些库,我们也需要为新的部署环境添加配置文件。

config/settings/demo.yml
config/settings/production.yml
config/settings/staging.yml
config/settings/staging-1.yml
config/settings/staging-2.yml
config/settings/staging-3.yml
config/settings/staging-4.yml
...

以上方案有几个的缺点:

第一,即使有完备的内部文档,全套走下来,工程量不小,人力成本很高。

第二,每次创建新的部署环境都要修改老代码中的常量。修改正在运行的老代码乃兵家大忌,稍有不慎就会bug缠身,死无葬身之地。

第三,安全性差。配置中包含 client_secret,token,私钥,如果代码不幸泄露,各种秘钥被一锅端。使用这种方案创建的 docker 镜像混杂了各种配置信息,不干净。万一泄露,也是个麻烦事。

虽然有种种缺陷,但这种 Rails 原生的解决方案也能维持一段时间。

业务的第三阶段:多租户方案 + 私有化部署 + 百人以上开发团队

项目早期,通常只有一个 production 部署环境。

  1. 如果产品面向的是普通客户(To C),一个 production 部署就能满足所有客户的需要。
  2. 面向企业客户的 SaaS 产品,早期也是多租户 (multi-tenant)设计,一个 production 部署环境服务所有的企业。

因此很多程序员脑子里有个假设:”production 部署环境只有一个”。随着业务的增长,这种假设会被打破。

为了国家安全,一些国家要求本国的公民的数据必须保存在本国的数据中心。Apple iCloud 既在美国有数据中心,也在中国贵州有数据中心,同一套代码部署在中国和美国,都是以 production 模式运行。抖音在美国部署在 Oracle Cloud上,在中国则部署在自己的机房里,他们也都以 production 模式运行。

大客户出于安全的考虑,要求私有化部署 (self-hosted)。阿里云同样一套代码,会卖给政府,中国电信,公安系统,代码部署在他们各自的机房。

开源项目的部署。Gitlab 是一个开源的代码管理平台,中小客户没有运维团队,通常会在 gitlab.com 注册一个账户直接使用;大客户财力雄厚,有自己的机房和运维团队,通常会部署 Gitlab 到自己的内网,并且只允许公司内网 IP 访问。

所以一套 SaaS,在真实的世界中的部署场景应该是这个样子:

运行实例 部署的Git分支 用途
production release/100* 部署在公有云上,多租户使用的 SaaS
production-gov release/101 客户为政府,部署在政府私有机房
production-cnpc release/99 客户为中石油,部署在中石油私有机房
production-china-police release/100 客户为中国警察,部署在公安私有机房
production-us-police release/100 客户为美国警察,部署在 AWS
production-huawei release/100 客户为华为,部署在内网
demo demo 销售给客户做演示。
staging main / 下一个 release 分支 用于上线前的回归测试
staging-1 staging-1 branch 给 “小熊猫” 团队开发测试使用
staging-2 staging-2 branch 给 “自杀小分队” 团队开发测试使用
staging-3 staging-3 branch 给 “星河战舰” 团队开发测试使用
staging-4 staging-4 branch 给 “深海水妖” 团队开发测试使用
staging-… staging-… branch 给 … 团队开发测试使用

note: release 分支:在 Trunk based development2 的工作流中,QA(或CI)会定期从最新的 main 分支创建部署分支,跑测试,如果没有bug,该分支就可以部署到生产环境。

当有众多 production 环境时,难道要把所有客户的配置都混入到代码里吗?显然不可能!客户也不答应!所以大家不约而同的认为代码应该无状态,配置信息应单独存储,这样创建一个部署环境时就不需要改动一行代码了。

概念:部署 (deploy)

当代码的 production 环境只有一个时,我们可以用 “production 环境”这个术语指代唯一的那个生产环境。可是 Gitlab 被千千万万个企业运行,production 实例不计其数,在沟通的时候,”production 环境”就个术语就无法指代任何事3

为了更精确的表达,在后半篇文章中,我们用部署(deploy)这个概念表述代码部署到某个数据中心后运行的实例。

同时 Rails config/environments 目录下的几个文件 production.rb / staging.rb / development.rb / test.rb ,我们称之为代码的运行模式

比如,当 Gitlab 部署到华为内网时,我们说 “Gitlab 在华为内网创建了一个部署(deploy),它的运行模式为 production”。

The 12-factor Application

Heroku 写过一篇 SaaS 架构文章 《12-factor Application4》,概括了设计 SaaS 应用的12条原则,被奉为圭臬,时至今日,依然无出其右。

第一条原则:一份基准代码(Codebase),多份部署(deploy)

每个应用的一份基准代码,可以同时存在多份部署。每份部署相当于运行了一个应用的实例。通常会有一个生产环境,一个或多个预发布环境。

第二条原则:显式声明依赖关系 (dependency)

同样的代码,在不同机器,依赖要一致,行为也要一致,比如:

第三条原则:在环境中存储配置5

12-Factor 推荐将应用的配置存储于环境变量中( env vars, env )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码。

Docker

比如 Docker 允许你把配置放到环境变量中,从而创建不同的实例(container)。

docker run --name postgresql \
  -e POSTGRES_USER=myusername \
  -e POSTGRES_PASSWORD=mypassword \
  -p 5432:5432 -v /data:/var/lib/postgresql/data \
  -d postgres

Helm

Helm6 是一个 Kubernetes 应用的包管理工具,它也遵循了 12-factor 的前三条原则。它有三个核心概念 chart,config,release。

几乎所有优秀的开源软件都遵守 12-factor,除了优秀的架构能力,我猜测作者从第一天就知道,这份软件会被千千万万家公司使用,代码和配置必须分离,绝对不能硬编码。

我们的代码不会部署到千万家公司,但是借鉴 12-factor 思想,可以让我们快速创建和维护十几个部署。DevOps 省时省力,业务程序员专心开发,销售演示功能时自信满满的,互不干扰。

借鉴 12-factor 的方案

第一步,让代码无状态,代码中所有的配置信息都取自环境变量。

比如,DB 的配置要取自环境变量。

# config/database.yml
# ...
production:
  <<: *default
  database: <%= ENV['DATABASE_NAME' %>
  host: <%= ENV['DATABASE_HOST'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
...

Sidekiq 的配置也取自环境变量。

# config/initializers/sidekiq.rb

Sidekiq.configure_server do |config|
  config.redis = {
    host: ENV['REDIS_HOST'],
    port: 6379
  }
end
# ...

任何逻辑,但凡和部署相关,其配置都取自环境变量。

class OauthController < ApiController
  def redirect
    redirect_to(ENV['GOOGLE_OAUTH_URL'])
  end
end

第二步,准备配置文件。

为 staging-1, staging-2, staging-3, staging-4,demo,production,production-gov,production-china-police,production-us-police 等部署创建配置文件。

如果你使用的是 AWS,可以把某个部署的配置保存在 AWS Systems Manager Parameter Store,敏感信息可以保存在 AWS secret manager

# 创建 staging-1 的配置信息
aws ssm put-parameter \
    --name "staging-1-configuration" \
    --value "parameter-value" \
    --type String \
    --tags "DB_HOST=xxx,DB_USER=xxx,DB_PASSWORD=xxx,REDIS_HOST=xxx,GOOGLE_OAUTH_URL=xxxx"

如果你使用 Kubernetes,可以把某个部署的配置信息保存在 ConfigMap,敏感信息保存在 Secret 中。

# 创建 staging-1 的 ConfigMap
kubectl create configmap staging1-config-map \
  --from-literral="DB_HOST=xxx" \
  --from-literral="DB_USER=postgres" \
  --from-literral="DB_PASSWORD=xxx"

# 创建 staging-1 的 Secret
kubectl create secret generic staging1-secrets \
   --from-literral="GOOGLE_CLIENT_ID=xxxx" \
   --from-literral="GOOGLE_CLIENT_SECRET=xxxx" 

第三步,以 production mode 运行各个部署实例。

几乎所有的工程师都曾遇到过类似问题:

为什么代码可以在同事的机器上运行,但是无法在我的机器上运行?

为什么代码可以在本地运行,但是无法在 staging 运行?

为什么代码在 staging 上没有问题,但是上线后客户后遇到一连串的问题。

很多问题是本地、测试、生产之间的差异导致的,比如本地开发用 Macbook,但生产服务器是 Ubuntu;本地开发数据库是 SQLite,生产数据库则是 PostgreSQL;本地开发拿内存做缓存,生产用 Memcached 作缓存。《12-factors App》称这种差异为 Dev/prod parity7

为了消除不同部署之间的差异,对于 production, production-huawei,demo,staging-1, staging-2, staging-3 等,我都以 production 模式来运行:

RAILS_ENV=production rails s

第四步: 把代码和配置组合在一起,创建一个个部署。

如果你使用的是 Capistrano 部署代码,那么

Code + 配置 = 部署

如果你使用的是 Docker 部署代码,那么:

Docker Image + 配置 = 部署

如果你使用的是 Kubenetes,将不同配置文件注入到了Pod 中,就变成了不同的部署。

---
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: webapp
  name: webapp
  namespace: default
spec:
  containers:
  - name: web-app
    image: web-app:staging-1
    envFrom:
    - configMapRef:  👈 看这里
        name: staging-1-config-map
    - secretRef:     👈 看这里
        name: staging-1-secrets

优点

  1. 代码无状态,可以被复用。如果想创建部署,只需要准备一份新的配置文件就可以,省事省力。

  2. 代码和 Docker image 中不包含机密信息。即使代码泄露也不会扩大风险。

  3. 方便私有化部署。

  4. 可以为不同部署的配置文件可以设置不同的访问权限,比如仅仅允许特定团队访问 production 部署实例的的配置信息。

  5. 所有部署的运行模式都是 production mode,以此消除不同部署之间的差异。 (关于本条,大家可以根据自己的实际情况做决定。有些人喜欢以 staging mode 来运行 staging 部署实例。)

缺点

NewRelic, Datadog, Sentry 等监控工具默认会把环境信息附着在监控数据上,方便筛选过滤。在第二种方案中,所有的部署的运行模式都为 production mode,这导致监控数据都混在 production 下。遇到事故,工程师根本无法排查是哪个部署出了问题。

如何解决监控工具的问题?

其实 Datadog, New Relic, Sentry 提供了接口,允许我们自定义部署的名字,以 Datadog 举例,它的语法如下:

Datadog.configure do |c|
  # ...
  c.env = "你喜欢的部署名"
end

因此我们可以在 staging-1, staging-2, staging-x, production-x 等不同部署的配置中,引入一个新的变量 “DEPLOY_ID” 来声明部署的名称,并传递给监控工具。

把 DEPLOY_ID 传递给 Datadog8

Datadog.configure do |c|
  c.env = ENV['DEPLOY_ID'] # prod / staging-1 / demo / prod-huawei
  # ...
end

把 DEPLOY_ID 传递给 Sentry9

Sentry.init do |config|
  #...
  config.environment = ENV['DEPLOY_ID'] # prod / staging-1 / demo / prod-huawei
end

把 DEPLOY_ID 传递给 New Relic10

# config/initializers/newrelic.rb
NEW_RELIC_ENV=ENV['DEPLOY_ID']
NEW_RELIC_LICENSE_KEY=ENV['NEW_RELIC_LICENSE_KEY']
...

这样就能保证监控工具的正常显示了。

感谢

本文中的方案,来自于 Workstream 同事们 和 SAP 前同事们的实践经验,我只是加工整理,提笔记录下来。

特别感谢 Louise Xu, Felix Chen, Vincent Huang, Teddy Wang, Kang Zhang 的审校和反馈。

参考资料

我在用的生产力工具

2022-07-28 01:27:45

我是一个程序员,这是我每天办公用到的软件和硬件。

硬件

软件