Avito auf der GopherCon Russia 2018

    Hallo allerseits! Im März fand in der Moskauer Technopolis eine Konferenz zur Programmiersprache Go, GopherCon Russia 2018 , statt . Sie hielt Reden vom Kernteam - es war cool aus erster Hand zu hören, wie man es richtig macht. Und natürlich gab es Berichte über Microservices, Open Trading, das Arbeiten mit einem Netzwerk in Go, das Erstellen von Kundenbibliotheken und coole Tools.
    Wir möchten uns bei den Rednern - für die Berichte und für die Organisatoren - für die Gelegenheit bedanken, mit dem lebhaften Brad Fitzpatrick und der echten Ashley McNamara zu plaudern . Unter dem Schnitt sprechen wir über Berichte, Meisterklassen und einen Wettbewerb von Avito und spielen auch einige Go-Souvenirs.
    UPD, 12.04, 10:13 Uhr Moskauer Zeit: Der Empfang von Kommentaren zu Wettbewerben wird gestoppt, später wird der Beitrag aktualisiert und wir werden an alle Gewinner schreiben.
    UPD, 13.04., 13:40 Uhr Moskauer Zeit: Die Antworten werden am Ende des Beitrags unter dem Spoiler veröffentlicht, alle Kommentatoren, die vor dem 12.04.2008 geschrieben haben, erhalten Preise.



    Die meisten Fotos haben wir dem Bericht entnommen, der auf der Facebook-Seite der GopherCon Russia 2018 veröffentlicht wurde.


    Aufsätze & Sektionen von Avito


    Aufbau eines Such-Ökosystems auf Go


    In seinem Bericht sprach Andrei Drozdov anhand von Live-Beispielen über die Struktur von Suchmaschinen, darüber, was in der Go-Community zu diesem Thema bereits getan wurde, und verglich die Leistung einer selbst erstellten Suchmaschine für Go mit Lösungen für das Riot-Framework. Während des Berichts diskutierten sie, wie eine Suchinfrastruktur im Unternehmen aufgebaut und neue Suchalgorithmen schnell in Betrieb genommen werden können. Folien mit vielen nützlichen Links finden Sie hier . Und hier ist ein Video dieser Rede:



    Suchen Sie nach einer Million


    In Fortsetzung seines Berichts hielt Andrei Drozdov eine Meisterklasse ab, in der er das Erstellen von Suchmaschinen üben konnte.
    Folgendes sagt er zu dem Treffen:


    Trotz kleinerer Probleme beim Anschließen eines Computers waren viele Leute in der Meisterklasse. Die meisten von ihnen waren in der Lage, ihre Suche im Rahmen der Ausschreitungen zu schreiben, eine Million Schlagzeilen darin zu laden und Aufkleber von Avito als Geschenk zu erhalten. Neben der Hauptaufgabe lösten die drei aktivsten eine Reihe weiterer Aufgaben: Sie hielten ihre Benchmark und implementierten einen benutzerdefinierten Ranker. Ich würde mich freuen, wenn dadurch mehr Menschen Aufruhr lernen und ihn möglicherweise in ihn kopieren, so dass er sich schneller entwickelt.

    Zentrifuge 2


    Alexander Emelin sprach im Rahmen des Abschnitts im Avito-Raum über Pläne zur Weiterentwicklung des Centrifugo- Projekts . In den letzten Monaten hat er an der zweiten Version des Servers gearbeitet, mit der Tausende von gleichzeitigen Verbindungen von Anwendungsbenutzern bedient und ihnen Nachrichten in Echtzeit gesendet werden können (Websocket und SockJS). Ein wichtiges Merkmal des Servers ist, dass Sie es in das Backend integrieren können, das in einer beliebigen Programmiersprache geschrieben ist.


    In der zweiten Version wurden recht komplexe Aufgaben implementiert - beispielsweise wurde der Serverkern einer separaten Bibliothek zugewiesen, die von Go-Entwicklern verwendet werden konnte. Unterstützung für die Übertragung von Binärdaten über Websocket (Protobuf) zusätzlich zum vorhandenen JSON-Protokoll implementiert und Unterstützung für GRPC als alternativen Transport implementiert.


    Folgendes sagte Alexander nach dem Meisterkurs:


    Ziemlich viele Leute kamen in den Avito-Raum, unter denen sich auch aktuelle Nutzer von Centrifugo befanden. Es stellte sich heraus, dass wir ein wertvolles Feedback erhalten haben, was in dieser Entwicklungsphase äußerst wichtig ist. Nach einer mündlichen Diskussion über die Funktionen der zweiten Version haben wir uns ein kleines Echtzeitbeispiel mit dieser Bibliothek angesehen - ein sehr einfacher Chat mit einer interessanten Funktion: Der Server erlaubte den Clients, nicht nur das Websocket-Protokoll als Transport, sondern auch GRPC zu verwenden.

    Golang oder Hin und zurück


    An unserem Stand war es natürlich auch den ganzen Tag über voll. Bereits um ∞ Uhr morgens warteten wir auf die frühesten Konferenzteilnehmer. Sie könnten ein Foto mit Gopher machen ...



    ... oder ein mutiger Mitarbeiter unserer Techno-PR-Abteilung Gosha Immortal, der kürzlich von einem Junior-Spezialisten eingestellt wurde (allerdings bislang nur als Inventarnummer) ...



    Nun, und vielleicht die interessanteste Aktivität - den ganzen Tag an unserem Stand gab es einen Wettbewerb "Golang, oder There and Back", bei dem Sie ein T-Shirt, Fäustlinge oder Sticker-Pack mit Go-Symbolen gewinnen können. Es war notwendig, die Codeausschnitte in Golang und anderen Programmiersprachen abzugleichen. Bei näherer Betrachtung können Sie feststellen, dass etwa die Hälfte der in diesem Bild erfassten Konferenzteilnehmer Schnipsel in vollem Gange sind:



    Aber größere Pläne:



    Und ein bisschen - in den Hörsälen:



    Anscheinend ging das Spiel an alle Teilnehmer: Diejenigen, die am Wettbewerb teilgenommen haben, waren froh, vor den Berichten und dazwischen ihren Verstand zu strecken, und wir haben es genossen, mit jedem der rund 350 Teilnehmer in diesem Spiel zu sprechen.


    Zeichnung von Stickern und Fäustlingen auf Habré


    Wir haben noch einige Go-Fäustlinge und Sticker-Packs übrig - wir wollen sie hier auf Habré spielen. Was ist in dem Etikettensatz enthalten? Neun "grundlegende" Gophers ...



    ... und ein Set Aufkleberzubehör, damit Sie sich Ihren eigenen Gopher zusammenstellen können. Zum Beispiel so:



    Zu diesem Zweck empfehlen wir Ihnen, sich Codeausschnitte anzusehen und zu vergleichen, die in Golang und anderen Programmiersprachen geschrieben wurden. Schreiben Sie in die Kommentare die Paare nach dem Prinzip von 1 - A, 2 - B und so weiter. Verstecke Antworten unter einem Spoiler, um andere Fans nicht zu verwöhnen!


    Die ersten fünf Kommentatoren senden wir per Go-Stickerpack und ein Paar Fäustlinge per Post oder Kurier. Mit einem Zufallsgenerator verteilen wir fünf weitere gleiche Sets unter den verbleibenden Teilnehmern. Viel Spaß!


    Erweitern Sie Codebeispiele

    1


    2


    3


    4


    5


    6


    7


    8


    9


    10


    A


    type vertex struct {
            X, Y int
    }
    func f(v *vertex) {
            v.X = 3
            v.Y = 4
    }
    func main() {
            v1 := vertex{1, 8}
            f(&v1)
    }

    B


    package main
    import "fmt"
    import "math"
    func main() {
            fmt.Printf("%f", 1.0/math.Sqrt(49))
    }

    C


    package main
    import (
        "fmt"
        "unicode/utf8"
    )
    func main() {
        b := []byte{80, 72, 80, 32, 114, 117, 108, 101, 115}
        for len(b) > 0 {
            r, size := utf8.DecodeRune(b)
            fmt.Printf("%c", r)
            b = b[size:]
        }
    }

    D


    func f(x, y int64) int64 {
       return x + y
    }

    E


    package main
    import (
            "fmt"
    )
    func f(a int) func(b int) int {
            return func(b int) int {
                    return a*b
            }
    }
    func main() {
            list := []int{2, 2, 2, 2}
            g := f(3)
            for i, value := range list {
                    list[i] = g(value)
            }
            fmt.Println(list)
    }

    F


    type vt struct {
            X, Y int
    }
    func f(v vt) {
            v.X = 3
            v.Y = 4
    }
    func main() {
            v1 := vt{1, 8}
            f(v1)
    }

    G


    package main
    import (
            "io"
            "log"
            "net/http"
    )
    func h(w http.ResponseWriter, r *http.Request) {
            io.WriteString(w, "hello, world!\n")
    }
    func main() {
            http.HandleFunc("/", h)
            log.Fatal(http.ListenAndServe(":8080", nil))
    } 

    H


    type filter func(string) bool
    func bf(list []string, fn filter) [][]string {
            valid, invalid := []string{}, []string{}
            for _, s := range list {
                    if fn(s) {
                            valid = append(valid, s)
                    } else {
                            invalid = append(invalid, s)
                    }
            }
            return [][]string{valid, invalid}
    }
    func main() {
            l := []string{"gl", "hf", "ht", "tt"}
            res := bf(l, func(s string) bool {
                    return s[0] == 'h'
            })
    }

    Ich


    package main
    import "fmt"
    func main() {
            a, b := 5, 10
            fmt.Println(map[bool]int{true: a, false: a-1}[a > b])
    }

    J


    package main
    import (
            "fmt"
    )
    func f(a, b int) int {
            if a > b {
                    return a
            }
            return b
    }
    func main() {
            ints := []int{1, 8, 3, 4, 5}
            res := ints[0]
            for _, v := range ints {
                    res = f(res, v)
            }
            fmt.Println(res)
    }

    Warten auf Ihre Kommentare!


    Update: Antworten

    1 - G, 2 - J, 3 - A, 4 - F, 5 - H, 6 - C, 7 - E, 8 - B, 9 - I, 10 - D.


    Aber Gopher ruht sich nach der Konferenz aus und gewinnt vor der nächsten an Stärke.



    Bis bald


    Jetzt auch beliebt: