...

суббота, 27 июня 2020 г.

[Перевод] Как заработать на веб-скрапинге

А вы знали о том, что то, что вы сейчас читаете, это — данные? Вы видите слова, но на серверах всё это хранится в виде данных. Эти данные можно куда-то скопировать, можно разобраться в их структуре, с ними можно сделать что-то ещё. Собственно говоря, только что мы привели упрощённое описание веб-скрапинга. Скраперы просматривают код, из которого созданы веб-сайты (HTML-код), или работают с базами данных, и вытаскивают отовсюду те данные, которые им нужны. Практически каждый веб-сайт можно подвергнуть скрапингу. На некоторых сайтах применяются особые меры, которые мешают работе веб-скраперов. Но тот, кто достаточно хорошо знает своё дело, способен успешно собрать данные с 99% существующих сайтов.

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

Способ №1: создание ботов


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

Для того чтобы продемонстрировать вам технологию разработки и продажи ботов, я создал бота для Airbnb. Этот бот позволяет пользователям вводить данные о некоем городе и возвращает сведения обо всех жилищах, которые в этом городе предлагает Airbnb. Сюда входят данные о цене, рейтинге, о количестве постояльцев, которое может принять дом, о количестве спален, кроватей, ванных комнат. И всё это делается благодаря применению технологий веб-скрапинга при сборе данных из постов, размещаемых на сайте Airbnb.

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


Теперь с такими данными работать гораздо легче, чем на сайте. Можно, например, сравнить разные жилища и их особенности. Кроме того, эти данные удобно фильтровать. В моей семье 4 человека. Если мы соберёмся в Рим, то нам понадобится Airbnb-жильё с как минимум 2 кроватями, отличающееся адекватной ценой. Благодаря тому, что все данные собраны в удобном формате, в Excel, с ними можно весьма продуктивно работать. Как оказалось, моим нуждам удовлетворяют 7 результатов из 272.

Среди этих 7 результатов я выбрал бы жильё Vatican St.Peter Daniel. У него очень хороший рейтинг и, из 7 найденных результатов, оно самое дешёвое ($67 за ночь). После того, как я нашёл то, что меня заинтересовало, я могу взять соответствующую ссылку из таблицы, открыть её в браузере и забронировать жильё.

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

Люди готовы платить за то, что хотя бы немного облегчает им жизнь.

Способ №2: перепродажа товаров, купленных с хорошими скидками


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

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


В каждом интернет-магазине бывают всяческие спецпредложения и распродажи. В карточках соответствующих товаров обычно показывают исходную цену и цену со скидкой. Правда, обычно разницу между новой и старой ценой, выраженную в процентах, не показывают. Например, если часы обычно стоят $350, а на распродаже — $300, то можно подумать, что $50 — это отличная скидка. Но это, на самом деле, скидка всего в 14,2%. А вот, например, майка, которая обычно стоит $50, а на распродаже её предлагают за $40. Вроде бы $10 — это не так уж и много, но это — скидка в 20%, то есть — более высокая, чем скидка на часы. Эти сведения позволяют экономить или зарабатывать, находя товары с самыми высокими скидками, выраженными в процентах.

Применим эти рассуждения к анализу цен на товары в универсальном интернет-магазине Hudson’s Bay. У них постоянно бывают распродажи товаров самых разных марок. Мы, пользуясь технологиями веб-скрапинга, собираемся найти товары с самыми высокими скидками.


После обработки сайта скрапер выдал более 900 товаров, и, как можно заметить, среди них есть всего один, скидка на который превышает 50%. Это — товар Perry Ellis Solid Non-Iron Dress Shirt.

Это — предложение, ограниченное по времени, поэтому цена на рубашку, в итоге, скоро вернётся к своему обычному уровню примерно в $90. Поэтому, если бы я купил эту рубашку за $40 и потом продал бы её на $30 дешевле её обычной цены, то есть, за $60, я заработал бы $20.

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

Способ №3: сбор и продажа данных


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

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

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

Как я уже говорил, доступ к данным, которые продаёт сайт BigDataBall, есть не только у этого сайта. Например, на сайте basketball-reference.com размещены те же данные, но они не структурированы и не сгруппированы. То есть — работать с ними неудобно, их нельзя просто загрузить, сформировав из них необходимый кому-то набор данных. Именно тут нам на помощь и приходит веб-скрапинг. А именно, я хочу собрать с сайта журналы игроков и оформить всё это в виде структурированного набора данных, напоминающего наборы данных BigDataBall. Ниже показан результат сбора данных


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

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

Итоги


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

А вы занимаетесь веб-скрапингом?

Let's block ads! (Why?)

Как развивалось домашнее аудио после Второй мировой — от магнитной звукозаписи до новых колонок

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


Фото dom christie / CC BY

Магнитная звукозапись


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

Хотя ситуация переменилась с началом Второй мировой.

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

Фото jglazer75 / CC BY / Ampex Model 300
Магнитная лента распространилась по миру уже после окончания войны, когда американские солдаты вывезли конфискованное оборудование из Германии. Один из них затем разработал новое устройство воспроизведения.

Оно увидело свет в 1948 году — это был бобинник Ampex Model 200. Система довольно быстро стала неотъемлемой частью звукозаписывающих студий, где ее использовали для мастеринга. Но у установки был недостаток — она была слишком громоздкой.

Одним из первых эту проблему решил польский аудиоинженер Стефан Кудельски (Stefan Kudelsky). В 1951 году он самостоятельно разработал и собрал прототип магнитофона NAGRA I (на КДПВ изображена его улучшенная версия — Nagra IV-S).

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

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

Долгоиграющий винил


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

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

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


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

Новые акустические системы


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

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

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



Дополнительное чтение по теме в «Мире Hi-Fi»:

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


Let's block ads! (Why?)

[Перевод] Kонференция NDС London. Предотвращение катастрофы микросервисов. Часть 1

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

В своем выступление Джимми Богард проведет «посмертное вскрытие» реальной катастрофы микросервиса. Он покажет проблемы моделирования, разработки и производства, которые обнаружил, и расскажет, как его команда медленно трансформировала новый распределенный монолит в окончательную картину здравомыслия. Хотя полностью предотвратить ошибки проекта невозможно, можно, по крайней мере, выявить проблемы на ранней стадии проектирования, чтобы конечный продукт превратился в надежную распределенную систему.

Приветствую всех, я Джимми, и сегодня вы услышите, как можно избежать мегакатастроф при создании микросервисов. Эта история компании, в которой я проработал около полутора лет, чтобы помочь предотвратить столкновение их корабля с айсбергом. Чтобы рассказать эту историю должным образом, придется вернуться в прошлое и поговорить о том, с чего начиналась эта компания и как со временем росла ее ИТ-инфраструктура. Чтобы защитить имена невиновных в этой катастрофе, я изменил название этой компании на Bell Computers. На следующем слайде показано, как выглядела IT инфраструктура таких компаний в середине 90-х. Это типичная архитектура большого универсального отказоустойчивого сервера HP Tandem Mainframe для функционирования магазина компьютерной техники.

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

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

Первоначальный дизайн выглядел довольно симпатично и состоял из сайта верхнего уровня bell.com и ряда поддоменов для отдельных приложений: каталога catalog.bell.com, аккаунтов account.bell.com, заказов orders.bell.com, поиска товаров search.bell.com. Каждый поддомен использовал фреймворк ASP.Net 1.0 и собственные базы данных, и все они общались с бэкендом системы. Однако все заказы продолжали обрабатываться и выполняться внутри единственного огромного мейнфрейма, в котором оставался весь мусор, зато фронтенд представлял собой отдельные веб-сайты с индивидуальными приложениями и отдельными базами данных.

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

Все элементы адресовали вызовы друг другу, обращались к API, встраивали сторонние библиотеки dll и тому подобное. Часто случалось, что системы управления версиями хватали чужой код, запихивали его внутрь проекта, и затем все ломалось. MS SQL Server 2005 использовал концепцию линк-серверов, и хотя я не показал стрелками на слайде, каждая из баз данных также общалась друг с другом, потому что как бы нет ничего плохого в том, чтобы строить таблицы на основании данных, полученных из нескольких БД.

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

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

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

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

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

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

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

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

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

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

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

Мы сделали некоторые математические вычисления. Каждый API-вызов имел SLA не более 150 мс и 99,9% аптайм. Один запрос вызывал 200 различных вызовов, и в наилучшем случае страница могла быть показана через 200 х 150 мс = 30 секунд. Естественно, это никуда не годилось. Перемножив 99,9% аптайм на 200, мы получали 0% доступность. Получается, что эта архитектура была обречена на провал с самого начала.

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

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

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

Эта картинка из блога MS на тему «Как строить микросервисы». Здесь показано простое веб-приложение, блок бизнес-логики и база данных. Запрос поступает напрямую, вероятно, здесь имеется один сервер для веб, один сервер для бизнеса и один для БД. Если увеличить трафик, картинка немного поменяется.

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

На следующей картинке показано, как MS рекомендует осуществлять переход от монолита к микросервисам – просто разделить каждый из основных сервисов на отдельные микросервисы. Именно при внедрении этой схемы Bell и совершили ошибку.

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

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

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

Она складывается из 4 уровней: уровень пользовательского интерфейса UI, уровень бизнес-логики, уровень доступа к данным и база данных. Более прогрессивна DDD (Domain-Driven Design), или программно-ориентированная архитектура, где два средних уровня представляют собой доменные объекты и репозиторий.

Я попытался рассмотреть в этой архитектуре различные области изменений, различные области ответственности. В обычном N-tier приложении классифицируются различные области изменений, которые пронизывают структуру вертикально сверху вниз. Это Catalog, настройки Config, выполняемые на индивидуальных компьютерах и проверки Checkout, которыми занималась моя команда.

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

Давайте рассмотрим, что означает «быть сервисом». Существует 6 характерных свойств определения сервиса — это программное обеспечение, которое:

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

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

Теперь рассмотрим определение микросервисов:

  • микросервис имеет малый размер и предназначен для решения одной конкретной задачи;
  • микросервис автономен;
  • при создании архитектуры микросервиса используется метафора «городской планировки» town planning metaphor. Это определение из книги Сэма Ньюмана «Создание микросервисов».

Определение Bounded Context взято из книги Эрика Эванса «Domain-Driven Design». Это основной паттерн в DDD, центр проектирования архитектуры, который работает с объемными архитектурными моделями, разделяя их на разные Bounded Context и явно определяя взаимодействие между ними.

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

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

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

Итак, мы сказали ребятам из Bell Computers: «Мы не сможем исправить ничего в созданном вами хаосе, потому что у вас просто не хватит для этого денег, но мы исправим всего один сервис, чтобы придать всему этому смысл». С этого места я начну рассказ о том, как мы исправили единственный сервис, чтобы он стал отвечать на запросы быстрее, чем через 9 с половиной минут.

22:30 мин

Продолжение будет совсем скоро…


Немного рекламы


Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас, оформив заказ или порекомендовав знакомым, облачные VPS для разработчиков от $4.99, уникальный аналог entry-level серверов, который был придуман нами для Вас:Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от $19 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только у нас 2 х Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 ТВ от $199 в Нидерландах! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — от $99! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)

[Из песочницы] Как ‌С#-разработчик у JavaScript плохому учился

Недавно мне на глаза попалась одна статья на Хабре. В ней сравниваются C# и JavaScript. На мой взгляд, сравнивать их — всё равно что сравнивать луну и солнце, которые, если верить классику, не враждуют на небе. Эта статья напомнила мне о другой публикации. В ней речь идёт о сценариях неожиданного и неочевидного поведения JavaScript, а C# не упоминается от слова совсем, но живое любопытство сподвигло меня попытаться повторить подобное поведение на другом языке.

Внимание


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

Примеры написаны под .NET Core 3.1.

Что в сухом остатке?


В JavaScript возможно применять оператор получения остатка от деления к числами с плавающей точкой. Работает это так:
3.14 % 5 // 3.14
13.14 % 5 // 3.1400000000000006

При этом числа имеют тип Number и хранятся в 64 битах в соответствии со стандартом IEEE 754. В .NET у этого типа есть брат-близнец System.Double или просто double. Если числовой литерал содержит плавающую точку, то он по умолчанию приводится к double. Намерение можно выразить явно, добавив к числу суффикс d или D. Возможность делить double с остатком тоже имеется. Так что пробуем. И… Бинго!
Console.WriteLine(3.14d % 5); // 3,14
Console.WriteLine(13.14d % 5); // 3,1400000000000006

Лирическое отступление
Если заменить суффикс на f или F, то уже будет использован тип float (System.Single), который хранит числа с плавающей точкой в 32 битах в соответствии со стандартом IEEE 754. Результат получается аналогичный, отличается только ошибка округления.
Console.WriteLine(3.14f % 5); // 3,14
Console.WriteLine(13.14f % 5); // 3,1400003

.NET позволяет работать с типом decimal (System.Decimal), который минимизирует ошибки округления.
Console.WriteLine(3.14m % 5); // 3,14
Console.WriteLine(13.14m % 5); // 3,14

Хотя и не гарантирует их отсутствие.
Console.WriteLine(1m/3m*3m); // 0,9999999999999999999999999999


Изыди, нечистый, ибо нет в тебе истины!


В следующем примере условие оказывается истинным.
const x = { i: 1, toString: function() { return this.i++; } };
if (x == 1 && x == 2 && x == 3)
    document.write("This will be printed!");

Это достигается за счёт того, что при проверке на равенство операнды приводятся к одному типу. При этом на x вызывается переопределённый метод toString(), который помимо того, что что-то возвращает, изменяет состояние объекта. Отмечаем про себя, что чистые функции — это прекрасно, но ради интереса пробуем воплотить концепцию из примера.
Trickster x = new Trickster();
if (x == 1 && x == 2 && x == 3)
    Console.WriteLine("This will be printed!");

.NET позволяет переопределять методы и приводит типы, где возможно, если соответствующее приведение определено.
class Trickster
{
    private int value = 1;

    public override string ToString() =>
        value++.ToString();

    public static implicit operator int(Trickster trickster) =>
        int.Parse(trickster.ToString());
}

Ура, работает. Но смущает, что Trickster как будто подстраивается под int. Заменим
public static implicit operator int(Trickster trickster) =>
    int.Parse(trickster.ToString());

на
public static implicit operator double(Trickster trickster) =>
    double.Parse(trickster.ToString());

Всё равно работает. Теперь Trickster и int приводятся к double.

На самом деле, переопределение ToString() не принципиально для достижения конечного результата и сделано для максимального подражания примеру на JavaScript. Достаточно определить приведение к double. Конечно не забывая о важности побочного эффекта.

class Trickster
{
    private int value = 1;

    public static implicit operator double(Trickster trickster) =>
        trickster.value++;
}

А если вспомнить о перегрузке операторов, то можно реализовать объект одновременно равный и неравный чему угодно
Trickster x = new Trickster();
if (x == 1 && x == 2 && x == 3 && x == new[] { 1, 2, 3 } &&
    x != 1 && x != 2 && x != 3 && x != new[] { 1, 2, 3 })
    Console.WriteLine("This will be printed!");

таким нехитрым способом
class Trickster
{
    public static bool operator ==(Trickster trickster, object o) =>
        true;

    public static bool operator !=(Trickster trickster, object o) =>
        true;
}

Элегантный захват


Этот код на JavaScript три раза выводит 3.
for (i = 1; i <= 2; ++i)
  setTimeout(() => console.log(i), 0);

Поскольку в C# функции setTimeout из коробки нет, реализуем аналог самостоятельно и получаем точно такой же результат.
void SetTimeout(Action action, int delay) =>
    Task.Run(async () =>
    {
        await Task.Delay(delay);
        action();
    });

for (int i = 0; i <= 2; ++i)
    SetTimeout(() => Console.WriteLine(i), 0);

// Не даём приложению закончить работу до завершения задач
Console.ReadKey();

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

Комутативность никто не обещал


Операторы в JavaScript иногда не отличаются коммутативностью.
Date() && {property: 1}; // {property: 1}
{property: 1} && Date(); // Uncaught SyntaxError: Unexpected token '&&'

В C# к пользовательским типам по умолчанию операторы вообще неприменимы (исключение == и != для ссылочных типов). Но некоторые из них могут быть перегружены явно в типе. Тогда забота о комутативности ложится на плечи разработчика.
class Trickster
{
    // В C# перегружать && недопустимо
    public static object operator +(Trickster trickster, object o) =>
        null;
}

И она не обязательно будет реализована.
var a = new Trickster() + new object(); // OK

// Compilation Error:
// Operator '+' cannot be applied to operands of type 'object' and 'Trickster'
var b = new object() + new Trickster();

Скрещиваем ужа с ежом


В JavaScript можно выполнять математические операции совместно над строками и числами.
var a = "41";
a += 1; // "411"
var b = "41";
b -=- 1; // 42

В C# так можно только со сложением.
var a = "41" + 1; // 411

// Compilation Error:
// Operator '-' cannot be applied to operands of type 'string' and 'int'
var b = "41" - (-1);

Но нет препятствий патриотам языка. Добавив немного колдунства, можно заставить «правильно» работать даже такой код:
Trickster a = "41";
Console.WriteLine(a += 1); // 411
Trickster b = "41";
Console.WriteLine(b -=- 1); // 42

Нужно просто реализовать пару неявных преобразований типов и перегрузить пару операторов.
class Trickster
{
    private string value;

    public static implicit operator Trickster(string s) =>
        new Trickster { value = s };

    public static implicit operator Trickster(int i) =>
        new Trickster { value = i.ToString() };

    public static string operator +(Trickster trickster, int i) =>
        trickster.value + i;

    public static int operator -(Trickster trickster, int i) =>
        int.Parse(trickster.value) - i;

    public override string ToString() =>
        value;
}

Можно заменить перегрузку сложения
public static string operator +(Trickster trickster, int i) =>
    trickster.value + i;

на неявное приведение к строке
public static implicit operator string(Trickster trickster) =>  
    trickster.value;

и получить тот же результат.

Если не заморачиваться с возвращением числа из операции вычитания и помещением этого числа в Trickster, то можно заменить

public static int operator -(Trickster trickster, int i) =>   
    int.Parse(trickster.value) - i;

на
public static string operator -(Trickster trickster, int i) =>
    (int.Parse(trickster.value) - i).ToString();

а приведение int к Trickster удалить.

Жонглируем бананами


В JavaScript строку «banana» можно получить следующим способом:
('b' + 'a' + + 'a' + 'a').toLowerCase(); // "banana"
('b'+'a'++'a'+'a').toLowerCase(); // Uncaught SyntaxError: Invalid left-hand side expression in postfix operation

Здесь применение унарного + ко второй 'a' возвращает NaN, который приводится к строке 'NaN' для сложения с остальными строками, и в итоге получается 'baNaNa', а для красоты всё приводится к нижнему регистру.

В C# создаем класс

class Trickster
{
    private string value;

    public static implicit operator Trickster(string s) =>
        new Trickster { value = s };

    public static double operator +(Trickster trickster) =>
        double.TryParse(trickster.value, out double result) ? result : double.NaN;
}

и пробуем
// чтобы double.NaN.ToString() возвращал "NaN", а не "не число"
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
Console.WriteLine(("b" + "a" + + (Trickster)"a" + "a").ToLower());

К сожалению, несмотря на неявное приведение компилятор не может построить цепочку string -> Trickster -> double -> string, и приходится явно ему подсказывать. (Если задуматься, такое приведение выглядело бы более чем странно.)

Trickster можно реализовать иначе:

class Trickster
{
    private double value;

    public static implicit operator Trickster(string s) =>
        new Trickster { value = double.TryParse(s, out var d) ? d : double.NaN };

    public static double operator +(Trickster trickster) =>
        +trickster.value;
}

В этом случае можно даже заменить перегрузку унарного + неявным приведением к double:
public static implicit operator double(Trickster trickster) =>
    trickster.value;

В качестве бонуса, если не поставить пробел между двумя плюсами, то как и в примере на JavaScript мы получим ошибку компиляции, да не одну, а целый букет.
Лирическое отступление
Компилятор таки может строить цепочки неявный преобразований типов вида встроенное
-> [встроенное->] пользовательское
. Например, пусть есть тип
class Trickster
{
    public static implicit operator Trickster(long? i) =>
        new Trickster();

    public static Trickster operator +(Trickster left, Trickster right) =>
        new Trickster();
}

Тогда для выражения
var result = 0u + new Trickster();

Будет выполнена цепочка преобразований типов uint -> long -> long? -> Trickster.

Мораль


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

Let's block ads! (Why?)

Разбор: откуда «Яндекс» возьмет деньги на развод со Сбербанком, и что будет с его акциями

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

Что случилось


В рамках развода поисковик выкупит у Сбербанка 45% доли в «Яндекс.Маркете». Общая оценка компании составляет 87,3 млрд рублей, доля финансовой организации оценивается в 42 млрд рублей. В итоге у «Яндекса» останется 100% «Маркета».

Вторая часть сделки – выход «Яндекса» из сервиса «Яндекс.Деньги», контролирующий пакет (75% плюс 1 рубль) которого с 2013 года принадлежит Сбербанку. Доля «Яндекса» в 25% предварительно оценивается в 2,4 млрд рублей.

Ожидается, что сделка будет закрыта в третьем квартале текущего года – она уже одобрена на уровне советов директоров и правления двух компаний. Руководитель Сбербанка Герман Греф вскоре покинет совет директоров «Яндекса». Из тонкостей – сделка по «Яндекс.Маркету» также потребует получения согласия Федеральной антимонопольной службы.

Как «Яндекс» профинансирует сделку


Источники издания The Bell сообщали о том, что «Яндекс» может направить на выкуп своей доли деньги, которые привлек в начале года с помощью размещения облигаций. Тогда компания получила $1,25 млрд. Всего же на конец прошлого года на счетах компании было около $1,43 млрд.

Частично расходы на выкуп доли Сбербанка в «Маркете» компания может компенсировать с помощью ускоренного размещения новых акций класса А. В ходе размещения «Яндекс» смог привлечь $400 млн – в два раза больше, чем планировалось изначально.

Помимо этого, для привлечение средств для дальнейшего развития развития компания планирует продать акций на $600 млн трем крупным инвесторам – «ВТБ Капиталу», инвестиционной компании Романа Абрамовича, а также инвестиционной компании Treliscope Limited.

Что будет с акциями компании


Новости о дополнительном размещении акций и разводе со Сбербанком не ударили по стоимости ценных бумаг «Яндекса» – в период после выхода этих новостей они росли и даже обновили исторический максимум цены на Московской бирже.

Кроме того, поддерживающим фактором для акций «Яндекса» стали новости о снижении ставки страхового взноса для IT-компаний с 14% до 7,6% и налога на прибыль с 20% до 3%.

На рост акций не повлияло даже сообщение «Яндекса» о возможном убытке в 4,5 млрд рублей по итогам текущего квартала – за аналогичный период прошлого года чистая прибыль составила 3,4 млрд. Причиной убытков стали ограничения, введенные из-за пандемии коронавируса, а также потери при изменении курсов валют.

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

Акции «Яндекса» торгуются на Московской бирже. Чтобы их купить, понадобится брокерский счет – открыть его можно онлайн.

Читайте обзоры, аналитику рынков и инвестидеи в Telegram-канале ITI Capital

Let's block ads! (Why?)

Как стать тимлидом фронтендеров и как жить после этого — расшифровка эфира

15 июня в нашем инстаграм-аккаунте прошел прямой эфир с Ильей, руководителем фронтенд-разработки в Яндекс.Деньги. Выкладываем запись эфира и расшифровку.

Меня зовут Илья, я работаю в компании Яндекс.Деньги и руковожу фронтендом. До этого был бэкенд-разработчиком, писал на C#, около 5 лет назад перешел во фронтенд. Чуть больше года руковожу. Вот такой путь развития. Еще активно участвую в Burning Lead – это сообщество для ведущих разработчиков, тимлидов, людей, которые так или иначе пересекаются с задачами управления; надеюсь, ребята из сообщества слушают стрим.


Про Node.js и его использование


Сначала скажу, как она у нас появилась и почему мы ею пользуемся. Исторически сложилось так, что у нас в Деньгах есть полноценный Java-бэкенд, в котором Java-разработчики работают с базами данных, с основной бизнес-логикой. Фронтендеры с бизнес-логикой не работают, мы подготавливаем для себя нужный формат данных и отправляем его на фронтенд, а там уже рисуем их на каком-либо фреймворке. Изначально у нас был Xscript-сервер, который ребята в Яндексе сделали еще в 2000-х годах – это наше legacy. Часть логики – серверный рендеринг – мы писали на XML, XSL/XML преобразования. Так продолжалось очень долго. Потом, когда мы осознали, что разработчиков на XSL/XML стало тяжело искать, мы стали выбирать новый сервер, в который можно было бы писать на бэкенде и потом использовать на фронтенде. Оказалось, что есть целая платформа Node.js.

Тогда Node.js была очень молодой платформой, версия 0.10, наверно. Решено было использовать ее по нескольким причинам: язык Javascript набирал популярность, разработчиков было много; кроме того, серверную и клиентскую логику мог писать один разработчик без суперспецифичных знаний. О своем выборе мы не жалеем: платформа все еще активно развивается, оптимизируется, становится быстрее, получает полезные фичи, имеет активное сообщество.

Поговорим про архитектуру фронтенда и о том, чего мы хотели бы достичь в архитектуре Яндекс.Денег в целом. Так как мы используем Node.js, у нас уже долгое время основой серверного фреймворка служит Express. Он хорошо справляется со своей задачей – обрабатывает запросы пользователя и дает ответы, больше от него ничего не нужно. Для него написано множество плагинов. Есть SSR для React-приложений, например; так как основной стек на клиенте – это React, SSR не проблема прикрутить. Есть много реализаций; можно даже не писать код: разворачиваешь из NPM, он сам все делает.

Что касается архитектуры – мы порядка 4-5 лет живем на Express, и из-за этого возникают некоторые проблемы. У нас довольно много разработчиков – в отделе сейчас человек 50 – и нам нужно писать понятный для всех код; разработчики могут менять интересы, переходить из команды в команду, и нам нужно, чтобы код был примерно одинаковым, чтобы разработчик в новой команде не тратил по месяцу на акклиматизацию к новому коду. Express – довольно низкоуровневый фреймворк, и с ним живется довольно тяжело: каждая команда использует свое видение того, как писать обработчики запросов или бизнес-логику, ходить в бэкенд. Первая попытка наладить архитектуру сервера была совершена, когда мы сделали ProcessFlow. Я на эту тему выступал с докладами – рассказывал, как на основе IDEF0 можно построить систему, которая позволит организовать бизнес-логику, задать правила ее написания, сделать поддержку, визуализацию связей между сущностями. Попытка была вполне успешной: в некоторых местах у нас были серьезные проблемы с пониманием кода, и ProcessFlow помогла их решить. Она работает и сейчас, и вполне нас устраивает.

Сейчас у нас идет переезд на NestJS. Это довольно современный серверный фреймворк, позволяет писать контроллеры в парадигме Model-View-Controller, организовывать бизнес-логику; его философия пришла из Angular. Его сильная сторона – это правила, они уже на уровне фреймворка определяют написание контроллеров и бизнес-логики. Бесконтрольная среда бывает губительна, когда вас много и все пишут по-разному; лучше иметь свод правил, к которому всегда можно обратиться – такой путь мы выбираем. Про NestJS активно рассказывает мой коллега Андрей Мелехов, ведущий подкаст devSchacht; он сейчас описывает процесс переезда на NestJS, обсуждает проблемы.

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

Про клиентскую часть


Она состоит из двух больших стеков. Первый – это легаси-стек с использованием методологии BEM Naming (определенные названия CSS-стилей, позволяющие избегать пересечений), на основе которой в Яндексе создали фреймворк. Мы использовали его довольно долго, так как мы используем технологический стек Яндекса. Он классный, и в нем работа с компонентами организована примерно так же, как в современных фреймворках: в виде отдельно лежащих блоков, которые удобно поддерживать. Однако он уже устарел, поскольку основан на GQL и не отвечает современным требованиям по UI; на нем очень сложно делать анимации и приложения на клиенте. Мы постепенно переходим на React уже несколько лет (переход продвигается тогда, когда меняется дизайн или функциональность: то есть, все переписывания бизнес-процессов происходят на новой технологии). Он показался нам довольно мейнстримовым — то есть, разработчиков на нем много. React — основной фреймворк на клиенте, в качестве стейт-менеджера используется Redux; с ним же мы используем Redux-Thunk для асинхронных действий и запросов к бэкенду. В нескольких проектах использовали hooks.

Почему не Angular?


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

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


На самом деле, в каждой компании будут собственные требования к тимлиду или руководителю отдела, но, как мне кажется, есть и определенный план того, что нужно знать и делать, чтобы развиваться в направлении менеджмента. Есть такой подкаст – PodlodkaPodcast, они публиковали такой план (роадмап). Крутая штука; там написано, что следует читать для развития нужных softskills — на них нужно делать упор. Конечно, у хорошего тимлида должны быть и отличные hardskills: он – не просто формальный лидер команды (допустим, 5 человек), он должен доказать свое лидерство, он должен учить свою команду, его люди должны желать научиться программировать так же, как может он. Но важны и softskill: коммуникативные навыки для общения в пределах команды и вне их, для отстаивания мнения команды, для поиска компромиссов. В работе тимлида очень много коммуникаций. Кроме того, нужно уметь проявлять эмпатию: при общении с разработчиками важно устанавливать понимание на уровне чувств, понимать настроение каждого собеседника, определять, чего он хочет. Напрямую это не говорится, но очень хорошо, когда тимлид владеет этим. Здорово, когда к hardskills также прилагается умение наставничества: за таким тимлидом потянутся люди, он будет в состоянии четко формулировать и ставить задачи.

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

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

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

О процессах управления людьми в нашем отделе


Процесс разработки подразумевает общение разработчиков между собой, и у нас есть несколько точек пересечения. Задача на разработку поступает в одну из команд; обычно команда — это Java-разработчики, фронтенд-разработчики, менеджер, продукт, обязательно тестировщики. Такая единица, сидит где-то отдельно. Существование других команд для нее особенного значения не имеет само по себе – но нам необходимо, чтоб все команды писал приблизительно единообразный код. Для этого нужно общаться, и здесь есть несколько подходов. Во-первых, это происходящие время от времени встречи всего отдела; сейчас мы все собираемся в zoom, но это, конечно, не то. На встречах мы делимся новостями, ребята рассказывают, что они делают у себя в командах: какие у них проекты, какие будут в дальнейшем, что и как они делают. Это помогает строить представление о том, что происходит во фронтенде: он большой, просто так его рассмотреть не выйдет. Еще мы организуем tech talks, разные по масштабам: на всю компанию или на наш отдел, и там представляются технические приемы: например, на одном из них рассказывали, как используются hooks в React, как они влияют на форму, как выглядит код для них, какие плюсы и минусы. Такие доклады интересно слушать, и они помогают распространять по компании знания.Непосредственно в разработке есть процессы, которые позволяют нам общаться так, чтобы писать код, который потом не встретит непонимания на кодревью из-за используемых приемов, компонентов и библиотек – то есть, мы стараемся нивелировать плохие последствия от изолированного принятия решений. Этот процесс, который мы называем Logic Review, позволяет нам узнавать мнения экспертов, ведущих разработчиков, старших разработчиков после того, как мы понимаем, как делать определенную задачу – то есть, сверить наше видение реализации проекта с видением тех, кто определяет дальнейшее развитие всего отдела. Он позволяет нам обмениваться знаниями, технологиями, и контролировать однородность и архитектуру стека. Конечно, успеть везде и избежать всех проблем на кодревью невозможно, но такая сверка перед началом разработки позволяет уменьшить их количество.

Можно ли обмануть Review 360?


Напомню, что Review 360 – это когда все (разработчики, тестировщики, менеджеры), с кем работал человек, которого нужно оценить, опрашиваются «по кругу» с помощью опросника. Я об этом процессе рассказывал на Burning Lead. Если команда небольшая, как у нас обычно – человек 5-10 – то этот процесс, собственно, не нужен: тимлид может сам пообщаться с каждым членом команды. Собственно, он и должен общаться с каждым разработчиком раз в 1-2 недели, чтобы понимать, чего хочет разработчик, какое у него настроение, доволен ли он задачами, как он работает, как проходит его рост. Но, когда команда большая – например, у меня сейчас больше 50 фронтендеров – то на такое личное общение уже не будет хватать времени. У тимлида есть и другие обязанности и проекты, он обязан развивать отдел, он не может тратить все рабочее время только на общение, которое впоследствии нужно будет еще и проанализировать. Поэтому приходится использовать менее точные подходы – например, Review 360.

Можно ли его обмануть – я думаю, имеется ввиду то, могут ли разработчики договориться между собой и поставить себе высокие оценки? Наверно, могут, но с менеджером и product owner так не договоришься: эти люди преследуют несколько другие интересы, и это будет легко вычислено. То есть – можно, но ненадолго. Со временем станет понятно, что разработчик не делает свои задачи. Если product owner говорит, что разработчик не справляется, а другие разработчики ставят ему высшие оценки, то мы ясно понимаем, что существует проблема: либо product owner на него точит зуб, либо другие разработчики чего-то не замечают (или они договорились).

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

Расскажите про менеджер зависимости, composer и Laravel


Я знаю, что Laravel – хороший PHP-фреймворк, и у нас на нем пишут, но сам с этими технологиями почти не работал.

У вас есть разделение на верстальщиков и JS-разработчиков, или разработчик делает все?


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

Что нужно знать джуниор-фронтенд-разработчику для работы в компании?


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

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


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

Какой размер вашей команды?


У меня две роли в компании: я руковожу отделом порядка 50 человек и одновременно являюсь product owner нашей платформенной команды, там 8 человек.

React Native или Flutter?


У нас были эксперименты с React Native, Flutter тогда был очень новым; мы решили, что выберем React Native.

Яндекс хочет свой фрейм запускать?


Нет, BEM – это очень старый фреймворк, он устарел, мы вместо него используем React. Никто не хочет запускать новый фреймворк.
Вопрос: на бэкенде только JS, или есть какие-то legacy-части?
Я рассказывал, что у нас есть сервер с Xscript с XML/XSL. Это как раз и есть наше legacy, мы его активно выпиливаем и хотим как можно скорее прекратить его использовать. В основном – в 96% случаев – у нас используется JS.

Redux-Thunk или Redux-Saga?


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

Вы внутри компании или команды ставите задачи по Smart?


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

Насчет микросервисов – сейчас выкатили Module Federation Pack 5, можно ли в эту сторону посмотреть?


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

В чем разница в управлении 5, 10 и 50 людьми?


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

Будет ли массовый переход на NestJS?


Сложно сказать. Может, завтра появится новый фронтенд-фреймворк, превосходящий NestJS, и мы все будем на него переходить. Я думаю, что сейчас NestJS хорошо проработан, но нужно исходить из задачи. Для многих задач, которые мы решаем на Node, не нужен такой серьезный фреймворк – например, для лямбда-функций, которые кто-то будет вызывать; но, когда на фронтенде есть развесистая логика, кажется, что подошел бы лучше Nest. Он сейчас хорошо проработан, есть и бэкенд-фреймворк (хотя он был довольно сырым, когда мы смотрели его). Nest развивается и, может быть, станет более популярным, но я не думаю, что будет массовый переход на него, как на Express.

Чем отличаются собеседования на джуна и миддла? Что оценивается во втором случае?


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

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


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

Как строите процесс по управлению таким количеством человек? Сколько лидов? Тяжело ставить цели?


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

Проводите 1 на 1? Как часто? Лайфхаки?


Собственно, у нас в компании ревью как раз называется «1 на 1». Сейчас я провожу со всеми старшими разработчиками ревью раз в месяц (это реже, чем рекомендуется – лучше проводить раз в пару недель). Зачастую нам есть, что обсуждать. Лайфхаков особых нет – в литературе достаточно подробно расписано про 1 на 1. Важно давать разработчику говорить – он должен говорить примерно 80% времени; в этом суть: задача руководителя – создать на ревью дружественную и безопасную атмосферу, чтобы разработчик мог ему рассказать все, что его беспокоит. Это довольно тяжело и не всегда получается, но круто, если 1 на 1 есть, и на них есть, что обсуждать. Их лучше проводить в неформальной обстановке – например, можно в парке. Создание комфортной атмосферы может быть разным – это не только переговорка в офисе.

Какие вакансии у вас открыты?


В каком направлении? У нас довольно много в разных направлениях. По фронтенду мы ищем нескольких миддл-разработчиков (по-моему, 2), можно и senior.

Какие сложные задачи возникают у руководителя?


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

Рассматриваете фронтов на удаленке?


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

Что делать, если тимлид слабоват и явно не должен оставаться на позиции?


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

А что дальше?


30 июня в 20:00 в нашем инстаграм-аккаунте будет выступать Влада Рау — Senior Digital Analyst в лондонском офисе McKinsey Digital Labs. Сейчас Влада занимается product/data engineering. До своего переезда в Лондон она дважды стажировалась в Google в Дублине, а также училась в ВШМ СПбГУ и IE Business School в Мадриде.

Задать ей вопрос можно в комментариях к этому посту.



Что было ранее


  1. Илона Папава, Senior Software Engineer в Facebook — как попасть на стажировку, получить оффер и все о работе в компании
  2. Борис Янгель, ML-инженер Яндекса — как не пополнить ряды стремных специалистов, если ты Data Scientist
  3. Александр Калошин, СEO LastBackend — как запустить стартап, выйти на рынок Китая и получить 15 млн инвестиций.
  4. Наталья Теплухина, Vue.js core team member, GoogleDevExpret — как пройти собеседование в GitLab, попасть в команду разработчиков Vue и стать Staff-engineer.
  5. Ашот Оганесян, технический директор и основатель DeviceLock — кто ворует и зарабатывает на ваших персональных данных.

Let's block ads! (Why?)

«Особенность» Вконтакте

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



Разбираемся

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

Еще варианты? Что же я такого сделал, что меня спалило? Как оказалось я просто зашел в раздел “Добавить друга”, чтоб посмотреть кого мне рекомендуют. В мобильном приложении для Андроид и IOS при переходе в раздел "Друзья""Добавить друга" происходит разглашение примерной геолокации пользователя через сервис "Найти рядом со мной".

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

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

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

Тестировалось на IOS и Android на двух разных аккаунтах. Хотите повторить?


  1. Вам нужно всего лишь 2 телефона и включенная для приложения ВК геолокация
  2. На одном телефоне заходите в "Друзья""Добавить друга"
  3. На другом в “Найти рядом с мной”
  4. PROFIT! Вы видите из “Найти рядом со мной” аккаунт второго телефона, пользователь которого и не думал показывать свое местоположение

Резюме

Благодаря этой особенности:


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

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

Внимание! Перед тем, как рассказать аудитории Хабра об этой проблеме, мной были предприняты попытки сообщить о ней разработчикам через платформу HackerOne. Разработчики посчитали это все “не багом”, а репорт был закрыт в статусе “informative”, на мои дальнейшие комментарии они ничего не ответили и игнорировали меня.

Let's block ads! (Why?)

[Перевод] Долгая и извилистая дорога к внедрению GPS во все автомобили

Подписывайтесь на каналы:
@AutomotiveRu — новости автоиндустрии, железо и психология вождения
@TeslaHackers — сообщество российских Tesla-хакеров, прокат и обучение дрифту на Tesla
image

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

Точное время


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

(И нет, несмотря на название, атомные часы не радиоактивны.)

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

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

Идея атомных часов была разработана профессором физики Колумбийского университета Исидором Раби в 1945 году с использованием методики, которую он разработал в 1930-х годах и назвал магнитным резонансом атомного пучка. Эта концепция позволила точно измерять магнитные свойства атомных ядер путем обнаружения единичных состояний вращения атомов и молекул, а метод, в свою очередь, доказал свою осуществимость в качестве способа точного определения времени. Первые часы с использованием атомно-лучевого магнитного резонанса были введены в 1949 году Национальным бюро стандартов (ныне Национальный институт стандартов и технологий, или NIST) с использованием атомов аммиака, но они не были достаточно точными. В 1952 году наиболее точным элементом был признан цезий, который впервые был использован на часах под названием NBS-1. Семь лет спустя NBS-1 был введен в эксплуатацию в качестве основного хронометриста НИСТ.

К моменту проведения 13-й Генеральной конференции по весам и мерам в 1967 году был установлен международный стандарт: секунда времени была определена как 9 192 631 770 циклов облучения, которое требуется атому цезия для вибрации.

Впервые мировой хронометраж перестал основываться на астрономии.

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

Точное местоположения


image

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

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

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

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

Это привело к тому, что в 1959 году ВМФ США построил свою первую спутниковую навигационную систему. Система под названием Transit была разработана Лабораторией прикладной физики Джона Хопкинса с использованием орбитальных спутников для передачи радиосигналов на мониторинговые станции. Эта система позволила пользователям определять свое местоположение путем измерения допплеровского сдвига сигналов спутников и, в свою очередь, была использована для слежения за местоположением атомных подводных лодок. Хотя связь и не была быстрой, она доказала надежность космических систем.

Примерно в то же время у Лаборатории военно-морских исследований и Организации по космическим и ракетным системам ВВС США были и другие идеи. Они отдавали предпочтение программе Timation, созданной в 1964 году и запущенной в 1967 году. В этой системе использовались два экспериментальных спутника с кварцевыми кристаллическими часами (хотя в конечном итоге они переключились на рубидиевые и цезийные атомные часы). И, как бы доказывая существование государственной неэффективности, ВВС также работали над аналогичной технологической программой под названием System 621B. Она непрерывно обеспечивала навигацию с использованием 16 спутников на орбитах, которые образовывали четыре кластера овальной формы, вытянутые на 30 градусов севернее и южнее экватора. (Мы упоминали, что армия предлагала свою собственную систему, SECOR, или Sequential Correlation of Range?).

Наконец, кто-то в Министерстве обороны в 1968 году создал NAVSEG, или Группу управления навигационными спутниками, которой было поручено изучить различные системы, уже существующие или разрабатываемые. Неудивительно, что в появившемся решении были использованы лучшие аспекты систем ВМФ и ВВС. Министерство обороны одобрило разработку глобальной системы позиционирования NAVSTAR в декабре 1973 года. Испытания начались в следующем году, а полномасштабная разработка была одобрена в августе 1979 года.

К сожалению NAVSTAR столкнулась с некоторыми трудностями на рассвете нового десятилетия. Бюджет на ее разработку был сокращен на 30% министром обороны в начале 1980-х годов. Важность нового танка или самолета легко понять, в отличие от новой высокотехнологичной системы поддержки. В конечном итоге количество спутников было сокращено до 18 с 24, плюс три запасных. Далее, как раз в тот момент, когда все шло своим чередом, авария космического челнока «Челленджер» в 1986 году задержала программу еще на 2 года. Первые спутники, наконец, были запущены с мыса Канаверал в феврале 1989 года и начали использоваться в апреле.

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

GPS-системы за пределами Соединенных штатов


Безусловно, развитие государством атомных часов и систем глобального позиционирования привело к созданию коммерческого рынка, на котором вскоре появились меньшие по размеру, более быстрые и дешевые устройства, что, в свою очередь, помогло военным. Сегодня космическое командование ВВС США управляет системой GPS, которая была разработана, в частности, при участии стран НАТО и Австралии. Эта система также используется информационно-развлекательными системами в автомобилях для обеспечения навигации и спутникового радиовещания. Остальной мир наверстывает упущенное, начиная с ГЛОНАСС, или Глобальной навигационной спутниковой системы — космической навигационной системы, созданной Россией. Планирование ее разработки было начато в 1968 году, а к 1976 году страна завершила создание этой системы. К 1991 году в эксплуатации находилось 12 спутников, а через два года она была введена в эксплуатацию, хотя в целом система функционировала лишь в декабре 1995 года. К 2002 году система едва работала. С помощью Индийской организации космических исследований, Космического агентства Индии, Российское космическое агентство развернуло ГЛОНАСС в полную силу к маю 2007 года.

Не осталась в стороне и глобальная навигационная спутниковая система Европейского космического агентства Galileo, работающая совместно с GPS и ГЛОНАСС. Первые спутники были запущены в 2011 году. Система начала функционировать в 2013 году, и в настоящее время на орбите находится 26 спутников. После завершения проекта Galileo будет иметь в эксплуатации 30 спутников.

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

Подробнее тут:


Оцифрованные карты перемещаются на приборную панель


Идея о том, что система GPS, встроенная в ваш автомобиль, может подсказать вам, куда ехать, заменяя вам партнера или штурмана, была надуманной до тех пор, пока первая картографическая навигационная система не была представлена в Японии в качестве дилерской опции для второго поколения Honda Accord в 1981 году. Система Honda Electro Gyrocator использовала датчики и гироскопы, которые сравнивали поверхность дороги с поверхностью карты, указывая таким образом направление движения. Также известная как система точного расчета траектории, она не использовала спутники, впрочем, техника не всегда работала корректно по причине наличия неточностей в картах, а это проблема для системы, которая добавляет дополнительные 25 процентов к стоимости автомобиля. Это была первая современная навигационная система, но лидерство в выходе на рынок не гарантирует долгую жизнь. Система Honda Electro Gyrocator исчезла в 1982 году.

image

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

Производители навигаторов Etak знают об этом не понаслышке. Разработанная в Калифорнии Стэном Хани и основателем Atari Ноланом Бушнеллом, эта навигационная система, устанавливаемая после продажи автомобиля, также работала по принципу точного расчета траектории, сравнивая местоположение автомобиля с точками на карте. Устройство было разработано дизайнером Pong, Аланом Алькорном (Alan Alcorn), и для составления карты оно использовало микропроцессор Intel 8088 и кассетный магнитофон. Благодаря использованию цифровой карты, компаса и датчиков колес, водители могли видеть результаты работы системы на экране.

image

Первая автомобильная навигационная система на основе карт была представлена в Японии в качестве дилерской опции для Honda Accord 1981 года. Названный Honda Electro Gyrocator, он использовал счисление пути для отслеживания местоположения автомобиля, используя используемые датчики и гироскопы для сравнения дорожного покрытия с картой.

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

В июле 1985 г. появился Etak Navigator 700 с 7-дюймовым экраном за 1595$ (3819$ с поправкой на инфляцию), и Etak Navigator 450 с 4,5-дюймовым экраном за 1395$ (или 3340$ сегодня). Кассеты стоили по 35 долларов каждая (или 84 доллара сегодня). Эти модели были достаточно успешны, чтобы будущие конкуренты покупали лицензии на патенты, данные карт и/или аппаратное обеспечение Etak. Etak была куплена новостной корпорацией Руперта Мердока в 1989 году за почти 25 миллионов долларов.

image

Первая навигационная система Toyota CD-ROM была установлена на японском рынке в 1987 году Toyota Crown Royal Saloon G

Два года спустя в Toyota's Crown Royal Saloon G, продававшейся на японском рынке, была предложена навигационная система с первым цветным CRT-дисплеем и картографической системой на компакт-дисках. Но так как все эти системы использовали точный расчет траектории (то есть, сравнивали местоположение автомобиля с точками на карте), эти решения на самом деле были не намного более совершенны, чем Jones Live-Map 1909 года. В 1980-е годы было использовано больше технологий.

image

Первый в мире современный автомобиль с интегрированной системой GPS-навигации, как на Eunos Cosmo, высококлассной марки Mazda на японском рынке.

image

Eunos Cosmo 1990-1995 годов выпуска-первый в мире современный автомобиль с интегрированной системой GPS-навигации. Eunos был высококлассной маркой Mazda на японском рынке и должен был стать частью запланированного бренда Mazda Amati, хотя Mazda в конечном счете решила не запускать его в Америке. Тем не менее, автомобиль выпускался до 1995 года.

Mazda представила первую в мире современную автомобильную навигационную систему GPS, которую компания предлагала только в Японии на Eunos Cosmo 1990 года. Eunos была высококлассной машиной, и этот автомобиль должен был стать частью запланированного бренда Mazda — Amati. В итоге Mazda решила не запускать его в Америке, но, тем не менее, автомобиль выпускался до 1995 года.

Спустя год после выхода Cosmo, в 1991 году, Toyota представила на японском рынке свою «Electro-Multivision Global Positioning System» в Toyota Soarer, выпущенной для внутреннего рынка (эта машина известна в штатах как Lexus SC). Она отображала местоположение автомобиля на 6-дюймовом цветном ЖК-дисплее с помощью спутников GPS.

Далее будут встречаться названия систем GPS из прошлого, которые могут быть вам знакомы. В 1992 году подразделения General Motors Oldsmobile и Delco представили встроенную навигационную систему GPS с 6-дюймовым полноцветным экраном Sony CRT под названием TravTek в автомобилях Avis Rent-A-Car во Флориде. В конце концов, эта система стала заводской опцией за $1995 на седане Oldsmobile 88 1995 года, где она была известна как GuideStar, навигационная система с точным расчетом траектории, использующей карты. И не путайте эту систему с более поздним сервисом OnStar, не использующим карты. Первоначально предлагалось использование этой системы только с картами Калифорнии или Лас-Вегаса, экран вставлялся в середину приборной панели и мог поворачиваться влево или вправо в зависимости от того, кто осуществлял навигацию. Сигнал GPS и карты, записанные на компакт-дисках, определяли направление движения.

