Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

История развития программирования в России

Содержание:

ВВЕДЕНИЕ

В нашу страну информация о разработках принципиально новых электронных устройств и создании новых типов информационных процессоров поступила довольно быстро. Исходя из интересов страны (прежде всего из необходимости поддерживать высокий уровень военных разработок), в СССР начались работы по созданию отечественных вычислительных машин. В конце 30-х годов в Институте электротехники АН СССР под руководством С. А. Лебедева уже начались работы по созданию ЭВМ с использованием двоичной системы счисления, но начавшаяся война прервала эти исследования. После этого пришло время продолжить их. В 1951 году в Киеве была запущена первая вычислительная машина в континентальной Европе - МЭСМ, созданная коллективом во главе с С. А. Лебедевым.

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

Целью работы является изучить историю программирования в России

Для достижения цени необходимо выполнить следующие задачи:

1. Понять онтологический подход к проблеме классификации компьютерных языков

2. Проанализировать историю программирования в России

3. Рассмотреть общую характеристику задачи

4. Описать алгоритм решения задачи

Объектом работы является история программирования

Предметом работы – Развитие программирования в России

Глава 1. История развития программирования и их классификация

1.1. Онтологический подход к проблеме классификации компьютерных языков

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

Первый вопрос, на который надо дать ответ, почему мы считаем актуальной проблему классификации компьютерных языков. Простой ответ состоит в том, что необходимость классификации (и систематизации) следует уже из числа известных компьютерных языков, которых уже несколько тысяч. Так, например, на плакате The History of Programming Languages издательства O’REILLY, специализирующегося на публикации ученой литературы по компьютерным языкам, представлены сведения о 2500 языках. Эти сведения включают названия, год рождения, авторство, влияние друг на друга и развитие версий компьютерных языков, появившихся в период с 1956 по 2006 гг.

Однако значение классификации компьютерных языков не исчерпывается желанием «навести порядок и систематику». Классификация уже существующих и новых компьютерных языков призвана помочь в выборе подходящих языков для разработки новых программных и информационных систем на основе требований к этим новым системам.

Классификацию компьютерных языков можно пытаться строить по аналогии с естественными науками, например «по Линнею»: царство - тип (у растений отдел) - класс - отряд (у растений порядок) - семейство - род - вид.

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

Так, например, только за последнее десятилетие XX века мы наблюдали как быстрый рост существовавших классов компьютерных языков, так и образование новых классов (например, языков представления знаний, языков кластерного/многоядерного программирования, проблемно-ориентированных языков программирования). Некоторые из этих новых компьютерных языков имеют свой специфический синтаксис (например, графический), свою семантику (т.е. модель обработки информации или виртуальную машину), свою прагматику (т.е. сферу применения и распространения).

Некоторые из давно существующих классов компьютерных языков сравнительно малочисленны (например, языки проектирования СБИС), некоторые - «густонаселенны» (например, языки спецификаций), а некоторые пережили или переживают сейчас период роста и миграций (например, языки разметки). В тоже время разработка новых компьютерных языков (а, следовательно, и образование новых классов компьютерных языков) будет продолжаться по мере компьютеризации новых отраслей человеческой деятельности.

Кроме того, часто специалисты по компьютерным языкам затрудняются отнести тот или иной язык к одному определённому классу. Например, функциональные языки программирования ML и Рефал появились ещё в 1960-ые годы как языки спецификаций вывода (логического и продукционного), но ещё в 1970-ые годы они стали языками программирования для задач искусственного интеллекта. В то же время они (в силу их декларативности) по-прежнему могут служить языками спецификаций для вычислительных программ. А некоторые языки изначально по замыслу их разработчиков не могут быть отнесены к одному конкретному классу. Вот, например, как позиционируют язык Ruby его активные пропагандисты [23]: Its creator, Yukihiro “matz ”, blended parts of his favorite languages (Perl, Smalltalk, Eiffel, Ada, and Lisp) to form a new language that balanced functional programming with imperative programming.

Мы полагаем, что современная классификация универсума компьютерных языков может быть основана на гибком понимании компьютерных парадигм. В современной методологии науки парадигмы - это разные подходы к постановке и решению задачи или проблемы. Современным пониманием этого термина мы обязаны широко известной диссертации Томаса Куна [9], впервые опубликованной в 1970 г.

