-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Идеальная домашняя сеть или «сам себе злобный перфекционист»

Пятница, 28 Июля 2017 г. 13:38 + в цитатник

Мудрость Бертрама Гилфойла
«Соник Уолл Соник Пойнт Эй-Си-И» вместе с «Ти-Зи 600» — самый передовой фаерволл, встроенная защита от атак, дешифратор SSL, анализатор управления приложениями и фильтрация контента.

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

Как говорит технический директор Qrator Labs Артём ximaera Гавриченков, DDoS-mitigation начинается там, где заканчиваются силы и время одного хорошего системного администратора.

В день системного администратора, который в Qrator Labs считают профессиональным праздником даже больше, чем день программиста, мы задумались — о чём таком можно было б рассказать на Хабре, с чем точно сталкивался каждый?..

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

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

Составив список из 10 вопросов, мы попросили всех коллег, потративших время хотя бы чуть большее, чем то, что требуется на распаковку роутера из коробки, отозваться и поделиться собственными историями. Насколько интересно получилось — судить вам. Мы также попросили ответить на вопросы системного администратора Хабрахабра Вадима Pas Рыбалко и сотрудника бара «Get Jerry» Александра Shoohurt Савицкого.

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

1. Сколько устройств в вашей домашней сети?


Алексей Старков, Qrator: Около 5.

Илья Урвачев, Qrator: Общее кол-во: 18. Из них: носимые устройства (6): 4 телефона, 2 планшета носимые ноутбуки: 2; стационарный ноутбук: 1; мультимедиа: 2 SmartTV + 1 видеорегистратор (домашнее видеонаблюдение); сетевые устройства: 2 mikroTik-a (wifi + switch); периферия: 1 сетевое МФУ + 1 телефон (a510 ip). Серверная группировка(2): border router (intel d510), multipurpose server (xeon E3-1230) — оба gentoo linux.

Александр Зубков, Qrator: Сейчас 3 сетевых девайса, 3 ноутбука и 4 телефона/планшета, 1 почти комп.

Андрей Лескин, Qrator: Где живу сейчас, в Чехии и куда еще не все свои железки перевез, около 10.

Дмитрий Шемонаев, Qrator: Пока их 8: межсетевой экран Juniper SRX100H, точка доступа TP-Link, сервер Fujitsu, сервер Supermicro, коммутатор D-Link DES-3200, проба RIPE Atlas, ноутбук, iPhone.

Антон Орлов, Qrator: Модем GPON, WiFi-рутер, 2 стационарных компьютера, медиаплеер, телевизор, плюс по WiFi более или менее постоянно 3 ноутбука, несколько планшетов, несколько телефонов.

Сергей Куценко, Qrator: ~8-10.

Алексей Березин, Qrator: Пять — роутер, десктоп (win10), MB Air, iPhone 5, китайский смартфон-андроид.

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

Александр Савицкий, Get Jerry: В моей домашней сети около 25 устройств, из которых примерно 20 подключены постоянно.

2. Помимо полноценных десктопов и ноутбуков — какая периферия наличествует (NAS, «умные» устройства — именно подключаемая техника)?


Алексей Старков: В роутере есть USB для подключения накопителей, но я им не пользуюсь.

Александр Зубков: Нет. Хотя раньше был Raspberry с OpenELEC подключенный к телевизору, на котором кино смотрели, телевизор остался в Москве.

Андрей Лескин: Там, где я живу сейчас — 2. Весы с аплоадом в облако и Chromecast, PlayStation, PS Vita.
Там, где я жил раньше: Все то же самое, за исключением того, что добавляется домашняя файлопомойка, где кино\сериалы\музыка\сторадж для облачного файлохранения и чего только фантазия не пожелает, подключенная напрямую к телеку.
Наконец, на даче, где была возможность продумать всё и сразу: Меньше периферии, но есть Raspberry Pi, который выступает температурным демоном и если что, верещит в почту, если в доме стало сильно холодно.

Дмитрий Шемонаев: Такого пока нет, но если появится телевизор, то он обязательно будет с Ethernet.

Антон Орлов: Медиаплеер, телевизор.

Сергей Куценко: Телефоны + роутер выступает в роли NAS+torrent, chromeCast.

Алексей Березин: Никакой. Не ощущаю в ней какой-то необходимости. Интернеты в
телевизоре — это что-то странное.

Вадим Рыбалко: Один двухдисковый NAS, один мини-сервер на базе тонкого клиента (по сути, полноценный компьютер), беспроводной принтер. Потенциально, пара IP-камер. Устройства «умного дома» что-то пока внимание сильно не привлекают, в силу на сегодняшний день тотальной кривости и взаимной несовместимости.

Александр Савицкий: В этот пул, помимо ноутбуков и смартфонов, входят несколько телевизоров, NAS, пара игровых консолей, пара телеприставок Apple TV и МФУ — ничего специфического.

3. Что для вас важно в ключе создания домашней сети, каковы основные требования?


Алексей Старков: Удобство подключения из разных комнат, т.е. покрытие. Самих устройств малое количество, интенсивность низка, поэтому настройка не очень критична.

Илья Урвачев: Стабильный wifi, который не надо перезагружать и/или мучаться, а только настроить и забыть, возможность иметь минимальный latency в местах где может быть установлен ПК (игры, да), мультимедиа никогда не должно заикаться и фризиться, возможность подключения удаленных «офисов» (родительская квартира, дача), сделать самому и как для себя любимого (теперь нет /(d|tp)link/-ков).

Александр Зубков: Желательно, чтобы работало хорошо и быстро и без wifi сейчас никуда.

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

Дмитрий Шемонаев: Для меня важна возможность сегментировать сеть, поэтому дома есть 3 vlan: HOME, MANAGEMENT, LAB. В состав HOME входят домашний ноутбук, айфон и пробник атласа. В MANAGEMENT входят все интерфейсы управления (свитч, IPMI, интерфейсы управления виртуальными роутерами). В LAB всякое остальное.

Антон Орлов: Скорость на скачивание из интернета (при этом скорость на отдачу не
так важна), скорость внутри домашней сети, безопасность, доступность
интернета, удобство просмотра фильмов.

Сергей Куценко: 5ГГц диапазон wi-fi an/ac; WPA2; QOS; upnp.

Алексей Березин: Производительность, простота, стабильность работы. KISS же!

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

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

4. Каковы номинальные (тариф оператора) и реальные параметры подключения (скриншот измерителя скорости типа speedtest)?


Алексей Старков: Номинальный 100 Мбит/с, реально:


Илья Урвачев: 100Mbps FD — меня устраивает (если не ошибаюсь — этот тест на wifi запускался).

Александр Зубков: ADSL 20 download / 2 upload (более-менее так и есть).

Андрей Лескин: Там, где я сейчас: Боль и страдание. ADSL 20/2 с отключением в полночь) speedtest показывает это же.
Там, где я был до этого: 100/100 полноценный. Если цепляться проводом к роутеру то достигало нужных значений. По воздуху — не всегда.
На даче: У всех по-разному, интернет обеспечивается свистками от мобильных операторов, зависит от погоды\уровня сигнала\удаленности вышки.

Дмитрий Шемонаев: 50 мегабит от Билайна и статический IP адрес. Скорость скорее соответствует тарифу.

Антон Орлов: Тариф 20 Мбит/с, реально 50 Мбит/с (это так с 2012 года, с момента
подключения GPON) — вот такой добренький МГТС:


Сергей Куценко: Безлимитный тариф от 50Мбит.

Алексей Березин: Скриншотов не будет, тариф 100МБит анлим. Работает на 100МБит анлим. Все хорошо, такой скорости хватает, оператор (2КОМ) ломается нечасто, стоит недорого.

Вадим Рыбалко: Тариф ISP 50 Мбит/с в обе стороны плюс статический публичный адрес. Реальные измерения более-менее совпадают с заявленными.

Александр Савицкий: Мой тариф подразумевает 100-мегабитное подключение, и надо отметить, что провайдер чаще всего честно отдает мне ровно сотню. Конечно, иногда, во время пиковой нагрузки, скорость может падать до 70-75% от номинальной, но это не проблема.

5. Что в вашем окружении с забитостью частот и как вы решаете данную проблему на уровне организации Wi-Fi сети?


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

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

Александр Зубков: На 2.4 ГГц плохо всё, выбираю менее забитую из 1,6,11. Решается 5 ГГц диапазоном, но не все устройства ещё умеют.

Андрей Лескин: Эфир на 2 ГГц забит до отказа везде, поэтому двойная AP на 2,4 и 5 ГГц. 5 ГГц эфир свободный совсем. А на даче помимо меня интернет есть только у соседа.

Дмитрий Шемонаев: Все плохо, поэтому ноутбук подключен проводом.

Антон Орлов: Не ощущаю проблему. Вокруг меня относительно мало живых квартир.

Сергей Куценко: *опа. ~ 40 точек доступа в видимости wi-fi; После неудачных попыток смены каналов в диапазоне 2.4 перетаскиваю все девайсы в 5ГГц диапазон.

Алексей Березин: Как и в любом многоквартирном доме из картона (панельный дом) — с утилизацией частот все плохо. В основном благодаря сидорам из ростелика/мгтс, ставящих бабушкам на замену телевизора и телефона новомодную цифру в виде GPON, который внезапно оказывается с включенным вай-фаем и и свистит на 200 метров вокруг. По делу — не использую диапазон 2.4ГГц совсем. 5ГГц гораздо быстрее затухает с расстоянием от источника и хуже проникает через препятствия типа стен,
больше каналов в эфире — можно подобрать пустой достаточной ширины. В этом диапазоне все еще можно получить устойчивую связность на модном нынче 802.11ac. Дальше, подозреваю, и в 5ГГц будет набег дэбилов с выкрученной мощой передатчиков «шоб в моей ласточке во дворе был
инторнет».

Вадим Рыбалко: Диапазон 2.4 ГГц утилизирован достаточно сильно, особенно вечерами. Надеятся на него не стоит. Диапазон 5 ГГц практически пуст, этим и пользуемся.

Александр Савицкий: В моем окружении частоты забиты неравномерно и не очень сильно: вокруг меня примерно 6-7 соседских точек Wi-Fi и все они скучкованы вокруг частот, устанавливаемых роутерами по умолчанию. 5-гигагерцевый диапазон ожидаемо практически не используется.

6. Опишите «сетап домашний»: используемые устройства, особенности настройки LAN/WAN


Алексей Старков: Сетап из коробки. Роутер через pppoe связан с циской провайдера в коридоре, от него идет WiFi, конфигурация через DHCP.

Илья Урвачев: Провайдер -> d510 -> MTik switch — ядро сети, а дальше собираем в свич wifi-ap и всё остальное. Особенностей каких-то специфических пожалуй что и нету, всё есть в манах и на stackoverflow.

Тут можно было бы рассказать много боли про l2tp (и kernel support pathces), но слава богу beeline от него отказывается.

Тут можно было бы рассказать много боли про всякие dlink/tp-link (конкретно те экземпляры что достались мне) которые не могут жить без регулярных ребутов или «выходят» из сети если вдруг ктото решит что-то большое скачать по локальной wifi, но теперь есть MirkoTik который этим не страдает.

Тут можно было бы написать что писать правила для iptables с NAT'он — трудно, но трудно это делается по большому счету только первый раз.

Александр Зубков: ADSL-роутер, коммутатор Mikrotik, wifi-точка dual-band. В Москве был проводной интернет и в качестве роутера был PandaBoard, но оно сдохло похоже, ну и тут всё равно без этой ADSL-коробки не обойтись.

Андрей Лескин: Два ноутбука, два телефона, пара планшетов, +- железки на поизучать, chromecast, консоли. Стараюсь сделать максимально просто все: 192.168.X.0/24 с DHCP. В отдельных случаях делается static IP для конкретных железок.

Дмитрий Шемонаев: В МСЭ приходит провод от провайдера, к нему же подключен коммутатор, куда подключены все остальные устройства.

Антон Орлов: GPON-модем имеет wi-fi модуль, но он выключен, так как там есть известные неустранимые проблемы с безопасностью (МГТС в то время всем такие ставил и не парился на эту тему). От него по квартире разведён проводной интернет (к двум стационарным компьютерам, к медиаплееру и WiFi-рутеру). По проводам 100 Мбит/с.

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

Сергей Куценко: Провайдерский роутер: 2-х диапазонный wi-fi/ac по проводу к нему подключен другой роутер (используется как NAS+torrent), все остальные девайсы подключены по wifi предпочтительно к 5ГГц.

Включен upnp для проброса портов torrent; Настроен QOS приоретизируя http трафик; Иногда повышая приоритет для определенных mac-адресов; Иногда включаю фильтр по mac; к роутеру подключен стационарный телефон по проводу; По LAN подключена TV-приставка.

Алексей Березин: Про WAN — провайдер почти адекват. Лочит по MAC, но хоть чистый белый DHCP, без всякого PPP-жупела.

С LAN немного интереснее. До недавнего времени в качестве роутера был какой-то простецкий TP-Link — поэтому и LAN был прост. Плоская адресация на все устройства, проброс порта для RDP, применение DynDNS от no-ip.com.
Теперь, после замены роутера на Mikrotik hAP ac, появилась возможность сегментирования сети (деление по vlan для провода/беспровода, выделение виртуалочек, живущих на стационарном компе, в отдельный vlan — все со своей адресацией). Плюшки про DynDNS и и проброс портов остались. Это пока только начало, дальше буду делать всякие разные приколы с авторизациями (в основном — беспровод, EAP/TLS, не-openvpn точка входа в домашнюю сеть, возможно поддержка IPv6, баловство c VRF etc).

Вадим Рыбалко: Так как основная сфера работы — возня с Цисками и серверами, коробки а-ля «всё в одном» не совсем устраивали. В первую очередь из-за того, что нужно было роутер размещать в географическом центре квартиры. Пробовал несколько, ни одна не удовлетворила потребности и практически со всеми были нарекания к стабильности работы. В предыдущем сетапе был маршрутизатор Cisco 871 и несколько точек доступа 3COM, но они морально устарели по характеристикам производительности (но не по функционалу). В актуальном сетапе я обратил внимание на серию Unifi от Ubuquiti — это оказалось практически идеально для меня. Центром является управляемый 8-портовый (на самом деле портов 10) коммутатор Unifi. Он имеет PoE почти по всем портам. К нему подключены маршрутизатор USG, две точки доступа стандарта AC и всё остальное сетевое железо. К нему же подключён контроллер Unifi в виде небольшого устройства Unifi Cloud Key. Всё, что может питаться по PoE, питается по PoE. На балконе планируется установить уличную точку доступа с небольшой секторальной антенной для покрытия сетью части парка, где планируется проводить много времени. Но это больше fun. Открывать её для гостей не планируется в свете последних законодательных инициатив.

Александр Савицкий: Моя домашняя сеть устроена довольно просто: поскольку в дом заходит не витая пара, а оптический кабель, на входе установлен конвертер, за ним — маршрутизатор, к нему подключен неуправляемый свитч (для нескольких проводных устройств) и точка доступа Wi-Fi. К ней, помимо всех беспроводных устройств, прицеплен рипитер, к которому подключено одно проводное устройство.

Каких-то специфических настроен не делал: и маршрутизатор, и точка Wi-Fi работают на настройках, мало отличающихся от базовых.

7. Какое количество провайдеров обеспечивают доступность из вашей домашней сети, если более одного. Зачем?


Алексей Старков: Один.

Илья Урвачев: 2,5 провайдера: beeline (основной) + net-by-net (резерв, почти не используется и не оплачивается) + постоянно меня дергает МГТС со своим gpon — может быть додергают когда-нибудь.

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

Андрей Лескин: Там, где я сейчас — один единственный. На даче: основные мобильные операторы с интернетом. 3 штуки, что ли. Меняются по мере необходимости. Yota режет VPN, нужно подключать другой. У Beeline лимит трафика, но хорошая полоса. Megafon полоса похуже, лимитов побольше. В зависимости от потребности выбирается инструмент. Последнее время используется только билайн.

Дмитрий Шемонаев: Пока один, есть резерв в виде раздачи интернета через телефон.

Антон Орлов: Если что, то раздаётся мобильный интернет с телефона. Реально за почти
5 лет было нужно только когда вырубался свет во всём доме, в остальное
время всё работало без перебоев.

Сергей Куценко: Один провайдер, в случае отключения использую Yota.

Алексей Березин: Базовый — один. Всегда есть emergency в виде интернета от ОпСоС'а.

Вадим Рыбалко: Один провайдер. Практически ни один домашний роутер не может организовать нормальный dual WAN (хотя многие имеют такую возможность). Редко когда отваливается «последняя миля», иногда просадки где-то на сети оператора или его стыках. Если не будет интернета некоторое время — не катастрофа, если чего, можно принудительно переключить трафик на LTE-маршрутизатор.

Александр Савицкий: Я пользуюсь услугами одного провайдера, хватает с лихвой.

8. Безопасность — каковы ваши основные подходы к защите устройств от компрометации или несанкционированного доступа?


Алексей Старков: Апдейты прошивки, доступ по ssh к роутеру закрыт со стороны интернета, WPA2 для WiFi, в общем то и все.

Илья Урвачев: Со стороны провайдеров и интернетов: border с нормальным linux + iptables. Со стороны wifi: wpa2 без wps, отдельная гостевая сеть с wpa2, отдельная гостевая-гостевая сеть для соседей. Для внутренних устройств: только ipv4 и только NAT сами внутренние устройства win: только пользовательские учетки, урезанные права и прочее угнетение сами внутренние устройства: в интернет ходить могут только те устройства, которым туда надо (например принтеру или видеорегистратору в интернете делать нечего).

Александр Зубков: Инфа на диске ноутбука и домашнего сервера зашифрована. На телефоне впрочем тоже.

Андрей Лескин: Шифрованный диск, потереть ключи через 2 часа неиспользования.
— Setup FileVault2;
— Disable Fast User Switching (REVERT IT);
— Setup Firmware Password;
— sudo pmset -a destroyfvkeyonstandby 1;
— sudo pmset -a standbydelay 3600;
+ encrypted backups.

