Федор Борщев

Технические долги

Есть ребята, которые пишут говнокод не потому, что не могут отличить хороший код от плохого, а потому, что считают, что так быстрее. Эта заметка для них.

Представь что ты увидел в магазине новый охуенный iMac pro. Можно пойти и накопить 400 тысяч (долго и муторно), а можно достать кредитку и купить прямо сейчас.

Во втором случае в нагрузку к аймаку ты получишь долг. Теперь что бы с тобой не случилось, ты должен банку 400 тысяч. Если их не отдать в ближайший месяц, то будешь должен уже 403 тысячи, еще через месяц — 406, и т.д.

Технический долг — он как финансовый

В принципе, по долгам можно не платить, правда придется отключить телефон. Однако долг никуда не денется — когда-нибудь в Пятерочке не примут платеж с твоей карты, а вернувшись домой ты не найдешь нового мака — его опишут приставы.

Технический долг устроен так же, как финансовый — первое время он почти не беспокоит. Чем дольше висит долг — тем выше риск. И однажды в солнечную пятницу тебе придется остаться на работе, потому что долг потребует платежа. Конечно, можно наговнокодить еще сильнее и пойти домой. А потом еще и еще — пока проект совсем не остановится. Вероятно, к этому времени ты уже поругаешься с семьей, друзьями и менеджером, или сменишь работу.

Расплата по долгам

В командах у технического долга появляется еще одно вредное свойство — по долгам одного нерадивого участника приходится платить другим. Относись к такому долгу, как к деньгам: представь, что ты в баре, и нашел в кармане кредитку коллеги. Ты же не станешь угощать весь бар Макаланом, правда?

Давайте жить не в долг и писать понятный код — так быстрее. И работу можно будет менять по собственной воле, а не из-за долговой ямы.

Книга: Строим нейросеть

Пару лет назад я не видел разницы между нейросетями и искусственным интеллектом. Ну а что — и в голове нейроны, и в нейросетях.

Потом разобрался: оказывается, никакого чуда нет. Нейронные сети — просто способ решать задачи, которые не получится решить формулами — распознать рукописный ввод, раскрасить черно-белую фотку или присоветовать новую музычку в айтюнсе.

Нейросети, как и человеческий мозг, работают по нечеткой логике — обучаются на примерах, выделяют закономерности «похожести», выделяя 10 важных сигналов из 500 входящих. Технически нейросеть устроена весьма просто — весь код строится на перемножении матриц и паре ветвлений.

Ладно, хватит сложностей. Если вы программист, вы и без меня найдете что почитать. А если менеджер — рекомендую книгу Тарика Рашида «Строим нейросеть».

Тарик Рашид — Строим нейросеть

Книга разделена на 3 части — машинное обучение, нейронные сети и Питон. Чтобы понять автора, достаточно оконченной 10 лет назад средней школы — все изложено предельно популярно. Даже Питон знать не нужно — основы расскажут прямо в книге.

Книга будет полезна всем, кто управляет проектами, связанными с машинным обучением — сможете говорить с программистами на одном языке, а слова вроде «коэффициент обучения» или «перетренированность» перестанут быть абракадаброй. Покупайте на озоне.

Какие технологии выбрать для нового проекта?

Эта заметка — для менеджеров, которые принимают решение о выборе технологического стека. Если вы CTO, программист или просто готовы поговорить о различиях языков программирования — бросьте чтение, дальше скучно.

За пару дней до Нового Года я решил выбрать робот-пылесос. На рынке есть десятки брендов — iClebo моет полы, iRobot лучше всех строит карту помещения, Дайсон — мощный, а Сяоми вроде бы самый крутой, и стоит в 5 раз дешевле. Объединяет всех производителей одно — нихуя не понятно, какую из характеристик нужно выбрать, чтобы конкретно в моей квартире стало всегда чисто.

Когда руководитель не может делегировать выбор технологий для нового проекта, он оказызывается в такой же ситуации, как я на Новый Год. Проект нужно было начать еще вчера, а чем Руби отличается от Питона и Раста, и как эти отличия отразятся на сроках и целях — непонятно.

Выбор технологий с точки зрения менеджера

