Раздел 3.3. Битва парадигм: Как мы учим код размножаться (1980-е — 1990-е)
Раздел 3.3. Битва парадигм: Как мы учим код размножаться (1980-е — 1990-е)
К началу 80-х годов программирование столкнулось с новой угрозой. Это была не нехватка памяти (она дешевела) и не медленные процессоры (они ускорялись по закону Мура). Это была Сложность.
Пока компьютеры работали в командной строке, жизнь программиста была линейной. Программа была диктатором.
- Компьютер пишет: «Введите имя».
- Компьютер ждет.
- Вы вводите.
- Компьютер пишет: «Введите возраст».
Это идеальный сценарий для процедурного стиля (языки C, Pascal, Fortran). Код читается сверху вниз.
Но потом появились Графические интерфейсы (GUI). Представьте окно текстового редактора. В нем 50 кнопок, 10 выпадающих меню, полосы прокрутки и поле ввода. Пользователь больше не подчиняется сценарию. Он может нажать что угодно и когда угодно. Он может выделить текст, потом нажать «Жирный», потом передумать, нажать «Печать», а пока принтер греется — свернуть окно.
Если писать это старыми методами (список инструкций), код превращался в гигантский клубок из тысяч условий IF, проверяющих всё подряд каждую миллисекунду.
- «Если нажата кнопка А, и при этом переменная Б равна 0, но галочка В стоит...»
Кризис: Индустрия задыхалась. Программы стали слишком сложными, чтобы человек мог удержать их логику в голове. Глобальные переменные конфликтовали друг с другом: кнопка «Печать» случайно меняла шрифт в документе, потому что программист использовал одну и ту же переменную i в двух разных функциях. Нам нужна была новая философия организации хаоса.
А. Объектно-ориентированное программирование (ООП): Уроки биологии
Решение пришло от человека, которого мы уже встречали в Xerox PARC — Алана Кея. Кей был уникальной фигурой: профессиональный джазовый музыкант, дизайнер и дипломированный биолог. В 70-х он посмотрел на компьютерную программу и понял, что она напоминает ему не математическую формулу, а... живой организм.
Клеточная теория
Подумайте о своем теле. У вас триллионы клеток.
- Клетке печени не нужно знать, как работает нейрон мозга.
- У клетки есть своя «память» (ДНК) и свои механизмы (митохондрии).
- Они изолированы мембраной.
- Они общаются, посылая друг другу химические сигналы (гормоны).
Кей предложил радикальную идею: давайте писать код так же. Вместо одной большой «простыни» кода, где всё связано со всем, мы разбиваем программу на тысячи маленьких независимых виртуальных машин — Объектов.
Так родилась парадигма ООП.
Три кита ООП (на пальцах)
- Инкапсуляция (Клеточная мембрана): Объект прячет свои «кишки» (данные) внутри.
- Раньше: Любая часть программы могла залезть в память, где хранится цвет кнопки, и поменять его. Это вело к багам.
- Теперь: Вы не можете залезть внутрь «Кнопки». Вы должны вежливо «послать ей сообщение» (вызвать метод):
Button.setColor(Red). Кнопка сама решит, как и когда себя перекрасить.
- Наследование (Генетика): Если вам нужно создать «Красную мигающую кнопку», вы не пишете код с нуля. Вы берете чертеж (Класс) обычной «Кнопки» и говорите: «Я хочу такую же, но чтобы мигала». Вы наследуете весь код предка бесплатно.
- Полиморфизм (Адаптация): Вы можете послать команду «Нарисуйся!» списку из 100 разных объектов. Круг нарисует себя как круг, квадрат — как квадрат, текст — как буквы. Программисту не нужно писать 100 проверок
IF.
Экономический эффект: ООП подарило бизнесу Reusability (Повторное использование). Один раз написав и протестировав объект «Окно Windows», Microsoft могла использовать его во всех своих программах — от Word до «Сапера». Разработка софта ускорилась в разы, а количество багов снизилось, потому что объекты были изолированы.
Б. C++: Прагматичный Монстр
Идеи Алана Кея были прекрасны, но его язык Smalltalk был слишком медленным. Он был «академическим». Индустрии нужен был язык, который сочетает красоту Объектов со скоростью старого доброго C.
Эту задачу решил датчанин Бьерн Страуструп.
Сюжет: Bell Labs и диссертация
1979 год. Бьерн работает в легендарной Bell Labs (там, где родились транзистор и Unix). Он пишет докторскую диссертацию по распределенным системам.
- Бьерн любит язык Simula (первый язык с объектами) — на нем удобно думать. Но он работает чудовищно медленно.
- Бьерн любит язык C — он быстрый, как молния, и работает на любом железе. Но на нем невозможно писать большие системы — тонешь в деталях.
Он решает «скрестить ужа с ежом». Он берет язык C и прикручивает к нему классы и объекты. Свое творение он называет «C with Classes», а позже — C++ (шутка для программистов: ++ означает «увеличить на единицу»).
Философия: «Я не хочу переписывать мир»
Страуструп сделал гениальный маркетинговый ход.
- Обратная совместимость: Любая программа, написанная на старом C, является валидной программой на C++.
- Это значило, что миллионам программистов не нужно переучиваться с нуля. Они могли переходить на новый стиль постепенно.
К середине 80-х C++ захватил мир. На нем писали всё: от Microsoft Windows и Adobe Photoshop до движков баз данных и видеоигр. Это был язык неограниченной власти.
«Выстрелить себе в ногу»
Но у этой власти была цена. C++ давал программисту прямой доступ к оперативной памяти. Знаменитая цитата Страуструпа:
«C позволяет вам легко выстрелить себе в ногу. C++ делает это сложнее, но если вы все же выстрелите, вам оторвет ногу целиком».
В C++ управление памятью было полуавтоматическим.
- Вы создаете объект (занимаете память) —
new Object(). - Вы обязаны удалить его (освободить память) —
delete Object.
Если вы забыли удалить объект (а в программе на миллион строк это легко), происходит Memory Leak (Утечка памяти). Программа жрет всё больше RAM. Компьютер начинает тормозить. В конце концов, операционная система падает. Автоматические деструкторы и умные указатели сильно облегчили управление памятью, но утечки памяти все еще оставались.
- Факт: Знаменитые «Синие экраны смерти» (BSOD) в Windows 95/98 на 90% были вызваны ошибками программистов C++, которые лезли в чужую память или забывали чистить за собой.
В. Java: Идеалист и Робот-уборщик
К началу 90-х мир устал от сложности C++. Компании тратили 50% времени на поиск утечек памяти, а не на создание новых функций. В солнечной Калифорнии, в компании Sun Microsystems (главный конкурент Microsoft), команда под руководством Джеймса Гослинга работала над секретным проектом.
Сюжет: Умный пульт, который не взлетел
В 1991 году Гослинг и его «Green Team» пытались предсказать будущее. Они верили, что следующим большим рынком будет не компьютер, а бытовая электроника. Холодильники, телевизоры и тостеры станут умными. Они создали прототип устройства Star7 — это был предок смартфона с сенсорным экраном, которым можно было управлять телевизором.
Для этого устройства Гослинг создал новый язык — Oak (Дуб, потому что дуб рос у него под окном). Позже юристы выяснили, что имя занято, и команда, сидя в кофейне, переименовала его в Java.
Провал: В начале 90-х никто не хотел покупать умные пульты. Кабельные компании посмеялись над идеей. Проект был на грани закрытия. Но в 1993 году случился бум Интернета (Netscape). Гослинг и его босс Скотт Макнили поняли: «Подождите! Наш язык идеально подходит не для тостеров, а для Веба! Он безопасный, компактный и переносимый!».
Java: Две революции (1995)
Sun выпускает Java с лозунгом, который стал религией: «Write Once, Run Anywhere».
1. Виртуальная машина (JVM) — Конец перекомпиляции
В C++ была проблема: если вы написали программу для Windows, она не запустится на Mac. Вам нужно переписывать часть кода и перекомпилировать его. Java работала иначе.
- Программист компилирует код не для реального процессора (Intel/AMD), а для вымышленного — Виртуальной машины Java (JVM).
- JVM устанавливается на любой компьютер (как плеер). И она уже на лету переводит код для конкретного железа. Бизнес-эффект: Банки были в восторге. Они могли написать торговый терминал один раз, и он работал у всех трейдеров, независимо от того, сидят они на Windows, Linux или Solaris.
2. Garbage Collection (Сборка мусора)
Это был самый радикальный шаг, за который хардкорные инженеры возненавидели Java, а бизнес — полюбил. Java забрала у программиста право управлять памятью.
- Как в C++: Программист сам нанимает уборщицу и сам тыкает ей пальцем: «Убери здесь». Если забыл — офис (память) зарастает мусором.
- Как в Java: Программист просто мусорит (создает объекты). А специальный фоновый процесс — Garbage Collector (Сборщик мусора) — ходит следом и проверяет: «На этот объект еще кто-то смотрит? Нет? Уничтожить».
Критика и Победа: Программисты игр кричали: «Это сделает программы медленными! Робот-уборщик тратит ресурсы процессора в самый неподходящий момент!». (Именно поэтому топовые игры до сих пор пишут на C++). Но Бизнес сказал: «Плевать на 10% скорости. Зато программа не падает, у нас нет утечек памяти, и мы пишем код в 2 раза быстрее, потому что не думаем о байтах».
Бизнес-контекст: Sun Microsystems использовала Java как таран против Microsoft. Билл Гейтс увидел угрозу: если все программы будут написаны на Java, Windows станет не нужна — Java-программы работают везде. Microsoft попыталась уничтожить Java, создав свою несовместимую версию (J++), что привело к грандиозному суду, который Sun выиграла (получив $2 млрд отступных), но это уже другая история.
Итог раздела 3.3
Битва парадигм 90-х закончилась разделением мира на две сверхдержавы, которое сохраняется до сих пор:
- C++ (и позже Rust): Зона «Близко к металлу». Здесь живут игровые движки, операционные системы, браузеры, высокочастотный трейдинг. Всё, где важна каждая наносекунда и контроль над ресурсами.
- Java (и позже C#): Зона «Enterprise». Здесь живут банковские системы, бэкенд Google и Amazon, Android-приложения. Всё, где важна надежность, безопасность и скорость разработки.
Мы научились строить сложные системы из кирпичиков-объектов. Программирование стало массовой профессией. Но эти системы все еще жили в изоляции на жестких дисках. В следующем модуле мы соединим их в глобальную Паутину, и начнется настоящий хаос Доткомов.