日记(五)

日记 五月一日 晴/多云 9-25°C(汉堡) 从法兰克福辗转到汉堡。此行赶上了好天气,今天依然晴朗,虽然天气预报是大部分地区多云,感觉是昆明的那种多云——有很多云但依然看得到蓝天,太阳不时越过朵朵白云直射到地面上来。 但其实汉堡(以及欧洲大部分非南部城市)的天气远没有这么好。根据维基百科的数据,汉堡年平均日照时间在1600小时。 这是什么概念呢? 从数据来看:中国日照时间最少的大城市可能是成都,勉强接近1000小时但不到;北方日照充足的城市例如北京在2500小时;长江中下游地区例如上海在1700-1800小时之间。 从体感来说,就是经常会有成都那种云很低的阴天天气,但偶尔太阳出来时跟北京一样明媚。连续的阴天让人心情压抑,跟成都感受差不多(不过空气质量好很多);但当太阳出来时,比北京还舒服:高纬度地区太阳高度比较小,紫外线不强烈,不用担心被晒黑的同时可以长时间享受暖洋洋的阳光直射。 根据“柯本气候分类法”——在这里我要打断一下我自己了——什么是柯本气候分类法?简单来说是一种从三个维度进行分类的方法,第一个维度是大分类,ABCDE五个字母分别代表热带、干旱、温带、大陆性以及极地气候。第二个维度是降水,fmsw四个字母(还有其他分类,不完全)分别表示全年湿润(没有明显旱季)、季风气候、夏季旱季、冬季旱季。第三个维度是气温,例如abc三个字母(还有其他分类,不完全)分别表示热的夏天、温暖的夏天、冷的夏天。这三个维度并不是任意组合都有,例如热带(A)就只有前两个维度没有温度维度(比较显然),例如Af就是热带雨林气候。 根据“柯本气候分类法”,汉堡的气候类型是Cfb——温带、全年湿润、夏季温暖。用中文来说就是温带海洋性气候。Cfb最大的缺点是阴天多,降水不少,但最大的优点则是太阳出来之后让你觉得一切都值了。欧洲大陆西北边,包括英国和波罗的海沿岸地区基本都是这种气候:西班牙北部沿海地区、法国、比利时、荷兰、英格兰、苏格兰、爱尔兰、威尔士、德国西北3/4的区域、丹麦、瑞典和挪威的南部,甚至深入到波罗的海里面的一些沿海城市,例如爱沙尼亚首都塔林。 在这些地方见到太阳需要一定的运气,总体来说日照主要集中在5-8月(但也不是每天晴天10小时以上阳光直射),而冬季则很惨,例如汉堡一月份整月的日照时间是45小时,塔林是30小时。换句话说,一月份30天有25天是成都一般的阴天,另外5天晴天。即使是在日照充足的5月,也并不是每天都晴天,大概一个月15-20天晴天的样子吧。记得2016年五月第一次踏上欧洲大陆在塔林旅行,连续10天每天都是大太阳,无比舒畅;定居欧洲之后才意识到那其实是小概率事件,称之为幻觉也不为过。 然而中国没有Cfb气候类型。换句话说,在中国想要全年湿润,夏天不很热,冬天不很冷(外加太阳直射晒不黑),基本是不可能事件。比较接近的有两个,但都不完美: Cfa:夏天热,比如东南沿海的上海、深圳,北方沿海的青岛。如果你不怕热,这是个不错的选择。 Cwb:跟Cfb一样,夏天不热,但冬天干燥并不是全年湿润(似乎不是太大的问题)。这个听起来很理想,但现实比较残酷:中国的Cwb之所以能做到C(温和)是因为这些地方都分布在青藏高原边缘,属于亚热带高地气候,例如昆明、大理、丽江。C的原因是海拔,而不是海洋。此外,高原地区紫外线强烈,外加这些地区纬度都低,导致不太容易享受阳光直射,很容易晒黑。 在做好防晒的前提下,Cwb优于Cfa,但Cwb所在地区都是经济欠发达地区,无法获得Cfa那些城市的现代文明。即使排除经济因素,仅从气候角度考虑,也没有最理想的地方,一切都要取舍权衡,看你的优先级是什么。 然而我的优先级是什么? 今天是五一假期第一天,不用工作所以时间很多。 早饭后等待食物消化的时候写了上面一大半,后来去跑了10公里。下午坐城际高速火车(ICE)回法兰克福,轻松的一天。

May 1, 2025

日记(四)

四月二十九日 晴 8-20°C(汉堡) 在汉堡万豪遇到酒店经理,一个荷兰人在德国呆了几十年,没有德国英语口音,前两句还以为是来自美国的游客,但一个词“long”的元音暴露了荷兰籍,听起来简直是AutoTopNL他爸。经理说明年就退休了,送了一张邀请函去他的pianobar坐坐;碍于情面就去了,况且入住时送的10欧credit不用掉就亏了。免费喝了一杯本地Ratsherrn Zwickel地窖啤酒之后算计着点了16.5欧的东西,心想只需付6.5欧,多么好的deal。叫服务员要账单准备签字时,服务员指着我随意放在吧台上的邀请函说不用付款,因为你有这个。我说连一块钱都不用付吗?真是不好意思。对方说不用付。 哦,忘记提了,今天骑着本田摩托来的——you meet the nicest people on a HONDA。 (最后一句是编的,为了让故事变成无厘头的本田广告风格。)

April 29, 2025

日记(三)

四月二十六日 晴 8-18°C(法兰克福) 日记系列的第三篇,但人没在昆明,而是在法兰克福。 距上次抬笔(不是抬笔,是敲键盘;也不是敲键盘,是敲键盘写日记)已一月有余。 工作日规律的生活:起床,冲咖啡,阅读,吃水果,学一点德语,工作,做午餐,午后喝咖啡、休息,下午骑行,回来洗衣服洗澡,之后要么继续工作要么摸鱼,做晚餐,晚上补工作,喝酒,看电影。 周末基本差不多:不需要工作,但偶尔写技术文章,强度可能比工作还高;不骑行,彻底休息,但偶尔出门洗个车什么的,时间也就在不知不觉中溜走了。 期间还经历了一个小假期,去成都熟悉的地方吃吃转转,还有一个周末带父母周边转了转。 果然(并未出乎意料)还是没能找到心境和时间把写日记的习惯集成到自己的daily routine(每日习惯?)中来。 在路上颠簸了22个小时之后,终于于昨天清晨抵达法兰克福。 由于抵达时间太早,酒店房间尚未准备好,在卫生间换衣服洗漱,等待的同时寄信给德国养老保险南巴伐利亚分部试图讨回之前缴纳的养老保险,然后去超市采购生活用品。 走入超市大门的瞬间立刻闻到熟悉的不知是来自于面包房还是Edeka(德国超市)的味道,瞬间把感受拉回7年前。DM(德国药品化妆品生活用品超市)可以支付宝付款了,这不禁让我试图计算距离上次在德国已经过了多少年了。在DM补充了: 每次来欧洲必定回购的CURAPROX(瑞士口腔护理品牌)5460 ultra soft(超软)系列牙刷 牙膏 (白菜价的)DM自有品牌漱口水 (白菜价的)DM自有品牌泡腾片(当无糖饮料喝) (相对白菜价的、比京东海外购便宜且更多选择的)ohne Octocrylene(without Octocrylene,不含奥克立林,致癌物)的防晒霜 考虑是否买防晒纠结了半天:家里的碰巧用完了,应该买。但昆明的夏天是雨季,阴天多,不买也行。京东有,贵不了太多,不应该买。但这里型号比京东多,还是应该买。200ml的容量意味着回国时必须将登机箱托运,而其体积也意味着本就塞得很满的行李箱(高腰登山鞋占了四分之一,不过给同事带的礼物也占据了一定空间,回去时可以腾空)在回去时大概率合不上了,还需要再搞个旅行袋。思来想去,本来就还有一点其他购物计划,那就再搞个旅行袋吧。 在ALDI买了沙拉和树莓(竟然比云南的大很多,虽然都是Driscoll’s牌)作为午饭。 为什么闻到Edeka还是面包房的味道之后反而去了DM和ALDI?因为德国大部分生活区都是多个超市品牌扎堆在一起。 采购回酒店后已可办理入住。首先要做的事情是分别给银行和证券公司客服打电话试图解决账号问题(当然没解决了,你在想什么;我不是说读者你,我是对自己说),然后写信给银行、发邮件给证券公司试图继续解决问题。暂且做完了从自身角度此刻能做的一切后才放下心来出门,不过才是中午12点多而已(早起的好处?)。 几个月之前就有一些心水的东西想从德国买回去,比如Rimowa的Original Pilot Case以及Aluminium Watch Case,但碰巧都没货所以省钱了。不过现在说这话为时过早(太早了),毕竟还要在德国呆三周多,或许哪天去汉堡或慕尼黑时还是会剁手。 出发前研究了Lindberg(丹麦眼镜品牌)的镜框,法兰克福碰巧有两家大的授权经销商。 出发前发邮件咨询了第一家但没有收到回复,决定直接杀过去看看,但到了之后发现之前看好的Aaron型号没货,预定也来不及,因为要等镜框到了才能再定镜片。 抱着试试的心情去了第二家之前没联系过的,才发现是专卖德国高端品牌的店,柜子里摆着的都是三四千欧元起价的黄金镜框水牛角镜腿之类Lotos(我不认识),还见到个迈巴赫标的眼镜这你受得了。不过我不开奔驰也并不喜欢奔驰,所以就算有钱了也不会买,聊以自我安慰。 Lindberg级别的品牌在这种档次的店只配被陈列在地下室的抽屉里,好在存货不少。试到了Aaron,感觉太窄(好吧是我头太圆),于是选了同是air titanium rim collection(空气钛合金镜框系列)的Tim,搭配Zeiss(蔡司,在德国当然选蔡司)镜片。 转战最爱逛的Globetrotter(德国大型户外运动用品连锁店,globetrotter似乎也是个英文词,环球旅行者的意思),补充了: Smartwool(美国品牌)的薄款美利奴速干排汗羊毛袜。 其实就美利奴袜子而言,德国本土品牌Falke也不错,但整体而言Smartwool给我带来的体验更好:一来尺码更标准、更适合我,而Falke遇到过偏大的;二来感觉更结实,虽然可能只是因为这个牌子的穿的久,但的确有几双美国海淘的从北京跟着我一起到了爱沙尼亚到了德国再回到成都,穿到几乎磨穿脚跟。所以还是选了Smartwool。 新西兰品牌Icebreaker接触较少,但从仅有的体验中来看,感觉透气排汗性差一些。还尝试过挪威本土相对便宜的品牌(你敢想象挪威还有相对便宜的东西),但可能是厚度或者材料的问题,感觉偏热,没那么丝滑。好了,未来就当Smartwool的脑残粉了。 Fjällräven(瑞典户外服装品牌,瑞典语意为北极狐)的钥匙圈。 不值钱的小东西,考虑过多次想买但都没找到剁手的理由。这次说服自己的是“回去把它挂在Vespa的钥匙上”。 Snowpeak(日本户外品牌)的挂环。 一来挂在背包上当装饰,二来像飞机颈枕这种重量轻体积大的东西就可以外挂而不侵占内部空间了(谁让我带了个20升的小背包)。 Fjällräven的Hoja Rider’s Wind Jacket(骑行者的防风夹克)。 Hoja在瑞典语中是“为了好玩而骑行”的意思。虽然我很少“为了好玩”而去骑行,但还是挡不住想要收集这种设计巧妙的日常也能穿的骑行夹克的心。这已经是第二件了,第一件是Fjällräven跟Specialized(闪电)合作的Räven Anorak防寒服。 Click&Collect(没现货,店里电脑上点击下单,到货后再来提货或者发快递)下单了Fjällräven的High Coast Duffel 22行李袋。 这不是回去的行李袋就有了吗? 考虑了Kånken Weekender 30,但纠结后还是选了High Coast 22,因为一来High Coast用的是摸起来比较柔软感觉似乎有点轻量化的210D尼龙而非Kånken系列的Polyamid 70D(尽管网传210D更耐磨,可能只是感觉70D有点硬所以比较结实吧),二来家里还有个Greenland Duffel 30。是的我有很多个Fjällräven。 Click&Collect下单始祖鸟的Thorium Jacket羽绒夹克。 S码黑色德国最后一件,20% off。尽管近期欧元对人民币汇率大幅上涨(感谢川建国),比国内还是划算的。况且国内只有更薄、更不结实的轻量化冲顶型号Cerium,没有Thorium,而且即便是Cerium也大都是带帽子的连帽衫,而不是无帽子的夹克。 ...

April 26, 2025

日记(二)

三月十六日 阴 7–14°C 这周末的主题是居家清洁。 大学毕业后就一直在搬家,如果没记错的话,在一套公寓里居住时间最长的也就是两年,最多三年?这一点对于打工一族应该深有体会,尤其是大城市的,例如北漂一族:要么由于换工作被迫搬到下家附近,要么由于法规对住户保护不足;频繁搬家也是情非得已。 记得日籍华语作家吉井忍在散文集《东京八平米》一开篇就清点自己住过的三十二处住房,颇有一种曾经沧海难为水之后皈依极简主义的嘚瑟,但我读来却不是滋味:大城市打拼的同龄人们经历过十几二十几处住所怕是太稀松平常了吧(我的数字目前是二十三,日后详谈),还值得专门作为以记之? 吐槽归吐槽,但“一直在搬家”也有一个很“正面”的副作用:(基本)不需要担心房屋的保养——反正住不久,住不旧就跑路了。 然而,这周末的主题竟然是居家清洁,主要是清洁瓷制的洗脸池和马桶,以及给白色浴衣和白色骑行服上沾的污渍进行漂白。也罢:一来为公寓和自己(的衣服)做做保养,二来换换心情:虽然看到洗脸池里堆积的黄色水垢不会有丝毫不适,因为知道水垢本质无非就是盐罢了,但如果擦洗得跟五星级酒店一样闪亮,想必还是会很舒服吧? 但是,当我谈居家清洁的时候我在谈什么?正解是——化学。 作为初中化学奥林匹克竞赛一等奖、高中化学奥林匹克竞赛二等奖,高中就开始读大学化学教材然后高二就能解决掉高考化学压轴题的我,很不幸大学读的是只搞数学和物理的计算机系,一个学分的化学都没修,工作之后更是没有再接触。所以究竟用什么化学物质进行清洁?根据万能的淘宝,似乎需要用到“浴室清洁剂”和“爆炸盐”,但理工科的好奇心让我不能满足于这两个一个看起来很偷懒(完全是英语式的名词+动词+er形式组成的偷懒词,比如kitchen cleaner、oven cleaner、air fryer……还要我继续吗?)一个又很哗众取宠(我敢打赌它不会爆炸)的名词——原理是什么? 所以还是得先谈化学。 洗脸池和马桶的水垢好说,主要成分无非就是钙、镁、铁盐,例如硫酸钙垢、碳酸钙、氢氧化镁、磷酸镁、氧化铁、磷酸铁等。而马桶可能还会有尿液形成的沉淀物,例如尿酸、磷酸钙等。明白成分都是盐以及弱酸之后,自然就明白了用稍微强一点的酸来对付即可。一看浴室清洁剂的主要成分,的确是酸(有机酸)以及表面活性剂(日后详谈)。 那么给衣物漂白除渍的“爆炸盐”又是什么?打开万能的Wikipedia发现其实就是过碳酸钠(又称过氧碳酸钠),是碳酸钠和过氧化氢的加成物,溶于水形成碳酸钠和过氧化氢。那就明白了,起漂白作用的是双氧水,氧化反应将有色分子反应成无色分子,从而去除污渍。生活中较常接触的氧化型漂白剂通常分为两类:氯漂白剂(氧化性较强,更容易破坏染料发色的结构使其褪色,酒店的浴巾床单为什么总是那么白?)及氧漂白剂(较弱,对染料衣服的破坏较小,“彩漂”)。为什么不直接用双氧水洗衣服?相对不太稳定,而且爆炸盐溶于水后有一种“缓释胶囊”的作用,持续发挥漂白和去污的作用。至于哗众取宠的“爆炸”部分:“爆炸盐”溶于水后产生碳酸钠和过氧化氢,最多有点气泡,然后过氧化氢分解生成的氧气加快碳酸钠的扩散,与我们所知道的“爆炸”完全不同。 好了,原理谈明白了,那实际操作就不用赘述了——结果肯定令人满意——只是没想到这周末的主题从居家清洁转变成了化学。

March 16, 2025

日记(一)

三月十五日 多云 11–22°C 三月初在北京东城区美术馆后街三联书店二楼某个不起眼的位置看到一套《富士日记》,随手拿起来翻了一下,感觉还不错。当时身在旅途,轻装旅行,只带了一只已经基本塞满的20寸薄款登机箱(55x40x20cm,连欧洲廉价航空用来测量超规行李的铁框都放得进去的那种),而且连随身背包都没带,所以没有当即购买,只是用手机上网略做功课,看了简介之后确定还不错便记录了下来。 说起东城区美术馆后街的三联韬奋书店,虽然在北京的日子里去的次数屈指可数,但心里却一直觉得自己与它有着不解之缘。 与竹君的相识相知便是在它的二楼,当时那里还是“雕刻时光”咖啡馆,我已忘记当时我在谈论些什么,只记得听竹君从小学生活讲到哈利·波特再讲到拜仁慕尼黑。后来我们各奔东西,我去了德国,竹君搬去了深圳而后远赴新加坡定居。说来也巧,抑或说,说来也是讽刺,在德国待的城市碰巧是慕尼黑,然而尽管常驻慕尼黑三年有余,并且在安联(Allianz)工作过,也无数次在A9、A99上看到亮灯或者不亮灯的拜仁主场安联球场(Allianz Arena),但却从未近距离观看过,连到此一游的照片也没一张。别提进去参观,连是否可以进去参观都没做过功课。 从德国回国后就没再定居北京,然而还是在2022年夏天某个傍晚从王府井一路步行到美术馆后街,只是抵达的时候已经太晚,书店早已关门,于是用手机“到此一游”留了个念。依稀记得曾在新闻中看到过书店24小时开放的消息,给爱书爱学习之人提供阅读自习场所,想必时隔已久,已是物是人非了。 时隔近三年后故地重游,算是了却了一桩心愿,虽然“再次拜访三联书店”从未在我的愿望清单中,而且也未尝试编撰过什么愿望清单。只是突然发现二楼扩张成了书店的区域,早已不是原来的咖啡馆了。上网查了一下才发现,雕刻时光早已倒闭关门。 说起雕刻时光,虽然在北京的日子里去的次数屈指可数,但心里却一直觉得自己与它有着不解之缘。读大学时省吃俭用,偶尔才舍得买雀巢速溶三合一,但当时已对这个主要开在各大高校附近的“中国星巴克”略有耳闻。毕业工作后第一次接触手冲咖啡也是因为雕刻时光的咖啡学院(虽然不是在美术馆后街这家),在那里第一次亲自操作各种手冲设备并品尝到了来自挪威的新鲜单一产区埃塞俄比亚耶加雪菲(Yirgacheffe),咖啡豆的品牌是Supreme Roastworks(日后详谈)——算是我的咖啡启蒙。再之后是与竹君的相识。 扯远了,从离题的小故事中回来:为什么在东城区美术馆后街22号三联韬奋书店二楼不起眼的位置拿起了那本同样不算起眼的《富士日记》? 回想起来,大概一方面是因为对“富士”二字颇为熟悉——富士相机、胶卷,富士重工,外加东野圭吾、村上春树,还有葛饰北斋的《富岳三十六景》看多了,所以尽管还未去过日本,但对这个名字却是相当熟悉甚至有些亲切;另一方面则是极简主义的封面装帧比较戳中我吧。 回到昆明后第一时间网购下单(昆明没有好书店,是的,没有),目前第一册看了几十页,介绍就不在此赘述了,网络上的介绍大抵是准确的:“每日晴暖雨雪、起居三餐、邻里家常、自然风物”——平实地对得起“日记”二字。会让人联想到维姆·文德斯(Wim Wenders)的《完美的日子》(Perfect Days)。 可能正是这种平实的文字感动了我,于是我也决定写写我的《日记》——是为序。

March 15, 2025

你应该没见过这个配色的Garmin Enduro 3

Intro 前几篇骑行相关博客都是用英文写的,主要因为是先发了Medium(国外博客平台)然后转载过来的。 这篇个人博客首发,就用中文写了。 当然还有一个原因:对于月入几千一万多的老美而言,花50镁买个表带可能感觉挺正常的(就像国内月入几千一万买个50元的淘宝表带应该也能忍一样),所以可能并不会做太多功课就直接下手原厂了,本文帮不到他们。而国内情况不同,淘宝一堆几十元,十几元,甚至个位数的第三方佳明表带,大概率没人会不做功课就直接剁手买400 RMB的官方表带吧。外加QuickFit表带相对罕见(尤其是奇怪的颜色),基本找不到评测、视频什么的,特此发博文一篇仅供大家参考。 Fenix 8/Enduro 3官方标配表带:QuickFit/UltraFit (Respectively) Fenix 8系列标配QuickFit(软硅胶)表带。不同表盘直径对应的表带宽度不同,最大直径51mm的对应26mm的表带。 用过Fenix 7的应该对7自带的硅胶表带有印象,手感不错,长时间不算难受,出汗也不会有问题。8的表带感觉材质更软,纹理也有所不同,相当于是7的硅胶表带的升级版。 Enduro 3标配UltraFit Nylon 26mm表带(尼龙,魔术贴)。 价格 QuickFit® 26 Watch Bands美国50刀,国内400元。 考虑到目前的汇率,国内价格也不算坑爹。 UltraFit Nylon Straps (26 mm)美国40刀, 国内420元。 国内价格有点坑爹也就算了,但美国QuickFit更贵,国内UltraFit更贵。目前国内专柜即使是新款Fenix 8/Enduro 3也都有比较大的折扣,而附件类是一分钱折扣没有的,即使天猫双十一双十二也没有折扣。说到这里基本已经劝退一大部分读者了吧哈哈哈哈。 重量 接下来是weight weenies喜闻乐见的称重环节。首先是Enduro 3裸表重量: ...

December 5, 2024

On "Against best practices"

I haven’t written any blogs on books or readings, so here’s what I’m gonna try: I will recommend some articles, and then write some comments about them. This is the second piece of this series. If you are interested, you can read the first one here on dependency updates. Recently, I read an article bashing on best practices and I’d like to comment on it. Read the original article here. Or, here’s a summary for those TL;DR guys: ...

November 28, 2024

On "Disabling Scheduled Dependency Updates"

I haven’t written any blogs on books or readings, so here’s what I’m gonna try: I will recommend some articles, and then write some comments about them. This is the first piece of this series. Recently, I read an article on dependency updates and I’d like to comment on it. Read the original article here. Or, here’s a summary for those TL;DR guys: ...

November 28, 2024

关于 Against best practices 的评论

我还没写过关于别人的文章的评论,所以打算尝试这么一种形式:推荐一些文章,并附上我的评论。 这是本系列的第二篇。 如果你感兴趣,可以点击这里阅读第一篇关于依赖项更新的文章。 最近读到一篇炮轰"最佳实践"的文章,在此分享我的看法。原文链接在此。以下是给没耐心读者的TL;DR摘要: 作者批判编程领域对"最佳实践"的盲目崇拜。虽然承认许多最佳实践确有价值,但指出当缺乏经验者或热衷树立权威者将其教条化时,反而会产生危害。作者强调必须理解每个实践背后的上下文和逻辑,而非视其为金科玉律。文中以Postel定律、避免全局变量、DRY原则等为例,说明这些准则虽普遍合理却存在例外。作者抨击将"最佳实践"作为权威论据的行为,认为这会扼杀讨论与批判性思维,并类比安全领域规范——由于倡导者的道德优越感,质疑现有规则往往举步维艰。 先说说文章的闪光点: 每个人都该培养批判性思维,不该盲从教条,更不该把这些教条当作支撑观点的廉价论据。 对此我完全赞同——这反而让我有点不习惯,毕竟我平时看什么都想抬杠。 顺带一提,上文的TL;DR摘要由Gemini生成,质量相当过硬。 但问题在于:这篇文章的行文结构,恰恰无法支撑"不该盲从最佳实践"的核心论点。 且听我分解。 文章标题是《反对最佳实践》,开篇却大段讨论Postel定律。这个例子本身没问题,但"Postel定律"根本不算"最佳实践"——这个案例完全跑题了。 不信?问问谷歌:搜索"Postel’s law" + “best practice”,结果页没有任何内容同时提及这两个术语。因为从来没人鼓吹"Postel定律是必须遵循的最佳实践"这类说法。 就像写《反对酗酒》,却用"每天喝可乐有害健康"作为开篇案例——可乐又不是酒精饮料。 退一步说,我们来看看Postel定律,或者说所有所谓的"定律"。 作者声称这不是真正意义上的"定律",违反也不会怎样。但事实上,所有"定律"都如此:摩尔定律、康威定律要么已失效,要么存在例外。给某个观点冠以"定律"之名(或原则、规则等)从不能保证其绝对正确——这本该是常识。世上本无百分百正确的理论,称之为定律也不代表你要盲从。 再退一步,看看现实世界的法律。并非所有法律都合理,也非所有违法行为都会受惩。但这不意味着你可以不守法。遵纪守法仍是"最佳实践",因为这是常识,通常也对你无害。 即便是牛顿定律这样的科学定律,在微观层面也会失效。 好了,关于这些非最佳实践的"定律"的题外话到此为止,回到正题。 作者随后举了些真正的"最佳实践"例子(比如搜索该术语+“best practice"能同时出现的结果),这很好。例如12要素应用。 但这里论证却显得乏力:作者认为12要素应用"包含部分可取观点、部分可疑观点和部分彻头彻尾的坏主意”,却未作任何解释。 作为自由人类,你当然可以持任何观点,但多些解释总归更好。十二要素里哪些可疑?哪些是坏主意?作者没说,我们永远无从得知。 当然,12要素并非放之四海皆准。比如在不使用容器编排平台时它就效用有限——它本就是为现代容器化、K8s环境设计的。在这个特定语境下,它非常可靠,因此才成为公认的最佳实践:这是在特定上下文中形成的共识。即便你搜索"12要素应用是错的"这类关键词,也很难找到有力反驳——因为它们本身没错,在适用场景下非常可靠,这正是它能成为最佳实践的原因:为日常处理容器化部署的人们提供了简化工作的共同基础。 总结来说,这篇文章的标题观点我完全赞同,可惜内容无法支撑标题,导致说服力大打折扣——虽然我本就不需要被说服。 就像挤奶凳需要三条腿(或四条;挤奶凳到底有应该有三条腿还是四条腿这种问题的答案取决于你的哲学倾向)才能稳固,文章的核心论点也需要内容支撑。 最后送上一句苦心经营的讽刺箴言:逻辑是个好东西,希望你也有。

November 28, 2024

关于 Disabling Scheduled Dependency Updates 的评论

我还没写过关于别人的文章的评论,所以打算尝试这么一种形式:推荐一些文章,并附上我的评论。 这是本系列的第一篇。 最近读到一篇关于依赖项更新的文章,想聊聊我的看法。原文在此阅读。给太长不看的读者总结如下: David Lord维护着众多GitHub库,其中许多已趋于稳定,鲜需更新。他发现来自Dependabot和pre-commit.ci的自动依赖更新PR(每月每个项目约3个)造成了大量通知噪音和无效劳动,尤其是每月月初。这让他难以识别重要通知,并制造了项目活跃的假象。虽然自动更新对应用程序很有用,但类库并不需要这种持续关注。为此,他关闭了自动更新功能,转而使用pip-compile、pre-commit和自研工具gha-update(用于GitHub Actions)创建本地更新命令。现在他只在主动开发项目时手动更新依赖,既能确保固定依赖环境可用,又能在需要时灵活升级。他通过tox管理这些更新命令,并用all-repos批量执行,从而完全掌控更新节奏。 我有三点——也可能是四点——想说: 这篇文章好在哪? 对作者论点的反驳 文中一个与主题无关的细节 以及我的随想 首先声明,我不同意他的某些观点。 但正确之处也不少。凡事总有可取之处,没有绝对错误的事情,对吧? 先说优点:为保持统一的开发体验,固定依赖版本并定期更新是正确的做法。 如果依赖版本设定为范围(比如大于某版本号),本质上就不可预测,更容易遭受供应链攻击。若对供应链攻击和依赖混淆攻击感兴趣,可读我的旧文: 依赖混淆攻击与防御:注册你的私有包名 供应链安全:什么是SLSA?(上) 供应链安全:Sigstore与Cosign(中) 密钥与现代安全框架(供应链安全下篇) 作者希望按自己的节奏升级依赖,理由有三,但在我看来都站不住脚: 他提到每月每个仓库3个PR造成的操作负担(滚动点击等),但这完全可以通过自动合并解决。况且更新频率本就可调,后文详述 他拥有20个仓库——这是极端案例。不能因为你无力维护20个仓库,就否定自动化更新对单个仓库的价值,这种逻辑不成立 自动化优于人工:零人为失误,零操作负担。综上,他的论点难以服人 第三点想谈个细节: “对于应用程序,特别是配置了持续部署的场景,定时更新可能合理。你希望尽快部署所有错误修复和安全补丁。” “对于类库,这些依赖仅在本地的开发环境运行。虽然新功能和修复很诱人,但并不需要持续即时关注。” 我持异议,尤其针对前半段。 即便是配置了持续部署的应用程序,也不该总是立刻升级到最新版本。关于这点我早年写过博客。 绝大多数漏洞和安全问题都集中出现在软件生命周期的前几个月,之后数量会急剧下降。这就是为什么Firefox、Chrome等关键软件都提供企业支持版,其版本往往落后标准版数月甚至数年。月度更新都嫌频繁,我倾向于季度更新。 最后,也是这篇文章的重点——我想分享近年阅读的一个感悟:作者应当对文字可能改变读者观念乃至人生的力量保持敬畏。举例说明: 偏爱手动操作本无妨,这是你的自由。 我自己就常手动处理:无论是单车还是汽车,我都享受换挡的掌控感;经常懒得写正则表达式匹配文本模式,而是在Sublime Text里按住Command+D逐个选中。我有的是时间,等得起"一会儿"。 但是(这个"但是"很重要),我绝不会建议你也这么做。这只是我的个人癖好,懂吗?我断不会为此专门写博客宣扬手工操作。能写≠应该写,尤其是这种仅符合小众偏好的主观选择。我不愿输出本质上"不正确"的内容。 然而(这个"然而"同样重要),作为Flask核心开发者——具有一定行业影响力的人物——下笔时理应对读者和社区多几分责任感。你要明白大多数人并不维护20个仓库,也不会每月处理3个依赖更新PR。更不该把特定场景下的个人工作流包装成普适建议公开发表。经验不足的读者可能会盲目追随:既然Flask大神都这么做,肯定是最佳实践吧? 再举个文学例子。 我喜欢的日本作家村上春树有本《刺杀骑士团长》,主人公是个住山间豪宅的富豪,开捷豹,每天凌晨2点失眠醒来,喝着威士忌配腰果。 他许多作品都有类似描写。当这类细节积累到一定程度,读者难免产生"喝威士忌配腰果很高级"的联想——既然是名家笔下被富豪主角青睐的生活方式,想必很有格调?我也该试试? 我们通过所见所闻塑造世界观,这些输入在某种程度上决定了认知的边界。 借此机会想对所有写作者说:少写些自我陶醉的内容,多承担几分责任。何乐而不为呢?

November 28, 2024