Ответ
Да, конечно. В предыдущей команде мы фокусировались на качестве кода и пользовательском опыте. Например, внедряли code reviews, покрывали функционал unit- и интеграционными тестами, использовали CI/CD для быстрого выявления проблем.
Пример подхода:
// Вместо "работает и ладно"
public class OrderService
{
private readonly IOrderRepository _repository;
public OrderService(IOrderRepository repository)
{
_repository = repository;
}
public async Task<Order> GetOrderAsync(int id)
{
if (id <= 0) throw new ArgumentException("Invalid ID");
return await _repository.GetByIdAsync(id) ?? throw new NotFoundException();
}
}
Важно было не просто закрыть задачу, но и обеспечить надежность, читаемость и масштабируемость.
Ответ 18+ 🔞
А, ну ты про то, как мы раньше-то работали, да? Ну, блядь, это ж целая эпопея, ёпта. Не то что сейчас — накатал какую-нибудь хуйню, пнул в прод и пошёл чай пить. А раньше-то, сука, был культ.
Вот смотри, мы же не просто фичи впихивали, как последние распиздяи. Мы, блядь, над каждым куском кода сидели, как над священным писанием. Code reviews — это ж был не формальный пиздёж, а реальная война. Принесёшь свою поделку, а тебе такой коллега, с лицом каменным, пишет: «А нахуя тут этот костыль? Ты что, мозгов дома забыл?». И ведь прав, сука, оказывается. Зато потом не прилетало ночью, что всё легло.
И тесты, мать их... Это ж была религия. Не просто «о, вроде кнопка нажимается». А unit-тесты, которые каждую мелкую функцию проверяют, и интеграционные, которые всю эту махину в сборе гоняют. Чтобы если что-то сломаешь в одном углу, тебе сразу же в другом углу тест в ебальник загорится красным. CI/CD, блядь, стоял такой бдительный стражник — не пропустит ни одной хуйни.
Вот, глянь, пример, как мы писали. Вместо того чтобы набросать метод, который «работает и ладно», мы выстраивали всё, как в армии.
// Вместо "работает и ладно"
public class OrderService
{
private readonly IOrderRepository _repository;
public OrderService(IOrderRepository repository)
{
_repository = repository;
}
public async Task<Order> GetOrderAsync(int id)
{
if (id <= 0) throw new ArgumentException("Invalid ID");
return await _repository.GetByIdAsync(id) ?? throw new NotFoundException();
}
}
Видишь? Проверка входящих данных на адекватность — чтобы какой-нибудь мудак минусовый айдишник не сунул. Чёткая работа с зависимостями через интерфейсы — чтобы потом, если что, можно было всё подменить и не переписывать половину проекта. И понятная обработка краевых случаев — если заказа нет, то это не тихое «вернул null, и хер с ним», а внятное исключение, которое дальше по цепочке красиво обработается.
Вот это и есть надёжность, читаемость и масштабируемость, ёпта. Не «и так сойдёт», а «сделано на совесть, чтобы через год самому же не было стыдно в этот код смотреть». А то щас, блядь, иногда такой говнокод встречаешь, что волосы дыбом — сразу видно, человек думал только о том, как бы поскорее слить задачу и свалить. А потом все дружно ебутся с последствиями.