分类: 开发

软件工程:黄金时代已过?

2025-07-05
软件工程:黄金时代已过?

曾经,软件工程师是炙手可热的职业,但如今,随着AI技术的兴起和行业竞争的加剧,许多工程师面临着失业的风险。作者认为,这是因为许多工程师安于现状,缺乏进取心,只满足于完成简单的代码编写工作。他鼓励工程师提升自身技能,积极学习AI工具,解决实际问题,才能在竞争激烈的环境中脱颖而出。如今的软件工程不再是人人可为,而是需要真正热爱并为之奋斗的职业。

开发

利用AI应对裁员:重塑职业生涯的实用指南

2025-07-05
利用AI应对裁员:重塑职业生涯的实用指南

在裁员潮的冲击下,作者分享了利用大型语言模型(LLM)AI工具(如ChatGPT或Copilot)来减轻失业带来的情绪和认知负担的实用方法。文章提供了多个提示词示例,涵盖职业规划、简历润色、LinkedIn个人资料优化、人脉拓展以及情绪疏导等方面,帮助求职者更高效、更冷静地应对挑战,并重塑职业生涯。虽然AI工具无法完全替代个人经验,但它们能在关键时刻提供帮助,提升效率和清晰度。

开发

Linux内核开发者与bcachefs文件系统开发者决裂

2025-07-05

Linux内核维护者Linus Torvalds拒绝合并bcachefs文件系统的6.16-rc3版本代码,并暗示在6.17版本中将不再接受该项目的代码贡献。这源于双方在代码审核过程中的严重分歧,Torvalds认为bcachefs开发者Kent Overstreet拒绝接受任何对其代码的质疑和修改。双方私下沟通后,最终决定停止合作。

开发 开发纠纷

AirBending:无需驱动,即插即用的全能MIDI控制器

2025-07-05
AirBending:无需驱动,即插即用的全能MIDI控制器

AirBending是一款革命性的MIDI控制器,它无需任何特殊驱动或插件,即可与Logic Pro、Ableton Live等主流DAW无缝兼容。你可以用它控制外部硬件合成器、软件乐器和效果处理器。其高级预设管理器允许你自定义手势到音乐映射的各个方面,无论是单手还是双手操作,都能实现灵活的音乐表达。它还支持MIDI通道控制、音阶选择和自定义CC赋值,让你精确控制滤波器、效果、音量和调制等参数,是录音室和现场表演的理想选择。

现代CPU如何高效预测字节码解释器循环

2025-07-05

研究Python 3.14尾调用解释器的性能时,作者发现现代CPU能够高效预测字节码解释器循环中的间接跳转。这得益于先进的TAGE和ITTAGE分支预测器。这些预测器通过将程序计数器(PC)及其历史映射到过去的执行行为,并利用多种历史长度的表格来动态选择最合适的预测,从而实现高精度预测。作者进一步探讨了将ITTAGE的思想应用于覆盖率引导模糊测试和程序状态探索的可能性,认为这可能有助于更好地理解和探索解释器等程序的行为。

说服K8s团队转向AWS无服务器的艰辛历程

2025-07-05

作者试图说服其K8s团队采用AWS无服务器架构,却遭遇重重阻碍。K8s工程师们担心成本失控、供应商锁定以及对开源技术的依赖。作者详细阐述了双方在成本、可扩展性、责任分担等方面的争论,最终承认双方技术各有优劣,并可以共存。文章以幽默的笔触展现了技术团队内部的思想碰撞,也反映了企业在云原生技术选型上的困境。

开发 K8s

Amiga 上的 Linux 移植:一次社区合作的尝试

2025-07-05

邮件讲述了 Guenther Grau 加入 AmigaLinux 移植项目的故事。他关注 Amiga 上的 Unix 移植已久,认为 Hamish 的 AmigaLinux 移植项目最具前景,因为它拥有一个可运行的核心,虽然驱动程序尚不完整。Guenther 希望加入该项目,并避免重复工作,致力于尽快让 Unix 在 Amiga 上运行。

Cursor Pro 定价调整及退款声明

2025-07-05
Cursor Pro 定价调整及退款声明

Cursor 公司就其 Pro 计划的近期定价调整向用户道歉,承认沟通不当导致用户产生意外费用。他们将为 6 月 16 日至 7 月 4 日期间因 Pro 计划调整而产生的额外费用提供全额退款。新的 Pro 计划提供无限的 Tab 和 Auto 模式下模型的使用,每月 20 美元的尖端模型使用额度(API 定价),并可选择按需购买更多额度。此调整是为了更好地反映不同模型在不同任务上的成本差异。Cursor 承诺改进未来的定价更新方式,包括提前通知、更清晰的文档和更好的用户支持。

Haskell Lens 库:强大的数据访问利器

2025-07-04

Haskell Lens 库提供了一套强大的工具,用于访问和操作数据结构。它包含透镜 (lenses)、同构 (isomorphisms)、折叠 (folds)、遍历 (traversals) 等,让开发者能够以更简洁、更安全的方式处理复杂的数据。库提供了丰富的示例和文档,并支持自动生成透镜,极大简化了开发流程。无论是读取、写入还是转换数据,Lens 都能提供高效且优雅的解决方案。

开发 Lens

数据库查询优化器:理想与现实的差距

2025-07-04

数据库查询优化器旨在选择最优查询计划,但其依赖于成本估算,而估算又依赖于选择性和基本资源成本(I/O、CPU等)。本文通过实验揭示了优化器经常出错的情况。实验表明,对于简单的SELECT查询,优化器在不同数据分布下选择查询计划的准确性差异巨大。均匀数据集下,位图扫描通常优于索引扫描;而在其他数据分布下,优化器则更容易选择次优的索引扫描。这说明,即使是简单的查询,优化器的成本模型也难以完美适应各种数据分布和硬件环境。虽然基于成本的规划是目前最好的方法,但提升其鲁棒性和适应性仍然是一个重要的挑战。

开发

软件开发:电池包还是无电池?

2025-07-04

本文探讨了软件开发中“电池包(batteries-included)”与“无电池(no-batteries)”两种模式的优缺点。前者如Express,开箱即用,集成度高,易于上手,但缺乏灵活性;后者如Flask,需要开发者自行配置,更灵活,但上手难度更大。作者认为,理想的框架应兼具两者优势,既能提供核心功能,又能支持插件化扩展,满足不同需求。

开发 电池包

Linux 内核恐慌信息 QR 码生成器

2025-07-04
Linux 内核恐慌信息 QR 码生成器

内核恐慌信息通常难以复制粘贴到错误报告中,这给开发者排查问题带来不便。为此,一个名为 `panic_report` 的项目应运而生,它利用 Rust 语言编写了一个嵌入式 QR 码生成器,将内核恐慌信息编码成 QR 码,方便用户快速复制粘贴到错误报告中。该项目已合并到 Linux 内核 v6.12-rc1 版本中,Arch Linux 也即将启用该功能。Rust 的内存安全特性在此项目中至关重要,简洁的代码也使其易于集成到内核中。该项目还提供了一个 Web 前端用于解码 QR 码中的恐慌信息,方便用户和开发者进行调试。

开发 QR 码

用OCaml编写Game Boy模拟器:一次充满挑战的旅程

2025-07-04
用OCaml编写Game Boy模拟器:一次充满挑战的旅程

作者用OCaml编写了一个可在浏览器运行的Game Boy模拟器CAMLBOY。这篇文章详细记录了开发过程,包括模拟器架构设计、接口定义(使用functor和GADTs提高可测试性和可重用性)、指令集实现、性能优化以及编译到JavaScript的过程。作者分享了使用测试ROM进行集成测试和探索性编程的经验,并讨论了OCaml生态系统和语言特性方面的优缺点。

开发

GitHub Copilot Agent 模式和 MCP:我的高效开发新利器

2025-07-04
GitHub Copilot Agent 模式和 MCP:我的高效开发新利器

我一直在寻找提高效率、更快交付更好代码的方法。最近,GitHub Copilot 的 Agent 模式结合模型上下文协议 (MCP) 彻底改变了我的开发流程。通过自定义 Copilot 的 AI 响应,我创建了针对不同开发阶段的专用 AI 助手,例如研究模式和规划模式。MCP 允许 Agent 访问外部工具和数据源,例如搜索引擎、浏览器自动化工具和 GitHub API。这个流程包括研究、规划、实现、修正和验证五个阶段,通过自定义的提示文件,确保 AI 理解我的需求并生成高质量的代码,最终极大提高了我的开发效率和代码质量。

Rust Trait 系统的巧妙规避:解决多重 Blanket 实现冲突

2025-07-04
Rust Trait 系统的巧妙规避:解决多重 Blanket 实现冲突

Rust 的 Trait 系统以其强大的功能和严格的避免歧义规则而闻名。本文作者在开发 Joydb 数据库时遇到了一个难题:如何优雅地处理 `Adapter` trait 的两种互斥实现(`UnifiedAdapter` 和 `PartitionedAdapter`)?直接使用 blanket implementation 会导致编译器报错。作者巧妙地利用了标记结构体(`Unified` 和 `Partitioned`)、辅助 trait (`BlanketAdapter`) 和 `Adapter` trait 中的关联类型来解决这个问题,最终实现了在不违反 Rust 一致性规则的前提下,支持这两种互斥行为,并保持良好的代码可读性和可维护性。

arXivLabs:与社区协作者的实验项目

2025-07-04
arXivLabs:与社区协作者的实验项目

arXivLabs是一个框架,允许协作者直接在arXiv网站上开发和分享新功能。参与arXivLabs的个人和组织都秉承着开放、社区、卓越和用户数据隐私的价值观。arXiv致力于这些价值观,只与遵守这些价值观的合作伙伴合作。如果你有想法可以为arXiv社区增值,那就了解更多关于arXivLabs的信息吧!

开发

突破四十年瓶颈:算法破解“书架难题”,挑战二叉搜索树霸权

2025-07-04

计算机科学家们攻克了困扰他们四十多年的“书架难题”(列表标注问题)。该问题旨在高效地将新数据插入已排序的数据结构中,类似于在书架上添加新书。研究人员开发出一种新算法,其成本接近理论下限,实现了在数据插入成本上的巨大飞跃。这项突破有可能挑战目前排序数据结构中占据主导地位的二叉搜索树,为大数据管理带来革命性的变化。

开发

开源个人网站及邮件通讯工具Postcard

2025-07-04
开源个人网站及邮件通讯工具Postcard

2022年,作者Philip Thomas创建了Postcard,一个个人网站和邮件通讯工具,用于替代社交媒体,与朋友保持联系。Postcard获得了数千用户的注册,尽管收入不高,但作者仍然维护着它。现在,作者决定开源Postcard的代码,方便开发者贡献和定制。Postcard是一个用Ruby on Rails编写的简单应用,支持单用户模式和多用户模式,部署简单,包含Dockerfile和render.yaml文件,方便在Render上部署。

开发

Linux errno(3) 的奇怪限制:成功调用也可能修改 errno

2025-07-04

Linux 的 errno(3) 手册页揭示了一个奇怪的限制:即使函数调用成功,errno 也可能被修改,且系统调用或库函数永远不会将 errno 设置为零。这源于 Unix 系统的传统设计,系统调用通常只在失败时返回 errno,成功时则不修改 errno。C 库函数可能调用多个系统调用,其中一些调用可能失败而不影响库函数本身的成功,导致 errno 保持失败时的值。ANSI C 和 POSIX 继承了这一行为,只要求在函数失败且文档说明会设置 errno 时,errno 的值才有意义。

开发 errno

缓存:抽象而非优化

2025-07-04
缓存:抽象而非优化

传统的观点认为缓存是为了提升软件速度,但作者认为这只是缓存功能的一部分。在处理对象存储、磁盘和内存之间的数据移动后,作者认为缓存更重要的作用是简化软件。文章探讨了预设缓存算法(LRU、LFU等)的局限性,并指出缓存更像是一种抽象层,它隐藏了底层存储的细节,使程序员无需关心数据存储在哪个层级。数据库和操作系统中的缓存机制就是这种抽象的体现。虽然缓存可能存在一些问题,例如操作系统页面缓存和fsync的误用,但这并不意味着要放弃缓存,而是要更好地理解和使用它。

开发

Pennybase: 简洁强大的Go语言轻量级BaaS

2025-07-04
Pennybase: 简洁强大的Go语言轻量级BaaS

Pennybase是一个用不到1000行Go代码实现的轻量级后端即服务(BaaS)解决方案,堪称Firebase、Supabase和Pocketbase的简化版。它仅依赖Go标准库,无需外部依赖,即可提供文件存储(基于版本化CSV)、REST API(JSON响应)、基于会话cookie和Basic Auth的身份验证、RBAC和基于所有权的权限控制、SSE实时更新、数据模式验证以及Go模板渲染等核心功能。数据存储在易于理解的CSV文件中,每次更新都会创建新版本记录。通过巧妙的内存索引,实现了快速查找和更新。其权限控制基于简洁的RBAC模型,并支持自定义Hook函数扩展功能。

GitHub代码建议应用限制

2025-07-04
GitHub代码建议应用限制

GitHub代码审查中,批量应用代码建议功能存在诸多限制,例如:建议无效(无代码改动)、PR已关闭、查看代码子集、单行只能应用一个建议、应用已删除行建议不支持、建议已应用或标记为已解决、来自待处理审查的建议无法应用、多行注释无法应用建议、PR排队合并时无法应用建议,以及一些未知原因导致的“现在无法应用建议”等情况。

开发

浏览器中的AI代理:Wasm-agents项目初探

2025-07-04
浏览器中的AI代理:Wasm-agents项目初探

Wasm-agents项目旨在将AI代理打包成HTML文件,直接在浏览器中运行,无需额外安装工具或框架。该项目利用WebAssembly和Pyodide技术,使Python编写的AI代理能够在浏览器沙箱环境中以接近原生速度运行。目前,该项目支持OpenAI API以及自托管模型,例如通过Ollama运行的模型。开发者提供了一些示例HTML文件,包括简单的对话代理、多代理系统以及具有内置工具的更高级代理。虽然存在一些限制,例如对openai-agents框架的依赖以及CORS问题,但该项目为AI代理的开发和分享提供了一种新途径,值得探索。

开发

Rust版tmux:从C到Rust的10万行代码迁移之旅

2025-07-03

作者耗时六个月,将67000行C代码编写的tmux终端复用器移植到Rust,最终代码量达到81000行。起初尝试使用C2Rust工具进行自动转换,但生成的代码难以维护且体积膨胀。于是作者放弃自动转换,改用手工方式逐行翻译。过程中作者分享了构建过程、遇到的bug以及C代码到Rust代码的转换技巧,例如处理raw pointers、goto语句和侵入式宏。最终,作者使用lalrpop crate重写了yacc解析器,完成了从C到Rust的完全迁移,并发布了0.0.1版本。

局部性行为:编写更易维护代码的原则

2025-07-03

本文介绍了“局部性行为”(LoB) 原则,该原则强调代码单元的行为应该在其自身范围内清晰可见。作者以htmx和jQuery的AJAX请求为例,说明了LoB如何提升代码可维护性。虽然LoB可能与“不要重复自己”(DRY)和“关注点分离”(SoC)等原则冲突,但作者认为,在权衡利弊后,优先考虑LoB能够提升代码的可理解性和可维护性,从而提高软件的质量和可持续性。

开发

arXivLabs:与社区协作者共建arXiv新功能

2025-07-03
arXivLabs:与社区协作者共建arXiv新功能

arXivLabs是一个实验性项目框架,允许合作者直接在arXiv网站上开发和分享新功能。参与其中的个人和组织都认同arXiv的开放性、社区性、卓越性和用户数据隐私等价值观。arXiv致力于这些价值观,只与遵守这些价值观的合作伙伴合作。如果你有想法能为arXiv社区增值,那就来了解一下arXivLabs吧!

开发

uv 构建后端:提升 Python 项目构建速度和体验

2025-07-03

uv 的原生构建后端 uv_build 显著提升了 Python 项目的构建速度和用户体验。它默认配置合理,无需额外配置即可满足大多数用户的需求,并支持灵活的配置以适应各种项目结构。uv_build 支持纯 Python 代码,构建包含扩展模块的库需要其他后端。通过在 `pyproject.toml` 中添加 `uv_build`,或使用 `uv init --build-backend uv` 创建新项目,即可使用该后端。uv_build 还优化了包名规范化、模块发现以及文件包含/排除策略,提高了构建过程的可预测性和可重复性。

开发

代码即一切:大型语言模型的局限性与代码生成的优势

2025-07-03
代码即一切:大型语言模型的局限性与代码生成的优势

本文作者质疑了多组件流水线(MCP)在实际应用中的有效性,认为其过分依赖推理,导致效率低下且难以扩展。作者通过自身经验,以将reStructuredText转换为Markdown为例,阐述了利用大型语言模型生成代码,再由代码执行任务,最后再用大型语言模型验证结果的流程。这种方法降低了对推理的依赖,提高了可信度和可扩展性,尤其适用于需要重复执行的任务。作者认为,虽然MCP在某些特定场景下表现出色,但其固有的局限性使其难以应对大规模自动化需求,未来应探索更有效的代码生成方法,并结合大型语言模型进行验证和解释,以提升其可用性和普适性。

开发

老码农Max和他的Imagebin:简单才是王道

2025-07-03
老码农Max和他的Imagebin:简单才是王道

本文讲述了一个名为Max的程序员和他15年前用PHP写的图片上传脚本Imagebin的故事。Imagebin代码简洁,只有233行,其中大部分是更新日志。作者尝试用Go重写Imagebin,却发现代码量反而增加了,而且可读性下降。这让他反思了程序设计的复杂性,意识到简洁的代码更易于维护,Max的Imagebin正是因为其简洁性而经久耐用。最终,作者决定保留Max的代码,继续使用PHP。

开发

在macOS上原生构建Linux内核:一次充满挑战的旅程

2025-07-03
在macOS上原生构建Linux内核:一次充满挑战的旅程

作者在macOS上原生构建Linux内核(RISC-V架构)的经历,并非易事。过程中遇到一系列问题:老旧的make版本、macOS的ld与Linux的不兼容、缺少elf.h和byteswap.h头文件,以及uuid_t和sed工具的版本冲突。作者通过Homebrew安装更新的工具链(make, llvm, lld, libelf, gnu-sed),并编写了补丁文件来解决头文件缺失和类型定义冲突等问题,最终成功构建内核。虽然macOS原生构建速度比Docker快,但增量构建则反之。作者认为持续解决构建问题如同持续集成一样,是一个永无止境的过程。

开发
1 2 47 48 49 51 53 54 55 213 214