История «Яндекса» от 90-х до наших дней
Яндекс знают все. Но мало кто знает его историю – в чем секрет успеха. Рассказываем: как родилась идея поисковика; за счет чего Яндекс обошел Рамблер в начале «нулевых»; в чем и почему с ним до сих пор не может соперничать Google; почему инвесторы компании недовольны итогами 2020 года несмотря на рост в выручке +24% и куда движется Яндекс.
15 показов
34K открытий
Один из символов Яндекса
С чего всё началось
В 1988 году, когда наша страна еще называлась иначе, аспирант Института нефти и газа им. Губкина Аркадий Волож занимался исследованиями в области обработки больших объемов данных.
Компания CompTek, основателем и гендиректором которой являлся Волож, занималась автоматизацией рабочих мест на отечественных предприятиях и поставкой компьютеров.
В процессе работы у Аркадия возникла идея создания компьютерной программы, которая позволила бы находить в больших текстах информацию с учётом морфологии русского языка (то есть по запросу слова в любой форме).
Аркадий Волож
Из этой идеи появилась компания «Аркадия» основанная Воложем вместе с Аркадием Борковским, специалистом по компьютерной лингвистике Академии наук СССР.
Позже Борковский покинул страну, а его место занял друг и однокурсник Воложа Илья Сегалович.
Первым проектом «Аркадии», из которого стало понятно, что поиском можно зарабатывать, стал заказ для НИИ патентной информации.
Разработчики создали несколько локальных поисковых программ, в том числе Международный классификатор изобретений и поиск по Библии, который учитывал морфологию русского языка.
Технология получила название «Яndex». Слово расшифровывалось как yet another indexer (с англ. – «ещё один индексатор», «очередной индексатор») или как «Языковой индекс».
В 1993–1994 годах программисты CompTek начали сотрудничать с лабораторией компьютерной лингвистики. Сегалович изучал морфологию русского языка и совершенствовал поисковую технологию.
Илья Сегалович
1995 год открыл новые горизонты – с выходом компании CompTek в интернет, её создатели решили настроить имеющуюся поисковую программу для работы в новых условиях. Для этого программисты переписали её так, чтобы она работала уже с интернет-сайтами Рунета.
Так 23 сентября 1997 года на международной выставке информационных технологий Softool впервые была продемонстрирована поисковая система «Yandex.ru».
Первые инвестиции
Следующие три года, с 1997 по 2000 Яндекс тщательно выкраивал себе нишу на новом рынке информационных услуг. Компания не была уникальной – ещё в 1996 году появились Рамблер и Апорт, а за год до этого – Altavista. Сам Сегалович высказался на этот счёт:
«Уже в 1997 году, когда мы запускали Yandex.ru, у нас было ощущение кипения, бурлящих пузырьков. Мы понимали, что делаем что-то, что это выстрелит и что никто вокруг этого не понимает. Но не было твердого осознания, как это будет. Это было конкретное, чисто физическое ощущение того, куда надо двигаться, почему это будет нужно всем, почему мы будем номером один. Мы тогда не были номером один, но примерно понимали, что нужно сделать, чтобы им стать».
В 1997 году Рунетом пользовались около 2,2 млн человек и лидером среди поисковиков был Рамблер. Чтобы вырваться вперёд, «Яндекс» закупил три сервера с жёсткими дисками по одному гигабайту. Такие мощности позволяли движку индексировать весь Рунет. Но зарабатывать компании помогли не только новые технические возможности.
Яндекс решил сделать упор на рекламу, но чтобы выделится среди десятков мигающих баннеров нужно было что-то особенное, отличающееся от остальных.
В компании решили придерживаться двух основных принципов: во-первых, реклама должна соответствовать тематике запроса.
А во-вторых, никаких флешей, анимации и самовольного раскрытия баннера на всю страницу.
Свой первый баннер «Яндекс» разместил безвозмездно, в марте 1998 года. Тогда CompTek был основным дистрибьютором Cisco Systems. «Ваша киска купила бы Cisco» – слоган привлёк внимание, и потянулись первые коммерческие клиенты.
В том же 1998 году на Yandex.ru впервые появилась контекстная реклама, которая стала одним из дополнительных ответов на вопросы пользователей, а в последующем – основной бизнес-моделью компании.
Так выглядела главная страница Яндекса в 1998 году
Несмотря на то, что CompTek приносил стабильный доход (именно эта компания кормила прародительницу Яндекса, Аркадию в голодные и неприбыльные годы), в 2000 году Аркадий Волож сложил с себя полномочия гендиректора собственной компании, чтобы занять аналогичное место в только что основанной компании «Яндекс». Учредителями стали акционеры CompTek.
Однако, для дальнейшего развития компании требовались вложения и немалые.
Конечно, взять средства можно было из кормилицы-CompTek, но Волож хотел привлечь инвестиции извне. Ситуацию осложнял тот факт, что в это же время другие российские гиганты-первопроходцы от IT искали инвестиции. Ozon, Rambler, Mail и Яндекс подписали свои договоры с инвесторами, но Яндексу удалось сохранить для себя выгодные условия.
Главной ошибкой в переговорах с инвесторами была неопытность разработчиков.
Вместо того, чтобы настоять на продаже исключительно миноритарного пакета (пакет акций, который не позволяет напрямую участвовать в управлении компанией), стеснительные разработчики уступали инвестбанкирам, и в итоге те, кто не понимал ничего в управлении IT-компанией, становились у руля. Это серьезно оттеснило Ozon, Rambler и Mail с общего пути развития.
Не будь во главе Яндекса опытного менеджера Воложа, возможно мы бы не наблюдали бы сейчас ставшую родной букву Я с рекламных щитов. Аркадию удалось отстоять компанию. Хотя, по тем временам требования Воложа звучали довольно дерзко: продажа исключительно миноритарного пакета акций и объём инвестиций ровно под нужды развития. По его словам, им нужен был именно инвестор, а не хозяин.
Кроме того, будущий партнёр должен быть не просто инвестором, но и единомышленником.
Так в 2000 году Baring Vostok Capital Partners и UFG специально для инвестиций в «Яндексе» создали новый фонд – ru-Net Holdings, который после долгих переговоров получил 35,72 процента акций «Яндекса» за $5,28 млн.
Baring Vostok – фонд частных капиталовложений Майкла Калви. Они инвестируют с 1994 года в быстрорастущие российские компании. Среди их проектов – «СТС медиа», Ozon, Авито и многие другие. Общий привлечённый капитал – $3,7 млрд.UFG (объединённая финансовая группа) – компания, инвестирующая частный и институциональный капитал в Россию и страны СНГ. Также управляет активами российских и иностранных инвесторов.
Председатель совета директоров – Чарльз Райан (эту же должность занимает в «Магните»). Совокупный объём привлечённого капитала – $2,3 млрд.
Существует мнение, что не последнюю роль в инвестициях сыграла моральная поддержка CompTek. Воложу, в отличие от других компаний, не столько нужны были деньги, сколько помощь и поддержка для правильного развития компании – те самые единомышленники, а правильные знакомства и опыт в ведении бизнеса с иностранными партнерами помогли ему их найти.
В число акционеров вошли также менеджеры «Яндекса» и ведущие разработчики поисковой системы. Директором компании по технологиям и разработке стал Илья Сегалович.Команда «Яндекса» насчитывала всего 25 человек, а все данные помещались на одном сервере. Так Яндекс встретил новое тысячелетие.
Первая в Рунете поисковая реклама
«Яндекс. Найдётся всё!» – знаменитый слоган, который появился во время масштабной рекламной кампании российского IT-гиганта.
Это был 2000-ый год, когда представители бренда не только заявили о грандиозных планах, но и выкатили массу интересных фичей.Тогда были открыты новые сервисы – Почта, Новости, Товары, Гуру, Бар, Закладки. Уже тогда поисковик жаждал вместить в себя все, что нужно современному человеку.
В 2001 году появился «Яндекс.Директ» – система контекстной рекламы.
За первый год существования Директа рекламу на Яндексе разместили 2 500 рекламодателей. Он стал первым сервисом поисковой рекламы в Рунете. Уже через год выручка «Яндекс.Директа» удвоилась, и «Яндекс» первой из российских IT-компаний вышел на окупаемость.
В 2001 году поисковая машина «Яндекса» обгоняет Рамблер и с тех пор остаётся лидером отечественного поискового рынка.
Чем же Яндекс выгодно отличался от Рамблера, что позволило ему занять лидирующую позицию на рынке?
1) Учёт морфологии русского языка.
2) Учёт расстояния между словами при поиске, например, в пределах одного словосочетания или абзаца.
3) Алгоритм соответствия результатов поиска запросу пользователя, который учитывал частоту слов из запроса, а также их расположение в документе, относительную частоту для конкретного документа.
Кроме того, в отличие от Яндекса, владельцы которого сохранили главенствующую позицию в компании и нашли правильные инвестиции, Рамблер вместе с привлечёнными средствами получил верхушку, ничего не смыслящую в особенностях сервиса.
Начальство менялось, разработчикам связывали руки, стратегию развития придумывали люди, не понимающие основной цели. Рамблер то превращался в новостную ленту, то с головой уходил в рекламу и в конечном итоге уступил свою позицию более цельному и стабильному Яндексу.
К тому же, у Яндекса была талантливая, молодая команда, практически на уровне интуиции понимающая, куда нужно двигаться. Одним из верных направлений стало усовершенствование рекламы, в ходе которого Волож идет на рискованный шаг. Он решает не продавать рекламу по показам. Теперь рекламодатель мог платить за клик. В первые же дни работы по новой схеме доходы Яндекса упали.
Тогда Волож на неделю стал менеджером и обзванивал все фирмы, у которых был свой сайт в интернете. Он предлагал им купить контекстную рекламу и объяснял принцип её работы. Результаты были видны уже через пару месяцев. Доходы стали расти в геометрической прогрессии и к 2008 году Яндекс.Директ приносит 85% от общей прибыли компании.
Компания развивается и растёт стремительно и уверенно. Летом 2002 года, совместно с российской компанией PayCash, была открыта электронная платёжная система Яндекс.Деньги.
Также появились «Яндекс.Картинки» (поиск по картинкам); вместо сервисов Подбери, Гуру и Товары был образован один – Яндекс.Маркет.
В 2003 году Яндекс становится первой в русскоязычном интернете компанией, которая выплатила своим акционерам дивиденды, общий размер которых достигал 100 тысяч долларов.
В компании работало тогда примерно 100 человек, доходы составляли около 200 тыс. долл., расходы – около 150 тыс. долл.
В 2005 году – выход за пределы страны. Открыто представительство в Украине.
В 2006 году – открыт первый удаленный офис разработки в Санкт-Петербурге.
В дальнейшем такие офисы появятся во многих городах России и за рубежом. Они создаются для разных целей. Среди них есть как офисы разработки, так и офисы продаж, а также офисы, отвечающие за локализацию продуктов.Цель «Яндекса» – поиск молодых и талантливых специалистов.
В рамках этой цели в 2007 году «Яндекс» открывает Школу анализа данных – бесплатные двухгодичные курсы, которые готовят специалистов в области обработки и анализа данных в интернете. Столь быстрый рост не мог не заинтересовать другого крупного игрока мирового рынка.
Российской IT-компанией заинтересовался Google. Сергей Брин и Ларри Пейдж (основатели Google) приехали в московский офис «Яндекса» на переговоры о возможной сделке. Разработчики и менеджеры Яндекса мысленно уже сидели за одним столом с коллегами из Google в общем офисе в Кремниевой долине, но условия покупки не были похожи на равноценное сотрудничество.
На деле Google хотел зайти на российский рынок и поглотить быстро растущий Яндекс.
Единственное, что сдерживало вход Google на отечественный рынок – это морфология русского языка, которой не владел американский поисковик. Яндекс от предложения отказался, но Google не отступил от своей идеи и самостоятельно пришёл в Россию. Постепенно занимая процент рынка, через пару лет он вытолкнул Рамблер, не обладающий такой гибкостью как Яндекс, а после стал подвигать и сам Яндекс.
Чем Google отличался от Яндекса?
В первую очередь, Яндекс учитывал морфологию русского языка, поэтому при написании слова, например, в родительном падеже, он выдавал большой список документов со всеми возможными видами написания. Принцип работы Google был схож с работой Яндекса, однако в его основе лежал особый алгоритм Page Rank, разработанный Брином и Пейджем.
Принцип такой: чем больше страниц ссылаются на сайт, тем выше он окажется в поисковой выдаче.
Этот принцип еще не отжил себя и активно используется до сих пор. В настоящее время Google применяет более 200 способов ранжирования, но Page Rank по-прежнему является одним из ключевых.
Яндекс против Google
Зайдя на российский рынок, Google парировал минимализму и простоте Яндекса еще большим минимализмом и простотой, ненавязчиво спрашивая новых пользователей: «не желаете ли сделать Google стартовой странице?»
Теперь целью Яндекса становится не только рост, а выживание в тяжелых конкурентных условиях. Стараясь сохранить позицию на российском рынке и расширить горизонты, летом 2008 года Яндекс открывает новый зарубежный офис в Кремниевой долине под названием Yandex.Lab.
Покорение мирового рынка
В 2008 г. впервые за свою историю Яндекс входит в 10 крупнейших поисковых систем мира.
Согласно статистике ComScore, 0,9 % поисковых запросов пользователей по всей планете приходится на Яндекс.
В это же время Яндекс покупает информационное агентство Смилинк. На основе базы данных об автомобильных пробках, составляемых этой компанией, запущена платформа Яндекс.Пробки.
Параллельно запускаются сервисы Яндекс.Метрика, Видео, Книги, Авто, Время, Я.Онлайн, Расписания, Интернетометр.
Покупается программа Punto Switcher, позволяющая автоматически исправлять раскладку клавиатуры.2009 год также приносит значительные перемены: компания внедрила новый метод машинного обучения Матрикснет, благодаря чему стало возможным учитывать при поиске в разы больше факторов и их комбинаций.
Этот метод в разы улучшил точность поиска и качество результатов выдачи по отдельным группам запросов.
Если в 2008 году число обслуженных Яндексом запросов составило 663 млн., то в июле 2009 г. – 1,29 млрд. запросов.
19 мая 2010 года компания запустила англоязычную версию своей поисковой системы на домене yandex.com, и, таким образом, вышла на международный уровень.
Развитием англоязычного поиска занимается открытая в 2008 году калифорнийская лаборатория Yandex Labs.
В 2011 Яндекс выходит на биржу, и продает акции на 52,2 млн.
Этот шаг стал вторым крупнейшим IPO после Google. В результате чего несколько десятков сотрудников компании становятся долларовыми миллионерами. Генеральный директор Аркадий Волож получает 101 млн, а технический директор Илья Сегалович – более 20 миллионов долларов.
В 2012 году Яндекс запускает браузер собственной разработки с локализацией для России, Украины и Турции.
В это же время поисковик продолжает борьбу за внимание пользователя с единственным серьезным конкурентом. И, если в России Яндекс сохраняет лидирующие позиции, то мировой рынок по-прежнему остается под влиянием Google.
Владельцы Яндекса оценивают ситуацию адекватно – Аркадий Волож заявляет о планах компании выйти на европейский рынок, но не на лидирующую позицию, а занять там второе место после Google, но с существенной долей, около 30%.
В результате открываются два офиса в Швейцарии: в январе – офис разработок в Цюрихе, а в марте – офис продаж в Люцерне для более оперативной работы с европейскими рекламодателями.
Яндекс начинает сотрудничество с Twitter и Microsoft.
Запускаются сервисы Яндекс.Музыка, веб-версия Яндекс.Такси, Яндекс.Навигатор, а Сбербанк приобретает долю системы Яндекс.Деньги.По состоянию на 2012 год, серверный парк компании достигал более 10 тыс. машин, количество сотрудников – более 4,5 тыс., объём рынка интернет-рекламы превышал 1,7 млрд долл.
К началу 2013 года Яндекс занимает четвёртое место на мировой арене среди поисковых систем.
Приобретения и потери
Компания продолжает расти, расширяться и получать доходы. Вводится новый функционал – платное расширение Яндекс.Диска и покупки на Яндекс.Маркете без перехода на сайт продавца.
В Картах появляются подробные карты зарубежья, что поднимает компанию на мировой уровень по геоданным. За 80 млн.долларов приобретается сервис Кинопоиск со 100% владением акций.
Но 2013 год также приносит и огромную, невосполнимую потерю для компании. Летом умирает Илья Сегалович, главный разработчик, технический отец и один из основателей империи Яндекса.
В последующие годы компания продолжит опираться на разработки и идеи Ильи. В частности, на основе его работы появится голосовой помощник Алиса, Яндекс.Острова и Яндекс.Терра. Пост директора по техническому развитию после смерти Сегаловича будет пустовать вплоть до 2015 года, когда его займет Михаил Парахин.
Тогда же, в 2013 году Волож осознает, что Яндекс – это не просто поисковик. Это феномен, вписанный в историю развития человечества. Новые технологии и новый образ мысли, созданные компанией и продиктованные инновациями.
История создания Яндекса также становится востребованной, и, на этой волне, выходят фильм «Стартап», Яндекс.Книга и собственная книга Воложа «Создание компании мечты».
Новые горизонты
2014 год приносит Яндексу сотрудничество с Фейсбуком, покупку израильского стартапа KitLocate, специализирующегося на разработке геопозиционирования для мобильных гаджетов на Android/iOS и покупку сервиса Auto.ru.
Верхушка «Яндекса» понимает, что для сохранения позиции нужно быть первым или единственным. А если не выходит – предоставлять то, что делают другие, но по-своему. Этому их научил еще далёкий 1998 год и первая контекстная реклама.
На этой волне Яндекс активно скупает и поглощает маленькие IT-компании и стартапы, среди которых:
- Any Void – студия разработки мобильных приложений
- Adfox – платформа по управлению интернет-рекламой
- PriceLabs – сервис по продвижению товаров
- Parascript – стартап по распознанию рукописного и печатного текста
- Метабар с его сервисом «Советник» – помощником для онлайн-покупок.
Кроме того, компания открывает на базе ВШЭ факультет компьютерных наук, которые объединит в себе отделения программной инженерии и прикладной математики и информатики, а также базовую кафедру Яндекса.
В 2015 году появляются новые сервисы – Яндекс.Путешествия, Яндекс.Работа и Яндекс.Недвижимость. Также перезапускается Яндекс.Метрика, улучшаются сервисы Яндекс.Такси и Яндекс.Транспорт.
Для улучшения качества сервиса Такси, Яндекс начинает активное сотрудничество с сотовыми операторами и получает выгодные тарифы для своих водителей.
Несмотря на жёсткую конкуренцию, Яндексу удаётся увеличить количество обрабатываемых запросов: по статистике LiveInternet, за 2015 г. прирост составляет 5%. В четвёртом квартале на долю Яндекса приходилось 57,3% запросов пользователей в Рунете.
Не уступает по объемам роста и 2016 год: появляются сервисы Яндекс.Дзен и Яндекс.Лицей – программа обучения школьников промышленному программированию на языке программирования Python.
В 2017 году компания попадает под санкции Украины, запрещающие российские IT-технологии на территории своей страны. Однако, это не мешает Яндексу развиваться: одним из глобальных расширений для компании становится сотрудничество с Uber и такси Яндекса выходит на мировой уровень.
В 2018 году компания представляет первую «умную станцию», а в 2019 в продажу выходит первая беспроводная bluetooth-колонка со встроенным голосовым помощником Алиса.
Супер-активно развивается Яндекс.Метрика. За последний год там появилось 7 (!) новых типов целей. Кроме того, система научилась фиксировать их автоматически.
На данный момент у Яндекса есть отделения в России (Москва, Санкт-Петербург, Екатеринбург, Новосибирск, Казань, Ростов-на-Дону), в Украине (Киев, Одесса), Белоруссии, Казахстане, США (Калифорния), Турции и Швейцарии.
История Яндекса богата на события и продолжает обновляться каждый день. Можно с уверенностью заявить, что Яндекс – российский феномен и значимый IT-бренд с мировым влиянием.
Что дальше
Доля поискового бизнеса в выручке составляет по итогам 2020 года 54%. При этом он почти не растет (всего +2% по сравнению с 2019 годом). Потенциал рекламных технологий также ограничен.
Несмотря на общий рост выручки +24% за 2020 год, инвесторы недовольны.
Поэтому Яндекс сейчас делает ставку на финтех & электронную коммерцию.В феврале 2021 года компания запустила сервис Yandex Pay. Это сервис для быстрой оплаты онлайн-покупок банковской картой. С его помощью можно платить картой, не вводя её данные – они подтянутся из аккаунта на Яндексе. Подробности – здесь.
Также есть информация, что «Яндекс» собирается купить банк «Акрополь» владельцем которого является генеральный директор группы компаний «Связной» Евгений Давыдович. Вот зачем это нужно.
Начало 2021 года выдалось «пасмурным»: 20 российских онлайн-платформ подали против Яндекса заявлениев ФАС (Федеральную антимонопольную службу) из-за доминирующего положения его сервисов в поисковой выдаче. ФАС в свою очередь вынесла предписание Яндексу что-то с этим сделать. Скоро узнаем, чем это закончится.
P.S.Если подвести итог истории компании от начала 90-х до сегодняшнего дня, можно выделить основные моменты, позволившие компании занять одну из лидирующих позиций в IT:
1) Яндекс предлагает и продолжает разрабатывать сервисы, которые нужны пользователям ежедневно и значительно упрощают им жизнь. Практически каждый продукт уникален.
2) Инвестиции в будущее – неотъемлемая часть успеха. Яндекс вкладывает много денег как в краткосрочные, так и долговременные проекты.
Развиваясь в различных IT-сферах и скупая стартапы, бренд создаёт для себя «подушку безопасности», благодаря которой даже при полном падении основного бизнеса, компания продолжит своё существование.
3) Локальность бренда – технологии поиска остаются заточенными под русскоязычных пользователей.
Несмотря на то, что Яндекс стремится занять топовые позиции в мировом поиске, ставка делаются на Россию, Белоруссию, Казахстан.
4) Масштабируемость – сегодня офисы Яндекса находятся не только в странах СНГ, но также в Турции, Германии, Швейцарии, Нидерландах, Китае, США и Израиле.
Во многом успех Яндекса в Рунете связывают с тем, что он стал пионером в разработке поисковой системы, способной эффективно справляться с трудностями русского языка. Именно это стало основным преимуществом, недоступным даже таким гигантам, как Google.
37 комментариев
Написать комментарий.
Аккаунт удален
Развернуть ветку
Справедливости ради айтишники и по сей день рвутся там работать. А что касается молодой и прогрессивной компании и монополиста — плоха та компания, которая не стремится стать монополистом на своем рынке. Таков бизнес. Что, Google, с которым тут все сравнивают Яндекс — не монополист, что — он не стремится к доминированию везде, где возможно? Да точно так же.
P.S. Бизнес просто обязан думать о прибыли в первую очередь. Иначе это нежизнеспособная «песочница», а не бизнес.
Развернуть ветку
Комментарий удален модератором
Развернуть ветку
+ Яндекс.Бар. Который сейчас уже не используется, но принцип повсеместного спамирования остался.
Развернуть ветку
Уж больно сильно статейка источает смрад маркетингового отдела.
Развернуть ветку
Вот да, Александр. Объяснитесь. Сколько Яндекс вам заплатил за маркетинг? )) (шутка)
Развернуть ветку
Назовите минусы яндекса. Очень интересно мнение юзеров
Развернуть ветку
Говно поиск и реклама засунутуя во все дырки
Развернуть ветку
Ну черт знает. Я несколько раз порывался юзать только поиск гугла, в итоге все время в гугле переходил в поиск Яндекса. Для Ру рынка Яша всеравно пока лучший
Развернуть ветку
Что вы имеете в виду?
Когда я ищу, я хочу найти. Гугл — это find, Yandex — search.
Кроме поиска картинок, у них отвратительный поиск.
Развернуть ветку
Аккаунт удален
Развернуть ветку
Так и про Google — точно такой же стереотип, если смотреть объективно. Ни те, ни другие — не лучше и не хуже. Просто они разные.
Развернуть ветку
Аккаунт удален
Развернуть ветку
Стереотип — про то, что Гугл чем-то лучше Яндекса. Поиск? Для меня поиск Яндекса пока №1. Не потому, что я «патриот», а просто субъективное мнение, основанное на личной практике.
P.S. Сдается мне, что все выпады в сторону Яндекса — этакий нонконформизм. Ну они ж свои, их можно хейтить. Google — забугорный. А там вообще всё типа лучше.
Развернуть ветку
Александр здравствуйте, как можно с вами связаться? ссылка на фейсбук не активна..
Развернуть ветку
Можно в Телеграм @alexmashkarev
Развернуть ветку
Мне русскоязычные запросы проще искать в Яндексе, англоязычные в Гугле.
Развернуть ветку
Аккаунт удален
Развернуть ветку
Ну вот пусть народ в комментах напишет свое мнение.
Развернуть ветку
Аккаунт удален
Развернуть ветку
Яндекс. Реклама. Браузер. Навязывание своих бестолковых сервисов. Кроме «Такси» пока ничего не получилось, к сожалению.
Развернуть ветку
История размеров поисковика Яндекса.
Когда-то Яндекс был ламповым и публиковал статистику объемов данных. Я покапался в WaybackMachine. Данные публиковали с 2000 года по 2010 год примерно.
2000 апрель —
180 Гб —
17 млн док. —
10К на док —
в продаже были диски 20-60 Гб
итого 3 диска
2001 апрель —
505 Гб —
36 млн док. —
13К на док —
в продаже были диски 60-100 Гб —
5 дисков
2002 июнь —
1 077 ГБ —
64 млн док. —
18К на док —
в продаже были диски 160 Гб —
7 дисков
2003 июнь —
2 410 ГБ —
94 млн док. —
27К на док —
в продаже были диски 160-200 Гб —
12 дисков
2004 июнь —
5 188 ГБ —
169 млн док. —
27К на док —
в продаже были диски 160-400 Гб —
12 дисков
2005 июнь —
19 744 ГБ —
706 млн док. —
27К на док —
в продаже были диски 500 Гб —
39 дисков
В этом году подключили сайты Украины
2006 август —
25 393 ГБ —
1 029 млн док. —
26К на док —
в продаже были диски 750 Гб —
33 диска
2007 июль —
57 393 ГБ —
2 385 млн док. —
25К на док —
в продаже были диски 1024 Гб —
57 дисков
Пошёл бум сео бирж и копирайтинга —
2008 сентябрь —
111 864 ГБ —
4 367 млн док. —
27К на док —
в продаже были диски 1500 Гб —
75 дисков
2009 осень —
140 864 ГБ —
5 180 млн док. —
29К на док —
в продаже были диски 2000 Гб —
70 дисков
2010 июль —
315 000 ГБ —
10 408 млн док. —
32К на док —
в продаже были диски 3000 Гб —
105 дисков
Проскальзывали данные по Google
2000 —
1 млрд док, как у яндекса в 2006
2008
1 000 млрд док
2016
60 000 млрд док
Указывали — 100 petabytes (equivalent to 100,000 1TB hard drives)
Есть предположение. Объем полезных и актуальных текстов, несущих какую-то уникальную смысловую нагрузку крайне не велик. На русском, по моим оценкам, около 3-5Тб чистого текста.
Гугл как-то подсчитал, что в мире издано около 130млн книг. Если средний размер представить как 200кб, то получается 24 Тб.
«Яндекс.Музыка»: зачем они так сделали?
В начале года я уже писал о том, как меня неприятно поразил сервис «СберЗвук». А в серии статей «Импортозамещение поневоле» перебирал вообще все аудиостриминговые сервисы. Поиск замены для ушедшего из России Spotify лично для меня завершился переходом на «Яндекс.Музыку» — во многом по причине того, что у них было совместное предложение с «МегаФоном», подразумевавшее, что можно оформить «льготную» подписку. Ага, льготную в кавычках, по той причине, что мне не попадалось других предложений, кроме как льготным образом начать пользоваться этим сервисом. Полную цену с первого месяца вы начнете платить ровно в одном случае: если ваш аккаунт уже был когда-то привязан к данному сервису «Яндекса». Но ничто не помешает вам создать новый и получить все то же льготное предложение. Никакой проверки устройств, личностей и прочего у «Яндекса» нет, так что можно все время участвовать в каких-то льготных акциях, которые предлагаются свежеподключившимся. И это приводит к первому вопросу: что помешало сделать нормальную систему аккаунтов?
Аккаунты
Нет, меня как пользователя не заботит, что в руководстве «Яндекса» никто не подумал о том, что рост базы пользователей — это вещь в себе. Пользователю, в общем-то, все равно, что компания хвастается миллионами пользователей, тогда как на самом деле у одного человека может быть хоть десяток аккаунтов. Но не считать это проблемой на уровне оценки собственной доли на рынке — это странно. Более того, не совсем понятно, в чем смысл бесконечного предоставления пользователям возможности создавать новые подключения к сервису при одновременном вводе искусственных ограничений по числу устройств, на которых можно запустить ваш сервис. Это какая-то откровенная ерунда.

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

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