Дмитрий Шемонаев: На МСЭ снаружи открыт только ssh на сам роутер. Внешние соединения на внешний IP сбрасываются.

Антон Орлов: Самое главное — регулярное обновление прошивок и софта на всех устройствах.

Сергей Куценко: WPA2 / шифрованные разделы на дисках для критичных данных.

Алексей Березин: Как у ГД. Закрыть и не пущать. Лучшая защита от компрометации — лишение возможности компрометации. Ну то есть как минимум надо обламывать все неинициированное изнутри. Ну и слава РКН и МНУ — не позволяют ходить на компрометированные URL.

Вадим Рыбалко: Снаружи всё прикрыто, кроме проброшенного порта SSH на сервер. Есть uPNP, открывающий порты приложениям, здесь удобство победило паранойю. Изнутри в интернет можно ходить без ограничений, на беспроводной сети WPA2-PSK с AES. На Unifi Cloud Key и NAS можно попасть из вне при помощи фирменных облачных сервисов.

Александр Савицкий: Я ограничивал доступ к админкам маршрутизатора и точки доступа не только сложным паролем, но и белым списком. Сама сеть Wi-Fi разделена на две: основную, доступ к которой есть только у белого списка, и гостевую с авторизацией по паролю.

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


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

Илья Урвачев: Коротко — уже. Длиннее:
0) Никаких полумер — только хардкор;
1) Варианты типа валяющейся витой пары или запихивание её под плинтус — неприемлемы от слова совсем;
2) Квартира недавно пережила второй за 3 года капитальный ремонт (отдельная тема для разговора — как без бюджета самостоятельно сделать капитальный ремонт) — при каждом из них для конечных стационарных устройств (ПК/ТВ/etc) провода укладывалить в гофре в стены, вводы провайдеров передвигались;
3) Ядро сети (сервера и роутеры) разполагаются специально для этого созданной антресоли — goo.gl/photos/WbdvqrnkYeaRtW2U8, к слову — вот так делалась электрика goo.gl/photos/Z9mTV1AZTrGUiGFT7 (на двушку);
4) Обеспечения устройств на балконе (smartTV и может быть еще что-то) — прокидывать на балкон витую пару.

Александр Зубков: Всякое было в разных местах. Розетки разводил, провода прятал. Но это жена их не любит и ругается. Есть даже устройства Ethernet over PowerLine — связь по ним лучше, чем через WiFi, но к сожалению иногда глючат.

Андрей Лескин: Там, где я живу сейчас съемная квартира, живем без этого. Там, где я жил раньше также была съемная квартира, приходилось для NAS откопать старый роутер, который работал в режиме «беспроводной сетевой карты». То есть от NAS к нему провод, далее по воздуху до основной точки входа. А на даче на этапе прокладки электричества при строительстве также развел в каждую комнату по сетевой розетке. В мыслях сделать роуминг-сеть.

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

Антон Орлов: Когда делал ремонт в квартире, заранее подумал, где будут нужны интернет-розетки и развёл провода в стенах. Не ошибся.

Сергей Куценко: Всё что не жрет полосу подключается по wifi, по проводу по возможности близко к роутеру. Исключение только TV приставка к которой по плинтусу протянута витая пара в другую комнату.

Алексей Березин: Живу на съемной квартире. Можно усверлиться, но лень и как-то незачем. Все в плинтусах, где можно. В своей ква (если появится когда-то) будет ремонт с учетом слаботочки — люблю порядок таки.

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

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

10. Чем отличается ваша домашней сеть от домашней сети соседа и почему она лучше?


Алексей Старков: У меня специальные розетки в стенах, ну. А так не сильно лучше, сделано по принципу «достал из коробки — работает — не трогай».

Илья Урвачев:
— Мало кто будет дома использовать роутер x86_64 (ну да atom) на linux и упарываться всякими l2tp и засовываением его в ядро (так как лопатить трафик userspace — накладно и безсмысленно) (отдельный привер beeline);
— Мало кто будет дома делать закрытую гостевую сеть + wifi-hotspot для соседей;
— Мало кто будет дружить torrent + dlna + smarttv и обмазывать это автоматизацией;
— Мало кто будет будет ставить на балкон отдельную точку доступа (витая пара есть);
— Мало кто будет заморачиваться дома с asterisk;
— Мало кто будет обмазывать motion (который motion-project.github.io) своим web-gui (и пожалуй никто не будет его делать на html+js+nginx+ssi и чуточку на bash);
— Мало кто будет делать самостоятельно multiroom-multimedia (правда и я тоже бросил не закончив);
— Мало кто будет запиливать zabbix;
— Мало кто будет локальный gentoo mirror;
— Мало кто будет объяснять samsung мфу что надо сканы в папочки по датам на smb шаре раскладывать;
— Мало кто будет брать под торренты/файлохранилища/etc только WD-Black, а я, попробовав — настоятельно рекомендую.

Александр Зубков: Не знаю что там у соседей.

Андрей Лескин: Там, где я сейчас все берут провайдерские железки, которые практически всегда Китай, который не очень хорошо работает. Выбираю адекватные железки под задачи. Очень полюбил микротики, но они не умеют в ADSL, поэтому пришлось взять Asus (в стоковой прошивке уныл, но есть прошивка энтузиастов, Tomato и прочее). Tomato даже когда-то патчил, когда к старому роутеру подключал терабайтный хард.
Там, где я жил раньше Mikrotik! Они сложнее в освоении, но, единожды настроив (понимая, что к чему), кладешь их на полку на года и забываешь. Он просто работает.
На даче я — Д'Артаньян.

Дмитрий Шемонаев: Я к соседям не заглядывал, поэтому не знаю.

Антон Орлов: У некоторых соседей модемы от МГТС так и стоят много лет с настройками
по умолчанию (включая пароли).

Сергей Куценко: Не думаю что есть какие-то особенные отличия.

Алексей Березин: Как только вломлюсь к соседу — узнаю. Это будет второй вопрос
после «Какого хрена куришь на горшке какое-то говно?!».

Вадим Рыбалко: Наличием 5 ГГц — к счастью, попсовые роутеры не вещают в этом диапазоне (хотя с приходом в массы AC всё может измениться). При этом с точки зрения масштабируемости топология сети больше походит на сеть небольшого предприятия, чем домашнюю. Лучше охват беспроводной сети за счёт нескольких точек прямо по центру помещений под потолком.

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

Всех причастных — с праздником! Если у вас есть непростая история создания и администрирования домашней сети, занимающая отдельное место в вашем сердце — поделитесь ею в комментариях.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334338/


Метки:  

20 правил самых коротких маркетинговых текстов

Пятница, 28 Июля 2017 г. 13:20 + в цитатник
Мы работаем на рынке A2P SMS более десяти лет. Через нашу платформу прошли миллионы рассылок и тысячи sms-кампаний. За эти годы накопили опыт, которым поделимся в этой статье.



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

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

1.Обращайтесь к человеку лично

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

При этом стоит избегать чрезмерной фамильярности или же формальности, если это не часть вашего корпоративного стиля. Часто, обращения «Уважаемый клиент!» бывает вполне достаточно.

2. Коротко и по сути

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

3. Правильно формулируйте — не запутывайте клиентов

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

4. Выделяйте только самое важное

Так как при составлении SMS текст невозможно выделить ярким цветом или другим шрифтом, часто для акцентирования определенного слова используют заглавные буквы. Но не стоит ими слишком увлекаться. Вы, вероятно, замечали, что сообщение написанное большими буквами (Caps Lock-ом), очень сложно воспринимается и почти не читабельно. Не повторяйте подобные ошибки, выделяя большими буквами лишь самое важное в вашем тексте.

5. Исключите сложные слова/ аббревиатуры

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

6. Пишите на понятном языке

Очень часто нам приходят SMS, слова которых читаются, как на кириллице, но пишутся английскими буквами. Мода на подобные сообщения пришла еще со времен, когда одна SMS могла вместить в себя больше латинских символов, чем слов написанных на кириллице. Мы не рекомендуем пользоваться подобным вариантом составления текстов, так как данный метод недостаточно читабельный и сложно воспринимается людьми. К тому же использование, например, таких букв, как «J»/ «Y» вводят в заблуждение получателей, потому что очень часто они имеют достаточно разные варианты трактовки: й, я, ж, ь и т.д.

7. Добавляйте призывы к действию

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

8. Первое слово дороже второго

Не секрет, что если нас не заинтересовали первые строчки статьи, то вряд ли мы будем дочитывать ее до конца. Такой же принцип действует и в коротких текстах для SMS-рассылки. Чтобы получатель прочитал всю информацию целиком, вызовите интерес в нем с самого начала. Если текст содержит данные о скидках, разместите его вначале SMS, например: “СКИДКИ до -50%”.

9. Акцентируйте внимание на выгоде для клиента

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

10. Побольше цифр

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

11. Долой хаос — выдерживайте структуру

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

12. Подарите человеку чувство значимости

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

13. Не забывайте о бренде

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

14. Будьте на шаг впереди получателя

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

15. Всегда будьте актуальны

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

16. Играйте на контрасте — сравнивайте цены

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

17. Не используйте уловки

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

18. Группируйте свою базу клиентов

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

19. Указывайте свои контакты

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

20. Тестирование — ключ к успеху

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

О том, как правильно тестировать SMS-рассылки мы писали в одном из наших предыдущих материалов.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334336/


Метки:  

Ужасный рекрутер, ужасный кандидат

Пятница, 28 Июля 2017 г. 13:14 + в цитатник
Здравствуйте, меня зовут Настя. 12 лет ищу и нахожу сотрудников для ИТ и ИБ компаний. В последние несколько месяцев на Линкедине, Фейсбуке и тематических сайтах возникают беседы, от которых хочется злиться, ругаться и восклицать «Да что ж ты делаешь-то?!». Кандидаты пишут, что компании унижают их достоинство, когда собеседование проводит «ничего не понимающий эйчар». HR’ы негодуют — «Да он сам не ответил, почему канализационные люки круглые!». Тимлидам не нравится профессиональный уровень кандидатов. А срокам проектов не нравится, что они так быстро подходят к дедлайну. И все они почему-то забывают, что найм и трудоустройство — это процесс, который требует от всех участников терпения, доброжелательности и позитива.

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

image


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

Ужасный рекрутер



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

image

Цитата: «пока мы с кандидатом доходим до переговорной, я уже знаю, будет он у нас работать или нет». Со своим незаконченным заочным педагогическим образованием безапелляционно судит об уровне интеллекта системного архитектора. Пока руководитель борется с нехваткой ресурса, а команда перерабатывает, рекрутер экспериментирует над кандидатами, подсовывая им идиотские тесты «как в гугле» или составляет психологический профиль по ещё более идиотским методикам с сайтов «для психолухов». До элементарной вежливости снисходит редко, не перезванивает никогда. Это не лень и не отсутствие профессионализма — в силу эгоцентрической зацикленности на себе не задумывается об эмоциях и чувствах других людей. Пребывает в полной уверенности, что кандидаты обладают бесконечными запасами времени и терпения и готовы неделями выполнять его хотелки: первое собеседование с hr, 2-ое с руководителем, 3-е с директором, потом тест, а потом ещё тест, а потом финальное, а потом детектор лжи для бедолаг, прошедших все круги ада. Не владеет методиками проведения интервью, не учится, задаёт одни и те же, давно превратившиеся в мемы и обстёбанные на всех форумах вопросы из серии «кем вы себя видите через 5 лет?!!» Зато обладает потрясающими способностями делать далеко идущие выводы из скупых ответов кандидатов «ну… э… я не знаю…». Ставит безапелляционные и категоричные диагнозы. Резюме такого рекрутера — это череда небольших кадровых агентств с опытом работы по несколько месяцев в каждом. Либо не пыльное существование in-house под прикрытием могущественного родственника. Из всех остальных мест он изгоняется, потому что хронически не в состоянии выполнить план по набору персонала.

Ужасный кандидат



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

image

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

В чем сходство этих двух типажей?



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

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

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

Что делать, если ужасный рекрутер — это ты?



  1. Уважай своих кандидатов. Если мы говорим о рынке труда в отрасли ИТ, большая часть из них умнее, талантливее, профессиональнее, чем ты.
  2. Вот прямо сейчас! напиши всем, кто ждёт твой ответ по итогам встречи. Отказ в E-staff отправляется одной кнопкой.
  3. Учись. Прекрати спрашивать, кем себя человек видит через 5 лет, этот вопрос всех достал.


Что делать если ужасный кандидат — это ты?



  1. Сними розовые очки и посмотрись в зеркало без них. Попроси продвинутого коллегу честно охарактеризовать твой профессиональный уровень. Главное — не поссорьтесь. Адекватная оценка будет полезна всем.
  2. Выучи уже Exchange, или что тебе необходимо, чтобы найти работу. Открой Лутца, стряхни пыль с Бертрана Мейера, ведь ты же его зачем-то купил?
  3. Прекрати жаловаться в соцсетях. Даже если твой пост наберёт 1000 лайков, какой в этом толк, если у тебя по-прежнему нет работы.
  4. Прекрати считать, что все кругом виноваты: hr, тимлид и заговор работодателей. Хуже всего от этой позиции тебе самому.


Вывод. Что делать если повстречался такой ужасный представитель рынка труда?



  1. Отойти на безопасное состояние, не тратить свои нервы
  2. Не реагировать на его комментарии, не принимать близко к сердцу его «профессиональную» оценку. Она ничего не значит и никому не интересна.
Вы были в такой ситуации?

Проголосовало 100 человек. Воздержалось 45 человек.

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

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

https://habrahabr.ru/post/334268/


Уменьшаем размер приложения: проверенные способы

Пятница, 28 Июля 2017 г. 13:07 + в цитатник

Введение


Одним из немаловажных аспектов разработки мобильных приложений является оптимизация размера. Мы все по личному опыту знаем, что чем меньше весит приложение, тем охотнее его скачивают, особенно если под рукой нет точки доступа Wi-Fi, а скорость и/или трафик мобильного интернета оставляют желать лучшего. К тому же, нельзя забывать и о том, что некоторые маркеты ставят ограничение на размер выпускаемого приложения. Например, в App Store продукты размером до 100 МБ доступны для скачивания по мобильному интернету, если же вес приложения превышает этот порог, то скачать его можно только через Wi-Fi. На Play Market же приложение, которое вытягивает больше 100 МБ, нельзя загрузить в принципе. В данной статье мы опишем, к каким методам и хитростям прибегали наши разработчики нативных приложений на iOS для того, чтобы уменьшить вес продукта, и добавим к этому несколько дельных советов, найденных в сети.



Основные способы уменьшения размера приложения


Графический контент


Сейчас дизайн играет ключевую роль в любом хорошем приложении. Если интерфейс минималистичен или продукт имеет небольшой набор функций, то этот этап можно пропустить. Если же проект отличается богатым функционалом или поддерживает некоторое количество цветовых схем, то здесь уже не обойтись без большого количества изображений со всеми вытекающими последствиями для веса. Кроме того, зачастую в проекты по умолчанию добавляются наборы изображений под различные форм-факторы мобильных устройств, как например @1x, @2x, @3x для iOS приложений. Ниже мы приведем методы, которые использовали в своих приложениях, чтобы разрешить проблему с обилием графического контента. Возможно, какие-то из них вы применяете и сами.

Один из простейших путей — использовать вместо трех масштабов только 3x изображение. Этот способ не назовешь оптимальным, так как на устройствах, ориентированных под 1x и 2x масштабы, такие изображения не всегда будут смотреться приемлемо. Однако за неимением лучшего этим приемом можно неплохо уменьшить размер проекта при огромном количестве графики.

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

Теперь рассмотрим пример с приложением, имеющим несколько цветовых схем (в простонародье «скин»). Чем больше цветовых схем в приложении, тем сильнее возрастает количество необходимых изображений. Если в изображении используется более одного цвета, то приходится хранить несколько вариантов на каждый скин. Однако, в случае когда изображение однотонное, его можно сделать шаблонным и уже в самом коде менять цвет оттенка (tint color). На iOS создать подобный шаблон можно двумя способами:

  1. выставить Template Image в самом XCode (см. Рис.1);
  2. задать шаблонный режим программно




Рис.1. Выставление шаблонного режима изображения в XCode.

UIImage *templateImage = [[UIImage imageNamed:@«Back Chevron»] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; - где  UIImageRenderingModeAlwaysTemplate и является шаблонным режимом изображения.
После чего уже в коде выставлять цвет оттенка: 
[backButton setTintColor:[UIColor blueColor]];


Замена анимационных изображений


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

	NSArray *gif=@[@"frame1",@"frame2",@"frame3",@"frame4",@"frame5", @"frame6",@"frame7",@"frame8",@"frame9",@"frame10"];
    	NSMutableArray  *images = [[NSMutableArray alloc] init];
	for (int i = 0; i < gif.count; i++)
    	{
        	UIImage *image=[UIImage imageNamed:[gif objectAtIndex:i]];
        	[images addObject:image];
    	}
	imageView.animationImages = images;
    	imageView.animationDuration = 0.3;
    	imageView.animationRepeatCount=1;
    	[imageView startAnimating];


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

+ (UIImage * _Nullable)animatedImageWithAnimatedGIFData:(NSData * _Nonnull)theData;
+ (UIImage * _Nullable)animatedImageWithAnimatedGIFURL:(NSURL * _Nonnull)theURL;


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

Однако gif-файл тоже занимает пространство, поэтому мы старались выполнить все анимации программно. В Audio Editor Tool на стартовом экране у нас проигрывается анимация появления логотипа AUDIO EDITOR побуквенно. Раньше данная анимация была реализована с помощью гифки, но из-за большого разрешения изображения весила она многовато. Поэтому мы решили реализовать ее с помощью CABasicAnimation.

CAGradientLayer *gradient=[CAGradientLayer layer];
gradient.frame=animationLabel.bounds;
gradient.colors = @[(id)[UIColor colorWithWhite:1 alpha:1.0].CGColor,
                    (id)[UIColor clearColor].CGColor];
gradient.startPoint = CGPointMake(0.0, 0.5);
gradient.endPoint = CGPointMake(0.1, 0.5);
animationLabel.layer.mask=gradient;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.99 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    gradient.colors = @[(id)[UIColor colorWithWhite:1 alpha:1.0].CGColor,
                        (id)[UIColor colorWithWhite:1 alpha:1.0].CGColor];
});
CABasicAnimation *startPoint=[CABasicAnimation animationWithKeyPath:@"startPoint"];
startPoint.fromValue= [NSValue valueWithCGPoint:CGPointMake(0.0, 0.5)];
startPoint.toValue= [NSValue valueWithCGPoint:CGPointMake(1.0, 0.5)];
startPoint.duration = 0.9;
[startPoint setBeginTime:0.1];
startPoint.removedOnCompletion=NO;
CABasicAnimation *endPoint=[CABasicAnimation animationWithKeyPath:@"endPoint"];
endPoint.fromValue= [NSValue valueWithCGPoint:CGPointMake(0.1, 0.5)];
endPoint.toValue= [NSValue valueWithCGPoint:CGPointMake(1.0, 0.5)];
endPoint.duration = 1.0;
[endPoint setBeginTime:0.0];
endPoint.removedOnCompletion=NO;
CAAnimationGroup *group = [CAAnimationGroup animation];
[group setDuration:1.2];
[group setAnimations:[NSArray arrayWithObjects:startPoint, endPoint, nil]];
[ gradient addAnimation:group forKey:nil];


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

Конвертирование аудио


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

+(void)convertAudio:(NSURL *)url toUrl:(NSURL *)convertedUrl{
    AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil];
    AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:audioFile.processingFormat frameCapacity:(uint32_t)audioFile.length];
    [audioFile readIntoBuffer:buffer error:nil];
    
    
    NSDictionary *recordSettings = @{
                                     AVFormatIDKey : @(kAudioFormatLinearPCM),
                                     AVSampleRateKey : @(audioFile.processingFormat.sampleRate),
                                     AVNumberOfChannelsKey : @(audioFile.processingFormat.channelCount),
                                     AVEncoderBitDepthHintKey : @16,
                                     AVEncoderAudioQualityKey : @(AVAudioQualityMedium),
                                     AVLinearPCMIsBigEndianKey: @0,
                                     AVLinearPCMIsFloatKey: @0,
                                     };
    AVAudioFile *writeAudioFile = [[AVAudioFile alloc] initForWriting:convertedUrl settings:recordSettings error:nil];
    [writeAudioFile writeFromBuffer:buffer error:nil];
}

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

Подгрузка файлов с сервера


Подгрузка файлов с сервера — это то что нужно для приложений со значительным объемом контента. Большое количество пресетов музыки, наборы изображений и многое другое, что сильно увеличивает размер приложения, можно загрузить и позднее. Конечно, загрузка каждого отдельного файла потребовала бы много времени и трафика, поэтому с сервера подгружаются архивы со всем необходимым, а уже в самом приложении они распаковываются и сохраняются в директории приложения. Для разархивирования используется библиотека SSZipArchive (репозиторий библиотеки вы найдете по ссылке). Этот библиотека способна как упаковывать файлы в архив, так и распаковывать архивы. Но нас интересует только один метод из основного класса библиотеки:

+ (BOOL)unzipFileAtPath:(NSString *)path
    toDestination:(NSString *)destination
    progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler
    completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;


Данный метод распаковывает файл из пути path в путь destination, а пока он распаковывается в progressHandler можно совершать какие-либо действия (например, отображение прогресса распаковки), после чего в completionHandler показать, что распаковка благополучно завершилась, либо вывести ошибку при неудаче.

Заключение


В конечном счете, если судить по приложению Mix Wave, которое до установки весит ~41 МБ, а после загрузки всех пресетов — 281 МБ, то описанные методы смогли уменьшить размер приложения примерно в семь раз. Результат неплохой, хотя, возможно, существуют и более актуальные способы. Если вы знаете о таких, предлагаем поделиться в комментариях.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334314/


[Из песочницы] Как крупная курьерская компания персональные данные своих клиентов раздавала

Пятница, 28 Июля 2017 г. 12:50 + в цитатник
image

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

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

В один прекрасный день на мой телефон в очередной раз позвонили из Москвы (сам я проживаю в регионе), попросили поучаствовать в опросе и спросили мою супругу. Я просто молча положил трубку. А через час мне пришло долгожданное SMS-сообщение из службы экспресс-доставки, услугами которой мы пользовались уже не первый год. Текст, аналогичный полученному, был выслан мне в Viber и на электронную почту. Данное SMS-сообщение содержало ссылку на официальный сайт компании вида www.XXXX.ru/dostavka/?hash=XXXXXXXXXXXX, пройдя по которой я мог отслеживать движение груза и управлять его доставкой (отказаться от груза, выбрать дату доставки и пр.).

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

Данное обстоятельство позволило мне предположить, что любой человек, пройдя по моей ссылке, может увидеть информацию о моем отправлении (а заодно и персональные данные, а именно: номер телефона, ФИО и домашний адрес). Само по себе данное обстоятельство уже не особо приятное. В то же время, слово «hash» в адресе дало мне надежду на то, что следующая за ним последовательность — результат некой хэш-функции, и подобрать последовательность таким образом, чтобы попасть в чей-то личный кабинет, будет затруднительно. Чтобы проверить данное предположение, я изменил последний символ в последовательности (цифру) и попал в чужой личный кабинет, где мне были доступны чужие персональные данные, а при входе логином автоматически послужил чужой номер телефона. Поверхностно пробежавшись по «соседним» личным кабинетам, я понял, что последовательность символов, следующая за "?hash=" — это не результат хэш-функции, а некий код, выдающийся по порядку каждому клиенту по каждому отдельному отправлению. Замена иных символов в последовательности — шестнадцатеричных цифр на предыдущие или последующие позволила мне попасть без какой-либо авторизации в чужие личные кабинеты, что давало доступ к сведениям о номере телефона, фио получателя и его адресе (часто — домашнем).

Вот как это выглядело
image image

imageimage

Так я с ужасом понял, что компания хранит персональные данные своих клиентов (а заодно и наши с супругой) в открытом виде на страницах, доступных любому лицу, имеющему доступ к их официальному сайту. Для доступа к персональным данным клиентов компании по всей стране достаточно пропарсить страницы личных кабинетов, подставляя методом перебора значения последовательности, следующей за "/?hash=" в url. Причем абсолютно никакой защитой от скрапинга сайт не располагал. Спешно набросанный на коленке краулер безо всяких проксей в 20 потоков буквально за пару минут собрал несколько сотен живых записей, после чего я его выключил. Нет, IP не забанили. Это была бомба. Справедливости ради надо сказать, что так можно было собрать данные не всех клиентов, а только тех, кто находится, так сказать, в «активной фазе получения груза». До момента поступления груза в какой-то из ближайших сортировочных центров и почти сразу после его получения доступ в кабинет управления доставкой закрыт, но телефон и номер накладной все еще светились в форме авторизации (т.е. базу живых номеров собрать все-таки было можно).

До определенного момента и после получения управление доставкой недоступно
image

Таким образом, избранный компанией способ хранения персональных данных клиентов обеспечивал неконтролируемое раскрытие этих данных третьим лицам, что являлось грубейшим нарушением требований статей 7 и 19 Федерального закона от 27.07.2006 №152-ФЗ «О персональных данных». С одной стороны, очень-очень сильно хотелось пожаловаться в Роспотребнадзор, с другой же стороны я понимал, что для компании создание сайта направление не профильное (а сайт, судя по копирайтам, они сделали сами), а службы ИБ в ее штате вообще могло и не быть. Поэтому (чтобы писать от себя) я выждал пару дней, пока придет груз уже на мое имя, убедился, что все по-прежнему работает, и изложил им обнаруженную мной проблему, честно указав, что намерен написать о ней сразу по закрытии уязвимости или через две недели с момента обращения (что наступит раньше). В ответ я получил дежурную благодарность и обещание передать информацию руководству и моему менеджеру.

Сколько эта брешь просуществовала на сайте можно только гадать, но я уверен, что она вовсю эксплуатировалась заинтересованными лицами. На сегодня (спустя почти три недели) брешь, вроде бы, закрыта. В прочем, со мной представитель компании не связывались.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334330/


Метки:  

Про Agile, Scrum и командную работу. Как устроены процессы развития продуктов в Альфа-Лаборатории

Пятница, 28 Июля 2017 г. 12:24 + в цитатник

Негибкий “Энтерпрайз” и гибкие методологии


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

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



Я расскажу, как у нас в Лаборатории выстраиваются процессы работы. Мы опираемся на концепцию Agile. В качестве основного фреймворка мы выбрали Scrum, модель производства — командно-центричная.

Составы команд варьируются в зависимости от потребностей создаваемого продукта, но практически всегда это “полный стек”, необходимый для доработки или разработки продукта. Чаще всего это Product Owner (PO), скрам-мастер, дизайнер, системный аналитик, несколько разработчиков и тестировщик. Набирается 7 — 10 человек. Всего в Лабе таких команд порядка 30.

Наши принципы


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

Кросс-функциональность и взаимовыручка


Одна из самых важных вещей в командной работе — это внутрикомандное взаимодействие.

Мы в командах не ставим задачи вроде “разработчик — пишет код”, “аналитик — готовит документацию” и т.д.

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

В Scrum-гайде это называется “кросс-функциональная команда”.

Никаких заказчиков и исполнителей


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

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

Соответственно, и в проработке бэклога задействована вся команда. У нас нет такого, что PO в качестве заказчика “загружает” в команду требования, а затем просто ожидает результата.

Продуктологи приходят к команде с клиентской проблемой (иногда бывает, что и сразу с решением). Далее все члены команды участвуют в проработке проблемы, формировании гипотез, поиске решений — они вместе делают “story map”, формируют пользовательские истории, обсуждают сценарии, решают, как будет выглядеть продукт.

При этом члены команды имеют полное право выносить на обсуждение свои идеи по улучшению продукта.

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

Итеративность


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

Прозрачность


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

В качестве “градусника” мы используем burndown-диаграмму спринтов команды. Burndown достаточно оперативно отражает возникающие в процессе работы проблемы (если график “плоский”), и мы можем своевременно реагировать на эти проблемы.

Кроме того, по совокупности графиков нескольких спринтов можно оценить общее положение дел в команде.

Очень удобно то, что все наши команды используют Jira в качестве таск-менеджера — воспользовавшись этим, мы настроили общий дашборд, на котором видны все 30 burndown-диаграмм. Можно сказать, что это наш Центр Управления Полётами :)

Не надо стесняться


В продолжение темы прозрачности поговорим о важном для нас мероприятии — демонстрации итогов.

В конце итерации (раз в одну или две недели) в каждой команде проводится Sprint Review — ребята показывают и рассказывают, что они сделали за спринт.

Состав приглашенных на “демо” определяется по усмотрению команды — они могут как пригласить реальных пользователей, так и ограничиться демонстрацией коллегам и своему PO.

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

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

Система поощрений


Помимо комфортного офиса, интересных задач, крутой команды и стандартных “белая зарплата + ДМС”, у нас существует система мотивации сотрудников.



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

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

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

Кто на новенького


Немало внимания мы уделяем поиску и подбору людей.

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

Человеческие качества кандидата, подходит ли он нам по духу — это те вещи, на которые мы обращаем внимание на собеседованиях.

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

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



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

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

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

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

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

Думаю, наше особое внимание к именно этим критериям помогло нам собрать такую крутую команду, работать в которой — всегда в радость и с удовольствием!

Если вы разделяете подобный подход к работе и хотели бы стать частью команды — обратите внимание на наши текущие вакансии — дизайнер интерфейсов, Scrum master, iOS-разработчик и многие другие.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334294/


Red Architecture — красная кнопка помощи для сложных и запутанных систем — часть 2 (пример с миллиардом ячеек)

Пятница, 28 Июля 2017 г. 12:22 + в цитатник
В первой части представлена концепция Red Architecture — подход, упрощающий взаимодействие между компонентами в сложных системах, и предназначенная в первую очередь для клиентских приложений. Для полного понимания текущей статьи необходимо познакомиться с данной концепцией здесь.



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

У нас есть клиетское приложение — редактор таблиц, в нём отображается лист таблицы. Экран у пользователя настолько большой, что на нём помещается 1 000 000 000 (один миллиард) табличных ячеек. Всё усложняется тем, что наш табличный редактор подключен к облаку для возможности совместного редактирования таблицы, поэтому изменения в любой из одного миллиарда ячеек “где-то в облаке” должны быть сразу же отображены нашему пользователю.

Паттерн Red Architecture позволяет реализовать данную функцию просто и с высокой производительностью.

Прежде всего, нам нужно немного усовершенствовать класс v

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

Рассмотрим решение этой проблемы
Теперь ключи (идентифицирующие логические цепочки) в классе v будут не элементами перечисления, а строками. Для краткости и лёгкого восприятия будем писать в псевдокоде:

class v {
   // value got from this format string will look like OnCellUpdateForList_List1_Cell_D9
   public const string KeyOnCellUpdate = “OnCellUpdateForList_%s_Cell_%s”;
}


Мы объявляем ключ, который по факту является форматной строкой, для чего? Дело в том, что ячейка в любом случае должна быть некоторым образом идентифицирована на табличном листе. Мы предполагаем, что информация об обновлении ячейки, пришедшая “из облака”, содержит данные идентифицирующие ячейку (иначе как мы её найдём в листе чтобы проапдейтить?), такие как имя листа (List1) и адрес ячейки (D9). Также мы предполагаем, что каждая ячейка, отображённая на экране пользователя, тоже “знает” путь к себе, а именно те же имя листа и свой адрес (иначе как она оповестит систему о том, что изменения произошли именно в ней, а не в какой-то другой ячейке?)

Далее, нам нужно добавить ещё один аргумент в метод h(). Теперь обработчики подписываются не на все ключи которые есть в системе, а на конкретный ключ, который передаётся первым аргументом:

class v {
   // for instance, OnCellUpdateForList_List1_Cell_D9
   public const string KeyOnCellUpdate = “OnCellUpdateForList_%s_Cell_%s”;

    private var handlers = new HashMap >();

    void h(string Key, HandlerMethod h) {
        handlers[Key] += h; 
   }

   void Add(string Key, data d) {
      for_each(handler in handlers[Key]) {
        handler(Key, d);
     }
  }
}


Для хранения обработчиков мы используем приватную коллекцию типа HashMap, содержащую пары “один ко многим” — один ключ, на который могут подписаться один и более обработчиков; а в методе Add(), “рассылающем” события по подписчикам, мы используем только функции-обработчики подписанные на данный ключ. Для контейнера с потенциальным миллиардом элементов стоит подыскать подходящую для такого объёма данных реализацию, поэтому мы используем HashMap — коллекцию, которая неявно конвертирует строковые ключи в числовые хеш значения. В случае с миллиардом элементов, HashMap позволит нам найти нужный элемент бинарным поиском за не более чем 30 операций сравнения чисел. Такая задача даже на низкопроизводительном оборудовании будет выполнена почти мгновенно.

Вот и всё! На этом изменения “инфраструктуры” Red Architecutre, а именно класса v, закончены. И теперь мы можем приступить к рассмотрению логики приёма и отображения апдейта ячейки.

Для начала нам нужно зарегистрировать ячейку для приёма апдейта. Код регистрации ячейки представлен в методе OnAppear():

class TableCellView {
    // List and Address are components of identifier for this cell in system (i.e. GUID consisting of two strings)
    private const string List;
    private const string Address;

    handler void OnEvent(string key, object data) {
        string thisCellUpdateKey = string.Format( /* format string */ v.OnCellUpdate, /* arguments for format string */ this.List, this.Address); 
    if(key == thisCellUpdateKey)
        // update content of this cell
        this.CellContent = data.Content;
   }

    // constructor
    TableCellView(string list, string address) {
        this.List = list;
        this.Address = address;
   }

    // cell appears on user’s screen - register it for receiving events
    void OnAppear() {
        string thisCellUpdateKey = string.Format( /* format string */ v.OnCellUpdate, /* arguments for  format string */ this.List, this.Address); 
        v.Add(thisCellUpdateKey, OnEvent);
   }

    // don't forget to "switch off" the cell from receiving events when cell goes out of user's screen
    void OnDisappear() {
        string thisCellUpdateKey = string.Format( /* format string */ v.OnCellUpdate, /* arguments for  format string */ this.List, this.Address);
        v.m(thisCellUpdateKey, OnEvent);
    }
}


При появлении ячейки на экране в методе OnAppear() мы “регистрируем” её для получения событий с уникальным ключом thisCellUpdateKey, который формируется в конструкторе объекта и является производным от форматной строки-ключа v.OnCellUpdate, и который позволяет позже передать данные именно этой ячейке, не вызывая функции обработчики у других ячеек.
А в методе обработчика OnEvent() мы проверяем ключ на соответствие текущей ячейке (на самом деле, в случае с OnCellUpdate эта проверка не обязательна, но поскольку в обработчике мы можем обрабатывать более одного ключа — всё же желательна) и в случае соответствия пришедшего ключа ключу текущей ячейки апдейтим отображаемые данные this.CellContent = data.Content;

Теперь рассмотрим логику получения и передачи данных ячейке

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

class SomeObjectWorkingWithSocket {

    void socket.OnData(data) {
       if(data.Action == SocketActions.UpdateCell) {
         string cellKey = string.Format( /* format string */ v.OnCellUpdate, /* arguments for format string */ data.List, data.Address);
         v.Add(cellKey, data);

         // This call for objects which process updates for any of the cells, for instance, caching data objects
         v.Add(v.OnCellUpdate, data);
       }
   }
}


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

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

  • Сколько времени займёт поиск кода, который нужно «патчить» для решения этой задачи? — Весь связанный код найдётся моментально, главное сказать разработчику, чтобы он поискал по коду v.OnCellUpdate.
  • Сколько времени такая задача займёт у нового человека в нашем случае? — Если удаётся обойтись уже существующим API для решения вопросов отображения и анимации, то 1-2 дня точно хватит.
  • Сколько шансов у нового разработчика сделать что-то не так? — Мало: код простой, разобраться в нём несложно.


