工程技术

Software engineering, web development, infrastructure, databases, programming, cybersecurity, developer tools, and computing systems.

18 threads

PinnedPinnedPrivate
subconscious.substack.com

免信任协议优于信任协议,因为它把所有权和授权放在用户可控制的密钥上,而不是放在某个中心账户系统里。传统登录要求用户向平台请求访问权,平台实际掌握账户、数据和通信入口,也能撤销访问、制造锁定或窥见交流关系。免信任协议使用公私钥完成身份认证和授权,密钥本身就是凭证,用户不必依赖权威机构证明自己是谁。这并不意味着所有人都必须独自承担丢钥匙的风险;免信任设计可以在上层加入托管、硬件备份、社交恢复或未来的零知识恢复方案。关键差异在于选择权:可信协议把中心权威写进基础设施,用户无法更换;免信任协议只要求通用密钥接口,是否托管、由谁托管、如何恢复,都能作为可替换层演进。密钥像协议里的基础连接点,足够简单,才能支撑开放生态和可信退出。

PinnedPinnedPrivate
subconscious.substack.com

这本书的主要内容是,互联网之所以如此具有生成性,是有具体原因的,而且可以追溯到其历史上早期的架构选择。) 当一个系统是由具有可识别边界的较小的独立部分组成时,它就是模块化。在设计模块化架构时,系统架构师以最小化组件之间的依赖性的方式来分解系统。如果它在使用上是模块化的,产品的用户可以在以后的阶段更换或 "混合和匹配 "组件。网络的模块化边界是为网络化的文件绘制的,内容被分割成 "页面",浏览器引擎被设计用于布局和滚动文本。你可以把像Mighty这样的东西看作是重新划定模块边界的尝试,把浏览器引擎的所有模块放到一个黑盒子里,并把计算能力投向这个黑盒子,直到唯一重要的模块边界是客户端和服务器之间的网络边界。在《技术的本质》中,W.Brian Arthur指出,模块化技术也具有所有这些特性 突变 ← 改变或替换模块 遗传 ← 从旧的模块组成新的模块 技术在不断发展。(W. Brian Arthur, 2009. 技术的本质) 如果你想创建开放式的系统,你需要模块化。

PinnedPinnedPrivate
inkandswitch.com

尽管有云,你还是拥有自己的数据。Google Docs和Trello等云应用程序很受欢迎,因为它们可以与同事进行实时协作,并且它们使我们能够轻松地从所有设备访问我们的作品。然而,通过将数据存储集中在服务器上,云应用程序也剥夺了用户的所有权和代理权。如果服务关闭,软件将停止工作,并且使用该软件创建的数据将丢失。在内容中,我们提出了“本地优先软件”:一套软件原则,使用户能够协作和拥有。

PinnedPinnedPrivate
tfos.co

在 RSS 之上重建社交媒体,核心做法是把发布、阅读和社区拆开,再用开放订阅机制让它们重新协作。社区应用应该能为新帖子输出 RSS,让成员不用反复打开 Discord、Slack 或论坛;发布工具可以把一个人在各社区的发言聚合成个人社交订阅源,使“关注一个人”不再依赖单一平台;阅读应用则要识别高频社交源,避免它们淹没低频通讯和博客。最大障碍不是技术协议,而是普通用户不知道 RSS 是什么,因此订阅必须被包装成简单动作:点开推荐链接、输入邮箱、自动加入阅读器,必要时还能下载 OPML 换到其他应用。这样的网络不追求一个平台吞下所有功能,而是让不同工具各自做好一件事,并通过可携带的订阅关系连接起来。社交分发因此从平台锁定转向个人可控的流动通道。


PinnedPinnedPrivate
cpu.land

Putting the “You” in CPU 面向想弄清“程序到底怎样在计算机上跑起来”的读者。它从作者对程序运行机制的好奇出发,梳理从启动到执行的底层过程,并涉及系统调用、多任务运行等主题。它解决的是计算机基础学习中常见的断层:会写代码,却不清楚代码如何变成进程,进程怎样请求操作系统服务,多个程序为什么能同时运行,CPU、内核和应用之间如何协作。长期价值在于补齐工程师的系统视角。理解这些机制后,性能问题、权限边界、崩溃、阻塞、并发和资源管理都不再只是黑盒现象。即使不做底层开发,也能用它建立对现代计算环境更扎实的判断。保存它的意义在于需要解释“为什么这个程序会这样运行”时,有一个从应用层一路追到内核和硬件抽象的入口,适合反复回看。它能把零散的操作系统概念连接起来,降低继续学习内核和性能分析的门槛。也适合补基础时重读。

PinnedPinnedPrivate
abortretry.fail

BeOS 的故事说明,技术上的优雅和领先并不自动变成市场胜利。Jean-Louis Gassée 离开 Apple 后创办 Be Inc,试图摆脱旧操作系统的包袱,用 BeBox 和 BeOS 重新设计个人计算机。BeBox 拥有双 PowerPC 处理器、丰富 I/O、MIDI、音频接口和给黑客使用的 GEEK 端口;BeOS 则支持抢占式多任务、多线程、对称多处理、图形界面和带数据库特性的文件系统,在九十年代显得异常现代。失败的根因不在想象力不足,而在生态不兼容:它跑不了主流 PC 软件,也无法自然承接 UNIX 市场。后来 BeOS 转向移植,甚至接近成为 Apple 新系统候选,但 Apple 最终收购 NeXT,macOS 的历史也由此改道。

PinnedPinnedPrivate
every.to

摩尔定律没有突然死亡,但它赖以成立的经济奇迹正在失效:晶体管继续变小变难,单位计算成本不再像过去那样稳定下降。早期计算从真空管走向晶体管,是因为固态开关更小、更快、更省电;集成电路又把晶体管和导线蚀刻在同一硅片上,让制造复杂电路摆脱手工焊接。随后的小型化带来罕见的复利:晶体管越小,所需电流越少,同一芯片容纳越多,计算能力和能效同步提升。英特尔 4004 把处理器和存储能力装进单一芯片,个人计算机才有了低成本扩散的基础。今天最先进制程已逼近纳米尺度,物理限制、设备成本、设计复杂度和产线投资同时上升。大公司开始用定制芯片、专用加速器、系统级设计和内部硅团队应对新阶段。硬件创新不会停止,但从通用制程红利转向架构、封装、软件协同和特定任务优化。

PinnedPinnedPrivate
annasofia.xyz

现代计算机值得被批评,因为硬件越来越强,软件却越来越笨重、脆弱且不可理解。处理器、内存和网络速度大幅提升,本应让程序更快、更可靠、更可控,现实却是应用崩溃、系统膨胀、依赖堆叠和用户无能为力变成常态。过去资源稀缺迫使程序员保持克制,坏设计更容易被淘汰;今天算力和存储掩盖了低质量软件,大量历史代码持续累积,维护成本被推给未来。Unix 曾提出一种清晰的反方向:程序只做一件事,用文本流互相连接,让用户能组合工具。但图形界面和封闭应用把人变成点击者,计算机越来越能塑造人的行为,人却越来越难改变计算机的行为。更深层的问题是,软件并非纯技术,它包含审美、政治、权力和创造控制。复杂到无人能完整理解的系统支撑着社会运行,这不是进步的必然形态,而是行业长期纵容复杂性的结果。


PinnedPinnedPrivate
users.ece.utexas.edu

罗伯-派克的 5 条编程规则 规则 1.你无法判断一个程序会在哪里花费时间。在测量之前不要调整速度,即便如此,除非代码的某个部分压倒了其他部分,否则也不要调整速度。规则 3.当 n 较小时,花哨的算法会很慢,而 n 通常很小。如果你选择了正确的数据结构,并把事情组织得井井有条,算法几乎总是不言自明的。派克规则 1 和 2 重申了托尼-胡尔的著名格言:"过早优化是万恶之源"。Ken Thompson 将派克规则的第 3 和第 4 条改写为 "当有疑问时,使用蛮力"。规则 3 和 4 是 KISS 设计理念的实例。弗雷德-布鲁克斯(Fred Brooks)曾在《神话中的男人月》(The Mythical Man-Month)一书中阐述过规则 5。规则 5 通常被简称为 "编写使用智能对象的愚蠢代码"。

PinnedPinnedPrivate
lethain.com

工程策略不是愿景口号,而是工程组织处理当前约束的一套成文判断。好的策略包含三部分:诊断、指导性政策和一致行动。诊断要说明真正的挑战是什么,例如收入增长转向某条业务线、测试不稳定拖慢研发、团队之间缺少决策信息;指导性政策要明确取舍,例如资源如何在产品、基础设施、新实验和开发效率之间分配,何时必须升级技术决策,是否坚持标准技术栈;一致行动则把政策变成具体变化,例如调整团队能力、设立测试稳定性投入、改造技术评审流程、规定发布和技术变更的沟通渠道。很多组织以为没有工程策略,其实只是策略没有写下来,隐藏在高管和团队的日常决策里。把它写清楚的价值,是让每个人知道哪些事情优先、哪些 trade-off 已经被接受、遇到争议时该如何推进。策略只有能改变行动,才算真的存在。

PinnedPinnedPrivate
usv.com

“先建完基础设施,再等应用出现”误解了新技术平台的成长方式。历史更常见的顺序是应用先提出真实需求,基础设施再围绕这些需求完善,然后新的基础设施又催生下一代应用。灯泡早于电网,飞机早于机场,电子邮件和消息传递推动网络协议、浏览器和服务商成熟,早期网站带来脚本语言与服务器工具,更复杂的Web应用又推动AWS、Rails、NGINX等基础设施出现。Web3同样如此:比特币、丝绸之路、代币发行和早期dapp先暴露需求,随后才有钱包、智能合约、Infura、Web3js等工具。脱离应用真空建设平台,容易解决不存在的问题;突破性应用能告诉开发者真正缺什么,也让投资者看清基础设施是否有价值。健康的平台演进不是单向阶段,而是应用与基础设施不断互相校准。

PinnedPinnedPrivate
technically.substack.com

内部工具要从使用者的真实工作流出发,而不是当作外部产品的简化版。最典型的是管理面板,它本质上是生产数据库的受控内部界面,让客服、运营或财务能退款、查订单、改地址、修复用户资料,而不需要直接写SQL或接触危险权限。另一类工具服务工程师自身,例如CI/CD、部署脚本、访问控制、测试流程、机器学习模型服务平台或内部Kubernetes入口,很多并没有图形界面,而是通过命令行和自动化脚本完成连续动作。内部工具的特殊性在于用户少、反馈更定性、通常没有专职产品经理、也很少直接绑定收入,因此资源不足和维护滞后很常见。坏工具会迫使团队忍受缓慢、易错和不透明的流程,因为内部用户往往没有替代品。做好内部工具需要明确权限边界、贴合高频任务、减少重复操作,并建立维护责任;它的价值不是界面精致,而是让组织中最常发生的内部动作更快、更准、更少出错。


PinnedPinnedPrivate
web.qianguyihao.com

千古壹号前端图文教程是一套从入门到进阶的中文前端知识库,覆盖 HTML、CSS、JavaScript 和常见工程实践。项目强调对初学者友好,可按路线学习,也可作为日常查询的参考资料。具体工具和框架内容会随前端生态变化,使用时应结合项目最新版本。

PinnedPinnedPrivate
fyze31atzb.feishu.cn

这份面向设计师的 Chrome DevTools 指南介绍如何检查页面结构与样式、理解 Flex 布局、查看设计变量、定位布局问题并使用 Lighthouse 分析页面。它帮助设计师把设计工具中的自动布局、颜色变量和组件概念映射到真实网页,从而更准确地与前端协作并验证实现效果。

PinnedPinnedPrivate
cohost.org

WebGPU 重要,因为它把浏览器绘图从旧式、状态混乱的 WebGL 带到更接近现代 GPU 的模型。过去的 OpenGL、OpenGL ES 和 WebGL 背着大量历史包袱:固定管线、全局状态、扩展碎片、驱动差异,都让开发者难以预测性能和行为。WebGPU 改用更明确的资源、管线和命令提交方式,让程序员直接描述显存、着色器和渲染流程,减少驱动猜测,也更适合 3D、计算任务和高性能 2D 绘制。它的价值不只在浏览器里跑更好的游戏,还在于把 GPU 变成 Web 平台的标准计算与绘图能力。未来的图像编辑、数据可视化、设计工具和交互应用,都可以在不安装原生软件的情况下获得接近本地的渲染能力。它仍有学习成本,但比旧 API 的隐式规则和兼容陷阱更清晰。