Что такое Widgets, Elements, BuildContext, RenderOject, Bindings.
Вступление
В прошлом году (прим: в 2018), когда я начал свое путешествие в сказочный мир Flutter, в Интернете было очень мало информации по сравнению с тем, что есть сегодня. Сейчас, несмотря на то, что уже написано много материалов, лишь небольшая их часть рассказывает о том, как на самом деле работает Flutter.
Что же такое Widgets (виджеты), Elements (элементы), BuildContext? Почему Flutter быстрый? Почему иногда он работает не так, как ожидается? Что такое деревья и зачем они нужны?
В 95% случаев при написании приложения вы будете иметь дело только с виджетами, чтобы что-то отображать на экране или взаимодействовать с ним. Но неужели вы никогда не задумывались, как вся эта магия работает внутри? Как система узнает, когда обновить экран и какие части должны быть обновлены?
Содержание:
- Вступление
- Часть 1: Предыстория
- Немного об устройстве
- Интерфейс между кодом и устройством
- Управление Flutter Framework рендерингом Flutter Engine
- RenderView и RenderObject
- Инициализация bindings
- SchedulerBinding
- GestureBinding
- RendererBinding
- WidgetsBinding
- Неизменяемая конфигурация
- Иерархическая структура виджетов
- Лес за деревьями
- Понимание Element в дереве
- 3 категории виджетов
- Типы элементов
- Как виджеты и элементы работают вместе
- onDrawFrame()
- Насколько полезным может быть BuildContext?
- Забавы ради
Часть 1: Предыстория
В первой части статьи представлены некоторые ключевые понятия, которые будут использованы во второй части материала и помогут лучше понять Flutter.
Немного об устройстве
Давайте начнем с конца и вернемся к основам.
Когда вы смотрите на свое устройство или, точнее, на приложение, запущенное на вашем устройстве, вы видите только экран.
На самом деле, всё, что вы видите – это пиксели, которые вместе составляют 2-мерное изображение, и когда вы касаетесь экрана пальцем, устройство распознает только положение вашего пальца на стекле.
Вся магия приложения (с визуальной точки зрения) в большинстве случаев заключается в обновлении этого изображения на основе следующих взаимодействий:
- с экраном устройства (например, палец на стекле)
- с сетью (например, связь с сервером)
- со временем (например, анимация)
- с другими внешними датчиками
Визуализация изображения на экране обеспечивается аппаратным обеспечением (дисплеем), которое регулярно (обычно 60 раз в секунду) обновляет дисплей. Эта называется «частотой обновления» и выражается в Гц (Герцах).
Дисплей получает информацию для отображения от GPU (Graphics Processing Unit), представляющего собой специализированную электронную схему, оптимизированную и предназначенную для быстрого формирования изображения из некоторых данных (полигонов и текстур). Количество раз в секунду, которое графический процессор может генерировать «изображение» (=буфер кадров) для отображения и отправки его на аппаратное обеспечение, называется кадровой частотой (прим: frame rate). Это измеряется с помощью блока кадров в секунду (например, 60 кадров в секунду или 60fps).
Вы, возможно, спросите меня, почему я начал эту статью с понятий 2-мерного изображения, отображаемого GPU / аппаратным обеспечением и датчиком физического стекла и какова связь с обычными виджетами Flutter?
Думаю, что будет легче понять, как на самом деле работает Flutter, если мы посмотрим на него с этой точки зрения, так как одна из главных целей приложения Flutter – создать это 2-мерное изображение и дать возможность взаимодействовать с ним. Также потому, что во Flutter, хотите верьте, хотите нет, почти все обусловлено необходимостью обновления экрана быстро и в нужный момент!
Интерфейс между кодом и устройством
Так или иначе, все интересующиеся Flutter уже видели следующую картинку, которая описывает архитектуру высокого уровня Flutter.

