Была ли мотивация сделать хороший продукт на прошлой работе?

Ответ

Да, конечно. В предыдущей команде мы фокусировались на качестве кода и пользовательском опыте. Например, внедряли 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, и хер с ним», а внятное исключение, которое дальше по цепочке красиво обработается.

Вот это и есть надёжность, читаемость и масштабируемость, ёпта. Не «и так сойдёт», а «сделано на совесть, чтобы через год самому же не было стыдно в этот код смотреть». А то щас, блядь, иногда такой говнокод встречаешь, что волосы дыбом — сразу видно, человек думал только о том, как бы поскорее слить задачу и свалить. А потом все дружно ебутся с последствиями.