На первом курсе информатики вы узнаете о разных алгоритмах, доступных для сортировки списка элементов. Существует простая пузырьковая сортировка, которая просматривает список снова и снова, меняя местами соседние пары элементов в правильном порядке до тех пор, пока не останется пар, которые можно было бы поменять местами. Существует методическая сортировка вставками, которая очень похожа на то, как человек сортирует стопку бумаг. Есть великолепная heapsort, которая сначала сортирует список, частично сортируя его в неправильном направлении. Существует хаотичная быстрая сортировка, которую, по общему мнению, невозможно правильно реализовать с первой попытки.

Посмотрите, как работают эти алгоритмы сортировки здесь.

Редко профессиональным программистам приходится реализовывать алгоритм сортировки. Это суть библиотечных функций, написанных и протестированных один раз и использованных много тысяч раз. Но разнообразие методов, доступных для сортировки списка, является прекрасной иллюстрацией гибкости и творчества, доступных программисту. Мы можем отдать приоритет быстрой реализации и использовать сортировку пузырьком. Мы можем отдать предпочтение элегантности и использовать heapsort. Или мы можем отдать предпочтение мазохизму и написать быструю сортировку.

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

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

Но эта важная особенность так и не появилась. По мере того, как продукт становился все более умным, накладные расходы на логику, связанную с API, быстро превышали накладные расходы, которые потребовались бы для буферизации всего файла в памяти при каждом его чтении. Я написал быструю сортировку, когда сработала бы пузырьковая сортировка.

Конечно, так же легко ошибиться в другом. Основным интерфейсом нашего продукта Timeslice является виджет календаря, в котором сотрудники могут просматривать и добавлять свои расписания. Когда впервые был написан код для отображения табелей учета рабочего времени в календаре, предполагалось, что люди (в основном) будут работать над одной задачей за раз. Случай, когда на один и тот же момент времени присутствует несколько табелей учета рабочего времени, был обработан простым группированием всех табелей учета рабочего времени, которые будут перекрываться, и рисованием каждого из них в отдельной колонке.

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

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