Старые учебники по программированию: как они делали сложные вещи понятными и актуален ли их подход сегодня
Краткое резюме
Старые учебники по программированию отличаются прямолинейностью и практичностью. Автор статьи хочет применить подходы из них к решению задач в современных условиях.
Возникает вопрос, почему учебники 90-х и 2000-х годов воспитали целое поколение инженеров, и возможно ли сейчас использовать их практичный подход без приукрашивания, оптимизации и изменения первоначальной логики.
Создаётся впечатление, что старые учебные пособия были чем-то вроде магических предметов. В то время не существовало модных фреймворков, размеченных веток в репозиториях и удобных интегрированных сред разработки с автодополнением. Однако выпускники той эпохи легко ориентировались в алгоритмах, понимали процессы и могли работать в различных средах. Сегодня мы привыкли к сложным инструментам, множеству абстракций и методологиям, обсуждение которых занимает больше времени, чем их реализация. Но раньше задачи решали по-другому, пусть и не так изящно, но честно.
Мне захотелось на время вернуться в прошлое, взять один из типичных учебников того времени и попробовать применить его подходы в современных условиях. Без улучшений и сложных инструментов, только оригинальная методика: чёткая структура, минимум зависимостей и максимум здравого смысла.
Изучая пожелтевшие страницы, я задался вопросом: не усложняем ли мы очевидное просто потому, что можем?
**Забытое чувство предсказуемости**
Старые учебники поражают своей прямолинейностью. Если речь идёт о сортировке, то сначала объясняется принцип, затем приводится схема и код. Код всегда полностью рабочий, без дополнительных уровней абстракции и расширений, только базовая логика. Возникает мысль: а что если применить этот подход сегодня? Например, взять простую задачу — сортировку большого массива данных — и попробовать решить её так, как учили тогда, на примере языка C.
Вот типичный фрагмент кода из тех времён:
```c
#include
void bubble(int arr[], int n) {
int i, j, tmp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main() {
int data[] = {5, 3, 8, 4, 2};
int size = sizeof(data) / sizeof(data[0]);
bubble(data, size);
for (int i = 0; i < size; i++)
printf("%d ", data[i]);
}
```
Читая этот код, словно слышишь голос преподавателя: если алгоритм работает медленно — не жалуйся, перепиши вручную. И ведь работало. Мы забыли это ощущение предсказуемости: если функция выполняет одну задачу, она делает именно это. Задумывались ли вы, сколько скрытых слоёв сегодня находится между вашим кодом и реальным исполнением?
**Инженерия по принципу минимального шума**
Одно из самых ценных открытий, которые я сделал, перелистывая свои старые конспекты, — идея минимального шума. Все примеры того времени строились логично и последовательно: сначала описание задачи, потом простейший алгоритм, далее улучшение, но без обилия слов. Мы жили в условиях дефицита информации, и, возможно, именно поэтому каждый байт текста был на вес золота.