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





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