Ответ про пылесос я в итоге нашел на вечнозеленом ixbt. Но с языками программирования так не получается — вменяемых материалов нет. Даже если вы неделю будете изучать реддит, то узнаете только как правильно троллить ПХПшников или что наследование в Го лучше чем в Джаве. Какое это имеет отношение к срокам и целям — непонятно.

А ответ простой — новый проект нужно начинать на стеке, с которым работает команда, способная гарантировать результат. Вы же не обсуждаете с дантистом диаметр бура, а с дворником виды метел? С дантистом вы договариваетесь о том, чтобы не болели зубы, с дворником — чтобы во дворе не валялся мусор.

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

Вы же менеджер, вот и управляйте проектом: договоритесь с командой о несдвигаемом дедлайне, узнайте что они будут делать, когда поймут, что не успевают. Найдите, наконец, запасную команду — пойдете к ним, если текущие ребята вас обманут. Но выбор технологий оставьте профессионалам.

Еще раз — подойдет любой язык программирования (кроме JS, конечно). Главное, чтобы те, кто на нем пишет, гарантировали результат. И у вас было, кем их заменить.

Если остались вопросы про выбор — пишите на почту.

Писать тесты — вежливо

Самое важное в общении распределенной команды — писать так, чтобы не переспрашивали. Когда коллега из Гонконга в следующий раз выйдет на связь — никто не знает, а значит в сообщении должно содержаться все необходимое для выполнения задачи.

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

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

Хорошая передача эстафетной палочки — 3 ссылки на тесты
Хорошая передача эстафетной палочки — 3 ссылки на тесты

Не пишете тесты? Откройте лучше автомойку, или завербуйтесь к газовикам на север.

Автоматизация рутины программиста

Год назад я вернулся к программированию и начал присматриваться, что изменилось в окружающей среде за последнее время. Оказалось, ничего — современный стек технологий до сих пор доступен только крупным компаниям, все остальные так и живут в каменном веке.

Программисты по-прежнему не пишут тесты, не измеряют качество кода и занимаются обновлением серверов вместо бизнес-логики. Хорошо, если хоть файлы на сайте по ФТП не правят. Руководство, видимо, привыкло к плохому — так и живут с проебывающимися сроками и десятком багов на боевом сервере.

6 сервисов для автоматизации рутины программиста

В хорошей команде рутиной занимается робот, а программисты думают только о полезном действии. Рутина выматывает, а хорошо отлаженная автоматизация — наоборот, заставляет концентрироваться на важном.

Если рядом с вами программируют хоть что-нибудь сложнее сайта-визитки на вордпрессе — проверьте эти 6 направлений:

  • Непрерывная сборка и запуск. Решает проблему с выкатыванием софта — программисту достаточно отправить коммит в репозиторий, дальше все случается без его участия — запускаются тесты, собирается фронтенд, снимаются метрики. Если код в коммите рабочий, продакшн обновляется автоматически. Хороший сервис — CircleCI.
  • Замер качества кода. Ключевые метрики — покрытие тестами, сложность, читаемость, наличие копипейста. Хороший сервис — Code Climate.
  • Отдельным пунктом — процент покрытия. Это соотношение кода, который выполняется во время прогона тестов к общему количеству кода в приложении. Если у вас проверяется меньше 80%, значит вы пишете плохой код. Если покрытие меньше 50%, а вы работаете над новыми фичами — вы работаете зря. Хороший сервис — Codecov.
  • Обработка ошибок. Хранит журнал ошибок и позволяет анализировать продакшн на основе реальных цифр, а не жалоб пользователей. Хороший сервис — Sentry, есть клиенты для всех языков, включая браузерный JS.
  • Мониторинг производительности. APM снимет трейсы самых долгих запросов прямо с продакшена, нарисует графики скорости и подскажет узкие места, которые приводят к тормозам. Для каждого фреймворка нужен свой APM, для Джанго я использую Datadog. Еще есть New Relic и куча других.
  • Облачный хостинг. Если на вашем проекте есть жужжащая железяка с сисадмином в комплекте — смело избавляйтесь. Дешевле и проще взять ресурсы в аренду и исключить человеческий фактор, чем владеть коробкой, которая не приносит денег. Идите в Azure или хотя бы в Digital Ocean.

Что-то забыл? Пишите в комменты. Интересуетесь автоматизацией? Начните с free-for-dev.