0%

2023-12-30: 他不害羞

电梯里,他睁着大眼睛,抬起头,目不转睛地望着旁边的阿姨,一直望着阿姨,一直望着阿姨。我们都看着他,忍不住笑。他突然开始朝着阿姨笑,没有发出声音。阿姨也看向他,看他望了很久,也开始对他笑,“小朋友真可爱!”

电梯里,几位叔叔阿姨一起同行。电梯门开了,叔叔出电梯了。“叔叔拜拜,叔叔拜拜!”他对着电梯门大声说。电梯门又开了。“阿姨拜拜,阿姨拜拜!”电梯里面进来一个人,阿姨没有下电梯。姥姥说,“阿姨还没到。”

电梯门开了,我们到了。我们走出电梯。“叔叔拜拜,阿姨拜拜,爷爷奶奶拜拜!”

2023-12-24: 童言

“小鸡怎么叫?”“小鸡叽jī叽jī叽jī。”

“小狗怎么叫?”“汪wàng汪wàng”

“大公鸡怎么叫?”“咯gé咯gē咯gé。”

“母鸡怎么叫?”“母鸡咯gé咯gē哒dà。”

“关guán门啦。”在看了很多遍小兔子乖乖的视频之后,他经常这样说。

有一次,家里人围坐在一起教他说话,一个人说,“妈妈好棒”,另一个人说,“妈妈好笨”,到他嘴里,最终变成了“妈妈好beng!”

2023-12-17: 传承

“搞破坏,搞破坏不乖”,在跟他说过这些之后,这几句成了他这几天的口头禅。

“瞎搞”,偶尔也能从他嘴里冒出来。

很久以前,每次在他准备打开平板电脑的时候,都会跟他说,“这个搞不得”。现在,当他发现平板电脑在旁边,想去玩一玩的时候,只要我在旁边,他都会重复之前说过的话:“这个搞不得”。

“拉粑粑要跟妈妈说”,虽然他现在还是每次拉完粑粑都不说,但是每当我们问起他为什么不说的时候,他总是重复着上面这句之前跟他说过的话。

传承,是个很奇妙的过程。

2023-12-16: 他其实学会了

和家里人一起在公园游玩,小孩子推着他自己的婴儿车往前走,这是他一直很喜欢的事情。

突然,地上有一个坑,挡住了婴儿车的轮子,推不动了。他望着姥姥说,“姥姥帮忙,姥姥帮忙!” 姥姥一脸惊诧,“哎呀呀,姥姥帮忙?真能干啊,什么时候学会叫姥姥帮忙了?什么时候学会的啊?这没人 …

2023-12-14: 又好气又好笑

家里小孩很喜欢吃蛋卷,但是有个坏毛病是喜欢每次拿一大卷,在吃的时候又总是免不了残渣掉满地。

一天中午,我特意把蛋卷掰成了一小块,递给他,小伙子用充满稚气的话说,“好大坨!” 小孩妈妈在旁边捂着嘴,禁不住地笑出声来,“哈哈哈,哈哈哈,好大坨!”

从此,小伙子记住了,“好大坨”这个词很好笑。后来很多次,他玩着玩着就突然冒出来一句:“好大坨”。

2023-12-12: 难得的安静

早上送完人回到家,小孩子已经起床穿好了衣裳,家里人正在准备早餐。

“要吃饼饼”,小孩子指着一袋子蛋卷说。看看给他准备的牛奶马上就要好了,就对他说,“我们先喝牛牛好不好,喝完牛牛再吃饼饼”。小孩子一改以往得不到就吵闹的样子,嘴上说着“喝完牛牛再吃饼饼”,往摇奶器那边走过 …

2023-12-11: 他也要做决定

今天天气不错,一阵微风吹散了笼罩城市多日的雾霾,太阳也从云层中探出头,把光明撒向大地。

去晒个太阳吧,这是个好主意。午饭之后,待孩子睡了一个午觉起来,家里人就开始收拾东西,尿不湿、水、各类纸巾、零食等等。我还特意剥了一个特别难剥的柚子。

好了,一切收拾妥当,准备出发。

小孩子快两岁了,跟着我们迈着小步子朝电梯走去。到停车场了,准备上车。爸妈把门拉开,示意小孩上车。“不上车,不上车,不坐车车,不坐车车”,小孩突然开始吵闹起来,一靠近车子就把身子往外面扭。咦?这是怎么回事,以前坐车都好好的,怎么今天突然不愿意坐车呢?

爸妈开始哄孩子,“乖,快上车我们去晒太阳,外面天气好好哦”,劝了好半天,小孩就是无动于衷。

等了好一会儿,小孩还是不愿意上车。实在没办法,大家只好收拾东西折回家去。

到了两岁的年纪,小孩子也想要自己做决定了。

2023-12-10: 城里人去住别墅

卧室外面是一个十来平的小院子,一张长方形的石桌子摆在一边,桌子旁立着四张方形石凳。桌子和凳子不少地方都露出了石头原本的颜色和样貌。

深秋时节,金黄色的银杏叶飘落,零星的洒落在院子里。拾起一片,满片树叶都是黄色,像是已经熟透了,有的地方甚至有点泛白。叶子上面的脉络,清晰可见。

邻居院子突然传来几声清脆的交谈声,有两个人,说的是无聊的琐事,但清脆的声音在安静的环境中显得特别清晰且响亮。可惜和他们隔着一堵墙,我踮起脚也只能看到他们的头顶,否则真想和他们打声招呼,问问看是否吃过了早餐。

这里也能听到鸟叫,偶尔还有几只小鸟悄没声地飞到院子里,在草丛里面翻找着食物。

不禁开始怀念起小时候在农村家里的样子,也是安静的早晨,新鲜的空气,唧唧乱叫的小鸟,和清脆的人声。

2023-09-30: 中秋节的月亮

10小时自驾,在一轮满月的陪伴下到家,终于见到一个月未见的小孩。平常的他10点睡觉,但今天,快到11点了,他还没有睡。

开门就发现,他满脸堆笑的站在门口,“哦!哦!哦!”高兴地拍手。

妈妈上前去,想要抱起,小孩有点不知所措,竟然推开妈妈的手,想要保持一点距离。大概在快速成长的小孩眼里,一个月已经是很长很长的时间了。

最终他还是投入了妈妈的怀抱。妈妈仔细端详起来,“长高了一点,越来越瘦了”。

小孩还是那么活泼,感觉有无穷的精力,在屋子里跑来跑去。现在正是语言爆发期,大人说什么,简单的,他也能跟着说。“好多大车车”,“骨头”,“鸡肉”,“丢到垃圾桶”,这些都是他新学到的几句话。

今天晚上,小孩兴奋了很久,12点才有睡意。

2023-09-29: 你看到的是什么

客户下班时间有事找到你,你会觉得这是一个新机会,还是烦人的加班工作?

碰到一个很复杂的技术问题,你会觉得这是一个提升的机会,还是一个巨大的风险?

梭罗说,我并不是说约翰或者乔纳森能够彻底明白这个道理;但正因为他们不明白,所以早晨只是时间的流逝,而不是真正的破晓。导致我们闭上双眼的阳光,对我们来说就是黑暗。只有在我们醒着时,天才是真正的破晓。日出未必意味着光明。太阳也无非是一颗晨星而已。

世界是什么样,那取决于你看世界是什么眼光。

2023-09-27: 正义的原则

作为20世纪最有名的政治理论家,罗尔斯,针对当下流行的功利主义正义观提出了批评,并提出了正义二原则来促进更大程度的自由和平等。

罗尔斯认为存在两类基本善(基本善是指经由社会合作产生并用于可分配的所有东西,比如财富、收入、人的自由、权利、机会、自尊等):一类“基本善”,如言论自由、人的自尊等,可以被平等分配;另一类“基本善”,如出身、天赋、收入、财富、机会、权力等,无法被平等分配。

如何解决这两类基本善的公平分配问题?罗尔斯提出了两个原则,即正义二原则:

第一原则是最大的平等自由原则:每个人对与其他人所拥有的最广泛的基本自由体系相容的类似自由体系都应有一种平等的权利。

第二原则包括差异原则和公平的机会平等原则:社会的和经济的不平等应这样安排,使它们

  • 适合于最不利者的最大利益,并与正义的储蓄原则相一致(差异原则);

  • 在公平的机会平等的条件下,使所有的职务和地位向所有的人开放(公平的机会平等原则)。

其中:第一原则优先于第二原则,即第一类基本善应该被公平分配;第二原则中,公平的机会平等原则优先于差异原则,即在出现第二类基本善的分配问题时,对所有人公平优于向弱者倾斜。

2023-09-26: 流水

最近做了一个明智的决定,那就是设置了短视频的每日使用时长。达到设置的时长之后,就需要输入密码才能继续使用,而我特意设置了一个随机的记不住的密码。

每次短视频提醒我的时候,我就知道:今天时间已到,需要安排其他事情了。于是,果断关闭它。

突然发现周末的时间变多了,可以做一些其他的事情。散步,做一餐饭,运动一下,打扫一下家里的卫生,把早该清洗的家具清洗一下,上网查一查东西要买哪一个品牌。生活一下子变得更充实了。

短视频就像流水,你坐在船上,水载着你自动往低处流去。如果你不主动停下,水就载着你越走越远。

2023-09-25: 用户体验

开火1:按压燃气灶开关,扭动,电池打火装置啪啪啪响起来;此时不能松手,需一直按着开关,否则将因为刚开始时燃气浓度太低而熄火;直到火势稳定,放手。

开火2:按压燃气灶开关,扭动,松手,火随之打着;为避免熄火,燃气灶自动保持啪啪啪打火,直到火势稳定。

煮蛋1:打着火,放入水和鸡蛋,记下开始时间,并计算煮好的时间;去忙其他事;时间到了,进厨房关火,捞出鸡蛋;再忙也不能忘记,否则,鸡蛋煮过了,或者,锅烧坏了。

煮蛋2:打着火,放入水和鸡蛋,设置13分钟定时关火;安心做其他事;其他事做完,回厨房,捞出煮到恰好的鸡蛋。

油烟机操作1:根据火势大小及油烟强度,判断吸力档位,然后,按动烟机上面的按键;炒菜完,不能忘关烟机,否则,它一直工作并发出呼呼呼的噪音;不能关太早,否则,空气中油烟未完全消除,余味绕梁。

油烟机操作2:无。(自动与燃气灶联动,开机、调节大小随火势自动变化;炒菜完毕自动延迟关闭)

2023-09-24: 感染力

她双手分别拿起一块鹅卵石,快速碰在一起,“铿”,声音不大,但在偌大的掉一根针都能听到的大厅里,这清脆的声音可以清晰地传入耳中。

紧跟着这一声“铿”,后排的三位伴奏者也同时敲下手里面的鹅卵石,三声“铿”分秒不差地重叠在一起,合并为更沉闷的一声“铿”传入耳中。

随着节奏往前推进,她一边敲击鹅卵石,一边轻声走向后面摆好的鼓阵。“铿铿”声瞬间切换为“咚咚咚咚”密集的鼓点,时而大时而小,时而密集时而稀疏,有时候是敲在鼓边的更清脆的“咚”,有时候是敲在鼓心的大声的沉闷的“咚”。这声音快起来的时候,她挥舞的鼓锤变成了看不清的残影;这声音慢起来的时候,她舞动的手臂像是在跳优雅而浪漫的古典舞。

谁说鼓只能拿来敲?只见她双手在鼓面上面划着圆圈摩挲,顿时响起一阵阵沙沙声,伴奏的三人也随之摩挲起来,一阵阵“沙沙沙沙”声此起彼伏。一会儿呼呼的风声响起,一会儿滔滔的水声响起,一会儿又“啪啪”的海水拍击礁石声响起,这声音哪里是来自她们手里的乐器?这声音分明是来自大自然!

一曲终了,她移步另一处鼓阵,这鼓锤再次与她手臂融为一体,一阵密集的鼓声之间,竟然出现了一声清脆的木棒碰到金属的声音。哦,这是旁边的金属架。开始是一声,后面越来越多,鼓声则越来越少。再后来,竟然全部是鼓锤敲击金属架的声音。随着她缓慢移步,旁边的鼓架、放乐器的桌面、桌子的桌角、地面全都变成了她的乐器。“铿铿”、“锵锵”、“砰砰”、“哐哐”、“啪啪”这不同质地的敲击声和谐地有节奏地发出,组成了一曲错落有致的壮丽乐章。

2023-09-23: 语言的能指和所指

著名的语言学家索绪尔在分析了语言的结构之后,发现我们所说的每一个语词都存在能指和所指两个概念。

能指是指一个语词的符号,而所指是指该符号所表达的概念和意义。能指是人们想要表达其所指时赋予的一个符号。

所指优先于能指而出现。比如,苹果作为一种球形的红色水果,在没有人类语言之前也是一直都存在的,人们为了表达这种水果,于是设计了一个符号“苹果”。

区分了能指和所指之后,就能理解,当我们想要表达某一个意思(所指)时,我们通过说出来一系列符号(能指)来实现。但是,听众却只能通过这些能指来理解我们的所指。于是,误解便经常产生。

如何消除误解?结合语音和表情,我们就能更多的获得对方的所指,这即是我们所推崇的当面沟通。

在软件开发领域,我们用变量名、函数名、类名、包名等编程语言元素来表达我们的所指。由于这些名字同样是自然语言,只是一种能指符号,其背后的所指常常因人而异。这就不难理解为什么我们读他人的代码会比较困难。

如何缓解?这可能需要我们每一个人在编写代码时都需要尽可能用清晰易懂的、没有歧义的语词。

2023-09-22: 理解就是视域融合

人是历史的人,每个人都身处不同的历史阶段下。人同时也是社会的人,每个人都在他的社会圈子中的活动。所以,人的认知范围受限于这个历史阶段和社会圈子,这个有限的范围就是人的视域。

一个人与另一个人沟通,需要彼此相互理解,理解的过程就是视域融合的过程。如果两者的视域完全没有交集,则无法相互理解。如果两者视域接近,则很容易相互理解。

视域的融合就如同可乐和雪碧的融合。当你作为可乐与另一个作为雪碧的人交流时,他的雪碧就会融入你的可乐,从而改变你的颜色和味道。同时,你的可乐也会融入他的雪碧,他的颜色与味道也因你而改变。

理解是两个人的双向奔赴,相互找到可融合的点,求同存异。理解也是无法相融的视域发生碰撞的点,碰撞激起的火花带来创新。

2023-09-21: 交往理性

在物质生活高度发达的今天,普世的教育是对科技的崇尚,认为脱胎于科技的工具就是人类之光。但是过于崇尚科技和工具,就容易忽略一个问题:科技的最终目的是服务于人并提升人类整体的幸福感。

在资本主义社会里,企业执着于创造利润,人不仅没有得到应有的服务,反而不得不面对越来越长的工作时间,越来越大的工作强度以及越来越低下的生活品质。如此一来,我们发展科技的作用是什么?

德国当代哲学家哈贝马斯提出的交往理性正是针对当今社会的工具理性中的问题而提出。工具理性的社会里,人由于使用工具产生了莫名的优越感,人与人之间的情感变得冰冷。交往理性呼吁人们关注和回归人与人之间的交往过程,提醒人们保持谦逊,用相互可以理解的方式沟通,求同存异,从而营造一个和谐共处的环境。

敏捷宣言中有一句话是个体和互动高于流程和工具。可以发现,敏捷宣言与交往理性所推崇的价值观是一致的。在软件开发活动中,我们只有把人的位置放在工具之上才能帮助我们构建更高质量、更人性化的软件工具。

2023-09-20: 知觉

我们很熟悉感觉,即用身体器官去感受世界而觉察到一些东西。它包括视觉、听觉、触觉、嗅觉等等。

知觉是什么?在梅洛庞蒂看来,从身体到心灵之间的桥梁就是知觉,知觉是基于心灵的认知的感觉,它把身体和心灵给紧密联系起来。

试想,如果我们在感觉之前,没有任何的感受经验,对将要感受的外物也没有任何的认知,那我们会如何对待接下来的感受?大概就如同婴儿,只剩下一些模糊不清的本能反应。

如果我们没有感受,而只有心灵,如同笛卡尔所说“我思故我在”,那我们可能根本无法成长起来,因为婴儿最开始的成长就是不断感受世界。即便成长起来了,没有身体的心灵也将如果植物人一样没有任何依附。

所以,心灵和身体是和谐的,不可分割的,知觉就是建立它们之间联系的桥梁。我们依靠心灵的思考,结合从感觉中获取的信息,而与世界进行交互。

2023-09-19: 匠艺与匠人

我们常常听说软件匠艺,字面意思是指把软件做成艺术品,这应该是每一个做软件开发的人的追求。

我对此的理解是,要做软件匠艺先做软件匠人。

什么是匠人,最初的匠人是指精益求精的手工艺人。在软件开发领域同样需要精益求精的精神。

如果你舍得多花五分钟把代码格式调整好,那你就在精益求精的路上往前走了一步。

如果你舍得在写代码之前仔细思考如何用一个更好的模型来抽象当前的问题,那你就在精益求精的路上又往前走了一步。

如果你不惜多花费一点时间从软件的用户、代码(api)的用户角度思考如何设计一个易用且好理解的接口,那你再次往前走了一步。

如果你对做好的功能建立了良好的易维护的测试,那你离匠人就更近了,你的软件就离匠艺更近了。

好的软件的背后是好的软件开发人员,是对好的极致追求。

2023-09-18: 逛超市

周末,午饭后,躺在沙发上休息了一阵子。我叫上她一起出去走走,消消食。去超市吧,顺便买点东西回来。

下楼,穿过地铁通道,往超市方向走去。她走得很快,我不得不叫住她,“你走太快了,能慢一点吗?” 她也突然意识到这一点,才放慢脚步。但是,走了几步,竟然又开始恢复到之前的速度。

到超市了。如何逛?我说,“我们要走一走每一个货架,看看以前都遗漏了什么”。于是我拉着她沿着货架左拐右拐,像是寻宝一般。超市的东西还真是多种多样,想得到的想不到的东西都有,包括各类睡衣、婴儿车、鞋子、毯子、玩具等等。食品区东西更是丰富,诱人的果脯,新鲜的水果和牛奶,各类糕点,各类干粮,卤的炸的,不管是颜色还是香气都肆无忌惮地诱惑着你。逛完之后,不禁感叹,人类的物质竟然丰富到这样的程度了吗?

我还在寻宝,但是她对此似乎没什么兴趣,望着一处搭建好到帐篷发呆。我叫她,这才反应过来,继续一同往前走去。

你越慢,时间越慢,你越快,时间越快。然而,生命的时间是有限的,究竟是要快一点还是慢一点?

2023-09-16: 没有成行的钓鱼

有一个漂亮的湖,湖水里经常有会飞的野鸭子出没,你明明看到在某一处有一只野鸭子,一转眼它已不见了身影。你开始睁大眼睛四处找寻,过来好一会儿,终于在几十米开外的地方突然发现有一个鸭子头从水里钻出来。

湖边是绿油油的草坪,这里几乎没有人,你可以肆意的进去踩一踩松软的草坪,甚至坐一坐,或者打个滚,丝毫不会影响小草的生长。

湖边的树木也是经过精心设计的艺术,一大株一小株相间排列,品种各样。小鸟禁不住诱惑,高兴地在树丛间飞来飞去,叽叽喳喳似乎在向同伴述说自己的意外发现。

有一次,我和家里人在湖边散步,看到有几个年长的人在钓鱼。他们不紧不慢,悠闲的坐在湖边,水里面的线很长时间也没有动一下。但是他们不在乎,好像只是在等着那些愿意上钩的鱼儿。这让我想起了儿时钓鱼的场景,那会儿钓鱼可是我们几个小朋友最大的爱好。

我说,我也要找个机会来钓鱼。

第二次,看到类似这样的场景,我说,一定要找个机会来钓鱼。

第三次,我也这么说过。

现在,时间已经过去了一年有余,钓鱼终也没有成行。也许再也不愿意花几个小时安安静静坐在湖边了。

2023-09-15: 一个管理命令行工具的工具

开发人员在开发阶段常常需要执行很多自动化的shell命令,以帮助完成测试和调试工作。

虽然执行命令已经很快了,但还是免不了需要手动输入命令名称以及命令参数。特别是在命令和参数非常多的时候,记忆负担变得更重了。

我们实现的开发工作台(data-workbench.com)引入了这样一些方法来解决这个问题:

  • 提供一种方式将这些常用的命令分组并添加描述

  • 提供多种访问和执行这些命令的入口,如网页版搜索、ide插件版快捷键等功能

  • 在上述这些入口中,提供自动参数校验,参数历史记录等便于使用的功能

有了这些功能,不仅记忆负担大大降低,而且方便了团队里面大家共享这些命令行工具。团队效率得到极大提升。

2023-09-14: 一个开发者工具的出现

