Брайан Керниган

Основы информационных технологий для неспециалистов: что происходит внутри машин

Посвящается Мэг

Understanding the Digital World:

What You Need to Know about Computers, the Internet, Privacy, and Security, Second Edition by Brian W. Kernighan.

Copyright © 2021 by Princeton University Press

All rights reserved.

No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage and retrieval system, without permission in writing from the Publisher.

Библиотека ИТ. Главные книги о современных технологиях

© Жевлакова Е.В., перевод на русский язык, 2024

© Оформление. ООО «Издательство «Эксмо», 2024

Предисловие

Курс под названием «Компьютеры в нашем мире» я преподаю в Принстоне почти каждую осень начиная с 1999 года. Название курса – размытое до неприличия, но дело в том, что однажды мне пришлось придумать его за пять минут, а поменять с тех пор стало довольно сложно. Впрочем, преподавать этот курс – самая увлекательная часть моей работы, которая и так почти всегда приносит радость.

Факт, что компьютеры и вычислительная техника окружают нас повсюду. Некоторые технологии у всех на виду: у студентов есть ноутбуки, и они намного мощнее компьютера IBM 7094^1, который стоил несколько миллионов долларов, занимал большую комнату с кондиционером и обслуживал весь кампус Принстона, когда я пришел сюда аспирантом в 1964 году. Кроме того, каждый студент пользуется сотовым телефоном, вычислительная мощность которого намного выше, чем у той древней машины IBM. У всех студентов, как и у значительной доли населения земного шара, есть высокоскоростной доступ в интернет. Любой из них может искать информацию в браузере, совершать покупки онлайн, пользоваться электронной почтой, мессенджерами и социальными сетями для общения с друзьями и семьей.

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

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

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

В июле 2013 года Эдвард Сноуден, подрядчик Агентства национальной безопасности (АНБ) Соединенных Штатов Америки, предоставил журналистам 50 000 документов, в которых раскрывалось, что сотрудники АНБ регулярно отслеживали электронные средства связи: звонки, сообщения, письма, интернет – и собирали данные почти по каждому жителю мира. Что примечательно, они следили и за американцами, которые жили в своей стране и не представляли никакой угрозы ее безопасности. Документы Сноудена показывали, что и другие государства тоже шпионили за своими гражданами. Удивительно, но после первоначального возмущения общественности все вернулось на круги своя, правительства стали еще более масштабно отслеживать, чем занимаются граждане, и шпионить за ними, а люди либо смирились с этим, либо не возражают по неведению.

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

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

Социальные сети вроде Facebook[1], Instagram[2], X (Twitter), Reddit и других изменили способы общения между людьми. С одной стороны, это полезно: мы можем поддерживать связь с друзьями и семьей, просматривать новости и всевозможные развлекательные посты. Соцсети могут и помочь, как в середине 2020 года, когда движение Black Lives Matter привлекло всеобщее внимание благодаря «вирусным» видеороликам о жестокости полиции.

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

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

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

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

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

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

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

Ричард Мюллер в своей прекрасной книге «Физика для будущих президентов»2 пытается объяснить научно-техническую подоплеку, лежащую в основе проблем, с которыми сталкиваются лидеры: ядерная угроза, терроризм, энергетические кризисы, глобальное потепление и так далее. Эрудированные люди, хоть и не претендующие на пост президента, тоже должны разбираться в этих темах. Если опираться на подход Мюллера, то и мое направление работы можно определить схоже: «Компьютеризация для будущих президентов».

Что будущий президент должен знать о компьютеризации? Что должен знать об этом эрудированный человек – например, вы?3

Я выделяю четыре основные технические области: аппаратное обеспечение, программное обеспечение, коммуникации и данные.

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

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

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

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

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

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

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

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

Любая книга об IT может быстро устареть, и эта не исключение. Предыдущее издание вышло задолго до того, как мы увидели, в каких масштабах враждебные силы способны влиять на общественное мнение и выборы в разных странах. Я дополнил книгу новыми важными историями, многие из которых касаются личной неприкосновенности и безопасности, поскольку за последние годы эти вопросы стали более актуальными. Появилась новая глава об искусственном интеллекте, машинном обучении и о том, как «большие данные»[3] сделали их такими эффективными, а в некоторых случаях – опасными. Я также попытался упростить сложные объяснения, а устаревший материал удалил или заменил. Тем не менее некоторые фрагменты уже устареют или станут неверными, когда вы будете читать эту книгу. Но я приложил все усилия, чтобы четко выделить знания, наделенные непреходящей ценностью.

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

Благодарности

Я снова в большом долгу перед друзьями и коллегами, которые помогали мне улучшить эту книгу. Как и прежде, Джон Бентли с особым вниманием вычитывал многочисленные черновики, а его поддержка в форме организационных предложений, проверки фактов и сбора новых примеров просто неоценима. Аль Ахо, Свати Бхатт, Джованни де Феррари, Пол Керниган, Джон Линдерман, Мадлен Планейкс-Крокер, Арнольд Роббинс, Ян Сон, Говард Трики и Джон Уэйт дали подробные комментарии ко всей рукописи. Я также благодарен Фабрицио д’Аморе, Питеру Грабовски, Эбигейл Гупте, Майе Хамин, Джерарду Хольцманну, Кену Ламберту, Даниэлю Лопрести, Теодору Марку, Джоан Ордилле, Аюши Синхе, Уильяму Угетте, Питеру Вайнбергеру и Франциске Вейрих-Фрейберг за ценные предложения. Корейский перевод предыдущего издания, сделанный Сончан Ха, заметно улучшил и эту английскую версию. Гарри Льюис, Джон Маккормик, Брайан Респасс и Эрик Шмидт не скупились на похвалы для предыдущего издания. Как всегда, было приятно работать с производственной группой издательства Принстонского университета: Марком Беллисом, Лоррейн Донекер, Кристен Хоп, Дмитрием Каретниковым и Хэлли Стеббинс. В свою очередь, Мэри-Эллен Оливер исключительно тщательно вычитала текст и проверила факты.

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

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

Благодарность за второе издание книги «Цифровой мир»

Я снова в большом долгу перед друзьями и коллегами за их щедрую помощь и советы. Как и в случае с первым изданием, Джон Бентли внимательно прочитал несколько черновиков, оставил полезные комментарии на каждой странице, и эта книга стала намного лучше благодаря его вкладу. Ценные предложения, критику и правки я получил также от Свати Бхатт, Джованни Де Феррари, Питера Грабовски, Джерарда Хольцманна, Вики Керн, Пола Кернигана, Эрена Курсуна, Дэвида Малана, Дэвида Маускопа, Дипы Муралидхар, Мадлен Планейкс-Крокер, Арнольда Роббинса, Говарда Трики, Джанет Вертези и Джона Уэйта. Кроме того, я воспользовался полезными советами Дэвида Добкина, Алана Донована, Эндрю Джадкиса, Марка Кернигана, Элизабет Линдер, Жаклин Мислоу, Арвинда Нараянана, Джона Синовица, Питера Вайнбергера и Тони Вирт. Было приятно работать с производственной группой издательства Принстонского университета – Марком Беллисом, Лоррейн Донекер, Дмитрием Каретниковым и Вики Керн. Моя благодарность им всем.

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

Благодарности за книгу «D значит Digital»[4]

Я в большом долгу перед друзьями и коллегами за щедрую помощь и советы. В частности, Джону Бентли – за подробные комментарии почти к каждой странице нескольких черновиков. Клей Бейвор, Дэн Бентли, Хильдо Бирсма, Стю Фельдман, Джерард Хольцманн, Джошуа Кац, Марк Керниган, Мэг Керниган, Пол Керниган, Дэвид Малан, Тали Мо-решет, Джон Рике, Майк Ши, Бьярне Страуструп, Говард Трики и Джон Уэйт внимательно прочитали полные черновики, внесли много полезных предложений и спасли меня от нескольких серьезных оплошностей. Я также благодарю Дженнифер Чен, Дуга Кларка, Стива Элгерсму, Ави Флам-хольца, Генри Лейтнера, Майкла Ли, Хью Линча, Патрика Маккормика, Жаклин Мислоу, Джонатана Рошелла, Кори Томпсона и Криса Ван Вика за ценные комментарии. Я надеюсь, они увидят, что во многих местах я воспользовался их советами, и не заметят, что где-то я этого не сделал.

Дэвид Брэйлсфорд дал очень полезные советы по самостоятельной публикации и форматированию текста, полагаясь на личный опыт, приобретенный тяжким трудом. Грег Доенч и Грег Уилсон щедро делились советами по вопросам публикации. За фотографии я в долгу перед Джерардом Хольцманном и Джоном Уэйтом.

Гарри Льюис принимал меня в Гарварде в 2010/2011 учебном году, когда я написал первые несколько черновиков. Советы Гарри и его опыт преподавания аналогичного курса очень пригодились мне, как и его комментарии к многочисленным черновикам. Гарвардская школа инженерных и прикладных наук и Беркмановский центр интернета и общества создали для меня дружественную и вдохновляющую атмосферу, предоставили офис, оборудование и (да, такое бывает!) регулярные бесплатные обеды.

Я особенно благодарен многим сотням студентов, которые прошли курс COS 109 «Компьютеры в нашем мире». Их интерес, энтузиазм и дружелюбие стали неисчерпаемым источником вдохновения. Я надеюсь, что, когда несколько лет спустя они будут руководить миром, окажется, что этот курс пошел им на пользу.

Введение

Это было лучшее из всех времен, это было худшее из всех времен…[5]

Чарльз Диккенс.

Повесть о двух городах, 1859

Мы с женой планировали провести летний отпуск 2020 года в Англии. Мы забронировали номер, внесли предоплату, купили билеты, договорились с друзьями, чтобы они присмотрели за нашим домом и котом… а потом мир изменился.

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

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

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

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

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

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

Стриминговые сервисы вроде Netflix, и так уже популярные, расширили аудиторию. Полный запрет на спортивные мероприятия поспособствовал ускорению развития онлайн-игр и фэнтези-спорта[6].

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

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

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

Я буквально никогда не слышал о Zoom перед тем, как начал использовать его в марте. Эта программа, выпущенная в 2013 году, предоставляла систему для видеоконференций, конкурируя с более крупными игроками вроде Microsoft Teams и Meet от Google (этот проект часто переименовывали). Zoom вышла на фондовую биржу в 2019 году, а сейчас, поздней осенью 2020 года, когда я пишу это, она оценивается в более чем 125 миллиардов долларов^4, что намного выше стоимости таких старых и хорошо известных компаний, как General Motors (61 млрд) и General Electric (85 млрд), и значительно дороже IBM (116 млрд).

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

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

Но у этой истории есть оборотная сторона, не такая радостная.

Ситуация с интернетом, который уже стал рассадником паранойи, ненависти и безумных теорий, еще ухудшилась. Социальные сети позволили политикам и чиновникам распространять ложь, все заметнее разделять нас и избегать ответственности, получая поддержку от «новостных» агентств, не интересующихся фактами. Такие сайты, как Twitter и Facebook[7], безуспешно пытались найти золотую середину – остаться нейтральной платформой для свободного выражения идей, но сдержать шквал провокационных постов и откровенной лжи.

Слежка вышла на новый уровень: во многих странах применялись технологии для ограничения прав людей, мониторинга их поведения и контроля над ним. Например, в Китае, помимо прочего, использовалась технология распознавания лиц для надзора за национальными меньшинствами. Во время пандемии COVID-19 китайское правительство обязало граждан установить приложение, которое работает как своего рода паспорт иммунитета, но также сообщает полиции о местонахождении пользователей^5. В США и Великобритании местные правоохранительные органы приглядывают за людьми, полагаясь на систему распознавания лиц, считыватели номерных знаков и тому подобное.

Наши мобильные телефоны постоянно фиксируют местоположение, и различные субъекты могут агрегировать эти данные. Приложения для отслеживания смартфонов – отличный пример двойственности технологий. Кто станет возражать против системы отслеживания контактов с COVID-19, которая уведомляет вас, общались ли вы с потенциально заразным человеком? Но любая технология, позволяющая правительству узнать, где вы были и с кем разговаривали, в том числе помогает ему более эффективно вести мониторинг и контроль. Это короткий и скользкий путь от отслеживания заболеваемости к выявлению мирных протестующих, инакомыслящих, политических оппонентов, изобличителей и всех остальных, кого власти воспринимают как угрозу. (Неясно, работает ли вообще отслеживание контактов на основе приложений, поскольку оно очень часто выдает ложноположительные и ложноотрицательные результаты^6.)

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

Наблюдением занимаются не только компании, но и правительство. То, что обнародовал Эдвард Сноуден, – электронные письма АНБ, внутренние отчеты, презентации PowerPoint, – многое поведало о шпионаже в цифровую эпоху^7. Суть в том, что АНБ следит за всеми в грандиозных масштабах.

Разоблачения Сноудена ошеломляли. Многие подозревали, что АНБ шпионит за людьми активнее, чем признаётся, но истинный размах превзошел воображение. Сотрудники АНБ регулярно собирали метаданные обо всех телефонных разговорах в США – кто и кого вызывал, когда и как долго они беседовали – и могли даже записывать сами звонки. Они сохраняли мои разговоры по Skype, контакты по электронной почте, а также, возможно, содержимое моих писем. (И ваших, конечно, тоже.) Они прослушивали телефонные разговоры мировых лидеров. Они перехватывали громадные объемы интернет-трафика, установив записывающие устройства на оборудование в тех местах, где подводные кабели входят на территорию США или покидают ее. Они склоняли и принуждали крупные телекоммуникационные и интернет-компании собирать и передавать информацию о своих пользователях. Они длительное время хранили громадное количество данных, делясь некоторыми из них со шпионскими агентствами других стран^8.

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

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

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

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

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

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

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

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

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

Считается, что прогресс приносит пользу, и во многих отношениях это действительно так. Но нет добра без худа. Самый очевидный из негативных факторов (и, пожалуй, наиболее тревожный для людей на личном уровне) – влияние технологий на неприкосновенность частной жизни. Когда вы пользуетесь телефоном, чтобы найти какой-нибудь продукт, а затем посещаете интернет-магазины, все участники этого процесса записывают ваши переходы по страницам. Они знают, кто вы такой, потому что идентифицируют вас по смартфону. Они знают, где вы находитесь, потому что телефон постоянно передает координаты вашего местоположения с точностью до 100 метров. Телефонные компании записывают эти сведения и затем могут продать их. Служба GPS (система глобального позиционирования) работает с точностью до 5-10 метров. Когда вы включаете ее, то информация о вашем местонахождении становится доступной для приложений, и их владельцы тоже могут продавать ее. Вообще дела обстоят даже хуже: когда вы выключаете службу позиционирования, то запрещаете использовать GPS-данные только приложениям. Но это совсем не препятствует операционной системе смартфона собирать и выгружать данные через телефонную сеть, Wi-Fi или Bluetooth^10.

В реальной жизни за вами наблюдают так же, как и онлайн. Технология распознавания лиц способна узнать вас на улице или в магазине. Дорожные камеры умеют сканировать ваши номерные знаки и определять, где сейчас ваш автомобиль. То же самое делают электронные системы взимания платы за проезд. Подключенные к интернету умные термостаты, автоответчики, дверные замки, радионяни и камеры наблюдения – это устройства слежки, нами же приглашенные в наш дом. Методы надзора, описанные в романе Джорджа Оруэлла «1984», выглядят дилетантскими на фоне того отслеживания, с которым мы сегодня смиряемся, даже не думая о нем.

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

Десять или двадцать лет назад мы даже не представляли, насколько уязвимыми для незнакомых нам людей сделают нас универсальная сеть и ее цифровая информация. Как говорит Брюс Шнайер в своей превосходной книге «Данные и Голиаф»11: «Неприкосновенность нашей частной жизни поставлена под удар из-за непрерывного наблюдения. Чтобы осознать, как высоки ставки, критически важно понять, как это происходит».

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

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

Часть I

Аппаратное обеспечение

О Господи, как жаль, что эти расчеты выполнены не с помощью пара!

Чарльз Бэббидж, 1821 год[8]

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

Вычислительная техника имеет долгую историю, однако самые ранние устройства предназначались только для решения узких задач – нередко для предсказания астрономических событий и положений. Например, согласно одной (недоказанной) теории, Стоунхендж был астрономической обсерваторией. Антикитерский механизм, датируемый примерно 100 годом до н. э., применялся для астрономических вычислений и отличается чрезвычайно замысловатой конструкцией. Арифметические устройства вроде абака или счет использовались людьми на протяжении тысячелетий, особенно в Азии. В начале 1600-х годов, вскоре после того как Джон Непер описал логарифмы, появилась счетная линейка. Я вычислял на такой, когда еще учился на инженера в 1960-х годах. Но сейчас логарифмические линейки – диковинка. Их заменили калькуляторы и компьютеры, а мои старательно приобретенные навыки стали бесполезными.

Наиболее значимый предок современных компьютеров – жаккардовый ткацкий станок, изобретенный Жозефом Мари Жаккардом во Франции около 1800 года. В этом агрегате применялись прямоугольные карточки с многочисленными рядами отверстий, которые задавали узоры плетения. Соответственно, жаккардовый станок «программировали» на создание разнообразных узоров по инструкциям, которые он получал на перфорированных карточках. Меняя карты, вы получали другие комбинации плетения^12. Создание машин, которые уменьшали трудозатраты, привело к социальным потрясениям, поскольку ткачи теряли работу: так, в 1811–1816 годах движение луддитов в Англии яростно выступало против механизации. Современные вычислительные технологии аналогичным образом привели к расколу.

Рис. 1.1. Современное воплощение разностной машины Бэббиджа^13

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

Чарльз поощрял интерес к математике и своим вычислительным устройствам у молодой Августы Ады Байрон – дочери поэта Джорджа Байрона, впоследствии графини Лавлейс. Она составила подробные описания о том, как использовать аналитическую машину Бэббиджа (наиболее передовое из его спроектированных устройств) для научных вычислений и предположила, что это устройство может даже выполнять нечисловые операции – в частности, сочинять музыку. «Если предположить, например, – писала она, – что основные соотношения высоких звуков в науке гармонии и музыкальной композиции поддаются таким отображениям и изменениям, то машина способна сочинять тщательно продуманные и научные музыкальные произведения любой сложности или протяженности^15». Аду Лавлейс часто называют первым в мире программистом, а язык программирования Ada назван в ее честь^16.

Герман Холлерит, сотрудник Бюро переписи населения США, в конце XIX века изобрел и построил устройства, которые сводили в таблицы сведения о жителях страны намного быстрее, чем при ручной обработке. Применяя идеи жаккардового ткацкого станка, Холлерит пробивал отверстия в карточках из плотной бумаги, тем самым кодируя данные переписи в формате, подходящем для обработки его машинами. Примечательно, что для получения сводных таблиц переписи 1880 года потребовалось восемь лет, но благодаря перфокартам и счетным машинам Холлерита итоги переписи 1890 года появились всего через год, а не через десять или больше, как прогнозировалось. Герман основал компанию, которая в 1924 году благодаря слияниям и приобретениям превратилась в International Business Machines, известную сегодня как IBM.

Рис. 1.2. Ада Лавлейс. Фрагмент портрета работы Маргарет Сары Карпентер, 1836 год^17

Машины Бэббиджа представляли собой сложные механические конструкции из шестеренок, колес, рычагов и стержней. Развитие электроники в XX веке позволило спроектировать компьютеры, в которых уже не применялись механические компоненты. Первой серьезной электрической машиной стал ENIAC (Electronic Numerical Integrator and Computer[9]), созданный Преспером Эккертом и Джоном Мокли в 1940-х годах в Пенсильванском университете в Филадельфии. ENIAC занимал просторное помещение и требовал огромного количества электроэнергии, а выполнял при этом около 5000 операций сложения в секунду. Предполагалось, что устройство будут использовать для баллистических расчетов и тому подобного, но его достроили только в 1946 году, уже после окончания Второй мировой войны^18. (Части ENIAC выставлены в Электротехнической школе Мура при Пенсильванском университете.)

Еще Бэббидж четко понимал, что вычислительные устройства могут сохранять свои командные инструкции и данные в одной и той же форме. Но в памяти ENIAC содержалась только информация, а программировали его путем настройки соединений с помощью реле и переключения кабелей. Первые компьютеры, способные совместно хранить программы и данные, создали в Кембридже в 1949 году. Они назывались EDS АС (Electronic Delay Storage Automatic Calculator – электронные автоматические вычислители с задержкой хранения).

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

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

1. Что такое компьютер?

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

Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.

Предварительное рассмотрение логического устройства электронного вычислительного прибора^19, 1946

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

Подумайте о ваших вычислительных устройствах. У многих читателей наверняка есть ПК, то есть или ноутбук, или настольный компьютер, произошедший от тех самых PC (Personal Computer, персональный компьютер), которые продавала компания IBM в 1981 году. Если у вас такой ПК, он работает на какой-нибудь версии операционной системы Windows от Microsoft. У других имеется Apple Macintosh под управлением той или иной версии macOS^20. У третьих – хромбук (Chromebook) на операционной системе ChromeOS, которая задействует интернет для большей части вычислений и хранения данных. Более специализированные устройства вроде смартфонов, планшетов и электронных книг тоже представляют собой мощные вычислительные машины. Они все выглядят по-разному, и при использовании каждое из них ощущается по-своему, но внутри они устроены в принципе одинаково. Мы поговорим о причинах этого.

Можно провести небольшую аналогию с машинами. Функционально автомобили не меняются уже больше ста лет. В каждом из них есть двигатель, который работает на каком-либо топливе и приводит машину в движение. Есть руль, с помощью которого водитель управляет автомобилем. Есть место, где содержится топливо, а также пространство для пассажиров и их вещей. Однако физически машины сильно преобразились за столетие: их изготавливают из других материалов, они стали быстрее, безопаснее, надежнее и удобнее. Есть огромная разница между моей первой машиной (подержанным Volkswagen Beetle[10] 1959 года выпуска) и Ferrari, но любая из них доставит меня и мои продукты домой из магазина или провезет через всю страну, и в этом смысле они функционально одинаковы. (Отмечу для ясности, что я никогда даже не садился в Ferrari, не говоря уже о том, чтобы владеть ею, поэтому лишь предполагаю, что там хватит места для продуктов. Правда, однажды я припарковался рядом с одной из них: см. рис. 1.1.)

Рис. 1.1. Самое близкое расстояние, на которое я когда-либо подходил к Ferrari

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

Различия между функциями и физическими свойствами – то есть между тем, что делает объект, и тем, как он устроен или работает внутри, – имеют большое значение. Для компьютеров часть «как это устроено» меняется удивительными темпами, как и их быстродействие, но вот часть «что делает» довольно стабильна. Такое различие между абстрактным описанием и конкретным воплощением будет неоднократно обсуждаться в дальнейшем.

На первой лекции я иногда провожу опрос среди студентов: у скольких из вас есть ПК, у скольких из вас есть Мас? В начале 2000-х годов соотношение уверенно держалось в области 10 к 1 в пользу ПК, но за несколько лет быстро изменилось, и теперь на долю Mac приходится более 75 % компьютеров. Впрочем, это нетипично для мира в целом, где ПК доминируют с большим отрывом.

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

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

На стороне Mac стоят надежность, качество, эстетическая привлекательность и ощущение, что «все просто работает», а за такое многие потребители готовы приплачивать.

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

Аналогичные дебаты ведутся и о телефонах. Почти у каждого есть смартфон («умный телефон»), который может запускать программы («приложения»), загруженные из Apple App Store, Google Play Store или иных магазинов приложений. Телефон служит браузером, почтой, часами, камерой, проигрывателем музыки и видео, диктофоном, картой, навигатором, средством для сравнения цен в магазинах, а иногда по нему даже звонят и общаются. Обычно примерно три четверти моих студентов владеют iPhone, и почти все остальные – смартфоном на ОС Android от разных поставщиков. iPhone стоят дороже, но они обеспечивают более плавную интеграцию с экосистемой компьютеров, планшетов, часов, музыкальных плееров и облачных сервисов от Apple: вот вам и еще один пример эффекта сетевой выгоды. Лишь изредка кто-то признаётся, что пользуется только «кнопочным телефоном», у которого нет дополнительных функций, кроме возможности совершать звонки. Я проводил исследование в США среди сравнительно обеспеченных людей, а в других странах и группах населения смартфоны на Android будут распространены гораздо шире.

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

1.1. Логическое построение

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

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

Базовая организация – процессор, память и хранилище для инструкций и данных, а также устройства ввода и вывода – была стандартной с 1940-х годов. Ее часто называют архитектурой фон Неймана в честь Джона фон Неймана, который описал ее в цитируемой выше статье 1946 года. Хотя и сейчас порой возникают дискуссии о том, не получает ли фон Нейман слишком много славы за работу, проделанную другими, его статья написана столь ясно и познавательно, что ее стоит прочесть даже сегодня. Например, цитата в начале текущей главы – это первое предложение его статьи. В переводе на современную терминологию, процессор обеспечивает арифметические операции и управление, оперативная и внешняя память – хранение в памяти, а клавиатура, мышь и дисплей взаимодействуют с человеком-оператором.

Рис. 1.2. Архитектурная схема простого идеализированного компьютера

Примечание по терминологии: процессор исторически назывался ЦПУ, или центральное процессорное устройство, но сейчас его часто именуют просто «процессор». Оперативную память часто называют ОЗУ, или оперативное запоминающее устройство, а внешнюю память – диск или накопитель, что отражает разницу в их материальных воплощениях. В основном я буду использовать слова «процессор», «память» и «хранилище», но иногда вы встретите старые термины.

1.1.1. Процессор

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

Если вы зайдете в магазин онлайн или офлайн, чтобы купить компьютер, то наткнетесь на описание всех компонентов, где обычно указываются загадочные аббревиатуры и не менее загадочные цифры. Например, вам может встретиться такое описание процессора – «2.2 GHz двухъядерный Intel Core 17», как в одном из моих компьютеров. Что это такое? Данный процессор произведен компанией Intel, a Core i7 – это название их обширной линейки. Он имеет два процессорных блока в одном корпусе: в этом контексте «ядро» синонимично «процессору». Любое ядро – само по себе процессор, однако в ЦПУ может входить несколько ядер, которые работают либо вместе, либо раздельно, но вычисления ускоряются в любом случае. Чаще всего приемлемо определять такую конструкцию как «процессор» независимо от того, сколько в ней ядер.

«2,2 ГГц» – это более интересная часть. Скорость процессора можно измерить, пусть даже примерно, подсчитав количество операций, команд или их частей, которые он способен произвести за секунду. Для пошагового выполнения своих основных операций процессор полагается на внутренние часы, которые «отбивают ритм», как сердцебиение или метроном. Один из показателей скорости – количество таких тактов в секунду. Один удар или такт в секунду называется одним герцем (сокращенно Гц) в честь немецкого инженера Генриха Герца, который в 1888 году открыл, как получать электромагнитное излучение, что напрямую привело к появлению радио и других беспроводных систем. Радиостанции вещают на частотах, измеряемых в мегагерцах (миллионах герц), например 102,3 МГц. Современные компьютеры, как правило, функционируют с частотой в миллиарды герц, или гигагерц – ГГц. Значит, мой довольно обычный процессор в 2,2 ГГц работает со скоростью 2 200 000 000 тактов в секунду. Человеческое сердце бьется с частотой примерно 1 Гц, или почти 100 000 ударов в день, то есть около 30 миллионов ударов в год. Итак, каждое ядро в моем процессоре за одну секунду выполняет столько операций, сколько мое сердце совершило бы за 70 лет.

Выше мы познакомились с некоторыми «числовыми» приставками вроде «мега» и «гига», которые весьма распространены в компьютерных системах. Мега – это один миллион, или 10^6, а гига (ударение на первый слог) – один миллиард, или 10^9. Вскоре мы познакомимся с другими приставками, полный список которых вы можете найти в глоссарии.

1.1.2. Оперативная память

Оперативная память хранит информацию, которая активно используется процессором и другими частями компьютера, причем ЦПУ способно изменять ее содержимое. В оперативной памяти содержатся не только данные, с которыми в данный момент работает процессор, но и инструкции по совершаемым операциям. Это чрезвычайно важный момент: загружая различные инструкции в память, мы можем «поручать» процессору разные вычисления. Благодаря этому ЭВМ с хранимой программой становится устройством общего назначения. Один и тот же компьютер способен запускать текстовый редактор и электронные таблицы, просматривать веб-страницы, отправлять и получать электронную почту, поддерживать связь с друзьями на Facebook[11], помогать с налогами и проигрывать музыку. И все это благодаря размещению подходящих инструкций в памяти. Важность концепции хранимой программы невозможно переоценить.

Оперативная память предоставляет место для хранения информации во время работы компьютера. В ней содержатся инструкции программ, которые на данный момент активны, – например, Word, Photoshop или браузера. Также в ней хранятся их данные: редактируемые документы, изображения на экране, воспроизводимая в данный момент музыка. Наконец, там же размещаются инструкции оперативной системы – Windows, macOS или какой-либо иной, – которая работает за кулисами и позволяет вам запускать несколько приложений одновременно. Мы поговорим о приложениях и оперативных системах в главе 6.

Оперативную память также называют памятью с произвольным доступом (англ, random access memory, или RAM, а в русской терминологии – ОЗУ, оперативное запоминающее устройство), потому что процессор может одинаково быстро достать информацию из любой части устройства. Если немного упростить, то доступ к ячейкам памяти в случайном порядке не приводит к потере скорости. Хотя видеокассеты давно ушли в прошлое, возможно, вы помните, что если вам хотелось посмотреть конец фильма, то приходилось ускоренно перематывать вперед (плавно!) от начала. Такой доступ называется последовательным.

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

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

Что такое емкость? В ноутбуке, на котором я сейчас печатаю, емкость оперативной памяти составляет 8 миллиардов байт, или 8 гигабайт (8 Гб), чего, возможно, слишком мало. Причина в том, что для ускорения вычислений обычно требуется увеличение объема памяти, поскольку ее никогда не хватает на все программы, которые одновременно хотят ее использовать, и требуется время, чтобы извлечь из нее части неактивной программы, освобождая место для чего-то нового. Если вы хотите, чтобы ваш компьютер работал быстрее, то, скорее всего, лучший вариант – купить больше «оперативки». По крайней мере, если предусмотрена возможность расширения памяти, что бывает не всегда.

1.1.3. Внешняя память

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

Жесткий диск хранит информацию, задавая направление намагничивания крохотных участков магнитного материала на вращающихся металлических поверхностях. Данные содержатся на концентрических дорожках, которые записываются и считываются датчиком, перемещающимся с дорожки на дорожку. Жужжание и щелчки, которые вы слышите при работе старого компьютера, издает диск, перемещая датчик в нужные места на поверхности. Поверхность диска вращается с огромной скоростью, как минимум 5400 оборотов в минуту. На изображении стандартного диска ноутбука (рис. 1.3) показаны поверхность и датчик. Диаметр тарелки жесткого диска составляет 6,35 см (2,5 дюйма).

Хранение одного байта на диске примерно в 100 раз дешевле, чем на ОЗУ, но при этом доступ к информации происходит медленнее. Дисководу требуется примерно 10 миллисекунд, чтобы добраться до определенной дорожки на поверхности, и скорость передачи данных составляет около 100 Мб/с.

Рис. 1.3. Внутренняя структура жесткого диска

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

Обычный SSD для ноутбука вмещает от 250 до 500 Гб. Различные внешние диски, которые можно подключить к разъему USB, имеют емкость до нескольких терабайт (Тб), и они по-прежнему основываются на вращающихся механизмах. «Тера» означает триллион, или 10^12, и это еще одно обозначение, с которым вы будете часто сталкиваться.

Кстати, насколько велик терабайт или гигабайт? Один байт хранит один буквенный знак стандартного английского алфавита. Роман «Гордость и предубеждение» объемом около 250 бумажных страниц содержит 680 000 знаков, и тогда 1 Гб может хранить около 1500 копий этого произведения^21. Впрочем, мне бы вполне хватило одной копии, а на свободное место я записал бы какую-нибудь музыку. Одна минута музыки в формате MP3 занимает около 1 Мб. Значит, если я запишу МР3-версию одного из моих любимых звуковых компакт-дисков The Jane Austen Songbook объемом около 60 Мб, то в одном гигабайте памяти хватит места еще для 15 часов музыки. Сериал «Гордость и предубеждение» 1995 года (производство ВВС, в главных ролях Дженнифер Эль и Колин Фёрт) на двух DVD занимает менее 10 Гб, поэтому я могу сохранить на одном терабайте его и еще сотню подобных фильмов.

На примере дискового накопителя очень удобно объяснять различия между логической структурой и физической реализацией. Программы вроде File Explorer («Проводник») для Windows или Finder для macOS отображают содержимое диска в виде иерархии папок и файлов. Но хранить сами данные можно на вращающемся оборудовании, в интегральных схемах без подвижных частей или на чем-то совершенно другом. Тип накопителя на компьютере не имеет значения. Аппаратное обеспечение в виде диска и программное обеспечение в рамках ОС, называемое файловой системой, работают вместе, создавая организационную структуру. Мы вернемся к этой теме в главе 6.

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

1.1.4. Другие устройства

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

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

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

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

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

1.2. Механическая конструкция

На занятиях я раздаю всевозможные образцы «железа» (найденные за десятки лет лазания по помойкам) со снятыми кожухами. В информатике столь много абстрактного, что бывает довольно полезно увидеть и потрогать диски, чип с интегральными схемами, пластины, в которые они встроены, и т. д. Также интересно посмотреть на эволюцию некоторых устройств. Например, современный жесткий диск ноутбука внешне неотличим от своих предшественников, выпущенных десять или двадцать лет назад. Емкость более нового диска увеличилась в 10-100 раз, но эти улучшения невидимы. То же самое относится и к картам памяти (SD), которые мы используем, например, в камерах. Их современные корпуса идентичны тем, что применялись несколько лет назад (рис. 1.4), но емкость карт намного выше, а цена ниже.

Так, изображенная здесь карта на 32 Гб стоит меньше 10 долларов.

Рис. 1.4. SD-карты весьма разной емкости

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

Рис. 1.5. Печатная плата для ПК, выпущена ок. 1998 года.

Размер 12 × 7,5 дюймов (30 × 19 см)

На рис. 1.5 показана печатная плата для настольного ПК конца 1990-х годов. Такие компоненты, как процессор и память, смонтированы на плате (или вставлены в нее) и соединены проводами, проложенными на другой стороне. На рис. 1.6 показана часть оборотной стороны той же печатной платы, где параллельно идущие печатные провода – это шины разного типа.

Рис. 1.6. Шины на печатной плате

Электронные схемы в компьютерах формируются из нескольких базовых элементов, представленных в большом количестве. Наиболее важный из них – логический вентиль, который вычисляет одно выходное значение на основе одного или двух входных. Он использует входные сигналы (напряжение или силу тока) для управления выходным сигналом аналогичного вида. При наличии достаточного количества таких вентилей, соединенных правильным образом, возможно производить вычисления любого типа. Чарльз Петцольд в своей книге «Код»22 удачно знакомит нас с этим процессом, а на многочисленных веб-сайтах представлены графические анимации, которые показывают, как логические схемы выполняют арифметические и другие вычисления.

Основным элементом схемы служит транзистор — устройство, изобретенное в Лабораториях Белла[12] в 1947 году учеными Джоном Бардином, Уолтером Браттейном и Уильямом Шокли, которые в 1956 году получили за это Нобелевскую премию по физике. В компьютере транзистор играет роль переключателя, который может включать и выключать ток под воздействием напряжения. На таком простом основании можно построить сколь угодно сложные системы.

Логические вентили раньше собирались из дискретных компонентов: вакуумных (электронно-лучевых) трубок размером с электрическую лампочку в ENIAC и отдельных транзисторов величиной примерно с карандашный ластик в компьютере 1960-х годов. На рис. 1.7 показаны копия первого транзистора (слева), вакуумная трубка и процессор в корпусе. Сама схема находится в центре и занимает площадь около 1 кв. см, а электронно-лучевая трубка имеет длину около 4 дюймов (10 см). Современный процессор такого размера содержал бы в себе несколько миллиардов транзисторов.

Логические вентили создаются на интегральных схемах, или ИС, которые часто называют микросхемами или микрочипами.

Интегральная схема содержит все компоненты и проводку электронной схемы на одной плоской поверхности (тонкий лист полупроводника), которая создается путем сложной последовательности оптических и химических процессов. В итоге получается схема без дискретных элементов и проводов обычного вида. Такие ИС намного компактнее и надежнее, чем схемы с дискретными компонентами. Микросхемы массово изготавливаются на круглых кристаллических пластинах (платах) диаметром 12 дюймов (30 см): из них затем нарезаются отдельные микросхемы, каждую из которых помещают в свой корпус. Обычная микросхема (рис. 1.7, внизу справа) монтируется в больший по размеру корпус с 10-100 штырьками, соединяющими ее с остальной системой. На рис. 1.8 показана интегральная схема в корпусе, где сам процессор находится в центре, и его площадь составляет около 1 кв. см.

Рис. 1.7. Вакуумная трубка, первый транзистор, микросхема процессора в корпусе

Рис. 1.8. Чип интегральной схемы

Из-за того, что интегральные схемы основаны на кремнии, регион в Калифорнии к югу от Сан-Франциско, где впервые возник бизнес по производству этих схем, стали называть Кремниевой долиной. Сейчас так условно называют все высокотехнологичные предприятия в этом регионе, а это название стало вдохновляющим для десятка подражателей, таких как Кремниевая аллея (Silicon Alley) в Нью-Йорке и Кремниевый торфяник (Silicon Fen) в Кембридже, Англия.

ИС изобрели примерно в 1958 году, причем открытие независимо друг от друга сделали Роберт Нойс и Джек Килби. Нойс умер в 1990 году, но Килби за свой вклад получил в 2000 году Нобелевскую премию по физике. Хотя интегральные схемы занимают центральное место в цифровых устройствах, другие технологии здесь также используются: магнитное запоминающее устройство для дисков, лазеры для CD и DVD и оптическое волокно для сетей. За последние 50–60 лет все они радикально изменились в размерах, производительности и стоимости.

1.3. Закон Мура

В 1965 году Гордон Мур, который затем станет соучредителем компании Intel и будет работать там генеральным директором на протяжении многих лет, опубликовал короткую статью под названием «Втиснуть больше компонентов в интегральные схемы»23. Экстраполируя очень ограниченное количество данных, Мур заметил, что с усовершенствованием технологий количество транзисторов, которые удавалось встроить в интегральные схемы заданного размера, удваивалось примерно каждый год. Затем, пересмотрев расчеты, он изменил этот показатель на «каждые два года», а другие исследователи говорили о 18 месяцах. Поскольку вычислительную мощность можно грубо определять по количеству транзисторов, то она тоже удваивалась каждые два года, если не быстрее. За 20 лет должно было произойти 10 удвоений, и количество устройств увеличилось бы в 2^10, то есть примерно в 1000 раз. За 40 лет – в миллион раз или больше.

Такой экспоненциальный рост, ныне известный как закон Мура, продолжается уже почти 60 лет, и поэтому в интегральные схемы сейчас встраивают в миллион раз больше транзисторов, чем в 1965 году. График действия закона Мура, особенно для микросхем процессора, показывает рост количества транзисторов от пары тысяч для ЦПУ Intel 8008 в начале 1970-х годов до миллиарда в ЦПУ недорогих потребительских ноутбуков нашего времени.

Наилучшим образом масштабы схемы характеризует какое-либо отдельное число, обозначающее размер того или иного элемента интегральной схемы – например, ширину провода или активной части транзистора. Этот показатель неуклонно сокращается на протяжении многих лет. В первой (и единственной) интегральной схеме, которую я однажды разрабатывал в 1980 году, величина элементов равнялась 3,5 микрона (3,5 микрометра). В 2021 году для многих ИС минимальный размер элементов составлял 7 нанометров, или 7 миллиардных долей метра, а следующим шагом будет 5 нанометров. «Милли» – это одна тысячная доля, или 10-3; «микро» – одна миллионная, или 10-6; «нано» – одна миллиардная, или 10-9, а нанометр сокращенно обозначается как нм. Для сравнения: толщина листа бумаги или человеческого волоса составляет 100 микрометров, или 1/10 миллиметра.

Если ширина элементов в интегральной схеме уменьшится в 1000 раз, то количество компонентов на единицу площади увеличится в квадратной зависимости, т. е. в миллион раз. Соответственно, там, где по старому производственному процессу размещали тысячу транзисторов, теперь хватит места для миллиарда.

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

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

Скорость процессоров возрастает не особенно – и уж точно больше не удваивается каждые два года, – отчасти потому, что быстрые микросхемы выделяют слишком много тепла. Но объем памяти по-прежнему увеличивается. Так или иначе, процессоры могут использовать больше транзисторов, если поместить два или более ядер ЦПУ на одной микросхеме. Кроме того, в системах зачастую применяются несколько процессорных ИС. Происходит рост количества ядер, а не скорости их работы.

Интересно будет сравнить современный персональный компьютер и первый ПК от IBM, который выпустили 1981 году. Процессор того ПК работал с тактовой частотой 4,77 МГц, то есть почти в 500 раз меньше, чем у процессорного ядра 2,2 ГГц, к тому же у такого ЦПУ обычно два или четыре ядра. Компьютер от IBM располагал 64 килобайтами оперативной памяти, а у современных компьютеров ее в 125 000 раз больше – 8 Гб. («Кило» – это одна тысяча, поэтому сокращение для килобайта – Кб.) Объем памяти гибких дисков для первого ПК составлял не более 750 Кб, а жесткого диска он не имел, тогда как в современных ноутбуках внешней памяти уже почти в миллион раз больше. Первый ПК мог выводить на свой 11-дюймовый монитор только 24 ряда по 80 зеленых символов на черном фоне, а большую часть этой книги я написал, сидя перед 24-дюймовым экраном с 16 миллионами цветов. Компьютер с 64 Кб памяти и одним гибким диском объемом 160 Кб стоил 3000 долларов в 1981 году, что сейчас с учетом инфляции эквивалентно 10 000 долларов, а ноутбук с процессором 2 ГГц, 8 Гб оперативной памяти и SSD-диском на 256 Гб сегодня продается за пару сотен.

1.4. Краткие выводы

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

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

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

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

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

2. Биты, байты и формат записи информации

Если используется основание 2, то результирующие числа можно назвать двоичными цифрами или, более кратко, битами[13] — это слово предложил использовать Дж. У Тьюки.

Клод Шеннон.

Математическая теория связи[14], 1948

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

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

Во-вторых, компьютеры представляют информацию в битах. Бит – это двоичная цифра, то есть число, равное 0 или 1. Внутри вычислительной машины всё записывается в виде битов, а не привычных для нас десятичных чисел.

В-третьих, группы битов представляют более крупные объекты. Числа, буквы, слова, названия, звуки, изображения, фильмы и инструкции, из которых составлены программы для их обработки, – все это представлено в виде групп битов.

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

2.1. Различия аналоговой и цифровой форм

Давайте определим, чем аналоговое отличается от цифрового. Слово «аналог» имеет тот же корень, что и «аналогичный», и поэтому оно подразумевает, что значения изменяются плавно по мере изменения чего-то другого. Многое из того, что окружает нас в повседневности, имеет аналоговую природу – например, водопроводный кран или руль автомобиля. Если вы хотите немного повернуть машину, то немного поворачиваете руль и вообще можете произвести сколь угодно малую регулировку. А теперь посмотрите на поворотник: его можно либо включить, либо выключить, никакого промежуточного положения. В аналоговом устройстве значение (угол поворота машины) меняется плавно и непрерывно, в определенной пропорции к изменению чего-либо (угла поворота руля). Здесь нет четко выраженных шагов: небольшие изменения одного значения приводят к небольшим изменениям в другом.

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

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

Представьте себе спидометр в автомобиле. У меня в машине традиционный аналоговый спидометр, стрелка которого перемещается размеренно и прямо пропорционально скорости движения. Переходы от одного значения скорости к другому совершаются плавно и без прерываний. Но в машине есть также цифровой дисплей, который показывает скорость с точностью до мили (или километра) в час. Если вы начнете двигаться немного быстрее, то число на нем поменяется с 65 на 66. Если поедете чуть медленнее – вернется к 65. Но он никогда не отобразит значение 65,5.

Представьте себе термометр. Те из них, что со столбиком красной жидкости (обычно подкрашенного спирта) или ртути, – аналоговые. Жидкость в них расширяется или сжимается прямо пропорционально изменению температуры, поэтому небольшое изменение температуры вызовет такое же небольшое изменение высоты столбика. А вот устройство на стене здания, высвечивающее «37°», – цифровое. У него числовой дисплей, который будет отображать 37 градусов при любой температуре между З6½ и 37½.

Это может привести к курьезным ситуациям. Год назад я ехал по шоссе в США на расстоянии приема радиосигнала из Канады, где используется метрическая система, и слушал радио. Диктор, стараясь угодить всей своей аудитории, сказал: «За последний час температура по Фаренгейту повысилась на один градус, а температура по Цельсию не изменилась».

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

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

2.2. Аналого-цифровое преобразование

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

2.2.1. Оцифровка изображений

Преобразование изображений в цифровую форму – возможно, самое простое наглядное объяснение процесса. Предположим, мы сфотографировали своего кота (рис. 2.1).

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

Рис. 2.1. Фотография кота, 2020 год

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

Каждый элемент матрицы датчиков представляет собой три детектора, которые измеряют количество красного, зеленого и синего света. Одна такая группа называется пикселем, или элементом изображения[15]. Если размер изображения составляет 4000 на 3000 пикселей, то в нем двенадцать миллионов элементов изображения, или двенадцать мегапикселей, – немного, по меркам современных цифровых фотоаппаратов. «Окраска» пикселя обычно определяется тремя значениями, которые соответствуют интенсивности красного, зеленого и синего цветов, поэтому для изображения размером 12 мегапикселей в сумме записывается 36 миллионов значений интенсивности света. На экране картинка отображается с помощью множества троек красных, зеленых и синих огоньков, уровень яркости которых задается соответствующими значениями в пикселе. Если вы посмотрите на экран телефона, компьютера или телевизора через увеличительное стекло, то разглядите отдельные пятнышки, подобно показаным на рис. 2.2, только цветные. Если вы подойдете достаточно близко к экранам стадионов или цифровых рекламных щитов, то увидите такую же картинку.

Рис. 2.2. RGB-пиксели

2.2.2. Оцифровка звука

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

Что такое звук? Любой его источник вызывает колебания давления воздуха посредством вибрации или других быстрых движений, и наши уши преобразуют эти изменения в нервную активность, которую мозг интерпретирует как звук. Устройство под названием «фонограф», созданное в 1870-х годах Томасом Эдисоном, преобразовывало такие пульсации в бороздку с непостоянной глубиной на восковом цилиндре, и полученная дорожка позже использовалась для воссоздания колебаний давления воздуха. Трансформация звука в дорожку с углублениями представляла собой «запись», а обратное преобразование – «воспроизведение». Изобретение Эдисона быстро совершенствовалось, и к 1940-м годам появились долгоиграющие записи, или грампластинки (рис. 2.3), от которых не отказались до сих пор, хотя в основном их слушают любители ретрозвука.

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

Рис. 2.3. Грампластинка (долгоиграющая запись)

Звук легко визуализировать, если построить график изменения давления воздуха во времени, как показано на рис. 2.4. Значения давления можно передавать любым физическим способом: напряжением или током в электронной схеме, яркостью света или полностью механической системой, как в оригинальном фонографе Эдисона. Высота волн звукового давления здесь соответствует интенсивности или громкости, а по горизонтальной оси отложено время. Число волн в секунду – высота или частота звука.

Рис. 2.4. Волновая форма звукового сигнала

Предположим, что мы измеряем высоту кривой – давление воздуха в микрофоне – через равные промежутки, как показано вертикальными линиями на рис. 2.5.

Рис. 2.5. Оцифровка формы звукового сигнала

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

Воспроизводить звук можно с помощью устройств, которые генерируют на основе числовых значений последовательность изменений напряжения или тока. Полученный сигнал воздействует на динамик или наушники, и так снова создается звук. Трансформация звуковых волн в числа называется аналого-цифровым преобразованием, а соответствующие устройства – аналого-цифровыми преобразователями, или АЦП. Обратный процесс – цифро-аналоговое преобразование. Ни то ни другое не бывает совершенным: при трансформации в обоих направлениях что-то утрачивается. Для большинства людей потери незаметны, хотя аудиофилы утверждают, что цифровой звук не так хорош, как аналоговый с долгоиграющей пластинки.

Первым носителем цифрового звука, рассчитанным на потребителей, стал аудио-компакт-диск, или CD, появившийся примерно в 1982 году. В отличие от грампластинок с аналоговой канавкой, на компакт-дисках записываются числа, для чего применяется длинная спиральная дорожка на одной из сторон. Поверхность в каждой точке дорожки либо гладкая, либо почти незаметно углублена. С помощью таких ямок или их отсутствия кодируются числовые значения волны. Любой участок – это один бит, а последовательность битов передает цифровые значения в двоичном кодировании, что мы обсудим в следующем разделе. Когда диск вращается, лазер освещает дорожку, и фотоэлектрический датчик определяет интенсивность отраженного света. Если она низкая, значит, на участке есть углубление, а если высокая, то ямки нет. При стандартном кодировании на компакт-дисках берется 44 100 выборок звука в секунду. Каждая из них имеет два значения амплитуды (левый и правый каналы для стерео), измеренных с погрешностью не более 1/65 536 – последнее число равняется 2^16. Сами углубления настолько малы, что их можно увидеть только под микроскопом. DVD устроены аналогично, только участки на дорожке меньше, а у лазера более короткая длина волны, что позволяет записывать на них около 5 Гб по сравнению с 700 Мб для CD.

Компакт-диск практически вытеснил грампластинки из обихода, потому что значительно превосходил их во многих отношениях: не такой хрупкий, не подверженный износу (с лазером нет физического контакта), не так сильно боящийся грязи или царапин и в буквальном смысле компактный. Но пластинки периодически возрождаются из пепла, пусть и не слишком масштабно, а вот CD с поп-музыкой находятся в глубоком упадке, потому что ее проще и дешевле загрузить из интернета. Компакт-диски «подрабатывали» как средство хранения и распространения ПО и данных, но затем их место заняли DVD, а тех, в свою очередь, заменили интернет-хранилища и загрузки. Многим читателям аудиодиски уже могут показаться таким же антиквариатом, как и грампластинки. Однако же я рад, что моя музыкальная коллекция полностью состоит из CD (правда, также она хранится в формате MP3 на съемных жестких дисках). Ими я владею по-настоящему, чего нельзя сказать о подборках композиций «в облаке». Выпущенные на производстве диски переживут меня, а вот их копии, возможно, нет: при их записи использовались химические изменения в светочувствительных красителях, чьи свойства могут с течением времени стать иными.

Поскольку звук и изображения содержат больше деталей, чем человек способен воспринять, их можно сжимать. В случае музыки применяются такие методы, как MP3 и AAC (Advanced Audio Coding[16]). Размер файла уменьшается в 10 раз, а ухудшение качества почти неуловимо. Для изображений наиболее распространена техника сжатия JPEG, названная в честь организации-изобретателя – Joint Photographic Experts Group (Совместная экспертная группа по фотографии). С ее помощью можно уменьшить файл картинки в 10 и более раз. Сжатие – один из примеров обработки, которую можно применить к цифровой информации, но чрезвычайно сложно (а то и невозможно) к аналоговой. Подробнее мы обсудим сжатие в главе 8.

2.2.3. Оцифровка фильмов

А что насчет фильмов? В 1870-х годах английский фотограф Эдвард Мейбридж показал, как создать иллюзию движения, быстро и последовательно перемещая статичные снимки. Сегодня в кинофильмах изображения прокручиваются со скоростью 24 кадра в секунду, а в телепередачах – от 25 до 30 кадров в секунду. Это достаточно быстро, чтобы человеческий глаз воспринимал последовательность картинок как непрерывное движение. Для видеоигр данный показатель обычно составляет 60 кадров в секунду, тогда как в старых кинолентах он равен 10, поэтому в них заметно мерцание. О таком искажении нам напоминают давнее обозначение для фильмов (англ, flicks – «мерцание») и современное название Netflix.

В цифровом представлении фильма сочетаются и синхронизируются звуковые и графические компоненты^24. Здесь сжатие можно применить, чтобы уменьшить запрашиваемый объем пространства, как в стандартных форматах вроде MPEG (Moving Picture Experts Group[17]). Ha практике отобразить видео в числах тяжелее, чем аудио. Среди причин – то, что оно сложнее по своей сути, а также то, что большая часть видеозаписей основывается на стандартах широковещательного телевидения, которое почти всегда существовало в аналоговой форме. Сейчас аналоговое ТВ постепенно сворачивается в большинстве стран мира. В США телевещание перевели на цифровой формат в 2009 году, в других странах этот процесс находится на тех или иных стадиях.

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

2.2.4. Оцифровка текста

Некоторые виды информации легко представить в цифровой форме, поскольку не требуется никаких преобразований, кроме согласования формата записи. Рассмотрим обычный текст – набор символов алфавита, цифр и знаков препинания, как в этой книге. Мы могли бы присвоить уникальный номер каждой отдельной букве: А равно 1, В равно 2 и так далее. Получилось бы прекрасное цифровое представление. Фактически именно так все и делается, разве что в стандартном представлении буквам от А до Z соответствуют числа с 65 по 90, от а до z – с 97 по 122, цифрам от 0 до 9 – с 48 по 57, а другие символы, такие как знаки препинания, принимают другие значения. Это представление называется ASCII (American Standard Code for Information Interchange) – стандартный американский код для обмена информацией, принятый в 1963 году.

На рис. 2.6 показана часть ASCII; я опустил первые четыре ряда, в которых содержится табуляция, пробел и другие непечатаемые символы.

Рис. 2.6. Символы ASCII и их числовые значения

В разных географических и языковых регионах существует множество стандартов для набора символов, но мир, по большому счету, сошелся на одном из них, который называется Unicode (Юникод). Он определяет уникальное числовое значение для каждого знака во всех языках. Это большая коллекция, поскольку люди, создавая системы письменности, всегда проявляли бесконечную изобретательность, но редко заботились о систематичности. Unicode включает в себя 140 тысяч символов, и их число неуклонно растет. Как несложно представить, значительную часть объема составляют азиатские знаки вроде набора китайских иероглифов, но ими дело не ограничивается. На веб-сайте Юникода (https://home.unicode.org/) можно просмотреть списки всех символов – это увлекательное занятие, и туда определенно стоит заглянуть.

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

2.3. Биты, байты и двоичная система исчисления

В мире есть только 10 типов людей: те, которые понимают двоичные числа, и те, кто их не понимает.

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

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

2.3.1. Биты

Биты – наиболее элементарный способ представления цифровой информации. Как отмечено в цитате в начале этой главы, «бит» – это сокращение от слов «двоичное число» (англ, binary digit), введенное статистиком Джоном Тьюки в середине 1940-х годов. Эдвард Теллер, хорошо известный как отец водородной бомбы, предпочитал использовать слово «биджит» (bigit), которое, к счастью, не прижилось.

Термин «двоичный», или «бинарный», указывает на то, что нечто имеет два значения (приставка «би» означает «два»), и это действительно так, ведь бит принимает значение либо 0, либо 1, и никакое иное. Тут очевидно различие с десятичными цифрами: они имеют 10 возможных значений, от 0 до 9.

С помощью одного бита мы способны закодировать или представить любую ситуацию, где есть выбор единственного параметра из двух. Таких бинарных вариантов предостаточно: вкл./выкл., истина/ложь, да/нет, высоко/ низко, вход/выход, вверх/вниз, влево/вправо, север/юг, восток/запад и т. д. Одного бита достаточно, чтобы определить, какой элемент из пары выбран. Например, мы можем присвоить «выключить» значение 0, а «включить» – 1, или наоборот. Главное, чтобы все согласились с таким определением.

На рис. 2.7 изображены тумблер питания на моем принтере и стандартный значок «вкл./выкл.», который встречается на многих устройствах. Это тоже символ из Unicode.

Одного бита достаточно, чтобы представить включение/выключение, истину/ложь и подобные двоичные выборы, но нам нужен способ для отображения более обширных диапазонов или более сложных концепций. Для этого мы используем группы битов – всевозможные комбинации нолей и единиц. Например, чтобы представить четыре года обучения в колледже США, возьмем два бита: первокурсник (00), второкурсник (01), третьекурсник (10) и старшекурсник (11). Если у нас появится еще одна категория, скажем, аспирант, то двух битов будет недостаточно – нам понадобится пять возможных значений, а комбинаций из двух битов только четыре. Трех нам хватит, и даже больше того: теперь у нас получится представить до восьми различных категорий, поэтому можно добавить профессуру, штатных преподавателей и научно-педагогических работников. Получатся следующие комбинации: 000, 001, 010, 011, 100, 101, 110 и 111.

Рис. 2.7. Тумблер питания и стандартный значок включения-выключения

Существует правило для соотнесения количества битов и максимального количества элементов, которые удастся обозначить ими. Взаимосвязь проста: если имеется N битов, то число различных способов их скомбинировать равняется 2N, то есть 2 × 2 ×… × 2 (N раз), как показано на рис. 2.8.

Рис. 2.8. Степени числа 2

Аналогичное правило применимо и к десятичным цифрам: если их взято N, то количество их уникальных комбинаций (которые мы называем числами) равно 10N (см. рис. 2.9).

Рис. 2.9. Степени числа 10

2.3.2. Степени чисел 2 и 10

Поскольку все в компьютере обрабатывается в двоичном формате, такие свойства, как размеры и емкости, обычно выражаются в степенях двойки. Если у нас N битов, то возможных значений будет 2N, поэтому удобно знать степени двойки до некоторого значения, скажем, до 2^10. Совсем большие числа, конечно, уже не стоит запоминать. К счастью, есть простой способ – округление, как показано на рис. 2.10. Определенные степени двойки довольно близки к степеням десятки, причем это сходство упорядоченно и его легко запомнить. На той же иллюстрации показан еще один префикс размера – «пета», или 10^15. В глоссарии в конце книги есть более подробная таблица с дополнительными единицами измерения.

Рис. 2.10. Степени чисел 2 и 10

Чем больше значения, тем заметнее разница, но даже при 10^15 округление составляет всего 12,6 %, так что эта схема полезна в широком диапазоне. Вы обнаружите, что люди часто не делают больших различий между степенями 2 и 10 (особенно если это играет им на руку в чем-либо), поэтому «кило» или «1К» могут означать как тысячу, так и 2^10, то есть 1024. Разница обычно невелика, поэтому знать степени чисел 2 и 10 весьма полезно, когда вы проводите в уме расчеты с большими значениями, связанными с битами.

2.3.3. Двоичные числа

Последовательность битов может отображать число, если считать, что цифры, как обычно, расставлены по разрядам, только с основанием 2, а не 10. Десяти цифр от 0 до 9 достаточно, чтобы обозначить десять предметов. Если их больше, то нам понадобится больше разрядов. Так, с помощью двух десятичных цифр мы сможем обозначить до 100 предметов – от 00 до 99. Для более чем 100 предметов мы возьмем три разряда и получим 1000 комбинаций – от 000 до 999. Нужно отметить, что мы, как правило, не записываем начальные нули для чисел, но они подразумеваются. Кроме того, в повседневной жизни мы начинаем считать от единицы, а не от нуля.

Десятичные числа – это сокращенная запись для сумм степеней 10. Например, 1867 – это 1 × 10^3 + 8 × 10^2 + 6 × 10^1 + 7 × 10°, или 1 × 1000 + 8 × 100 + 6 × 10 + 7 × 1, или 1000 + 800 + 60 + 7. Вспомните сложение в столбик из начальной школы: единицы, десятки, сотни и так далее. Просто мы настолько привыкли к такому виду, что редко задумываемся об этом.

С двоичными числами все точно так же, только при основании 2, а не 10, поэтому используются лишь цифры 0 и 1. Двоичное число 11101 интерпретируется как 1 × 2^4 + 1 × 2^3 + 1 × 2^2 + 0 × 2^1 + 1 × 2°, которое при основании 10 выражается как 16 + 8 + 4 + 0 + 1, или 29.

Тот факт, что последовательности битов можно истолковывать как числа, означает, что есть органичная закономерность для присвоения элементам двоичных обозначений. Их располагают в порядке возрастания. Мы уже видели это выше, с индексами для первокурсника, второкурсника и так далее – 00, 01, 10, 11. В десятичной системе эти числа имеют значения 0, 1, 2 и 3. Следующая последовательность выглядела бы как 000, 001, 010, 011, 100, 101, ПО, 111 с числовыми значениями от 0 до 7.

Чтобы лучше это понять, выполним одно упражнение. Мы все умеем считать до десяти на пальцах, но до какого числа вы смогли бы досчитать, используя двоичные числа, где каждый палец (не просто так их назвали![18]) представляет двоичную цифру? Какой получится диапазон значений? Если вы уже сообразили, на что похоже бинарное отображение 4 и 132, то уловили идею[19].

Как вы уже убедились, преобразовать двоичную систему в десятичную просто: сложите степени 2, для которых соответствующий бит числа равен 1. Преобразовать числа из десятичной системы в двоичную сложнее, но ненамного. Начните делить десятичное число на 2. Запишите остаток, который будет равняться 1 или 0, а полученный результат снова делите на два. Не останавливайтесь, пока число не будет равно нулю. Полученная последовательность остатков – это двоичное число, но сейчас оно записано в обратном порядке, так что «переверните» его.

В качестве примера на рис. 2.11 показано преобразование числа 1867 в двоичный формат. Читая биты в обратном порядке, мы получим 1110100 1011. Для проверки сложим степени двух: 1024 + 512 + 256 + 64 + 8 + 2 + 1 = 1867.

На каждом этапе деления мы вычисляем наименее значимый (крайний правый) бит оставшегося числа. Эта процедура аналогична тому, как мы преобразовываем большое количество секунд в дни, часы, минуты и секунды: сначала делим число на 60 и получаем минуты (остаток – количество секунд), делим результат на 60 и получаем часы (остаток – количество минут), делим новый результат на 24 и получаем дни (остаток – количество часов). Разница в том, что при таком расчете времени используется не одинаковое, а смешанное основание – 60 и 24.

Рис. 2.11. Преобразование десятичного числа 1867 в двоичное 11101001011

Вы можете также преобразовать десятичное число в двоичное, вычитая из исходного числа убывающие степени двух. Начать нужно с высшей степени 2, которую содержит число, – например, 2^10 в 1867. Каждый раз при вычитании степени записывайте 1 или, если ее значение больше остатка, 0, как в случае с 2^7 или 128 в примере выше. Итоговая последовательность единицы и нолей даст вам двоичное значение. Этот подход, пожалуй, более наглядный, а не механический.

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

Рис. 2.12. Таблицы сложения и умножения в двоичной системе

2.3.4. Байты

Во всех современных компьютерах базовой единицей обработки и организации памяти являются восемь бит, которые рассматриваются как единое целое. Группа из восьми бит называется байтом. Это слово ввел в 1956 году Вернер Бухгольц, разработчик архитектуры ЭВМ, работавший в IBM. Одним байтом можно закодировать 256 различных значений (2^8, то есть все уникальные комбинации из восьми нулей и единиц) – например, целые числа от 0 до 255, или 7-битный символ из ASCII (с одним битом в запасе), или что-то еще. Часто конкретный байт входит в более крупную группу, которая отображает что-то более объемное или сложное. Два байта вместе дают 16 бит, чего достаточно для представления числа от 0 до (2^16 – 1), или 65 535. Они также могут отображать символ из набора Unicode, скажем, из записи названия «Токио», первый или второй в слове. На каждый иероглиф отведено по два байта. Четыре байта – это 32 бита, которые могут определять четыре символа ASCII, или два символа Unicode, или числа до (2^32 – 1), что составляет около 4,3 миллиарда. Байтами допустимо отображать что угодно, однако сам процессор имеет довольно скромный набор групп – в частности, целые значения различного размера, – а также располагает инструкциями для их обработки.

Если мы хотим записать числовое значение, представленное одним или несколькими байтами, его допустимо выразить в десятичной форме, что удобно для чтения человеком (только если оно точно числовое). Мы можем записать его в двоичной системе, чтобы увидеть отдельные биты: это важно, поскольку разные биты кодируют разные типы информации. Однако двоичная система громоздка, и такие представления более чем втрое длиннее десятичных, поэтому обычно используется альтернативная система счисления, называемая шестнадцатеричной^25. Для записи чисел с таким основанием применяются 16 цифр (по аналогии с 10 цифрами для десятичной и 2 для двоичной) – 0,1… 9, A, B, C, D, E и F. Каждая шестнадцатеричная цифра представляет собой 4 бита, числовые значения которых приведены на рис. 2.13.

Рис. 2.13. Таблица шестнадцатеричных цифр и их значений в двоичной системе исчисления

Если вы не программист, то шестнадцатеричный код встречается вам лишь в нескольких местах. Одно из них – краски на веб-странице. Как я упоминал выше, в наиболее распространенном представлении цветов на компьютере используется три байта на каждый пиксель: по одному для красного, зеленого и синего. Эта система кодирования называется RGB (Red, Green, Blue). Каждый из таких компонентов хранится в виде одного байта, поэтому существует 256 различных значений (оттенков) красного, на любой из которых приходится 256 возможных значений зеленого, а на всякую их комбинацию – 256 оттенков синего. В общей сложности получаем 256 × 256 × 256 возможных цветов, что звучит внушительно. Давайте прибегнем к степеням двух и десяти, чтобы быстро прикинуть количество. Это 2^8 × 2^8 × 2^8, что равно 2^24, или 2^4 × 2^20, или примерно 16 × 10^6, или 16 миллионов. Вероятно, это число попадалось вам в описаниях компьютерных дисплеев («Более 16 миллионов цветов!»)26. Кстати, оценка занижена примерно на 5 %, ведь 2^24 в десятичной записи – 16 777 216.

Насыщенный красный представлен числом FF0000, то есть максимальным значением из 255 возможных, если брать десятичную систему. В нем нет ни зеленого, ни синего. А вот яркий, но негустой синий цвет, которым выделяются ссылки на многие веб-страницы, кодируется как 000 °CC. Желтый цвет – это смесь красного и зеленого, и его самый яркий оттенок выражается комбинацией FFFF00. Оттенки серого содержат в себе равное количество красного, зеленого и синего. Например, средний серый пиксель будет закодирован числом 808080, в котором содержание всех трех цветов будет одинаковым. Наконец, черный и белый – это 000000 и FFFFFF соответственно.

Шестнадцатеричные значения также используются в кодовых таблицах Unicode для определения символов. Например, –   это 6771 4EAC. Кроме того, вы можете встретить шестнадцатеричные числа в адресах Ethernet, о которых мы поговорим в главе 8, и в специальных символах в URL-адресах – это глава 10.

В рекламе компьютеров вы иногда встречаете понятие «64-битный» («Microsoft Windows 10 Ноше 64-битная»). Что это значит? Внутри себя компьютеры обрабатывают данные в виде блоков разного размера, в которые входят как числа – а для них удобнее применять 32 и 64 бита, – так и адреса, то есть указания, где расположена информация в оперативной памяти. Речь в рекламе идет о втором параметре. Тридцать лет назад произошел переход от 16-битных адресов к 32-битным, которые достаточно велики для доступа к 4 Гб памяти. В настоящее время мы почти перешли от 32 к 64 битам в компьютерах общего назначения^27. Не стану предсказывать, когда мы двинемся от 64 к 128 битам: пока все на какое-то время затихнет.

Из этого обсуждения битов и байтов нам важно запомнить, что значение группы битов зависит от контекста: вам не удастся определить, что они отображают, просто посмотрев на них. Например, в байт может входить один бит, представляющий истину или ложь, а семь других не будут использоваться. Там может храниться небольшое целое число или символ ASCII, такой как #. Возможно, что байт составляет либо часть символа в другом алфавите, либо компонент большого числа из 2, 4 или 8 байт, либо фрагмент изображения или музыки на DVD, либо часть инструкции для процессора и так далее. (С десятичными цифрами все то же самое. В зависимости от контекста, трехзначное число может обозначать телефонный код района США, номер шоссе, показатель отбивания в бейсболе и многое другое.)

Инструкции для одной программы иногда служат данными для другой. Когда вы загружаете программу или приложение, то они представляют собой просто данные – биты, копируемые вслепую. Но когда вы запускаете программу, ее биты при обработке в ЦПУ воспринимаются как инструкции.

2.4. Краткие выводы

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

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

Двоичные значения также используются в повседневных занятиях, не связанных с компьютерами. Вероятно, дело в том, что такие расчеты, как удвоение или уменьшение веса, длины и тому подобного, вполне естественны для людей. Например, во втором томе книги Дональда Кнута «Искусство программирования»28 описаны английские единицы тары для вина 1300-х годов, в которые входят 13 двоичных порядков величины: 2 джилла – это один шопен, 2 шопена – это одна пинта, 2 пинты – это одна кварта, и так далее, пока 2 барреля не станут одним хогсхедом, 2 хогсхеда не сольются в одну пипу (или пайп), а 2 пипы не образуют один тан. Около половины этих единиц все еще используются в английской системе мер для жидкостей, хотя такие очаровательные слова, как «феркин» и «килдеркин» (два феркина, или половина барреля), ныне встречаются уже редко.

3. Процессор изнутри

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

Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.

Предварительное рассмотрение логического устройства электронного вычислительного прибора, 1946

В главе 1 я упомянул, что процессор, или ЦПУ, – «мозг» компьютера, хотя и с оговоркой, что это определение употребляется не в прямом значении. Сейчас пришло время более подробно рассмотреть процессор, поскольку это самый важный элемент вычислительной машины и его свойства имеют наибольшее значение для оставшейся части книги.

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

Самое главное – ЦПУ принимает решения, пусть и простые. Процессор способен сравнивать как числа (больше или меньше), так и данные других типов (совпадает ли эта часть информации с другой), и на основании полученных результатов решать, что делать дальше. Это самое важное его свойство, поскольку, хотя процессору доступно немногим больше, чем калькулятору, он умеет работать без вмешательства человека. Как сказали Беркс, Голдстайн и фон Нейман, «предполагается, что машина будет полностью автоматической по своей природе, то есть независимой от человека-оператора после начала вычислений».

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

3.1. Компьютер-игрушка

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

Я привык называть такую выдуманную машину «компьютером-игрушкой», или просто Игрушкой, поскольку она не настоящая, но обладает свойствами реальной. По возможностям она примерно соответствует уровню мини-ЭВМ конца 1960-х годов и напоминает устройство, описанное в первой статье Беркса, Голдстайна и фон Неймана. В компьютере-игрушке есть память, отведенная под инструкции и данные, а также одна дополнительная область хранения – накопитель, емкости которого достаточно для удержания одного числа. Накопитель – это аналог экрана на калькуляторе: он показывает число, только что введенное пользователем, или последние результаты вычислений. Компьютер-игрушка содержит около десяти инструкций для выполнения основных операций, описанных выше. На рис. 3.1 приведены первые шесть из данного набора.

Рис. 3.1. Типовые инструкции в машине-игрушке

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

Fetch: извлечь следующую инструкцию из памяти

Decode: определить, что выполнять по этой инструкции (декодировать)

Execute: выполнить инструкцию вернуться к Fetch

3.1.1. Первая программа компьютера-игрушки

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

GET

PRINT

STOP

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

И, к счастью, рабочие игрушечные компьютеры существуют. На рис. 3.2 показан один из них в действии.

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

Рис. 3.2. Симулятор компьютера-игрушки с готовой к запуску программой

Когда вы нажимаете ПУСК, выполняется инструкция GET и появляется диалоговое окошко (см. рис. 3.3). Число 123 введено пользователем.

Рис. 3.3. Диалоговое окно ввода симулятора Игрушки

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

Рис. 3.4. Симулятор Игрушки после выполнения короткой программы

3.1.2. Вторая программа компьютера-игрушки

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

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

Единственная сложность заключается в том, что нам нужно выделить место в памяти для хранения данных – первого числа, которое будет считываться. Мы не можем оставить первое число в накопителе, так как вторая инструкция (GET) перезапишет его. Поскольку число – это данные, а не инструкция, мы должны хранить его в определенном месте в памяти, где оно не будет истолковано как инструкция. Но, если мы поместим его в конец программы, после всех инструкций, процессор точно не попытается интерпретировать значение данных как инструкцию, потому что остановится (STOP) и не доберется до него.

Рис. 3.5. Программа компьютера-игрушки для сложения двух чисел и вывода суммы

Нам также нужен способ ссылаться на место хранения, когда этого потребуют инструкции программы. Мы можем заметить одну возможность для хранения данных – седьмую ячейку памяти (после шестой инструкции) – и написать «STORE 7». В конечном итоге наша программа будет сохранена в такой форме. Но местоположение (адрес) может меняться при изменении программы. Решение в том, чтобы присвоить ему имя: как мы увидим в главе 5, любая программа способна выполнять такую «конторскую» задачу, то есть отслеживать, где в памяти находятся данные, заменяя имя правильным положением числа. FirstNum указывает, что это «первое число». Имя задается произвольно, хотя рекомендуется использовать то, которое отражает предназначение или смысл связанных с ним данных или инструкций. После имени мы поставили двоеточие, чтобы определить FirstNum как метку. По соглашениям о именовании, инструкции в программе набирают с отступом, а имена, привязанные к инструкциям или ячейкам памяти, – без. В симуляторе Игрушки учитываются все эти детали.

3.1.3. Инструкции ветвления

Как нам расширить программу, показанную на рис. 3.5, чтобы она суммировала три числа? Можно просто добавить еще одну последовательность инструкций – STORE, GET и ADD (для них есть два свободных места), но такое «расширение», конечно, не позволит суммировать тысячу чисел. Программа вообще не даст результата, если мы не будем знать заранее, сколько чисел нужно сложить.

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

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

Рис. 3.6. Программа копирования данных, которая выполняется вечно

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

Давайте задействуем инструкцию IFZERO, чтобы написать программу (см. рис. 3.7), которая считывает и печатает входные значения до тех пор, пока в них не появится значение, равное 0. Она будет извлекать и отображать данные, пока пользователь не устанет и не введет ноль, после чего программа перейдет к инструкции STOP, помеченной как Bot, то есть bottom («низ»), и остановится. (Заманчиво написать IFZERO STOP, но так не сработает: за IFZERO должна следовать ячейка, а не инструкция.)

Рис. 3.7. Программа копирования данных, которая останавливается при вводе О

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

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

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

Я говорю «в принципе», потому что на практике мы обязаны учитывать скорость процессора, объем памяти, ограниченность величины чисел в компьютере и тому подобное. Так или иначе, иногда мы будем возвращаться к идее эквивалентности всех ЭВМ, поскольку это фундаментальная концепция.

В качестве еще одного примера работы IFZERO и GOTO на рис. 3.8 приведена программа, которая суммирует несколько чисел и останавливается, когда введен 0. Какое-либо специальное значение сплошь и рядом применяют для того, чтобы завершить последовательность ввода. В данном случае ноль вполне подходит в качестве метки окончания, потому что мы складываем числа, а добавлять данные с нулевым значением не обязательно.

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

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

Рис. 3.8. Программа Игрушки для сложения последовательности чисел

Как бы вы проверили эту программу, чтобы убедиться, что она работает? На первый взгляд все выглядит нормально, и она дает правильные ответы на простые тестовые задачи. Упустить из виду проблему легко, поэтому нужна систематическая проверка. Ключевое слово – «систематическая»: просто вводить в программу случайные данные будет неэффективно.

Какой самый простой тестовый пример? Если мы не вводим никаких чисел, кроме нуля, который завершает ввод, то сумма будет равняться нулю, так что в качестве первой проверки годится. Потом нужно попробовать ввести одно число: сумма должна совпасть с ним. Затем надо ввести два числа, сумма которых уже вам известна (например, 1 и 2, где результат должен равняться 3). После нескольких таких тестов вы можете с достаточной степенью уверенности утверждать, что программа работает. Если вы скрупулезны, то проверите код еще до того, как он попадет на компьютер, – тщательно пройдетесь по всей последовательности инструкций. Хороший программист поступает так с каждой написанной им программой.

3.1.4. Представление в памяти

До сих пор я уклонялся от ответа на вопрос о том, как инструкции и данные представлены в памяти. Как это работает?

Вот одно из возможных объяснений. Предположим, что каждая инструкция использует одну ячейку памяти для хранения своего цифрового кода, а также задействует ту, что расположена рядом, если ссылается на местоположение в памяти или имеет значение данных. То есть GET занимает одно место, а инструкции вроде IFZERO и ADD, которые ссылаются на ячейку памяти, используют два. Второе – это место, на которое они ссылаются.

Предположим также, что любое значение данных помещается в одной ячейке. Это все упрощения, однако они не слишком искажают картину того, что происходит в реальных компьютерах. Наконец, примем, что числовые значения инструкций следующие: GET = 1, PRINT =2, STORE = 3, LOAD = 4, ADD = 5, STOP = 6, GOTO = 7, IFZERO = 8. В таком порядке они появлялись на предыдущих страницах.

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

Рис. 3.9. Как программа сложения чисел выглядит в памяти

Симулятор Игрушки написан на JavaScript – языке программирования (ЯП), о котором пойдет речь в главе 7, – но мы могли выбрать любой другой ЯП. Данный симулятор легко расширить. Например, вы без труда добавите инструкцию умножения или условную ветвь другого типа, даже если никогда раньше не видели компьютерную программу. Это хороший способ проверить, как вы усвоили материал. Код можно найти на веб-сайте этой книги.

3.2. Настоящие процессоры

Мы рассмотрели упрощенную версию процессора, но он не сильно отличается от тех, что стояли в ранних вычислительных устройствах или сейчас применяются в маленьких. Современные ЦПУ гораздо сложнее в деталях, и все сосредоточено вокруг производительности.

Любой процессор снова и снова производит цикл извлечения, декодирования, выполнения. Он извлекает из памяти очередную инструкцию, которая обычно хранится в следующей ячейке памяти, но ее местоположение также могли задать GOTO или IFZERO. Процессор декодирует инструкцию (то есть выясняет, что она делает) и совершает все необходимые приготовления для ее запуска. Затем он выполняет инструкцию: вытаскивает информацию из памяти, производит арифметические или логические действия и сохраняет результат в подходящей комбинации битов. Потом ЦПУ возвращается к шагу извлечения. Цикл «извлечение – декодирование – выполнение» в настоящем процессоре задействует хитроумные методы, которые ускоряют всю процедуру, но фундаментально там нет разницы с циклом для сложения чисел, показанным выше.

Настоящие компьютеры выполняют больше инструкций, чем наша Игрушка, хотя они относятся к тем же основным видам. Они знают больше способов того, как перемещать данные, выполнять арифметические действия (в том числе для различных размеров и типов чисел), сравнивать и разветвлять, а также управлять остальными частями машины. Типичное ЦПУ имеет от пары десятков до пары сотен различных инструкций, которые вместе с данными занимают несколько ячеек памяти, обычно от 2 до 8 байт на каждую. В реальном процессоре есть много накопителей, чаще всего от 16 до 32. Поэтому он может хранить более одного промежуточного результата в своей, скажем так, чрезвычайно быстродействующей памяти.

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

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

Одна из проблем, рассматриваемых архитектурой ЭВМ, – размер набора инструкций, то есть совокупности команд, которые выполняет процессор. Что лучше: множество инструкций для широкого спектра различных вычислений или небольшое количество команд – таких, которые проще создавать и которые будут выполняться быстрее? Разработка архитектуры предполагает поиск многогранного баланса функциональности, скорости, сложности, энергопотребления и программируемости. Снова процитируем фон Неймана: «В общем внутренняя структура арифметического устройства определяется компромиссом между стремлением к быстроте работы <…> и к простоте или дешевизне машины».

Как процессор соединяется с оперативной памятью и остальными частями компьютера? Начнем с того, что ЦПУ действуют очень быстро, выполняя одну инструкцию менее чем за наносекунду. (Напомним, что «нано» – это одна миллиардная, или 10“9.) Для сравнения, память чрезвычайно медленная: извлечение данных или инструкций из нее занимает от 10 до 20 наносекунд. Конечно, это молниеносно в абсолютном выражении, но неторопливо по меркам функционирования процессора. Он мог бы выполнить десятки инструкций за то время, что ему приходится ждать поступления данных.

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

У разработчиков также есть набор конструкционных приемов, которые ускоряют работу процессора. ЦПУ можно изготовить так, чтобы шаги извлечения и выполнения совмещались, и тогда процессор будет одномоментно прогонять несколько инструкций на разных стадиях завершенности. Это называется конвейерной обработкой, как при движении деталей автомобиля по сборочной линии. Хотя выполнение любой отдельной инструкции будет занимать такое же время, при одновременной обработке других возрастут общие темпы выполнения. Иной вариант – параллельно прогонять несколько инструкций, если они не мешают друг другу или не взаимозависимы. В машиностроении тоже есть аналогия, параллельные линии сборки. Иногда инструкции даже можно выполнять не по порядку, если они не взаимодействуют.

Еще один вариант – одновременная работа нескольких процессоров. Сегодня это норма для ноутбуков и мобильных телефонов. В процессоре Intel моего компьютера 2015 года выпуска, на котором я сейчас печатаю, есть два ядра на одном чипе интегральной схемы. Сейчас наблюдается сильная тенденция в сторону увеличения количества ядер ЦПУ на чипе, а также на установку более одного чипа в устройстве. Поскольку размеры элементов интегральной схемы уменьшаются, на микросхему удается поместить больше транзисторов, и они, как правило, используются для того, чтобы добавить ядер и увеличить кэш-память. Процессоры сами по себе не ускоряются, но ядер становится больше, и фактическая быстрота вычислений продолжает расти.

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

В случае сотовых телефонов, планшетов и других портативных устройств требуется идти на еще большие компромиссы, поскольку размер, вес и мощность уменьшаются еще заметнее. Здесь уже недостаточно только «подкрутить» конструкцию. Если Intel и ее основной конкурент AMD – главные поставщики ЦПУ для компьютеров и ноутбуков, то в большинстве сотовых телефонов и планшетов используется процессор под названием ARM, специально спроектированный для работы с низким энергопотреблением. Структура таких ЦПУ запатентована английской компанией Arm Holdings.

Сравнение скоростей процессоров – дело сложное и, по сути, бессмысленное. Даже базовые операции вроде арифметических действий могут выполняться настолько разными способами, что трудно провести прямое сопоставление. Например, одному процессору понадобится выполнить три инструкции, чтобы сложить два числа и сохранить результат в ходе третьей, как делала Игрушка. Другому для такого вычисления хватит двух команд, а третьему – всего одной. Некоторые ЦПУ способны параллельно обрабатывать несколько инструкций или совмещать их, чтобы они выполнялись поэтапно. Процессоры умеют жертвовать скоростью работы ради снижения энергопотребления и даже динамически регулировать ее в зависимости от того, поступает энергия из батареи или из сети. В отдельные ЦПУ встроены как быстрые, так и медленные ядра для выполнения разных задач. Поэтому вам следует с осторожностью заявлять о том, что один процессор «шустрее» другого, – вероятно, ваша оценка субъективна.

3.3. Кэширование

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

Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.

Предварительное рассмотрение логического устройства электронного вычислительного прибора, 1946

Здесь стоит ненадолго отойти от темы и рассмотреть кэширование – идею, широко применимую за пределами вычислений как таковых. В процессоре кэш — это маленькая быстрая память, где хранится недавно обработанная информация. Тем самым удается избежать постоянных обращений к оперативной памяти, которая больше по объему, но действует значительно медленнее. Как правило, процессор неоднократно обращается к группам данных и инструкций за короткий отрезок времени. Например, пять инструкций в цикле программы, приведенной на рис. 3.9, будут выполняться по одному разу для каждого введенного числа. Если хранить их в кэше, то извлекать их из ОЗУ для каждого цикла уже не понадобится, и тогда программа начнет выполняться быстрее, поскольку для обработки инструкций не придется ждать их поступления из памяти. Аналогично, если держать Sum (переменную из программы для Игрушки) в кэше данных, доступ тоже ускорится, однако узкое место в этой программе – получение данных.

Типичный процессор имеет два или три кэша, которые последовательно увеличиваются по емкости и уменьшаются в скорости. Их часто называют уровнями LI, L2 и L3. Самый большой из них способен вмещать несколько мегабайт данных. (На моем ноутбуке 256 Кб кэша L2 для каждого ядра и 4 Мб в одном кэше L3.) Кэширование приносит пользу, так как велика вероятность, что недавно использованная информация вскоре понадобится вновь, а наличие ее в кэше уменьшит время ожидания отклика памяти. Обычно в процессе кэширования одновременно загружаются все блоки данных – например, блок последовательных ячеек памяти, когда запрашивается один байт. Это связано с тем, что «примыкающая» информация, вероятно, также скоро будет использоваться – и значит, почти наверняка уже окажется в кэше, когда в ней возникнет надобность. Тогда ссылкам на соседние данные не придется ждать.

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

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

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

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

3.4. Другие виды вычислительных устройств

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

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

В суперкомпьютерах, как правило, устанавливают большое количество ЦПУ и громадный объем памяти. Сами их процессоры порой имеют инструкции, которые обрабатывают определенные виды данных намного быстрее, чем их более привычные собратья. Правда, современные суперкомпьютеры основаны на кластерах быстрых, но в целом обычных процессоров, а не на специализированном оборудовании. Каждые полгода на вебсайте top500.org публикуется новый список 500 самых быстрых компьютеров в мире. Поразительно, как быстро повышается максимальная скорость: машины, которые находились в первой десятке несколько лет назад, сегодня вообще отсутствуют в списке. Лучшая машина на ноябрь 2020 года, построенная компанией Fujitsu в Японии, имеет 7,6 миллиона ядер и может выполнять максимум 537 × 10^15 арифметических операций в секунду[20]. Скорость суперкомпьютеров измеряется количеством операций с плавающей запятой, или флопами, т. е. количеством арифметических операций с числами с дробной долей в секунду. Лидер списка top500.org показывает результат в 537 петафлопов, а компьютер на 500-м месте – 2,4 петафлопа.

Графический процессор (GPU) – это специализированный процессор, который выполняет определенные графические вычисления намного быстрее, чем ЦПУ общего назначения. Такие устройства изначально разрабатывались для высокоскоростных расчетов графики, необходимой для игр, но они также применяются для обработки речи и сигналов в телефонах. GPU помогают ускорить работу обычных ЦПУ при определенных видах рабочих нагрузок. Графические процессоры могут параллельно выполнять большое количество простых арифметических вычислений, поэтому если какую-либо часть задачи можно передать для выполнения в GPU, то операция в целом будет выполняться быстрее. Данные устройства особенно полезны для машинного обучения (глава 12), при котором одни и те же вычисления производятся независимо в разных частях большого набора данных.

Распределенные вычисления выполняются на компьютерах, которые более независимы: они, например, не используют общую память, а иногда физически рассредоточены, вплоть до того, что находятся в разных частях света. Из-за такого подхода повышается вероятность того, что связь станет узким местом, но он позволяет людям и компьютерам взаимодействовать на больших расстояниях. Крупномасштабные веб-сервисы – поисковые системы, интернет-магазины, социальные сети и облачная обработка данных в целом – это распределенные вычислительные системы, в которых тысячи ЭВМ объединяются, чтобы быстрее получить результат для большого количества пользователей.

Все эти типы компьютеров базируются на одних и тех же фундаментальных принципах. Они основаны на процессоре общего назначения, который можно запрограммировать для выполнения бесконечно разнообразных задач. Каждый ЦПУ имеет ограниченный набор простых инструкций для выполнения арифметических действий, сравнения значений данных и выбора следующей инструкции на основании результатов предыдущих вычислений. Определяющая архитектура ЭВМ не сильно изменилась с конца 1940-х годов, но их физическая конструкция непрерывно эволюционировала поразительными темпами.

Возможно, это прозвучит неожиданно, но все упомянутые компьютеры обладают одинаковыми логическими возможностями и способны «обсчитывать» буквально одно и то же, если оставить в стороне такие практические факторы, как требования к скорости и памяти. Данную теорию независимо друг от друга доказали в 1930-х годах несколько ученых, включая английского математика Алана Тьюринга. Именно его подход легче всего понять неспециалисту. Тьюринг описал элементарное счетное устройство, гораздо проще нашей Игрушки, и показал, что оно может вычислить всё, что поддается вычислениям в самом общем смысле. Сегодня такой компьютер называется машиной Тьюринга^29. Затем Алан показал, как создать машину Тьюринга, которая способна действовать как симулятор других подобных машин. Теперь такое устройство обозначается как универсальная машина Тьюринга (УМТ). Составить программу, которая будет имитировать УМТ, несложно. Также возможно (но уже не просто) написать программу для УМТ, которая будет имитировать настоящий компьютер. Следовательно, все компьютеры равны в том, что они умеют вычислять, но различаются в скорости обработки.

Во время Второй мировой войны Алан перешел от теории к практике: он сыграл главную роль в разработке специализированного компьютера для дешифрирования немецких военных сообщений^30, о чем мы еще кратко поговорим в главе 13. Работы Тьюринга на благо фронта показаны – со значительными художественными отступлениями – в нескольких фильмах, в частности «Взлом кода» (Breaking The Code, телеканал ВВС) 1996 года и «Игра в имитацию» 2014 года.

В 1950 году Тьюринг опубликовал статью под названием «Вычислительные машины и разум»31, в которой предлагался тест (сегодня называемый тестом Тьюринга), который подошел бы для оценки того, демонстрирует ли компьютер человеческий интеллект. Представьте себе, как вычислительная машина и человек по отдельности общаются через клавиатуру и экран с человеком-опросчиком. Ведя такую беседу, может ли опрашивающий установить, кто из его собеседников – человек, а кто – компьютер? Тьюринг полагал, что, если их не удастся надежно различить, значит, ЭВМ демонстрирует разумное поведение. Как мы увидим в главе 12, компьютеры сейчас общаются на уровне человека или даже выше по некоторым темам – хотя, конечно, к общему умственному развитию это никак не относится.

Рис. 3.10. CAPTCHA^32

Имя Тьюринга упоминается в несколько вымученной аббревиатуре CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart), она же «капча», которая расшифровывается как «Полностью автоматизированный публичный тест Тьюринга, позволяющий отличать компьютеры от людей»[21]. CAPTCHA представляет собой искаженные наборы букв вроде тех, что приведены на рис. 3.10. Она используется для попыток проверить, человек ли посетитель веб-сайта или программа. «Капча» – пример обратного теста Тьюринга, поскольку она пробует отличить человека от компьютера, полагаясь на тот факт, что люди, как правило, лучше машин распознают графические структуры. Конечно, CAPTCHA неприменима для тех, кто страдает нарушениями зрения.

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

В 1952 году Тьюринга привлекли к ответственности за гомосексуальную активность, которая в то время в Англии преследовалась по закону. Он умер в 1954 году, по-видимому, покончив с собой^34.

3.5. Краткие выводы

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

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

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

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

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

Алан Тьюринг. Вычислительные машины и разум[22].

Mind, 1950

Краткое заключение по аппаратному обеспечению

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

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

Логическая структура компьютеров не сильно изменилась с 1940-х годов, но физическая конструкция преобразовалась колоссально. Уже больше пятидесяти лет подтверждается закон Мура – по сути, предсказание, повлиявшее на реальность. В нем говорится об экспоненциальном уменьшении размера и цены отдельных компонентов и, следовательно, экспоненциальном увеличении вычислительной мощности при заданной стоимости и объеме пространства. Предупреждения о том, что закон Мура перестанет действовать в ближайшие 10 лет, неизменно звучат в предсказаниях о развитии технологий вот уже на протяжении десятилетий[23]. Очевидно, что в наше время техпроцесс для интегральной схемы совершенствовать сложнее, поскольку компоненты теперь могут состоять всего из нескольких атомов. Но люди в прошлом выказывали удивительную изобретательность: возможно, какое-нибудь новое открытие обеспечит нам следующий взлет.

Цифровые устройства работают в двоичном формате. На базовом уровне информация представлена в компонентах с двумя состояниями, поскольку они просты в сборке и наиболее надежны в эксплуатации. Информация любого вида представлена в виде набора битов. Числа разных видов (целые, дробные, научная запись[24]) отображаются с помощью 1, 2, 4 или 8 байт – такие фрагменты естественным образом подходят для обработки аппаратным обеспечением. Это значит, что при обычных условиях числа обладают конечным размером и ограниченной точностью. С помощью подходящего ПО можно поддерживать произвольный размер и точность, хотя программы на таком обеспечении будут работать медленнее. Иную информацию, вроде символов естественных языков, также представляют в виде некоторого количества байтов. Шифрование ASCII, которое вполне годится для английского языка, задействует один байт на символ. Более обширный Unicode, сочетающий несколько кодировок, обрабатывает все наборы символов, но занимает ощутимо больше места. UTF-8 – кодировка переменной длины в Unicode, которая предназначена для обмена информацией между системами. В ней применяется один байт для символов из ASCII и два или более для других.

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

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

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

Часть II

Программное обеспечение

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

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

Программное обеспечение – это общий термин, обозначающий последовательности инструкций, которые заставляют компьютер выполнять что-то полезное. Слово soft (англ, software – программное обеспечение) противоположно по смыслу слову hard[25] (англ, hardware – аппаратное обеспечение), потому что ПО неосязаемо, к нему сложно прикоснуться. «Железо» осязаемо: если вы уроните ноутбук себе на ногу, то ощутите это. Но для «софта» такую ситуацию представить невозможно.

В следующих нескольких главах мы будем говорить о ПО, то есть о средстве указать компьютеру, что нужно сделать. В главе 4 мы обсудим теорию программных средств с упором на алгоритмы – по сути, схематические программы для решения узких задач. В главе 5 мы поговорим о программировании и его языках (ЯП): мы применяем их, чтобы задавать последовательности вычислительных операций. В главе 6 описываются основные виды программных систем, которыми мы пользуемся, порой даже не зная о них. В последней части данного раздела, главе 7, вы кратко познакомитесь с двумя наиболее популярными на сегодня ЯП – JavaScript и Python.

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

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

После того как в октябре 2018 года и марте 2019 года разбились два «Боинга-737 МАХ», что привело к гибели 346 человек, в новостях часто обсуждали программное обеспечение для самолетов. Компания Boeing начала производство серии 737 в 1967 году, и с годами машины постоянно совершенствовались. Самолеты модели 737 МАХ, выпущенные в 2017 году, представляли собой обширную модификацию оригинала с более объемными и экономичными двигателями.

Вследствие такого обновления машины приобрели существенно иные летные характеристики. Вместо того чтобы модифицировать аэродинамические параметры и обеспечить тем самым поведение самолета, близкое к ранним версиям, инженеры Boeing разработали программную систему автоматического контроля полета под названием Maneuvering Characteristics Augmentation System[26], или MCAS. Ее задача состояла в том, чтобы МАХ летал так же, как и другие модели серии 737, ведь тогда удалось бы избежать крупных затрат на повторную сертификацию и переобучение пилотов. В каком-то смысле ПО сделало бы новый самолет неотличимым от старого.

Говоря простым языком, из-за более тяжелых двигателей, к тому же перемещенных в другое положение, у МАХ поменялись летные характеристики. При определенных обстоятельствах, когда программа MCAS считала, что нос самолета находится слишком высоко, она интерпретировала это как возможное сваливание и опускала нос. Ее решение основывалось на показаниях одного (возможно, неисправного) входного датчика, хотя на «Боинге» их стояло два. Когда пилоты пытались поднять нос, программа отменяла эту команду. В результате самолет раскачивался вверх и вниз, что неизбежно приводило к авиакатастрофам. Что еще хуже, Boeing не уведомляла о существовании MCAS, поэтому пилоты даже не знали о возможной проблеме. Их не обучали тому, как ее устранить^36.

Вскоре после второго крушения авиационные органы власти по всему миру приостановили эксплуатацию самолета МАХ. Репутация Boeing серьезно пострадала, а убытки компании оценивались в более чем 20 миллиардов долларов. В конце ноября 2020 года Федеральное управление гражданской авиации США снова разрешило полеты на МАХ, так как в подготовку пилотов и в саму машину внесли изменения. Впрочем, неясно, когда эти самолеты снова будут регулярно подниматься в воздух.

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

В медицинских системах визуализации тоже применяются компьютеры: они управляют сигналом и формируют изображения, которые анализируют врачи, так что цифровые картинки вытеснили пленочные снимки. Схожая ситуация теперь и в таких областях инфраструктуры, как система управления воздушным движением, навигационные средства, электрические и телефонные сети. Но в вычислительных устройствах для голосования нашли серьезные недостатки. Так, в начале 2020 года подсчет голосов на предварительных выборах Демократической партии в Айове сорвался из-за неполадок с компьютерной системой, и для устранения ошибки понадобилось несколько дней^37. Идея интернет-голосования стала популярной во время пандемии COVID-19, но она несет в себе рисков больше, чем осознают сотрудники избирательных комиссий. Очень сложно разработать систему, которая надежно даст людям сделать выбор, сохранив при этом тайну голосования^38.

Военные системы полностью зависят от компьютеров как по части вооружений, так и в аспекте снабжения. То же самое относится и к финансовым системам по всему миру. Кибервойна и шпионаж – это реальные угрозы. Например, червь Stuxnet 2010 года разрушил иранские центрифуги по обогащению урана. Крупное отключение электроэнергии на территории Украины в декабре 2015 года было вызвано российской вредоносной программой, хотя правительство РФ отрицает свою причастность^39. Два года назад (в 2018-м) произошла вторая серия атак с использованием программы-вымогателя Petya, которая повлияла на работу различных украинских организаций. Когда атака программы-вымогателя WannaCry нанесла ущерб в миллиарды долларов по всему миру, правительство США официально возложило ответственность на Северную Корею^40. В июле 2020 года несколько стран обвинили российскую группу кибершпионажа в попытке украсть сведения о разрабатываемых вакцинах против COVID-19^41.

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

4

Алгоритмы

Алгоритм Фейнмана^42:

1. Запишите проблему.

2. Подумайте над ней как следует.

3. Запишите решение.

Приписывается физику Мюррею Гелл-Манну, лауреату Нобелевской премии, 1992

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

Более удачная метафора – бланки налоговых деклараций, так как в них описывается множество подробностей того, что нужно сделать («Вычтите строку 30 из строки 29. Если получилось ноль или меньше, укажите 0. Умножьте строку 31 на 0,25…»). Аналогия все еще не совершенна, но тут намного лучше, чем в варианте с рецептами, отражаются вычислительные аспекты. Здесь проводятся арифметические операции, значения данных копируются из одного места в другое, проверяются условия, последующие расчеты зависят от результатов предыдущих.

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

Алгоритм — это компьютерная версия тщательно составленного, точного и недвусмысленного рецепта или налоговой формы. По сути, последовательность шагов, которые гарантируют правильное вычисление результата. Каждый этап описывается в терминах базовых операций, значение которых четко определено: например, «сложить два целых числа». Нет никаких расплывчатых терминов. Указан характер входных данных. Рассмотрены все возможные ситуации: никогда не бывает такого, что при работе с алгоритма становится непонятно, какие действия производить дальше. Если специалисты по информатике склонны к педантизму, то обычно добавляют еще одно условие: алгоритм не может выполняться бесконечно. Согласно такому стандарту, классическая инструкция к шампуню «намылить, смыть, повторить»[27] – это не алгоритм.

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

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

4.1. Линейные алгоритмы

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

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

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

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

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

А что, если мы захотим вычислить средний рост? Можно узнавать у каждого человека его или ее рост, складывать получаемые значения по мере их поступления (возможно, используя программу Игрушки для суммирования последовательности чисел) и потом разделить итог на количество опрошенных. Если у нас на листочке записано N значений роста, то, выразив процесс расчета более «алгоритмически», мы получим:

Однако если мы попросим компьютер выполнить эту работу, надо будет проявить внимательность. Что произойдет, например, если на листочке нет никаких чисел? Если расчеты ведет человек, то это не проблема: нам понятно, что пока вычислять нечего. Компьютеру же нужно сказать, чтобы он проверил, не возникла ли такая ситуация, и описать ему порядок действий на такой случай. Если машина не проведет проверку, то будет пытаться разделить сумму на ноль, а это неопределенная операция. Алгоритмы и компьютеры обязаны обрабатывать все возможные ситуации. Если вы когда-нибудь получали чек на «О долларов и 00 центов» или счет, где к оплате указана сумма, равная нулю, то сталкивались с примером того, что кто-то не учел все вероятные случаи должным образом.

Что, если мы не знаем заранее, сколько будет элементов данных, как чаще всего и бывает? Можно подсчитывать элементы по мере вычисления суммы:

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

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

Многие линейные алгоритмы принимают одну и ту же базовую форму. В них есть некий этап инициализации – например, текущую сумму устанавливают равной 0 или задают для «самого высокого роста» какое-либо малое значение. Затем проверяется каждый элемент по очереди, и с ним производятся те или иные простые вычисления: его учитывают, сравнивают с предыдущим значением, элементарно преобразовывают, возможно, печатают. В конце могут потребоваться некоторые шаги для завершения работы – например, вычисление среднего значения, вывод суммы или самого высокого роста. Если операция с каждым элементом занимает примерно одинаковое время, то общий срок будет пропорционален количеству элементов.

4.2. Двоичный поиск

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

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

Данный алгоритм поиска называется двоичным поиском, потому что при каждой проверке или сравнении элементы разбиваются на две группы, одну из которых можно исключить из дальнейшего рассмотрения. Это пример более общей стратегии, называемой «разделяй и властвуй». Насколько быстр такой алгоритм? На каждом шаге мы исключаем половину оставшихся элементов, поэтому количество шагов равняется тому, сколько раз нужно разделить первоначальный объем на 2, чтобы получить один элемент.

Допустим, мы начали с 1024 имен (я выбрал это число, потому что так проще считать). При первом сравнении мы исключаем 512 имен. На втором шаге объем уменьшается до 256, затем до 128, далее до 64, 32, 16, 8, 4, 2 и, наконец, до 1. Итого получается 10 сравнений. Очевидно, это не совпадение, что 2^10 равно 1024. Количество сравнений – это степень двойки, что возвращает нас к исходному числу: идя в обратном направлении, мы каждый раз умножаем на 2 и получаем последовательность 1, 2, 4… 1024.

Если у вас сохранился в памяти школьный курс логарифмов (как ни поразительно, большинство их забывают!), возможно, вы вспомните, что логарифм числа – это степень, в которую надо возвести основание (в данном случае 2), чтобы получить само число. Таким образом, логарифм по основанию 2 для 1024 равен 10, поскольку 2^10 = 1024. В нашем случае можно считать логарифмом количество делений числа на 2, необходимых, чтобы получить 1, – или, что эквивалентно, количество умножений на 2 до получения искомого числа. В книге будут использоваться только логарифмы по основанию 2. Нам не нужна точность или дроби: приблизительных чисел и целых значений вполне достаточно в рамках наших упрощений.

Важно, что при использовании двоичного поиска объем выполняемой работы медленно увеличивается с ростом количества данных. Если у нас есть 1000 имен в алфавитном порядке, нам нужно просмотреть 10 имен, чтобы найти искомое. Если имен насчитывается 2000, то мы должны просмотреть 11 имен, так как на первом же шаге будет исключена тысяча из них и мы вернемся к проверке 1000 оставшихся (на что нужно 10 шагов). Миллион имен – это 1000 раз по 1000. После первых 10 проверок мы возвращаемся к 1000, а после еще 10 приходим к 1 имени, то есть в сумме требуется всего 20 шагов. Миллион – это 10^6, что близко к 2^20, поэтому логарифм 1 000 000 по основанию 2 составляет около 20.

Отсюда вам уже наверняка очевидно, что при поиске имени в каталоге с миллиардом записей (телефонной книге почти всей Земли) вам пришлось бы провести лишь 30 сравнений, поскольку миллиард – это примерно 2^30. Вот почему можно утверждать, что объем работы растет медленно по сравнению с увеличением количества информации: если данных становится в тысячу раз больше, требуется всего 10 дополнительных шагов.

Чтобы быстро подтвердить это на практике, я однажды решил найти моего друга Гарри Льюиса в старом телефонном справочнике Гарварда, который тогда содержал около 20 000 имен на 224 страницах. (Разумеется, бумажные телефонные книги давно исчезли, поэтому сегодня я не смогу повторить эксперимент.) Тогда я начал со страницы 112 и увидел фамилию Лоуренс. Значит, Льюис встречается позже, во второй половине. Поэтому на следующем шаге я открыл страницу 168, расположенную посередине между 112 и 224, и мне встретилось Ривера. «Льюис» находится перед этой фамилией, поэтому я перелистнул на 140-ю страницу (середина между 112 и 168) и нашел фамилию Морита. Далее я перешел к 126-й (посередине между 112 и 140) и фамилии Марк. Следующая проверка привела меня на страницу 119 (Литтл), затем 115 (Лейтнер), затем 117 (Ли)[28], и в итоге я остановился на 116-й.

На этой странице находилось около 90 фамилий, и после еще 7 сравнений (уже не переходя со 116-й) я отыскал Гарри среди дюжины других Льюисов. Всего в ходе эксперимента потребовалось 14 шагов, что примерно соответствует ожиданиям, поскольку 20 000 находятся между 2^14 (16 384) и 2^15 (32 768).

В повседневной жизни этот вид двоичного деления используется в круговых турнирах на выбывание. Вначале в соревновании участвует много спортсменов – например, 128 в мужском одиночном разряде на Уимблдоне. В каждом раунде вылетает половина участников, и в последнем матче сходятся два игрока, которые определяют между собой одного победителя. Уимблдон не случайно состоит из семи кругов, ведь 128 – это степень двойки (2^7). Если вообразить всемирный турнир на выбывание, то для того, чтобы выявить победителя даже среди семи миллиардов участников, нам понадобилось бы провести всего 33 раунда. Если вы помните обсуждение степеней 2 и 10 в главе 2, то сможете проверить результат с помощью простых расчетов в уме.

4.3. Сортировка

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

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

Для наглядности давайте возьмем 16 знакомых названий и расположим их в алфавитном порядке.

Intel Firefox Zillow Yahoo Pinterest Twitter Verizon Bing Apple Google Microsoft Sony PayPal Skype IBM Ebay

Пойдем слева направо. Intel стоит первым, так что пока оно будет первым и в алфавитном порядке. Сравним его со следующим названием – Firefox. F по алфавиту идет раньше I, так что это слово временно становится первым. Zillow не стоит перед Firefox, как и другие названия вплоть до Bing, которое забирается на первое место, но затем его сразу же сменяет Apple. Мы проверим и остальные названия, но ни одно из них не стоит перед Apple, так что оно сохраняет лидерство по алфавиту. Передвинем его в начало, а прочие названия оставим на прежних местах. Теперь список выглядит так:

Apple

_________

Intel Firefox Zillow Yahoo Pinterest Twitter Verizon Bing Apple Google Microsoft Sony PayPal Skype IBM Ebay

Теперь мы повторим процесс и найдем второе по алфавиту название, начиная с Intel, которое стоит первым в неотсортированной группе. Снова его сместит Firefox, а затем первым станет Bing. После завершения второго прохода мы получим такой результат:

Apple Bing

____________

Intel Firefox Zillow Yahoo Pinterest Twitter Verizon Google Microsoft Sony PayPal Skype IBM Ebay

Выполнив данный алгоритм еще 14 раз, мы получим полностью отсортированный список.

Какой объем работы здесь пришлось выполнить? На каждом проходе алгоритм перебирает оставшиеся элементы и всякий раз находит следующее по алфавиту название. Когда их было 16, для того чтобы найти первое, понадобилось просмотреть все. Поиск второго названия занял 15 шагов, поиск третьего – 14 и так далее. В итоге мы должны проверить 16 + 15 +14+…+3 + 2+1 названий, всего 136. Конечно, «умный» алгоритм сортировки мог бы обнаружить, что названия уже стоят в определенном порядке, но специалисты по информатике, которые изучают алгоритмы, довольно пессимистичны: они рассматривают худший вариант, когда срезать углы нельзя и надо проделать всю работу целиком.

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

N + (N– l) + (N-2) + (N-3) +… + 2+ 1

Этот ряд сумм можно выразить так: N × (N + 1)/2 (что легко увидеть, если складывать числа попарно, по одному с каждого конца) или N^2/2 + N И. Если опустить деление на 2, то объем работы пропорционален N^2 + N. По мере того как увеличивается N, N^2 быстро становится больше, чем N (например, если N равно тысяче, N^2 равно миллиону), поэтому можно принять, что объем работы примерно пропорционален N^2, или N в квадрате. Такой темп прироста называется квадратичным. Он хуже линейного, а если точнее, то намного хуже. Если элементов вдвое больше, то их сортировка будет выполняться в четыре раза дольше, если вдесятеро – в сто раз дольше, а если увеличить количество в тысячу раз, то потребуется в миллион раз больше времени! Это нехорошо.

К счастью, сортировать можно гораздо быстрее. Давайте рассмотрим один умный способ – алгоритм под названием Quicksort[29], который изобрел английский ученый-компьютерщик Тони Хоар примерно в 1959 году. (А в 1980-м Хоар получил премию Тьюринга за многочисленные вклады в науку, в том числе Quicksort.) Это элегантный алгоритм и отличный пример принципа «разделяй и властвуй».

Перед нами снова несортированные названия:

Intel Firefox Zillow Yahoo Pinterest Twitter Verizon Bing Apple Google Microsoft Sony PayPal Skype IBM Ebay

Чтобы отсортировать названия с помощью упрощенной версии Quicksort, просмотрим их один раз и отберем в одну колонку имена, которые начинаются с буквы в диапазоне от А до М, а в другую – от N до Z. В результате мы получим две группы, каждая из которых содержит примерно половину названий. Допустим, что распределение имен не слишком асимметрично, и тогда на каждом этапе в обе колонки будет попадать примерно по половине названий. В нашем случае получатся две группы, содержащие по восемь названий:

Intel Firefox Bing Apple Google Microsoft IBM Ebay

Zillow Yahoo Pinterest Twitter Verizon Sony PayPal Skype

Теперь проверим группу A-M: отсортируем названия с первой буквой от А до F в одну колонку, и от G до М – в другую. Затем проверим группу N-Z и перенесем названия, начинающиеся с буквы от N до S в одну колонку, а от Т до Z – в другую. На данном этапе мы сделали два прохода по названиям и получили четыре колонки, в каждой из которых содержится четверть названий:

Firefox Bing Apple Ebay

Intel Google Microsoft IBM

Pinterest Sony PayPal Skype

Zillow Yahoo Twitter Verizon

На следующем этапе мы проходим по каждой из новых групп, разделяя A – F на ABC и DEF, G – M на GHIJ и KLM, и то же самое для N-S и Т-Z. Теперь у нас есть восемь колонок, и в каждой содержится в среднем два названия:

Bing Apple

Firefox Ebay

Intel Google IBM

Microsoft

Pinterest PayPal

Sony Skype

Twitter Verizon

Zillow Yahoo

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

Сколько нам потребовалось действий? Мы проверили каждое из 16 названий в каждом проходе. Если всякий раз получалось идеально равномерное деление, то колонки содержали сначала по 8 названий, затем по 4, по 2 и по 1. Количество проходов равно количеству делений 16 на 2 до получения 1. Это логарифм 16 по основанию 2, то есть 4. Таким образом, объем работы равен 16 log_2 16 для шестнадцати имен. Совершив четыре прохода по данным, мы получаем 64 операции против 136 при сортировке методом выбора. И это для 16 названий, а когда их больше, преимущества Quicksort гораздо заметнее, что показано на рис. 4.1.

Рис. 4.1. Рост log N, N, N log N и N2

Этот алгоритм всегда подходит для сортировки данных, но его применение эффективно только в том случае, если при каждом делении будут получаться примерно одинаковые колонки. При настоящих вычислениях алгоритм Quicksort должен догадаться, где находится срединное значение данных, чтобы всякий раз делить их на две примерно равных по размеру группы. На практике это удается довольно точно оценить, выбрав несколько пробных элементов. В целом Quicksort требуется около N × log N операций для сортировки N элементов, то есть объем работы пропорционален N × log N. Эта зависимость хуже, чем линейная, но не во много раз, и значительно лучше, чем квадратичная.

График на рис. 4.1 показывает, как log N, N, N log N и N^2 растут по мере увеличения объема данных. Первые три построены для 20 значений, но квадратичное – только для 10, иначе линия графика вышла бы за пределы рисунка.

В качестве эксперимента я сгенерировал 10 миллионов случайных 9-значных чисел, аналогичных номерам социального страхования США, и замерил время, которое заняла сортировка групп разного размера с помощью метода выбора (зависимость N^2, или квадратичная) и алгоритма Quicksort (зависимость Nlog N). Результаты представлены на рис. 4.2. Прочерк в таблице означает, что я опускал эти вычисления.

Точно измерить время для программы, которая быстро выполняет операции, сложно, поэтому относитесь к полученным цифрам с большой долей скептицизма. Впрочем, вы всё же можете увидеть примерный рост ожидаемого затраченного времени в пропорции N log N для Quicksort, а также то, что сортировка методом выбора приемлема до объема, скажем, в 10 000 элементов, хотя и не способна составить конкуренцию другому способу. На каждом этапе она безнадежно уступает Quicksort.

Вероятно, вы также заметили, что время сортировки методом выбора для 100 000 элементов примерно в 200 раз больше, чем для 10 000 (вместо ожидаемого стократного увеличения). Скорее всего, дело в кэшировании: не все числа помещаются в кэш, и сортировка ведется медленнее.

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

Рис. 4.2. Сравнение времени сортировки

4.4. Трудности и сложности

Мы рассмотрели несколько вопросов, относящихся к темам «сложности» алгоритмов или времени их выполнения. На одном конце диапазона находится log N, зависимость для двоичного поиска, где с увеличением количества данных объем работы возрастает медленно. Наиболее распространенный алгоритм – линейный, с простой зависимостью N, где объем работы прямо пропорционален количеству данных. У алгоритма Quicksort зависимость Nlog N, и это хуже, чем N (число операций увеличивается быстрее), но он все же исключительно удобен для больших значений N, потому что в целом значения логарифма растут медленно. Есть еще алгоритм с квадратичной зависимостью N^2, где объем работы увеличивается так быстро, что получается нечто среднее между томительным и непрактичным.

Существует много других вариантов сложности. Какие-то из них легко понять – например, кубические, или N^3, которые еще хуже, чем квадратичные, хотя идея та же, – а другие настолько мудреные, что разобраться в них способны только специалисты. Вам стоит знать еще один показатель, так как он встречается на практике. Он особенно тяжеловесный, но важный. Речь об экспоненциальной сложности, где затраты времени увеличиваются примерно в пропорции 2N (не то же самое, что N^2). Здесь объем работы растет исключительно быстро – удваивается при добавлении всего одного элемента. В некотором смысле экспоненциальный алгоритм (ЭА) находится в противоположном конце спектра от алгоритма log N, где при удвоении количества элементов прибавляется только один шаг.

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

Но сейчас у вас должно появиться интуитивное понимание того, что одни проблемы решить легко, а другие – тяжело. Мы можем охарактеризовать это различие более точно. «Легкие» задачи «полиномиальные» по своей сложности, то есть время их решения можно выразить в виде какого-либо полинома вроде N^2. Впрочем, если показатель степени больше 2, то проблемы становятся тяжелее. (Не волнуйтесь, если вы забыли, что означает «полиномиальный», – здесь это выражение употребляется только для обозначения целых степеней переменной, например, N^2 или Ж) Специалисты по информатике определяют этот класс задач как Р (polynomial), потому что их можно решить за полиномиальное время.

Для решения большого количества задач и проблем, возникающих на практике, требуются ЭА, то есть мы не знаем для них ни одного полиномиального алгоритма. Эти задачи называются NP. Их свойства таковы, что мы не способны быстро найти для них решение, но можем быстро проверить правильность предложенного решения. NP расшифровывается как «недетерминированный полином». Если объяснять упрощенно, то такие задачи можно решить за полиномиальное время с помощью алгоритма, который всегда угадывает правильно, когда ему приходится делать выбор. В реальной жизни такого везения не бывает, так что это всего лишь теоретическая концепция.

Многие NP-задачи довольно узкоспециальные, но одну из них легко объяснить и представить, как она применяется на практике. В задаче коммивояжера (TSP, Travelling Salesman Problem) продавец должен начать со своего родного города, посетить ряд определенных городов в любом порядке, а затем вернуться домой. Его или ее цель – посетить каждый город только один раз (без повторений), преодолев наименьшее расстояние^44. По аналогии можно разработать эффективный маршрут для школьного автобуса или мусоровоза, а когда я давным-давно занимался TSP, на нее опирались для решения таких разнообразных задач, как распределение дырок в печатных платах и отправка лодок для отбора проб воды в определенных точках Мексиканского залива.

На рис. 4.3 показана случайно сгенерированная задача с 10 городами. Ее решение находят по интуитивно привлекательной эвристической процедуре «ближайшего соседа»: начните с любого города и затем переходите к ближайшему месту, где еще не побывали. «Длина» (маршрут оценивается по заранее заданному критерию выгодности, например: кратчайший, самый дешевый, совокупный критерий и т. п.) этого маршрута составляет 12,92. Заметьте, что путь зависит от выбора первого города. Маршрут на рис. 4.3 – самый короткий из возможных при использовании данного метода.

Рис. 4.3. Решение по методу «ближайшего соседа» для TSP с 10 городами (длина 12,92)

Задачу коммивояжера, впервые описанную в XIX веке, старательного изучали на протяжении многих лет. Мы научились хорошо справляться с решением даже более сложных примеров, но методы поиска кратчайшего пути все еще сводятся к хитроумным способам анализа всех возможных маршрутов. Для сравнения, на рис. 4.4 показан самый короткий маршрут, найденый методом перебора всех 180 000 возможных путей. Его длина составляет 11,86, что примерно на 8 % короче лучшего маршрута «ближайшего соседа».

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

Рис. 4.4. Наилучшее решение для TSP из 10 городов (длина 11,86)

Стивен Кук в 1971 году получил замечательное математическое доказательство того, что многие из этих задач эквивалентны в следующем смысле: если мы найдем алгоритм с полиномиальным временем выполнения (что-то вроде N^2) для одной из них, это позволит нам найти алгоритмы для всех остальных. За свою работу Кук в 1982 году удостоился премии Тьюринга.

В 2000 году Математический институт Клэя[30] предложил премию в миллион долларов тому, кто найдет решение для одной из семи нерешенных проблем (так называемых Задач тысячелетия). Один из этих вопросов касался определения того, равны ли P и NP, то есть эквивалентны ли на самом деле «тяжелые» и «легкие» задачи^45. Гипотеза Пуанкаре – еще одна задача в списке, она датируется началом 1900-х годов. Ее решил российский математик Григорий Перельман, которого наградили премией в 2010 году, но ученый отказался ее принять. Осталось только шесть проблем – лучше поторопитесь, а то вас кто-нибудь опередит!

Говоря о сложности алгоритмов, надо держать в уме еще пару фактов. Хотя вопрос равенства P и NP важен, он скорее теоретический, чем практический. Большинство результатов по сложности, о которых говорят ученые-информатики, относятся к наихудшему случаю. То есть примеры некоторых задач потребуют для вычисления ответа максимально возможного времени, но не все они настолько тяжелы. Кроме того, это асимптотические оценки, применимые только для больших значений N. В повседневной жизни N бывает настолько маленьким, что асимптотическое поведение не имеет значения. Например, если у вас есть только несколько десятков или даже сотен элементов, то сортировка по методу выбора получится достаточно быстрой, хотя ее сложность квадратична, и асимптотически такая зависимость намного хуже, чем N log N в Quicksort. Если вы посещаете только 10 городов, то вполне возможно перебрать все возможные маршруты, однако данный метод вряд ли осуществим для 100 городов и совершенно невозможен для 1000. Наконец, в большинстве реальных ситуаций достаточно будет найти примерное решение, так как в поиске абсолютно оптимального ответа нет необходимости.

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

4.5. Краткие выводы

Информатика как область науки потратила годы на изучение концепции «как быстро мы можем вычислять». Квинтэссенцией таких поисков стала идея выражать время выполнения задачи в зависимости от количества данных (например, N, log N, N^2, или N log N). Здесь опускаются такие моменты, как скорость работы разных компьютеров и разница в таланте программистов. Однако тут затрагивается проблема сложности самой задачи или алгоритма, и поэтому данный метод хорошо подойдет для того, чтобы провести сравнение и сделать вывод, будут ли какие-либо вычисления выполнимыми. (Необязательно, чтобы объективная сложность задачи и алгоритма для ее решения совпадали. Например, сортировка – это проблема сложности N log N, но для нее применимы и Quicksort, алгоритм N log N, и сортировка по методу выбора, алгоритм N^2.)

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

Многие алгоритмы более специализированны и сложны, чем базовый поиск и сортировка. Например, алгоритмы сжатия пытаются уменьшить объем памяти, занимаемый текстом, музыкой (MP3, AAC), изображениями (PNG, JPEG) и фильмами (MPEG). Также важны алгоритмы обнаружения ошибок и их исправления, ведь данные могут повреждаться при хранении и передаче: в беспроводных каналах возникают зашумления, а на CD появляются царапины. Алгоритмы, которые вносят в данные управляемую избыточность, позволяют обнаружить и даже исправить некоторые виды ошибок. Мы еще вернемся к этим алгоритмам в главе 8, поскольку они будут важны в разрезе коммуникационных сетей.

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

Еще одна область, где алгоритмы играют решающую роль, – поисковые системы вроде Bing и Google. В принципе, многое из того, что они делают, устроено просто: система собирает какое-то количество веб-страниц, упорядочивает информацию так, чтобы ее легче получалось найти, а затем выполняет эффективный поиск по ней. Проблема в масштабе: веб-страниц миллиарды, и каждый день появляются миллиарды запросов. Даже зависимость N log N здесь недостаточно хороша, поэтому применяется множество алгоритмических и программных ухищрений, направленных на то, чтобы поисковые системы работали достаточно быстро, успевая за увеличением масштабов интернета и ростом нашего интереса к отысканию в нем того, что нам нужно. Более тщательно мы обсудим данную тему в главе 11.

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

5. Программирование и языки программирования

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

Морис Уилкс.

Мемуары компьютерного первопроходца[31], 1985

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

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

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

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

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

Помимо того, непросто управлять ресурсами компьютера, особенно учитывая сложность современного оборудования. Поэтому мы также поручаем ЭВМ контроль над ее собственными действиями, что подводит нас к концепции операционных систем (ОС). Тема этой главы – программирование и ЯП, а в следующей мы обсудим программные комплексы, особенно ОС. В главе 7 мы более подробно рассмотрим два важных языка – JavaScript и Python.

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

5.1. Ассемблерный (сборочный) язык

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

То, к каким проблемам это приводило, можно понять по цитате Мориса Уилкса в эпиграфе выше. Уилкс разрабатывал и внедрял EDSAC – один из первых компьютеров с хранимой программой, который начал работать в 1949 году. В 1967 году Морис получил премию Тьюринга за свои заслуги, а в 2000 году его посвятили в рыцари.

В начале 1950-х годов программы создавались для выполнения некоторых простых канцелярских обязанностей. Благодаря им разработчики могли использовать осмысленные названия для инструкций (ADD вместо 5, например) и имена для определенных ячеек памяти (Sum вместо 14). Программа, которая управляет другой программой, – это важная идея, лежащая в основе большинства значимых достижений в области ПО.

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

Ассемблерный язык (АЯ) специфичен для архитектуры процессоров, для работы с которыми он предназначен. Как правило, он в точности совпадает с инструкциями ЦПУ и «знает», как именно они закодированы в двоичный формат, как информация размещается в памяти и т. д. Это означает, что программа, написанная на АЯ определенного вида процессора (скажем, Intel в Mac или PC), будет отличаться от программы на АЯ для выполнения такой же задачи на другом ЦПУ – например, процессоре ARM в сотовых телефонах. Если кто-то захочет перевести программу с АЯ одного процессора на другой, то ее придется полностью переписать.

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

LOAD X

ADD Y

STORE Z

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

COPY X, Z

ADD X, Z

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

5.2. Языки высокого уровня

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

Код, написанный на языке высокого уровня, преобразуется программой-транслятором в инструкции на АЯ конкретного целевого процессора, а они, в свою очередь, переводятся ассемблером в биты для загрузки в память и выполнения. Транслятор обычно называется компилирующей программой (компилятором). Это еще один исторически сложившийся термин, он не особенно содержателен и интуитивно понятен.

На обычном языке высокого уровня вышеописанные расчеты, при которых складываются два числа – X и Y, а результат сохраняется в виде третьего числа – Z, описываются так:

Z = X + Y

Это означает «получить значения из ячеек памяти X и Y, сложить их и сохранить результат в ячейке памяти Z». Оператор «=» означает «заменить» или «сохранить», а не «равно».

Компилирующая программа в Игрушке преобразовала бы это в последовательность из трех инструкций, а в другом компьютере – в две инструкции. Соответствующие ассемблеры затем транслировали бы инструкции на своем языке в фактические наборы битов настоящих инструкций, а также выделили ячейки памяти под величины X, Y и Z. Полученные наборы битов почти наверняка оказались бы различными для каждого из компьютеров.

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

Рис. 5.1. Процесс компиляции в двух программах

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

Языки высокого уровня обладают большими преимуществами перед АЯ. Они ближе к образу мышления человека, их проще учить и использовать. Вам не нужно разбираться в наборах инструкций для всех процессоров, чтобы успешно писать код на этих языках. Все это позволяет большему количеству людей создавать программы для компьютеров, причем быстро. Кроме того, программа на языке высокого уровня не зависит от конкретной архитектуры, поэтому ее можно запускать на ЦПУ разных видов, обычно даже без изменений. Достаточно лишь скомпилировать ее с помощью другого компилятора, как показано на рис. 5.1. Программу можно написать только один раз и запускать на различных вычислительных устройствах. Это позволяет амортизировать затраты на разработку программ для всевозможных типов компьютеров – даже для тех, что еще не появились.

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

Я покажу одну и ту же программу, написанную на шести наиболее важных языках программирования высокого уровня – Fortran, С, C++, Java, JavaScript и Python, – чтобы вы в общих чертах уяснили их сходства и различия. Каждая из них выполняет то же самое, что и программа для компьютера-игрушки в главе 3. Она складывает целые числа, а когда появляется нулевое значение, выводит сумму и останавливается. Все программы имеют одинаковую структуру: они дают названия используемым величинам, присваивают нулевое начальное значение для суммы, считывают числа и суммируют их, пока не будет введен ноль, затем выводят полученную сумму. Не беспокойтесь о деталях синтаксиса: примеры в основном нужны для того, чтобы вы получили представление, как выглядят языки. Я старался, чтобы образцы программ как можно больше походили друг на друга, хотя, возможно, есть и более удачные способы написать любую из них в отдельности.

Первые языки высокого уровня были сосредоточены на конкретных прикладных областях. Один из самых ранних, FORTRAN, получил название от словосочетания «перевод формул» (англ. Formula Translation,) и сегодня пишется как Fortran. Его разработала команда сотрудников IBM под руководством Джона Бэкуса, и с помощью этого языка очень успешно задавали вычисления в науке и технике. Многие ученые и инженеры (включая меня) изучали Fortran в качестве своего первого ЯП, и по сию пору он жив и здоров. С 1958 года Fortran прошел несколько этапов развития, но сохранил свои узнаваемые черты. Бэкус получил премию Тьюринга в 1977 году в том числе и за работу над этим языком.

На рис. 5.2 приведена программа на языке Fortran для сложения ряда чисел.

Эти инструкции написаны на Fortran 77, и они выглядели бы по-другому в более ранней или поздней версии – например, самой свежей Fortran 2018. Поразмыслите, как перевести арифметические выражения и последовательность операций на АЯ нашей Игрушки. Операции read и write, очевидно, соответствуют GET и PRINT, а четвертая строка – явно проверка IFZERO.

Рис. 5.2. Программа на языке Fortran для сложения чисел

Второй основной язык высокого уровня конца 1950-х – COBOL (Common Business Oriented Language[32]), на который сильно повлияла работа Грейс Хоппер над высокоуровневыми решениями для ассемблерного языка. Хоппер сотрудничала с Говардом Эйкеном при создании «Марк I» и «Марк II» с гарвардской архитектурой, ранних механических компьютеров, а затем над UNI VAC I[33]. Грейс одной из первых разглядела потенциал языков высокого уровня и компиляторов^47. COBOL специально предназначался для обработки бизнес-данных, и его языковые особенности позволяли легко задавать структуры данных и вычисления, которые использовались для инвентаризации, подготовки счетов, составления платежных ведомостей и т. п. COBOL продолжает жить: он сильно изменился, но все еще узнаваем. Существует много устаревших программ, написанных на этом языке, однако пишущих на нем программистов мало. В 2020 году в штате Нью-Джерси обнаружили, что старинные программы для обработки заявлений о безработице не справляются с возросшим объемом обращений, вызванным COVID-19, но власти не смогли найти достаточно опытных специалистов для обновления программ на COBOL.

Еще один язык того времени – BASIC (Beginners All-purpose Symbolic Instruction Code – «Универсальная система символического кодирования для начинающих»), разработанный Джоном Кемени и Томом Курцем в 1964 году в городе Дартмут. Предполагалось, что BASIC будет несложным языком для обучения программированию. Он действительно получился очень простым и требовал незначительных вычислительных ресурсов, поэтому оказался первым языком высокого уровня, доступным на персональных компьютерах, когда они только появились. Билл Гейтс и Пол Аллен, основатели Microsoft, начинали с разработки компилятора на BASIC для микрокомпьютера Altair в 1975 году, что стало первым продуктом их компании. На сегодняшний день один из основных видов BASIC все еще активно поддерживается как Microsoft Visual Basic.

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

Fortran, COBOL и BASIC обрели такой успех потому, что сосредоточились на конкретных областях применения и намеренно не пытались решить все возможные задачи программирования. В течение 1970-х годов создавались языки, предназначенные для «системного программирования», то есть написания инструментов программирования – ассемблеров, компиляторов, текстовых редакторов и даже операционных систем. Безусловно, наиболее удачным из этих языков стал С, разработанный в 1973 году Деннисом Ритчи, сотрудником Лабораторий Белла. С тех времен С остается одним из самых популярных и широко используемых ЯП, причем изменился он немного. Современная программа на С очень похожа на те, что написали 30 или 40 лет назад.

На рис. 5.3 приведен очередной сравнительный пример программы для сложения чисел, теперь на С.

Рис. 5.3. Программа на языке С для сложения чисел

1980-е годы ознаменовались разработкой таких языков, как C++ (автор – Бьярне (Бьёрн) Страуструп, также из Лабораторий Белла), цель которых состояла в том, чтобы помочь людям справиться со сложностями при написании очень больших программ. C++ развился из С, и в большинстве случаев программа на С, как на рис. 5.3, годится для использования в программе на C++, но не наоборот.

На рис. 5.4 приведен пример сложения чисел в C++ – один из многочисленных способов решения такой задачи.

Рис. 5.4. Программа на C++ для сложения чисел

Большинство основных программ, которые мы сегодня используем на наших личных компьютерах, написаны на языке С или C++. Я печатаю этот текст на Мас, в котором большинство ПО создано на С, C++ и Objective-C (один из диалектов С). Первый черновик я набирал в Word, программе на языке С и C++, а в настоящее время я редактирую, форматирую и печатаю с помощью программ на С и C++, делаю резервные копии в операционных системах Unix и Linux (они обе – программы на С) и выхожу в Сеть через Firefox, Chrome и Edge (все на C++).

В 1990-е годы началось развитие интернета и Всемирной паутины, что привело к разработке многих новых ЯП. Компьютеры по-прежнему получали все более быстрые процессоры, объемы ОЗУ увеличивались, и потому скорость и удобство программирования стали более важными, чем эффективность использования «железа». Языки вроде Java и JavaScript намеренно идут на этот компромисс.

Java создан в начале 1990-х Джеймсом Гослингом из компании Sun Microsystems. Первоначально этот язык ориентировался на небольшие встроенные системы, такие как бытовая техника и электронные устройства, где прежде всего требовалась гибкость, а не скорость. Затем Java перепрофилировали для запуска на веб-страницах, но там он не прижился, зато широко применяется на вебсерверах. Когда вы посещаете сайт вроде Ebay, на вашем компьютере работают C++ и JavaScript, но вполне вероятно, что интернет-магазин использует Java для подготовки страницы, которую отправляет в ваш браузер. Кроме того, Java – основной язык, на котором пишутся приложения для Android. Этот ЯП проще, чем C++ (хотя развивается в сторону такой же комплексности), но сложнее, чем C. Java также безопаснее, чем C, поскольку устраняет некоторые опасные функции и имеет встроенные механизмы для обработки задач, подверженных ошибкам, – например, управление сложными структурами данных в памяти. По этой причине он также популярен в качестве первого языка на занятиях по программированию.

На рис. 5.5 показана программа сложения чисел на Java. Для нее потребовалось больше слов, чем в других языках, что вполне типично для Java, но ее получилось бы сократить на две-три строки, если бы я объединил несколько вычислений.

Рис. 5.5. Программа на языке Java для сложения чисел

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

JavaScript – язык из того же широкого семейства, начало которому положил С, хотя у него много уникальных особенностей. Его создал Брендан Эйх из компании Netscape в 1995 году. У JavaScript нет ничего общего с Java, кроме разве что одинаковой части в названии. С самого начала его проектировали для использования в браузере, чтобы обепечить динамические эффекты на вебстраницах, и сегодня почти все они включают в себя код JavaScript. Мы подробнее поговорим об этом ЯП в главе 7, но ради наглядности сравнений версия сложения чисел в JavaScript представлена здесь, на рисунке 5.6.

Рис. 5.6. Программа на JavaScript для сложения чисел

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

Перейдем к Python, созданному в 1990 году Гвидо ван Россумом из Centrum Wiskunde & Informatica[34] (CWI) в Амстердаме. Синтаксически он несколько отличается от С, C++, Java и JavaScript, и одна из его наиболее характерных черт – использование отступов вместо скобок для указания групп команд.

С самого начала Python разрабатывался с акцентом на удобочитаемость. Его легко учить, он стал одним из наиболее широко используемых языков, с богатым набором программных библиотек для почти любой мыслимой задачи, связанной с написанием кода. Если бы мне пришлось выбрать только один язык, который я мог бы изучать или преподавать, я бы назвал Python. Подробнее мы поговорим о нем в главе 7, а здесь на рисунке 5.7 представлен вариант программы для суммирования чисел на Python.

Рис. 5.7. Программа на Python для сложения чисел

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

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

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

Что бы ни происходило, ЯП остаются важной и увлекательной частью информатики. Американский лингвист Бенджамин Уорф сказал: «Язык формирует наши способы мышления и определяет то, о чем мы можем думать». Лингвисты до сих пор спорят о том, верно ли это утверждение для естественных языков, но, похоже, оно применимо для искусственных языков, которые мы изобретаем для передачи команд компьютеру.

5.3. Разработка программного обеспечения

Программирование в реальном мире, как правило, ведется в больших масштабах. Стратегия похожа на ту, которую мы используем, когда пишем книгу или беремся еще за какой-нибудь крупный проект: определяем, что делать, начиная с общей спецификации, последовательно разбиваем задачу на всё более мелкие компоненты, а затем работаем над каждым из них по отдельности, следя, чтобы они сочетались друг с другом. В программировании эти части обычно имеют такой размер, чтобы написать для них точные вычислительные шаги на каком-либо языке получилось у одного человека. Обеспечить совместную работу фрагментов, разработанных разными программистами, довольно сложно, а неудачная реализация данного этапа приводит к многочисленным ошибкам. Например, орбитальный аппарат NASA Mars Climate Orbiter потерпел неудачу в 1999 году, потому что в ПО системы управления полетом для определения тяги использовались метрические единицы, а данные коррекции курса ввели в британских (неметрических) единицах. Из-за этого аппарат вышел на неверную траекторию, слишком приблизился к поверхности планеты и развалился в атмосфере^48.

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

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

Для сравнения: компилятор или веб-браузер могут содержать от сотен тысяч до миллиона строк. Наконец, крупные системы состоят из нескольких миллионов или даже десятков миллионов строчек кода, над ними одновременно работают сотни или тысячи людей, а срок их службы измеряется десятилетиями. Компании обычно осторожничают и стараются не раскрывать, насколько масштабны их программы, но достоверная информация иногда всплывает. Например, согласно презентации на Google Conference в 2015 году, в общей сложности в их поисковике насчитывалось около двух миллиардов строк кода^49. К настоящему времени, вероятно, их стало минимум вдвое больше.

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

5.3.1. Библиотеки, интерфейсы и средства разработки

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

То же верно и в отношении программирования. Серьезных программ, которые бы создавались с нуля, практически не существует. Можно взять «с полочки» много компонентов, уже написанных кем-то другим, и использовать их напрямую. Например, если вы пишете программу для Windows или Мас, то у вас уже есть доступ к коду стандартных меню, кнопок, графических вычислений, сетевых соединений, подключений к базам данных и так далее. Большая часть работы заключается в том, чтобы разобраться в этих компонентах и склеить их по-своему. Естественно, такие элементы опираются на другие, более простые и базовые, часто в несколько слоев. Ну, а фундаментом служит ОС – программа, которая управляет оборудованием и контролирует все, что происходит. Мы поговорим об операционных системах в следующей главе.

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

Этот код «вызывает» (то есть использует) две функции языка С: scanf считывает данные из источника ввода, то есть он аналогичен GET в компьютере-игрушке, a printf печатает выходные данные, как и PRINT. У любой функции есть имя и набор входных значений данных, которые нужны ей для выполнения своей работы. Она производит вычисления и может возвращать результат той части программы, где она задействована. Синтаксис и другие детали здесь специфичны для С и будут отличаться в другом языке, но сама концепция универсальна. Наличие функций позволяет писать программу, опираясь на компоненты, которые уже созданы по отдельности и используются всеми программистами при необходимости.

Набор связанных функций обычно называется библиотекой. Например, С имеет стандартную библиотеку функций для чтения и записи данных на диски и в другие места, причем scanf и printf входят в нее.

Сервисы, предоставляемые библиотекой функций, описываются для программистов в терминах API (Application Programming Interface), то есть программного интерфейса прикладных задач. В нем перечисляются сами функции и то, что они выполняют, указывается, как их использовать в программе, какие входные данные требуются и какие значения они выдают. В API также могут описываться структуры данных (организация данных, передающихся назад и вперед) и еще всякая всячина, которая совместно определяет, как именно программист должен обращаться к сервисам и что будет вычислено в качестве результата. Здесь нужна подробная и точная спецификация, потому что в конечном счете программу будет интерпретировать тупой прямолинейный компьютер, а не дружелюбный и сговорчивый человек.

API включает в себя не только описание синтаксических требований, но и вспомогательную документацию, благодаря которой программисты эффективно используют систему. Современные крупные комплексы часто включают в себя SDK (Software Development Kit), то есть пакет средств разработки ПО, чтобы люди могли ориентироваться во все более замысловатых программных библиотеках. Например, Apple предоставляет среду и инструменты поддержки для программистов, которые пишут код для iPhone и iPad. Google обеспечивает аналогичный SDK для телефонов на Android, a Microsoft – различные среды разработки для создания кода Windows на разных языках для многих устройств. SDK и сами по себе – большие программные комплексы. В частности, Android Studio, пакет средств для этой ОС, весит 1,6 Гб, a Xcode, SDK для разработчиков Apple, – намного больше.

5.3.2. Ошибки (баги)

К сожалению, ни одна серьезная программа не начинает работать с первого раза: жизнь слишком сложна, и программы это тоже отражают. Они требуют безукоризненного внимания к мелочам, которым мало кто обладает. Ошибки встречаются в программах любого масштаба: при определенных обстоятельствах они будут что-то делать неправильно или выдавать неверные ответы. Эти недостатки называются «багами», то есть «жуками», и первое употребление термина часто приписывают Грейс Хоппер, которая упоминалась выше. В 1947 году ее коллеги обнаружили настоящего жука (дохлую моль) в механическом компьютере «Марк II», с которым они работали, и Хоппер, по-видимому, сказала, что они «очищали [машину] от жуков» (англ, debugging), то есть занимались отладкой. Насекомое сохранили, и оно обрело своего рода бессмертие. Его можно увидеть в Музее американской истории Смитсоновского института в Вашингтоне и на фотографии, приведенной на рис. 5.8.

Рис. 5.8. Жучок из ЭВМ «Марк II» гарвардской архитектуры^50

Однако Хоппер не вводила новое значение для слова bug; оно датируется 1889 годом. В Оксфордском словаре английского языка (второе издание) сказано:

bug. Дефект или неисправность в машине, плане или подобном.

Происх. США

1889 Pall Mall Gaz[35], 11 марта. 1/1 Мистер Эдисон, как мне сообщили, две предыдущие ночи не спал, обнаружив в своем фонографе «жука» – выражение, обозначающее попытки решить затруднение и подразумевающее, что какое-то воображаемое насекомое спряталось внутри и порождает все неприятности.

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

Рис. 5.9. Функции для пересчета между шкалами Цельсия и Фаренгейта

В качестве примера с выдуманной ситуацией на рис. 5.9 показана пара функций JavaScript, которые переводят температуру по Цельсию в градусы Фаренгейта и наоборот. (Операторы * и ⁄ выполняют умножение и деление соответственно.) Одна из этих функций выдает ошибку. Вы заметите ее? Я вернусь к ней через мгновение.

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

Как бы вы проверили функции преобразования градусов, показанные на рис. 5.9? Безусловно, вы решите провести несколько простых тестов с ситуациями, в которых ответы известны – например, температура по Цельсию 0° и 100° соответствует значениям 32° и 212° по Фаренгейту. Все работает прекрасно.

Но в другом направлении, от Фаренгейта к Цельсию, программа вычисляет не так хорошо: функция сообщает, что 32 °F равно -14,2 °C, а 212 °F равно 85,8 °C, что неверно. Ошибка в том, что там не поставлены круглые скобки: нужно сначала вычесть 32 из значения по Фаренгейту, а уже потом умножить результат на 5/9. Выражение в f toe должно быть таким:

return 5/9 * (f – 32);

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

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

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

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

Еще одна сложность реального ПО заключается в том, что среда постоянно меняется и программы нужно адаптировать. Разрабатывается новое аппаратное обеспечение, и для него необходимо новое ПО, иногда с изменениями в системах. Также на техзадания программ влияют принятые властями законы и другие требования. Например, пакеты вроде TurboTax[36] должны обновляться в соответствии с частыми изменениями в налоговом законодательстве во многих юрисдикциях. Компьютеры, средства разработки, языки и физические устройства устаревают и подлежат замене. Также выходят из обращения форматы данных: например, в современной версии Word невозможно прочитать файлы начала 1990-х. Вместе с ними исчезают знания и навыки, потому что люди уходят на пенсию, умирают или теряют работу в результате сокращения штата корпорации. С программами, написанными студентами, возникают такие же сложности, когда их авторы покидают стены университета.

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

5.4. Интеллектуальная собственность

Термин «интеллектуальная собственность» относится к различным видам нематериальной собственности, которые появились в результате творческих усилий, таких как изобретение или авторство. Это книги, музыка, картины, фотографии (сами произведения, а не их воплощения на носителях). Важный пример – программное обеспечение. Оно неосязаемо, но ценно. Для создания и поддержания значительного объема кода необходимо много и напряженно работать. В то же время ПО можно копировать неограниченное количество раз и без затрат распространять по всему миру, его легко изменять, и, в конечном счете, оно невидимо.

Концепция прав на программное обеспечение порождает сложные юридические вопросы (думаю, даже в большей степени, чем с аппаратным обеспечением, хотя, возможно, это мое предубеждение как программиста). ПО – более новая область по сравнению с оборудованием, ведь до 1950 года программных средств не существовало, и только за последние лет сорок они стали крупным независимым сектором экономики. Прошло сравнительно мало времени, чтобы законы, коммерческая практика и социальные нормы успели развиться как должно. В этом разделе я рассмотрю некоторые проблемы, чтобы у вы разобрались в основных технических принципах и смогли, по крайней мере, оценить ситуацию с разных точек зрения. Я описываю ситуацию с позиции законодательства США – в других странах есть аналогичные системы, но они отличаются во многих отношениях.

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

5.4.1. Коммерческая тайна

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

5.4.2. Товарный знак

Товарный знак — это слово, фраза, название, логотип или даже особенный цвет, который отличает товары или услуги компании. Например, плавный, будто рукописный шрифт, который используется в рекламе Coca-Cola, и форма классической бутылки Соке – это все относится к товарному знаку. Золотые арки McDonald’s – это торговая марка, которая отличает его от других компаний быстрого питания.

В вычислительной технике существует множество товарных знаков – например, блестящий контур на ноутбуках Mac от Apple. Четырехцветный логотип в операционной системе Microsoft на компьютерах и игровых контроллерах выполняет такую же функцию.

5.4.3. Авторское право

Авторское право (АП) защищает творческое самовыражение, и оно знакомо нам в контексте литературы, искусства, музыки и фильмов. Оно оберегает творческую работу от копирования другими людьми – по крайней мере, в теории – и предоставляет создателям право получать доход от своей работы в течение ограниченного периода времени. В США он раньше составлял 28 лет с одним продлением, но сейчас рассчитывается как «до конца жизни автора плюс 70 лет». Во многих других странах добавляют 50 лет вместо семидесяти. В 2003 году Верховный суд США постановил, что 70 лет после смерти автора – «ограниченный» срок^52. Формально это правильно, но на практике не отличается от «навсегда». Правообладатели в Штатах прилагают все усилия, чтобы распространить по всему миру условия авторского права, соответствующие законодательству США.

Обеспечить соблюдение АП на цифровые материалы непросто. Можно без каких-либо затрат создать и распространить по всему миру любое количество электронных копий. Попытки защитить авторские материалы с помощью шифрования и других форм управления цифровыми правами[37], или DRM (digital rights management), неизменно терпели неудачу. Шифрование обычно оказывается уязвимым, и даже если нет, материалы могут перезаписать в ходе их воспроизведения (т. н. аналоговая брешь), например путем тайной съемки в кинотеатре. Частным лицам и даже крупным организациям трудно добиться успеха, преследуя нарушение авторских прав в судебном порядке. Я вернусь к этой теме в главе 9.

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

5.4.4. Патент

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

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

Наглядным примером патента для ПО может выступать технология Amazon «Один клик». В сентябре 1999 года четыре изобретателя из Amazon.com, включая Джеффа Безоса, основателя и генерального директора компании, получили патент США № 5 960 411. Его выдали на «Метод и систему размещения заказа для покупки товара через интернет», где заявленное нововведение позволяло зарегистрированным пользователям размещать заказ одним щелчком мыши (рис. 5.10)53. Обратите внимание, что «Один клик» – зарегистрированная торговая марка Amazon, обозначаемая как 1-Click®.

Рис. 5.10. Amazon 1-Click®

Из-за патента на «Один клик» почти 20 лет шли споры и юридические разбирательства. Справедливо сказать, что большинство программистов считают такую концепцию очевидной, однако закон гласит, что изобретение должно выглядеть «неочевидным» для «человека, обладающего обычными навыками в данной области» на момент изобретения, которое случилось в 1997 году, на заре веб-коммерции. Патентное ведомство США отклонило некоторые патентные притязания, но удовлетворило другие. Тем временем патент лицензировали другие компании, включая Apple с ее интернет-магазином iTunes, a Amazon получил судебное постановление, которое запрещало прочим фирмам использовать идею «Один клик» без разрешения. Естественно, в зарубежных странах складывалась иная ситуация. К счастью, все это больше не актуально, поскольку срок патента, составлявший 20 лет, уже истек.

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

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

5.4.5. Лицензии

Лицензии — это юридические соглашения, по которым дается разрешение на использование продукта. Каждый пользователь компьютера знаком с этапом процесса установки новой версии какого-либо ПО – «Лицензионным соглашением с конечным пользователем», или EULA (End User License Agreement). В диалоговом блоке показывается маленькое окошко с колоссальным объемом текста мелким шрифтом – юридический документ, с условиями которого вы должны согласиться, чтобы двинуться дальше. Большинство людей просто ставят галочку, не читая, что в теории и, возможно, на практике связывает их законными обязательствами по соглашению.

Если вы все-таки прочтете эти условия, то вряд ли удивитесь, увидев, что они односторонние. Поставщик отказывается от любых гарантий и ответственности, даже не обещая, что ПО будет что-то делать. Приведенный ниже отрывок (все буквы прописные, как в оригинале) – небольшая часть лицензионного соглашения для macOS Mojave, операционной системы, работающей на моем Мас^55.

B. ВЫ ПРЯМО ПРИЗНАЕТЕ И СОГЛАШАЕТЕСЬ С ТЕМ, ЧТО, НАСКОЛЬКО ЭТО РАЗРЕШЕНО ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, ИСПОЛЬЗОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ APPLE И ЛЮБЫХ УСЛУГ, ПРЕДОСТАВЛЯЕМЫХ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ APPLE ИЛИ ДОСТУПНЫХ ЧЕРЕЗ НЕГО, ОСУЩЕСТВЛЯЕТСЯ ИСКЛЮЧИТЕЛЬНО НА ВАШ СТРАХ И РИСК И ЧТО ВЕСЬ РИСК В ОТНОШЕНИИ УДОВЛЕТВОРИТЕЛЬНОГО КАЧЕСТВА, ПРОИЗВОДИТЕЛЬНОСТИ, ТОЧНОСТИ И ПРИЛОЖЕННЫХ УСИЛИЙ ЛЕЖИТ НА ВАС.

C. В МАКСИМАЛЬНОЙ СТЕПЕНИ, РАЗРЕШЕННОЙ ПРИМЕНИМЫМ ЗАКОНОДАТЕЛЬСТВОМ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ И УСЛУГИ APPLE ПРЕДОСТАВЛЯЮТСЯ «КАК ЕСТЬ» И «ПО НАЛИЧИЮ», СО ВСЕМИ ОШИБКАМИ И БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, И КОМПАНИЯ APPLE И ЕЕ ЛИЦЕНЗИАРЫ (СОВМЕСТНО ИМЕНУЕМЫЕ «APPLE» В РАМКАХ РАЗДЕЛОВ 7 И 8) НАСТОЯЩИМ ОТКАЗЫВАЮТСЯ ОТ ВСЕХ ГАРАНТИЙ И УСЛОВИЙ В ОТНОШЕНИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ И УСЛУГ APPLE, ЯВНЫХ, ПОДРАЗУМЕВАЕМЫХ ИЛИ ПРЕДУСМОТРЕННЫХ ЗАКОНОМ, ВКЛЮЧАЯ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИИ И/ИЛИ УСЛОВИЯ ТОВАРНОЙ ПРИГОДНОСТИ, УДОВЛЕТВОРИТЕЛЬНОГО КАЧЕСТВА, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ТОЧНОСТИ, СПОКОЙНОГО ИСПОЛЬЗОВАНИЯ И ОТСУТСТВИЯ НАРУШЕНИЯ ПРАВ ТРЕТЬИХ ЛИЦ, НО НЕ ОГРАНИЧИВАЯСЬ ЭТИМИ ГАРАНТИЯМИ.

D. APPLE НЕ ГАРАНТИРУЕТ ОТСУТСТВИЕ ВМЕШАТЕЛЬСТВА В ВАШЕ ПОЛЬЗОВАНИЕ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ И СЕРВИСАМИ APPLE И ТО, ЧТО СОДЕРЖАЩИЕСЯ ФУНКЦИИ ИЛИ УСЛУГИ, СОЗДАННЫЕ ИЛИ ПРЕДОСТАВЛЯЕМЫЕ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ APPLE, БУДУТ СООТВЕТСТВОВАТЬ ВАШИМ ТРЕБОВАНИЯМ, И ЧТО РАБОТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ СЕРВИСОВ APPLE БУДЕТ БЕСПЕРЕБОЙНОЙ ИЛИ БЕЗОШИБОЧНОЙ, ЧТО ЛЮБЫЕ УСЛУГИ БУДУТ ПРОДОЛЖАТЬ ПРЕДОСТАВЛЯТЬСЯ, ЧТО ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ СЕРВИСЫ APPLE БУДУТ СОВМЕСТИМЫ ИЛИ БУДУТ РАБОТАТЬ С ЛЮБЫМ ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ, ПРИЛОЖЕНИЯМИ ИЛИ СЕРВИСАМИ ТРЕТЬИХ СТОРОН, ИЛИ ЧТО ДЕФЕКТЫ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ ИЛИ СЕРВИСАХ APPLE БУДУТ ИСПРАВЛЕНЫ. УСТАНОВКА ЭТОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ APPLE МОЖЕТ ПОВЛИЯТЬ НА ДОСТУПНОСТЬ И УДОБСТВО ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ПРИЛОЖЕНИЙ ИЛИ СЛУЖБ ТРЕТЬИХ СТОРОН, А ТАКЖЕ ПРОДУКТОВ И СЕРВИСОВ APPLE.

В большинстве EULA говорится, что вы не сможете подать в суд на возмещение ущерба, если ПО причинит вам вред. Существуют условия относительно того, для чего может использоваться программное обеспечение, и вы соглашаетесь с тем, что не будете пытаться декомпилировать его или транслировать на ассемблерный язык. Вы не имеете права поставлять его в определенные страны и применять для разработки ядерного оружия (я серьезно)56. Мои друзья-юристы говорят, что такие лицензии, как правило, действительны и подлежат исполнению, если условия не слишком безумны. Но тогда возникает вопрос, как определить их разумность.

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

Отличный пример такой ситуации появился в июле 2009 года. Компания Amazon «продает» много книг на своем устройстве для чтения Kindle, хотя в действительности произведения лицензируются, а не продаются. В какой-то момент компания поняла, что распространяла кое-какие книги, на которые не имела необходимых прав, и поэтому «отменила их продажу», то есть отключила на всех устройствах Kindle. По замечательной иронии судьбы, в число отозванных произведений вошло издание антиутопического романа Джорджа Оруэлла «1984». Не сомневаюсь, ему понравилась бы эта история.

Из-за API (прикладной интерфейс программирования) также возникает несколько интересных юридических вопросов, в основном связанных с авторскими правами. Предположим, что я произвожу какую-нибудь программируемую игровую систему, аналогичную ХЬох или PlayStation. Я хочу, чтобы люди покупали мои приставки, и продажи будут успешнее, если на них выйдет много хороших игр. Очевидно, мне не удастся написать всё ПО самостоятельно, поэтому я тщательно продумаю подходящий API, чтобы другие люди сумели создавать проекты для моей консоли. Чтобы помочь разработчикам игр, я могу также предоставить средства разработки ПО, или SDK, аналогичные XDK для ХЬох от Microsoft. Если повезет, я продам горы приставок, заработаю кучу денег и уйду на пенсию счастливым.

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

Как мне поступить с точки зрения закона? Я не могу запатентовать API, поскольку это не оригинальная идея. И он не будет коммерческой тайной, я ведь должен показывать интерфейс людям, которые станут им пользоваться. Однако если определять API как творческий акт, я должен иметь возможность защитить его авторскими правами, чтобы другим людям, желающим воспользоваться им, требовалась лицензия от меня. То же самое верно, если я предоставляю SDK. Достаточно ли такой защиты? Эта юридическая коллизия и множество подобных ей не вполне разрешены.

Статус авторских прав на API – не гипотетический вопрос. Например, в январе 2010 года компания Oracle купила Sun Microsystems, которая создала язык программирования Java, а в августе 2010 года подала в суд на Google, утверждая, что Google незаконно использует Java API на телефонах с ОС Android, запускающих Java-код^57.

Если пересказать суть этой запутанной истории простыми словами, то в итоге окружной суд постановил, что API не может охраняться авторским правом. Oracle подала апелляцию, и решение отменили. Затем Google подала петицию в Верховный суд США, прося о рассмотрении этого дела, но в июне 2015 года получила отказ. В следующем раунде Oracle запросила компенсацию в размере более 9 миллиардов долларов, но присяжные решили, что Google «добросовестно использовал» API и, следовательно, не нарушил закона об авторском праве. Я думаю, что в данном случае большинство программистов на стороне Google, но вопрос еще не решен. (В качестве ремарки скажу, что я дважды подписывал экспертное заключение от EFF[38] (Фонд электронных рубежей, борется с нарушением конфиденциальности с помощью электронных технологий), где поддерживается позиция Google.) После еще нескольких раундов разбирательств Верховный суд вновь рассмотрел дело в октябре 2020 года[39].

5.5. Стандарты

Стандарт — это точное и подробное описание того, как следует создавать какой-либо продукт разработки или как он должен функционировать. Некоторые из них, как. doc и. docx, форматы файлов Word, это стандарты де-факто: они не имеют официального статуса, но все ими пользуются. Слово «стандарт» лучше всего подходит для формальных описаний, которые часто составляет и поддерживает квазинейтральная сторона вроде некоего правительственного агентства или консорциума. В них определяется, как что-либо собрано или функционирует. Там приводится достаточно полное и точное определение, на основании которого отдельные субъекты могут взаимодействовать или независимо предоставлять варианты реализации.

Стандарты аппаратного обеспечения постоянно приносят нам пользу, хотя мы, возможно, не замечаем, как их много. Купив новый телевизор, я могу подключить его к электрическим розеткам в моем доме благодаря стандартам, касающимся размера и формы штекеров, а также напряжения, которое они обеспечивают. (Хотя, конечно, в других странах все иначе; уезжая в Европу, мне приходится брать с собой несколько хитроумных адаптеров, чтобы через них вставлять североамериканские вилки в разные розетки в Англии и Франции.) Сам телевизор будет принимать сигналы и выводить изображения, потому что существуют стандарты широковещательного и кабельного ТВ. Я сумею подсоединить к нему другие устройства с помощью стандартных кабелей и разъемов, таких как HDMI, USB, S-video и так далее. Но каждому телевизору нужен собственный пульт дистанционного управления, потому что они не стандартизированы, а так называемые «универсальные» пульты работают далеко не всегда.

Иногда существуют даже конкурирующие стандарты, что кажется контрпродуктивным. (Как однажды сказал специалист по информатике Энди Таненбаум, «самое приятное в стандартах то, что можно выбрать тот, какой больше нравится».) В качестве исторических примеров можно привести «Betamax против VHS» для видеокассет, «HD-DVD против Blu-ray» для видеодисков высокой четкости. В обоих случаях один из них в конечном счете взял верх, но есть примеры, когда сосуществовало несколько стандартов: например, две несовместимые технологии сотовых телефонов, использовавшиеся в США примерно до 2020 года.

В программном обеспечении также есть множество стандартов – например, наборы символов ASCII и Unicode, языки программирования C и C++, алгоритмы шифрования и сжатия, а также протоколы для обмена информацией по сетям.

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

5.6. Программное обеспечение с открытым исходным кодом

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

Концепция открытого исходного кода (open source) описывает альтернативную ситуацию, при которой ИК свободно доступен для изучения и улучшения.

В прежние времена большинство ПО разрабатывалось компаниями, и основная часть исходного кода держалась в секрете как коммерческая тайна разработчика. Ричард Столлман, программист из Массачусетского технологического института (МТИ), досадовал из-за того, что не мог исправить или улучшить программы, которые он использовал, поскольку их ИК защищали права собственности, что перекрывало доступ к нему. В 1983 году Столлман запустил проект, названный им GNU[41] (https://www.gnu.org/), для создания бесплатных и открытых версий важных программных комплексов – например, операционной системы и компиляторов для ЯП. Он также основал некоммерческую организацию Free Software Foundation (Фонд свободного программного обеспечения) для поддержки открытого исходного кода. Ричард стремился создавать перманентно «свободное» ПО в том смысле, что на него не брали бы патенты и не обременяли бы ограничениями владения. Своей цели он достиг, распространяя разработки под отлично продуманной лицензией авторского права «Универсальная общественная лицензия GNU» (GNU General Public License, или GPL).

В преамбуле к GPL говорится:

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

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

Благодаря проекту GNU, поддерживаемому компаниями, организациями и частными лицами, удалось создать обширную коллекцию средств разработки программ и приложений, все элементы которой защищены GPL. Другие приложения и документы свободного распространения имеют схожие лицензии – например, Creative Commons, которая сопровождает многие изображения в «Википедии». В некоторых случаях версии с открытым ИК устанавливают стандарт, по которому оцениваются запатентованные коммерческие версии. Открытый исходный код имеют браузеры Firefox и Chrome, а также Apache и NGINX, два наиболее распространенных вебсервера, и ОС Android для мобильных телефонов.

Языки программирования и вспомогательные инструменты в настоящее время почти всегда имеют открытый ИК. Будь они строго проприетарными, при создании новых ЯП возникли бы затруднения. За последнее десятилетие Google разработала и выпустила Go, Apple – Swift, Mozilla – Rust, a Microsoft предоставила доступ к C# и F#, которые долгие годы защищались правами собственности.

Пожалуй, наиболее заметный проект с открытым исходным кодом – операционная система Linux. Она широко используется частными лицами и крупными коммерческими предприятиями, такими как Google, где вся инфраструктура управляется на этой ОС. Вы можете бесплатно загрузить исходный код Linux с kernel.org, использовать его в личных целях и вносить любые изменения. Но если вы распространяете его в любой форме (например, в новом гаджете с какой-либо операционной системой), вы обязаны сделать ваш исходный код доступным под той же GPL. Оба моих автомобиля от разных производителей работают на Linux, и глубоко внутри системы экранного меню каждого из них находятся уведомление о GPL и ссылка. Перейдя по ней, я смог загрузить код из интернета (не из машины!) – почти гигабайт ИК Linux^58.

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

Некоторые из этих вопросов, по-прежнему интересующих экономистов и социологов, начинают проясняться. Например, Red Hat[42], основанная в 1993 году, к 1999 году стала публичной компанией, акции которой торговались на Нью-Йоркской фондовой бирже, а в 2019-м ее приобрела IBM за 34 миллиарда долларов. Red Hat распространяет исходный код Linux, который можно бесплатно скачать в интернете, – но зарабатывает деньги, получая оплату за поддержку, обучение, обеспечение качества, интеграцию и другие услуги. Многие программисты открытого ИК официально трудоустроены в компаниях, которые используют этот код и вносят в него свой вклад. IBM, Facebook[43] и Google – яркие примеры такого подхода, но, конечно, не единственные. Microsoft в настоящее время – один из крупнейших разработчиков ПО с открытым исходным кодом. Компании выигрывают от того, что направляют развитие программ в нужную им сторону, и от того, что другие люди исправляют их ошибки и вносят усовершенствования.

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

5.7. Краткие выводы

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

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

6. Программные системы

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

Фредерик П. Брукс.

Мифический человеко-месяц[44], 1975

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

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

Жаргонный термин для таких программ – приложение. Он предположительно произошел от фразы «прикладная программа для решения какой-либо задачи на компьютере». Так обычно называются более-менее автономные программы, которые сосредоточены на выполнении одной задачи. Раньше это слово использовалось только в среде программистов, но после ошеломляющего успеха App Store от Apple, где продавались приложения для iPhone, в повседневую речь на английском прочно вошло усеченное «app».

Когда вы приобретаете компьютер или телефон, на нем уже установлены несколько таких программ, и со временем вы пополняете их список, покупая или загружая новые. Приложения в этом смысле важны для нас как пользователей, но они также обладают рядом интересных свойств с технической точки зрения. Мы коротко поговорим о нескольких видах, а затем сосредоточимся на одном из них – браузере. Это показательный пример, ведь с браузерами знаком каждый, но в нем все равно таятся некоторые сюрпризы, включая неожиданные параллели с ОС.

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

6.1. Операционные системы

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

Операционные системы неуклонно усложнялись, не отставая от развития оборудования, которым они управляли. А поскольку «железо» становилось все более мощным и хитроумно устроенным, имело смысл выделять больше ресурсов для управления им. Первые широко используемые ОС возникли на рубеже 1950-1960-х годов. Обычно они предоставлялись той же компанией, которая производила оборудование, и были тесно с ним связаны, поскольку их писали на ассемблерном языке. IBM и более мелкие компании вроде Digital Equipment[45] и Data General[46] выпустили собственные операционные системы для своей аппаратуры. Фредерик Брукс, которого я процитировал в эпиграфе выше, руководил разработкой компьютеров IBM серии System/360 и OS/360 – флагманской ОС его компании с 1965 по 1978 год. Брукс получил премию Тьюринга 1999 года за свой вклад в компьютерную архитектуру, операционные системы и разработку ПО.

ОС также изучали в университетах и промышленных лабораториях. Первопроходцем здесь стал Массачусетский технологический институт, где в 1961 году создали систему под названием CTSS («Совместимая система с разделением времени»). Она получилась действительно передовой на тот момент и, не в пример ее промышленным конкурентам, приятной в использовании. В 1969 году Кен Томпсон и Деннис Ритчи, сотрудники Лабораторий Белла, которые работали над Multics – более сложным и менее успешным продолжением CTSS, – написали ОС Unix. Все современные операционные системы, за исключением Windows от Microsoft, произошли или от оригинальной Unix, или от совместимой с ней, но независимо созданной Linux. Именно за работу над Unix Ритчи и Томпсон в 1983 году совместно удостоились премии Тьюринга^59.

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

Единственный способ жонглировать всеми элементами на таком уровне сложности – задействовать еще одну программу, чтобы компьютер сам помогал себе производить операции. Такая программа называется операционной системой. Наиболее распространенная ОС для домашних и рабочих компьютеров – Windows от Microsoft и ее различные исторические версии. Они установлены примерно на 80–90 % машин, которые мы видим в повседневной жизни. Компьютеры от Apple работают на системе macOS. Многие «закулисные» компьютеры (и некоторые на переднем плане) – на Linux. Смартфонами также управляют ОС: изначально под них писали специализированные системы, но сегодня зачастую обходятся облегченными версиями Unix или Linux. Например, на iPhone и iPad установлена iOS, производная от macOS, которая, по сути, вариант Unix. А вот в телефонах на базе Android применяется Linux, как и в моих телевизоре TiVo, читалке Amazon Kindle и устройствах Google Nest. Я даже могу войти в мой телефон на Android и запустить на нем базовые команды Unix.

Любая ОС управляет ресурсами компьютера и распределяет их. Во-первых, она руководит процессором, планируя и координируя программы, которые используются на данный момент. В любой момент времени она переключает внимание ЦПУ между программами, активно выполняющими вычисления в данный момент, – как между приложениями, так и между фоновыми процессами вроде антивирусного ПО. Также ОС приостанавливает работу задач, ожидающих события, – например, щелчка пользователя по диалоговому окну. Тем самым она не позволяет отдельным программам «грести ресурсы под себя»: если одна задача требует слишком много процессорного времени, операционная система «притормаживает» ее, чтобы и на другие программы осталась необходимая доля.

В типичной ОС одновременно работают сотни процессов. Среди них есть и приложения, запущенные пользователями, но большинство из них – системные задачи, невидимые нам. Увидеть, что происходит, вы можете с помощью таких программ, как Activity Monitor на macOS или Task Manager (диспетчер задач) на Windows, или аналогичного средства на телефоне. На рис. 6.1 показано несколько из 300 процессов, которые сейчас запущены на Мас, пока я печатаю. Большинство из них не зависят друг от друга и поэтому хорошо подходят для многоядерной архитектуры.

Во-вторых, ОС управляет оперативной памятью. Она загружает программы в память, чтобы они приступили к выполнению инструкций. Также она временно копирует их на диск, если не хватает памяти на все одновременно идущие процессы, а потом перемещает обратно, когда появляется свободное место. Это не дает отдельным программам вмешиваться в работу других, так как одна задача не может получить доступ к памяти, выделенной другой программе или самой ОС. Отчасти это делается для поддержания готовности к работе, но также из соображений безопасности: система не хочет, чтобы вредоносная или «забагованная» программа совала нос туда, куда не следует. («Синий экран смерти», некогда обычное явление в Windows, возникал из-за недостаточного обеспечения защиты.)

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

Рис. 6.1. Activity Monitor отображает загрузку процессора в macOS

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

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

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

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

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

Рис. 6.2. Использование памяти в macOS, показанное в программе Activity Monitor

Например, 6-я редакция операционной системы Unix, прародительницы многих современных систем, в 1975 году состояла из 9000 строк на ассемблерном языке и С, написанных двумя коллегами. Современная ОС Linux содержит более 10 миллионов строчек, и над ней работали тысячи людей на протяжении десятилетий. Предполагается, что в Windows 10 содержится 50 миллионов строк, но официальные данные о ее размере пока не опубликованы. Впрочем, эти числа нельзя сравнивать напрямую, поскольку современные компьютеры намного сложнее и имеют дело с более замысловатыми средами и с большим количеством устройств. Кроме того, на этапе обсуждения того, что войдет в ОС, тоже принимаются разные решения.

Поскольку ОС – просто программа, вы, в принципе, можете и сами написать «операционку». Например, история Linux началась в 1991 году, когда финн Линус Торвальдс, будучи студентом колледжа, решил с нуля создать собственную версию» Unix. Разместив первый черновик (чуть менее 10 000 строк) в интернете, он предложил людям попробовать его разработку и помочь улучшить ее. С тех пор Linux стал главной силой в индустрии ПО, его применяют как крупные компании, так и бесчисленное количество мелких игроков. Как упоминалось в предыдущей главе, Linux имеет открытый исходный код, поэтому каждый может его использовать и развивать^60. Сегодня в проекте участвуют тысячи человек, хотя костяк составляют специалисты, занятые полный рабочий день. Торвальдс по-прежнему сохраняет общий контроль, и за ним остается окончательный выбор, когда возникают споры по поводу технических решений.

Вы можете использовать на своем оборудовании ОС, отличную от той, что предусмотрена для него. Хороший пример – установка Linux на компьютерах, изначально предназначенных для Windows. Также вы можете хранить на диске несколько ОС и при каждом включении компьютера выбирать любую из них. Такая «мультизагрузка» реализуется, например, через программу Apple Boot Camp, которая позволяет работать на Mac под управлением Windows вместо macOS.

Вы даже можете запустить одну ОС под контролем другой, как виртуальную операционную систему. Программы для работы с виртуальной ОС, такие как VMware, VirtualBox и Хеп (с открытым исходным кодом), позволяют запускать одну операционную систему – скажем, Windows или Linux – в качестве гостевой операционной системы на хосте (например, macOS). Операционная система-«хозяин» перехватывает запросы, созданные «гостем», но для этого ей требуются привилегии вроде доступа к файловой системе или сети. Хост выполняет операции и затем возвращает результат гостевой ОС. Когда обе системы скомпилированы для одного оборудования, то гостевая ОС по большей части работает на полной аппаратной скорости и реагирует почти так же быстро, как если бы она одна стояла на этом компьютере.

На рис. 6.3 схематически показано, как виртуальная ОС выполняется на хосте. С точки зрения системы-«хозяина» го

Рис. 6.3. Организация виртуальной операционной системы

стевая ОС – это типичное приложение.

На рис. 6.4 показан снимок экрана моего Мас, на котором работает VirtualBox. Приложение, в свою очередь, управляет двумя гостевыми ОС: Linux (слева) и Windows 10 (справа).

На виртуальных машинах основаны облачные вычисления, к которым мы еще вернемся в главе 11. У любого поставщика облачного сервиса имеется значительное количество физических компьютеров с большим объемом памяти и высокой пропускной способностью сети – они обеспечивают вычислительную мощность для пользователей. Каждый клиент использует несколько виртуальных машин, которые поддерживаются на меньшем количестве физических устройств. Для операций такого рода идеально подходят многоядерные процессоры.

Рис. 6.4. На macOS запущены виртуальные машины Windows и Linux

Самый крупный поставщик облачных вычислений – Amazon Web Services (AWS), за ним следуют Microsoft Azure и Google Cloud Platform. AWS стала особенно успешной, ведь на ее долю приходится более половины операционной прибыли Amazon. Все они предлагают сервис, производительность которого для любого конкретного клиента может увеличиваться или уменьшаться по мере изменения нагрузки. У них есть достаточно ресурсов, чтобы позволить отдельным пользователям мгновенно наращивать или убавлять отведенную им мощность. Многие компании, включая крупного игрока Netflix, полагают, что облачные вычисления более рентабельны, чем поддержание собственных серверов, поскольку они обеспечивают экономию на масштабировании, способны адаптироваться к меняющейся нагрузке и снижают потребность во штатном персонале.

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

Здесь следует упомянуть еще одно значение слова «виртуальный». Программу, которая имитирует компьютер, настоящий или выдуманный (как наша Игрушка), часто называют виртуальной машиной (ВМ). То есть компьютер существует только в ПО – программе, симулирующей его работу так, словно он собран из реального оборудования.

Такие виртуальные машины – обычное явление. У браузеров есть ВМ для интерпретации программ на JavaScript, а возможно, и еще одна – отдельно для программ на Java. В смартфонах на Android также есть виртуальная машина для Java. Люди пользуются ВМ, потому что писать и распространять программы легче и удобнее, чем создавать и доставлять физическое оборудование.

6.2. Как работает операционная система

Процессор устроен таким образом, что, когда компьютер включается, ЦПУ запускает на выполнение несколько инструкций, хранящихся в постоянной памяти. Затем уже они считывают другие инструкции из небольшой флеш-памяти, которая содержит достаточно кода, чтобы прочитать еще больше инструкций из определенного места на диске, USB-памяти или сетевого подключения. Те, в свою очередь, прочитают еще больше инструкций, и так до тех пор, пока не будет загружено достаточно кода для выполнения полезной работы. Такой процесс начального запуска когда-то называли boot-strapping (буквально «тянуть за ушко ботинка») – по старому присловью о людях, которые сами всего добились с нуля[47], а сейчас говорят просто booting (загрузка). Детали различаются, но основная идея не меняется: хватает нескольких инструкций, чтобы обратиться к другим, которые, в свою очередь, запустят третьи и т. д.

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

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

Система реагирует на такие события, как окончание музыки, получение письма, открытие веб-страницы или нажатие клавиши. В каждом случае она делает все необходимое, часто сообщая, что с приложением произошло нечто, требующее каких-либо действий. Если я захочу перенести окошко на моем экране, ОС сообщит дисплею, куда нужно его поместить, и скажет всем приложениям, что части их окон сейчас станут видимыми, чтобы они могли их заново отобразить. Если я выхожу из приложения через File Exit (Файл Закрыть) или нажимаю на маленький × в верхнем углу окна, система уведомляет приложение, что оно вот-вот умрет, и тогда у него появляется шанс привести свои дела в порядок – например, спросить пользователя: «Хотите ли вы сохранить файл?» Затем ОС восстанавливает все ресурсы, которые использовала программа, и сообщает приложениям с открытыми окнами, что они должны их перерисовать.

6.2.1. Системные вызовы

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

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

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

6.2.2. Драйверы устройств

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

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

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

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

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

На рис. 6.5 показаны отношения между ОС, системными вызовами, драйверами и приложениями. Для операционных систем смартфонов, таких как Android или iOS, схема будет аналогичной.

Рис. 6.5. Интерфейсы операционной системы, системного вызова и драйвера устройства

6.3. Другие операционные системы

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

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

Итак, мы можем сделать общий вывод, что сейчас устройства приобретают черты обычных компьютеров общего назначения, о которых мы говорили в главе 1. В них встраивают мощный процессор, много памяти и несколько периферийных устройств (например, объективы и дисплей в камере). У них бывают сложные пользовательские интерфейсы. Часто у этих устройств есть выход в сеть, и они могут общаться с другими системами: смартфоны используют телефонные каналы и Wi-Fi, а игровые контроллеры – инфракрасное излучение и Bluetooth. Также всевозможное оборудование можно подключать через USB при нерегулярных ситуативных соединениях. «Интернет вещей» основан на том же принципе: термостаты, освещение, системы безопасности и тому подобное управляются встроенными компьютерами и подсоединяются к Всемирной паутине.

Поскольку эта тенденция продолжается, то становится все более разумно использовать стандартную ОС, нежели писать собственную. Если у вас обычная среда, то проще и дешевле применять урезанную версию Linux (надежную, адаптивную, компактную и бесплатную), чем разрабатывать свою специализированную систему или лицензировать дорогостоящий коммерческий продукт. Недостаток такого решения: вам придется опубликовать часть финального кода под лицензией, подобной GPL. Да, тогда может появиться проблема защиты интеллектуальной собственности на вашем устройстве. Но для таких компаний, как Kindle, TiVo и многих других, это препятствие оказалось преодолимым.

6.4. Файловые системы

Файловая система (ФС) – это часть ОС, которая представляет информацию на физических носителях, таких как CD и DVD и другие съемные запоминающие устройства, в виде иерархического расположения файлов и папок. ФС – отличный пример существования различий между логической организацией и физической реализацией: хотя она организует и хранит данные на различных типах устройств, ОС обеспечивает для всех них одинаковый интерфейс. Способы хранения информации в файловых системах могут иметь практические и даже юридические последствия, поэтому у нас появляется еще одна причина изучить ФС: нужно понять, почему «удаление файла» не означает, что его содержимое исчезло навсегда.

Большинство читателей, вероятно, использовали Проводник Windows или Finder в macOS, которые отображают упомянутую иерархию, начиная с самого верха (например, диск С: в Windows). Папки содержат имена других папок и файлов. Просматривая какую-нибудь папку, мы обнаруживаем в ней еще больше папок и файлов. (В системах семейства Unix обычно используется слово «каталог», а не «папка».) Папки обеспечивают организационную структуру, а в файлах размещается само содержимое документов, изображений, музыки, электронных таблиц, веб-страниц и так далее. Вся информация в компьютере хранится в файловой системе, через которую вы получаете доступ к сведениям, когда что-то ищете. ФС содержит не только ваши данные, но и исполняемые формы программ вроде Word и Chrome, библиотеки, информацию о конфигурации, драйверы устройств и файлы, которые составляют саму ОС. Их количество поражает: я с удивлением узнал, что мой скромный MacBook хранит более 900 тысяч файлов, а ПК с Windows у друга – около 800 тысяч. На рис. 6.6 показана часть иерархии из пяти уровней на моем компьютере, внизу которой находятся несколько фотографий в моем корневом каталоге.

Рис. 6.6. Иерархия файловой системы

Несмотря на свои названия, Finder («Искатель») и Проводник наиболее полезны, только если вам известно местоположение ваших файлов: вы всегда можете двигаться к ним от корня или верхней части иерархии ФС. Однако если вы не знаете, где располагается то, что нужно, возможно, вам придется задействовать инструмент поиска – например, Spotlight на macOS.

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

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

6.4.1. Файловые системы внешней памяти

ФС – отличный пример того, как на основе крайне разнообразных физических систем создать единое логическое отображение – иерархию папок и файлов. Как это работает?

Диск объемом 500 Гб содержит 500 миллиардов байт, но его ПО, скорее всего, представит это в виде 500 миллионов фрагментов или блоков по 1000 байт. (В настоящих компьютерах все величины измерялись бы степенями двойки, но сейчас я указываю десятичные числа, чтобы вы отчетливо видели все связи.) Файл объемом в 2500 байт – например, небольшое сообщение в почте – будет сохранен в трех таких блоках. Для двух он слишком велик, а вот трех достаточно.

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

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

Кроме того, запись в папке указывает, где файл хранится на диске, то есть в каком из 500 миллионов блоков содержатся его байты. Управление этими сведениями о местоположении ведется множеством различных способов. Запись папки или содержит список номеров блоков, или ссылается на блок, который сам содержит такой список, или указывает номер первого блока, а тот – второго и т. д.

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

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

Любая папка – это файл, содержащий информацию о том, где расположены папки и файлы. Поскольку сведения о содержимом и организации файлов должны быть предельно точными и непротиворечивыми, ФС оставляет за собой право контролировать и поддерживать содержимое папок. Пользователи и приложения могут изменять содержимое папки только косвенно, отправляя запросы в файловую систему.

Рис. 6.7. Организация файловой системы на жестком диске

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

Когда программа хочет получить доступ к имеющемуся файлу, ФС должна выполнить его поиск, начиная от корня иерархии, то есть просмотреть каждый компонент имени пути к файлу в соответствующей папке. Например, если нам нужен файл /Users/bwk/book/book. txt на Мас, ФС будет искать в корне файловой системы каталог Users, затем уже в нем – bwk, далее book и book. txt. В Windows имя может выглядеть как C: \My Documents\book\book. txt, но поиск будет вестись аналогично.

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

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

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

6.4.2. Удаление файлов

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

При удалении файла в Windows или macOS он переходит в Корзину или Trash («мусорное ведро»), которые выглядят просто как очередная папка, хотя и с несколько другими свойствами. Вообще говоря, так оно и есть. Когда файл удаляется, его запись в папке и полное имя (путь к нему) копируются в папку под названием Корзина или Trash, а первоначальная запись очищается. Блоки файла и все его содержимое нисколько не меняются! Восстановление файла из «мусорки» – это обратная процедура, при которой запись возвращается в исходную папку.

«Очистка корзины» больше похожа на то, что мы описывали ранее: запись в папке Корзины или Trash очищается, а блоки действительно добавляются в список свободных. Это не зависит от того, выполняется очистка явно или незаметно, за вашей спиной, когда ФС понимает, что у нее мало свободного места.

Предположим, что вы удалили весь мусор, выбрав «Очистить корзину» или Empty Trash. Эти команды очищают все записи в самой папке-корзине и перемещают блоки в список свободных, но их содержимое по-прежнему не удалено. Все байты каждого блока исходного файла остаются нетронутыми. На них не будет записываться новое содержимое, пока блок не удалят из списка свободных и не переведут в новый файл.

Из-за такой задержки та информация, которую вы считаете удаленной, все еще существует, к ней легко могут получить доступ те, кто знает, как ее найти. Любая программа, которая считывает диск через физические блоки, то есть без прохождения через систему иерархии, способна увидеть их старое содержимое. В середине 2020 года Microsoft анонсировала выпуск Windows File Recovery – бесплатного инструмента, выполняющего восстановление именно такого рода для широкого спектра файловых систем и носителей^61.

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

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

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

Несколько похожая ситуация происходит с самой записью в папке. Когда вы удаляете файл, ФС отмечает, что его запись в папке больше не указывает на действительный файл. Для этого она задает в папке бит, означающий «эта запись не используется». При таком методе возможно затем восстановить исходную информацию о файле, включая содержимое всех блоков, которые еще не перераспределены. Но сделать это получится лишь до тех пор, пока сама запись в папке еще не использована повторно. В 1980-х годах этот механизм лежал в основе коммерческой программы по восстановлению файлов для MS-DOS от Microsoft, которая отмечала свободные записи, присваивая первому символу в имени файла специальное значение. Тем самым облегчалось восстановление целого файла, если оно проводилось не слишком поздно.

Итак, содержимое файлов может храниться еще долгое время после того, как их создатель посчитал, что оно удалено. Этот факт имеет последствия для юридических процедур, таких как досудебное представление и удержание документов. Например, удивительно часто всплывают старые сообщения электронной почты, которые неким образом компрометируют или в чем-то уличают их авторов. Если записи существуют только на бумаге, есть неплохой шанс полностью уничтожить все копии, тщательно измельчив их. А вот цифровые записи можно быстро распространить, с легкостью скопировать на съемные устройства и спрятать во многих местах. Если вы поищете в интернете такие фразы, как «электронные письма преданы огласке» или «утечка электронной почты», то наверняка станете более осмотрительными в отношении и того, что отправляете другим людям, и вообще любой информации, которую передаете компьютеру^62.

6.4.3. Другие файловые системы

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

На компакт-дисках и DVD доступ к информации предоставляется так, словно на них тоже организована ФС, опять же с иерархией папок и файлов. Повсеместно распространены ФС флеш-памяти на дисках USB и SD (Secure Digital, рис. 6.8). Когда мы подключаем такой носитель к компьютеру с Windows, флешка или карта отображаются как еще один дисковый накопитель. Его можно просматривать через Проводник, а файлы читаются и записываются точно так же, как со встроенного диска. Единственное отличие в том, что пропускная способность бывает ниже, а доступ – несколько медленнее.

Рис. 6.8. Флеш-память SD-карты

Если то же самое устройство подключить к Мас, оно тоже будет отображаться как папка, которую можно открыть с помощью Finder, а файлы с него – перекидывать в разные места. Его можно подсоединить к компьютерам на Unix или Linux, и оно снова появится в файловой системе. Благодаря ПО физическое устройство отображается в различных операционных системах как ФС, с такой же абстракцией папок и файлов. Внутри, скорее всего, применяется файловая система Microsoft FAT – широко используемая, де-факто стандартная, – но точно мы не знаем, да нам этого и не нужно. Абстракция совершенна. (FAT расшифровывается как File Allocation Table, то есть «таблица распределения файлов», и тут нет никаких намеков на качество реализации[48].) Это возможно благодаря стандартизации структуры интерфейса аппаратного и программного обеспечения.

Моя первая цифровая камера хранила снимки во внутренней файловой системе. Чтобы извлечь их, мне приходилось подключать ее к компьютеру и запускать патентованную программу, чтобы извлечь их. С тех пор у каждой камеры появилась съемная карта памяти SD вроде той, что показана на рис. 6.8, и я могу загружать фотографии, переставляя ее из аппарата в компьютер. Это намного быстрее, чем раньше, и к тому же с неожиданной побочной выгодой: мне больше не нужно пользоваться ужасно неуклюжим и ненадежным ПО от производителя камеры. Знакомый и единообразный интерфейс стандартных носителей заменяет громоздкое и разнородное обеспечение, как программное, так и аппаратное. Полагаю, производитель тоже доволен тем, что ему больше не нужно предоставлять специализированное приложение для передачи файлов.

Стоит упомянуть еще одну версию реализации этой идеи – сетевую ФС, распространенную в школах и на предприятиях. С помощью ПО создается доступ к файловой системе на каком-либо другом компьютере так, словно вы работаете за этой машиной. При этом для доступа к информации мы снова используем Проводник, Finder или другие программы. При этом неважно, какая ФС на дальнем конце подключения – такая же (когда на обоих компьютера стоит Windows, например) или другая – скажем, macOS или Linux. Как и в случае с устройствами флеш-памяти, ПО скрывает различия и предоставляет единый интерфейс, поэтому все выглядит как обычная файловая система на локальном компьютере.

Сетевые ФС часто используются в качестве как резервного, так и основного хранилища файлов. Многочисленные старые экземпляры файлов могут копироваться на архивный носитель для хранения в другом месте. Это помогает защитить важные записи от разрушительных событий вроде атаки программы-вымогателя или пожара, поскольку в таком случае погибнут только копии. Некоторые дисковые системы полагаются на технологию под названием «массив независимых дисков с избыточностью», или RAID (redundant array of independent disks): данные записываются на несколько дисков с применением алгоритма исправления ошибок, что позволит восстановить информацию даже при поломке одного из дисков. Естественно, при использовании таких систем сложнее гарантировать, что информация стерта бесследно.

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

6.5. Приложения

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

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

В качестве примера элементарного приложения рассмотрим программу в Unix под названием date, которая выводит текущую дату и время:

$ date

Fri Nov 27 16:50:00 EST 2020

Программа date ведет себя одинаково во всех системах, подобных Unix, в том числе macOS, и похожим образом в Windows. Реализация date крошечная, потому что она создана на основе системного вызова (time), который предоставляет текущую дату и время во внутреннем формате, а также на библиотеках для форматирования дат (сtime) и вывода текста (printf). Ниже представлена полная реализация на языке С – посмотрите, насколько она короткая:

В системах семейства Unix есть программа под названием Is, которая составляет списки файлов и папок в каталоге. Это простой текстовый аналог Проводника Windows и Finder в macOS. Другие приложения копируют, перемещают, переименовывают файлы и т. д. (Как в Finder, так и в Проводнике аналогичные операции реализованы через графический интерфейс.) И, опять же, эти программы используют системные вызовы для получения доступа к базовой информации о содержимом папок и полагаются на библиотеки для чтения, записи, форматирования и отображения данных.

Такое приложение, как Word, гораздо объемнее любой программы для просмотра файловой системы. Очевидно, что в него потребовалось встроить некий код ФС, чтобы пользователи смогли открывать файлы, читать их содержимое и сохранять документы. В Word включены сложные алгоритмы – например, чтобы отображение непрерывно обновлялось по мере изменения текста. Приложение обладает продуманным пользовательским интерфейсом, который выводит информацию на экран и предоставляет способы настраивать размер и тип шрифта, цвет, слои и т. д. Его можно назвать основной частью программы. Word и другие большие приложения, имеющие значительную коммерческую ценность, постоянно развиваются, получая новые функции. Не знаю, насколько объемный у Word код, но не удивлюсь, если он содержит десять миллионов строк на языках С, C++ и других, особенно если в пакет включены версии для Windows, Мас, телефонов и браузеров.

Любой браузер – это пример объемного бесплатного приложения, иногда с открытым исходным кодом, которое по некоторым параметрам еще сложнее Word. Среди них Firefox, Safari, Edge, Chrome, и вы наверняка применяли хотя бы один из них, а многие люди регулярно используют несколько. В главе 10 мы более подробно поговорим о Сети и о том, как браузеры извлекают информацию, тогда как здесь я хочу сосредоточиться на принципах работы больших сложных программ.

Если посмотреть со стороны, браузер отправляет запрос веб-сервисам и получает от них данные для отображения. В чем сложность?

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

Им полагается поддерживать много разных видов контента: от статического текста до интерактивных программ, которые меняют содержимое страницы. Часть задач браузер может передать вспомогательным приложениям, как обычно и поступает со стандартными форматами – например, PDF[49] и фильмами. Но при этом он обязан предоставлять механизмы для запуска таких вспомогательных программ, для отправки и получения их данных и запросов, а также их интеграции в общее отображение.

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

Помимо того, браузер обеспечивает платформу для расширений на нескольких уровнях: плагинов вроде QuickTime, виртуальных машин JavaScript и надстроек (например, Adblock Plus и Ghostery). К тому же он должен работать на нескольких версиях различных ОС, в том числе для мобильных устройств.

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

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

На протяжении многих лет казалось, что браузер можно использовать как операционную систему и не зависеть от того, какая ОС управляет имеющимся оборудованием. Десять или двадцать лет назад идея уже звучала отлично, но на практике путь к ее реализации преграждало слишком много барьеров. Сегодня это жизнеспособная альтернатива. Многие сервисы стали доступны только через интерфейс браузера. Почта, календарь, музыка, видео, социальные сети – вот наглядные примеры, список которых будет расти. Google предлагает ОС под названием ChromeOS, которая в основном опирается на веб-сервисы. Его хромбуки – компьютеры, работающие под управлением данной ОС, – имеют ограниченный объем локального хранилища, в качестве основной памяти используют интернет и запускают только браузерные приложения вроде Google Docs. Мы еще вернемся к этой теме, когда будем говорить об облачных вычислениях в главе 11.

6.6. Уровни программного обеспечения

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

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

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

Это верно для интерфейса операционных систем Unix и Linux, которые работают на всех видах ЦПУ и обеспечивают на них выполнение одинаковых служб ОС. По сути, сама ОС стала предметом потребления: мы уже не особо обращаем внимания на тип оборудования, разве что на цену и производительность, поскольку ПО «наверху» от него не зависит. (Это очевидно в том числе потому, что я часто упоминаю системы Unix и Linux как взаимозаменяемые, так как в большинстве аспектов различия между ними несущественны.) Всё, что необходимо для переноса какого-либо программы на новый процессор, – скомпилировать ее с помощью подходящего компилятора. Конечно, чем сильнее приложение зависит от определенных свойств оборудования, тем сложнее станет эта работа, но она вполне выполнима для многих программ.

Вот пример такого процесса в крупных масштабах: компания Apple меньше чем за год (с 2005 по 2006) перевела свое ПО с процессора IBM PowerPC на Intel. В середине 2020 года Apple объявила, что планирует снова проделать эту работу, поскольку собирается теперь использовать на всех телефонах, планшетах и компьютерах процессоры ARM, а не Intel. Это еще одна демонстрация того, как программное обеспечение может существенно не зависеть от конкретной архитектуры процессора.

Это в меньшей степени относится к Windows, которая на протяжении многих лет поддерживала довольно тесную связь с архитектурой Intel, начиная с процессора Intel 8086 в 1978 году и заканчивая его последующими версиями. (Данное семейство ЦПУ часто называют «х86», поскольку названия процессоров Intel долгие годы заканчивались на 86, включая 80286, 80386 и 80486.) Сотрудничество велось настолько плотно, что Windows, работающую на Intel, иногда называли Wintel. Однако сегодня Windows также выполняется на процессорах ARM^63.

Следующий уровень над ОС – это набор библиотек, которые предоставляют основные полезные сервисы, чтобы отдельным программистам не приходилось писать их с нуля. Доступ к ним осуществляется через API. Одни библиотеки относятся к низким уровням, потому что работают с базовой функциональностью (например, обрабатывают математические функции вроде квадратного корня или логарифма, или высчитывают дату и время, как в команде date выше), тогда как другие гораздо более сложны и отвечают за криптографию, графику, сжатие и т. п. Компоненты графического пользовательского интерфейса (диалоговые окна, меню, кнопки, ячейки-флажки, полосы прокрутки, панели с вкладками и проч.) требуют объемного кода, но, как только они попадают в библиотеку, любой может ими воспользоваться, что помогает обеспечивать единообразный внешний вид. Вот почему большинство приложений Windows – или, по крайней мере, их базовые компоненты – выглядят одинаково. На устройствах Mac это проявляется даже в большей степени. Для большинства поставщиков ПО слишком трудозатратно изобретать или внедрять что-то новое, тем более что бессмысленные отличия в визуальном дизайне сбивают пользователей с толку.

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

Как же их разделять? Вот полезное, хотя и не исчерпывающее указание: к ОС относится всё, необходимое для того, чтобы одно приложение не мешало другому. Управление памятью, то есть принятие решений о том, в какой части RAM держать программу, пока она работает, – это часть ОС. Файловая система, которая определяет, где хранить информацию во внешней памяти, – тоже ключевая функция. Это же относится к контролю устройств: два приложения не должны одновременно запускать принтер или что-то выводить на дисплей безо всякой координации. Фактически и руководство процессорами – функция ОС, поскольку оно необходимо для обеспечения всех остальных свойств.

Браузер – не часть ОС, поскольку можно запустить любой браузер или даже несколько одновременно, не вмешиваясь в общие ресурсы или управление. Возможно, вы решите, что это технический нюанс, но он привел к серьезным юридическим последствиям. Антимонопольный судебный процесс Министерства юстиции США против Microsoft, тянувшийся с 1998 по 2011 год, частично касался того, является ли браузер Internet Explorer (IE) от Microsoft частью операционной системы или просто приложением. Microsoft утверждала, что верно первое, а значит, его невозможно удалить без последствий, и компания вправе требовать, чтобы покупатель использовал IE. Если же правильно второе, то получается, что Microsoft незаконно принуждает клиентов пользоваться IE, хотя в этом нет необходимости. Разумеется, суть дела гораздо сложнее, но важная его часть заключалась в споре о том, где провести эту черту. Для справки, суд решил, что браузер – это приложение, а не часть ОС. Выражаясь словами окружного судьи Томаса Джексона, «веб-браузеры и операционные системы – это отдельные продукты»64.

6.7. Краткие выводы

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

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

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

7. Учимся программировать

Не просто играйте на своем телефоне, а пишите для него программы!

Барак Обама, президент США, декабрь 2013 года^65

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

Существует целая тьма языков. Какой из них вам следует изучить в первую очередь? Если вы хотите написать программу для своего телефона, как призывал нас президент Обама, вам понадобится Java для Android или Swift для iPhone. Оба этих ЯП могут освоить новички, но они сложны для повседневного использования, да и в создании кода для смартфона много нюансов. Scratch, система визуального программирования от МТИ, очень хороша для детей, но на ней невозможно писать крупные или сложные программы.

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

Язык JavaScript включен в каждый браузер, поэтому никакое ПО скачивать не нужно. Написав программу, вы сможете использовать ее на собственных веб-страницах, чтобы показать друзьям и родственникам. Сам по себе язык простой – даже при скромном опыте работы на нем можно создавать шикарные штучки – и в то же время удивительно универсальный. Почти каждая веб-страница включает в себя что-нибудь на JavaScript, и эти строки можно изучить, просматривая ее исходный код в браузере. Правда, чтобы найти нужный пункт, вам придется полазить в паре меню: браузеры усложняют поиск, хотя этого не должно быть. С помощью JavaScript поддерживаются многие эффекты веб-страниц, включая средства Google Docs и аналогичных программ из других источников. JavaScript также служит языком для API, на таких веб-сервисах, как Twitter, Facebook[50], Amazon и так далее.

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

Программы на JavaScript обычно запускаются как часть веб-страницы, хотя все чаще их можно выполнять вне браузера. Если вы используете JavaScript с браузером в качестве хоста, необходимо немного изучить HTML (Hypertext Markup Language[51]) – язык для описания макета веб-страниц. (Мы мельком рассмотрим его в главе 10.) В общем, есть незначительные сложности, но все же стоит постараться и немного изучить JavaScript.

Другой наш язык – Python. Он отлично подходит для повседневной разработки программ в громадном диапазоне областей применения. За последние несколько лет Python стал стандартным языком для вводных занятий по программированию, а также для курсов по аналитике данных и машинному обучению. Хотя прежде вам пришлось бы работать с ним на вашем компьютере, сейчас появились веб-сайты, позволяющие запускать программы на Python как веб-сервис. Поэтому не нужно что-либо скачивать или изучать, как пользоваться интерфейсом командной строки. Если бы я преподавал курс программирования для людей, которые изучают свой первый ЯП, то выбрал бы именно Python.

Если вы разберетесь в приведенном здесь материале и немного поэкспериментируете, то сможете научиться программировать – по крайней мере, на базовом уровне, – а такой навык стоит того, чтобы им овладеть. Приобретенные вами знания в дальнейшем облегчат изучение других языков. Если вы хотите копнуть глубже или узнать еще чье-либо мнение, найдите в интернете учебные пособия по JavaScript или Python. Вы получите длинный список полезных сайтов, включая Codecademy, Khan Academy и W3Schools, которые обучают программированию полнейших новичков.

Несмотря на все вышесказанное, ничего страшного, если вы пролистаете эту главу, не обращая внимания на подробности синтаксиса. Для понимания других тем они не важны.

7.1. Принципы языков программирования

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

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

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

Большинство ЯП имеют три компонента. Первый – это сам язык: команды для компьютера, велящие ему выполнить арифметическую операцию, проверить, соблюдаются ли условия, и повторить вычисления. Второй – библиотеки кода, написанные другие людьми, которые вы можете использовать в своей программе. Это уже готовые модули, и вам не нужно их заново составлять. Типичные их примеры – математические функции, календарные расчеты, функции поиска и действий с текстом. Третий компонент – доступ к среде, в которой работает программа. Так, программа на JavaScript, запущенная в браузере, может получать входные данные от пользователя, реагировать на события (нажатие кнопки, ввод текста в форму), а также побуждать браузер отобразить иной контент или перейти на другую страницу. Любой программе на Python предоставляется доступ к файловой системе на компьютере, где она запущена, однако это запрещено программам на JavaScript, работающим в браузере.

7.2. Первая программа на JavaScript

Я начну с языка JavaScript, затем мы перейдем к Python. После изучения JavaScript вам будет легче читать раздел про Python, хотя вы можете пойти в обратном порядке. Как правило, если вы разобрались в одном языке, освоить другие становится легче: вы уже понимаете принципы работы, нужно только выучить синтаксис.

Первая программа на JavaScript максимально короткая: она просто выводит диалоговое окно со словами Hello, world («Привет, мир») при загрузке веб-страницы. Вот полная страница в HTML – с этой разметкой мы еще познакомимся, когда будем говорить о Всемирной паутине в главе 10. Сейчас мы сосредоточимся на одной строчке JavaScript, которая появляется между <script> и </ script> (выделена жирным шрифтом).

Если вы поместите эти семь строчек в текстовый файл, назовете его hello.html и загрузите в свой браузер, то увидите результсат, показанный на рис. 7.1.

Изображения взяты из Firefox, Chrome, Edge и Safari на macOS. Как видите, разные браузеры могут вести себя по-своему. Safari отобразил «закрыть», но не в виде кнопки, а вот Edge почти идентичен Chrome, потому что основан на одной из его реализаций.

Функция alert входит в библиотеку JavaScript по взаимодействию с браузером. Она открывает диалоговое окно, которое отображает текст, написанный в скобках, и ждет, когда пользователь нажмет «ОК» или «Закрыть».

Рис. 7.1. Firefox, Chrome, Edge, Safari на macOS

Кстати, когда вы пишете собственную программу на JavaScript, используйте стандартный символ двойной кавычки (на английской раскладке), который выглядит как", а не так называемые «книжные кавычки» из привычных вам текстов. Это простой пример синтаксического правила. Кроме того, создавая HTML-файлы, не применяйте текстовые редакторы вроде Word – работайте в таких приложениях, как Блокнот или TextEdit, и проверяйте, что они сохраняют файлы в виде обычного текста (то есть простого ASCII без форматирования информации), даже если у файла расширение. html.

Когда этот пример заработает, вы сможете добавить в него некоторые интересные вычисления. Далее я не буду показывать код разметки HTML – только JavaScript между <script> и </script>.

7.3. Вторая программа на JavaScript

Вторая программа на JavaScript будет запрашивать у пользователя имя и выводить персонализированное приветствие:

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

Во-вторых, программа задействует одну из библиотек JavaScript, где определена функция prompt, которая похожа на alert, но ее всплывающее диалоговое окно будет запрашивать у пользователя ввод. Любой текст, напечатанный им, будет доступен программе как значение, вычисленное функцией prompt. Оно присваивается переменной username в строчке:

username = prompt("Как вас зовут?");

Знак равенства «=» означает «выполнить операцию на правой стороне и сохранить результат в переменной, стоящей слева». Похоже на сохранение значения накопителя в памяти компьютера-игрушки. То, как здесь интерпретируется знак равенства, дает нам повод поговорить о семантике. Эта операция называется присвоением, причем «=» здесь означает не равенство, а копирование значения. Большинство языков программирования для присвоения использует знак равенства, пусть даже люди путают его с математическим равенством.

В последней инструкции, alert, используется знак плюс +:

alert("Привет, " + username);

Он соединяет слово «Привет» (а также запятую и пробел) и имя, которое ввел пользователь. Знак + тоже может

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

Когда вы запускаете программу, prompt выводит диалоговое окно, где вы можете напечатать текст, как показано на рис. 7.2 (в Firefox).

Рис. 7.2. Диалоговое окно, ожидающее ввода

Если вы введете «Джо» и нажмете ОК, то появится окно сообщения (см. рис. 7.3.)

Рис. 7.3. Появление кнопки ОК в диалоговом окне

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

7.4. Циклы и условия

На рис. 5.6 приводилась версия программы на JavaScript, которая суммирует последовательность цифр. На рис. 7.4 я повторил тот код, чтобы вам не пришлось перелистывать назад.

Рис. 7.4. Программа на JavaScript для сложения чисел

Напомню, что программа считывает числа, пока не будет введен нуль, а затем выводит сумму. Выше мы уже рассмотрели некоторые элементы языка, представленные в этом коде, – объявление, присвоение, а также функцию prompt. В первой строчке объявляются две переменные с именами num и sum, которые будут использоваться в программе. Вторая инструкция задает sum значение О, а третья присваивает num значение, которое пользователь печатает в диалоговом окне.

Затем появляется важный компонент – цикл while, в который входят строчки с 4 по 7. Компьютеры как устройства прекрасно умеют раз за разом выполнять последовательности инструкций, и проблема только в том, как выразить это повторение на ЯП. В языке для Игрушки мы ввели инструкцию GOTO, которая задает переход к другому месту в программе, а не к следующей команде по порядку, и инструкцию IFZERO, выполняющую переход, только если значение в накопителе равно нулю.

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

Такая методика почти точно соответствует IFZERO и GOTO в программе для компьютера-игрушки, описанной в главе 3. Разница только в том, что с «цикл while» нам не нужно придумывать метки, а проверяемым условием может служить любое выражение, которое определяется как истинное или ложное. В данном случае проверяется, не записан ли в переменную num символ 0. Оператор! = означает «не равно»; он унаследован от языка С, как и сама инструкция while.

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

Итак, функция prompt возвращает символы (текст), и затем проверяется, нет ли там буквенной константы О, что задается путем помещения 0 в одинарные кавычки. Без них он воспринимался бы как число.

Функция parselnt преобразует текст во внутреннюю форму, пригодную для операций целочисленной арифметики. Другими словами, эти входные данные обрабатываются как целое число (например, 123), а не как три символа, случайно оказавшиеся десятичными цифрами. Если мы не используем parselnt, то данные, возвращенные функцией prompt, будут интерпретироваться как текст, и тогда оператор + добавит их в конец предыдущего текста. Результатом стала бы конкатенация всех цифр, которые ввел пользователь, что, пожалуй, занимательно, но не совсем то, что нам нужно. В следующем примере, показанном на рис. 7.5, выполняется немного другая работа: поиск наибольшего числа из всех введенных. Это повод представить вам еще одну команду потока управления – if-else, которая встречается в той или иной форме во всех высокоуровневых языках, играя роль способа принятия решения. По сути, это универсальный вариант IFZERO. Версия if-else в JavaScript такая же, как и в С.

Оператор if-else может иметь две формы. У показанного здесь нет части else: если условие в круглых скобках истинно, то выполняются команды, заключенные в { }. И в любом случае далее прогоняются инструкции, которые идут после закрывающей фигурной скобки. Более общая форма оператора содержит элемент else для последовательности команд, которые выполняются, если условие ложное. Далее, независимо от истинности условия, прогоняется инструкция, следующая за if-else.

Возможно, вы заметили, что в программах из примеров используется отступ для выделения структуры. Так, команды, зависящие от while и if, имеют отступ. Данная практика полезна, так как она позволяет с первого взгляда увидеть, насколько широка «зона влияния» операторов вроде while и if, которые управляют другими инструкциями.

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

Рис. 7.5. Отыскание наибольшего числа из последовательности

Например, попробуйте прогнать в голове последовательности «1, 2, 0» и «2, 1, 0». Можете даже начать с последовательности «О», а затем «1, 0», дабы убедиться, что в простейших случаях все выполняется правильно. Это хорошая практика, помогающая удостовериться, что вы понимаете, как работает программа. Если вы так поступите, то убедитесь, что код дает верный результат для любой последовательности вводимых значений.

Или все-таки нет? Программа отлично работает, если вводится хотя бы одно положительное число. Но что, если все они окажутся отрицательными? Если вы попробуете указать такие значения, то программа всегда будет сообщать, что наибольшее число – это ноль.

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

Эту ошибку легко устранить. Я покажу одно решение в конце обсуждения JavaScript, но вам тоже будет полезно подумать, как все отладить.

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

7.5. Библиотеки и интерфейсы JavaScript

JavaScript играет важную роль как механизм расширения для сложных веб-приложений. Хороший пример – Google Maps. Язык предоставляет библиотеки и API, поэтому операции с картами могут задаваться программами JavaScript, а не только щелчками мыши. Таким образом, кто угодно может написать на JavaScript код для отображения информации на карте от Google. API прост в использовании: например, код на рис. 7.6 (если добавить несколько строчек HTML и ключ авторизации от Google) показывает место на карте (рис. 7.7), где, возможно, какой-нибудь читатель однажды поживет несколько лет.

Как мы увидим в главе 11, в интернете отмечается тенденция все больше использовать JavaScript, в том числе с программируемыми интерфейсами, как у Google Карт. Один из недостатков здесь – сложность защиты интеллектуальной собственности. Ведь если вы используете JavaScript, то обязаны раскрывать исходный код. Любой желающий может заглянуть в браузере в ИК страницы.

Рис. 7.6. JavaScript-код для использования Google Maps

Рис. 7.7. В такой перспективе выглядит скромно, да?

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

7.6. Как работает JavaScript

Вспомните описание компиляторов, ассемблеров и машинных команд в главе 5. Программа на JavaScript преобразуется в исполняемую форму аналогичным образом, однако подробности существенно отличаются. Когда браузер встречает код JavaScript на веб-странице (например, увидев тег <script>), он передает текст программы компилятору JavaScript. Тот проверяет ее на наличие ошибок и транслирует в инструкции на ассемблерном языке для воображаемой машины, аналогичной нашей Игрушке, но с более обширным набором инструкций, – то есть виртуальной машины, описанной в предыдущей главе. Затем она запускает симулятор, опять же подобный Игрушке, для выполнения любых действий, которые заданы в программе на JavaScript. Симулятор и браузер тесно взаимодействуют: например, когда пользователь нажимает кнопку, браузер уведомляет об этом действии моделирующую программу. Когда симулятор хочет, например, чтобы появилось диалоговое окно, он просит об этом браузер, и тот вызывает функции alert или prompt.

Это всё, что я хотел рассказать о JavaScript. Но если вам захотелось разобраться подробнее, есть хорошие книги и онлайн-руководства, где вы «на лету» научитесь редактировать код JavaScript и сразу видеть результаты^66. Программирование порой выводит из себя, но иногда приносит огромное удовольствие, и вы даже можете прилично зарабатывать им на жизнь. Программистом способен стать каждый, но вам весьма пригодятся скрупулезность и умение пристально изучать мелкие элементы, а затем снова окидывать взглядом всю картину. Также помогает небольшая одержимость правильным воплощением деталей, поскольку программы не заработают (или будут работать плохо), если вы невнимательны. Как и в большинстве других областей, здесь огромная разница между любителями и настоящими профессионалами.

Вот один из ответов на вопрос о программировании, заданный пару страниц назад:

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

7.7. Первая программа на Python

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

Если у вас локально установлен Python^67, можете запустить его из командной строки с помощью терминала в macOS или Windows. По традиции первая программа печатает «Hello, world», и взаимодействие выглядит следующим образом:

Всё, что набираете вы, отображается жирным курсивом, текст, напечатанный компьютером, – моноширинным шрифтом, а»> – приглашение ввода самого языка Python.

Если у вас не инсталлирован Python или вы хотите попробовать онлайн-альтернативу, существует множество сервисов, которые позволяют запускать его из веб-браузера. Один из самых простых – Colab от Google^68. Он обеспечивает удобный доступ к различным инструментам машинного обучения. В подробности этого мы здесь вдаваться не будем, но Colab также хорош для начала работы с Python. Если вы зайдете на веб-сайт Colab, выберете File, затем New notebook, введете программу в поле «+ Code» и, если пожелаете, текст в поле «+ Text», то перед вами должна появиться страница, показанная на рис. 7.8. На ней изображена ситуация непосредственно перед запуском первой программы: строка из текста, который объясняет, что представляет собой пример, а затем сам код.

Рис. 7.8. Colab перед запуском «Hello, world»

Чтобы скомпилировать и запустить программу, щелкните по значку треугольника (появляется при наведении). Результат показан на рис. 7.9.

Рис. 7.9. Colab после запуска Hello, world

Текстовая область используется для документации любого вида, а кода вы можете добавлять сколько захотите. В ходе разработки системы вы также вправе включить дополнительные разделы для текста и кода. Colab – это облачная версия широко используемого интерактивного инструмента Jupyter notebook^69, компьютерного аналога физической записной книжки, куда вы заносите ваши идеи, разъяснения, отчеты об экспериментах, код и данные. Все сохраняется на одной веб-странице, которую затем можно редактировать, обновлять, выполнять и делиться с другими. Более подробную информацию ищите по адресу jupyter.org.

7.8. Вторая программа на Python

Мы уже знакомы с программой, которая складывает последовательность чисел и печатает итоговую сумму, – она описана в главе 5. Версия, показанная на рис. 7.10, выводит вместе с суммой сообщение, но в остальном они идентичны. (Эта программа не будет работать, если вы просто скопируете ее и вставите в Python, потому что вызов функции input интерпретируется сразу. Вы должны создать отдельный файл, например, addup.py, и затем запустить Python из него.)

Рис. 7.10. Программа на Python для сложения чисел

Давайте добавим это в наш блокнот Colab. На рис. 7.11 показаны код и статус программы сразу после начала выполнения. Голубой прямоугольник – это поле для ввода, эквивалент диалогового окна prompt, которое мы использовали в JavaScript.

Рис. 7.11. Colab перед запуском Addup

На рис. 7.12 показан результат вычислений после того, как я напечатал числа 1, 2, 3, 4, а затем 0, который завершил цикл. Данная версия программы показывает текстовое сообщение, в котором прописывается вывод, но оно не появляется перед каждым вводом. Добавьте такую функцию сами – это простое и полезное упражнение.

Рис. 7.12. Colab после запуска Addup

В следующем примере приведена программа (рис. 7.13), которая вычисляет максимальное значение в последовательности чисел.

Рис. 7.13. Colab перед запуском Мах

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

Рис. 7.14. Colab после запуска Мах

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

7.9. Библиотеки и интерфейсы Python

Одна из самых сильных сторон Python – огромная коллекция библиотек, доступных программистам. Назовите какую угодно область применения приложений – вероятно, для нее найдется библиотека Python, которая упростит написание программы.

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

Первоначально я создал этот рисунок в Excel, но его можно легко выполнить и в Python, опять же с помощью нашего блокнота Colab.

Рис. 7.15. Расчет графика классов сложности

В коде на рис. 7.15 представлено несколько новых функциональных средств. Два оператора import используются для доступа к библиотекам кода Python – математической и построения графиков. Последняя имеет длинное имя, поэтому ей обычно присваивается короткий псевдоним pit. Значения, которые надлежит вычислить и нанести на график, сохраняются в четырех изначально пустых списках, заданных строчкой:

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

В конце цикла все списки (теперь включающие по 20 элементов) подготавливаются для построения графика путем вызова функции plot. Затем она создает рисунок и добавляет метки к его легенде. Но есть одно исключение: из списка квадратичных значений (quadratic) для построения графика берутся только первые десять элементов, ведь квадраты п увеличиваются настолько быстро, что иначе остальные линии на рисунке просто сольются. Записью [0:10] мы выбираем срез списка, содержащий первые десять элементов, которые пронумерованы от 0 до 9.

Функция legend задает легенду с метками для каждой кривой, a show генерирует график, показанный на рисунке 7.16.

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

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

Рис. 7.16. Рост log N, N, N log N и N2

Библиотеки Python также позволяют легко экспериментировать с текстовыми приложениями. На рис. 7.17 используется библиотека Python requests, с помощью которой мы получаем доступ к копии романа «Гордость и предубеждение» с сайта Gutenberg.org[52] и отображаем на экране знаменитое вступительное предложение. В начале книги есть изрядный объем стандартного текста, который нужно пропустить. Функция find находит в тексте начальную позицию отрывка, где впервые появляется заданная строка символов, и мы можем использовать ее, чтобы отыскать фрагмент от начала и до конца.

Часть программы

pandp = pandp[start:]

заменяет исходный pandp подстрокой, которая начинается с позиции start и доходит до конца строки.

Затем мы снова используем find, чтобы найти первую точку, которая находится в конце первого предложения, а затем напечатать подстроку, начинающуюся с нулевой позиции. Почему end+1? В переменной end содержится положение «.», поэтому нам нужно увеличить ее на единицу, чтобы включить саму точку.

Рис. 7.17. Доступ к интернет-данным с помощью Python[53]

В последних примерах я изложил много материала без подробных объяснений, чтобы кратко показать некоторые основные идеи. С таким большим объемом кода вам легко провести простые эксперименты. Например, вывести другие значения функции, такие как квадратный корень (sqrt) или N^3 или даже 2N. Для этого потребуется изменить диапазон данных. Или же попробуйте изучить средства matplotlib, которые способны выполнять гораздо больше действий, чем показано здесь. Можно загрузить больше отрывков «Гордости и предубеждения» или других текстов и применить к ним пакеты Python для обработки естественного языка (например, NLTK или spaCy).

По моему опыту, эксперименты с уже готовым кодом – это эффективный способ лучше разобраться в программировании. А чтобы держать все результаты ваших опытов в одном месте, хорошо подойдут «записные книжки» вроде тех, что доступны на Colab.

7.10. Как работает Python

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

Тот проверяет программу на наличие ошибок и компилирует ее в инструкции на ассемблерном языке для условной машины, аналогичной нашей Игрушке, хотя и с более богатым набором инструкций. Описание виртуальных машин приведено в главе 6. Если есть инструкции import, то также включается код из вызываемых ими библиотек. Компилятор затем запускает ВМ для выполнения всех действий, которые должна совершить программа на Python. Взаимодействуя со средой, виртуальная машина проводит такие операции, как считывание данных с клавиатуры или из интернета и вывод результатов на экран.

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

7.11. Краткие выводы

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

Следует ли вводить программирование как обязательный предмет в начальной или старшей школе? А в университетах (о чем постоянно спорят у меня на работе)?

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

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

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

Краткое заключение по программному обеспечению

В последних четырех главах мы рассмотрели солидный объем материала. Вот краткое изложение наиболее важных моментов.

Алгоритмы. Алгоритм – это последовательность точно и однозначно заданных шагов, которые выполняют конкретную задачу, после чего происходит остановка. Описание расчетов не затрагивает детали их реализации. Шаги основаны на четко определенных операциях, элементарных или примитивных. Есть множество алгоритмов, но мы рассмотрели самые основные, такие как поиск и сортировка.

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

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

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

Библиотеки. Чтобы создать программу для запуска на реальном компьютере, требуется расписать множество замысловатых мелочей даже для обычных операций. Библиотеки и связанные с ними механизмы предоставляют компоненты, которые программисты используют при создании собственных программ, благодаря чему новая работа опирается на уже готовый фундамент. В настоящее время при составлении программ в равной мере применяется как «склеивание» существующих компонентов, так и написание оригинального кода. К компонентам библиотеки могут относиться как функции (например, те, что мы видели в JavaScript и Python), так и большие системы вроде Google Maps и других веб-сервисов. Библиотеки бывают как с открытым исходным кодом (любой программист может его читать, понимать и улучшать), так и с закрытым, проприетарным. Впрочем, фактически все они созданы программистами, которые написали подробные инструкции на каком-либо ЯП, либо из упомянутых выше, либо на каком-то еще.

Интерфейсы. Прикладной программный интерфейс, или API, – это контракт между двумя сторонами: ПО, оказывающим некоторую услугу, и ПО, использующим ее. Через API библиотеки и компоненты предоставляют свои сервисы. Благодаря интерфейсам вызова ОС аппаратное обеспечение отображается более стандартно и легче поддается программированию.

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

Ошибки (баги). Компьютеры неумолимы, и программирование требует от разработчиков (неидеальных по природе своей) постоянного высокого уровня точности в работе. Неудивительно, что все крупные программы забагованы, из-за чего действуют не совсем так, как задумывалось. Одни ошибки просто доставляют неудобство, они больше похожи на недочеты в дизайне, чем на реальные дефекты. («Это не баг, а фича» – распространенная поговорка среди программистов.) Другие проявляются только в таких редких и необычных ситуациях, что их невозможно даже воспроизвести, не говоря уже об исправлении. Лишь немногие баги действительно серьезны и способны привести к тяжелым последствиям, когда под угрозой окажутся безопасность, защищенность и даже жизни людей. Сегодня подверженность воздействиям становится более серьезной проблемой для вычислительных устройств, особенно когда растет число критически важных систем, зависящих от ПО. Модель «Хочешь – бери, хочешь – нет, но без гарантии», на которой основано использование персональных компьютеров, скорее всего, будет заменена более разумными гарантиями на продукт и принципами защиты потребителей, уже действующими в мире аппаратного обеспечения.

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

Часть III

Коммуникации

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

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

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

На протяжении тысячелетий послания передавали бегуны на длинные дистанции. В 490 году до н. э. Фидиппид пробежал 26 миль (42 км) от поля битвы при Марафоне до Афин, чтобы принести весть о великом триумфе афинян над персами. К сожалению, как сказано в легенде, он только прохрипел: «Радуйтесь, мы победили» – и умер.

Геродот указывал, что примерно в то же время в Персидской империи действовала система доставки сообщений конными курьерами. Его слова в 1914 году начертали на (теперь уже бывшем) здании главного почтамта на Восьмой авеню в Нью-Йорке: «Ни снег, ни ливень, ни зной, ни даже ночная пора не могут помешать каждому всаднику проскакать во весь опор назначенный отрезок пути»[54]. Известно, что курьеры «Пони-экспресс» перевозили почту на расстояние 1900 миль (3000 км) между Сент-Джозефом, штат Миссури, и Сакраменто, штат Калифорния, и стали иконой американского Запада, хотя сама компания просуществовала менее двух лет, с апреля 1860 по октябрь 1861 года.

Сигнальные огни и костры, зеркала, флаги, барабаны, почтовые голуби и даже человеческие голоса – все это долгое время использовалось для общения на расстоянии. Например, слово stentorian[55] происходит от греческого stentor – названия человека, который выкрикивал сообщения, разносящиеся по узким долинам.

Есть ранняя механическая система, известная не так хорошо, как она того заслуживает. Это оптический телеграф, который независимо друг от друга изобрели Клод Шапп во Франции (около 1792 года) и Абрахам Эделькранц в Швеции^70. В нем применялась сигнальная система, основанная на механических затворах и рычагах, а сами устройства размещали на башнях, как показано на рис. III. 1.

Оператор получал сигналы, поступающие с соседней вышки с одной стороны, и отправлял их на следующую с другой стороны. Рычаги и затворы могли принимать только определенное количество положений, поэтому оптический телеграф представлял собой настоящее цифровое устройство. К 1830-м годам на большей части Европы и в некоторых районах США появилась разветвленная сеть таких башен. Их ставили с промежутками примерно 10 км (6 миль), а скорость передачи составляла несколько символов в минуту. Согласно одному источнику, чтобы преодолеть расстояние от Лилля до Парижа (230 км, или 140 миль), отправленному символу требовалось около 10 минут.

Рис. 111.1. Станция оптического телеграфа^71

Проблемы, с которыми сталкиваются системы связи в наше время, проявлялись еще в 1790-х годах. Требовались стандарты для отображения информации, обмена сообщениями, а также выявления и исправления ошибок. Доставлять сообщения быстро всегда было затруднительно, хотя короткие послания доходили с одного конца Франции на другой всего за пару часов. Также возникали сложности с безопасностью и конфиденциальностью. В главе 61 «Графа Монте-Кристо», опубликованного в 1844 году, Александр Дюма пишет, как главный герой подкупил телеграфиста, чтобы тот отправил в Париж поддельную депешу, и это привело к финансовому краху злодея-банкира, барона Данглара. Вот вам прекрасный пример атаки через посредника.

При эксплуатации оптического телеграфа возникала по меньшей мере одна серьезная проблема: его удавалось использовать только при хорошей видимости, но не ночью или в плохую погоду. Электрический телеграф, изобретенный Сэмюэлем Морзе в 1830-х годах, заработал в 1840-м и уничтожил оптического предшественника всего за десять лет. Вскоре главные города США соединила коммерческая телеграфная связь: в 1844 году заработала первая линия между Балтимором и Вашингтоном, а уже в 1858-м по дну океана проложили первый трансатлантический кабель. Появление электрического телеграфа породило такие же надежды, ожидания и разочарования, которые мы испытали в начале интернет-бума и краха доткомов в конце 1990-х годов. Люди наживали и теряли состояния, совершались мошенничества, оптимисты предсказывали наступление мира и взаимопонимания на всей планете, а реалисты понимали, что все это уже происходило раньше, хотя и в немного ином виде^72. Слова «Ну, теперь-то всё иначе», бывают правдивы редко, если вообще когда-либо бывают.

История гласит, что в 1876 году Александр Грейам Белл всего на несколько часов опередил Элиша Грея, когда подал в патентное ведомство США заявку, описывающую его изобретение[56] – телефон, – хотя точная последовательность событий до сих пор не установлена. Телефон развивался на протяжении следующих ста лет и совершил революцию в средствах связи, хотя не привел к миру и взаимопониманию на всей планете. Теперь люди могли напрямую разговаривать между собой, причем им не требовались какие-то особые навыки. Стандарты и соглашения между телефонными компаниями позволяли соединять практически любые два аппарата в мире.

Телефонная система процветала в течение долгого периода сравнительной стабильности. Она передавала только голос человека. В среднем разговор длился три минуты, поэтому то, что соединение устанавливалось несколько секунд, не имело большого значения. Номер телефона служил уникальным идентификатором и довольно точно определял географическое положение. Пользовательский интерфейс был безыскусным: простые черные аппараты с поворотным диском. Сейчас они почти исчезли, и память о них сохранилась только в выражениях «набрать номер» или «взять трубку». Телефоны прошлого – полная противоположность нынешним смартфонам. Вся интеллектуальная обработка происходила в сети, а пользователь мог только набрать номер, чтобы послать вызов, ответить при звонке или попросить оператора-человека о выполнении более сложных услуг. На рис. III.2 показан телефон с поворотным диском для набора номера, стандарт для таких аппаратов на протяжении многих лет.

Рис. 111.2. Телефон с дисковым номеронабирателем (фото любезно предоставлено Дмитрием Каретниковым)

В работе телефонной системы уделялось внимание двум ключевым ценностям: высокой надежности и гарантированному качеству обслуживания. В течение 50 лет, если кто-то поднимал трубку, раздавались «гудки» (еще один пережиток прошлого в речи), звонок всегда проходил, вы отчетливо слышали человека на другом конце, и так продолжалось, пока обе стороны не вешали трубку. Возможно, у меня радужное представление о телефонной системе, поскольку я более тридцати лет проработал в Лабораториях Белла, входящих в состав Американской телефонно-телеграфной компании (AT&T), и наблюдал много перемен изнутри, пусть и далеко от центра событий. С другой стороны, я определенно скучаю по почти идеальной надежности и более четкой слышимости, которые отмечались до появления сотовых телефонов^73.

Последняя четверть XX века стала периодом стремительных изменений телефонной системы в части технологий, взаимодействия с обществом и политики. Модель трафика изменилась с распространением факсимильных аппаратов в 1980-х годах.

Также стала привычной связь между компьютерами с применением модемов для преобразования битов в звук и наоборот. Как и факсимильные аппараты, они использовали звук для передачи цифровых данных через аналоговую телефонную систему. Новые технологии позволяли быстрее устанавливать соединения, отправлять больше информации (в частности, по оптоволоконным кабелям, как внутри страны, так и через океаны) и кодировать всё в цифровую форму. Еще более кардинально характер использования поменялся с появлением «мобилок», и сегодня они настолько прочно доминируют в телефонии, что многие люди отказались от проводной связи дома.

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

Сегодня телекоммуникационные компании продолжают бороться с угрозами, исходящими от новых систем связи (в первую очередь тех, которые работают через интернет), и часто сталкиваются с уменьшением прибыли и доли рынка. Одна из опасностей связана с интернет-телефонией. Отправить цифровой голос через Всемирную паутину стало просто. Сервисы вроде Skype идут еще дальше, предлагая бесплатно передавать голос и изображение между компьютерами, а также звонить через интернет на обычные телефоны по ничтожной цене – обычно гораздо более низкой, чем взимают действующие телефонные компании, особенно в случае международной связи. Зловещие предзнаменования этого появились давно, но не все их заметили. Я помню, как мой коллега в начале 1990-х сказал руководству AT&T, что стоимость междугородних звонков упадет до одного цента за минуту (тогда фирма взимала по тарифу более 10 центов), а над ним посмеялись.

Точно так же компаниям кабельного телевидения вроде Comcast[57] сейчас угрожают потоковые сервисы, предоставляемые Netflix, Amazon, Google и многими другими. Все они используют интернет, а «кабельщикам» остается только переносить чужие биты.

Естественно, действующие компании борются за сохранение своих доходов и удержание монополии, применяя технические, законодательные и политические средства. Один из способов – взимать плату с конкурентов за доступ к проводным телефонам в жилых помещениях. Другой – ограничить пропускную способность и другие параметры, чтобы помешать соперникам, которые предоставляют телефонные или другие услуги через интернет («Голосовая связь по IP-протоколу», или VoIP).

Все это относится к общей проблеме сетевого нейтралитета. Следует ли разрешать интернет-провайдерам вмешиваться, ухудшать или блокировать трафик по каким-либо причинам, кроме чисто технических, связанных с эффективным управлением сетью? Должны ли мы требовать от телефонных и кабельных компаний, чтобы они предоставляли интернет-услуги на одинаковом уровне для всех пользователей? Или они вправе относиться к сервисам иначе, чем к частным лицам? Если да, то на каком основании? Например, следует ли разрешить телефонным компаниям замедлять трафик конкурентов (скажем, фирмы Vonage, предоставляющей VoIP)? Следует ли разрешить кабельной и развлекательной корпорации, такой как Comcast, замедлять трафик для конкурирующих с ней интернет-киносервисов вроде Netflix? Должны ли мы разрешить поставщикам услуг препятствовать трафику для сайтов, которые придерживаются других политических и социальных взглядов, чем хозяева оборудования? Как обычно, есть аргументы в пользу обеих сторон.

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

С другой стороны, в интернете действуют весьма разнообразные сайты и форумы, полные дезинформации, заведомо ложных новостей, ксенофобии и сексизма, ненавистнических высказываний, теорий заговора, клеветы и прочих непотребств. Идет дискуссия (по крайней мере, в США) о том, что такое интернет-сайты вроде Twitter и Facebook[58] – просто платформы для общения, которые, соответственно, не отвечают за размещаемый на них контент, как телефонные компании нельзя судить за то, что люди скажут по телефону? Или это СМИ, подобные газетам, которые должны нести какую-то ответственность за публикации на их сайтах? Неудивительно, что позиция по данному вопросу зависит от того, на какую проблему вы закрываете глаза. Так или иначе, по большей части социальные сети не хотят, чтобы их рассматривали как СМИ.

8. Сети

Мистер Уотсон, подойдите сюда, мне нужно вас видеть.

Первое разборчивое сообщение, отправленное по телефону.

Александр Грейам Белл,

10 марта 1876 года^74

В этой главе я расскажу о сетевых технологиях, с которыми мы напрямую сталкиваемся в повседневной жизни: обычных проводных (телефоны, кабельное телевидение, Ethernet) и беспроводных, среди которых наиболее распространены Wi-Fi и смартфоны. Именно через них большинство людей подключается к интернету, о котором мы поговорим в главе 9.

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

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

Время запаздывания или задержка измеряется количеством времени, которое понадобится, чтобы через сеть прошел определенный объем информации. Длинная задержка не обязательно означает низкую пропускную способность. Если представить, что через всю страну едет грузовик с жесткими дисками, то у такого «канала» будет огромное время запаздывания, но колоссальная ПС.

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

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

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

8.1. Телефоны и модемы

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

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

Применение телефона для передачи данных имеет серьезные недостатки. Для него требуется выделенная телефонная линия, а если у вас дома есть только одна, то вам придется выбирать между подключением к интернету и голосовыми звонками. Однако для большинства людей важно то, что скорость отправки информации по телефону сильно ограниченна. Максимальное значение составляет около 56 Кбит/с (56 000 бит в секунду), или 7 Кб (килобайт) в секунду^75. Таким образом, загрузка вебстраницы размером 20 Кб займет три секунды, изображения в 400 Кб – около 60 секунд, а видеоролика или обновления какой-нибудь программы – часы или даже дни.

8.2. Кабель и DSL

Ограничение скорости передачи сигналов по аналоговой телефонной линии, составляющее 56 Кбит/с, заложено в ее конструкции – пережитке инженерных решений, принятых 60 лет назад, когда начинался переход к цифровой телефонной системе. Многим людям доступна альтернатива в форме двух других технологий, чья пропускная способность выше по крайней мере в 100 раз.

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

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

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

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

Еще одна достаточно быстрая сетевая технология для дома основана на другой системе, которая уже проведена в здание, – старом добром телефоне. Она называется Digital Subscriber Loop[59], или DSL (иногда ADSL, где А означает «асимметричный», так как пропускная способность скачивания выше, чем пропускная способность выгрузки от клиента). Она предоставляет почти такие же услуги, как в варианте с кабелем, но со значительно иной реализацией^76.

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

Еще одна приятная особенность DSL заключается в том, что это не общий носитель. Для него используется выделенный провод между вашим домом и телефонной компанией. Больше никто к нему не подключается, поэтому вам не нужно делиться пропускной способностью с соседями, а ваши биты не попадут к ним в дом. Специальная коробка в вашем доме – еще один модем, аналогичный тому, что в здании фирмы, – преобразует сигналы в формат, нужный для отправки по проводам. В остальном связь по кабелю и DSL выглядит и ощущается практически одинаково. Цены, как правило, тоже примерно одинаковы – по крайней мере, если есть конкуренция. Однако, как ни странно, объем использования DSL в США, похоже, снижается.

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

Оптоволоконные системы работают намного быстрее других сетей. Сигналы передаются как импульсы света по чрезвычайно чистому стекловолокну с низкими потерями, поэтому могут преодолевать километры, перед тем как их понадобится снова усилить до полной мощности. В начале 1990-х годов я участвовал в исследовательском эксперименте «Волокно до дома» и на протяжении десятилетия пользовался соединением в 160 Мбит/с. Это дало мне право шумно похваляться, но не более того: не существовало ни одного сервиса, который мог бы воспользоваться преимуществами такой пропускной способности.

Сегодня, по другой географической случайности, к моему дому подведено гигабитное оптоволоконное подключение (не то, что от Verizon), но эффективная скорость составляет всего 30–40 Мбит/с, потому что ее ограничивает мой беспроводной маршрутизатор. В сети моего офиса Wi-Fi выдает 80 Мбит/с для ноутбука, но Ethernet-соеди-нение для компьютера обеспечивает от 500 до 700 Мбит/с. Вы можете проверить вашу скорость подключения на таких сайтах, как speedtest.net.

8.3. Локальные сети и Ethernet

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

В начале 1970-х годов в исследовательском центре Xerox в Пало-Альто (он же Xerox PARC) разработали инновационный компьютер под названием Alto, послуживший средством проведения экспериментов, которые привели ко множеству других инноваций. В нем впервые применялась оконная система и растровый дисплей, способный отображать не только символы. Хотя Alto слишком дорого стоили для персонального компьютера в современном понимании, у каждого исследователя в PARC имелся свой экземпляр.

Существовала одна проблема: как подключить их друг к другу или к общему ресурсу вроде принтера? Решение нашлось, когда Боб Меткалф и Дэвид Боггс в 1970-х годах изобрели сетевую технологию под названием Ethernet. В сетях такого типа сигнал передавался между компьютерами, подсоединенными к одному коаксиальному кабелю, внешне похожему на тот, которым ваш дом сейчас подключен к кабельному телевидению. Сигналы представляли собой импульсы напряжения, величину или полярность которых кодировали битовые значения. В простейшей форме могло использоваться положительное напряжение для бита «1» и отрицательное – для бита «0».

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

Каждому устройству, способному подключаться к Ethernet, присваивается (Е1Ьегпе1-)адрес – 48-битный ID, отличный от номеров других компьютеров. Таким способом можно идентифицировать 2^48 (примерно 2,8 × 10^14) уникальных устройств. Вы можете узнать Ethernet-адрес вашей машины: иногда его печатают на нижней поверхности. Кроме того, он отображается такими программами, как ipconfig на Windows или if config на macOS, а также в установках системы и настройках. Адреса Ethernet всегда записываются в шестнадцатеричном формате с двумя цифрами на байт, то есть состоят из 12 шестнадцатеричных цифр (48 бит = 6 байт). Поищите последовательность вроде 00:09:6B:D0:E7:05 (с двоеточиями или без них). Кстати, именно это число вы не встретите на своем компьютере, поскольку я взял его с одного из моих ноутбуков.

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

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

Что до конфиденциальности, то изначально о ней не беспокоились, поскольку все пользователи работали на одну компанию и находились в одном маленьком здании. Но сегодня с ней крупные проблемы. Определенное ПО способно перевести интерфейс Ethernet в «неразборчивый режим», в котором оно считывает содержимое всех сообщений в сети, а не только тех, что предназначены специально для него. Это означает, что оно может искать интересный контент – например, незашифрованные пароли. Такое «вынюхивание» раньше было распространенной проблемой безопасности для сетей Ethernet в общежитиях колледжей. Решение здесь в том, чтобы шифровать пакеты при отправке по кабелю, и сегодня это по умолчанию делается для большей части трафика.

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

Информация по сети Ethernet передается пакетами. Пакет — это последовательность битов или байтов, содержащих информацию в точно определенном формате, что позволяет упаковать их для отправки и вскрыть при получении. Представьте, что пакет – это конверт (или почтовая открытка), на котором в стандартном формате написаны адрес отправителя, получателя, содержимое и прочие сведение. Это вполне удачная аналогия, а еще их можно сравнить с типовыми упаковками вроде тех, что используют транспортные компании (например, FedEx).

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

Рис. 8.1. Формат пакета Ethernet

Ethernet оказался исключительно успешной технологией. Поставлять его как коммерческий продукт начала не Xerox, а компания ЗСот, основанная Бобом Меткалфом, но, так или иначе, за прошедшие годы большое количество поставщиков продали миллиарды устройств с Ethernet. Первая версия работала на скорости 3 Мбит/с, а современные – от 100 Мбит/с до 10 Гбит/с. Как и в случае с модемами, первые устройства были громоздкими и дорогими, а нынешний интерфейс Ethernet – это один дешевый чип.

Ethernet имеет ограниченный радиус действия – всего несколько сотен метров. Оригинальный коаксиальный кабель впоследствии заменили 8-жильным со стандартным разъемом. Через него каждое устройство может подключаться к «коммутатору» или «концентратору», который транслирует входящие данные на другие подсоединенные компьютеры. В настольных компьютерах обычно есть гнездо с этим стандартным разъемом, и оно также появляется на устройствах вроде беспроводных базовых станций и кабельных модемов, имитирующих работу Ethernet. Во многих современных ноубуках этого гнезда нет, потому что они полагаются на беспроводные сети.

8.4. Беспроводные сети

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

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

Для передачи сигналов беспроводные системы (БпС) используют электромагнитное излучение. Для систем, с которыми мы сталкиваемся, здесь подразумевается волна определенной частоты, измеряемой в Гц или, чаще, в МГц и ГГц (например, 103,7 МГц для радиостанции). В процессе модуляции информационный сигнал переходит в несущую волну. Например, для передачи данных амплитудная модуляция (AM) изменяет амплитуду или силу несущей волны, а частотная модуляция (FM) изменяет частоту несущей волны в неком промежутке вокруг ее центрального значения. Сила принимаемого сигнала напрямую зависит от уровня мощности передатчика и обратно пропорциональна квадрату расстояния от передатчика до приемника. Таким образом, приемник, расположенный в два раза дальше, получит вчетверо более слабый сигнал.

Беспроводные системы работают в соответствии со строгими правилами, определяющими возможный диапазон частот для использования, или спектр, а также мощность передачи. Распределение спектра вызывает много споров, поскольку на него претендуют многие конкурирующие стороны. Руководят этим процессом правительственные службы, такие как Федеральная комиссия по связи (FCC) в Соединенных Штатах, а международные соглашения координирует Международный союз электросвязи, или МСЭ, – учреждение ООН. В США, когда становится доступной новая область спектра, чаще всего в полосах очень высоких частот, его обычно распределяют на публичных аукционах, проводимых FCC.

Стандарт беспроводной связи для компьютеров имеет запоминающееся название IEEE 802.11. Впрочем, чаще вам будет встречаться термин Wi-Fi – торговая марка отраслевой группы Wi-Fi Alliance. IEEE (Institute of Electrical and Electronics Engineers) – это Институт инженеров по электротехнике и радиоэлектронике, профессиональное сообщество, которое, помимо других видов деятельности, устанавливает стандарты для широкого диапазона электронных систем, включая беспроводные, а 802.11 – номер стандарта, который состоит из полутора десятков частей для различных скоростей и базовых технологий. Номинальная скорость доходит почти до 1 Гбит в секунду, но эти показатели явно завышены по сравнению с тем, чего можно достичь в реальных условиях.

Любое беспроводное устройство (БпУ) кодирует цифровые данные в форму, пригодную для передачи на радиоволнах. Типичная система 802.11 внешне «упакована» так, что работает как Ethernet. Зона действия, как правило, почти совпадает, только нет проводов, о которые мы рисковали бы споткнуться.

БпУ Ethernet действуют на частотах около 2,4–2,5 ГГц, 5 ГГц и выше. Когда все беспроводные устройства используют одну и ту же узкую полосу частот, то вполне возможна конкуренция. Хуже того, в том же самом перегруженном диапазоне работают другие устройства, включая некоторые радиотелефоны, медицинское оборудование и даже микроволновые печи.

Я кратко опишу три широко распространенные БпС. Первая из них – Bluetooth[60]. Кстати, названа она в честь датского короля Харальда Синезубого (ок. 935–985). Bluetooth предназначена для ситуативных подключений на малой дистанции. Она использует тот же диапазон частот (2,4 ГГц), что и беспроводная сеть 802.11. В зависимости от уровня мощности ее радиус действия составляет от 1 до 100 метров, а скорость передачи данных – от 1 до 3 Мбит/с. Bluetooth используется в пультах ДУ для телевизоров, в беспроводных микрофонах, наушниках, клавиатурах, мышках и игровых контроллерах, где критически важно низкое энергопотребление, а также в машинах, чтобы руки оставались свободными при разговоре по телефону.

Далее RFID, или радиочастотная идентификация, – это беспроводная технология с низким энергопотреблением. Она применяется в электронных дверных замках, маркировочных бирках для разных товаров, автоматических системах взимания платы, чипах для домашних животных и даже в документах, таких как паспорта. Бирка, по сути, представляет собой небольшой радиоприемник и передатчик, который транслирует свой идентификационный номер в виде потока битов. В «пассивных» бирках нет батареек, так как они получают энергию через антенну, ловящую сигнал датчика системы RFID. Когда чип подносят близко к датчику, обычно на расстояние в несколько сантиметров, он сообщает свои идентификационные данные. RFID-системы используют различные частоты, но обычно 13,56 МГц. Такие бирки позволяют незаметно отслеживать местоположение предметов и людей. Сейчас популярно устанавливать чипы домашним животным: например, такой есть у нашей кошки, поэтому, если она потеряется, ее смогут идентифицировать. Ожидаемо высказывались предложения по имплантации чипов людям, но с разными целями – как благородными, так и не очень.

Наконец, GPS – глобальная система позиционирования это важная однонаправленная БпС, обычно используемая в навигационных модулях автомобилей и смартфонов. Спутники GPS передают точное время и информацию о своем местоположении, а GPS-приемник рассчитывает собственные координаты на земле, основываясь на том, как долго шли сигналы от трех или четырех объектов на орбите. Сам он ничего обратно не передает. То, что сама GPS как-то отслеживает пользователей, – распространенное заблуждение. В «Нью-Йорк тайме» несколько лет назад написали: «Некоторые [смартфоны] используют глобальную систему позиционирования, или GPS, которая отправляет сигналы спутникам, почти точно определяющим местонахождение пользователя». Это неверно. Отслеживание на основе GPS ведется с помощью наземных систем (вроде тех же «мобилок») для передачи местоположения. Ваш сотовый телефон постоянно поддерживает связь с базовыми станциями, о чем мы поговорим позже, поэтому, если он включен, телефонная компания знает ваши точные координаты. Когда вы разрешаете определять местонахождение, эта информация становится доступна и приложениям.

8.5. Мобильные телефоны

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

Первую коммерческую систему сотовой связи разработала компания AT&T в начале 1980-х годов. Телефоны были тяжелыми и неуклюжими: в рекламе того времени изображался человек с маленьким чемоданом для батарей, стоящий рядом с автомобилем, гда располагалась антенна.

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

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

Рис. 8.2. Ячейки сотовой связи

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

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

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

Системы сотовых телефонов в разных частях мира используют различные диапазоны частот, но обычно в промежутке от 900 до 1900 Мгц. Новые стандарты, такие как 5G, работают на гораздо более высоких частотах. Каждый диапазон делится на несколько каналов, и при разговоре используется один канал для обоих направлений. Каналы тональной сигнализации общие для всех телефонов в ячейке, а в некоторых системах они также используются для отправки текстовых сообщений и данных.

У каждого мобильника есть 15-значный идентификационный номер – IMEI (International Mobile Equipment Identity[61]), по аналогии с адресом Ethernet. Когда телефон включен, он передает свой идентификатор. Ближайшая базовая станция улавливает его и проверяет с помощью локальной системы сотовой радиосвязи (ЛССР). Когда телефон перемещается, базовые станции сообщают ЛССР о его местоположении. Если кто-то позвонит владельцу мобильника, локальная система будет знать, какая БС в данный момент находится в контакте с ним.

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

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

Из-за мобильных телефонов возникают политические и социальные проблемы. Одна из них – распределение спектра. Например, в США правительство ограничивает использование выделенных частот, допуская в каждый диапазон не больше двух компаний. Соответственно, диапазон – ценный ресурс. Когда Sprint и T-Mobile[62] проводили слияние в 2020 году, среди прочего они желали более эффективно задействовать принадлежащие им спектры (отчасти раздельные).

Расположение вышек сотовой связи – еще один источник потенциальных конфликтов, ведь они не самые красивые объекты архитектуры. На рис. 8.3. показана Frankenpine («сосна Франкенштейна»), то есть вышка, неудачно замаскированная под дерево. Многие сообщества против установки подобных творений на их территории (хотя, конечно, пользоваться телефонной связью высокого качества они хотят).

Рис. 8.3. Вышка сотовой связи, замаскированная под дерево

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

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

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

Загрузка фильмов на смартфон требует большой пропускной способности (ПС). Мобильные телефоны применяются все шире, и нагрузка на существующее оборудование будет только возрастать. В США операторы связи включают в свои тарифные планы лимиты на ПС и вводят зависимость цены от фактического использования – якобы для того, чтобы приструнить «жадин», которые скачивают полнометражные фильмы, но в действительности такие ограничения действуют даже при небольшом трафике.

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

8.6. Пропускная способность

Данные текут по сети настолько быстро, насколько позволяет самый медленный ее канал. Трафик может притормаживать на многих участках, поэтому узкие места часто возникают в самих каналах и при обработке на компьютерах по пути. Скорость света – тоже ограничивающий фактор. Сигналы распространяются в вакууме со скоростью 300 миллионов метров в секунду (около 30 см в наносекунду, как часто замечала Грейс Хоппер), но не столь быстро перемещаются в электронных схемах. Поэтому для передачи сигнала из одного места в другое требуется время, даже если нет прочих задержек. Двигаясь со скоростью света в вакууме, можно добраться с западного побережья США на восточное примерно за 13 миллисекунд. Для сравнения: время такой же поездки на скорости интернета составит около 40 мс, для путешествия в Париж – около 50 мс, в Сидней – ПО мс и в Пекин – 140 мс. Эти сроки не обязательно пропорциональны реальным расстояниям.

В повседневной жизни мы сталкиваемся с разной пропускной способностью. Мой первый модем работал со скоростью ПО бит в секунду (или бит/с), которой хватало, чтобы не отставать от механической печатной машинки. Домашние беспроводные системы, действующие по стандарту 802.11, теоретически могут выдавать скорость до 600 Мбит/с, хотя на практике она будет намного ниже. Для проводной сети Ethernet этот показатель обычно составляет 1 Гбит/с. Скорость кабельного соединения между вашим домом и вашим интернет-провайдером (Internet Service Provider[63]) способна достигать нескольких сотен мегабит в секунду, если используется оптоволокно. Ваш интернет-провайдер, скорее всего, подключен к интернету по оптоволоконным линиям, которые теоретически обеспечивают скорость до 100 Гбит/с и больше.

Телефонные технологии чрезвычайно сложны, и люди постоянно развивают их, стремясь к увеличению пропускной способности. Мобильники работают в такой многоплановой среде, что трудно оценить их эффективную ПС. Большинство телефонов сегодня используют стандарт, называемый 4G, или «четвертое поколение», а индустрия переходит к следующему поколению – 5G. Телефоны 3G пока еще существуют, но, похоже, в США находятся под угрозой исчезновения: недавно мой оператор прислал сообщение, что в течение года один из моих телефонов перестанет работать.

Предполагается, что 4G обеспечивает скорость около 100 Мбит/с для движущихся сред (то есть в автомобилях и поездах) и 1 Гбит/с для находящихся в одном месте или медленно перемещающихся телефонов. Такие показатели выглядят скорее желанными, чем истинными, и дают много поводов для завышенных обещаний в рекламе. Впрочем, мой телефон 4G работает достаточно быстро, если учесть, что я пользуюсь им не очень активно: проверяю почту, ищу что-нибудь в браузере и просматриваю интерактивные карты.

Иногда встречается термин 4G LTE, где LTE означает Long-Term Evolution («долгосрочное развитие»). Это не стандарт, а своего рода поэтапный план действий на пути от 3G к 4G. Телефоны, которые находятся на какой-либо из промежуточных стадий, иногда подают как 4G LTE, желая показать, что они, по крайней мере, приближаются к 4G^79.

Системы 5G впервые начали развертывать в 2019 году. Телефоны, использующие данный стандарт, обладают большей пропускной способностью – во всяком случае, если они подключены к соответствующему оборудованию на допустимом расстоянии. Номинальная скорость варьируется от 50 Мбит/с до целых 10 Гбит/с. Смартфоны 5G задействуют до трех частотных диапазонов, из которых два нижних еще применяются в существующих телефонах 4G, поэтому пятое поколение в этих диапазонах аналогично четвертому. В 5G используются гораздо более высокие частоты для соединений на коротких расстояниях (примерно 100 метров), что и обеспечивает более высокие скорости. Также 5G позволяет применять гораздо больше устройств на какой-либо территории, что будет полезно для «интернета вещей».

8.7. Сжатие

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

Рассмотрим английский текст вроде этой книги. В английском языке буквы встречаются с разной частотой: чаще всего появляется e, за ней следуют t, a, o, i и n, примерно в таком порядке. На другом конце диапазона – наименее употребляемые буквы z, x и q. В текстовом представлении ASCII каждая буква занимает один байт, или 8 бит. Один из способов сэкономить бит – использовать только семь из них. Например, в US ASCII 8-й бит (то есть крайний левый) всегда равен нулю, таким образом, не несет никакой информации.

Мы можем пойти дальше и использовать меньше битов для представления наиболее распространенных букв и, при необходимости, больше для редких букв. Тем самым значительно уменьшится общее количество битов. Этот подход аналогичен азбуке Морзе, где часто встречающаяся буква е закодирована одной точкой, t – одним тире, а малоиспользуемая q – тире-тире-точка-тире.

Давайте конкретизируем. «Гордость и предубеждение» содержит чуть более 121 000 слов, или 680 000 байт. Наиболее распространенный символ – пробел между словами, он употребляется почти 110 000 раз. За ним следует символы e (68 600), t (45 900) и a (31 200), тогда как Z встречается только три раза, а X вообще отсутствует. Наименее распространенные строчные буквы – j (551 раз), q (627 раз) и x (839 раз). Очевидно, мы бы значительно сэкономили, используя по 2 бита для пробелов, e, t и a, даже если бы нам пришлось применить более 8 бит для кодирования X, Z и других нечастых букв. Алгоритм, называемый кодированием Хаффмана, делает это систематически. Он отыскивает вариант кодирования отдельных символов, при котором обеспечивается наилучшее возможное сжатие. Так, объем текста «Гордости и предубеждения» уменьшается на 44 %, до 390 000 байт, и в среднем для буквы требуется около 4,5 бит.

Мы добьемся большего, если будем сжимать более крупные фрагменты, чем отдельные буквы (например, целые слова или фразы), и приспосабливаться к свойствам исходного документа. У нескольких алгоритмов это хорошо получается. Так, широко используемый ZIP уменьшает размер данной книги на 64 %, до 249 000 байт. Программа в Unix под названием bzip2 сокращает ее до 175 000 байт, то есть почти до четверти от изначального объема.

Можно сжимать и изображения. Есть два распространенных формата – GIF (Graphics Interchange Format[64]) и PNG (Portable Network Graphics[65]), которые применимы к рисункам, в основном содержащим текст, линейную графику и блоки сплошных цветов. GIF поддерживает только 256 различных цветов, тогда как PNG – не менее 16 миллионов, но они оба не предназначены для фотографий.

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

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

Последний вариант чаще всего используется для материалов, которые люди будут слушать и смотреть. Рассмотрим сжатие фотографии с цифровой камеры. Человеческий глаз не способен различать близкие оттенки, поэтому нет нужды сохранять точные цвета входных данных. Подойдет меньшее количество тонов, а значит, при кодировании потребуется меньше битов. Аналогичным образом можно отбросить некоторые мелкие детали, и конечное изображение будет не таким четким, как исходное, но глаз этого не заметит. То же самое верно для градаций яркости. Алгоритм JPEG, который создает вездесущие изображения формата. jpg, использует этот принцип для сжатия обычного изображения в 10 и более раз без значительного ухудшения качества (для нашего восприятия). Большинство программ, создающих JPEG, допускают некоторый контроль над степенью сжатия: «более высокое качество» означает меньшее сжатие.

Изображение на рис. 2.2, продублированное на рис. 8.4, подходит для сжатия в формате PNG. При своем первоначальном размере около 2 дюймов (5 см) в ширину оно занимает около 10 Кб.

Версия в формате JPEG имеет размер 25 Кб, а если рассмотреть ее крупным планом, то мы заметим очевидные визуальные артефакты, которых нет в оригинале. С другой стороны, JPEG лучше подходит для сжатия фотографий^80.

Рис. 8.4. Пиксели RGB

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

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

MP3 и его преемник AAC входят в MPEG, где отвечают за обработку аудиопотока. Это алгоритмы перцепционного кодирования для сжатия звука. Среди прочего в них используются те факты, что громкие звуки маскируют более тихие и что человеческое ухо не улавливает частоты выше ≈20 кГц, к тому же восприятие ухудшается с возрастом. Кодирование обычно уменьшает объем записи на стандартном компакт-диске примерно в 10 раз.

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

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

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

На практике некоторая входная информация даже становится объемнее.

Трудно представить, но тема сжатия способна даже развлекать. Телесериал НВО «Кремниевая долина», премьера которого состоялась в 2014 году, включал в себя 53 серии в шести сезонах. В нем повествуется об изобретении нового алгоритма сжатия и о том, как его создатель пытался защитить свой стартап от более крупных компаний, захотевших украсть его идеи.

8.8. Обнаружение и исправление ошибок

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

Некоторые распространенные наборы чисел не имеют избыточности, и поэтому невозможно определить, не затесалась ли в них ошибка. Например, номера социального страхования США состоят из 9 цифр, и почти любая последовательность из 9 цифр может оказаться допустимой. (Это полезно, когда у вас спрашивает номер кто-нибудь, кому незачем его знать, – просто придумайте что-нибудь.) Но если бы в них добавили какие-то дополнительные цифры или ограничили диапазон возможных значений, ошибки удавалось бы обнаружить.

Номера кредитных карт и банкоматов состоят из 16 цифр, но не каждый набор из 16 цифр – допустимый номер карты. В них применяется алгоритм контрольной суммы, изобретенный Хансом Петером Луном из IBM в 1954 году, который обнаруживает как единичные неверные цифры, так и большинство погрешностей транспозиции, когда две цифры меняются местами. На практике такие виды ошибок встречаются чаще всего.

Алгоритм прост: начиная с крайней правой цифры, умножайте каждую последующую цифру попеременно на 1 или на 2. Если результат больше 9, вычтите 9. Сложите полученные цифры: у вас должна выйти сумма, кратная 10. Проверьте это на ваших кредитках и на номере 4417 1234 5678 9112, который отдельные банки используют в рекламе. Результат для последнего равен 9, так что это недопустимый номер карты. Но если мы изменим последнюю цифру на 3, он станет допустимым.

Номера ISBN в книгах, состоящие из 10 или 13 знаков, также имеют контрольную сумму на основе аналогичного алгоритма, что защищает их от ошибок тех же видов.

Эти алгоритмы специализированы и нацелены на десятичные числа. Код с контролем по четности — простейший вариант стандартного обнаружения ошибок, который применяется к битам. К каждой группе битов присоединяется один дополнительный бит четности, чье значение выбирается таким образом, чтобы в группе теперь насчитывалось четное количество битов «1» (например). Следовательно, если в любом отдельном бите возникнет ошибка, получатель увидит нечетное количество битов «1» и поймет, что данные повреждены. Конечно, этот метод не определяет, с каким именно битом проблема, и не работает в случае двух ошибок.

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

Рис. 8.5. Символы ASCII с дополнительными битами четности и нечетности

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

Рис. 8.6. QR-код для http://www.kernighan.com

8.9. Краткие выводы

Диапазон – важнейший ресурс для беспроводных систем, и его обычно не хватает для удовлетворения спроса. За распределяемые полосы частот конкурирует множество сторон, а традиционные игроки, такие как широковещательные и телефонные компании, сопротивляются нововведениям. Один из способов справиться с этим – использовать имеющиеся области более эффективно. В сотовых телефонах изначально применялось аналоговое кодирование, но от этих систем давно отказались в пользу цифровых, которые занимают гораздо более узкую полосу пропускания. Иногда существующий диапазон повторно пускают в дело: например, в США при переходе на цифровое телевещание в 2009 году высвободились широкие полосы, за которые поборолись другие сервисы. Наконец, можно использовать более короткие волны, но обычно на не таких дальних расстояниях, так как эффективный радиус действия уменьшается пропорционально квадрату частоты (вот и еще один пример квадратичного эффекта).

Беспроводная связь – это средство вещания, которое может прослушивать любой желающий, поэтому контролировать доступ и защищать передаваемую информацию можно только путем шифрования. Первоначальный стандарт беспроводного шифрования в сетях 802.11 (WEP, или Wired Equivalent Privacy[67]), как оказалось, имел существенные недостатки, но современные стандарты, такие как WPA (Wi-Fi Protected Access[68]), работают лучше. Кое-кто все еще использует открытые сети, то есть вообще без шифрования, и в этом случае любой находящийся рядом человек может не только прослушивать их, но и бесплатно наслаждаться услугами связи. По некоторым данным, количество открытых сетей сегодня намного меньше, чем несколько лет назад, поскольку люди стали более настороженно относиться к риску прослушивания или использования сервисов за их счет.

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

Проводные соединения всегда будут основным незримым компонентом сетей, особенно в случае высокой пропускной способности и больших расстояний. Тем не менее в будущем «лицом» этой технологии станут беспроводные сети, несмотря на ограничения их диапазона и пропускной способности.

9. Интернет

LO

Первое сообщение ARPANET, отправленное 29 октября 1969 года из Калифорнийского университета (Лос-Анджелес) в Стэнфорд.

Предполагалось переслать слово LOGIN, но система вышла из строя

Мы уже поговорили о локальных сетевых технологиях, таких как Ethernet и беспроводная связь. Но телефонная система соединяет аппараты по всему миру. Как нам сделать то же самое для компьютеров? Как мы можем увеличить масштаб, чтобы соединить разные локальные сети – допустим, все сети Ethernet в одном здании, или компьютеры в моем и ваших домах, расположенных в соседних городах, или корпоративные сети в Канаде и Европе? Как нам добиться этого, если базовые сети используют не связанные между собой технологии? Как нам устроить так, чтобы соединение элегантно расширялось по мере увеличения количества сетей, пользователей, расстояний и в условиях постоянных изменений в оборудовании и технологиях?

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

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

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

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

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

Некоторые ресурсы находятся в дефиците, и один из очевидных примеров – диапазон для беспроводной связи. К тому же нельзя, чтобы названия веб-страницам давали безо всякого порядка. Кто будет распределять такие ограниченные ресурсы и на каком основании? Кто, кому и сколько должен платить за их использование? Кто станет выносить суждения по неизбежным спорам? Какую правовую систему (или системы) применять для их разрешения? В самом деле, кто должен устанавливать правила? Возможно, правительство, фирмы, отраслевые консорциумы, условно незаинтересованные или нейтральные участники вроде Международного союза электросвязи при ООН. Главное, чтобы в итоге все согласились соблюдать нормы.

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

9.1. Обзор интернета

Перед тем как перейти к подробностям, рассмотрим общую картину. Интернет зародился в 1960-х годах в результате попыток создать сеть, которая могла бы соединять компьютеры в разных, географически отдаленных точках. Основное финансирование этих работ осуществляло Управление перспективных исследовательских проектов (ARPA) Министерства обороны США, и получившуюся в результате сеть назвали ARPANET. Первое сообщение по ней отправили 29 октября 1969 года с компьютера в Калифорнийском университете в Лос-Анджелесе на машину в Стэнфорде, расположенную на расстоянии около 350 миль (550 км). Эту дату можно считать днем рождения интернета. (Ошибку, что вызвала первоначальный сбой, упомянутый в эпиграфе, быстро исправили, и следующая попытка сработала.)

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

Сегодня интернет состоит из многих миллионов нестрого соединенных независимых сетей. Соседние компьютеры объединены через локальные сети, зачастую беспроводные Ethernet. Сети подключаются одна к другой через шлюзы или маршрутизаторы — специализированные компьютеры, которые прокладывают между сетями маршруты для пакетов информации. (В «Википедии» говорится, что шлюз – более общий вариант подобного устройства, а маршрутизатор – нечто специализированное, но эти определения не универсальны.) Шлюзы обмениваются сведениями о маршрутизации, поэтому они знают (по крайней мере, локально), что в данный момент подключено, а значит, доступно.

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

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

По интернету данные передаются в IP-пакетах (IP означает «межсетевой протокол»). Все они имеют одинаковый формат. В какой-либо конкретной сети IP-пакет, вероятно, будут пересылать в виде одного или нескольких физических пакетов. Например, объемный IP-пакет будет разделен на несколько маленьких пакетов Ethernet, потому что даже самый большой из них (около 1500 байт) гораздо меньше наиболее крупного IP-пакета (чуть больше 65 000 байт).

Любой IP-пакет передается через несколько шлюзов, и каждый них отправляет данные следующему, более близкому к месту назначения. Двигаясь в нужную точку, пакеты могут пройти через 20 шлюзов, которые принадлежат десяткам всевозможных компаний или организаций (и управляются ими) – возможно, даже в разных странах. Трафик не обязательно должен следовать по кратчайшему пути: в зависимости от удобства и затрат пакеты иногда направляют по более длинным маршрутам. Многие пакеты, отсылаемые или получаемые за пределами США, передаются по кабелям, проложенным по территории страны, чем пользуется АНБ, чтобы записывать информацию со всего мира^81.

Работу всего этого обеспечивают несколько механизмов.

Адреса. Каждому сетевому узлу (хосту-машине) нужен адрес, нечто вроде номера телефона, который уникально определяет его среди всех прочих машин в интернете. Этот идентификатор, или IP-адрес, состоит либо из 32 бит (4 байта), либо из 128 бит (16 байт). Короткие адреса предназначены для четвертой версии межсетевого протокола (IPv4), а более длинные – для шестой версии (IPv6). IPv4 использовалась на протяжении многих лет, и она по-прежнему доминирует. Но все доступные адреса IPv4 уже распределены, поэтому ускоряется переход к IPv6.

IP-адреса аналогичны адресам Ethernet. IPv4^pec обычно записывается в виде значений, полученных из его 4 байт, каждое из которых представлено в виде десятичного числа, разделенного точками. Например, 140.180.223.42 (это у нас https://www.princeton.edu/). Такая странная форма записи называется десятичной с точками, а применяют ее потому, что людям легче запомнить ее, чем десятеричное или шестнадцатеричное число, где все символы шли бы подряд. На рисунке 9.1 показан этот IP-адрес в десятичном с точками, двоичном и шестнадцатеричном виде.

Адреса IPv6 обычно записываются в виде 16 шестнадцатеричных байт с двоеточиями между каждой парой байтов – например, 2620:0:1003:100c:9227:e4ff: fee9:05ec.

Рис. 9.1. Десятичная с точками запись для адресов IPv4

Они еще менее интуитивно понятны, чем десятичные с точками, поэтому для наглядности я буду использовать IPv4. Свой IP-адрес вы можете узнать в System Preferences (системных настройках) на macOS или аналогичном приложении на Windows (или в настройках на вашем телефоне, если он подключен к Wi-Fi).

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

Имена. Сетевой узел, к которому люди пробуют подключиться напрямую, должен носить имя, удобное с человеческой точки зрения. Мало кто из нас умеет запоминать произвольные 32-битные числа, даже в десятичной с точками записи. Общепринятые форматы для имен выглядят как www. nyu. edu или ibm. com. Такие сочетания называются доменными именами. Важнейшая часть инфраструктуры интернета – служба доменных имен, или DNS (Domain Name System), которая преобразует их в IP-адреса.

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

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

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

Выше уровнем, чем IP, действует протокол управления передачей, или TCP (Transmission Control Protocol). Он задействует IP, чтобы предоставить надежный механизм пересылки последовательности байтов произвольной длины от источника к месту назначения.

Протоколы, расположенные еще выше, используют TCP для обеспечения работы сервисов, которые мы в целом воспринимаем как интернет: просмотра веб-страниц, почты, переброски файлов и так далее. Существует также множество других протоколов. Например, динамическое изменение IP-адреса выполняется протоколом динамического конфигурирования хост-машины, или DHCP (Dynamic Host Configuration Protocol). Все вместе они определяют работу интернета, и мы еще поговорим о каждом из них подробнее.

9.2. Доменные имена и адреса

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

Большую часть основных технологий интернета разработало неформальное объединение, действующее под названием «Рабочая группа проектирования Интернета» (Internet Engineering Task Force, или IETF). Она готовила инженерные расчеты и документацию с описанием того, как все должно работать. Технические спецификации уточнялись (и тогда, и сейчас) с помощью регулярных совещаний и частых публикаций, которые назывались «Запросы для обсуждения» (Requests for Comments, RFCs) В итоге они становились стандартами. Те запросы, коих насчитывается 9000, доступны в интернете. Не все они смертельно серьезны: взгляните хотя бы на RFC-1149 – «Стандарт для передачи IP-датаграмм на пернатом носителе», опубликованный 1 апреля 1990 года^82.

Другими аспектами интернета управляет ICANN (Internet Corporation for Assigned Names and Numbers[69]; icann.org), которая обеспечивает техническую координацию в сети. Она назначает имена и номера, обеспечивая их уникальность в рамках интернета. Это доменные адреса, IP-адреса и некоторые протоколы информации. ICANN также аккредитует регистраторов доменных имен, которые, в свою очередь, присваивают доменные имена частным лицам и организациям. Интернет-корпорация начинала работать как агентство Министерства торговли США, но сейчас стала независимой некоммерческой организацией. Базируется ICANN в Калифорнии, а финансируется в основном за счет сборов с регистраторов и платы за оформление доменных имен.

Неудивительно, что работа интернет-корпорации сопряжена со сложными политическими проблемами. Некоторые страны недовольны тем, что она с момента возникновения и до сих пор располагается в США. Они называют ICANN орудием правительства Соединенных Штатов, а некоторые чиновники хотели бы, чтобы она стала частью ООН или другого международного органа, что облегчило бы контроль над ней.

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

9.2.1. Система доменных имен

Система доменных имен, или DNS, обеспечивает привычную нам иерархическую схему именования, где возникают такие названия, как berkeley.edu или cnn.com. Имена. com, edu и тому подобное, а также двухбуквенные коды стран вроде. us и. са называются доменами верхнего уровня^83. Они делегируют ответственность за администрирование и присвоение последующих имен на более низкий уровень. Например, Принстонский университет несет ответственность за администрирование princeton.edu и может определять поддоменные имена в границах этого диапазона: в частности, classics. princeton.edu для факультета классических дисциплин и cs.princeton.edu для факультета информатики. Те, в свою очередь, могут определять такие доменные имена, как www. cs. princeton. edu и т. д.

Доменные имена вводят логическую структуру, но не обязательно связаны с каким-то заданным местоположением. Например, IBM работает во многих странах, однако все ее компьютеры включены в ibm.com. Одна машина может обслуживать несколько доменов, что вполне привычно для компаний, предоставляющих услуги хостинга. И наоборот, один домен может обслуживаться множеством компьютеров. Это относится к таким крупным сайтам, как Facebook[70] и Amazon.

Отсутствие географических ограничений имеет некоторые интересные последствия. Например, страна Тувалу (население 11 000 человек), расположенная на группе небольших островов в южной части Тихого океана на полпути между Гавайями и Австралией, имеет код страны. tv. Тувалу сдает права на него в аренду коммерческим организациям, которые с радостью продадут вам домен. tv. Если нужное вам имя имеет какое-то потенциальное коммерческое значение – допустим news.tv, – вам, скорее всего, придется здорово раскошелиться. А вот за kernighan. tv плата составляет менее тридцати долларов в год. Есть страны, благословленные лингвистическими случайностями, – например, Республика Молдова, чей. md наверняка понравится докторам, и Италия, посредством которой можно создавать сайты вроде play.it[71]. Обычно доменные имена ограничиваются 26 буквами английского алфавита, цифрами и дефисами, но в 2009 году ICANN одобрила некоторые международные доменные имена верхнего уровня – в частности,

как альтернативу. сп для Китая и

в дополнение к. ед для Египта.

Примерно в 2013 году ICANN начала разрешать новые домены верхнего уровня – например, online и. club. Неясно, насколько успешными они будут в долгосрочной перспективе, но некоторые вроде. info и. io пользуются популярностью. Коммерческие и правительственные домены, такие как. toyota и. parts, тоже можно купить, однако тут встает вопрос о целях ICANN: действительно ли есть нужда в подобных доменах или организация просто хочет повысить свои доходы?

9.2.2. IP-адреса

Чтобы взаимодействовать между собой, все сети и подключенные к ним хост-машины должны обладать IP-адресом. IPV4-адрес – это уникальное 32-битное число, которое в каждый момент времени может использовать только один сетевой узел во всем интернете. Адреса назначает ICANN, выдавая их в виде блоков, которые затем распределяются организациями на более низких уровнях. Например, у Принстона есть два блока, 128.112.ddd.ddd и 140.180.ddd.ddd, где каждое ddd – это десятичное число от 0 до 255. В рамках каждого из блоков можно выдать 65 536 (2^16) хостов, то есть около 131 000 в сумме.

В числах из этих блоков не скрыт никакой особый смысл, и они никак не привязаны к географическому положению. По аналогии, телефонные коды США 212 и 213 – смежные числа, но они принадлежат Нью-Йорку и Лос-Анджелесу, которые находятся в разных частях континента. Поэтому не стоит ожидать, что соседние блоки IP-адресов соответствуют компьютерам, физически размещенным вблизи друг от друга. Также по самому IP-адресу невозможно определить координаты хоста, хотя зачастую это можно установить по другой информации. Например, DNS поддерживает обратный поиск (от IP-адреса к имени) и сообщает, что 140.180.223.42 – это www.princeton.edu. Разумно предположить, что машина расположена в Принстоне, штат Нью-Джерси, хотя сервер может находиться в совершенно ином месте^84.

Иногда подробности того, кто стоит за доменным именем, можно выяснить, используя службу под названием whois, доступную в интернете по адресу lookup. icann. org, или программу командной строки whois в Unix.

Существует всего 2^32 возможных IPv4-адреса, то есть около 4,3 миллиарда. Это меньше чем по одному на каждого жителя Земли. Если учесть, что люди всё обширнее пользуются услугами связи, однажды запас точно иссякнет. В реальности ситуация даже хуже, поскольку IP-адреса выдаются блоками, которые применяются не так эффективно, как хотелось бы (разве в Принстоне сейчас работает 131 000 компьютеров?). Так или иначе, все IPV4-адреса, за некоторыми исключениями, уже распределены в большинстве частей света.

Немного облегчают положение дел методы прикрепления нескольких хостов к одному IP-адресу. Домашние беспроводные маршрутизаторы обычно применяют трансляцию сетевых адресов, или протокол NAT (Network Access Translation), при котором один внешний IP-адрес может обслуживать несколько внутренних. Если у вас действует NAT, то все ваши домашние устройства при «взгляде снаружи» будут иметь один IP-адрес. При этом ПО и аппаратное обеспечение маршрутизатора преобразует адреса в обоих направлениях. Например, в моем доме есть как минимум десяток компьютеров и других устройств, которым нужен IP-адрес. Они все обслуживаются по NAT-протоколу с одним внешним адресом.

Как только мир перейдет на IPv6, который использует 128-битные адреса, давление спадет: их насчитывается 2^128 или около 3 × 10^38, так что они закончатся нескоро.

9.2.3. Корневые серверы

Важнейшая служба DNS – преобразование имен в IP-адреса. Домены высокого уровня обрабатываются набором серверов имен корневого домена (корневых серверов), которые знают IP-адреса для них всех – например, для mit.edu. Чтобы определить IP-адрес для www.cs.mit.edu, у корневого сервера запрашивается IP-адрес для mit. edu. Этого достаточно, чтобы попасть в MIT (Массачусетский технологический институт, МТИ), где у сервера имен МТИ запрашивается cs.mit.edu, а далее мы приходим к серверу имен, который знает о www. cs. mit. edu.

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

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

Вы можете сами поставить опыты с DNS, применяя такие команды, как nslookup. Попробуйте в Unix выполнить команду:

nslookup a.root-servers.net

В принципе, мы можем представить себе, что есть лишь один корневой сервер – но тогда будет только одна точка отказа, а это плохо для таких критически важных систем. Поэтому существует тринадцать корневых серверов, разбросанных по всему миру, и примерно половина их находится в США. Большинство из них состоят из нескольких компьютеров, расположенных на большом расстоянии друг от друга. Все эти машины работают как одно целое, но применяют протокол, который направляет запросы ближайшему члену группы (то есть маршрутизирует). Поскольку в корневых серверах используются разные программные системы и неоднотипное оборудование, они менее уязвимы для ошибок и вирусов, чем любая монокультура[72]. Впрочем, иногда корневые серверы становятся мишенью скоординированных атак, и вполне возможно, что однажды при определенном стечении обстоятельств все они одновременно выйдут из строя.

9.2.4. Регистрация вашего собственного домена

Если нужное вам имя еще не занято, то оформить свой домен будет просто. ICANN аккредитовала сотни регистраторов по всему миру, так что вы можете обратиться в один из них, выбрать доменное имя, заплатить за него – и оно ваше (хотя права придется ежегодно продлевать). По названиям есть некоторые ограничения, но нет правил, запрещающих матерные слова (это легко проверить, поискав несколько из них) или переход на личности, из-за чего корпорации и общественные организации вынуждены защищать себя сами, превентивно покупая такие домены, как bigcorp-sucks.com[73]. Имена не должны содержать более 63 символов. Обычно это буквы, цифры и дефисы, хотя можно использовать знаки из Unicode. Если символы не относятся к ASCII, то стандартная кодировка, называемая Punycode, преобразует их обратно в подмножество букв, цифр и дефисов.

Для сайта вам понадобится хост[74], то есть компьютер, который хранит и обслуживает содержание, отображаемое вашим сайтом для посетителей. Также вам нужен сервер имен, чтобы отсылать IP-адрес хоста, когда кто-нибудь пробует найти IP-адрес вашего домена. Это все отдельная часть процесса, хотя регистраторы обычно предоставляют такую услугу сами или же помогают вам связаться с тем, кто может помочь.

Конкуренция сдерживает цены: так, регистрация в. сот стоит 10 или 20 долларов в качестве первого взноса, и за год берется абонентская плата в том же размере. Услуги хостинга стоят 5 или 10 долларов в месяц для обычного использования в небольших объемах, а просто «запарковать» домен со стандартной страницей вполне можно и даром. Если вы не собираетесь много всего делать на сайте или просто хотите недолго потестировать его, то некоторые услуги хостинга будут бесплатными или совсем недорогими.

Кому принадлежит доменное имя? Как разрешаются споры? Что я смогу предпринять, если кто-то еще зарегистрирует kernighan. com? Ответ на последний вопрос звучит элементарно: ничего, разве что предложу выкупить его. Что касается имен с коммерческой ценностью (например, mcdonalds.com или apple.com), то суды и ICANN со своей политикой урегулирования споров, как правило, принимают сторону более влиятельных игроков. Даже если ваша фамилия – Макдональд или Эппл, шансы отвоевать соответствующий домен у одной из этих компаний будут невелики. Или же, если вы займете имя первым, у вас возникнут проблемы с его использованием. (В 2003 году канадский старшеклассник Майк Роу создал сайт mikerowesoft. com для своего крошечного бизнеса по программированию. Это вызвало угрозу судебного иска со стороны… несколько более крупной корпорации с похожим по звучанию названием. В итоге дело уладили миром, и господин Роу выбрал другое доменное имя.)

9.3. Маршрутизация

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

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

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

Интернет-провайдеры соединяются между собой через шлюзы. Для обмена большим объемом трафика между основными операторами существуют так называемые IXP (Internet exchange Points[75]), где встречаются сетевые соединения многочисленных компаний и осуществляются физические подключения между сетями, поэтому данные из одной могут успешно передаваться в другую. При значительном трафике между такими сетями пропускаются терабиты информации в секунду. Один из самых крупных в мире провайдеров DE-CIX Frankfurt в настоящее время в среднем передает около 6 Тбит/с, а пиковые значения превышали 9 Тбит/с^85. На рис. 9.2 показан график пересылки данных за 5 лет. Обратите внимание на стабильный рост трафика, а также на значительный скачок в начале 2020 года, когда кризис из-за COVID-19 вынудил многих людей работать удаленно.

Рис. 9.2. Трафик в DE-CIX Frankfurt IXP (любезно предоставлено DE-CIX)

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

Вы можете изучить маршрутизацию с помощью программы traceroute на системах Unix (включая macOS) или tracert на Windows^86. Также существуют веб-версии подобных средств. На рис. 9.3 показан путь из Принстона к компьютеру в Сиднейском университете в Австралии (с пропусками для краткости). В каждой строке прописаны имя, IP-адрес и время на передачу и подтверждение для следующего перехода на маршруте.

Рис. 9.3. Маршрут из Принстона, штат Нью-Джерси, в Сиднейский университет, Австралия

По времени на передачу и подтверждение понятно, как извилисто сигнал путешествует по США. Затем видны два больших перехода через Тихий океан до Австралии.

Кстати, чтобы развлечься, попробуйте выяснить местоположение разных шлюзов по загадочным аббревиатурам в их названиях. Соединение между странами легко может осуществляться через шлюзы другого государства, зачастую США. Возможно, для кого-то это неожиданно и даже неприятно – всё зависит от характера трафика и того, какие страны сообщаются между собой. На карте подводных кабелей на рис. 9.4 показано, где именно оптоволокно достигает берегов США, Европы и Азии.

На изображении не приведены кабели, проложенные по суше.

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

9.4. Протоколы TCP/IP

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

Для интернета разработано множество протоколов, два из которых фундаментальны. IP – это межсетевой, или интернет-протокол, который определяет, как форматируются и передаются отдельные пакеты. TCP, протокол управления передачей, определяет, как IP-пакеты можно объединять в потоки данных и направлять к службам. Вместе эта пара протоколов называется TCP/IP.

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

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

Рис. 9.4. Карта подводных кабелей на конец 2020 года (любезно предоставлена https://www.submarinecablemap.com/)

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

UDP (User Datagram Protocol, протокол пользовательских датаграмм) – это еще один протокол того же уровня, что и TCP. Он намного проще TCP и применяется для обмена данными, при котором не требуется двусторонний поток, а только эффективная доставка пакетов с несколькими дополнительными функциями. Используется UDP в DNS, потоковом видео, IP-телефонии и некоторых онлайн-играх.

Рис. 9.5. Уровни протоколов

9.4.1. Интернет-протокол (IP)

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

«Ненадежный» означает нечто большее, чем вы могли подумать. IP – это протокол «максимально возможного качества», который не гарантирует, насколько успешно будут доставлены пакеты. Если что-то пойдет не так, вам не повезло. Пакеты теряются или повреждаются, их доставляют не по порядку, пересылают так быстро, что их не успевают обработать, или так медленно, что они становятся бесполезными. Однако на практике IP очень надежен. Правда, когда пакет сбивается с пути или повреждается, то его не пытаются восстановить. Это как когда вы опускаете открытки в почтовый ящик в каком-нибудь сомнительном месте: скорее всего, их довезут получателю, но могут помять по дороге. Иногда они вообще не приходят, а порой доставка занимает больше времени, чем вы ожидали. (Кстати, у IP есть один вид сбоя, которого нет у открыток: IP-пакет дублируется, и к получателю прибывает больше одной копии.)

Максимальный размер IP-пакетов составляет около 65 Кб. Следовательно, длинное сообщение нужно разделить на менее крупные фрагменты, которые отправляются раздельно, а на дальнем конце собираются заново. Любой IP-пакет, как и пакет Ethernet, имеет определенный формат. На рис. 9.6 показана часть формата IPv4 (формат пакетов IPv6 аналогичен, но адреса источника и места назначения имеют длину 128 бит каждый).

Рис. 9.6. Формат пакета IPv4

Одна интересная часть пакета – время жизни, или TTL (Time to Live). Это однобайтовое поле, для которого источник пакета устанавливает первоначальное значение (обычно около 40), и затем оно уменьшается на единицу каждым шлюзом при прохождении через него. Если счетчик опускается ниже нуля, то данный пакет отбрасывается, а отправителю возвращается пакет с уведомлением об ошибке. При типовом путешествии по интернету встречается от 15 до 20 шлюзов, поэтому у пакета, который совершает 255 переходов, явно возникли проблемы (вероятно, он попал в бесконечное перенаправление). Наличие TTL не устраняет такие ошибки, но благодаря ему отдельные пакеты не могут перемещаться вечно.

Сам IP-протокол не дает никаких гарантий относительно того, как быстро придут данные. Будучи услугой «максимально возможного качества», он даже не обещает, что информация вообще поступит, не говоря уже о том, в какие сроки. Чтобы как-то ускорить процесс, в интернете широко применяют кэширование (мы уже видели это, когда обсуждали серверы имен). Веб-браузеры также кэшируют информацию, поэтому, если вы попробуете открыть страницу или изображение, которые недавно просматривали, то, возможно, программа извлечет данные из локального кэша, а не из сети. Основные интернет-серверы тоже используют кэширование, чтобы быстрее реагировать на вызовы. Такие фирмы, как Akamai[76], предоставляют другим компаниям (например, Yahoo) услуги распространения контента, что сводится к кэшированию контента ближе к получателям. Поисковые системы тоже поддерживают объемные кэши для страниц, которые они нашли во время сканирования интернета, но данную тему мы обсудим в главе 11.

9.4.2. Протокол управления передачей (TCP)

Протоколы более высокого уровня словно бы выплетают надежную связь из ненадежной подложки IP. Самый важный из них – TCP, или протокол управления передачей. Он обеспечивает для своих пользователей стабильный двусторонний поток: введите данные на одном конце, и они выйдут на другом, причем с незначительной задержкой и низкой вероятностью ошибок. Может показаться, что точки отправки и получения связаны прямым проводом.

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

Рис. 9.7. Формат заголовка сегмента TCP

Для каждого сегмента от получателя должно прийти подтверждение (или положительное, или отрицательное). То есть для любого сегмента, который я вам отправил, вам нужно прислать подтверждение о получении. Если оно не прибудет ко мне после солидного промежутка времени, мне следует предположить, что сегмент потерян, и я вышлю его еще раз. Аналогично, если вы ожидаете конкретный сегмент, но не получили его, то вам нужно отправить мне отрицательное подтверждение («сегмент 27 не прибыл»). Тогда я сразу пойму, что его нужно отослать заново.

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

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

Когда между двумя хост-машинами устанавливается TCP-соединение, оно создается не между компьютерами как таковыми, а между определенными портами на них. Каждый порт соответствует отдельному сеансу связи. Порт представлен двухбайтовым (16 бит) номером, то есть существует 65 536 возможных портов, и в принципе хост мог бы выполнять одновременно 65 536 отдельных сеансов связи TCP. Можно провести аналогию с компанией, у которой есть один телефонный номер, а у ее сотрудников – разные добавочные.

Около сотни «хорошо известных» портов зарезервированы для подключения к стандартным службам. Например, веб-серверы используют порт 80, а почтовые серверы – порт 25. Если браузер хочет получить доступ к www.yahoo.com, он установит TCP-соединение с портом 80 на стороне Yahoo, а почтовая программа задействует порт 25 для доступа к почтовому серверу Yahoo. Порты источника и назначения указываются в заголовке TCP, который сопровождает данные.

Есть еще много подробностей, но основные концепции не сложнее тех, что описаны выше. Изначально TCP и IP разработали в 1973-м Винтон Серф и Роберт Кан, удостоившиеся за это премии Тьюринга 2004 года. Хотя протоколы TCP/IP совершенствовались со временем, по существу они не изменились, пусть даже размеры сети и скорости передачи данных выросли на множество порядков. Первоначальная конфигурация оказалась на удивление хорошо продуманной, и сегодня TCP/IP отвечают за большую часть трафика в интернете.

9.5. Протоколы более высокого уровня

TCP обеспечивает надежный двусторонний поток, по которому передаются данные между двумя компьютерами. Службы интернета и приложения используют TCP как транспортный механизм, но у них есть и свои специфичные протоколы для конкретных задач. Например, HTTP (Hypertext Transfer Protocol[77]) – это особенно простой протокол, который применяется браузерами и серверами. Когда я кликаю на какую-нибудь ссылку, мой браузер открывает TCP/IP-соединение с портом 80 на сервере (скажем, amazon.com) и отправляет короткое сообщение, которое запрашивает конкретную страницу. На рис. 9.8 браузер – это клиентское приложение в левом верхнем углу. Сообщение проходит по цепочке протоколов, пересекает интернет (обычно с большим количеством шагов), а затем направляется к соответствующему серверному приложению на дальнем конце.

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

9.5.1. Telnet и SSH: удаленный вход в систему

Учитывая, что интернет – носитель информации, как нам его задействовать? Давайте рассмотрим пару самых ранних приложений TCP/IP, которые применялись еще на заре интернета. Они датируются началом 1970-х, но их по-прежнему используют, отдавая должное их дизайну и полезности.

Рис. 9.8. Соединения TCP/IP и поток информации

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

Вы можете обратиться к Amazon, используя Telnet – службу TCP для установления сеанса удаленного входа в систему на другой машине. Обычно Telnet использует порт 23, но его можно нацелить и на другие. Напечатайте в окне командной строки следующее[78]:

$ telnet www.amazon.com 80

GET ⁄ HTTP/1. О

[введите здесь дополнительную пустую строку]

и в ответ придет более 225 000 символов, которые браузер применил бы для того, чтобы отобразить веб-страницу.

GET – это один из нескольких HTTP-запросов, «/» указывает серверу, что нужно выслать файл по умолчанию, a HTTP/1. О – имя и версия протокола. В следующей главе мы подробнее поговорим об HTTP и Всемирной паутине.

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

В качестве еще одного примера рассмотрим, как использовать эту службу для поиска:

$ telnet www.google.com 80

GET /search?q=что_угодно

[введите здесь дополнительную пустую строку]

В результате мы получим ПО ООО байт выходных данных, в основном JavaScript и изображения. Но если внимательно присмотреться, среди них можно увидеть результаты поиска.

Telnet не обеспечивает никакой безопасности. Если удаленная система принимает логины без пароля, то она ничего не запрашивает. Если для подключения требуется пароль клиента, Telnet отправляет его в явном виде, открытом для любого, кто просматривает поток данных. В том числе из-за полного отсутствия безопасности Telnet в настоящее время применяется редко, за исключением особых обстоятельств, когда защита данных не так важна. Сейчас широко используется его потомок – SSH (Secure Shell, протокол безопасной оболочки), который зашифровывает весь трафик в обоих направлениях. Следовательно, обеспечивается безопасный обмен информацией. Протокол SSH задействует порт 22.

9.5.2. SMTP: простой протокол передачи почты

Второй протокол – SMTP (Simple Mail Transfer Protocol), или простой протокол передачи почты^87.

Обычно мы отправляем и получаем почту с помощью браузера или отдельного приложения. Но, как часто бывает в случае интернета, под такой поверхностью скрываются еще несколько уровней, каждый из которых поддерживается программами и протоколами. Работу почты обеспечивают два основных вида последних. Так, SMTP используется для обмена письмами с другой системой. Он устанавливает TCP/IP-соединение с портом 25 на почтовом компьютере получателя и использует свои параметры для идентификации адресата и отправителя, для пересылки сообщения. SMTP основан на тексте – если хотите посмотреть, как он работает, запустите его через Telnet на порту 25. Правда, из-за ограничений безопасности вы можете столкнуться с проблемами, даже если задействуете его на своем компьютере^88.

Рис. 9.9. Отправка почты с помощью SMTP[79]

На рис. 9.9 показан пример диалога (отредактированный для компактности) из реального сеанса работы с локальной системой, когда я отправлял себе почту как будто от другого имени (по сути, спамил). Мой ввод набран в таком формате.

Это абсурдное (во всяком случае, маловероятное) послание должным образом пришло мне на почту, как показано на рис. 9.10.

SMTP требует, чтобы почтовые сообщения состояли только из текста в формате ASCII, поэтому также применяется стандарт MIME (Multipurpose Internet Mail Extensions[80], фактически другой протокол). В нем описывается, как преобразовать в текст другие виды данных и как объединить несколько фрагментов в одно послание. Этот механизм используется для прикрепления почтовых вложений (фотографий, видео). Также он задействуется в HTTP.

Рис. 9.10. Письмо пришло в Gmail!

Хотя SMTP – сквозной протокол, TCP/IP-пакеты по пути от источника к месту назначения проходят через 15–20 шлюзов. Любой шлюз на маршруте вполне способен проверить пакеты и сделать копии для неторопливого просмотра. Копии содержимого может создавать и сам SMTP, а содержимое и заголовки отслеживаются почтовыми системами. Поэтому, чтобы сохранить конфиденциальность материалов, их нужно зашифровать в источнике.

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

SMTP только передает письмо от отправителя к получателю – к самому доступу к почте он не имеет никакого отношения. Прибыв на нужный компьютер, сообщение обычно ждет, когда его извлечет адресат. Как правило, здесь применяется уже протокол под названием IMAP (Internet Message Access Protocol[81]).

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

Почта нередко обрабатывается «в облаке» такими системами, как Gmail или Outlook. На скрытом уровне они применяют SMTP для передачи данных, а сами выступают как IMAP для клиентского доступа. Про облачные вычисления я расскажу в главе 11.

9.5.3. Обмен файлами и одноранговые протоколы

В июне 1999 года Шон Фэннинг, первокурсник Северо-Восточного университета[82], выпустил программу Napster, которая чрезвычайно упростила людям обмен музыкой, сжатой в формате MP3. Фэннинг выбрал идеальный момент. Тогда повсеместно пользовались аудиодисками с поп-музыкой, но они дорого стоили. При этом персональным компьютерам уже хватало скорости, чтобы кодировать и декодировать MP3, а алгоритмы стали широко доступными. Как оказалось, и пропускная способность достаточно высока, чтобы сравнительно быстро передавать по сети песни в формате MP3, особенно в случае студентов с Ethernet в общежитиях. Фэннинг хорошо поработал над идеей и реализацией, поэтому Napster разошлась стремительно, как лесной пожар. В середине 1999 года появилась компания, предоставляющая эту услуги. Как утверждала сама фирма, на пике развития у нее насчитывалось 80 миллионов клиентов. Позже в том же году появились первые иски с заявлениями о крупномасштабной краже музыки, защищенной авторским правом, и решение суда вывело Napster из бизнеса к середине 2001-го. Компания, набравшая с нуля 80 миллионов потребителей, а всего через пару лет превратившаяся в ничто, стала яркой иллюстрацией к популярной в ту пору фразе «эпоха интернета».

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

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

Мы привыкли к модели «клиент – сервер», когда браузер (клиент) запрашивает что-то с веб-сайта (сервера). В Napster реализовывалась иная модель. Программа создавала центральный каталог, где перечислялась музыка, доступная для обмена, но сами файлы хранилась только на машинах пользователей. Во время «встречи» композиции переходили напрямую от одного клиента Napster к другому, а не через центральную систему. Следовательно, такую организацию назвали одноранговой (peer-to-peer, или P2P), то есть все участники находились в равном положении. Компания надеялись обойти вопрос авторских прав, поскольку сами файлы лежали только на компьютерах участников и даже не передавались через центральный сервер, но эта юридическая тонкость не убедила суд.

Протокол Napster использовал TCP/IP, то есть фактически действовал на том же уровне, что HTTP и SMTP. При всем уважении к труду Фэннинга (он отлично постарался), Napster – это простая система, опиравшаяся на уже созданную инфраструктуру интернета, TCP/IP, MP3 и инструменты разработки графического пользовательского интерфейса.

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

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

9.6. Авторское право в интернете

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

Если брать индустрию развлечений, то отраслевые группы вроде RIAA[83] и МРАА[84] неустанно пытаются помешать распространению материалов, защищенных авторским правом. Они подавали иски и угрожали судебным разбирательством множеству предполагаемых нарушителей, а также активно лоббировали постановления, объявляющие действия таких субъектов незаконными. Скорее всего, пиратство никуда не денется, однако похоже, что компании способны значительно снизить его влияние, когда взимают разумную плату за гарантированное качество. И при этом они все равно получают прибыль. В качестве примера можно привести музыкальный магазин iTunes от Apple, а также потоковые сервисы Netflix и Spotify.

В США основной нормативной базой для таких вопросов служит DMCA (Digital Millennium Copyright Act[85]), принятый в 1998 году. Он объявляет нелегальными методы обхода защиты авторских прав на цифровых носителях, включая распространение таких материалов в интернете. В других странах приняты аналогичные законы. DMCA – это юридический механизм, с помощью которого индустрия развлечений преследует нарушителей авторских прав.

Данный закон создает «безопасную гавань» для поставщиков интернет-услуг. Например, когда обладатель авторских прав уведомит провайдера о том, что его пользователь распространяет защищенные материалы, сам поставщик не понесет ответственности, если потребует от нарушителя удалить соответствующие файлы. Такая безопасная гавань важна для учебных заведений, поскольку они выполняют функцию интернет-провайдеров для своих студентов и преподавателей. Так, в каждом университете есть сотрудник, который разбирается с обвинениями в нарушениях. На рис. 9.11 показано уведомление DMCA для Принстона.

Чтобы сообщить о нарушениях авторских прав, касающихся информационных технологических ресурсов или услуг Принстонского университета, пожалуйста, свяжитесь с […], сотрудником, назначенным в соответствии с «Законом об авторском праве в цифровую эпоху» (П. З.[86] № 105–304) для обработки уведомлений о предполагаемых нарушениях авторских прав на сайтах Принстонского университета.

Рис. 9.11. Информация об уведомлении согласно закону об авторских правах с веб-страницы

Этот закон также применяется (обеими сторонами) и в судебных спорах между оппонентами с более равными возможностями. В 2007 году Viacom, крупная кино- и телекомпания, потребовала у Google компенсацию размером в 1 миллиард долларов за то, что кто-то выложил на его сервисе YouTube материалы, защищенные авторским правом. Истец заявил, что DMCA создавался не для прикрытия подобных массовых краж интеллектуальной собственности. Защита Google отчасти основывалась на том, что корпорация выполняла все уведомления об удалении, предъявленные должным образом, но Viacom их не представляла. В июне 2010 года решение вынесли в пользу Google, последовала апелляция, вердикт частично отменили, затем другой судья опять оправдал Google – снова на том основании, что YouTube должным образом соблюдал процедуры DMCA. Стороны договорились в 2014 году, но, к сожалению, не обнародовали условия соглашения.

В 2004 году Google начал проект по сканированию большого количества книг, хранящихся в основном в научно-технических библиотеках. В 2005 году на корпорацию подала в суд Гильдия авторов, утверждавшая, что Google извлекает выгоду, нарушая их права. Дело тянулось очень долго, но в решении, вынесенном в 2013 году, говорилось, что Google невиновен, поскольку сохраняет книги, которые иначе могли бы быть утеряны, и делает их доступными в цифровом виде для ученых, а впоследствии это даже способно принести доход писателям и издателям. Апелляционный суд подтвердил это решение в конце 2015 года, частично основываясь на том факте, что Google выкладывал в интернет только отрывки произведений. Гильдия авторов обратилась в Верховный суд, который в 2016 году отказался рассматривать дело, тем самым фактически прекратив тяжбу.

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

Подавать жалобы в соответствии с законом об авторских правах легко. Когда я отправил в Scribd[87] уведомление о нелегально загруженном тексте первого издания этой книги, ее убрали в течение 24 часов. К сожалению, основную часть пиратских копий большинства книг удалить практически невозможно.

Закон об авторских правах иногда используется в конкурентной борьбе, что, надо полагать, не входило в его первоначальные цели. Например, Philips производит «умные» лампочки с сетевым подключением, что позволяет контроллерам регулировать их яркость и цвет. В конце 2015 года компания объявила, что модифицирует прошивку таким образом, чтобы с контроллерами ее торговой марки получалось использовать только ее же источники света. Закон об авторских правах не позволил бы никому иному провести инженерный анализ ПО и затем выпустить патчи для лампочек от других производителей. Начались довольно шумные возражения, и Philips отказался от своей идеи, но другие компании по-прежнему опираются на DMCA для ограничения конкуренции (например, в области сменных картриджей для принтеров и кофемашин^89).

9.7. Интернет вещей

Смартфоны – это просто компьютеры, способные использовать стандартную телефонную систему. Также все современные мобильники могут подключаться к интернету – либо через оператора беспроводной связи, либо через Wi-Fi, если есть возможность. Такая доступность стирает различия между телефонной сетью и интернетом, и похоже, что в итоге они совсем исчезнут.

Те же факторы, которые сделали мобильные телефоны таким повсеместным атрибутом нашей реальности, сегодня работают и на другие цифровые устройства. Как я уже говорил, во многие гаджеты и аппараты встроены мощные процессоры, память, часто беспроводное сетевое соединение. Естественно, возникает желание подключить все такие устройства к интернету, к тому же это просто, ведь все необходимые механизмы уже есть, а дополнительных затрат почти не будет. Наши камеры уже загружают фотографии через Wi-Fi или Bluetooth. Машины скачивают развлекательные программы одновременно с тем, как выгружают свои координаты и телеметрию двигателя. Термостаты измеряют условия окружающей среды, контролируют ее и отчитываются хозяину, находящемуся вне дома. Видеомониторы наблюдают за детьми, нянями и теми, кто звонит нам в дверь. У нас есть системы с речевым ответом вроде Alexa[88] и упомянутые выше сетевые лампочки. И все эти технологии основаны на подключении к интернету. Данную концепцию сейчас модно называть интернетом вещей, или IoT (Internet of Things).

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

Вот один случайный пример из богатой подборки: в январе 2016 года один веб-сайт позволил своим пользователям искать веб-камеры, которые передают видео вообще без какой-либо защиты. Сайт предлагает изображения «плантаций марихуаны, служебных помещений в банках, детских комнат, кухонь, гостиных, гаражей, палисадников, задних дворов, лыжных трасс, плавательных бассейнов, колледжей и школ, лабораторий и камер над кассовыми аппаратами в магазинах». Естественно, так люди могут не только утолить жажду к подглядыванию, но и устроить нечто куда более скверное^91.

Некоторые детские игрушки подключены к интернету, и это создает другой набор потенциальных опасностей. Одно исследование показало, что в нескольких таких предметах содержались аналитический код, пригодный для отслеживания координат детей, и ненадежные механизмы, позволяющие использовать игрушку как средство для других атак. (Среди предметов упоминалась бутылка с водой, подключенная к интернету – очевидно, для контроля того, как ребенок восполняет потери жидкости.) Потенциальное отслеживание нарушает и СОРРА[89], и заявленную продавцами игрушек политику конфиденциальности^92.

Потребительские продукты – в частности, упомянутые выше веб-камеры, – зачастую уязвимы, потому что производители не обеспечили должной безопасности. Возможно, кто-то посчитал, что возиться с ней слишком дорого или она окажется слишком сложной для покупателя. Наконец, защиту могли просто плохо реализовать. Например, в конце 2019 года хакер опубликовал IP-адреса и пароли Telnet для полумиллиона устройств интернета вещей. Он нашел их, рассылая запросы на подключение к порту 22, а затем попробовал войти, указывая учетные записи по умолчанию и пароли вроде admin и guest, и у него получилось^93.

Инфраструктурные системы для электроснабжения, связи, транспорта и многих других вещей раньше подсоединяли к интернету, не уделяя особого внимания их безопасности. Так, в декабре 2015 года сообщалось, что ветровые турбины определенного производителя имеют административный интерфейс с подключением к интернету, который можно атаковать тривиальными способами (просто подправить URL), чтобы отключить выработку энергии^94.

9.8. Краткие выводы

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

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

В интернете каждому подключенному в данный момент хосту присваивается уникальный IP-адрес, причем хостам в одной сети назначается общий префикс IP-адреса. Мобильным хостам, таким как ноутбуки и телефоны, обычно задаются разные IP-адреса при каждом подключении. Кроме того, адрес может меняться при перемещении хоста. Существует система доменных имен (DNS) – большая распределенная база данных, которая преобразует имена в IP-адреса и наоборот.

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

Интернет живет и дышит протоколами и стандартами. IP – это типовой механизм, всеобщий язык для обмена информацией. Хотя формируются IP-пакеты конкретными аппаратными технологиями, такими как Ethernet и беспроводные системы, детали того, как работает та или иная единица оборудования (и вовлечена ли она в процесс вообще), невидимы на уровне IP. Далее, TCP использует IP для создания надежного потока, подключенного к определенному порту на хосте. Протоколы более высокого уровня используют TCP/IP для создания служб.

Все протоколы делят единую систему на ярусы. Каждый из них пользуется службой, которую предоставляет слой, лежащий ниже, а сам, в свою очередь, обеспечивает функционирование служб для уровня, находящегося сразу над ним. Ни один ярус не пытается выполнить всю работу сам. По сути, интернет держится на таком наслоении протоколов: оно позволяет организовать и контролировать сложность, одновременно скрывая ненужные детали реализации. Каждый уровень делает ровно то, что он умеет: аппаратное обеспечение пересылает байты с одного компьютера в сети на другой, IP переносит отдельные пакеты через интернет, TCP синтезирует из IP надежный поток, а прикладные протоколы отправляют по нему данные туда и обратно. Кстати, программные интерфейсы, представленные на любом слое, – отличные примеры API, о которых мы говорили в главе 5.

У этих протоколов есть общая черта: они перемещают информацию между компьютерными программами, используя интернет как «безмозглую» (или «немую») сеть, которая эффективно копирует байты с одного компьютера на другой, но не пробует их интерпретировать или обработать. Для интернета важно такое свойство, ведь «немой» он в том смысле, что просто молча передает данные. Менее уничижительно эта характеристика обозначается как принцип «от и до». Интеллектуальная обработка ведется в начальных и конечных точках – в программах, которые отправляют и получают данные. В телефонии дела обстояли противоположным образом: вся обработка производилась в сети, а конечные точки (например, старомодные телефоны) были действительно «безмозглыми» – они обеспечивали разве что подключение к сети и ретрансляцию голоса.

Модель «безмозглой сети» оказалась крайне продуктивной. Любой человек, у которого возникнет хорошая идея, может сам создать «умную» конечную точку, а интернет использовать только для переноса байтов. Для сравнения: не стоило бы ждать, что телефонная или кабельная компания внедрит или станет поддерживать его блестящий замысел. Как несложно догадаться, эти операторы желали бы иметь более обширный контроль, особенно в сфере мобильной связи, где большинство инноваций приходят извне. Смартфоны вроде iPhone и Android – это компьютеры, которые в основном общаются по телефонной сети, а не через интернет. Компаниям-операторам хотелось бы зарабатывать на услугах телефонии, но в основном они получают доход только от передачи данных. На заре мобильников за пересылку информации брали фиксированную ежемесячную платау, но, например, в США это давно изменилось, и теперь деньги взимаются за фактическое использование. В случае объемных услуг, таких как загрузка фильмов, вполне обоснованно повышать цены и вводить лимит при откровенной недобросовестности клиента, но, если речь идет об отправке текста, подобные меры сложнее обосновать. Это почти ничего не стоит для оператора, ведь загрузка сети минимальна.

Наконец, обратите внимание, как первые протоколы и программы доверяли своим пользователям. Telnet отправляет пароли в открытом виде. Долгое время SMTP ретранслировал почту от кого угодно к кому угодно, никак не ограничивая отправителя или получателя. Этот сервис «открытой ретрансляции» стал благодатной почвой для спамеров: если вам не нужен прямой ответ, можно дать неверный исходный адрес, чтобы с легкостью совершать мошенничество и атаки типа «отказ в обслуживании» (DDoS). Ранние интернет-протоколы и программы, созданные на их основе, разрабатывались для честного и благонамеренного сообщества, основанного на сотрудничестве и взаимном доверии. Совершенно ничего похожего на современный интернет, где мы играем в догонялки в области информационной безопасности и аутентификации.

Обеспечить конфиденциальность и безопасность в интернете – непростая задача, и мы еще поговорим о ней в последующих главах. Она похожа на гонку вооружений между нападающими и защитниками, причем первые часто выходят победителями. Данные проходят через нерегулируемые и разнообразные носители и сайты общего пользования, разбросанные по всему миру. Сведения в любой момент могут записать, изучить и заблокировать в интересах правительства, бизнеса и преступников. Управлять доступом и защищать информацию «по дороге» сложно. Многие сетевые технологии используют широковещательную рассылку, которая уязвима для прослушивания. Если для атаки на проводной Ethernet и оптоволоконную сеть необходимо найти кабель и физически подключиться к нему, то в случае беспроводной сети лазутчику не нужен физический доступ – достаточно находиться рядом.

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

10. Всемирная паутина

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

Часть текста на первой веб-странице, info. cern.ch/hypertext/WWW/TheProject.html, 1990

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

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

Во-первых, URL (Uniform Resource Locator, унифицированный указатель ресурса), который задает имя для источника информации. Например: http://www.amazon.com.

Во-вторых, HTTP (Hypertext Transfer Protocol, протокол обмена гипертекстовой информацией), кратко упомянутый в предыдущей главе как пример протокола более высокого уровня. HTTP-клиент делает запрос на определенный URL, а сервер возвращает запрошенную информацию.

В-третьих, HTML (Hypertext Markup Language, язык гипертекстовой разметки), язык для описания формата или представления информации, отправленной сервером. Тут тоже ничего сложного, и для владения им на базовом уровне вам нужно знать совсем немного.

И наконец, браузер в виде программы (например, Chrome, Firefox, Safari или Edge), которая запускается на вашем компьютере. Она создает запрос серверу, используя URL и HTTP, извлекает HTML, отправленный сервером, и отображает его.

Всемирная паутина зародилась в 1989 году, когда англичанин Тим Бернерс-Ли – специалист по информатике, работавший в CERN, Европейском центре ядерных исследований возле Женевы, – создал систему, призванную сделать научную литературу и результаты исследований более доступными через интернет. В его проект вошли URL-адреса, HTTP и HTML, а также клиентская программа для просмотра имеющихся материалов (исключительно текстовая). По ссылке https://info.cern.ch/hypertext/ WWW/TheProject.html можно посмотреть имитацию этой первой версии веб-сайта CERN.

Та программа для просмотра использовалась с 1990 года. Лично я видел ее в действии в октябре 1992 года во время визита в Корнелл[90]. Стыдно признаться, но тогда она не впечатлила меня, и я уж точно не предполагал, что менее чем через шесть месяцев изобретение первого графического браузера изменит мир. Вот тебе и «заглянул в будущее»…

Первый браузер под названием Mosaic разработали студенты Иллинойского университета. Их проект вышел в феврале 1993 года и быстро набрал популярность, а через год стал доступен первый коммерческий браузер Netscape Navigator, которому со старта сопутствовал успех. Хотя всплеск интереса к интернету застал Microsoft врасплох, корпорация быстро опомнилась и создала конкурента – Internet Explorer (IE), который с большим отрывом вырвался вперед по популярности.

Из-за доминирования Microsoft на рынке персональных компьютеров возникли опасения, что она создала монополию в нескольких областях, и в 1998 году Министерство юстиции США подало на компанию в суд. Разбирательство касалось и IE, поскольку утверждалось, что Microsoft злоупотребила своим доминирующим положением, чтобы вытеснить Netscape из бизнеса. Корпорация проиграла тяжбу, и ей пришлось изменить некоторые из своих деловых практик.

Сегодня самый широко используемый браузер на ноутбуках, настольных компьютерах и телефонах – Chrome. За ним со значительным отрывом идут Safari и Firefox. В 2015 году Microsoft выпустила новый браузер для Windows 10 под названием Edge, который заменил IE. Первоначально он работал на собственном коде Microsoft, но с 2019 года перешел на открытый исходный код Google Chromium. Доля рынка Edge ниже, чем у Firefox, а у IE – и того меньше.

Техническая эволюция Сети управляется (или, по крайней мере, направляется) некоммерческим предприятием под названием World Wide Web Consortium, или W3C, то есть «Консорциум Всемирной паутины» (w3.org). Основатель и нынешний директор W3C – тот самый Бернерс-Ли. Он не старался заработать на своем изобретении, а великодушно предпочел сделать его бесплатным для всех, хотя многие из тех, кто поспешил примазаться к интернету и Сети, возникшими благодаря его трудам, стали очень богатыми. В 2004 году королева Елизавета II посвятила его в рыцари.

10.1. Как работает Всемирная паутина

Давайте более внимательно посмотрим на технические компоненты и механизмы Всемирной паутины. Начнем с URL-адресов и HTTR

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

Предположим, что в ссылке написано нечто вроде «домашняя страница W3C». Если вы наведете на нее курсор, то в строке состояния в нижней части окна браузера, скорее всего, появится URL-адрес, с которым связана ссылка (например, http://w3.org), и, возможно, дополнительная информация после доменного имени.

Когда вы нажимаете на ссылку, браузер открывает TCP/IP-соединение с портом 80 в домене w3.org и отправляет HTTP-запрос на информацию из остальной части URL. Если ссылка имеет вид http://w3.org/index. html, запрос предназначен для файла index.html.

Когда сервер для w3. org получает этот запрос, то решает, что делать дальше. Если запрашивается существующий файл на сервере, в качестве ответа он отправляет файл, и клиент (то есть браузер) отображает его. Текст, передающийся с сервера, почти всегда представлен в формате HTML, который сочетает в себе сам контент и информацию о том, как его форматировать или отображать.

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

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

После:// следует доменное имя, определяющее сервер. Далее могут стоять косая черта (/) и строка символов. Она в точности передается на сервер, и тот волен поступить с ней как пожелает. В простейшем случае, когда нет даже косой черты, сервер возвращает страницу по умолчанию – например, index.html. Если задано имя файла, то его содержимое отправляется как есть. Знак вопроса после начальной части имени файла обычно означает, что сервер должен запустить программу, название которой прописывается перед? и отправить в нее остаток текста. По сути, это один из способов обработки информации, задаваемой в формах на веб-странице. Вот, например, поиск в Bing:

https://www.bing.com/search?q=funny+cat+pictures

Для проверки напечатайте это прямо в адресной строке браузера.

Любой текст после доменного имени записывается знаками из ограниченного набора, куда не входят пробелы и большинство не буквенно-цифровых символов, поэтому их требуется кодировать. Знак плюс (+) соответствует пробелу, а другие символы задаются с помощью % и двух шестнадцатеричных цифр. Например, фрагмент URL-адреса 5%2710%22%2D6%273%22 означает 5’10"-6’3", где шестнадцатеричное число 27 – символ одинарной кавычки, шестнадцатеричное число 22 соответствует двойной кавычке, а шестнадцатеричное 2D – знаку минус («короткому тире»).

10.2. HTML

Ответ с сервера обычно приходит в формате HTML, который сочетает в себе информацию о содержимом и форматировании. HTML настолько прост, что вы без труда создадите веб-страницу в вашем любимом текстовом редакторе. (Если вы работаете в чем-то вроде Microsoft Word, то нужно сохранить веб-страницу в виде

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

На рисунке 10.1 показан пример HTML для минималистичной веб-страницы. На рис. 10.2 вы можете увидеть, как его отобразит браузер.

Рис. 10.1. HTML для простой веб-страницы

Рис. 10.2. Отображение HTML-кода с рис. 10.1 в браузере

Файл изображения здесь по умолчанию пересылается из того же места, что и первоначальный файл, но его можно получить и из любой точки в интернете. Если файл, указанный в теге изображения <img>, недоступен, браузер отобразит на его месте какой-нибудь условный рисунок, обозначающий сбой. Атрибут alt= указывает, какой текст появится, если само изображение вывести невозможно. Это небольшой пример того, как создать веб-страницу, удобную для людей с расстройствами зрения или слуха^95.

Одни теги автономны (например, <img>), другие имеют начало и конец (такие, как <body> и </body>). Для других, в частности <р>, на практике не нужен закрывающий тег, однако строгое определение требует </р>, и выше мы прописали его. Отступы и переводы строки не обязательны, но облегчают чтение текста.

Большинство HTML-документов также содержат информацию на другом языке, называемом CSS (Cascading Style Sheets – каскадные таблицы стилей). С помощью CSS можно в одном месте определить свойства стиля – например, формат заголовков, – а затем применить их ко всем вхождениям. В частности, если нам хочется, чтобы все заголовки h2 и h3 отображались красным курсивом, зададим такую CSS:

h2, h3 { color: red; font-style: italic; }

И HTML, и CSS – языки, но не языки программирования. У них есть формальные грамматики и семантики, но нет циклов и условий, поэтому вы не сумеете записывать на них алгоритмы.

Цель этого раздела – показать вам ровно столько HTML, чтобы пролить свет на принципы работы вебстраниц. Для создания безупречных страниц, которые вы видели на коммерческих сайтах, требуется немалое мастерство, однако основы настолько просты, что всего через несколько минут обучения вам удастся изготовить собственный аналог, пусть и очень скромный. При создании большинства текстовых веб-страниц вам понадобится всего десяток тегов, и еще стольких же хватит, чтобы обеспечить практически всё, что важно для обычного пользователя. Подготовить страницы вручную легко: в текстовых редакторах имеется функция «создать HTML», а также существуют программы, специально предназначенные для разработки профессиональных веб-страниц. Такие инструменты понадобятся вам, только если вы решите серьезно заняться веб-дизайном, но в любом случае полезно разобраться, как здесь всё устроено изнутри.

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

Далее рассмотрим простой механизм с неочевидным названием «стандарт CGI» (Common Gateway Interface – общий шлюзовый интерфейс). Он передает информацию от клиента (вашего браузера) к серверу – например, логин и пароль, поисковый запрос или сведения о том, что вы выбрали с помощью радиокнопок и выпадающих меню. Этот метод задается тегом <form>… </form> в HTML. В раздел <form> вы можете поместить общие элементы пользовательского интерфейса: области ввода текста, кнопки, поля для флажков и так далее. Если вы добавили кнопку «Отправить», то после ее нажатия на сервер уйдут данные внутри формы, а также запрос на запуск определенной программы, использующей их.

Формы имеют ограничения. Например, они поддерживают только несколько видов элементов интерфейса. Данные внутри формы проверяются лишь в том случае, если написан нужный код JavaScript или же их пересылают на сервер для обработки. Далее, хотя в поле ввода пароля набранные символы заменяются звездочками, это не обеспечивает никакой безопасности, потому что само его значение передается и хранится в журналах без шифрования. Тем не менее формы – важнейшая часть Сети.

10.3. Куки-файлы

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

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

В 1994 году компания Netscape изобрела решение, которое назвала куки-файлами (от англ, cookie – печенье). Термин звучит своеобразно, однако он уже давно устоялся среди разработчиков. Так обозначается небольшой фрагмент информации, передаваемый между программами. Отправляя веб-страницу, сервер может прикреплять дополнительные фрагменты текста (до 4000 байт каждый), которые браузер должен сохранить. Каждый такой фрагмент называется куки-файлом. Когда браузер делает следующий запрос для этого же сервера, он отправляет обратно те же куки-файлы. По сути, сервер держит сведения о предыдущем посещении в памяти на стороне клиента. Часто сервер назначает клиенту уникальный идентификатор и включает его в куки-файлы (отслеживает). В базах данных на сервере хранятся фиксированные данные, связанные с этим номером, – например, статус логина, содержимое корзины покупок, предпочтения пользователя и т. д. Всякий раз, когда клиент в дальнейшем заходит на сайт, сервер определяет с помощью куки-файлов, что этот посетитель уже знаком ему, и настраивает или восстанавливает сведения.

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

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

Увидеть их на вашем компьютере довольно просто – или в самом браузере, или через другие инструменты. Например, недавнее посещение Amazon обернулось для меня полудюжиной «печенек». На рис. 10.3 они показаны через Cookie Quick Manager, расширение Firefox. Обратите внимание: похоже, Amazon обнаружил, что я использую блокировщик рекламы (adblk_yes).

Рис. 10.3. Куки-файлы с сайта Amazon

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

10.4. Активный контент на веб-страницах

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

Ранние версии Netscape Navigator позволяли запускать в браузере программы на языке Java, сравнительно новом в те времена. Его разработали для установки в среде со скромными вычислительными способностями (например, в бытовой технике), поэтому технически ничто не мешало внедрить интерпретатор Java в браузер. Тогда стало понятно, что в браузере возможно производить существенные вычисления, а значит, он теоретически способен заменить обычные программы – например, текстовый редактор, электронные таблицы и даже саму операционную систему. Эта идея настолько встревожила Microsoft, что корпорация предприняла ряд действий, пытаясь подорвать использование Java. В 1997 году компания Sun Microsystems, создатель Java, обратилась по этой причине в суд. Тяжбу урегулировали несколько лет спустя, когда Microsoft выплатила истцу более миллиарда долларов.

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

В 1995 году Netscape создала новый язык специально для использования в своем браузере – JavaScript (JS). Несмотря на такое название, выбранное из маркетинговых соображений, он никак не связан с Java (не считая того, что они оба внешне похожи на язык программирования С, как мы отметили в главе 5). Оба применяют реализацию виртуальной машины, но со значительными техническими различиями. Исходный код (ИК) Java компилируется там же, где и создается, а для интерпретации в браузер отправляется результирующий объектный код. Вы не увидите, как выглядит первоначальный ИК Java. Напротив, исходный код JS отправляется в браузер и компилируется там. Получатель может просматривать выполняемый ИК, а также изучать его, изменять и запускать.

Сегодня почти все веб-страницы включают в себя код JavaScript для создания графических эффектов и всплывающих окон (полезных или раздражающих), проверки информации в формах и так далее. Теперь язык не так активно используется для рекламных «поп-апов», поскольку во всех браузерах уже есть блокировщики, но его повсеместно задействуют для хитроумного отслеживания и мониторинга. JS стал настолько распространенным, что без него сложно что-либо делать в Сети, хотя такие расширения браузера, как NoScript и Ghostery, позволяют нам частично его контролировать. Парадоксально, но и они сами написаны на JavaScript.

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

Также браузер обрабатывает другие языки и содержимое как с помощью своего кода, так и плагинами вроде Apple QuickTime и Adobe Flash. Как правило, это написанные третьими лицами программы, которые по необходимости динамически загружаются в ваш браузер. Если вы посетите страницу с содержимым в формате, который еще не поддерживается им, то вам, возможно, предложат «подключить плагин». Это означает, что вы скачаете новую программу, которая будет работать на вашем компьютере в тесной связи с браузером.

Что может делать плагин? Фактически всё что захочет, поэтому вы, в общем, вынуждены или доверять поставщику, или обходиться без контента. Плагин – это компилированный код, который работает как часть браузера, используя его API, и, по сути, становится его частью при запуске. Для видео и анимации широко применялся Flash, а для PDF-документов популярен Adobe Reader. Если вкратце, то ставьте плагин в тех случаях, когда вы доверяете источнику. Опасностей будет не больше, чем с обычным кодом, в котором наверняка есть ошибки и средства слежения за вами. Однако Flash имеет долгую историю серьезных уязвимостей в системе безопасности, и в настоящее время его не рекомендуется применять. HTML5 создает для браузера возможности, которые снижают его потребность в плагинах, особенно для видео и графики, но, похоже, сторонние программы еще долго будут существовать.

Как мы увидели в главе 6, браузеры подобны специализированным ОС, которые способны расширяться и обрабатывать все более разнообразный и сложный контент, «чтобы привносить новизну в просмотр веб-страниц». Хорошая новость: с помощью какой-нибудь программы, запущенной в браузере, можно сделать много всего, и взаимодействие будет быстрее, если вычисления выполняются локально. Плохая новость: теперь ваш браузер выполняет программы, которые написал кто-то посторонний, и вы наверняка не до конца понимаете их свойства. Запуская на вашем компьютере код из неизвестных источников, вы сталкиваетесь с реальными рисками. «Я всегда полагаюсь на доброту незнакомцев» – не самая разумная политика безопасности. В статье Microsoft, озаглавленной «10 непреложных законов безопасности», первый из них гласит: «Если злоумышленник способен убедить вас запустить его программу на вашем компьютере, этот компьютер уже не ваш»96. Будьте осмотрительны, разрешая JavaScript и плагины.

10.5. Активный контент в других местах

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

Что насчет HTML в почтовых сообщениях? Интерпретация тегов размера и шрифта безопасна: нет никакого риска в том, что часть сообщения отобразится большими красными буквами, хотя, возможно, получателя это не обрадует. Должна ли программа чтения почты автоматически выводить изображения? Так упростится их просмотр, но возникнет вероятность получить еще больше куки-файлов, если контент поступает из других источников. Мы можем заблокировать «печеньки» почты, но ничто не помешает отправителю добавить изображение в виде прозрачного пикселя размером 1x1, в URL-адресе которого закодировано что-то о сообщении или получателе. (Эти невидимые картинки иногда называют веб-маяками, и они часто встречаются на веб-страницах.) Когда ваше средство чтения писем с поддержкой HTML запрашивает изображение, то обслуживающий его сайт узнаёт, что вы читаете данное сообщение в какой-то определенный момент. Так появляется простой способ отслеживать, когда вы проверяете почту, что потенциально раскрывает информацию о вас, которую вы предпочли бы сохранить в тайне.

Что произойдет, если почтовое сообщение содержит JavaScript? А если оно включает в себя документ Word, Excel или PowerPoint? Должно ли средство чтения писем автоматически запускать данные программы? Нужно ли «упрощать вам жизнь», чтобы это происходило по нажатию на ту или иную область в письме? И, раз уж на то пошло, стоит ли ему позволять вам кликать прямо на ссылки в сообщениях? У мошенников это излюбленный метод спровоцировать жертву на какую-нибудь глупость. Известно, что PDF-документы порой содержат JavaScript (я удивился, впервые увидев это). Должен ли внедренный в них код автоматически выполняться приложением для просмотра PDF, которое по умолчанию вызывается программой чтения почты?

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

Еще хуже то, что почтовые сообщения включают исполняемые файлы, такие как файлы. ехе в Windows или их эквиваленты. Кликнув на какой-нибудь из них, мы запускаем программу, которая с большой вероятностью повредит вашу систему. Злоумышленники пускают в ход разнообразные уловки, чтобы побудить вас запускать такие программы. Однажды я получил письмо, в котором утверждалось, что оно содержит фотографию российской теннисистки Анны Курниковой, и предлагалось щелкнуть на него. Имя файла выглядело как kournikova. jpg.vbs, но расширение. vbs не показывалось (неудачная особенность Windows), иначе сразу стало бы ясно, что это не картинка, а программа на Visual Basic. К счастью, я использовал устаревшую почтовую программу в системе Unix (только текстовую, без опции нажатия на изображение), поэтому я сохранил «фотографию» в файл для дальнейшего изучения.

10.6. Вирусы, черви и троянские кони

Та «фотография Анны Курниковой» оказалась вирусом.

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

Потенциал таких программ известен уже давно. Первым примером, на который обратили внимание вечерние новости, стал «интернет-червь», запущенный Робертом Т. Моррисом в ноябре 1988 года, задолго до начала так называемой современной эпохи интернета. Он использовал два разных механизма, чтобы копировать себя между системами. Червь полагался на ошибки широко распространенных программ, а также выполнял «словарные атаки», то есть перебирал широко используемые слова, чтобы найти верный пароль и залогиниться.

Моррис, аспирант по направлению информатики в Корнелле, не имел дурных намерений: он хотел провести эксперимент по измерению величины интернета. К сожалению, из-за ошибки программирования червь распространялся гораздо быстрее, чем ожидал Роберт. В результате многие машины заражались по несколько раз, не справлялись с объемом трафика, и их приходилось отключать от интернета. В соответствии с новым на тот момент законом, Актом о компьютерном мошенничестве и злоупотреблении[91], Морриса признали виновным в уголовном преступлении. Его приговорили к штрафу и общественным работам.

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

Когда в 1991 году в программах Microsoft Office, особенно Word, появился Visual Basic, вирусам стало намного легче распространяться. В большинство версий Word включен интерпретатор VB, и документы текстового редактора (файлы. doc) могут, среди прочего, содержать программы VB, а также файлы Excel и PowerPoint. Нет ничего сложного в том, чтобы написать программу на Visual Basic, которая будет брать на себя контроль при открытии документа, а поскольку VB обеспечивает доступ ко всей ОС Windows, то ваш код сможет делать всё что угодно. Обычная последовательность действий для вируса выглядит так: если его еще нет на компьютере, он устанавливает себя локально, а затем принимает меры, чтобы расползтись в другие системы. Вот один популярный способ распространения: когда открывается зараженный документ, вирус получает доступ к списку контактов текущей жертвы и отправляет на каждый адрес электронной почты свою копию в каком-либо безобидном или привлекательном сообщении. (Именно этот метод использовал «вирус Анны Курниковой».) Если получатель открывает документ, вирус устанавливается в новую систему и процесс повторяется.

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

VB-вирусы настолько просты в создании, что их могут написать даже неопытные программисты – «хакеры-дилетанты»[92]. А вот создать рабочий вирус или червя так, чтобы не попасться самому, уже сложнее. В конце 2010 года в ряде компьютеров для управления технологическими процессами обнаружили хитроумного червя под названием Stuxnet. Его главной целью стало иранское оборудование для обогащения урана. Действовал он исподтишка: вызывал колебания скорости вращения в двигателях центрифуг, что приводило к повреждению или даже разрушению, и причем выглядело это почти как обычный износ. Одновременно вирус сообщал системе мониторинга, что все в порядке, поэтому проблему не замечали. Никто не взял на себя ответственность за действия Stuxnet, хотя широко распространено мнение, что в его разработке для кибервойны участвовали Израиль и США^97.

Троянский конь (в данном контексте часто сокращается до «троян») – это программа, которая выдает себя за нечто практичное или неопасное, но на самом деле может нанести ущерб. Жертву побуждают скачать или установить троян, потому что он выглядит как полезное приложение. Вот типичный пример: вам предлагают выполнить анализ безопасности системы, но на самом деле инсталлируют вредоносное ПО.

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

Рис. 10.4. Попытка запустить троянского коня[93]

Как я упомянул, на первых порах вирусы распространялись на дискетах. Их современный эквивалент – USB-накопители. Возможно, вы считаете, что флешки – это пассивные устройства, поскольку у них есть только память. Однако некоторые системы, в частности Windows, предоставляют службу «автозапуска», которая автоматически запускает программу с диска при подключении CD, DVD или флеш-накопителя. Если эта функция включена, то вредоносное ПО может заработать и причинить вред, а вы не увидите предупреждений и не сможете вмешаться. Такой способ заражения нередок для корпоративных систем, хотя во многих компаниях действует строгая политика, запрещающая подключать USB-нако-пители к их компьютерам. Иногда совершенно новые диски поставлялись с уже записанными на них вирусами, что относится к «атакам через цепочку поставок». Еще более простой вариант – подбросить флешку с логотипом компании на ее парковку. Если на диске будет храниться файл с интригующим названием вроде «ЗарплатыНачальства. xls», автозапуск может даже не понадобиться.

10.7. Веб-безопасность

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

10.7.1. Атаки на клиентов

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

В следующей главе мы подробно обсудим, как вашу активность в Сети отслеживают с помощью «печенек» и других механизмов, якобы ради того, чтобы предоставлять вам более релевантную (а значит, менее раздражающую) рекламу. Размах мониторинга можно уменьшить, запретив сторонние куки-файлы (с тех веб-сайтов, куда вы не заходили), а также применив расширения браузера, которые отключают трекеры, JavaScript и так далее. Держать оборону сложно, так как многие сайты становится неудобно просматривать, если вы полностью отгородились щитами: приходится их временно опускать, а затем не забывать снова поднимать, однако я думаю, что оно того стоит. Разработчики браузеров упрощают блокировку некоторых куки-файлов и других трекеров, но вам, возможно, придется изменить настройки по умолчанию. Также это не отменяет полезность внешних блокировщиков.

Спам – нежелательные письма, в которых предлагаются схемы обогащения, советы по торговле акциями, увеличение определенных частей тела, особые медицинские средства и множество других ненужных товаров и услуг. Его объемы так возросли, что ставят под угрозу само использование электронной почты. Обычно я получаю от 50 до 100 «мусорных» сообщений в день – куда больше, чем настоящих. Спам настолько распространен, потому что его отправка практически бесплатна. Если ответит даже крошечная часть из миллионов получателей, этого хватит, чтобы выйти в плюс.

Спам-фильтры пытаются отделить зерна от плевел, анализируя текст на наличие известных шаблонов («Вкусный напиток избавит от лишнего жира» – обещание из недавней партии мусорных писем), маловероятных имен, вычурных вариантов написания (\/l/-\ GR/-\) или любимых адресов спамеров. Обычно используется комбинация критериев, поскольку одного недостаточно. Фильтрация спама – один из основных способов использовать машинное обучение на практике. Его алгоритмам предлагается тренировочный набор писем, отмеченных как «спам» или «не спам». Затем они классифицируют последующие входные данные на основании их схожести с характеристиками учебных вариантов. Мы подробнее поговорим об этом в главе 12.

Спам – это пример гонки вооружений: пока защитники учатся справляться с одним видом нежелательных писем, нарушители находят новый способ обхода. У источника спам остановить трудно, поскольку тот хорошо скрыт. Большое количество мусорных сообщений рассылается со взломанных ПК, обычно работающих под Windows. Дыры в системе безопасности и слабый контроль со стороны пользователей приводят к тому, что компьютеры становятся уязвимыми для установки вредоносных программ, призванных нанести ущерб или иным образом вмешаться в работу системы. Один из видов опасного ПО рассылает спам-почту по команде вышестоящего элемента управления, который, в свою очередь, может получать команды с другой машины. С добавлением каждого звена поиск отправителя значительно усложняется.

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

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

Рис. 10.5. Фишинг из Франции

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

На рис. 10.6 изображена сокращенная расшифровка сравнительно адресной атаки, которая началась с письма, полученного мной якобы от коллеги (назовем его Дж. П). Поскольку я уже видел подобное жульничество несколькими неделями ранее, а почтовый адрес выглядел довольно коварно – что-то из серии jp.princeton.edu0 gmail. com, – я решил подыграть.

(Орфография и пунктуация сохранены.)

Дж. П.: Вы готовы выполнить небольшое задание?

Б. К.: в чем дело?

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

Спасибо

Б. К.: какой магазин? ближайший – винный.

Дж. П.: Хорошо, купите пять подарочных карт ebay по 200 $ за шт. = 1000 $. Вы можете найти их в любом ближайшем ближайшем магазине Сотрите серебряное тиснение с обратной стороны, чтобы узнать пин-код. Отправьте пин-коды каждой карты после покупки. Можете прямо сейчас этим заняться?

Б. К.: Не думаю, что в винном магазине продаются такие карточки, обычно я там просто пиво покупаю. Еще предложения?

Рис. 10.6. Слабая попытка фишинга

В итоге преступники сдались – видно, поняли, что я их раскусил. Эта атака получилась отчасти убедительной, потому что ее направляли на меня лично, используя имя моего коллеги и друга. Вот почему точно нацеленные атаки подобного рода порой называют адресным фишингом. Такой вид мошенничества – своего рода социотехника. Применяя ее, мошенники притворяются человеком, находящимся в каких-либо отношениях с жертвой (например, общим знакомым или сотрудником той же компании) и побуждают сделать глупость. Чем больше вы рассказываете о своей жизни в таких местах, как Facebook[94] и LinkedIn, тем проще злоумышленникам нацелиться на вас. Социальные сети помогают социотехникам.

В июле 2020 года Twitter подвергся возмутительной атаке: в аккаунтах некоторых известных личностей, таких как Билл Гейтс, Джефф Безос, Илон Маск, Барак Обама и Джо Байден, мошенники опубликовали разные варианты твитов на тему «Отправьте нам 1000 долларов в биткоинах, и мы вышлем вам обратно 2000 долларов». Трудно поверить, что хоть кто-то может на такое купиться, особенно если речь о владельцах биткоинов, но примерно 100 человек успели это сделать, перед тем как Twitter удалил этот контент. Впоследствии компания сообщила^98:

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

Обратите внимание, что мошенники смогли продвинуться от сотрудников без нужного доступа к тем, кто обладал таковым. Произошла атака типа «расширение прав».

Удалось быстро установить, что нападением руководил 17-летний подросток из Флориды. Кроме него, обвинения предъявили еще двум молодым людям.

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

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

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

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

Опасная программа может зашифровать файлы на вашем компьютере, и вы не сумеете пользоваться им, пока не заплатите за пароль для декодирования. Вирусы, применяемые в таких атаках, называются программами-вымогателями. В июне 2020 года подобному нападению подверглась медицинская школа Калифорнийского университета в Сан-Франциско (UCSF). В заявлении университета говорится^100:

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

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

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

Мы продолжаем взаимодействовать с Blackband, чтобы определить, по какой причине нас уведомили не сразу после обнаружения взлома, а с задержкой…

…которая составила около двух месяцев – в этот период времени Blackband выплачивала выкуп. Учреждение, о котором идет речь, задержалось еще на две недели, прежде чем проинформировать меня и, предположительно, других сотрудников. Меня также смущают «заверения» плохих парней в том, что они уничтожили данные. Не напоминает ли это вам обещания шантажистов сжечь компрометирующие фотографии?

Более примитивная версия программы-вымогателя всего лишь выводит жуткий экран с сообщением о том, что ваш компьютер заражен вирусом, но вы можете избавиться от него: ничего не трогайте, просто позвоните по указанному бесплатному номеру, и за небольшую плату вас спасут. Это своего рода фиктивный антивирус[95]. Один мой родственник попался на такое мошенничество и заплатил несколько сотен долларов. К счастью, эмитент его кредитной карты отменил переводы, но так везет не всем. Если же вы заплатите биткоинами, а злоумышленники нарушат уговор, то вам вообще негде будет искать помощи.

Риски возрастают, если в вашем браузере или другом ПО есть ошибки, позволяющие преступникам установить свои программы на вашу машину. Браузеры – это большие сложные приложения, и в них есть много уязвимостей, которые открывают дорогу к атакам на пользователей. Вы отчасти защитите себя, если будете постоянно обновлять браузер и настроите его так, чтобы он не выдавал лишние сведения или не допускал случайных скачиваний. Например, укажите, чтобы он всегда запрашивал разрешение перед тем, как открыть документы Word или Excel. Будьте осторожны с тем, что загружаете себе: если веб-страница или программа попросят вас щелкнуть по какой-нибудь ссылке, сначала обязательно подумайте. Через несколько страниц мы более подробно обсудим способы защиты.

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

10.7.2. Атаки на серверы

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

Серверы следует тщательно программировать и настраивать, чтобы никакие клиентские запросы, даже самые хитроумные, не сумели получить закрытую информацию или разрешение на неавторизированный доступ. Но на серверах работают сложные большие программы, поэтому в них встречаются ошибки в коде и конфигурации, а злоумышленники умеют пользоваться и тем и другим. Как правило, серверы взаимодействуют с базами данных (БД), доступ к которым осуществляется через стандартный интерфейс SQL (structured query language – язык структурированных запросов). Одна из распространенных атак – внедрение SQL-кода. Если доступ не ограничен как положено, умный преступник может отправить запросы, которые раскроют структуру базы данных, извлекут закрытую информацию и даже запустят на сервере код злоумышленника, способный взять всю систему под контроль. Вполне понятно, как проводятся такие атаки и как от них защищаться, но они по-прежнему случаются удивительно часто.

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

Такие взломы сейчас происходят почти ежедневно, и иногда в больших масштабах. В марте 2017 года преступники скопировали терабайты личной информации о 150 миллионах человек с серверов Equifax – одного из трех крупнейших бюро кредитных историй в США. Подобные агентства хранят в своих БД громадный объем конфиденциальных сведений, так что серьезная проблема явно назревала. Компания Equifax пренебрегала процедурами безопасности – не поддерживала свои системы в актуальном состоянии для противостояния известным уязвимостям, – а после взлома тоже повела себя не очень достойно. Компания публично уведомила об утечке только в сентябре, причем до этого некоторые высокопоставленные руководители успели продать свои акции^101.

В декабре 2019 года американская сеть круглосуточных магазинов Wawa объявила, что у нее украли информацию о большом количестве кредитных карт (около 30 миллионов) с помощью вредоносного ПО, которое проникло в кассовые терминалы^102. Данные карт продавались в «теневом интернете» (даркнете).

В феврале 2020 года взломали компанию Clearview AI, предоставляющую ПО для распознавания лиц (в первую очередь правоохранительным органам, однако не исключительно им), и произошла утечка ее клиентской базы данных. Компания объявила, что больше ничего не похитили – ни снимки, ни записи о поисках личностей, – однако в репортажах тогда звучали намеки, что фотографии все-таки украли^103.

Также в феврале 2020 года сеть отелей Marriott International объявила, что преступники получили доступ к сведениям о более чем 5 миллионах постояльцев, в том числе к их контактным данным и другой персональной информации – например, дате рождения^104.

Серверы также могут стать объектом атаки типа «отказ в обслуживании», когда злоумышленники направляют огромный объем трафика на сайт и перегружают его. Часто это организуется с помощью бот-сетей. Взломанным машинам приказывают посылать запросы на определенные сайты в назначенное время, из-за чего создается координированный поток трафика. Атака, которая одновременно исходит из многих источников, называется «распределенный отказ в обслуживании» (DDoS). Например, в феврале 2020 года облачный сервис AWS от Amazon успешно справился с DDoS-атакой, которая, по словам сотрудников, оказалась самой крупной в истории: на пике интенсивность трафика достигала 2,3 Тбит/с^105.

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

10.7.3. Атаки на передаваемую информацию

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

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

Чтобы не позволить мошенникам прослушивать содержимое потока данных или выдавать себя за одну из сторон, применяется протокол HTTPS – подвид HTTP, который шифрует трафик TCP/IP в обоих направлениях. HTTPS используется все обширнее, но пока еще не проник везде.

Возможен еще один тип атак – «через (незаконного) посредника»[96], когда злоумышленник перехватывает сообщения, изменяет их и отправляет так, словно они пришли непосредственно из их первоначального источника. (Примером может служить история графа Монте-Кристо, упомянутая в главе 8.) Нападения подобного рода тоже возможно предотвратить с помощью правильного шифрования. Брандмауэры на уровне страны[97] – это, по сути, еще один вариант атак через посредника, при которых замедляется трафик или изменяются результаты поиска.

Виртуальная частная сеть (VPN, Virtual Private Network) создает зашифрованный путь между двумя компьютерами и обеспечивает общую безопасность потока информации в обоих направлениях. Корпорации часто используют VPN, чтобы позволить сотрудникам работать из дома или в странах, где безопасности коммуникационных сетей нельзя доверять. Частные лица могут применять VPN, чтобы уменьшить опасность подключения в кофейнях и других местах с открытым Wi-Fi. Только обращайте внимание, кто управляет VPN и насколько они готовы воспротивиться давлению правительства, если оно потребует раскрыть информацию об их пользователях.

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

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

через посредника. Facebook[98] Messenger – это еще одно приложение для обмена сообщениями, но на данный момент оно не защищено сквозным шифрованием, хотя такая опция существует. Пока такой защиты нет, оно более уязвимо для атак.

Signal – это ПО с открытым исходным кодом, Whats-Арр – продукт Facebook[98], a iMessage принадлежит Apple. Эдвард Сноуден одобрил Signal, назвав ее наиболее предпочтительной системой для безопасного общения, и сам применяет ее.

Система для видеоконференций Zoom, которой сейчас пользуются многие из нас, утверждает, что обеспечивает сквозное шифрование совещаний с 256-битным AES[99]. Но в 2020 году Федеральная торговая комиссия США (FTC) подала жалобу, в которой утверждалось, что на самом деле Zoom хранил ключи шифрования, применял только AES-128 и незаметно устанавливал ПО, которое обходило механизм безопасности браузера Safari^107.

10.8. Как защитить себя

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

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

Важные.

Тщательно придумывайте пароли, чтобы никто не смог их угадать или быстро раскрыть, задействовав перебор вариантов с помощью компьютера. Вам нужен более сильный пароль, чем одно слово, дата вашего рождения, кличка домашнего питомца, имя родственника или близкого человека. Определенно не выбирайте вариант «пароль», который встречается удивительно часто. Фраза из нескольких слов, в которую входят заглавные и строчные буквы, цифры и специальные символы – вот достойный компромисс между безопасностью и простотой в применении^109. Существует несколько сайтов, которые оценивают силу предлагаемого пароля. Есть общепринятое мнение, что время от времени пароли следует менять, однако я в этом не уверен. Частая смена может оказаться контрпродуктивной, особенно если вы вынуждены заниматься ею в неподходящее время. Тогда вас потянет внести явно шаблонные поправки – например, увеличить последние числа.

Никогда не используйте одинаковые пароли для важных сайтов (например, банка и почты). Это допустимо только для малоценных ресурсов вроде агрегаторов новостей или социальных сетей. Никогда не применяйте на работе те же пароли, что и для личных учетных записей. Не заходите на разные сайты через какой-то один вроде Facebook[100] или Google: если что-то пойдет не так, возникнет единая точка отказа. Кроме того, так вы просто выдаете сведения о себе. Если вы хотите проверить, не взломан ли уже какой-либо из паролей, зайдите на haveibeenpwned. com, где собирают информацию такого рода.

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

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

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

Рис. 10.7. Двухфакторное устройство RSA SecurlD

Не открывайте вложения от незнакомых отправителей, как и вложения, неожиданно присланные друзьями или коллегами. Запретите макросы Visual Basic в программе Microsoft Office. Если вас просят что-то принять, нажать или установить – сначала подумайте! Не скачивайте программы сомнительного происхождения. Будьте бдительны, когда загружаете и инсталлируете любое ПО (включая защитные расширения, упомянутые в этом разделе), если только оно не получено из доверенного источника. Все это верно не только для вашего компьютера, но и для вашего смартфона!

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

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

Регулярно создавайте резервные копии ваших данных в безопасном месте. Это можно делать автоматически с помощью такого сервиса, как Time Machine от Apple, или вручную, если вы усердны. Систематически проводить резервное копирование в любом случае весьма разумно: тогда, если диск выйдет из строя, или вредоносное ПО сотрет на нем информацию, или зашифрует его с целью получения выкупа, это не станет для вас тяжким ударом. Если вы пользуетесь облачными сервисами для хранения важных документов и фотографий, то делайте резервное копирование локально – на случай, если вас заблокируют или поставщик услуг закроется.

Благоразумные.

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

Для борьбы с рекламой, отслеживанием и полагающимся на них вредоносным ПО применяйте такие расширения, как Adblock Plus, uBlock Origin и Privacy Badger. Ghostery поможет вам почти полностью избавиться от отслеживания через JavaScript. Принцип работы Adblock и аналогичных расширений заключается в том, что они фильтруют HTTP-запросы к URL-адресам в длинных списках рекламных сайтов^110. Хотя рекламодатели утверждают, что пользователи блокировщиков рекламы каким-то образом обманывают их или воруют у них, объявления в Сети по-прежнему остаются одним из главных источников распространения опасных программ, поэтому правильно их просто отключить, чтобы избежать заражения. К тому же вы обнаружите, что ваш браузер теперь работает быстрее.

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

Вырубите службы определения местоположения на смартфоне, если вам не нужны карта или навигатор. Отключите HTML и JavaScript в вашей программе чтения почты.

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

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

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

Для мнительных.

Используйте NoScript в вашем браузере, чтобы ограничить JavaScript.

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

Выдумывайте адреса электронной почты для временной регистрации. Когда какой-нибудь сайт не позволяет мне получить доступ к какой-либо услуге или информации и настаивает на предоставлении адреса электронной почты, я использую сервисы mailinator.com или yop-mail. com.

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

Скачайте браузер для анонимного просмотра Сети. (Подробнее об этом в главе 13.)

Установите Signal, WhatsApp или iMessage для безопасной связи. Но учтите, что они все равно могут передавать данные вредоносным программам, если вы не проявляете осторожность.

Поскольку мобильные телефоны все чаще становятся объектом атак, для них необходимы повышенные меры предосторожности. Будьте особенно внимательны с приложениями и другим контентом, который вы скачиваете. Так, в мае 2018 года агенты правительства Саудовской Аравии взломали смартфон Джеффа Безоса (основателя Amazon) с помощью вредоносного видео, которое пришло вместе с сообщением в WhatsApp^111.

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

10.9. Краткие выводы

Всемирная паутина еще не существовала в 1990 году, а к сегодняшнему дню превратилась в неотъемлемую часть нашей жизни. Посредством поиска, онлайн-покупок, рейтинговых систем, сайтов со сравнениями цен и отзывами о товарах она изменила облик бизнеса, особенно на потребительском уровне. Она преобразила наше поведение – в частности, то, как мы ищем друзей, людей, с которыми у нас общие интересы, и даже спутников жизни. Теперь мы по-иному изучаем мир и получаем новости из других источников. Правда, если мы узнаём о текущих событиях и составляем мнения, пользуясь целевым набором ресурсов, которые приспосабливаются под наши интересы, это не очень хорошо. Есть такой термин – «информационный пузырь» (или «пузырь фильтров»), который подчеркивает, насколько сильно Сеть влияет на формирование наших мыслей и взглядов^113.

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

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

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

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

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

Попытки таких компаний, как Facebook[101] и Google, заставить своих пользователей указывать настоящие имена, встретили сильное сопротивление по уважительным причинам. У анонимности в интернете есть много недостатков – например, ксенофобные высказывания, травля и троллинг, и это убедительные аргументы против нее. Но для людей важно иметь возможность свободно выражать себя, не опасаясь репрессий.

Мы еще не нашли правильный баланс, если он вообще существует.

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

Часть IV

Данные

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

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

«Большие данные» означает только то, что мы имеем дело с большим объемом данных, и возразить тут сложно. Оценки того, сколько информации сейчас во всем мире, непрерывно растут. Раньше для таких прикидок вполне годились эксабайты (10^18), но те времена прошли, и теперь нам нужны зеттабайты (10^21). Можно с уверенностью предсказать, что в ближайшем будущем появятся йоттабайты (10^24). Йотта – это приставка для самых больших значений в Международной системе единиц (СИ). Когда и ее станет не хватать, придется добавить еще один префикс, что-то вроде «за пределами йотты», вдохновившись детской книгой Доктора Сьюза «За пределами зебры!»[102]’114.

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

Откуда все эти данные поступают? Что мы можем с ними сделать? Как поступить, если мы не желаем предоставлять информацию о себе?

В главе 11 мы обсудим многочисленные источники данных: как наши действия в Сети и в реальной жизни вносят вклад в так называемые «выхлопные данные» – огромный объем сведений о нас, который накапливается, пока мы просто живем в этом мире.

В главе 12 мы поговорим об искусственном интеллекте (ИИ) и машинном обучении – рассмотрим один аспект того, что делается со всеми этими горами данных. Кое-что из этого используется в наших интересах: благодаря обучению на больших данных стали возможны компьютерное зрение[103], распознавание изображений и голоса, обработка речевых сигналов, автоматический перевод и другие полезные приложения. Но недостаток здесь в том, что о нас могут узнать много информации, часто личной, которой мы бы не хотели делиться или, по крайней мере, допускать, чтобы кто-то ею воспользовался.

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

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

11. Данные и информация

Когда вы смотрите на интернет, интернет смотрит на вас.

Приношу извинения Фридриху Ницше за искажение его слов из книги «По ту сторону добра и зла», 1886

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

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

Мы все что-то ищем и приобретаем, развлекаем себя фильмами и телесериалами в Сети. Мы общаемся с друзьями и родственниками по электронной почте, через текстовые сообщения, а иногда даже голосовыми звонками. С помощью Facebook[104] или Instagram[104] мы не отдаляемся от товарищей и знакомых, LinkedIn помогает поддерживать связь с потенциальными работодателями, а сайты для свиданий – находить романтических партнеров (возможно). Мы читаем Reddit, Twitter и онлайн-новости, чтобы оставаться в курсе событий вокруг нас. Мы управляем нашими деньгами и оплачиваем счета онлайн. Мы повсюду ходим с телефоном, который точно знает, где мы находимся в любое время. Автомобили определяют наше местоположение и передают эту информацию другим. А вездесущие камеры, конечно же, в курсе, где сейчас наши машины. Домашние системы (например, сетевые термостаты, системы безопасности и умные приборы) отслеживают каждое наше движение, знают, когда мы дома и что мы там делаем.

Ни один бит этого потока персональных данных не пропадает зря. В 2018 году Cisco, ведущий производитель сетевого оборудования, выпустил прогноз, где говорилось, что годовой глобальный интернет-трафик превысит 3 зеттабайта в 2021-м^115. Приставка «зетта» означает 10^21, что по любым меркам целая куча байт. Откуда берутся все эти данные и что с ними делают? Ответы отрезвляют, ведь большинство сведений собирают не для нас, а о нас. Чем обширнее данные, тем больше информации о нас получают незнакомые люди, тем заметнее снижается уровень нашей безопасности и нарушается право на личную жизнь.

Я начну с веб-поиска, поскольку сбор огромного количества сведений начинается в поисковых системах. Отсюда мы перейдем к обсуждению отслеживания – наблюдения за тем, какие сайты вы посетили и что там делали. Далее я расскажу о персональной информации, которую люди непреднамеренно отдают или обменивают на развлечения или удобный сервис. Где ее всю хранят? Чтобы ответить, мы рассмотрим базы данных (БД) – коллекции данных, которые накапливают самые разные участники процесса. Здесь же мы обсудим агрегирование данных и интеллектуальный анализ, поскольку ценность сведений повышается, когда их комбинируют и получают новые выводы. Именно здесь возникает большинство проблем с конфиденциальностью: изучая сочетание информации о нас из разных источников, посторонние слишком легко выявляют то, что касается только нас. Наконец, я уделю внимание облачным вычислениям. В рамках этой услуги мы сами передаем все данные компаниям, которые обеспечивают их хранение и обработку на своих серверах, а не на наших компьютерах.

11.1. Поиск

Веб-поиск зародился в 1995 году, когда Всемирная паутина по сегодняшним меркам была еще крошечной. Количество веб-страниц и запросов быстро выросло в течение следующей пары лет, а в начале 1998-го вышла оригинальная статья Сергея Брина и Ларри Пейджа о Google – «Анатомия крупномасштабной гипертекстовой системы поиска в Сети»[105]. В ней говорилось, что AltaVista, одна из наиболее популярных поисковых систем, в конце 1997-го обрабатывала 20 миллионов запросов в день. Авторы точно предсказали, что к 2000 году сеть будет состоять из миллиарда страниц и сотен миллионов запросов в сутки^116. По одной из оценок, в 2017 году подавалось уже 5 миллиардов запросов в день.

Поиск – это большой бизнес, который менее чем за 20 лет превратился из ничего в крупную индустрию. Например, компания Google, основанная в 1998 году, вышла на фондовую биржу в 2004-м, а к осени 2020-го ее рыночная капитализация составляла триллион долларов. Это меньше, чем у Apple (более 2 триллионов долларов), но намного больше, чем у таких давно известных компаний, как Exxon Mobil и AT&T, которые оценивались менее чем в 200 миллиардов долларов каждая. Google высокорентабелен, но существует высокая конкуренция, поэтому… кто знает, что может произойти дальше? (Здесь уместно кое-что раскрыть: я по совместительству работаю в Google, и у меня много друзей в этой корпорации. Но, естественно, ничто из написанного в этой книге не должно восприниматься как позиция Google по какому-либо вопросу.)

Как функционирует поисковая система (ПС)? С позиции пользователя – запрос печатается в форме на вебстранице и отправляется на сервер, который почти мгновенно возвращает список ссылок и фрагментов текста. На стороне сервера все сложнее. Он формирует список вебресурсов, содержащих одно или несколько слов из запроса, сортирует их по релевантности, «обертывает» фрагменты страниц в теги HTML и отправляет пользователю.

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

На рис. 11.1 примерно показана организация этого процесса, включая размещение рекламы на странице результатов.

Рис. 11.1. Организация поисковой системы

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

Допустим, размер обычной веб-страницы составляет 100 Кб, а для хранения ста миллиардов ресурсов требуется 10 петабайт дискового пространства. Некоторые из них статичны и не меняются месяцами или даже годами, но значительная часть ресурсов быстро обновляется (новостные сайты, блоги, ленты в Twitter), поэтому индексирование следует вести непрерывно и эффективно. Возможности отдохнуть не будет, ведь индексируемая информация не должна устаревать. Поисковые системы обрабатывают миллиарды запросов в день, причем для каждого из них требуется просканировать БД, найти релевантные страницы и отсортировать их в правильном порядке. Также необходимо выбрать рекламу, выводимую вместе с результами, и фоном записать в журналы все данные, которые помогут улучшить качество поиска, опередить конкурентов и продать больше рекламы^117.

С нашей точки зрения, ПС – отличный пример алгоритмов в действии. Но при таком объеме трафика ни один простой алгоритм поиска или сортировки не будет работать достаточно быстро.

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

Следующий компонент – построение индекса. У робота поисковой системы берутся страницы, извлекаются релевантные части каждой из них, а затем все это индексируется вместе с URL-адресом и положением фрагмента на страничке. Детали процесса зависят от контента, который нужно проиндексировать. Текст, изображения, электронные таблицы, PDF-файлы, видео и так далее – все они требуют разной обработки. По сути, индексирование готовит список ресурсов и местоположений для каждого слова или индексируемого элемента, встретившегося на какой-либо веб-странице, и сохраняет эти данные в форме, позволяющей затем быстро извлекать перечень страниц для любого конкретного элемента.

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

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

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

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

Google Ads (ранее AdWords) позволяет легко экспериментировать с предлагаемой рекламной кампанией. Например, их инструмент оценки (см. рис. 11.2) говорит, что ожидаемая стоимость поискового слова «керниган» и связанных с ним – например, unix и «программирование на С» – будет составлять 5 центов за клик, то есть каждый раз, когда кто-то ищет один из этих терминов и затем щелкает на мою рекламу, я буду платить Google 5 центов. Инструмент также подсчитал, что по выбранным мной поисковым запросам будет совершаться 194 клика в день при ежедневном бюджете в 10 долларов (в среднем за месяц) – хотя, конечно, никому неведомо, как много людей нажмут на мою рекламу и во сколько мне это обойдется. Я никогда не пытался проверить на опыте.

Могут ли рекламодатели платить за то, чтобы результаты поиска подправлялись в их пользу? Это беспокоило Брина и Пейджа, которые написали в той же статье: «Мы ожидаем, что поисковые системы, финансируемые за счет рекламы, будут изначально предвзято относиться к рекламодателям и не станут учитывать потребности потребителей». Google получает большую часть доходов от объявлений. И хотя он разделяет результаты поиска и рекламу, как и большинство других ПС, во множестве судебных дел истцы обвиняли компанию в предвзятости и несправедливости по отношению к своим продуктам. В Google отвечают, что результаты поиска не предвзяты по отношению к чьим-либо конкурентам, а целиком базируются на алгоритмах, которые отражают предпочтения людей.

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

Рис. 11.2. Оценки Google Ads для «керниган» и связанных с ним слов

В США некоторые виды рекламы считаются незаконными, если в них отдается предпочтение какой-либо расе, религии или полу. Компания Facebook[106], которая тоже получает свой основной доход от объявлений, предоставляет своим клиентам инструменты для таргетированной рекламы с обширным набором критериев. Большинство из них вполне очевидны (доход, образование), но встречаются и такие, что явно незаконны или служат ширмой для возможной дискриминации. В 2019 году Facebook[107] уладила миром тяжбу, где истец утверждал, что на ее платформе позволялось размещать рекламу, способствующую дискриминации^118.

Возможно ли вообще искать что-то в сети так, чтобы ваши действия не отслеживали в таких подробностях? Поисковая система DuckDuckGo (DDG) утверждает, что не сохраняет вашу личную историю запросов и не выдает персонализированную рекламу. Поиск она отчасти выполняет самостоятельно, но в основном агрегирует результаты из большого числа ПС и других ресурсов. DDG все же получает прибыль от рекламы, но ее можно заблокировать через Adblock и другие расширения. Кроме того, этот поисковик предлагает несколько полезных руководств с советами о том, как просматривать веб-страницы и пользоваться смартфоном с меньшим риском для вашей безопасности и неприкосновенности частной жизни^119.

11.2. Отслеживание

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

Когда мы пользуемся интернетом, о нас неизбежно собирают информацию. Мы оставляем след практически при каждом действии. То же самое верно для других систем, особенно мобильников, которые во включенном состоянии всегда знают наше физическое местоположение. Когда вы не в помещении, любому аппарату с функцией GPS (а она есть во всех смартфонах) известно, где вы находитесь, с погрешностью в десять метров, и он способен в любое время передать ваши координаты. В некоторые цифровые камеры также встроена функция GPS, что позволяет им кодировать географическое положение в каждой фотографии. Это называется привязкой к местности (оно же геотегирование'). Также камеры применяют для выгрузки изображений Wi-Fi или Bluetooth. В общем, очевидно, что вас могут отслеживать и через них.

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

В 2019 и 2020 годах газета «Нью-Йорк тайме» опубликовала большую серию статей о конфиденциальности и отслеживании. Одна из наиболее показательных и тревожных частей – исследование БД о местоположении смартфонов на 50 миллиардов записей. База охватывала 12 миллионов человек в нескольких крупных городах США. Данные поставлялись из анонимного источника – вероятно, того, кто работал с брокером данных. Цитата из «Нью-Йорк тайме»120:

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

Ни одно из трех не выдерживает проверки.

«Нью-Йорк тайме» смогла точно определить значительное число личностей, сопоставив сведения о мероприятиях, домашних и рабочих адресах и тому подобном. Журналисты работали с 50 миллиардами записей, но сообщили, что компании, занимающиеся данными о местоположении, каждый день собирают на порядок больше информации, в том числе большой объем демографических сведений, что упрощает корреляцию и идентификацию^121. В теории в «анонимных» данных не содержатся сведения, позволяющие установить личность, однако на практике легко выявить связи, четко определяющие человека, особенно при объединении информации из нескольких источников. Эта статья серьезно настораживает, как и серия материалов в целом.

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

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

Рис. 11.3. Некоторая информация, отправляемая браузером

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

Это самая суть отслеживания, поэтому давайте разберемся более подробно. В качестве эксперимента я выключил все мои средства защиты и зашел на сайт https:// toyota.com через браузер Safari. При первом посещении мне закачались куки-файлы с более чем 25 разных сайтов, а также 45 изображений со всевозможных ресурсов и более 50 программ JavaScript общим объемом более 10 Мб.

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

Рис. 11.4. Веб-страница, которая не устает вычислять

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

Обычно, когда у меня включены средства защиты – Ghostery, Adblock Plus, uBlock Origin, NoScript, запрет на куки-файлы, «не использовать локальное хранилище данных», – я вообще не получаю ни «печенек», ни скриптов.

Значительное количество картинок на той веб-странице относились к тому же типу, что изображение, выделенное на рис. 11.5. То есть на ресурсе Toyota содержится ссылка на Facebook[108], которая извлекает картинку. Изображение прозрачно, а также имеет ширину и высоту в 1 пиксель, поэтому оно полностью невидимо.

Рис. 11.5. Однопиксельное изображение для отслеживания

Такие однопиксельные изображения часто называют веб-жучками или веб-маяками. Создают их исключительно для отслеживания. Когда мой браузер запрашивает эту картинку с Facebook[108], тот ресурс узнаёт, что я смотрю на определенную страницу Toyota.com, и (если я разрешаю это) сбрасывает мне куки-файлы. Когда я посещаю другие сайты, каждая отслеживающая компания может составить представление о том, что я ищу. Если мои поиски в основном касаются машин, наблюдатели сообщают об этом потенциальным рекламодателям, и тогда мне начинают выводить объявления насчет автомобилей от дилеров, кредитов и аксессуаров. Если я заинтересуюсь несчастными случаями и купированием боли, мне будут показывать больше рекламы от ремонтных служб, юристов и терапевтов.

Компании вроде Google, Facebook[109] и многих других собирают информацию о сайтах, на которые мы заходили, после чего используют ее, чтобы продавать рекламные места клиентам вроде Toyota. Те, в свою очередь, применяют данные для целенаправленной рекламы и (возможно) сопоставляют их с другими сведениями обо мне, помимо моего IP-адреса. По мере того как я посещаю все больше веб-страниц, отслеживающие компании создают все более детальную базу данных о моих предполагаемых характеристиках и интересах. Возможно, в итоге они определят, что я мужчина, женат, мне более 60 лет, у меня две машины, я живу в центральном районе штата Нью-Джерси и работаю в Принстонском университете. Чем больше они знают обо мне, тем точнее их клиенты сумеют подбирать для меня объявления. Конечно, таргетинг как таковой – это не идентификация личности, но в какой-то момент определить ее станет довольно просто (хотя многие компании говорят, что таким не занимаются). Однако если на какой-либо странице я указываю свое имя или адрес электронной почты, то нет никакой гарантии, что эти данные не передадут кому-то еще.

В 2016 году «Вашингтон пост» опубликовала серию материалов о конфиденциальности^122. Одна статья вышла под заголовком «98 персональных элементов данных, с помощью которых Facebook[110] подгоняет рекламу под вас». В этот список входят не только очевидные параметры вроде местоположения, возраста, пола, языка, уровня образования, размера доходов и капитала, но и более щекотливые, такие как «этническое сродство», что может применяться для незаконной дискриминации^123.

Интернет-реклама – это продуманный рынок. Когда вы запрашиваете веб-страницу, ее публикатор уведомляет рекламную биржу (например, Google Ad Exchange или AppNexus), что есть доступное пространство на ресурсе, и сообщает информацию о вероятном посетителе: например, «одинокая женщина 25–40 лет из Сан-Франциско, которая любит технологии и хорошие рестораны». Рекламодатели предлагают цены за место, и объявление победителя размещается на странице. Весь процесс занимает пару сотен миллисекунд.

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

Еще имеется полуофициальный механизм «Не отслеживать» (Do Not Track), который больше обещает, чем делает. В браузерах, обычно в меню конфиденциальности и безопасности, есть опция с таким названием. Если ее выбрать, вместе с запросами будет отправляться дополнительный HTTP-заголовок (см. пример на рис. 11.3). Вебсайт, который соблюдает этот механизм, не будет передавать данные о вас другим сайтам, хотя может свободно сохранять информацию для собственных нужд. В любом случае никого не обязывают уважать желания посетителей, и большинство ресуров игнорируют такие предпочтения. Например, Netflix сообщает: «В настоящее время мы не реагируем на сигналы веб-браузера „не отслеживать"»124.

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

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

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

JavaScript – это основной инструмент отслеживания. Браузер запустит любой код JS, найденный в исходном HTML-файле или загруженный с URL с src="name. js" внутри тэга <script>. Это обширно используется для «аналитики», которая отслеживает просмотры определенного ресурса. Например, когда я посещаю Slashdot. org, сайт новостей о технологиях, мой браузер загружает 150 Кб для самой страницы и еще 115 Кб скриптов JS для аналитики с других трех сайтов, включая этот от Google:

(Отмечу, что, когда лично я захожу на Slashdot, ни один из этих аналитических скриптов не загружается, потому что их блокируют расширения Adblock и Ghostery.)

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

На рис. 11.6 показаны несколько строк кода JS, который отображает положение мышки при ее перемещении. Если добавить еще парочку, скрипт начнет передавать такую же информацию поставщику любой веб-страницы, просматриваемой вами. Туда же уйдут и сведения о других событиях – например, где вы печатаете, щелкаете или куда переносите блоки. Если хотите увидеть гораздо более отточенную и очень занимательную реализацию той же идеи, зайдите на сайт clickclickclick, click.

Рис. 11.6. JavaScript для отображения координат при перемещении мышки

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

Electronic Frontier Foundation предлагает поучительный сервис Panopticlick. Он назван в честь «Паноптико-на» Иеремии Бентама[111] – тюрьмы, спроектированной так, чтобы за арестантами там можно было постоянно наблюдать незаметно для них самих. Зайдя на coveryoutracks. eff.org, вы узнаете, насколько (примерно) вы уникальны среди других недавних посетителей. Даже если у вас хороший уровень защиты, вас, скорее всего, идентифицируют однозначно или хотя бы приблизительно. Когда вы откроете сайт в следующий раз, вас опознают с высокой вероятностью.

Сервис Blacklight, который можно найти на themarkup. org/blacklight, имитирует незащищенный браузер и сообщает вам о трекерах (включая те, которые пытаются обойти блокровщиков рекламы), сторонних куки-фай-лах, отслеживании мышки и клавиатуры и других коварных практиках. Иногда довольно страшно видеть, как активно за вами наблюдают, а вот искать самых злостных нарушителей скорее забавно. Например, кулинарный сайт epicurious.com загрузил 136 сторонних куки-файлов и 44 рекламных трекера, причем одновременно он мониторил нажатия клавиш и щелчки мыши, передавая данные о посещении в Facebook[112] и Google.

Механизмы отслеживания не ограничиваются браузерами – они также применяются почтовыми и другими системами. Если ваш почтовик интерпретирует HTML, то он «отобразит» те самые однопиксельные картинки, с помощью которых кто-то будет наблюдать за вами. Apple TV, Chromecast, Roku, TiVo и Fire TV Stick от Amazon – все они в курсе, что вы смотрите. Так называемые «умные телевизоры» тоже это знают, а еще они способны отправлять своему производителю ваш голос и даже изображения с их камер. Устройства с поддержкой речи вроде Amazon Echo также пересылают для анализа то, что вы произносите^126.

Как мы уже знаем, каждый IP-пакет на пути от вашего компьютера до места назначения проходит от 15 до 20 шлюзов. Это верно и для пакетов, которые отправляются обратно. Каждый шлюз на маршруте может заглянуть в содержимое пакета и даже изменить его неким образом. Это называется глубокой проверкой пакетов (ГПП), потому что просматриваются не только заголовки, но и само содержимое. Обычно все происходит на стороне вашего интернет-провайдера, поскольку именно здесь вас проще всего идентифицировать. И речь не только о просмотре веб-страниц, а обо всем трафике между вами и интернетом.

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

Единственная защита от ГПП – сквозное шифрование в HTTPS. Оно не позволяет проверять и изменять содержимое во время его передачи, однако не скрывает метаданные – например, источник или точку назначения.

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

В Европейском союзе неприкосновенность частной жизни воспринимается более серьезно (опять же, если сильно упростить): компании не могут законно собирать или применять данные о человеке без его прямого разрешения. В соответствующей части GDPR (General Data Protection Regulation[113]), который вступил в силу в середине 2018 года, сказано, что персональные данные недопустимо обрабатывать без прямого одобрения. Даже если в онлайн-форме по умолчанию выставлено «Отказываюсь», не считается, что пользователю дана возможность выразить информированное согласие. Также у людей есть право получить доступ к своей личной информации и следить, как ее используют. Согласие можно отозвать в любое время.

В 2016 году США и ЕС заключили соглашение, в котором регулировался порядок перемещения данных между двумя регионами и учитывалась защита прав граждан Евросоюза на неприкосновенность частной жизни. Однако в июле 2020 года высший суд ЕС постановил, что соглашение не соответствует нормам Евросоюза в данной области, поэтому сейчас ситуация в подвешенном состоянии^127.

В начале 2020 года вступил в силу Закон о конфиденциальности потребителей в Калифорнии (ССРА), чьи цели и параметры аналогичны Общему регламенту ЕС. В нем прописано, что люди должны иметь возможность явно запретить продажу их данных. Хотя этот акт распространяется только на жителей одной территории, мы можем надеяться, что его влияние ощутят по всей стране. В Калифорнии живет более 10 % населения США, и она часто опережает другие штаты в решении социальных вопросов.

Однако пока еще слишком рано говорить о том, хорошо ли работают Общий регламент ЕС и ССРА.

11.3. Социальные сети

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

Сколько-то лет назад я наткнулся на пост в Сети, где говорилось что-то вроде «На собеседовании меня спрашивали о том, что я не упоминал в резюме. Они просматривали мою страничку в Facebook,[114] и это возмутительно, потому что она посвящена моей личной жизни, а их вообще не касается». Это трогательно наивно и невинно, но есть подозрение, что по крайней мере часть пользователей Facebook[114] испытывала подобное чувство поругания – пусть даже хорошо известно, что работодатели и приемные комиссии колледжей регулярно используют поисковые системы, социальные сети и подобные ресурсы, чтобы получить более подробную информацию о кандидате. В США незаконно спрашивать соискателя о возрасте, этнической принадлежности, религии, сексуальной ориентации, семейном положении и о многом другом, относящемся к персональным сведениям, – но это можно легко и незаметно определить с помощью соцсетей.

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

За то недолгое время, что существуют соцсети, они резко выросли в размерах и влиянии. Facebook[114] основали в 2004 году, а в 2020-м компания сообщала о более чем 2,5 миллиарда активных пользователей ежемесячно – около трети населения всего мира. (Facebook[115] также владеет Instagram[115] и WhatsApp, и сведения передаются между операторами.) Ежегодный доход в 70 миллиардов долларов практически полностью обеспечивается за счет рекламы. При таком стремительном росте у корпорации нет времени на то, чтобы тщательно продумывать политику и неторопливо разрабатывать надежные компьютерные программы. Каждый сайт социальных сетей сталкивался с проблемами разглашения личных данных из-за плохо продуманных функций, неясных для пользователей настроек конфиденциальности (которые часто меняются), ошибок в ПО и утечек информации, присущих системе в целом.

Проблемы Facebook[115] как крупнейшей и самой успешной соцсети были наиболее заметны. Некоторые из них возникли из-за того, что корпорация предоставляет третьим лицам API для написания приложений, которые запускаются в пользовательском контексте, а они могут раскрывать личные данные вопреки политике конфиденциальности компании^128. Опять же, такие проблемы есть и у других соцсетей^129.

Сервисы геолокации отображают местоположение пользователей на мобильных телефонах, что упрощает личные встречи с друзьями или позволяет участвовать в играх, где учитываются ваши координаты. Адресная реклама становится особенно эффективной, если известно, где в реальности находится потенциальный клиент. Вы с большей вероятностью отреагируете на предложение от ресторана, если стоите около его двери, а не читаете о нем в газете. С другой стороны, дрожь пробирает, когда вы понимаете, что с помощью смартфона отслеживаются даже ваши действия в пределах магазина. Тем не менее продавцы начинают использовать внутримагазинные маячки. Если вы регистрируетесь в системе (обычно скачивая определенное приложение или неявно соглашаясь на отслеживание), маячки, применяя Bluetooth для общения с вашим телефоном, определяют, где именно в торговом зале вы находитесь, и делают вам предложение, посчитав, что вас привлечет какой-то определенный товар. Процитируем одну компанию, которая разрабатывает такие системы: «Маячки возвещают о революции мобильного маркетинга внутри помещений»130.

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

Разведывательным службам давно известно, что они могут многое выяснить, анализируя, кто с кем общается, даже если к содержанию разговоров нет доступа. Именно по этой причине АНБ собирало метаданные по всем телефонным звонкам в США: номера абонентов, время и длительность. Изначально Агентство получило разрешение на такую деятельность в ряду прочих необдуманных реакций на террористическую атаку 11 сентября 2001 года, но об истинных масштабах накапливания сведений никто не подозревал до публикации Сноудена в 2013-м. Если даже поверить заявлению, что там «просто метаданные, а не сами разговоры», то учтите, что и такая информация бывает исключительно показательной. Эд Фелтен из Принстонского университета, давая показания на слушаниях Судебного комитета Сената в октябре 2013 года, объяснил, как метаданные превращают частную историю в достояние гласности^132:

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

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

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

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

Это же верно и в отношении явных и неявных взаимодействий в социальных сетях. Намного проще установить связи между людьми, когда они сами всё предоставляют в открытом виде. Например, «лайки» в Facebook[116] можно использовать для точного определения таких характеристик, как пол, этническая принадлежность, сексуальная ориентация и политические взгляды. Это указывает на то, какие выводы можно сделать из информации, свободно выкладываемой пользователями социальных сетей^133.

Кнопки для «лайков» в Facebook[116] и аналогичные им в Twitter, LinkedIn, YouTube и других сетях значительно упрощают отслеживание и выявление связей. Щелкая на иконку социальной сети на какой-нибудь страничке, вы сообщаете, что просматриваете ее. По сути, это рекламное изображение, пусть даже видимое, а не скрытое, и оно дает поставщику шанс отправить вам куки-файлы.

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

Если друг помечает меня на фотографии, опубликованной на Facebook[117], тайна моей личной жизни нарушается без моего согласия. Эта соцсеть обеспечивает функцию распознавания лиц, благодаря которой пользователям проще отмечать своих друзей, что по умолчанию позволено делать без их разрешения. И я, похоже, способен контролировать ситуацию лишь отчасти: можно запретить соцсети предлагать кому-то отмечать меня, но не сами отметки. Как пишет Facebook[117]:

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

Если вы отключаете эту функцию: <… > Мы не будем применять распознавание лиц, чтобы предлагать людям отмечать вас на фотографиях. Это означает, что вас по-прежнему могут отметить на фотографиях, но мы не будем предлагать ставить пометки, основываясь на шаблоне распознавания лиц^134.

Я вообще не пользуюсь Facebook[118] и поэтому удивился, обнаружив, что у меня «есть» страница в этой соцсети, очевидно, автоматически сгенерированная на основе статьи в «Википедии». Досадно, но тут я мало что могу поделать – только надеяться, что люди не подумают, будто я одобряю такое.

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

Хорошенько подумайте о том, что вы рассказываете миру о себе. Перед тем как отправить почту, написать пост или твит, сделайте паузу на пару секунд и задайте себе вопрос: понравится ли вам, если загруженные вами слова или изображения напечатают на первой странице «Нью-Йорк тайме» или покажут в главном сюжете в выпуске новостей на ТВ? Ваша письма, текстовые сообщения и твиты, скорее всего, будут храниться вечно и могут всплыть годы спустя в позорном для вас контексте.

11.4. Интеллектуальный анализ и агрегирование данных

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

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

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

Но как насчет открытых архивов? Закон гласит, что данные определенных типов доступны по запросу каждому представителю общественности. В Соединенных Штатах это судебные разбирательства, документы по ипотеке, цены на жилье, местные налоги на недвижимость, записи о рождении и смерти, свидетельства о браке, списки избирателей, взносы на политические цели и тому подобное. (Обратите внимание, что из свидетельства о рождении можно узнать дату и порой – девичью фамилию матери, а ведь то и другое часто используют для проверки личности пользователя.)

В прежние времена, чтобы получить такую информацию, требовалось добраться до местного правительственного учреждения. Поэтому, хотя формально архивы считались «открытыми», ради доступа к ним приходилось постараться. Человеку, искавшему данные, следовало показаться лично, предъявить документы и, возможно, даже заплатить за каждую физическую копию. Сегодня сведения часто доступны онлайн, и я могу проверять публичные акты анонимно, не выходя из дома. Или даже организовать свое дело, собирая эту информацию и комбинируя ее с другой. Например, популярный сайт zillow.com отображает на карте цены на жилье, основываясь на планах местности, объявлениях агентств недвижимости, общественные данные о земельной собственности и сделках. Такой сервис сочтут полезным те, кто собирается продать или купить дом, однако в других ситуациях, вероятно, люди назвали бы его бесцеремонным. Подобные сайты добавляют сведения о нынешних и прошлых жильцах, данные об их регистрации на выборах и в качестве затравки намекают, что у них, возможно, криминальное прошлое. Из базы данных Федеральной избирательной комиссии (fec.gov), где записаны пожертвования на выборы, четко видно, каких кандидатов поддержали ваши друзья и известные люди. Также в ней возможно найти их домашние адреса. Это создает неустойчивое равновесие, которое больше склоняется в сторону права публики на осведомленность, нежели права отдельной личности на неприкосновенность частной жизни.

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

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

В августе 2006 года, исходя из лучших побуждений, AOL[119] опубликовал большую выборку поисковых журналов для исследования. Перед этим компания анонимизировала логи, содержащие 20 миллионов запросов от 650 000 пользователей за три месяца, теоретически полностью удалив все данные, по которым удалось бы идентифицировать ее клиентов. Но, несмотря на благие намерения AOL, на практике быстро выяснилось, что логи не такие уж анонимные. Оказалось, что пользователям назначались случайные, но уникальные ID, по которым получилось найти последовательности запросов от одних и тех же личностей, а затем однозначно определить как минимум нескольких из них. Люди искали свои имена, адреса, номера социального страхования и другие персональные данные. Сопоставление поисковых запросов раскрыло больше сведений, чем предполагали в AOL, включая огромные объемы информации, которую сами пользователи явно не хотели бы делать общедоступной. Компания быстро удалила журналы запросов со своего веб-сайта, но, разумеется, опоздала: данные уже разошлись по всему миру.

Подобные логи содержат информацию, ценную для ведения бизнеса и улучшения качества обслуживания, но, очевидно, в них также находятся потенциально уязвимые персональные данные. Как долго поисковые системы должны сохранять такие сведения? В этом вопросе компании подвергаются внешнему давлению с разных сторон: с точки зрения конфиденциальности всё надо удалять как можно скорее, а с позиции правоохранительных органов – наоборот. До какой степени следует обрабатывать данные внутри системы, чтобы добиться большей обезличенности? Некоторые компании утверждают, что удаляют часть IP-адреса для каждого запроса (обычно крайний правый байт), но этого может не хватить для анонимизации клиента. Насколько обширный доступ к такой информации нужно давать правительственным учреждениям? А что раскрывать, если подадут гражданский иск? Ответы на эти вопросы далеко не очевидны.

В журналах AOL попадались пугающие запросы (например, «как убить своего супруга»), поэтому вполне уместна идея, что в определенных ситуациях стоит открывать правоохранительным органам доступ к этим записям. Но где провести черту – не совсем понятно. Между тем существует горстка поисковых систем, которые утверждают, что не хранят журналы запросов. Наиболее распространенная из них – DuckDuckGo.

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

Описанный выше пример ярко высветил эту проблему повторной идентификации. В 1997 году Латанья Суини, тогда аспирант МТИ, изучила якобы анонимизированные медицинские карты 135 000 государственных служащих Массачусетса. Эти данные обнародовала государственная комиссия по страхованию: они предназначались для проведения исследований, и их даже продали одной частной компании. Каждая карта, помимо различной информации, включала в себя дату рождения, пол и текущий почтовый индекс. Суини нашла шесть человек, которые родились 31 июля 1945 года: трое из них были мужчинами, но только один жил в Кембридже. Сопоставив такие сведения с общедоступным списком регистрации избирателей, она смогла идентифицировать Уильяма Уэлда, на тот момент губернатора Массачусетса.

И это не единичный случай. В 2014 году Комиссия по такси и лимузинам Нью-Йорка опубликовала анонимизированный набор данных обо всех 173 миллионах поездок на такси в городе в 2013 году. Но обработку выполнили некачественно, что позволило определить ход процесса, обратить его и заново привязать информацию о каждой машине к поездкам на основании номера «бляхи» – лицензии такси^135. Предприимчивый стажер по аналитике данных тогда же обнаружил, что можно найти фотографии знаменитых людей, садящихся в такси, где виден номер лицензии. Этого хватило для воссоздания подробностей о десятке поездок, вплоть до суммы чаевых.

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

11.5. Облачные вычисления

Вспомните модель вычислений, описанную в главе 6. У вас есть персональный компьютер – один или несколько. Вы запускаете отдельные приложения для выполнения разных задач – например, Word для работы с документами, Quicken или Excel для расчета личных финансов и iPhoto для обработки фотографий. Программы работают на вашем компьютере, но при этом могут связываться через интернет с некоторыми службами. Время от времени вы закачиваете новую версию с исправленными ошибками, а иногда покупаете обновления, чтобы получить новые функции.

Суть этой модели заключается в том, что программы и их данные обитают на ваших компьютерах. Если вы измените файл на одной машине, а затем он понадобится вам на другой, то придется переносить его самому. Если окажется, что вам нужен файл, который хранится на компьютере дома, а вы сейчас в офисе или в путешествии, то вам не повезло. Если вам требуется работать с Excel или PowerPoint и на ПК с Windows, и на Мас, то придется купить программу для каждого. И ваш телефон не будет никак с ними связан.

В настоящее время нормой стала другая модель: использование браузера или смартфона для доступа и обработки информации, хранящейся на интернет-серверах. Самые распространенные примеры здесь – почтовые сервисы, например Gmail или Outlook. Вы можете зайти в почту с любого компьютера или телефона. Хотя вы вправе выгрузить туда послание, написанное локально, или скачать письмо в локальную файловую систему, в большинстве случаев вы просто оставляете всю информацию «лежать» у поставщика услуги. Вы не получаете уведомлений об обновлениях программы, однако в ней иногда появляются новые функции. Мы часто поддерживаем связь с друзьями и просматриваем их фотографии через Facebook[120] – так вот, сообщения и изображения сохраняются на этой платформе, а не на вашем компьютере. Подобные сервисы бесплатны. Единственная «видимая» стоимость заключается в том, что порой вам показывают рекламу, пока вы читаете письмо или просматриваете ленту друзей.

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

Почта и социальные сети – наиболее распространенные облачные сервисы, но существует множество других, таких как Dropbox, Twitter, LinkedIn, YouTube и онлайн-календари. Данные размещаются не локально, а в облаке, то есть на оборудовании поставщика услуг: почта и календарь находятся на серверах Google, фотографии – на серверах Dropbox или Facebook[121], резюме – на LinkedIn и так далее.

Рис. 11.7. Облако^137

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

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

Возникает интересный вопрос: заработают ли когда-нибудь облачные инструменты настолько хорошо, что вытеснят настольные версии? Несложно представить, как обеспокоена Microsoft – она ведь получает значительную часть доходов от Office, и к тому же эти программы работают в основном на Windows, на которую приходится большая часть остального заработка компании. Текстовым редакторам и электронным таблицам на базе браузера не нужна платформа от Microsoft, поэтому они угрожают обоим ключевым направлениям ее бизнеса. На данный момент Google Docs и подобные системы не предоставляют всех возможностей Word, Excel и PowerPoint, однако история технологического прогресса изобилует примерами, когда появлялась явно худшая система, набирала новых пользователей, которым хватало и ее возможностей, и постепенно съедала действующего лидера. Очевидно, Microsoft хорошо осведомлена об этой проблеме, поэтому теперь предлагает облачную версию пакета, названную Office 365.

Веб-сервисы нравятся Microsoft и другим поставщикам, поскольку в них легко вводить модель подписки, то есть заставлять пользователей регулярно оплачивать доступ. Но возможно, что потребители предпочтут один раз приобрести ПО и при необходимости покупать обновления. На своих старых Mac я до сих пор использую версию Microsoft Office 2008 года. Она работает прекрасно и (к чести Microsoft) все еще иногда получает «заплатки» безопасности, поэтому я не спешу ничего менять.

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

В облачных вычислениях могут применяться разные компромиссные решения в плане того, где выполняются вычисления, и тем, где находится информация во время обработки. Один из способов сделать код JavaScript независимым от типа браузера – включить проверку условия в сам код, например «если браузер – Firefox версии 75, то сделайте это, если Safari 12, сделайте то, иначе сделайте что-то третье». Такой код очень громоздкий, следовательно, для того чтобы переслать программу JavaScript клиенту, потребуется большая пропускная способность, а дополнительные проверки замедлят работу браузера. В качестве альтернативы сервер может запросить у клиента, какой браузер используется, а затем отправить код, адаптированный к данной версии. Возможно, такой код будет более компактным и запустится быстрее, хотя для небольшой программы разница окажется незначительной.

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

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

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

Это не гипотетические вопросы. Будучи университетским профессором, я по необходимости обладаю доступом к персональной информации студентов: прежде всего к оценкам, конечно, но порой и к важным данным личного и семейного толка. Все это приходит по почте и хранится в компьютере университета. Не нарушу ли я закон, если буду держать мои файлы с оценками и переписку в «облаке» от Microsoft? Если по какой-либо моей оплошности эта информация станет достоянием всего мира, что произойдет? А если некое правительственное учреждение потребует от Microsoft предоставить сведения об одном или нескольких студентах?138 Я не юрист и не знаю ответов, но беспокоюсь из-за всего этого и стараюсь не пользоваться облачными сервисами ни при работе с данными об учениках, ни при общении с ними. Я храню такие материалы на компьютерах университета, поэтому, если из-за небрежности или ошибки сотрудников наружу просочится что-то конфиденциальное, у меня будет хоть какая-то защита от обвинений в ответственности. Конечно, если я сам совершу оплошность, то уже неважно, где именно содержались сведения.

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

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

Если для личной корреспонденции вы, как и большинство людей, используете интернет-провайдера или облачные службы (например, Gmail, Outlook, Yahoo и многие другие), они обещают вам защиту персональных данных. Как правило, такие сервисы публично заявляют, что электронная почта их клиентов не подлежит оглашению и ни один человек не будет ее просматривать или раскрывать, разве что в случае запроса от судебного органа. При этом они обычно не затрагивают тему того, насколько решительно будут сопротивляться тем требованиям о предоставлении информации, которые кажутся слишком абстрактными, или неофициальным просьбам в обертке «интересов национальной безопасности». Вы зависите от того, готов ли ваш провайдер выдержать мощное давление. В США правительство стремится облегчить доступ к почте: до 11 сентября их стремление объяснялось борьбой с организованной преступностью, а после – войной с терроризмом. Натиск подобного рода возрастает равномерно, а после каждого теракта резко усиливается.

Например, в 2013 году небольшой компании Lavabit, которая предоставляла клиентам защищенную электронную почту, приказали установить на ее сети систему наблюдения, чтобы правительство США получило доступ к корреспонденции. Власти также распорядились передать им ключи шифрования и велели владельцу фирмы Ладару Левисону ничего не сообщать абонентам. Левисон отказывался, утверждая, что не соблюдена надлежащая правовая процедура. В итоге он предпочел закрыть компанию, а не открывать доступ к письмам своих клиентов^139. Со временем стало очевидно, что правительство интересовали сведения лишь об одном аккаунте – Эдварда Сноудена^140.

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

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

Какие обязанности перед клиентами берет на себя поставщик услуги? Когда он будет стоять на своем и бороться, а когда уступит угрозам привлечения к ответственности или негласным просьбам «властей»? Таких вопросов возникает множество, а четких ответов совсем мало. Государство и частные лица всегда хотят получать больше сведений о других, но при этом стараются ограничить доступ к данным о себе. Ряд крупных игроков, включая Amazon, Facebook[122] и Google, теперь публикуют «отчеты о прозрачности»: там указывается приблизительное количество запросов правительства, в которых оно требует удалить информацию, предоставить данные о пользователях, устранить нарушения авторских прав или произвести схожие действия. Помимо прочего, в этих докладах имеются заманчивые намеки на то, как часто крупные коммерческие организации дают отпор и на каких основаниях. Например, в 2019 году Google получил от правительств разных стран более 160 000 запросов о предоставлении сведений, касающихся примерно 350 000 аккаунтов пользователей. Примерно в 70 % из них компания раскрыла «некоторые данные». Facebook[122] сообщает о примерно таком же количестве запросов и разглашений^141.

11.6. Краткие выводы

При помощи технических средств мы создаем объемные потоки детализированных данных – гораздо более крупные, чем нам кажется. Все эти сведения перехватывают для коммерческого использования: передают, комбинируют, изучают и продают с гигантским размахом. Такой «взаимовыгодный обмен» позволяет нам пользоваться ценными услугами вроде веб-поиска, социальных сетей, приложений на телефоне и безлимитных хранилищ в Сети, бесплатный доступ к которым мы принимаем как должное. Общественность становится все более осведомленной (хотя и недостаточно) о масштабах сбора данных. Рекламодатели уже стали обращать внимание, что многие сейчас применяют блокировщики рекламы. Это вполне разумно, поскольку рекламные сети часто, пусть и непреднамеренно, становятся источниками вредоносных программ. Но не совсем понятно, что произойдет, если все подключат Ghostery и Adblock Plus. Перестанет ли Сеть в ее нынешнем виде работать, или кто-нибудь изобретет альтернативные бизнес-модели для поддержки Google, Facebook[123] и Twitter?

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

Очень эффективный рекламный слоган AT&T из начала 1980-х гласил: «Протяни руку и коснись кого-нибудь». Интернет, электронная почта, текстовые сообщения, социальные сети и облачные вычисления – все это упрощает задачу. Иногда все работает просто замечательно: вы можете находить друзей, общаться по интересам в гораздо более обширных сообществах, чем при личных встречах. Однако же, протягивая руку, вы становитесь видимым и доступным для всего мира, где далеко не каждый желает вам добра. Так вы открываете двери для спама, мошенничества, шпионских программ, вирусов, отслеживания, полицейского надзора, кражи персональных данных, утраты конфиденциальности и даже денег. Будьте осторожны – это разумно.

12. Искусственный интеллект и машинное обучение

Если компьютер начнет думать, учиться и создавать, то это будет заслуга программы, которая наделяет его этими способностями. <…> Именно программа будет каким-либо образом анализировать свою производительность, диагностировать свои сбои, вносить изменения, которые усилят ее эффективность.

Герберт А. Саймон.

Новая наука об управленческих решениях[124], 1960

Мои коллеги изучают искусственный интеллект, а я изучаю естественную глупость.

Амос Тверски (1937–1996), основатель современной поведенческой экономики.

Цитируется в журнале Nature[125], апрель 2019

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

Эффективный ИИ – явление сравнительно новое, хотя историческими корнями оно уходит в 1950-е годы. Сегодня эта сфера представляет собой слияние модных словечек, шумихи, ложного оптимизма и довольно большого количества реальных достижений. Искусственный интеллект, машинное обучение и обработка естественного языка оказались очень успешными в игровой сфере (программы для в шахмат и го превосходят в мастерстве лучших гроссмейстеров), восприятии и синтезе речи (вспомните Alexa и Siri), машинном переводе, распознавании изображений и компьютерном зрении, а также робототехнических системах вроде автомобилей с автономным управлением. Системы рекомендаций, применяемые в Netflix и Goodreads[126], подсказывают людям новые фильмы и книги, а списки сопутствующих товаров на Amazon явно способствуют повышению доходов компании. Достойно трудятся и системы обнаружения спама, хотя им суждено вечно бороться со все новыми методами рассылки.

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

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

Искусственный интеллект — обширный термин, используемый в ситуациях, когда мы поручаем ЭВМ выполнить задания, с которыми вроде бы способны справиться только люди. «Интеллект» – это то, что мы приписываем себе, а «искусственный» означает, что делом занимается компьютер.

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

МаО – это не методы статистики, хотя у них есть что-то общее. Если очень сильно упростить, то в статистическом анализе мы предполагаем, что данные соответствуют некоторой модели, а затем пытаемся выявить параметры закономерности, в которую они укладываются наилучшим образом. Система машинного обучения, напротив, не выстраивает модель, а старается найти связи между самими сведениями. Обычно МаО применяют к большим наборам данных. Статистический анализ и машинное обучение – вероятностные методы, то есть существует некоторая вероятность того, что данные ими ответы верны, но нет никаких гарантий правильности^142.

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

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

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

12.1. Историческая справка

На раннем этапе развития ЭВМ, в середине XX века, люди начали задумываться о том, как использовать компьютеры для выполнения задач, обычно подвластных только человеку. Одной из очевидных целей стало применение машин для игры в шашки и шахматы. Они удобны тем, что имеют четко определенные правила, к тому же ими увлечено множество людей, в том числе настоящих мастеров. Еще одной целью выбрали перевод с одного языка на другой. Такая задача сложнее, но и важнее. Например, машинный перевод с русского на английский приобрел колоссальное значение в эпоху холодной войны. Нашлись и иные области применения: это распознавание и генерация речи, математические и логические обоснования, принятие решений и процессы обучения.

На такие разработки охотно выделяли финансирование, и зачастую оно поступало от правительственных органов, таких как Министерство обороны США. Мы уже знаем, какую важную роль сыграла его поддержка первых исследований сетей, приведших к созданию интернета. Изыскания в области ИИ стимулировались примерно так же, и средств на них не жалели.

Я думаю, что научную деятельность, связанную с темой ИИ в 1950-х и 1960-х годах, вполне справедливо охарактеризовать как «наивно-оптимистическую». Ученым казалось, что прорывы не за горами. Через каких-то 5 или 10 лет компьютеры станут делать точные переводы с одного языка на другой и побеждать лучших шахматистов-людей.

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

Применять ИИ почти в любой области оказалось сложнее, чем предполагалось, поэтому слова «нужно еще 5-10 лет» звучали постоянно. Когда выяснилось, что результаты получились скудными, а выделенные деньги кончились, поле работы забросили на 10–20 лет. Впоследствии этот период назвали «зимой ИИ». Затем, в 1980-х и 1990-х годах, начали применять новые методы – экспертные, или основанные на правилах системы^144.

В данном случае эксперт предметной области записывает множество правил, программист преобразует их в код, а компьютеры выполняют на их основе какое-либо задание. Среди прочего подобные системы обширно применялись для медицинской диагностики. Врачи создавали правила, по которым определялось, какой недуг у пациента, а затем программы устанавливали болезнь. Они поддерживали и дополняли реальных специалистов, а в теории даже могли заменить докторов. Например, одна из первых систем – MYCIN[127] – разработана для диагностики кровяных инфекций. Она использовала около 600 правил и справлялась не хуже, чем врач общей практики. MYCIN создал Эдвард Фейгенбаум, один из пионеров экспертных систем, и в 1994 году он получил премию Тьюринга за свои труды над искусственным интеллектом.

Экспертные системы действовали по-настоящему успешно, в том числе в службах поддержки клиентов, обслуживании и ремонте механических систем и в других узких областях. Но со временем стало ясно, что у них есть серьезные ограничения. Дело в том, что на практике трудно создать всеобъемлющий набор правил, к тому же из них слишком много исключений. Метод плохо масштабировался для объемных задач или новых проблемных областей. Если улучшалось понимание процесса или менялись условия, директивы приходилось обновлять. Представьте, например, как изменились правила принятия решений для врачей в 2020 году, когда к ним стали приходить пациенты с высокой температурой, болью в горле и сильным кашлем. Если раньше такие симптомы указывали на простуду, возможно, с небольшими осложнениями, то сейчас вполне вероятен COVID-19 – острозаразное заболевание с серьезными рисками для пациентов и медицинских работников.

12.2. Классическое машинное обучение

Основная идея МаО – дать алгоритму большое количество примеров и позволить ему «учиться» самостоятельно. Здесь люди не устанавливают правила и не программируют напрямую решение определенных задач. В самом простом случае мы предоставляем программе обучающий набор примеров, в которых отмечены правильные значения. В частности, вместо того чтобы придумывать правила для распознавания цифр, написанных от руки, можно обучать алгоритм на большом количестве образцов, к каждому из которых приложено его численное значение. Алгоритм, опираясь на свои успехи и неудачи, узнаёт, как комбинировать характерные признаки обучающих элементов, чтобы получать наилучшие результаты. Конечно, не факт, что они точно будут «лучшими». Хотя алгоритмы МаО стремятся увеличить вероятность получения хорошего результата, но не гарантируют совершенства.

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

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

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

Распознавание рукописных цифр – хорошо изученная задача. Национальный институт стандартов и технологий США (НИСТ, NIST[128]) предоставляет общедоступный набор тестов, содержащий 60 000 обучающих изображений и 10 000 тестовых изображений. На рис. 12.1 показана небольшая выборка. Системы машинного обучения хорошо справляются с этими данными: на открытых конкурсах они показывали частоту ошибок менее 0,25 %, то есть неверно определялся примерно один из 400 символов.

Рис. 12.1. Выборка рукописных цифр НИСТ (взято из «Википедии»)

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

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

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

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

Рис. 12.2. Кластеризация для выявления аномалий

У неконтролируемого обучения есть преимущество – для него не нужно подготавливать размеченные обучающие данные, что порой требует больших затрат, но это применимо не ко всем ситуациям. Здесь надо выделить набор полезных признаков, по которым формируются скопления, и, конечно, заранее предполагать, сколько примерно их получится. Вот пример из личного опыта: однажды я посмотрел, что произойдет, если применить стандартный алгоритм кластеризации методом к-сред-них, чтобы разбить около 5000 изображений лиц на два скопления. Я наивно полагал, что он разделит людей на группы по полу. Эмпирически это оказалось правильным в 90 % случаев, но мне не удалось понять, на чем основывались его выводы, а в ошибках не нашлось очевидных закономерностей.

12.3. Нейронные сети и глубокое обучение

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

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

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

Идея нейронных сетей не нова, но первые работы с ними не принесли полезных результатов, и концепция попала в немилость. Однако в 1980-х и 1990-х годах группа ученых продолжила их изучение и, вопреки ожиданиям, к началу 2000-х искусственные НС, выполнявшие такие задачи, как распознавание изображений, стали давать более точные результаты, чем лучшие методы из применявшихся в то время. Все последние сдвиги в машинном обучении связаны именно с нейронными сетями. Ну, а те трое настойчивых ученых – Йошуа Бенжио, Джеффри Хинтон и Ян Лекун – удостоились премии Тьюринга за 2018 год^145.

Рис. 12.3. Искусственная нейронная сеть с четырьмя слоями

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

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

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

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

Глубокое обучение особенно успешно проявило себя при решении задач компьютерного зрения, когда машина определяет объекты на изображениях, а иногда распознает точно заданные шаблоны вроде человеческих лиц. Например, Google Maps в режиме просмотра выявляет и размывает черты людей, регистрационные знаки машин, а иногда и номера домов. Данный вариант – очень простая разновидность общей проблемы распознавания конкретных лиц, поскольку не произойдет ничего страшного, если алгоритм «замылит» больше, чем нужно.

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

В то же время именно распознавание лиц вызывает наибольшие опасения. Самая очевидная тревога – значительное усиление полицейского надзора^146, но также есть опасность скрытой дискриминации. В случае небелокожих людей большинство систем распознавания лиц работает менее точно, поскольку обучающие изображения недостаточно разнообразны. В 2020 году на фоне всемирных протестов против расизма крупные компании объявили о планах полностью уйти из этой области (IBM^147) или ввести мораторий на поставку соответствующей технологии правоохранительным органам (Amazon^148, Microsoft). Ни одна из этих корпораций не относилась к крупным игрокам в бизнесе распознавания лиц, поэтому эффект получился незначительным, но, возможно, их символический шаг – знак того, что они в целом чувствуют ответственность.

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

Первой программой, которая победила профессионального игрока в го, стала AlphaGo, разработанная компанией DeepMind (позже ее приобрел Google). За ней быстро последовала AlphaGo Zero, значительно более сильная, а потом вышла AlphaZero. Последняя могла состязаться не только в го, но и в шахматы, и в японскую настольную игру сёги, не уступающую им по сложности. AlphaZero обучалась, играя сама с собой, и после дня тренировок сумела одолеть Stockfish, лучшую из традиционных шахматных программ. Матч из 100 партий принес ей 28 побед, 72 ничьи и 0 поражений.

AlphaZero основана на форме глубокого обучения, которая называется обучением с подкреплением. Она использует обратную связь от внешней среды (в случае игр – проиграла она или победила), чтобы постоянно улучшать свои результаты. Ей не нужны обучающие данные, поскольку среда сама указывает программе, верны ли ее действия, или просто подталкивает ее в нужном направлении.

Если вы хотите сами поставить опыты с машинным обучением, то загляните на сайт teachablemachine. withgoogle.com от Google. Там несложно устроить эксперименты с такими задачами, как распознавание изображений или звуков.

12.4. Обработка естественного языка

Обработка естественного языка (ОЕЯ) – это подраздел машинного обучения, в рамках которого рассматривается, как поручить компьютерам обрабатывать человеческие языки. Требуется, чтобы машина понимала значение текста, умела излагать его суть, переводить на другой язык, преобразовывать письменный текст в устную речь (и обратно) и даже генерировать осмысленные наборы предложений, выглядящие так, словно их написал человек. Сегодня мы встречаемся с ОЕЯ в голосовых системах вроде Siri и Alexa, которые распознают речь и превращают ее в текст, соображают, о чем их спросили, ищут нужные данные, а затем синтезируют естественно звучащий ответ.

Может ли компьютер рассказать нам о содержании документа, о том, что оно означает или как соотносится с нашей работой? Способна ли машина создать точное резюме или конспект объемного текста? Удастся ли компьютеру найти релевантные или связанные между собой документы – например, разные точки зрения на одну и ту же новость или как-то пересекающиеся судебные дела? Сумеет ли он безошибочно обнаружить плагиат? На все эти вопросы найдутся ответы, когда компьютеры научатся лучше понимать язык.

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

Мы могли бы наивно предположить, что достаточно сосчитать слова с положительной («замечательный», «великий», «стабильный», «гениальный») и отрицательной окраской («ужасный», «тупой»), а затем отобразить разницу. Но такой подход даже отдаленно не отражает тонкостей языка. Даже с простыми отрицаниями возникнут проблемы («Он не стабилен и не гениален»), а с иронией или сарказмом («Его вряд ли можно назвать замечательным») всё гораздо запутаннее.

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

Одной из первых попыток взаимодействия с компьютером на естественном языке стала программа «Элиза», которая имитировала беседу между пациентом и роджерианским психологом[129]. «Элизу» создал профессор МТИ Джозеф Вейценбаум в 1966 году, и она оказалась на удивление дееспособной, по крайней мере при первом знакомстве. В интернете есть множество симуляторов «Элизы», и, хотя поиграть с ними несколько минут очень интересно, их слабые стороны быстро становятся очевидными. На рис. 12.4 показан пример беседы с одним из них^149.

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

Расскажите вкратце, чем я могу вам помочь. Вы можете произнести «выставление счетов», «ремонт», «заказы» или «что-то еще».

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

Рис. 12.4. Беседа с «Элизой»

Сложные системы, которые основаны на языковых моделях, созданных путем обучения на большом объеме текста, способны генерировать более качественные ответы, хотя не при прямом общении с людьми. Один из интересных примеров – программа Talk to Transformer^150, которая генерирует правдоподобные продолжения начальной фразы, заданной пользователем. Ее БД включает 8 миллионов веб-страниц, и она пытается предсказать следующее слово по закономерности, выведенной из всех предыдущих. Результат обычно получается вполне правдоподобным, а иногда очень хорошим. Вот два варианта ответа на введенное мной предложение «Писать книгу – тяжелая работа».

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

Писать книгу – тяжелая работа. И важно сделать это правильно, чего не понимают многие писатели. Я потратил годы жизни, пытаясь создать «Книгу, которую я хочу написать». За последний год моя новая книга «Как сделать все правильно с первого раза» пользовалась бешеным успехом. Я получил слова благодарности и одобрения от моих редакторов и читателей.

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

Рассмотрим иную давнюю проблему – перевод с одного естественного языка на другой. Еще в 1950-х годах люди уверенно предсказывали, что проблема будет решена в 1960-х, затем крайний срок сдвинулся на 1970-е. Но, к сожалению, мы еще не достигли цели, хотя ситуация значительно улучшилась благодаря огромной вычислительной мощности и объемным наборам текста, которые можно применять для создания алгоритмов при машинном обучении.

Рис. 12.5. Три стихотворения. Какие из них написала программа, а какие – человек?

Классическое упражнение – перевести присловье The spirit is willing but the flesh is weak[130] на русский и затем обратно на английский. Рассказывают (возможно, в шутку), что раньше перевод получался следующий: The vodka is strong but the meat is rotten (то есть «Водка крепкая, а вот мясо протухло»).

Сегодня Google Translate предлагает иной вариант, показанный на рис. 12.6. Он звучит лучше, но еще далек от совершенства, поэтому очевидно, что задача машинного перевода еще не решена. (Алгоритм Google быстро меняется, поэтому вы можете получить немного другой результат.)

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

Рис. 12.6. Перевод с английского на русский и обратно

12.5. Краткие выводы

Машинное обучение – это не панацея. Остается еще много открытых вопросов о том, насколько хорошо оно работает, а особенно о том, как объяснять полученные результаты. В комиксе xkcd[131] на рисунке 12.7 это прекрасно обыгрывается.

Рис. 12.7. xkcd.com/1838 о машинном обучении

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

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

К сожалению, это всего лишь привлекательная городская легенда, как установлено Гверном Бранвеном на https://gwern.net/tank. Впрочем, пусть история и выдумана, она дает нам полезное предостережение: следите, чтобы какой-нибудь нерелевантный артефакт не ввел нас в заблуждение.

Могут ли алгоритмы машинного обучения показать себя лучше, чем определяется их данными? Известно, что Amazon отказалась от внутреннего инструмента, который использовался для подбора персонала, поскольку он явно демонстрировал предвзятое отношение к кандидатам-женщинам. Его модели оценивали претендентов по шаблонам, выведенным на основании резюме за прошлый 10-летний период. Но большинство тех кандидатов были мужчинами, а для текущего набора претендентов обучающие данные оказались нерепрезентативными. В результате алгоритм научился отдавать предпочтение кандидатам мужского пола. Иными словами, ни одна система ИИ или МаО не способна «поступать» лучше, чем детерминировано ее входными данными, и высока вероятность того, что она просто воспроизведет предвзятость, заложенную в тренировочный набор.

Например, системы компьютерного зрения способны распознавать лица, иногда с достаточно высокой точностью. Обычно это применяется в полезных целях (например, чтобы разблокировать ваш телефон или открыть дверь кабинета), но иногда – в сомнительных. Умные системы дверных звонков, такие как Amazon Ring, могут отслеживать, что происходит рядом с вашим домом, и при обнаружении чего-то настораживающего отправлять оповещения вам и местной полиции. Однако если она начнет отмечать цветных людей в преимущественно белом районе как «подозрительных», то мы получим что-то вроде роботизированного расизма.

Подобные опасения привели к тому, что в середине 2020 года Amazon приостановила использование органами правопорядка своего ПО Recognition^151. Это произошло во время массовых протестов против жестокости полиции и расовых предрассудков в США. Вскоре в суд поступило несколько исков против компании Clearview AI, которая создала базу данных лиц на основе миллиардов фотографий из интернета и открыла доступ к ним для правоохранительных органов. Clearview заявляет, что сбор общедоступной информации защищен положениями о свободе слова Первой поправки^152.

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

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

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

(Первое и последнее стихотворения на рис. 12.5 написаны людьми, их авторы – Пауль Целан и Гертруда Стайн соответственно. Среднее сгенерировано программой Рэя Курцвейла[132] «Кибернетический поэт» (Cybernetic Poet), которая доступна на https://www.kurzweilcyberart.com/154.)

13. Конфиденциальность и безопасность

В любом случае у вас нулевая конфиденциальность. Смиритесь.

Скотт Макнили, генеральный директор Sun Microsystems, 1999

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

Гленн Гринвальд.

Негде спрятаться[133], 2014

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

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

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

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

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

13.1. Криптография

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

На протяжении тысячелетий к криптографии прибегали для обмена частной информацией с другими сторонами. Юлий Цезарь использовал простую схему шифрования (представьте себе, ее называют «шифром Цезаря»), сдвигая буквы в тайных посланиях на три позиции, так что А превращалось в D, В – в Е и так далее. Сообщение HI JULIUS кодировалось бы как KL MXOLXV. Этот алгоритм можно встретить в программе rotl3, которая сдвигает буквы на 13 позиций. Он применяется в телеконференциях, чтобы скрыть спойлеры и оскорбительные материалы от случайных просмотров, а не для каких-либо криптографических целей. (Подумайте, почему смещение на 13 знаков удобно для текстов на английском языке.)

Тайнопись имеет долгую историю, часто красочную и иногда опасную для тех, кто надеялся сохранить свои секреты благодаря шифрованию. Так, в 1587 году Мария Стюарт, королева Шотландии, лишилась головы из-за некачественной криптографии. Она обменивалась посланиями с заговорщиками, которые хотели свергнуть Елизавету I и посадить Марию на трон. Их шифр взломали, заговор и имена его участников раскрыли с помощью атаки через посредника. Их ждала такая судьба, что обезглавливание в сравнении с ней выглядит гуманным^155. В 1943 году адмирал Исороку Ямамото, главнокомандующий Объединенным флотом Японии, погиб из-за того, что криптографическая система империи оказалась недостаточно надежной. Американская разведка узнала планы полета Ямамото, а пилоты смогли сбить его транспортник. Также утверждается, хотя и не везде признается, что Вторая мировая война продлилась значительно меньше, чем могла бы, потому что Британия, полагаясь на вычислительные методы и знания Алана Тьюринга, смогла разгадать код в немецких военных сообщениях, зашифрованных с помощью машины «Энигма» (рис. 13.1).

Рис. 13.1. Немецкая шифровальная машина «Энигма»156

Основная идея криптографии заключается в том, что Алиса и Боб хотят переписываться, но так, чтобы злоумышленники не разгадали содержимое посланий, даже если сумеют прочесть их. В таком случае Алисе и Бобу нужен какой-то общий секрет для кодирования и расшифровки сообщений, чтобы они понимали смысл текста, а посторонние – нет. Такой секрет называется ключом. В шифре Цезаря, например, его роль играет промежуток, на который сдвигается алфавит, – например, 3 для замены A на D, и так далее. Для такого сложного механического шифратора, как «Энигма», ключ – это комбинация расположения нескольких кодовых колес и подключения набора штекеров. А для современных компьютерных систем шифрования ключ выглядит как большое секретное число, используемое в алгоритме. Тот преобразует биты сообщения таким образом, что их невозможно раскодировать, если не знать это число.

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

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

В данной области жизненно необходима открытая разработка. Для поиска уязвимостей в криптосистемах нужны опыт и навыки как можно большего количества экспертов. Но даже тогда будут сомнения, что система в порядке. Спустя долгое время после первоначальной разработки и анализа может проявиться уязвимость на уровне алгоритма. В коде, вставленном случайно или злонамеренно, вылезут ошибки. Кроме того, порой предпринимаются осознанные попытки ослабить криптосистемы – как в том случае, когда АНБ пыталось определить принципиальные параметры одного генератора случайных чисел, используемого в важном стандарте шифрования^157.

13.1.1. Криптография с секретным ключом

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

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

секретные ключи, подбирая тот, что применялся для шифрования. Времени может уйти много: если ключ содержит N бит, объем работ будет примерно пропорционален 2N. Однако «грубая сила» не то же самое, что «тупая». Злоумышленник будет пробовать сначала короткие и вероятные ключи, а потом длинные и маловероятные. Например, в атаке по словарю перебираются широкоупотребимые слова и сочетания чисел, такие как «пароль» и «12345». Если люди поленились или небрежно отнеслись к выбору ключей, то такое нападение окажется успешным.

До начала 2000-х годов самым распространенным криптографическим алгоритмом с секретным ключом был Data Encryption Standard[134], или DES, разработанный IBM и АНБ в начале 1970-х. Существовали подозрения, что АНБ тайно встроила в него лазейку, бэкдор, чтобы зашифрованные по DES сообщения удавалось быстро раскодировать, но это так и не подтвердилось^158. Так или иначе, DES давал 56-битный ключ, поэтому, когда ЭВМ стали быстрее, он показался слишком коротким. К 1999 году ключ DES получалось взломать методом перебора за день вычислений с помощью сравнительно недорогого компьютера специального назначения. Это привело к созданию новых алгоритмов с более длинными ключами.

Самый распространенный из них – Advanced Encryption Standard[135], или AES. Его разработали в рамках всемирного открытого конкурса, спонсируемого Национальным институтом стандартов и технологий США (НИСТ). Там представили несколько десятков алгоритмов co всего мира, причем все они открыто тестировались и обсуждались. Победителем стал Rijndael, созданный бельгийскими криптографами Йоаном Даменом и Винсентом Райменом, после чего в 2002 году его приняли как официальный стандарт правительства США. Это общедоступный алгоритм, то есть любой желающий вправе использовать его без лицензий или сборов. AES поддерживает три длины ключей: 128, 192 и 256 бит. Значит, потенциальных ключей много, и атаки «грубой силой», скорее всего, не будут иметь смысла еще долгие годы, разве что найдется какое-нибудь слабое место AES.

Давайте даже посчитаем для наглядности. Если специализированный процессор, такой как GPU, способен выполнять 10^13 операций в секунду, то миллион графических процессоров производят 10^19 операций в секунду, или около 3 × 10^26 в год, что составляет примерно 2^90. Это значение намного меньше, чем 2^128, так что даже 128-битный ключ наверняка защищен от атаки методом перебора.

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

13.1.2. Криптография с открытым ключом

Системы КрОК работают по совершенно иному принципу, выведенному в 1976 году Уитфилдом Диффи и Мартином Хеллманом в Стэнфорде при использовании некоторых идей Ральфа Меркла. В 2015-м Диффи и Хеллман получили премию Тьюринга за свое достижение. Правда, на несколько лет раньше них данный принцип независимо обнаружили Джеймс Эллис и Клиффорд Кокс – два криптографа из британского разведывательного управления GCHQ[136]. Но их работу не рассекречивали вплоть до 1997 года, поэтому они не могли опубликовать результаты, а иначе удостоились бы куда больших почестей.

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

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

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

Боб расшифровывает послание Алисы с помощью своего секретного ключа, который известен только ему. Это единственный способ прочитать сообщение, закодированное посредством его открытого ключа (см. рис. 13.2). Если он хочет отправить зашифрованный ответ Алисе, он использует открытый ключ Алисы. И снова Ева может увидеть письмо, но только в кодированном виде, нечитаемом для нее. Алиса же расшифрует ответ Боба своим секретным ключом, который знает только она.

Рис. 13.2. Алиса отправляет Бобу зашифрованное сообщение

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

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

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

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

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

У криптографии с открытым ключом есть и другие полезные свойства. Например, ее можно использовать в электронной цифровой подписи. Предположим, Алиса хочет подписать сообщение, чтобы получатель был уверен, что оно пришло от нее, а не от мошенника. Если она зашифрует послание своим секретным ключом (СК) и отправит результат, то любой сможет прочитать его с помощью ее открытого ключа. А если СК Алисы обладает только она сама, значит, сообщение могла закодировать только она. Очевидно, это не сработает в том случае, если ее СК попал не в те руки.

Давайте посмотрим, как Алиса обрабатывает личное послание для Боба, чтобы его никто больше не мог прочитать, а адресат не сомневался, что оно пришло от нее. Алиса сначала подписывает сообщение Бобу своим СК, затем шифрует всё вместе открытым ключом адресата. Ева может заметить, что Алиса что-то отправляет Бобу, но декодировать послание сумеет только Боб. Он расшифровывает «внешнее» сообщение своим секретным ключом, а «внутреннее» – открытым ключом Алисы и так удостоверяется, что письмо от нее^160.

КрОК, конечно, не решает все задачи. Если секретный ключ Алисы раскроют, то посторонние смогут прочесть все ее сообщения, отправленные ранее, а ее подписи будут вызывать подозрение. Отозвать ключ (то есть объявить, что он больше не действителен) сложно, хотя в большинстве схем создания ключа в него добавляются сведения о дате генерации и сроке окончания его действия. Но тут помогает техника прямой секретности. Каждое отдельное сообщение шифруется разовым паролем, как описано выше, а затем пароль очищается. Если разовые пароли сгенерированы так, что злоумышленнику не удастся их воссоздать, то, даже узнав пароль для одного послания и взломав секретный ключ, он не сумеет расшифровать предыдущие или будущие сообщения.

Наиболее широко используемый алгоритм с открытым ключом называется RSA – по первым буквам фамилий Рональда Ривеста, Ади Шамира и Леонарда Адлемана (Rivest, Shamir, Adleman), ученых-информатиков из МТИ, которые изобрели его в 1978 году. Математическая основа RSA – сложность разложения больших составных чисел[137] на множители. В RSA генерируются большие целые числа, состоящие как минимум из 500 десятичных цифр. Получают их перемножением двух больших простых чисел, каждое из которых примерно вдвое короче произведения. Полученные числа затем используются в качестве основы для открытого и секретного ключей. Тот, кто знает множители («держатель секретного ключа»), сможет быстро расшифровать сообщение, а вот другим, по сути, придется раскладывать на множители большое целое число. Считается, что при нынешней скорости вычислений это невозможно. За изобретение алгоритма RSA его создатели в 2002 году получили премию Тьюринга.

Важное значение имеет длина ключа. Насколько нам известно, объем работы по вычислению множителей большого простого числа, которое равно произведению двух простых чисел примерно одинакового размера, быстро растет при увеличении их длины, поэтому решение данной задачи невозможно. RSA Laboratories, компания-правообладатель патента на RSA, с 1991 по 2007 год проводила конкурс по разложению на множители. Она публиковала списки составных чисел, всякий раз увеличивая их длину, и предлагала денежный приз первому, кто справится с задачей. Наименьшие числа состояли примерно из 100 десятичных цифр, и их разложили довольно быстро. Когда конкурс закончился в 2007 году, самое длинное из разложенных чисел насчитывало 193 цифр (640 бит), а приз составлял 20 тысяч долларов. Известно, что в 2019 году удалось разложить на множители RSA-240 (240 цифр, 795 бит). Если хотите испытать себя, то список все еще можно найти в Сети.

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

Вот наглядный пример: в ASCII буквы × и X отличаются на один бит, то есть в шестнадцатеричном формате они представлены как 78 и 58, а в двоичном как 01111000 и 01011000. Ниже приведены их криптографические хеши, для получения которых использовался алгоритм под названием MD5. Первая строка – это первая половина хеша х, а вторая строка – первая половина хеша X. Соответственно, третья и четвертая строки – вторые половины. Даже вручную легко подсчитать, на сколько битов они отличаются (66 из 128), но я сделал это с помощью программы.

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

Несколько хеш-алгоритмов стали широко использоваться. Показанный выше MD5 разработан Роном Ривестом и выдает 128-битный результат. SHA-1 от НИСТ формирует 160 бит. Со временем выяснилось, что MD5 и SHA-1 имеют слабые места, поэтому они вышли из употребления. А вот в алгоритме SHA-2, разработанном АНБ, пока не обнаружено уязвимостей. Впрочем, НИСТ все равно провел открытый конкурс – аналогичный тому, в результате которого появился AES, – чтобы создать новый алгоритм криптографического хеширования. В 2015 году выбрали победителя, ныне известного как SHA-3. Он, как и SHA-2, создает хеши в диапазоне от 224 до 512 бит.

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

Но тогда я должен доверять центру сертификации. Ведь если они мошенники, то я не вправе верить никому, кто с ними сотрудничает. Например, в 2011 году неизвестный хакер взломал DigiNotar, один из контрольных органов в Голландии, что позволило ему создать поддельные сертификаты ряда сайтов, включая Google. Если бы подложная страница прислала мне сертификат, подписанный DigiNotar, я принял бы ее за настоящий Google.

Обычный браузер знает поразительно много центров сертификации – около 80 в моей версии Firefox и около 200 для Chrome. О большинстве из них я даже не слышал, и они расположены где-то очень далеко.

Существует некоммерческий центр сертификации Let’s Encrypt, который предоставляет бесплатные сертификаты всем желающим. Там исходят из того, что если получить сертификат будет легко, то в конечном итоге все веб-сайты начнут работать по протоколу HTTPS и весь трафик будет зашифрован. К началу 2020 года Let’s Encrypt выпустил миллиард сертификатов.

13.2. Анонимность

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

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

Как мы знаем из главы 11, на coveryourtracks.eff.org можно оценить, насколько вы уникальны. Я провел эксперимент с одним из моих ноутбуков и, просматривая эту страницу в Chrome, обнаружил, что уникален среди более чем 280 000 недавних пользователей. При использовании Firefox такие же настройки, как у меня, обнаружились еще у одного человека, и аналогичный результат принес опыт с Safari. Эти значения варьируются в зависимости от средств защиты, таких как блокировщики рекламы, но большая часть различий определяется по заголовку пользовательского агента (USER_AGENT на рис. 11.3), отправляемого автоматически, а также по установленным шрифтам и подключаемым плагинам, над которыми у меня почти нет контроля. По идее, разработчики браузеров могут настроить их так, чтобы они отправляли меньше информации, потенциально пригодной для отслеживания, но, кажется, мало что предпринимают. Несколько обескураживает тот факт, что если я отключу куки-файлы или задействую опцию «Не отслеживать», то начну отличаться от других, стану чуть более заметным, и меня легче будет идентифицировать.

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

13.2.1. Конфиденциальность в Сети

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

Рис. 13.3. Логотип Тог

Можно настолько эффективно использовать криптографию для скрытия диалога, что конечный получатель не узнает, откуда исходит соединение. Наиболее популярная такая система называется Тог[138], что первоначально расшифровывалось как The Onion Router[139] – метафора для слоев шифрования, которые окружают разговор, когда он передается из одного места в другое. Логотип Тог на рис. 13.3 намекает на происхождение названия.

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

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

Сейчас в мире насчитывается около 7000 ретрансляторов[140]. Приложение Тог выбирает случайный набор узлов и устанавливает путь, который время от времени меняется, даже в течение одной сессии.

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

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

В качестве примера того, как выглядит анонимное посещение сайта для обычного пользователя, на рис. 13.4 показано отображение сайта с погодой в Принстоне в Тог (слева) и Firefox (справа). В обоих случаях я посетил https://weather.yahoo.com. Yahoo считает, что знает мое местоположение, но он ошибается, если я захожу через Тог. Почти в каждом моем эксперименте выходной узел находился где-то в Европе. Когда я через час перезагрузил страницу, он переместился из Латвии в Люксембург. Единственное, что меня немного смущает, – температура всегда указывалась по шкале Фаренгейта, не слишком распространенной за пределами США. От чего зависит выбор Yahoo? Другие погодные сайты указывают температуру в градусах Цельсия.

Согласно Panopticlick, когда я использую браузер Тог, из их выборки в 280 000 недавних посетителей около 3200 других людей имеют те же характеристики, что и я, поэтому мою личность труднее определить с помощью браузерной идентификации. И, безусловно, если сравнивать с прямым подключением через браузер, то так труднее определить, кто я.

Рис. 13.4. Браузер Тог в действии

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

Защищен ли он от АНБ или настолько же влиятельных организаций? В число документов, обнародованных Сноуденом, вошла презентация для АНБ 2007 года, где на одном слайде (рис. 13.5) говорится: «Мы никогда не сможем деанонимизировать всех пользователей Тог за все время его существования»162. Конечно, АНБ не собирается сдаваться, но пока эта система кажется лучшим инструментом защиты частной жизни для обычных людей^163. (Тут есть легкая ирония, поскольку изначально Тог разрабатывался государственным учреждением США – научно-исследовательской лабораторией ВМС, – стремившимся обеспечить безопасность линий связи американской разведки.)

Рис. 13.5. Презентация АНБ на тему Тог (2007)[141]

13.2.2. Биткоин

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

Оказывается, хорошо продуманную криптосистему можно применить для создания анонимной валюты. Наиболее успешный пример здесь – так называемый биткоин[142], схема, изобретенная Сатоси Накамото и выпущенная в виде ПО с открытым исходным кодом в 2009 году. (Кто такой Накамото на самом деле, неизвестно, что служит редким примером сохранения анонимности.)

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

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

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

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

Поскольку все стороны транзакций способны сохранить обезличенность, если будут вести себя внимательно, биткоин стал самой популярной валютой для торговли наркотиками, выплат вымогателям и других незаконных действий^164. Например, электронная площадка Silk Road («Шелковый путь») широко использовалась для незаконной продажи наркотиков, оплачиваемых в ВТС. Ее владельца в итоге идентифицировали, но не из-за недостатков ПО. К нему привела почти незаметная дорожка из комментариев в Сети, которую сумел отследить внимательный агент Налогового управления США, выявивший реальную личность преступника. Безопасность операций («обеспечение скрытности», opsec на жаргоне разведки) трудно обеспечить, и достаточно разок проболтаться, чтобы лавочку прикрыли.

Рис. 13.6 Цены на биткоин[143] (finance.yahoo.com)165

Биткоины – это «виртуальная валюта», но их можно конвертировать в обычные платежные средства и обратно. В прошлом обменные курсы радикально менялись, стоимость BTC по отношению к доллару США значительно колебалась вверх и вниз. На рис. 13.6 показан график цен за несколько лет.

Большие игроки, такие как банки и компании вроде Facebook[144], окунулись в новый мир криптовалюты, предлагая услуги или даже свою версию валютного блокчей-на. Конечно, биткоинами заинтересовались и фискальные органы, поскольку анонимные платежи позволяют уйти от налогообложения. В США виртуальные валюты типа ВТС рассматриваются как средства, подлежащие обложению федеральным подоходным налогом, поэтому и с транзакций могут взимать процент курсовой выручки^166.

С технологией биткоинов легко экспериментировать. Хорошее место для начала – bitcoin.org, а на coindesk.com можно найти отличную обучающую информацию. Есть также книги и онлайн-курсы^167.

13.3. Краткие выводы

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

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

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

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

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

Фундаментальная проблема заключается в том, что мы не можем ослабить шифрование для террористов, но сохранить его сильным для всех остальных. Как сказал Тим Кук, генеральный директор Apple, «дела обстоят так – если вы создадите черный ход, он будет открыт и для хороших парней, и для плохих». И, конечно же, мошенники, террористы и правительства других стран не станут пользоваться дефектной версией, так что наше положение только ухудшится.

ПО от Apple шифрует все содержимое iPhone на iOS, используя ключ, предоставленный пользователем и неизвестный самой корпорации. Если правительство или суд потребуют от нее расшифровать файлы на смартфоне, компания честно скажет, что не может этого сделать. Хотя из-за своего подхода Apple не завела себе друзей среди политиков или служителей закона, она все равно способна защитить свою позицию. В ней есть и коммерческий смысл: «подкованные» клиенты неохотно покупали бы телефоны, если бы знали, что власть с легкостью будет подслушивать разговоры и проверять содержимое.

В конце 2015 года два террориста убили 14 человек в Сан-Бернардино, штат Калифорния, а затем погибли сами. Тогда ФБР попыталось заставить Apple взломать шифрование на iPhone одного из преступников, но компания заявила, что, разработав даже узкоцелевой механизм для извлечения информации, она создаст прецедент, который серьезно ослабит безопасность всех телефонов.

Инцидент в Сан-Бернардино в конечном счете стал неактуальным, когда Бюро заявило, что нашло альтернативный способ восстановить информацию, однако вопрос снова возник в конце 2019 года, когда произошла очередная перестрелка, теперь во Флориде. ФБР запросило помощи, Apple ответила, что предоставила все сведения, какие имела, и что у нее нет паролей^169.

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

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

Даже если вы тщательно заботитесь о своей безопасности, решительный злоумышленник, стремясь получить доступ к данным, всегда может прибегнуть к четырем грязным приемам – подкупу, шантажу, краже со взломом и жестокости[145]. Правительство способно угрожать тюремным заключением, если человек отказывается раскрывать свои пароли по их требованию. Впрочем, если вы будете осторожны, то сумеете хорошо себя защитить, пусть даже не от всех опасностей и не навсегда – но достаточно для того, чтобы жить и работать в современном мире.

14. Что дальше?

Делать прогнозы сложно, особенно в отношении будущего.

Авторство приписывается Йоги Берра, Нильсу Бору, Сэмюэлю Голд вину, Марку Твену и другим

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

Ричард Хэмминг[146].

Искусство заниматься наукой и инженерией: учимся учиться, 1996

Мы проделали большой путь. Что вам точно требовалось усвоить? Что может стать актуальным в будущем? С какими проблемами в области вычислений мы еще будем бороться спустся пять или десять лет? А что уйдет в прошлое или утратит важность?

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

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

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

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

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

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

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

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

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

Вторая концепция – универсальный цифровой процессор (обработчик). Любой компьютер – это цифровое устройство, управляющее битами. Инструкции, которые сообщают процессору, что он должен выполнить, кодируются в виде битов и хранятся обычно в той же памяти, что и данные. При изменении инструкций компьютер начинает выполнять другие действия, поэтому он относится к машинам общего назначения. Значение битов зависит от контекста: то, что для одного человека – инструкции, для другого – данные. Независимо от того, что отображают биты, с ними выполняются такие действия, как копирование, шифрование, сжатие и выявление ошибок. Хотя, если тип информации известен, какие-либо конкретные методы могут работать с ней быстрее. Сейчас отмечается тенденция к замене специализированных устройств компьютерами общего назначения под управлением универсальных ОС, и в дальнейшем она сохранится. В будущем возможно появление новых видов процессоров, основанных на биологическом вычислении, или квантовых компьютеров, или новых изобретений – но цифровые счетные устройства останутся с нами еще долго.

Третья – универсальная цифровая сеть, которая передает биты (то есть данные и инструкции) от одного процессора на другой по всему миру. Вполне вероятно, что интернет и телефонная сеть объединятся в универсальную сеть, по аналогии с сочетанием вычислений и средств связи, которое мы наблюдаем сегодня в мобильниках. Интернет, несомненно, будет развиваться – хотя сейчас никто не ответит, сохранит ли он тот свободный, раскованный нрав Дикого Запада, так благотворно влиявший на его развитие в ранние годы. Возможно также, что он станет более ограниченным и контролируемым со стороны бизнеса и правительства, эдакой «золотой клеткой» – привлекательной, конечно, но все-таки темницей. К сожалению, я склоняюсь к последнему варианту. Мы уже видели примеры, когда целые страны регулярно ограничивали доступ в интернет или полностью отключали его во времена беспорядков.

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

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

Недостоверные сведения, дезинформация и заведомо ложные новости всех видов – быстро растущая проблема в интернете. Вымышленные и вводящие в заблуждение сюжеты, фотографии, видео и тому подобное наводнили социальные сети, которые чрезмерно пассивно вели себя, когда требовалось дать отпор ненадлежащему вредоносному контенту. Безусловно, существуют обоснованные страхи перед цензурой и ограничением свободы слова, но, на мой взгляд, маятник слишком сильно качнулся в одну сторону. Вот один случайный пример: за три месяца во время пандемии COVID-19 в 2020 году соцсеть Facebook[147] удалила семь миллионов постов, предлагавших «вымышленные превентивные меры или надуманные методы лечения, которые, по мнению сотрудников Центра по контролю заболеваний США и других экспертов в области здравоохранения, представляют опасность»170. Также компания отметила предупреждениями около 100 миллионов постов.

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

Продолжают расширяться масштабы полицейского надзора — от вездесущих камер до веб-отслеживания и записи местоположения ваших телефонов. Затраты на хранение и обработку данных снижаются экспоненциально, что делает все более вероятным создание полной записи нашей жизни в цифровой форме. Сколько места на диске понадобится для сбережения всего, что вы услышали и сказали с момента рождения, и во что это обойдется? Если вам 20 лет, то понадобится около 10 Тб, в 2021-м содержание такого объема информации стоило менее 200$. Полная видеозапись займет пространство всего в 10 или 20 раз больше.

Еще одна нерешенная проблема – безопасность частных лиц, корпораций и правительств. Я не уверен, что термины «кибервойна» или еще какие-нибудь с приставкой

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

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

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

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

Антимонопольное законодательство — важный вопрос в ЕС и США. Такие компании, как Amazon, Facebook[148] и Google, доминируют на своих рынках, и это дает им огромную власть, сосредоточенную в руках немногих. Google, пожалуй, наиболее уязвим для антимонопольных действий. Например, в конце 2020 года Министерство юстиции США объявило о соответствующем иске против корпорации. Через Google осуществляется по меньшей мере 70 % поисковых запросов по всему миру и 90 % в США. Это самая важная компания в сфере рекламы, которая приносит ей большую часть дохода. Подавляющее большинство телефонов работает на Android – операционной системе от Google. Facebook[148] доминирует среди социальных сетей, как напрямую, так и через дочерние структуры вроде Instagram[148]. Она, как и Google, регулярно покупает небольшие компании, чтобы приобрести технологии и опыт, а также устранить потенциальных конкурентов, пока те не набрались сил. Крупные технологические корпорации утверждают, что они успешны, поскольку предоставляют более качественные услуги, чем их соперники, и процветают именно поэтому. Но можно также сказать, что у них слишком много власти (неважно, нарушает это закон или нет). Похоже, ЕС и США начинают обращать внимание на данную проблему и порой даже предпринимают меры, стараясь ограничить могущество таких компаний.

Определить области юрисдикции также непросто в мире, где информация может распространяться повсюду. Деловые и социальные практики, законные на одной территории, порой оказываются противоправными в другой. Юридические системы вообще не успевают за преобразованиями. Эта проблема очевидна в таких вопросах, как налогообложение при покупке за границами штата в США и конфликт правил о конфиденциальности данных в ЕС и США. Проблемы начинаются при выборе выгодной юрисдикции, когда истец начинает тяжбу (например, по делу о патенте или клевете) в том месте, где ожидает наиболее выгодного для себя решения, независимо от того, где совершено правонарушение или где располагаются ответчики. Сама интернет-юрисдикция находится под угрозой со стороны организаций, которые хотят большего контроля в собственных интересах.

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

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

Примечания

Вы логично выстраиваете текст, основательно подбираете материал и хорошо пишете.

Но вы не совсем поняли суть сносок. С+[149].

Комментарии экзаменатора к эссе, которое я написал на первом курсе университета, 1963

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

1. IBM 7094 имел около 150 Кб оперативной памяти, тактовую частоту 500 кГц и стоил почти 3 миллиона долларов: en.wikipedia.org/wiki/IBM_7090. – Здесь и далее примечания автора.

2. Мюллер Ричард А. Физика для будущих президентов. ACT, 2011 г. Отличный текст, ставший источником вдохновения для этой книги.

3. Hal Abelson, Ken Ledeen, Harry Lewis, Wendy Seltzer, Blown to Bits: Your Life, Liberty, and Happiness After the Digital Explosion, Second Edition, Addison-Wesley, 2020 (Абельсон Хэл, Ледин Кен, Льюис Гарри, Зельцер Венди. Разорванный на биты: ваша жизнь, свобода и счастье после цифрового взрыва. 2-е издание. Эддисон-Уэсли, 2020). Затрагивает многие важные социальные и политические темы, особенно касающиеся интернета. Если, так сказать, выбить из текста отдельные кусочки, получился бы хороший материал для моего курса в Принстоне. Сама книга основывается на аналогичном курсе в Гарварде.

4. Цена акций Zoom значительно упала, когда Федеральная торговая комиссия США обвинила компанию во лжи о сквозном шифровании. Правда, потом котировки отыграли большую часть потерь.

5. О приложении для борьбы с ковидом в Китае: www.nytimes. сот/2020/03/01/business/china-coronavirus-surveillance.html.

6. Рассуждения Брюса Шнайера о неэффективности приложений для отслеживания контактов: www.schneier.com/ blog/archives/2020/05/me_on_covad-19_.html.

7. История Сноудена рассказана в ленте Гленна Гринвальда «Негде спрятаться» (2014), а также в документальном фильме Лоры Пойтрас «Citizenfour. Правда Сноудена», получившем множество призов (2015), автобиографии Сноудена «Личное дело» (2019) и книге Барта Геллмана «Темное зеркало» (Dark Mirror, 2020).

8. О том, как АНБ прослушивает телефоны во всем мире: www. npr.org/ sections/thetwo-way/2014/03/18/291165247/report-nsa-can-record-store-phone-conversations-of-whole-countries.

9. Глик Джеймс. Информация. История. Теория. Поток. Corpus, 2016. Интересный материал о системах связи, посвященный Клоду Шеннону, отцу теории информации. Особенно любопытна историческая часть.

10. Рекомендации АНБ по ограничению данных о местоположении: media.defense.gov/2020/Aug/04/2002469874/-1/-1/0/CSI_ LIMITING_LOCATION_DATA_EXPOSURE_FINAL.PDF.

11. Schneier Bruce, Data and Goliath: The Hidden Battles to Collect Your Data and Control Your World, W. W. Norton & Company, 2015. (стр. 127). Авторитетная, волнующая, хорошо написанная книга. Скорее всего, она вызовет у вас обоснованный гнев.

12. Essinger James, Jacquard’s Web: How a Hand-Loom Led to the Birth of the Information Age, Oxford University Press, 2004 (Эссинджер Джеймс. Паутина Жаккарда: как ручной ткацкий станок привел к рождению информационной эры. Издательство Оксфордского университета, 2004). Здесь мы следуем от ткацкого станка Жаккарда к работам Бэббиджа, Холлерита и Эйкена.

13. Изображение разностной машины взято из «Википедии», лицензирование не требуется: commons.wikimedia.org/ wiki/File: Babbage_Difference_Engine_(l). jpg.

14. Swade Doron, The Difference Engine: Charles Babbage and the Quest to Build the First Computer, Penguin, 2002 (Суэйд Дорон. Разностная машина: Чарльз Бэббидж и путь к сборке первого компьютера. Penguin, 2002). Суэйд также описывает конструкцию одной из машин Бэббиджа, воссозданную в 1991 году, которая сейчас хранится в Лондонском музее науки. Ее точная копия, собранная в 2008-м (рис. 1.1), находится в Музее компьютерной истории в Маунтин-Вью, Калифорния. См. также www.computerhistory.org/babbage.

15. Цитата о музыкальной композиции взята из перевода и примечаний Ады Лавлейс к «Наброску аналитической машины» Луиджи Менабреа, 1843 год.

16. Стивен Вольфрам, создатель Mathematica, написал длинное и информативное сообщение в блоге об истории Лавлейс: writings.stephenwolfram.com/2015/12/untangling-the-tale-of-ada-lovelace.

17. Портрет Ады Лавлейс взят из «Википедии», лицензирование не требуется: commons.wikimedia.Org/wiki/File: Carpenter_ portrait_of_Ada_Lovelace-detail.png.

18. McCartney Scott, ENIAC: The Triumphs and Tragedies of the Worlds First Computer, Walker & Company, 1999 (Маккартни Скотт. ENIAC: Триумфы и трагедии первого в мире компьютера. Walker & Company, 1999).

19. Беркс, Голдстайн и фон Нейман. Предварительное рассмотрение логического устройства электронного вычислительного прибора // www.cs.unc.edu/adyilie/comp265/ vonNeumann.html.

20. macOS – современное название операционной системы от Apple, ранее известной как Mac OS X.

21. Копия «Гордости и предубеждения» в Сети: www.gutenberg. org/ebooks/1342.

22. Петцольд Чарльз. Код. Тайный язык информатики. Манн, Иванов и Фербер, 2021. О том, как компьютеры строятся из логических элементов. Описания на один-два порядка подробнее, чем в этой книге.

23. Мур Гордон. Втиснуть больше компонентов в интегральные схемы // newsroom.intel.com/wp-content/uploads/ sites/ll/2018/05/moores-law-electronics.pdf.

24. Отличное объяснение принципов работы цифровых камер: www.irregularwebcomic.net/3359.html.

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

26. Загляните на интересный сайт colornames.org. Вам станет понятно, что 16 миллионов цветов – это очень много.

27. В 2020 году Catalina, версия macOS от Apple, перестала поддерживать 32-разрядные программы.

28. Кнут Д. Э. Искусство программирования. Том 2. Получисленные алгоритмы = The Art of Computer Programming. Volume 2. Seminumerical Algorithms I под ред. Л. Ф. Козаченко (гл. 3, разд. 4.6.4 и 4.7), В. Т. Тертышного (гл. 4) и И. В. Красикова (разд. 4.6). – 3. – Москва: Вильямс, 2001. Про меры рассказано в разд. 4.1.

29. Машина Тьюринга – это абстрактная модель вычислений; по ссылке www.youtube.com/watch?v=E3keLeMwfHY вы найдете удивительно точные реализации.

30. «Энигму» 1944 года, применявшуюся немецким ВМФ, в 2020 году продали на аукционе за 437 000 долларов: www. zdnet.com/article/rare-and-hardest-to-crack-enigma-code-machine-sells-for-437000.

31. Тьюринг Алан. Вычислительные машины и разум. – Москва: Издательство ACT, 2018. В американском журнале The Atlantic опубликована информативная и любопытная статья о тесте Тьюринга: www.theatlantic.com/magazine/ archive/2011/03/mind-vs-machine/8386.

32. Изображение «капчи» взято из «Википедии», лицензирование не требуется: en.wikipedia.org/wiki/File: Modern-captcha.jpg.

33. Премия Тьюринга от Ассоциации по вычислительной технике: amturing.acm.org/.

34. Домашняя страница Тьюринга, поддерживаемая Эндрю Ходжесом: www.turing.org.uk/turing. Ходжес – автор полной биографии «Алан Тьюринг: Энигма». Обновленное издание, Издательство Принстонского университета, 2014.

35. Одна из множества статей о том, что закон Мура перестанет работать: https://www.technologyreview.com/2020/02/24/905789/ were-not-prepared-for-the-end-of-moores-law/.

36. Описание ситуации с Боинг-737 МАХ в аспекте ПО: spectrum.ieee.org/aerospace/aviation/how-the-boeing-737-max-disaster-looks-to-a-software-developer.

37. Фиаско автоматики на предварительных выборах Демократической партии в Айове: www.nytimes.com/2020/02/09/ us/politics/iowa-democraticcaucuses.html.

38. Опасности интернет-голосования, которое хотели ввести из-за ситуации с коронавирусом: www.politico.com/ news/2020/06/08/online-voting-304013.

39. www.cnn.com/2016/02/03/politics/cyberattack-ukraine-power-grid.

40. en.wikipedia.org/wiki/WannaCry_ransomware_attack.

41. thehill.com/policy/national-security/507744-russian-hackers-return-to-spotlight-with-vaccine-research-attack.

42. Джеймс Глик о Ричарде Фейнмане: «Отчасти шоумен, гений на все сто», www.nytimes.com/1992/09/20/magazine/ part-showman-all-genius.html.

43. The River Cafe Cookbook, “The best chocolate cake ever” (Кулинарная книга кафе «Ривер». Лучший шоколадный торт на свете) // books.google.com/books? id=INFnzXj81-QC&pg=PT512.

44. Cook William, In Pursuit of the Travelling Salesman, Princeton University Press, 2011 (Кук Уильям. В погоне за коммивояжером. Издательство Принстонского университета, 2011). Увлекательное описание истории и современного уровня технологий.

45. Эпизод сериала «Элементарно» 2013 года, посвященный проблеме Р = NP: www.imdb.com/title/tt3125780/.

46. MacCormick John, Nine Algorithms That Changed the Future: The Ingenious Ideas That Drive Todays Computers, Princeton University, 2011 (Маккормик Джон. Девять алгоритмов, которые изменили будущее: гениальные идеи, управляющие современными компьютерами. Издательство Принстонского университета, 2011). Книга содержит доступное описание некоторых основных алгоритмов, включая поиск, сжатие, исправление ошибок и криптографию.

47. Beyer Kurt, Grace Hopper and the Invention of the Information Age, MIT Press, 2009 (Бейер Курт. Грейс Хоппер и изобретение информационной эпохи. Издательство Массачусетского технологического университета, 2009). Хоппер – заметная фигура, первопроходец вычислительной техники, влиятельный специалист. В отставку она вышла в 79 лет, будучи старейшим офицером ВМС США среди тех, кому присвоили звание после обучения в вузе. Во время выступлений она использовала разные приемы, в том числе разводила руки на фут и говорила: «Это наносекунда».

48. Отчет NASA Mars Climate Orbiter: llis.nasa.gov/llis_lib/ pdf/1009464main l_0641 – mr.pdf.

49. www.wired.com/2015/09/google-2-billion-lines-codeand-one-place.

50. Изображение насекомого не требует лицензирования: www. history.navy.mil/our-collections/photography/numerical-list-of-images/nhhc-series/nh-series/NH-96000/NH-96566-KN.html.

51. www.theregister.co.uk/2015/09/04/nsa_explains_handling_ zerodays.

52. Решение Верховного суда, подтверждающее конституционность Закона о продлении срока действия авторских прав имени Сонни Боно 1998 года, саркастически именуемого «Законом о защите Микки Мауса», поскольку он продлил и без того длительную защиту авторских прав на Микки Мауса и других персонажей Диснея: en.wikipedia. org/wiki/Eldred_v._Ashcroft.

53. Патент Amazon «Один клик»: www.google.com/patents?id= O2YXAAAAEBAJ.

54. В «Википедии» есть хорошее обсуждение патентных троллей: en.wikipedia.org/wiki/Patent_troll.

55. Лицензионное соглашение конечного пользователя взято из раздела «О системе» Mac ⁄ Поддержка ⁄ Важная информация… ⁄ Лицензионное соглашение на программное обеспечение. Содержит около 12 страниц.

56. Из лицензионного соглашения macOS Mojave: «Вы также соглашаетесь с тем, что не будете использовать программное обеспечение Apple ни в каких целях, запрещенных законодательством Соединенных Штатов, включая, помимо прочего, разработку, проектирование, изготовление или производство ракет, ядерного, химического или биологического оружия».

57. en.wikipedia.org/wiki/Oracle_America,_Inc._v._Google,_Inc.

58. Код для моей машины: www.fujitsu-ten.com/support/source/ oem/14f.

59. Керниган Брайан. Время Unix: A History and a Memoir. Питер, 2021. Это мой личный взгляд на историю Unix с точки зрения человека, присутствовавшего при создании системы, но не несущего за нее ответственность.

60. Исходный код Linux можно найти по адресу www.kernel. org/pub/linux/kernel/Historic.

61. Средство восстановления файлов Windows: www.microsoft. com/en-us/p/windows-file-recovery/9n26s501n705.

62. Один пример из 65 миллионов результатов в поиске Google: «Утечка электронных писем Белого дома проливает свет на закулисную борьбу за хлорохин для борьбы с коронавирусом».

63. Microsoft Windows на процессорах ARM: docs.microsoft. com/en-us/windows/uwp/porting/apps-on-arm.

64. Установленные судом факты, пункт 154, 1999 год: www. justice.gov/atr/cases/f3800/msjudgex.htm. Дело окончательно закрыли в 2011 году, когда закончился последний этап надзора за тем, как Microsoft соблюдает требования.

65. Призыв Обамы, размещенный на YouTube, был частью кампании «Неделя образования – информатика»: www. whitehouse.gov/blog/2013/12/09/don-t-just-play-your-phone-program-it.

66. Есть множество полезных сайтов для изучения JavaScript. Два из них – jsfiddle.net и w3schools.com.

67. Python можно скачать с python.org.

68. Colab доступен по адресу colab.research.google.com.

69. Сервис Jupyter notebook – это «веб-приложение с открытым исходным кодом, которое позволяет вам создавать документы, содержащие живой код, уравнения, визуализации, текст, и обмениваться ими». Заходите Hajupyter.org.

70. Holzmann Gerard and Pehrson Bjorn, The Early History of Data Networks, IEEE Press, 1994 (Хольцманн Джерард и Персон Бьорн. Ранняя история сетей передачи данных. IEEE Press, 1994). Подробная и интересная история оптического телеграфа.

71. Чертеж оптического телеграфа взят из «Википедии», лицензирование не требуется: en.wikipedia.org/wiki/File: Telegraph_ Chappe_l.jpg.

72. Standadge Tom, The Victorian Internet: The Remarkable Story of the Telegraph and the Nineteenth Century’s On-Line Pioneers, Walker, 1998 (Стэндидж Том. Викторианский интернет: замечательная история телеграфа и пионеров он-лайн-технологий девятнадцатого века. Уокер, 1998). Увлекательное и занимательное чтение.

73. Я не единственный, кто скучает по жизни до мобильных телефонов: www.theatlantic.com/technology/archive/2015/08/ why-people-hate-making-phone-calls/401114.

74. Статьи Александра Грейама Белла лежат в Сети, и цитата взята из memory.loc.gov/mss/magbell/253/25300201/0022.jpg.

75. www.10stripe.com/articles/why-is-56k-the-fastest-dialup-modem-speed.php.

76. Хорошее описание DSL: broadbandnow.com/DSL.

77. Klemens Guy, Cellphone: The History and Technology of the Gadget that Changed the World, McFarland, 2010 (Клеменс Гай. Мобильный телефон: история и технология устройства, изменившего мир. Макфарленд, 2010). Подробная история и технические факты об эволюции мобильных телефонов. Некоторые части трудно читать, но многие описания доступны. Книга дает хорошее представление об удивительной сложности системы, которую мы принимаем как должное.

78. Федеральный судья США запретил приводить доказательства, полученные от стингрея: www.reuters.com/article/us-usa-crime-stingray-idUSKCN0ZS2VI.

79. Хорошее разъяснение темы 4G и LTE можно найти по ссылке: www.digitaltrends.com/mobile/4g-vs-lte.

80. Интерактивное объяснение того, как работает JPEG: parametric.press/issue-011 unraveling-the-jpeg/

81. АНБ и GCHQ подключаются к оптоволоконным кабелям там, где они выходят на сушу: www.theatlantic.com/ international/archive/2013/07/the-creepy-long-standing-practice-of-undersea-cable-tapping/277855.

82. RFC на птичьих носителях: tools.ietf.org/html/rfcll49. Вам также может понравиться RFC-2324.

83. Текущий список доменов верхнего уровня находится по адресу www.iana.org/domains/root/db. Их почти 1600.

84. Правоохранительные органы часто не осознают, что невозможно точно идентифицировать человека по IP-адре-су: www.eff.org/files/2016/09/22/2016.09.20_final_formatted_ ip_address_white_paper.pdf.

85. Компания DE-CIX, как и многие точки обмена интернет-трафиком, предоставляет подробные графики потоков данных. Зайдите на www.de-cix.net.

86. Инструмент traceroute создан Ваном Якобсоном (Джейкобсоном) в 1987 году.

87. SMTP изначально описан Джоном Постелом в RFC-788 (1981 год).

88. То, как провести сеанс SMTP, описано на technet.microsoft. сот/en-us/library/bb 123686.aspx.

89. В 2015 году Keurig попыталась внедрить DRM (техническое средство защиты авторских прав) на капсулы для своих кофеварок. Пользователи остались недовольны, и продажи резко упали: boingboing.net/2015/05/08/keurig-ceo-blames-disastrous-f.html.

90. Устройства «звонят домой»: www.digitaltrends.com/news/ china-spying-iot-devices.

91. arstechnica.com/security/2016/01/how-to-search-the-internet-of-things-for-photos-of-sleeping-babies.

92. Chu Gordon, Apthorpe Noah, Feamster Nick, “Security and Privacy Analyses of Internet of Things Childrens Toys”, 2019 (Чу Гордон, Эпторп Hoa, Фимстер Ник. Анализ безопасности и конфиденциальности детских игрушек в интернете вещей. 2019).

93. Использование Telnet для доступа к устройствам интернета вещей: www.schneier.com/blog/archives/2020/07/half_a_ million.html.

94. Атаки на ветряные турбины: news.softpedia.com/news/ script-kiddies-can-now-launch-xss-attacks-against-iot-wind-turbines-497331.shtml.

95. Специальные настройки для слабовидящих: www.afb. org/about-afb/what-we-do/afb-consulting/afb-accessibility-resources/improving-your-web-site.

96. 10 непреложных законов безопасности Microsoft: docs. microsoft.com/en-us/archive/blogs/rhalbheer/ten-immutable-laws-of-security-version-2-0.

97. Zetter Kim, Countdown to Zero Day, Crown, 2014 (Зеттер Ким. Обратный отсчет до нулевого дня. Crown, 2014). Поистине захватывающее описание Stuxnet.

98. blog.twitter.com/en_us/topics/company/2020/an-update-on-our-security-incident.html.

99. В ходе фишинговой атаки якобы от лица генерального директора были раскрыты справки о зарплате по форме W-2 по всем сотрудникам Seagate в 2016 году: krebsonsecurity. сот/ 2016/03/seagate-phish-exposes-all-employee-w-2s.

100. www.ucsf.edu/news/2020/06/417911/update-it-security-incident-ucsf.

101. epic.org/privacy/data-breach/equifax/.

102. Заявление Wawa о нарушении их безопасности: www.wawa. com/alerts/data-security.

103. Утечка данных в Clearview Al: www.cnn.com/2020/02/26/tech/clearview-ai-hack/index.html.

104. news.marriott.com/news/2020/03/31/marriott-international-notifies-guests-of-property-system-incident

105. Атака типа «отказ в обслуживании» на Amazon: www. theverge.com/2020/6/18/21295337/amazon-aws-biggest-ddos-attack-ever-2-3-tbps-shield-github-netscout-arbor.

106. Утечка из бесплатных VPN «без регистрации»: www. theregister.com/2020/07/17/ufo_vpn_database/.

107. Жалоба Федеральной торговой комиссии и предлагаемое урегулирование с Zoom: www.ftc.gov/news-events/press-releases/2020/11/ftc-requires-zoom-enhance-its-security-practices-part-settlement.

108. Bellovin Steve, Thinking Security, Addison-Wesley, 2015 (Белловин Стив. Разумная безопасность. Addison-Wesley, 2015). В книге подробно обсуждаются модели угроз.

109. Известный выпуск комикса xkcd, посвященный выбору паролей: xkcd.com/936.

110. help.getadblock.com/support/solutions/articles/6000087914-ho w- does – adblo ck-work.

111. www.theguardian.com/technology/2020/jan/21/amazon-boss-jeff-bezoss-phone-hacked-by-saudi-crown-prince.

112. Schneier Bruce, Click Here to Kill Everybody: Security and Survival in a Hyper-Connected World, WW Norton&Co, 2018. (Шнайер Брюс. Нажмите здесь, чтобы убить всех. Безопасность и выживание в чрезмерно оцифрованном мире. WW Norton&Co, 2018).

113. Pariser Eli, The Filter Bubble: What the Internet is Hiding from You, Penguin, 2011 (Паризер Эли. Информационный пузырь: что интернет скрывает от вас. Penguin, 2011).

114. В детской книге Доктора Сьюза «За пределами Зебры!» (1955 г.) описывается причудливый расширенный алфавит.

115. Прогноз Cisco – один из нескольких, которые предполагают значительное увеличение интернет-трафика: www. cisco.com/c/еп/us/solutions/collateral/executive-perspectives/ annual-internet-report/white-paper-cl l-741490.html.

116. Первая статья с описанием Google: infolab.stanford.edu/~backrub/ google.html. В своем оригнальном воплощении система действительно называлась BackRub («массаж спины»).

117. Два сайта с большими числами: www.domo.com/learn/data-never-sleeps-5,www.forbes.com/sites/bernardmarr/2018/05/21/ how-much-data-do-we-create-every-day-the-mind-blowing-stats-everyone-should-read.

118. Латанья Суини обнаружила, что поиск по именам, которые «ассоциируются с расовой принадлежностью», значительно чаще генерировал «рекламные объявления, предполагающие, что у вас кто-то арестован». См. papers.ssrn. com/sol3/papers.cfm?abstract_id=2208240, а также www. reuters.com/article/us-facebook-advertisers/hud-charges-facebook-with-housing-discrimination-in-targeted-ads-on-its-platform-idUSKCNlR91E8 и www.propublica.org/article/ facebook-ads-can-still-discriminate-against-women-and-older-workers-despite-a-civil-rights-settlement.

119. Рекомендации DuckDuckGo по вопросам конфиденциальности можно найти по адресу spreadprivacy.com.

120. www.nytimes.com/series/new-york-times-privacy-project.

121. www.nytimes.com/interactive/2019/12/19/opinion/location-tracking-cell-phone.html.

122. www.washingtonpost.com/news/the-intersect/ wp/2016/08/19/98-personal-data-points-that-facebook-uses-to-target-ads-to-you/.

123. 98 элементов, которые Facebook[150] использует для таргетирования: www.washingtonpost.com/technology/2020/01/28/ off-facebook-activity-page.

124. Политика конфиденциальности Netflix: help.netflix.com/ legal/privacy, июнь 2020 года.

125. Снятие цифровых отпечатков: en.wikipedia.org/wiki/Can-vas_fingerprinting.

126. Как отключить поддержку речи в «умных» телевизорах: www.consumerreports.org/privacy/how-to-turn-off-smart-tv-snooping-features/.

127. www.nytimes.com/2020/07/16/business/eu-data-transfer-pact-rejected.html.

128. www.реwresearch.org/internet/2019/01/16/facebоok-algorithms-and-personal-data.

129. В 2019 году New York Times проанализировала 150 политик конфиденциальности. «Они катастрофически невразумительны». www.nytimes.com/interactive/2019/06/12/opinion/ facebook-google-privacy-policies.html.

130. www.swirl.com/products/beacons.

131. О конфиденциальности местоположения: www.eff.org/wp/ locational-privacy. Electronic Frontier Foundation (eff.org) – хороший источник информации о политике конфиденциальности и безопасности.

132. fas.org/irp/congress/2013_hr/100213felten.pdf.

133. Косински и др. «Личные черты и атрибуты можно определить на основе цифровых записей человеческого поведения». www.pnas.org/content/early/2013/03/06/1218772110. full.pdf+html.

134. Справка по тегированию на Facebook[151]: www.facebook.com/ help/187272841323203 (июнь 2020).

135. Симеон Л. Гарфинкель. Деидентификация личной информации. dx.doi.org/10.6028/NIST.IR.8053.

136. georgetownlawtechreview.org/re-identification-of-anony-mized-data/GLTR-04-2017.

137. Изображение облака любезно предоставлено clipartion. com/free-clipart-549.

138. В апреле 2016 года Microsoft подала в суд на Министерство юстиции США из-за такого рода требований: blogs. microsoft.com/on-the-issues/2016/04/14/keeping-secrecy-exception-not-rule-issue-consumers-businesses.

139. www.theguardian.com/commentisfree/2014/may/20/why-did-lavabit-shut-down-snowden-email.

140. Ошибка при вымарывании в правительственном документе показала, что целью был Сноуден: www.wired. com/2016/03/government-error-just-revealed-snowden-target-lavabit-case.

141. Отчеты о прозрачности: www.google.com/transparencyreport, govtrequests.facebook.com, aws.amazon.com/compliance/amazon-information-requests.

142. О связи машинного обучения со статистикой: www.svds. com/machine-learning-vs-statistics.

143. vas3k.com/blog/machine_learning от Василия Зубарева – отличное введение, написанное непринужденным языком с хорошими иллюстрациями и без математики.

144. http://www.computerhistory.org/col-229: Ретроспектива экспертных систем в Музее компьютерной истории (2018): www.computerhistory.org/ collections/catalog/102781121.

145. Страница премии Тьюринга о Бенжио, Хинтоне и Лекуне находится по адресу: awards.acm.org/about/2018-turing.

146. www.nytimes.com/2020/06/24/technology/facial-recognition-arrest.html.

147. IBM отказывается от распознавания лиц: www.ibm.com/ blogs/policy/facial-recognition-susset-racial-justice-reforms.

148. Amazon приостанавливает распознавание лиц: уго. slashdot.org/story/20/06/10/2336230/amazon-pauses-police-use-of-facial-recognition-tech-for-a-year.

149. Диалог с «Элизой» взят по адресу www.masswerk.at/elizabot.

150. Поговорить с Transformer можно по адресу inferkit.com.

151. История с Amazon Rekognition: www.nytimes.com/2020/06/10/ technology/amazon-facial-recognition-back-lash.html.

152. Дело по Clearview Al: /www.nytimes.com/2020/08/ll/ technology/clearview-floyd-abrams.html.

153. Важные идеи для этого раздела взяты из книги Barocas, Hardt and Narayanan, Fairness and Machine Learning: Limitations and Opportunities (Барокаса, Хардта и Нараянана «Справедливость и машинное обучение: ограничения и возможности»); ищите ее на fairmlbook.org.

154. На www.kurzweilcyberart.com есть занимательный онлайн-тест Тьюринга для поэзии.

155. Сингх Саймон. Книга шифров. Тайная история шифров и их расшифровки. Аванта+, 2009. Восхитительно написанная история криптографии для широкого круга читателей. Заговор Бабингтона (попытка посадить на трон Марию, королеву Шотландии) весьма любопытен.

156. Фотография машины «Энигма» взята из «Википедии», лицензирование не требуется: commons.wikimedia.org/wiki/ File: EnigmaMachine.jpg.

157. У Брюса Шнайера есть несколько эссе о том, почему любительские криптосистемы обречены на провал. Его более ранние работы также приведены по адресу: www.schneier. com/blog/ archives/2015/05/amateurs_produc.html.

158. Рональд Ривест говорит: «Представляется весьма вероятным, что этот стандарт был разработан АНБ, чтобы важнейшая информация пользователей напрямую утекала в АНБ (и ни к кому иному). Стандарт Dual-EC-DRBG, по-видимому (и я бы предположил, почти наверняка), содержит «бэкдор», дающий АНБ негласный доступ», www.nist. gov/public_affairs/releases/upload/VCAT-Report-on-NIST-Cryptographic-Standards-and-Guidelines-Process.pdf.

159. Про Алису, Боба и Еву в выпуске xkcd.com/177.

160. Когда подпись и шифрование объединены, внутренний криптоуровень должен каким-то образом зависеть от внешнего слоя, чтобы выявлять любое вмешательство в него. world.std.com/dtd/ sign_encrypt/sign_encrypt7.html.

161. Политика конфиденциальности Snapchat: www.snapchat, com/privacy.

162. Документы Сноудена можно найти по адресам www.aclu. org/nsa-documents-search и www.cjfe.org/snowden, среди прочих.

163. www.washingtonpost.com/news/the-switch/wp/2013/10/04/ everything-you-need-to-know-about-the-nsa-and-tor-in-one-faq.

164. С некоторыми людьми, чьи личности выявили после взлома сайта Ashley Madison для внебрачных связей, связались шантажисты, требовавшие 2000 долларов в биткоинах: www. grahamcluley.com/2016/01 /ashley-madison-blackmail-letter.

165. Многолетние средние цены на биткоин взяты на ресурсе Yahoo Finance.

166. www.irs.gov/individuals/international-taxpayers/frequently-asked-questions-on-virtual-currency-transactions.

167. Narayanan Arvind et al., Bitcoin and Cryptocurrency Technologies, Princeton Univercity Press, 2016 (Нараянан Арвинд и др. Биткоин и криптовалютные технологии. Издательство Принстонского университета, 2016).

168. «Ключи под ковриком»: dspace.mit.edu/handle/1721.1/97690. Авторы – группа действительно компетентных экспертов по криптографии. Я знаю половину из этих людей лично, мне известны их мотивы, и я доверяю их опыту.

169. www.nytimes.com/2020/01/07/technology/apple-fbi-iphone-encryption.html.

170. www.msn.com/en-us/news/technology/facebook-says-it-removed-over-7m-pieces-of-wrong-COVID-19-content-in-quar ter/ar- BB17 Q4qu.

Глоссарий

Есть некоторые слова, которые я не могу объяснить, потому что я их не понимаю.

Сэмюэл Джонсон[152].

Словарь английского языка, 1755

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

Компьютеры и системы связи (например, интернет) работают с большими числами, часто выраженными в неизвестных единицах. В таблице ниже приведены определения всех единиц, которые встречаются в книге, а также в Международной системе единиц. По мере развития технологии вы увидите еще больше единиц, которые будут представлять большие числа. В таблице также показаны ближайшие степени двойки. В случае 10^24 ошибка составляет всего 21 %, так как 2^80 примерно равняется 1,21 × 10^24.

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

API (интерфейс прикладного программирования). Предназначенное для программистов описание сервисов, предоставляемых библиотекой или другим набором программного обеспечения. Например, Google Maps API описывает, как управлять отображением карт с помощью JavaScript.

ASCII (American Standard Code for Information Interchange). Стандартный американский код для обмена информацией, 7-битная кодировка букв, цифр и знаков препинания. Почти всегда хранится в виде 8-битных байтов.

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

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

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

ChromeOS. Операционная система от Google, в которой приложения и пользовательские данные в основном хранятся в облаке, а не на локальном компьютере. Доступ к ним осуществляется через браузер.

DES (Data Encryption Standard). Первый широко используемый алгоритм цифрового шифрования. На смену ему пришел AES.

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

Flash. Программная система Adobe для отображения видео и анимации на веб-страницах. Выведена из обращения.

GIF Graphics Interchange Format. Формат обмена графикой алгоритм сжатия простых изображений с цветными блоками, но не фотографий. См. JPEG, PNG.

IP-адрес. Адрес интернет-протокола, уникальный числовой адрес, присвоенный компьютеру в интернете в данный момент. В общих чертах аналогичен телефонному номеру.

IPv4, IPv6. Две версии IP-протокола; IPv4 использует 32-битные адреса, IPv6 – 128-битные. Других версий нет.

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

JPEG. Стандартный алгоритм сжатия и представления цифровых изображений, названный в честь Совместной экспертной группы по фотографии (англ. Joint Photographic Experts Group).

Linux. Операционная система с открытым исходным кодом. Подобна Unix, широко используется на серверах.

MD5. Криптографический алгоритм хеширования или создания профиля сообщения. Выведен из употребления.

MP3. Алгоритм сжатия и формат цифрового аудио, компонент стандарта MPEG (см.) для видео.

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

PDF Portable Document Format. Формат переносимых документов, стандартный формат документов для печати, разработанный компанией Adobe.

PNG-формат Portable Network Graphics. Переносимая сетевая графика, алгоритм сжатия без потерь, непатентованная замена GIF, поддерживает гораздо больше цветов. Используется для текста, линейной графики и изображений с большими областями сплошного цвета.

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

RGB (красный, зеленый, синий). Стандартный способ представления оттенков на компьютерных дисплеях в виде комбинации трех основных цветов.

Unicode (Юникод). Стандартная кодировка для всех символов во всех системах письменности мира. UTF-8 – 8-битная кодировка переменной длины для передачи данных в Юникоде.

Unix. Операционная система, разработанная в Лабораториях Белла и ставшая основой многих современных ОС. Linux выглядит аналогично и предоставляет те же службы, но с другой реализацией.

URL Uniform Resource Locator. Унифицированный указатель ресурса, стандартная форма веб-адреса, например: http://www.amazon.com.

USB (Universal Serial Bus, универсальная последняя шина). Стандартный интерфейс для подключения к компьютерам устройств вроде внешних накопителей, камер, мониторов и телефонов. USB-C – новая версия, физически несовместимая с предыдущей.

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

VPN (Virtual Private Network, виртуальная частная сеть). Зашифрованный путь между компьютерами, который защищает поток информации в обоих направлениях.

Wi-Fi (Wireless Fidelity, «беспроводная достоверность»). Маркетинговое название беспроводной сети стандарта 802.11.

4G. «Четвертое поколение»; несколько неточный термин, описывающий технологию, которая используется в смартфонах примерно с 2010 года. Преемник 3G.

5G. «Пятое поколение», более новый и четко определенный стандарт. Примерно с 2020 года вытесняет 4G.

802.11. Стандарт для беспроводных систем, которые используются, например, в ноутбуках и домашних маршрутизаторах. Также см. Wi-Fi.

Алгоритм. Техническое описание вычислительного процесса (точное и полное, но абстрактное). Не выполняется компьютером напрямую, в отличие от программ.

Алгоритм RSA. Наиболее широко используемый алгоритм шифрования с открытым ключом, названный в честь его изобретателей Рона Ривеста, Ади Шамира и Леонарда Адлемана.

Алгоритмы SHA-1, SHA-2, SHA-3. Алгоритмы хеширования (выборки сообщений) для создания криптографического профиля для произвольных входных данных. SHA-1 выведен из обращения.

Амплитудная модуляция, AM. Механизм добавления информации (такой, как голос или данные) к сигналу путем изменения его амплитуды. Обычно рассматривается в контексте AM-радио. См. частотная модуляция (FM).

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

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

Ассемблер. Программа, которая преобразует инструкции из набора процессора в биты для загрузки непосредственно в память компьютера. Ассемблерный язык – соответствующий уровень языка программирования.

Атака «через посредника» («человек посередине»).

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

Баг. Ошибка в программе или другой системе.

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

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

В современных компьютерах рассматривается как единица измерения.

Беспроводной маршрутизатор. Радиоустройство, которое подсоединяет беспроводные устройства (например, компьютеры) к проводным сетям.

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

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

Бит. Двоичная цифра (0 или 1), которая представляет информацию, основанную на бинарном выборе (например, включить или выключить).

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

Блокчейн. Распределенный реестр всех предыдущих транзакций, используемый протоколом биткоина.

Бот, ботнет. Программа, запускаемая компьютером под управлением злоумышленников. Ботнет – совокупность ботов под общим контролем. Термин произошел от слова «робот».

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

Браузер. Программа, которая предоставляет большинству людей основное средство доступа к веб-сервисам. Например, Chrome, Firefox, Internet Explorer, Edge или Safari.

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

Бэкдор («лазейка») в криптографии. Преднамеренно созданное слабое место, которое позволяет человеку, обладающему дополнительной информацией, взломать или обойти шифрование.

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

Веб-сервер. Сервер, ориентированный на веб-приложения.

Виртуальная машина. Программа, имитирующая компьютер. То же самое, что интерпретатор.

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

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

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

Вредоносная программа (malware). Программное обеспечение с вредоносными свойствами и целями.

Глобальная система мобильной связи, или GSM. Система сотовой связи, применяемая во многих странах мира.

Глобальная система позиционирования, или GPS (Global Positioning System). Использует временные сигналы со спутников для вычисления положения на поверхности Земли. Работает в одном направлении; устройства с GPS (например, навигаторы в автомобилях) не отправляют сигнал на спутник.

Глубокое обучение. Методика машинного обучения, основанная на сетях искусственных нейронов.

Двоичный. То, что имеет только два состояния или возможных значения. Двоичное число – число в системе счисления с основанием 2.

Диапазон. Полоса частот спектра для системы или устройства (например, телефонной службы или радиостанции).

Доменное имя. Иерархическая схема именования компьютеров, подключенных к интернету (например, www.cs.nott.ac.uk).

Драйвер. Программное обеспечение, которое управляет определенным аппаратным устройством, например принтером; обычно устанавливается в ОС по необходимости.

Жесткий диск. Устройство, которое хранит данные на вращающихся дисках из магнитного материала. Другое название – накопитель на жестких дисках. Противоположен дискете.

Закон об авторских правах в цифровую эпоху, или DMCA (Digital Millennium Copyright Act) (1998). Закон США, защищающий цифровые материалы с авторским правом.

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

Интегральная схема, ИС. Компонент электронной схемы, изготовленный на плоской поверхности и вмонтированный в герметичную упаковку; соединяется с другими устройствами в цепи. Большинство цифровых устройств состоят в основном из ИС.

Интеллектуальная собственность. Творческое произведение или изобретение, защищенное авторскими правами или патентом. Применимо к ПО и цифровым средствам коммуникации. В английском иногда используется аббревиатура IP (от Intellectual Property), что вызывает путаницу.

Интернет-провайдер, ISP (Internet Service Provider). Организация, которая обеспечивает подключение к интернету. Среди них, например, университеты, кабельные и телефонные компании.

Интернет-протокол, IP (Internet Protocol). Основной протокол для отправки пакетов через интернет. В английском аббревиатура совпадает с таковой у интеллектуальной собственности.

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

Интерфейс. Размытый общий термин для обозначения границы между двумя независимыми объектами. См. API для интерфейсов программирования. Также существует (графический) пользовательский интерфейс, или GUI, – часть компьютерной программы, с которой человек взаимодействует напрямую.

Исходный код. Текст программы, написанный на понятном программистам языке. Подлежит компиляции в объектный код.

Кабельный модем. Устройство для отправки и приема цифровых данных в сеть кабельного телевидения.

Каталог (в ОС). То же самое, что папка (см.).

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

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

Клиент. Программа, часто браузер, которая отправляет запрос на сервер (если используется модель «клиент – сервис»).

Код. Текст программы, написанный на языке программирования, если мы говорим об исходном коде. Если имеется в виду ASCII, то правильно «кодировка».

Компилятор. Программа, которая переводит программы с языка высокого уровня (например, С или Fortran) на язык низкого уровня (например, ассемблерный).

Комплект для разработки ПО, или SDK. Набор инструментов, помогающих разработчикам писать программы для какого-либо устройства или среды (например, сотовых телефонов и игровых консолей).

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

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

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

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

Логарифм заданного числа N. Степень, в которую возводится основание для получения числа N. В этой книге использовалось основание 2 и логарифмы в форме целых чисел.

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

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

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

Микрочип. Еще одно слово, обозначающее чип или интегральную схему.

Модем, модулятор/демодулятор. Устройство, которое преобразует биты в аналоговый формат (например, звук) и обратно.

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

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

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

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

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

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

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

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

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

Одноранговый. Обмен информацией между иерархически равными узлами, то есть симметричные отношения, в отличие от «клиент – сервер». Используется для файлообменных сетей и биткоина.

Оперативная память (ОЗУ). Оперативное запоминающее устройство, основная память в компьютере.

Операционная система. Программа, которая управляет ресурсами компьютера, включая процессор, файловую систему, устройства и внешние подключения. Например, Windows, macOS, Unix, Linux.

Организация по присвоению имен и адресов в интернете, ICANN (Internet Corporation for Assigned Names and Numbers). Организация, распределяющая интернет-ресурсы, которые должны быть уникальными (например, доменные имена и номера протоколов).

Открытый исходный код. Исходный код (то есть удобный для чтения программистами), который находится в свободном доступе. Обычно защищен лицензией (например, GNU GPL), обеспечивающей свободный доступ к нему на неизменных условиях.

Отслеживание. Запись сведений о том, какие сайты посещает пользователь и что там делает.

Пакет. Набор информации в определенном формате (например, IP-пакет). На уровне концепции примерно аналогичен конверту или транспортному контейнеру.

Папка. Файл, который содержит информацию о файлах и других папках: размер, дату изменения, разрешения и местоположение. То же самое, что каталог.

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

Периферия. Аппаратные устройства, подключенные к компьютеру (например, внешний диск, принтер или сканер).

Пиксель. Элемент картинки, одна точка на цифровом изображении.

Плагин. Программа, которая запускается в контексте браузера. Популярные примеры – Flash и QuickTime.

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

Поисковая система. Сервер вроде Bing или Google, который собирает веб-страницы и отвечает на запросы о них.

Представление. Общее слово для обозначения того, как информация выражается в цифровой форме.

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

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

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

Пропускная способность. Определяет скорость передачи информации по каналу связи, измеряется в битах в секунду (бит/с). Например, 56 Кбит/с для телефонного модема или 100 Мбит/с для Ethernet.

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

Протокол передачи гипертекста, или HTTP, HTTPS (Hypertext Transfer Protocol). Используется между клиентами, такими как браузеры и серверы. HTTPS имеет сквозное шифрование и поэтому сравнительно защищен от слежки и атак типа «человек посередине».

Протокол TCP (Transmission Control Protocol, протокол управления передачей). Использует IP для создания двусторонних потоков. TCP/IP – это комбинация TCP и IP.

Процессор, или ЦПУ. Часть ЭВМ, которая выполняет арифметические и логические действия и управляет остальной частью компьютера. ЦПУ Intel и AMD широко используются в ноутбуках, тогда как ARM – в большинстве телефонов.

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

Расширение. Небольшая программа на JavaScript, добавляемая в браузер ради дополнительных функций или удобства. Например, есть расширения для обеспечения конфиденциальности Adblock Plus и NoScript. Другой вариант названия – надстройка.

Регистратор. Фирма, которую ICANN наделила полномочиями продавать доменные имена частным лицам и компаниям.

Сервер. Компьютер или компьютеры, которые предоставляют доступ к данным по запросу клиента. Примеры – поисковые системы, торговые сайты и социальные сети.

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

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

Сжатие. Уменьшение представления цифровых данных до меньшего количества битов (например, сжатие цифровой музыки в формат MP3 или изображений в формат JPEG).

Симулятор. Программа, которая имитирует некое устройство или другую систему, т. е. ведет себя как они.

Система доменных имен, или DNS (Domain Name System). Интернет-сервис, который преобразует доменные имена в IP-адреса.

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

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

Смартфон. Телефон (например, iPhone или Android) с возможностью загрузки и запуска приложений (apps).

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

Стандарт. Официальная спецификация или описание того, как что-то работает, собрано или контролируется. Достаточно точен, чтобы обеспечить совместимость и независимые реализации. Примеры – набор символов в ASCII и Unicode, вилки и розетки USB, определения в языке программирования.

Стандартная общественная лицензия GNU, или GNU GPL. Лицензия на интеллектуальную собственность, которая защищает открытый исходный код, требуя свободного доступа к исходному коду. Тем самым устраняется риск того, что его сделают конфиденциальным.

Стингрей. Устройство, имитирующее базовую станцию сотового телефона, в результате чего телефоны начинают взаимодействовать с ним вместо настоящей телефонной системы.

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

«Темный интернет», даркнет. Часть Всемирной паутины, доступная только при наличии специального ПО и/или информации. В значительной степени связана с незаконной деятельностью.

Точка обмена интернет-трафиком, IXP. Физический узел, где несколько сетей соединяются и обмениваются данными.

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

Троянский конь. Программа, которая обещает делать одно, но устраивает что-то другое, обычно вредное.

Управление цифровыми правами, или DRM (Digital Rights Management). Методы предотвращения незаконного копирования материалов, защищенных авторским правом. Как правило, неэффективные.

Уязвимость нулевого дня. Слабое место в ПО, на исправление которого или установку защиты у разработчиков есть ноль дней.

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

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

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

Функция. Компонент программы, который выполняет определенную целенаправленную вычислительную задачу (например, считает квадратный корень или выводит диалоговое окно, как функция prompt в JavaScript).

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

Цифровая абонентская линия, или DSL (Digital Subscriber Loop). Технология передачи цифровых данных по телефонным линиям. Сравнима с кабельным подключением, но используется реже.

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

ЦПУ. Центральный процессор; см. процессор.

Частотная модуляция, FM. Метод передачи информации путем изменения частоты радиосигнала. Ообычно встречается в FM-радио. См. амплитудная модуляция (AM).

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

Чип. Небольшая электронная схема, собранная на плоской кремниевой поверхности и вмонтированная в керамический корпус. Варианты названия – интегральная схема, микрочип.

Шестнадцатеричная система счисления. Система с основанием 16, наиболее часто встречающаяся в таблицах Unicode, URL-адресах и спецификациях оттенков цвета.

Шина. Набор проводов, используемых для подключения электронных устройств. Также см. USB.

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

Шпионское ПО (spyware). Программное обеспечение, передающее данные о том, что происходит на компьютере, где оно установлено.

Экспоненциальный. Увеличение в определенной пропорции на каждом шаге фиксированного размера или за определенный период времени (например, рост на 6 % в месяц). Часто и бездумно используется в значении «быстрый рост».

Ядро. Центральная часть операционной системы, ответственная за управление работой и ресурсами.

Язык программирования. Совокупность символов для выражения последовательности действий на компьютере, которые далее переводятся в биты, загружаемые в оперативную память. Примеры: ассемблерный язык, С, C++, Java, JavaScript.

Язык разметки гипертекста, или HTML (Hypertext Markup Language). Используется для описания содержимого и формата веб-страницы.

Примечания

1

Принадлежат компании Meta, признанной экстремистской и запрещенной на территории РФ.

2

Принадлежат компании Meta, признанной экстремистской и запрещенной на территории РФ.

3

Большие данные (англ. Big Data) – социально-экономический феномен, связанный с появлением технологических возможностей анализировать огромные массивы данных и вытекающих из этого трансформационных последствий. – Здесь и далее примеч. науч, ред., если не указано иное.

4

Kernighan, Brian W., D is for Digital: What a well-informed person should know about computers and communications, CreateSpace Independent Publishing Platform, 2011.

5

Пер. Е. Г. Бекетовой. – Прим. пер.

6

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

7

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

8

Цитируется в книге Гарри Уилмота Бакстона «Воспоминания о жизни и трудах покойного Чарльза Бэббиджа», 1872 (Harry Wyl-mot Buxton. Memoir of the Life and Labours of the Late Charles Babbage Esq. F.R.S., MIT, 1988). Бэббидж воскликнул это после того, как нашел множество ошибок в астрономических таблицах, где расчеты велись вручную.

9

Электронный числовой интегратор и вычислитель (англ.).

10

Folkswagen Kafer (Kafer в переводе с нем. означает «жук», поэтому во многих странах модель называли соответствующим словом на другом языке, как Beetle в англ.) – легковой автомобиль, выпускавшийся немецкой компанией Volkswagen с 1946 по 2003 год.

11

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

12

Лаборатории Белла (Bell Labs) – финско-американская корпорация, крупный исследовательский центр в области телекоммуникаций, электронных и компьютерных систем. Штаб-квартира расположена в штате Нью-Джерси (США).

13

В английском языке термин «биты» (bits во мн. ч.) образован слиянием слогов из слов bmary digits («двоичные цифры»). Также bits означает «маленькие кусочки».

14

Shannon С. Е. A Mathematical Theory of Communication U Bell System Technical Journal: журнал. – 1948. – Vol. 27. – P. 379–423.

15

В английском языке термин pixel образован слиянием первых слогов сочетания picture element («элемент изображения»).

16

Усовершенствованное звуковое кодирование (англ.).

17

Группа экспертов по движущимся изображениям (англ.).

18

В английском языке понятия «палец» и «цифра» могут обозначаться одним словом – digit.

19

При двоичном счете на пальцах 4 выглядит как выставленный средний палец на одной руке, а 132 – на обеих.

20

На конец сентября 2023 года первое место в списке занимал суперкомпьютер Frontier (США, Hewlett-Packard) с 8,7 миллиона ядер и пиковым быстродействием в 1679 петафлопов.

21

Альтернативное название на русском – «метод разделения попыток доступа со стороны машины и человека».

22

Turing A. Computing machinery and intelligence (англ.) U Mind: журнал. – Oxford: Oxford University Press, 1950. – № 59. – P. 433–460.

23

Одна из множества статей о том, что закон Мура перестанет работать: https:/⁄ www.technologyreview.com/2020/02/24/905789/were-not-prepared-for-the-end-of-moores-law/.

24

Научная (экспоненциальная) запись – представление действительных чисел в виде мантиссы и порядка. Например, 1 201 000 = = 1,201 × 10^6, 0,000000231 = 2,31 × 10 7 и т. п.

25

В английском языке soft означает «мягкий, еле ощутимый», тогда как hard – «твердый, крепкий».

26

Система улучшения характеристик маневренности (англ.).

27

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

28

В английском написании фамилия Льюис (Lewis) находится после Лейтнер (Leitner), но перед Литтл (Little) и Ли (Li).

29

Буквально «быстрая сортировка» (англ.).

30

Математический институт Клэя (CMI) – частная НКО, расположенная в Кембридже (штат Массачусетс, США). Основана в 1998 году, ставит своей целью увеличение и распространение математических знаний.

31

Wilkes М. V. Memoirs of a Computer Pioneer, The MIT Press. 1985.

32

Универсальный язык для коммерческих задач (англ.).

33

UNIVAC I («Универсальная автоматическая ЭВМ») – первый условно коммерческий компьютер, созданный в Соединенных Штатах, и третий коммерческий компьютер в мире. Разрабатывался с 1947 по 1951 год.

34

Центр математики и информатики (нидерл.).

35

Pall Mall Gazette — британская газета, выходившая с 1865 по 1923 год. Впоследствии поглощена Evening Standard.

36

TurboTax — пакет программного обеспечения для подготовки деклараций по подоходному налогу в США, разработанный Intuit; лидер рынка в своем сегменте продуктов.

37

Другое название – «управление правами на цифровую интеллектуальную собственность».

38

Electronic Frontier Foundation — международная некоммерческая группа по защите цифровых прав, базирующаяся в Сан-Франциско, Калифорния. Основана 10 июля 1990 года Джоном Гилмором, Джоном Перри Барлоу и Митчем Капором для продвижения гражданских свобод в интернете.

39

Окончательную победу в споре Google одержал только в апреле 2021 года, однако Верховный суд США не стал определять, защищен ли код Oracle авторским правом, и принял решение лишь о том, что он использовался добросовестно.

40

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

41

GNU — рекурсивный акроним (GNU is Not UNIX, букв. «GNU – это не UNIX»). – Прим. nep.

42

Red Hat — американская компания, производитель программного обеспечения на основе операционной системы Linux: Red Hat Enterprise Linux (распространяется по годовой подписке), Fedora, CentOS, CoreOS.

43

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

44

Брукс Ф. Мифический человеко-месяц, или Как создаются программные системы. (Серия «Профессионально») = The Mythical Man-Month. Essays on Software Engineering. Anniversary Edition. – СПб.: Символ-Плюс, 2000.

45

Digital Equipment Corporation (DEC) – американская компьютерная компания, основана в 1957 году Кеном Олсеном и Харланом Андерсоном, в 1998-м поглощена Compaq.

46

Data General Corporation — одна из первых в мире компаний по производству мини-компьютеров, зарегистрирована в штате Делавэр (США) в 1968 году, в 1999-м поглощена ЕМС.

47

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

48

Fat (англ.) – грузный, увесистый.

49

Portable Document Format – переносимый формат документов (англ.).

50

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

51

Язык гипертекстовой разметки (англ.).

52

По данному адресу в интернете располагается библиотека бесплатных электронных книг, насчитывающая более 70 000 произведений.

53

Цитата из романа «Гордость и предубеждение» дана в переводе И. С. Маршака.

54

Геродот. История в девяти книгах. Кн. VIII, гл. 98. Пер. Г. А. Стратановского. Ленинград: Наука, 1972.

55

Громогласный (англ.).

56

Согласно ряду источников, изобретателем телефона следует считать итальянского ученого Антонио Меуччи, который в 1860 году пришел к выводу о возможности превращения звуковых колебаний в электрические импульсы для передачи голоса на расстояние с помощью проводов. В 1871 году Меуччи запатентовал свое изобретение, названное им «телетрофон», но в конце декабря 1874-го не сумел продлить патент из-за нехватки средств.

57

Comcast Corporation — американская телекоммуникационная корпорация, состоит из трех основных подразделений: Comcast Cable (кабельное телевидение, телефония, интернет-провайдер), NBCUniversal (телеканалы NBC и Telemundo, киностудия Universal Pictures) и Sky (европейская телекоммуникационная компания).

58

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

59

Цифровая абонентская линия (англ.).

60

Синий зуб (англ.).

61

Международный идентификатор мобильного оборудования (англ.) – Прим. пер.

62

Sprint Corporation была основана в 1899 году, перед поглощением насчитывала 58 млн абонентов. T-Mobile US, основанная в 1994 году, на конец 2022 года (после слияния) обслуживала 113,6 млн абонентов.

63

Официальный вариант – «поставщик услуг сети Интернет».

64

Формат обмена графической информацией (англ.).

65

Переносимая сетевая графика (англ.).

66

Перцепционный — здесь «полагающийся на особенности человеческого восприятия».

67

Безопасность, аналогичная защите проводных сетей (англ.). – Прим. пер.

68

Защищенный доступ к Wi-Fi (англ.). – Прим. пер.

69

Интернет-корпорация по присвоению имен и номеров (англ.).

70

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

71

Поиграй в это (англ.).

72

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

73

«Большая корпорация – отстой» (англ.).

74

Буквально «хозяин» (англ.).

75

Точки обмена интернет-трафиком (англ.). – Прим. пер.

76

Akamai Technologies (расположена в Кембридже, штат Массачусетс) – поставщик услуг для акселерации веб-сайтов, провайдер платформ доставки контента и приложений. Компания основана в 1998 году, использует 240 000 территориально распределенных серверов для более быстрой доставки контента посетителям.

77

Протокол обмена гипертекстовой информацией (англ.). – Прим. пер.

78

Обратите внимание, что сначала вам, возможно, потребуется установить клиент Telnet (порядок инсталляции зависит от версии вашей операционной системы).

79

* ER (Elizabeth II Regina) – монограмма английской королевы Елизаветы II (правила с 1952 по 2022 год).

80

Многоцелевые расширения межсетевой электронной почты – Прим. пер.

81

Протокол доступа к интернет-сообщениям (англ.).

82

Северо-Восточный университет — частный исследовательский университет в Бостоне, штат Массачусетс. Основан в 1898 году.

83

Recording Industry Association of America – Американская ассоциация компаний звукозаписи (англ.). – Прим. пер.

84

Motion Picture Association of America – Американская ассоциация кинокомпаний (англ.). – Прим. пер.

85

Закон об авторском праве в цифровую эпоху (англ.). – Прим. пер.

86

Публичный закон.

87

Scribd — американский интернет-сервис облачного хранения документов, предоставляющий услуги подписки на электронные и аудиокниги.

88

Amazon Alexa — виртуальный ассистент, разработанный компанией Amazon и впервые появившийся в 2014 году в «умных» колонках Amazon Echo и Amazon Echo Dot.

89

Childrens Online Privacy Protection Act (Закон о защите конфиденциальности детей в интернете) – американский федеральный закон, касающийся неприкосновенности частной жизни. Вступил в действие с 21 апреля 2000 года.

90

Корнеллский университет — один из крупнейших и известнейших университетов США, входит в Лигу плюща. Основан в 1865 году, кампус находится в Итаке, штат Нью-Йорк.

91

Принят в 1986 году.

92

На компьютерном жаргоне их презрительно называли script kiddies, что можно перевести с английского как «малыши-скрип-тыши».

93

* Судя по адресу, «Эфрейн» работает в некой парикмахерской Ренато в Нидерландах, а не в финансовой организации.

94

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

95

На англоязычном компьютерном жаргоне такие программы называются scareware, что приблизительно переводится как «ПО, работающее на испуге».

96

Другой вариант названия – «человек посередине». – Прим. пер.

97

В качестве примера можно привести проект «Золотой щит» (он же

«Великий Китайский брандмауэр»), систему фильтрации содержимого Сети в КНР. – Прим. пер.

98

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

99

AES (Advanced Encryption Standard) – симметричный алгоритм блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит), принятый в качестве стандарта шифрования правительством США.

100

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

101

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

102

Доктор Сьюз — псевдоним Теодора Сьюза Гайсела (1904–1991), американского детского писателя и мультипликатора. Книга-букварь «За пределами зебры!» (On Beyond Zebra!) представляет двадцать дополнительных букв английского алфавита, которые якобы следуют за Z.

103

Формальное название – «автоматический анализ видеоинформации».

104

Принадлежат компании Meta, признанной экстремистской и запрещенной на территории РФ.

105

Brin S., Page L. The anatomy of a large-scale hypertextual Web search engine. Computer Networks and ISDN Systems. 30 (1–7): 107–117.

106

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

107

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

108

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

109

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

110

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

111

Иеремия (Джереми) Бентам (1748–1832) – английский философ-моралист и правовед, социолог, юрист, родоначальник утилитаризма.

112

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

113

Общий регламент по защите (персональных) данных (англ.). – Прим. пер.

114

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

115

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

116

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

117

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

118

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

119

AOL Inc. – американский медийный конгломерат, поставщик он-лайн-служб и электронных досок объявлений, интернет-пейджера AIM. Основан в 1983 году, в начале 2000-х – крупнейший интернет-провайдер в США, в 2015-м поглощен Verizon.

120

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

121

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

122

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

123

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

124

Herbert Alexander Simon. The New Science of Management Decision. Harper, 1960.

125

Nature (англ. «Природа») – британский журнал, в котором публикуются исследования в основном естественно-научной тематики. Один из самых старых и авторитетных общенаучных журналов мира.

126

Goodreads — интернет-портал так называемой «общественной каталогизации». Сайт предоставляет свободный доступ к обширной базе данных книг, аннотаций, различных обзоров. В 2013 году приобретен Amazon.

127

Название системы можно читать как «мицин», поскольку оно отсылает к суффиксу – mycin, встречающемуся в названии многих антибиотиков.

128

The National Institute of Standards and Technology — подразделение Управления по технологиям США, одного из агентств Министерства торговли США.

129

Роджерианская (клиент-центрир о ванная) психология — метод психотерапии, предложенный Карлом Роджерсом (1902–1987), американским психотерапевтом, который радикально перевернул основное понимание психотерапии: не терапевт, а клиент является экспертом самому себе.

130

Фраза из Евангелия от Матфея (26:41). Синодальный перевод звучит как «Дух бодр, плоть же немощна».

131

xkcd — веб-комикс Рэндела Манро о романтике, сарказме, математике и языке, публикующийся с 29 мая 2005 года и выходящий трижды в неделю.

132

Пауль Целан (1920–1970) – румынский, позже французский поэт и переводчик, писавший на немецком языке. Гертруда Стайн (1874–1946) – американская писательница, теоретик литературы. Рэймонд Курцвейл (р. 1948) – американский изобретатель и футуролог, создатель многочисленных систем распознавания речи.

133

Гленн Гринвальд. Негде спрятаться. Эдвард Сноуден и зоркий глаз Дядюшки Сэма. – СПб.: Питер, 2015.

134

Стандарт шифрования данных (англ.).

135

Улучшенный стандарт шифрования (англ.).

136

Штаб-квартира британской правительственной связи (англ.).

137

Составное число — натуральное число, имеющее делители, отличные от единицы и самого себя (т. е. не простое число и не единица).

138

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

139

Буквально «луковый маршрутизатор» (англ.). – Прим. пер.

140

Чуть больше 8000 на начало октября 2023 года.

141

TORI — Target Office of Primary Interests – специальный отдел первоочередных задач (англ.).

142

Название образовано от английских слов bit — бит и coin — монета.

143

В декабре 2023 года 1 биткоин (ВТС) стоил 42 389,50 $.

144

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

145

В английском языке эта «методика» носит название «четыре В» (от Bribery, Blackmail, Burglary, Brutality).

146

Йоги Берра (настоящее имя Лоуренс Питер Берра, 1925–2015) – американский бейсболист, игрок Главной лиги бейсбола, выступавший на позициях кетчера и аутфилдера, впоследствии тренер и спортивный менеджер. Нильс Бор (1885–1962) – датский физик-теоретик и общественный деятель, один из создателей современной физики. Сэмюэл Голд вин (1882–1974) – американский кинопродюсер, один из основателей киностудии Metro-Goldwyn-Mayer. Ричард Хэмминг (1915–1998) – американский математик, работы которого в сфере теории информации оказали существенное влияние на компьютерные науки и телекоммуникации.

147

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

148

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

149

Оценка, аналог «тройки с плюсом».

150

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

151

Принадлежит компании Meta, признанной экстремистской и запрещенной на территории РФ.

152

Сэмюэл Джонсон (1709–1784) – английский литературный критик, лексикограф и поэт эпохи Просвещения.

Content

Брайан Керниган
Основы информационных технологий для неспециалистов: что происходит внутри машин

Предисловие

Благодарности

Благодарность за второе издание книги «Цифровой мир»

Благодарности за книгу «D значит Digital»

Введение

Часть I Аппаратное обеспечение

1. Что такое компьютер?

1.1. Логическое построение

1.1.1. Процессор

1.1.2. Оперативная память

1.1.3. Внешняя память

1.1.4. Другие устройства

1.2. Механическая конструкция

1.3. Закон Мура

1.4. Краткие выводы

2. Биты, байты и формат записи информации

2.1. Различия аналоговой и цифровой форм

2.2. Аналого-цифровое преобразование

2.2.1. Оцифровка изображений

2.2.2. Оцифровка звука

2.2.3. Оцифровка фильмов

2.2.4. Оцифровка текста

2.3. Биты, байты и двоичная система исчисления

2.3.1. Биты

2.3.2. Степени чисел 2 и 10

2.3.3. Двоичные числа

2.3.4. Байты

2.4. Краткие выводы

3. Процессор изнутри

3.1. Компьютер-игрушка

3.1.1. Первая программа компьютера-игрушки

3.1.2. Вторая программа компьютера-игрушки

3.1.3. Инструкции ветвления

3.1.4. Представление в памяти

3.2. Настоящие процессоры

3.3. Кэширование

3.4. Другие виды вычислительных устройств

3.5. Краткие выводы

Часть II Программное обеспечение

4 Алгоритмы

4.1. Линейные алгоритмы

4.2. Двоичный поиск

4.3. Сортировка

4.4. Трудности и сложности

4.5. Краткие выводы

5. Программирование и языки программирования

5.1. Ассемблерный (сборочный) язык

5.2. Языки высокого уровня

5.3. Разработка программного обеспечения

5.3.1. Библиотеки, интерфейсы и средства разработки

5.3.2. Ошибки (баги)

5.4. Интеллектуальная собственность

5.4.1. Коммерческая тайна

5.4.2. Товарный знак

5.4.3. Авторское право

5.4.4. Патент

5.4.5. Лицензии

5.5. Стандарты

5.6. Программное обеспечение с открытым исходным кодом

5.7. Краткие выводы

6. Программные системы

6.1. Операционные системы

6.2. Как работает операционная система

6.2.1. Системные вызовы

6.2.2. Драйверы устройств

6.3. Другие операционные системы

6.4. Файловые системы

6.4.1. Файловые системы внешней памяти

6.4.2. Удаление файлов

6.4.3. Другие файловые системы

6.5. Приложения

6.6. Уровни программного обеспечения

6.7. Краткие выводы

7. Учимся программировать

7.1. Принципы языков программирования

7.2. Первая программа на JavaScript

7.3. Вторая программа на JavaScript

7.4. Циклы и условия

7.5. Библиотеки и интерфейсы JavaScript

7.6. Как работает JavaScript

7.7. Первая программа на Python

7.8. Вторая программа на Python

7.9. Библиотеки и интерфейсы Python

7.10. Как работает Python

7.11. Краткие выводы

Часть III Коммуникации

8. Сети

8.1. Телефоны и модемы

8.2. Кабель и DSL

8.3. Локальные сети и Ethernet

8.4. Беспроводные сети

8.5. Мобильные телефоны

8.6. Пропускная способность

8.7. Сжатие

8.8. Обнаружение и исправление ошибок

8.9. Краткие выводы

9. Интернет

9.1. Обзор интернета

9.2. Доменные имена и адреса

9.2.1. Система доменных имен

9.2.2. IP-адреса

9.2.3. Корневые серверы

9.2.4. Регистрация вашего собственного домена

9.3. Маршрутизация

9.4. Протоколы TCP/IP

9.4.1. Интернет-протокол (IP)

9.4.2. Протокол управления передачей (TCP)

9.5. Протоколы более высокого уровня

9.5.1. Telnet и SSH: удаленный вход в систему

9.5.2. SMTP: простой протокол передачи почты

9.5.3. Обмен файлами и одноранговые протоколы

9.6. Авторское право в интернете

9.7. Интернет вещей

9.8. Краткие выводы

10. Всемирная паутина

10.1. Как работает Всемирная паутина

10.2. HTML

10.3. Куки-файлы

10.4. Активный контент на веб-страницах

10.5. Активный контент в других местах

10.6. Вирусы, черви и троянские кони

10.7. Веб-безопасность

10.7.1. Атаки на клиентов

10.7.2. Атаки на серверы

10.7.3. Атаки на передаваемую информацию

10.8. Как защитить себя

10.9. Краткие выводы

Часть IV Данные

11. Данные и информация

11.1. Поиск

11.2. Отслеживание

11.3. Социальные сети

11.4. Интеллектуальный анализ и агрегирование данных

11.5. Облачные вычисления

11.6. Краткие выводы

12. Искусственный интеллект и машинное обучение

12.1. Историческая справка

12.2. Классическое машинное обучение

12.3. Нейронные сети и глубокое обучение

12.4. Обработка естественного языка

12.5. Краткие выводы

13. Конфиденциальность и безопасность

13.1. Криптография

13.1.1. Криптография с секретным ключом

13.1.2. Криптография с открытым ключом

13.2. Анонимность

13.2.1. Конфиденциальность в Сети

13.2.2. Биткоин

13.3. Краткие выводы

14. Что дальше?

Примечания

Глоссарий

Примечания