Роберт Флойд стал первым в информатике, кто ввёл понятие парадигм программирования в научный оборот в его тьюринговской лекции Paradigms of Programming в 1978 г. [Floyd, 1979]. К сожалению, он не дал явного определения этого понятия.

В 2009 г. Питер ванн Рой опубликовал в Интернете таксономию The principal programming paradigms, в которой выделил 27 различных парадигм, и предпринял попытку обосновать её в статье [20]. Однако ни эта таксономия, ни соответствующая статья не дают развёрнутого определения понятия парадигм программирования. Можно процитировать только следующее краткое (и неполное, на наш взгляд) определение [20]: A programming paradigm is an approach to programming a computer

based on a mathematical theory or a coherent set of principles. Each paradigm supports a set of concepts that makes it the best for a certain kind of problem.

На основе краткого определения понятия парадигмы программирования, предложенного Питером ванн Роем [20], в 2011 г. нами было дано следующее более полное понятие компьютерных парадигм [3, 17]:

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

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

Компьютерные парадигмы соответствуют классам компьютерных языков и наоборот:

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

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

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

Роль синтаксиса, семантики и прагматики. Категории синтаксиса, семантики и прагматики используются для описания как естественных, так и искусственных языков (компьютерных языков в том числе). Синтаксис - это правописание (орфография) языка. Смысл правильно написанных фраз (слов) языка определяет его семантика. Прагматика - это практика использования синтаксически корректных осмысленных фраз языка.

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

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

синтаксис, порождается ли он LR(k) грамматикой и тому подобное. Следовательно, эти и другие формально-синтаксические свойства компьютерного языка могут и должны быть атрибутами, учитывающимися при классификации компьютерных языков.

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

Роль и значение семантики для компьютерных языков общепризнанны. Косвенным подтверждением признания этого является количество лауреатов премии имени А. Тьюринга (самой престижной международной премии в области информатики), заслуживших эту премию за вклад в развитие семантики компьютерных языков: Эдсгер Дейкстра (1972), Джон Бэкус (1977), Роберт Флойд (1978), Ч. Энтони Р. Хоар (1980), Никлаус Вирт (1984), Робин Милнер (1991) и Питер Наур (2005). Таким образом, за 46-летнюю историю присуждения этой ежегодной премии 7 раз она присуждалась именно за вклад в развитие языков программирования и их семантики.

Однако, неформальная семантика мало пригодна для использования при классификации в силу нечёткости терминов и понятий, а использование формальной семантики для классификации компьютерных языков до сих пор наталкивалось на следующие препятствия:

слабое знание формальной семантики среди пользователей компьютерных языков (разработчиков, руководителей и менеджеров проектов);

распространённое предубеждение, что формальная семантика малополезна и неэффективна на практике;

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

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

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

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

Так, образовательная семантика компьютерного языка может делить язык на 2-3 образовательных уровня. Эти уровни можно условно назвать элементарным, основным (или базовым) и экспертным (или мастерским), причём элементарный и основной уровни или основной и экспертный уровни могут иногда совпадать. Элементарный образовательный уровень компьютерного языка - это учебный диалект для изучения основ языка человеком (возможно, даже без использования компьютера), с очень простой и прозрачной формальной семантикой в виде виртуальной машины языка. Основной образовательный уровень компьютерного языка - это диалект языка для регулярного использования, предполагающий понимание со стороны пользователя, как основные конструкции языка могут быть определены (в принципе) в терминах виртуальной машины языка. Экспертный образовательный уровень компьютерного языка - это язык в полном объеме с пониманием того, какие конструкции языка соответствуют формальной семантике, а какие нет, но имеют семантику обусловленную особенностями и эффективностью реализации (т.е. практикой использования). Обращаем внимание, что здесь речь идёт не о машинных языках, автокодах (или ассемблерах) и языках высокого уровня, а об образовательном аспекте языка.

