The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

  Специально студентам неблизким к информационным технологиям, экономистам, юристам и прочим нетехнарям-гуманитариям, желающим знать немного больше, чем слово «браузер» …
By Jouel Spolski

Источник: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joul Spolski

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

Джоэл Спольски, Среда, 8 октября 2003

Вы никогда не задумывались о таинственном теге Content-Type? Того самого, который неизвестно как выглядит, если его надо вставить в HTML документ? Вы когда-нибудь получали электронную почту от своих друзей из Болгарии с темой «???? ???????? ????»?

Осознав, что множество разработчиков программного обеспечения абсолютно не компетентны во всем, что касается наборов символов, кодировкой, Unicode, считая все это таинственным миром, я был разочарован. Пару лет назад, при бета-тестировании FogBUGZ, стало любопытно, а справиться ли он с входящей почтой на японском языке. Японский? Электропочта на японском? Об этом я и мечтать не смел. При тщательной отладке коммерческого ActiveX компонента, который мы использовали для анализа MIME сообщений электронной почты, мы обнаружили, что при работе с текстом он делает что-то совсем непотребное и были вынуждены героически править код для исключения неправильных преобразований, что бы заставить его работать так, как надо. Когда я присматривался к другой коммерческой библиотеке, да к тому же еще в объектном коде, то в переписке с разработчиком этого пакета узнал, что он «ничего не сможет с этим поделать». Как и большинство программистов, он просто понадеялся, что все и так сойдет. Не получилось. А когда я обнаружил, что для популярнейшего средства Web-разработки PHP демонстрируется полное незнание вопросов кодировки, а для представления символов беспечно использует 8 бит, что делает практически невозможной любую «языковую примочку» в хороших международных Web-приложений, то понял — довольно, пора что-то делать.

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

Кроме того,

ИТ не так уж сложны

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

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

Историческая справка

Рис.1
Понять это проще всего, если заглянуть в историю. Не думаете, что сейчас я расскажу об очень старых наборах символов, например, EBCDIC. Не буду, нет. EBCDIC не имеет никакого отношения к нашей жизни. Так далеко углубляться в прошлое не надо. Вернёмся в лишь в недалёкое прошлое. Когда был придуман Unix и K&R писали о Языке программирования C, все было очень просто. EBCDIC был единственным выходом из положения. Символы, имеющие значение, — это только добрые старые безударные английские буквы, а код это, так называемый, ASCII-код, в котором для представления каждого символа используется число от 32 до 127. А до 32 все было свободно, буква «А» — это 65 и т.д. Все это удобно и можно хранить в 7 битах.

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

Все, что меньше 32 считалось нецензурными, предназначенным исключительно для ругательств. Шутка такая. На самом деле — это символы управления, например, 7 — это звуковой сигнал, которые должен изрекать компьютер, а 12 выбрасывает текущую страницу бумаги из принтера и на прокорм забирает новую.

И все бы было ничего, если бы был только английский. Постольку поскольку в байт помещалось восемь бит, то многим пришло в голову — «черт возьми, для себя любимого можно использовать коды диапазона 128-255». Но всё дело в том, что эта мысль пришла одновременно ко многим, а у каждого свои собственные идеи по использованию пространства от 128 до 255. У IBM-PC это выродилось в наборы OEM символов, где представлены нетрадиционные для английского символы европейских языков, а так же куча символов псевдографики для рисования — горизонтальные и вертикальные полосы, горизонтальные полосы с небольшими галтелями, оборванными по краям и т.д. С помощью таких графических символов можно нарисовать на экране элегантный бокс, который Вы еще сможете подсмотреть на компьютере 8088 своей химчистки. В действительности, как только ПК стали покупать за пределами Америки, каждый стал выдумывать свои наборы OEM символов, использующие верхние 128 кодов для своих собственных нужд. Например, на некоторых ПК код 130 будет отображать как символ é, а на компьютерах, продаваемых в Израиле, на иврите, будет написано гимел (λ). Поэтому, когда американцы посылают свои résumés в Израиль то, там читают rλsumλs . Частенько, например у русских, было множество различных реализаций верхних 128 кодов. Так, что надежно обмениваться русскими документами было невозможно.

Рис.2В итоге по либеральному принципу «свободно для всех» OEM стало стандартом ANSI кодировок. Согласно стандарту ANSI коды до 128 полностью соответствуют ASCII, а символы с кодами от 128 и выше зависят от Вашего местожительства с полной свободой реализации. Такие различия операционных систем назвали кодовыми страницами. Так, например, в Израиле DOS использует 862 кодовую страницу, в то же время греки предпочитают 737. Они одинаковы до 128 и отличаются после 128, где живут все эти смешные буковки. В национальных версиях MS-DOS были десятки кодовых страниц для обработки всего не английского, а может быть исландского. Было даже несколько «многоязычных» кодовых страниц, что позволяло работать на одном компьютере одновременно и на эсперанто, и на галисийском! Вот так! Однако, написать свою собственную программу, использующую для отображения растровую графику так, чтобы на одном компьютере работали одновременно и евреи, и греки принципиально невозможно — иврит и греческий слишком различны в интерпретации кодов и требуют абсолютно разных кодовых страниц.

А тем временем в Азии творится вообще полное безумие с учетом того факта, что азиатские алфавиты содержат тысячи символов, т.е. все их, ну никак, не вписать в 8 бит. Как правило, использовались «грязные» методы типа DBCS, «Double Byte Character Set», где часть букв кодируются одним байтом, а другая — двумя. В такой строке легко перемещаться вперед, но, чёрт возьми, совершенно не возможно назад. Для движения по строке назад и вперед программистам рекомендовалось не использовать *S++ и *S—, а вместо этого применять функции типа AnsiNext и AnsiPrev в Windows, которые научили бороться со всем этим кошмаром.

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

Unicode

Unicode — это смелая попытка создания единого набора символов, включающего все разумные системы письма на планете и даже некоторые, искусственно созданные такие, например, как «клингонский язык». Многие заблуждаются, считая Unicode просто 16-разрядным кодом, где каждому символу отводится 16 бит, т.е. 65 536 возможных комбинаций. На самом деле все не так. Это самый распространенный миф о Unicode, а если вы так думаете, то пусть же Вам будет хуже.

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

А -> 0100 0001

В Unicode символом называют код местоположения в таблице, а не битовый образ, — это теоретическая концепция. Именно, код места хранится в памяти или на диске. Образ А в Unicode — это платонический идеал. Это просто, парящий в небе символ A.

Этот платонический А отличается от B, точно так же, как а отличается А, но А не отличается от A, хотя отличается от а. Идея того, что «А» шрифта Times New Roman то же самое, что и «А» шрифта Helvetica, но отличается от «а» в нижнем регистре, не кажется очень уж спорной. Однако, выясняется, что в некоторых языках графический образ может быть сомнительным. Немецкий символ β – это действительно символ или причудливый способ написания ss? Если символ изменен в конце слова, является ли он другой буквой? Евреи говорят «да», а арабы «нет». Но по любому, Вам не придется об этом беспокоиться потому, что умные люди из консорциума Unicode на протяжении последнего десятилетия или около того только тем и занимались, что выясняли всё это, проводя большие и высокопарные политические споры для всеобщей ясности и понимания.

Всякому платоническому символу всякого алфавита консорциумом Unicode присвоено магическое число, которое записывается в виде U+0639. Это магическое число называется кодом места. U+ означает «Unicode», далее шестнадцатеричное число. U+0639 — это арабское Айн. Английская буква А — U+0041. Вы можете найти их все с помощью утилиты отображении символов вWindows 2000/XP или посетив веб-сайте Unicode.

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

Итак, у нас есть строка:

Hello,

что в Unicode соответствует пяти кодам:

U+0048 U+0065 U+006C U+006C U+006F.

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

Кодировка

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

00 48 00 65 00 6C 00 6C 00 6F

Верно? Но, не спешите! А не то же ли самое:

48 00 65 00 6C 00 6C 00 6F 00?

Ну, на самом деле, по технике это одно и то же и я уверен, что первые разработчики были в сомнениях — для какого конкретного режима работы процессора естественней хранить номера Unicode в старших байтах, а для какого в младших, но был вечер, и было утро, и вот уже два способа хранения Unicode. Так люди вынуждены придумать странные соглашения о записи FE FF в начале каждой строки Unicode. Это называется Unicode Byte Order Mark, и если вы смените свои старшие байты на младшие, то это будет выглядеть, как FF FE, а человек, читающий вашу строку, будет знать, что необходимо поменять местами все оставшиеся байты. Уф … Однако, в дикой природе не каждая строка Unicode содержит в начале метку порядка байтов.

Какое-то время всем всё казалось довольно удобным, но заворчали программисты. «Посмотрите на все эти нули!» — говорили они потому, что были американцами и смотрели только на английский текст, где редко используются номера более U+00FF. Более того, все эти либеральные Калифорнийские хиппи не хотели расти над собой. Техасцы даже не думали бы о двукратном поглощении байтов (прикол). Но эти калифорнийские слабаки не смогли переварить идею удвоения памяти для хранения текстов. Так или иначе, но уже есть масса ANSI и DBCS документов и, черт возьми, кто будет их конвертировать? Мы? Вот только по этой причине на протяжении нескольких лет большинство решительно игнорировало Unicode, а за это время всё стало совсем плохо.

В итоге, появилась блестящая концепция UTF-8. UTF-8 – это другая системы хранения кодов, этих волшебных U+номеров строки Unicode в памяти с помощью 8 битного байта. В UTF-8 каждый код от 0 до 127 хранится в одном байте. И только для хранения некоторых кодов от 128 и больше используются 2, 3, а на самом деле, до 6 байтов.
Рис.3
Английский текст выглядит в UTF-8 точно так же, как в ASCII, в чем нет ничего плохого. Но американцы даже не замечают этого галантного побочного эффекта. А весь остальной мир вынужден подпрыгивать в кольце. В частности, Hello, U+0048 U+0065 U+006C U+006C U+006F, будет храниться в виде 48 65 6C 6C 6F, вот! Точно так же как он хранится в ASCII, ANSI и любом OEM наборе планеты. Теперь, если вы возьмете на себя смелость использовать нестандартные или греческие буквы, клингонский язык, и должны будете использовать несколько байт для хранения одного номера символа, то американцы этого просто не заметят. (Кроме того, UTF-8 обладает хорошим свойством не обрезать строки в косолапой старой строке, где байт со значение NULL используется как нуль-терминатор).

До сих пор я говорил о трёх способах кодирования Unicode. Традиционные store-it-in-two-byte методы называются UCS-2 (потому что два байта) или UTF-16 (потому что 16 бит) и вы поняли, что такое UCS-2 старшего байта и UCS-2 младшего байта. Новый популярный стандарт UTF-8, обладает еще одним замечательным свойством — счастливым совпадением текстов на английском языке в различных кодировках, что позволяет прилично работать брендовым программам, которые даже не подозревают, что существует нечто кроме ASCII.

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

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

Надеюсь теперь, Вы думаете о сущности с точки зрения платонического идеала буквы, представленной номером в Unicode, которое может быть закодировано по схеме любой не слишком древней школы кодирования! Например, вы можете кодировать Unicode строку Hello (U+0048 U+0065 U +006C U+006C U+006F) в ASCII или старом OEM греческой кодировки, или иврите ANSI кодировки, или любой другой из нескольких сотен кодировок, изобретённых до сих пор с пониманием того, что некоторые буквы могут просто не отображаться! Если номер Unicode не заполнен, а Вы пытаетесь показать этот символ, то, обычно, получаете небольшой знак вопроса «?», а если Вы действительно хороши, то вопрос в коробке �. У Вас какой?

Есть сотни традиционных кодировок, где верно хранятся только некоторые номера, а все остальные места Unicode заменяются вопросительным знаком. Наиболее популярными кодировками текста для английского являются Windows-1252 (Windows 9x стандарт западноевропейских языков) и ISO-8859-1, также известный как Latin-1 (полезен для любого западноевропейского языка). Но попробуйте в них сохранить буквы русского или иврита и вы получите кучу вопросительных знаков. А вот UTF, 7, 8, 16 и 32 — все обладают хорошими свойствами и позволяют правильно хранить любой номер.

Самое важное в кодировках

Если вы полностью забудите все, что я только что сейчас объяснил, помните одно чрезвычайно важное обстоятельство — строка не имеет смысла, если не известна её кодировка. И Вы больше не можете прятать голову в песок и делать вид, что «просто текст» — это ASCII.

Нет такого понятия «просто текст».

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

Почти каждый брюзжал — «мой сайт выглядит бредом» или «она не может прочитать мои письма не на английском». А проблему создал один наивный программист, который не понимает простого факта — если ему не сказали, что конкретная строка закодирована UTF-8, ASCII, ISO 8859-1 (Latin 1) или Windows 1252 (западноевропейская), то просто невозможно правильно её отобразить, более того, даже выяснить, где же она заканчивается.

Существует более ста кодировок, где номера более 127 полностью отсутствуют.

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

Content-Type: text/plain; charset=»UTF-8″

Для веб-страниц была оригинальная идея — веб-сервер в заголовке http возвращает аналогичный Content-Type, т.е. не в HTML странице, а в заголовке, который отправляются до передачи самой HTML страницы.

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

Было бы удобно получить возможность размещать Content-Type в самом файле HTML, используя какой-то специальный тег. Конечно, пуристы сочтут Вас за сумасшедшего … Как вы можете прочитать HTML файл, если не знаете в какой он кодировке?! К счастью, почти у всех кодировок коды всех символов от 32 до 127 одинаковы, так что вы всегда можете прочитать страницу HTML без использования смешанных записей до:

1334677249-clip-2kb

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

Что делают веб-браузеры, если не находят Content-Type в HTTP заголовке или в мета-теге? Internet Explorer на деле предпринимает что-то довольно интересное — по частоте появления характерных байт в характерных местах текста он пытается угадать язык и кодировку. По-столько по-скольку, старых 8 битовых страниц мало, а национальные буквы, из диапазона между 128 и 255, имеют характерные частоты распределения в текстах различных человечьих языков, то это, скорее всего, имеет шансы работать. По настоящему странно то, что это работает довольно часто потому, что веб-страницы наивных писателей, которые никогда не знали о Content-Type в заголовке, выглядят в web-браузере нормально, пока в один прекрасный день, они не начнут писать тексты с отличным от их родного языка частотным распределение букв. Тогда Internet Explorer решит, что это корейский и соответствующим образом отобразит, доказывая, как думается, закон Постела «Будь требователен к тому, что отсылаешь, и либерален к тому, что принимаешь», откровенно неважный принцип для инженера. Во всяком случае, что делает бедный читатель болгарского сайта, который показан на корейском (и даже фрагментарно на корейском)? В главном меню «Просмотр» пункт «Кодировка» он пытается перебирать кучу разных кодировок (по крайней мере дюжину для восточн-европейских языков), пока страница не прояснится. Если он знает, что делать, но большинство об этом не знает.

В программном обеспечении последней версии CityDesk — системы управления контентом сайта моей компании, мы решили всю внутреннюю кодировку сделать в UCS-2 (два байта) Unicode, которая по жизни была родной в Visual Basic, COM, и Windows NT/2000/XP. В кодах на C++ мы просто объявили строки как wchar_t («широкий символ»), а не char и использовать wcs_функции вместо str_функций (например, wcscat и wcslen вместо strcat и strlen). Для записи литеральной константы UCS-2 в коде на C достаточно перед ней просто написать символ L, вот так: L»Hello».

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

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

Не бойтесь космонавтов архитектуры

Don’t Let Architecture Astronauts Scare You by Joel Spolsky

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

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

КОСМОНАВТЫ АРХИТЕКТУРЫ
Таких людей я называю Космонавтами Архитектуры [1]. Это очень трудно — заставить их писать код или проектировать программу, ведь они постоянно заняты мыслями об архитектуре. Они космонавты и витают там вверху, в безвоздушном пространстве. Правда, я не знаю, чем они дышат. Работают они, как правило, в истинно великих компаниях, где позволительно содержать толпу бездельников с учеными степенями, ни одной строчкой не вносящих реальный вклад в дело.

Свеженький пример. Типичный космонавт архитектуры, размышляя над тем, что «Napster — Peer-To-Peer (P2P) [2] сервис для обмена музыкой» проигнорировал все, кроме архитектуры, думая, что интересно только Peer-To-Peer, забыв о том, что ещё можно ввести название песни и мгновенно её прослушать.

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

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

Еще одно распространенное свойство космонавтов архитектуры — заявлять, придумав новую архитектуру, что именно она что-то решает. Java, XML, SOAP, XML-RPC, Hailstorm, NET, Jini, о боже я не успеваю. И это только за последние 12 месяцев! Я не хочу сказать ничего плохого об этих архитектурах, ни в коем случае. Это довольно хорошие архитектуры. Но какой грандиозной шумихой все это сопровождается. Помните white paper [3] Microsoft Dot Net? «Следующее поколение настольных платформ Windows, Windows.NET поддерживает продуктивность, креативность, управление, развлечения и многое другое, и предназначен обеспечить полный контроль пользователя над своей цифровой жизнью». Это было около 9 месяцев назад. А месяц назад мы получили Microsoft Hailstorm. В white paper последнего говорится: «Люди не управляют технологией, которая их окружает …. Hailstorm заставляет технологию в вашей жизни работать вместе от Вашего имени и под вашим контролем». О, великолепно, теперь высокотехнологичный галогеновый свет в моей квартире перестанет моргать случайным образом.

Microsoft не одинок. Вот цитата из white paper Jini: «Три таких факта — вы новый системный администратор, нет компьютеров, один компьютер есть всегда, должны реально сочетаться для улучшения мира, когда исчезают границы и компьютер доступен везде и всегда, а работать с ним так же просто, как положить DVD в лоток домашнего кинотеатра».

И даже не напоминайте мне о навозе, распространяемом Джорджом Гилдером о Java: «Важнейший прорыв в истории техники …» Верный признак того, что Вам угрожает космонавт архитектуры — это невероятная напыщенность; героическая, утопическая высокопарность; хвастовство; полное отсутствие чувства меры. И люди покупаются! Деловая пресса сходит с ума!

Почему, черт возьми, людей так впечатляет скучная архитектура, которая зачастую не более чем новый формат передачи RPC или просто виртуальная машина? Такие вещи могут быть хорошими архитектурами, они, безусловно, благо для разработчиков, которые их применяют, но это не замена, я повторюсь, не замена мессии, въезжающего на белой ослице в Иерусалим или миру во всем мире. Эй, Microsoft, компьютеры не начнут вдруг читать наши мысли и автоматически делать то, что мы хотим только потому, что у каждого в мире есть Login и Password. Очнитесь, Sun, мы не сможем и не будем анализировать свои корпоративные данные о продажах «так же просто, как положить DVD в лоток домашнего кинотеатра».

Помните, космонавты архитектуры — это люди, решающие те проблемы, которые они способны решить, а не те, решение которых действительно необходимо. SOAP + WSDL может быть действительно горячая штучка, но на самом деле она не позволяет делать что-то такое, что невозможно при желании сделать без неё, опираясь на другие ранние технологий. Вся та нирвана распределённых сервисов, о которой болтают космонавты, уже была обещана в прошлом, когда мы использовали DCOM, JavaBeans, OSF DEC или CORBA.

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

Источник: Don’t Let Architecture Astronauts Scare You by Joel Spolsky

Вольный перевод автора.

ПРИМЕЧАНИЕ:

  1. В оригинале Architecture Astronauts. Но слово космонавт все же, в приложении к русскому яснее. Поэтому и будем употреблять далее Космонавт архитектуры;
  2. Peer-to-peer (или P2P) — это технология построения распределенной сети, в которой каждый узел может одновременно выступать как в роли получателя, так и поставщика информации;
  3. Белая книга (White paper) — это официальное сообщение в письменном виде, обычно этот термин применяется в США, Великобритании, Ирландии и других англоговорящих странах. Это может быть государственное сообщение, поясняющее политику; справочный документ для корпоративных клиентов. В информационных технологиях это, как правило, текст, который Вы читаете при установке программного обеспечения.

Советы студентам Computer Science

Advice for Computer Science College Students by Joel Spolsky

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

Большинство студентов, к счастью, достаточно дерзки и не стесняются задавать вопросы старейшинам компьютерных наук, и это правильно, несмотря на то, что старики склонны говорить странные допотопные вещи типа: «спрос на операторов перфоратора превысит 100 млн. к 2010 году» или «lisp-карьера — круто именно сейчас».

Я тоже не знаю, что говорить, когда даю советы студентам. Я так безнадежно устарел, что бы понять, что такое AIM [2], и о, ужас, использую эту оригинальную старинную вещь, называемую «электронной почтой», которая была популярна в те дни музыки на плоских круглых пластинках, называемых «компакт-дисками».

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

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

О чем я говорил? Ах да, советы. Без лишних слов, вот семь свободных Советов от Джоэла для CS-студентов [3] (они стоят того, что бы за них заплатить [4]):

  1. Научитесь писать;
  2. Изучите «С»;
  3. Выучите микроэкономику и все это до окончания учёбы, а так же
  4. Не пропускайте скучные занятия по некомпьютерным наукам;
  5. Обязательно пройдите интенсивные курсы программирования;
  6. Перестаньте беспокоиться о рабочих местах в Индии;
  7. Независимо от того, что вам нравится, летом пройдите хорошую практику.

Теперь, перед разъяснениями, добавлю — 8. Обратитесь к профессионалу, что бы самоутвердится, если вы не достаточно доверчивы, чтобы просто делать все то, о чем я вам сейчас расскажу.

Научитесь писать до конца учебы

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

Вы слышали о последней моде — экстремальном программировании? Ну, не вдаваясь в то, что я думаю об XP [5], все, что Вы знаете об XP, только благодаря очень талантливым писателям и ораторам.

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

Разница между хорошим и великим программистом не в том, как много языков программирования они знают и что предпочитают Python или Java, а в том могут ли они рассказывать о своих идеях. Убеждая других, они получают дополнительное влияние. Ясное комментирование и описание технических характеристик позволяет другим понимать таких программистов, и это значит, что все могут использовать и работать с их кодом, а не переписывать его заново. При отсутствии этого, программа ничего не стоит. Понятная техническая документация для конечных пользователей позволяют понять, что программа должна делать и это единственный способ показать пользователям её ценность. На SourceForge એ похоронено много прекрасных и полезных кодов, которые никто не использует, только потому, что их создатели не умеют хорошо писать (и пишут ли вообще). Поэтому никто не знает, что они сделали, а их блестящий код просто пропадает.

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

Большинство университетов проводит курсы типа «Интенсивный письменный», где вы должны много написать для сдачи зачета. Присмотритесь и идите на такие курсы! Ищите занятия в любой области, которые требуют еженедельной или даже ежедневной письменной работы. Заведите дневник или веб-блог. Чем больше вы будете писать, тем писать будет легче и, наоборот, чем легче вам будет писаться, тем писать вы будете больше.

Изучите «С» до конца учебы

;

Совет второй — «C», обратите внимание, не «C++». Хотя «C» становится все более редким, он по-прежнему лингва-франка рабочий язык программистов. Это язык, который они используют для общения друг с другом. И, что более важно, он намного ближе к машине, чем «современные» языки такие, как ML, Java, Python, которым Вас будут учить в университете по не совершенным, но модным теориям педагогики. По крайней мере, в течение одного семестра, Вы должны приблизиться к машине, иначе эффективный код высокого уровня будет Вам недоступен. Вы не сможете работать над компиляторами и операционными системами, т.е. на самых привлекательных рабочих местах в программировании. Вам никогда не доверят создания архитектуры крупномасштабных проектов. Мне все равно, как много вы знаете о продолжениях, закрытии и исключениях, если не можете объяснить, почему while(*s++ = *t++); — это обычное копирование строки, и доказать мне, что это самая естественная вещь в мире. Ну, а если это не так, то Вы программируете, насколько я могу судить, основываясь на суеверии, как врач, не знающий анатомии, раздаёт рецепты по рекомендациям аптекарши.

Выучите микроэкономику до конца учебы

МикроэкономикаСупер- быстрый обзор для тех, кто не знает экономики. Экономика — это одна из тех областей, которая начинается с приятного возбуждения. Она полна полезных теорий и фактов, которые действительно имеют смысл, могут быть доказаны на практике и т.д. Первый полезный толчок дает микроэкономика, которая является основой любой мало-мальски значимой теории в бизнесе. После этого все начинается ухудшаться — вы переходите к макроэкономике (если хотите, её можно пропустить) с ее интересными теориями о том, как процентные ставки влияют на безработицу, которые, похоже, опровергается гораздо чаще, чем подтверждаются. Дальше все становится ещё хуже и поэтому многие студенты, ранее специализировавшиеся в экономике, уходят в физику, что, впрочем, все равно дает им право на теплое местечко Wall Street-а. Но обязательно изучите микроэкономику, потому что вы должны знать о спросе и предложении, вы должны знать о конкурентных преимуществах, вы должны понимать, что такое NPV [6], дисконтирование и предельная полезность, прежде чем получите представление, почему бизнес работает именно так, а не иначе.

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

Не пропускайте скучные занятия по некомпьютерным наукам

Пропуски занятий, не относящихся к Computer Science — отличный способ получить низкий средний балл.

Не стоит недооценивать важность Вашего среднего балла. Большинство агентов по найму и менеджеров по персоналу, включая меня, сразу же ищут средний балл, просматривая резюме, и мы не собираемся за это извиняться. Почему? Потому что средний балл, болше чем любая другая оценка, отражает то, что думают о вашей работе дюжина профессоров за долгий период и в различных ситуациях. Вступительный экзамен (SAT [7])? Ха! Да это только один тест на несколько часов. Средний же балл отражает сотни письменных заданий, промежуточные аттестации и активность на занятиях за четыре года. Да, у этой оценки есть свои недостатки. Он подвержен инфляции [8]. Средний бал ничего не говорит о том, как Вы его получили, посещая легкие лекции по домашней экономике в Podunk Community College, или изучили квантовую механику в Caltech. В конце концов, только после того, как я отсею всех со средним баллом в 2.5 из Podunk Community, я спрошу копии аттестатов и рекомендации. Затем я смотрю на твердые высокие оценки, и не только по вычислительным наукам.

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

В университете я пошел на курс культурной антропологии, потому что понял, а ведь чёрт возьми, я должен что-то знать из антропологии, а этот курс выглядит интересным и исследовательским. Интересно? Ничего подобного! Я должен был читать эти невероятно монотонные книги об индейцах бразильских тропических лесов и с островов Тробриан, которые, при всем моём уважении, не очень-то меня интересуют. В какой-то момент, занятия стали невероятно утомительны, и мне хотелось чего-то более захватывающего, например, понаблюдать, как растет трава. Я совсем потерял интерес к предмету. Навсегда и основательно. Мои глаза закрывались. Я так устал от бесконечных обсуждений сбора ямса. Я не знаю, почему на острове Тробриан так много времени уходит на сбор ямса, ведь это невероятно скучно, но я помнил, что необходимо сдать промежуточную аттестацию, и поэтому пахал. В конце концов, я решил, что культурная антропология — это моя рутина, моя личная полоса препятствий от скуки. Если бы я изучал курс, где зачетные тесты требуют знаний об укрывном материале, то я смогу справиться со всем этим, как бы скучно это не было. В другой раз я случайно застрять в Линкольн-центре, просидев целых 18 часов на Вагнеровском «Кольце Нибелунгов», когда Квакиутль был мне приятен в сравнении с моим обучением. Я получил наивысшую оценку по антропологии. А если я смог это сделать, то и Вы это можете.

Возьмите интенсивные курсы программирования

Я помню тот момент, кода я поклялся не поступать в аспирантуру. Это было на курсе «Динамической логики», который вёл Ленор Зак (Lenore Zuck) в Йельском университете, один из самых ярких представителей очень авторитетного факультета Computer Science. По истечении времени, мои мрачные воспоминания не станут рекламой этому предмету, но позвольте мне довести дело до конца. Идеей формальной логики является то, что вы доказываете истину, потому что исходные посылы содержат истину. Например, истинность высказываний «Каждый, кто получает хорошие оценки, получает работу» и «Джонни получил хорошие оценки» по формальной логике позволит Вам получить новый истинный факт — «Джонни получит работу». Это очень изящно и весело, требует всего десяти секунд для понимания формальной логики и того, насколько это бесполезно.

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

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

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

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

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

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

Мораль этой истории в том, что информатика это не то же самое, что разработка программного обеспечения. Вам действительно очень повезет, если Ваш университет имеет достойную программу курса проектирования программного обеспечения. Хотя, скорее всего, это не так, потому что в элитных школах считается, что получение практических навыков лучше оставить профессионально-техническим училищам и программам тюремной реабилитации. Простое программирование Вы можете изучать в любом месте. В Йельском же университете мы воспитываем будущих мировых лидеров. Вы считаете, что ваша плата за обучение в $160,000 дает Вам право изучать только цикл while? Вы считаете, что пришли на однодневный Java-семинар на Airport Marriott? Тьфу.

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

ИнтенсивЕсли вам повезет, Вы можете найти множество интенсивных курсов программирования на факультете Computer Science, точно так же, как вы можете найти множество курсов на историческом факультете, где вы будете писать достаточно много, чтобы научиться писать. Такие курсы лучше пройти.

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

Перестаньте беспокоиться о рабочих местах в Индии

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

Но я постоянно слышу, что число абитуриентов факультета CS опасно падает, и одна из причин — «студенты боятся рынка труда, где все рабочие места в Индии». Это очень неправильно по многим причинам. Во-первых, пытаться выбрать карьеру, ориентируясь на текущие причуды бизнеса, глупо. Во-вторых, даже если всё программирование переместится в Индию и Китай, оно является невероятно хорошей тренировкой для многих видов сказочно интересных работ, например, анализ и инжениринг бизнес-процессов. В-третьих, поверьте мне, ещё существует невероятный дефицит действительно хороших программистов и здесь, и в Индии. Да, существует масса людей из ИТ, раздувающих шумиху — а, Вы знаете как долго я без работы? Рискую утверждать, что действительно хорошие программисты имеют работу. В-четвертых, у Вас есть идеи лучше? Вы собираетесь окунуться в историю? Тогда у Вас не остаётся выбора и придётся пойти в юридическую школу. Но есть одна вещь, которую я точно знаю — 99% работающих юристов ненавидят свою работу, ненавидят каждую её минуту, работая те-же самые 90 часов в неделю. Как я уже говорил, если вы любите компьютерное программировать, то благословенны, Вам очень повезло находиться в меньшинстве людей, которые могут прожить великую жизнь, делая любимую работу.

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

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

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

Если вам нравится программирование, то самая большая ошибка, какую можно совершить, это согласиться на любую летнюю работу с неполный рабочим днём, а не на программистскую работу. Я знаю, что каждый второй 19-летний хочет работать в торговом центре на складе рубашек, но у вас есть навык, который невероятно ценен, даже если вам 19, поэтому глупо тратить его на раскладывание рубашек. При окончании университета у Вас уже должно быть резюме с целым букетом софтовых рабочих мест. Выпускники А&F будут работать в Enterprise Rent-A-Car и «помогать людям с удовлетворением их потребностей». (За исключением Тома Уэллинга, который играет супермена по телевизору).

Чтобы облегчить Вашу жизнь и подчеркнуть, насколько весь этот очерк бескорыстен, моя компания, Fog Creek Software, предоставляет летнюю программистскую практику, которая будет солидно выглядеть в Вашем резюме. «Скорее всего, с Fog Creek Software Вы узнаете о кодировании и разработке бизнес программного обеспечения больше, чем на любой другой стажировке», сказал Бен, один из прошлогодних стажеров, которого совсем недавно выпер из комнаты общежития для разговора, посланный мною вышибала. Для того, что бы попасть на текущую практику заявки принимаются до 1 февраля.

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

ПРИМЕЧАНИЕ:

  1. Windows GUI — Graphical user interface, графический интерфейс пользователя операционной системы;
  2. AOL Instant Messenger — одна из программ мгновенного обмена сообщениями, предлагаемая фирмой AOL;
  3. Студенты компьютерных наук;
  4. «Шаровары» получаются. Shareware — программное обеспечение, распространяемое свободно с добровольной оплатой;
  5. XP — eXtreme Programming, экстремальное программирования, технология разработки с привлечением заказчика во время написания кода для постоянной и непрерывной корректировки постановки задачи и алгоритмов реализации;
  6. NPV — Net Present Value, чистая текущая стоимость;
  7. SAT — Scholastic Assessment Test, Российский аналог ЕГЭ, тест готовности к обучению в высшей школе;
  8. В том смысле, что увеличивается год от года;
  9. Сельскохозяйственная культура, типа батата.

В поисках великих девелоперов

Где все эти великие девелоперы

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

По мере их изучения Вы отмечаете — «Хм-м-м-м, это может сработать», «Нет! Ни за что!» или «Интересно, смогу ли я убедить его переехать в Буффало». Но то, что точно никогда не случится, гарантирую, просто потому, что этого не может быть никогда, Вы не скажете себе — «Восхитительно! Он великолепен! Этот бриллиант мы обязаны заполучить!». На самом деле, Вы можете просмотреть тысячи резюме, если, конечно, знаете, как их читать, а это не так просто, и я к этому вернусь в пятницу. Вы можете изучить тысячи заявлений на работу и никогда не встретить великого девелопера [1]. Ни одного.
И вот почему. Великие девелоперы — это действительно лучшие люди в своем деле, и их попросту нет на рынке труда. В среднем, великий девелопер за все свою карьеру, возможно, раза четыре и сменит место работы.
Читать далее «В поисках великих девелоперов»

Автоматизация измерения показателя «ПОСЕЩАЕМОСТЬ» в БРС факультета

В связи с новыми веяниями в системе ВПО и СПО медленно, но верно происходит переход к компетентносному подходу и внедрению балльно-рейтинговых систем (БРС) различного уровня. Но во всех БРС обязательно присутствует один показатель, который требует очень много усилий и времени при измерении и потому не пользуется популярностью не только среди студентов по понятным причинам, но и среди преподавателей, вынужденным выделять время учебных занятий на эту процедуру. Этот показатель называется «ПОСЕЩАЕМОСТЬ ЗАНЯТИЙ». При выставлении итоговой оценки по учебному курсу этот показатель учитывается весовым коэффициентом, определяющим его значимость. В связи с прохладным отношением участников бизнес-процесса валидность сырых данных вызывает большие сомнения. Надо бы как-то автоматизировать учет посещаемости, тем самым, сделать его более объективным. Но пока все известные предложения требуют значительных умственных и материальных затрат. Было-бы, конечно, неплохо сделать это с помощью системы распознавания образов с помощью видеокамеры, установленной в аудитории, да больно дорого и трудоёмко при реализации.
Читать далее «Автоматизация измерения показателя «ПОСЕЩАЕМОСТЬ» в БРС факультета»

Посчитаем деньги в чужом кармане

Последние три года уровень доходов IT-специалистов в госсекторе США не претерпевает значительных изменений — зарплаты и бонусы практически замерли на месте. Однако за последний год, по данным опроса InformationWeek, наметился небольшой рост средней заработной платы сотрудников, количество недовольных своей работой при этом снизилось.
Читать далее «Посчитаем деньги в чужом кармане»

И всё-таки он движется

В рамках международной выставки Geoforum-2008 (Москва, МВЦ «Крокус Экспо», 11-14 марта 2008) состоялся 2-й международный семинар «Спутниковая навигация и мониторинг в России – новые решения и перспективы развития. Глобальные навигационные спутниковые системы ГЛОНАСС и NAVSTAR (GPS)». После моего выступления о дифференциальной коррекции навигационных данных в системах спутникового мониторинга при определении реальных транспортных издержек у коллег появился один, но довольно распространенный, вопрос. Как исключить флуктуаций показаний навигационных приемников в состоянии покоя. Это вопрос, прежде всего, был связан с картинками траектории «неподвижного» GPS приемника, подобными приведенному рисунку
Читать далее «И всё-таки он движется»