Когда мы пишем приложение Flutter, используя Dart, мы остаемся на уровне Flutter Framework (выделено зеленым цветом).
Flutter Framework взаимодействует с Flutter Engine (синим цветом) через слой абстракции, называемый Window. Этот уровень абстракции предоставляет ряд API для косвенного взаимодействия с устройством.
Также через этот уровень абстракции Flutter Engine уведомляет Flutter Framework, когда:
- событие, представляющее интерес, происходит на уровне устройства (изменение ориентации, изменение настроек, проблема с памятью, состояние работы приложения…)
- какое-то событие происходит на уровне стекла (=жест)
- канал платформы отправляет некоторые данные
- но также и в основном, когда Flutter Engine готов к рендерингу нового кадра
Управление Flutter Framework рендерингом Flutter Engine
В это сложно поверить, но это правда. За исключением некоторых случаев (cм. ниже) ни один код Flutter Framework не выполняется без запуска рендеринга Flutter Engine.
- Gesture / Жест (= событие на стекле)
- Сообщения платформы (= сообщения, которые создаются устройством, например, GPS)
- Сообщения устройства (= сообщения, которые относятся к изменению состояния устройства, например, ориентация, приложение, отправленное в фоновом режиме, предупреждения памяти, настройки устройства…)
- Future или http-ответы
(Между нами говоря, на самом деле можно применить визуальное изменение без вызова от Flutter Engine, но это не рекомендуется делать)
Вы меня спросите: «Если какой-то код, связанный с жестом, выполняется и вызывает визуальное изменение или если я использую timer для задания периодичности задачи, которая приводит к визуальным изменениям (например, анимация), то как это работает?»
Если вы хотите, чтобы произошло визуальное изменение или чтобы какой-то код выполнялся на основе таймера, то вам нужно сообщить Flutter Engine, что что-то должно быть отрисовано.
Обычно при следующем обновлении Flutter Engine обращается к Flutter Framework для выполнения некоторого кода и в конечном итоге предоставляет новую сцену для рендеринга.
Поэтому важный вопрос заключается в том, как движок Flutter организует все поведение приложения на основе рендеринга.
Чтобы вам получить представление о внутренних механизмах, посмотрите на следующую анимацию:
Краткое объяснение (более подробная информация будет позже):
- Некоторые внешние события (жест, http-ответы и тд) или даже futures могут запускать задачи, которые приводят к необходимости обновления отображения. Соответствующее сообщение отправляется Flutter Engine (= Schedule Frame)
- Когда Flutter Engine готов приступить к обновлению рендеринга, он создает Begin Frame запрос
- Этот Begin Frame запрос перехватывается Flutter Framework, который выполняет задачи, связанные в основном с Tickers (например, анимацию)
- Эти задачи могут повторно создать запрос для более поздней отрисовки (пример: анимация не закончила своё выполнение, и для завершения ей потребуется получить еще один Begin Frame на более позднем этапе)
- Далее Flutter Engine отправляет Draw Frame, который перехватывается Flutter Framework, который будет искать любые задачи, связанные с обновлением макета с точки зрения структуры и размера
- После того, как все эти задачи выполнены, он переходит к задачам, связанным с обновлением макета с точки зрения отрисовки
- Если на экране есть что-то, что нужно нарисовать, то новая сцена (Scene) для визуализации отправляется в Flutter Engine, который обновит экран
- Затем Flutter Framework выполняет все задачи, которые будут выполняться после завершения рендеринга (= PostFrame callbacks), и любые другие последующие задачи, не связанные с рендерингом
- … и этот процесс начинается снова и снова
RenderView и RenderObject
Прежде чем погружаться в детали, связанные с потоком действий, самое время ввести понятие Rendering Tree.
Как уже говорилось ранее, всё в конечном итоге преобразуется в пиксели, которые будут отображаться на экране, и Flutter Framework преобразует Widgets, которые мы используем для разработки приложения, в визуальные блоки, которые будут отображаться на экране.
Данные визуальные части соответствуют объектам, называемым RenderObject, которые используются для:
- определения некоторой области экрана с точки зрения размеров, положения, геометрии, а также с точки зрения «rendered content»
- определения зон экрана, на которые могут повлиять жесты (= касания пальцев)
Набор всех RenderObject формирует дерево, называемое Render Tree. В верхней части этого дерева (= root) мы находим RenderView.
RenderView представляет общую поверхность для объектов Render Tree и является специальной версией RenderObject.

Визуально мы могли бы представить все это следующим образом:
Cвязь между Widget и RenderObject будет рассмотрена далее. А пока пришло время немного углубиться…
Инициализация bindings
При запуске Flutter приложения сначала вызывается функция main() , который в конечном итоге вызовет метод runApp(Widget app) .
Во время вызова метода runApp() Flutter Framework инициализирует интерфейсы между собой и Flutter Engine. Эти интерфейсы называются bindings (прим: привязки).
Введение в привязки
Привязки предназначены для того, чтобы быть связующим звеном между фреймворком и движком Flutter. Только с помощью привязок можно обмениваться данными между Flutter Framework и Flutter Engine.
(Есть только одно исключение из этого правила – RenderView, но мы обсудим это позже).Каждая привязка отвечает за обработку набора конкретных задач, действий, событий, сгруппированных по области деятельности.
На момент написания этой статьи во Flutter Framework насчитывается 8 привязок.
Ниже приведены 4 из них, которые будут рассмотрены в этой статье:
Для полноты картины упомяну и остальные 4:
- ServicesBinding: отвечает за обработку сообщений, отправленных каналом платформы (platform channel)
- PaintingBinding: отвечает за обработку кэша изображений
- SemanticsBinding: зарезервировано для последующей реализации всего, что связано с семантикой
- TestWidgetsFlutterBinding: используется библиотекой тестов виджетов
Можно также упомянуть WidgetsFlutterBinding, но на самом деле это не является привязкой, а скорее своего рода «инициализатором привязки».
На следующей диаграмме показано взаимодействие между привязками, которые я собираюсь рассмотреть далее, и Flutter Engine.

