1.07. Развитие софта
Развитие софта
1940-е – появились компьютеры, программирование было через переключатели и кабели. ENIAC – первый электронный компьютер общего назначения. Первым «багом» отмечают мотылька, застрявшего в реле компьютера Harvard Mark II в 1947 (в журнале сохранились записи, и именно поэтому слово «баг» стало обозначать неисправности). Программы вводились дырками в бумаге – перфокартами. Представьте себе, что нет никаких клавиатур, мышек и даже мониторов, а программирование является физическим процессом.
Интересный факт – в те времена программистами были в основном женщины. Например, шесть женщин — Кей Макналти, Фрэнсис Биллингтон, Бет Дженнингс, Рут Лихтерман, Сюзан Мейтцнер и Мариан Блатт — работали над программированием ENIAC. Они не просто «вводили данные» — они проектировали логику работы машины, учили её решать задачи.
Первые программы были последовательностью машинных команд, без разделения на логические блоки. «Сделай раз», «Сделай два», «Сделай три». И когда пишут уже «Сделай семьсот тысяч пятьдесят восемь», человеческая память или терпение могут подвести. Тогда возникла идея - а что если часто используемый код можно как то вынести и использовать повторно? Понятие «функции» (или подпрограммы) появилось как способ повторного использования кода. В 1947 году Джон фон Нейман описал концепцию подпрограммы , которая позволяла выносить часто используемый код в отдельные участки памяти. Это можно отметить как первое фундаментальное решение в оптимизации написания кода, ведь сейчас те самые подпрограммы являются функциями, процедурами и методами.
1950-е – поначалу код писали на ассемблере, но появились фундаментальные языки программирования Fortran (FORmula TRANslator, 1957) и COBOL (COmmon Business-Oriented Language, 1959). Код выполняют и передают на перфокартах, которые были на вес золота – их носили в ювелирных футлярах. Кобол стал языком для бизнеса, и до 2000-х на нём работало 80% банковских систем! Многие банки и до сих пор используют его — например, в 2020 году во время пандемии в США столкнулись с проблемой, когда некому было поддерживать старые COBOL-системы. Финансовые компании всегда являлись основной аудиторией для надёжных и стабильных технологий, однако они же и выступали в качестве распространителей идей и стандартов, что как развивало технологии, так и приводило к общим ошибкам и потерям.
Хранение информации изначально было примитивным, использовали текстовые файлы, плоские таблицы, никаких связей между ними нет. Но с ростом объема данных потребовалась система. В 1960-х появились иерархические и сетевые модели (IBM IMS). Эти модели позволили структурировать данные и ускорить доступ к ним, что стало основой для дальнейшего развития реляционных БД.
В 1958 году язык Lisp стал первым языком, где функции могли быть объектами первого класса, то есть передаваться как аргументы другим функциям. Lisp стал основой для развития функционального программирования, дал жизнь таким концепциям, как рекурсия, лямбда-выражения, макросы. Современные языки вроде JavaScript, Python, Scala и Kotlin активно используют идеи, впервые реализованные в Lisp.
Позже концепция была развита в языках ALGOL, C, Pascal, что положило начало процедурному и структурному программированию. ALGOL (1958-1960) ввёл такие понятия, как блоки кода (begin...end), циклы, условные операторы. Pascal (1970) развил идеи ALGOL и стал основным языком обучения программированию, а C…
В 1970-х годах произошёл один из самых важных поворотов в истории программирования и операционных систем: появился язык C и операционная система UNIX.
UNIX была создана в Bell Labs (AT&T) как ответ на потребность в мощной, гибкой и переносимой операционной системе. Первоначальная версия UNIX, написанная Кеном Томпсоном в 1969 году, была на ассемблере, что делало её крайне привязанной к конкретному типу оборудования. Но всё изменилось в 1973 году, когда Деннис Ритчи разработал язык программирования C (Си), специально чтобы переписать UNIX на нём. Это был революционный шаг - операционная система могла быть перенесена на другие машины с минимальными изменениями, программы стали более читаемыми, структурированными и эффективными. Язык Си, созданный Деннисом Ритчи в 1972 году, стал не просто инструментом для написания UNIX. Он стал основой почти всего, что мы сегодня используем в IT - Linux, Windows, macOS, Python, JavaScript, базы данных, компиляторы и трансляторы. Говоря о базах данных, как раз в этот период, Эдгар Кодд из IBM предложил реляционную модель данных — таблицы с отношениями между ними. Затем Oracle реализует первый коммерческий SQL-движок. Но как программы передавали друг другу данные? Первым прототипом цифрового обмена документами между компаниями был EDI (Electronic Data Interchange), заложивший основу для дальшейшего взаимодействия. Контроллеры как абстракция для управления потоком выполнения и взаимодействия в приложениях появились в конце 1970-х (к примеру, паттерн MVC (Model-View-Controller) впервые описан Трюффо и Реенскогом в 1978 году, популяризирован в Smalltalk).
1980-е были золотым веком компьютерной революции, ведь началось массовое распространение ПК, появились первые ОС. В 1991 году молодой финский студент Линус Торвальдс запустил проект, который изначально воспринимался как личное хобби. Он хотел разобраться, как работают процессоры Intel x86, и написал небольшое ядро (kernel), способное управлять базовыми функциями компьютера. Он назвал своё детище Linux — в честь своего имени (Linus) и UNIX-подобной архитектуры, на которой оно строилось. Но вместо того чтобы закрыть свой код или продать его, Линус сделал его открытым . Он просто выложил исходники в интернет и сказал: ««Если кому-то интересно — добро пожаловать к разработке». И разработчики со всего мира начали помогать, что привело к тому, что именно Linux стал основой интернета (вы же знали, что Android основан на Linux?). Если Linux — это пример открытого сотрудничества и прозрачности, то история MS-DOS — образец деловой хитрости и решительности. В 1980 году компания IBM решила создать свой персональный компьютер (IBM PC) и искала подходящую операционную систему. На тот момент у Microsoft, возглавляемой Биллом Гейтсом, не было своей полноценной ОС. Но Билл не упустил шанс. Он договорился с IBM и пообещал предоставить операционную систему.
Проблема была только одна - её ещё не существовало.
Гейтс нашёл выход, и купил у небольшой компании Seattle Computer Products операционную систему QDOS (Quick and Dirty Operating System) за 75 000 долларов , немного доработал её и переименовал в MS-DOS. Так, без собственной готовой технологии, Microsoft стала ключевым игроком в мире персональных компьютеров. А IBM получила свою версию — PC-DOS, но не подозревала, что покупает не оригинальную разработку, а адаптированную копию.
В 1980-х годах понятия GitHub, облачного хранения и мгновенного доступа к коду ещё не существовало. Программы передавались на дискетах, по телефонным модемам или вручную, между коллегами, друзьями и сотрудниками. Каждая дискета содержала ценную информацию, и потерять её значило потерять неделями написанный код.
Но где есть код — там и злоумышленники. В 1982 году ученик старших классов Ричард Скента (Richard Skrenta) написал программу, которая могла заражать дискеты Apple II и активироваться после загрузки. Это был первый в мире массово распространённый вирус — Elk Cloner. При каждом 50-м запуске игры он выводил стишок. Забавно, но тогда никто не воспринял это всерьёз. Однако Elk Cloner стал отправной точкой для эпохи компьютерных вирусов, троянов и кибератак.
Технологии софта стали стремительно развиваться - именно в тот период произошло развитие SQL, появление MySQL, PostgreSQL, Microsoft SQL Server. Программы становились сложнее, требовалась модульность. Так появились компоненты — автономные части системы, объединённые через чётко определённые интерфейсы. По мере роста числа систем внутри компаний и организаций появилась необходимость их интеграции — обмен данными между различными сервисами и платформами.
В 1991 появился CORBA (Common Object Request Broker Architecture) - платформенно-независимый стандарт для распределённых систем. Другой один из первых таких стандартов появился в 1993, силами Microsoft, это COM (Component Object Model) для создания переиспользуемых компонентов. Позднее, в конце 1990-х уже появилась Java-реализация компонентной архитектуры, а в 2002 - .NET Assemblies (компоненты .NET Framework). Такие технологии усложнили софт, позволив разделять ответственность, масштабировать, тестировать и переиспользовать компоненты.
С увеличением сложности приложений программисты начали искать универсальные решения типовых задач. Первые 23 ключевых паттерна программирования были изложены в книге «Банды четырёх» в 1994, благодаря чему качество кода стало улучшаться, решения стандартизировались, читаемость и количество ошибок стали стремиться к совершенству.
С развитием многопоточных и распределённых систем стало важно реагировать на события и обмениваться сообщениями между компонентами, к примеру, Event-driven architecture (EDA). В 1993 появился IBM MQSeries (MQ). Другие брокеры сообщений появились позже, к примеру, RabbitMQ (2007) и Apache Kafka (2011).
Идея, что каждая часть бизнес-логики может быть отдельным сервисом, зародилась в 2000-х (SOA). Она переросла в микросервисную архитектуру в 2010-х, а с появлением Docker (2013) и Kubernetes (2015) системы сильно изменились за счёт повышенной гибкости, независимости развёртывания и устойчивости.
Большинство стандартов для описания и передачи данных между системами (XML, SOAP, WSDL, ESB, REST API) появились лишь в 2000-х. И только в 2000-х появились NoSQL (MongoDB, Cassandra), графовые базы (Neo4j). Сейчас же софт уже не простые приложения, а единые экосистемы, обеспечивающие автоматизацию процессов, снижение ошибок и повышение эффективности (по сравнению со старыми подходами).
Можно сказать, что основной фундамент современных систем в окончательном виде был построен приблизительно в 2015-х годах, после чего, фактически, кроме некоторых трендов вроде «ИИ» и «машинное обучение», особо ничего и не шевелится.