Tecnologia
6388 descobertas · Descobertas escolhidas da web aberta, das mais recentes às mais antigas.
-
QWERTY 键盘布局的发展历史
在我最初学习键盘打字时,曾今为看似随机的键盘字母排列困惑不已。当时为找到一个字母就需要看半天键盘,我觉得键盘按字母表次序排列不好吗?当时流行的解释是:机械键盘在输入时,一些常用的字母组合的连杆,在快速连续击打时容易卡在一起。所以,现在的 QWERTY 排列“旨在降低打字速度”。这个说法至今广为流传,而我最近读了一篇 Koichi Yasuoka 和 Motoko Yasuoka 写的论文《 On the Prehistory of QWERTY 》,更清晰的描述了 QWERTY 键盘的发展脉络,我觉得可信度更高。 论文分两个部分,第一部分阐述了先进流行的 QWERTY 键盘是怎样演变到今天的布局的,第二部分驳斥了“旨在降低打字速度”的说法。后者源于 1980 年东京大学 Hisao Yamada 教授发表的论文《 A Historical Study of Typewriters and Typing Methods 》。论文中有这么一段话: : Hence the original keyboard arrangement...
云风的 BLOG · ZH
-
程序员阅读清单:我喜欢的 100 篇技术文章(1-20)
清单 1. 《开发者应学习的 10 件有关“学习”的事》 2. 《开发者如何管理自驱力》 3. 《用 Go 语言分析 10 亿行数据,从 95 秒到 1.96 秒》 4. 《在开发高质量软件上的花费值得吗?》 5. 《错误抽象》 6. 《谷歌技术写作课:编写有帮助的错误信息》 7. 《深入 Python 字典——一份“可探索”的解释》 8. 《愿意让自己显得愚蠢》 9. 《我们为什么坚持使用 Ruby on Rails》 10. 《ChatGPT 是互联网的一张模糊的 JPEG 图》 11. 《重新发明 Python notebook 时学到的教训》 12. 《断点单步跟踪是一种低效的调试方法》 13. 《作为“胶水”》 14. 《拥抱苦差事》 15. 《也许是时候停止推荐〈代码整洁之道了〉》 16. 《我在编辑时考虑的事》 17. 《修复流行 Python 库的内存泄露问题》 18. 《UI 设计原则》 19. 《你的数据库技能不是“锦上添花”》 20. 《预估开发时间很难,但还是得做》 结语 程序员们也许是互联网上最爱分享的群体之一,他们不仅喜欢开源自己写的软件,也爱通过写文章来分享知识。从业以来,我阅读过大量技术文章,其中不乏一些佳作。这些佳作中,有些凭借深刻的技术洞见令我深受启发,也有些以庖丁解牛般的精湛手法解释一项技术,让我读后大呼过瘾。 作为“爱分享”的程序员中的一份子
Python 工匠 · ZH
-
程序员阅读清单:我喜欢的 100 篇技术文章(21-40)
清单 21. 《人生短暂》 22. 《有“产品意识”的软件工程师》 23. 《Python 的 range 不是迭代器》 24. 《有关 TLS/SSL 证书的一切》 25. 《让困难的事情变容易》 26. 《The Hiring Post》 27. 《13 年后,我如何用 Go 写 HTTP 服务》 28. 《Rust std fs 比 Python 更慢!?》 29. 《选择乏味的技术》 30. 《Python 3.10 中的结构化模式匹配》 31. 《你想要的是模块,不是微服务》 32. 《我不喜欢 Go 语言默认的 HTTP Handlers》 33. 《对人类更友好的“超时”与“取消”》 34. 《20 年软件工程师生涯,学到 20 件事》 35. 《为什么你的 mock 不工作》 36. 《实用的 Go:来自真实世界的编写可维护 Go 程序的建议》 37. 《编写系统软件:代码注释》 38. 《编写易于删除,而不是易于扩展的代码》 39. 《如何提出好问题》 40. 《每天写代码》 结语 程序员们也许是互联网上最爱分享的群体之一,他们不仅喜欢开源自己写的软件,也爱通过写文章来分享知识。从业以来,我阅读过大量技术文章,其中不乏一些佳作。这些佳作中,有些凭借深刻的技术洞见令我深受启发,也有些以庖丁解牛般的精湛手法解释一项技术,让我读后大呼过瘾。 作为“爱分享”的程序员中的一
Python 工匠 · ZH
-
程序员阅读清单:我喜欢的 100 篇技术文章(41-50)
清单 41. 《抽象泄露法则》 42. 《如何设计一个好的 API 及其重要性》 43. 《我构建软件的原则+实践“让无效状态不可表示”》 44. 《不,不是编译器的问题,从来都不是》 45. 《关于在除夕前一天换了一个洗衣机的故事》 46.《你的函数是什么颜色?》 47. 《健康的文档》 48. 《如何像人类一样做代码评审》 49. 《关于 Python 3.13 你需要了解的一切 - JIT 和 GIL》 50. 《入行 14 年,我还是觉得编程很难》 结语 程序员们也许是互联网上最爱分享的群体之一,他们不仅喜欢开源自己写的软件,也爱通过写文章来分享知识。从业以来,我阅读过大量技术文章,其中不乏一些佳作。这些佳作中,有些凭借深刻的技术洞见令我深受启发,也有些以庖丁解牛般的精湛手法解释一项技术,让我读后大呼过瘾。 作为“爱分享”的程序员中的一份子,我想当一次推荐人,将读过的好文章分享给大家。我给这个系列起名为 《程序员阅读清单:我喜欢的 100 篇技术文章》 。 受限于本人的专业与兴趣所在,清单中的文章对以下几个领域有所偏重: 程序员通识、软件工程、后端开发、技术写作、Python 语言、Go 语言 。 下面是阅读清单的第三部分,包含第 41 到 50 篇文章。 系列索引: 第一部分(1-20): 链接 第二部分(21-40): 链接 第三部分(41-50): 链接 清单 41.
Python 工匠 · ZH
-
我看见的软件设计:胖瘦客户端
kubectl apply 的故事 客户端侧 apply 客户端侧 apply 的局限性 服务端侧 apply 小结 软件设计建议 1. 善用服务端功能零成本复用、变更实时触达的特点 2. 别让服务端因客户端的定制需求过载 烤肉店故事:如何调味? 识别服务端复杂度的过载风险 3. 客户端的计算力是独特的优质资源 烤肉店故事:谁来烤肉? 善用客户端的独特资源 “自助烤肉”的弊端 结语 文末彩蛋 设计软件是一个不断产生疑问、解决疑问的过程。设计者们面对一个需求,会产生许许多多的疑问,在这些疑问中,有一个看似幼稚,却直击灵魂的小问题: “业务逻辑(复杂度)放在哪?” 项目每引入一个新功能,所增加的总复杂度几乎是确定的,但如何把这些复杂度分配到各模块中,其中的方式方法却变化无穷。 比如,一个采用“客户端/服务端”架构的软件,在增加某项业务功能时,工程师们可能会发现:它既可以(主要)放在服务端实现,也可以放在客户端实现。不同决策直接影响后续的分工模式、开发效率以及功能扩展性等方方面面。 此类场景中,一种常见的设计策略是 “瘦客户端,胖服务端” ,“胖/瘦”指的并非身材,而是组件所承担的职责多寡。采用“瘦客户端”设计,代表主要的业务逻辑均由服务端承担,客户端尽量简单。 让我们通过 kubectl apply 命令的故事,看看如何把“瘦客户端”理念应用在现实世界的软件中。 kubectl app
Python 工匠 · ZH
-
Python 的 OrderedDict 为什么有序?
一个双向链表和另一个字典 小结 有趣的细节 1. 对 weakref 的使用 2. 传入 object() 作为默认值 现在是 2025 年,网上已很少见到 Python 字典有序性的相关讨论。自从 Python 在 2018 年发布 3.7 版本,将“字典保持成员的插入序”写进语言规范后,人们已渐渐习惯有序的字典。那曾经调皮、无序的字典,早已像 2.7 版本一样成为过去,只在某些老登们忆苦思甜时被提起。 而在那个字典无法保持顺序的年代,如果我们要用到有序的字典,我们用什么?答案是: collections.OrderedDict 。 但是,随着内置字典已经有序, OrderedDict 似乎也渐渐变得不再必要。不过,截止到目前(3.14 版本)为止,它仍然存在于标准库模块 collections 中。这主要是出于以下几个原因: 保持向前兼容,已依赖其的旧代码可以保持不变; 行为不同: OrderedDict 在判断相等性时会将键顺序纳入考量,内置字典不会; 更多特性: OrderedDict 拥有 move_to_end 等方法。 >>> d OrderedDict([('a', 1), ('b', 2), ('c', 3)]) >>> d.move_to_end('a') >>> d OrderedDict([('b', 2), ('c', 3), ('a', 1)]) # 1
Python 工匠 · ZH
-
AI 编程是一种“框架”
框架的问题 1. 抽象泄露 2. 丧失控制权 认知成本:DRF 的启示 也许,该把 AI 编程当成一种库 使用 AI 类编程工具越多,我便越来越强烈地感觉到:AI 编程是一种“框架(Framework)”。 框架是每位程序员的老朋友,它通常针对特定领域所设计,能极大提升编码效率。以 REST API 服务为例,一些成熟的框架(比如 Django REST Framework )能做到仅需定义 数据模型和视图类 ,便生成一套功能完备的 CRUD API 服务。 AI 编程工具和传统框架一样,都是一种“杠杆”,它们允许人们用少量输入撬动庞大的功能。二者区别仅在于输入类型不同,框架需要代码(或配置),而 AI 仅需一句简单的自然语言提示词—— “写一个书店网站” 。 框架的问题 作为一种新型框架,“AI 编程”所带来的便利性,足以把人类从前发明过的任何一种框架按在地上摩擦,但是,框架天生所具备的问题并未消失。 1. 抽象泄露 所有框架都有一个共性,它们提供了极高级的抽象,以降低实现特定功能所需的工作量。比如,Django 的 ORM 提供了“数据模型”这层抽象,免去了手写 SQL 语言、设计数据校验等繁重工作。 但不幸的是, 抽象都会泄露 。 一名 Django 初学者编写的网站上线后,客户投诉爆表,因为列表页加载极为缓慢。此时,打开数据库监控面板,他会发现这个看似简单的页面,每访问一次
Python 工匠 · ZH
-
一份关于 AI 编程的简明行为指南
对所有人 谨记 Agent 不对代码担责 多“协作”,少“委派” 拆分你的 PR 善用 Plan 模式,多做前置探索 采纳稳定的库,优于 AI 从零实现 创建 PR 前使用 AI Review 让改动可验证,并总是验证 其他 对初级工程师 质量胜过效率 尝试手动修复 Bug 自己先动脑,在 AI 给出的方案之外寻求 其他 结语 AI 编程发展迅猛,Claude Code、Codex 等 AI Agent 已成为许多软件工程师工作时必不可少的得力助手。然而,对于如何在项目中更好地实践 AI 编程,目前仍然是一副“八仙过海,各显神通”的模样。 假如同一个团队里的工程师,在如何使用 AI 工具的“大问题”上没有达成共识,就会出现协作上的摩擦,对项目产生不良影响。 因此,本文尝试面向软件工程师群体,对 AI 编程的 推荐行为实践 做一些总结,弱化具体的工具和技巧( 比如 Spec 驱动还是不 Spec 驱动? ),着眼于更通用的方面( 比如初级工程师该 完全委派 AI Agent 修 bug 吗? )。 内容分为“对所有人”和“对初级工程师”两部分,其中“对初级工程师”部分,针对这类人群身处的特殊阶段,提供了一些量身定制的建议。 说明: 本文部分内容由 jianan、 wklken 参与共创;本文观点基于笔者所身处的工作环境总结而来,不一定完全适用于其他项目,酌情采纳; 对所有人 谨记 A
Python 工匠 · ZH
-
开发软件,或建造迷宫
前段时间,我通关了一个三十多年前的老游戏: 《塞尔达传说:织梦岛》 。 《织梦岛》是久负盛名的塞尔达传说系列的第四部作品,发售于 1993 年,平台为 Game Boy——任天堂在 1989 年推出的风靡全世界的游戏掌机。 用今天的眼光看,《织梦岛》的游戏画面简陋得吓人。举个例子,游戏的分辨率极低,仅为 160×144,换算下来像素面积不到 iPhone 17 屏幕的 1%。不过,技术过时并未过多损害游戏的可玩性。这部诞生于上世纪的作品,用极具想象力的道具和迷宫,打造出了一个引人入胜的小岛,玩起来依然妙趣横生。 正因如此,在发售后的第 26 年,《织梦岛》在任天堂最新的游戏主机 Switch 上迎来了一次重制。 为了迎合现代玩家,新版《织梦岛》完全重做了游戏画面,不再是 2D “大果粒”,而是全高清的卡通风 3D 建模。游戏操作也得到现代化升级,道具切换变得更为便捷。最重要的一点,在于新版几乎 1:1 复刻了原版的大地图和迷宫,也就是说, 在游戏性方面(迷宫、道具及探索),重制版几乎原汁原味继承了几十年前的配方。 你肯定想问:对于这样一部已三十岁高龄的换皮老游戏,玩家会买单吗?答案是肯定的。Switch 上的《织梦岛》一经推出,销量超过六百万份,直接跻身“塞尔达传说”史上销量最高的作品之一。 我相信,作为史上最成功的电子游戏之一,《织梦岛》一定可以给游戏从业者许多启发。但就像你所知
Python 工匠 · ZH
-
设计流动摩擦:AI 原生团队的核心能力
过去几年,我们讨论 AI 对软件研发的影响,最常使用的仍是个人生产力:一个功能要多久,一名开发者能同时推进多少任务,Coding Agent 能生成多少代码。AI 确实显著降低了执行成本,过去数天才能形成的初步实现,现在几个小时后就可能进入 Pull Request。
全栈应用开发:精益实践 · ZH
-
从 AGENTS.md 开始:构建 Agent 友好项目的五个步骤
最近我重新整理 [Better Harness](https://github.com/QoderAI/better-harness) 的 `references`
全栈应用开发:精益实践 · ZH
-
Agent 插件如何走向工程化:Better Harness 的五个实践
把一项能力写进 `SKILL.md`,再封装成 Agent 插件,并不难。真正困难的是,当它被不同用户、不同项目和不同 Agent
全栈应用开发:精益实践 · ZH
-
Harness Inspector:让 Agent 交付过程可观察、可检查、可追溯
最近,我们一直在尝试优化 Better Harness 的 **SKILL 自动沉淀**能力:从 Agent 的真实会话中识别重复出现的工作路径,再判断其中哪些经验值得进一步沉淀成可复用的 SKILL。真正做起来以后,我们发现这件事远比“把一段 Session 分析一遍”复杂得多。
全栈应用开发:精益实践 · ZH
-
从可编程到表现力:构建更好的 Agent 运行时重塑用户体验
最近,我重新看了 remio 在 PPT DSL 上的尝试,也注意到 OpenAI 的 **Artifact Tool**(产物工具)正逐渐演进成一套完整的专业文档运行时。
全栈应用开发:精益实践 · ZH
-
面向人机交互设计 Harness:构建以产物为中心的 Agent Loop
最近,我一直在 Better Harness 里思考编码智能体的工作闭环:用户究竟想完成什么,智能体读取了哪些上下文、执行了哪些操作,
全栈应用开发:精益实践 · ZH
-
从生成动画到可编程产物:在 Harness 中构建 Lottie 创作运行时
最近,我把 Lottie 插件的第一个版本 [0.1.0](https://qoder.com/marketplace/plugin?id=92998645-4b3b-472b-a4a7-a3f6bc133bff)
全栈应用开发:精益实践 · ZH
-
开坑!从 AI Coding 到 AI4S:新开源项目 Pero 的一次探索
PS:最近从 Qoder 离职了。原本还想继续折腾 AI Coding 和 Coding Agent 相关的开源项目,但考虑到过去的工作经历,
全栈应用开发:精益实践 · ZH
-
中美 AI 竞争的差距到底有多大?
上周五因为有 AI 新品发布的原因,我写了一篇中美 AI 竞争格局的短文,分别发 … Continue reading →
MacTalk-池建强的随想录 · ZH
-
墨问 Web 社区版本上线,本月 墨问 cli 之后的第二个发布
现在墨问有小程序版本,墨问命令行版本,还有了 Web 社区版。 https:// … Continue reading →
MacTalk-池建强的随想录 · ZH
-
想 Vibe 就别错过这个巨大的流动知识库
周末的时候我主要看书写东西,拍照徒步,周末最好给自己一种跳出圈外的机会,多思考, … Continue reading →
MacTalk-池建强的随想录 · ZH
-
CatReader 上线:重启 RSS 阅读
自从 AI 的 Vibe Coding 能力突飞猛进之后,我自己也没闲着,做了好 … Continue reading →
MacTalk-池建强的随想录 · ZH
-
谁说 ChatGPT 和 Codex 合体了?
AI 媒体现在也太能扯了,前两天看到有若干家媒体公众号说 ChatGPT 和 C … Continue reading →
MacTalk-池建强的随想录 · ZH
-
两小时用智谱 glm 5.2 实现了 CatReader 的移动微信版
昨天上午写了一篇阅读方式的改变就去出去玩了,打了一小时羽毛球,出去吃东西徒步还赶 … Continue reading →
MacTalk-池建强的随想录 · ZH
-
墨问发布第一款 Mac App:CatBar,极简 Mac 菜单栏图标管理工具
这半年来一直基于 Vibe Coding 做点产品,除了墨问本身的功能,已经发布 … Continue reading →
MacTalk-池建强的随想录 · ZH