代码审查:一个成功案例
一位工程师X在Google参与了两个项目的开发,分别经历了两种不同的代码审查流程。第一个项目代码审查流于形式,导致上线后出现大量bug。第二个项目则采用了严格细致的代码审查流程,尽管耗时较长,但最终一次性通过测试,并让工程师X受益匪浅,甚至提升了其职业发展。文章强调代码审查本身并非问题,关键在于参与者的态度和方法,以及如何合理利用这个工具提升代码质量和培养新人。
一位工程师X在Google参与了两个项目的开发,分别经历了两种不同的代码审查流程。第一个项目代码审查流于形式,导致上线后出现大量bug。第二个项目则采用了严格细致的代码审查流程,尽管耗时较长,但最终一次性通过测试,并让工程师X受益匪浅,甚至提升了其职业发展。文章强调代码审查本身并非问题,关键在于参与者的态度和方法,以及如何合理利用这个工具提升代码质量和培养新人。
本文介绍了一种在无法使用快照的情况下备份系统磁盘的巧妙方法。作者面临的困境是:需要备份一个临近崩溃的系统,但该系统不支持快照功能,重启或重新配置存储设置又不可取。文章重点介绍了利用Linux的blktrace API,实时追踪磁盘块设备的活动,从而在数据写入过程中也能完整地创建磁盘镜像。作者还分享了其使用Go语言开发的工具hot-clone,该工具通过追踪磁盘块的修改,确保在镜像创建过程中不会丢失数据,最终实现了完整备份。这为在紧急情况下备份关键系统提供了一种可靠的解决方案。
Keon 是一种人类可读的对象表示法 (ORN) 和序列化格式,其语法类似于 Rust,并完全支持 Serde 的数据模型。它具有更简洁的语法,支持注释和尾随逗号,并允许像编写 Rust 代码一样编写 Keon。Keon 区分元组和列表,支持任意类型作为字典键,并提供对 Base64、Base32 和 Base16 的支持。其目标是提供一种更直观、易于阅读和编写的序列化格式。
Cloudflare Pages的免费套餐提供无限带宽,这在竞争对手中脱颖而出。作者探讨了其背后原因:静态网站占用资源少,易于服务;Cloudflare受益于更快的互联网,从而促进更多公司使用其安全产品;免费试用促进了口碑营销,并引导用户升级付费服务。虽然Cloudflare官方未明确解释,但作者认为这是一种战略决策,与Cloudflare其他免费服务如1.1.1.1 DNS服务和免费DDoS防护相一致,旨在推广其安全产品生态。
本文深入探讨了广义LR (GLR) 解析算法及其改进版本——右空GLR (RNGLR) 解析算法。GLR 算法能够解析任何上下文无关文法,而无需对文法进行限制,这对于原型设计非常有用。然而,传统的 GLR 算法在处理隐藏左递归和隐藏右递归时存在效率问题。RNGLR 算法通过巧妙地处理右空规则,有效地解决了这些问题,提高了解析效率。文章详细解释了 RNGLR 算法的原理,并通过实例演示了其在处理冲突和构建共享压缩解析森林 (SPPF) 方面的优势。
Ropey是一个用Rust编写的UTF-8文本处理库,专为大型文本编辑器等应用设计。它高效、稳定,能轻松处理海量文本和复杂编辑操作。Ropey支持Unicode,性能稳定可预测,尤其擅长处理中等至大型文本的频繁编辑。但它不适合处理极小文本或超过可用内存的文本。其核心功能包括:强大的Unicode支持、行感知操作、高效的Rope切片和灵活的低级API。Ropey已在多个项目中得到应用,并通过了严格的测试,为开发者提供可靠的文本处理解决方案。
本指南旨在帮助Django开发者轻松掌握现代JavaScript开发。它涵盖了组织前端代码、现代JavaScript工具、集成JavaScript管道、构建React应用、使用HTMX和Alpine.js构建无JavaScript网站以及使用OpenAPI改进前端API交互等多个方面。指南采用分步式讲解,从基础知识到实际应用,循序渐进,适合不同水平的开发者。
一个三人的团队在四个多月内用 Rust 构建了一个名为 ScopeDB 的共享磁盘架构云数据库,用于管理 PB 级别的可观测性数据。他们充分利用了 Rust 生态系统中的众多开源项目,如 Apache OpenDAL、SQLx、SeaQuery 等,并积极回馈社区,贡献了多个补丁和库。ScopeDB 还拥有一个开源的“孪生兄弟”Morax,用于分享工程经验,体现了一种商业化开源模式。
本文介绍了一个仅用383字节实现的x86-64 Linux ELF可执行文件,它是一个二元Lambda演算解释器。这个微型解释器实现了垃圾回收、惰性列表和尾递归等特性,其程序以极小的二进制编码表示,例如元循环解释器仅需232位。作者还提供了其他平台的C代码和预编译二进制文件。这个项目对于学习Lambda演算非常有帮助,也展示了在极端资源受限的环境下,仍然可以实现复杂的计算功能。
博客作者John Graham-Cumming分享了他2002年用30美元从AOL标志性语音播报员Elwood Edwards处定制语音片段的经历。当时,Graham-Cumming正在开发一个机器学习邮件过滤程序POPFile,并通过Edwards的网站订购了“Mail classified by POPFile”和“Use the source, Luke!”两句语音,Edwards还额外赠送了“You've got mail, John!”。这篇文章不仅展现了一段科技往事,更体现了早期互联网的个性化和人情味,以及技术人员的幽默感。
Claudio Santini开发了一个名为Audiblez的工具,利用轻量级82M参数的文本转语音模型Kokoro,将电子书转换成高质量的有声书。Audiblez支持多种语言和音色,可在几小时内转换大型电子书。该工具使用Python编写,需要安装必要的库和模型文件。虽然章节检测尚不完善,但整体效果良好,未来将改进章节检测和添加更多功能。
Parallels Desktop 20.2更新为Apple Silicon Mac带来了对x86架构Windows和Linux系统的早期支持,这意味着M1、M2及更高版本芯片的Mac用户现在可以运行更多版本的Windows和Linux系统。虽然性能受限,启动时间较长,且不支持USB设备和嵌套虚拟化,但对于需要在Apple Silicon Mac上运行x86应用程序的用户来说,这是一个重要的进展。
Customasm是一个允许你定义自定义指令集的汇编器,方便测试虚拟机字节码或为FPGA芯片上的新微处理器架构编写程序。它支持Web端在线试用,并提供NES示例项目和VSCode语法高亮扩展。你可以通过cargo install customasm安装,或从Releases下载预编译的可执行文件,亦可从源代码编译。文档和使用指南可在wiki中找到。
临近Linux 6.13内核稳定版发布之际,一个由微软工程师提交的代码更改险些酿成大祸。该更改旨在提升性能,但它在某些系统上造成了问题,特别是那些启用了控制流完整性(CFI)的系统,例如搭载英特尔Alder Lake处理器的机器。英特尔工程师Peter Zijlstra紧急提交了一个补丁来禁用该有问题的代码,避免了Linux 6.13稳定版发布的延期。这一事件凸显了代码审查的重要性,以及在将代码合并到大型开源项目之前进行充分测试的必要性。
Pyper是一个基于函数式编程模式的灵活框架,用于简化并发和并行数据处理。它支持线程、多进程和异步操作,并通过简洁的API和高效的队列机制,轻松构建ETL系统、数据微服务和数据收集管道。Pyper无需额外依赖,纯Python编写,具有易用性、安全性及高效率等特点,让开发者专注于业务逻辑,而不是底层并发细节。
SimplexDocsPlaygroundRequest API 提供了代码执行和预览功能。用户可以通过该 API 向服务器提交代码,服务器端会执行代码并返回结果,同时提供代码执行过程的预览。这对于开发者调试代码、测试API以及快速构建原型非常有用。该 API 还在加载中,需要等待代码执行完成才能查看结果。
作者因厌倦了SvelteKit构建系统的复杂性,决定将个人网站重写为纯HTML和CSS。他详细描述了重写过程,包括使用Pandoc将Markdown转换为HTML,以及使用Python和uv构建轻量级构建流程。虽然网站规模较小,但重写后网站大小从356kb减少到88kb,代码更简洁易懂。作者还指出了重写后存在的代码重复和缺乏实时重载的问题,并计划在未来改进。
本文通过测试在Pascal和C语言中判断一个数是否为偶数的两种方法——模运算和位运算——的性能,发现位运算(使用按位与运算符)显著快于模运算。作者在Pascal中测试了从0到MaxInt的循环,位运算的执行速度比模运算快了近15倍。在C语言中,虽然编译器优化可能将模2运算转化为位运算,但测试结果仍然显示位运算略胜一筹。这说明在性能敏感的环境中,优先选择位运算来判断偶数更为高效。
FFmpeg By Example 网站汇集了大量 FFmpeg 使用技巧,展示了其在视频和音频处理方面的强大功能。无论是提取视频片段、分析视频元数据,还是生成 GIF 图片,你都能在这里找到相应的示例代码和详细解释。该网站鼓励社区贡献,并提供在线尝试功能,方便用户学习和实践。
rqlite,一个基于SQLite和Raft的轻量级分布式关系数据库,其可靠性和质量源于其严谨的测试策略。文章详细阐述了rqlite如何遵循测试金字塔模型,以单元测试为核心,辅以系统测试和少量端到端测试,确保高效且易于调试。单元测试占据大部分比重,确保组件的独立性和可测试性;系统测试验证Raft共识模块和SQLite的交互;端到端测试仅作为最后的验证。此外,文章还强调了性能测试的重要性,并分享了在测试过程中学到的经验教训,例如从性能测试中发现并优化了fsync调用带来的瓶颈。rqlite的成功案例证明了这种测试策略在维护高质量的同时,还能保持开发效率。
structured-logprobs是一个开源Python库,通过提供详细的token log概率信息来增强OpenAI的结构化输出可靠性。它与OpenAI的结构化输出功能配合使用,该功能可确保模型始终生成符合提供的JSON Schema的响应,避免缺失必要键或产生无效值。该库提供两种方法整合log概率:作为单独字段添加到响应中,或内嵌到消息内容中。
Marimo推出了一个在线playground,允许用户免费创建和共享Marimo笔记本,无需注册账号。用户可以通过链接分享,并嵌入到其他网页中,例如Marimo官方文档中就使用了该功能。目前仅支持WebAssembly笔记本,虽然在包和性能方面存在一些限制,但易于分享和嵌入。用户可通过marimo.new创建新笔记本,保存到浏览器本地存储或社区云。GitHub上的笔记本也可直接在playground中打开,并支持包含数据文件。此外,还提供多种配置选项,例如只读模式、隐藏标题和排除代码等,方便用户灵活使用。
DevOps 并非仅仅是一套工具,更是一种软件交付的文化哲学和实践集。它通过自动化和桥接软件开发与IT运维团队之间的流程,来消除阻碍软件交付的瓶颈,例如手动流程、办公室政治和相互冲突的工作流程。DevOps 倡导持续集成(CI)和持续交付(CD),通过更短的开发周期、更快的反馈循环以及自动化,显著提升软件交付速度和质量。持续集成自动化了构建、测试和打包阶段,而持续交付则将自动化扩展到整个交付流程,最终让用户更快速地访问软件。成功的 DevOps 实施需要关注自动化、团队文化和流程优化,并从小的方面入手逐步改进。
作者分享了两年来使用NixOS(操作系统、包管理器和语言)的体验。起初被其声明式配置和可重复性所吸引,但在实际使用中,却发现问题多于解决方案。虽然NixOS在服务器和简单服务方面表现出色,但在桌面使用中,由于包管理的复杂性、构建错误、资源消耗大等问题,最终选择放弃全盘使用,转而寻求更易用的方案。
Modal团队创建了一个全面的GPU术语表,旨在解决GPU文档分散的问题。这份交互式在线词典涵盖了从CUDA架构到nvcc编译器标志等各个层面,将相关的概念清晰地连接起来。用户可以通过超链接在各个页面之间跳转,也可以线性阅读。内容包含设备硬件(CUDA架构、流多处理器等)、设备软件(CUDA编程模型、PTX等)、主机软件(CUDA C++、NVIDIA驱动程序等)等多个方面,为开发者提供了一个全面而易于理解的GPU知识库。
本文探讨了如何在 Elixir 中使用集合论类型来解决静态类型语言中库的公共数据定义向后兼容性问题。作者以一个 C 和 Rust 库交互的例子说明了现有类型系统在处理数据结构演进时的不足,并提出了一种基于结构子类型和版本修订的解决方案。这种方案允许库在不破坏现有用户的情况下扩展数据结构,通过编译器自动验证类型安全,并支持库和应用之间不同版本的数据协同工作。
经过21年的发展,Guix Shepherd 服务管理器终于迎来了1.0版本发布!Shepherd是一个极简但功能强大的服务管理器,它能够监控、启动、停止和重启服务,并支持自定义操作和服务依赖关系的可视化。Shepherd 使用 Guile Scheme 编写,配置简单易懂,即使不是 Scheme 专家也能轻松上手。1.0 版本新增了定时服务、改进的服务状态显示、日志轮转服务和系统日志服务等功能,代码简洁高效,仅 7.4K 行 Scheme 代码。未来,Shepherd 将朝着分布式和能力式服务管理器方向发展。
dbt Labs收购了SDF Labs,这家公司拥有先进的SQL理解技术。此举将显著提升dbt的开发者体验,包括大幅提升编译速度、提供IDE代码自动补全、以及更精准的数据血缘追踪等。SDF的技术能够让dbt更深入地理解用户编写的SQL,从而实现更强大的功能和更流畅的开发流程,这被比作是数据领域里的“React时刻”。
最近在玩HTML的``元素,它可以方便地创建原生对话框,无需大量JavaScript代码。文章介绍了两个实用技巧:一是使用`backdrop-filter: blur(2px);`为``的背景添加模糊效果;二是使用`body:has(dialog[open]) { overflow: hidden; }`在``打开时禁用页面滚动,避免页面内容在滚动时与对话框重叠。这两个技巧能提升用户体验,使对话框更易用。
本文探讨了软件开发团队组织结构的演变。过去,软件开发采用自上而下的瀑布模型,效率低下。互联网时代,分布式团队兴起,软件结构也随之转变为网络状。作者指出,这种新型组织结构与蚂蚁等昆虫的群体行为——“群体智能”——有异曲同工之处。群体智能通过个体间的间接刺激(例如代码注释、邮件等),实现高效协作,无需中心化控制。文章最后倡导程序员学习群体智能,借鉴昆虫协作模式来提升软件开发效率和质量。