Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 10776 сообщений
Cообщения с меткой

разработка - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Панель управления databoom. Работа с коллекциями. Часть 2

Вторник, 28 Июня 2016 г. 10:28 (ссылка)

Привет Хабр! Мы продолжаем знакомить разработчиков с сервисом databoom.



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









JSON файлы, используемые в видео, хранятся здесь: github.com/Databoom/pub-src



Подробнее познакомиться с сервисом databoom и БЕСПЛАТНО зарегистрироваться можно на сайте databoom.space

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/304250/

Комментарии (0)КомментироватьВ цитатник или сообщество
ibab

Разработка рекламы футболок реферат

Суббота, 27 Июня 2015 г. 17:53 (ссылка)

Разработка рекламы футболок реферат.


Читать далее
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Обзор новорождённой платформы Scorocode

Понедельник, 27 Июня 2016 г. 15:19 (ссылка)





BaaS-платформы (Backend as a Service) сделали разработку и сопровождение backend'а для мобильных и веб-приложений достаточно простыми и предсказуемыми процессами. Одним из флагманов движения BaaS стала компания Parse, но в 2016 году она заявила о прекращении обслуживания клиентов с 2017 года.



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



Расцвет BaaS



Разработка серверной части — самый трудный и непредсказуемый этап создания приложения. Зачастую, при планировании разработки проекта, недооценивается необходимый объём ресурсов и время создания backend'а.



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



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



Долгое время ИТ-индустрия искала способы упрощения разработки backend'а. Многие компании создавали инструменты, облегчающие работу над частными аспектами разработки, но это только затрудняло процесс: разработчикам приходилось разбираться не только в конкретной СУБД или платформе, но и в дополнительных инструментах.



Всё изменилось в 2011 году, когда компания Parse предложила новый подход к созданию backend'а на основе облачного сервиса. Он позволял решить две основные задачи:




  • Хранение в облаке и свободное манипулирование структурированными данными;

  • Возможность писать серверную бизнес-логику на JavaScript — стабильно популярном языке программирования на протяжении нескольких лет.



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



Идея имела колоссальный успех. В середине 2012 года сервисом пользовалось 20 000 разработчиков, а ежемесячный прирост пользователей составлял 40%. Теперь этап разработки backend'а занимал дни, а не месяцы, и сэкономленные ресурсы можно было направить на разработку и совершенствование frontend'а.



Использование BaaS позволило точнее оценивать сроки разработки и необходимые ресурсы. Сам процесс создания backend'а стал более формализованным, позволяя для разных платформ использовать единую серверную часть, упростилось сопровождение проекта, расходы снизились и стали более прогнозируемы.



Scorocode: начало



Три года назад Facebook приобрёл Parse, и в конце 2015 года социальная сеть решила использовать мощности BaaS монопольно. Все остальные разработчики должны в течение 2016 года мигрировать на другие ресурсы.



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



Scorocode: техника вопроса



Scorocode — горизонтально масштабируемая система, построенная на принципах кластеризации. Кластеры разделяются по типам: API, СУБД, файлы, статистика. Каждый кластер API, работающий с конечными приложениями, выдерживает нагрузку около 25 тысяч запросов в секунду. С ростом нагрузки количество кластеров наращивается.







Немного о платформах и языках, используемых нами в разработке.



Основная СУБД в Scorocode — MongoDB, в качестве in-memory database используется Redis, а сервер очередей работает под управлением RabbitMQ. Высокопроизводительный API написан «с нуля» на Go. Язык был выбран нами после серии экспериментов с Node.js и С++. Google в последнее время очень активно развивает Go, писать на нём комфортно, код получается компактным, а производительность на уровне С++. Множественные микросервисы платформы тоже разработаны на Go.



Scorocode позволяет исполнять два варианта серверного кода:




  • JS-скрипты с бизнес-логикой. Они хранятся и выполняются на наших серверах. Причём выполняются асинхронно — по расписанию или с запуском вручную с клиентов, посредством вызовов через API. Выполнением серверных скриптов занимается движок Google V8.

  • Триггеры на JS, то есть обработчики операций с данными. Они выполняются высокоскоростным движком, написанным на Go. В данном случае мы отказались от V8, потому что он достаточно долго стартует, а у каждого обработчика есть всего лишь 500 миллисекунд для выполнения кода.



Чем мы отличаемся от конкурентов?




  • Scorocode состоит только из самописных и open source-компонентов. Исключена ситуация, когда в какой-то из компонентов сторонними разработчиками вносятся изменения, с которыми нам придётся мириться. Нам известно устройство и алгоритмы работы каждого элемента системы, поэтому исправление ошибок и реализация новых функций могут выполняться в кратчайшие сроки.

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

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

  • Все серверы и данные находятся на территории РФ. Это позволяет нашим клиентам соблюдать требования законодательства.



Финансовый вопрос



На данный момент у нас действует три тарифных плана:




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

  • Базовый “Indie”. По умолчанию предоставляется в 1,5-2 раза больше возможностей, чем на бесплатном тарифном плане. Этого уже достаточно для небольших студий и команд разработчиков. Можно расширять возможности тарифного плана, приобретая в Marketplace дополнительные опции.

  • Корпоративный “Enterprise”. Индивидуальные условия для корпоративных клиентов, отсутствие ограничений, выделенные кластеры, космическая техническая поддержка, и т.д.



С платформой Scorocode можно дополнительно сократить затраты на обслуживание приложений:




  • Всем новым разработчикам мы зачисляем при регистрации на счёт платформы по 3000 рублей. Этого достаточно для оплаты одного месяца тарифного плана Indie.

  • Всем новым студиям разработки и digital-агентствам после подтверждения мы зачисляем на счёт платформы 10 000 рублей. Их можно потратить по своему усмотрению — либо взять Indie на три месяца, либо докупить в Marketplace дополнительные опции.



Развитие



У нас оптимистичные планы по развитию Scorocode на четыре года вперёд. Инвестиции и поддержку нам оказывает группа компаний PROF-IT GROUP, которая в 2015 году вошла в рейтинг самых быстрорастущих IT-компаний по версии Cnews.



Ближайшие планы развития:




  • Интеграция с партнёрскими облачными сервисами для расширения методов обработки данных, хранящихся в Scorocode;

  • Фабрика интеллектуальных чат-ботов;

  • Поддержка полного цикла разработки — от backend до frontend.



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



Приглашаем поделиться в комментариях своими пожеланиями и впечатлениями от использования Scorocode.



Мы будем регулярно вести блог с циклом статей про Scorocode: примеры его использования, наш опыт разработки платформы и особенности разработки приложений в целом. Будем рады видеть вас в подписчиках.
Original source: habrahabr.ru.

https://habrahabr.ru/post/303954/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Прогрессивное упрощение

Понедельник, 27 Июня 2016 г. 13:02 (ссылка)

Статья была опубликована на LayerVault и была переведенна специально для Хабрахабр.



Идея упрощения



image



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



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







«Провести за ручку»



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



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



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



Применение на практике



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



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



image



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



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



Угасание опыта



Помимо концепции упрощения, не менее важным является так называемое «угасание опыта» (Experience Decay). Суть в том, что возвращаясь к интерфейсу, которым мы давно не пользовались, нам сложно сразу начать пользоваться им также оперативно, как раньше. Это связано с тем, что со временем наш пользовательский опыт забывается.



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



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



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



Пространство для роста



Чаще всего реализация идеи прогрессивного упрощения встречается в видеоиграх или социальных сетях, и реже – в более серьёзных приложениях.



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

Original source: habrahabr.ru.

https://habrahabr.ru/post/304192/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Важные аспекты работы браузера для разработчиков

Воскресенье, 26 Июня 2016 г. 17:00 (ссылка)



Автор: Антон Реймер



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



Что такое браузер?




Браузер — программа, работающая в операционной системе. Большинство браузеров написано на языке C++. Основное предназначение браузера — воспроизводить контент с веб-ресурсов. В качестве веб-ресурса в большинстве случаев выступает html-страница. Это также может быть pdf-файл, png, jpeg, xml-файлы и другие типы. Среди огромного количества браузеров можно выделить самые популярные: Chrome, Safari, Firefox, Opera и Internet Explorer. Мы рассмотрим браузеры с открытым исходным кодом: Chrome, Firefox, Safari.



Из чего состоит и как работает браузер?






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



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



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



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



Когда мы говорим о браузерных движках, таких как Webkit или Gecko (первый находится «под капотом» у Safari и до 2013 года был у Chrome, второй у Firefox), в первую очередь имеем в виду модуль отображения. Далее мы подробно рассмотрим модуль отображения и более детально разберем, как он работает.



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



Модуль JS Interpreter отвечает за интерпретацию скрипта, и его выполнение. Существует несколько JS-движков. Самые известные это V8 и JavaScriptCore. Важно не путать движок браузера и JS-движок, который работает в модуле JS Interpreter.



Следующий модуль — исполнительная часть пользовательского интерфейса (UI backend). Она отвечает за отрисовку всего на экране и работу пользовательского интерфейса.



Последний модуль — хранилище данных. Браузеру нужно где-то хранить данные, обычно для этого используется оперативная память. Какие данные нужно хранить? Например, кэш, собственные настройки. Также к хранилищу данных можно отнести indexedDB, который появился в стандарте html5 — собственные базы данных браузера.



Модуль отображения






Модуль отображения получает данные от сетевого модуля. Данные поступают пакетами по 8 Кб. Что важно — модуль отображения не ждет, пока придут все данные, он начинает обрабатывать и выводить их на экран по мере поступления. В случае с html-страницами, он начинает их анализировать, происходит парсинг html (это отдельная большая тема, я на ней останавливаться не буду). Главное, что нужно понимать: в результате парсинга у нас появляется DOM-дерево. Также по окончании парсинга срабатывает событие load, которое можно обрабатывать в скрипте. Это значит, что документ готов и скрипт может с ним работать.



DOM-дерево — document object model. По большому счету, «интерфейс», который предоставляет браузер JS-движку для работы с тем или иным html-документом. На основе DOM-дерева происходит конструирование дерева отображения (render tree). Дерево отображения — тоже важная часть модуля отображения. По большому счету, два этих дерева — DOM-дерево и дерево отображения — наиболее важные элементы для разработчика. Дерево отображения во многом повторяет структуру DOM-дерева (далее будет пример, где это будет представлено нагляднее), но имеет некоторые отличия:




  1. Дерево отображения не содержит скрытых элементов. Если у нас есть html-элемент, у которого прописан display:none, в дереве отображения он присутствовать не будет. При этом, если visibility:hidden, то в дереве отображения он будет. Некоторые DOM-узлы, которые в DOM-дереве представлены как единый узел, в дереве отображения могут быть представлены в виде нескольких. Яркий пример — составной тэг select. Если в DOM-дереве это один узел, в дереве отображение он преобразовывается в минимум три узла. Первый узел отвечает за отображение выбранного элемента. Второй — за выпадающий список с возможными пунктами. И, наконец, третий блок отвечает за стрелочку.

  2. Текст в DOM-дереве представлен как простая node. DOM-дереву нет никакого дела до того, что там написано, сколько строк этот текст занимает. В то время, как для дерева отображения — это важно, и текст трансформируется в несколько узлов, в зависимости от того сколько строк он занимает. Это нагляднее рассмотрим чуть позже.





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



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



Предлагаю рассмотреть два браузерных движка: Webkit и Gecko.





Webkit. Модуль отображения получает html и стили. В результате парсинга html возникает DOM-дерево. В результате парсинга CSS возникает дерево правил таблиц стилей (Style Rules). Далее идет важный этап, который называется Attachment, можно перевести, как «совмещение». На этом этапе CSS-стили накладываются на DOM-дерево, в результате чего появляется Render Tree. После чего происходит компоновка дерева. Называется она здесь Layout. И в завершении происходит отрисовка (Painting).





Если посмотреть на Gecko, можно заметить, что схемы очень похожи. Главные отличия — в терминологии. Здесь тоже парсятся HTML, CSS. В результате чего создается DOM-дерево, которое здесь называется Content Model. Парсятся стили, образуется дерево стилей. Этап Attachment здесь называется Frame Constructor, но, по сути, это тоже самое. В результате совмещения образуется дерево отображения, здесь оно называется Frame Tree. Компоновка здесь называется Reflow. А отрисовка называется Painting, так же, как и в Webkit.



Для простоты приравняем некоторые термины:


  • Attachment = Frame constructor = Совмещение

  • Render Tree = Frame Tree = Дерево отображения

  • Layout= Reflow = Компоновка





Пример








Здесь у нас есть теги:
, 

, есть

и ещё один
”…”/>








Модуль отображения строит DOM-дерево. В данном случае оно будет выглядеть следующим образом. Есть корневой элемент (он всегда присутствует), называется он documentElement и соответствует тегу html. В этом дереве присутствуют все теги. И заметим, что текст представлен, как [text node]. И DOM-дереву больше ничего о тексте знать не нужно. На основе этого DOM-дерева строится Render Tree.



Пример








Дерево отображения. У него также есть корневой элемент (RenderView), но уже можно увидеть отличия между DOM-деревом и деревом отображения. Во-первых, нет тега head, т. к. он не отображается на экране. Нет
, есть только

”…”/>



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



Пример








Каждый прямоугольник имеет своего «родителя», кроме корневого элемента root.



Модуль отображения также занимается обработкой скриптов.



Порядок обработки скриптов и таблиц стилей




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
















...









Скрипт 1. Первое, что нужно знать про скрипты, — когда при парсинге html анализатор встречает скрипт, он останавливает дальнейший парсинг документа. Т. е., как только анализатор дошел до скрипта 1, браузеру ничего неизвестно о том, что будет дальше. И пока скрипт 1 не выполнится, дальнейший анализ документа происходить не будет.



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



При этом скрипт 3 все равно не будет выполняться, пока не выполнится скрипт 1. К моменту, когда скрипт 1 уже выполнится, скрипт 3 уже может быть полностью загружен. Скрипты можно вставлять в теги head и body. Разница в том, что в скрипте 2, в отличии от скрипта 1, практически весь документ уже будет проанализирован.

У скрипта могут быть атрибуты, такие как deffer и async. Они похожи, но у них есть отличия:




  • Атрибут deffer сообщает браузеру, чтобы тот не ждал окончания выполнения скрипта, а продолжал парсинг html-страницы. При этом скрипт 4 выполнится только после того, как весь html-документ будет проанализирован и построено DOM-дерево.

  • Атрибут async тоже говорит браузеру, что дальнейший html-документ может быть проанализирован, пока скрипт выполняется. Но при этом он выполняется в параллельном потоке, т. е. он на самом деле выполняется асинхронно. Это означает, что он может быть выполнен раньше, чем скрипт1. Если в скрипте 1 у нас 1000 строк, а в скрипте 5 – 10, скрипт 5 вероятно будет выполнен раньше. Т. е. порядок подключения в этом случае не соблюдается.





В случае с defer скрипт 4 всегда выполняется после скрипта 1. С атрибутом async неизвестно, когда он будет выполнен и какая часть документа уже будет проанализирована к этому моменту.



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



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



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



Компоновка окон








Окно = Прямоугольник = Узел дерева отображения



Способ компоновки окна определяется следующими факторами:


  • Тип окна (свойство display).

  • Схема позиционирования (свойства position и float).

  • Размеры окна.

  • Внешняя информация (размеры изображения, размер экрана).





Компоновка окон — это этап компоновки дерева отображения. Я думаю многим верстальщикам знакома эта схема, она называется “Box model”. Я не буду подробно на ней останавливаться.



При компоновке окон учитываются следующее факторы:



CSS-свойство display. Два основных типа — inline и block. Другие, такие как inline-block table и прочие, появились уже позже. Отличие в том, что display:block, указывает, что ширина прямоугольника будет вычисляться в зависимости от ширины «родителя». А display:inline указывает, что ширина прямоугольника будет вычисляться в зависимости от его содержимого. Если в элементе два слова, ширина прямоугольника будет равна ширине, необходимой для вывода этих слов. Inline-элементы выстраиваются друг за другом. А блочные элементы — друг под другом.



Следующее, что влияет на компоновку элемента, — свойства position и float. Position по умолчанию static, при этом прямоугольник идет в стандартном потоке компоновки. Также есть position:relative и position:absolute. Position:relative указывает, что прямоугольнику выделяется место в стандартном потоке компоновки. При этом позиция элемента может быть сдвинута относительно этого места: влево, вправо, вверх, вниз с помощью соответствующего свойства.



Абсолютное позиционирование, к которому относится position:absolute и position:fixed, указывает, что элемент выходит за пределы своего прямоугольника из общего потока компоновки. Остальные прямоугольники его не учитывают. Он также не учитывает соседние элементы. Координаты его вычисляются относительно корневого элемента страницы, либо относительно предка, у которого position не static. Размеры же вычисляются тоже относительно родителя. Также на позиционирование влияет свойство float. Оно указывает, что наш прямоугольник идет в стандартном потоке, но при этом занимает либо крайнюю левую, либо крайнюю правую позиции. При этом все остальные прямоугольники «обтекают» этот элемент.



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



В Firefox модуль отображения работает в одном потоке. Он един на весь браузер. В Chrome все немного иначе: модуль отображения и поток выполнения у каждой вкладки свои.



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



В следующей части мы детально рассмотрим события reflow и repaint и попытаемся понять как грамотная работа с ними может повысить скорость работы приложения.
Original source: habrahabr.ru.

https://habrahabr.ru/post/304138/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Onem

Украинское «чудо-оружие»

Пятница, 24 Июня 2016 г. 21:29 (ссылка)
infopolk.ru/1/U/articles/79...00fc74687c


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

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Инлайн ассемблер в PowerShell

Пятница, 24 Июня 2016 г. 12:09 (ссылка)

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



Те, кто не первый год на «ты» с C#, знают о чем пойдет далее речь: все верно — представление ассемблерных инструкций в виде массива байтов. Единственное, что может показаться невероятным во всей это истории, как этот массив удалось преобразовать в функцию. Полагаю, кто уже догадался, будет ворчать, мол, снова обобщенные делегаты. А ведь когда я о них только упомянал, многие скептически отнеслись ко всему этому, ибо самую соль, а именно отсутсвие необходимости генерирования динамической сборки при использовании таковых делегатов, мало кто уловил.



Итак, концепт представляет собой получение вендора CPU.



Набор байтов для x86 архитектуры будет выглядеть так:



[Byte[]]$x86 = @(
0x55, #push ebp
0x8B, 0xEC, #mov ebp, esp
0x53, #push ebx
0x57, #push edi
0x8B, 0x45, 0x08, #mov eax, dword ptr[ebp+8]
0x0F, 0xA2, #cpuid
0x8B, 0x7D, 0x0C, #mov edi, dword ptr[ebp+12]
0x89, 0x07, #mov dword ptr[edi+0], eax
0x89, 0x5F, 0x04, #mov dword ptr[edi+4], ebx
0x89, 0x4F, 0x08, #mov dword ptr[edi+8], ecx
0x89, 0x57, 0x0C, #mov dword ptr[edi+12], edx
0x5F, #pop edi
0x5B, #pop ebx
0x8B, 0xE5, #mov esp, ebp
0x5D, #pop ebp
0xC3 #ret
)


Для x64:



[Byte[]]$x64 = @(
0x53, #push rbx
0x49, 0x89, 0xD0, #mov r8, rdx
0x89, 0xC8, #mov eax, ecx
0x0F, 0xA2, #cpuid
0x41, 0x89, 0x40, 0x00, #mov dword ptr[r8+0], eax
0x41, 0x89, 0x58, 0x04, #mov dword ptr[r8+4], ebx
0x41, 0x89, 0x48, 0x08, #mov dword ptr[r8+8], ecx
0x41, 0x89, 0x50, 0x0C, #mov dword ptr[r8+12], edx
0x5B, #pop rbx
0xC3 #ret
)


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



#в этой сборке можно разжиться VirtualAlloc и VirtualFree
Add-Type -AssemblyName System.ServiceModel
#извлекаем нужные нам функции и заносим их в одноименные переменные
([AppDomain]::CurrentDomain.GetAssemblies() |
Where-Object {
$_.ManifestModule.ScopeName.Equals(
'System.ServiceModel.dll'
)
}).GetType(
'System.ServiceModel.Channels.UnsafeNativeMethods'
).GetMethods([Reflection.BindingFlags]40) |
Where-Object {
$_.Name -cmatch '\AVirtual(Alloc|Free)'
} | ForEach-Object { Set-Variable $_.Name $_ }
#какой блок нужно запихнуть
[Byte[]]$bytes = switch ([IntPtr]::Size) {
4 { $x86 }
8 { $x64 }
}

try {
#выделяем память равной размеру массива байтов
$ptr = $VirtualAlloc.Invoke($null, @(
[IntPtr]::Zero, [UIntPtr](New-Object UIntPtr($bytes.Length)),
[UInt32](0x1000 -bor 0x2000), [UInt32]0x40
))
#запихиваем данные в указатель
[Marshal]::Copy($bytes, 0, $ptr, $bytes.Length)
...


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



  ...
$proto = [Action[Int32, [Byte[]]]]
$method = $proto.GetMethod('Invoke')

$returntype = $method.ReturnType
$paramtypes = $method.GetParameters() |
Select-Object -ExpandProperty ParameterType

$holder = New-Object Reflection.Emit.DynamicMethod(
'Invoke', $returntype, $paramtypes, $proto
)
$il = $holder.GetILGenerator()
0..($paramtypes.Length - 1) | ForEach-Object {
$il.Emit([OpCodes]::Ldarg, $_)
}

switch ([IntPtr]::Size) {
4 { $il.Emit([OpCodes]::Ldc_I4, $ptr.ToInt32()) }
8 { $il.Emit([OpCodes]::Ldc_I8, $ptr.ToInt64()) }
}
$il.EmitCalli(
[OpCodes]::Calli, [CallingConvention]::Cdecl, $returntype, $paramtypes
)
$il.Emit([OpCodes]::Ret)

$cpuid = $holder.CreateDelegate($proto)
...


Остается только прочитать вендора и освободить указатель.



  ...
[Byte[]]$buf = New-Object Byte[] 16
$gch = [GCHandle]::Alloc($buf, 'Pinned')
$cpuid.Invoke(0, $buf)
$gch.Free()

"$(-join [Char[]]$buf[4..7])$(
-join [Char[]]$buf[12..15]
)$(-join [Char[]]$buf[8..11])"
}
catch { $_.Exception }
finally {
if ($ptr) {
[void]$VirtualFree.Invoke($null, @($ptr, [UIntPtr]::Zero, [UInt32]0x8000))
}
}


В моем случае будет возвращена строка AuthenticAMD.



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



Код полностью
function Get-CPUVendor {
begin {
@(
[Runtime.InteropServices.CallingConvention],
[Runtime.InteropServices.GCHandle],
[Runtime.InteropServices.Marshal],
[Reflection.Emit.OpCodes]
) | ForEach-Object {
$keys = ($ta = [PSObject].Assembly.GetType(
'System.Management.Automation.TypeAccelerators'
))::Get.Keys
$collect = @()
}{
if ($keys -notcontains $_.Name) {
$ta::Add($_.Name, $_)
$collect += $_.Name
}
}

Add-Type -AssemblyName System.ServiceModel

([AppDomain]::CurrentDomain.GetAssemblies() |
Where-Object {
$_.ManifestModule.ScopeName.Equals(
'System.ServiceModel.dll'
)
}).GetType(
'System.ServiceModel.Channels.UnsafeNativeMethods'
).GetMethods([Reflection.BindingFlags]40) |
Where-Object {
$_.Name -cmatch '\AVirtual(Alloc|Free)'
} | ForEach-Object { Set-Variable $_.Name $_ }

[Byte[]]$x86 = @(
0x55, #push ebp
0x8B, 0xEC, #mov ebp, esp
0x53, #push ebx
0x57, #push edi
0x8B, 0x45, 0x08, #mov eax, dword ptr[ebp+8]
0x0F, 0xA2, #cpuid
0x8B, 0x7D, 0x0C, #mov edi, dword ptr[ebp+12]
0x89, 0x07, #mov dword ptr[edi+0], eax
0x89, 0x5F, 0x04, #mov dword ptr[edi+4], ebx
0x89, 0x4F, 0x08, #mov dword ptr[edi+8], ecx
0x89, 0x57, 0x0C, #mov dword ptr[edi+12], edx
0x5F, #pop edi
0x5B, #pop ebx
0x8B, 0xE5, #mov esp, ebp
0x5D, #pop ebp
0xC3 #ret
)

[Byte[]]$x64 = @(
0x53, #push rbx
0x49, 0x89, 0xD0, #mov r8, rdx
0x89, 0xC8, #mov eax, ecx
0x0F, 0xA2, #cpuid
0x41, 0x89, 0x40, 0x00, #mov dword ptr[r8+0], eax
0x41, 0x89, 0x58, 0x04, #mov dword ptr[r8+4], ebx
0x41, 0x89, 0x48, 0x08, #mov dword ptr[r8+8], ecx
0x41, 0x89, 0x50, 0x0C, #mov dword ptr[r8+12], edx
0x5B, #pop rbx
0xC3 #ret
)

[Byte[]]$bytes = switch ([IntPtr]::Size) {
4 { $x86 }
8 { $x64 }
}
}
process {
try {
$ptr = $VirtualAlloc.Invoke($null, @(
[IntPtr]::Zero, [UIntPtr](New-Object UIntPtr($bytes.Length)),
[UInt32](0x1000 -bor 0x2000), [UInt32]0x40
))

[Marshal]::Copy($bytes, 0, $ptr, $bytes.Length)

$proto = [Action[Int32, [Byte[]]]]
$method = $proto.GetMethod('Invoke')

$returntype = $method.ReturnType
$paramtypes = $method.GetParameters() |
Select-Object -ExpandProperty ParameterType

$holder = New-Object Reflection.Emit.DynamicMethod(
'Invoke', $returntype, $paramtypes, $proto
)
$il = $holder.GetILGenerator()
0..($paramtypes.Length - 1) | ForEach-Object {
$il.Emit([OpCodes]::Ldarg, $_)
}

switch ([IntPtr]::Size) {
4 { $il.Emit([OpCodes]::Ldc_I4, $ptr.ToInt32()) }
8 { $il.Emit([OpCodes]::Ldc_I8, $ptr.ToInt64()) }
}
$il.EmitCalli(
[OpCodes]::Calli, [CallingConvention]::Cdecl, $returntype, $paramtypes
)
$il.Emit([OpCodes]::Ret)

$cpuid = $holder.CreateDelegate($proto)

[Byte[]]$buf = New-Object Byte[] 16
$gch = [GCHandle]::Alloc($buf, 'Pinned')
$cpuid.Invoke(0, $buf)
$gch.Free()

"$(-join [Char[]]$buf[4..7])$(
-join [Char[]]$buf[12..15]
)$(-join [Char[]]$buf[8..11])"
}
catch { $_.Exception }
finally {
if ($ptr) {
[void]$VirtualFree.Invoke($null, @($ptr, [UIntPtr]::Zero, [UInt32]0x8000))
}
}
}
end {
$collect | ForEach-Object { [void]$ta::Remove($_) }
}
}



Original source: habrahabr.ru.

https://habrahabr.ru/post/304010/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Запускаем Yocto Linux на виртуальной машине

Четверг, 23 Июня 2016 г. 17:21 (ссылка)

В процессе разработки, например, для Intel Edison или Galileo, может случиться так, что нужного для экспериментов устройства под рукой не оказалось. Похожее происходит и тогда, когда «железо» есть, но установленная на нём ОС не поддерживает всех необходимых для проекта возможностей. Что делать?





Один из вариантов решения этой проблемы – запуск целевой операционной системы на виртуальной машине. На ней можно компилировать, развёртывать и тестировать программы. Сегодня поговорим о том, как создавать образы Yocto Linux, подходящие для запуска в виртуальных средах, например, в простом программном эмуляторе QEMU. Кроме того, подобные образы можно использовать в системах с гипервизорами, скажем, в Microsoft Hyper-V на Windows.



Предварительные требования



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




  • ОС Debian/Ubuntu (протестировано на Debian 8.2. amd64).

  • Подключение к интернету.

  • Как минимум 100 Гб свободного пространства на жёстком диске.



Подготовка компьютера



В качестве root-пользователя (или с использованием «sudo») выполните на компьютере следующую команду:



# apt-get install wget git-core unzip make gcc g++ build-essential subversion sed autoconf automake texi2html texinfo coreutils diffstat python-pysqlite2 docbook-utils libsdl1.2-dev libxml-parser-perl libgl1-mesa-dev libglu1-mesa-dev xsltproc desktop-file-utils chrpath groff libtool xterm gawk fop


Примечание №1. Успешность выполнения этой команды зависит от версии Ubuntu/Debian, которой вы пользуетесь. Однако, вы вполне можете, для того, чтобы разрешить зависимости пакетов, воспользоваться «aptitude» и выполнить принудительную установку подходящих версий необходимых пакетов (например, такой командой: «aptitude install libsdl1.2-dev»).



Примечание №2. Для других дистрибутивов Linux, таких, как RedHat, CentOS, Fedora, SuSe, Gentoo, и так далее, мы бы посоветовали поискать подходящие версии вышеупомянутых пакетов с использованием соответствующего менеджера пакетов (например, zypper или yum).



Шаг первый. Настройка рабочей директории



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



# cd
# mkdir yocto-2.0
# cd yocto-2.0
# wget http://downloads.yoctoproject.org/releases/yocto/yocto-2.0/poky-jethro-14.0.0.tar.bz2
# tar xvjf poky-jethro-14.0.0.tar.bz2
# cd poky-jethro-14.0.0/


Примечание №3. Здесь можно выбрать другую ветку релизов Yocto. В этом руководстве мы пользуемся Yocto Poky 2.0.14.0.0 (Jethro).



Примечание №4. Если вы хотите загрузить самый свежий релиз исходных кодов Yocto, можете обратиться к ветке master. При этом понадобится поменять пару команд из вышеприведённого листинга на следующие:



# git clone git://git.yoctoproject.org/poky.git
# cd poky


Примечание №5. Нужную ветку можно выбрать, используя её кодовое имя. Например, так:



# git clone -b jethro git://git.yoctoproject.org/poky.git


Шаг второй. Настройка переменных окружения



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



# . ./oe-init-build-env


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



/home//yocto-2.0/poky-jethro-14.0.0/build/.


Шаг третий. Настройка BitBake



После исполнения скрипта из предыдущего шага был создан файл conf/local.conf.



Этот конфигурационный файл нужен для настройки BitBake, системы сборки Yocto (это центральный компонент Yocto Project).



Отредактируйте конфигурационный файл BitBake в любом текстовом редакторе, которым пользуетесь. Мы редактировали его в редакторе nano. Это – простой консольный текстовый редактор для Unix-сред. Запускается он так:



# cd conf/
# nano local.conf


В конфигурационном файле раскомментируйте следующие строки:



DL_DIR ?= "${TOPDIR}/downloads"
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
TMPDIR ?= "${TOPDIR}/tmp"
SDKMACHINE ?= "i686"


Советуем собирать образы, включая в них все доступные дополнительные возможности. Хотя в результате файлы образов получаются немаленькими (около 8 Гб каждый), они включают в себя всё, что только можно, и, как результат, подходят для любых задач разработки.



EXTRA_IMAGE_FEATURES = "dbg-pkgs dev-pkgs ptest-pkgs tools-sdk tools-debug eclipse-debug tools-profile tools-testapps debug-tweaks"


Сохраните изменения в файле local.conf. В нашем случае это делается с помощью комбинации клавиш Ctrl+X. Теперь выполните следующие команды:



# cd ..
# hob


В ответ на них должен запуститься Hob (графический интерфейс для BitBake, основанный на GTK-2). Он приступит к проверке правильности настройки системы сборки.





Проверка настройки системы сборки



После проверки выберите из выпадающего меню, в качестве целевой системы, qemux86.





Выбор целевой системы



Подождите, пока Hob завершит разбор рецептов BitBake и сгенерирует дерево зависимостей. Затем выберите рецепт для целевого образа из соответствующего выпадающего списка. В нашем случае выбран полный образ без графического интерфейса: core-image-full-cmdline.





Выбор рецепта для сборки образа



После этого щёлкните по кнопке «Advanced configuration».





Переход к расширенным настройкам



На вкладке «Image types», в меню «Distro», выберите «poky», если хотите собрать самый свежий стабильный релиз. Затем, в списке «Image types», выберите желаемый формат образа. Обычно имеет смысл выбирать здесь «.iso», «.vdi» и «.vmdk». Образы в таких форматах наиболее удобны для практического использования.





Выбор формата образа



На вкладке «Output» задайте настройки, соответствующие вашим потребностям. Советуем добавить в образ как минимум 4 Гб свободного пространства для включения SDK для архитектуры i686 (если вы экспериментируете с платой Edison). Кроме того, было обнаружено, что весьма полезно устанавливать «deb» в качестве формата корневой файловой системы. В итоге мы пришли к следующим настройкам.





Настройка образа



Теперь можете сохранить выполненные настройки, нажав на кнопку «Save», и, в основном окне, нажать на кнопку «Build Image» для запуска процесса сборки образа.





Запуск сборки



Hob запустит экземпляр bitbake core-image-full-cmdline с заданными настройками.





Сборка



Примечание №6. Процесс сборки может занять очень много времени. Но, в зависимости от возможностей вашего компьютера, вы можете изменить число потоков, использующихся при сборке, настраивая параметры «BitBake parallel threads» и «Make parallel threads» в окне настроек Hob.





Настройка количества потоков, использующихся при сборке



Примечание №7. И, наконец, при использовании Hob, у вас есть возможность выбрать, какие пакеты вы хотите включить в образ, который планируете собрать. Для того, чтобы это сделать, перед началом сборки образов, нажмите на кнопку «Edit image recipe».





Переход к настройке состава пакетов, включаемых в образ



В появившемся окне выберите пакеты, которые хотите добавить в образ.





Выбор пакетов



Когда процесс сборки образов завершится, вы можете тут же их опробовать! Для этого нажмите на кнопку «Run image». Hob запустит QEMU с только что собранным образом qemux86.





Образ собран и готов к запуску



В самом начале запуска система попросит задать пароль суперпользователя.





Ввод пароля



Запустится ещё одно окно командной строки UNIX. В нём можно наблюдать за индикатором загрузки на фоне логотипа Yocto Project.





Загрузка



После загрузки вы можете войти в учётную запись root только что созданного образа Yocto. Помните о том, что, добавив параметр отладки (debug-tweak) в переменную EXTRA_IMAGE_FEATURES в файле conf/local.conf, вы сможете входить в систему как root-пользователь без пароля. В противном случае нужно будет задать пароль для root-пользователя в рецепте BitBake перед сборкой образа.





Вход в систему



Теперь всё готово для того, чтобы приступить к экспериментам с виртуальной машиной QEMU, на которой работает Yocto Linux.



Примечание №8. После сборки образа Yocto по методике, представленной выше, на диске будет занято 89,8 Гб.





Размер данных, сгенерированных при сборке образов



Итоги



Образы Yocto Linux, сгенерированные при сборке, можно найти по адресу «~/yocto-2.0/poky-jethro-14.0.0/build/tmp/deploy/images/qemux86/*». Здесь, в зависимости от настроек, могут быть файлы в различных форматах. Например, файлы .iso, .vmdk, .vdi.



Теперь вы можете запускать полученные образы, используя эмулятор или гипервизор, которым обычно пользуетесь. Среди них – Microsoft Hyper-V, VMware Fusion, VirtualBox и другие. Удачных экспериментов!
Original source: habrahabr.ru.

https://habrahabr.ru/post/303960/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Как стать профессиональным веб-разработчиком: практическое руководство

Среда, 23 Июня 2016 г. 01:46 (ссылка)



Дорога длинна и трудна, но интересна и полезна!



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



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



Что нужно помнить:



1. Статью разрешается пролистывать



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



Начните с начала, и продолжайте, пока не дойдёте до конца; и там уже остановитесь.



2. Попробуйте всего понемногу, а затем выбирайте специализацию.



Деньги – не самое важное. Вам необходимо ЛЮБИТЬ ваше занятие! Но вы не узнаете, что вам нравится, пока не попробуете.





Найдите свою страсть, а потом монетизируйте её



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



Я решил писать код. Мне нравится веб. Я не знаю, с чего начать





У вас всё получится!



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



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



Изучите основы HTML



Язык разметки гипертекста, Hypertext Markup Language (HTML), контролирует содержимое и разметку того, что вы видите в браузере. Начав с него, вы получаете интерфейс пользователя, с которым можно взаимодействовать, и видите результаты работы своего кода. При изучении более сложных языков его важность будет возрастать. Вам ведь не нужно кодить вслепую.



Вот, что вам нужно изучить на тему HTML:





Я уже знаю основы HTML



Круто! Это очень важный шаг. Теперь изучите основы JavaScript.



Изучите основы JavaScript



JavaScript – язык веба, и все основные браузеры (Chrome, Firefox, Safari, IE, множество других) поддерживают его. Каждый сайт, каждое веб-приложение, которым вы пользовались, скорее всего, содержит огромное количество JS-кода. Не говоря уже о том, что язык набирает популяность и на других платформах – сервера, настольные компьютеры, другие устройства.



Пока вам нужны основы, и для этого подойдут следующие ресурсы:





Я знаю основы JavaScript и HTML



Потрясающе! Теперь добавим к вашим навыкам CSS



Изучите CSS



CSS, или Cascading Style Sheets (каскадные таблицы стилей). Используются для настройки внешнего вида элементов HTML на странице. Ознакомьтесь с бесплатным обучающим материалом от Mozilla, а затем обращайтесь к ресурсу CSS-Tricks для решения самых сложных проблем (справа вверху есть поиск).



Переходим к бэкенду



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



Языков для бэкенда масса, но поскольку вы знакомы с JavaScript, я порекомендую изучить использование Node.js. Он позволяет запускать JS-код на сервере, а не в браузере.



В дополнение к этому вам необходимо изучить Express и MongoDB.



Express


Это библиотека, с помощью которой Node.JS может работать веб-сервером (слушать запросы от страниц и отправлять им ответы).



MongoDB


Это база данных, позволяющая вам хранить и извлекать информацию.



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



Мне нужно выбрать между «фронтенд», «бэкенд» и разработкой полного цикла



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









К этому моменту вы писали два типа кода. Один предназначен для взаимодействия с пользователем, другой – с данными. Что вы предпочитаете?



Взаимодействие с пользователем? Поздравляю, вы фронтенд-разработчик!



Взаимодействие с данными? Поздравляю, вы бэкенд-разработчик!



Оба? Поздравляю, вы разработчик полного цикла!



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



Я хочу быть разработчиком полного цикла



Круто. Вам нужно ознакомиться со всем содержимым разделов «Я хочу быть бэкенд-разработчиком» и «Я хочу быть фронтенд-разработчиком».



Я хочу быть фронтенд-разработчиком и я знаю основы JavaScript, HTML и CSS



Для эффективной работы фронтенд-разработчиком вам необходимо в совершенстве овладеть HTML, CSS и клиентским JavaScript. Также вам нужно будет хорошо разобраться в нескольких важных фреймворках. Вы приобретёте навыки, которые работодатели и клиенты ожидают найти в разработчиках фронтенда.



К этому моменту вы уже должны знать основы HTML. В противном случае вернитесь к разделу «Изучите основы HTML».



Изучите промежуточный и продвинутый HTML


Ознакомьтесь с обучающим материалом по промежуточному HTML, а затем – по продвинутому.



Изучите продвинутый клиентский JavaScript




Отличная серия книг по JS, при этом бесплатная



Для поднятия вашего уровня владения JavaScript, я рекомендую серию книг «You Don’t Know JS» за авторством Кайла Симпсона. Автор выложил всю серию в онлайн совершенно бесплатно:





Кроме того, вашим лучшим другом должен стать и MDN JavaScript.



[Также совершенно бесплатно вам доступен превосходный перевод отличной книги "Выразительный JavaScript" — прим.перев.]



Знать «троицу фронтенда», HTML, CSS и JavaScript – это, конечно, здорово. Но для зарабатывания денег придётся вам познакомиться с некоторыми фреймворками.



Изучите jQuery


Это самая популярная библиотека JS всех времён. Хотя из-за некоторых новых фреймворков важность jQuery чуть поуменьшилась, если вы ищете работу, велика вероятность, что jQuery будет присутствовать в описании необходимых навыков (и упоминаться на собеседовании) ещё много лет.



Рекомендую изучить jQuery при помощи материалов FreeCodeCamp – это быстрый и эффективный метод. После этого отправляйтесь на официальный обучающий сайт – там вы найдёте дополнительные инструкции.



Также вам понадобится держать под рукой документацию по jQuery API.



Изучите популярный JS-фреймворк


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



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



Во время написания этой статьи следующие фреймворки пользовались популярностью:







React JS


React создали разработчики Facebook для работы с их архитектурой Flux. Это JS-библиотека для создания интерфейсов. Не так давно она вырвалась на первое место по популярности, перегнав Angular. Начинайте с React. Здесь можно найти хороший бесплатный курс для начинающих.



Angular 1 и 2


Angular JS создали разработчики Google, и он быстро набрал популярность. Многие компании сильно вложились в него, и, судя по графику выше, он всё ещё популярен. К сожалению, в Google приняли решение полностью переписать Angular при разработке 2-й версии. Поэтому Angular 1 и Angular 2 получились практически полностью разными. Если вам хочется стать экспертом в Angular, придётся изучить оба фреймворка. Возможно даже, что вам окажется достаточно и первой версии – пока ещё есть время. Но время это уже на исходе. Большинство работы, связанной с Angular, постепенно переходит на Angular 2. В Code School есть интересный бесплатный курс по Angular 1. А для изучения Angular 2 посмотрите бесплатные видео.



Ember JS


Для людей с опытом работы в Ember JS пока ещё есть места, но судя по графику, он уже помирает. Его не поддерживают такие монстры, как Google или Facebook, а вы и так будете загружены изучением React и Angular. Но если вам интересно, можете почитать официальное руководство по Ember JS.



Выбрав наиболее подходящий фреймворк и хорошенько ознакомившись с ним, стоит изучить идущий в паре с ним CSS-фреймворк. Два крупнейших игрока на этом рынке сегодня – Bootstrap и Material Design.



Bootstrap


Bootstrap сделали разработчики Twitter, и он уже довольно взрослый и популярный. Версии Bootstrap существуют для Angular, Angular 2 и React.



Material


Material – это набор правил дизайна, разработанный в Google. Он набирает популярность, существуют его версии для Angular и React. Поскольку Angular – это тоже детище Google, сочетается Material с ним превосходно.



Вот вам несколько ссылок:





Поздравляю! У вас есть ключевые навыки фронтенд-разработчика!





Вы только посмотрите на него!



Я хочу быть бэкенд-разработчиком



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





TIOBE Index of Programming Languages, www.tiobe.com/tiobe_index?page=index



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



Если вы знакомы с одним из отмеченных зелёным цветом языков, и он вам нравится – концентрируйтесь на нём.



Java


Чрезвычайно популярный язык, запускающийся почти везде. Разработан в Sun Microsystems (сейчас им владеет Oracle). На этом языке пишутся приложения для Android. Его также можно использовать для создания десктопных приложений, и, конечно, веб-приложений (как отдельных приложений бэкенда, так и работающих в паре с JSP). Он развитый, стабильный, и для его изучения есть огромное количество ресурсов. Кроме того, это самый популярный язык для изучения объектно-ориентированного программирования в колледжах и университетах. Вот неплохой курс по Java для начинающих.



C#


C# был создан в компании Microsoft как прямой конкурент Java. До недавнего времени его поддержка на системах, не принадлежащих Microsoft, была не ахти – но сейчас ситуация выправляется. Как и Java, этот язык объектно-ориентирован, и может использоваться как для создания веб-приложений (как отдельно, так и совместно с ASP.Net), так и десктопных приложений. Если вы пользуетесь ОС Windows, и вам нужна более привычная среда разработки, C# может подойти вам. Ознакомьтесь с бесплатным курсом по языку от Microsoft Virtual Academy.



Python


За ним не стоит огромная компания, как за языками Java или C#, но Python – отличный язык для того, чтобы быстро выполнять поставленные задачи. Его относительно легко учить, и с каждым годом он набирает популярность. Если другие языки пришлись вам не по вкусу, вы можете углубиться в него. Лучше всего начать отсюда.



JavaScript


Если вы читаете эту статью с начала, то с JS вы уже разобрались. С пришествием Node.JS и популярностью npm (системы управления пакетами, Node Package Manager), серверный JavaScript несомненно будет и дальше набирать популярность. Стоит изучения.



Если вы раньше этого не сделали, сейчас самое время изучить Node.JS, Express и MongoDB при помощи этого превосходного бесплатного изучающего материала и его продолжения.



Ruby


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



Лучше всего учить Ruby на ресурсе RubyMonk



Что насчёт PHP?


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



Я много чего изучил, но у меня нет реального опыта





Ну что, давайте наработаем вам опыт!



Без опыта работы очень сложно устроиться на работу. Сначала нужно закончить парочку персональных проектов, чтобы освоиться с их созданием от начала до конца. А когда вы начнёте работать над ними, очень полезным будет изучить способ управления и публикации кода. Для этого вам потребуется GitHub.



GitHub


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



Личные проекты


Разобравшись с GitHub, нужно приступать к разработке своих проектов. И вот вам пара идей:


  • Сделайте простенький блог (вот вам обучалка для React и Node);

  • Сделайте простой календарь (обучалка для C# и .Net).





На ресурсе Free Code Camp вы найдёте разнообразные примеры проектов, включая те, что требуют только фронтенд. Два моих любимых, это:





Реальный опыт


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



1. Внесите вклад в проект с открытым кодом



Благодаря популярности GitHub существуют миллионы открытых проектов, в которых есть проблемы (ошибки), которые только и ждут, чтобы их исправил кто-то вроде вас. Включить в резюме упоминание об участии в известном открытом проекте – это отличный способ повысить ваш статус. Лучше всего найти себе проект по душе при помощи ресурса Code Triage. Он поможет выбрать наилучший проект для вас и будет отправлять вам задачи по почте каждый день.



2. Поработайте на знакомого или родственника



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



3. Поработайте на благотворительные организации



Очень полезный способ набрать опыт – поработать на благотворительные и некоммерческие организации. Вы можете обратиться к милой вашему сердцу организации подобного рода и предложить свою помощь. Вы можете найти нужный проект через сайт Catch a Fire. А если вы полностью пройдёте программу обучения на сайте Free Code Camp и получите все сертификаты, вы получите доступ к некоммерческим проектам, где сможете применить ваши навыки.



4. Рабский труд



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



У меня есть опыт, помогите мне с работой





Готовы бросить вызов миру?



Первое правило – не называйтесь «веб-разработчиком».







А что же это за разница такая между веб-разработчиком и разработчиком полного цикла? А вот получается, что разница составляет $7000 в год. Если серьёзно, простая смена названия может решать довольно много.



Сделайте приличное резюме


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



Создайте веб-сайт с портфолио


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



Подготовьтесь для интервью


С этим вам поможет моя предыдущая статья How to Win the Coding Interview.



Подкачайте необходимые для интервью умения


Вам нужно подготовиться не только к написанию кода. В хорошей статье с Life Hacker описано много полезной и ценной информации.



Главное – закрепиться на рынке


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



Хочу быть фрилансером


Сам себе хозяин – это хорошо, но это одновременно и огромное давление, и большие сложности. Лучший источник информации по фрилансу из всех, что я видел — DoubleYourFreelancing.com. У него есть серия статей, которые помогут вам стать фрилансером лучше, чем это получилось бы у меня. Читайте.



Ещё один вариант, если вы в себе уверены – сервис Toptal. Они принимают лишь 3% из всех, кто подаёт заявки, и этот процесс очень сложен, но если вы попадёте туда – у вас будет доступ к хорошо оплачиваемым работам, над которыми вы сможете трудиться удалённо.



Я начал работу, но чувствую, что зашел в тупик


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



Освежите ваше первоначальное намерение


Спросите себя, запишите на бумаге, почему вы решили идти по этому пути. В силе ли всё ещё ваш ответ? Если да – то зачем останавливаться? Вперёд!



Оцените свои реальные возможности


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



Прочтите следующую статью



"Не бросайте – каждый эксперт был когда-то новичком"
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/303896/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Муся54

Google перестанет обновлять Nexus 5X и Nexus 6P в сентябре 2017 года - Сделать сайт. Студия 8 GN - Разработка сайтов, продвижение web-ресурса

Среда, 22 Июня 2016 г. 23:36 (ссылка)
8gn.ru/novosti-it-industrii...-2017-goda


Сделать сайт, заказ сайтов, интернет-магазина. Разработка сайтов, создание сайта, продвижение web-ресурса (сайт, интернет-магазин)

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Vlad53

Бренд " Сделано в России " .

Среда, 22 Июня 2016 г. 06:16 (ссылка)

Телеканал "Звезда"

Бренд Made in Russia разрабатывает российское правительство

22 июня 2016, 03:07

Правительство задумалось над разработкой бренда Made in Russia («Сделано в России» - в пер. с англ.). Об этом сообщает газета «Известия» со ссылкой на источник в Минпромторге. По данным издания, в задачи бренда войдет продвижение продукции РФ как внутри страны, так и за ее пределами.... Подробнее »

Метки:   Комментарии (1)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Вице-президент по новым продуктам Mail.ru Group Юрий Гурский — о собственных проектах: Maps.me, MSQRD и Prisma

Вторник, 21 Июня 2016 г. 15:52 (ссылка)

image



Юрий Гурский — человек, о котором сегодня много пишут. Один из немногочисленных белорусских предпринимателей, ныне вице-президент Mail.ru Group и человек частично ответственный за успех MSQRD.



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



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



Что происходит сейчас в вашей жизни и куда все это приведет в ближайшие 2-3 года?



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



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



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



У меня сейчас несколько проектов находятся в состоянии подписания контрактов.



Позже Юрий сообщил о том, что является ментором (и, вероятнее всего, инвестором) в проекте Prisma, разработанном Алексеем Моисеенко:

Prisma — первый проект, который я поддержал из-за идеи использования AI в массовом продукте. Рост сейчас просто фантастический — в пять раз быстрее MSQRD. Миллион пользователей за 4 дня пришло вообще без рекламы и PR.


Есть вопрос, связанный с Mail.ru Group. Вы, если я все верно понимаю, длительное время оставались человеком, который работает в небольших и динамично развивающихся стартапах. Еще недавно это было просто малым или средним околокомпьютерным или интернет-бизнесом. Сейчас вы занимаете одну из ведущих должностей в крупнейшем IT-холдинге России. В одном из предыдущих интервью вы говорите, что это вам интересно, что это вам нравится, но при этом вы продолжаете сотрудничать с маленькими компаниями.



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




Начнем с того, что Mail.ru Group не такая, как о ней думают. Это не классическая корпорация по своему устройству, а холдинг, где каждый бизнес является относительно независимым. Там очень мало интегрирующих отделов – и то, они в основном обеспечивающие. «ВКонтакте» живет как отдельный бизнес. «Одноклассники» – отдельно, Maps.me – тоже, и так далее.



Поэтому я не сказал бы, что вижу для себя какие-то отличия. Я не занимаюсь огромными проектами. Я занимаюсь такими точками, которые для компании являются, можно сказать, внутренними стартапами. Меня, по большому счету, очень мало задевает размер Mail.ru, хотя возможности они дают достаточно большие. И в целом не могу сказать, что столкнулся с какой-то ужасной бюрократией. Может, это было связано с тем, что я изначально попал на такую позицию… Но путь от идеи до принятия решения совсем другой, чем в «Газпроме» или «Роснефти».



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



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



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



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



Вернемся на шаг назад хронологически. Вы оказались в компании после поглощения сервиса Maps.me. А как вы вообще оцениваете конкурентоспособность российских (или скорее, русскоязычных) продуктов на глобальном рынке? И каковы наши слабые и сильные стороны?



Для меня вся территория, которая интегрируется русским языком с точки зрения бизнес-интересов в области разработки, едина: что Беларусь, что Украина, что Россия, и даже Прибалтика.



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



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



Кроме того, важно понимать (этот эффект особенно заметен в Беларуси и Украине), что так как зарплаты ИТшников в среднем выше, чем у выпускников других специальностей, то самые «элитные» мозги уходят в ИТ. Это продолжается уже лет 10, и я сегодня вижу поколение программистов, которое вобрало в себя лучших.



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



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



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



В связи с вопросами эффективности и рачительности или по каким-то другим соображениям?



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



Поэтому, отобрав 1% рынка США, можно заработать больше, чем отобрав 50% рынка в России. А отобрать 1% на большом и растущем рынке для стартапа проще, чем половину на падающем.



Вас насколько сильно деньги мотивируют? Если вас мотивируют не деньги, то что? Какова окончательная цель существования Юрия Гурского?



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



image



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



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



Какое у вас образование? Считаете ли вы себя техническим специалистом?



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



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



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



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



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




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



То есть, для вас доверие к этому человеку является определяющим в своей способности контролировать проект, будущий бизнес?



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



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



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



Вероятно, мы будем сейчас совместно инвестировать в еще один новый проект.



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



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



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







Начнем с некой идеологии. Я в тех инвестициях, которые не в рамках Mail.ru Group, обычно склоняюсь к идее монетизации equity, то есть, к продаже компании. В этом случае очень важным фактором является качество команды. И соответственно я всегда говорю: «Хорошо, у вас будут выше cost’ы, но тогда нужно сделать так, чтобы наша команда была выше рынка. Давайте не брать слабых людей вообще. Даже если мы понимаем, что у нас есть не очень квалифицированная работа, даже если мы понимаем, что мы за эту работу переплачиваем специалисту, давайте не будем брать аутсорсеров, давайте не будем делить людей на junior, middle и senior и стараться брать людей, как минимум, middle +».



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



Вы, наверное, достаточно часто говорите эту вещь. Ее не все принимают.



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



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



Я понял. «Спасти рядового Райана».



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



Ну, плохой проект я никогда не продам.



А если это очень хороший проект?



Это только вопрос денег.



Ладно… А если это будет проект, который изменит жизни людей? Конечно, MSQRD – это классно, но это развлечение. Maps.me – это уже более полезная вещь, способная влиять на жизни людей, их поведение… А если вдруг у вас получится создать какое-то решение, например, в области искусственного интеллекта? Или крупнейшего поставщика аналитических инструментов для big data?



Смотрите, тут вопрос делится на три части:



1. Я не продам плохой проект, потому что я дорожу своей репутацией.

2. Я не продам проект компании, которая его завалит, – даже за хорошие деньги.

3. Я считаю, что у меня есть только один бизнес – это я сам. Все остальное – это проекты. Я не продам себя.



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



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



Вообще нас учили в бизнес-школе, что есть три типа людей:




  • те, кто живут, чтобы покупать,

  • те, кто живут, чтобы продавать,

  • те, кто занимаются бизнесом как хобби.



То, что вы говорите, это, скорее, про третье, либо про первое, да?



Да.



Я не хочу строить империю, поэтому первый вариант отпадает. Хобби, я думаю, можно найти более интересное при желании. Соответственно, строить и продавать. Но и продавать можно по-разному: IPO тоже под это подпадает.



Если будет складываться так, что публичное размещение будет для вас идеальным вариантом, вы пойдете на IPO?



Не вижу большой разницы между публичным размещением и продажей компании. В случае продажи компании покупатель — один или какой-нибудь конгломерат. В случае IPO – это десятки тысяч покупателей. С точки зрения идеологии – никакой разницы.



А вот после покупки MSQRD все там по-прежнему работают из тех, кто были на момент продажи? Его команда остается тем самым отрядом спецназа до сих пор?



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



В России в целом большая проблема с мотивацией людей и с их энергетикой.



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



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



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



1. Что делать в этой ситуации потенциальному инвестору?



2. Что делать этому человеку с прототипом?




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



А если у людей есть классная идея, но они слабые, они все равно ее не вытянут. Я не верю, что слабые люди могут что-то сделать.



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



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



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



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



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



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



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



Это пример того, как работает долгосрочное преимущество. Или, например, Maps.me. Практически все попытки сделать хорошие офлайн карты (а их было очень много) провалились. Причем, как у крупных корпораций, так и у маленьких стартаперов. Потому что технологически это очень нелинейная задача.



image
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/303776/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<разработка - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda