”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 从周五黑客到发布:对创建和发布开源项目的思考

从周五黑客到发布:对创建和发布开源项目的思考

发布于2024-11-07
浏览:872

From Friday Hack to Release: Reflections on Creating and Releasing a Open Source Project

从周五补丁破解到发布:对创建和发布开源项目的思考

这是针对初学者和中级开发人员的系列的一部分,通过将他们的想法作为开源项目发布或引起兴趣。
这些想法是有偏见的和个人的。计划发布更多文章。通过分享一些思考,我希望能启发你做自己的项目

  • 思考(此)
  • 作为 Java 开发人员学习 Go lang (TODO)
  • 开源健康和社区文件 (TODO)
  • 开源安全 (TODO)

需求

这一切都始于几年前。我时不时地需要一些似乎总是涉及重新创建相同的旧 Bash 脚本的东西,无论是由我还是其他人。
总体要求很简单,因为它们通常处于高水平。
我们开发人员主要做的实际上只是将信息从 A 点转移到 B 点,对吧?

这里的目标是在 CLI 应用程序中将一堆 Git 存储库镜像到另一个 Git 提供程序、磁盘、存档格式。
我私下和工作中都需要这个。我见过人们很挣扎,投入大量时间手动完成这些事情,这让我很困扰。

然而,它似乎始终是一个简单的 Bash 脚本。很快就完成了,但一旦需要添加任何额外的东西 - 特殊情况、错误处理、模块化、打包等 - Bash 脚本无法支持更大的工具,正如我们大多数人都同意的那样。

所以我决定为其创建一个完整的 CLI 应用程序。

需要做出的预先决定

这样的工具已经存在吗?

首先要做的就是不要重新发明轮子。
有一些开源工具可以解决这个问题。至少有一个用 Go 编写的脚本,一些 Bash 脚本,如果算上 Gitea 中的导入函数的话。
我尝试了它们,但找不到任何能完全按照我想要的方式工作的。由于我对这个项目有其他想法,我决定不深入研究
开始对现有项目应用补丁。

也存在一些商业工具,但我觉得这个小工具也应该以开源形式存在。

结论: 这个 CLI 工具在这个世界上有一席之地。

在工作黑客日或私人空闲时间进行黑客攻击?

我们在冲刺结束时和其他场合都有黑客时间。一种方法是在这些情况下随着时间的推移对其进行破解,将其制作成有用的东西。
我很快决定在我的私人业余时间完全完成这件事,原因如下:

  • 工作中的黑客机会应该用于短期的学习和创造力,而不是长期的整个项目。
  • 该解决方案不适合核心组织的业务 - 如果是这样,它总是很奇怪。
  • 将它与工作联系起来会让我感觉只是更多的工作 - 我这样做是为了乐趣和学习 Go 等 - 这会给我带来压力。
  • 在工作日做这件事将花费很长时间。几个小时,持续数周。

结论:我应该在业余时间做一些有趣的事情。

技术栈的选择

这些年来我的大部分时间都花在 Java/Kotlin 世界中,在 JS/TS、Python/Ruby 中完成了一些项目,并且像每个高级开发人员一样,有时也会涉足其他领域。
但很长一段时间以来,我一直想真正学习 Go 和/或 Rust。因此,这将是一个获得学习新语言动力的机会
我选择 Go 的原因是开源 DevOps 世界中相当多的 CLI 应用程序都是用 Go 编写的,而且我希望能够不时向第三方项目提交补丁。此外,用 Go 编写意味着一个二进制文件具有多个目标架构。

我可以用 Java 来完成此操作,例如,使用 Pico CLI 和 GraalVM,自从之前的尝试以来,我对其中的印象很好,但我决定我真的想学习 Go。

结论:我应该用 Go 来做,并从中学习。

其他学习目标

有了这个,我还想更深入地研究交付包装精美的开源项目的主题,遵循大多数安全实践 - 记分卡、SLSA、

并使用 GoRelease 等工具来创建各种类型的构建。

结论:抓住机会学习和深入研究您选择的主题。

保持范围

