关闭 Fornjot
摘要
Hanno Braun 宣布关闭 Fornjot,这是一个有六年历史的开源 CAD 内核项目,理由是开发节奏不可持续且无法提供与现有解决方案有实质区别的功能。
<p><a href="https://lobste.rs/s/ggp2ov/shutting_down_fornjot">评论</a></p>
查看缓存全文
缓存时间: 2026/06/20 14:34
# Fornjot - 关闭 Fornjot
来源:https://fornjot.app/blog/shutting-down-fornjot/
## 关闭 Fornjot
发布于2026\-06\-19,作者:Hanno Braun (https://github.com/hannobraun)Fornjot 结束了;未完成,不完整。这不是我想要的,也不是我启动这个项目的初衷。但这是我做出的决定。
有一段时间,Fornjot 的开发一直是在工作之余进行的,旁边还有其他大部分时间占据的工作。这种情况变得不可持续,我通过将精力串行化来应对:一次专注于一个项目,直到达到一个合适的暂停点,然后切换到下一个。
讽刺的是,这些改善后的条件反而让我做出了放弃的决定。当轮到 Fornjot 时,我取得了比以前更好的进展。结果,多年来第一次,我能够浮出水面,看清全局,理解事情的发展方向。
就在这时我意识到我必须退出。我的工作得到了赞助人的支持。如果我不相信自己在创造一条与现有方案有显著差异(从而在某些方面更好)的道路,我就无法心安理得地收取他们的钱。
我清楚地看到,在现有条件下,要达到*开始*交付这种价值的程度,至少还需要2-3年时间来打好基础。而在已经投入近6年之后,我意识到自己无法再承诺这么长时间。这太多了。我不再有这个心力了。
(在写这篇文章之前,我曾私下向赞助人发送了一个公告,其中我说自己已经为 Fornjot 工作了大约5年,而不是6年。这是我当时相信的,但我刚刚查了一下,结果发现 Fornjot 仓库的第一次提交发生在 2020 年 7 月 30 日。)
## 我犯过的错误
六年过去都没有交付任何有用的东西;这看起来不太好。CAD 内核以复杂著称,但这只是一个部分借口。我沿途犯了许多错误。在这一节中,我想反思这些错误。也许我们可以从中学习。
当我开始做 Fornjot 时,那是与我早期基于有符号距离场的 CAD 实验不同的方向。当我切换到边界表示时,它显示出潜力,我期望从那以后会有线性进展。
这种线性进展从未实现。相反,我撞上了一堵墙。在无数种方式中我逐渐发现为什么 CAD 内核,特别是 B-rep 内核,被认为很难。
从 2022 年开始,我对 Fornjot 变得更加认真。通过创建 issue 和 pull request 来让进展更易于追踪,而不是直接推送到 `main`。搭建网站,发布定期版本,撰写版本发布公告。以及寻求赞助。
这奏效了。赞助的增长支撑了随后的一切。如果这个项目曾有任何成功的机会,那正是因为赞助。然而,我不会再这样做了;不会以这种方式。我仍在通往创建有用工具的路上。我没有在销售产品,而是在销售一个梦想。
那并非我的本意。我曾期望能线性地接近一个有用的工具,但从未到达。这多年来一直啃噬着我的内心。我的意思是,我撑过来了。但依旧,我不喜欢这样。我打算再也不销售梦想了,至少在没有一个实际产品可以交付的情况下。
### 坚持渐进式改进
当我试图攀登那堵墙时,我把自己限制在渐进式改进中。这些改进一向对我很有帮助,而大型重写只会分散注意力。这源于我想用一张白纸替换混乱局面的渴望,却从未解决根本问题。
但这两种态度都是极端。中间有肥沃的土壤。与其说服自己一个新想法很有前景,然后花很长时间逐步实现,我更应该一直进行原型验证。然后才整合(无论是渐进式还是其他方式)那些被证明有价值的东西。
### 在危机面前采取折中措施
我的赞助收入在 2022 年的几个月里首次达到了可持续水平,这得益于一位非常慷慨的赞助人。当他们在 2023 年没有续费时,留下了一个巨大的缺口。类似的事情在 2024 年又发生了。
两次我都认为赞助收入不太可能恢复,但两次都是现有赞助人挺身而出填补了缺口。但从下降到恢复之间存在着延迟,这为错误留出了空间。
第一次,它打破了那股魔力。驱散了我脑海中那种 Fornjot 是我唯一需要做的事情的画面。第二次,我决定需要加倍努力实现收入多元化,并将 Fornjot 降级为副项目。一个我绝对还想完成的副项目。但我的毕生事业变成了别的。
而这是我最大的错误。每次,我都恰好有两个合理的选项:要么全力以赴继续,要么就此退出。我哪个都没选。如果必须将项目的失败归因于单一原因,那就是这个。
### 让愿景变得模糊
Fornjot 的初始目标是构建一个代码优先的 CAD 应用程序,其中包括一个自定义的 CAD 内核。在应对第一次收入下降时,我决定砍掉应用程序,只专注于内核。从某种程度上说,这很好。它移除了许多活动部件,大大简化了项目。
但总体而言,我仍然认为这是一个错误。应用程序可以有明确的焦点。CAD 内核是一种通用的基础设施组件,需要考虑许多用例。至少我当时的感觉是这样。而这模糊了我的愿景(尽管随着时间的推移有所恢复)。
我本应该跳出框架思考,本应该抛弃这些类别。某个东西可以是内核、库,但仍然专注于特定的用例。成为工具而不是构建块。(而在现有内核之上构建一个应用程序是一个我从未感兴趣的选项。)
### 原型验证来得太晚
我最终意识到,一味坚持渐进式改进是一个错误。我把代码库引向了一个过渡状态,介于旧方法和新方法之间,这时我意识到新方法不太可能成功。
然后我启动了一系列实验来发现更好的想法,更好的基础架构来支撑 Fornjot。事实上,花了一年多时间!也许我成功了。我想出了一个大为简化的架构,我至今仍认为它很有前景。
但我没有收获这项工作带来的回报。我开始将新架构集成到现有代码库中,目标是替换或适配旧代码。但我没有完成。在到达那一步之前,我耗尽了精力。
## 结论
就这样了。一个野心过大的项目,几乎每一步都因错误而受损。我希望阅读这其中的经历对你有所帮助,或许能为你自己的工作提供一些参考。
至于我自己,我相信经历了这些,我变得更聪明、更坚强。但我们得走着瞧。承认自己的错误比实际避免重犯要容易。我希望我未来的努力能证明我学到了多少。
相似文章
Kefir C 编译器公开开发停止
Kefir C 编译器的主要开发者宣布停止公开开发,将项目无限期转为私有模式,以保持个人兴趣和可持续性。
为何我要从 GitHub 迁移至 Forgejo
本文探讨了从 GitHub 迁移到自托管的 Forgejo 的决定,主要提及了对数据所有权、可靠性以及 AI 数据收集实践的担忧。文章还介绍了荷兰政府类似的举措,并详细说明了个人 Forgejo 实例的技术部署。
Fisker破产后,车主们从废墟中建立了一家开源汽车公司
Fisker破产后,Ocean SUV的车主们组织起来对其软件进行逆向工程,并创建开源工具,实际上从瓦砾中建立了一家由志愿者运营的汽车公司。
Nullsoft, 1997-2004 (2004)
AOL 于2004年关闭了其富有创新精神的 Nullsoft 部门,标志着创始人 Justin Frankel 以及 Winamp 和 Gnutella 等工具一个时代的终结。
@mattshumer_: 那么,Fable 就没什么用了吗?看来编码工作会退回到 Opus。
Anthropic 宣布重新部署 Claude Fable 5,并加入新的分类器以阻止网络安全任务,这可能会限制日常编码,并将用户推向 Opus。