- ✨ 欢迎来到我的个人博客
- 🤔 我在这里分享技术、读书、生活还有思考。
没有人因为简单而获得晋升
“简洁是一种伟大的美德,但要达到它需要辛勤的付出,而要真正欣赏它则有赖于良好的教育。更糟糕的是,复杂性往往更能卖得出去。”——艾兹赫尔·戴克斯特拉 我认为,有那么一种微妙的机制,正在悄然拖工程团队的后腿。在面试中、在晋升材料里、在设计评审中:那些过度设计的工程师总能讲出引人入胜的故事,而那些只交付最简单却能正常运行的方案的工程师,却往往一无所获。 当然,这绝非有意而为之。没有人会坐下来大声说:“咱们得确保那些把事情过度工程化的人升职!”但当公司对工作评价出现偏差时,这种情况就有可能发生——而且一次又一次地重演。 想象一下,同一团队中有两位工程师。工程师A被分配到一项功能开发任务。她仔细审视这个问题,权衡了几种方案,最终选择了最简单的那一个——一个直截了当的实现,大概只有50行代码。代码易于阅读、易于测试,也方便下一位接手的同事快速上手。这个功能运行得非常顺畅。她在短短几天内就完成了交付,然后继续推进下一个项目。 工程师B也获得了一项类似的功能。他同样审视了这个问题,却从中看到了打造一款更加“稳健”产品的契机。他引入了一层新的抽象层,为各组件之间的通信构建了一个发布/订阅系统,并添加了一个配置框架,使该功能在未来应对更多用例时具备“可扩展性”。整个过程耗时三周,期间提交了多条Pull Request。当他分享那篇详尽阐述这一切的文档时,大家纷纷发来大量兴奋的表情符号。 如今,晋升季又到了。工程师B的工作几乎可以自动写进晋升材料里:*“设计并实现了可扩展的事件驱动架构,引入了被多个团队采用的可复用抽象层,并构建了一个配置框架,为未来的扩展性奠定了基础。”*这简直是在明明白白地宣告:Staff+! 但说到工程师A的工作,几乎没什么可说的。“实现了功能X。”三个字。她的工作做得更好,却因为太过简单而鲜为人知。你根本写不出一段引人入胜的故事来讲述那些你没有打造的东西。没人会因为避开了复杂性而获得晋升。 复杂性看似高明,倒不是因为它本身有多厉害,而是因为我们的体系天生就倾向于奖励复杂性。而这种激励机制的问题,并非始于晋升之时,甚至在你还没拿到这份工作之前就已经埋下了伏笔。 想想面试吧。你正在参加系统设计环节,提出了一套简单的解决方案:一个单一的数据库、一套直白的 API,也许再加一层缓存。面试官一听,立刻追问:“那 scalability 怎么办?要是用户达到一千万怎么办?”于是你开始添置服务、引入队列、进行分片,在白板上画上越来越多的方框。终于,面试官看起来满意多了。 你刚刚学到的一点是:复杂性往往能给人留下深刻印象。那个看似简单的答案本身并没有错,只是不够引人入胜。而这一课,或许会伴随你一路走向职业生涯。说实话,面试官有时确实有充分的理由追问规模问题——他们想观察你在压力下如何思考,以及你是否真正理解分布式系统。可如果对候选人而言,最终得出的结论只是“简单还不够”,那事情就有点不对劲了。 这在设计评审中也屡见不鲜。一位工程师提出了一种简洁明了的方案,却立刻被泼来一盆冷水:“我们是不是该为未来做好准备?”于是,他们只好回过头来,添上眼下根本用不上的层层抽象,为那些可能永远不会出现的问题构建复杂的抽象层,又为那些连用户都没提过的需求预留出无谓的灵活性。这么做并非因为问题本身需要如此,而是因为“领导”或“团队”期望如此。 我曾见过(自己也曾是)一些工程师为了避免重复几行代码而刻意构建抽象,结果却造出了一套比原本的重复代码还要难懂、更难维护的东西。每次做出这样的选择时,总觉得这是再正确不过的决定——代码看起来更“专业”,更像经过精心设计的工程产物。可用户不仅没因此更快地用上新功能,而且下一位接手修改的工程师,还得花上大半天时间去搞清楚这套抽象的来龙去脉,才能动得了一根手指。 现在,让我说明一点:有时候,复杂性反而是正确的选择。如果你要处理数以百万计的交易,或许就需要采用分布式系统;如果你有10个团队在开发同一款产品,那么很可能需要划定服务边界。当问题本身很复杂时,解决方案(大概)也该同样复杂! 问题不在于复杂性本身,而在于无端生出的复杂性。*“我们已经触及数据库上限,需要进行分片”与“我们可能在三年后才会触及数据库上限,所以现在就先分片吧。”*这两者之间是有区别的。 有些工程师深谙此道。当你仔细审视他们的代码(以及架构)时,你会不禁感叹:“嗯,这当然啦。”其中既没有玄妙的魔法,也没有什么令人自惭形秽的巧思,更没有任何让你觉得自己当初没看懂而倍感愚蠢的地方。而这,正是关键所在。 通往资深之路的真正关键,并不是掌握更多工具和模式,而是懂得在何时不必使用它们。任何人都能添砖加瓦、堆砌复杂,但要懂得如何化繁为简,则需要丰富的经验和十足的自信。 那么,我们究竟该如何应对这个问题呢?毕竟,说“保持简单”容易,但改变激励机制却要难得多。 如果你是一名工程师,请明白:简洁性必须被清晰地展现出来。工作本身并不会自我说明——并非因为它不够好,而是因为大多数系统在设计时并未考虑到倾听它的声音。 先从你如何描述自己的工作说起。“实现了功能X”听起来没什么分量。但如果你说:“评估了包括事件驱动架构和自定义抽象层在内的三种方案,最终认定采用一种简洁直接的实现方式就能满足当前及未来的所有需求,并在短短两天内顺利上线,在长达六个月的时间里零故障运行”——同样是这项简单的工作,只是用更精准、更能凸显背后决策过程的方式来加以阐述。不去构建某样东西本身也是一种决策,而且是至关重要的决策!务必如实地将其记录下来。 在设计评审中,当有人问“我们是不是应该为未来做好准备?”时,别只是轻易妥协、一味地增加层层叠叠的复杂结构。不妨这样回应:*“如果我们将来真有需要,要追加这项功能的话,大概需要做这些工作;而我们现在就把它加进去,成本大概是这样。我觉得还是再等等吧。”*你并不是在硬抗,而是在表明自己已经做了充分的功课——你权衡了其中的复杂性,最终选择暂不接手。 是的,不妨和你的主管沟通这件事。你可以这样说:“我想确保自己记录工作的方式,能够真实反映我所做的决策,而不仅仅是我在写哪些代码。我们能不能聊聊,在下一次绩效评估中,该如何更好地呈现这一点?” 大多数主管都会很欣赏这种做法,因为你在帮他们省心——你为他们提供了可以用来为你发声的语言和框架。 现在,如果你把这一切都做到了,可你的团队依然只提拔那些打造最复杂系统的人……这也同样是一条很有价值的信息。它能让你看清自己所处的工作环境。有些文化真正崇尚简约;而另一些文化口头上说崇尚简约,实则却奖励截然相反的做法。如果你身处后者,要么就顺势而为,要么就另谋高就,去寻找一个真正赏识明智判断的地方。但至少,你心里会明白自己究竟身在何处。 如果你是一名工程领导者,这一点比任何人都更关乎你。无论你是否意识到,你都在制定激励机制。而问题在于,大多数晋升标准本质上都是为了奖励复杂性,即便它们本意并非如此。“影响力”往往以某人所打造之物的规模与覆盖范围来衡量——而这些指标往往至关重要!但同样重要的是,他们本该避免的问题也理应被纳入考量。 所以,不妨先从改变你提出的问题入手。在设计评审中,与其问“我们有没有考虑过规模问题?”,不如试试这样问:“我们能交付的最简单版本是什么?又有哪些具体的信号能告诉我们,我们需要更复杂的方案?” 仅仅这一句话,就能彻底改写游戏规则:它让简洁成为默认选项,把举证责任放在复杂性身上,而不是反过来! 在晋升讨论中,当有人提交的方案基本上只是一长串听起来很唬人的系统列表时,不妨适时提出质疑:「这些东西真的都非用不可吗?我们这里到底是不是真的需要一个发布/订阅系统,还是说它只是在纸面上看起来很炫酷?」而当团队里的某位工程师交出了一套简洁明了的成果时,不妨帮他们把背后的故事讲得更精彩。「经过多方比选,最终选择了最简捷、却能完美解决问题的方案」——这样的表述本身固然算得上一份有力的晋升申请材料,但前提是你得真正把它当作一份值得认真对待的“故事”来打磨。 还有一件事:要留意你在公开场合庆祝什么。如果你的团队频道里每次点赞、表扬都只针对那些庞大而复杂的项目,大家自然就会把精力都放在这些项目上。不妨开始多关注那位删掉代码的工程师——正是他当时说“我们暂时用不着这个”,结果却一语中的。 归根结底,如果我们一味奖励复杂、忽视简单,那么最终得到的正是我们所期待的结果,也就不该感到意外。不过,解决问题的办法其实并不复杂——我想,这大概就是关键所在。 来源:Nobody Gets Promoted for Simplicity – Terrible Software
Andrej Karpathy:AI 编程七步心法
Karpathy 的 AI 辅助编程心法,总结下来有七个关键步骤 第一步:上下文拉满 (Stuff everything relevant into context) 这是基础。你需要把项目所有相关的信息都喂给 AI。对于大型项目,这可能需要花些时间。如果是小项目,可以直接打包所有相关文件。Karpathy 甚至给出了一个 files-to-prompt 工具的示例命令: files-to-prompt . -e ts -e tsx -e css -e md --cxml --ignore node_modules -o prompt.xml 这个命令大致意思是,将当前目录下所有的 .ts, .tsx, .css, .md 文件内容(忽略 node_modules 文件夹)打包成一个 XML 格式的 prompt 文件,供 AI 读取。核心思想是:给 AI 足够的全貌信息。 第二步:策略先行,而非代码 (Describe the next single, concrete incremental change) 明确你想要实现的下一个具体、增量的改动是什么。关键点来了:不要直接让 AI 写代码。相反,你应该要求 AI 提出几种实现该目标的高级方法,并分析各自的优缺点(pros/cons)。Karpathy 指出,LLM 的判断力并非总是最佳,通常实现一个功能有好几种方式,先看选项再决定。如果需要,可以再让 AI 把选定的方法具体化 第三步:选定方案,获取初稿 (Pick one approach, ask for first draft code)...
报 bug 的礼仪
不要对一个程序员说:你的代码有bug。 他的第一反应是: 你的环境有问题吧; 傻逼你会用吗。 如果你委婉的说:你这个程序和预期的有点不一致,你看是不是我的使用方法有问题。 他本能会想:操,是不是出bug了! 🤔 思考: 只图一时爽快,是短视的行为。对自己的成长和做人没有任何好处 自嘲自贬是最简单的高情商
微信公众号文章链接
背景 一直以来对微信公众号文章的链接比较疑惑有时候很短,有时候很长,有时候保存的文章链接还会失效。 最近在看github 上的etrobot/chatgptSummary 里面有对链接的解析。自己试了下发现有些问题。所以借此机会搞清楚微信文章链接的一些概念 三种链接形式 短链接 https://mp.weixin.qq.com/s/LmWJGCLyddA9sAM7arYpag 由微信客户端生成,长度较短,链接的值或许为某种变种的base64,其长度恒定为22个字符。其中不带有可用与追踪用户身份的参数。只能通过微信客户端的「复制链接」或「在浏览器打开」功能获取这种链接。 完整链接 https://mp.weixin.qq.com/s?__biz=MzIyODI1MzYyNA==&mid=2653546018&idx=1&sn=69ff3b17631b8a88b7e96b7a971c5850 这是最常见的公众号文章链接格式,通常在浏览器中打开文章时可以看到(指手机客户端,在mac 客户端用浏览器打开是短链接)。 公众号文章会设置一个全局的JavaScript变量msg_link,它的值就是完整链接格式的文章URL。这个变量可直接在文章的HTML代码中找到。(使用时需要对其进行HTML entity decode,将&替换为&) 几个参数的含义: __biz可以认为是微信公众平台对外公布的公众帐号的唯一id mid是图文消息id idx是发布的第几条消息(1就代表是头条位置消息) sn是一个随机加密串(对于一篇图文消息是唯一的) 临时链接 https://mp.weixin.qq.com/s?src=11×tamp=1712886908&ver=5195&signature=0M-muFRrcH94BrNld9FV6XZyD4uU503p-4G31bXv2Kum2toGDV9VMfHjuJhOc8gJwQ96kwenaMX1QKfs51js8rHRkbBJlM2gBCOke59WFxT9WodpTV8KDo4OPshf8YW1&new=1 使用搜狗的微信搜索得到的链接。有效期应为6小时,到期后只能通过微信客户端才能查看。 src,显然指”source”。目前发现的值有3和11两种,含义未知。 timestamp,生成这个链接时的UNIX Timestamp,在服务器返回查询结果时便已确定,即按下搜索键或翻页的时刻。 ver,显然指”version”。可能是生成下面signature使用的算法版本,每个数字会使用一段时间,可能不超过一天。 signature,某种签名。长度恒定为128个字符,其中带有星号。 参考 微信公众号文章URL的种类与结构 | 咸湖的盐鱼 秘塔AI搜索(微信公众号链接中 __biz,mid,idx,sn 四个参数的意义) 解读微信公众平台图文消息的链接组成 - 菲比寻常 - 博客园
资源:AI 工具
我常用的 ai大模型网站和工具 更新说明 2024.04.06,第一版 AI 搜索引擎 Perplexity:全世界最出名的,支持中文,综合体验良好,就是在国内有时候会抽风,短链接:pplx.ai 秘塔AI搜索:国内类似工具,体验也不错,还有小程序 Devv AI:面向程序员的 AI 搜索引擎,可以搜索技术类问题 其他 ThinkAny - AI 搜索引擎:@ArronYoung的作品 Lepton Search:贾扬清的开源作品 AI对话大模型 chatgpt、文心一言等就不列举了 Kimi.ai - 帮你看更大的世界:最近很火的长文本 ai 大模型,我用来总结文章和资料挺好用 Poe:集合了多家大模型的网站,有免费额度 DeepSeek:国内量化基金幻方量化的作品,用的少但是体验流畅,支持通用对话和代码助手。 AI bot 开发平台 用来开发和展示类似于 GPTs的自定义 AI bot 的平台 扣子 - AI 智能体开发平台:字节产品,国内版本,开发流程和使用体验很好。但自己的云雀大模型拉胯 Coze: Next-Gen AI Chatbot Developing Platform:字节国外版本,免费使用 gpt4,就问你爽不爽 灵境矩阵 | 想象即现实:百度的基于文心大模型的智能体平台,支持 prompt 编排 百度智能云千帆AppBuilder:百度的 ai 原生应用开发平台,支持多个模型,支持多个框架和组件,相比灵境矩阵更底层一些。 AI 工具大全|导航 AIbase - 智能匹配最适合您的AI产品和网站:有排行榜 AI帮个忙 | 多功能AI小帮手:即刻出品的 AI工具集 | 700+ AI工具集合官网,国内外AI工具集导航大全:这个比较常用 爱AI:配置好的AI bot比较多,比如OKR 专家,小说助手等,还支持画画...
资源:视频观看下载
常用的影视资源信息,包括网盘搜索、在线/app观看、下载等 当前更新于:2024.04.05 更新说明 2024.04.05,第一版 2024.04.06,新增奇乐搜 简单说下 看视频我一直习惯「先存后看」:之前是BT下载到本地,现在是转存到阿里网盘(虽然最后很可能变成只存不看😂)。 网盘搜索 各种资源都可以搜索,不只影视 网盘导航 - 奔跑中的奶酪:奶大的网盘搜索导航贴,很不错 阿里云盘资源搜索引擎 - 阿里搜:顾名思义,只搜索阿里云盘 小云搜索 - 阿里云盘夸克网盘搜索神器 蓝奏云搜索:这个不错,搜了几个都能找到 皮卡搜索:支持阿里、百度、夸克、蓝奏云等多个网盘 咔帕搜索 - 资源超丰富的综合云盘资源搜索网站!:同上支持多个。但默认的「智能搜索」太拉胯,需要改成「精准搜索」 盘友圈:支持阿里、百度和夸克,用的少,但好像还挺好用。 奇妙搜索:曾经最常用的,奇妙应用作者的项目。目前已经关了,但我直觉还会回来。 奇乐搜 - 阿里云盘、夸克网盘综合搜索网站:提供热门资源榜单 在线视频网站 影视森林:视频网站导航 BTNULL 无名小站:片库网,提供视频在线观看、磁力下载网盘下载和 vip 解析 获取网址:发送主题包含”最新网址“的邮件给get@btnull.org,会自动回复包含最新网址信息的邮件。 视频解析-全民解析-vip视频解析-在线视频解析:vip 视频解析 91毒舌电影:收录了国内外、爱奇艺、优酷、腾讯、Netflix等等VIP平台热门的欧美日韩剧等影视资源,提供了网页和 app,网站干净无广告,而且有各种专题。 南柯电影网-追最新电视剧-看热门电影:差不多 人人影视 - 人人影视PRO - 聚合全网高清影视在线观看 学霸网盘影视 - 阿里云盘,百度网盘,夸克网盘下载 奈飞工厂-一个致力于免费提供Netflix影剧动漫的流媒体播放平台:专门的网飞视频网站 只下载 电影天堂_电影下载_高清首发 体育直播 178直播-欧洲杯直播_足球即时比分直播_足球比赛直播_NBA篮球比分直播_欧洲杯直播_欧洲杯视频直播_足球直播_足球比分直播 JRS低调看球-JRS直播NBA无插件|低调看直播|足球直播吧|世界杯直播吧 看球通体育_NBA直播吧_足球直播_篮球直播_英超直播_欧洲杯直播_体育直播_纬来体育 app 这类 app 其实很多,但是经常会用不了,我目前的措施是使用「app 壳」+「视频源」的方案,可在手机和电视上直接观看。 参考网站: TVBox Android TV 版 - 家用安卓电视盒子 - 小众软件 o0HalfLife0o/TVBoxOSC(官方) TG 频道:TVBox开发版 盒子地窖:各种 app 和视频源
昭昭肺炎康复复盘
宝宝生病,前后折腾了半个多月,列张表格复盘一下,总结经验教训。
美
发现美,欣赏美,理解美。 刘亦菲参加迪士尼《星愿》首映礼,值得发一篇文。
应不应该用 ai 总结文章
思考 大模型异军突起,很多以前实现起来很困难的功能在大模型前面变的轻而易举,「总结」能力就是其中一种。在我用的起劲的时候,突然反思,我这样做对吗?会不会让我自己丧失总结的能力?会不会失去阅读的兴趣? 画了个波士顿矩阵: 想了想,工具是帮助自己的,人类发明了计算器我能怕丧失计算能力而不用吗?君子爱器,取之有道,只要把握好一个度就好了。用ai总结的目的是帮自己快速过滤没有意义的文章,剩下的文章是需要自己认真研读的。 所以可以这么做:让ai总结,并问一些问题,比如文中是否有不合直觉的地方等等然后再决定是否详读。 资源 整理一下当前可以用的ai总结工具 kimi :个人觉得最好用 kagi:内容多,但没有重点 sider:浏览器扩展,需要选中文本再操作 poe.com 内置的ai agent,比如:Summarise,URLsummary,Webpage等等
XREAL Air2&Beam使用体验
TL;DR 主要就是通过 Beam 安装的 app 看视频(B站和阿里云盘),拥有了之前没有过的体验,不后悔 3dof功能非常有用:降低眩晕,而且会有真实感(所以没买雷鸟是对的) Beam续航大概四五个小时,发热严重,风扇有点响,按键声音有点响,感觉廉价 缘由 家里有了孩子后看电视就不方便,顺便也想玩vr/ar,借来朋友的pico4体验,除了乒乓游戏和看普通视频以外,别的感受都不怎么好,续航段,闷且眩晕感强烈,所以打消了买vr头显的念头。 然后考察AR,对比了雷鸟和xreal选择了后者。感觉XREAL更酷一点,而且3dof悬停功能才有ar的感觉,不然就只是一个屏幕。 产品:XREAL Air 2 + Beam 价格:3123 渠道:京东 开箱全家福 这里该有一张设备和配件的全家福😂 Air 2使用感受 屏幕:接上beam,点亮屏幕的一刻,感觉还是很震撼的,在我眼前竟然有这么大一个屏幕,真就像坐在电影院一样。而且屏幕是非常清晰的,小字基本也能看清。 音质:对于木耳的我来说,眼镜的声音效果也还好,很新奇的一个特点是官方宣传的「相位消除」技术,真就能达到声音只有自己能听到,旁边的人几乎听不见的情况。深夜看剧体验不错。 佩戴:佩戴效果感觉也还好,比普通眼镜舒适度差一点,而且总有种带的位置不对的感觉。不过随着使用次数感觉越来越适应了。 眼镜使用:眼镜本身没有电池,需要配合设备,比如手机、电脑等使用。 在手机上:需要支持dp输出功能(oppo、华为等安卓旗舰支持),我自己是小米13,没法使用。 在电脑上:有两种使用方式,直连即可作为一个外接屏幕;或者使用官方提供的Nebula工具,可以实现多个屏幕悬浮显示,效果很惊艳,但会有晃动和模糊的情况,用来办公的话还是差点。 Beam使用感受 基于我的手机不能直连,所以Beam成了必选项。 Beam实际上就是一个低配能装apk的安卓盒子,额外提供3dof功能。不过对我来说已经够了,我在里面装了:bbll(bilibili三方app)、阿里云盘和电视直播app。 不得不提的是3dof功能,能够吧屏幕「定」在空间某一处,减少眩晕增强虚拟现实感受,这还挺好的。 但是beam本身素质就有点查了,续航三四个小时中规中矩,用十几分钟风扇就呼呼转,机身也是热乎乎的。最让我受不了的是按键声音贼差,质感特别廉价,我只能把beam藏在被窝里用。