由于我计划进行很多实验,而且我对 Go 完全陌生,所以我知道我会做很多非结构化工作。
这里设置范围很重要 - 什么时候对于 alpha 版本来说足够好?
我很早就决定了它应该具有什么功能,尽管坐下来进一步完善和扩展它是很诱人的,但这很好。
我可以坐这个很长一段时间。

结论:当你同样感到尴尬和自豪时,将项目发布为 alpha。

估计——有多难?

学习一门新语言只是学习语言本身的一小部分,但更多的是学习生态系统及其习语。
使用哪些库、如何使用它们、执行此操作或执行此操作的惯用方法是什么?
在这个项目中我必须花费大量的时间学习和研究,也许50%的时间我会
我只用我知道的语言和生态系统进行编码。

结论: 在学习新的核心堆栈并涉及实验时,将您的时间估计乘以三。语言语法将是小事。

创作过程

初始提交

基本实现在一天内完成 - 它没有构建、错误处理、文档、边缘情况、可维护性等。
这就是大多数周五黑客行为的结局,而且大多数都不会再进一步​​。

但正如所有高级开发人员都知道的那样,让某些东西发挥作用距离发布产品还有很长的路要走。

很快就完成了,嗯?并不真地。

寻找时间

有时真的很难找到时间花在这个项目上,特别是因为我在工作中度过了一个疲惫的春天。
您并不是每天晚上都想花 2 小时阅读一本有关特定内容的书,或者学习一项新技术。
或者花时间编写文档。我有孩子和房子,我不能让私人项目比其他爱好消耗更多的精力。
但总要付出一些代价 - 我最终观看的系列节目减少了,并且在此期间几乎不存在任何游戏。

话虽如此,虽然我希望我能在这个项目上花更多的时间,但它几乎总是能激励我——我有几个晚上睡得更少,编码或学习,
因为我很兴奋能走得更远。另外,当某件事有趣时,它就是有趣的,无论是举重、写书、开发等等。

我忘记的事

我已经习惯了团队合作很长时间了。对于一个单独的项目,你必须管理更多的帽子,并且在其中的每个部分都非常出色,但通常不是技术性的。
我花了很多时间来研究良好的 CLI 设计和惯用的选择。另一个领域是发布过程和为不同平台构建二进制文件。
遵循 SLSA 和其他开源标准也需要时间。我们想要良好的测试覆盖率,对吗?
在团队中工作,其他人有望制作您想要的徽标,需要编写的文档。
独自工作,只有你一个人,否则就不会发生。
编写代码甚至还不到交付项目的 50%。剩下的就是

冒充者综合症来袭

冒名顶替综合症在我们以知识为基础的开发者世界中很常见。每个人都有不同的技能,在任何特定的时间,总会有人比你懂得更多。
在一个团队中,你有人可以讨论事情。
一个人,没那么多。

但是,这一切都是为了接受人们有时会在代码中做一些愚蠢的事情。
而且,开源并不意味着完美。这是关于学习、解决和发布可能对其他人有用的东西。

磨砺

好吧,我能说什么 - 当它完成时就完成了。

有几个深夜的调试、重构,但也有无数心流和多巴胺的时刻。

对我来说,当我觉得项目中的整体架构不会发生根本性的变化时,发布时间就到了——我已经确定了接口,并且觉得它是可扩展的。
代码库没问题。
大多数基本功能都已具备,虽然一切都有待改进,但它仍然是一个基础。

后果和经验教训

  1. 尽早设定范围:决定在哪里停止。尽早设置项目结构、文档、版本、管道和社区指南。未来的你会感谢过去的你。

  2. 不要有压力,享受学习过程:完成了就完成了。

  3. 坚持:开源是一场马拉松,而不是短跑。不要烧坏。这是一种爱好,而不是你的生活。不过一定要坚持。每天做一件小事。

  4. 学习,学习,学习:将一切视为学习和改进的机会,而不是问题。

  5. 编码是最简单的部分:主要代码是花费你最少时间的;其他一切,比如文档、测试等,都是花费时间的地方。

  6. 做额外的事情:它们和编码一样有趣。是的,即使是文档也可以节省您解释和重新解释的时间。如果让你感到无聊,那就让它变得有趣。文档即代码、vim-pong 等

  7. 休息一下:倦怠是真实的。当你需要的时候退后一步。就像其他创造性学习过程一样,分批进行。

  8. 使用系统:尽早在实践和现实世界中使用你自己的狗粮。更好的是,找到一个人/社区来提供反馈。

  9. 享受旅程:创造真是美妙。

  10. 完成它:这个世界上有无数的半成品项目。完成它。

  11. 使用人工智能作为帮助:我通过委派一些额外的工作来节省时间,比如要求代码改进、代码审查、文档结构、总结等。但是,不要永远盲目地相信它。回顾并批评答案。

好吧,快乐的黑客,现在去想想你下一步想要做什么!

链接

项目:Git Provider Sync

版本声明 本文转载于:https://dev.to/janderssonse/from-friday-hack-to-release-reflections-on-creating-and-releasing-a-open-source-project-1ljg?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    高级 T:依赖参数、推断联合以及 Twitter 上的健康交互。
    每次我用 TypeScript 写成 Foo 时,我都会感受到失败的沉重。 在一种情况下,这种感觉特别强烈:当函数采用的参数取决于哪个 "mode" 处于活动状态时。 通过一些示例代码更清晰: type Provider = "PROVIDER A" | "PR...
    编程 发布于2024-11-07
  • 如何创建人力资源管理解决方案
    如何创建人力资源管理解决方案
    1. Understanding the Basics of Frappe and ERPNext Task 1: Install Frappe and ERPNext Goal: Get a local or cloud-based instance of ERP...
    编程 发布于2024-11-07
  • 从周五黑客到发布:对创建和发布开源项目的思考
    从周五黑客到发布:对创建和发布开源项目的思考
    从周五补丁破解到发布:对创建和发布开源项目的思考 这是针对初学者和中级开发人员的系列的一部分,通过将他们的想法作为开源项目发布或引起兴趣。 这些想法是有偏见的和个人的。计划发布更多文章。通过分享一些思考,我希望能启发你做自己的项目 思考(此) 作为 Java 开发人员学习 Go l...
    编程 发布于2024-11-07
  • 可以使用 constexpr 在编译时确定字符串长度吗?
    可以使用 constexpr 在编译时确定字符串长度吗?
    常量表达式优化:可以在编译时确定字符串长度吗?在优化代码的过程中,开发人员尝试计算使用递归函数在编译时计算字符串文字的长度。此函数逐字符计算字符串并返回长度。初始观察:该函数似乎按预期工作,在运行时返回正确的长度并生成表明计算发生在编译时的汇编代码。这就提出了一个问题:是否保证length函数会在编...
    编程 发布于2024-11-07
  • 在 Raspberry Pi 上运行 Discord 机器人
    在 Raspberry Pi 上运行 Discord 机器人
    Unsplash 上 Daniel Tafjord 的封面照片 我最近完成了一个软件工程训练营,开始研究 LeetCode 的简单问题,并觉得如果我每天都有解决问题的提醒,这将有助于让我负起责任。我决定使用按 24 小时计划运行的不和谐机器人(当然是在我值得信赖的树莓派上)来实现此操作,该机器人将执...
    编程 发布于2024-11-07
  • 解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    解锁 JavaScript 的隐藏宝石:未充分利用的功能可提高代码质量和性能
    In the ever-evolving landscape of web development, JavaScript remains a cornerstone technology powering countless large-scale web applications. While...
    编程 发布于2024-11-07
  • 为什么通过非常量指针修改“const”变量看起来有效,但实际上并没有改变它的值?
    为什么通过非常量指针修改“const”变量看起来有效,但实际上并没有改变它的值?
    通过非常量指针修改 const在 C 中,const 变量一旦初始化就无法修改。但是,在某些情况下,const 变量可能会被更改。考虑以下代码:const int e = 2; int* w = (int*)&e; // (1) *w = 5; ...
    编程 发布于2024-11-07
  • Android - 将 .aab 文件上传到 Play 商店时出错
    Android - 将 .aab 文件上传到 Play 商店时出错
    如果您遇到此错误,请按照以下步骤操作以确保与您的包名称和签名密钥保持一致: 确保 app.json 文件中的包名称与您第一次上传 .aab 文件时使用的包名称匹配。 "android": { "permissions":["CAMERA","READ_EXTERNAL_STORAGE...
    编程 发布于2024-11-07
  • 如何使用 PHP 将 HTML 转换为 PDF
    如何使用 PHP 将 HTML 转换为 PDF
    (适用于 Windows 的指南。不适用于 Mac 或 Linux) (图片来源) 在 PHP 中将 HTML 转换为 PDF 的方法不止一种。您可以使用Dompdf或Mpdf;但是,这两个库的执行方式有所不同。 注意:本文中并未包含所有解决方案。 要使用这两个库,您将需要 Composer。 ...
    编程 发布于2024-11-07
  • C++ 会拥抱垃圾收集吗?
    C++ 会拥抱垃圾收集吗?
    C 中的垃圾收集:实现和共识的问题虽然有人建议 C 最终会包含垃圾收集器,但它仍然是争论和持续发展的主题。要理解其中的原因,我们必须深入研究迄今为止阻碍其纳入的挑战和考虑因素。实现复杂性向 C 添加隐式垃圾收集是一个非-琐碎的任务。该语言的低级性质和对指针的广泛支持带来了重大的技术障碍。实施问题的范...
    编程 发布于2024-11-07
  • 如何有条件地删除 MySQL 中的列?
    如何有条件地删除 MySQL 中的列?
    使用 MySQL ALTER 进行条件列删除MySQL 中的 ALTER 命令提供了一种从表中删除列的简单方法。但是,当指定列不存在时,其传统语法 (ALTER TABLE table_name DROP COLUMN column_name) 会引发错误。对于 MySQL 版本 4.0.18,没有...
    编程 发布于2024-11-07
  • 你应该了解的现代 CSS 样式 4
    你应该了解的现代 CSS 样式 4
    TL;DR: 本博客使用代码示例来探索 Web 开发的五种最佳 CSS 样式和功能:容器查询、子网格、伪类、逻辑属性和实验室颜色空间。它们增强响应能力、简化布局并提高设计一致性。 层叠样式表 (CSS) 是一种众所周知的用于设计网页样式的语言。使用 CSS,您可以通过添加空格来自定义 HTML 元素...
    编程 发布于2024-11-07
  • 箭头函数或父作用域何时定义函数的参数?
    箭头函数或父作用域何时定义函数的参数?
    ES6 箭头函数中的参数:官方说明在 ES6 箭头函数中,arguments 关键字的行为一直是争论的话题。一些浏览器和平台(例如 Chrome、Firefox 和 Node)偏离了最初的 TC39 建议,引发了对该规范正确解释的质疑。根据官方 ES6 规范,箭头函数没有其自身的定义。自己的参数在其...
    编程 发布于2024-11-07
  • 根据您提供的内容,以下是一些采用问题格式的潜在文章标题:

* 加载数据本地内文件访问被拒绝:如何排除和修复错误? 
* 为什么要加载数据LOCA
    根据您提供的内容,以下是一些采用问题格式的潜在文章标题: * 加载数据本地内文件访问被拒绝:如何排除和修复错误? * 为什么要加载数据LOCA
    LOAD DATA LOCAL INFILE 访问被错误拒绝:不允许使用的命令当利用 MySQL 的 LOAD DATA INFILE 执行 PHP 脚本时,它可能会遇到错误“用户访问被拒绝...(使用密码:是)”。常见的解决方法是切换到 LOAD DATA LOCAL INFILE,尽管这可能会导...
    编程 发布于2024-11-07
  • 如何在 Python 中检查文本文件是否为空?
    如何在 Python 中检查文本文件是否为空?
    确定文本文件是否为空在编程领域,通常需要确定特定文件是否包含任何数据或无效。本文深入探讨了这样一个问题:“我们如何确定文本文件是否为空?”Python 作为一种多功能编程语言,为这个问题提供了一个简单的解决方案。通过利用 os.stat() 函数,我们可以检索有关文件的属性数组,包括其大小。查询答案...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3