PinnedPinnedPrivate
geoffreylitt.com

浏览器扩展的价值不只在于广告拦截或密码管理,而在于它们让普通用户重新获得改造软件的权力。多数现代平台把用户限制在应用设计者预设的边界内,扩展却能在网页之上叠加新功能、删掉干扰、改变界面,甚至把多个小工具组合成自己的工作环境。它们强大,是因为 Web 把可读代码、语义标签和统一表单等结构暴露给浏览器,使第三方无需等待官方 API 也能动手。真正值得争取的方向,是让扩展更容易被普通人制作、更不容易被网站更新破坏,并在安全与隐私之间继续保留这种可改造性。开放平台的意义,不是让用户多填几个文本框,而是允许他们改变使用软件的方式。安静的、细碎的扩展生态,提醒我们计算机本可以更像可组装的工具箱,而不是封闭的消费品。

PinnedPinnedPrivate
indepthjavascript.dev

老实说,我第一次看到正则表达式时,那是一次可怕的经历。它看起来像一种奇怪的外星语言!我心想:“我花了几个月的时间学习编程,现在我必须学习这门看似超级复杂的语言!然而,一旦我坐下来真正学习正则表达式,我发现它并不难,一旦你学会了语法。我为什么还要费心学习正则表达式?


PinnedPinnedPrivate
blog.bhanuteja.dev

文章解释新标签页可能利用 window.opener 控制原页面的反向标签抢注风险,并区分 rel 属性的作用:noopener 阻止新页面访问原窗口,noreferrer 还会隐藏引用来源,nofollow 则用于搜索引擎关系声明。对使用 target="_blank" 的外部链接,应优先添加 noopener;只有确实不希望传递引用信息时,才使用 noreferrer。

PinnedPinnedPrivate
snyk.io

当开发人员需要出于不同目的处理不同形式的 URL 时——例如浏览器历史导航、锚定目标、查询参数等——我们通常会求助于 JavaScript。但是,它的频繁使用会促使攻击者利用其漏洞。这种利用风险是我们必须在我们的 JavaScript 应用程序中实现 URL 验证的原因。URL 验证的存在是为了加强安全性以防止可能的漏洞利用并消除运行代码时出现任何错误的可能性。但是我们什么时候应该使用 URL 验证,我们在这个过程中验证什么?

PinnedPinnedPrivate
netmeister.org

了解 gTLD 中权威 NS 记录的多样性。2022 年 11 月 15 日。这是我在 第五届 ICANN DNS 座谈会 。为什么是的,互联网是建立在一个基础上的 和 胶带 WD40 众所周知。DNS 是 所有房角石,如果被撞倒,很快就会 导致西方文明的没落。


PinnedPinnedPrivate
how.complexsystems.fail

复杂系统失败通常不是单个错误造成的,而是许多平时看似无害的小故障在特定时刻叠加。交通、医疗、发电这类系统天然带有危险,因此才会发展出备份、流程、培训、监管等多层防线。灾难发生时,人们容易寻找一个根因或一个犯错的人,但这种解释遮蔽了真实机制:系统长期在带缺陷的状态下运行,靠冗余和一线人员的持续调整维持安全。事后知道结果,会让旁观者误以为风险当时显而易见,从而低估操作者面对的不确定性。人既要完成生产,又要阻断事故,这两个角色经常冲突。改变也不总是让系统更安全,新技术可能消除常见小问题,同时打开罕见但严重的新失败路径。安全不是某个零件或部门的属性,而是整个系统在变化中不断被人创造出来的结果。没有故障经验的人,也难以识别系统边界在哪里。

PinnedPinnedPrivate
apenwarr.ca

很多人不这么认为,但我认为这是因为他们要么没有把这个比喻延伸得足够远,要么是因为他们没有正确理解金融债务。这在第一年就能获得90万美元的利润!(不包括折旧) 有盈利的长虹公司承担债务是有原因的,而且随着时间的推移,债务总额往往增加而不是减少。利率第二高的是普通用途的信用卡,如Visa或Mastercard。技术债务通常表现为你的开发速度放缓(即你所做的其他事情的开销),这意味着在中长期内推出的功能较少,这意味着收入和客户反馈较少。在这之后,在添加测试和文档之前,你尝试写的每一个PR(即 偿还债务)会更慢,因为你有可能创造出未被发现的错误或遇到未被记录的边缘案例。Debt ceilings 债务最高限额 美国政府给自己强加了一个著名的不明智的债务上限,这主要是为了制造戏剧性,并创造一个伟大的地方来推动没有人看的无关的附加条款,因为提高债务上限的法案总是会通过。相当于技术债务的情况是,当你落后到完全没有改进的情况下,你可以勉强维持系统的运行;。


PinnedPinnedPrivate
simplethread.com

关系型数据库并不过时,它们强在把数据可靠性变成默认能力。ACID 事务、外键、唯一约束、非空约束和检查约束,看起来不如高吞吐基准耀眼,却替应用承担了最难处理的工作:失败、并发、崩溃和边界情况下的数据一致性。许多 NoSQL 系统之所以显得更快、更容易横向扩展,是因为它们放弃或弱化了部分保证,例如即时一致性、复杂查询、跨表关系和严格模式。这不是单纯的技术进步,而是复杂度转移:数据库少管的事情,应用代码、后台任务和人工修复就要多管。对海量写入、简单键值访问、特殊分片需求或最终一致性可接受的场景,非关系数据库很合适;但在大多数业务系统里,干净、结构化、可长期维护的数据更重要。应用会重写,数据会留下。选择数据库时真正要问的不是谁更现代,而是谁承担了哪些代价。

PinnedPinnedPrivate
misfra.me

CTE 可以直接充当一次性查找表,用来把数据库里的代码值转换成更适合展示的文本。面对国家代码、状态码、类型码这类字段,常见做法是在查询里写 CASE 表达式,但分支一多就会让主查询变得臃肿;同样的映射如果在多个地方使用,还得反复复制,维护时容易漏改。更清爽的写法是在查询开头用 CTE 构造一张小表,把 code 和 label 一行行列出来,再在主查询中 JOIN 或多次引用它。这样映射规则集中、可读性更好,也更接近真实维表的思路。对于 SQLite 和 PostgreSQL 这类支持 CTE 的数据库,这是一种轻量、无需建表、适合报表和临时分析的技巧。它不替代正式的数据建模,但能让一次性查询少些噪音。

PinnedPinnedPrivate
blog.danslimmon.com

面对数据库容量或性能瓶颈,先充分挖掘现有系统,再引入分片等会显著增加复杂度的架构。文章以 Postgres 优化为例,说明团队可通过遥测定位重查询、优化或消除低效代码、调整负载和补充系统能力,延后数月甚至数年的扩容压力。这个过程不仅节省工程时间,也会积累跨团队的系统知识;只有当业务需求确实超过现有技术边界时,才值得承担架构跃迁的成本。


PinnedPinnedPrivate
tmp.bearblog.dev

因此,我的做法是随机编排 1 到 3 个单词,或许在末尾添加一个随机年份,有时使用 leet speak,有时使用一些用户名生成器。为每项服务手动创建新的电子邮件帐户非常繁琐,但幸运的是,有一些服务可以帮助我们完成这项工作: Firefox Relay(5 次免费,无限制每年约 12 美元) Fastmail 屏蔽电子邮件(无限制,30 美元/年) iCloud+ 隐藏我的电子邮件(无限量,0.99 美元/月) 有了这些服务,我就能获得类似于服务独有的 "别名"。1Password 与 Fastmail 的掩码电子邮件集成,因此我可以在网站注册时即时生成电子邮件和密码。如果我出于某种原因需要或想要一张个人头像,我会用以下方法生成一张: ThisPersonDoesNotExist、ThisCatDoesNotExist 或类似服务 Dall-E(根据我的提示生成图像) 有时我会在谷歌或类似网站上搜索 "随机 "图片,但我会尽量注意版权问题,绝不使用真人图片。

PinnedPinnedPrivate
k3tan.com

隐藏网络身份需要把设备、账号、网络连接、支付方式和自托管服务作为一个整体设计。文章从匿名邮箱、独立设备、操作系统、公共网络和数据托管等环节说明,任何一个与真实身份绑定的细节都可能破坏匿名性。它也提醒读者,完全匿名成本很高,实践前应先明确威胁模型和必要程度。

PinnedPinnedPrivate
geekplux.com

提升互联网隐私的关键不是寻找单一神器,而是按风险叠加几层合适的保护。DNS 是第一层,Cloudflare 1.1.1.1 通过更快的解析和 DoH、DoT 加密,减少运营商或中间人看到浏览查询的机会。苹果 iCloud Private Relay 则把流量拆给两个中继处理:苹果知道用户 IP 但不知道访问目标,第三方知道目标网站但不知道真实身份,从而降低单一机构掌握完整轨迹的可能。两者一起用,能覆盖日常浏览的大部分隐私需求。VPN 适合公共网络、地理位置切换或更高安全要求,但它会把信任集中到 VPN 服务商身上,也可能牺牲速度。浏览器、广告拦截器、脚本拦截器、私人搜索和加密邮箱是补充工具。真正可持续的策略,是在便利、速度和安全之间选择默认组合,再按场景临时加固。


PinnedPinnedPrivate
github.com

在浏览器中输入 URL 并回车,看似只是打开网页,背后却串起了从硬件输入到网络通信再到页面渲染的一整条计算机系统链路。这个中文翻译项目把键盘事件、URL 解析、DNS 查询、协议交互、浏览器处理等环节拆开说明,适合用一个日常动作理解操作系统、网络、浏览器和前端工程之间的连接。它解决的问题是把抽象的“网页加载”还原成可追踪的步骤,让学习者知道每一层系统分别承担什么职责。长期价值在于建立工程直觉:排查网页打不开、DNS 异常、请求慢、渲染问题时,不再只停留在表象,而能沿着输入、解析、寻址、传输、响应和展示逐层定位。对入门者,它是一张跨学科地图;对有经验的工程师,它能用来补齐自己忽略的底层环节,把浏览器、网络和操作系统知识串成一条完整路径。面试准备、系统学习和故障复盘都能反复使用这条路径,也适合作为课程导读。

PinnedPinnedPrivate
jvns.ca

这是我去年在 RubyConf Mini 上发表的主题演讲:10 年学习 DNS。从我第一次购买域名并设置我的 DNS 记录到我真正觉得我了解该系统的工作原理,我大概花了 16 年的时间。在本次演讲开始时我想说的一件事是,我认为花 16 年时间学习 DNS 之类的东西是很正常的。例如,您在手机上使用 Google 地图,它需要知道 maps.google.com 在哪里,对吗?我要谈谈两个用于 DNS 的间谍工具:dig 和 wireshark。我在这张幻灯片上使用了 example.com 而不是 maps.google.com,但字段是相同的。当我们像这样进行 DNS 查询并查找 example.com 时,Wireshark 可以捕获它。所以我们应该能够使用 Wireshark 在 DNS 查询中找到该域名。快速警告:您的浏览器可能正在使用加密的 DNS,如果您的 DNS 已加密,则使用 Wireshark 监视您的 DNS 查询将不起作用。

PinnedPinnedPrivate
css-tricks.com

WWW 仍可作为网址的一部分,但已不是必须保留的技术标志。网站应在 www 子域和裸域之间选择一个规范地址,并把另一个永久重定向过去。两种方案在 DNS 配置、Cookie 范围和可识别性上各有差异,搜索引擎并不偏好其中任何一种;真正重要的是保持跳转、canonical 和站内链接一致。


PinnedPinnedPrivate
herbcaudill.com

不一定,老项目最不该因为代码难看就推倒重写。网景在浏览器大战中选择重写,三年后交付缓慢又多漏洞的新版本,市场份额已经被 IE 吃光;技术上后来孕育了 Gecko 和 Firefox,商业上却等同自毁。Basecamp 的相反经验说明,重写能成功的前提不是复制旧系统,而是承认问题、用户和产品判断已经变了。Basecamp 2 删除旧功能、放弃完全兼容,把它当成新产品;同时不强迫老客户迁移,继续维护 Classic。真正的判断标准是:重写是否带来新的产品自由,是否能在有限时间交付,是否尊重既有用户的工作流。否则,重写只会把公司拖进漫长的暂停,既丢掉未来,也消耗现在。代码债只是线索,不是理由;产品债和用户迁移成本才是关键。

