diff --git a/project_structure.md b/project_structure.md index 782fdf4..ec963b7 100644 --- a/project_structure.md +++ b/project_structure.md @@ -1 +1,38 @@ # Project Structure +One of Go's strength's is its simplicity. Project structure should be kept simple as well. + +### A Common Misconception +Although the [golang-standards/project-layout](https://github.com/golang-standards/project-layout) repo looks official (23k+ stars, "golang" in the name, etc), it is not. [Russ Cox](https://swtch.com/~rsc/), a principal engineer at Google and the [most active contributor](https://github.com/golang/go/graphs/contributors) to Go has opened an [issue](https://github.com/golang-standards/project-layout/issues/117) to address this. + +### How Complex is Your Project? +On the complex end of the spectrum, projects like [CockroachDB](https://github.com/cockroachdb/cockroach) and [Kubernetes](https://github.com/kubernetes/kubernetes) use a complex project structure. [gorilla/mux](https://github.com/gorilla/mux) is comparatively simple. It has no dependencies and has no directory structure. Here are complexity scores for these 3 projects, and a few others, using [scc](https://github.com/boyter/scc): + +| Project | Lines in .go Files | Complexity score | +| :--- | ---: | ---: | +| [Kubernetes](https://github.com/kubernetes/kubernetes) | 4,913,049 | 524,227 | +| [CockroachDB](https://github.com/cockroachdb/cockroach) | 4,064,838 | 725,465 | +| [gitea](https://github.com/go-gitea/gitea) | 223,761 | 39,001 | +| [hugo](https://github.com/gohugoio/hugo) | 148,613 | 16,642 | +| [go-github](https://github.com/google/go-github) | 117,131 | 15,637 | +|[traefik](https://github.com/traefik/traefik) | 107,542 | 9,154 | +| [gio](https://gioui.org/) | 47,283 | 5,122 | +| [gorilla/mux](https://github.com/gorilla/mux) | 6,661 | 763 | + +The complexity scores are rough estimates, but are useful in realizing how complex your code is. Creating project structure is not a pure science. There is an art to knowing how to lay out a project based on its current state, and its trajectory. + +If your project is simple, do not add unnecessary structure. This increases the cognitive load of anyone trying to use the project. + +### Package `internal` + +### Package `pkg` + +### Use Encapsulation Tools to Create Project Structure + +Just as structs, funcs, files, packages, and modules are + +### Adding Complexity Should be Justified + +### Use Other Methods of Abstraction + +### Other Resources +