backend_podcast

backend_podcast

By Artem OstretsovTechnology
Download on the App Store

backend_podcast episodes

  • ep011

    Проект loon


    Обратил внимание на ballon'ы на сайте https://www.flightradar24.com/.
    Это проект [loon][1] воздушные шары, обеспечивающие интернетом наземных клиентов.
    Если коротко, то это летающая базовая станция.

    Дженерики в Golang

    Первое и важное: [дженерикам в Go быть][2]!

    В течении первых 24 часов после публикации Go возник вопрос о наличии дженериков.
    До сих пор это один из top вопросов. Летом 2019 года был опубликован [дизайн-документ дженериков][3] для Go.

    Определение дженериков:
    > Generic programming enables the representation of functions and data structures in a generic form, with types factored out.

    Уже сейчас можно [поиграть с дженериками в Golang][5] с помощью [wasm-go-playground][4].

    Уже сейчас можно писать универсальный код для разных типов с помощью:
    - интерфейсов;
    - кодогенерации;
    - приведения типов (`interface{}`).

    Немного про Дональда Кнута

    [1]: https://loon.com/
    [2]: https://go-review.googlesource.com/c/go/+/187317
    [3]: https://go.googlesource.com/proposal/+/4a54a00950b56dd0096482d0edae46969d7432a6/design/go2draft-contracts.md
    [4]: https://github.com/ccbrown/wasm-go-playground
    [5]: https://ccbrown.github.io/wasm-go-playground/experimental/generics/#A4Qwxg1iDmCmAEBbEBLAdgKA2A9mgLgE7j7wDOR6chAFACoCU8A3hgJB3wDKla0NTCoSoYAvlnwBPYAh7gINKTPichVWISYBtALp0sAMwCuaMPBplu+efQZMACrFgKmnVm0Kx8RwmnJaAG1g0CwYAWgBGHTFDEzMLeAAqOUhbBxxgARZ2RMsAXnNchi0ALiCQosjo8QxjU3NLZOtUxgcjMgALGgA3EACjBEZstlz4ApBgGTQAExpcgBp4Xv7YBhjauIarG1arYT4stT5hz1ISgoAiC/YDHEJ4AH1F7vhz+GI+BEt3NhQDd688AAhJcLsM2B5AQBqS6La4Q8QQ07wGFLAB0PH2/DWbERpx8flO6yUCAAspIAPIAIwAVrAwKQhEYGcMAHIgRBfXjQdZ1eI4WnwcnUukMpiYqiHbknLwE+ACmlo9mc3mbZDoLLuXr3CjybapYW0+n4HG6yBo+ztLqG0X4ZgXW44C6iU3NCAWq00G3G+1UkCEZ044D7fABEJm90Sg52GJAA=

    36 min
  • ep010

    Не проследили за балансом микрофонов, поэтому Боря в этом выпуске звучал тише, чем обычно. Приносим извенения за неудобства.


    Поговорили про логгирование в web-сервисах.

    - пакет `log` стандартной библиотеки;
    - написание своих кастомных логеров;
    - упомянули наше решение [gluent-bit][1], которое мы используем для трансляции логов в Graylog;
    - [logrus][2] в ~20 раз медленнее [zap][3];
    - немного упомянули json-экстрактор Graylog;
    - уровни логирования: DEBUG, INFO, WARN, ERROR, FATAL;
    - особенности [zap][3]:
       - поддержка уровней логирования;
       - sampling для дедупликации потока логов;
       - не использует рефлексию и стандартный `json` пакет: работает через `append`;
       - `SugaredLogger` и `Logger`;
       - нет ротации логов.
    - ротация логов через [lumberjack][4]
    - что имеет смысл логировать, а что выносить в мониторинг;
    - `Reference-Id` для идентификации request-response и связанных операций;
    - отказ от логирования запросов, не изменяющих состояние системы;
    - унификация логов.

    [1]: https://github.com/ostretsov/gluent-bit
    [2]: https://github.com/sirupsen/logrus
    [3]: https://github.com/uber-go/zap
    [4]: https://godoc.org/gopkg.in/natefinch/lumberjack.v2

    43 min
  • ep009

    В подкасте подняли вопрос о сообщениях об ошибках в API.

    RFC7807 "Problem details"

    Этот документ предлагает унифицированное решение по форматированию (схеме) ответа проблемы/ошибки для API-сервисов. Несмотря на то, что документ достаточно свежий (весна 2016) мы едва ли обнаружили для себя удобное решение, которое одновременно будет удобно и для клиента API.

    RFC предлагает дополнительный Content-Type: application/problem+json. Частичное применение некоторых идей мы нашли в API DHL v4

    Обсудили применимость использования Content-Language для последующей локализации. В большинстве наших проектов мы используем английский.

    Обсудили предложение RFC по использованию в качестве кодов ошибок URI и насколько это удобно использовать клиенту.

    Рассказали схему ошибки, которую мы используем в своих проектах.

    57 min
  • ep008
    • тестирование unexported методов в Go через создание exported алиаса;
    • создание *_test пакета для решения проблемы циклических импортов в тестах;
    • unicode пакет;
    • тестирование через публичные интерфейсы;
    • преждевременная оптимизация;
    • преждевременная абстракция: функции, классы, интерфейсы, новые протоколы;
    • правило трех;
    • читаемость против преждевременной абстракции;
    • соблюдение уровней абстрации;
    • правило бойскаута;
    • 43 min
    • ep007
      • чуть-чуть о Google Cloud Spanner - реляционная геораспределенная БД от Google
      • коснулись темы документные базы против реляционных
      • consistency в базах данных
      • дорогие облачные БД от Google
      • научные публикации на google research / google scholar
      • удобные облачные сервисы, которые мы используем регулярно: AWS S3, SES, Google Places API
      • поддерживать самому кластер k8s или нет
      • проекты, в которых "поставили точку"
      • трудности, с которыми мы столкнулись, когда впервые развернули своей k8s кластер
      • история одной проблемы в k8s на hetzner, суть которой мы так и не выяснили
      • возможно стоит подписаться на changelog k8s
      • https://github.com/urfave/cli для создания CLI-приложений на Go
      • http://docopt.org/
      • ACID вобще и ACID в MongoDB
      • 43 min
      • ep006
        Удаленная работа
        boltdb

        Встраиваемая key-value база данных. Чем-то напоминает SQLite за исключением того, что это просто key-value. Всего <3K LOC. Не поддерживается более, но стабильна: новых фич автор добавлять не планирует. Отлично подходит для интенсивных чтений. Использует lock'и.

        • транзакции на чтение и на запись;
        • автоинкременты;
        • бакеты могут быть вложенными;
        • итерации по ключам бакета с использованием курсора возможно в любых направлениях;
        • ключи отсортированы "байт-к-байту" за счет чего можно делать prefix-сканы и range-сканы (например по RFC3339-дате).
        • Объектно-ориентированный язык программирования Pharo

          В Pharo всего 6 ключевых слов.

          45 min
        • ep005

          Поговорили о:

          • ActiveRecord vs Repository паттерне;
          • pgbouncer;
          • проекты типа аггрегатор и интегратор.
          • 47 min
          • ep004

            Подкасть чуть более чем полностью о Go

            Зависимости в хендлерах

            Обсудили два способа инжектирования зависимостей в хендлерах:

            • использование глобальных переменных;
            • явная передача зависимостей через арументы фунции-хендлера;
            • использование структуры-контейнера.
            • Много говорили о базе данных в роли зависимости.

              Вынесение request и response структур в хендлер
              func Handler(db *storage.DB) gin.HandlerFunc {
                 type request struct {
                     //
                 }

                 type response struct {
                     //
                 }

                 return func(ctx *gin.Context) {
                     //
                 }
              }
              Go поощряет написание "скучного" кода
              Оптимистическое программирование

              Опубликовано: 05.03.2020

              Теги: Go, сервис-контейнер, зависимости, python, оптимистическое программирование

              55 min
            • ep003

              excelize, упомянутый в прошлом эпизоде удалось за прошедшую неделю применить. В деле показал себя отлично. Не часто заказчик требует обмен данных в XLSX-формате через API. Это был тот редкий случай.

              Алгоритмы

              Проходил на coursera курс по алгоритмам от ВШЭ. Среди языков, на которых можно делать submission нет Go, но для мня это неплохой повод попрактиковаться в Python или Rust. Последний мы не используем в проектах, а вот проекты на Python у нас есть. Так вот на каждый язык свои лимиты по рантайму:

              Язык программирования

              Лимит времени выполенения, сек

              C, C++, Rust     1

              Java, C#            1.5

              Haskell              2

              Scala                  3

              Ruby, JavaScript, Python      5

              Несколько неожиданно, что Scala дали такой лимит.

              Концепция стресс-тестирования

              Идея в том, чтобы написать две имплементации и сравнивать выходные значение при одинаковых входных. Чаще применяется для тестирования алгоритмов когда есть медленное, но простое решение и быстрое, но, возможно, с ошибками в реализации. В тестах мы чаще сами придумываем входные данные для тестируемого метода. При стресс-тестировании входные данные генерируются произвольным образом. Стресс-тесты не отменяют необходимости в корнер-кейсах, когда мы тестируем пограничные состояния: отрицательные, одинаковые значение, неверные типы, нулевые значения и т.д.

              Рейтинг языков программирования от IEEE

              Графики предварены несколько сомнительной цитатой:

              Engineers love Python, JavaScript, and Java. Employers, on the other hand, shine their light on Go.

              Пожалуй действительно любят из этой тройки Python. JavaScript как раз едва ли любят, поэтому и перетягивает на себя популярность TypeScript, добавивший строгости. А Go - это хороший шаг в сторону упрощения кода и он оппонирует Java, C++, C#, Scala. Go в рейтинге IEEE №1.

              pkg.go.dev вместо godoc.org

              На главной популярные и рекомендуемые репозитории. В каждом пакете можно посмотреть зависимости и кто использует этот пакет.

              Другое

              Обсудили также пару пакетов из x/sync:

              • https://godoc.org/golang.org/x/sync/singleflight
              • https://godoc.org/golang.org/x/sync/errgroup
              • Коротко обсудили алгоритм зайца и черепахи для поиска петли в связанном списке. Вдохновился на некоторое углубление в тему этим видео (каким бы было аниме о программировании).

                48 min
              • ep002
                tamago

                Позволяет запускать Go-приложение прямо на процессоре, без операционной системы. Концепция unikernel. Пока поддерживается только их же (f-secure) SoC (Systm-on-Chip) MkII (~150USD). В планах добавить поддержку Raspberry PI Zero (~25USD).

                Кстати будет упомянуть книгу Code: The Hidden Language of Computer Hardware and Software by Charles Petzold. Основы изложены лучше, чем вам их дадут в университете.

                excelize

                Просто упомяну библиотеку для чтения и записи XLSX-файлов в Go:

                Excelize is a library written in pure Go providing a set of functions that allow you to write to and read from XLSX files.
                Supports reading and writing XLSX file generated by Microsoft Excel™ 2007 and later.
                Supports saving a file without losing original charts of XLSX.
                This library needs Go version 1.10 or later.
                Go vs Python

                Статья о использовании Python для небольших скриптов. Полностью поддерживаю автора. Среди прочего автор упомянул сложность идентификации версии Go-программы: имеешь дело с бинарным файлом. В Go можно использовать ldflags:

                $ go build -ldflags="-X 'main.Version=v1.0.0'"

                Отличная вводная статья на DigitalOcean про использование go build для модификации значений переменных пакета. Также к недостаткам Go автор отнес отсутсвие REPL, но он есть.

                Применение NLTK для опредления HC/HTC

                Обсудили популярную библиотеку NLTK, написанную на Python, для решения нашей одной из повседневных задач для определения HTC-кода посылки по её описанию для таможни в США.

                41 min

              About backend_podcast

              From the publisher's feed

              Разрабатываем бэкэнды, делимся впечатлениями