PinnedPinnedPrivate
medium.com

软件重写不能被简单判成禁忌,也不能被当成摆脱遗留代码的万能出口。网景的失败说明,从头重写会吞掉多年时间,让产品停滞、竞争对手追上来,还可能丢掉旧代码里积累的边界案例和用户习惯。Basecamp的成功则说明,有些重写并非因为代码腐烂,而是因为既有用户和既有产品形态把团队锁住,任何改动都会伤害现有工作流,导致产品逐渐只服务过去的客户,不再吸引未来客户。真正的问题不是“要不要重写”,而是现有系统的限制来自哪里:技术债、架构错位、过时平台、招聘困难、产品方向冻结,还是用户迁移成本。可选路径也不只有渐进重构和完全推倒重来,还包括并行新版本、分模块替换、保留旧产品服务老用户、用新产品验证新市场。重写应当服务清晰的业务目标,并承认迁移、功能缺失和时间窗口的代价。若只是厌恶旧代码,重写多半会失败;若旧产品已经阻止公司面向未来,干净的新起点可能反而更诚实。


PinnedPinnedPrivate
papereditor.app

有一天,偶然间我发现了一个非常简单而优雅的Markdown编辑器,名为iA Writer,出于某种原因,我决定做一个类似的东西。Xcode、AppKit、Objective-C——这些对我来说都是新的东西,也不是我在日常工作中会用到的。在某个时候,我开始将这个应用称为Paper,因为为了追求极简主义,我将编辑器简化成了一个空白的矩形。2017年1月,从零开始两年后,我在Mac App Store上发布了这个Mac应用程序。因此,这里是我整理的所有怪异、奇特,有时聪明的方式,我在开发过程中组织我的应用程序架构和产品理念,这些都来自一个网页开发者,他在Mac或iOS开发者的工作中没有赚到一分钱,但却通过向Apple设备的用户销售本地文本编辑器赚到了不少钱。论文只使用来自AppKit和UIKit的原生UI元素,因为它们具有最低的维护成本:由Apple自动更新,可适应各种特性,向后兼容,并且保证在每个设备上都能正常工作。


PinnedPinnedPrivate
wiki.c2.com

我可能错了,但一个 2000 级的工资单系统听起来像是一个\差\的设计。I once thought payroll was simple too. 抱歉,这只是我的直觉,2000 级的规模实在太大了,战舰管理可能不划算!事实证明,它本质上是复杂的,因为经过多年的工会谈判和人力资源人员的奇思妙想,已经形成了各种特殊的交易和奇怪的做法。UPGWA(you-pig-wa)美国联合护厂工人协会根据雇用时间将工人分为两级。这些字段大多比较复杂,例如 他们有一些奇怪的计算方法,比如(基本工资,除非这个人在休病假,在这种情况下就是他的子女数)(嗯,差不多)。有时,他们会在系统中发现同一个人有两个副本,有时在同一个工资单中,有时在不同的工资单中。马丁-福勒(MartinFowler)说,"商业逻辑 "是一个矛盾体,因为企业的运行方式非常不合逻辑。


PinnedPinnedPrivate
susam.net

下面引自 RFC 4122: 本规范为 UUID(通用唯一标识符)(也称 GUID(全球唯一标识符))定义了统一资源名称命名空间。下面是几个使用 Python 生成第 4 版 UUID 的示例: 版本 4 UUID 是目前最常用的 UUID 类型之一。在第 4 版 UUID 中,除六个比特位外,其他所有比特位都是随机生成的。下面是一个演示第一组固定位的 Python 小程序: 上述程序是一个无限循环。我们可以看到前面提到的两个版本 4 UUID 示例,并确认情况确实如此。下面还有几个例子可以说明这种模式: 第二个连字符后面的数字位于索引 14,事实上,这个数字总是 4。由于我们使用的是第 4 版 UUID 的变体 1,这两个位必须分别为 1 和 0。同样,对 RFC 第 4.1.2 节和第 4.1.3 节的研究表明,八位位组 6 最重要的四位必须设置为 0100,以表示版本号 4。


PinnedPinnedPrivate
dev.to

使用 GitHub Actions 让你的 GitHub 配置文件动态化 April 9, 2023 2023 年 4 月 9 日 人们首先在网上在哪里发现您?使用 GitHub Actions,您可以将静态 markdown 文档转变为动态体验,随时了解有关您的最新信息。在此示例中,您将学习如何抓取网站并使用该数据动态更新您的 GitHub 配置文件。How Your GitHub Profile Works 你的 GitHub 配置文件是如何工作的 你的 GitHub 配置文件可以通过在网络浏览器中转到 找到,例如我的。您的文件结构现在应该如下所示: Making a Dynamic Profile 制作动态配置文件 我们需要为这个例子做三件事: 在 中定义动态内容所在的位置 在 中添加一个脚本来完成抓取工作 在 中为 GitHub Actions 添加一个工作流程,它将按计划运行脚本 现在让我们执行这些步骤中的每一个。


PinnedPinnedPrivate
tomcritchlow.com

小型数据库是独立网络最缺工具的一块拼图。发布一篇文档已经很容易,发布一个可搜索、可维护、可协作的收藏却仍然困难:艺术家索引、阅读清单、图画书档案、网络女性主义资料库,都需要对象、标签、关系、注释、稳定地址和导入导出能力,而普通建站工具更擅长页面,不擅长集合。电子商务平台已经证明产品数据库可以被非技术用户管理,但类似能力很少服务于业余研究者、策展人和小机构。理想工具应支持批量编辑元数据、创建路径和关系、开放文件格式、搜索发布,并允许自动化参与维护,例如抓取新资料、用机器学习提取颜色或媒介标签。问题不只是技术,也包括社会认知:像 Substack 让付费通讯成为可理解的模式一样,小型数据库也需要一个能让人轻松创建、更新、分享甚至收费的生态。更多小图书馆和社区索引出现,网络才会不只是文章流,也是公共记忆的细密结构。


PinnedPinnedPrivate
blog.galowicz.de

显示分辨率和丢帧检测可以自动化,但难点不只是写脚本,而是让自动化结果在 QA 流程里等同于人工签字认可。被测笔记本运行定制系统,发布前必须验证网络、外接屏、休眠唤醒、虚拟机和视频播放;由于产品不能被测试工具改变,插拔显示器、合盖开盖、断开扩展坞都要从硬件层面真实发生。原型用 Linux 控制机、树莓派 GPIO、远程电源插座、物理视频开关、电磁铁和多台摄像头搭出端到端测试台,再用 NixOS 固化系统配置,用 Python 服务提供镜像上传、任务调度和结果下载。分辨率验证的关键是拍摄真实屏幕,通过 OpenCV 和 ArUco 标记定位显示器四角,把照片校正为可分析的屏幕区域,再判断测试图案、方向、排序和分辨率是否符合预期。丢帧检测也沿用同一思路:看用户实际会看到的画面,而不是只相信驱动报告。


PinnedPinnedPrivate
thevaluable.dev

终端、控制台和 Shell 不是同一种东西,而是一组从电报、电传打字机和早期 Unix 继承下来的层层抽象。TTY 最初是有键盘和打印机的实体设备,人把字符输入机器,机器把结果打印出来;ASCII、回车、换行、DEL 等控制字符,都来自这种机械通信时代。后来纸张被屏幕取代,视频终端出现,再后来现代系统用虚拟终端和终端模拟器复刻这些行为。控制台更接近系统提供的本地交互入口,终端负责承载输入输出,Shell 则是在其中运行的程序,解释命令、启动进程、连接管道。今天开发者在黑框里输入命令,看似只是在操作软件,其实仍踩在一整套旧硬件协议、字符编码和 Unix 设计传统之上。理解这些来源,能减少把 terminal、console、shell 混用造成的误会。


PinnedPinnedPrivate
img.ly

在本指南中,我们将讨论 FFmpeg 的热门话题。但在此之前,我们将介绍一些基础知识,以帮助您了解基本的媒体概念和 FFmpeg。随意跳过对您来说已经微不足道的部分!FFmpeg.org 的定义如下:“FFmpeg 是领先的多媒体框架,能够解码、编码、转码、mux、demux、流、过滤和播放人类和机器创造的几乎任何东西。它支持最晦涩的古老的格式一直到最前沿。