image

В 1998 году компания Garmin представила свою первую портативную навигационную систему StreetPilot GPS. Компания была основана в 1991 году и стала первой компанией, которая ввела GPS-навигацию в общее пользование в том же году.

В 1997 году японская компания Alpine представила систему послепродажного обслуживания, которая также использовала карты на CD-ROM и принимала сигнал GPS, что позволяло любому покупателю автомобиля добавлять их в свой автомобиль. В следующем году Garmin представила свою первую портативную навигационную систему StreetPilot GPS, и в конце концов Garmin заняла видное место на рынке товаров послепродажного обслуживания, совместимых с разными марками автомобилей.

На кончиках пальцев


Автомобильная навигация быстро завоевала популярность в автомобильной промышленности в 1990-е годы. Но с большинством из этих решений было неудобно взаимодействовать, так как им не хватало еще одной современной технологии — сенсорного экрана.

Сам по себе скромный сенсорный экран был создан в 1965 году и появился на свет благодаря работе передового исследовательского подразделения британского Министерства авиации.

image

Э.А. Джонсон изобрел первый в мире емкостный сенсорный экран, который состоял из нескольких слоев стекла и пластика и был покрыт проводящим материалом (вроде оксида индия и олова или меди). Когда вы прикасаетесь к экрану, замыкается электрическая цепь, заставляющая операционную систему реагировать. Емкостный сенсорный экран либо реагирует, либо нет, и для замыкания цепи необходимо использовать палец. Сенсорный экран Джонсона использовался британскими авиадиспетчерами до 1990-х годов. Он также использовался в миллионах (если не миллиардах) смартфонов, ноутбуков и планшетных компьютеров благодаря более длительному сроку службы, превосходной эффективности multi-touch и четкости по сравнению с реактивными сенсорными экранами, которые впервые появились в 1970 году.

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

Несмотря на то, что эта технология существует уже более десяти лет, первые сенсорные экраны для потребителей появились только в 1982 году в Hewlett-Packard HP-150 — персонального компьютера, работающего под управлением операционной системы MS-DOS на 9-дюймовом сенсорном ЭЛТ-экране от Sony. Технология сенсорного экрана была новой, а потому недешевой: 2795 долларов или 7634 доллара с поправкой на инфляцию.

image

Buick разработал Buick Riviera 1986 года в качестве технологического экспоната для General Motors. Ключевой частью этого плана была замена многих элементов управления приборной панели графическим Центром управления.

Вскоре после этого мир получил машину, которая стала пионером в использовании сенсорных экранов: Buick Riviera 1986 года. В свое время этот автомобиль был проигнорирован – в основном из-за его маленьких размеров и непримечательного дизайна. Тем не менее, первое использование сенсорного экрана в качестве стандартного оборудования в 1986 году было большим успехом, учитывая, что на разработку автомобиля ушло более пяти лет.

image

В 1986 году Buick Riviera был первым сенсорным экраном, когда-либо поставленным в автомобиль в качестве стандартного оборудования. Он появился на рынке через два года после появления первого потребительского продукта с сенсорным Hewlett-Packard PC.

Согласно документам компании, в ноябре 1980 года (за два года до того, как Hewlett-Packard HP-150 поступил в продажу), менеджеры Buick во Флинте, штат Мичиган, решили, что к 1985 году они выпустят автомобиль с самой передовой электроникой в отрасли. По мере того, как комитет оценивал, какие электронные функции будут предлагаться, сенсорный ЭЛТ-экран разрабатывался Delco Systems – дочерней компанией General Motors в Санта-Барбаре, Калифорния. В течение нескольких месяцев, в начале 1981 года, система от GM была продемонстрирована и одобрена Группой Продуктовой Политики GM. AC Spark Plug и Delco Electronics разработали аппаратное обеспечение, в то время как Delco Systems занималась разработкой программного обеспечения. К 1983 году были разработаны спецификации для экрана, и на следующий год эти экраны были установлены в тестовом парке из 100 автомобилей для измерения реакции заказчика.

Графический центр управления (GCC) представлял собой ЭЛТ-экран, покрытый невидимой панелью Mylar, в которой использовались прозрачные проводники, которые были закодированы столбцами и строками для выполнения определенных функций на определенных страницах. Функции каждого переключателя менялись с каждой страницей. Поскольку на разогрев ЭЛТ уходит несколько секунд, цепь GCC начинала прогреваться при касании ручки двери водителя. Когда дверь водителя открывалась и закрывалась, на дисплее появлялся логотип Riviera.

Как только автомобиль был запущен, дисплей переходил на домашнюю страницу, которая удовлетворяла 90% потребностей водителя. Если экрана не касались в течение 30 секунд, он выключался. GCC контролировал автоматический климат-контроль, AM/FM радио, графический эквалайзер и расчеты поездки, а также отображал показания датчиков и диагностическую информацию об автомобиле. Его черный экран и зеленый дисплей теперь кажется антиквариатом, но в то время эта технология была передовой.

Руководители Buick были в восторге, в том числе Кэри Уилсон, который впервые обратил внимание на эту идею в 1980 году. «Приходит новое поколение автомобильных электрических систем, и Buick заложил для них фундамент», — сказал он в 1986 году.

Впрочем, некоторые были настроены менее оптимистично – например, легендарный автомобильный журналист Брок Йейтс.

«Существование графического центра управления — это плохая шутка», — написал он в сентябре 1986 года. «Система, установленная в Riviera не делает ничего такого, чего не мог бы сделать обычный набор ручек, кнопок и аналоговых инструментов за долю секунды». Его коллега Рич Сеппос согласился. «Высокотехнологичный ЭЛТ в Riviera — это не скачок вперед, это лишь небольшой шаг».

Несмотря на отрицательные отзывы, Бьюик установил бы GCC и в Reatte 1988-1989 годов до появления модифицированной версии: визуального информационного центр Oldsmobile, был доступен в 1989-1992 годах в Oldsmobile Toronado Trofeo (Riviera имела такую же базовую платформу). 4-дюймовый полноцветный сенсорный экран был сделан компанией Sony, а система могла быть оснащена дополнительным мобильным телефоном Motorola, которым можно было управлять через экран.

image

Навигационная система Alpine на базе CD-ROM aftermarket может быть добавлена к любому автомобилю.

image

Acura представит свою первую навигационную систему на основе жесткого диска в 1996 году Acura 3.5 RL.

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

image

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

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

Подписывайтесь на каналы:
@AutomotiveRu — новости автоиндустрии, железо и психология вождения
@TeslaHackers — сообщество российских Tesla-хакеров, прокат и обучение дрифту на Tesla



image
О компании ИТЭЛМА
Мы большая компания-разработчик automotive компонентов. В компании трудится около 2500 сотрудников, в том числе 650 инженеров.

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

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


Читать еще полезные статьи:

Let's block ads! (Why?)