Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Нейминг

There are only two hard things in Computer Science: cache invalidation and naming things — Phil Karlton.

Про инвалидацию кэша поговорим как-нибудь в другой раз, сейчас про именование методов.

Всякие банальности наверно говорить не стоит: и так понятно, что метод f() - вообще донное название, переменная должна быть существительным, метод - глаголом. Базовые советы неплохо расписаны в этой статье (которая у нас висит на заглавной странице Redmine, если кто не помнит).

Недавно на хабре подняли еще один вопрос про нейминг. https://habr.com/ru/post/484860/. Суть примерно такова - не надо в названии отражать, как функция работает. Надо писать, что полезного она делает.

Вообще, у нас в отделе вопрос нейминга решается обычно так:

  1. Попробуй назвать сам. Если совсем туго - возможно нарушен SRP или другая практика, код надо отрефакторить.
  2. Попроси помочь старшего друга, но хотя бы 2-3 варианта предложи сам.
  3. Спроси команду. “Если хочешь что-то понять - объясни другому”. Если объясняешь человеку, который не в контексте - то, во-первых, сам сконцентрируешься на важном и лучше поймешь, что делает функция, во-вторых, незамыленный взгляд/слух способствует новым идеям и/или объективному подходу к теме.
  4. Совсем тяжелые случаи выносим на голосование.
СсылкаКомментировать

Мониторинг приложения

Как понять, сколько запросов система обрабатывает в секунду? Как долго обрабатывает запрос? Какие очереди забиваются?

На эти вопросы вы можете ответить, если обложите ваше приложение метриками - счетчиками, таймерами и т.п., которые будут отправляться в какое-нибудь хранилище. А уже из него можно их читать, строить статистику, визуализировать и мастрячить дашборды. Или алерты, когда какая-то метрика отклоняется от нормы.

Вообще тема довольно широкая и “в минутку” ее тяжело уложить.

У нас в отделе для этих целей раньше использовалась ganglia + graphite, сейчас - TICK-stack. Серьезные ребята с нагрузкой побольше могут использовать Prometheus, если ближе к железу/сисадминству - то это Zabbix. Можно еще подобные шутки построить в elastic-стеке, а вообще штук для мониторинга - пруд пруди.

TICK-stack у нас с задачей справляется, хотя он довольно молод, еще не так стабилен, как хотелось бы и к нему есть претензии. Например, если в influx забился диск, он это честно обнаруживает и пишет в логи, но потом даже при свободном месте он ничего не делает и продолжает якобы нормально работать (вместо того, чтобы обнаружить новое место и продолжить писать). Приходится рестартить.

СсылкаКомментировать

Работа с легаси-кодом

Как работать с легаси кодом? Т.е. как себя вести в ситуации, когда наткнулся на старый код и понимаешь, что его надо серьезно отрефакторить (не важно по какой причине - устарел, появились новые компетенции в команде и поняли, что так писать не стоит, новая фича только с костылями пролезет и т.п.)?

Варианты примерно такие (можно и нужно комбинировать):

  1. Закладывать в оценку таска время на рефакторинг. Это может быть явно прописано или учтено в рисках. Если рефакторинг мелкий, то этого времени обычно хватает.

  2. Сделать “чтобы работало”, и добавить таск на рефакторинг в трекер задач. Будет время - выполним задачу. Обычно это связано с глобальным рефакторингом - то есть тяжелой задачей. Если реально без этого рефакторинга никак - то стоит еще раз подумать о приоритетах.

А вообще лучше придерживаться правила, что после работы с участком кода он должен стать лучше:) Все-таки над этим кодом потом работать тебе и твоему коллеге. И работать с техдолгом нужно - иначе код превратится в огромного страшного монстра, которого проще будет сжечь, чем исправить :)

СсылкаКомментировать

Запуск команды на нескольких серваках

Что делать, если надо запустить одну и ту же команду на нескольких серваках?

Варианты:

  1. parallel-ssh. Тупо заходит на сервак по ssh и выполняет команду (нужно настроить беcключевой доступ). Дешево и сердито

  2. puppet. Упрощенно - это такая штука, где можно писать в декларативном стиле “на этом серваке должны быть поставлены такие-то пакеты, должен быть запущен такой-то сервис, развернута база с определенными таблицами и т.п.”. Сервер хранит сведения о том, что должно быть на каждой ноде, а на нодах стоит агент, который периодически запрашивает с сервера, что у него должно быть и сравнивает со своим текущим состоянием. Если не совпало - исправляет это. Для этой штуки есть букет плагинов (но не очень высокого качества), имеет смысл, только если проект довольно большой, долгий и есть похожие ноды (есть потенциал добавления новых нод).

  3. ansible - это parallel-ssh на стероидах. Претендует на то, чтобы быть заменой puppet, однако качество плагинов к нему очень низкое (по крайней мере те, с которыми я работал). Хипстерская хрень, насчет которой стоит трижды подумать, прежде чем использовать

СсылкаКомментировать

Моржовый оператор в питоне

В октябре релизнулся Python 3.8. Среди нововведений - моржовый оператор, который позволяет делать присваивание внутри другого выражения:

# So instead of
a = some_func()
if a:
    print(a)

# Now you can concisely write
if a := some_func():
        print(a)

и, разумеется, можно сделать так:

a = 5
d = [b := a+1, a := b-1, a := a*2]

потенциальный undefined behavior, добро пожаловать в питон!

Если интересна тема, как можно плохо что-то делать в питоне или нужен источник паззлеров для него, то можно почитать https://github.com/satwikkansal/wtfpython

СсылкаКомментировать

Тяжелые задачи с ssh

Запускать длительные задачи на серваке через ssh надо через nohup. Ибо если это не сделать, то при обрыве ssh-сессии (что равносильно закрытию “терминала”) процесс завершится. nohup запускает команду “в отрыве” от терминала. При выходе из него (при завершении сессии ssh) задача останется. Если вы запустили что-то тяжеленное и забыли про nohup, то на помощь придет disown.

  1. Нажимаем ctrl+Z, чтобы поставить выполнение задачи на паузу
  2. jobs -l - получаем список задач, находим там нужный ID
  3. bg ID - запускаем задачу в фоне
  4. disown PID - отвязываем от терминала
СсылкаКомментировать