Найти тему

Разбор “твиттер собеседования”


На днях я сделал тред в твиттере про вопросы, которые можно задать на собесе опытным девелоперам, чтобы понять их уровень решения прикладных задач. Тред круто разошелся и часть людей в ответах стала проходить это “собеседование”. Большая часть ответов там в тему, но кое что можно подать по другому, поэтому я хочу сейчас здесь разобрать некоторые из этих вопросов.

Сразу скажу, что это вопросы на пообсуждать, на них нет правильных ответов, есть только какие-то области, в рамках которых лежит ответ на вопрос.

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

Если коротко, ответ это использование либо оптимистической либо пессимистической блокировки. Их даже не придется делать самостоятельно, потому что такая функциональность есть в любой хорошей ORM.

> Каких принципов разработки нужно придерживаться, для обеспечения механизма zero downtime deployment, это подход при котором приложение деплоится без простоя сервиса. Как это достигается?

То что конкретно касается разработчика, это то как надо работать с интерфейсами. Структура сообщений в очередях, api, структура базы данных, все это должно быть обратно совместимым так как ZDD подразумевает одновременный запуск прошлой и новой версии приложений.

> Что может произойти, если ваша крон задача, которая запускается раз в минуту, стала выполняться больше 1 минуты? Как это можно предотвратить?

Может быть нужно перейти на событийную систему и очереди/джобы, может быть увеличить таймауты, а может поставить лок.

> Если вы пишите тесты, то как вы обходите проблему того, что код который вы тестируете, делает внешние вызовы? Доп условие, говорим о том, что на CI внешние вызовы запрещены (почему так правильно?)

VCR (кассеты) или стабы

> Предположим что в вашей системе реализована смена емейла. При этом этот емейл хранится еще и во внешней системе, например эквайринге, который шлет пользователю свои письма (но пользователь им напрямую не пользуется). Как бы вы реализовали синхронизацию емейла с внешней системой?

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

> Как вы узнаете об ошибках, которые происходят на продакшене? От пользователей или это автоматизировано?

Самое простое это коллекторы ошибок типа sentry, остальное по требованиям/вкусу

> Как обеспечивается изоляция тестов друг от друга если они ходят в базу и меняют ее (дефолт в большинстве фреймворков)? Если в вашем фреймворке этого нет, то как вы это делаете или сделали бы?

Кстати удивительно, что никто не назвал самый простой вариант реализованный во всех бек фреймворках по умолчанию, это транзакционные тесты. В начале теста транзакция стартует, в конце откатывается. Так работает в laravel, django, rails, spring boot и других фреймворках без доп настроек.
2 минуты