Можно ли считать программирование наукой? Аргумент скептиков
обычно железный: «Какая это наука, если в ней нет ни одного закона, как в
физике? Нет ни одной теоремы! Программа либо работает, либо нет — вот и вся
ваша наука». Вопрос честный и, на первый взгляд, логичный. Вот только проблема в том,
что мы пытаемся измерить объем жидкости линейкой. Инструмент не тот.

Миф о «нет теорем». Где у программиста своя «физика»?
Утверждение, что в программировании нет теорем, — это
классическое заблуждение. Они есть, и их сотни. Просто эти теоремы не про
яблоки, падающие на голову Ньютону, а про то, как ведет себя информация.
Каждый раз, когда вы вбиваете что-то в поисковике или
сортируете таблицу в Excel, в работу включаются алгоритмы, основанные на
строгой математике. Например, существует целая теория, которая доказывает, что
отсортировать массив данных, просто сравнивая элементы друг с другом, быстрее,
чем за определенное количество операций (условные N*logN), в принципе
невозможно. И прежде чем знатоки в комментариях вспомнят про поразрядную
сортировку, сразу оговоримся: да, есть узкоспециализированные методы для особых
данных, которые могут быть быстрее. Но для общего случая — это фундаментальный
предел. Такой же непреодолимый в своей области, как скорость света в физике. Вы
можете изобретать сколько угодно велосипедов, но быстрее этого предела не
прыгнете.
Или взять CAP-теорему, которую знает любой разработчик
высоконагруженных систем. Она гласит, что любая распределенная система (вроде
соцсети или банковского приложения) может одновременно гарантировать только два
из трех свойств: согласованность данных, доступность сервиса и устойчивость к
сбоям. Все три вместе — никогда. И когда инженеры проектируют какой-нибудь
Amazon, они не гадают на кофейной гуще, а делают осознанный выбор, чем
пожертвовать, опираясь на эту доказанную теорему.
А уж про булеву алгебру и говорить нечего. Это фундамент, на
котором стоит вообще всё. Каждое условие if в программе, каждая проверка в
цикле while на самом низком уровне превращается в простейшие операции «И», «ИЛИ»,
«НЕ». Вся логика работы любого процессора — это чистая математика, без которой
ни один транзистор не поймет, что ему делать.
Простая аналогия: хороший каменщик не пересчитывает сопромат
для каждого кирпича. Но если он построит стену, нарушив законы физики, она
рухнет. Точно так же и программист: он не доказывает теоремы каждый день. Но
вся его работа стоит на фундаменте Computer Science, и если он этот фундамент
игнорирует, его «стена» из кода рано или поздно тоже рухнет.

Чистая, прикладная, инженерная. Раскладываем по полочкам
Главная путаница возникает из-за того, что слово «наука» —
одно, а суть у него разная. Давайте на простом примере.
-
Чистая (фундаментальная) наука: физик открывает законы
термодинамики. Ему все равно, где они будут применяться. Он познает мир.
-
Прикладная наука: инженер-теплотехник на основе этих законов
разрабатывает принципы работы двигателя внутреннего сгорания. Он ищет способ
применить знания.
-
Инженерия: инженер-конструктор на заводе проектирует
конкретный двигатель для конкретной модели автомобиля, чтобы он был мощным,
надежным и влезал под капот. Он решает практическую задачу.
Теперь перенесем эту модель на нашу тему:
-
Чистая наука: математик доказывает теорему о пределах
вычислимости.
-
Прикладная наука (Computer Science/Информатика): ученый на
основе этой теоремы разрабатывает универсальные алгоритмы, структуры данных и
методы программирования.
-
Инженерия (Программирование): инженер-программист, используя
эти алгоритмы и методы, пишет код для конкретной задачи — мобильного
приложения, сайта или системы управления станком.
Так вот, программирование в его повседневном виде является
по своей сути инженерной дисциплиной. А вот информатика (Computer Science) —
это прикладная наука, на которой эта инженерия базируется. Сравнивать
программирование с физикой — это то же самое, что сравнивать работу
конструктора на АвтоВАЗе с исследованиями Стивена Хокинга. И то, и другое —
сложнейшая интеллектуальная деятельность, но цели и методы у них разные.
«Постойте, — скажет тут самый упрямый скептик, — если есть
наука, то где ученые? Не бывает же докторов программистских наук!» А вот тут он
ошибется.
В государственной номенклатуре научных специальностей есть целый
раздел, посвященный компьютерным наукам. Существуют официальные направления
вроде «Искусственный интеллект и машинное обучение» или «Математическое и
программное обеспечение вычислительных систем». Именно по ним люди защищают
диссертации и становятся кандидатами и докторами технических или
физико-математических наук. Так что «ученый в области информатики» не выдумка,
а реальность, подтвержденная государством.

Так наука или ремесло?
Сама постановка вопроса — ловушка. Это как спорить, чем
является стройка — тасканием кирпичей или сопроматом? И тем, и другим. Можно научиться месить раствор и класть кирпич.
Собрать из этого сарай на глазок — вполне себе ремесло, и в нем нет ничего
зазорного. Но чтобы этот сарай не поплыл по весне, нужны уже базовые знания о
грунтах и нагрузках. А чтобы построить мост, по которому без опаски поедут
поезда, нужно быть инженером, досконально знающим тот самый сопромат.
С программированием история ровно та же. Склепать
код, который кое-как решает задачу здесь и сейчас, — это уровень ремесленника.
Спроектировать и построить систему, которая не рухнет завтра под нагрузкой,
которую смогут развивать другие люди, и которую не придется выкинуть на свалку
через год, — вот это уже задача для инженера.
И весь тот научный фундамент, о котором мы говорили,
вся эта математика, теория алгоритмов и структуры данных — это и есть тот самый
«сопромат» для программиста. Именно он отличает надежную конструкцию, которая
простоит годы, от сарая, который рискует завалиться после первого же сильного
дождя.
Изображение в превью: