При онлайн-мониторинге подсчета голосов на выборах в Государственную думу, прошедших в декабре 2011 года, по каналу «Россия» был показан результат мониторинга процентного соотношения голосов избирателей, отданных за различные партии, и в некоторый момент трансляции подсчета промежуточных результатов сумма процентов голосов, поданных за все партии по Ростовской области, оказалась равной 146,47%. Наблюдатели сразу заговорили о «руке Москвы», контроле и корректировке свободного волеизъявления граждан и т. п. Как бы то ни было, так родился мем «146%», а соответствующее изображение (рис. 1) до сих пор воспринимается как факт намеренного искажения результатов выборов. Общераспространенный смысл мема состоит в том, что свободное волеизъявление граждан бесполезно, а демократические свободы иллюзорны. Однако похоже, что причиной его рождения является не злонамеренное искажение результатов выборов, а банальная некомпетентность программистов.

Рис.1. Cумма голосов за все партии — 146,47%
Рис.1. Cумма голосов за все партии — 146,47%

 

Подсчет голосов избирателей на выборах 2011 года проводился с помощью системы ГАС «Выборы». Это распределенная система, которая поддерживает множество процессов, параллельно работающих с общими данными и обеспечивающих сбор и передачу в ЦИК сведений от порядка 100 тыс. участковых избирательных комиссий из 83 субъектов Федерации. Проблема онлайн-мониторинга промежуточных результатов в такой системе процессов является классической для параллельного программирования — это «проблема построения мгновенного общего состояния параллельно выполняющихся процессов (snapshot)». Давно известно, что она не может быть корректно решена ни наивным сбором и обработкой распределенных данных, ни простой синхронизацией в реальном времени распределенных программ [1].

Аналогичный инцидент произошел на радио «Эхо Москвы» в передаче «Перехват», которую 24 сентября 2011 года вел Алексей Венедиктов. Во время передачи при обсуждении кандидатур Путина и Медведева было запущено телефонное голосование, во время которого ведущий проводил онлайн-мониторинг промежуточных результатов. В какой-то момент система голосования выдала 111% [2].

Сервис поддержки телефонного голосования для «Эха Москвы» — это также параллельная программа, построенная из нескольких параллельно функционирующих процессов, работающих с разделяемыми структурами данных (рис. 2). Один из процессов должен следить за звонками по первому телефонному номеру, увеличивая число проголосовавших за первую альтернативу, второй должен делать то же для другого телефонного номера. Для онлайн-мониторинга результатов в простейшем варианте можно построить процессы, выполняющие подсчет общего числа проголосовавших (процесс Р3), а также подсчет процентного соотношения тех, кто проголосовал за каждую альтернативу (процессы Р4 и Р5). Однако представленное наивное решение проблемы некорректно — любой специалист по параллельному программированию определит, что в ходе голосования здесь могут быть получены любые промежуточные значения. Очевидно, что использованная на радио «Эхо Москвы» программа параллельная, а произошедший инцидент демонстрирует, что она работает некорректно. Результат «146%» свидетельствует о подобной же ошибке в программе ГАС «Выборы».

 

Рис. 2. Параллельная программа для поддержки голосования, состоящая из пяти процессов
Рис. 2. Параллельная программа для поддержки голосования, состоящая из пяти процессов

 

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

Истинная цена программных ошибок

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

Майкл Живич, Роберт Каннингэм

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

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

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

***

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

Литература

  1. K. Many Chandy, Leslie Lamport. Distributed Snapshot: Determing Global States of Distributed Systems // ACM Transactions on Computer Systems. Vol. 3, No 1, Febr. 1985, P. 63–75.
  2. URL: http://www.echo.msk.ru/programs/interception/814452-echo (дата обращения 18.05.2014).
  3. Вячеслав Любченко. Многоядерный тупик: выход есть // Открытые системы.СУБД. — 2013. — № 8. — С. 52–54. URL: http://www.osp.ru/os/2013/08/13037860 (дата обращения: 11.06.2014).
  4. Борис Штейнберг. Открытая распараллеливающая система // Открытые системы.СУБД. — 2007. — № 9. — С. 36–41. URL: http://www.osp.ru/os/2007/09/4567122 (дата обращения: 11.06.2014).

Юрий Карпов (karpov@dcn.ftk.spbstu.ru) — зав. кафедрой «Распределенные вычисления и компьютерные сети», Санкт-Петербургский политехнический университет.