Attending GopherCon online
Tags: gopher, gophercon, conference, go
Published: 2020-08-10 11:18:47

---
title: Attending GopherCon online
published: true
description: On August 8-9, an online GopherCon Russia conference was held at which the developers shared their experience
tags: #gopher #gophercon #conference #golang
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/kyfwetnrz9npyvwye2j9.png
---

2020 will be remembered for a very long time by the quarantine and the accompanying restrictions. All events where there is a crowd of people have been cancelled and we are trying to adhere to all recommendations. It would seem that this year's conference would be impossible. But tough times await new solutions, and now conferences are also moving online.

This innovative solution has its pros and cons. What I liked was:
- ability to communicate with the speaker;
- switch channels just in one click;
- talks were recorded in advance, so speakers could answer questions in runtime;
- talk to anyone you want in chat;
- sitting in my favourite chair with two monitors;
- slides or speaker monitor very clearly visible (people with poor eyesight will understand me 😉);
- if you get bored, you can go about your business (conferences in the post-Soviet area are held on weekends, so you need to spend your personal time);
- waking up late and no queues to get a pass.

Nevertheless, in addition to the pros, there were also disadvantages:
- affiliate ads sound more intrusive and more like spam;
- the platform they used for sharing had a few technical issues, so I met a lot of freezes;
- only the winners of contests and quizzes can receive partner merchandise.

### What about the conference

The conference is divided into two days. The first day was devoted to workshops, and the second day there were 2 tracks for talks. The overall level of the talks was quite high and I personally really liked it.

Workshops were held exclusively in Russian, so the audience was very limited (about 140 participants). But the talks were both in Russian and in English and were very reasonably distributed among the tracks (approximately the number of listeners on the stream was 150 and 80 per track).

#### Workshops

- **Observability in practice** by Elena Grahovac
{% user elena %}

Quite an interesting and practical workshop, in which she showed by a practical example of how to log useful information using a `uber-go/zap` logger, tracing of application flow execution and gathering metrics using `opentelemetry`, visualization and analysis of the obtained data using `jaeger`.

The codebase available on GitHub, just use tags in this order `clean`, `logger`, `tracer`, `meter` and `tools` to follow the process:

{% github rumyantseva/stayathome no-readme %}

- **TLA+/TLC: a practical tool for formal verification of algorithms that all gophers need to know for sure** by Alexey Naidyonov

Despite the title, I personally think that this topic is important, but not so much that everyone should know it. It would be nice to know - yes, it can help you with your architecture planning, but for need - no, I don't think so.

{% github growler/gophercon-russia-2020-talk no-readme %}

TLA+ is a tool to design systems and algorithms, then programmatically verify that those systems don't have critical bugs. It's the software equivalent of a blueprint.

If you are interested to learn more, here are a few links for you:

* [The TLA+ Video Course](https://lamport.azurewebsites.net/video/videos.html) by Leslie Lamport, author of TLA+ and PlusCal specification language
* [Learn TLA+](https://learntla.com/introduction/)
* [TLA+ Examples](https://github.com/tlaplus/Examples)

If you are interested in a deeper study, then "*Specifying Systems*" and "*Practical TLA+*" books will serve as the best continuation for you.

![TLA+ best books to learn](https://dev-to-uploads.s3.amazonaws.com/i/tbn68o9ptkp3869u09ju.png)

#### Talks

- **Continuous profiling for Go applications** by Mike Kabischev

Nice talk, started with an overview of profile types and basics profiling with `runtime/pprof`. Then several continuous profiling packages were compared, such as `github.com/conprof/conprof` and `github.com/profefe/profefe`.

Profiling is a part of observability, that's why `pprof` should be always available, but `net/http/pprof` should be accessible in the different port.

![Running net/http/pprof on the different port](https://dev-to-uploads.s3.amazonaws.com/i/2ie3jewa6mm82y0oa2oa.png)

As a follow-up you can also read {% medium https://medium.com/google-cloud/continuous-profiling-of-go-programs-96d4416af77b %}

- **eBPF: Modern Introspection Capabilities in Linux** by Marko Kevac

BPF is kernel-level profiling in Linux. It allows you to monitor what happens in the system, as Linux is an event-driven system and you can analyse these events with BPF program. The newer the version of your kernel, the more BPF features you can use. However, BPF is not fully adapted with Go, namely BPF program written in Go cannot work with the kernel part. The most commonly used package is `iovisor/gobpf`, but there are other alternatives like `github.com/dropbox/goebpf` and `github.com/cilium/ebpf`.

If you are interested and would like to know more, then it is best to read "*BPF Performance Tools*" and "*Linux Observability with BPF*" books:

![BPF best books to read](https://dev-to-uploads.s3.amazonaws.com/i/v4n8jz4yiv6aqb68er9e.png)

- **Codegenerator in Go** by Dmitriy Smotrov 

Personally, I am too conservative for decisions such as code generation, as I prefer to do everything myself. Nevertheless, such solutions can speed up work on routine things, for example, describing a repository for a model, or writing tests for this model. In addition, it is important to note that Go has good functionality for such solutions.

Source code is available on GitHub
{% github dsxack/gophercon2020 no-readme %}

- **GoLand Tips & Tricks** by Florin Patan

If you are using GoLand as an IDE for writing code, then the examples shown during the talk can be very useful for you.

Code samples can be found in the GitHub
{% github dlsniper/golandtipsandtricks no-readme %}

- **Debugging concurrent programs in Go** by Andrii Soldatenko

{% user andriisoldatenko %}

The talk was built on the use of the console version of the delve (`dlv`). Of course, GoLand will solve it for you as its debugger also uses devle, same as VSCode, but not everything from delve release will immediately appear in your IDE. So if you want to have a better and custom debugger, it is good to know how `dlv` works.

{% github go-delve/delve no-readme %}

Slides can be found in the [Dropbox](https://www.dropbox.com/s/00c9vtyooz5b58v/advanced_debugging_techniques_of_go_code.pdf)

- **Go, please: language server under the microscope** by Ilya Danilkin 

A Language Server is meant to provide the language-specific smarts and communicate with development tools over a protocol that enables inter-process communication. The idea behind the Language Server Protocol (LSP) is to standardize the protocol for how such servers and development tools communicate. This way, a single Language Server can be re-used in multiple development tools, which in turn can support multiple languages with minimal effort.

In the past, there were many LSP implementations in Go, but over time, the Go core team developed the official LSP implementation `gopls` that we know today.

Slides can be found in [slides.com](https://slides.com/nezorflame/20200809_gophercon/)

- **How to stop thinking about required fields and start writing contracts** by Vladimir Serdyukov

The talk tells about the Buffer Protocol mechanism, invented by Google for serializing data structures. The speaker talked about the differences between `proto2` and `proto3`, as well as how to use required fields in `proto3`. For validation, you can use either `buf.build` or `github.com/uber/prototool`.

{% github golang/protobuf no-readme %}

In new projects and for better compatibility it is recommended to use `proto3`. `apiv2` can and should be used, but `prototool` does not support it. `buf.build` looks promising, but plugins such as *`gogoproto`* lose their relevance.

- **Intro to AI for software engineers using go-learn** by Miriah Peterson

GoLearn is an accessible ML library written primarily in Go with some C and C++. It uses with simple classification problems.

Checkout the examples 
{% github sjwhitworth/golearn no-readme %}

To learn more, go through the tutorials at
{% github ardanlabs/training-ai no-readme %}

and 

{% github dwhitena/gc-ml no-readme %}

- **Growth of the open-source community: problems and solutions** by Georgy Rylov

The speaker told how he organized a special course at the university and involved students in writing their project.

{% github wal-g/wal-g no-readme %}

As a result, he summed up that students can write productive code in Go and it takes comparable time to review it as for regular developer. It is not necessary to have a curriculum in order to come to the university with your projects.

- **Generic Programming in Go** by Vladimir Vivien, "*Learning Go Programming*" book author

{% user vladimirvivien %}

The possibility of adding generics to Go is currently being developed. Preliminary, they should be expected no earlier than 2 years later.

Go core team assumes a level of performance in runtime, as generics should come with faster execution time. Nevertheless, compiler time may increase, but the Go core team are doing everything to keep compilation fast. Use of generics can be also complicated and the code with them may look unusual. Here is an example of using type parameters in functions:

```go
fmt.Print(F(int)(param int))
```

The proposal can be found here:
{% github vladimirvivien/go-generics-proposal no-readme %}

1. [The Next Step for Generics | go blog](https://blog.golang.org/generics-next-step)
2. [Contracts — Draft Design | Google source](https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-contracts.md)
3. [Go training for Generics](https://github.com/ardanlabs/gotraining/tree/master/topics/go/generics)
4. [`dev.go2go` branch](https://go.googlesource.com/go/+/refs/heads/dev.go2go/)
5. [`dev.go2go` branch README](https://go.googlesource.com/go/+/refs/heads/dev.go2go/README.go2go.md)
6. [`dev.go2go` testdata](https://go.googlesource.com/go/+/refs/heads/dev.go2go/src/cmd/go2go/testdata/go2path/src)

***

### Conclusion

I was pleased with the time spent listening to talks and workshops. In addition to the information from the official part, in the communication channels, I have gathered for myself several technologies that are worth paying attention to.

1. `uber-go/zap` logger might be a good alternative to the `sirupsen/logrus` which we are currently using at ottonova. Although it is simpler to implement and use, nevertheless its execution speed is several times lower than that of `zap`.
2. FluentD is an interesting alternative for LogStash. From a preliminary analysis of FluentD, it appears to be less resource-intensive and more flexible.
3. Observability is popular and demanded thing, and most of the conference was dedicated to it.