Давайте посмотрим на каждую из этих «основных» привязок.
SchedulerBinding
У этой привязки есть две основные обязанности:
- Сказать Flutter Engine: «Эй! В следующий раз, когда вы не будете заняты, «разбудите» меня, чтобы я мог немного поработать и сказать вам, что отрендерить, или, если мне нужно, чтобы вы вызвали меня позже. «
- Слушать и реагировать на такие «тревожные пробуждения» (см. ниже)
Когда SchedulerBinding запрашивает «тревожное пробуждение»?
- Когда Ticker должен отработать новый tick
Например, у вас есть анимация, вы ее запускаете. Анимация кадрируется с помощью Ticker, который с регулярным интервалом (= tick) вызывается для выполнения обратного вызова. Чтобы запустить такой обратный вызов, нам нужно сказать Flutter Engine, чтобы он «разбудил» нас при следующем обновлении (= Begin Frame). Это запустит обратный вызов ticker для выполнения его задачи. Если ticker все еще нужно продолжить выполнение, то в конце своей задачи он вызовет SchedulerBinding для планирования другого кадра. - Когда надо обновить отображение
Например, надо отработать событие, которое приводит к визуальному изменению (пример: обновление цвета части экрана, прокрутка, добавление / удаление чего-либо с экрана), для этого нам нужно предпринять необходимые шаги, чтобы в конечном итоге показать на экране обновленное изображение. В этом случае, когда происходит такое изменение, Flutter Framework вызывает SchedulerBinding для планирования другого кадра с помощью Flutter Engine. (Позже мы увидим, как это работает на самом деле)
GestureBinding
Данная привязка слушает взаимодействие с движком в терминах «пальца» (= жест).
В частности, он отвечает за прием данных, относящихся к пальцу, и за определение того, с какой частью (частями) экрана работают жесты. Затем он соответственно уведомляет об этом / этих частях.
RendererBinding
Эта привязка является связующим звеном между Flutter Engine и Render Tree. Она отвечает за:
- прослушивание событий, создаваемых движком, чтобы сообщить об изменениях, применяемых пользователем через настройки устройства, которые влияют на визуальные эффекты и / или семантику
- сообщение движку об изменениях, которые будут применены к отображению
Чтобы предоставить изменения, которые будут отображаться на экране, RendererBinding отвечает за управление PipelineOwner и инициализацию RenderView.
PipelineOwner — это своего рода оркестратор, который знает, что нужно сделать с RenderObject в соответствии с компоновой, и координирует эти действия.
WidgetsBinding
Данная привязка прослушивает изменения, применяемые пользователем через настройки устройства, которые влияют на язык (= locale) и семантику.
Я предполагаю, что на более позднем этапе развития Flutter все события, связанные с семантикой, будут перенесены в SemanticsBinding, но на момент написания этой статьи это еще не так.
Кроме этого, WidgetsBinding является связующим звеном между виджетами и Flutter Engine. Она отвечает за:
- управление процессом обработки изменений структуры виджетов
- вызов рендеринга
Обработка изменений структуры виджетов осуществляется с помощью BuildOwner.
BuildOwner отслеживает, какие виджеты нуждаются в перестройке, и обрабатывает другие задачи, которые применяются к структуре виджетов в целом.
Часть 2. От виджетов к пикселям
Теперь, когда мы познакомились с основами внутренней работы Flutter, пришло время поговорить о виджетах.
Во всей документации Flutter вы прочитаете, что всё Widgets (виджеты).
Это почти правильно. Но для того, чтобы быть немного более точным, я бы скорее сказал:
Со стороны разработчика, всё, что связано с пользовательским интерфейсом с точки зрения компоновки и взаимодействия, делается с помощью виджетов.
К чему такая точность? К тому, что Widget позволяет разработчику определить часть экрана с точки зрения размеров, содержания, компоновки и взаимодействия, НО за этим есть гораздо большее. Так что же такое Widget на самом деле?
Неизменяемая конфигурация
Если вы посмотрите исходный код Flutter, то заметите следующее определение класса Widget.
@immutable abstract class Widget extends DiagnosticableTree < const Widget(< this.key >); final Key key; . >Аннотация «@immutable» очень важна и говорит нам, что любая переменная в классе Widget должна быть FINAL, другими словами: «определена и назначена ОДИН РАЗ ДЛЯ ВСЕХ«. Таким образом, после создания экземпляр Widget больше не сможет изменить свои внутренние переменные.
Так как Widget неизменяемый, то можно его считать статичной конфигурацией
Иерархическая структура виджетов
Когда вы разрабатываете с помощью Flutter, вы определяете структуру своего экрана(ов), используя виджеты примерно так:
Widget build(BuildContext context)
В этом примере используется 7 виджетов, которые вместе образуют иерархическую структуру. Очень упрощенная схема, основанная на данном коде, выглядит следующим образом:

Как можно заметить, представленная схема выглядит, как дерево, где SafeArea является его корнем.
Лес за деревьями
Как вы уже знаете, виджет сам по себе может быть агрегацией других виджетов. В качестве примера можно изменить предыдущий код следующим образом:
Widget build(BuildContext context)
Данный вариант предполагает, что виджет «MyOwnWidget» сам будет отображать SafeArea, Scaffold. Но самое главное в этом примере заключается в том, что
Widget может представлять лист, узел в дереве, даже само дерево или, почему бы и нет, лес деревьев.
Понимание Element в дереве
При чём здесь это?
Как будет показано далее, чтобы иметь возможность генерировать пиксели, которые составляют изображение, отображаемое на устройстве, Flutter должен знать в деталях все маленькие части, которые составляют экран, и, чтобы определить все части, ему необходимо знать раскрытие всех виджетов.
Чтобы проиллюстрировать данный момент, рассмотрим принцип матрёшки: в закрытом состоянии вы видите только 1 куклу, но она содержит другую, которая в свою очередь содержит ещё одну и так далее.

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

Формулировка «дерево виджетов» (Widget tree) существует только для облегчения понимания, поскольку программисты используют виджеты, но во Flutter НЕТ дерева виджетов!
На самом деле, правильнее будет сказать «дерево элементов» (tree of Elements)
Настало время ввести понятие элемента (Element).
Каждому виджету соответствует один элемент. Элементы связаны друг с другом и образуют дерево. Следовательно элемент является ссылкой на что-то в дереве.
Для начала подумайте об элементе как о узле, который имеет родителя и, возможно, ребенка. Связывая их вместе через отношение родитель — ребёнок, мы получаем древовидную структуру.

Как вы можете видеть, элемент указывает на один виджет, а также может указывать на RenderObject.
Даже лучше… Element указывает на Widget, который создал этот Element!
Давайте подведём итоги:
- Нет никакого дерева виджетов, но есть дерево элементов
- Элементы создаются виджетами
- Элемент ссылается на виджет, который его создал
- Элементы связаны вместе с родительскими отношениями
- У элемента может быть «ребёнок»
- Элементы также могут указывать на RenderObject
Элементы определяют, как части отображаемых блоков связаны друг с другом
Для того, чтобы лучше представить, где понятие элемент подходит, давайте рассмотрим следующее визуальное представление:

Как вы можете заметить, дерево элементов является фактической связью между виджетами и RenderObjects.
Но почему Widget создает Element?
3 категории виджетов
Во Flutter виджеты разделены на 3 категории, лично я называю их следующим образом (но это только мой способ классифицировать их):
- Proxy
Основная задача этих виджетов состоит в том, чтобы хранить некоторую информацию (которая должна быть доступной для виджетов), части древовидной структуры, основанной на Proxy. Примером таких виджетов является InheritedWidget или LayoutId.
Эти виджеты не принимают непосредственного участия в формировании пользовательского интерфейса, но используются для получения информации, которую они могут предоставить. - Renderer
Данные виджеты имеют непосредственное отношение к компоновке экрана, поскольку они определяют (или используются для определения) размеры, положение, отрисовку. Типичными примерами являются: Row, Column, Stack, а также Padding, Align, Opacity, RawImage. - Component
Это другие виджеты, которые предоставляют непосредственно не окончательную информацию, связанную с размерами, позициями, внешним видом, а скорее данные (или подсказки), которые будут использоваться для получения той самой финальной информации. Эти виджеты обычно называются компонентами.
Примеры: RaisedButton, Scaffold, Text, GestureDetector, Container.

В этом PDF-файле перечислена большая часть виджетов, сгруппированных по категориям.
Почему это разделение важно? Потому что в зависимости от категории виджета, соответствующий тип элемента связан с…
Типы элементов
Есть несколько типов элементов:
Как вы можете видеть на картинке выше, элементы делятся на 2 основных типа:
- ComponentElement
Эти элементы напрямую не отвечают за отрисовку какой-либо части отображения. - RenderObjectElement
Данные элементы отвечают за части отображаемого изображения на экране.
Отлично! Столько информации, но как всё это связано друг с другом и почему об этом интересно рассказать?
Как виджеты и элементы работают вместе
Во Flutter вся механика основана на инвалидации элемента или renderObject.
Инвалидация элемента может быть сделана следующими способами:
- используя setState , который инвалидирует весь StatefulElement (обратите внимание, что я намеренно не говорю StatefulWidget)
- через уведомления, обрабатываемые proxyElement (например, InheritedWidget), который инвалидирует любой элемент, зависящий от данного proxyElement
Результатом инвалидации является то, что на соответствующий элемент появляется ссылка в списке dirty элементов.
Инвалидация renderObject означает, что структура элементов никак не меняется, но происходит изменение на уровне renderObject, например:
- изменение его размеров, положения, геометрии.
- необходимо что-то перекрасить, например, когда вы просто меняете цвет фона, стиль шрифт.
Результатом такой инвалидации является ссылка на соответствующий renderObject в списке объектов рендеринга (renderObjects), которые необходимо перестроить или перекрасить.
Независимо от типа инвалидации вызывается SchedulerBinding (помните такое?) для запроса к Flutter Engine, чтобы тот запланировал новый кадр.
Это именно тот момент, когда Flutter Engine «будит» SchedulerBinding и происходит вся магия.
onDrawFrame()
Ранее в этой статье мы отметили, что у SchedulerBinding две основные обязанности, одна из которых заключается в готовности обрабатывать запросы, создаваемые Flutter Engine, связанные с перестроением кадра. Это идеальный момент, чтобы сосредоточиться на этом.
Ниже на частичной диаграмме последовательности показано, что происходит, когда SchedulerBinding получает запрос onDrawFrame() от Flutter Engine.

