Before pointing out my lessons learned, I am going to describe my background and the way I was learning and using Go to give you some context and better understanding.

I was writing in C# from 2009 to 2018. I was developing different sort of applications such as desktop apps, web apps, web services. Some of these were really big (even modular) monoliths. I was doing quite a lot of TDD since 2015. I think that I have a quite deep understanding and experience in OOAD, Design Patterns, SOLID, DDD, CQRS. I have also tried functional programming on my own in F# and started to apply functional programming in C#.

In 2018, I started to feel that C# is getting to complicated and loaded with too many features. Moreover, it did not look anything is going to be simplified in the future, rather the contrary. For example for concurrent programming you could use threading, TPL DataFlow, async/await, Reactive Extensions. Right now in C# 8.0 if you want to return more than one result from a method you can use an out parameter, use ValueTuple or Tuple or create your own type… or throw an exception if it is an error. I decided that I want to check out something else, even if I would decide to go back to C# some day. I just started to feel unhappy with C#.

My journey with Go started in the second half of December of 2018. This is when I decided to move to a project, where it was planned to develop new microservices in Go. I started learning by completing the Tour of Go. Then I have read Effective Go and How to Write Go Code. Then I have started to learn in multiple ways in parallel to get the most of my brain. I have been:

in May of 2019, I finally started to code in Go at work. Colleagues from other teams have made for our team a beautiful project seed with basic CRUD logic together with dockerization and Continuous Integration. Moreover, I have been mentored by probably one of our best Gopher, who has been doing a lot of initial code reviews (thank you a lot Trevor!). During 8 months, I have been developing a REST API microservice, a queue worker microservice and 2 CLI apps.

After this lengthy preface, I am going to try the list what I have learned in my last 14 months of development in Go.

The list is probably not complete, as my memory is not really good. There are also some stuff that I generally like in Go, but I think that they are not really applicable for other languages. For example, I favor returning explicit error objects instead of throwing exception. However, I would not do it in C#, because it is not idiomatic. Unfortunately, error handling in most of the languages is done using exceptions. I love how fast Go builds the code, its testing framework and the simplicity of the language.

Right now, I truly miss only one thing in Go, which is great in C# ecosystem. A great free IDE like Visual Studio. I use Visual Studio Code with Go extension. It has almost no refactorings. Even simple renaming often fails. Additionally, support for go modules does not work very well.

The other stuff pro C# is that it possible to write almost all kind of applications in C#: network, desktop, mobile, ML, IoT. It gives you possibility to use the same tools and libraries in most of the above applications. For me C# is like a Swiss Army knife. You can do everything with it, but it would never be the most efficient way.

I know that I could learn all of this stuff while still being a C# developer. However, changing the language and ecosystem made it easier to analyze my coding style and change my habits. Additionally, I think that a lot Gophers have similar experience to mine that most software in other ecosystems are a total legacy mess or over-engineered modular, CQRS, DDD, Event Driven, everything systems. Go community resits to use patterns when not needed.