Схематично цепочка передачи данных по ключу v.OnCellUpdate выглядит следующим образом



На этом можно было бы закончить, но… К нам пришла задача чтобы мы не только отображали, но и кешировали пришедшие данные. Неужели нам придётся что-то менять в уже написанном или, хуже того, всё переписывать? Нет! В Red Architecture объекты совершенно не связаны друг с другом. К нам пришла задача — добавить функцию, ровно в таком виде эта задача и будет отражена в коде — мы добавим код кеширующий данные без каких-либо изменений того, что уже написано. А именно:

class db {
    handler void OnEvent(string key, object data) {
       if(key == v.OnUpdateCell)
           // cache updates in db
           db.Cells.update("content = data.content WHERE list = data.List AND address = data.Address");
   }

   // constructor
   db() {
      v.h(v.OnUpdateCell, OnEvent);
   }

   // destructor
   ~db() {
      v.m(v.OnUdateCell, OnEvent);
   }
}


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

Вы прочли вторую часть, первая часть здесь.
В следующий раз в рамках Red Architecture мы решим проблемы многопоточности.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334204/


Что необходимо для качественной Web разработки?

Пятница, 28 Июля 2017 г. 12:19 + в цитатник
Какие знания необходимы современному, а главное востребованному веб-разработчику?

За скобками остается базовое умение писать код и всё что связано с умением работать в команде и иные очевидные вещи. Для нашей программы курса «Web-Разработчик», который стартует 5 августа, мы очертили именно следующий круг знаний и скилов, считая их основополагающими в специальности:



Во-первых, код ревью: стоит писать такой код, чтобы он был повторно используем, понятен и прост, сюда относятся DRY, KISS, цикломатическая сложность, читаемость, преждевременная оптимизация, чистые функции, статический анализ, соблюдение style guide и инструменты для отслеживания всего этого. Это как дизайн или психология: каждый считает себя экспертом, но далеко не каждый таковым является на деле — тут важны чёткие принципы, системный подход конечно же практика.

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

Хороший разработчик умеет делать API: может быстро сделать REST на Django, знает хорошие и плохие практики при реализации API, а также понимает для чего может пригодиться GraphQL и какие у него подводные камни. Бекендерам всё чаще приходится делать API и, что важно, уметь делать его правильно.

Кстати, бекендеру придётся тяжело без базового знания фронтенда — было бы очень кстати уметь на коленке собрать минимальный фронтенд для классного бекенда, заверстать его на Bootstrap или Material и оживить с помощью старого-доброго jQuery. Речь не идёт о фулстек-разработчике, но ради любого чиха ждать фронтендера – не самый продуктивный способ вести разработку.

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

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

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

Будет классно, если такой разработчик будет разбираться в асинхронности: как работает, когда нужна, как пользоваться. Тема важная потому что async is new sexy – этот подход позволяет сделать многие вещи быстро и удобно.

Чего по-вашему критически не хватает в этом списке? Может, что-то лишнее? Поделитесь своим мнением и давайте делать отрасль лучше!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334328/


Метки:  

Конструктор

Пятница, 28 Июля 2017 г. 12:15 + в цитатник


Денис Паясь (Яндекс)


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

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

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





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



Но обо всем по порядку.

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



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



В общем, если всех сфоткать, получится примерно так.



Что мы все делаем?

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



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



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



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



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



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



Параллельно с майнингом данных нужно нарисовать для всего этого дизайн.



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



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



После того как фронтендеру кажется, что фичу он сделал, он отдает ее в тестирование, и тестировщик его убеждает, что скорее всего, фронтендер не прав.



Что проверяет тестировщик? Во-первых, что фича корректно работает под всеми платформами. Мы верстаем сразу под десктопы, планшеты, телефоны, под все браузеры, доля которых на SERP (search engine results page) больше чем, по-моему, пол-процента. В общем, это просто огромное количество штук, которое надо проверить. Кроме того у нас достаточно сложная система логирования, и тестировщик проверяет, что разработчик там в ней нигде не накосячил, что все хорошо.

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



После того, как тестировщик все это проверил, он, скорее всего, возвращает задачу фронтендеру на доработку. Фронтендер это дорабатывает, отдает снова тестировщику, и так до победного. Как только тестировщик считает, что все выглядит замечательно, фича катится в production. Плюс-минус так.



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

Фичу мы сделали. Что происходит дальше?



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



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



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



Ладно. Берет, верстает.



Я думаю, вы догадались, что происходит дальше.



Дальше приходит менеджер еще разочек.



Какой-нибудь, тоже с какой-то фичей.





А потом еще один.





И еще разок.И на каждое из этого мы тратили по две недели.



И мы начинаем стоять примерно с таким выражением лица, типа: «Что за фигня происходит? Кажется тут что-то сильно не так!»



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

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

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



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

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

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

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



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



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

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



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



Выглядит оно вот так.Например, тот самый компонент с картинками в ряд, он называется витриной. Дизайнеры теперь уже знают, что у них есть компонент «витрина», и в фичах стараются его реиспользовать. Тут описано, какие поля в нем настраиваются, то есть какое у него API, как его использовать и так далее.



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



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

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



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



А через день может прийти другой менеджер и задать нам вот такую фичу – «маркет».



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



И менеджер начинает выглядеть примерно так: «Чуваки! И тут, и тут общий компонент – мы вроде договаривались о таком подходе, но в одном случае ты будешь его делать два дня, а в другом две недели? Что за фигня?»



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



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



Выглядит это следующим образом.И что нам это дает?

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



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

Кстати, мы выложили в открытый доступ видеозаписи последних двух лет конференции фронтенд-разработчиков Frontend Conf. Смотрите, изучайте, делитесь и подписывайтесь на канал YouTube.

Собираем фичу, сдаем в тестирование, катим в продакшн. Вроде все круто теперь уже, но мы были бы не мы, если бы не пошли еще дальше.



Я тут говорю, что дизайнеры выносят общие компоненты в Depot. А давайте подумаем, какие компоненты вообще могут быть не общими? Серьезно.

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

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

Что дает нам такой подход?



Дает он нам следующее. Если у нас все компоненты общие, то что у нас остается на реализацию непосредственно компоненты под фичу? Что она делает? Оказывается, что при таком подходе компонента под фичу должна делать ровно одно: преобразовывать данные, пришедшие в формате бекенда, в формат, который понимает API компонент «конструктора», зачастую лейаутов, как компонент самых крупных.



Раз так, то компоненты под фичу вырождаются в, по сути, адаптер. Что такое адаптер?



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

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



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



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



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



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



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



Но как этого добиться? Есть одна маленькая проблемка: не все менеджеры, не все аналитики умеют в git, умеют в наш flow, умеют коммитить в репозиторий, делать pull-request и так далее. Но мы очень ленивые, поэтому нам хотелось все-таки, чтобы менеджеры это делали, поэтому мы себя пересилили и сделали следующее.



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



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





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





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



Собственно, к чему мы в итоге пришли?



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

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



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



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

А раз они делают прототипы – какие-то части этих прототипов они могут выносить в общие компоненты.

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

Кроме того мы сделали версионирование компонент у дизайнеров и синхронизацию дизайнерских компонент с нами.

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

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

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

Собственно, к чему я всё это?



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

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

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

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

В общем, на этом наверное – всё.

Можно хлопать, радоваться и задавать вопросы.

ВОПРОСЫ И ОТВЕТЫ


Вопрос:
Адаптеры, которые пишутся не фронтендерами, – они проходят какое-то code review? И как много говнокода появляется в адаптерах?

Ответ:
Смотри, сейчас они какое-то code review проходят, но мы хотим осознанно от этого отказаться.

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

Но тестировщики это проверять конечно все-равно будут, просто just in case.

Вопрос:
У меня два вопроса. Первый: как долго у вас заняло сделать всю эту экосистему вокруг компонентов, адаптеров – до конца? Второй: используют ли ваши дизайнеры git?

Ответ:
Отвечу по порядку.

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

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

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

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

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

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

Примерно так.

Вопрос:
Предыдущий вопрос был близок, если я правильно понимаю, то в Depot у вас хранятся прямо уже готовые HTML-куски, которые можно использовать. То есть дизайнеры по сути их сами готовят?

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

Тут у нас не видно конечно ни фига, но есть список компонентов. Дизайнер смотрит и так далее.

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

Ответ:
Согласен. Смотри, пока это все лежит плоским списком, но есть два «но» больших.

Первое – у нас есть БЭМ, благодаря которому у нас, например, нет двадцати вариантов кнопок – у нас есть одна кнопка с гибко настраиваемым поведением, то есть у нее есть темы, у нее есть какая-то кастомизация, и он нас в этом месте спасает. Хотя иногда действительно дублирование такое происходит, но мы стараемся от него избавляться.

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

Вопрос:
И, соответственно, с того момента, как вы перешли от макетов к прототипам, вы, получается, отказались от понятия pixel perfect, правильно я понимаю?

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

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

Вопрос:
То есть тестировщики в основном проводят такое больше функциональное тестирование?

Ответ:
Компонент на продакшне – да, а в дизайнерские компоненты смотрим только мы, и стараемся реализовывать похожим образом. То есть если, например, у дизайнера сверстана таблица каким-нибудь div c «display: table;», и если у нас нет каких-то возражений, мы делаем так же, чтобы впоследствии при развитии и нам, и им развиваться было примерно одинаково дорого или дешево.

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

Ответ:
Тут смотри, в чем дело, тут дело не в конкретных технологиях, – что тебе нужно взять этот «велосипед» и поставить его у себя, – тут дело в подходе. Даже в тот момент, когда ты начнешь думать о проекте не как: вот у меня есть страница, и мы ее как-то верстаем, – и вот это вот всё; а как реально о наборе компонент, готовых для реиспользования – что бы вы там не использовали, я не знаю, табличку в Excel, например. Это уже скорее всего может вам принести какую-то выгоду.

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

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

Вопрос:
Но каких-то готовых решений в Интернете нет, которые можно заюзать? И вы не выкладываете?

Ответ:
Я, боюсь, не могу вам их предложить, просто потому что у нас стек технологий свой. То есть даже если бы эти решения были, они были бы для БЭМ-стека, что скорее всего вас не устраивает. Поэтому тут, к сожалению, нет.

Вопрос:
Как вы заставили менеджера захотеть самому создавать эти компоненты, вернее их компоновать, писать эти дескрипторы?

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

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

С точки зрения менеджера выбор понятен, мне кажется.

Вопрос:
Вопрос в том, что с адаптером – понятно. Этот компонент надо потом куда-то вывести, то есть нужно определить место и как он вызывается и так далее. Как это происходит? Кто это делает?

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

Вопрос:
А вот эти данные, которые определяют структуру, – они на чьей стороне хранятся, и кто их правит?

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

Вопрос:
То есть появляются данные от бекенда, смотрится если есть адаптер, то это выводится. Если нет – то…

Ответ:
Если нет, то – упс! – ничего не выводится.

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

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

Ответ ведущего:
Мы с Денисом уже обсуждали эту штуку. И там конкретно в Яндексе, они использовали такую странную штуку, как BEM-JSON, и у них все шаблоны были, собственно, вот в этом джейсоне таком. Это сложно, не понятно зачем эта штука была нужна, она такая вся страшная.

Реплика докладчика:
Я тебе расскажу после доклада – хорошая штука.

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

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

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

Ответ:
А! Легко! Легко! Самое важное забыл рассказать.

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

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

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

Вопрос:
Вот эта вся штука внедрена сейчас в SERP, правильно? То есть на одной странице, на одной поисковой выдаче? А планируется ли как-то масштабироваться, то есть на другие проекты, соседние, еще как-то?

Ответ:
Отчасти планируется, но вопрос такой на самом деле – очень по теме и достаточно сложный.

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

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

Ответ ведущего:
Еще и стек технологический на разных проектах немного может отличаться.

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

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

Ответ ведущего:
Через год увидимся, и нам расскажут как это получилось.

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

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

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

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

То что это похоже на Ucoz – да, примерно так. Это очень похоже на CMS, только я не думаю, что в разрезе такого проекта кто-то думал, что похожий подход вообще применим. А он применим так внезапно. Что круто.

Контакты


» lostsoul@yandex-team.ru

Этот доклад — расшифровка одного из лучших выступлений на профессиональной конференции фронтенд-разработчиков Frontend Conf.

С этого года мы решили выделить секцию "Архитектура фронтенда" в отдельный трек на конференции разработчиков высоконагруженных систем HighLoad++. Мы приглашаем докладчиков и слушателей!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329798/


Yota в России: от безлимита до гибких пакетов

Пятница, 28 Июля 2017 г. 12:01 + в цитатник
В 2014 году на российском телекомрынке появился еще один игрок: Yota начала предоставлять услуги мобильной связи. Главной особенностью наших продуктов для смартфона и планшета стал безлимитный интернет. Базовый пакет услуг также включал в себя неограниченное количество минут разговора внутри сети, от 100 минут звонков на внешние номера по России и возможность подключить безлимитные или поштучные SMS. Спектр услуг и география присутствия Yota постепенно расширялись: сегодня наши SIM-карты для смартфонов можно купить в 82 регионах России.
Мы всегда стремимся дать своим клиентам максимально удобный продукт, и сегодня расскажем, как заново придумали услуги для мобильной связи.




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

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

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



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

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

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

Линейка трафика стартует с 1-2 Гб, максимальный пакет включает 30 Гб. Гигабайты из пакета можно раздавать на другие устройства. А если вдруг пакет заканчивается, то всегда можно докупить еще 5 Гб. Например, в Москве дополнительный пакет стоит 100 рублей.

Во-вторых, мы разделили опцию безлимитных мобильных приложений. И теперь неограниченный доступ к самым популярным соцсетям и мессенджерам можно покупать поштучно. На данный момент для безлимитного подключения доступны девять приложений: Facebook+Facebook Messenger, «ВКонтакте», «Одноклассники», Instagram, Twitter, WhatsApp, Viber, Telegram и Skype.

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

Видео

Попробовать сформировать свой оптимальный пакет и посмотреть, сколько он будет стоить, можно на нашем сайте yota.ru.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334326/


Метки:  

Бюджет на эксплуатацию дата-центра: инструкция по составлению

Пятница, 28 Июля 2017 г. 10:42 + в цитатник

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


Все затраты на эксплуатацию серверной/дата-центра мы делим на два типа:


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

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


Давайте смотреть, как собрать каждый из бюджетов.


Операционный бюджет


Это постоянные затраты на ЗИП, расходники, ремонты и ТО, которые закладываются из года в год.


ШАГ 1. Составляем список инженерных систем и самого главного оборудования.


Покажу на примере дата-центра NORD-4:


  • Бесперебойное энергоснабжение: 33 ИБП.
  • Гарантированное энергоснабжение: 12 ДГУ.
  • Система холодоснабжения: 108 кондиционеров.
  • Система видеонаблюдения и пожаротушения.
    Последние два не всегда входят в зону ответственности службы эксплуатации, но в нашем случае тоже учитываем эти системы.

Составляя такой список, важно не забыть про:


  • вспомогательные системы, например, мониторинг, вентиляцию, систему орошения, грузовые подъемники и ворота;
  • то, что, казалось бы, совсем косвенно относится к эксплуатации – клининговые услуги, транспортные расходы, утилизацию отработанных материалов (масло, АКБ).

ШАГ 2. Определяем стоимость и количество расходных материалов и ЗИП по каждой системе.


Если про стоимость деталей понятно – просто запрашиваем у поставщиков или делаем мониторинг предложения на рынке, то с вопросом: “А сколько нам этого надо?” – сложнее. Вот тут нам пригодится статистика по поломкам и ремонтам, о которой я говорю, наверное, на каждом своем семинаре.


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


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



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


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


ШАГ 3. Рассчитываем стоимость работ по каждой системе силами подрядчиков.


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


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


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


ШАГ 4. Сводим все цифры в один excel-файл.


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


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


Инвестиционный бюджет


Это крупные траты на модернизацию и замену оборудования. Для его составления нам понадобится следующее:


  • данные о сбоях и авариях в прошлом году. Смотрим статистику и выявляем слабые звенья. Например, у нас есть постоянно ломающийся кондиционер, которому за последний год 2 раза заменили компрессор. Или другой вариант: на всех кондиционерах ломаются пароувлажнители. В этом случае задумайтесь, не лучше ли заменить этот кондиционер целиком или модернизировать всю подсистему, чем дальше тратить деньги и силы на ремонты.
  • данные об устаревающих элементах системы. Самый простой пример – аккумуляторные батареи. По моему опыту, среднее время работы батарей – 0,7 от заявленного производителем: если обещают 10 лет, то уже через 7 нужно готовиться к замене. Если меняем, то сразу всю линейку. Например, у нас 12 ИБП и 12 стеллажей. Всю замену разбиваем на год: каждый месяц меняем один стеллаж, начав с самой дохлой линейки.
  • все, что нам завернули в прошлом году со словами: “Давай вернемся к этому вопросу через год”. Не забываем про эти обещания и вписываем в новый бюджет. Если это не потеряло актуальности, а не должно.

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


Потом идем со всем этим к начальству, и...


нам предлагают подумать, как это все умножить на 0,8. Без паники. Место для маневров есть.


На чем можно сэкономить


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


  • Не дублируются ли одни и те же работы под разными формулировками.


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


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


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


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


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

Хороший способ урезать бюджет – заняться оптимизацией расходов на ЗИП и расходники. Вот тут внимательно: экономить призываю НЕ за счет отказа от закупки ЗИП. Делаем следующее:


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

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


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

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


На чем нельзя экономить


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


Тестирование. Если хотите спать спокойно, то боевые учения необходимы. Пусть лучше неисправность в оборудовании или системе (а иногда и в процессе) проявится во всей красе под нашим контролем, чем это случится 31 декабря, когда нужные люди будут водить хороводы вокруг елки.
Тестировать нужно правильно. В моем понимании это – комплексно и регулярно. Даже когда тестируем дизель-генераторы, у нас есть возможность попутно проверить систему бесперебойного энергоснабжения, мониторинг и много чего другого (читайте подробнее тут). Если последние 44 тестирования прошли успешно, это не означает, что 45-е можно отложить или отменить.


Сезонные подготовительные работы. В первую очередь это касается системы холодоснабжения. Перед летним сезоном, самое позднее – в апреле, нужно промыть все внешние блоки и чиллеры, проверить правильность установленного ИТ-оборудования в залах, работоспособность резервных кондиционеров (здесь подробно рассказывал, как подготовить дата-центр к лету).
К зиме готовимся в октябре: сливаем все, что может замерзнуть, проверяем подогрев ДГУ.


Закупка ЗИП. Мой опыт показывает, что подрядчика или своего инженера можно быстро вытащить на площадку ночью, в выходные или праздники, а вот привезти нужную деталь со склада так же быстро сложно. Склады живут по своему графику, не 24х7. А еще там просто может не оказаться нужной детали. Тогда ЗИП придется ждать неделями, если не месяцами.
Необязательно дублировать всю инфраструктуру на складе. Достаточно определить те детали, которые часто приходится менять (опять же смотрим статистику), и те, из-за которых вы можете лишиться резерва или вовсе остаться с неработающим оборудованием/системой. Когда пускаем в дело запасы со склада, сразу же закупаем новые, хотя бухгалтерия будет удивленно спрашивать: “Зачем вам новое, вы же только что поменяли?”
И еще момент: список ЗИП – это не константа. Каждый раз будет ломаться что-то новое, не забывайте добавлять это в список будущих покупок для постоянного хранения на вашем складе.
Если не убедил, то вот вам поучительный случай, после которого мы начали закупать и хранить ЗИП у себя.



Склад с ЗИП для системы холодоснабжения на площадке OST.


И последнее напутствие.
Если составление бюджета – наука, то согласование больше походит на искусство, которым, впрочем, тоже можно овладеть. На защите руководство любит задавать каверзные вопросы, типа: “Почему здесь 150, а не 149 тысяч?” Или: “Зачем тебе так много на вентиляторы?” Если вы, не приходя в сознание, сможете ответить с примерами из статистики, откуда берется каждая цифра, то отобьетесь.

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

https://habrahabr.ru/post/334320/


Метки:  

Читаем, слушаем, используем. Гайд по источникам для саморазвития Android-разработчика

Пятница, 28 Июля 2017 г. 10:32 + в цитатник
Пару недель назад я опубликовал “дорожную карту” по развитию для iOS-разработчиков. Теперь, как и обещал, — подобная подборка ресурсов для тех, кто работает с Android. Важный момент — разных источников много, но я выбрал именно те, что постоянно читаю сам, и в чём нахожу пользу. Итак, регулярные рассылки, блоги (личные, коллективные и в видеоформате), подкасты, живые чаты на русском языке, telegram-каналы и огонь-события — всё здесь, под катом.


Блоги


Android Developers Blog
Новости из самого сердца Googleplex, подогретые калифорнийским солнцем.

Google developers
Блог на медиуме: написано для инженеров, написано инженерами. Материалы пишутся либо курируются сотрудниками Google, но это не голос компании, как можно было бы подумать, а личные мнения специалистов. Google developers читают уже 30 000 подписчиков со всего мира.

Материалы об Android на news.realm.io
Много полезного про ось можно узнать на сайте Realm под соответствующим тегом. Здесь регулярно выкладываются записи докладов на актуальные темы. Есть расшифровки и конспекты на английском.

Androiddev на Reddit
Пожалуй, Reddit не нуждается в представлении. У потока androiddev 70000 подписчиков, поэтому обязательно хотя бы иногда заглядывать в топ — там the best of the best.

AndroidPub
Коллективный блог с хорошей редакторской и авторской командой. 17000 подписчиков, приличная частота обновлений (почти каждый день), приятная вёрстка.

Androidhive
Блог разработчика из Индии. Много статей про материальный дизайн, UI и UX. Обновляется нерегулярно.

Styling Android
Блог Марка Элисона, разработчика под Android с более чем семилетним опытом. О чём он? Архитектурные компоненты, обзоры обновлений с точки зрения дизайна, фоны, скрипты. Всё для тех, кто любит, чтобы было красиво.

Android в лицах
Видеоблог про android-разработку. Подходы, практики решения — все это в разговорном формате интервью с известными по всему миру разработчиками.

Telegram-каналы


Android Good Reads
Самые интересные статьи, видео и новости, связанные с Android-разработкой, прямо на экран вашего андроид-смартфона. Не больше трёх материалов в день. У канала 850 подписчиков.

Android ResId
Новости и ресурсы для андроид-разработчиков. Теги: android, testing, AndroidStudio, Java8, performance, Architecture, Kotlin, MultiWindow, RxJava, MVP, MVVM. 1350 подписчиков.

pro.JVM
Канал для разработчиков под JVM и Android. Отборный bytecode и 1000 поклонников.

Рассылки


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

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

#ANDROIDDEV DIGEST
Как анонсирует дайджест его автор, это “рассылка ручной работы”. И действительно, там присутствуют и материалы из корпоративных блогов, и заботливо отобранные тематические посты с крупных порталов, и инфа о небольших проектах и библиотеках. В общем, удовольствие чтения без поиска источников — это уже сделали за нас. Можно предлагать и свои ссылки.

Подкасты


Android Developers Backstage
Подкаст от создателей Android Developers Blog.

The context
Подкаст об андроид-разработке от Артёма Зиннатуллина, Ханнеса Дорфманна и гостей их студии. Перед созданием очередного выпуска создается ветка, где можно предложить темы для обсуждения. А в комментариях к уже вышедшим материалам публикуются отзывы, комментарии и вопросы по теме. Обновляется нерегулярно.

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

Fragmented
Подкаст об андроид-разработке от Донна Фелкера и Каушика Гопала. Однажды эти парни “устали слушать классные подкасты о web и iOS разработке и сделали свой — об Android”. Записи постоянно обновляются начиная с января 2015 года. Подписчики сообщают, что ребята достойны призов в номинациях типа “лучший интервьюер мира об Android”. В общем-то, я с ними согласен. В конспектах внутри много полезных ссылок.

Android Dev
Android Dev — русскоязычный подкаст о разработке под Android во всех её аспектах: от нарезки дизайна до сборки собственных прошивок. Все выпуски тематические. Ведет подкасты Денис Неклюдов. Гости программы — разработчики, которые помнят Android в его Cupcake-версии.

Talking Kotlin
Подкаст про Kotlin (и не только) от JetBrains. Выходит дважды в месяц.

Чаты


Android Good Talks
Обсуждение статей канала Android Good Reads. Споры, холивары, вот это всё.

Android Developers — русскоговорящее сообщество
Общение на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д. 2500 участников.

Pro.jvm
Чат одноименного сообщества разработчиков. Есть и “дочернее” комьюнити для начинающих. 1700 участников.

kotlinlang.slack.com
Обсуждение языка Kotlin в Android. 8600 участников на сегодняшний день. Чат официальный и очень популярный. Инвайты выдают здесь.

События


Mobius
Независимая российская конференция разработчиков мобильных приложений. В ноябре этого года пройдет в Москве. Никакого маркетинга, только технические доклады, хардкор и обсуждение практических задач. Аудитория — разработчики, 80% из которых уровня Middle и Senior. Кстати, сегодня в Android Good Reads появился промокод на покупку билетов на это мероприятие.
Организаторы: JUG.ru.
Периодичность: 2 раза в год.

AppsConf
Конференция проходит в рамках РИТ++ и посвящена технологиям Android и iOS, кроссплатформенной разработке, архитектуре мобильных приложений, клиент-серверному взаимодействию и процессам разработки и тестирования. Выделен день для мастер-классов.
Организаторы: ontico.ru.
Периодичность: ежегодно.

MBLTdev
Грядет уже четвертая конференция мобильных разработчиков MBLTdev 2017. Можно услышать как российских, так и зарубежных докладчиков. Анонсируются мощные доклады по нативной и кроссплатформенной разработке, рассказы о нововведениях и особенностях Android и iOS, а также лабораторные зоны для всех желающих.
Организаторы: e-Legion, РАЭК.
Периодичность: ежегодно.

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

На этом всё. Пользуйтесь этими источниками для развития, дополняйте список в комментариях. Напомню, что анонсы тематических выступлений сотрудников Avito, мероприятий и конкурсов публикуются также на странице AvitoTech в Facebook, телеграм-канале и твиттере.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334264/


Метки:  

[Перевод] Продвинутая тактика игры в «Сапёр»

Пятница, 28 Июля 2017 г. 10:21 + в цитатник
[Пятничный перевод статьи 1999 года одного из авторов движка игры Thief Шона Барретта]

Неприятное положение в «Сапёре»


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


Голубые/розовые — взаимоисключающие пары, светло-/тёмно-зелёные — взаимоисключающие группы

«Сапёр»: логика или вероятность


В «Сапёра» можно играть двумя способами: как в логическую или в вероятностную игру.

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

Но бывают такие ситуации, когда вся логика мира не может вас спасти. Простой пример — ситуация с «T», которую видно внизу по центру. Она немного осложняется дополнительными соседними минами. (В простейшем случае «2» заменяется на «1», а «5» — на «3», чтобы ситуация была симметричной.)

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

Тактика в конце игры


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


Возможные конфигурации мин в правом нижнем углу

Если у вас получилась такая позиция и счётчик говорит, что осталось всего две мины, то ответ готов: это должна быть конфигурация B.

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

На самом деле, шансы в пользу конфигурации B.

Локальные вероятности


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

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


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

Ситуация в правом нижнем углу тоже чем-то похожа: рядом с каждым из чисел на «границе» есть одна мина и две клетки, в которых она может быть.

Если рядом с клеткой есть одна скрытая мина, но три закрытых клетки, то вероятность мины в каждой из клеток составляет 33%; каждая из четырёх закрытых клеток имеет вероятность 25%. Если у нас две скрытые мины и три закрытых клетки, то каждая клетка имеет вероятность 66%.

Вот ситуация с «локальной вероятностью» для всего поля:



Как вы видите, несколько клеток в верхней левой области имеют несколько вероятностей; закрытая клетка рядом с «2» и «6» и одна рядом с «3» и «5». (Клетка рядом с «5» и «6» благодаря им всё равно имеет вероятность 66%, поэтому нет видимого несоответствия.)

Разрешение конфликтов локальной вероятности


Вы наверно, задаётесь вопросом, что значит наличие конфликтующих локальных вероятностей. Интуиция может подсказать, что наибольшая вероятность должна выиграть. Например, клетка между «6» и «2» должна на самом деле иметь 66%. Это будет значить, что у крайней левой клетки с вероятностью 50% она на самом деле равна 33%. Или можно попробовать как-то комбинировать приоритеты: возможно, вероятность будет 5/6 или средним значением.

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

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

Непосредственный подсчёт потребовал бы много времени. К счастью, существуют и другие способы.

Подсчёт конфигураций


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

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


Возможные конфигурации для левого верхнего угла

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

Теперь есть искушение воскликнуть: «ага, вот пять случаев, так что мы можем подсчитать количество случаев для каждой из возможных позиций мины». Например, мина находится в четвёртом ряду (рядом с левой нижней «1») находится слева в двух верхних случаях, и справа в трёх нижних случаях. Поэтому можно решить, что она имеет вероятность в 60% находиться справа, рядом с «6». (Это позиция с конфликтующими локальными вероятностями 50% и 66%.)

Однако мы упускаем одну тонкость — количество мин в некоторых случаях разное: в A1 шесть мин, в B2 — четыре, и по пять во всех остальных случаях.

Считаем ненайденные мины


Для подробного изучения этой тонкости давайте вернёмся к более простой ситуации в правом нижнем углу.


Возможные конфигурации с правом нижнем углу

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

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

Ещё одно искушение — вспомнить, сколько всего было мин и сколько всего клеток, и сказать: «каковы шансы того, что нижняя область 3x3 будет пустой». Это тоже неверно. Очень сложно объяснить, почему это ошибка, наверно, её можно сравнить с парадоксом Монти Холла. Однако достаточно сказать, что в действительности шансы в этой ситуации не зависят от общего количества мин и размера поля.

Правильный ответ таков: сколько возможных конфигураций из трёх мин соответствуют нашим знаниям о поле? Из рисунка мы видим, что две: конфигурации A и B. Но в B всего две мины. Третья мина может быть в любой из клеток нижней области 3x3, о которой мы пока не собрали никаких данных. То есть всего есть девять вариантов конфигураций B, я просто не стал изображать их все.

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

Поскольку каждая из десяти конфигураций (девять для B, одна для A) равновероятны, конфигурация B в данном случае имеет вероятность 90%!

Если бы на этом этапе было четыре мины, то у конфигурации A имелось бы девять вариантов. Конфигурация B имела бы по одному варианту для каждого варианта расположения двух мин в левом нижнем углу; это C(9,2), то есть 9!/((9-2)! * 2!) или 9*8/2, равное 36. В этом случае конфигурация B имела бы вероятность только 75%.

С пятью минами конфигурация A имела бы 36 вариантов, а конфигурация B — 9*8*7/6 = 84 варианта; то есть шансы B были бы чуть больше 66%.

В случае шести мин B имела бы вероятность 60%. С семью минами у B было бы всего 50%. С восемью минами B была бы менее вероятна, чем A; в этом случае с таким количеством мин в оставшихся позициях конфигураций становится меньше. Рассмотрим наихудший случай, когда осталось 11 мин. (Шанс этого чрезвычайно мал, но если такая ситуация возникнет, то применимы эти вероятности.) В конфигурации B, во всех закрытых клетках будут мины, в конфигурации A во всех, кроме одной. То есть существует 9 вариантов для A и всего один для B.

Окончательное решение


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

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

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

Вверху слева Внизу справа Количество мин Осталось мин Закрытые варианты
A1 B 8 0 1
B1 A 8 0 1
B1 B 7 1 12
A2 A 8 0 1
A2 B 7 1 12
B2 A 7 1 12
B2 B 6 2 66
C2 A 8 0 1
C2 B 7 1 12

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

Конфигурация Варианты Процент
A1 1 1
B1 13 11
A2 13 11
B2 78 66
C2 13 11
A 15 13
B 103 87

Далее я обошёл каждую клетку на поле и вычислил её вероятность, суммировав количество вероятностей, в которых она появляется, и поделив на 118. (На самом деле, просто сложив указанные выше проценты.) Кроме того, в среднем в каждой из закрытых клеток есть мина в 15 из 118 вариантов (то есть шансы на то, что по крайней мере в одной закрытой клетке есть мина, очень высоки). [Это можно вычислить умножением количества оставшихся мин на закрытые варианты, что даёт нам среднее количество мин в закрытых клетках.]


Вероятности наличия мины

(Следует сказать, что это не показывает всей доступной информации. Например, мы знаем, что вероятности двух тёмно-зелёных клеток с 87% связаны — если одна верна, то другая тоже. И голубые 13-процентные клетки, в которых есть мины по конфигурации A, тоже связаны. Остальные голубые 13-процентные клетки не связаны. Если в одной из них есть мина, вероятность того, что в любой из оставшихся есть мина, уменьшаются.)

Играем в игру


Скорее всего, играя в «Сапёра», вы не захотите корпеть над всеми этими вычислениями.

И я тоже.

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

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



Восемь раз из девяти я был бы прав.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334216/


Метки:  

«Пятничный формат»: Как погасить пламя или 8 верных способов загубить разработку

Пятница, 28 Июля 2017 г. 10:12 + в цитатник
Быть руководителем технической команды, безусловно, — огромная ответственность. Направляя профессионалов в нужное русло, можно создать по-настоящему гениальные вещи. С тем же успехом их можно уничтожить в зародыше. Об этом наш материал далее.

/ фото Bureau of Land Management CC

Даже самые выдающиеся идеалисты на топовых позициях сталкиваются с нехваткой ресурсов, дедлайнами и боссами, требующими предсказуемых графиков и результатов. В таких условиях фокус смещается с потребностей и настроения подчиненных на сиюминутные задачи. Тем временем успех в IT зависит в первую очередь от людей и идей, а уже после – от технологий. По данным IBM Systems Magazine, 54% неудач IT-проектов связаны с управлением и лишь 3% имеют отношение к техническим проблемам.

С этим согласны даже люди, примерившие на себя роль проект-менеджера. Например, Амр Ноаман Абдель-Хамид (Amr Noaman Abdel-Hamid) в 2003 году занял руководящую должность в IBM благодаря опыту работы в компании и технической подготовке. Однако он сам не считает это решение хорошим, так как в его личной иерархии на первом месте среди необходимых для проект-менеджера качеств стоит способность мотивировать команду.

Кто-то скажет, что высокой оплаты вполне хватит для разжигания энтузиазма. Но в октябре 2012 года известный экономист Дэн Ариэли (Dan Ariely) в рамках TEDTalk заявил, что деньги как исчерпывающий мотиватор для достижения идеальной работоспособности чересчур упрощен. Ариэли наблюдал за группой инженеров одной компании в Сиэтле, которой было предложено реализовать крупный проект. Он был для них не просто работой, но интересной задачей.

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

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

Забудьте о планировании


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

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

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

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

Всех под одну гребенку




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

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

Андреа Гоулет (Andrea Goulet), глава IT-компании Corgibytes, считает, что разработка ПО изобилует стереотипами. Один из них заключается в том, что все разработчики обожают переписывать код с нуля, а не вносить изменения в существующий. На деле же есть два типа профессионалов: «мэйкеры», которые предпочитают работать с «пустым холстом», и «мэндеры», подхватывающие проект на этапе MVP и работают над безопасностью, масштабируемостью, производительностью, корректировкой ошибок и улучшением функций. Это слаженный тандем, на котором строится эффективная командная работа.

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

Удобные инструменты не нужны


С какой стати вам вообще заботиться об облегчении жизни разработчика? Разве кто-то пытается упростить работу проект-менеджера? Однако именно проект-менеджеру следует наладить связи и упростить взаимодействие между отделом разработки и другими сотрудниками.

Мостиками между отделами выступают удобные инструменты, которые позволяют людям различных профессий разговаривать на одном языке. Существует множество решений во всех важных для разработки отраслях. Например, Moqups и InVision помогают дизайнерам в совместной работе над макетами, GitHub и Bitbucket позволяют разработчикам координировать совместную работу над кодом. Если вы не позаботитесь об устранении барьеров между участниками команды и выработкой стандартизированного набора инструментов, проблемы будут лишь накапливаться.

Сосредоточьтесь на мелочах


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

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

Нужно работать, а не учиться


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

Все бы ничего, но, согласно go2HR, в 40% случаев недостатка обучения сотрудники уходят в течение первого года.



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

Консультант во всем разберется


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

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

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

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

Заказчик всегда прав


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

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

Нужно больше совещаний




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

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

Слишком большое количество встреч по незначительным поводам — плохой знак для сотрудников. Фрэнк Келли (Frank Kelly), тимлид в Nokia, считает, что в идеале разработчики должны быть в состоянии самостоятельно наладить связь друг с другом, а встречи не должны носить принудительный характер.

В опросе Industry Week от 2012 года руководители признались, что не менее 30% времени, проведенного на собраниях, потрачено впустую. Поэтому важно выработать для своей команды единый регламент встреч. Например, вы должны договориться о максимальной продолжительности совещания или о том, что обсуждения начинаются, даже если кто-то опаздывает. Приглашайте меньше людей на одну встречу — эффективность снижается с увеличением числа участников. Контролируйте обсуждения, договоритесь не использовать гаджеты, оглашайте повестку митапа заранее, чтобы все участники подготовились. Самое важное — не «мучайте» подчиненных обсуждениями по незначительным поводам. Это не только снижает эффективность, но и влияет на настрой команды.

P.S. Вот еще несколько свежих материалов из Первого блога о корпоративном IaaS:

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

https://habrahabr.ru/post/333690/


Метки:  

Автоматизация CI/CD для Java приложений с помощью Microsoft Visual Studio Team Services

Пятница, 28 Июля 2017 г. 09:54 + в цитатник
Привет, Хабр! На первый взгляд название этой статьи может показаться вам странным: Java и Visual Studio – что между ними общего? Зачем вообще Visual Studio, когда есть множество других классных инструментов для разработки на Java: Eclipse, NetBeans, IntelliJ IDEA и прочих (холивар устраивать не будем). На самом деле, Visual Studio сейчас – это не просто среда для разработки, а целое семейство продуктов, где IDE Visual Studio лишь один из инструментов. Под катом мы поговорим о Microsoft Visual Studio Team Services (VSTS).



Microsoft Visual Studio Team Services – это DevOps облачная платформа, позволяющая гибко выстраивать DevOps процессы непрерывной интеграции, сборки и развертывания (CI/CD). Конечно, тут не обходится без поддержки контроля версий, встроенной системы bag tracking, инструментов Agile планирования и многих других возможностей для разработчиков разных «религий», и «мастей». И, конечно, для разработчиков на Java тоже найдётся полезный функционал для DevOps автоматизации своих решенияй. О том, как им можно эффективно использовать возможности VSTS, и пойдет речь в нашей сегодняшней статье.

На протяжении 20 лет своего существования Java платформа сформировала вокруг себя богатую экосистему из разных инструментов для сборки, развёртывания, тестирования приложений, которыми Java разработчики пользуются в повседневной практике, и многие из которых, по сути, уже стали промышленным стандартом (Maven, Gradle, Ant, JUnit, JMeter и многие другие). И, конечно, у каждого разработчика или команды есть свои предпочтения по выбору инструментов: кто-то привык собирать проект используя Maven, а кто-то, использует Gradle. Основная идея VSTS — предоставить разработчикам возможности, которые позволят выстроить CI/CD процессы максимально гибко, используя знакомые и привычные OSS инструменты для сборки, развертывания, тестирования. VSTS — это облачная платформа (в отличие от Microsoft Team Foundation Server, который развертывается on-premise), однако, благодаря такому механизму как агенты сборки (build agents), о которых мы будем говорить ниже, сборку можно производить, например, on-premise (у вас в ЦОДе), и, конечно, на ваших виртуальных машинах в облаках (Azure, AWS, Google и другие платформы).

Нагляднее всего возможности VSTS можно проиллюстрировать на простом примере Java приложения с полным циклом сборки и развертывания. Сразу оговорюсь, что я не буду описывать полный и детальный step-by-step tutorial, цель данной статьи донести идею использования VSTS платформы для Java DevOps процессов.

Для наших экспериментов вам понадобится учетная запись Microsoft Visual Studio Team Services. Вы можете получить ее бесплатно, используя свой Microsoft Account или, создав новый.

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



Указываем имя проекта, Git как систему контроля версий и создаем новый проект.



После создания проекта, VSTS автоматически создает новый Git репозиторий и предлагает клонировать его на вашу рабочую машину используя Git CLI или клонировать и открыть его в Java IDE, например, IntelliJ IDEA, также поддерживается и Eclipse. Для этих двух IDE есть плагины для интеграции с VSTS.



Мы вернемся к интеграции с IDE в нашей статье чуть позже, а сейчас просто клонируем код из GitHub. Кликаем Import, указываем URL нашего GitHub репозитория (https://github.com/easkerov/SampleJava.git) и завершаем импорт. В нашем случае репозиторий публичный и авторизация не нужна, но, конечно, вы можете использовать и приватные репозитории, указав нужные credentials для доступа.



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

А мы переходим к следующему этапу – сборке нашего приложения. Для этого нам нужно создать Build Definition (определение сборки) в нашем проекте.



В VSTS есть 2 важных понятия, связанных с конфигурированием CI/CD процессов. Это определение сборки (Build Definition) и определение релиза (Release Definition). Оба определения позволяют очень гибко выстроить DevOps процессы через концепцию заданий (tasks). Задания могут быть разных типов: например, сборка проекта в Maven, выполнение Bash скрипта, сборка Docker контейнера, копирование файлов, развертывание приложения в Tomcat контейнере – все это примеры заданий, из которых вы можете собирать ваши CI/CD процессы. При создании определения процесса сборки, можно пользоваться уже готовым шаблоном (template) c заданным набором заданий под определенную задачу (например, сборка проекта в Maven/Gradle) или создать пустое определение сборки и самому определить набор заданий в этом процессе. В нашем случае, мы выберем пустой шаблон (empty template) и сами определим задания в нем.



Порядок сборки и публикации нашего приложение будет следующий: первым шагом мы должны установить все front-end зависимости используя менеджер пакетов Bower, далее собираем наше приложение в Maven, в результате получаем war артефакт, который помещаем в Docker контейнер c Tomcat и публикуем его в Docker Registry (в нашем случае это будет приватный registry на базе Azure Container Registry).



Создав пустой шаблон, мы должны определить в нем необходимые задачи. Каждый шаг нашего CI процесса – это отдельная задача. Например, сборка Bower – это отдельный task, который нам нужно добавить в наш CI pipeline и настроить. Однако, не все задачи доступны в VSTS «из коробки». Например, Bower задачи по умолчанию в VSTS нет. Но, к счастью, есть Visual Studio Marketplace, где Microsoft и сторонние разработчики публикуют VSTS расширения для интеграции с различными инструментами. Установка этих расширений в VSTS предельно простая, достаточно найти нужный модуль и установить его к себе в окружение, кликнув Install и указав свою учетную запись VSTS.



Перед тем, как определить конкретные задания для сборки нашего приложения, необходимо указать где будет происходить сборка нашего приложения. Собирать мы его можем, используя механизм агентов сборки и релиза/развертывания (Build/Release agents) который есть в VSTS. Агенты могут быть двух типов: hosted и private. Hosted агенты использовать проще всего, так как эти окружения (VM) для сборки нам выделяет сама VSTS платформа со всеми вытекающими преимуществами cloud computing (обслуживание, upgrade и т.д.). Причем есть выбор ОС для окружения — это может быть Windows/Linux (последний пока в preview). Но что, если у нас сложный случай, и для окружения, в котором мы будем собирать Java приложение нужна специфическая сложная настройка компонентов сборки (например, нужно определить приватный репозиторий Maven в settings.xml). В этом случае можно самим развернуть окружение (на Linux/Windows/MacOS), установить Private Build Agent и инициировать сборку приложения в нем из VSTS консоли. Причем собственное окружение (VM) может быть развернуто в облаках (Azure, Google, AWS) или в собственном ЦОДе.

Для нашего примера вполне достаточно Hosted агента на Linux машине. Необходимо задать это явно в настройках процесса (Process).



Далее выстраиваем CI процесс, и определяем задачи, которые будут выполняться в нем.



В нашем CI процессе будет 6 задач. Давайте рассмотрим подробнее из чего он будет состоять.

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

Bower.Install. Первая задача, Bower.Install, позволяет нам установить все front-end зависимости используя менеджер пакетов Bower. Для этого нужно лишь правильно настроить параметры задачи. Как видно из скриншота выше, конфигурация простая и не требует специальных комментариев (разве что нужно указать явно --allow-root).

Maven.Build. На втором шаге мы осуществляем сборку приложения, используя Maven task, и pom.xml артефакт из Git репозитория нашего приложения. Кроме имени задачи и Maven goals, можно настроить параметры публикации JUnit тестов, указать настройки JDK (версия, архитектура, настройки памяти и т.д.), а также подключить инструменты для статического анализа кода (SonarQube, Checkstyle, PMD, FindBugs) и покрытия кода (JaCoCo, Cobertura и т.д.).





Docker.ImageBuild. На третьем шаге мы выполняем сборку Docker образа, используя уже готовый Dockerfile из Git репозитория нашего проекта. Для этого шага используется задача Docker task (которая, будет использоваться и на следующем шаге). В качестве Action параметра мы выбираем Build an image и Dockerfile. Дополнительно также можно указать параметры для сборки образа.



Docker.ImagePush. На четвертом шаге происходит публикация собранного нами на предыдущем шаге Docker образа в приватный Docker registry, в качестве registry в нашем случае используется Azure Container Registry (ACR), но вы можете использовать и другие приватные/публичные Docker registry (Docker Hub). Обратите внимание, что здесь мы используем тот же самый Docker task, что и на предыдущем шаге, но Action параметр в этом случае установлен как Push an Image. В качестве имени образа, который собираем и публикуем мы указываем выражение devopsdemoregistry.azurecr.io/javademo:v$(Build.BuildId), где $(Build.BuildId) это переменная с ID текущей сборки.



Приложение мы собираемся развертывать в облачную службу контейнеров Azure Container Service и в качестве системы управления контейнерами будем использовать хорошо известный Kubernetes. Для публикации был заранее подготовлен YAML манифест с описанием deployment и service объектов Kubernetes.

Shell Script. В YAML артефакте нужно правильно определить Docker image, который мы собираемся использовать в deployment. В случае каждой новой сборки помечаем каждый собранный Docker image с нашим приложением используя Build ID в image tag, соответственно и при развертывании, в CD процессе мы должны запускать deployment процесс, используя образ c нужным нам Build Id. Для этого в YAML манифесте нужный образ определяется при помощи подстановки значения параметра, и происходит это на 5 шаге с помощью Shell Script task и Linux команды sed.



Publish Artifact. Наконец, мы подошли к финальному, 6-му шагу нашего CI процесса. Так как приложение запускается в контейнере, Docker image которого мы опубликовали в ACR на 4-ом шаге, никаких других артефактов приложения мы публиковать не будем. Единственный артефакт, который нам необходим для CD процесса это модифицированный YAML манифест для развертывания в Kubernetes. Его мы и будем публиковать на этом шаге. Опубликованный YAML артефакт будет использоваться далее в release definition для развертывания приложения через Kubernetes task.



Наш CI процесс почти сконфигурирован, остается лишь несколько дополнительных настроек, и мы можем проверять процесс сборки. Для запуска CI процесса после каждого изменения в выбранной ветке исходного кода (например, master), необходимо включить опцию Continuous Integration в свойствах Build Definition. Кроме того, одновременно можно включить опцию сборки по расписанию (Scheduled).



Наш build definition готов и сейчас самое время его протестировать. Жмем Save & queue, далее VSTS предложит нам подтвердить настройки сборки, и наслаждаемся процессом.

После размещения сборки в очереди, процессу будет присвоен Build ID, о чем VSTS сообщит нам.



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





Мы публикуем наш Docker image после каждой сборки в Azure Container Registry и открыв Azure Portal консоль, для нашего registry, можем действительно убедиться, что наш образ опубликован.



После завершения CI процесса, мы готовы двигаться далее и настроить CD процесс для нашего Java приложения. Для этого нам необходимо создать новый Release Definition (определение релиза) в нашем проекте.



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



На следующем шаге VSTS предлагает указать проект и определение сборки на основе которого будет происходить наше развертывание. Дополнительно включаем опцию Continuous deployment, что означает что развертывание начнется сразу после успешного окончания сборки (CI процесса) для нашего приложения.



Для CD процесса необходимо выполнить некоторые настройки: дать осмысленное имя определению и CD окружению и выбрать Release Agent который будет использоваться для развертывания. В нашем случае продолжаем использовать Hosted Linux Preview. Обратите внимание на понятие окружения (environment) в контексте Release Definition. Окружения – это логические сущности, которые определяют, где мы будем развертывать приложение. В нашем простом примере — это только Dev окружение, но для промышленных решений сюда могут добавиться Test, Q&A, Stage, Prod окружения и т.д. Соответственно, для каждого окружения может быть свой набор задач, с разными алгоритмами развертывания в разные физические или виртуальные окружения. Кроме того, существует специальный механизм утверждений (approvals), который позволяет не начинать развертывание в следующем окружении до тех пор, пока пользователь или группа пользователей с соответствующими правами не утвердит (или откажет) в продолжении CD процесса. Например, развертывать приложения в Prod после Stage только после утверждения одного или нескольких пользователей.



Теперь мы готовы добавить одну единственную задачу для CD процесса, — Kubernetes task. Однако, по умолчанию этого расширения в каталоге VSTS нет, но снова выручает Visual Studio Marketplace, о котором я уже говорил выше, где его можно найти и установить для своей учетной записи VSTS.



По сути, в Kubernetes task, используется kubectl CLI и при помощи команды apply применяется наш YAML манифест и происходит развертывание приложения в Kubernetes (напоминаю о том, что приложение мы собираемся публиковать в облачную службу контейнеров Azure Container Service).

CD процесс готов и самое время запустить развертывание.



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



Как видно из результатов выполнения, CD процесс завершился успешно и объекты deployment и service созданы в Kubernetes успешно.



Результаты развертывания можно проверить, проверяя статус pods, deployments и services через CLI kubectl. Ну и конечно, просто перейдя в любимом браузере по ссылке: http://:8080



А что еще есть полезного для Java-разработчиков в VSTS?


VSTS поддерживает интеграцию c различными IDE, позволяя разработчикам работать с платформой, по сути не покидая пределы своей среды разработки. То есть просматривать список задач, назначенных на вас, проводить code review, создавать Pull Requests и многое другое, не говоря уже о привычной работе с GIT репозиторием. В настоящее время поддерживается интеграция через plug-ins для популярных Java IDE: IntelliJ IDEA, Android Studio, Eclipse.

Давайте проверим на простом примере, как это работает для IDE IntelliJ IDEA. Для этого нужно установить plug-in для VSTS. Где его скачать, и как установить описано здесь.



Предположим, нам была назначена новая задача из backlog в VSTS и предварительно создана новая ветка Git branch c названием homepage (это операции можно проделать в консоли VSTS). Первым шагом клонируем нужный Git репозиторий на рабочую машину. Проще всего это сделать, используя опцию Clone и выбрав пункт IntelliJ IDEA. Специальный скрипт автоматически запустит IDE и checkout процесс.





Для примера, отредактируем файл index.jsp, добавив новый элемент в список с заголовком Deployment и сделаем commit и push.



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



Следующим шагом создадим pull request прямо в IntelliJ IDEA и укажем в качестве target branch ветки — master. Также мы указываем наш последний commit в качестве изменений и создаем pull request.



После создания pull request, его можно открыть и просмотреть в VSTS консоли в браузере.



Для завершения pull request, его необходимо утвердить (approve). Доступ для утверждения имеют пользователи или группа пользователей со специальными правами в VSTS. После завершения approve процесса, pull request можно завершить (complete).



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



Слияние (merge) изменений в master ветку автоматически инициирует CI/CD процесс сборки, тестирования и развертывания нашего приложения в Azure Container Service. Перейдя в раздел Build&Release, можно отслеживать процесс выполнения сборки и развертывания.



После завершения CI/CD процессов, открываем любимый браузер и наслаждаемся изменениями в приложении.



Часто задаваемые вопросы


  1. У меня CI процесс построен в Jenkins, зачем мне VSTS? Jenkins и VSTS хорошо интегрируются и дополняют друг друга. Например, вы можете продолжать использовать Jenkins Server для CI сборок (on-premise или в облаках), а для CD процессов использовать VSTS. Более того, у вас может быть сложный CI процесс, где сборка в Jenkins представляет собой лишь часть определения сборки в VSTS. Интеграция Jenkins с VSTS осуществляется при помощи специального Team Foundation Server Plugin модуля.
  2. А что с нагрузочным тестированием? Могу ли я использовать JMeter в VSTS? Да, Apache JMeter доступен уже «из коробки» в VSTS. Как его использовать можно посмотреть в документации.
  3. Могу ли я написать собственное расширение для VSTS? Да, можете, доступен специальный SDK для разработчиков. Подробную информацию можно посмотреть здесь: Write your first extension for Visual Studio Team Services.
  4. Где найти дополнительные материалы и примеры про Java-разработку в VSTS? Для Java-разработчиков существует отдельный портал с информацией, примерами, tutorials, на тему использования VSTS в Java разработке: http://java.visualstudio.com/. Ну и конечно доступна официальная документация по VSTS.

Заключение


В данной статье был рассмотрен лишь простой пример использования VSTS в Java DevOps и некоторые аспекты не были рассмотрены детально, например, интеграция с инструментами покрытия кода (JaCoCo, Cobertura) и статического анализа кода (SonarQube, PMD, CheckStyle и так далее). Как я отмечал в начале статьи, самое большое преимущество VSTS платформы для разработчиков – это ее гибкость, универсальность, расширяемость и простота и тут девиз «Any Developer, Any Language, Any Platform» полностью себя оправдывает!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334270/


Метки:  

Настройка аутентификации в Citrix XenDesktop 7.x c использованием смарт-карт JaCarta PKI

Пятница, 28 Июля 2017 г. 09:51 + в цитатник
Настоящая статья описывает процесс настройки двухфакторной аутентификации с использованием смарт-карт JaCarta PKI разработки компании «Аладдин Р.Д.» в виртуальной среде Citrix XenDesktop версии 7.x.

JaCarta PKI – линейка USB-, MicroUSB-токенов или смарт-карт для строгой двухфакторной аутентификации пользователей при доступе к защищённым информационным ресурсам предприятия, безопасного хранения ключей, ключевых контейнеров программных СКЗИ.

Преимуществами использования решений «Аладдин Р.Д.» с продуктами Citrix являются:

  • защищённый доступ к виртуальным рабочим столам и приложениям, возможность многофакторной аутентификации в XenApp/XenDesktop;
  • поддержка Netscaler Gateway;
  • возможность работы со смарт-картами и USB-токенами после аутентификации в VDI сессии Citrix с любыми приложениями, поддерживающими эти устройства;
  • возможность как встраивания решений Citrix в существующую инфраструктуру открытых ключей (PKI), так и наоборот — встраивания PKI в существующую виртуальную среду Citrix.

Аутентификация в виртуальной среде Citrix по смарт-картам и USB-токенам JaCarta от «Аладдин Р.Д.» основана на инфраструктуре открытых ключей (PKI) и цифровых сертификатах стандарта X.509, хранящихся на этих устройствах. Решения соответствуют мировым стандартам, требуется лишь настройка без сложных программных интеграций.

Все модели смарт-карт и USB-токенов JaCarta выполнены на основе смарт-карточного микроконтроллера, имеющего специальные встроенные средства защиты от клонирования, взлома и других специальных атак (secure by design).

Краткое описание инфраструктуры демо-стенда



  • Microsoft Windows Server 2008 R2 – сервер с ролью контроллера домена (DC.aladdin.local)
  • Microsoft Windows Server 2008 R2 – сервер с ролью центра сертификации Microsoft Certification Authority (MS CA) (CA.aladdin.local)
    • JC Client 6.24.16

  • Microsoft Windows Server 2008 R2 – компоненты программного обеспечения (ПО) XenDesktop (Citrix Director, Citrix License Server, Citrix Studio, Citrix StoreFront, Citrix Delivery Controller) (XD7.aladdin.local). Данные компоненты могут быть установлены на разных серверах
    • ПО Citrix XenDesktop 7.0

  • Microsoft Windows 7 64-bit – тестовый ПК пользователя (Test2.aladdin.local)
    • Citrix Receiver 4.0.0.45893
    • JC Client 6.24.16

  • Microsoft Windows 7 32-bit – тестовая эталонная машина – «золотой» образ, с которого будут развёрнуты виртуальные машины для пользователей (win7x32.aladdin.local)
    • Citrix Receiver 4.0.0.45893
    • JC Client 6.24.16
    • Virtual Delivery Agent


Создание виртуальных машин



1. Создание каталога виртуальных машин


Перед созданием каталога для виртуальных машин необходимо подготовить эталонную машину. В данном тестовом окружении – это виртуальная машина с операционной системой (ОС) Windows 7 (32-bit).
Для подготовки эталонной машины на неё необходимо установить ПО Virtual Delivery Agent (дистрибутив которого расположен на диске с ПО XenDesktop 7.0), JC Client 6.24.16 (установка и настройка ПО JC Client 6.24.16 описаны в документе «JC-Client — Руководство администратора»), а также другое ПО, которое необходимо для работы пользователей данной группы. После установки виртуальную машину необходимо выключить.

Cоздание каталога для виртуальных машин

На сервере, где установлен компонент Citrix Studio (установка и настройка ПО Citrix XenDesktop 7.x описана на сайте http://support.citrix.com/proddocs/topic/xendesktop-71/cds-install-config-intro.html), запустите Citrix Studio (Start -> All Programs -> Citrix), подключитесь к Citrix Delivery Controller и перейдите в Machine Catalogs, запустите мастер создания каталога Create Machine Catalog (рис. 1).


Рис. 1 — Окно «Create Machine Catalog»

Нажмите Next.

Выберите пункт Windows Desktop OS или другой пункт в зависимости от настроек Ва-шей среды (рис. 2).


Рис. 2 — Окно выбора операционной системы для каталога

Нажмите Next.

Выберите пункт Virtual Machines и Machine Creation Services (MCS) (рис. 3).


Рис. 3 — Окно выбора способа доставки виртуальной машины

Нажмите Next.

В окне Desktop Experience настройте параметры рабочих столов для пользователей и способ хранения пользовательских данных так, как показано ниже (рис. 4). Могут быть выбраны другие параметры в зависимости от настроек Вашей среды и требуемых задач.


Рис. 4 — Окно настроек параметров виртуальной машины

Нажмите Next.

Из списка доступных виртуальных машин выберите ранее созданную эталонную машину (рис. 5).


Рис. 5 — Окно выбора эталонной машины

Нажмите Next.

Задайте количество виртуальных машин в каталоге и задайте их технические характеристики (рис. 6).


Рис. 6 — Выбор параметров виртуальных машин пользователей

Нажмите Next.

Настройте схему для автоматического добавления учётных записей созданных машин в службу каталогов Active Directory (AD) (рис. 7).

Для простоты администрирования можно предварительно создать организационный модуль (OU) в службе каталогов AD, куда будут добавлены учётные записи создаваемых виртуальных машин.


Рис. 7 — Окно «Active Directory Computer Account»

Нажмите Next.

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


Рис. 8 — Окно «Summary»

Нажмите Finish.

Каталог виртуальных машин создан (рис. 9).


Рис. 9 — Созданный каталог виртуальных машин

2. Создание группы пользователей виртуальных машин — Delivery Group


Для связи созданных виртуальных машин с пользователями, необходимо настроить группу пользователей виртуальных машин (Delivery Group).

Откройте консоль управления Citrix Studio и перейдите во вкладку Delivery Group -> Create Delivery Group (рис. 10).


Рис. 10 — Окно «Delivery Group»

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


Рис. 11 — Окно «Machines»

Нажмите Next.

Выберите тип доставляемых ресурсов: приложения или виртуальные машины (рис. 12).


Рис. 12 — Выбор «Delivery Type»

Нажмите Next.

Назначьте пользователей, с которыми будут связаны виртуальные машины (рис. 13).


Рис. 13 — Окно выбора пользователей

Нажмите Next.

ПО Citrix Receiver настраивается позднее (см. раздел 2.5).

В следующем окне выберите пункт Manually, using a StoreFront server address that I will provide later (рис. 14).


Рис. 14 — Окно настройки «Citrix StoreFront»

Нажмите Next.

Проверьте итоговые настройки и определите название группы (рис. 15).


Рис. 15 — Окно «Summary»

Нажмите Finish.

Группа пользователей виртуальных машин создана (рис. 16).


Рис. 16 — Созданная «Delivery Group»

Внимание: Убедитесь в том, что все виртуальные машины в пуле зарегистрированы (имеют статус Registered (рис. 17)).


Рис. 17 — Окно статуса виртуальных машин

3. Проверка доступности виртуальных машин


Перейдите на рабочую станцию (ПК) пользователя. Это Windows 7 x64 с предустановленным JC Client 6.24.16.

Откройте браузер и в адресной строке укажите путь к Web-интерфейсу ПО Citrix XenDesktop: http://xd7.aladdin.local/Citrix/StoreWeb/ (рис. 18).

Если ПО Citrix Receiver не установлено, отобразится окно установки ПО Citrix Receiver (рис. 19).

Нажмите Установить.


Рис. 18 — Web-интерфейс ПО XenDesktop


Рис. 19 — Установка ПО Citrix Receiver

Введите Логин и Пароль учётной записи пользователя в службе каталогов AD. Данная учётная запись должна входить в группу пользователей виртуальных машин, которая была создана в разделе 1.2 (рис. 20).


Рис. 20 — Окно аутентификации пользователя на Web-интерфейсе ПО XenDesktop

Убедитесь в том, что виртуальная машина доступна, после чего завершите сеанс пользователя (рис. 21).

(Пуск -> Выйти из системы)


Рис. 21 — Виртуальная машина пользователя

Настройка аутентификации по смарт-картам



1. Выпуск сертификата для IIS


На сервере, где установлено ПО XenDesktop 7, запустите оснастку управления сервисом Internet Information Services (IIS) (рис. 22).


Рис. 22 — Путь к оснастке управления сервисом IIS

Откройте вкладку Server Certificates (рис. 23).


Рис. 23 — Оснастка управления сервисом IIS

Выберите Create Domain Certificate (рис. 24).


Рис. 24 — Вкладка «Create Certificate»

Заполните информацию об организации для выпускаемого сертификата (рис. 25).

В поле Common name укажите полное доменное имя сервера с установленным ПО XenDesktop. В настоящем примере: xd7.aladdin.local.


Рис. 25 — Данные об организации в выпускаемом сертификате

Выберите центр сертификации организации и в поле Friendly name укажите полное доменное имя сервера с установленным ПО XenDesktop. В настоящем примере: xd7.aladdin.local (рис. 26).


Рис. 26 — Выпуск сертификата для сервиса IIS

Нажмите Finish.

Убедитесь в том, что сертификат выпущен успешно (рис. 27).


Рис. 27 — Результат выпуска сертификата

2. Настройка SSL доступа к IIS


Перейдите на вкладку Default Web Site и нажмите Bindings…

В открывшемся окне нажмите Add (рис. 28).


Рис. 28 — Окно настройки «Site Bindings»

Выберите тип соединения https, а в списке SSL certificate выберите ранее выпущенный сертификат для IIS (рис. 29).

В настоящем примере имя сертификата: xd7.aladdin.local.


Рис. 29 — Окно «Add Site Binding»

Нажмите OK.

Убедитесь в том, что данный тип соединения добавлен в список (рис. 30).


Рис. 30 — Результат настройки типа соединения

Закройте окно «Site Bindings».

3. Настройка Citrix StoreFront


Внимание! При работе с StoreFront в многосерверных установках используйте только один сервер при внесении изменений в настройки. Убедитесь в том, что консоль управления Citrix StoreFront не выполняется на другом сервере или серверах данной серверной группы. После завершения конфигурирования убедитесь в том, что изменения применились на все серверы группы (propagate your configuration changes to the server group).

Запустите Citrix Studio. Во вкладке Citrix StoreFront откройте вкладку Authentication (рис. 31).


Рис. 31 — Вкладка «StoreFront Authentication»

Выберите пункт Add/Remove Authentication Methods.

Откроется окно Add/Remove Methods (рис. 32).

Выберите метод аутентификации Smart card.


Рис. 32 — Окно «Add/Remove Authentication Methods»

Нажмите OK.

Убедитесь в том, что на вкладке Authentication добавился метод аутентификации Smart card (рис. 33).


Рис. 33 — Результат изменения методов аутентификации

Откройте Default Web Site -> Citrix -> Authentication -> Certificate (рис. 34).


Рис. 34 — Вкладка Certificate Home

Выберите пункт SSL Settings -> Require SSL. Отметьте параметр Require (рис. 35).


Рис. 35 — Настройки SSL Settings

Для проверки правильности SSL-настроек необходимо выполнить следующую последователь-ность действий:

  • подключитесь к ПК пользователя;
  • подключите смарт-карту с сертификатом пользователя к ПК пользователя;
  • откройте браузер;
  • в адресной строке укажите путь к странице с тестовым приложением. В настоящем примере — https://xd7.aladdin.local/Citrix/Authentication/Certificate/test.aspx.

Вместо xd7.aladdin.local необходимо указать полное доменное имя сервера с ПО Citrix XenDesktop.

Отобразится следующее окно, в котором необходимо выбрать сертификат пользователя (рис. 36).


Рис. 36 — Окно запроса сертификата пользователя

Выберите сертификат пользователя и нажмите OK.

Отобразится следующее окно (рис. 37).


Рис. 37 — Окно запроса PIN-кода для смарт-карты пользователя

Введите PIN-код смарт-карты пользователя и нажмите OK.

Если SSL соединение установлено успешно, то Вы увидите на открывшейся странице информацию о сертификате пользователя (рис. 38).


Рис. 38 — Окно проверки сертификата пользователя

Подключитесь к серверу с установленным ПО Citrix XenDesktop и выполните настройку протоколов связи для SSL.

Запустите консоль управления Citrix Studio. Для этого откройте ПО Citrix StoreFront и выберите вкладку Server Group. Выберите пункт Change Base URL и измените значение http на https (рис. 39).


Рис. 39 — Окно «Change Base URL»

Нажмите OK.

Перейдите на вкладку Stores (рис. 40).


Рис. 40 — Вкладка «Stores»

Выберите пункт Manage Delivery Controllers.

В открывшемся окне нажмите Edit (рис. 41).


Рис. 41 — Окно «Manage Delivery Controllers»

В поле Transport type замените HTTP на HTTPS (рис. 42, рис. 43).


Рис. 42 — Окно «Edit Delivery Controller» с значением HTTP


Рис. 43 — Окно «Edit Delivery Controller» с значением HTTPS

Нажмите OK.

Убедитесь в том, что в поле Status появилось значение Service using HTTPS (рис. 44).

Внимание: После применения настроек необходимо выполнить перезагрузку сервера с ПО Citrix XenDesktop.


Рис. 44 — Значение поля Status

4. Настройка XML-запросов


Необходимо разрешить XML-запросы к серверу с установленным ПО Citrix XenDesktop. Для этого выполните следующие действия.

На сервере с установленным ПО Citrix XenDesktop откройте командную строку Windows PowerShell (рис. 45).


Рис. 45 — Путь к командной строке «Windows PowerShell»

В открывшейся командной строке выполните команду:

Set-BrokerSite -TrustRequestsSentToTheXmlServicePort $true (рис. 46)


Рис. 46 — Командная строка «Windows PowerShell»

5. Настройка ПК пользователя


Подключитесь к ПК пользователя. Откройте ПО Citrix Receiver и добавьте строку подключения к серверу, с опубликованными рабочими столами и/или приложениями (рис. 47).


Рис. 47 — Добавление адерса сервера в ПО Citrix Receiver

Для обеспечения корректной работы необходимо, чтобы адрес сервера с ПО Citrix StoreFront был добавлен в доверенные (Trusted) или локальные (Local Intranet) сайты в используемом браузере. В настройках уровня безопасности для каждого из вариантов необходимо убедиться в том, что включена настройка Automatic logon with the current user name and password. Рекомендуется использовать браузер – Internet Explorer 9.0 и выше.

Если адрес сервера указан верно, а смарт-карта с сертификатом подключена к USB-порту ПК пользователя, откроется окно с запросом PIN-кода пользователя (рис. 48).


Рис. 48 — ПО Citrix Receiver: запрос PIN-кода для смарт-карты пользователя

Введите PIN-код пользователя (рис. 49).


Рис. 49 — Ввод PIN-кода пользователя

Подключение к серверу приложений (рис. 50).


Рис. 50 — Подключение к серверу приложений

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

В настоящем примере выберите Win7x32 (рис. 51).


Рис. 51 — Список доступных приложений

Для входа в ОС Windows на виртуальной машине необходимо ввести PIN-код на ключевой носитель пользователя (рис. 52).


Рис. 52 — Аутентификация по смарт-карте на удалённом рабочем столе

Аутентификация прошла успешно (рис. 53).


Рис. 53 — Успешная аутентификация по смарт-карте в удалённом рабочем столе

Настройка сквозной аутентификации по смарт-карте


1. Порядок настройки Single Sing-On при аутентификации по смарт-карте при использовании ПО XenDesktop 7


Внимание: Для корректной работы сквозной аутентификации по смарт-картам необходимо, чтобы конечное устройство пользователя (ПК пользователя) было добавлено в домен, в котором находятся инфраструктурные серверы с установленным ПО Citrix XenDesktop 7 (Delivery Controller, StoreFront и тд.) или, при использовании нескольких доменов, между доменами были настроены доверительные отношения.

Настройка Single Sign-on (SSO) для аутентификации по смарт-карте при использовании ПО XenDesktop7 состоит из нескольких этапов.

Создание каталога виртуальных машин.

Создание группы пользователей виртуальных машин.

Установка ПО Citrix Receiver 4.0 и выше на ПК пользователя.

Настройка политик аутентификации ПО Citrix XenDesktop.

Выпуск сертификата для IIS и настройка SSL доступа к IIS.

Настройка XML-запросов к серверу с установленным ПО XenDesktop 7.

Настройка ПО Citrix StoreFront 2.1 для включения SSO при аутентификации по смарт-картам.

Настройка ПК пользователя (стр. 34).

2. Установка и настройка ПО Citrix Receiver 4.0 для включения SSO при аутентификации по смарт-картам.


Для настройки сквозной аутентификации по смарт-картам на Citrix Receiver 4.0 необходимо выполнить установку Citrix Receiver 4.0 с дополнительными параметрами. Установка Citrix Receiver 4.0 выполняется из командной строки:

  • на ПК пользователя запустите утилиту командной строки CMD с правами администратора;
  • в командной строке указать путь к файлу установщика Citrix Receiver 4.0 и дополнительно указать параметры для включения SSO: /includeSSON AM_SMARTCARDPINENTRY=CSP; Пример: C:\Distr\CitrixReceiver.exe /includeSSON AM_SMARTCARDPINENTRY=CSP
  • дождитесь окончания установки ПО Citrix Receiver 4.0 и перезагрузите ПК пользователя;
  • после перезагрузки ПК пользователя проверьте, что в исполняемых про-цессах (Task Manager/Processes) присутсвует процесс ssonsrv.exe;
  • выполните настройку политик аутентификации для ПО Citrix XenDesktop, которые будут применяться на серверы Citrix и устройства пользователей, как описано в разделе 3.3.


Подробную информацию для настройки аутентификации по смарт-картам можно найти на сайте электронной документации: http://support.citrix.com/proddocs/topic/receiver-windows-40/receiver-windows-smart-card-cfg.html. Для настройки параметров сквозной аутентификации необходимо обратить внимание на следующие разделы: To enable single sign-on for smart card authentication, To use CSP PIN prompts.

3. Настройка политик аутентификации для ПО Citrix XenDesktop


Настройку политик рекомендуется выполнять через групповые политики службы каталога Active Directory. Также настройку можно осуществить из оснастки управления локальными политиками.

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

  • в шаблоны групповых политик службы каталога Active Directory им-портируйте шаблон политик Citrix ADM Template (Add Template в оснастке управления групповыми политиками); Шаблон политик можно найти в папке установки клиента ПО Citrix Receiver: C:\Program Files (x86)\Citrix\ICA Client\Configuration\icaclient.adm.
  • создайте политику (или отредактируйте имеющуюся) и включите сквозную аутентификацию по смарт-картам;
  • откройте раздел Computer Configuration -> Policies -> Administrative templates -> Classic -> Citrix Components -> Citrix receiver -> User Authentica-tion;
  • выберите настройку Smart Card Authentication и включите параметры «Allow smart card authentication» и «Use pass-through authentication for PIN». Выберите настройку Local User Name and Password и включите параметры «Enable pass-through authentication» и «Allow pass-through authentication for all ICA connections» (рис. 54, рис. 55).


Подробная информация доступна на сайте — http://support.citrix.com/proddocs/topic/ica-settings/ica-settings-wrapper.html


Рис. 54 — Настройка групповых политик AD для SSO


Рис. 55 — Настройка групповых политик службы каталога AD для SSO

4. Настройка ПО Citrix StoreFront 2.1 для включения сквозной аутентификации по смарт-картам


Внимание: При работе с ПО Citrix StoreFront в многосерверных установках используйте только один сервер при внесении изменений в настройки. Убедитесь в том, что консоль управления Citrix StoreFront не выполняется на другом(их) серверах данной серверной группы. После завершения конфигурирования убедитесь в том, что изменения применились на все серверы группы (propagate your configuration changes to the server group).

Для настройки ПО Citrix StoreFront для работы SSO при аутентификации по смарт-картам необходимо выполнить следующие действия на сервере с установленным ПО Citrix StoreFront:

  • выполните первоначальную настройку ПО Citrix StoreFront 2.1, со-гласно разделу —Настройка Citrix StoreFront;
  • в разделе Add/Remove Authentication Methods добавьте метод аутентификации Domain pass-through (рис. 56);


    Рис. 56 — Настройка метода аутентификации

  • для включения сквозной аутентификации с использованием смарт-карт необходимо внести дополнительные изменения в конфигурацию. Для этого отредактируйте default.ica для каждого ПО Citrix Store, где требуется сквозная аутентификация по смарт-картам;
  • используя текстовый редактор, откройте файл default.ica, который находится в папке:
    C:\inetpub\wwwroot\Citrix\storename\App_Data\;
  • если в инфраструктуре не используется аутентификация через NetScaler Gateway, то добавьте следующий параметры
    [Application]: DisableCtrlAltDel=Off.
    Данная настройка будет применяться для всех пользователей;
  • для включения сквозной аутентификации по смарт-картам с использованием NetScaler Gateway добавьте следующий параметр:
    [Application]: UseLocalUserAndPassword=On; Подробная информация доступна на сайте: http://support.citrix.com/proddocs/topic/dws-storefront-21/dws-configure-conf-smartcard.html.
  • выполните настройку пользователя, согласно разделу — Настройка ПК пользователя (см. раздел 2.5). Проверьте, что вход на виртуальную машину пользователя выполняется успешно. Проверьте, что после входа на ПК пользователя (по смарт-карте или по паролю) больше не появляется окно запроса учётных данных или PIN-кода при доступе к StoreFront или/и виртуальной машине пользователя.


В качестве итога хочется ещё раз отметить преимущества применения строгой двухфакторной
аутентификации в VDI с использованием решений «Аладдин Р.Д.»:

  • повышение общего уровня безопасности, что происходит за счёт отказа от простых паролей и перехода к строгой аутентификации с использованием второго фактора;
  • обеспечение защищённого доступа к виртуальным рабочим столам и приложениям;
  • возможность работы со смарт-картами и USB-токенами после аутентификации в защищённой сессии;
  • возможность использования электронной подписи;
  • поддержка RSA- и ГОСТ-алгоритмов;
  • дополнительные преимущества — одна и та же карта, помимо основных функций аутентификации и ЭП, может служить пропуском в помещение (наличие RFID-метки), также может являться зарплатной (платёжное приложение MasterCard или VISA) или транспортной картой;
  • доступны и другие варианты кастомизации — нанесение логотипа и использование
    корпоративного стиля заказчика.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334322/


С днем системного администратора

Пятница, 28 Июля 2017 г. 09:11 + в цитатник
С днем системного администратора! Поздравляю всех с праздником.

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

Ну и традиционно первый тост за localhost!

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

https://habrahabr.ru/post/334318/


Метки:  

[Перевод] «Алекса, пожалуйста, убей меня уже»: разговорные интерфейсы

Пятница, 28 Июля 2017 г. 09:02 + в цитатник
image

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



Размышления на тему разговорных пользовательских интерфейсов


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

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


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


image

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


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


Множество людей, включая меня, полагают, что этот фантастический мир останется недостижимой химерой.


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


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


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


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


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

В моей машине — атрибуте реального мира — все происходит немного по-другому. «Позвони Роберту». «Извините, я не понимаю». «Позвони Роберту». «Извините, я не понимаю». «Набери номер Роберта». «Вы имеете в виду Роберта Джонса, 555-543-1298». «Да». «Готова». «Набирай номер». «Набираю номер». И в этот момент я понимаю, что пока был занят этим избыточным проговариванием, я пропустил свой съезд. С точки зрения основного постулата проектирования взаимодействия, любая голосовая команда пользователя должна считаться критически важной, и ровно поэтому большая часть автомобильных систем голосового управления не используется ни разу после того, как машина покидает автосалон.


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


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


***


Один из моих любимых фильмов — «Разговор» (The Conversation) Фрэнсиса Форда Копполы. Этот мрачноватый бриллиант, на самом деле, очень глубокий и личный фильм великого режиссера, выпущенный в 1974 году сразу после триумфа фильма жизни Копполы, «Крестного отца». В целом, как и любая хорошая детективная история в жанре нуара, это фильм про характеры, маскирующийся под расследование убийства. И, почему я вообще о нем говорю — все в этом фильме (персонажи, сюжет, тема, определение того, кто хороший парень, а кто плохой) завязано на интерпретацию того, как было произнесено одно-единственное слово.

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

https://habrahabr.ru/post/334316/


Метки:  

Тут вам не DevOps: судьба сисадмина в малом бизнесе

Пятница, 28 Июля 2017 г. 09:00 + в цитатник
Наш контент-менеджер, проработав два года инженером и 10 лет в ИТ, обычно вспоминает о Дне системного администратора и Дне программиста едва ли не в 22:00 накануне. В этот раз нам повезло — мы сами вспомнили о празднике в среду и стали планировать прекрасную последнюю пятницу июля. Между делом задумались — а какой он, системный администратор-2017? Что он делает, как мирится с облаками, как выживает среди софтверного и аппаратного разнообразия? Собрались, поговорили, обсудили наблюдения. Получилось интересно — излагаем литературно и с чек-листом, хотя живое обсуждение было прикольнее.


Cat-tube.ru

Наша компания в силу особенностей продукта (десктопная CRM-система для МСБ) не ходит на встречи в Газпром и Почту России, не носит галстуки и не подписывает меморандумы о меморандумах. Проще говоря, мы пашем — автоматизируем компании микро, малого и среднего бизнеса по всей России и странам СНГ. А они потом зарабатывают больше за счёт ускорения процессов, порядка в рутине, планирования, управления задачами и клиентами и т.д.

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

Agile, Machine Learning, DevOps — делаем, но не слышали


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

  • Сисадмин + разработчик в одном лице или же системный администратор в составе микро-команд разработки. Это DevOps, непрерывная разработка и развёртывание ПО на аппаратном обеспечении. Очень полезная штука, тесно увязывает разработку и эксплуатацию, помогает выпускать продукт быстро и без критических и мажорных багов на продакшене. Мы в RegionSoft так делали с первого дня разработки (а это 11 лет) — ещё тогда, когда слово DevOps не гремело по миру ИТ. Кстати, элементы Agile и даже экстремального программирования у нас тоже есть.

  • Сисадмин-менеджер — человек, который знает, как устроена инфраструктура, но она вся вынесена в облако, поэтому он владеет SAM, подписывает SPLA и контролирует расходы на поддержание ИТ-службы. Его задача — оптимизировать затраты, выбивать бюджеты, следить за количеством и профилем использования лицензий. За парком оборудования чаще всего следят его коллеги.

  • Сисадмин-носитель лучших практик. Кстати, лучшие практики ITSM и ITIL в частности — отличные вещи, которые стоит внедрять в компании абсолютно любого размера. Это не значит, что вам нужны все процедуры и знание всех томов, — достаточно взять на вооружение базовые принципы и следовать им. Результат не заставит себя ждать. Так вот, системный администратор с пониманием лучших практик всегда умеет выстроить ИТ-службу компании (даже трёх человек) как мощную команду внутри команды: управляет инцидентами, следит за обработкой тикетов, накапливает базу знаний и т.д.


    Сисадмины всех типов бывают не в духе

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

  • Сисадмин-безопасник — последний в списке, но трендовый и нужный специалист. WannaCry и Petya не на шутку напугали бизнес всех уровней и внезапно в памяти руководителей стали всплывать понятия «бэкап», «антивирус», «кейлоггер», «обновление системы» и т.д. К тому же, облачные технологии и web-интерфейсы ПО добавляют задачи, которые необходимо решить. Нередко именно на такого человека возлагается контроль за средствами доступа в помещение и контроля физической безопасности (камеры, сканеры, турникеты, магниты, трекеры и проч.) Такой системный администратор не просто следит за состоянием ИТ-инфраструктуры, он способен сделать её безопасной и умеет использовать и правильно сочетать аппаратные и программные методы защиты, в том числе и от одного из самых опасных агентов — нелояльного внутреннего сотрудника компании.

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

Но по-прежнему самый распространённый тип системного администратора в малом и среднем бизнесе — системный администратор обыкновенный. Это те парни, которые не успевают писать скрипты, не следят за SLA и никак не могут внедрить принципы ITIL, потому что «он один, а пользователей много». Таких ребят легко узнать — даже на обеде из одного кармана у них торчит мобильник, а из другого — внутренний радиотелефон с коротким номером, который все сотрудники знают чётче, чем 01, 02, 03 и 112. В этом телефоне — все тикеты, заявки, проблемы и инциденты.


Home, sweet home

Сисадмин в корпоративной среде: ад пуст, все демоны здесь


Корпоративная среда, особенно не в девелоперской компании, — большое испытание для системного администратора. Мы не будем шутить про бухгалтерию, 1С, принтеры и шредеры, а выберем объективные факторы.

  • Пользователи различного уровня компьютерной грамотности. И тут, чем грамотнее, тем страшнее, потому что «у меня не запускается CRM» и «оно само, я не трогала» звучит гораздо безобиднее и перспективнее, чем «компьютер тормозил, я почистил реестры, потом удалил антивирус, перезагрузил, зашёл в BIOS и вот теперь BSD». Проблема решается ограничением прав сотрудников на рабочий ПК, настройкой систем мониторинга, ведением журнала действий.


    Biztechmagazine.com

  • Зоопарк программного обеспечения. Это серьёзная проблема, с которой мы в RegionSoft сталкиваемся чаще всего. Доступность различного корпоративного ПО привела к тому, что у каждого менеджера может стоять по несколько программ одного типа, которыми никто не пользуется. И полбеды, если они бесплатные, но куда хуже, если истекает срок лицензии или они крякнутые — можно нарваться на проверки отдела «К» ОБЭП. Решается мониторингом ПО и профиля его использования (SAM), контролем наличия лицензий.

    Splogosapiens.lj.ru

  • Зоопарк аппаратного обеспечения. Тут как повезёт: может быть и зоопарк, а может и кладбище еле работающих устаревших рабочих ПК. В последнее время добавилась проблема мобильных устройств пользователей (особенно в торговых компаниях) и периферии: кассы, графические планшеты, МФУ, камеры и т.д. Решается мониторингом профиля использования периферийных устройств, подменным фондом, инвентаризацией и своевременной амортизацией.

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

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

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

  • Очень щедрый босс. Он любит передовые технологии, читает биографию Стива Джобса и покупает всем рабочие Mac и MacBook. При этом почти всё используемое ПО в компании может быть рассчитано на Windows, как и пользователи в возрасте за N лет. И тогда начинаются пляски с виртуалками, Parallels и обучением правильным кнопкам. Лечится сметами на хороший парк ПО, систему мониторинга и лицензии — хочешь тратить, трать так, чтобы наша производительность росла.

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

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


    simplywallpapers.com

  • Несколько каналов общения с сотрудниками — зло современных коммуникаций. Кто-то пишет в Slack, кто-то в Skype, кто-то шлёт sms, звонит, тщательно описывает проблему и свои ощущения в почте, особо тревожные сотрудники пишут и звонят сразу везде. Это абсолютно неправильно и требует искоренения: на телефон и в мессенждеры — только срочные вещи, их же и всё остальное — в тикет-систему, чтобы можно было контролировать сроки, ресурсы, статусы. Так всем будет быстрее и лучше. И не обязательно покупать что-то дорогое или разворачивать сложное — например, мы внутри компании всю тикет-систему держим в своей же CRM: и по своим задачам, и по клиентским.

  • Общительные пользователи — они будут эмоционально рассказывать, как выступил пот, когда завис 1С, как чавкал принтер, заедая бумагу со скрепками, непременно покрутятся вокруг и тщательно расспросят, что вы делаете и как это повторить. Решение: рекомендовать не повторять и мило общаться с коллегами. Опытным путём доказано — они всё равно не отстанут, а вот шоколадки и печеньки вам обеспечены.

Пользователь, помни!


Любимый и нетленный Bash.im (Башорг)

И опять же, факторы по одному не ходят, случаются пачками и наносят непоправимый вред психике и, в первую очередь, ИТ-инфраструктуре, увеличивая стоимость её содержания.

Чек-лист для выживания в мире малого и среднего бизнеса


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

  • Фиксируйте всю выполненную работу, документируйте её. Лучше всего, если вы заведёте систему тикетов, в которую пользователи будут отправлять свои заявки на поломки, проблемы и т.д. Таким образом вы сможете упорядочить свою работу, накопить базу знаний, легко передать дела при увольнении, поднять спорный вопрос и, в конце концов, распечатать все задачи, ресурсы и результаты руководству, если оно усомнится в вашей полезности.

  • Следите за обновлениями (платными и бесплатными) — это банальный совет, который нарушается сплошь и рядом. Так вы защитите себя от ряда неприятностей, а пользователи получат актуальные и мощные версии своего рабочего ПО.

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

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

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

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

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

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

  • Проводите аудит и мониторинг. Используйте специализированное ПО для мониторинга устройств, лицензий, сети и периферии, проверяйте номера лицензий и оборудования, настройте систему оповещения о сбоях. Это здорово облегчит процесс управления ИТ-инфраструктурой в целом и инвентаризации в частности.

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

  • Успевайте за новыми технологиями, обучайтесь. Технологии развиваются с невероятной скоростью, и отстать от них — дело пары месяцев. Не обязательно внедрять в работе всё, что видите, но знать основные тренды обязательно: например, виртуализацию, IoT, нейросети, новые версии OS, новые типы железа и т.д. Возможно, у вас возникнет идея, как новые технологии смогут оптимизировать и удешевить ИТ-инфраструктуру, а вас избавить от головных болей.

  • Включайтесь в бизнес-процессы в компании. Если компания внедряет новое ПО (например, CRM-систему) или разрабатывает новый бюджет/бизнес-план, не отмахивайтесь от участия, а работайте в команде и будьте в курсе всех дел. Как минимум, вам потом это всё поддерживать.

  • Любите свою работу и не теряйте чувство юмора — без этого ну совсем никак. Да вы и сами знаете.

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

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

А то мало ли - алмазная пыль в смазке...
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334298/


Метки:  

День сисадмина: зажги на квесте, закрути баклажан

Пятница, 28 Июля 2017 г. 08:53 + в цитатник


Про вас не снимают фильмов, не пишут песен и часто даже не знают в лицо. Образ сисадмина оброс мифами: небрит, нетрезв и неотёсан.

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

Рыцари в сияющих доспехах, повелители офиса и атланты IT-инфраструктуры. На вас все компьютеры, сети, серверы, роутеры, концентраторы, коммутаторы и шлюзы.

Сегодня мы преклоняемся перед вами и приносим дары:



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

10 победителей:
Первые трое получат 5000, 3000 и 1500 р. на баланс аккаунта + по свитшоту FirstVDS.
Ещё трое — футболки FirstVDS и четверо — бафы с символикой проекта.

Начало сегодня 28.07 в 10:00 по МСК, но можно присоединиться даже в воскресенье 30.07.
Квест закончится в воскресенье 30.07 в 24:00 по МСК. Результаты объявим в понедельник 31.07 в 13:00 по МСК.

Участвовать в квесте


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

https://habrahabr.ru/post/332532/



Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1069 1068 [1067] 1066 1065 ..
.. 1 Календарь