为了能及时获得开发反馈,我们开发了一个工具,将easysql编写的etl转换为impala可执行的sql代码。它给我们带来了极大的便利,定位olap引擎的impala可以非常及时的告诉我们代码是否有问题。

但是,改进似乎是没有尽头的。工具虽然好用,但是是以命令行的形式调用的。于是,为了能获得这样的开发反馈,总是需要手动的执行命令,拷贝代码,然后粘贴到impala的sql执行工具中执行一下。每改一行代码都需要重复这个工作。总是感觉很繁琐。

然后,我们又在酝酿下一次工具的迭代升级。思路非常简单,把之前需要手动完成的操作进一步自动化,使得开发者可以一键获取反馈,或者更进一步,自动在后台给我们提供开发反馈。

道家说,道生一,一生二,二生三,三生万物。回过头来看这样的工具演进路线,一个之前完全不存在的工具,似乎正在变得越来越丰富和完善。这可能是软件的发展之道。

2023-09-13: etl代码静态检查

作为数据开发的专用dsl–sql,它与其他编程语言存在着一个显著差异:其正确性严重依赖于外部环境。这带来了一些问题:

  • 无法在编码时静态检查字段有没有写错。一个字段在当前没有,不代表后续建表的时候不会重新加上;一个当前已存在的字段也可能在运行时被删除了。

  • 无法检查潜在的类型转换问题。比如,当你在按照数字类型处理数据时,如果实际上该类型为字符串,就可能由于类型隐式转换导致大量空置。

这些基本的错误常常在代码执行时才暴露出来,反馈循环太长,开发人员因此效率低下。

因此,数据开发迫切需要一个能实时连接元数据库进行静态代码检查的集成开发环境。目前有很多数据库专用开发工具可以给到这样的开发体验,比如Oracle提供的sql developer。但支持spark或hive这类大数据引擎的目前还比较少。

一个简单的实现思路是:

  1. 将sql代码转换为基于cte的一条查询语句

  2. 在最后添加一个用于输出结果的占位语句,如select 1

  3. 在查询引擎上面执行这个查询,并分析报错结果,然后映射回对应的代码行

2023-09-12: 想念

一位很久没有打电话问候的奶奶,突然入梦,慈祥的脸上还是洋溢着那般笑容。

她不愿意到城市里面和我们一起生活,一个人在农村老家待得自在。

上次回去,家里显得空空的,大大的堂屋里面只有一张陈旧的小桌子和两张长条凳。但是,她一个人在家,也要收拾得干干净净,桌凳上、地上、墙壁上没有一点灰尘。

上次回家带上一岁儿子一起,一开始,小孙子还认生,不愿意跟太奶奶亲近。太奶奶很想和小孙子抱一抱,张开双臂,嘴里温和的念叨着要抱一抱,还比着手势。小孩子纠结了好一会儿,最后笑着投入太奶奶的怀抱。

在老家,有人气的家里就会受燕子的青睐,上次回去,墙壁上又筑好了两个燕子巢。

2023-09-11: 影响

跑步,总是能碰到跑在我前面的。遇到实力差不多的,总是忍不住想要跟上去,从而不自觉地加快脚步。

图书馆,看到满座都是捧起书津津有味吸取知识精华的人,总是忍不住也伸手拿起一本,沉下心来,享受阅读的乐趣。

景区,附近一个停车的地方,一位当地的老乡说,这是他们自己家修的,不收费。附近的几处停车的地方也没有收费。

景区,你随手捡起地上的塑料垃圾,准备收集起来处理掉,避免污染环境。旁边也有人效仿你开始捡起其他的垃圾。

泰戈尔说:把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗;请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。

这就是影响的力量!

2023-09-10: 这味道,停不下来

一锅香气四溢的辣子红油汤上桌,每人一个浅腹平底碗,装满调料。

服务员过来打汤,将一半敞口,一半过滤网的汤匙浸入辣子红油汤锅,旋转勺子底部撇开部分红油,舀起一大勺汤,过滤,倒入调料碗。

夹起一只美蛙,放入调料碗中,来回旋转几次,彻底浸入调料汁。拆下一块肉,送入口中。一辣一麻一香,以肉的位置为中心,瞬间四溢到周围的味蕾。活动牙齿,咀嚼一下,鲜嫩的蛙肉一下子散开。散开的每一小块都味道十足,带着劲道的汤汁无情地席卷整个口腔。

辣,刺激着口腔发痛;麻,让每一个口腔细胞都开始跳舞;香,带着令人幸福爽快的小分子穿越口腔和鼻腔直达脑门。

十足的辣让人想赶紧把食物咽下去,十足的麻和香又让人想把食物一直留在口中。于是,在辣味还未来得及传递到大脑时,赶紧咀嚼几次,得到美味的享受之后,辣味也快速到来,赶紧吞咽下肚。然而,大脑哪里能抵抗这种美味,立即指挥手开始拆下一块肉送入口中。

哪管他会不会长肉!哪管他是不是健康!这味道,停不下来!

2023-09-09: 宗教与诗

在很多西方人看来,每个人都应该信仰一种宗教。但是中国却很特别,一个具有数千年历史的文明古国竟然没有一个广泛信仰的宗教。

中国人如何处世?引导中国人一直向前的可能是诗。从最早的六经,到唐朝的绝句,到宋朝的词,到元朝的曲,再到现代的白话诗。