Реализационная семантика компьютерного языка может делить язык на 2-3 или более слоя. Обычно можно условно выделить ядро, несколько промежуточных слоёв и полный язык. Ядерный слой имеет эффективную реализационную семантику для класса платформ и достаточные средства для реализации методом раскрутки, интерпретации или трансформаций конструкций промежуточных слоёв. Полный язык может иметь только частичную трансформационную семантику в более низкие (промежуточные или ядерный) слои, часть конструкций полного языка может иметь свою индивидуальную реализационную семантику для каждой конкретной платформы. В качестве примера слоёв языка можно сослаться на «уровни» языка C# [1].

Прагматика компьютерных языков (в отличие от синтаксиса и формальной семантики) - это неформализованные представления людей, вовлечённых в жизненный цикл языка (авторов и реализаторов, «экспертов» и простых пользователей) о происхождении, назначении и использовании этого языка. Другими словами, прагматика компьютерных языков - это человеческие «знания» о компьютерных языках.

Здесь, однако, уместно напомнить, что хотя мы и ведём речь о «знаниях», но на самом деле надо говорить только о представлениях или мнениях (beliefs), т.к. (согласно традиции, восходящей к Платону) знания - это представления о реальности, соответствующие действительности (т.е. истинные представления); «знания» разных людей, вовлечённых в жизненный цикл компьютерного языка, могут быть просто противоречивыми (и, следовательно, не могут соответствовать действительности одновременно).

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

Формальная «онтология - это теория объектов и их связей. Онтология предусматривает критерии для выделения различных типов объектов (конкретных и абстрактных, существующих и несуществующих, реальных и идеальных, зависимых и независимых) и связей между ними (отношений, зависимостей и предшествования)» [19]. Поэтому под онтологией предметной области (прагматики компьютерных языков в том числе) мы будем понимать формальную онтологию, представляющую мнения «экспертов» об объектах этой области, их классах и отношениях между ними. Будем говорить, что онтология задана явно, если она явно представлена в виде графа, вершины которого - объекты онтологии, а дуги - отношения между объектами; в противном случае будем говорить о неявной онтологии. Наиболее известная неявная онтология - это Wikipedia. Наиболее популярный инструмент создания явных онтологий - это платформа Protege

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

1.2. История программирования в России

Россия традиционно ассоциируется с огромной территорией и бесконечными природными ресурсами. Нефть, газ, уголь и древесина по-прежнему остаются наиболее важными составляющими валового национального продукта России, на этом фоне индустрия программирования почти незаметна. Однако, помимо лидерства на сырьевом рынке, Россия занимает первое место в мире по количеству технических специалистов. Согласно отчету World Bank/UNESCO, более миллиона человек в стране работает в области научных исследований. У России есть все предпосылки для того, чтобы стать заметной силой на международном рынке программирования.

Российское программирование имеет богатую историю, ведущую свой отчет от 50-х годов, когда программирование в основном предназначалось для решения военных и промышленных задач, например, для точного расчета места приземления космического корабля Юрия Гагарина. Ранние успехи советского программирования во многом связаны с тем, что советская экономика всегда была сильно индустриализованной и технически ориентированной. Растущая потребность в программистах была разрешена путем переориентации части математиков и физиков на информатику. В те времена количество программистов (да и самих компьютеров) было очень небольшим, так как область применения программирования была достаточно ограниченной. Так, за все 20 лет производства БЭСМ-6, одного из самых успешных компьютеров тех времен (было выпущено всего около 300 штук). Тем не менее, к концу 60-х советская школа программирования находилась на мировом уровне и в промышленной разработке программ, и в научных исследованиях.

К сожалению, где-то с начала 70-х годов в программировании, как и в ряде других отраслей, начали наблюдаться первые признаки застоя. Одной из основных причин стала официальная политика ориентации компьютерных платформ на клоны IBM/360 и PDP/11. Считалось, что путем копирования западной аппаратной базы удастся сэкономить деньги, которые впоследствии можно было бы использовать для «гигантского скачка» в программировании. Эта «стратегия» потерпела провал, а Эдгар Дейкстра в своей лекции, прочитанной в России, назвал это решение советского правительства «величайшей победой Запада в холодной войне» (подробнее о ранней истории программирования в России можно прочитать в [1]).

Кризис продолжался до начала 90-х годов. В процессе перехода на рыночную экономику большинство существовавших структур рухнуло [2], что привело, в частности, к радикальной смене преобладающей аппаратной платформы. В течение нескольких лет мэйнфреймы были потеснены мощным потоком персональных компьютеров; так, согласно оценке IDC, в 1997 году в России было продано 1,4 млн. компьютеров. Переход на новую платформу создал потребность в целом ряде новых услуг, например, в разработке программ и системной интеграции, которые стали предоставлять молодые частные компании. Большинство современных лидеров в компьютерном бизнесе России — представители этой «новой волны»; сегодня такие компании вполне могут считать себя ветеранами рынка, несмотря на возраст от 8 до 12 лет.

Компьютерный рынок быстро увеличивался вплоть до кризиса 1998 года. Отечественная компьютерная индустрия была одной из наиболее пострадавших из-за своей зависимости от западного рынка; лишь совсем недавно Россия снова вышла на уровень 1997 года по количеству продаваемых компьютеров. Тем не менее, сегодня перспективы компьютерного рынка в России выглядят очень хорошими; страна демонстрирует очень быстрый рост темпов продаж компьютеров, при том, что рынок еще ненасыщен: на 100 человек в России приходится всего лишь около 5 компьютеров (в США — 62).

Самым большим конкурентным преимуществом российской индустрии программирования является наличие большого количества хорошо обученных технических специалистов. Типичный российский программист обладает как минимум высшим образованием в программировании, технических или точных науках, что совсем нехарактерно для западных стран. Например, примерно 86% американских программистов обладают лишь степенью бакалавра, закончили специальные двухгодичные курсы или вообще ограничились средним образованием [3].

Платное образование становится все более популярным; по данным Госкомстата, в 2001 году более трети студентов в России платили за свое образование. Однако программы обучения всех университетов, как государственных, так и частных, контролируются государством с помощью набора стандартов, гарантирующих единый уровень обучения. Такой подход порождает ряд специфических для России моментов. Например, в стандарте на программистские специальности традиционно очень велик процент обязательных курсов по математике и прочим фундаментальным наукам. В результате, первые два с половиной года самой распространенной программистской специальности 351500 (бывшая 220400) почти полностью посвящены математическим предметам; это означает, что студенты не получают достаточной практики в программировании до третьего или даже четвертого курса. У такого подхода к делу есть и преимущества: отечественные программисты получают базовые знания, которые могут быть применены в самых разных исследовательских задачах. Это, кстати, регулярно подтверждается победами российской молодежи на различных международных соревнованиях. Например, команда Санкт-Петербургского государственного университета два года подряд становилась победителем международной олимпиады по программированию, проводимой под эгидой ACM (2000 и 2001 годы), а также входила в десятку победителей в течение пяти лет. Следующее поколение также подает большие надежды: в 2000 году российские школьники победили на международной олимпиаде по информатике в Китае.

Количество обучающихся в России студентов также растет. В 2001 году в стране насчитывалось 4,7 млн. студентов, почти вдвое больше, чем в 1995 году. В частности, растет и число студентов, обучающихся программированию: количество тех, кто ежегодно поступает на связанные с компьютерами специальности, выросло за последние пять лет с 8 до 25 тыс. человек. В связи с возможностью найти по окончании вуза высокооплачиваемую работу программирование становится все более привлекательной специальностью.

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

Некоторый процент российских программистов эмигрирует из России, и все же проблема «утечки мозгов» уже не так критична, как в начале 90-х годов, когда программисты тысячами эмигрировали, опасаясь неясного положения и туманных перспектив развития России.

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

Согласно оценке консалтинговой компании Brunswick Warburg, в 1999 году объем российского рынка программного обеспечения составлял 560-580 млн. долл. — всего 0,1% от валового национального продукта (при том, что весь ИТ-рынок страны в 2001 году составлял по оценке газеты «Коммерсант» 3,5-4 млрд. долл. при темпах роста 15-20% в год). И все же программирование имеет огромный потенциал. В отчете McKinsey [4] программирование названо самой эффективной и одной из самых быстро растущих отраслей России. По экспертным оценкам, в этой области занято от 50 до 80 тыс. человек. К сожалению, не представляется возможным дать более точную оценку размеров рынка или даже определить явных лидеров в конкретных сегментах рынка, так как на данный момент он достаточно хаотичен и неструктурирован. К тому же, практически все российские компьютерные компании являются закрытыми акционерными обществами и не разглашают точные сведения о своем финансовом состоянии. В данной статье используются цифры из различных опубликованных источников, в особенности из [4-6], хотя в некоторых случаях приводимые оценки значительно различаются.

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

Большинство отраслей экономики России несут в себе отпечаток советского времени, однако компьютерная индустрия сильно отличается в этом смысле — после развала СССР большинство исследовательских институтов стало разваливаться, оставив программистов без работы и вчерашние исследователи были вынуждены уйти в бизнес. В целом, можно разделить российские программные компании на две категории: работающие на внутреннем рынке и работающие на иностранных заказчиков.

Компании, работающие на внутреннем рынке, в основном позиционируются как системные интеграторы, обслуживающие крупные предприятия в платежеспособных отраслях. Есть еще целый ряд компаний, ориентирующихся на мелкий бизнес и индивидуальных покупателей, хотя компьютерное пиратство изрядно подрывает этот рынок. Наконец, многие ориентируются на международный рынок, поскольку заметная ценовая разница по сравнению с западными странами и изобилие талантливых программистов дают России уникальную возможность в области глобального (офшорного) программирования. Эту нишу заполнили сотни компаний, ориентированных на предоставление услуг по аутсорсингу. По оценке компании McKinsey, в 1999 году в российском офшорном программировании было занято от 5 до 8 тыс. профессиональных программистов, а общий объем этого рынка составлял от 60 до 100 млн. долл. при темпах роста от 40 до 60% в год [4]. Правда, российские источники считают, что приведенные цифры сильно занижены. Так, по оценкам компании Market-Visio/EDC, общий доход российского рынка офшорного программирования в 2001 году составил 194 млн. долл. при темпах роста 227% в год.

Международный рынок аутсорсинга отличается жесткой конкуренцией, здесь есть свои общепризнанные лидеры — Индия и Ирландия [7, 8]. В 2000-2001 годах Индия заработала на этом рынке 6,3 млрд. долл. По количественным показателям Россия сегодня отдаленно напоминает Индию в 1990 году.

В последние два-три года компании, специализирующиеся на глобальном программировании стали объединяться в ассоциации, такие, как «Форт-Росс» в Петербурге и «СибАкадемСофт» в Сибири (в процессе создания аналогичная ассоциация в Москве, которая, однако, ничем фактически полезным пока не отличилась). Основной задачей этих ассоциаций стало лоббирование интересов компьютерной индустрии в российском правительстве и маркетинг возможностей отечественных компаний на Западе путем, например, проведения международных конференций типа Software Outrsourcing Summit

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

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

Motorola открыла лабораторию с небольшой группой программистов в Петербурге в 1993 году, сейчас в ней работает более 200 программистов;

Sun Microsystems начала работать в России более 10 лет назад; на сегодняшний день в Москве и Петербурге работают более 300 сотрудников, принимающих участие в разработке новых продуктов и сопровождении существующих;

Intel открыла свою лабораторию в Нижнем Новгороде в 1993 году; сегодня в этом подразделении работает около 200 программистов, планируется увеличить их число до 500 [9];

SAP при поддержке компании Siemens Business Services развернула в Петербурге подразделение из 40 программистов, численность которых планируется довести до 100.

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

В стране исторически сложилось три основных центра программирования: Москва, Петербург и Новосибирск. Среди прочих городов с развитой индустрией программирования следует отметить Нижний Новгород, Екатеринбург, Пермь и Саров.

В Москве сосредоточены основные денежные потоки, а также менеджмент страны и практически всех крупных российских компаний, поэтому многие здешние компьютерные компании ориентированы на внутренний рынок (хотя есть и исключения, например, Luxoft, VDI и Auriga).

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

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

Практически все программные компании в России начинались с небольшой группы квалифицированных программистов. Чаще всего, на этом этапе вопросы качества вообще специально не рассматривались — компании в основном полагались на профессионализм отдельных сотрудников. Однако по мере роста возникали все новые и новые проблемы, связанные с качеством программных продуктов и процессов. Поэтому сегодня большинство российских компаний (особенно работающих с западными заказчиками) понимают важность обеспечения качества. За последние несколько лет рынок услуг, связанных с качеством, значительно вырос. Еще три-четыре года назад ни в одной российской компании не было внутренней программы улучшения качества, а сегодня десятки компаний уже получили сертификат соответствия стандарту ISO 9001, многие планируют сертификацию на следующие несколько лет.

Работы по обеспечению качества в России чаще всего основываются на ISO 9001, который еще в советские времена был положен в основу национального стандарта ГОСТ ИСО Р 9001. На сегодняшний день ISO 9001 по-прежнему остается наиболее доступным из всех программных стандартов: существует множество сертифицирующих органов (как национальных, так и международных) и множество курсов по ISO 9001. Прочие стандарты менее популярны и прежде всего по причине их недостаточной распространенности и высокой стоимости сертификации. Многие российские компании планируют сертификацию по стандарту СММ, однако еще ни одна из них еще не достигла этого; среди подразделений западных компаний необходимо отметить лабораторию Motorola в Петербурге, достигшую пятого уровня СММ.

Развитие российской индустрии программирования затруднено целым рядом проблем. Самая большая трудность — это компьютерное пиратство. 88% используемых в России программ являются нелицензионными (в среднем по миру — 36%). Только Вьетнам, Китай и ряд стран бывшего СССР имеют еще худшие показатели по этой проблеме. Некоторые компании пытаются избежать столкновения с этой проблемой путем ориентации создаваемых продуктов на западный рынок. Этот подход (известный также как «скандинавская» или «израильская» модель) представляется очень многообещающей, так как из-за разницы в уровне цен на исходном и целевом рынке финансовый результат может многократно превышать затраты. Единственная проблема заключается в том, что требуются значительные начальные финансовые вложения, отсутствующие у большинства российских компаний. Финансовый рынок в России также недостаточно развит для того, чтобы поддерживать подобные проекты. Поэтому, несмотря на целый ряд примеров успешной реализации подобной модели (например, антивирусная система AVP или графические средства, разработанные компанией ParaGraph и приобретенные впоследствии Silicon Graphics), все еще неясно, станет ли эта модель массовой в России.

Еще одна проблема, затрагивающая все отрасли России, — неразвитая инфраструктура. Почта, транспорт, муниципальные услуги либо ненадежны, либо просто плохи в большинстве регионов, может быть, за исключением отдельных крупных городов. Естественно, это затрудняет работу всех предприятий, зависящих от инфраструктуры. Например, расцвет электронной коммерции во всем мире практически не затронул России: очень мало людей владеют и пользуются кредитными картами, лишь 6,3% всего населения имеют доступ к Сети, и, наконец, почта крайне ненадежна. Только с телефонизацией дела обстоят относительно хорошо — в России насчитывается 21,3 телефонных аппарата на 100 жителей, что, конечно, значительно хуже, чем 59,5 для промышленно развитых стран, но все-таки лучше, чем среднемировое значение 15,1.

Наконец, российская индустрия глобального программирования страдает от неадекватного имиджа России за рубежом. В погоне за сенсациями ряд статьей в западной прессе освещает такие «неаппетитные» темы: отмывание денег, природные и техногенные катастрофы или русская мафия. В результате, российские компании вынуждены начинать свой маркетинг с нейтрализации бытовых мифов.

Глава 2. Характеристика задачи и описание алгоритма задачи

2.1. Общая характеристика задачи

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

Непосредственно условие задачи в текстовом виде;

Набор входных и выходных тестов (файлов). При этом, тесты могут разделяться на тесты предварительного и полного тестирования.

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

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

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

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

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

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

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

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

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

Защита системы от вредоносных решений обычно выполняется в три этапа.

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

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

Третий этап является самым важным и сложным в реализации, так как он напрямую зависит от операционной системы. Программа-решение участника должно запускаться в специальном «контейнере», который ограничен одной единственной директорией исполнения. В Linux-системах для реализации такого контейнера используется утилита chroot, в Windows-системах необходимо создавать специальные Job- объекты, внутри которых есть возможность запускать процессы с наложением ограничений.

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

ЗАКЛЮЧЕНИЕ

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

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

СПИСОК ЛИТЕРАТУРЫ

1. Абрамов, С.А. Математические построения и программирование / С.А. Абрамов. - М.: Наука, 2016. - 192 c.

2. Бекишев, Г.А. Элементарное введение в геометрическое программирование / Г.А. Бекишев, М.И. Кратко. - М.: Наука. Главная редакция физико-математической литературы, 2017. - 144 c.

3. Ван, Тассел Д. Стиль, разработка, эффективность, отладка и испытания программ / Ван Тассел Д.. - М.: Мир, 2017. - 332 c.

4. Вирт, Н. Алгоритмы и структуры данных / Н. Вирт. - М.: Мир, 2016. - 360 c.

5. Голицына, О.Л. Основы алгоритмизации и программирования: Учебное пособие / О.Л. Голицына, И.И. Попов. - М.: Форум; Издание 2-е, 2017. - 432 c.

6. Готье, Р. Руководство по операционной системе UNIX / Р. Готье. - М.: Финансы и статистика, 2017. - 232 c.

7. Гребенников, Л.К. Программирование микропроцессорных систем на языке ПЛ/М / Л.К. Гребенников, Л.А. Летник. - М.: Финансы и статистика, 2016. - 160 c.

8. Дж., Вандер Плас Python для сложных задач. Наука о данных и машинное обучение / Дж. Вандер Плас. - М.: Питер, 2017. - 518 c.

9. Жильцов, В. В. Информационные технологии в проектировании «интеллектуальной» скважины / В.В. Жильцов. - М.: Университет, 2016. - 906 c.

10. Карпов, В.Я. Алгоритмический язык Фортран / В.Я. Карпов. - М.: Наука, 2016. - 192 c.

11. Крамм Программирование в Access для "чайников" / Крамм, Роб. - М.: Диалектика, 2016. - 304 c.

12. Кук, Даррен Машинное обучение с использованием библиотеки Н2О / Даррен Кук. - М.: ДМК Пресс, 2017. - 310 c.

13. Линдси, Ч. Неформальное введение в Алгол 68 / Ч. Линдси, Ван Дер Мюйлен, С.. - М.: Мир, 2018. - 408 c.

14. Лужецкий, М. Г. Автоматизация аналитической работы кредитной организации / М.Г. Лужецкий. - М.: Университет, 2016. - 555 c.

15. Мельчук, И.А. Автоматический синтаксический анализ / И.А. Мельчук. - М.: Редакционно-издательский отдел Сибирского отделения АН СССР, 2018. - 358 c.

16. Неслуховский, К.С. Пособие по программированию для ЭЦВМ "Минск-32" / К.С. Неслуховский. - М.: Советское радио, 2016. - 296 c.

17. Попов, И. И. Использование семантических подходов в экономических моделях / И.И. Попов. - М.: Университет, 2016. - 646 c.

18. Постовалов 1С: Предприятие 7.7. Уроки программирования / Постовалов, Постовалова Сергей; , Анастасия. - М.: СПб: BHV, 2018. - 320 c.

19. Рихтер Программирование на платформе Microsoft. NET Framework / Рихтер, Джеффри. - М.: Русская Редакция, 2016. - 512 c.

20. Скотт, Т. Основы программирования. Курс программированного обучения / Т. Скотт. - М.: Советское радио, 2016. - 490 c.

21. Соломон Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000 / Соломон, Руссинович Д; , М. - М.: СПб: Питер; Издание 4-е, 2016. - 992 c.

22. Стивенс, У. UNIX: разработка сетевых приложений / У. Стивенс. - М.: СПб: Питер, 2015. - 400 c.

23. Фаронов, В.В. Основы Турбо-Паскаля / В.В. Фаронов. - М.: МВТУ-Фесто дидактик, 2015. - 304 c.

24. Фролов, А.В. Локальные сети персональных компьютеров. Работа с сервером Novell NetWare / А.В. Фролов, Г.В. Фролов. - М.: Диалог-Мифи, 2017. - 168 c.

25. Шаран, Кишори Java 9. Полный обзор нововведений. Для быстрого ознакомления и миграции / Кишори Шаран. - М.: ДМК Пресс, 2017. - 690 c.