」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 從週五黑客到發布:對創建和發布開源專案的思考

從週五黑客到發布:對創建和發布開源專案的思考

發佈於2024-11-07
瀏覽:277

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]刪除
最新教學 更多>
  • 文件的力量:閱讀如何改變我在 JamSphere 上使用 Redux 的體驗
    文件的力量:閱讀如何改變我在 JamSphere 上使用 Redux 的體驗
    作為開發人員,我們經常發現自己一頭扎進新的庫或框架,渴望將我們的想法變為現實。跳過文件並直接跳到編碼的誘惑很強烈——畢竟,這有多難呢?但正如我透過建立音樂管理平台 JamSphere 的經驗所了解到的那樣,跳過這一關鍵步驟可能會將順利的旅程變成充滿挑戰的艱苦戰鬥。 跳過文檔的魅力 ...
    程式設計 發佈於2024-11-07
  • 如何在PHP多子網域應用中精準控制Cookie域?
    如何在PHP多子網域應用中精準控制Cookie域?
    在PHP 中控制Cookie 域和子域在PHP 中控制Cookie 域和子域建立多子網域網站時,必須控制會話cookie 的網域確保每個子網域的正確會話管理。然而,手動設定網域時,PHP 的 cookie 處理似乎存在差異。 header("Set-Cookie: cookiename=c...
    程式設計 發佈於2024-11-07
  • 如何取得已安裝的 Go 軟體包的完整清單?
    如何取得已安裝的 Go 軟體包的完整清單?
    檢索Go 中已安裝軟體包的綜合清單在多台電腦上傳輸Go 軟體包安裝時,有必要取得詳細的清單所有已安裝的軟體包。本文概述了此任務的簡單且最新的解決方案。 解決方案:利用“go list”與過時的答案相反,當前的建議列出Go 中已安裝的軟體包是使用“go list”命令。透過指定三個文字句點 ('...
    程式設計 發佈於2024-11-07
  • Java中的三元運算子可以不回傳值嗎?
    Java中的三元運算子可以不回傳值嗎?
    三元運算子:深入研究程式碼最佳化三元運算子:深入研究程式碼最佳化雖然三元運算子(?:) 是Java 中的一個強大工具,但它了解其限制至關重要。一個常見的誤解是可以在不傳回值的情況下使用它。 與這種看法相反,Java 不允許在沒有 return 語句的情況下進行三元運算。三元運算子的目的是評估條件並將...
    程式設計 發佈於2024-11-07
  • 為什麼您應該在下一個 PHP 專案中嘗試 Lithe?
    為什麼您應該在下一個 PHP 專案中嘗試 Lithe?
    Lithe 是尋求簡單性與強大功能之間平衡的開發人員的完美 PHP 框架。如果您厭倦了使開發緩慢且令人困惑的繁瑣框架,Lithe 提供了一種極簡但極其靈活的方法,旨在使您的工作更快、更有效率。 1. 輕量且超快 Lithe 的開發重點是輕量級,允許您以很少的開銷創建應用程式。與其他...
    程式設計 發佈於2024-11-07
  • 如何處理 Android 中的網路連線變更?
    如何處理 Android 中的網路連線變更?
    處理Android 中的互聯網連接變化問題集中在需要一個可以監視互聯網連接變化的廣播接收器,因為現有代碼僅檢測連接變化。 為了解決這個問題,這裡有一個替代方法:public class NetworkUtil { public static final int TYPE_WIFI = 1; ...
    程式設計 發佈於2024-11-07
  • Python 3.x 的 Super() 在沒有參數的情況下如何運作?
    Python 3.x 的 Super() 在沒有參數的情況下如何運作?
    Python 3.x 的超級魔法:解開謎團Python 3.x 在其super() 方法中引入了令人驚訝的轉折,允許無參數呼叫。這種看似無害的改變在幕後卻帶來了重大的後果和內在的魔力。 揭開魔力為了維護 DRY 原則,新的 super() 行為繞過了顯式類別命名。它有一個特殊的 class 單元,用...
    程式設計 發佈於2024-11-07
  • Tailwind Flex:Flexbox 實用程式初學者指南
    Tailwind Flex:Flexbox 實用程式初學者指南
    Tailwind Flex 提供了一种创建响应式布局的有效方法,无需编写复杂的 CSS。通过使用 flex、flex-row 和 flex-col 等简单的实用程序,您可以轻松对齐和排列元素。 Tailwind Flex 非常适合希望简化布局创建同时保持对对齐、方向和间距的完全控制的开发人员 - 所...
    程式設計 發佈於2024-11-07
  • ETL:從文字中提取人名
    ETL:從文字中提取人名
    假設我們想要抓取chicagomusiccompass.com。 如你所見,它有幾張卡片,每張卡片代表一個事件。現在,讓我們來看看下一篇: 注意事件名稱是: jazmin bean: the traumatic livelihood tour 所以現在的問題是:我們要如何從文本中提取藝術家的名字?...
    程式設計 發佈於2024-11-07
  • 如何控制 C++ ostream 輸出中的浮點精度?
    如何控制 C++ ostream 輸出中的浮點精度?
    在Ostream 輸出中維護浮點精度在Ostream 輸出中維護浮點精度在C 中,在ostream 運算中使用“
    程式設計 發佈於2024-11-07
  • 如何保證PHP會話的安全銷毀?
    如何保證PHP會話的安全銷毀?
    確保銷毀 PHP 會話儘管資訊存在衝突,但仍有有效的方法可以安全地消除 PHP 會話。要實現此最終終止,遵循多步驟流程至關重要。 會話終止的基本步驟刪除會話資料:啟動會話後與session_start() 一起,使用unset() 刪除與特定會話變數關聯的任何儲存數據,例如$_SESSION[...
    程式設計 發佈於2024-11-07
  • 為什麼我的 MongoDB 文件在 Go 中使用 TTL 索引 5 秒後沒有過期?
    為什麼我的 MongoDB 文件在 Go 中使用 TTL 索引 5 秒後沒有過期?
    在Go 中使用MongoDB 在指定的秒數後使文件過期使用TTL 索引,MongoDB 允許您在指定的秒數後自動使文件過期期間。本文示範如何使用官方 mongo-go-driver 在 Go 中實現此目的。 按照MongoDB 文檔,程式碼顯示如何:建立帶有expireAfterSeconds 的索...
    程式設計 發佈於2024-11-07
  • 使用 JetForms 簡化表單管理:完整指南
    使用 JetForms 簡化表單管理:完整指南
    在當今的數位環境中,管理表單提交很快就會變得不堪重負,特別是當您跨不同平台處理多個表單時。無論是網站上的簡單聯絡表單還是產品的全面調查,手動維護表單提交都是一件麻煩事。這就是 JetForms 的用武之地——一個簡化流程、節省您時間和精力的精簡平台。 在本指南中,我將引導您了解如何開始使用 Jet...
    程式設計 發佈於2024-11-07
  • 使用清單清單時如何修復 Tensorflow 中的「不支援的物件類型浮點」錯誤?
    使用清單清單時如何修復 Tensorflow 中的「不支援的物件類型浮點」錯誤?
    Tensorflow - ValueError:無法將NumPy 數組轉換為張量(不支援的物件類型float)背景您正在嘗試訓練一個)背景]您正在嘗試訓練一個包含清單清單的模型,每個清單包含1000 個浮點數,但遇到錯誤「無法將NumPy 陣列轉換為張量(不支援的物件類型浮點)。」x_train =...
    程式設計 發佈於2024-11-07
  • 如何使用 contains() 函數在 XPath 中實作不區分大小寫的搜尋?
    如何使用 contains() 函數在 XPath 中實作不區分大小寫的搜尋?
    不區分大小寫的 XPath contains() 函數在 XPath 中,contains() 函數區分大小寫。但是,有一些方法可以解決此限制。 方法1:翻譯字元此方法涉及在檢查子字串之前將字元轉換為小寫或大寫:/html/body//text()[ contains( translat...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3