诗中的故事和情感,感动着一代又一代的人。诗中的哲学和世界观,引导着一代又一代的人。在彷徨时,诗给人以一束穿透迷雾的光;在失意时,诗给人以一种从容向前的动力;在成功时,诗警醒人前路依然不平坦。

宗教,虽然充满理性和逻辑,但总少不了神秘主义色彩。相比起来,诗是作者的想象,是脱离现实而高于现实的,这是读者在读诗之前就知道的。同时,诗中有大量的留白,需要读者去填补和想象;诗中有很多道理,需要读者结合自己的经历去体悟。

这可能就是为什么中国人的哲学既是出世的也是入世的,既追求内圣也追求外王。

2023-09-08: 负能量

小a上项目半天,说,我感觉很懵,别的团队上新人会有技术的业务的各类onboarding,这边都没有。

公司人员缩减,小a说,这两天上班心都悬着,别什么时候被约谈了。

小a遇到了一种新的语法规则,说,这个怎么这么奇怪,完全反人类,我是怎么都理解不了。

小a碰到一个不熟悉的工具,说,这个怎么这么难用,感觉很难理解,看不懂。

2023-09-07: 道德的本源

道德是一个非常抽象的概念。根据当今时代的理解,道德是社会意识形态之一,是人们共同生活及其行为的准则和规范,通过社会的或一定阶级舆论对社会生活起约束作用。(百度百科)

为什么道德是规则和意识形态?要追寻其最初的本义,需要回归老子的道德经。

经上说,“道生一,一生二,二生三,三生万物”。从这里来看,道是万物之源,并且,万物在生成过程之中,也都有“道”在其中。但是初始的“道”不同于万物之“道”,因此,“道可道,非常道”。

什么是德?在万物之中的“道”就是“德”, “德”的含义是“能力”或“品德”,它可以解释为万物本有的品质。“万物莫不尊道而贵德”, “道”是万物的由来,“德”则是万物本性的依据。

当今我们所指的道德更近似道家的“德”,即人的本性,本性具象化就是一些规律,延伸出来就是规则。

2023-09-06: 他乡遇故知

想象一下,你在一个陌生的城市,正在为生计做着事,突然一抬头,发现一个多年未见的朋友,恰好,他也看见你。

“xxx”!“xxx”!你们兴奋而又惊讶地相互叫出名字。

相约去大餐一顿。饭间,以前一起经历的往事,搞笑的尴尬的,变成现在的笑谈…

人类的情感就是这么奇妙,一次偶然的遇见,一段尘封的往事,就足以令人潸然泪下。

2023-09-05: 稳妥的技术路线

今天被一个hive分区问题给坑了。

问题表现非常奇怪,使用create table as select *…创建的表居然与原表数据量不一致!

调查了很久,发现了一些端倪:

  1. 原表为分区表,采用insert overwrite以动态分区的形式创建

  2. 查看底层文件系统发现,原表有一些分区列值为空的分区,以及分区列值为 hive__default 的分区

  3. 直接查询原表按照分区统计数量,不会出现上述不合法的分区

  4. 对新表(未分区表)按照原表的分区字段统计数量,出现了值为空及 hive__default 的数据

通过这些现象,可以了解到,可能由于之前某一次运行etl产生了一些脏数据。由于insert overwrite在动态分区场景下不会覆盖没有出现过数据的分区,所以之前的脏数据也一直被保留了下来。

在技术选择上,我一直推荐采用保守而稳妥的策略。事实上由于软件已经过于复杂了,如果再引入没必要的复杂度,那就很容易导致问题。比如,避免上述问题的一种稳妥的策略是,先truncate或drop table清除所有数据,然后再写入新数据。

一些其他常见的稳妥技术选择包括:

  1. 采用最简单和通用的语法,避免采用过于风格化的编程语言语法(如Scala过于复杂的类型推导)

  2. 采用最成熟的api,比如写在库或工具的上手文档中的那些api

  3. 保持实现的幂等性(类似纯函数),尽量隔离副作用

2023-09-04: 成就自己与成就他人

儒家之仁有两层意义。

  • 一是忠,即:己欲立而立人,己欲达而达人(《论语 雍也》)。

  • 二是恕,即:己所不欲,勿施于人。

第一点的忠,并不是愚忠(别人叫你干什么就干什么)。而是指,自己想要成功,就需要真心实意帮助别人成功。

当今社会很多人为了自己的成功不择手段,损害他人利益,这显然不是一种可持久的方式。对己难以保持平和,对人难以受到信任。

事实恰好在于,如果帮助他人成功了,自己往往也会成功。这就是:成就他人即成就自己。

2023-09-03: 生命不能承受之重

汽车突然刹停,“嘭”,一个响亮的声音传入车厢里的几人耳中。

“哇!”接着传来小孩的哭声。“遭了,这下遭了!”后排的人嘴里说着话,赶紧抱起摔倒的小孩。

大家开始检查小孩的伤势,鼻子旁边有擦伤,在流血,另一只鼻子也隐隐流出血来。

事发之前,小孩站在后排中间座椅上,刹车时,被惯性带着往前倾倒。由于正对着空调出风口,直直的撞了上去。

这是多幸运?只是一点擦伤!如果没有这么幸运,那可能就是生命不能承受之重!

2023-09-02: 代码行数的错觉

最近进行的是一个数据开发重构项目,最重要任务之一是改善先前代码的质量。

经过几周时间的分析和实践,我们发现核心问题是代码重复。

团队随处能看到一大段一大段的重复代码,一个800行的sql代码消除重复之后可能只有不到200行。

消除重复带来的益处非常明显:

  1. 原来的数据计算逻辑清晰地呈现了出来,代码更容易理解,调查问题更快了

  2. 不少隐藏的bug被发现并修复

  3. 取数逻辑的一致性得到更好的保证

代码行数一直是程序员工作量的一个参考指标,不少企业甚至为每个员工设定一个代码行数的目标。因此,很多开发人员为了达成这个所谓的目标胡乱复制粘贴代码,最终导致了低下的项目质量。

这其实是关于代码行数的错觉。

事实上,在代码量指标上,不仅不应该求多,反而应该求少。能完成同样功能的代码,当然是越少越容易维护。

2023-09-01: 数据流水线自动生成

在很多数据项目中,数据流水线的配置都是靠团队手工完成。这带来了很大的工作量(特别是在开发阶段),而且容易出错。

事实上,数据流水线完全可根据etl血缘关系自动生成出来。

我们在团队中这样做:

  1. 采用airflow这样的可通过代码定义流水线的调度工具

  2. 自动解析etl文件中的依赖表,并找到对应的etl文件

  3. 根据以上依赖关系自动生成etl依赖图

  4. 将此依赖图转化为流水线代码

自动化数据流水线的生成和管理给我们带来了极大的便利,节省了团队大量的时间。团队变得更高效和敏捷了。

2023-08-31: 核污染水的数据与逻辑

日本核污染水排海事件正在成为国际关注的焦点。关于这件事有很多说法,比如日本自私论,美国阴谋论,中国过分反应论等等。

日本举出了很多数据说明核污染水无害。然而中国的逻辑很简单,如果无害就没必要排海,如果有害就更不应该排海。

在这件事上,我们的态度应该是保守的,因为它关乎全人类的健康。同时,在这件事上,过分相信数据那是极危险的,因为数据极容易作假,特别是这样复杂的专业领域,漏报一项数据就可能让性质完全不一样。

这件事上更应该相信的是简单的逻辑,中国的逻辑就是简单而显然的。

在关乎健康的重大问题上,中国是偏保守的,这让我们很放心,感觉更安全。为什么要拿安全去冒险?钱是可以赚的,安全问题发生了,就无法回头了。

2023-08-30: 无处藏身的bug

业务应用开发中大家常常遇到bug,有些bug隐藏很深,甚至连专业的qa都没法发现。比如某些并发场景下出现的bug,某些极少出现的边界场景、需求未定义的场景下的bug等等。

但是在数据开发中,这些bug往往无处遁形。究其原因,有:

  1. 数据开发通常要并行处理大量数据,并发问题极易在开发阶段就暴露出来

  2. 数据开发通常要处理生产系统积累的全部数据,其背后覆盖了几乎所有业务场景

  3. 数据开发以专用的sql语言为主要开发语言,如果代码本身有问题,从结果上很容易发现(比如结果集数据量不对,统计上不符合业务直觉等等)

因此,数据开发人员在编写代码时应当极为谨慎,因为bug很容易暴露出来,而出现bug后也得由自己处理,总也跑不掉。

2023-08-29: 自动化一切

如何让团队变得更敏捷,也许应该从自动化一切开始。

自动化大部分工作之后,团队的各类开发规范就不至于只停留在纸面上,而是通过工具自动化得到保证。团队也不会因为一些低级错误而耗费大量的时间。有了自动化加持,团队可以集中精力解决重要问题,从而实现效率更高、质量更好。

就像先进机器是工业化时代的生产力一样,自动化工具就是敏捷团队的生产力。

如何推进团队工作自动化?要点在于在团队内部建立这样的意识,当每个团队成员在完成开发任务的时候都想着是不是可以把一些工作自动化的时候,团队的自动化水平就会越来越高。

自动化一切要求团队成员具备很强的技术基础,不过,这正好是技术人员努力前进的方向。

2023-08-28: 诱惑

小孩到了一岁半的年纪,吃饭慢慢变成一件令人头疼的事情。

勺子自己拿不太稳,同时专注力也不够,吃两口之后就动来动去,上蹿下跳。

家里人没办法只能喂饭,喂一口,又跑了,得跟着追。有时候喂快了没吃完,或者他只是单纯抗拒食物,到嘴里面了,也直接吐出来,吐一地。

最近发现一个特别有效 …

2023-08-20: 在紧张中创造

反思一下个人的内容产出频率,我注意到一个很有意思的现象:往往工作最紧张、压力最大的那一个阶段,产出却是最多的。

为何?紧张的时期,大脑一直处于思考的状态,所以新的想法就很多;当渐渐进入到一个平稳的时期,创造力似乎就渐渐离我远去。

为什么春秋战国时期有百家争鸣,各类新思潮层出不穷?大概是因为那个时代是一个局势紧张的时代,各诸侯国之间战事不断,不仅要求发展还求如何得人心。

古希腊半岛位于各个文明圈的中央,也正是由于和周围的城邦不断的进行交流和碰撞才产生了西方哲学的萌芽。

所以,站在人类的历史长河看,有竞争的乱世也并不是一件坏事,因为它常常是破旧立新产生突破的时代。

2023-08-19: 记忆里的人

在记忆里她一直是一位很慈祥的母亲。

她很会做饭,曾经在一个山清水秀的煤矿厂里给厂子里面的人做饭;数次春节到她们家,也总是能有一大桌子菜等着大饱口福。

她也很慷慨,每次春节到她们家总少不了一个大红包;平时去也是各类零食水果从不间断。

她勤劳且持家,每次去她们家总是能看到干净整洁的房间;只要她在,总是在忙里忙外收拾这准备那。

很多年没常见面了,以后回去也见不到了。

2023-08-18: 半梦半醒

我左手抱着小孩,有一种沉甸甸的感觉。他今天很安静,没有吵闹。客厅的墙、过道、地板看起来都非常的清晰。我没有戴眼镜。家里人都正常在家休息,有的在沙发上半躺着,有的在房间其他角落走动。

我能清晰的知道这不是现实。但眼前的事物是那么的清晰和真实,即便在我的身体自然移动时,这些事物也可以正常地跟随切换。

我想挑战一下这自动在脑海里出现的场景,看看它的能力极限在哪里。

走进房间的过道,进入一间卧室。没错,是我们家的卧室!床和柜子的摆放都是没问题的。甚至连门上面的贴画上面的字都清晰映入眼帘。

穿出过道,进入了一个黑黢黢的拐角处,朝房间里面望去。这好像是好几年前的住过的房间。床和家具是深色木质的,被子铺在床上。看起来是被人直接在床上面躺过而没有将被子展平,有很多褶皱。衣柜的一边柜门贴着一张四方形的福字贴,里面有老婆很久以前写的八个字,字非常清晰。和我有关,读后感觉很感动。这个场景渐渐勾起了我更多的回忆。。。

2023-08-17: 程序员终极提效工具

最近的数据开发项目中,我们引入了一个etl代码编译解析工具,它可以自动分析代码为语法树,并从中提取代码相关信息。

然后,我发现有很多日常开发需要手工完成的事情都可以用它来自动完成,比如:

  • 自动生成建表语句

  • 自动生成数据血缘分析图

  • 自动提取输入表、输出表,辅助生成输入输出处理代码

  • 自动代码格式化

  • 自动重构

  • 自动提示待重构的代码

-…

有了语言级的信息支持,有一种思路一下子被打开的感觉。随着一个一个工具的实现,工作效率也是蹭蹭蹭往上涨。

程序员的终极提效工具是什么?除却GPT这种自动写代码的黑科技之外,那可能就是编程语言级的自动分析优化和代码生成了。

回想很多语言提出的元编程思想(比如rust),其实与这里的解法一致,不过它们大多由官方提供了支持。

2023-08-16: 当学习成为负担

最近团队在专业业务领域知识积累不太够,于是我们组织大家一起学习。

由于学习通常在工作时间之外,这势必会占用一些工作之外的其他时间。

这就导致了一个矛盾,团队成员可能不得不放弃一些个人安排,投入更多时间到学习中。

看起来学习成为了团队的一种负担。

但是,学习真的是负担吗?

回顾一下之前的学习过程就可以知道,学习常常能给人一种充实感。学到新知识了,我们会感觉获得更多能力了,变得更强大了。所以,学习常常是获得快乐的一种方式,而不是负担。

为什么会有人觉得是负担?可能是当代学以致用的观念胜过了学以致知。当我们将自己定位为一个学习的人,成长的人,坚持终身学习,把学习作为人生的一种状态,它也就不是负担了。

所以,是不是负担,关键在于个人的心态。

2023-08-15: 二级混沌系统

准确的预测可以帮我们更好的计划。比如,预测明天的天气,可以帮助我们计划旅游目的地;预测将来的行业趋势,可以帮助我们更好的选择职业。

随着科技的进步,越来越多的系统的原理被揭示出来,变得可以被准确预测。

然而有一类系统不可被准确预测,那就是二级混沌系统。

比如股市的预测,如果有一个方法宣称它可以准确预测股票的走势,那大家就可以完全根据它的预测结果进行股票交易。其结果反而将推翻之前的预测。

在这类系统中,预测会受到本身预测结果的影响,因而不可能准确预测。这就是二级混沌系统。

类似的系统还有很多,比如物理学中的测不准原理,政治预测,地图上的拥堵预测等等。

当下流行一句话,我预判了你的预判,这是指人思维也具有这样的特性。

在这样的系统中,一个科学的做法是什么?可能是要有多种完全不同的预测方法,然后不同的人选择不同的方法来做预测。这样一来,就有可能大家共赢。

2023-08-14: 动态的制度

在一个组织中,一项制度的确定一定是为了解决某一类问题,其初衷通常是好的。其操作过程也常常是因为得到大多数人的支持而形成。但制度常常解决某些问题却引出来另一些问题,这就是上面的政策引出来的下面的对策。

所以,制度的出台应该着眼于解决现实问题。但制度却不应该是死的制度,应该根据情况随时调整。对待调整的制度的态度应不亚于最初制定制度的态度,否则制度往往流于形式或导致更严重的问题。

钱穆在《中国历代政治得失》中说,应该用制度迁就现实,而不是现实迁就制度。直接生搬硬套拿来的制度不一定是好的制度,因为它没有着眼于具体的现实问题。而从汉唐一成不变的制度最终导致没落,又可说明制度需常改常新。