Для чего программисту нужно знать физику?
Оценить 2 комментария
Примерно затем же, зачем нужно знать историю России или экологию.
Для общего развития.
То, что это вам пригодится в профессиональной деятельности, очень маловероятно.
jkotkot: сколько мне лет? Потом спросите, кого я предпочитаю в постели?
у меня давно законченное ВО. Только вот ни разу не пригодилось ничего, кроме различных областей математики (причем самых основ этих предметов). А последние предметы, связанные с ней, у меня были на третьем курсе.
И изучить эти основы спокойно можно и дома ученику последних классов школы, купив в книжном магазине какой-нибудь конспект лекций.
jkotkot: то, что вы называете «быдлокодером», программисты называют «профессионал». Потому что знает свое дело, а не понахватался везде понемногу, и ничего не умеет.
> что вы никогда не сталкивались с программированием железок вообще никак.
Сталкивался, с AVR. Написал пару игр (в том числе и тетрис), использовал только экран и кнопки (не ардуиновские шилды). Решил, что мне не нравится, и я не хочу развиваться дальше в этом направлении.
Для чего нужна физика в программировании
Многие старшеклассники наивно полагают, что программирование — это лишь углубленное знание информатики, специальных языков и алгоритмов, но ведь на самом деле работа в этой сфере требует решения задач из абсолютно разных областей знаний. Как программисту помогает физика, биология и просмотр советских мультиков, а также о нюансах поступления в Институт системной и программной инженерии и информационных технологий (СПИНТех) МИЭТ нам рассказал кандидат технических наук, доцент СПИНТеха Алексей Роальдович Фёдоров.
— У Института СПИНТех вот уже несколько лет самый высокий проходной балл. Почему, как вы думаете?
— Оглянитесь вокруг. Просмотрите в свою сумочку. Почти половина предметов вокруг нас так или иначе связаны с электроникой и программированием. Начнем с самого дорогого, с чем не расстаются даже дети — смартфон, то есть «умный» телефон. Умным его делают программы. Это и Интернет, различные приложения, игры, платежные системы. Кстати, в вопросах платежей на кассе в магазине с помощью смартфона мы обогнали США. Там у вас это не получится сделать. Ну и далее — ключи от замка в подъезд, телевизоры, системы «умный дом», автомобили, автобусы, табло на автобусных остановках… И для всего этого надо разрабатывать алгоритмы и писать программы.
Разнообразие задач подразумевает многогранность подходов к их решению. Например, создать сайт из конструктора, взятого в Интернете, может даже школьник. Но этот сайт не будет нормально работать при большом количестве пользователей, не будет безопасным и т. п. Здесь уже нужны специальные знания, которые входят в образовательную программу СПИНТех. Без знания математики, теории алгоритмов невозможно создать что-то действительно сложное и полезное. Кстати, олимпийский принцип «быстрее, выше, сильнее», полностью соответствует решаемым в программировании задачам.
— В этом году у вас новшество — можно поступать не с физикой, а с информатикой. Это на какое направление подготовки?
— Да, это так: на образовательную программу «Программные компоненты информационных систем». Программа отличается прикладной направленностью, так как изначально предназначалась для обучающихся из стран ближнего и дальнего зарубежья, подготовка которых в области физики оставляет желать лучшего. В связи с пандемией приток иностранцев ослаб, а востребованность программистов только возрастает, вот мы и предоставили абитуриентам еще одну «лазейку»… Но не забывайте — студенты этой программы, как и программы направления «Прикладная информатика» не обеспечиваются общежитием. Прием на бюджет в этом году окончен, но до 15 сентября продолжается прием на контрактную форму обучения.
— А зачем вообще физика программисту?
— Я бы сказал, что программисту нужны не только физика, но и биология и история. Да и вообще все предметы, которые изучаются в школе. В том числе и литература и русский язык. Скажу больше: даже советские и российские мультфильмы нужны. Все это делает гибким мышление, способствует умению абстрактно мыслить, и как следствие находить новые подходы к решению различных сложных задач. А широкий кругозор помогает понимать постановку задач из разных областей знаний, а ведь заказчиком разработки могут быть и физики и лирики, и медики и биологи… Без базовых знаний в различных областях заказчик и программист не смогут понять друг друга.
— Какие языки программирования к моменту окончания обучения знают ваши выпускники?
— Это не совсем корректный вопрос. Институт СПИНТех создан на основе кафедры информатики и программного обеспечения вычислительных систем (ИПОВС) факультета Микроприборов и технической кибернетики (МПиТК) и двух кафедр факультета Прикладной информатики (ПРиТ) — кафедры корпоративных информационных технологий и систем (КИТиС) и кафедры системной среды качества (ССК). Программы обучения соответственно отличаются. Отличаются и языки программирования. Для профиля бакалавриата 09.03.04 Программная инженерия: С#; Python, Java. Для профиля 09.03.03 Прикладная информатика — C++, С#.
Но, как вы понимаете, это, как в фигурном катании, «обязательная программа». Бывает и «произвольная», но это в рамках факультативов и работы на профильных предприятиях.
— Вы сами не только преподаете, но и занимаетесь практикой магистрантов. Расскажите, с какими компаниями сотрудничает СПИНТех? Где проходят практику ребята?
— На сегодня у Института СПИНТех заключены договоры на прохождение студентами практики более чем с 30 компаниями. Наши основные научно-образовательные партнеры: АО «НПЦ ЭЛВИС» — обработка изображений для современных систем слежения; ЗАО НТЦ «ЭЛИНС» — разработка интеллектуальных микроэлектронных систем; ООО «АНКАД» — разработка современных средств защиты от кибератак и т. п.; Институт программных систем Российской академии наук (ИПС РАН) — суперкомпьютерные и параллельные вычисления, нейросети, аналитическая работа с большими данными; ООО «КомпНет» — программные средства глобальных сетей; ООО «Гринсайт» — заказные интернет- и веб-разработки.
Хочу особо отметить — мы не ограничиваемся каким-либо фиксированным списком предприятий. Мы не возражаем и даже приветствуем, если студенты самостоятельно находят профильное предприятие. И если это предприятие соответствует требованиям МИЭТ, то мы как правило заключаем с ним официальный договор. Кстати, договор определяет права и обязанности предприятия, и МИЭТ имеет право проверить, соответствует ли заявленная тематика реально выполняемой студентом работе.
— А часто практика студентов становится основным местом работы?
— Официальную статистику мы не ведем, но по ощущениям примерно в 25% случаев студенты после окончания МИЭТ работают как раз на предприятиях, где проходили практику. Практику студенты проходят на 4-ом курсе. Но некоторые компании (например, АО «Системы управления») приглашают студентов уже начиная с 3-го курса и продолжают с ними сотрудничать и в магистратуре. Конкретные фамилии студентов, оставшихся работать на местах практики, я назвать вам не смогу — это подпадает под закон о персональных данных. Но мы, СПИНТех, знаем этих людей и даже с некоторыми сотрудничаем — уже они приглашают наших студентов на практику на свои предприятия.
— Каким вы видите будущее программирования в России? Чего нам не хватает в этой области сегодня, на ваш взгляд?
— Молодые программисты, в том числе и выпускники СПИНТех, сегодня хорошо подготовлены и мотивированы на успех. Число областей применимости программных технологий постоянно растет. Появляются совершенно неожиданные и очень интересные и перспективные задачи, поэтому, на мой взгляд, эта профессия будет востребована всегда. А не хватает, опять же на мой взгляд, возврата к советской системе образования как в средней, так и в высшей школе и полного отказа от бакалавриата и магистратуры, ибо бакалавр — это недоинженер и даже не соответствует уровню советского техникума, магистр — недокандидат наук. А ЕГЭ — вообще убийца интеллекта.
— Жизнь можно запрограммировать?
— Запрограммировать можно все, для чего существует алгоритм. Алгоритм основывается на некоей модели, действующей в системе ограничений. Собственно жизнь человека тоже протекает в рамках модели (внутренней — задаваемой личностью, и внешней — задаваемой окружающей средой). И да, СПИНТех может в какой-то мере поспособствовать созданию эффективно работающей «программы» жизни — с минимумом «багов» для всех своих выпускников.
Беседовала Ирина Дорон ина
Почему физики всё ещё используют Fortran
Не знаю, как будет выглядеть язык программирования в 2000-м году, но я знаю, что называться он будет FORTRAN.
— Чарльз Энтони Ричард Хоар, ок. 1982
В индустрии Fortran сегодня используется редко – в одном из списков популярных языков он оказался на 28-м месте. Но Fortran всё ещё главный язык для крупномасштабных симуляций физических систем – то есть для таких вещей, как астрофизическое моделирование звёзд и галактик (напр. Flash), крупномасштабной молекулярной динамики, коды подсчёта электронных структур (SIESTA), климатические модели, и т.п. В области высокопроизводительных вычислений, подмножеством которых являются крупномасштабные числовые симуляции, сегодня используются лишь два языка – C/C++ и «современный Fortran» (Fortran 90/95/03/08). Популярные библиотеки Open MPI для распараллеливания кода были разработаны для двух этих языков. В общем, если вам нужен быстрый код, работающий на нескольких процессорах, у вас есть только два варианта. В современном Fortran есть такая особенность, как «coarray», позволяющая прямо в языке работать с параллельным программированием. Coarray появились в расширении Fortran 95, а затем были включены в Fortran 2008.
Активное использование Fortran физиками часто приводит в замешательство специалистов по информатике и других не связанных с этой областью людей, которым кажется, что Fortran – исторический анахронизм.
Я хотел бы объяснить, почему Fortran всё ещё остаётся полезным. Я не призываю изучающих физику студентов учить Fortran – поскольку большинство из них будут заниматься исследованиями, им лучше заняться изучением C/C++ (или остановиться на Matlab/Octave/Python). Я хотел бы пояснить, почему Fortran всё ещё используется, и доказать, что это не только из-за того, что физики «отстают от моды» (хотя иногда это так и есть – в прошлом году я видел студента-физика, работавшего с кодом Fortran 77, при этом ни он, ни его руководитель ничего не слышали про Fortran 90). Специалисты по информатике должны рассматривать преобладание Fortran в числовых вычислениях как вызов.
Перед тем, как углубиться в тему, я хочу обсудить историю, поскольку, когда люди слышат слово «Fortran», они сразу представляют себе перфокарты и код с пронумерованными строками. Первая спецификация Fortran была написана в 1954 году. Ранний Fortran (тогда его название писалось заглавными буквами, FORTRAN), был, по современным меркам, адским языком, но это был невероятный шаг вперёд от предыдущего программирования на ассемблере. На FORTRAN часто программировали при помощи перфокарт, как об этом без удовольствия вспоминает профессор Мириам Форман из университета Стони Брук. У Fortran было много версий, самые известные из которых – стандарты 66, 77, 90, 95, 03 и 08.
Часто говорят, что Fortran до сих пор используют из-за его скорости. Но самый ли он быстрый? На сайте benchmarksgame.alioth.debian.org есть сравнение C и Fortran в нескольких тестах среди многих языков. В большинстве случаев Fortran и C/C++ оказываются самыми быстрыми. Любимый программистами Python часто отстаёт в скорости в 100 раз, но это в порядке вещей для интерпретируемого кода. Python не подходит для сложных числовых вычислений, но хорошо подходит для другого. Что интересно, C/C++ выигрывает у Fortran во всех тестах, кроме двух, хотя в целом по результатам они мало отличаются. Тесты, где Fortran выигрывает, наиболее «физические» – это симуляция системы из n тел и расчёт спектра. Результаты зависят от количества ядер процессора, например, Fortran немного отстаёт от C/C++ на четырёхъядерном. Тесты, в которых Fortran сильно отстаёт от C/C++, большую часть времени занимаются чтением и записью данных, и в этом отношении медлительность Fortran известна.
Так что, C/C++ настолько же быстрый, насколько Fortran, а иногда и немного быстрее. Нас интересует, «почему профессора физики продолжают советовать своим студентам использовать Fortran вместо C/C++?»
У Fortran есть унаследованный код
Благодаря долгой истории Fortran, неудивительно, что на нём написаны горы кода по физике. Физики стараются минимизировать время на программирование, поэтому, если они найдут более ранний код, они будут его использовать. Даже если старый код неудобочитаемый, плохо документированный и не самый эффективный, чаще использовать старый проверенный, чем писать новый. Задача физиков – не писать код, они пытаются понять природу реальности. У профессоров унаследованный код всегда под рукой (часто этот код они сами и писали десятилетия назад), и они передают его своим студентам. Это сохраняет их время и удаляет неопределённости из процесса устранения ошибок.
Студентам-физикам изучать Fortran легче, чем C/C++
Я думаю, что изучать Fortran легче, чем C/C++. Fortran 90 и C очень похожи, но на Fortran писать проще. C – язык сравнительно примитивный, поэтому физики, избирающие себе C/C++, занимаются объектно-ориентированным программированием. ООП может быть полезным, особенно в крупных программных проектах, но изучать его гораздо дольше. Нужно изучать такие абстракции, как классы и наследование. Парадигма ООП очень отличается от процедурной, используемой в Fortran. Fortran основан на простейшей процедурной парадигме, более приближенной к тому, что происходит у компьютера «под капотом». Когда вы оптимизируете/векторизуете код для увеличения скорости, с процедурной парадигмой легче работать. Физики обычно понимают, как работают компьютеры, и мыслят в терминах физических процессов, например, передачи данных с диска в RAM, а из RAM в кэш процессора. Они отличаются от математиков, предпочитающих размышлять в терминах абстрактных функций и логики. Также это мышление отличается от объектно-ориентированного. Оптимизация ООП-кода более сложна с моей точки зрения, чем процедурного. Объекты – очень громоздкие структуры по сравнению со структурами данных, предпочитаемыми физиками: массивами.
Лёгкость первая: работа Fortran с массивами
Массивы, или, как их зовут физики, матрицы, находятся в сердце всех физических вычислений. В Fortran 90+ можно найти много возможностей для работы с ними, схожих с APL и Matlab/Octave. Массивы можно копировать, умножать на скаляр, перемножать между собой очень интуитивным образом:
Здесь, A, B, C – массивы некоторой размерности (допустим, 10x10x10). C = A*B даёт нам поэлементное перемножение матриц, если A и B одного размера. Для матричного умножения используется C = matmul(A,B). Почти все внутренние функции Fortran (Sin(), Exp(), Abs(), Floor(), и т.д.) принимают массивы в качестве аргументов, что приводит к простому и чистому коду. Похожего кода в C/C++ просто нет. В базовой реализации C/C++ простое копирование массива требует прогона for циклов по всем элементам или вызова библиотечной функции. Если скормить массив не той библиотечной функции в С, произойдёт ошибка. Необходимость использования библиотек вместо внутренних функций означает, что итоговый код не будет чистым и переносимым, или лёгким в изучении.
В Fortran доступ к элементам массива работает через простой синтаксис A[x,y,z], когда в C/C++ нужно писать A[x][y][z]. Элементы массивов начинаются с 1, что соответствует представлениям физиков о матрицах, а в массивах C/C++ нумерация начинается с нуля. Вот ещё несколько функций для работы с массивами в Fortran.
Сначала создаётся вектор A через подразумеваемый цикл do, также известный, как конструктор массивов. Затем создаётся вектор B, состоящий из каждого 10-го элемента А, при помощи шага в 10. И, наконец, массив B копируется в массив С, начиная с 10-го элемента. Fortran поддерживает объявления массивов с нулевыми или отрицательными индексами:
Отрицательный индекс сначала выглядит глупо, но я слышал об их полезности – например, представьте, что это дополнительная область для размещения каких-либо пояснений. Fortran также поддерживает векторные индексы. Например, можно передать элементы 1,5 и 7 из массива A размерностью N x 1 в массив B размерностью 3 x 1:
Fortran поддерживает маски массивов во всех внутренних функциях. К примеру, если нам нужно посчитать логарифм всех элементов матрицы, больших нуля, мы используем:
Или мы можем в одну строку обнулить все отрицательные элементы массива:
В Fortran легко динамически размещать и освобождать массивы. К примеру, для размещения двумерного массива:
Для освобождения массива в Fortran
Лёгкость вторая: не нужно беспокоиться об указателях и выделении памяти
В языках вроде C/C++ все переменные передаются по значению, за исключением массивов, передающихся по ссылке. Но во многих случаях передача массива по значению имеет больше смысла. Например, пусть данные состоят из позиций 100 молекул в разные периоды времени. Нам необходимо анализировать движение одной молекулы. Мы берём срез массива (подмассив) соответствующий координатам атомов в этой молекуле и передаём его в функцию. В ней мы будем заниматься сложным анализом переданного подмассива. Если бы мы передавали его по ссылке, переданные данные не располагались бы в памяти подряд. Из-за особенностей доступа к памяти работа с таким массивом была бы медленной. Если же мы передадим его по значению, мы создадим в памяти новый массив, расположенный подряд. К радости физиков, компилятор берёт на себя всю грязную работу по оптимизации памяти.
В Fortran переменные обычно передаются по ссылке, а не по значению. Под капотом компилятор Fortran автоматически оптимизирует их передачу для повышения эффективности. С точки зрения профессора в области оптимизации использования памяти компилятору стоит доверять больше, чем студенту! В результате физики редко используют указатели, хотя в Fortran-90+ они есть.
Ещё несколько примеров отличий Fortran и C
В Fortran есть несколько возможностей для управления компилятором при поиске ошибок и оптимизации. Ошибки в коде можно отловить на этапе компиляции, а не при выполнении. К примеру, любую переменную можно объявить как параметр, то есть константу.
Если параметр в коде меняется, компилятор возвращает ошибку. В С это называется const
Проблема в том, что const real отличается от простого real. Если функция, принимающая real, получит const real, она вернёт ошибку. Легко представить, как это может привести к проблемам функциональной совместимости в коде.
В Fortran также есть спецификация intent, сообщающая компилятору, является ли передаваемый в функцию аргумент входным, выходным, или одновременно входным и выходным параметром. Это помогает компилятору оптимизировать код и увеличивает его читаемость и надёжность.
В Fortran есть и другие особенности, используемые с разной частотой. К примеру, в Fortran 95 есть возможность объявлять функции с модификатором pure [чистый]. У такой функции нет побочных эффектов – она меняет только свои аргументы, и не меняет глобальные переменные. Особым случаем такой функции служит функция elemental, которая принимает и возвращает скаляры. Она используется для обработки элементов массива. Информация о том, что функция pure или elemental, позволяет компилятору проводить дополнительную оптимизацию, особенно при распараллеливании кода.
Чего ждать в будущем?
В научных подсчётах Fortran остаётся основным языком, и в ближайшее время исчезать не собирается. На опросе среди использующих этот язык посетителей конференции «2014 Supercomputing Convention» 100% из них сказали, что собираются использовать его в ближайшие 5 лет. Из опроса также следует, что 90% использовали смесь из Fortran и C. Предвидя увеличение смешивания этих языков, создатели спецификации Fortran 2015 включают в неё больше возможностей для функциональной совместимости кода. Код Fortran всё чаще вызывается из кода на Python. Специалисты по информатике, критикующие использование Fortran, не понимают, что этот язык остаётся уникально приспособленным для того, в честь чего он был назван — FOrmula TRANslation, перевода формул, то есть, преобразования физических формул в код. Многие из них не догадываются, что язык развивается и постоянно включает всё новые возможности.
Называть современный Fortran 90+ старым, это всё равно, что называть старым C++, из-за того, что C разработали в 1973. С другой стороны, даже в самом новом стандарте Fortran 2008 существует обратная совместимость с Fortran 77 и большей частью Fortran 66. Поэтому разработка языка сопряжена с определёнными трудностями. Недавно исследователи из MIT решили преодолеть эти трудности, разработав с нуля язык для HPC по имени Julia, впервые вышедший в 2012 году. Займет ли Julia место Fortran, ещё предстоит увидеть. В любом случае, подозреваю, что это будет происходить очень долго.
Зачем программистам изучать физику
Многие люди, обучающиеся профессии программиста, искренне не понимают, зачем им нужно изучать такие дисциплины, как физика и математика. В одной из статей мы выяснили, что математика учит думать. Теперь давайте обсудим, зачем люди технических специальностей изучают физику.
Работа, связанная с физикой
Будущая работа программиста может быть связана с физикой напрямую. Допустим, в ваши задачи будет входить создание симулятора корабля, интерпретация данных, полученных от медицинского оборудования, или же разработка реалистичных компьютерных игр.
Если взять последнее направление, то применений физики можно найти огромное количество:
С первым пунктом всё более-менее понятно.
Умение строить модели
Если в математике всё всегда предельно строго (попробуйте выкинуть уравнение из системы!), то в физике человек зачастую работает с неким упрощением — моделью реальной системы. В некоторых случаях можно считать объект идеально упругим (в реальном макромире таковых нет), где-то можно пренебречь силой трения, в другой ситуации несущественной окажется сила Кориолиса.
Именно физика учит построению моделей объектов реального мира, записи их на строгом математическом языке, учит выделять главное и отбрасывать несущественное.
Для профессии программиста такой навык жизненно необходим, ведь работать с моделями приходится практически в любой сфере деятельности, начиная с поисковых систем и заканчивая банковским сектором.
Общее развитие
Знать, почему и при какой температуре закипает вода, почему скользят лыжи по снегу и почему выстреливает пробка из бутылки шампанского, должен любой образованный человек. Но если вы — представитель технической профессии, можете быть уверены, что окружающие будут ожидать от вас более глубоких познаний в области физики.
В некоторых жизненных ситуациях, человек, знающий, а главное понимающий физику, может находить простые решения сложных, на первый взгляд, проблем. А таких ситуаций жизнь активному человеку подкидывает великое множество.
В заключение
Незнакомое и непонятное всегда пугает человека. Древние люди считали, что гром и молния — это гнев богов, а сегодня, благодаря физике, эти явления сможет объяснить даже семиклассник.
Изучение математики и физики позволяет открыть для себя гармонию окружающего нас мира и даёт возможность восхищаться его красотой, вместо того, чтобы бояться и списывать всё на суеверия. На мой взгляд, это один из ценных подарков, которые дарит людям современная цивилизация.
***
Статья написана при поддержке физического сайта kalser.ru, где вы найдёте множество интересных материалов по физике: советы по решению задач, описания и демонстрации физических опытов, афоризмы и крылатые фразы из мира физики, выдержки из книг и учебников.