Clear is better than clever

was Go auszeichnet

kontext

Symbolfoto

  • René Habermann
  • viel Java
  • zuletzt Go
  • 250 Mitarbeiter
  • 6 Standorte
  • Tochter der Otto Group

Ablauf

  1. Darum gibts Go
  2. Das zeichnet Go aus
  3. Unsere Erfahrung Go vs. Java

High-Level, kein Go-Kurs



Slides
renehabermann.gitlab.io/presentations/go2






Situation 2007

Große, verteilte, nebenläufige Systeme

Java und C++ dominant

Frustration, geringe Produktivität

Robert Griesemer
Rob Pike
Ken Thompson

Neue Sprache

statisch typisiert und effizient

einfach zu verwenden, leicht lesbar

networking und nebenläufigkeit als Kernkompetenz

Go Language Design

Wer nimmts?

...

Was Go auszeichnet


Einfach

Effizient

Designed

Nebenläufig


Einfach

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. – Kent Beck

Keywords

Nur ein Teilaspekt!

C#
C++
Java
Ruby
JavaScript
Python
C
Go
102
82
50
42
46
35
32
25

quelle

Minimalismus

keine

  • Generics
  • Vererbung
  • manuelle Speicherverwaltung (GC)
  • Pointer Arithmetik
  • Exceptions*
  • ternäre Operatoren


Exception Handling Considered Harmful

Implikationen auf Code

  • bekannte Strukturen
  • einfacher, klarer Ablauf
  • keine magic
  • langweilig

Implikationen für Team

  • Sprachwechsel einfach
  • schnell produktiv
  • schnell hochwertig


zeige ich im Projektbeispiel

Effizient

Web Server

10 MiB Docker Image from scratch

5 MiB Speicher Footprint

ms Kompilierzeit

ms Startzeit

keine GC lags

"GC latency is an existential threat to Go"

Tooling inklusive

Geringe Hürde für effizienten Code

  • Profiling
  • Benchmarks
  • Tracing
  • Vet (Statische Analyse)
  • Data Race Detector

Designed

Erfahrung der Autoren zeigt sich hier

https://golang.org/doc/gopher/modelsheet.jpg

Stabil

Konsistent

  • entworfen, nicht gewachsen
  • Proposals knallhart kuratiert

Tooling Inklusive

  • Dependency Management
  • Testing
  • Godoc

  • Profiling
  • Benchmarks
  • Tracing
  • Vet (Statische Analyse)
  • Data Race Detector

Das Gute programm

Sting / CC BY-SA (https://creativecommons.org/licenses/by-sa/2.5)

Für Go relativ klar

Nebenläufig

go

Alan Kay über OOP

Marcin Wichary from San Francisco, U.S.A. / CC BY

I'm sorry that I long ago coined the term "objects" for this topic because it gets many people to focus on the lesser idea. The big idea is messaging.

http://wiki.c2.com/?AlanKayOnMessaging

chan

Implikation auf Code



  • Parallelisierbarkeit
  • Gute Strukturierung

keine Zeit tiefer zu gehen :(

https://gobyexample.com/goroutines

Communicating Sequential Processes (CSP)

Photograph by Rama, Wikimedia Commons, CC BY-SA 2.0 FR

Don’t communicate by sharing memory, share memory by communicating. – go proverb

Channels

package main

import "fmt"

func main() {

    messages := make(chan string)

    messages <- "ping"

    msg := <-messages
    fmt.Println(msg)
}

Channels

package main

import "fmt"

func main() {

    messages := make(chan string)

    go func() { messages <- "ping" }()

    msg := <-messages
    fmt.Println(msg)
    
}

Select

package main

import "fmt"

func main() {

    messages := make(chan string)

    go func() { messages <- "ping" }()

    select {
    case msg := <-messages:
        fmt.Println(msg)
    case <-time.After(1 * time.Second):
        fmt.Println("timeout 1")
    }
    
}

Close, Buffers

func main() {
    jobs := make(chan int, 5)
    done := make(chan bool)

    go func() {
        for job := range jobs {
            fmt.Println("received job", j)
        }
        done <- true
    }()

    for j := 1; j <= 3; j++ {
        jobs <- j
    }
    close(jobs)

    <-done
}

Projekterfahrungen

https://www.hermesworld.com/de/content/karriere/hf/standortbroschuere-haldensleben.pdf

Retouren im Konzern

  • reife Software, 1999 gestartet
  • spannende Anforderungen
  • massive Integration
  • Backends
  • Frontends
  • C, Perl, Java, Ruby
  • Entwicklung an 4 Standorten, mit Dienstleister
  • stabil, aber eher schwerfällig

Schöne neue Welt

  • Self Contained Systems (SCS)
  • ACL für Integrationen
  • Go + Java
  • weiche Migration
  • CI/CD


Wir legen los

idealer start

  • Go Einarbeitung ~ 2 Wochen
  • erste Services funktional fertig ~ 2 Wochen
  • gute Qualität
  • hochperformant
  • extrem effizient

Java+Go = Overhead

  • Fachlich kein Thema, aber technisch
  • alles 2 mal erforscht und umgesetzt
  • Technologisch noch breiter
  • Spaltung des Teams

Fazit

Für ein Team nicht ideal

Fokus auf eine Sprache

aber welche?

Java vs Go

Unklare Kausalität!

Migration

  • eines bestehenden Services
  • als Self Contained System
  • erstes Go-Projekt für Kollegen
  • als finaler Go-Beweis

Umsetzung

  • Release zum Zieltermin
  • viel Ballast bei Java (insb. Pattern)


Unklare Kausalität!

Ergebnis

Vorteile bei GO

  • schnelles onboarding
  • geringer Ressourcenbedarf
  • Spring Boot überkompensiert

Meine Einschätzung

  • Go Code kompakter
  • simpler strukturiert
  • schneller geschrieben
  • besser änderbar, wartbar

Zu Bedenken

  • Java Integrationen unschlagbar
  • Ziele der Entwickler

    Stackoverflow Developer Survey 2020

Mehr zu Go

Danke!

rene.habermann@ottogroup.com

renehabermann.gitlab.io/presentations/go2