diff --git a/_data/remote-docs.json b/_data/remote-docs.json index d82edcb1..635ff16e 100644 --- a/_data/remote-docs.json +++ b/_data/remote-docs.json @@ -24,6 +24,7 @@ "https://raw.githubusercontent.com/folio-org/rfcs/master/text/0004-iso-8601.md", "https://raw.githubusercontent.com/folio-org/rfcs/master/text/0005-application-formalization.md", "https://raw.githubusercontent.com/folio-org/rfcs/master/text/0006-folio-distributed-vs-centralized-configration.md", + "https://raw.githubusercontent.com/folio-org/rfcs/master/text/0009-golang.md", "https://raw.githubusercontent.com/folio-org/stripes-cli/master/doc/dev-guide.md", "https://raw.githubusercontent.com/folio-org/stripes-cli/master/doc/user-guide.md", "https://raw.githubusercontent.com/folio-org/stripes-components/master/README.md", diff --git a/_data/repos.json b/_data/repos.json index 2ef21439..a240232b 100644 --- a/_data/repos.json +++ b/_data/repos.json @@ -1,10 +1,10 @@ { "metadata": { - "generatedDateTime": "2025-01-03T04:13:04.899048+00:00" + "generatedDateTime": "2025-01-08T05:25:20.763824+00:00" }, "repos": [ { - "countBranches": 104, + "countBranches": 108, "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Central repository for the acquisition models", @@ -23,7 +23,7 @@ ] }, { - "countBranches": 12, + "countBranches": 13, "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, @@ -127,7 +127,7 @@ "snippetIntro": "" }, { - "countBranches": 49, + "countBranches": 52, "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, @@ -153,7 +153,7 @@ "snippetIntro": "" }, { - "countBranches": 22, + "countBranches": 23, "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Application descriptor repository for a minimal FOLIO platform installation", @@ -244,8 +244,8 @@ "snippetIntro": "

Folio application descriptors

" }, { - "countBranches": 3, - "countOpenPullRequests": 1, + "countBranches": 4, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": null, "docDirName": null, @@ -271,8 +271,8 @@ "snippetIntro": "" }, { - "countBranches": 29, - "countOpenPullRequests": 0, + "countBranches": 30, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "The library to handle events from data-import", "docDirName": null, @@ -323,7 +323,7 @@ }, { "countBranches": 18, - "countOpenPullRequests": 5, + "countOpenPullRequests": 2, "defaultBranch": "ramsons", "description": "FOLIO Documentation", "docDirName": null, @@ -451,8 +451,8 @@ }, { "apiTypes": "OAS", - "countBranches": 25, - "countOpenPullRequests": 0, + "countBranches": 26, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": null, "docDirName": null, @@ -754,7 +754,7 @@ }, { "countBranches": 72, - "countOpenPullRequests": 1, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "3M Standard Interchange Protocol (SIP) support in FOLIO", "docDirName": null, @@ -947,7 +947,7 @@ "snippetIntro": "

Dependency Injection support for FOLIO backend modules

" }, { - "countBranches": 6, + "countBranches": 7, "countOpenPullRequests": 0, "defaultBranch": "master", "description": "The common resources library for mod-data-export-spring and mod-data-export-worker", @@ -1049,7 +1049,7 @@ "snippetIntro": "

A collection of runbooks for FOLIO installation.

" }, { - "countBranches": 339, + "countBranches": 340, "countOpenPullRequests": 7, "defaultBranch": "master", "description": "The set of integration tests, based on karate framework", @@ -1104,8 +1104,8 @@ "snippetIntro": "

Utilities for data import modules interaction with Kafka

" }, { - "countBranches": 25, - "countOpenPullRequests": 3, + "countBranches": 17, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": null, "docDirName": null, @@ -1120,8 +1120,8 @@ ] }, { - "countBranches": 5, - "countOpenPullRequests": 2, + "countBranches": 4, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "Folio plugins for Keycloak", "docDirName": null, @@ -1178,7 +1178,7 @@ "snippetIntro": "" }, { - "countBranches": 2, + "countBranches": 3, "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, @@ -1309,8 +1309,8 @@ ] }, { - "countBranches": 7, - "countOpenPullRequests": 1, + "countBranches": 6, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Library with general purpose classes to help with FOLIO backend service development", "docDirName": null, @@ -1327,8 +1327,8 @@ }, { "apiTypes": "OAS", - "countBranches": 23, - "countOpenPullRequests": 1, + "countBranches": 22, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "This is a library (jar) that contains the basic functionality and main dependencies required for development FOLIO modules using Spring framework.", "docDirName": "doc", @@ -1445,7 +1445,7 @@ "snippetIntro": "" }, { - "countBranches": 8, + "countBranches": 9, "countOpenPullRequests": 2, "defaultBranch": "master", "description": "Shared library for Jenkins Pipeline", @@ -1470,13 +1470,12 @@ "repoType": "other", "snippetIntro": "", "workflows": [ - "build-npm-release.yml", - "build-npm.yml" + "ui.yml" ] }, { "countBranches": 2, - "countOpenPullRequests": 0, + "countOpenPullRequests": 1, "defaultBranch": "main", "description": "LDLite is a client-side reporting tool for Okapi-based services", "docDirName": null, @@ -1548,8 +1547,8 @@ "snippetIntro": "

Fingerprint hash is the unique identifier for a resource in Linked Data Graph. This library provides a function for a fingerprint hash generation.

" }, { - "countBranches": 15, - "countOpenPullRequests": 3, + "countBranches": 18, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": "A library for converting MARC records to Linked Data Graphs and vice versa.", "docDirName": null, @@ -1643,7 +1642,7 @@ ] }, { - "countBranches": 14, + "countBranches": 15, "countOpenPullRequests": 0, "defaultBranch": "master", "description": "A FOLIO Module for handling the server side work needed for the ERM system", @@ -1763,8 +1762,8 @@ }, { "apiTypes": "OAS", - "countBranches": 25, - "countOpenPullRequests": 0, + "countBranches": 27, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": null, "docDirName": null, @@ -1832,8 +1831,8 @@ }, { "apiTypes": "RAML", - "countBranches": 170, - "countOpenPullRequests": 15, + "countBranches": 172, + "countOpenPullRequests": 17, "defaultBranch": "master", "description": "FOLIO mod-circulation", "docDirName": "doc", @@ -2118,8 +2117,8 @@ }, { "apiTypes": "OAS", - "countBranches": 18, - "countOpenPullRequests": 0, + "countBranches": 19, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": null, "docDirName": null, @@ -2146,8 +2145,8 @@ }, { "apiTypes": "OAS", - "countBranches": 21, - "countOpenPullRequests": 1, + "countBranches": 23, + "countOpenPullRequests": 3, "defaultBranch": "master", "description": null, "docDirName": null, @@ -2535,8 +2534,8 @@ }, { "apiTypes": "RAML", - "countBranches": 95, - "countOpenPullRequests": 0, + "countBranches": 96, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "Finance business logic", "docDirName": null, @@ -2564,8 +2563,8 @@ }, { "apiTypes": "RAML", - "countBranches": 107, - "countOpenPullRequests": 0, + "countBranches": 108, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "CRUD module to manage finance-data (i.e. ledgers, funds, budgets, etc.)", "docDirName": null, @@ -2623,8 +2622,8 @@ }, { "apiTypes": "OAS", - "countBranches": 146, - "countOpenPullRequests": 4, + "countBranches": 147, + "countOpenPullRequests": 5, "defaultBranch": "master", "description": "FOLIO Query Machine back-end module", "docDirName": "docs", @@ -2787,8 +2786,8 @@ }, { "apiTypes": "RAML", - "countBranches": 55, - "countOpenPullRequests": 2, + "countBranches": 56, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": null, "docDirName": "doc", @@ -2814,8 +2813,8 @@ }, { "apiTypes": "RAML", - "countBranches": 19, - "countOpenPullRequests": 4, + "countBranches": 18, + "countOpenPullRequests": 3, "defaultBranch": "master", "description": null, "docDirName": null, @@ -3000,8 +2999,8 @@ }, { "apiTypes": "OAS", - "countBranches": 36, - "countOpenPullRequests": 8, + "countBranches": 38, + "countOpenPullRequests": 9, "defaultBranch": "master", "description": "Manage data graph of FOLIO library's catalog", "docDirName": null, @@ -3144,8 +3143,8 @@ }, { "apiTypes": "OAS", - "countBranches": 5, - "countOpenPullRequests": 1, + "countBranches": 4, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Module designed for high-performance migration of MARC records.", "docDirName": "doc", @@ -3452,8 +3451,8 @@ }, { "apiTypes": "OAS", - "countBranches": 21, - "countOpenPullRequests": 1, + "countBranches": 20, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Performs password validation and stores validation rules for specified tenant", "docDirName": "doc", @@ -3596,8 +3595,8 @@ }, { "apiTypes": "OAS", - "countBranches": 9, - "countOpenPullRequests": 1, + "countBranches": 8, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Backend for quickMARC editor", "docDirName": "doc", @@ -3826,8 +3825,8 @@ }, { "apiTypes": "OAS", - "countBranches": 6, - "countOpenPullRequests": 2, + "countBranches": 5, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": null, "docDirName": null, @@ -3902,8 +3901,8 @@ }, { "apiTypes": "OAS", - "countBranches": 4, - "countOpenPullRequests": 2, + "countBranches": 5, + "countOpenPullRequests": 3, "defaultBranch": "master", "description": null, "docDirName": null, @@ -3930,8 +3929,8 @@ }, { "apiTypes": "OAS", - "countBranches": 20, - "countOpenPullRequests": 4, + "countBranches": 17, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": null, "docDirName": "doc", @@ -4090,8 +4089,8 @@ }, { "apiTypes": "RAML", - "countBranches": 33, - "countOpenPullRequests": 1, + "countBranches": 34, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": "Persistent source record storage", "docDirName": null, @@ -4352,7 +4351,7 @@ }, { "countBranches": 5, - "countOpenPullRequests": 1, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, "docDirName": "docs", @@ -4432,8 +4431,8 @@ "snippetIntro": "

The purpose of this repository is to provide a personal data disclosure form template and related tools/scripts. Each module will specialize and store this form in the top level of their git repository. The form is a mechanism to disclose the types of personal data stored by each module. This information enables those hosting FOLIO to better manage and comply with various privacy laws and restrictions, e.g. GDPR, etc.

" }, { - "countBranches": 204, - "countOpenPullRequests": 3, + "countBranches": 211, + "countOpenPullRequests": 6, "defaultBranch": "master", "description": null, "docDirName": null, @@ -4445,8 +4444,8 @@ "snippetIntro": "" }, { - "countBranches": 141, - "countOpenPullRequests": 11, + "countBranches": 140, + "countOpenPullRequests": 9, "defaultBranch": "master", "description": "Complete set of Stripes modules for FOLIO", "docDirName": "doc", @@ -4553,8 +4552,8 @@ }, { "apiTypes": "RAML", - "countBranches": 63, - "countOpenPullRequests": 3, + "countBranches": 62, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": "Framework allowing easy module creation based on RAML files", "docDirName": "doc", @@ -4595,7 +4594,7 @@ }, { "countBranches": 8, - "countOpenPullRequests": 1, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "RFCs for changes to the FOLIO platform", "docDirName": null, @@ -4640,8 +4639,8 @@ ] }, { - "countBranches": 22, - "countOpenPullRequests": 0, + "countBranches": 23, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "Stripes components that are specific to use cases that arise in Acquisitions-related modules", "docDirName": null, @@ -4661,8 +4660,8 @@ ] }, { - "countBranches": 29, - "countOpenPullRequests": 2, + "countBranches": 27, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Stripes components that are specific to use cases that arise in Authority-related modules", "docDirName": null, @@ -4680,8 +4679,8 @@ ] }, { - "countBranches": 7, - "countOpenPullRequests": 2, + "countBranches": 6, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "Components to be used by modules and applications that handle Authorization (ui-authorization-roles, ui-authorization-capabilities, etc.) duties. Other modules and applications may not find them as useful.", "docDirName": null, @@ -4699,8 +4698,8 @@ ] }, { - "countBranches": 31, - "countOpenPullRequests": 4, + "countBranches": 32, + "countOpenPullRequests": 5, "defaultBranch": "master", "description": "Command line interface for creating, building, and testing Stripes UI modules.", "docDirName": "doc", @@ -4731,8 +4730,8 @@ "snippetIntro": "" }, { - "countBranches": 54, - "countOpenPullRequests": 20, + "countBranches": 51, + "countOpenPullRequests": 17, "defaultBranch": "master", "description": "A component library for Stripes", "docDirName": null, @@ -4770,8 +4769,8 @@ ] }, { - "countBranches": 36, - "countOpenPullRequests": 9, + "countBranches": 38, + "countOpenPullRequests": 11, "defaultBranch": "master", "description": "The core of Stripes, an opinionated and modular platform for React components consuming REST data and the UI framework for the FOLIO project", "docDirName": "doc", @@ -4789,8 +4788,8 @@ ] }, { - "countBranches": 33, - "countOpenPullRequests": 1, + "countBranches": 32, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "Stripes components that are specific to use cases that arise in ui-data-import and ui-data-export modules", "docDirName": null, @@ -4889,8 +4888,8 @@ ] }, { - "countBranches": 8, - "countOpenPullRequests": 0, + "countBranches": 9, + "countOpenPullRequests": 1, "defaultBranch": "main", "description": "Administer locally created instances, holdings records, items", "docDirName": null, @@ -4963,8 +4962,8 @@ ] }, { - "countBranches": 52, - "countOpenPullRequests": 9, + "countBranches": 53, + "countOpenPullRequests": 10, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5001,8 +5000,8 @@ ] }, { - "countBranches": 84, - "countOpenPullRequests": 14, + "countBranches": 74, + "countOpenPullRequests": 12, "defaultBranch": "master", "description": null, "docDirName": "doc", @@ -5022,8 +5021,8 @@ ] }, { - "countBranches": 14, - "countOpenPullRequests": 1, + "countBranches": 15, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": "A set of TypeScript typings for the Stripes UI framework", "docDirName": null, @@ -5053,12 +5052,10 @@ "repoType": "stripes", "snippetIntro": "

Stripes UI is a main wrapper responsible for setting the global layout of the user interface, such as the global navigation menu and top bar. It also renders given stripes module on the appropriate route.

", "workflows": [ - "build-npm-release.yml", - "build-npm.yml" + "ui.yml" ], "workflowsFolio": [ - "build-npm-release.yml", - "build-npm.yml" + "ui.yml@v1.6" ] }, { @@ -5102,8 +5099,8 @@ ] }, { - "countBranches": 33, - "countOpenPullRequests": 4, + "countBranches": 34, + "countOpenPullRequests": 5, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5376,8 +5373,8 @@ ] }, { - "countBranches": 2, - "countOpenPullRequests": 1, + "countBranches": 3, + "countOpenPullRequests": 2, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5611,8 +5608,8 @@ ] }, { - "countBranches": 14, - "countOpenPullRequests": 0, + "countBranches": 15, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5653,8 +5650,8 @@ ] }, { - "countBranches": 2, - "countOpenPullRequests": 0, + "countBranches": 3, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "UI finc-config module. Funded by European Regional Development Fund (EFRE).", "docDirName": null, @@ -5672,8 +5669,8 @@ ] }, { - "countBranches": 3, - "countOpenPullRequests": 1, + "countBranches": 2, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": "finc-select UI module. Funded by European Regional Development Fund (EFRE).", "docDirName": null, @@ -5816,7 +5813,7 @@ }, { "countBranches": 23, - "countOpenPullRequests": 1, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5876,8 +5873,8 @@ ] }, { - "countBranches": 13, - "countOpenPullRequests": 2, + "countBranches": 15, + "countOpenPullRequests": 0, "defaultBranch": "master", "description": null, "docDirName": null, @@ -5975,7 +5972,7 @@ ] }, { - "countBranches": 24, + "countBranches": 25, "countOpenPullRequests": 0, "defaultBranch": "master", "description": "UI module: managing user profile settings", @@ -6537,8 +6534,8 @@ ] }, { - "countBranches": 80, - "countOpenPullRequests": 2, + "countBranches": 79, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "Stripes UI for quickMARC editor", "docDirName": null, @@ -6722,8 +6719,8 @@ ] }, { - "countBranches": 7, - "countOpenPullRequests": 2, + "countBranches": 6, + "countOpenPullRequests": 1, "defaultBranch": "master", "description": "UX Module for Serials Management", "docDirName": null, @@ -6880,7 +6877,7 @@ }, { "countBranches": 78, - "countOpenPullRequests": 16, + "countOpenPullRequests": 17, "defaultBranch": "master", "description": "Stripes UI module: administrating users", "docDirName": null, diff --git a/_remote/rfcs/text/0009-golang.md b/_remote/rfcs/text/0009-golang.md new file mode 100644 index 00000000..51f55f64 --- /dev/null +++ b/_remote/rfcs/text/0009-golang.md @@ -0,0 +1,82 @@ +--- +layout: null +--- + + +- Contributors: + - [Jakub Skoczen](jakub@indexdata.com) + - [Mike Taylor](mike@indexdata.com) +- RFC PRs: + - PRELIMINARY REVIEW: https://github.com/folio-org/rfcs/pull/25 + - DRAFT REVIEW: https://github.com/folio-org/rfcs/pull/27 + - PUBLIC REVIEW: https://github.com/folio-org/rfcs/pull/30 + - FINAL REVIEW: https://github.com/folio-org/rfcs/pull/33 +- Outcome: ACCEPTED + +# Add GO programming language to FOLIO Officially Supported Technologies + +## Summary + +With this RFC, we are proposing to evaluate the Go language through an incubation project and eventually extend the FOLIO Officially Supported Technologies [list](https://wiki.folio.org/display/TC/Officially+Supported+Technologies) with the [Go](https://go.dev/) programming language for backend development. + +## Motivation + +We think that Go has compelling characteristics that make it a solid and safe choice for building enterprise applications and network services. + +Specifically for FOLIO development, we believe that Go will complement the list of already supported backend languages and that [many conscious decisions in the design of the language and its core library](https://go.dev/talks/2012/splash.article) make it well-suited for FOLIO microservices-inspired architecture and open, community-first collaborative project structure. + +## Detailed Explanation/Design + +FOLIO backend module development has relied primarily on Java and most FOLIO backend modules, with a few exceptions, are written in Java. Java is a good fit for writing backend and web services with good performance and safety characteristics. But it can also lead to complex and highly layered codebases and impose a high-barrier of entry for full-stack developers. We believe Go possesses characteristics that address these challenges. + +Go is a statically-typed, natively-compiled programming language with syntax based on the C family of programming languages (C, Java, C#, etc). Go has been created at Google by Rob Pike and Ken Thompson in 2007 to "[improve programming productivity in an era of multi-core, networked machines and large codebases](https://go.dev/solutions/google/)". Go, like Java, provides automatic memory management through the use of garbage collector but, compared to Java, has a simpler programming model with optional classes/OOP, no inheritance and no exceptions for regular error handling. + +Thanks to its design, Go has a high level of familiarity for Java (and C#) developers. This includes both the language syntax and programming constructs, as well as the runtime characteristics. As previously mentioned, like Java, Go is a statically typed, compiled language with a garbage collector. While Go redefines some basic concepts like loops or conditionals (e.g there's no while loop in Go and the switch statement does not fall through) there are few paradigm-shifting concepts, with the concurrency model (there's no direct equivalent of Go's goroutines in Java) and more control over memory management (pointers and stack vs heap allocation) being some examples where the languages differ substantially. This familiarity means that a Java programmer can become proficient with the Go language relatively quickly, for instance through the duration of a small development project, including idiomatic use of some of the constructs that differ from Java. Similarity to Java also means that the developer can “read” Go source code with limited prior knowledge of the language, referring only occasionally to the language documentation. + +The simplicity of Go stems from the fact that, unlike Java, it is not a multi-purpose tool. Go's main uses cases are web services and CLIs (command-line interfaces) which makes it a perfect fit for writing FOLIO backend modules. Being simpler than Java, the language is also easier to pick up by full-stack developers coming from scripting and web languages background like Node.js or Python. This can be a big advantage for small teams of few developers as the entire team can, effectively, be kept full-stack. With large Java codebases it’s not practical and developers in the team usually specialize in front-end or back-end programming. + +On the operational front, Go's characteristics make it a better fit than Java for building systems comprised of many small microservices. Go is compiled ahead-of-time (AOT) into a static binary which is a perfect fit for Docker containers. AOT compilation means that the resulting application has a visibly smaller memory footprint and faster startup times as compared to Java/vert.x, and orders of magnitude better as compared to Java/Spring based modules. Java provides AOT compilation capability through the GraalVM project, but porting existing Java projects to GraalVM involves substantial complexity and is not possible for certain frameworks like older Spring (including versions used by FOLIO project) and Grails due to the dynamic language features they require. + +From a sysops perspective, Go containers require less operational tuning compared to the JVM containers as they do not contain a stand-alone virtual machine that requires parametrization. + +The Go language is widely used across the industry and open-source communities, especially in the areas related to web and microservices. Popular examples of large open-source projects created with Go include the [Kubernetes](https://github.com/kubernetes/kubernetes) container orchestration platform and the [Docker](https://github.com/docker) container runtime. + +The Go project maintains a [list](https://go.dev/solutions/) of case-studies from commercial companies relying on Go in their products and general use-cases for the language. + +According to [GitHub statistics](https://madnight.github.io/githut/#/pull_requests/2023/3), Go is the third fastest growing language (behind Python and Java) as measured by the number of new Pull Requests. + +## Risks and Drawbacks + +Introducing Go as one of the supported backend technologies involves the same general concerns as introducing any new technology into FOLIO. The biggest potential risk is the increased development and maintenance complexity as some new FOLIO backend modules will be created with Go which is not immediately well known to existing FOLIO backend developers that have primarily Java background. As explained in the previous section, however, this risk is contained because of the design of Go which, while being a different language, has many points of similarity to Java. It should be noted that while Go is an OOP language and supports both interfaces and generics, it doesn't support inheritance, only extension through composition is supported. + +The top three challenges from the Go Developer Survey 2024 H1 are: + +* Learning how to write Go effectively +* The verbosity of error handling +* The Go ecosystem is missing libraries of frameworks I need + +Another drawback worth mentioning is that a subset of the shared library functionality used by Java modules must be implemented in the form of a shared Go library. The library can, however, be kept simple and include only the most fundamental functionality, similar to [folio-vertx-lib](https://github.com/folio-org/folio-vertx-lib). + +Additionally, as history of FOLIO development shows, there exists high level of affinity between specific teams of developers and particular modules and domains. This affinity often results in siloing and can create barriers preventing wider collaboration between various development teams. This siloing exists even within Java-only usage in FOLIO (vert.x vs Spring) because of the high reliance on web programming frameworks. Development in Go has less or no reliance on frameworks -- for instance it's entirely possible to develop FOLIO modules with only Go standard library, Postgres client library and OpenAPI parser library. This more lightweight approach to development can ease some of the cross-module development barriers in FOLIO. + +Another risk flagged during the RFC review is that the FOLIO community mostly has only has Java developers today and it might struggle to attract Go developers in the future and that would make supporting Go modules over the long term harder to achieve + +## Rationale and Alternatives + +As explained in the design section, Go is a programming language well-suited to writing backend web services and, as such, is a perfect fit for FOLIO's microservices-inspired architecture. It is also an increasingly popular language with community-driven open-source projects thanks to its simplicity and familiar syntax but without the performance tradeoffs typical to dynamic or scripting languages. + +Go's excellent AOT compilation support puts it ahead of Java for building systems that comprise of many small, containerized workloads. + +As such there's no direct alternative to Go available in the FOLIO ecosystem. + +## Timing + +We propose that Go be added as an incubating technology in Ramsons with the attempt to execute a pilot project. The pilot will serve as the technology preview to validate Go's fit for FOLIO backend development. While it might be a good idea to directly compare Java and Go by re-implementing an existing module it should be stressed that during the pilot phase, any new module written in Go will be considered strictly a proof-of-concept and there's no guarantee the module will remain a part of the FOLIO release. + +In the case Go is deemed unsuitable for FOLIO development, the PoC module developed in Go will be removed from future FOLIO versions, and Go will not be accepted as a supported technology. + +In the case Go is deemed suitable for FOLIO backend development, it will be accepted to the official technology list starting from the Sunflower release. + +We do not expect this RFC and Go's admission to the officially supported technology list to have any impact on release planning for Ramsons or Sumflower or cause any additional workload for development teams. Index Data DevOps will provide initial support with regard to the CI/CD pipelines to development teams wanting to build FOLIO modules in Go. + +## Unresolved Questions