Что такое программная инженерия. Лекция в Яндексе

в 12:14, , рубрики: Анализ и проектирование систем, Блог компании Яндекс, инженерия, инженерные решения, Программирование, Проектирование и рефакторинг, Промышленное программирование, Софт, теория, теория программирования, теория программной инженерии

Кандидат технических наук МИЭМ, заместитель руководителя департамента программной инженерии факультета компьютерных наук НИУ ВШЭ и заместитель завкафедрой системного программирования ИСП РАН Ефим Гринкруг даёт свой ответ на вопрос о том, что такое программная инженерия.

Этому термину уже почти 50 лет — впервые его начали использовать в 1968 году. Дело в том, что именно тогда методы классической инженерии — например, разбиение на отдельные компоненты — стали всерьёз применяться в создании софта. Но почему они не применялись раньше, и какой новый смысл приобрело выражение «программная инженерия» в последние десятилетия?

Под катом — подробная расшифровка и слайды.

Итак, разрешите представиться. Меня зовут Ефим Гринкруг, я профессор Департамента программной инженерии Высшей школы экономики, там новый факультет, организованный с участием Яндекса. Вы, наверное, знаете — факультет компьютерных наук. Там есть три департамента, один из них — Департамент программной инженерии. Одновременно с этого года я являюсь заместителем заведующего кафедры системного программирования. Это базовая кафедра, которая у нас открыта с этого сентября, и что это такое, я вам тоже немножко сегодня расскажу.

Что такое программная инженерия. Лекция в Яндексе - 1

Вы видите этот слайд, который показывает, что я в 1968 году закончил физико-математическую школу № 444. Среди вас есть кто-нибудь оттуда? Это лицей № 444 в Измайлово, 13-я Парковая. Я там был две недели назад, он еще оставался. Это была первая физико-математическая спецшкола в Москве, которая вместо столярного и слесарного дела в 1959 году, задолго до того, как я там учился, ввела уроки программирования. До этого все строгали табуретки. И когда я получал аттестат, вместе с аттестатом зрелости в школе я получил такую бумажку — свидетельство о присвоении квалификации, где написано, что мне присвоена квалификация «вычислитель-программист 3-го разряда». В те времена рабочие профессии были от 1-го до 6-го разряда, 6-й был самый крутой. Третий разряд получали те, у кого пятерка по программированию, второй разряд — четверка, троечников- перворазрядников у нас не было. И так получилось, что в 1968 году я столкнулся со словом «программирование» в первый раз. Почему в 1968-м? Потому что я пришел в эту школу не с самого начала, а с середины девятого класса, предпоследнего в те времена. И когда я туда пришел, потому что старые районы Москвы стали сноситься и школы закрывались, а я ходил в университет на мехмат в математический кружок, мне посоветовали пойти в эту школу в середине 9-го класса, потому что преподавателю было интересно, смогу я догнать там или нет. Нас таких было трое из этого кружка. Я пришел туда, и через неделю где-то выяснилось, что какая-то полугодовая контрольная по программированию. Я, конечно, ни сном ни духом. Мне дали учебник, я честно прочитал половину этого учебника за пару вечеров, и потом нужно было написать программу. И программа представляла собой некий двойной ложный цикл. Нужно было успеть за 45 минут что-то такое двойным циклом изобразить, причем на языке, как теперь сказали бы, ассемблера. Я успел прочитать только половину команд, которые бывают в этой машине, оператор цикла до меня не дошел, он был в другой половине, и мне пришлось ухитриться сделать двойной цикл, пользуясь условным переходом, больше ничем. Вы, наверное, представляете, как это можно соорудить теперь. Парадокс был в том, что оценку «пять» за контрольную получили в классе двое: один мальчик, который там учился с самого начала и который был победителем всех мыслимых олимпиад всегда, и ваш покорный слуга, просто потому, что у нас двоих программа работала, а у остальных примерно тридцати пяти учащихся все было очень хорошо с циклами, но не работало. И с тех пор я проникся очень твердо идеей о том, что в программировании ничего серьезного нет. Если человек напряжется и за два дня может превозмочь то, что проходили два года до этого, и получить пятерку, не делая ничего и ничего не зная, то никакого серьезного отношения к этому делу вообще быть не может, и все это полная ерунда. Вот математика, физика — это серьезно, а это полная ерунда. И это отношение к делу, к программированию, у меня сохранялось после этого примерно лет шесть, то есть почти до окончания университета (тогда это называлось институтом, но мы об этом еще поговорим).

Что такое программная инженерия. Лекция в Яндексе - 2

Мой первый учебник, который мне дали читать и который я не успел прочесть, назывался «Программирование в содержательных обозначениях». Сразу возник вопрос: а что, бывает программирование в бессодержательных обозначениях? Русский язык в этом смысле очень показателен для перевода программистских терминов, мы еще увидим это. Спустя много лет я скажу: да, иногда бывает. Иногда сознательно, чаще бессознательно. Содержательные обозначения в сравнении с бессодержательными облегчают процесс создания программ, и бессодержательные, соответственно, затрудняют этот процесс. Есть специальные программы, которые называются обфускаторы, которые назло делают обозначение бессодержательным, просто чтобы сократить воровство кода.

Что же такое процесс создания программ? Это и есть тема нашей лекции, это и есть сущность программной инженерии.

Что такое программная инженерия. Лекция в Яндексе - 3

Как и любое производство, производство программ проделало большой путь: от кустарного к промышленному. Что отличает современное производство вообще, не только в программировании, от кустарного? Есть какие-то отличительные признаки. Какие это признаки? Прежде всего, разделение труда. Неслучайно говорят: «кустарь-одиночка». Наверное, какие-то научные результаты привлекаются, что кустарю редко бывает под силу. Еще современные технологии. Чтобы было разделение труда, нужно поддерживать какие-то стандарты. Вы никогда не пробовали воткнуть какой-нибудь разъем туда, куда он не втыкается? Значит, нужно поддерживать какие-то профессиональные стандарты. Что еще?

— Результат.

— Это правильно. Качество результата. А откуда оно берется? И вообще, на что оно влияет? И почему, как вы думаете, я пришел сюда из Высшей школы экономики, где есть новый факультет компьютерных наук? Потому что, как на днях в газете «Ведомости» писал Анатолий Карачинский, президент компании IBS, большого российского холдинга, который компьютеризирует все на свете (в этот холдинг входит также компания Luxoft, это едва ли не единственная в стране компания, которая имеет сертификат качества высшего уровня в мире по производству программного обеспечения), экономика Индии, например, получает почти в два раза больше от экспорта ПО, чем Россия от экспорта нефти и газа (это в цифрах). Поэтому серьезная разработка программ и вы как будущие серьезные разработчики программ — это, наверное, и есть национальное достояние.

Что такое программная инженерия. Лекция в Яндексе - 4

Что же такое программная инженерия? А что такое вообще инженерия? Если полезть в «Википедию», как все любят делать первым делом, вы там прочтете, что это приложение систематического дисциплинированного подхода к развитию, функционированию, сопровождению ПО, а также исследованию всего перечисленного, чтобы это сделать лучше. «Инженерия» вообще от французского слова «изловчиться» — это такая область технической деятельности, которая направлена на практическое применение знаний. Мы в конце с вами немножко обсудим, чем же компьютерные науки отличаются или как они соотносятся с программной инженерией. Примерно так же, как любые другие науки соотносятся с инженерией. Инженерия вообще — это наука?

Кораблестроение — это наука? Да, академик Крылов делал какие-то достижения в кораблестроении. Это наука? Что там есть кроме закона Архимеда? То есть наука бывает разная: бывает наука теоретическая, бывает наука практическая, инженерная и так далее.

Программная инженерия — это деятельность, связанная с производством и поддержанием ПО.

Что такое программная инженерия. Лекция в Яндексе - 5

Откуда взялся этот термин и почему я решил начинать свой рассказ с 1968 года? Потому что в 1968 году впервые в истории этот термин стали использовать. Была конференция, которую спонсировало НАТО, в германском городе Гармиш-Партенкирхене, где потом проводилась зимняя Олимпиада, там собралось 50 крупнейших специалистов со всего западного мира, и они попытались ответить на вопрос, который к тому времени — к 1968 году — уже назрел очень остро, а именно: «Как делать программы так, чтобы они были надежные, вовремя и так далее?» К тому времени в 1968 году я окончил эту самую 444-ю школу и поступил на первый курс МИЭМ (тогда это был Московский институт электронного машиностроения, как когда-то отколовшийся от Вычислительного факультета МИФИ, а теперь он стал отделением (или кампусом, как у нас принято говорить) Высшей школы экономики). Таким образом получилось, что с 1968 года я, не имея особого влечения к этой деятельности, оказался в профессиональном смысле ровесником программной инженерии.

Что такое программная инженерия. Лекция в Яндексе - 6

Когда я учился в школе, там стояла одна из первых вычислительных машин, называлась она «Урал-1». К сожалению, уже очень давно закрыт на ремонт Политехнический музей, и всю его экспозицию раскидали по каким-то углам. На самом деле, там довольно интересный был представлен ряд отечественных вычислительных машин. Отличникам давали попрограммировать на «БЭСМ-4» тогда, неотличникам — на «БЭСМ-3» и этом самом «Урале». Это ламповая машина. А вот фотография школы.

Кто ее разрабатывал? Тут было написано, что их было сделано всего 183 штуки, и одним из разработчиков был Юдицкий Давлет Исламович, который потом стал одним из основателей города Зеленограда. Зеленоград — это была попытка сделать «Силиконовую долину» под Москвой. Он известен тем, что был одним из разработчиков нетрадиционных арифметических устройств, которые считали в остаточных классах. Это такая арифметика, у которой нет единиц переноса, поэтому она работает очень быстро. Эта линия как-то увяла, потому что потом из этого представления числа, которое годится для такой быстрой арифметики, очень трудно преобразовывать в обычные числа туда-сюда, зато считает замечательно.

Что такое программная инженерия. Лекция в Яндексе - 7

Вот эта машина «Урал-1», когда она еще стояла в Политехническом музее.

Что такое программная инженерия. Лекция в Яндексе - 8

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

Что такое программная инженерия. Лекция в Яндексе - 9

Конференция в Гармиш-Партенкирхене была посвящена тому, что уже в те годы на Западе стало ясно, что писать программы дороже и дольше и более трудоемко, чем делать то железо, на котором они потом работают. И возник вопрос: почему это происходит и как сделать так, чтобы быстро разрабатывать надежные программы?

Темой основного доклада на конференции, которая первый раз озвучила термин «программная инженерия», стал вопрос, как эффективно, экономически выгодно, надежно и качественно разрабатывать ПО индустриальным образом, не кустарным, а промышленным образом? И все корифеи на тот момент признали, что основная и принципиальная разница между железом и программами заключается в том, что в железе разрабатываются компоненты, а программы пишут каждый раз с чистого листа (как правило, так и происходило в те годы). Задались вопросом: «Почему компонентность широко применяется в промышленном производстве аппаратуры и не применяется в достаточной степени в программном обеспечении?»

Что такое программная инженерия. Лекция в Яндексе - 10

А что такое программная компонентность? Есть давно такой термин, появившийся как раз с той конференции — компонентно-ориентированное программирование. О чем это вообще? А это о многом. Это о том, как программировать, как создать большую программную систему, где участвует много разработчиков, как использовать результаты, полученные в такой разработке, для других программных систем, и что вообще считать результатом такой разработки? Как ее отладить, такую большую систему, какими средствами? Как использовать результаты труда других коллективов? Как организовать процесс разработки, в каком порядке это все делать, чтобы это было обозримо? Причем это обозримо должно быть не только для того, кто делает, но и для того, кто деньги платит. И потом, когда эта система уже сделана, как ее развивать? Потому что есть системы, и я очень скоро их увидел, которые работают всегда. И ведь будет катастрофа, если они перестанут это делать. А их надо развивать.

Что такое программная инженерия. Лекция в Яндексе - 11

Значит, хочется чего? Хочется собирать программные изделия так же, как вы в детстве делали это с помощью конструктора Lego.

Что такое программная инженерия. Лекция в Яндексе - 12

То есть взять какой-то готовый набор…

Что такое программная инженерия. Лекция в Яндексе - 13

Может быть, если не хватает, другой прикупить.

Что такое программная инженерия. Лекция в Яндексе - 14

Собрать команду.

Что такое программная инженерия. Лекция в Яндексе - 15

Что такое программная инженерия. Лекция в Яндексе - 16

И строить это дело, как Lego, из типовых готовых компонент.

Что такое программная инженерия. Лекция в Яндексе - 17

Что такое программная инженерия. Лекция в Яндексе - 18

Что такое программная инженерия. Лекция в Яндексе - 19

Что такое программная инженерия. Лекция в Яндексе - 20

Что такое программная инженерия. Лекция в Яндексе - 21

Что такое программная инженерия. Лекция в Яндексе - 22

Что такое программная инженерия. Лекция в Яндексе - 23

Как строят дома, города, машины, из подходящих деталей, но разные, или разрабатывают радиоприемники из всяких стандартных радиокомпонент, как само железо раньше разрабатывали, всякие вычислительные устройства.

Что такое программная инженерия. Лекция в Яндексе - 24

Это, кстати, продукция одной из компаний, в которых я работал потом до сравнительно недавнего времени.

Что такое программная инженерия. Лекция в Яндексе - 25

И как это все делать вообще? Основное содержание этой конференции, 1968 год. Перед вами темы, которые обсуждались тогда. А кто там был? Там были преподаватели, производители как железа, так и программ, там был, в частности, Эдсгер Вибе Дейкстра. Знаете такого?

— Да.

— Чем он знаменит?

— Алгоритмы делал.

— И не один, много. Семафоры Дейкстры, алгоритм Дейкстры. «On-the-Fly Garbage Collection» — классическая статья о том, как математически обосновать параллельную сборку мусора в теперешних платформах — Java, .NET и так далее, — там, где есть на ходу параллельная сборка мусора. Автор — тоже Дейкстра.

Вот основные темы, некоторые из них уже неактуальны. Например, последняя — «Надо ли оценивать Software отдельно от Hardware?». Всерьез обсуждался этот вопрос. Все уже понимают, что такой Hardware, по сравнению с Software, которым он начинен, не стоит вообще ничего.

Что такое программная инженерия. Лекция в Яндексе - 26

И главный доклад был про то, как организовать такое компонентное программирование, чтобы поставить это дело на промышленный поток. Этот вопрос актуален до сих пор, хотя прошло много лет. Это такая парадигма программирования. Что такое парадигма? Подход к программированию, один из многих. Где какие-то программные конструкции можно многократно использовать, единожды написав (в современных объектно-ориентированных языках это обычно классы или совокупности классов) с тем, чтобы их можно было, во-первых, написать хорошо, обязательно переиспользовать, обязательно достигать их безошибочного качества, и потом из качественных компонент собирать качественные изделия. Что для этого надо? Надо ограничить свободу программирования, потому что нужно соблюдать какие-то правила. Правила — это стандарты программирования. И мы тут первый раз переходим от кустарщины к промышленному разговору. Необходимо внедрить производственные стандарты. Это высоко сказано, но какие-то стандартные отношения, потому что стандартизация — это необходимое условие промышленного производства, надежности результата, разделения труда, и отвечает почти на все вопросы, которые хотелось прояснить.

Программные компоненты должны производиться и использоваться в соответствии с определенными стандартами, которые принято называть компонентными моделями. То есть что такое компонент? Компонентная модель — их может быть много разных — отвечает на главный вопрос: что такое компонент и чем он отличается от некомпонента?

Что такое программная инженерия. Лекция в Яндексе - 27

Тут я должен заметить (и вы, наверное, уже сами это почувствовали), что некомпонентного программирования не бывает, и весь разговор идет о том, что считать компонентом.

Что такое программирование? Это процесс принуждения более-менее большого количества железа к какой-то полезной деятельности. Это борьба за то, чтобы машина выполнила то, что вы от нее хотите. Но борьба эта не с машиной, а борьба эта с вами, с самим собой, потому что есть тенденция развести безграничное безобразие, и когда вы что-то делаете, вы боретесь с собой. Бороться с железом абсолютно бессмысленно. Вы боретесь со своим недопониманием, неумением и так далее. И вся эта борьба так или иначе связана с компонентностью, если вдуматься.

Что такое программная инженерия. Лекция в Яндексе - 28

Если посмотреть на историю вычислительной техники, то меня, например, в университете учили программировать на двух видах вычислительных машин: на аналоговых, которых вы, наверное, уже не увидите, скорее всего, никогда, и уже цифровых. Почему не увидите? Потому что вся аналоговая техника начиная с телефона уже перешла на цифру. Тем не менее, изначально аналоговая вычислительная машина представляла собой набор готовых компонент, и здоровенный ящик с проводами перед ней для того, чтобы соединять эти компоненты между собой, и получать такую функцию только на выходе, или напряжение, которое моделирует постановку задачи, решаемой на этой аналоговой машине. Кроме того, сама цифровая машина сделана из электрических элементов, которые так или иначе аналоговые. То есть некая диалектика.

Что такое программная инженерия. Лекция в Яндексе - 29

Слева вы видите сравнительно позднюю аналоговую вычислительную машину, компоненты которой как раз соединены проводами для того, чтобы получилась какая-то желаемая функция, смоделировалась.

А здесь вы видите первую цифровую машину (или одну из самых первых). Я ее когда-то сам сфотографировал в библиотеке Гарвардского университета, называлась она MARK-1. Буква «K» от слова MARK-1 в правом верхнем углу отвалилась. Может быть, сейчас уже приклеили обратно. Вы видите параметры этой машины.

Почему все это важно и почему НАТО за это взялось в первый раз? Потому что вы видите, что это стало развиваться примерно в конце войны, и развиваться это стало не просто так, а потому что надо было бомбу делать, а бомбу надо было моделировать и просчитывать, потому что если бы каждый раз делали натурные испытания бомбы, когда возникал какой-то вопрос, и не применяли бы вычислительную технику для этого, то вполне вероятно, Землю уже раскололи бы пополам давно. Неслучайно Лос-Аламосская национальная лаборатория, которая делала бомбу в Америке, считается одной из основных лабораторий, которая диктовала и диктует всякие суперкомпьютерные, например, оценки. Знаете, 24 ливерморских теста (Ливерморская национальная лаборатория) до сих пор считаются классическими тестами оценки производительности компьютеров.

Что такое программная инженерия. Лекция в Яндексе - 30

Как это все происходит? Как правило, обычная программа, к которой вы привыкли, сперва пишется, создается (разрабатывается, отлаживается), а потом исполняется. Поэтому принято различать всегда две стадии, два этапа: статику до выполнения программы и динамику, когда она выполняется, какие возможности она получает и что она делает в динамике.

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

Что такое программная инженерия. Лекция в Яндексе - 31

В те времена все это было гораздо сложнее. И этой платформой занималась отрасль программирования, которая называлась «системное программирование». На самом деле системное программирование — это основа программирования вообще. Что это такое? Очень часто приходится объяснять экономистам, что такое системное программирование и чем оно отличается от просто программирования. Я уже сказал, что у нас с этого года открыта базовая кафедра Института системного программирования Российской академии наук под руководством академика Иванникова. Академик Иванников знаменит тем, что он руководил разработкой программной системы, которая управляла стыковкой космических кораблей «Аполлон» и «Союз». Слышали об этом? Наверное, слышали благодаря сигаретам, а тогда это было большое достижение.

Экономисты говорят, что бывает два вида продукции в промышленном производстве. Их называют «Производство группы А» и «Производство группы B». Что относится к группе А? Средства производства, а к группе B — в основном предметы потребления.

Что такое программная инженерия. Лекция в Яндексе - 32

Блага, которые предназначены для производства, называются средствами производства или товарами производственного назначения. А то, что непосредственно потребляется — одежда или еда, — это средство, предметы потребления. Бывает так, что один и тот же продукт относится и к средствам производства, и к предметам потребления. Какой-нибудь сахар, когда вы его кладете в чай — это предмет потребления, а когда вы его используете для производства варенья — это средство производства.

Что такое программная инженерия. Лекция в Яндексе - 33

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

— Был.

— Был один, РЕФАЛ назывался. Он был очень теоретический. Рекурсивных функций алгоритмический язык. Он был давно, он не использовался для практического программирования. Я когда-то на семинаре в университете попытался вместе с автором этого языка сложить два целых числа. Мы исписали несколько досок — и не уложились в семинарское время.

Что такое программная инженерия. Лекция в Яндексе - 34

Название «системное программирование» происходит от того, что базовое ПО любого компьютера включает операционную систему (обратите внимание на слово «система») и систему программирования отладки (туда входят компиляторы, отладчики и так далее). Это базовое программное обеспечение разрабатывается системными программистами, и оно и составляет средство производства программ. Поскольку у нас с этим делом беда в последнее время, мы можем сказать, что никакого опережающего развития без этого ожидать не приходится. Мы занимаемся производством программ потребления. Это тоже серьезная область. Они стоят бешеных денег, ровно на них зарабатывает Индия, потому что она тоже не делает операционных систем, как вы понимаете. Но невозможно иметь лидирующие позиции на этом рынке, в этой области науки, если нет производства средств производства программ. Это как на заводе. Я вспоминал вначале, что были шесть градаций рабочих профессий. В токарном цеху самый квалифицированный токарь не занимается производством продукции, он резцы затачивает для всех остальных. Самый квалифицированный программист — это системный программист, который делает инструменты для всех других программистов.

Вот у нас кафедра системного программирования Института системного программирования Академии наук с этого сентября появилась, и для начала где-то 15-20 человек с каждого курса там раз в неделю занимаются, слушают лекции и работают. Это попытка. Эта базовая кафедра не только у нас открыта, она открыта в Физтехе и на ВМК МГУ, они там все вместе перемешиваются. И это попытка передать опыт, чтобы не распалась связь времен в этой области, важнейшей области программирования, если мне удалось это донести до вас.

Что такое программная инженерия. Лекция в Яндексе - 35

Развитие компонентного программирования вообще зависит от архитектуры железа. Даже на голом железе машинный код, были какие-то содержательные обозначения, как писать программу. Не в нулях и единицах же, эта производительность будет равна нулю. Потом появляется автокод, какие-то содержательные обозначения появляются. Потом появляются какие-то процедурные языки, то есть можно воровать целыми процедурами и считать их компонентами. Это будут компоненты, этапы статистической разработки программ. Берете код и делаете cut and paste. Потом вас лишают премии за это. Появляются какие-то языки высокого уровня, более-менее высокого уровня.

Появился язык C. Почему появился язык C? Где-то на рубеже 1973-1974 годов появился язык C, потому что научились быстро делать железо, быстро делать машины, появилась машина PDP-11 в частности, и к тому времени надоело каждый раз писать операционную систему с нуля для разных архитектур.

Появилась идея переиспользовать код. Это тоже компонентность. Главный смысл компонентности — не делать дважды того же самого. Переиспользовать даже не код, а труд. Язык C появился для того и потому, что ядро операционной системы каждый раз переписывать не захотелось. А захотелось иметь основную часть, написанную на компилируемом на любое железо языке, где надо чуть-чуть вставить Assembler. Это главная побудительная причина появления языка C и ядра операционной системы Unix.

Что такое программная инженерия. Лекция в Яндексе - 36

И зимой 1974 года мне так повезло, что я держал бобину с магнитной лентой, которая каким-то образом попала в Курчатовский институт. Обратите внимание, у нас тоже сильные программисты были в институте, занимавшемся вопросами ядерной физики. Это тоже неслучайно. И так мне повезло, что я держал первый компилятор C в руках, потому что в Курчатовском институте собирали команду добровольцев, чтобы ее содрать, эту самую операционную систему Unix, потому что железо уже сдирали. Содранное PDP-11 называлось у нас СМ-3, СМ-4, СМ-5, СМ-6, они соответствовали этой PDP-11. Как выглядела PDP-11 в те времена, вы видите.

Что такое программная инженерия. Лекция в Яндексе - 37

Я в то время уже пошел писать диплом на практику в Институт вычислительных комплексов (как он потом стал называться), а до этого он был филиалом Радиотехнического института Академии наук имени Минца, и заведовал этим филиалом Михаил Александрович Карцев. Вы, наверное, не слышали эту фамилию. Вы слышали фамилии Карцев и Ильченко, а имени Михаила Александровича Карцева вы не слышали, потому что это был довольно секретный главный конструктор отечественных суперкомпьютеров (его иногда называли «советский Крэй»). Он — основатель института. Прошел всю войну и возглавил разработку первых советских компьютеров, наиболее мощных по тем временам. Кроме того, он сам мне показывал книжку на китайском языке, которую написали пара его китайских аспирантов (тогда была большая дружба с Китаем), и он фактически являлся автором архитектуры первой китайской вычислительной машины. Сейчас китайцы поставляют суперкомпьютеры в качестве спонсорского взноса в наши университеты куда-нибудь на Урал и так далее. Карцев был автором первой китайской вычислительной машины.

Что такое программная инженерия. Лекция в Яндексе - 38

Что было сделано в мои времена в этом институте? Был проект, он был начат в 1967 году, вычислительный комплекс М-9 производительностью 1 млрд операций в секунду (по тем временам). Денег на него не дали, и он постепенно обрезался до машины под названием М-10, которая примерно 10 лет, начиная с конца 1970-х годов, была самой мощной советской вычислительной машиной. Она была параллельной и многопроцессорной, и параллелизм этой машины не превзойден нигде по сей день. Когда эта машина прошла испытания, как раз образовался Институт вычислительных комплексов, который потом к 70-летию Карцева (Карцева уже не было в живых) стал носить его имя. Сейчас он находится недалеко от метро Беляево и уже не является никаким институтом. Там, как во многих теперь бывших закрытых институтах, торгуют мебелью, бог знает чем, — это время прошло.

В те времена в академическом Институте проблем управления под руководством профессора Задыхайло из Института прикладной математики имени Келдыша проходили тараканьи бега, как мы называли. Все отечественные и неотечественные компьютеры, которые были в стране, соревновались на какой-то контрольной задаче, кто быстрее ее посчитает. В качестве единицы измерения, как в попугаях, было время расчета этой задачи на БЭСМ-6. БЭСМ-6 — это 48-разрядная машина, поэтому по правилам нужно было считать не хуже, чем БЭСМ-6, то есть с не меньшей точностью. А эта наша М-10 могла перестраивать формат вычислений на ходу, и можно было считать в 16-разрядной арифметике, в 32-разрядной, в 64-разрядной. Нас заставили считать на 64-разрядной, чтобы было не хуже. И эта машина М-10 выиграла у всех и держала этот рекорд примерно десятилетие.

Что такое программная инженерия. Лекция в Яндексе - 39

Вот я вам показываю Радиотехнический институт имени Минца, который до сих пор есть на улице 8 Марта. Весь первый этаж, эти большие стекла, был выставлен, чтобы шкафы от этой машины внести внутрь, потому что никак иначе внести ее туда было невозможно.

Что такое программная инженерия. Лекция в Яндексе - 40

Так выглядит НИИ ВК теперь возле метро Беляево (может быть, проезжали, видели), но там уже нет института.

Что такое программная инженерия. Лекция в Яндексе - 41

И эта самая М-10 в 1974 году предстала передо мною на первом этаже радиотехнического института как куча голого железа без единой команды внутри. И какое-то количество людей пыталось ее зарядить базовым программным обеспечением, системным программным обеспечением. И я туда попал по распределению, и, конечно, я вам рассказывал, что мое пренебрежение к программированию тогда было известно какое. Меня спросили, когда я пришел в первый раз: «Чем бы вы хотели заниматься?», я сказал: «Чем угодно, только не программированием». И мне сказали так: «У нас сейчас горячая пора, у нас там запарка, сроки. Вы помогите месяца три, а потом мы с вами найдем что-нибудь вкусненькое из математики, прикладной математики и так далее». Я поехал помогать. Вот примерно до сих пор и помогаю.

Вы видите здесь всякие слова о том, что качественная архитектура не имеет себе равных до сих пор, потому что Cray — это был наиболее знаменитый американский аналог. Конечно, элементарная база была лучше у Cray, но по количеству вложенных идей М-10 была богаче.

Тут ведь какая картина? Элементной базы нет, а задачу надо решать по сложности большую и такую же, а может быть, и еще более сложную. Как быть? На пальцах это можно себе представить так.

В Америке берут и строят Empire State Building, потому что у них есть замечательное сталелитейное производство, и 100 с лишним этажей эти балки выдержат. Они занимают мало места по площади и имеют какой-то объем.

У нас места много, кирпичи у нас необожженные, но места много. Мы можем этот Empire State Building положить на бок, объем будет такой же, места будет занимать много, и не требуется никакой особой высоколегированной стали. Если положить на бок, там будет всего этажа четыре. Примерно так же выглядели эти все вычислительные супер-ЭВМ, которые здесь показаны на картинке.

Что такое программная инженерия. Лекция в Яндексе - 42

Это общий вид системы М-10 в шкафах. Такие шкафы уходили за горизонт. В этом зале она бы не поместилась. Шкаф, чтобы вы представляли себе масштаб, который подходил к этому шкафу, поднимал вот так руку вверх, и в правом верхнем углу там был тумблер включения питания, то есть каждый шкаф выше меня с поднятой рукой. И вся эта куча железа одновременно должна была работать. По теории вероятности никак не должна была. Военные удивлялись. Естественно, все образцы стояли. Сейчас покажу пару слайдов, зачем это все было.

Что такое программная инженерия. Лекция в Яндексе - 43

Но потом, когда это все заработало, сказали, что на целое поколение специалистов (это 10-15 лет)… Почему мы говорим, что нужно поддерживать, чтобы не распалась связь времен?

Мой возраст и ваш возраст — это 2-3 поколения специалистов.

Что такое программная инженерия. Лекция в Яндексе - 44

Где это использовалось? Вы видите. То, что называют ядерным чемоданчиком, никакого отношения к ядерной реакции не имеет. Этот чемоданчик — просто оконечное устройство системы предупреждения о ракетном нападении. Оно стояло каждый раз у главы государства в шаговой доступности, как говорят, и в положенных местах.

Что такое программная инженерия. Лекция в Яндексе - 45

По периметру страны — это карта — были расположены радиолокационные объекты. Неслучайно вся первая машина оказалась в Радиотехническом институте имени Минца. Они разрабатывали радиочасть этого всего. А эта машина была мозгами всей этой системы. Вы видите, что эти секторы покрывали весь периметр. Скажем, сектор под номером 2 закрывал весь Китай с Индией. Сама станция была из таких зданий (это реальная фотография одной из них, а именно которая под цифрой 1, Печорская Северная). Верхнее здание — 17 этажей вверх, 5 вниз под землю, — и эта наклонная часть — это антенная решетка площадью примерно с футбольное поле. Нижняя часть — это то же самое, только передающая станция. Та приемная, эта передающая. Когда в Казахстане я видел такие же две станции возле озера Балхаш и их включали в опытную эксплуатацию, их налаживали, я думал, во-первых, во всем Казахстане гас свет, а во-вторых, в Балхаше рыба вареная появлялась в непосредственной близости от этого передающего устройства. Это основательная получается СВЧ-печка. Про все это можно прочитать в Интернете. Это просто локатор. С этого локатора в вычислительный комплекс из машин такого рода поступало огромное количество информации в реальном времени, и нужно было по этой информации увидеть, летит что-нибудь сюда вообще или нет. Увидеть, что не летит — хорошо. Если летит, то понять, что летит — все автоматически, — сколько летит, куда летит, и скомандовать тем, кто должен лететь на перехват, что им надо делать. И на все про все есть пара десятков минут.

Что такое программная инженерия. Лекция в Яндексе - 46

Такая система была на этих машинах сделана. При этом, конечно же, нужно было программировать. Архитектура была параллельная, непохожая ни на что. Вы знаете хоть один хороший язык параллельного программирования, уже сейчас? Не 25 лет назад, не 30, а сейчас? Наверное, нет. Есть маленькие попытки внедрить это дело сейчас, довольно скромные. Тогда это работало, потому что никакого выхода не было иначе, иначе невозможно было за те пару десятков минут успеть сделать то, что нужно. И нужно было это делать, имея какое-то базовое программное обеспечение с соответствующим качеством.

Тут мы переходим опять к программной инженерии. Как такое все разрабатывать, кто заказчики? Если вы сейчас откроете учебник по программной инженерии, то там будет написано, что программный инженер начинает свою работу с формулировки требований. Требования он берет, опрашивая заказчика. Для производства предметов потребления, если мы будем использовать экономические термины, то есть для пользовательского программирования, это нормально. Заказчик говорит, что он хочет, программист, программный инженер делает, что он хочет. Когда делается что-то новое, заказчик ничего в этом не понимает. Когда начинается что-то научное, какая-то инновация, не может быть заказчика кроме автора этой инновации. Поэтому, когда делаются действительно инновационные разработки в программировании, никаких заказчиков спрашивать нельзя, их нет.

Вы сами как автор должны придумать, что вы делаете, и сделать это хорошо. Когда вы покажете, что это хорошо, тогда появятся у вас заказчики. К сожалению, всякие разговоры про программную инженерию, списанные с американских учебников, они как-то упускают этот момент.

И опыт накапливался, потому что натыкались на все эти грабли. Сначала сделали то, что просили военные. Понятно, что им нужно сделать — делай раз, делай два. Не работает, работает неоптимально, потому что, не продумав суть, сразу начали делать частности. Провалилась разработка.

Что такое программная инженерия. Лекция в Яндексе - 47

Потом была следующая разработка. Военным нужно было решать одну большую задачу на этой машине, но она должна была крутиться всегда. Это пример непрерывного производства в виртуальном мире. Она должна работать всегда: надежно и так далее. Отдельный разговор, как программный инженер должен потом это все развивать, даже просто ошибки отлаживать в программе, которая работает всегда. Это отдельная тема. Но главное, что получается при этом — пропадает грань между системным программированием и программированием пользовательским. Пользовательское программирование в данном случае — это обработка локационной информации. Она тоже не очень пользовательская и очень важная. Но грань между операционной системой, системным программированием и программированием пользовательским, чисто задача распознавания образов, например, она стирается, потому что нужно успеть. Хорошо яичко к Христову дню. Система должна заработать к тому времени, когда она должна заработать. Поэтому эта грань начинает пропадать, а значит, начинает пропадать надежность. Когда одна подсистема, один модуль, один компонент, пусть большой, становится беззащитным от другого, теряется качество. Это все архитектурные вопросы, которые, кстати, не решены до сих пор, по крайней мере в тех компьютерах, с которыми мы с вами имеем дело. Я сейчас скажу парадоксальную вещь, но операционная система Windows не является системой, а значит, операционной, просто потому, что она не является системой.

Что такое система? Вообще, есть математическая теория систем — быть может, вам когда-то расскажут тут, что это такое, — есть книжки, и есть определение в этом предмете, что такое динамическая система. Динамическая система в отличие от статической системы — это та, которая остается системой, когда она работает во времени. Статические системы изучает, по-видимому, такая наука, как сопромат, потому что от них требуется, чтобы они во времени не менялись. Дом не должен упасть никогда, поэтому изучают специалисты по сопромату, как это сделать, чтобы он был статической системой. Динамическая система должна все это делать во времени, но оставаться системой. Определение довольно сложное, но суть на пальцах такая.

У системы есть множество допустимых состояний и множество контролируемых ею, допускаемых ею входных воздействий. И она будет системой тогда, когда при любом допустимом входном воздействии она не выходит из множества допустимых состояний. Я очень упрощенно говорю.
Каждый из вас, наверное, знает, какое воздействие на операционную систему Windows надо оказать, такое, что она разрешит его оказывать, после чего вы увидите голубой экран навсегда. Это не нужно быть большим гуру, чтобы этого добиться. Если мы, конечно, причисляем состояние полной неработоспособности к допустимым, тогда системой является все на свете. Тогда и кирпич — система.

Системное программирование, к сожалению, до сих пор называется системным программированием от однокоренных слов, а не от сути. Операционная система, система программирования отладки — все это вместе системное программирование. А надо бы, чтобы все эти системы удовлетворяли определение системы для начала.

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

Что такое программная инженерия. Лекция в Яндексе - 48

Тем не менее, когда эта машина была сделана, стали прибегать к главному конструктору разные люди из Академии наук, из того же Курчатовского института, кстати, и просили на ней сделать что-то серьезное, то, что делали в Америке на Cray, а для этого должна быть более-менее похожая на людей операционная система. Ею я и занимался, и мы с коллегами сделали операционную систему (ОС) М-10, но она могла позволить физикам, например, считать что-то научное. Тут перечислены некоторые научные задачи из физики, которые были посчитаны с помощью этой системы в те времена. Кто интересуется, откроет сайт Computer Museum и сможет там увидеть историю всего этого дела, так что я могу себя считать экспонатом виртуального музея.

Что такое программная инженерия. Лекция в Яндексе - 49

Последняя машина Карцева была такая. Она была тоже параллельная, она была сделана уже в конце 1980-х годов. Карцев умер в 1983 году. Доделывали уже без него. Было сделано несколько экземпляров, а на этом все и кончилось. Тут тоже была векторная параллельная архитектора с высокой производительностью.

Что такое программная инженерия. Лекция в Яндексе - 50

После этого институт стал заниматься ширпотребом. Кстати, первый персональный компьютер в Советском Союзе и в России был сделан у нас в качестве ширпотреба. В те времена закрытые учреждения должны были что-то делать для народного хозяйства. И наш один самый маленький отдел для народного хозяйства содрал Apple Macintosh и сделал его на советском заводе. В качестве монитора был стандартный телевизор. Там у некоторых первых образцов сзади был рубильник, его можно было переключать с телевизора на монитор. Поработал, рубильник переключил, посмотрел телевизор.

Что такое программная инженерия. Лекция в Яндексе - 51

Продавалось это все в ГУМ и стоило недорого, вы видите, вполне доступно.

Что такое программная инженерия. Лекция в Яндексе - 52

Это Сначала был «Шилялис», потом «Юность». Они ничем не отличались друг от друга кроме формы. И в 1987 году эта штука поступила в продажу, это был первый персональный советский компьютер с уже содранным программным обеспечением.

Что такое программная инженерия. Лекция в Яндексе - 53

Я почему про это все говорю? Мы говорим о программной инженерии. Если нет своего производства средств производства программ, то неизбежно приходится их сдирать.

Сейчас начались какие-то слабые разговоры про импортозамещение, и что я вижу на всяких конференциях по операционной системе? Импортозамещение операционных систем к чему сводится? Как правило, сводится к сдиранию Linux, потому что его легче содрать, чем Windows, он открытый. И никому не приходит в голову сделать что-то самим, вообще не приходит в голову. Как вы думаете, почему?

— Сложно.

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

Коммерческое ПО. Когда институт закрылся примерно в начале 1990-х, что получилось? Стали сдавать помещения, и нас пригласил греческий Software House, команда программистов из нашего института, мы поехали в греческий Software House, и я первый раз поехал туда в 1991 году. Тогда в Греции все было хорошо. Это сейчас там плохо, а тогда, в начале 1990-х годов, все было отлично. Они разрабатывали банковскую систему для Европы. Там было человек 600 программистов, но это было то самое пользовательское программирование. И я имел возможность три года там попрограммировать банковские системы, в том числе для нашего московского «Инкомбанка» (он тогда еще существовал). Там я первый раз столкнулся с тем, что бывает не просто программная инженерия, а бывает Computer-Aided программная инженерия. Эта компания, которая производила банковские системы, закупила как раз тогда в Америке CASE tool (CASE — Computer-Aided Software Engineering), с помощью которого можно было полуграфически, полупрограммистским образом определить всю здоровенную банковскую систему и нажать кнопочку, чтобы сгенерировался ее исходный код, причем на разных языках, и получить банковскую систему, которая была сопрягаема со всем европейским банковским хозяйством, с переводом денег, карточками (тогда там были карточки, у нас еще не было). В те времена в банковских системах в обиходе был «Кобол» (он и до сих пор там живет только поэтому). Этот тул был разработан под руководством Джеймса Мартина. Это автор и разработчик известных книг и продуктов по базам данных, автор DB2 и так далее.

Он организовал фирму тогда, которая называлась KnowledgeWare, и проповедовал то, что потом стало называться UML. То, о чем я сказал, — это был предвестник (еще UML не было), но это был один из тулов, которые послужили предтечей UML. Там я увидел, что такое программная инженерия по-западному, когда сидело примерно 600 программистов, каждый день на такой доске писалось «Осталось 755 ошибок», «Осталось 754 ошибки», потом что-то сделали — «Осталось 850 ошибок». И этот процесс не сходился вообще за те три года, что я там работал, с помощью этого тула. Тул стоил 2 млн долларов за инсталляцию. Сам Джеймс Мартин привел команду разработчиков этого тула туда в Афины, две недели нам читали лекции, чтобы мы потом объясняли грекам, как этим всем пользоваться, потому что технический директор этой греческой компании предпочел, чтобы сначала эти ребята рассказали нам, а не грекам, а мы рассказали грекам. Он решил, что это будет оптимально.

Джеймс Мартин запросил какую-то астрономическую сумму за вводную лекцию и уехал в тот же день.

Банковское программирование очень консервативное в том смысле, что эти правила и компонентные модели банковских систем ни один банкир менять не будет под страхом смерти, потому что это действительно огромные деньги. В этом пользовательском программировании крутятся огромные деньги. Полчаса простоя современной программной системы, поддерживающей торги в каких-то инвестиционных компаниях (скажем, в Бостоне есть большая инвестиционная компания с большой программной поддержкой), полчаса стоит десятки миллионов долларов. Если эту программу остановить на полчаса просто потому, что ее надо починить, нашли ошибку, сразу десяток миллионов долларов за эти полчаса ушел в трубу. Это программная инженерия.

Что такое программная инженерия. Лекция в Яндексе - 54

Проработав там три года в такой программной инженерии, я вернулся в Москву, потому что невозможно три года жить в гостинице, и попал, к моему удовольствию, в замечательную компанию в Москве. Может быть, вы о ней слышали, она называлась «Параграф». Потом она несколько раз переименовывалась. Сейчас она называется ParallelGraphics. Организовали ее братья Пачиковы. Один в Америке живет, другой в Москве до сих пор. Там были отборные ребята, которых с улицы не брали. Они распространяли информацию о себе по друзьям и знакомым. Было там человек 100, максимум 120 в разные годы. Я там проработал восемь лет. Эта компания занималась трехмерной графикой для Интернета. Зайдите на www.parallelgraphics.com, там будет много демонстраций. Я хотел вам показать какие-то свои программки тех лет, связанные с трехмерной графикой и компонентностью, прежде всего, но, к сожалению, у нас нет технической возможности это сделать.

Эта компания еще знаменита тем, что это одна из самых первых российских программистских компаний, которую купила серьезная американская фирма Silicon Graphics. Компания Silicon Graphics в Америке — это та компания, которая делала суперкомпьютеры и программное обеспечение, для фильмов в том числе. Jurassic Park весь был снят, запрограммирован с помощью продуктов Silicon Graphics. И вот «Параграф» стал частью Silicon Graphics под названием Cosmo Software. Вы видите, что руководил этим подразделением Silicon Graphics после продажи Кай-Фу Ли (Kai-Fu Lee). Он потом стал главным в китайском Microsoft, а потом его оттуда сманила Google. Это говорит о том, что наши программисты всегда котировались на высочайшем уровне. При этом, к сожалению, само программирование пока еще котируется недостаточно. Вспомним позавчерашнее замечание Карачинского.

В настоящее время эта компания существует, с ней были связаны довольно известные имена. Например, вы, наверное, знаете, кто такая Ольга Дергунова, она работала в «Параграфе». Она много лет была представителем Microsoft в Москве. Когда сюда приезжал Билл Гейтс, он первым делом встречался с ней.

Кто такой Алексей Пажитнов, вы знаете? Это автор «Тетрис». Он сейчас живет в Америке, но он каждый год приезжает сюда, чтобы быть членом жюри конкурса программных студенческих проектов, которые организует фирма Microsoft, называется Microsoft Imagine Cup, и об этом чуть позже.

Что такое программная инженерия. Лекция в Яндексе - 55

Там я занимался реализацией языка VRML, а потом он стал называться X3D. Консорциум www.web3d.org. Web3D — это очень трехмерная графика в Интернете. Там вы посмотрите на стандарты этого дела. Я подчеркиваю слово «стандарт». Программная инженерия начинается со стандартов, как всякое промышленное производство чего бы то ни было. И когда я пришел в «Параграф» 1 сентября 1996 года, буквально в этот день опубликовали в открытом доступе Java-технологии. С тех пор прошел почти 21 год, и я практически кроме Java ни на чем не программирую, просто потому, быть может, что я до этого, исключая зарубежный греческий опыт, программировал на языках, которые вообще ни на что не похожи на машинных архитектурах, которые тоже вообще ни на что непохожи. И захотелось программировать так, чтобы это не улетало в трубу, захотелось делать reusable code, а это одна из главных мыслей в компонентном программировании и в программной инженерии. Обидно тратить сумасшедшие усилия на то, что потом пропадет вместе с этим железом. Ради этого Unix стали придумывать, чтобы не пропадало вместе с железом. Из него пророс Linux, который все теперь любят списывать в порядке импортозамещения.

Этот язык в принципе компонентный, и он отлично ложится на самую распространенную в Java-платформе компонентную модель JavaBeans. Может быть, про нее вам здесь расскажут, я просто с первого раза не хочу вам забивать голову.

Что такое программная инженерия. Лекция в Яндексе - 56

Что такое программная инженерия. Лекция в Яндексе - 57

Наши студенты теперь уже довольно регулярно участвуют в этом конкурсе Microsoft. Первый раз мы выиграли второе место по России с проектом, который назывался «Интернет для слепых». Официально он назывался немножко иначе, но по сути это был Интернет для слепых. Как слепой человек может работать в Интернете, входить туда, и что он там может делать? Если мы сейчас накроем полотенцем монитор, как это? Были предложены разные ухищрения на этот счет. И в 2013 году мы взяли первое место по России. Это произошло в Санкт-Петербурге, и было обидно, потому что каждый год Microsoft проводит конкурс в другой стране, а наши ухитрились выиграть тогда, когда это проводилось в Санкт-Петербурге. До этого или через год после это было, по-моему, в Австралии где-то, в Сиднее. Приезжает туда почти полсвета, одна команда от страны, как правило, по какой-то номинации. Наши ребята выиграли первое место по России, и пятое неофициальное место они заняли где-то по зрительским симпатиям. Я не могу сказать, что это особое научное мероприятие, потому что там оценивается не только сама идея и качество ее реализации в программистском смысле, там оценивается еще и то, как это подается, потому что Microsoft — это коммерческая компания. «Яндекс» тоже коммерческая компания. Задача любой коммерческой компании — это получение прибыли, поэтому надо еще это дело хорошо подать. Но если вы к нам придете — уже пора нам выигрывать в мировом масштабе, в России мы все попробовали уже.

Что такое программная инженерия. Лекция в Яндексе - 58

Я хочу постепенно закругляться, сделать какие-то выводы.

Экономика всех развитых стран все больше зависит от программного обеспечения. Я вернусь к мысли о переводе на русский язык. Есть так называемый mission critical software (это английский термин). Попытайтесь перевести его на русский язык. Это такая же история, как системное программирование. Что является альтернативой системному программированию? Академика Иванникова, директора института, почтальон спрашивает: «У вас на вывеске написано „Институт системного программирования“. Значит ли это, что во всех других институтах программирование бессистемное?»

Что такое mission critical software? На русский язык переводят как «ответственное программное обеспечение». Сразу возникает вопрос: а все остальное — это безответственное? И хочется сказать «да».

Расходы в развитых странах на производство и сопровождение программ — я уже сказал, что стоит починить ошибку в каком-то инвестиционном банке, — это заметная часть вообще национального валового продукта. Это я вам говорю как сотрудник ВШЭ. Программная инженерия занимается теориями, методами и инструментами для профессиональной индустриальной разработки ПО. Это не значит, что нельзя сделать что-нибудь особенное кустарным образом. Можно придумать гениальную простую вещь и сделать ее методом вышивания гладью, как «Тетрис». Алексей прославился тем, что он один сделал на коленке гениальную вещь. У него вместо номера на машине написано «Tetris», и полиция его приветствует, он знаменит. Но это не индустриальное программирование, это не программная инженерия.

Стоимость программного обеспечения уже давно и несоизмеримо превышает стоимость железа, на котором она работает, если мы не говорим об уникальном железе. Те машины, которые были уникальными для решения уникальных сложных задач, они могут быть дорогими, конечно. Сопровождать такое программное обеспечение гораздо дороже, чем его делать, потому что тут возникают свои проблемы. Как вообще программа эволюционирует? Не задумывались? Мы привыкли к тому, что программа пишется, запускается, работает, и вы ее останавливаете. Потом она проработала пять лет, ваш ноутбук подох, вы его выбросили вместе со всеми программами.

Как заставить программу жить всегда? Как заставить ее эволюционировать? Вообще, виртуальный мир как-то должен смахивать на реальный. Чтобы реальный мир пришел к такому состоянию, в котором мы его сейчас наблюдаем, потребовались какие-то геологические периоды, правда? Ни одна программа не проработала больше, чем я живу на свете, потому что я, наверное, ровесник самых первых программ просто по возрасту. О котором искусственном интеллекте может идти речь при этом, как вы думаете? Нет эволюции, нет геологических периодов. Конечно, в машине события происходят чаще и больше, чем в реальной жизни, она вся сплошь состоит из каких-то событий, но должно же что-то накапливаться, должно что-то переиспользоваться. Я повторюсь, время жизни любого этого ящика — в среднем пять лет, а потом идет на свалку. С появлением таких языков, как Java, который, слава богу, позволяет накапливать результаты вне зависимости от того, какое железо, появилась надежда на эволюцию. И, конечно же, компонентно-ориентированное программирование будет главным местом здесь.

А что такое программное обеспечение вообще? Чем мы вообще занимаемся? Кто-нибудь знает определение слова «программа»? Вы видели в книжке, что такое программа, строгое определение? Как мы вспоминали, как дать строгое определение такому, что такое система и операционная система?

В те времена у нас был сотрудник, чистый математик, он был аспирантом курса по чистой алгебре на мехмате. Ему где-то хотелось получать зарплату, его привели к нам в отдел программирования в Карцевский институт, но поскольку он был чистый математик, ему поручили писать документацию — инструкцию по программированию. Тогда только появилось голое железо, его заставили писать инструкцию по программированию. Он начал гениально, как настоящий математик. Он должен был дать определение, что такое программа. Он иначе не понимал, как вообще начать такую инструкцию. Но написал. Правда, он сделал оговорку. Он написал так: «Программой в частях и соединениях Советской армии называется…», ну, и дальше последовательность машинных инструкций, каждая из которых объясняется в этой книге. Но хоть попытка была. Я не видел никогда серьезной попытки дать определение программы. В принципе, программная инженерия — это такая пара, потому что программа сама по себе без документации не может развиваться. Она будет выброшена после того, как перестанет работать.

Что такое программная инженерия. Лекция в Яндексе - 59

И теперь несколько слов о том, что такое факультет Computer Science, что такое компьютерные науки и при чем там отделение программной инженерии.

Компьютерные науки — это, наверное, науки о том, что происходит в виртуальном мире, это все науки, которые имеют отношение к виртуальному миру. А программная инженерия — это инженерная наука в этом самом виртуальном мире. Такое у них соотношение. Она имеет чисто практическую направленность, как любая инженерная дисциплина, но именно она дает тот самый продукт, который Индия производит, получая за него больше, чем за нефть и газ получаем мы. Поэтому это важная вещь. У нас тоже неслучайно факультет компьютерных наук занимается только программированием и только обоснованием, может быть, науки и научных результатов, используемых при программировании. Но я повторюсь, компьютерные науки не могут быть без железа. И именно архитектура железа определяет всю новизну. Она определяет разумные подходы к тому, что можно сделать, потому что если машины, допустим, не параллельные, то мы сразу выплеснули ребенка вместе с водой из этого таза. Сейчас пытаются все сделать параллельно, потому что просто по физике. Не имея из чего делать, нельзя сделать. Не имея, из чего сделать, нельзя развивать это самое производство средств производства программ, а это, мы видели, основа индустриализации. Но можно постепенно накапливать опыт все-таки в том, что есть. Сейчас такой этап. Сейчас наши программисты хорошо умеют производить средства программного потребления, программы, потребляемые в самых разных областях. Я надеюсь, что настанут времена, когда у нас технология будет развиваться, и тогда можно ожидать какого-то прорыва. Какого прорыва? Понимаете, я немножко намекнул, что все развивается в том направлении, что динамика становится богаче, то есть компьютерная вселенная может себе позволить больше во время выполнения программы, чем собственно сама программа. Ведь сейчас, если вы посмотрите на обычное приложение Java, там компьютер, выполняя Java-приложение, далеко не 100 % тратит только на него, а там в динамике происходит в параллели масса вещей. Тот же самый сборщик мусора работает, который обосновал когда-то Дейкстра, упомянутый нами, та же самая just-in-time компиляция на ходу оптимизирует эту программу, и так далее, и так далее.

Много лет назад были разговоры о том, что системы адресации данных и команд в современных архитектурах устарели уже тогда, много лет назад. И я не имел времени вам рассказать об идеях, заложенных в карцевскую машину М-13 и похожие на нее. Скажу только, что там есть намеки на то, чтобы разделить чисто аппаратно возможности обратиться в ячейку памяти за данными и возможности указать, кто может это сделать, а кто нет. Сейчас это решается одним и тем же аппаратным узлом, и поэтому адресация памяти совмещена железно-архитектурно с контролем доступа к этой памяти. Уже 30 лет назад было понято, и в экспериментальных архитектурах доказано, что это совершенно два независимых механизма. Развивая эти вещи, можно сделать гораздо более надежное программное обеспечение, но оно требует, чтобы вместе с выполнением программы в параллель делалось что-то еще в динамике, какие-то правила движения в виртуальном мире. Современные ширпотребовские архитектуры не умеют это делать. Почему? Я закончу опять отсылкой к Библии.

Вы знаете, что первым делом сделал Иисус Христос, когда пришел в Иерусалим? Он выгнал торгующих из храма. Вытолкал. Kicked the money changers out of the Temple. В русском языке есть устойчивое словосочетание «храм науки», и до тех пор, пока в храме науки будет превалировать торговля, видимо, трудно ожидать таких революций, потому что они стоят огромных денег, но они дают перспективу. И этой перспективой, наверное, будут заниматься программные инженеры, относящиеся к системному программированию, которые имеют системное мышление, которые смогут установить соответствие между математической теорией систем и тем системным программным обеспечением, которое будет диктоваться новыми архитектурами. Но это, наверное, уже делать вам.

Про языки. Язык Python — это популярный, хороший язык, используемый в основном в веб-программировании, очень хорош для того, чтобы с него начинать обучение, но значительно менее употребим, чем язык C и чем язык Java. Если вы зайдете на сайт www.tiobe.com, этот сайт уже лет 25 мониторит каждый месяц популярность языков программирования. Последние лет 15 на первом месте два языка — Java и С. В этом году Java усилила свое преимущество над С. Все остальные сильно позади, C#, про который вам рассказывают. C# — это отдельная история, это слепок с Java. Почему? По тому самому, почему мне надоело на уникальных машинах программировать.
Язык C — это высокоуровневый язык низкого уровня. Пока микропроцессоры популярны, скажем, для Internet of things, там же маленькие микропроцессоры, там память поначалу у всех этих сенсорных узлов в беспроводных сетях…

Я пропустил это в своем докладе. Я работал примерно лет пять в компании MeshNetics, которая делала Internet of things у нас. Эти микропроцессоры программировались на голом C, потому что это фактически Assembler, ничего другого там быть не может. В эти годы, когда появляется огромное количество маленьких микропроцессоров с маленькими возможностями, C начинает обгонять Java последние 10 лет. Потом, по мере того, как эта технология приобретает размах и крупные компании начинают их клепать большим тиражом, они становятся мощнее. Как только появляется возможность засадить туда виртуальную Java-машину, сделать реализацию, все ребята переключаются на нее.

Почему у вас в Android на Java программируют, как вы думаете? Потому что Джеймс Гослинг ушел в Google, когда фирма Sun была продана Oracle. Причем он ушел, потому что ему не понравился коммерческий подход в фирме Oracle к развитию Java-машины, он всегда считал, что это должно происходит в более открытом виде, как открытое программное обеспечение. Как только микропроцессор для телефона стал способен крутить Java, там была сделала Java-машина, и все программируют на ней. А Python — это такой язык, на котором хорошо учиться, который неоптимально компилируется, потому что он интерпретируется в основном. Современная Java хороша тем, что она сначала была интерпретируема, но потом за 20 лет развития там уже такая оптимизация на ходу происходит (помните, я сказал, что на ходу происходит много помимо собственного выполнения?), что уже не в разы производительность теряется, а на единицы процента. К сожалению, я вам не смог показать по техническим причинам трехмерную графику, которую я делал, работая в «Параграфе» только на Java. А Java ничего не знает про видеокарту, про всякие аппаратные возможности.

Если вы хотите сравнить язык программирования, то всякое сравнение языков программирования… Я когда-то вычитал умную фразу в детективе Марининой, как ни странно. Там было написано, что «всякий критерий приобретает свой смысл в контексте целеположения». Замечательная фраза. Если вы хотите сравнивать языки по каким-то критериям, вы сначала спросите «зачем?», то есть целеположение определите. Если вы хотите потом устроиться на работу, то на ближайшие лет 10 я вас опять-таки буду агитировать за Java просто потому, что Python уже уступает место другим языкам, а Java этого пока не делает и еще лет десять не будет.

— Существуют ли приложения языков, такие как «Пролог», в современной программной инженерии? То есть с совершенно другими принципами.

— Да.

— Как они используются в наши дни? Есть еще для них место?

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

Это открытые области науки. Может быть, это называется computer science, но делается этот computer science ради программной инженерии, потому что на выходе хочется иметь хорошую программу. Этим тоже стоит заниматься.

К сожалению, нынешнее состояние дел приводит даже тогда, когда приводит, к качеству сгенерированной программы, которое в десятки раз по эффективности уступает ручному программированию. И, опять-таки, главный магистральный путь борьбы с этим — это компонентное программирование, потому что не надо каждый раз генерировать код. Если сейчас программист, который занимается промышленным производством программ, начнет писать код, как вышивать гладью на пяльцах с нуля, то не будет ни качества, ни своевременности сделанной работы. Вообще все развитие программирования сдерживается именно тем, что все время норовят что-то писать с центра поля. И пока не удается сделать так, чтобы был рынок компонент, о котором мечтали в 1968 году, глядя на аппаратчиков. Сейчас вы можете на радиолюбительском уровне заказать по DHL любой микропроцессор, вам привезут, в конце концов, и вы с паяльниками что угодно сделаете. А с программами так не получается. И сделать так, чтобы получалось, тут не жалко никакой искусственный интеллект применить и никакую технологию программирования. Это великое дело.

— (неразборчиво)

— Он находится в трех минутах ходьбы от метро, но, к сожалению, там уже почти никакого не осталось. Там бо́льшая часть помещения была сдана в аренду, молодежи там почти нет. Там есть, правда, до сих пор ученый совет, который принимает к защите диссертации. Но была статья. Когда началась перестройка, где-то в 1990-х годах была статья в американском журнале «Компьютер», называлась она «High-speed computers of the former Soviet Union», по-моему. Что-то в этом духе. Она у меня есть. Кто заинтересуется — пишите мне письмо. У меня был написан ее e-mail, я вам ее пришлю. Там был обзор всех оригинальных архитектур — потому что обозревать то, как списывали IBM 360, смысла нет, — которые были разработаны. И там было написано. Единственное, что они говорили, действительно оригинальное — это они вспоминали машину M-10 и сказали, что с уходом главного конструктора — а он умер, не дожив трех недель до своего шестидесятилетия в 1983 году — институт как-то перестал генерировать новые архитектуры. Это действительно так, но это объективная вещь. Везде человек смертен. Иногда бывает школа научная, иногда она обрывается, все разбегаются, как правило, за длинным рублем. Ради чего вас здесь собирают при «Яндексе»? Вас собирают здесь для того, чтобы из вас потом такие школы получились, чтобы не прерывалась связь времен. Как-то так. Я подчеркиваю, не может быть серьезного самостоятельного программирования без элементарной базы, которая позволяет делать свои аппаратные компоненты, прежде всего. Но это общемировая тенденция. Фирму Intel переплюнуть не может никто, и не скоро сможет, я думаю. Но у нас в те времена была та же тенденция, что и в фирме Intel, кстати. Фирма Intel имеет два центра разработки новых процессоров: один находится в Хайфе (Израиль), а второй в Редмонде (США), по-моему. В Силиконовой долине в Пало-Альто у фирмы Intel находится штаб-квартира, но там ничего не разрабатывают, там сидит руководство, менеджеры. И эти два исследовательских центра в конвейерном режиме друг с другом конкурировали, и это в значительной степени было двигателем интеловских технологий.

Надо сказать, что фирма Intel проводит ежегодный конкурс, который похож на Oscar в Голливуде. Там новые разработки награждаются призами. Среди своих интеловских сотрудников он называется Intel Technology Award. Все ходят по красной дорожке, как в Голливуде, приезжают во фраках и так далее. У нас просто этого не показывают. Когда у нас будет такое же уважение к этому делу, желательно к тому моменту, когда вы вызреете как специалисты, тогда вам будет широкая улица для работы, чего я вам искренне желаю.

Спасибо за внимание. Учитесь хорошо.

Автор: Яндекс

Источник

Поделиться новостью

* - обязательные к заполнению поля