Шаг 1. Элементы
Вызывается WidgetsBinding, и данная привязка сначала рассматривает изменения, связанные с элементами. WidgetsBinding вызывает метод buildScope объекта buildOwner, так как BuildOwner отвечает за обработку дерева элементов. Этот метод проходит по списку dirty элементов и запрашивает их перестроение (rebuild).
Основными принципами данного метода-перестроения ( rebuild() ) являются:
- Следует запрос на перестроение элемента (это займёт большую часть времени), вызывая метод build() виджета, на который ссылается этот элемент (= метод Widget build (BuildContext context) ). Данный метод build() вернёт новый виджет
- Если у элемента нет «детей», то для нового виджета создаётся элемент (см. ниже) (прим: inflateWidget), в противном случае
- новый виджет сравнивается с тем, на который ссылается дочерний элемент элемента
- Если они взаимозаменяемы (= тот же тип виджета и ключ), то обновление происходит и дочерний элемент сохраняется.
- Если они не взаимозаменяемы, то дочерний элемент отбрасывается (~ discarded) и для нового виджета создаётся элемент
- Данный новый элемент монтируется как дочерний элемент элемента. (монтируется (mounted) = вставляется в дерево элементов)
Следующая анимация попытается сделать это объяснение немного нагляднее.
Примечание по виджетам и элементам
Для нового виджета создаётся элемент конкретного типа, соответствущего категории виджета, а именно:
- InheritedWidget ->InheritedElement
- StatefulWidget ->StatefulElement
- StatelessWidget ->StatelessElement
- InheritedModel ->InheritedModelElement
- InheritedNotifier ->InheritedNotifierElement
- LeafRenderObjectWidget ->LeafRenderObjectElement
- SingleChildRenderObjectWidget ->SingleChildRenderObjectElement
- MultiChildRenderObjectWidget ->MultiChildRenderObjectElement
- ParentDataWidget ->ParentDataElement
У каждого из этих типов элементов есть свое собственное поведение. Например:
- StatefulElement вызовет метод widget.createState() при инициализации, который создаст состояние (State) и свяжет его с элементом
- Когда элемент типа RenderObjectElement смонтирован, то он создаёт RenderObject. Этот объект renderObject будет добавлен в Render Tree и связан с элементом.
Шаг 2. renderObjects
Теперь после завершения всех действий, связанных с dirty элементами, Element Tree является стабильным. Поэтому пришло время рассмотреть процесс визуализации.
Поскольку RendererBinding отвечает за обработку Render Tree, WidgetsBinding вызывает метод drawFrame RendererBinding.
Ниже на частичной диаграмме показана последовательность действий, выполняемых во время запроса drawFrame().

На этом шаге выполняются следующие действия:
- Каждый renderObject, помеченный как dirty, запрашивается для выполнения его компоновки (то есть вычисления его размеров и геометрии)
- Каждый renderObject, помеченный как «нуждающийся в перерисовке», перерисовывается, используя свой метод layer
- Результирующая сцена формируется и отправляется во Flutter Engine, чтобы последний передал ее на экран устройства
- Наконец, также обновляется семантика и отправляется во Flutter Engine
В конце этого потока действий экран устройства обновляется.
Часть 3: Обработка жестов
Жесты (= события, связанные с действиями пальца на стекле) обрабатываются с помощью GestureBinding.
Когда Flutter Engine отправляет информацию о событии, связанном с жестом, через window.onPointerDataPacket API, то GestureBinding перехватывает её, выполняет некоторую буферизацию и:
- преобразует координаты, выдаваемые Flutter Engine, в соответствие с device pixel ratio, а затем
- запрашивает у renderView список всех RenderObjects, которые находятся в части экрана, относящейся к координатам события
- затем проходит по полученному списку renderObjects и отправляет связанное событие каждому из них
- если renderObject «слушает» события такого типа, то он его обрабатывает
Надеюсь, сейчас понятно, насколько важны renderObjects.
Часть 4: Анимации
Эта часть статьи посвящена понятию анимации и глубокому пониманию Ticker.
Когда вы работаете с анимациями, то вы обычно используете AnimationController или любой виджет для анимаций (прим: AnimatedCrossFade).
Во Flutter всё, что связано с анимациями, относится к Ticker. У Ticker, когда он активен, есть только одна задача: «он просит SchedulerBinding зарегистрировать обратный вызов и сообщить Flutter Engine, что надо разбудить его, когда появится новый обратный вызов». Когда Flutter Engine готов, он вызывает SchedulerBinding через запрос: «onBeginFrame«. SchedulerBinding обращается к списку обратных вызовов ticker и выполняет каждый из них.
Каждый tick перехватывается «заинтересованным» контроллером для его обработки. Если анимация завершена, то ticker «отключён», иначе ticker запрашивает SchedulerBinding для планирования нового обратного вызова. И так далее.
Полная картина
Теперь мы узнали, как работает Flutter:

BuildContext
Напоследок вернёмся к диаграмме, которая показывает различные типы элементов, и рассмотрим сигнатуру корневого Element:
abstract class Element extends DiagnosticableTree implements BuildContext
Мы видим тот самый всем известный BuildContext! Но что это такое?
BuildContext — это интерфейс, определяющий ряд геттеров и методов, которые могут быть реализованы элементом. В основном BuildContext используется в методе build() StatelessWidget или State для StatefulWidget.
- обновляемому виджету (внутри методов build или builder )
- StatefulWidget, связанному со State, в котором вы ссылаетесь на переменную контекста.
Это означает, что большинство разработчиков постоянно работают с элементами, даже не зная об этом.
Насколько полезным может быть BuildContext?
Поскольку BuildContext соответствует элементу, связанному с виджетом, а также местоположению виджета в дереве, то BuildContext может быть полезен, когда надо:
- получить ссылку на объект RenderObject, соответствующий виджету (или, если виджет не является Renderer, то виджету-потомку)
- получить размер RenderObject
- обратиться к дереву. Это используется фактически всеми виджетами, которые обычно реализуют метод of (например, MediaQuery.of(context) , Theme.of(context) …)
Забавы ради
Теперь, когда мы осознали, что BuildContext – это элемент, я хотел бы показать вам другой способ его использования. Ниже совершенно бесполезный код позволяет StatelessWidget обновить себя так, как если бы это был StatefulWidget, но без использования setState() , а с помощью BuildContext.
ПРЕДУПРЕЖДЕНИЕ
Пожалуйста, не используйте этот код!Его единственная задача – продемонстрировать, что StatelessWidget может запрашивать обновление.
Если вам нужно некоторое состояние с виджетом, пожалуйста, используйте StatefulWidget.void main() < runApp(MaterialApp(home: TestPage(),)); >class TestPage extends StatelessWidget < // final because a Widget is immutable (remember?) final bag = ; @override Widget build(BuildContext context) < return Scaffold( appBar: AppBar(title: Text('Stateless ??')), body: Container( child: Center( child: GestureDetector( child: Container( width: 50.0, height: 50.0, color: bag["first"] ? Colors.red : Colors.blue, ), onTap: ()< bag["first"] = !bag["first"]; // // This is the trick // (context as Element).markNeedsBuild(); >), ), ), ); > >Если честно, когда вы вызываете setState() , то в конечном итоге он делает то же самое: _element.markNeedsBuild() .
Заключение
Вы скажете: «Ещё одна длинная статья». Но я подумал, что вам было бы интересно узнать, как построена архитектура Flutter, и решил напомнить, что всё было разработано, чтобы быть эффективным, масштабируемым и открытым для будущих расширений. Кроме того, ключевые понятия, такие как Widget, Element, BuildContext, RenderObject, не всегда очевидны для восприятия. Могу только надеяться, что эта статья была для вас полезной.
Ждите новых новостей уже скоро. А пока позвольте пожелать вам успешного программирования.
PS Всю критику, вопросы и предложения по переводу буду рад услышать в (личных) сообщениях.
PSS Ещё раз ссылка на оригинальную статью Flutter internals от Didier Boelens, так как одной в шапке перевода для такого большого материала мало)- Программирование
- Разработка мобильных приложений
- Dart
- Flutter
Как продвигать свою компанию в сети: обзор сервиса «Яндекс Бизнес»
Яндекс Бизнес — сервис, который помогает находить новых клиентов в интернете. В него входят бесплатные инструменты, с помощью которых можно разместить информацию о своем бизнесе в Яндекс Картах и Поиске, и платная Рекламная подписка, автоматически запускающая онлайн-рекламу. На июль 2022 года рекламу через Яндекс Бизнес запускают более 60 тысяч компаний и предпринимателей.
Для продвижения через Яндекс Бизнес не нужны специальные знания и навыки, сервис запускает рекламу автоматически с помощью умных алгоритмов. Сервис позволяет продвигать бизнес по всему интернету даже в условиях ограниченного бюджета, что особенно актуально для малого и микробизнеса, который обычно не готов к большим вложениям в рекламу.
Информация актуальна на 1 августа 2022 года.
Инструменты Яндекс Бизнеса
Внутри сервиса есть бесплатные и платные возможности продвижения бизнеса.
Бесплатно можно создать профиль компании и сайт. А платно — подключить Рекламную подписку. Разберем инструменты подробнее.
Профиль компании. В нем можно рассказать о своей организации, товарах и услугах, указать адрес и контакты. Профиль компании могут видеть пользователи Яндекс Карт и Яндекс Поиска, когда ищут либо конкретную компанию, либо товар или услугу, например вбивают запрос «где поесть». В профиле пользователи Яндекса могут оставлять отзывы и ставить оценки, на их основе формируется рейтинг компании.


Сайт организации. Он автоматически создается на основе данных из профиля компании и выглядит как витрина товаров и услуг: с названиями, описаниями и фотографиями. Ссылку на сайт можно найти в личном кабинете Яндекс Бизнеса — в разделе «Сайт».
Информацию на сайте получится редактировать: менять цвет фона, загружать дополнительные материалы, например описание акций для клиентов. Также здесь есть функция «Подключить корзину для заказов» — тогда клиенты смогут оформлять покупки, а уведомления о новых заказах будут приходить на почту или в СМС. А еще для сайта можно подключить рекламу, он уже настроен для рекламной кампании.

Рекламная подписка. Это инструмент для автоматического запуска рекламы в интернете. Он сам создает объявления о компании, товарах или услугах и размещает их на площадках Яндекса: в Поиске, Картах и Рекламной сети, которая включает более 40 тысяч сайтов-партнеров.
Алгоритмы сервиса выбирают только те площадки, где находится больше всего потенциальных клиентов бизнеса, которым стоит показать рекламу в первую очередь. Если окажется, что какие-то объявления работают недостаточно эффективно — привлекают мало людей или дорого стоят, — Рекламная подписка перенастроит объявления или отключит их. Деньги будут направлены только на те объявления и площадки, которые приводят больше всего потенциальных клиентов по наименьшей цене. Она будет вести клиентов туда, куда вам удобнее: в профиль компании, на собственный сайт компании, сайт, сгенерированный Яндекс Бизнесом, или в соцсети.
Как добавить компанию в Яндекс Бизнес
Чтобы воспользоваться возможностями сервиса, нужно зарегистрировать компанию. Для этого:
- Создайте профиль компании и подтвердите права.
- Добавьте информацию о ваших товарах или услугах.
- Верифицируйте профиль.
Разберем каждый шаг подробно.
Шаг 1. Создайте профиль компании и подтвердите права. Для начала нужно создать профиль компании, чтобы ваш бизнес появился в Яндекс Поиске и в Яндекс Картах.
Для создания профиля необходимо ввести базовую информацию о вашем бизнесе: название компании, адрес, телефон, график работы, добавить ссылки на соцсети.




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

Шаг 2. Добавьте информацию о ваших товарах или услугах и фотографии. Так пользователю будет проще понять, что ваш бизнес из себя представляет: какой интерьер у салона красоты, как выглядят блюда в ресторане или в каком стиле оформлена гостиница.
- Фотографии должны отражать реальность и давать честное представление о вашем предложении. Если у вас, например, салон красоты, недостаточно показывать только работы мастеров, важно продемонстрировать и общие зоны, и столики для маникюра. А если вы открыли автомастерскую, на фото стоит показать сам процесс ремонта, результат до и после.
- Фотографии должны быть сняты с правильного ракурса и при хорошем освещении — плохое качество контента может отпугнуть пользователей.
- Если у вас офлайн-бизнес, рекомендуем добавить фотографии здания или подъезда, где вы находитесь, чтобы клиенты могли быстрее вас найти.

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

Как работать с профилем компании в Яндекс Бизнесе
Чтобы компании больше доверяли, рекомендуем работать с отзывами и регулярно обновлять профиль.
Работайте с отзывами. Многие пользователи, прежде чем сделать выбор, обращают внимание как на рейтинг, так и на отзывы предыдущих клиентов. Желательно реагировать на отзывы не реже раза в сутки: за хорошие комментарии благодарить, а если оставили плохой отзыв — разобраться в ситуации.
Довольные клиенты реже оставляют отзывы, чем разочарованные. Поэтому не стесняйтесь просить покупателей или посетителей делиться впечатлениями в профиле.
Если клиент недоволен, не оставляйте отзыв без ответа. Советуем разобраться в проблеме, и если претензии конструктивны — попробовать найти решение. Например, в ответе по пунктам расписать, какие именно действия вы собираетесь предпринять, чтобы больше такого не повторилось. Это успокоит недовольного клиента и положительно повлияет на восприятие вашей компании потенциальными покупателями: они будут понимать, что вы дорожите репутацией и вам можно доверять.

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

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

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

Вы попадете на страницу запуска Рекламной подписки с предлагаемым бюджетом:

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

Рекламная подписка предлагает три варианта бюджета, а еще можно выбрать свой вручную, но не меньше и не больше предложенных. Рекомендуемый бюджет рассчитывается для каждого бизнеса индивидуально. В среднем он составляет от 3000 ₽ в месяц и зависит от категории бизнеса, его расположения, количества конкурентов и срока, на который вы оформляете подписку. На выбор — 3, 6 или 12 месяцев. На этом этапе вы также увидите прогноз количества потенциальных клиентов.
Дальше Рекламная подписка все сделает сама. Когда деньги поступят на счет, алгоритмы Рекламной подписки автоматически создадут рекламные объявления и разместят их на тех площадках, где есть ваши потенциальные клиенты.

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

Главное
- Яндекс Бизнес — сервис для предпринимателей, который помогает рассказывать о своем бизнесе в интернете с помощью платных и бесплатных инструментов.
- Бесплатные возможности — это создание профиля компании, который будет виден в Поиске и в Картах. А также готовый сайт от Яндекс Бизнеса, который показывает товары и услуги компании.
- Чтобы создать профиль в Яндекс Бизнесе, нужно рассказать, чем занимается компания, добавить график работы, загрузить фото товаров и услуг, а также подтвердить, что компания ваша.
- Если ваш профиль заполнен на 90% и в нем не менее трех фотографий, вы получите синюю галочку — знак гарантии для пользователей, что вся информация о компании актуальна.
- Чтобы сделать профиль компании полезным для покупателей, регулярно обновляйте его, делитесь новостями и спецпредложениями. А чтобы получить высокий рейтинг в Яндексе, работайте с отзывами, которые клиенты оставляют в профиле.
- Платный инструмент — это Рекламная подписка. Она сама проанализирует аудиторию, создаст объявления и автоматически запустит рекламу вашего бизнеса на тех площадках, где есть ваши потенциальные клиенты. Например, в Яндекс Картах, в Поиске Яндекса и на сайтах партнеров, всего их более 40 000.
- Запустить рекламу с помощью Рекламной подписки можно в личном кабинете в один клик. Рекомендуемый бюджет рассчитывается индивидуально и в среднем начинается от 3000 ₽ в месяц.
- В личном кабинете доступна статистика, где благодаря простым графикам вы будете видеть, сколько клиентов вами заинтересовались: перешли в ваш профиль или на сайт, оставили заявку, построили маршрут и другое.