Quantcast
Channel: Найцікавіше на DOU
Viewing all 8591 articles
Browse latest View live

DOU Проектор: Prostir - команда, яка приводить закордонних клієнтів до українських аутсорсерів

$
0
0

У рубриці DOU Проекторвсі охочі можуть презентувати свій продукт (як стартап, так і ламповий pet-проект). Якщо вам є про що розповісти — запрошуємо взяти участь. Якщо ні — можливо, серія надихне на створення власного made in Ukraine продукту. Питання і заявки на участь надсилайте на editors@dou.ua.

Привіт, я Іва Козловська, CEO компанії Prostir! Prostir — sales-платформа, яка збирає навколо себе менеджерів з продажу, чиє завдання — знаходити клієнтів для ІТ-компаній України.

Компанію Prostir ми заснували разом з Ігорем Ковтуном, Антоном Бричаком та Михайлом Тимошенком. За 10 років роботи в аутсорсингових і продуктових ІТ-компаніях, я досконало вивчила процеси і знаю, що можна покращити та як саме це зробити. За бізнес-процеси компанії відповідає Ігор, наш COO, кандидат наук, спеціаліст з міжнародних відносин та PR. Антон має досвід QA, PM, Team Lead, зараз він налагоджує співпрацю із українськими партнерами. Михайло спеціалізується на рекламі, маркетингу та фінансах.

Команда Prostir

Наша мета — якісно та кількісно змінити ринок аутсорсингу в Україні, впроваджуючи нові бізнес-процеси:

  • аудит IT-компаній в Україні та передачу проектів лише надійним розробникам;
  • юридичну підтримку для компаній-партнерів;
  • комплексну перевірку клієнтів.

Крім того, ми розширюємо IT-ринок: передаємо компаніям-партнерам нових клієнтів за допомогою розвиненої мережі представництв за кордоном; навчаємо нове покоління менеджерів з продажу; формуємо надійний бренд українських компаній-розробників у світі.

Ідея

Ідея проекту з’явилася під час обговорення ринку аутсорсингу в Україні. Кожен з нас стикався з однаковими проблемами. Саме тоді ми поставили собі за мету створити сервіс, який зможе забезпечити:

  • потік клієнтів для українських IT-компаній;
  • ефективний процес перемовин та підписання контракту;
  • дотримання домовленостей між виконавцем та замовником;
  • зменшення ризиків при виконанні контрактів.

Prostir допомагає компаніям вирішувати проблеми стабільності нових клієнтів; результативності відділу продажів; професійності перемовників; гарантованої оплати послуг після підписання контракту; супроводу контрактів.

В Україні є достатньо розробників, які можуть створити якісний продукт. Проблема в тому, що пошук ідеальної команди для клієнта може затягнутись. Важко знайти команду розробників в Україні, коли знаходишся за тисячі кілометрів. З досвіду я знаю, що алгоритм пошуку клієнтів такий:

  1. Пошук компаній-розробників.
  2. Збір відгуків, вивчення портфоліо.
  3. Скайп-перемовини з компаніями-кандидатами.
  4. Надання ТЗ.
  5. Вивчення і обговорення пропозицій.
  6. Вибір однієї компанії-виконавця.

Цей процес може тривати від 3-хмісяців до року, а інколи й більше. Якщо ж розробник виявився ненадійним або завищив свої можливості, тоді все починається з початку.

Такі ситуації виникають, якщо компанії беруть будь-які проекти, щоб не втрачати клієнтів. Для невеликих компаній кожен потенційний клієнт важливий.

Prostir стає «агентом» клієнта в Україні і дбає про його інтереси. Коли замовник звертається до Prostir, протягом 5-7днів ми підбираємо йому команду за таким алгоритмом:

  1. Надаємо декілька пропозицій реалізації проекту від команд.
  2. Вибір команди.
  3. Підписання контракту.
  4. Початок робіт.

Від Prostir українські компанії отримують постійний потік потенційних проектів в своїй сфері технологій без зайвих зусиль та супутніх витрат на продажі та маркетинг. Часто замовники довго не можуть визначитись з функціоналом або змінюють його в процесі, просять зробити дешевше, ніж можливо, або нічого не замовляють після тривалих переговорів. Ми беремо на себе юридичні аспекти підписання та виконання контрактів.

Схема, за якою ми працюємо з клієнтом

Реалізація

Ми створили та постійно вдосконалюємо мережу представництв за кордоном, які допомагають уникнути непорозумінь між замовником та виконавцем. Часто такі непорозуміння виникають через мовний бар’єр. Тому наші представники за кордоном — це виключно місцеві авторитетні компанії та особи, що розмовляють з замовником однією мовою.

Для зацікавлених клієнтів менеджери Prostir обирають перевірених команд-партерів, які найбільше відповідають вимогам замовника. Замовник обирає команду. Якщо українська сторона перестає виконувати свої обов’язки якісно, ми гарантуємо заміну команди у найближчий термін. І навпаки, якщо клієнт відмовляється оплачувати послуги, то наша компанія бере на себе вирішення непорозумінь та юридичну підтримку.

Ми ретельно перевіряємо кандидатів перед їх потраплянням в наш список компаній-партнерів. Наші вимоги такі:

  • компанія працює на ринку ІТ-послуг понад 3 роки;
  • наявність власного офісу на території України;
  • штат розробників 10+ осіб;
  • достатній рівень володіння англійською мовою.

Усіх ІТ-партнерів ми відвідуємо особисто — перевіряємо офіс, знайомимось із топ-менеджментом та програмістами. Так ми гарантуємо контроль якості, адже відповідаємо за неї своєю репутацією.

Часто під час переговорів менеджери з продажів так сильно хочуть підписати контракт, що забувають перевірити замовника. Що робить Prostir:

  • перевіряє ідентифікаційний номер компанії на наявність боргів чи судових справ;
  • відслідковує репутацію замовника та збирає відгуки про нього;
  • відвідує офіс замовника, щоб познайомитись особисто.

Від ідеї до запуску проекту минуло 2 місяці. Спочатку Prostir планувався як сервіс, орієнтований виключно на продажі — величезний відділ продажів. На основі власного досвіду ми планували зібрати команду досвідчених менеджерів з продажу та підготувати їх до роботи на іноземному ринку. На жаль, на сьогодні український ринок праці до цього не готовий — часом одного спеціаліста доводиться шукати по 1-2 місяці.Фахівцям бракує мотивації, рівня володіння англійською мовою, мінімально необхідних технічних знань і досвіду ведення переговорів.

Створити мережу представництв виявилося легше. Ми не змінювали ідею, ми адаптували її до сучасних реалій.

Київський офіс Prostir на вул. Володимирській

Результати і плани

За майже місяць з моменту офіційного старту, ми маємо 7 представництв в різних країнах світу, 2 головні офіси в Україні та Європі, 10+ українських команд, які повністю відповідають необхідним вимогам, більш ніж 400 досвідчених розробників з широкою експертизою, найсмачнішу каву та неймовірний вид з вікна на Національну оперу України.

Ми не збираємось зупинятися на досягнутому. Працюємо над подальшим розширенням мережі представництв та продовжуємо збільшувати перелік компаній партнерів в Україні. Паралельно ми збільшуємо sales-команду, переймаючи досвід закордонних колег. Розширюємо нашу присутність в інших регіонах світу.

Prostir — це не просто компанія, це спільнота професіоналів, до якої ми запрошуємо вас приєднатися.


DOU Ревизор в ЛУН: «Двухуровневый лофт на высоте птичьего полета»

$
0
0

В этот раз DOU Ревизорпобывал в киевском офисе ЛУН — украинской продуктовой компании, которая делает поиск жилья комфортным. Компания была основана в 2008 году, и на данный момент в ее портфолио 5 продуктов: Flatfy — сервис для поиска квартир в 37 странах мира; ЛУН — самый большой в Украине поисковик недвижимости; ЛУН.Новостройки — полный каталог новостроек и ЖК в Украине; Flatfy.Novostroyki — выбор новостроек в 6 странах; Соседи — сервис для создания красивых объявлений-инфографик о поиске жилья.

Над продуктами ЛУН работает почти 100 человек, из них 63 в офисе и 36 специалистов — удаленно. У компании всего один офис, и находится он в Киеве. Именно здесь и работают те самые 63 человека, 32 из них — технические специалисты.

В округе и поблизости

Офис компании расположен на верхних этажах здания в ЖК «Сонячна брама» на улице Ломоносова, что в 10-тиминутах ходьбы от станции метро «ВДНХ».

В соседнем доме есть кафе «Дача», из которого для сотрудников компании организована доставка обедов. Но если есть желание проветриться, можно зайти туда самому и взять еду с собой по корпоративной скидке (стоимость обеда ≈ 60 грн). В этом же здании есть ресторан «Брамс», но там уже подороже, так как бизнес-ланчей нет, и цена за салат начинается от 80 грн. Неподалеку находится фермерское кафе «Вильямс» (стоимость бизнес ланча — 75 грн), и совсем недавно открылся ресторан «Брюгге», где средняя стоимость обеда составит 60 грн. В близлежащих жилых домах много кофеен, закусочных, булочных, кондитерских, несколько недорогих китайских кафешек. Прямо в соседнем здании расположен супермаркет Novus, а с другой стороны здания — «ЛотOK». В 10 минутах ходьбы также находится фитнес-клуб Sport Life.

У офиса ЛУН есть также стратегически важное соседство с КНУ им. Т. Г. Шевченко. 71% всех технических специалистов компании — выпускники именно этого вуза. Из окон офиса хорошо просматриваются корпуса альма-матер, а некоторые сотрудники, еще в статусе студентов, умудряются бегать в обеденное время на пары.

В жилом комплексе есть подземный паркинг, но там могут оставить свое авто только жильцы ЖК «Сонячна брама». Все остальные паркуют автомобили под домом или во внутреннем дворике. В самом ЖК нет оборудованной велопарковки, но в офисе ЛУН, неподалеку от рецепции, сделали небольшую велопарковку, рассчитанную на 4 велосипеда. Есть, правда, нюанс — в офисе нет душа.


















Рабочее пространство

Офис ЛУН — это 700 м2двухуровневого офисного пространства с элементами стиля лофт. Все рабочие зоны здесь — это кабинеты, рассчитанные на команды от 5 до 16 человек. Во всем офисе есть 3 полноценных митинг-рума и 5 капсул — маленьких кабинок для уединенной или для совместной работы небольшими группами. Сами сотрудники отмечают, что переговорок уже не хватает (читайте раздел «DOU Ревизор спрашивает»).

ЛУН работает по гибкому графику. Офис открыт с 8:30 и до последнего человека. Специалисты сами выбирают промежуток времени, в котором им удобно работать (по данным компании). 8 часов — это полный рабочий день, 6- или 4-часовойрабочий день — для студентов.

Количество квадратных метров на человека в рабочем помещении составляет 7 м2 (по данным компании).








































Отдых и вдохновение

Основная зона отдыха, она же просторное ЛУН Кафе, расположена на первом уровне и оборудована всей необходимой бытовой техникой — от встроенного холодильника и микроволновок до блендера и соковыжималки для цитрусовых. Из Кафе есть выход на террасу, которая расположена по периметру всего офиса.

Удивительно, но в этом офисе нет привычной лаунж-зоны с теннисным столом, которая уже давно вошла в список must have для офисов ИТ-компаний. Представители ЛУН утверждают, что такая зона была, но не пользовалась популярностью, и сами сотрудники попросили переоборудовать ее в рабочий кабинет для одной из команд.

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




















DOU Ревизор спрашивает

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

Денис, Head of Product Design, 2,5 года в компании:

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

Из ключевых характеристик — красивый вид. У меня половина Инстаграма — это наши рассветы и закаты здесь. В офисе много стеклянных перегородок. Можно посмотреть со второго этажа на первый. Боязнь высоты свою вот преодолеваю немножко и рассматриваю.

Что еще интересного? Мы мигрируем часто из комнаты в комнату. За 2,5 года это получается мой 3-йкабинет. И по-моему, я скоро буду переезжать опять :) Почему так? Команды переформатируются. Кто-то вырос, переехал в другую комнату. Кто-то разделился — получилось две маленькие команды. В этом плане офисное пространство достаточно хорошо продумано, и всем хватает места. По крайней мере, пока что. Мы это делаем очень осторожно, потому что планы на рост есть. А стены в офисе как бы не подвинешь.

Еще офис у нас в стиле «Star Wars». Я не смотрел «Star Wars», мне это никак не откликается. Декор как декор. А есть люди, которые от этого фанатеют.

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

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

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

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

Дима, Team Lead/Backend Developer (ЛУН.Новостройки team), 1,5 года в компании:

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

У нас классный вид на аэропорт с одной стороны и на центральный корпус ВДНХ с другой. Я вообще люблю такие видовые места. За Жулянами находится мой дом. И вот получается, что отсюда из некоторых окон видно дом. А из дома видно офис. И все это на фоне взлетающих и садящихся самолетов.

Виталий, Team Lead/Backend Developer (Flatfy team), 6 лет с командой:

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

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

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

Саша, Head of Product (Flatfy team), 5 лет в компании:

Самое главное — это, конечно же, потрясающий вид. Я вообще фанат самолетов. Как и, наверное, 90% мужского населения, мечтал стать пилотом, когда был маленьким. И даже сейчас :) Вид на взлетно-посадочную полосу Жулян из офиса просто потрясающий. У меня когда-то было рабочее место возле видового окна на полосу. И вот когда ты сидишь и смотришь, как самолеты взлетают или садятся, чувствуется какая-то бизнес-динамика. Люди куда-то летят по делам, ну клево. Чувствуешь, что ты рядом со всем этим, и это мотивирует. Вид вообще красивый во все стороны. Это классно вечером, когда задерживаешься. Это классно на Новый год, когда видишь елку на ВДНХ прямо из офиса. Вид — это самый the best пункт.

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

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

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

По месторасположению офиса. Опять же — летом очень клево, что рядом ВДНХ. У нас есть ребята, которые бегают по утрам, ездят на велосипедах — им очень классно. Офис недалеко от метро. Я дохожу за 8 минут. Девочки говорят, что 10-15.

Еще мне нравится дизайн. Мы в этот раз подошли к этому серьезно. И он выдержан в нашей теме.

Что улучшить? При увеличении команды стало понятно, что мы немного просчитались с количеством переговорок. Сейчас, по сути, есть 1 большая переговорка на втором этаже, 2 большие на первом и 5 капсул: 3 на втором и 2 на первом. Они выполняют свою роль, но при таком росте команды хотелось бы еще одну переговорку. Сейчас это, наверное, уже не получится сделать. Но в следующем офисе мы это обязательно исправим. Вот кроме того, что не хватает еще одной переговорки, — иногда приходится за них спорить — я всем полностью доволен.


Ну что, мы поехали дальше... А если вы хотите, чтобы DOU Ревизор приехал к вам, пишите нам — revisor@dou.ua

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

Следите за нами на Facebook — www.facebook.com/dourevisor

Смотрите закулисные кадры того, что не проходит нашу цензуру на Instagram — instagram.com/dourevisor

Подписывайтесь на видеоканал DOU Ревизор на YouTube.

SQL Server 2016/2017: особенности работы с JSON

$
0
0

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

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

Такое пафосное вступление имеет определенные основания, поскольку долгое время на Microsoft Connect поддержка работы с JSON в SQL Server была одной из самых востребованных фич. Шли годы, и неожиданно для всех этот функционал реализовали в SQL Server 2016. По факту вышло очень даже хорошо, но Microsoft не остановилась на этом и в SQL Server 2017 обстоятельно улучшила производительность и без того быстрого парсера JSON.

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

1. Datatypes

Поддержка JSON на SQL Server изначально доступна для всех редакций. При этом отдельного типа данных, как в случае с XML, Microsoft не предусмотрела. Данные в JSON на SQL Server хранятся как обычный текст: в Unicode (NVARCHAR/NCHAR) либо ANSI (VARCHAR/CHAR) формате.

DECLARE @JSON_ANSI VARCHAR(MAX) =      '[{"Nąme":"Lenōvo モデ460"}]'
      , @JSON_Unicode NVARCHAR(MAX) = N'[{"Nąme":"Lenōvo モデ460"}]'

SELECT @JSON_ANSI, DATALENGTH(@JSON_ANSI)
UNION ALL
SELECT @JSON_Unicode, DATALENGTH(@JSON_Unicode)

Главное, о чем нужно помнить: сколько места занимает тот или иной тип данных (2 байта на символ, если храним данные как Unicode, или 1 байт для ANSI строк). Также не забываем перед Unicode константами ставить «N». В противном случае можно нарваться на кучу веселых ситуаций:

--- ----------------------------
25  [{"Name":"Lenovo ??460"}]
50  [{"Nąme":"Lenōvo モデ460"}]

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

Кроме того, Microsoft настоятельно рекомендует не использовать deprecated типы данных — NTEXT/TEXT. Для тех, кто в силу привычки их до сих пор использует, мы сделаем небольшой следственный эксперимент:

DROP TABLE IF EXISTS #varchar
DROP TABLE IF EXISTS #nvarchar
DROP TABLE IF EXISTS #ntext
GO

CREATE TABLE #varchar  (x VARCHAR(MAX))
CREATE TABLE #nvarchar (x NVARCHAR(MAX))
CREATE TABLE #ntext    (x NTEXT)
GO

DECLARE @json NVARCHAR(MAX) =
    N'[{"Manufacturer":"Lenovo","Model":"ThinkPad E460","Availability":1}]'

SET STATISTICS IO, TIME ON

INSERT INTO #varchar
SELECT TOP(50000) @json
FROM [master].dbo.spt_values s1
CROSS JOIN [master].dbo.spt_values s2
OPTION(MAXDOP 1)

INSERT INTO #nvarchar
SELECT TOP(50000) @json
FROM [master].dbo.spt_values s1
CROSS JOIN [master].dbo.spt_values s2
OPTION(MAXDOP 1)

INSERT INTO #ntext
SELECT TOP(50000) @json
FROM [master].dbo.spt_values s1
CROSS JOIN [master].dbo.spt_values s2
OPTION(MAXDOP 1)

SET STATISTICS IO, TIME OFF

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

#varchar:  CPU time = 32 ms,  elapsed time = 28 ms
#nvarchar: CPU time = 31 ms,  elapsed time = 30 ms
#ntext:    CPU time = 172 ms, elapsed time = 190 ms

Кроме того, нужно помнить, что NTEXT/TEXT всегда хранятся на LOB страницах:

SELECT obj_name = OBJECT_NAME(p.[object_id])
     , a.[type_desc]
     , a.total_pages
     , total_mb = a.total_pages * 8 / 1024.
FROM sys.allocation_units a
JOIN sys.partitions p ON p.[partition_id] = a.container_id
WHERE p.[object_id] IN (OBJECT_ID('#nvarchar'), OBJECT_ID('#ntext'), OBJECT_ID('#varchar'))

obj_name      type_desc      total_pages  total_mb
------------- -------------- ------------ -----------
#varchar      IN_ROW_DATA    516          4.031250
#varchar      LOB_DATA       0            0.000000
#nvarchar     IN_ROW_DATA    932          7.281250
#nvarchar     LOB_DATA       0            0.000000
#ntext        IN_ROW_DATA    188          1.468750
#ntext        LOB_DATA       1668         13.031250

Для справки, начиная с SQL Server 2005 для типов с переменной длиной поменяли правило «На каких страницах хранить данные». В общем случае, если размер превышает 8060 байт, то данные помещаются на LOB страницу, иначе хранятся в IN_ROW. Понятно, что в таком случае SQL Server оптимизирует хранение данных на страницах.

И последний довод не использовать NTEXT/TEXT — это тот факт, что все JSON функции с deprecated типами данных банально не дружат:

SELECT TOP(1) 1
FROM #ntext
WHERE ISJSON(x) = 1

Msg 8116, Level 16, State 1, Line 63
Argument data type ntext is invalid for argument 1 of isjson function.

2. Storage

Теперь посмотрим, насколько выгодно хранение JSON как NVARCHAR/VARCHAR по сравнению с аналогичными данными, представленными в виде XML. Кроме того, попробуем XML хранить в нативном формате, а также представить в виде строки:

DECLARE @XML_Unicode NVARCHAR(MAX) = N'<Manufacturer Name="Lenovo"><Product Name="ThinkPad E460"><Model Name="20ETS03100"><CPU>i7-6500U</CPU><Memory>16</Memory><SSD>256</SSD></Model><Model Name="20ETS02W00"><CPU>i5-6200U</CPU><Memory>8</Memory><HDD>1000</HDD></Model><Model Name="20ETS02V00"><CPU>i5-6200U</CPU><Memory>4</Memory><HDD>500</HDD></Model></Product></Manufacturer>'

DECLARE @JSON_Unicode NVARCHAR(MAX) = N'
[
  {
    "Manufacturer": {
      "Name": "Lenovo",
      "Product": {
        "Name": "ThinkPad E460",
        "Model": [
          {
            "Name": "20ETS03100",
            "CPU": "Intel Core i7-6500U",
            "Memory": 16,
            "SSD": "256"
          },
          {
            "Name": "20ETS02W00",
            "CPU": "Intel Core i5-6200U",
            "Memory": 8,
            "HDD": "1000"
          },
          {
            "Name": "20ETS02V00",
            "CPU": "Intel Core i5-6200U",
            "Memory": 4,
            "HDD": "500"
          }
        ]
      }
    }
  }
]'

DECLARE @XML_Unicode_D NVARCHAR(MAX) = N'<Manufacturer Name="Lenovo"><Product Name="ThinkPad E460"><Model Name="20ETS03100"><CPU>i7-6500U</CPU><Memory>16</Memory><SSD>256</SSD></Model><Model Name="20ETS02W00"><CPU>i5-6200U</CPU><Memory>8</Memory><HDD>1000</HDD></Model><Model Name="20ETS02V00"><CPU>i5-6200U</CPU><Memory>4</Memory><HDD>500</HDD></Model></Product></Manufacturer>'
      , @JSON_Unicode_D NVARCHAR(MAX) = N'[{"Manufacturer":{"Name":"Lenovo","Product":{"Name":"ThinkPad E460","Model":[{"Name":"20ETS03100","CPU":"Intel Core i7-6500U","Memory":16,"SSD":"256"},{"Name":"20ETS02W00","CPU":"Intel Core i5-6200U","Memory":8,"HDD":"1000"},{"Name":"20ETS02V00","CPU":"Intel Core i5-6200U","Memory":4,"HDD":"500"}]}}}]'

DECLARE @XML XML = @XML_Unicode
      , @XML_ANSI VARCHAR(MAX) = @XML_Unicode
      , @XML_D XML = @XML_Unicode_D
      , @XML_ANSI_D VARCHAR(MAX) = @XML_Unicode_D
      , @JSON_ANSI VARCHAR(MAX) = @JSON_Unicode
      , @JSON_ANSI_D VARCHAR(MAX) = @JSON_Unicode_D

SELECT *
FROM (
    VALUES ('XML Unicode', DATALENGTH(@XML_Unicode), DATALENGTH(@XML_Unicode_D))
         , ('XML ANSI', DATALENGTH(@XML_ANSI), DATALENGTH(@XML_ANSI_D))
         , ('XML', DATALENGTH(@XML), DATALENGTH(@XML_D))
         , ('JSON Unicode', DATALENGTH(@JSON_Unicode), DATALENGTH(@JSON_Unicode_D))
         , ('JSON ANSI', DATALENGTH(@JSON_ANSI), DATALENGTH(@JSON_ANSI_D))
) t(DataType, Delimeters, NoDelimeters)

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

DataType     Delimeters  NoDelimeters
------------ ----------- --------------
XML Unicode  914         674
XML ANSI     457         337
XML          398         398
JSON Unicode 1274        604
JSON ANSI    637         302

Может показаться, что самый выгодный вариант — нативный XML. Это отчасти правда, но есть нюансы. XML всегда хранится как Unicode. Кроме того, за счет того, что SQL Server использует бинарный формат хранения этих данных — все сжимается в некий стандартизированный словарь с указателями. Именно поэтому форматирование внутри XML не влияет на конечный размер данных.

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

Если хочется еще сильнее сократить размер JSON данных, то в нашем распоряжении несколько возможностей.

3. Compress/Decompress

В SQL Server 2016 реализовали новые функции COMPRESS/DECOMPRESS, которые добавляют поддержку GZIP сжатия:

SELECT *
FROM (
    VALUES ('XML Unicode', DATALENGTH(COMPRESS(@XML_Unicode)), DATALENGTH(COMPRESS(@XML_Unicode_D)))
         , ('XML ANSI', DATALENGTH(COMPRESS(@XML_ANSI)), DATALENGTH(COMPRESS(@XML_ANSI_D)))
         , ('JSON Unicode', DATALENGTH(COMPRESS(@JSON_Unicode)), DATALENGTH(COMPRESS(@JSON_Unicode_D)))
         , ('JSON ANSI', DATALENGTH(COMPRESS(@JSON_ANSI)), DATALENGTH(COMPRESS(@JSON_ANSI_D)))
) t(DataType, CompressDelimeters, CompressNoDelimeters)

Результаты для предыдущего примера:

DataType     CompressDelimeters   CompressNoDelimeters
------------ -------------------- --------------------
XML Unicode  244                  223
XML ANSI     198                  180
JSON Unicode 272                  224
JSON ANSI    221                  183

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

DECLARE @t TABLE (val VARBINARY(MAX))
INSERT INTO @t
VALUES (COMPRESS('[{"Name":"ThinkPad E460"}]')) -- VARCHAR(8000)
     , (COMPRESS(N'[{"Name":"ThinkPad E460"}]')) -- NVARCHAR(4000)

SELECT val
     , DECOMPRESS(val)
     , CAST(DECOMPRESS(val) AS NVARCHAR(MAX))
     , CAST(DECOMPRESS(val) AS VARCHAR(MAX))
FROM @t

Функция COMPRESS возвращает разные бинарные последовательности для ANSI/Unicode и при последующем чтении мы столкнемся с ситуацией, что часть данных сохранено как ANSI, а часть — в Unicode. Крайне тяжело потом угадать, к какому типу делать приведение:

---------------------------- -------------------------------------------------------
筛丢浡≥∺桔湩偫摡䔠㘴∰嵽        [{"Name":"ThinkPad E460"}]
[{"Name":"ThinkPad E460"}]   [ { " N a m e " : " T h i n k P a d   E 4 6 0 " } ]

Если мы захотим построить нагруженную систему, то использование функции COMPRESS замедлит вставку:

USE tempdb
GO

DROP TABLE IF EXISTS #Compress
DROP TABLE IF EXISTS #NoCompress
GO

CREATE TABLE #NoCompress (DatabaseLogID INT PRIMARY KEY, JSON_Val NVARCHAR(MAX))
CREATE TABLE #Compress   (DatabaseLogID INT PRIMARY KEY, JSON_CompressVal VARBINARY(MAX))
GO

SET STATISTICS IO, TIME ON

INSERT INTO #NoCompress
SELECT DatabaseLogID
     , JSON_Val = (
            SELECT PostTime, DatabaseUser, [Event], [Schema], [Object], [TSQL]
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        )
FROM AdventureWorks2014.dbo.DatabaseLog
OPTION(MAXDOP 1)

INSERT INTO #Compress
SELECT DatabaseLogID
     , JSON_CompressVal = COMPRESS((
            SELECT PostTime, DatabaseUser, [Event], [Schema], [Object], [TSQL]
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
         ))
FROM AdventureWorks2014.dbo.DatabaseLog
OPTION(MAXDOP 1)

SET STATISTICS IO, TIME OFF

Причем очень существенно:

#NoCompress: CPU time = 15 ms,  elapsed time = 25 ms
#Compress:   CPU time = 218 ms, elapsed time = 280 ms

При этом размер таблицы сократится:

SELECT obj_name = OBJECT_NAME(p.[object_id])
     , a.[type_desc]
     , a.total_pages
     , total_mb = a.total_pages * 8 / 1024.
FROM sys.partitions p
JOIN sys.allocation_units a ON p.[partition_id] = a.container_id
WHERE p.[object_id] IN (OBJECT_ID('#Compress'), OBJECT_ID('#NoCompress'))

obj_name       type_desc     total_pages  total_mb
-------------- ------------- ------------ ---------
#NoCompress    IN_ROW_DATA   204          1.593750
#NoCompress    LOB_DATA      26           0.203125
#Compress      IN_ROW_DATA   92           0.718750
#Compress      LOB_DATA      0            0.000000

Кроме того, чтение из таблицы сжатых данных потом сильно замедляет функция DECOMPRESS:

SET STATISTICS IO, TIME ON

SELECT *
FROM #NoCompress
WHERE JSON_VALUE(JSON_Val, '$.Event') = 'CREATE_TABLE'

SELECT DatabaseLogID, [JSON] = CAST(DECOMPRESS(JSON_CompressVal) AS NVARCHAR(MAX))
FROM #Compress
WHERE JSON_VALUE(CAST(DECOMPRESS(JSON_CompressVal) AS NVARCHAR(MAX)), '$.Event') = N'CREATE_TABLE'

SET STATISTICS IO, TIME OFF

Логические чтения сократятся, но скорость выполнения останется крайне низкой:

Table '#NoCompress'. Scan count 1, logical reads 187, ...
    CPU time = 16 ms, elapsed time = 37 ms

Table '#Compress'. Scan count 1, logical reads 79, ...
    CPU time = 109 ms, elapsed time = 212 ms

Как вариант, можно добавить PERSISTED вычисляемый столбец:

ALTER TABLE #Compress ADD EventType_Persisted
    AS CAST(JSON_VALUE(CAST(
            DECOMPRESS(JSON_CompressVal) AS NVARCHAR(MAX)), '$.Event')
        AS VARCHAR(200)) PERSISTED

Либо создать вычисляемый столбец и на основе него индекс:

ALTER TABLE #Compress ADD EventType_NonPersisted
    AS CAST(JSON_VALUE(CAST(
            DECOMPRESS(JSON_CompressVal) AS NVARCHAR(MAX)), '$.Event')
        AS VARCHAR(200))

CREATE INDEX ix ON #Compress (EventType_NonPersisted)

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

DECLARE @json NVARCHAR(MAX) = (
        SELECT t.[name]
             , t.[object_id]
             , [columns] = (
                     SELECT c.column_id, c.[name], c.system_type_id
                     FROM sys.all_columns c
                     WHERE c.[object_id] = t.[object_id]
                     FOR JSON AUTO
                 )
        FROM sys.all_objects t
        FOR JSON AUTO
    )

SELECT InitialSize = DATALENGTH(@json) / 1048576.
     , CompressSize = DATALENGTH(COMPRESS(@json)) / 1048576.

Для меня это стало «спасительный кругом», когда пытался сократить сетевой трафик на одном из проектов:

InitialSize    CompressSize
-------------- -------------
1.24907684     0.10125923

4. Compression

Чтобы уменьшить размер таблиц, можно также воспользоваться сжатием данных. Ранее сжатие было доступно только в Enterprise редакции. Но с выходом SQL Server 2016 SP1 использовать данную функциональность можно хоть на Express-е:

USE AdventureWorks2014
GO

DROP TABLE IF EXISTS #InitialTable
DROP TABLE IF EXISTS #None
DROP TABLE IF EXISTS #Row
DROP TABLE IF EXISTS #Page
GO

CREATE TABLE #None (ID INT, Val NVARCHAR(MAX), INDEX ix CLUSTERED (ID) WITH (DATA_COMPRESSION = NONE))
CREATE TABLE #Row  (ID INT, Val NVARCHAR(MAX), INDEX ix CLUSTERED (ID) WITH (DATA_COMPRESSION = ROW))
CREATE TABLE #Page (ID INT, Val NVARCHAR(MAX), INDEX ix CLUSTERED (ID) WITH (DATA_COMPRESSION = PAGE))
GO

SELECT h.SalesOrderID
     , JSON_Data = 
           (
                SELECT p.[Name]
                FROM Sales.SalesOrderDetail d
                JOIN Production.Product p ON d.ProductID = p.ProductID
                WHERE d.SalesOrderID = h.SalesOrderID
                FOR JSON AUTO
           )
INTO #InitialTable
FROM Sales.SalesOrderHeader h

SET STATISTICS IO, TIME ON

INSERT INTO #None
SELECT *
FROM #InitialTable
OPTION(MAXDOP 1)

INSERT INTO #Row
SELECT *
FROM #InitialTable
OPTION(MAXDOP 1)

INSERT INTO #Page
SELECT *
FROM #InitialTable
OPTION(MAXDOP 1)

SET STATISTICS IO, TIME OFF

#None: CPU time = 62 ms,  elapsed time = 68 ms
#Row:  CPU time = 94 ms,  elapsed time = 89 ms
#Page: CPU time = 125 ms, elapsed time = 126 ms

Сжатие на уровне страниц использует алгоритмы, которые находят похожие куски данных и заменяют их на меньшие по объёму значения. Сжатие на уровне строк урезает типы до минимально необходимых, а также обрезает лишние символы. Например, у нас столбец имеет тип INT, который занимает 4 байта, но хранятся там значения меньше 255. Для таких записей тип усекается, и данные на диске занимают место как будто это TINYINT.

USE tempdb
GO

SELECT obj_name = OBJECT_NAME(p.[object_id])
     , a.[type_desc]
     , a.total_pages
     , total_mb = a.total_pages * 8 / 1024.
FROM sys.partitions p
JOIN sys.allocation_units a ON p.[partition_id] = a.container_id
WHERE p.[object_id] IN (OBJECT_ID('#None'), OBJECT_ID('#Page'), OBJECT_ID('#Row'))

obj_name   type_desc     total_pages  total_mb
---------- ------------- ------------ ---------
#None      IN_ROW_DATA   1156         9.031250
#Row       IN_ROW_DATA   1132         8.843750
#Page      IN_ROW_DATA   1004         7.843750

5. ColumnStore

Но что мне нравится больше всего — это ColumnStore индексы, которые от версии к версии в SQL Server становятся все лучше и лучше.

Главная идея ColumnStore — разбивать данные в таблице на RowGroup-ы примерно по 1 миллиону строк и в рамках этой группы сжимать данные по столбцам. За счет этого достигается существенная экономия дискового пространства, сокращение логических чтений и ускорение аналитических запросов. Поэтому если есть необходимость хранения архива с JSON информацией, то можно создать кластерный ColumnStore индекс:

USE AdventureWorks2014
GO

DROP TABLE IF EXISTS #CCI
DROP TABLE IF EXISTS #InitialTable
GO

CREATE TABLE #CCI (ID INT, Val NVARCHAR(MAX), INDEX ix CLUSTERED COLUMNSTORE)
GO

SELECT h.SalesOrderID
     , JSON_Data = CAST(
           (
                SELECT p.[Name]
                FROM Sales.SalesOrderDetail d
                JOIN Production.Product p ON d.ProductID = p.ProductID
                WHERE d.SalesOrderID = h.SalesOrderID
                FOR JSON AUTO
           )
       AS VARCHAR(8000)) -- SQL Server 2012..2016
INTO #InitialTable
FROM Sales.SalesOrderHeader h

SET STATISTICS TIME ON

INSERT INTO #CCI
SELECT *
FROM #InitialTable

SET STATISTICS TIME OFF

Скорость вставки в таблицу при этом будет примерно соответствовать PAGE сжатию. Кроме того, можно более тонко настроить процесс под OLTP нагрузку за счет опции COMPRESSION_DELAY.

#CCI: CPU time = 140 ms, elapsed time = 136 ms

До SQL Server 2017 ColumnStore индексы не поддерживали типы данных [N]VARCHAR(MAX), но вместе с релизом новой версии нам разрешили хранить строки любой длины в ColumnStore.

USE tempdb
GO

SELECT o.[name]
     , s.used_page_count / 128.
FROM sys.indexes i
JOIN sys.dm_db_partition_stats s ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id
JOIN sys.objects o ON i.[object_id] = o.[object_id]
WHERE i.[object_id] = OBJECT_ID('#CCI')

Выигрыш от этого иногда бывает очень внушительный:

------ ---------
#CCI   0.796875

6. Create JSON

Теперь рассмотрим, каким образом можно сгенерировать JSON. Если вы уже работали с XML в SQL Server, то здесь все делается по аналогии.

Для формирования JSON проще всего использовать FOR JSON AUTO. В этом случае будет сгенерирован массив JSON из объектов:

DROP TABLE IF EXISTS #Users
GO

CREATE TABLE #Users (
      UserID INT
    , UserName SYSNAME
    , RegDate DATETIME
)

INSERT INTO #Users
VALUES (1, 'Paul Denton', '20170123')
     , (2, 'JC Denton', NULL)
     , (3, 'Maggie Cho', NULL)

SELECT *
FROM #Users
FOR JSON AUTO

[
    {
        "UserID":1,
        "UserName":"Paul Denton",
        "RegDate":"2029-01-23T00:00:00"
    },
    {
        "UserID":2,
        "UserName":"JC Denton"
    },
    {
        "UserID":3,
        "UserName":"Maggie Cho"
    }
]

Важно заметить, что NULL значения игнорируются. Если мы хотим их включать в JSON, то можем воспользоваться опцией INCLUDE_NULL_VALUES:

SELECT UserID, RegDate
FROM #Users
FOR JSON AUTO, INCLUDE_NULL_VALUES

[
    {
        "UserID":1,
        "RegDate":"2017-01-23T00:00:00"
    },
    {
        "UserID":2,
        "RegDate":null
    },
    {
        "UserID":3,
        "RegDate":null
    }
]

Если нужно избавиться от квадратных скобок, то в этом нам поможет опция WITHOUT_ARRAY_WRAPPER:

SELECT TOP(1) UserID, UserName
FROM #Users
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER

{
    "UserID":1,
    "UserName":"Paul Denton"
}

Если же мы хотим объединить результаты с корневым элементом, то для этого предусмотрена опция ROOT:

SELECT UserID, UserName
FROM #Users
FOR JSON AUTO, ROOT('Users')

{
    "Users":[
        {
            "UserID":1,
            "UserName":"Paul Denton"
        },
        {
            "UserID":2,
            "UserName":"JC Denton"
        },
        {
            "UserID":3,
            "UserName":"Maggie Cho"
        }
    ]
}

Если требуется создать JSON с более сложной структурой, присвоить нужные название свойствам, сгруппировать их, то необходимо использовать выражение FOR JSON PATH:

SELECT TOP(1) UserID
            , UserName AS [Detail.FullName]
            , RegDate AS [Detail.RegDate]
FROM #Users
FOR JSON PATH

[
    {
        "UserID":1,
        "Detail":{
            "FullName":"Paul Denton",
            "RegDate":"2017-01-23T00:00:00"
        }
    }
]

SELECT t.[name]
     , t.[object_id]
     , [columns] = (
             SELECT c.column_id, c.[name]
             FROM sys.columns c
             WHERE c.[object_id] = t.[object_id]
             FOR JSON AUTO
         )
FROM sys.tables t
FOR JSON AUTO

[
    {
        "name":"#Users",
        "object_id":1483152329,
        "columns":[
            {
            "column_id":1,
            "name":"UserID"
            },
            {
            "column_id":2,
            "name":"UserName"
            },
            {
            "column_id":3,
            "name":"RegDate"
            }
        ]
    }
]

7. Check JSON

Для проверки правильности JSON формата существует функция ISJSON, которая возвращает 1, если это JSON, 0 — если нет и NULL, если был передан NULL.

DECLARE @json1 NVARCHAR(MAX) = N'{"id": 1}'
      , @json2 NVARCHAR(MAX) = N'[1,2,3]'
      , @json3 NVARCHAR(MAX) = N'1'
      , @json4 NVARCHAR(MAX) = N''
      , @json5 NVARCHAR(MAX) = NULL

SELECT ISJSON(@json1) -- 1
     , ISJSON(@json2) -- 1
     , ISJSON(@json3) -- 0
     , ISJSON(@json4) -- 0
     , ISJSON(@json5) -- NULL

8. JsonValue

Чтобы извлечь скалярное значение из JSON, можно воспользоваться функцией JSON_VALUE:

DECLARE @json NVARCHAR(MAX) = N'
    {
        "UserID": 1,
        "UserName": "JC Denton",
        "IsActive": true,
        "Date": "2016-05-31T00:00:00",
        "Settings": [
             {
                "Language": "EN"
             },
             {
                "Skin": "FlatUI"
             }
          ]
    }'

SELECT JSON_VALUE(@json, '$.UserID')
     , JSON_VALUE(@json, '$.UserName')
     , JSON_VALUE(@json, '$.Settings[0].Language')
     , JSON_VALUE(@json, '$.Settings[1].Skin')
     , JSON_QUERY(@json, '$.Settings')

9. OpenJson

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

Существует 2 режима работы функции OPENSON. Самый простой — без указания схемы для результирующей выборки:

DECLARE @json NVARCHAR(MAX) = N'
    {
        "UserID": 1,
        "UserName": "JC Denton",
        "IsActive": true,
        "RegDate": "2016-05-31T00:00:00"
    }'

SELECT * FROM OPENJSON(@json)

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

DECLARE @json NVARCHAR(MAX) = N'
    [
        {
            "User ID": 1,
            "UserName": "JC Denton",
            "IsActive": true,
            "Date": "2016-05-31T00:00:00",
            "Settings": [
                 {
                    "Language": "EN"
                 },
                 {
                    "Skin": "FlatUI"
                 }
              ]
        },
        {
            "User ID": 2,
            "UserName": "Paul Denton",
            "IsActive": false
        }
    ]'

SELECT * FROM OPENJSON(@json)
SELECT * FROM OPENJSON(@json, '$[0]')
SELECT * FROM OPENJSON(@json, '$[0].Settings[0]')

SELECT *
FROM OPENJSON(@json)
    WITH (
          UserID INT '$."User ID"'
        , UserName SYSNAME
        , IsActive BIT
        , RegDate DATETIME '$.Date'
        , Settings NVARCHAR(MAX) AS JSON
        , Skin SYSNAME '$.Settings[1].Skin'
    )

Если в нашем документе есть вложенная иерархия, то поможет следующий пример:

DECLARE @json NVARCHAR(MAX) = N'
    [
        {
            "FullName": "JC Denton",
            "Children": [
                { "FullName": "Mary", "Male": "0" },
                { "FullName": "Paul", "Male": "1" }
            ]
        },
        {
            "FullName": "Paul Denton"
        }
    ]'

SELECT t.FullName, c.*
FROM OPENJSON(@json)
    WITH (
          FullName SYSNAME
        , Children NVARCHAR(MAX) AS JSON
    ) t
OUTER APPLY OPENJSON(Children)
    WITH (
          ChildrenName SYSNAME '$.FullName'
        , Male TINYINT
    ) c

10. Lax & strict

Начиная с SQL Server 2005, появилась возможность валидации XML со стороны базы за счет использования XML SCHEMA COLLECTION. Мы описываем схему для XML, а затем на ее основе можем проверять корректность данных. Такого функционала в явном виде для JSON нет, но есть обходной путь.

Насколько я помню, для JSON существует 2 типа выражений: strict и lax (используется по умолчанию). Отличие заключается в том, что если мы указываем несуществующие или неправильные пути при парсинге, то для lax выражения мы получим NULL, а в случае strict — ошибку:

DECLARE @json NVARCHAR(MAX) = N'
    {
        "UserID": 1,
        "UserName": "JC Denton"
    }'

SELECT JSON_VALUE(@json, '$.IsActive')
     , JSON_VALUE(@json, 'lax$.IsActive')
     , JSON_VALUE(@json, 'strict$.UserName')

SELECT JSON_VALUE(@json, 'strict$.IsActive')

Msg 13608, Level 16, State 2, Line 12
Property cannot be found on the specified JSON path.

11. Modify

Для модификации данных внутри JSON присутствует функция JSON_MODIFY. Примеры достаточно простые, поэтому нет смысла их детально расписывать:

DECLARE @json NVARCHAR(MAX) = N'
    {
        "FirstName": "JC",
        "LastName": "Denton",
        "Age": 20,
        "Skills": ["SQL Server 2014"]
    }'

SET @json = JSON_MODIFY(@json, '$.Age', CAST(JSON_VALUE(@json, '$.Age') AS INT) + 2) -- 20 -> 22
SET @json = JSON_MODIFY(@json, '$.Skills[0]', 'SQL 2016') -- "SQL 2014" -> "SQL 2016"
SET @json = JSON_MODIFY(@json, 'append $.Skills', 'JSON')

SELECT * FROM OPENJSON(@json)

SELECT * FROM OPENJSON(JSON_MODIFY(@json, 'lax$.Age', NULL)) -- delete Age
SELECT * FROM OPENJSON(JSON_MODIFY(@json, 'strict$.Age', NULL)) -- set NULL
GO

DECLARE @json NVARCHAR(100) = N'{ "price": 105.90 }' -- rename
SET @json = 
    JSON_MODIFY( 
        JSON_MODIFY(@json, '$.Price',
            CAST(JSON_VALUE(@json, '$.price') AS NUMERIC(6,2))),
                '$.price', NULL)

SELECT @json

12. Convert implicit

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

При парсинге JSON нужно помнить об одном нюансе — OPENJSON и JSON_VALUE возвращают результат в Unicode, если мы это не переопределяем. В базе AdventureWorks столбец AccountNumber имеет тип данных VARCHAR:

USE AdventureWorks2014
GO

DECLARE @json NVARCHAR(MAX) = N'{ "AccountNumber": "AW00000009" }'

SET STATISTICS IO ON

SELECT CustomerID, AccountNumber
FROM Sales.Customer
WHERE AccountNumber = JSON_VALUE(@json, '$.AccountNumber')

SELECT CustomerID, AccountNumber
FROM Sales.Customer
WHERE AccountNumber = CAST(JSON_VALUE(@json, '$.AccountNumber') AS VARCHAR(10))

SET STATISTICS IO OFF

Разница в логических чтениях:

Table 'Customer'. Scan count 1, logical reads 37, ...
Table 'Customer'. Scan count 0, logical reads 2, ...

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

Если же указать явно тип, как и у столбца, то мы получим IndexSeek:

13. Indexes

Теперь рассмотрим, как можно индексировать JSON объекты. Как я уже говорил вначале, в SQL Server 2016 не был добавлен отдельный тип данных для JSON, в отличие от XML. Поэтому для его хранения вы можете использовать любые строковые типы данных.

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

Увы, но JSONB не завезли. Команда разработки торопилась при релизе JSON функционала и сказала буквально следующее: «Если вам будет не хватать скорости, то мы добавим JSONB в следующей версии». С релизом SQL Server 2017 этого не произошло.

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

USE AdventureWorks2014
GO

DROP TABLE IF EXISTS #JSON
GO

CREATE TABLE #JSON (
      DatabaseLogID INT PRIMARY KEY
    , InfoJSON NVARCHAR(MAX) NOT NULL
)
GO

INSERT INTO #JSON
SELECT DatabaseLogID
     , InfoJSON = (
            SELECT PostTime, DatabaseUser, [Event], [Schema], [Object], [TSQL]
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
         )
FROM dbo.DatabaseLog

Каждый раз парсить один и те же данные не очень рационально:

SET STATISTICS IO, TIME ON

SELECT *
FROM #JSON
WHERE JSON_VALUE(InfoJSON, '$.Schema') + '.' + JSON_VALUE(InfoJSON, '$.Object') = 'Person.Person'

SET STATISTICS IO, TIME OFF

Table '#JSON'. Scan count 1, logical reads 187, ...
    CPU time = 16 ms, elapsed time = 29 ms

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

ALTER TABLE #JSON
    ADD ObjectName AS JSON_VALUE(InfoJSON, '$.Schema') + '.' + JSON_VALUE(InfoJSON, '$.Object')
GO

CREATE INDEX IX_ObjectName ON #JSON (ObjectName)
GO

SET STATISTICS IO, TIME ON

SELECT *
FROM #JSON
WHERE JSON_VALUE(InfoJSON, '$.Schema') + '.' + JSON_VALUE(InfoJSON, '$.Object') = 'Person.Person'

SELECT *
FROM #JSON
WHERE ObjectName = 'Person.Person'

SET STATISTICS IO, TIME OFF

При этом оптимизатор SQL Server весьма умный, поэтому менять в коде ничего не потребуется:

Table '#JSON'. Scan count 1, logical reads 13, ...
    CPU time = 0 ms, elapsed time = 1 ms

Table '#JSON'. Scan count 1, logical reads 13, ...
    CPU time = 0 ms, elapsed time = 1 ms

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

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

USE AdventureWorks2014
GO

DROP TABLE IF EXISTS dbo.LogJSON
GO

CREATE TABLE dbo.LogJSON (
      DatabaseLogID INT
    , InfoJSON NVARCHAR(MAX) NOT NULL
    , CONSTRAINT pk PRIMARY KEY (DatabaseLogID)
)
GO

INSERT INTO dbo.LogJSON
SELECT DatabaseLogID
     , InfoJSON = (
            SELECT PostTime, DatabaseUser, [Event], ObjectName = [Schema] + '.' + [Object]
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
         )
FROM dbo.DatabaseLog
GO

IF EXISTS(
    SELECT *
    FROM sys.fulltext_catalogs
    WHERE [name] = 'JSON_FTC'
)
    DROP FULLTEXT CATALOG JSON_FTC
GO

CREATE FULLTEXT CATALOG JSON_FTC WITH ACCENT_SENSITIVITY = ON AUTHORIZATION dbo
GO

IF EXISTS (
        SELECT *
        FROM sys.fulltext_indexes
        WHERE [object_id] = OBJECT_ID(N'dbo.LogJSON')
    ) BEGIN
    ALTER FULLTEXT INDEX ON dbo.LogJSON DISABLE
    DROP FULLTEXT INDEX ON dbo.LogJSON
END
GO

CREATE FULLTEXT INDEX ON dbo.LogJSON (InfoJSON) KEY INDEX pk ON JSON_FTC
GO

SELECT *
FROM dbo.LogJSON
WHERE CONTAINS(InfoJSON, 'ALTER_TABLE')

14. Parser performance

И наконец мы подошли, пожалуй, к самой интересной части этой статьи. Насколько быстрее парсится JSON по сравнению с XML на SQL Server? Чтобы ответить на этот вопрос, я подготовил серию тестов.

Подготавливаем 2 больших файла в JSON и XML формате:

/*
    EXEC sys.sp_configure 'show advanced options', 1
    GO
    RECONFIGURE
    GO

    EXEC sys.sp_configure 'xp_cmdshell', 1
    GO
    RECONFIGURE WITH OVERRIDE
    GO
*/

USE AdventureWorks2014
GO

DROP PROCEDURE IF EXISTS ##get_xml
DROP PROCEDURE IF EXISTS ##get_json
GO

CREATE PROCEDURE ##get_xml
AS
    SELECT r.ProductID
         , r.[Name]
         , r.ProductNumber
         , d.OrderQty
         , d.UnitPrice
         , r.ListPrice
         , r.Color
         , r.MakeFlag
    FROM Sales.SalesOrderDetail d
    JOIN Production.Product r ON d.ProductID = r.ProductID
    FOR XML PATH ('Product'), ROOT('Products')
GO

CREATE PROCEDURE ##get_json
AS
    SELECT (
        SELECT r.ProductID
             , r.[Name]
             , r.ProductNumber
             , d.OrderQty
             , d.UnitPrice
             , r.ListPrice
             , r.Color
             , r.MakeFlag
        FROM Sales.SalesOrderDetail d
        JOIN Production.Product r ON d.ProductID = r.ProductID
        FOR JSON PATH
    )
GO

DECLARE @sql NVARCHAR(4000)
SET @sql = 'bcp "EXEC ##get_xml" queryout "X:\sample.xml" -S ' + @@servername + ' -T -w -r -t'
EXEC sys.xp_cmdshell @sql

SET @sql = 'bcp "EXEC ##get_json" queryout "X:\sample.txt" -S ' + @@servername + ' -T -w -r -t'
EXEC sys.xp_cmdshell @sql

Проверяем производительность OPENJSON, OPENXML и XQuery:

SET NOCOUNT ON
SET STATISTICS TIME ON

DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'X:\sample.xml', SINGLE_BLOB) x

DECLARE @jsonu NVARCHAR(MAX)
SELECT @jsonu = BulkColumn
FROM OPENROWSET(BULK 'X:\sample.txt', SINGLE_NCLOB) x

/*
    XML:      CPU = 891 ms, Time = 886 ms
    NVARCHAR: CPU = 141 ms, Time = 166 ms
*/

SELECT ProductID =     t.c.value('(ProductID/text())[1]', 'INT')
     , [Name] =        t.c.value('(Name/text())[1]', 'NVARCHAR(50)')
     , ProductNumber = t.c.value('(ProductNumber/text())[1]', 'NVARCHAR(25)')
     , OrderQty =      t.c.value('(OrderQty/text())[1]', 'SMALLINT')
     , UnitPrice =     t.c.value('(UnitPrice/text())[1]', 'MONEY')
     , ListPrice =     t.c.value('(ListPrice/text())[1]', 'MONEY')
     , Color =         t.c.value('(Color/text())[1]', 'NVARCHAR(15)')
     , MakeFlag =      t.c.value('(MakeFlag/text())[1]', 'BIT')
FROM @xml.nodes('Products/Product') t(c)

/*
    CPU time = 6203 ms, elapsed time = 6492 ms
*/

DECLARE @doc INT
EXEC sys.sp_xml_preparedocument @doc OUTPUT, @xml

SELECT *
FROM OPENXML(@doc, '/Products/Product', 2)
    WITH (
          ProductID INT
        , [Name] NVARCHAR(50)
        , ProductNumber NVARCHAR(25)
        , OrderQty SMALLINT
        , UnitPrice MONEY
        , ListPrice MONEY
        , Color NVARCHAR(15)
        , MakeFlag BIT
    )

EXEC sys.sp_xml_removedocument @doc

/*
    CPU time = 2656 ms, elapsed time = 3489 ms
    CPU time = 3844 ms, elapsed time = 4482 ms
    CPU time = 0 ms, elapsed time = 4 ms
*/

SELECT *
FROM OPENJSON(@jsonu)
    WITH (
          ProductID INT
        , [Name] NVARCHAR(50)
        , ProductNumber NVARCHAR(25)
        , OrderQty SMALLINT
        , UnitPrice MONEY
        , ListPrice MONEY
        , Color NVARCHAR(15)
        , MakeFlag BIT
    )

/*
    CPU time = 1359 ms, elapsed time = 1642 ms
*/

SET STATISTICS TIME, IO OFF

Теперь проверим производительность скалярной функции JSON_VALUE относительно XQuery:

SET NOCOUNT ON

DECLARE @jsonu NVARCHAR(MAX) = N'[
    {"User":"Sergey Syrovatchenko","Age":28,"Skills":["SQL Server","T-SQL","JSON","XML"]},
    {"User":"JC Denton","Skills":["Microfibral Muscle","Regeneration","EMP Shield"]},
    {"User":"Paul Denton","Age":32,"Skills":["Vision Enhancement"]}]'

DECLARE @jsonu_f NVARCHAR(MAX) = N'[
   {
      "User":"Sergey Syrovatchenko",
      "Age":28,
      "Skills":[
         "SQL Server",
         "T-SQL",
         "JSON",
         "XML"
      ]
   },
   {
      "User":"JC Denton",
      "Skills":[
         "Microfibral Muscle",
         "Regeneration",
         "EMP Shield"
      ]
   },
   {
      "User":"Paul Denton",
      "Age":32,
      "Skills":[
         "Vision Enhancement"
      ]
   }
]'

DECLARE @json VARCHAR(MAX) = @jsonu
      , @json_f VARCHAR(MAX) = @jsonu_f

DECLARE @xml XML = N'
<Users><User Name="Sergey Syrovatchenko"><Age>28</Age><Skills><Skill>SQL Server</Skill><Skill>T-SQL</Skill><Skill>JSON</Skill><Skill>XML</Skill></Skills></User><User Name="JC Denton"><Skills><Skill>Microfibral Muscle</Skill><Skill>Regeneration</Skill><Skill>EMP Shield</Skill></Skills></User><User Name="Paul Denton"><Age>28</Age><Skills><Skill>Vision Enhancement</Skill></Skills></User></Users>'

DECLARE @i INT
      , @int INT
      , @varchar VARCHAR(100)
      , @nvarchar NVARCHAR(100)
      , @s DATETIME
      , @runs INT = 100000

DECLARE @t TABLE (
      iter INT IDENTITY PRIMARY KEY
    , data_type VARCHAR(100)
    , [path] VARCHAR(1000)
    , [type] VARCHAR(1000)
    , time_ms INT
)

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @int = JSON_VALUE(@jsonu, '$[0].Age')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @int = JSON_VALUE(@jsonu_f, '$[0].Age')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu_f', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @int = JSON_VALUE(@json, '$[0].Age')
         , @i += 1
INSERT INTO @t
SELECT '@json', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @int = JSON_VALUE(@json_f, '$[0].Age')
         , @i += 1
INSERT INTO @t
SELECT '@json_f', '$[0].Age', 'INT', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @int = @xml.value('(Users/User[1]/Age/text())[1]', 'INT')
         , @i += 1
INSERT INTO @t
SELECT '@xml', '(Users/User[1]/Age/text())[1]', 'INT', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @nvarchar = JSON_VALUE(@jsonu, '$[1].User')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu', '$[1].User', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @nvarchar = JSON_VALUE(@jsonu_f, '$[1].User')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu_f', '$[1].User', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = JSON_VALUE(@json, '$[1].User')
         , @i += 1
INSERT INTO @t
SELECT '@json', '$[1].User', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = JSON_VALUE(@json_f, '$[1].User')
         , @i += 1
INSERT INTO @t
SELECT '@json_f', '$[1].User', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @nvarchar = @xml.value('(Users/User[2]/@Name)[1]', 'NVARCHAR(100)')
         , @i += 1
INSERT INTO @t
SELECT '@xml', '(Users/User[2]/@Name)[1]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = @xml.value('(Users/User[2]/@Name)[1]', 'VARCHAR(100)')
         , @i += 1
INSERT INTO @t
SELECT '@xml', '(Users/User[2]/@Name)[1]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @nvarchar = JSON_VALUE(@jsonu, '$[2].Skills[0]')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu', '$[2].Skills[0]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @nvarchar = JSON_VALUE(@jsonu_f, '$[2].Skills[0]')
         , @i += 1
INSERT INTO @t
SELECT '@jsonu_f', '$[2].Skills[0]', 'NVARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = JSON_VALUE(@json, '$[2].Skills[0]')
         , @i += 1
INSERT INTO @t
SELECT '@json', '$[2].Skills[0]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = JSON_VALUE(@json_f, '$[2].Skills[0]')
         , @i += 1
INSERT INTO @t
SELECT '@json_f', '$[2].Skills[0]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT @i = 1, @s = GETDATE()
WHILE @i <= @runs
    SELECT @varchar = @xml.value('(Users/User[3]/Skills/Skill/text())[1]', 'VARCHAR(100)')
         , @i += 1
INSERT INTO @t
SELECT '@xml', '(Users/User[3]/Skills/Skill/text())[1]', 'VARCHAR', DATEDIFF(ms, @s, GETDATE())

SELECT * FROM @t

Полученные результаты:

iter   data_type  path                                    type      2016 SP1    2017 RTM
------ ---------- --------------------------------------- --------- ----------- -----------
1      @jsonu     $[0].Age                                INT       830         273
2      @jsonu_f   $[0].Age                                INT       853         300
3      @json      $[0].Age                                INT       963         374
4      @json_f    $[0].Age                                INT       987         413
5      @xml       (Users/User[1]/Age/text())[1]           INT       23333       24717

6      @jsonu     $[1].User                               NVARCHAR  1047        450
7      @jsonu_f   $[1].User                               NVARCHAR  1153        567
8      @json      $[1].User                               VARCHAR   1177        570
9      @json_f    $[1].User                               VARCHAR   1303        693
10     @xml       (Users/User[2]/@Name)[1]                NVARCHAR  18864       20070
11     @xml       (Users/User[2]/@Name)[1]                VARCHAR   18913       20117

12     @jsonu     $[2].Skills[0]                          NVARCHAR  1347        746
13     @jsonu_f   $[2].Skills[0]                          NVARCHAR  1563        980
14     @json      $[2].Skills[0]                          VARCHAR   1483        860
15     @json_f    $[2].Skills[0]                          VARCHAR   1717        1094
16     @xml       (Users/User[3]/Skills/Skill/text())[1]  VARCHAR   19510       20767

Краткие выводы

  • Извлечение данных из JSON происходит от 2 до 10 раз быстрее, чем из XML.
  • Хранение JSON зачастую более избыточное, нежели в XML формате.
  • Процессинг JSON данных в Unicode происходит на 5-15%быстрее.
  • При использовании JSON можно существенно снизить нагрузку на CPU сервера.
  • В SQL Server 2017 существенно ускорили парсинг скалярных значений из JSON.

Все тесты проводились:

Windows 8.1 Pro 6.3×64
Core i5 3470 3.2GHz, 32Gb, SSD 850 Evo 250Gb
SQL Server 2016 SP1 Developer (13.0.4001.0)
SQL Server 2017 RTM Developer (14.0.1000.169)

И небольшое послесловие...

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

Знаю, что краткость — не мой конек. Но если вы дочитали до конца, то надеюсь, это было полезным. В любом случае буду рад конструктивным комментариям о вашем жизненном опыте использования JSON на SQL Server 2016/2017. Отдельная благодарность, если вы проверите скорость последних двух примеров. Есть подозрение, что JSON не всегда такой быстрый, и интересно найти репро.

Для тех, кому хочется продолжения: 18-гоноября в Днепрея буду проводить митап. Более 4-хчасов практических примеров, неожиданных багов и адских граблей, на которые я наступал... пока пытался сам для себя найти ответ на вопрос: «Что же лучше использовать — XML или JSON?».

Какая польза от Agile: несколько кейсов из практики

$
0
0

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

Из хаоса в Скрам

Артем Быковец, Certified Scrum Master, Agile Coach:

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

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

Первый месяц я занимался изучением окружения, при этом еще ничего не менял и не внедрял. Затем провел 1×1 с каждым членом команды. Спрашивал, чем этот специалист занимался последние 3 месяца, что сделал за это время, что нового отдал пользователям. Ответы были в духе: «Я работал над Competera». Добиться конкретики — какой функционал добавили, какие именно проблемы решили — не удавалось.

Затем я пошел общаться с Sales & Business Developers. Оказалось, что они не могут подписать некоторые контракты, «потому что программисты чем-то своим заняты». То есть продажи и разработка были очень сильно расфокусированы: сейлзы пытались продать то, чего еще нет, а программисты разрабатывали то, что пока еще можно было и не разрабатывать.

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

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

В других командах внедрили Скрамбан: мы планировали только около 60% спринта, а остальные 40% времени закладывали для того, чтобы оперативно реагировать на падающие задачи с продакшена. Например, если звонил клиент и говорил, что у него что-то не работает, мы могли сразу разобраться с его вопросами и не угробить планы на спринт. Если нам везло и в течение спринта и с продакшена ничего не прилетало, то мы просто добирали задачи из бэклога.

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

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

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

Дальше — еще интереснее. Чтобы как-то стыковать тактические задачи на уровне команд и департаментов и стратегические на уровне всей компании, мы внедрили OKR — Objectives and Key Result. Этот фреймворк популярен в крупных компаниях, таких как Intel, Google, LinkedIn. Он заключается в том, что бизнес задает цели на год, затем годовые цели распадаются на квартальные. Каждый отдел компании думает, какими своими личными целями он может приблизить компанию к этим результатам.

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

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

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

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

«Изобретение» Agile

Сергей Семенов, Certified Scrum Master, Certified Facilitator:

«А почему ты выбрал Scrum? Как встал на эту тропу, с чего всё началось?» Отвечая на такие вопросы, я иногда шучу, что так получилось, что когда-то я его изобрёл сам...

5,5 лет назад я даже не слышал о таких словах, как Agile, Скрам, бэклог, ретроспектива. В то время я занимался разработкой и администрированием баз данных в крупной не IT-компании (700+ сотрудников). Тогда и произошел переломный момент в моей карьере.

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

Снежный ком тикетов в HelpDesk нарастал. Начальники, мягко говоря, не справлялись с ситуацией и подходили к вопросу творчески. К примеру, говорили так: «Если прилетает новый тикет, то сразу перекидывайте его назад и просите уточнить требования или смоделировать ситуацию. Главное, чтобы на нашем отделе было поменьше тикетов. А если перекидывать назад, у нас будут нормальные показатели».

Когда и этот подход не помогал, изобрели другой — с кодовым названием «Наверняка». Он заключался в том, чтобы принимать запросы на разработку новой функциональности по шаблону, в основе которого был использован ГОСТ 80-90-х годов с вишенкой на торте: обязательный для заполнения раздел об экономической выгоде в случае реализации запрашиваемого функционала. Другими словами, IT-отдел требовал у бизнеса экономическое обоснование на разработку, без которого футболил тикеты. Бизнес был не просто недоволен, он был взбешен такой работой.

Вскоре на работу вышел новый IT-директор.

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

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

Я рассказал свое видение ситуации, называя вещи своими именами и понимая, что за эти слова меня могут уволить (на тот момент я был в штате всего месяцев 5). Но работать без изменений в этом окружении мне уже не хотелось. К моему удивлению, IT-директор спросил: «А потенции у тебя хватит навести здесь порядок?». Какая тонкая манипуляция! И я ответил, что хватит. Забегая наперед, скажу, что её таки хватило :)

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

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

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

Один из разработчиков в итоге выдал: «Понимаешь Серега, я работаю тут уже 2 года, делаю 3 тикета за неделю, а мне таких еще 5 прилетает. А на мне их и так уже 60, и этот снежный ком постоянно растет. Какой смысл мне вкалывать и стараться — все равно нас никто не ценит и все будут недовольны. А ещё наши заказчики не могут договориться между собой, что приоритетней. Я только начну что-то делать, как кто-то прибегает и требует сделать отчёт, поскольку от него зависят бонусы его отдела, или другую срочную доработку. И стоит над душой, пока я ее не сделаю. А цирк начинается, когда таких заказчиков двое, трое, и они между собой выясняют, чем мне заниматься. Если я беру тикеты в работу по принципу FIFO, то вот и получается, что тикет, который пришел сегодня, попадет в работу через полгода. А потом еще жалуются, что долго ждут. А мне что делать?»

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

Вот только согласно политике компании тикет должен быть на кого-то назначен: потому-то они и накапливались. Вот незадача, что же делать? А что если перевести все тикеты на себя? Тогда я по сути стану хранителем бэклога (правда, такого слова я тогда тоже еще не знал). Нет, не то пальто: в таком случае у меня будет бардак с тикетами в HelpDesk.

И вот оно решение, простое, как пробка, доступное в тех условиях: мы создали фейкового сотрудника в HelpDesk и абсолютно все тикеты перебросили на него. Дали ему имя Герасим, а фамилию придумали айтишную — Софтенко. И наконец-то у разработчиков стало пусто в HelpDesk — красота.

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

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

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

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

Прошло несколько месяцев, мы выработали устойчивый процесс. Недельные спринты начинались с планирования и заканчивались подведением итогов и определением шагов по улучшению. Мы попадали в коммитмент на 90-100%.На протяжении спринта мы ежедневно общались, обсуждали прогресс — собирались в одном и том же месте, в одно и тоже время, все длилось 15-30 минут.Узнаете стендап? А нам казалось, что это придумали мы и это наша находка.

В результате мы не только систематически выполняли обязательства по взятым в спринт задачам, мы ещё и подняли нашу производительность в 3-4раза в первые 2 месяца и удерживали эту скорость на протяжении 10 месяцев. А потом меня переманили в PocketBook, и я сменил работу :)

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

Наш успех я связываю со следующими изменениями:

  1. Мы перенесли все тикеты с разработчиков в сторонку. Накопившаяся гора тикетов больше не давила и не подавляла желание работать на результат.
  2. Начали работать спринтами и проводили командные встречи.
  3. Процесс стал прозрачным и для команды разработки, и для бизнеса. Команда сама оценивала и принимала решение, сколько задач брать, чтобы их завершить к концу спринта. В свою очередь департаменты видели, над чем работает IT-отдел, и получали готовый инкремент в конце каждой недели.
  4. Прекратились «шатания» и «нависания» над столами разработчиков. Ребята были счастливы, что могут просто спокойно делать свою работу, и их больше не отвлекают.
  5. Разработчикам начали давать положительный фидбэк со стороны бизнеса, их хвалили и ценили. Это давало +100 к мотивации. Команда начала чувствовать, что она приносит пользу бизнесу.
  6. Команде разработки были присущи ценности: открытость, уважение, доверие, взаимоподдержка, обязательства, работа на результат.
  7. Дружественная атмосфера в IT-отделе.
  8. Фокус на сотрудничество с заказчиком, а не игра с ним в футбол.
  9. Открытость и прозрачность для бизнеса: в любой момент времени каждый мог видеть, над чем работает IT-отдел.

И только через год я открыл для себя Скрам, его ценности, принципы, встречи, роли, артефакты... Как все знакомо, ну кто бы мог подумать! И вот, последние 3 года я помогаю компаниями и командам создавать ценность, используя этот фреймворк.

Канбан внутри «водопада»

Анна Лаврова, PM, Certified Scrum Master, SAFe Agilist:

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

На входе: digital-агентство с 10+ активными проектами. Их средний размер — 3 месяца, в команде 6 человек. К тому же, были короткие и быстрые спецпроекты раз в месяц и промопроекты, которые нужно провернуть за три дня. Вдобавок: запросы от существующих клиентов и их пользователей, а также несколько внутренних проектов «для разминки» и опять же оптимизации всего, что происходит.

Digital-агентство — часть устоявшейся другой медийной компании. Все проекты продаются без утверждения сроков с командой и без готового ТЗ, но с дедлайном. Представьте себе онлайн-версию журнала, типа Forbes. У нас не всегда были готовые сверстанные статьи и фотографии, но было понимание, когда же выйдет новый выпуск и его outline — тема, заглавная идея и наброски основных секций (статей).

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

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

Идея: создать доску, на которой будут вертикально отображены процессы, а горизонтально — проекты (в Jira это делается за счет swimlane). Эти проекты будут перетягиваться вверх-вниз и вправо-влево в зависимости от приоритетов. Свои приоритеты будут и у задач внутри каждого проекта.

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

Доска в Jira: свимлейн — это проект, а вертикальная колонка — процесс

Каждую неделю команде озвучивали «проект недели» — проект с наивысшим приоритетом. Только после выполнения всех задач по нему можно было приступать ко второму, третьему внутреннему проекту. Также мы сделали супер свимлейн highest urgent important — сюда попадали задачи от клиентов. Например, на мобильной версии сайта потерялся логотип или поломалась картинка, кнопка перестала быть кликабельна и т. п.

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

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

Челленджем работы с Jira была автоматизация процессов, которая помогла с метриками. Когда задача перетягивалась в одну из колонок, запускался внутренний таймер, который далее помогал измерить lead time, cycle time, time to production, waste in queue time.

Также мы сделали физическую доску, где писали все ключевые даты по проектам и их стадии.

Что не сделали: не приняли практику ретроспектив. Однако приняли lessons learned как часть процесса и проводили встречи, похожие по формату на lean coffee.

В планах — больше автоматизаций.

В результате получили:

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

Скрам и несдвигаемые дедлайны

Андрей Троянов, Delivery Lead and Agile PM:

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

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

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

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

Проблемных мест в процессе внедрения тоже было немало:

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

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

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

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

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

— Обязательное Code Review.До этого в компании вообще не использовалась такая практика. В итоге удалось договориться с заказчиками, чтобы в каждой задаче отводить на Code Review 30 минут.

Подведу итог. За 2 месяца мы внедрили новый подход к работе с требованиями, перешли на практику Continuous Design, ввели регулярное Code Review. Эти изменения упростили и повысили эффективность работы с отделами разработки и дизайна игры. Вместе с тем, качество поставляемого продукта существенно улучшилось.

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

Ефективне самонавчання. Що ми робимо не так?

$
0
0

Я вчився, відколи себе пам’ятаю: спершу вчився читати, потім — читав, щоб вчитися. Іронічно, але донедавна я не задумувався про те, щоб навчитися вчитися, адже ні в школі, ні в університеті цьому ніхто не приділяв уваги.

В сфері ІТ ефективне самонавчання — одне з найважливіших вмінь, але при цьому одне з найменш розвинених. З постійною зміною та еволюцією технологій ефективна самоосвіта допомагає тримати багато дверей відчиненими, диверсифікувати та регулярно інвестувати в портфоліо власних знань.

Illustration by Yukai Du

Але що саме це значить — вивчити щось ефективно? На мою думку, ефективне навчання — це одноразовий процес глибокого засвоєння і розуміння важливої інформації, концепцій та ідей і їх поєднання з уже наявними знаннями і досвідом. Це зосереджений процес, націлений в ідеалі на те, щоб зрозуміти та засвоїти нові знання раз і назавжди.

Проблема з підходом, який практикують більшість програмістів, яких я знаю (включаючи мене в минулому), — в тому, що вони вивчають лише стільки, скільки достатньо для вирішення тієї чи іншої задачі.

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

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

Особисто я вирішив вдосконалити свій підхід до засвоєння нової інформації після того, як вкотре не міг згадати якусь ідею чи «дістати» з пам’яті знання, які я був впевнений, що засвоїв раніше. До деяких книг чи статей я повертався багаторазово протягом кількох років, щоразу читаючи їх наче вперше.

Представлений підхід є результатом моїх особистих експериментів із самонавчання, поєднання простих та відомих багатьом технік з різних книг та онлайн-джерел про пам’ять, навчання та знання.

Мій підхід складається з п’яти етапів: підготовка, розвідка, практика, занурення та повторення.

Підготовка

Ефективність інших етапів значною мірою залежить від цього короткого, але дуже важливого етапу.

На цьому кроці ви обираєте матеріали для навчання. Потурбуйтеся про те, щоб зібрати найкращі доступні джерела інформації: читайте відгуки, рекомендації експертів у галузі чи покладіться на власний досвід.

Illustration by Yukai Du

Розвідка

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

Спробуйте зрозуміти, у чому полягає основна ідея, що автор намагається донести та яким способом він це робить.

Не концентруйтесь на складних частинах і не соромтесь пропускати матеріал, який ви не розумієте.

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

Практика

Один з найдовших та найзосередженіших етапів. Це безперервний етап — він не закінчується перед наступним, а продовжується протягом всього процесу засвоєння нових знань.

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

Дуже важливим є вибір правильних вправ для практики — вони повинні бути достатньо складними, щоб відчувався прогрес, але не надто складними чи великими, щоб не демотивувати.

Для прикладу, якщо ви швидко пройшлися по синтаксису нової для вас мови, хороша ідея — написати кілька кат, але створювати ще один клон «Твіттера» — трохи передчасно.

Занурення

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

Основна мета на цьому етапі — зрозуміти всі найскладніші ідеї, які ви ідентифікуєте під час практики. Для цього я рекомендую використовувати метод Фейнмана:

Ідентифікуйте тему

Ідентифікуйте предмет занурення. Зберіть всю основну інформацію на цю тему, яку лише можете знайти в тих джерелах, що ви відібрали на етапі підготовки. Якщо тема надто велика — розбийте її на менші шматки. Пам’ятайте: половина вміння — краще, ніж «напіввміння».

Запишіть ідею, яку хочете зрозуміти

Візьміть шматок паперу чи створіть новий документ в редакторі на ваш вибір та запишіть ідею у заголовку.

Навчайте

Тепер час написати просте пояснення ідеї, так ніби ви навчаєте когось іншого, наприклад — пояснюєте її дитині. Використовуючи всю доступну вам інформацію, запишіть кожну частину ідеї своїми словами у вигляді кількох речень чи/та візуалізацій, які, на вашу думку, добре передають суть.

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

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

Illustration by Yukai Du

Повторення

Після заповнення всіх прогалин та розуміння ідеї — не думайте, що ви закінчили. Потрібно якось зберегти свіжі знання надовго, в ідеалі — назавжди.

Для цього покладіться на те, як працює людський мозок, та скористайтесь розподіленими повтореннями! Перетворіть та перенесіть усі свої нотатки з етапу занурення у флеш-картки, використовуючи програму на ваш вибір (я користуюсь Anki). Переглядайте картки щодня по 10-15 хвилин.

Не бійтесь перенасичення картками. Хороша програма вчиться розуміти, що ви засвоїли добре, і відкладає наступне повторення далі, фокусуючись на найсвіжіших знаннях.

Підсумок

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

Зверніть увагу на те, що останні три етапи — практика, занурення та повторення — протікають в основному паралельно, а не поступово.

Зокрема, при засвоєнні складних тем, котрі займають від кількох днів до кількох місяців, постійна практика породжує нові запитання, занурення в котрі призводить до ще більшої кількості нотаток та карток для повторення. Але повірте — результат того вартий!

Успіхів у навчанні!

Как украинские стартапы, работающие на американском рынке, ищут сотрудников

$
0
0

[Об авторе: Максим Печерский — руководитель и сооснователь стартапа PromoRepublic. Объединяет профессионалов, компании и стартапы для взаимовыгодного сотрудничества. Работает в Киеве, Хельсинки и Сан-Франциско]

PromoRepublic запустилась в 2013 году и за четыре года превратилась из гаражного стартапа в небольшую IT-компанию с 30 сотрудниками на трех континентах. Хочу поделиться своим опытом комплектования R&D команды в киевском офисе, которая может делать продукт на уровне топовых американских компаний.

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

Первый вариант отличный, кроме одного нюанса. Средний показатель зарплаты разработчиков в Долине составляет свыше $134 000 в год, а стоимость одного найма при помощи рекрутера — $10-40 тыс. Этих цифр нам хватило для понимания того, что для найма людей в США на нашем этапе денег не хватит. Как результат — мы решили искать сотрудников в Киеве и Хельсинки и растить их до нужного уровня компетенций.

Команда PromoRepublic

Первое время искали людей самостоятельно — размещали резюме, проводили собеседования. Методы поиска людей у нас были стандартные: Facebook, LinkedIn, Djinni, личные рекомендации. Позже мы наняли фриланс-рекрутера, который делает всю техническую часть работы и передает нам отфильтрованные входящие заявки. Примерно 1 из 10-20кандидатов нам подходит, и мы начинаем с ним работать.

Часто находить людей в команду помогает случай. После того, как наш маркетинг-директор ушел заниматься консалтингом, мы начали искать ему замену. И я по ошибке отправил ссылку на вакансию одному американскому инвестору, с которым не общался больше года. Спустя час он ответил ссылкой на резюме подходящего человека. Это оказался парень из Риги, спустя пять минут мы уже говорили с ним по скайпу. Выяснилось, что он — очень крутой специалист c опытом работы в США и сейчас как раз ищет работу. Он выбирал между тремя предложениями — одним из Финляндии, вторым из США, но в итоге присоединился к нашей команде и через несколько месяцев стал одним из ключевых сотрудников компании.

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

И вот, что мы придумали.

Челленджи и развитие

У наших кофаундеров Михаила Барановского и Валеры Грабко есть потрясающая способность «челленджить» и развивать людей. Первые вопросы, который они задают на интервью: какие твои цели на ближайшие 2-3года и как ты себя прокачиваешь? Если кандидат недостаточно амбициозен, мы отказываем. Для тех, кто прошел, мы выстраиваем персональный план развития. Для этого в компании используется система Objective and Key Results (OKR), которую придумали в Intel и используют в Airbnb, Uber, Google, MongoDB, LinkedIn и нескольких украинских компаниях. Задача OKR — соединить цели компании, командные цели и персональные и отобразить в очень простой форме, чтобы все могли работать в одном направлении и понимать свой вклад. Также мы развиваем product ownership и feature ownership, стараемся растить менеджеров внутри, давать больше знаний по разработке и маркетингу продуктов.

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

Знакомства с людьми, которые все знают и умеют

До того, как назвать себя San Francisco based startup, мы прошли через четыре акселератора: в Украине, Эстонии, Финляндии и Чили. За это время мы подружились с уймой классных специалистов по всему миру, включая тех, которые оправданно берут за свои консультации по несколько сотен долларов в час. Сейчас каждый наш сотрудник может свободно прийти к знакомой нам звезде Кремниевой долины со своими вопросами, и, скорее всего, тот не откажет ему в помощи. Еще мы обязали всех взять личные фриланс-проекты по SMM: какой же ты сотрудник SMM SaaS, если ни разу не обсуждал с клиентами тематику постов в Facebook?!

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

Не растерять команду

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

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

У нас был случай, когда спустя какое-то время после запуска стартапа от нас ушел сотрудник, у которого была доля в компании. Он проработал три года в различных гемблинговых компаниях, получая очень высокую зарплату, но в итоге вернулся к нам на меньшие деньги. Из чего мы делаем вывод: главное — получать удовольствие от работы, а не просто рубить бабло в различных серых нишах или на галерах. Еще мы заметили, что к нам идут люди ни дня не работавшие на галерах — им интересна философия продуктовой компании и они хотят создавать что-то интересное лично им, а не кодить очередную поваренную книгу для Samsung.

Постоянно задавать себе вопрос — что инновационного мы строим?

Разработчикам важно знать, что они создают что-то полезное и в чем заключается big idea их компании. Важно понимать не, ЧТО ты делаешь, а ЗАЧЕМ ты делаешь. В этом наше отличие от аутсорсинг-компаний — ты работаешь над своим продуктом, ты знаешь зачем он нужен, ты принимаешь решения о его развитии и ты видишь, как продукт «заходит» клиентам. Мы строим Netflix for Social Media Content, помогаем малому бизнесу зарабатывать больше, создавая контент для соцсетей на уровне крупных брендов. Без необходимости становиться экспертом в SMM.

Все эти задачи мы решаем путем шаблонов, автоматизации и применения в нашем продукте big data и AI. В тоже время есть много задач, связанных с дизайном, а это уже сложный Front-end — фреймворки Ember и React.

Опыт коллег

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

  1. Ваша команда работает удаленно или из офиса? Где находится главный офис? Сколько у вас сотрудников?
  2. Где вы ищете разработчиков в проект (соцсети, личные рекомендации, собственный HR-отдел, агентство)? Сложно ли уговорить хорошего специалиста работать в стартапе? Какова средняя медиана зарплат в вашем проекте по сравнению с рынком? Какими плюшками вы завлекаете человека идти работать к вам?
  3. Какие трудности возникают при рекрутинге?

Олег Кемпбелл, Founder/CEO в Reply.io

Работаем удаленно. Днепр и Торонто.

В порядке приоритета: рекомендации сотрудников, DOU, соцсети, агентство Indigo. Изначально ищем только тех, кто заинтересован работать в стартапе (указываем это в job post). ЗП средняя по рынку, привлекаем людей тем, что у нас удаленная работа, продуктовая компания, современные технологии и крутая команда.

Обычно поиск нового человека занимает от одного до трех месяцев.

Кирилл Бигай, Co-Founder/CEO в Preply

Работаем из офиса. Верим в то, что находиться рядом намного эффективнее, чем работать удаленно. Главный офис находится в Киеве, и нас около 40 человек.

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

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

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

Алексей Орап, Founder/CEO в YouScan

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

Ищем по-разному. Разработчиков в основном через DOU, Djinni, иногда привлекаем HR агентство. Мы участвуем в конференциях, строим нетворк, так что часто нанимаем на работу людей, с которыми уже давно знакомы. Зарплаты у нас рыночные. Дополнительных плюшек много — прекрасный офис с панорамамина центр города, сильная команда с внутренней культурой, в которой можно расти и развиваться, оплата всего необходимого для профессионального обучения (конференции, курсы и т. п.), программа «Бонус за книгу» и, самое главное, работа над сложными и нестандартными задачами по анализу big data из социальных сетей.

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

Александр Галкин, Co-Founder в Competera

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

Несмотря на офисную работу, у нас нет жесткого штатного расписания:

  • Гибкий график:ребята сами выбирают, когда приходить и когда уходить из офиса.
  • Возможность удаленной работы: каждый сотрудник может несколько дней в месяц поработать удаленно, поэтому наших ребят можно часто встретить в коворкингах или кафе.
  • Day off:наши клиенты живут и работают в 14-тистранах, поэтому мы не отдыхаем на государственные праздники. Вместо этого мы ввели пропорциональное количество отгулов (day off), поэтому ребята отдыхают, когда им удобно, и не отрабатывают по субботам :)

Ищем сотрудников через соцсети (в основном LinkedIn и Facebook), job-сайты, личные рекомендации сотрудников, работающих у нас, рекомендации наших друзей и партнеров, собственный отдел рекрутинга. Иногда привлекаем агентства, но это скорее исключение.

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

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

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

В целом есть две сложности при рекрутинге.

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

Вторая сложность заключается в том, что далеко не все кандидаты, подходящие Competera по уровню hard skills, подходят по уровню soft skills для работы в нашей команде: мы шутим в Slack, играем в настольный теннис, участвуем в «Гонке нации», выезжаем вместе на природу. И такой уровень вовлеченности в команду подходит не каждому.

Как бы это назвать: принципы хорошего именования в базе кода

$
0
0

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

Называйте объекты своими именами

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

Эта стратегия действует при Object Oriented Design (OOD) подходе. Хороший OOD имеет максимальное количество классов, которыми может оперировать и которые может понять конечный пользователь, и минимальное количество классов, которые он не может видеть. Названия всех объектов, которые видит конечный пользователь, должны диктоваться им самим.

Например, представим, что внутри вашего проекта есть понятия «Article» и «Email». У обоих есть заголовок — header. Но для статьи пользователи назовут его «Title», а для имейла — «Subject». Принцип следования за пользователем требует дать этим заголовкам разные названия на уровне кода, что упростит коммуникацию и уменьшит трудности в общении, которые опишу ниже.

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

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

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

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

Вот пример из жизни. Представим, что в системе пользователям доступны 2 действия: «Subscribe to newsletter» и «Unsubscribe from all email notifications». Поскольку мы имеем обыкновение все упрощать, кому-то может показаться, что эти два действия противоположны друг другу, так как «unsubscribe» противоположно «subscribe». Но это не так — на практике это могут быть независимые действия: например, вы можете быть подписаны на рассылку и не подписаны на прочие оповещения. Или, например, вы не можете быть подписаны на рассылку, если отписались от всех оповещений.

Для того чтобы избежать «автоматического упрощения», вы можете назвать эти действия по разному: «Opt in for newsletter» и «Unsubscribe from all email notification». Таким образом, ошибка станет менее вероятной, поскольку «opt in» не явно противоположно «unsubscribe». Идея в том, чтобы закрепить «opt in» за «newsletter subscription» и «unsubscribe» — для «email notifications».

В ежедневном общении люди говорят очень быстро, сокращая ненужные слова. Это означает, что многие действия будут использованы без описания объекта действия. Например: «How many subscribed people do we have?» будет восприниматься неоднозначно, если «subscribe» будет ассоциироваться и с «newsletter», и с «email notifications».

Разным понятиям давайте разные названия

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

Но есть проблемы уникальности имен, которых можно было избежать. Представим, что в проекте есть понятия «WebPageSnapshot» и «ServerSnaption». Когда члены команды разговаривают быстро, то скорее всего будут использовать слово «Snapshot» для обоих понятий. Это может привести к проблемам понимания. Фраза «I made a patch that touches a snapshot source code, please take a look» неточно определяет, куда именно нужно смотреть. Подобные фразы почти гарантированно будут вести к потере времени, потому что собеседники будут полагать, что понимают друг друга, а на самом деле — не совсем. Или автор, или слушатель в данном случае могут вообще не знать о том, что в системе есть 2 разных вида Snapshot, и для них может быть даже неочевидна неточность высказывания.

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

Убедитесь, что сокращенные версии названий удобны

Использование одинаковых уточняющих слов, с другой стороны, может быть хорошей идеей. Давайте рассмотрим бизнес-правило: «„Affiliate Member“ can participate in „Affilicate Campaign“». При таких названиях не будет никакой путаницы. Без уточнений фраза по-прежнему остается понятной: «This member has joined the campaign 2 days ago».

Напротив, бизнес-правило «„Member Affiliate“ can participate in „Campaign Affiliate“» может стать настоящим оружием массового поражения при коммуникации.

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

Используйте длинные или странные названия для внутренних объектов

Под словом «внутренний» я имею ввиду что-то, что невидимо для конечного пользователя.

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

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

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

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

Выводы

Можно выделить три типа названий по функции:

  1. Прямое имя — как ваши пользователи называют понятие.
  2. Описательное имя — длинное и описывающее в большей степени функцию объекта.
  3. Странное имя — не вызывающее никаких предположений о функции до того, как кто-то не заглянет в реализацию.

И вот несколько принципов именования:

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

PM дайджест #7: плюсы и минусы Freemium, избавляемся от технического долга и как не спугнуть лояльных сотрудников

$
0
0

Всем привет! Меня зовут Виктор, и я работаю менеджером проектов в компании Cogniance. Делюсь дюжиной интересных материалов по управлению проектом и продуктом в ноябрьском выпуске PM Digest’a!

Project Management

Обстоятельная инфографикао прошлом, настоящем и будущем проектного менеджмента.

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

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

А чего ваш босс ожидает от вас, как от проджект-менеджера?

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

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

Пора похоронить практику оценки персонала раз в полгода. Да здравствует real-time performance management!

Never push loyal employees to the Point they no longer care.Друзья ПМы, возьмите на заметку себе, а также покажите эту статью своему топ-менеджменту.

Agile, Scrum и все такое

Вышел новый Scrum Guide. Ничего нового. Кен Шварбер и Джефф Сазерленд обьясняют, почему так.

Возможен ливысокий уровень инженерной культуры в распределенных скрам-командах?

Как отличить Agile, Холакратию и бирюзовую организацию от подделки. Набор тестовот Артема Сердюка на соответствие красивого названия тому, что происходит внутри компании.

Многие любят адаптировать скрам под свои нужды, уходя существенно в сторону от того, что написано в Scrum Guide. Но есть правила, которыми лучше не пренебрегать. Автор насчитал 5 — 5 Aspects of Scrum You Cannot Skip.

Scaling Agile — a real story.

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

12 подкастов, которые слушает Юрген Апелло, автор мастрида для технологических лидеров — «Management 3.0».

Product Management

Плюшка от Igor Stefurak:

«Люблю шаблони в гуглодоксах. Скопіюйте собі „SaaS budget“з 5 вкладками: P&L, фіксовані витрати (одиничні, постійні), потік доходів та маркетинг. А на першій сторінці інструкція».

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

Факапить на Product Demo очень неприятно. 4 шага, с помощью которых ваше выступление пройдет на ура.

Толковая инфографика — How to create acceptance criteria. Dev Team будет в восторге, если ПО/BA будут так описывать user story.

Как дробить user story на мелкие части.

Качественный конспекткниги «Sprint: How to Solve Big Problems and Test New Ideas in Just Five Days». Продакты, это маст для валидации ваших идей. Мы в Cogniance вовсю юзаем этот фреймворк.

20 техник для приоритезации фич

Fun

Ух! MS Project выпустил киллер-фичу:

Православный скрам:

Гибкий вотерфолл в тренде:

Тренды — они такие:


← Предыдущий выпуск: PM дайджест #6.


Front-Еnd дайджест #27: Angular 5 и Chrome Dev Summit 2017, советы Эдди Османи, как Grammarly пишет свое расширение

$
0
0

В выпуске: прощай Firebug и привет Firefox Quantum, JavaScript экосистема глазами Дэна Абрамова, переходим на CSS гриды вместе со Slack, а также изучаем скандал на ReactiveConf 2017.

CSS

Rebuilding slack.com — как Slack переписали на CSS гриды

Grid areas and the element that occupies them aren’t necessarily the same size — изучаем гриды

The CSS attr() function got nothin’ on custom properties — как правильно хранить данные в разметке

CSS Code Smells

Smooth corners with CSS Houdini — canvas в CSS

JavaScript

The Cost Of JavaScript — Эдди Османи о производительности Front-End приложений

The melting pot of JavaScript — Дэн Абрамов о состоянии экосистемы и вашей роли в ней

ES proposal: import.meta — module metadata — метаданные для ES-модулей

Creating a Star to Heart Animation with SVG and Vanilla JavaScript

How to use SVG as a Placeholder, and Other Image Loading Techniques — SVG-плейсхолдеры для предзагрузки изображений

Apollo Client 2.0: Beyond GraphQL APIs

All You Need To Know About CSS-in-JS — переходим на CSS in JS

Progressive Web Apps

6 myths of Progressive Web Apps

Learn To Build Progressive Web Applications (PWA)

What is Progressive web App (and Why Should You Care)?

React и React Native

Everything You Should Know About React: The Basics You Need to Start Building — с чего стоит начать?

Netflix functions without client-side React, and it’s a good thing — лендинг Netflix ускорился на 50% без React

React 16:

Create React Kotlin App — CRA добралась до Kotlin

Creating Progressive Web Application in 6 simple steps with React.JS

Performance-tuning a React application.

3+ years of Ember, 6 months of React — Ember vs React

Next.js — React Server Side Rendering Done Right

Rendering a function with React — используем паттерн rendering function

How Redux Can Make You a Better Developer

Navigating Navigation in React Native

React Pattern: Centralized PropTypes

Vue.js

Upcoming TypeScript Changes in Vue 2.5

VueJs: Introduction to Vuex

5 Vuex Plugins For Your Next VueJS Project

The State of Vue.js Report Is Out. Here Are the Most Important Facts and Figures.

Angular

A new Angular Service Worker — creating automatic progressive web apps:

Using Angular Components with Third-Party Libraries

How to Reduce Action Boilerplate

Do you really know what unidirectional data flow means in Angular

3 Tips for Angular Runtime Performance from the Real World

These 5 articles will make you an Angular Change Detection expert

Introducing @ngrx/entity

Node.js

Node Best Practices

Stop supporting old releases.

How JavaScript works: Deep dive into WebSockets and HTTP/2 with SSE + how to pick the right path — как работают веб-сокеты и HTTP/2 с server-sent event

Turning VS Code Into A Killer MongoDB Admin Tool

Стоим микросервис кинотеатр на Node.js:

ReasonML

Ten interesting features from various modern languages

Building the Super Tiny Compiler with Reason

Библиотеки

Critical — утилита от Эдди Османи для автоматической генерации и подключения критических стилей страницы

js2flowchart.js — генерация блок-схем из кода в SVG

Stylable — CSS для компонентов

Frappé Charts — строим графики без зависимостей

Сube UI — мобильные компоненты для Vue.js

React-Virgin — мобильные компоненты для React Native

Helm — генерация письма

XmySQL — генерируем API для MySQL-баз данных

Послушать

Веб-стандарты:

Пятиминутка React:

Devschacht:

Frontend Weekend:

Фронтенд Юность (18+):

Конференции

Chrome Dev Summit 2017

React Alicante

FrontTalks 2017

WSD в Минске 2017

WSD в Киеве 2017

Демо

Fullstack GraphQL

NBA GO

Что нового

Firefox Quantum

Node.js 8.9.0 LTS и Node.js 9.0.0

Angular 5.0

Ember 3.0

Apollo Client 2.0

Meteor 1.6

VS Code Live Share

Остальное

Building Browser Extensions At Scale — как разрабатывается расширение Grammarly

The Front-End Checklist

How we adapted the Booking.com mobile site for the iPhone X notch.

Really Good UX — коллекция примеров хорошего UX

I Watched All of the Chrome Dev Summit 2017 Videos So You Don’t Have To — обзор докладов Chrome Dev Summit 2017

Проблемы больших компаний

My web app died from performance bankruptcy — Никита Прокопов про развитие веба

The whole web at maximum FPS: How WebRender gets rid of jank

Entering the Quantum Era—How Firefox got fast again and where it’s going to get faster — о внутренностях Firefox Quantum

Saying Goodbye to Firebug — прощай Firebug

Why I cancelled my ReactiveConf talk — про скандал Пегги Рейзис на ReactiveConf 2017


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

С вами был Григорий Шехет, @AGambit95. За помощь в оформлении дайджеста благодарю своих коллег.


← Предыдущий выпуск: Frontend дайджест #26.

С другой стороны: жены программистов о переезде в Кремниевую долину

$
0
0

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

Ирина Рыбенко, муж — Роман Рыбенко, Senior QA Engineer в Roku

Переехали в 2008 году.

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

Через три месяца после переезда мы узнали о том, что вскоре нас будет уже четверо, поэтому ближайшие пару лет мысли о работе меня не тревожили. Позже компания мужа выступила спонсором Green Card, это дало мне толчок нового профессионального поиска себя. В Украине я получила высшее образование в сфере финансов и банковского дела. На протяжении 6 лет я работала в сфере связей с общественностью. На последней работе занималась внутренними коммуникациями крупного холдинга Asnova.

Мне было сложно вернуться в свою профессию в США. Я знаю, что многие опускают или не хотят признавать наличие языковых сложностей: владение идиомами, бытовым английским (всю жизнь меня учили английскому исключительно для бизнес-коммуникаций) или языком для специфических целевых аудиторий. Наверное, именно это остановило меня от возвращения в PR.

Но моя работа меня все-таки нашла, и предыдущий опыт мне очень помогает. Уже больше трех лет я работаю консультантом компании YouTube. Две команды, которыми я руковожу, тесно связаны с применением локального опыта в оценке контента каналов, а также с поддержкой пользователей (соблюдение правил YouTube). До должности операционного менеджера я доросла с самой стартовой ступени, поэтому никогда не перестаю повторять всем сомневающимся в своих силах — дерзайте, все получится! Кроме этого, я сейчас учусь в Стэнфорде на годовом курсе «Корпоративные инновации».

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

Что касается адаптации детей (Ивану 10 лет, Алисе 8 лет), то они вообще не задумываются об этом, так как для них каждый новый день в жизни — это уже адаптация. Сын выучил английский, когда пошел в школу в 5 лет. Я, как положено любой молодой мамочке, безумно переживала о том, как будут складываться его отношения с коллективом и преподавателями. Сейчас вспоминаю и улыбаюсь. Все сложилось. Дочка, хоть и родилась в Калифорнии, до 3 лет английского не знала, а теперь едва говорит по-русски (украинский дети осваивают во время летних каникул на даче в Киеве).

Когда-то мы часто шутили над ситуацией: трое украинцев в нашей семье владеют английским (я, муж, сын), но одна американка (дочка), не знает по-английски ни слова. Я бы назвала Bay Area «kids friendly» местом, хотя бы потому что прохожие улыбаются вашим детям. В каждом маленьком городке есть парки, зоны отдыха, музеи, библиотеки, спортивные кружки и детские развлечения. Здесь прекрасная природа: национальные парки, пляжи, горы, — все в пределах 1-3часов езды (да, детям это тоже интересно!).

Мне сложно говорить о минусах жизни здесь, так как моя симпатия к Кремниевой долине затмевает все ее недостатки. Но в целом многие родители сетуют на качество калифорнийского образования (школ). Мы живем на юге Сан-Хосе и в меру довольны школами в нашем округе. Ни для кого не секрет, что чем лучше школа, тем дороже аренда и недвижимость в этом районе. Стоимость afterschool (продленка) достаточно высокая (может быть до $500 в неделю), также не дешевые детсады и частные школы. Поправка на географию вашего точного места жительства может значительно сократить эти расходы (продленка в школе моих детей, например, около $200/мес). Отвозить и забирать детей со школы необходимо самостоятельно, так как здесь практически нет школьных автобусов (исключение — дети с особенными потребностями или школы в отдаленных от жилых районов местностях). Наконец, к недостаткам можно отнести и то, что дети хотят купаться в океане, а он всегда холодный.

Ирина Эллис, муж — Роман Верчиков, программист

Переехали в сентябре 2014 года.

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

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

Сначала у меня была L2 виза, по которой можно работать, запросив дополнительно разрешение, а теперь уже есть Green Card. Пока ждала разрешение на работу, попробовала себя в роли модели. Успела походить по подиуму и даже сняться в кино в маленькой роли. Наигравшись, устроилась волонтером (а потом и ставку дали) в Генеральное консульство Украины в Сан-Франциско. Как только получила разрешение на работу, устроилась на Front Desk в отель Hilton. Сейчас совмещаю работу в гостинице с работой в крупной лизинговой компании Irvine Company, куда мечтала попасть с первого дня пребывания в США. С пятого раза таки взяли!

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

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

Я — большой ненавистник холода, потому лучшее, что здесь есть — это погода. Если говорить о заслуге не природы, а государства, могу привести два примера. Как-то возвращаясь с работы домой, я заметила, что мой телефон перестал мне служить. Недолго думая, я поехала в Купертино и купила новый. Что бы я сделала в этой ситуации в Украине (даже имея ученую степень и две работы)? Я бы нашла свой старенький кнопочный, покрытый пылью, или написала бы пост в фейсбуке: «Ребята, одолжите телефон, пока не куплю новый». А тут я просто поехала и купила телефон, как хлеб в супермаркете, не делая из этого огромное событие. Вторая история тоже связана с покупкой. С покупкой машины. В Украине я не могла себе это позволить, а тут купила кабриолет, о котором мечтала всю жизнь, не взяв ни копейки у мужа.

Таня Луцаевская, муж — Андрей Сергиенко, Software Engineer в Airbnb

Переехали в декабре 2014 года.

Я закончила Харьковский аэрокосмический университет по специальности «Прикладная лингвистика». Работала маркетинг-аналитиком, бизнес-аналитиком, скрам-мастером в IT-компаниях. Так как моя виза не дает права на работу, я решила посвятить время обучению и переквалифицироваться в Data Analyst. Сейчас укрепляю знания по Python, SQL, а также взяла курс Data Analyst на www.udacity.com.

Мы хотели переехать именно в Кремниевую долину. Поэтому муж обратился в GlobalLogic (компанию, где он тогда работал), и ему предложили несколько вакансий для релокейта. Единственная сложность для меня как трудоголика — перестроиться на новый режим и проводить много времени дома из-за невозможности работать. Проблем с языком у меня не было, так как английский я изучала с 7-милет. Произношение сначала хромало, но сейчас оно существенно улучшилось, а барьер в общении удалось быстро преодолеть благодаря small talks.

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

Приятной неожиданностью для меня здесь стало изобилие ресторанов, хорошей еды и вина. У многих складывается впечатление, что американцы не разбираются в еде, но это не так, всё-таки Штаты недаром находятся на 3-мместе среди стран с ресторанами высокой кухни. В Долине Напа большое количество семейных виноделен с очень красивыми видами и вкуснейшим вином. Можно устроить тур по сырным фермам. Или купить свежевыловленных морепродуктов с лодки у рыбаков в Half Moon Bay, где в ближайшем кафе вам их приготовят.

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

Основное преимущество жизни в Долине — это больше перспектив в работе, возможность лучше раскрыться в профессиональном и личностном плане. Относительно других аспектов — очень нравится погода и природа. Поражает количество красивых мест, куда можно съездить на выходные. Меня иногда спрашивают, скучаю ли я по снегу, но, на самом деле, всего в нескольких часах езды есть озеро Тахо, где зимой можно покататься на лыжах или сноуборде. Отдельную тему можно посвятить национальным паркам США — Yosemite, Yellowstone, Zion, Grand Canyon, Joshua Tree National Park, Sequoia и многим другим.

В США у меня значительно расширился кругозор. Я ценю, что здесь можно познакомиться с людьми, которые меняют историю в сфере технологий. На улицах уже не редкость self-driving cars, на наших глазах строился новый кампус Apple Park. Как-то раз мы поехали в Universal Studio в Лос-Анджелес, где в тот день, как оказалось, проходила закрытая конференция от Tesla, на которой Илон Маск представлял Tesla Powerwall. Когда этим живёшь и интересуешься, то наслаждаешься возможностями быть частью чего-то нового.

Юля Синица, муж — Руслан Киянчук, Software Engineer в Symantec

Переехали в декабре 2014 года.

Я закончила магистратуру Харьковского национального университета радиоэлектроники по специальности «Системы технической защиты информации». В 2011-2014занималась научной работой, тема исследования была «Биометрическая аутентификация по клавиатурному почерку». Разрабатывала и совершенствовала алгоритмы, ездила на конкурсы научных работ и конференции, планировала поступать в аспирантуру.

Идею переезда в США я восприняла очень легко. Я всего год жила в Харькове и еще не успела осесть там. К тому же я только что закончила учебу, и было по сути все равно, где начинать — в Харькове или в другом месте. Муж на протяжении года ездил в командировки в Штаты. После моего выпуска мы решили поехать туда вместе, чтобы осмотреться, ведь я ни разу до этого не была за границей. После этого окончательно решили, что релокации быть. Мы переехали по визам L1/L2, но я не знала языка, поэтому толку от моей визы, позволяющей работать, особо было. Сейчас у нас уже Green Card.

Самой большой проблемой для меня в первое время был английский (в школе и университете я учила немецкий). Я пошла на курсы ESL, ходила на занятия каждый день, брала максимум уроков и сидела в школе с утра до вечера. Через 5 месяцев стала волонтерить в Техническом музее инноваций в Сан-Хосе, потом устроилась работать в этот музей на part time и параллельно искала работу в IТ. Через 3 месяца поисков получила оффер, и сейчас я — Software Engineer в стартапе UnifyID в Сан-Франциско (кстати, мои коллеги были в восторге от уровня математической подготовки в обычных украинских вузах). Следя за процессом найма у нас в стартапе, я понимаю, что мне очень повезло найти работу именно по той специальности, которую я получила в Украине, ведь здесь мои конкуренты — это выпускники университетов Беркли, Стэнфорда, MIT, у которых за плечами парочка интернатур в известных IT-компаниях.

Самым тяжелым для меня в адаптации оказалась социализация с местными. Я по натуре была очень застенчивой, к тому же мешал языковой барьер. Сейчас мой круг общения очень разнообразный. У нас много друзей с Украины, мы собираемся по различным поводам, и День независимости Украины празднуем, и на различные украинские мероприятия ходим. Американцы научили нас гордиться тем, что мы украинцы. Мы и до переезда были патриотами, но после, кажется, стали еще больше любить свою Родину. Когда мы завели собаку, круг знакомых расширился ребятами с собачьих парков, мы знаем всех наших соседей и благодаря постоянным small talks всегда в курсе событий в нашем районе. Я стала часто ходить в спортзал и нашла там много друзей. Ну и коллеги, конечно, у меня отличные ребята, мы ходим вместе на happy hour и в зал, зимой планируем всем офисом выбраться покататься на лыжах.

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

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

Людмила Могиленко, муж — Николай Могиленко, Senior Cloud Platform Engineer в Adobe Systems

Переехали в 2017 году.

У меня два высших образования: первое — коммерческая деятельность, второе — учет и аудит. Работала в основном по второй специальности бухгалтером. До переезда я два года была в декрете, у нас двойня — мальчик и девочка, им 2,5 года.

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

Из несомненных плюсов жизни в Bay Area отмечу микроклимат, наличие океана и природное разнообразие: 30 минут езды — и ты совсем в другой сказке. И, конечно, прекрасная погода почти целый год, поэтому нет необходимости в трех слоях одежды.

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

Александра Храпачевская, муж — Роман Морозов, Senior Software Engineer в GlobalLogic

Переехали в сентябре 2015 года.

Я очень люблю учиться и считаю, что человек должен заниматься в жизни тем, что нравится, поэтому мой путь поиска себя состоял из нескольких образований и различных курсов. Я закончила Академию МВД, специальность «Гражданское право». Проработав юристом некоторое время, поняла, что это совсем не мое. Была помощником руководителя в крупных компаниях, потом закончила школу маркетинга BeFirst и работала в диджитал-агентствах.

В 2013 году случилась наша первая с мужем поездка в США, в Нью-Йорк, это была его рабочая командировка на три месяца. Когда вернулись домой, поняли, что хотим переехать, а значит надо искать достойные предложения и всячески готовиться. Я закончила годовой курс по Frontend-разработке. Параллельно начала увлекаться кондитеркой, закончила Kiev International Culinary Academy — базовый кондитерский курс. Мы шли к релокации больше двух лет. Предложения, которые были, нас не совсем устраивали, поэтому дождавшись, наконец, подходящего, поняли — либо сейчас, либо никогда. Конечно, были сомнения, потому что карьера Романа в Киеве была уже на достаточно высоком уровне.

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

У меня виза L2, по которой я могу работать. Английский я регулярно учила с 6 лет, но после школы мало его использовала, поэтому пришлось вспоминать грамматику и восстанавливать словарный запас. Ходила на speaking club в библиотеку (не могу сказать, что это очень полезно для моего уровня), занималась с преподавателем по Skype (мне понравилось, знания возвращаются довольно быстро), ходила на митапы.

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

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

Катерина Твердохлеб, муж — Ярослав Твердохлеб, Software Engineer в Facebook

Переехали в 2014 году.

До переезда в Штаты я училась в магистратуре экономического факультета КНУ им. Шевченко. Цели уехать из Украины у меня не было, я даже строила карьерные планы. Но наши отношения с Ярославом тогда казались важнее, поэтому когда он получил оффер от Facebook, решение о релокейте было закономерным и далось достаточно просто. Мы собрали пару чемоданов и сумки за несколько дней и все. Гораздо больше времени заняла подготовка к свадьбе.

Около двух лет у меня была виза Н4, по которой нельзя ни работать, ни даже бесплатно стажироваться на позициях, которые потенциально приносят компании доход. После получения Green Card я работала на полставки маркетологом в консалтинговой компании, недавно подписала оффер на позицию аналитика (Research Analyst) с компанией IHS Markit, предоставляющей информационно-аналитические услуги по всему миру. Поиск хорошей работы без американского опыта — большая сложность, он занимает месяцы даже у местных, так что пришлось запастись терпением.

Я достаточно хорошо владела английским до переезда, за что огромное спасибо моим родителям и учителям. Правда, оказалось, что существует еще огромное количество привычных для американцев фраз и оборотов, без которых непринужденная беседа переставала быть такой уж непринужденной. Особенно пришлось учиться вести small talks. Так как работать я не могла, искала разные возможности улучшить устную речь и расширить круг общения. Ходила на английский в школу для взрослых, но меня хватило всего на месяц — учась с не native speakers, помимо своих ошибок, стала подхватывать новые. Настоящим решением моих проблем стали ежедневные групповые занятия спортом в кругу американцев. Здесь спорт тесно связан с социализацией — все общаются, делятся планами на протяжении всей тренировки.

Неожиданностью для меня стали огромные расстояния и ориентированность на автомобиль. Я люблю водить машину, но еще больше мне нравятся городские прогулки и архитектура, чего здесь очень не хватает. Шоком также стало количество сахара во многих продуктах и размеры порций в кафе. Удивили общие стиральные машинки, ковролин в большинстве квартир под аренду, то, что все строения деревянные (как следствие — звукоизоляция не очень). Пришлось привыкать к новым единицам измерений: галлонам, милям, фаренгейтам.

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

Я понимала до отъезда, что будет большая разница во времени с домом (10 часов) и отсутствие близких друзей и круга общения, но оказалась совершенно не готова к этому. Лучшее, что мы можем дать друг другу, — это свое время, но переехав за 6000 миль, неизбежно пропустишь свадьбы, рождения детей и семейные праздники.

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

В Калифорнии восхитительная природа и температура воздуха выше нуля круглый год (хоть иногда я очень скучаю по ливням и снегу). Здесь потрясающе открытые люди, никто не ищет изъянов в других, царит атмосфера дружелюбия и принятия людей с разными взглядами и жизненным опытом. Мне нравится инновационность Кремниевой долины, ведь большинство новинок, идей, исследований зарождаются именно здесь. Я даже шучу иногда, что все здесь на «игле инноваций». Иначе как еще объяснить стремление жить в сейсмически активной зоне в деревянных домиках и с заоблачными ценами на жилье?


Подписывайтесь на наш Telegram-канал о релокации, чтобы не пропустить интересные вакансии, события, статьи.

Salesforce для початківців в IT: як я стала розробником за півроку

$
0
0

З кожним роком IT-ринок України зростає. Збільшується кількість охочих працювати в IT, а разом з тим — і конкурентність. У цій статті я хочу поділитися власним досвідом — як я, дівчина без технічної освіти, стала розробником і навчилася писати код з нуля. А також хочу довести, що якщо є бажання і сила волі працювати над собою, то обов’язково все вийде!

Передісторія

Чому я обрала IT, мабуть, зрозуміло всім — найкращі умови праці, можливість розвиватися, цікава робота, висока зарплата і це далеко не все. У 2013 році я працювала спеціалістом з обслуговування фізичних осіб у ПриватБанку. Робота в основному одноманітна: видача кредитних карток, залучення депозитів, прийом платежів. Вже за рік я на 100% переконалася, що обрала одну із найнудніших спеціальностей. Мій чоловік працював software developer, тому про можливості в IT я знала добре: починаючи з халявної кави — так, тоді мені здавалось це великим бенефітом — і закінчуючи бізнес-поїздками в різні куточки світу. Так ось, коли моя робота витиснула з мене все, а натомість не принесла ніякого задоволення, я твердо вирішила, що хочу в IT.

Перша думка була спробувати себе в ролі тестера. Я перечитала декілька книг з тестування, відправила резюме усюди, де шукали стажера QA. Але будьмо відверті: беручи до уваги кількістю людей з технічною освітою та сертифікатами про закінчення курсів QA, шансів у мене майже не було. Моїм вхідним білетом в IT став Salesforce — досить нова технологія на українському ринку, яка почала стрімко розвиватися.

Чому Salesforce

На той час у Львові, та й у всій Україні Salesforce-спеціалістів було небагато, і одним з них був мій чоловік. Тому персональний вчитель у мене вже був :) Окрім цього, Salesforce — це CRM-система, з якою можна працювати без написання коду. І, мабуть, основна причина — це знову ж таки невелика кількість спеціалістів, а отже, і мала конкуренція, що дає більше шансів для джуніорів та стажерів.

Ще декілька фактів, чому розробнику варто обрати Salesforce:

  • Усі сервери, код, база даних обертаються в клауд. Для розробки достатньо створити безкоштовний акаунт і працювати в браузері.
  • Salesforce пропонує свою мову програмування Apex (аналог Java), Visualforce — мову розмітки, що дозволяє створювати власні сторінки Salesforce з кодом, Lightning Component Framework — UI-фреймворк, подібний до AngularJS або React.
  • Готові Salesforce API рішення.
  • Весь код виконується тільки в хмарах, не потрібно турбуватися про розгортання локального середовища розробки на комп’ютері.
  • Інфраструктура постійно оновлюється, за всім можна слідкувати за допомогою Salesforce Release Notes.
  • Вбудована система авторизації і налаштування прав доступу.
  • Платформа для використання CRM на мобільних пристроях — Salesforce1.
  • Магазин готових рішень AppExchange.
  • Salesforce займає перше місце в рейтингу найпопулярніших CRM-систем. А це означає, що попит на Salesforce-спеціалістів буде зростати.

Перший досвід в IT

Приблизно через 3 тижні навчання я могла самостійно робити невеликі завдання. Так, спочатку все, що я робила, — це адаптація і налаштування, але цього було достатньо, щоб пройти співбесіду на позицію Salesforce Administrator у одній з провідних IT-компаній Львова. Одна з умов оферу — я мала отримати сертифікат Salesforce Administrator протягом 3 місяців. Salesforce надає досить серйозну систему сертифікацій. Залежно від різних робочих ролей, пропонуються різні варіанти сертифікації для адміністраторів, розробників, архітекторів, консультантів. Здебільшого це екзамен з 60 тестових завдань. Вартість складання екзамену — від $200 до $400. Крім того, для підтвердження сертифіката потрібно тричі на рік складати невеликий тест з розширення/додавання нових фіч. Кожен третій тест також платний ($100). Більшість IT-компаній зацікавлені в наймі сертифікованих спеціалістів, тому після проходження тесту його вартість компенсують.

Я отримала сертифікат, а невдовзі — і перший досвід роботи над реальними проектами. Для мене було важливо не залишатися на місці і працювати над собою, тому дуже швидко самого адміністрування стало мало. Тут у пригоді мені знову став чоловік. Саме він допоміг мені у написанні перших лінійок коду, порадив, які книги варто прочитати, на що звернути увагу в першу чергу (інформацією ділюся в нижче). Крім цього, працюючи Salesforce-адміністратором, я мала можливість робити прості девелоперські завдання на реальних проектах. Приблизно за півроку я отримала посаду Salesforce Developer, а ще за півроку здала сертифікацію Salesforce Platform Developer I. Наразі я вже 3 роки в IT, отримала шанс попрацювати на різних проектах, вести проекти як фрілансер.

На що може очікувати джуніор

Зарплата джуніора залежить від початкових знань і навиків і в середньому стартує з $300-500. Кар’єрні можливості для розробника досить широкі. Їх можна оцінити за допомогою системи сертифікації Salesforce:

Для того щоб мати можливість отримати сертифікацію Technical Architect, потрібно підтвердити свої знання та навички, а також зростання досвіду на платформі Salesforce.

Один з моїх клієнтів якось сказав мені, що до співпраці зі мною він думав, що програмування — це суто чоловіча справа, але я зламала цей стереотип :) Не бійтеся й ви!

Salesforce — з чого почати

  1. Спочатку потрібно створити безкоштовну дев організацію — повнофункціональне середовище розробки.
  2. Пройти «Force.com Platform Fundamentals». Це була перша книга із Salesforce, яку я прочитала. Тут можна ознайомитись і попрактикувати фундаментальні можливості роботи як для адміністраторів, так і для розробників.
  3. Зареєструватись на Trailhead (використовуючи дев організацію). Мегакруте середовище для вивчення Salesforce: інформація поділена на окремі розділи і модулі. В кінці кожного модуля для перевірки засвоєної інформації потрібно виконати завдання (у вигляді тестових запитань або невеличкого проекту на дев орг). Навчання проходить у вигляді гри: за кожний вивчений модуль студент отримує бали, тому з власного досвіду скажу, що так інформація засвоюється набагато швидше і легше.
  4. У першу чергу раджу пройти 2 курси: Admin Beginnerі Developer Beginner.
  5. Ще декілька воркбуків.
  6. Must read! Best Practices з написання Apex.
  7. Бібліотека матеріалівіз Salesforce.

І, мабуть, найголовніше — обов’язково пробуйте все це на практиці! Якщо у вас виникли питання — з радістю відповім. Мій email — juliashaleva@ukr.net.


Підписуйтеся на наш Telegram-канал для джуніорів, щоб не пропустити цікаві вакансії, стажування, курси, статті.

Delivery Manager: кто он, что делает и как им стать

$
0
0

Я начинал с позиции инженера, но достаточно скоро мне пришлось руководить командой. Заказчик был своего рода стартапом: распределения ролей почти не было, но надо было совмещать управление, архитектуру и разработку. Со временем команда стала заниматься крупной продуктовой разработкой для авиалиний. С ней я сотрудничаю уже больше 10 лет. А «стартап» за это время подрос до 300+ человек и сейчас автоматизирует огромное количество авиалиний, вроде JetBlue, AirСhina и других крупных игроков.

За 14 лет в EPAM мой карьерный путь выглядел так: рядовой инженер, инженер-управленец, Solution Architect (хотя тогда этой должности еще не было), Engineering Manager, Director. Невзирая на названия должностей, суть работы не менялась: я быстро схватывал то, как работают разные системы и как они могли бы интегрироваться в общее решение; рисовал на досках схемы того, как тот или иной solution landscape ложится на бизнес-проблематику; всегда был на стыке коммуникаций заказчика и команды.

Я до сих пор немного программирую на уровне D-1, но настоящее удовольствие получаю от работы с группой людей, которые хотят сделать продукт. Мне важен результат. Позднее я выяснил, что прошел классический путь Delivery Manager. Так, с приставкой Director уже три года звучит моя должность.

Как появилась позиция

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

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

Delivery Manager (DM) — сотрудник с хорошими лидерскими и бизнес-навыками, специализация которого граничит с архитектором с одной стороны и Program Manager с другой.

Именно такое определение мы оформили в качестве позиции в компании и уже три года внедряем ее в работу.

В интернете по-прежнему можно мало что найти о Delivery Manager — института профессии не существует. Такой подход пришел из организаций, у которых давно есть позиция Service Delivery Manager (SDM). Но это понятие отличается от Delivery Manager. Сервис — повторяемая вещь. К примеру, PayPal — сервис, который обеспечивает проведение платежей миллионы раз в день, и человек, отвечающий за его работу, — Service Delivery Manager. Если взять компании вроде EPAM в широком смысле, то они занимаются бизнесом по разработке IT-решений. Но сами решения обычно имеют продуктовый характер и уникальность. Поэтому позиции SDM и DM пересекаются лишь незначительно.

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

Роль в проекте

Роль и распределение обязанностей Delivery Manager зависит от стадии проекта.

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

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

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

Есть определенный набор вещей, за которыми DM должен следить постоянно:

  • Знаем ли мы, что надо сделать?
  • Делаем ли мы правильные вещи?
  • Делаем ли правильные вещи первыми?
  • Делаем ли мы эти вещи правильно?

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

Delivery Manager контролирует проделанную работу и убеждается, что она приближает команду к цели.

Большая часть обязанностей DM — общение и решение проблем разных уровней. В этом аспекте Delivery Manager отличается от Program Manager тем, что если задача касается технологий, он хорошо понимает, в какой момент потребуется консультация со стороны. Как любой инженер он знает, что в шинах могут не доходить сообщения; в базе стоит искать риски в конкурентных записях; IoT устройству часто не хватает памяти.

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

Если что-то пошло не так

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

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

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

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

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

Самый большой вызов Delivery Manager — как все сделать, получая разные объемы информации из «разных миров»? Как обеспечить решение классического конфликта между клиентом и компанией, компанией и сотрудником, сотрудником и клиентом? Как жить в этом треугольнике, при этом добавляя четвертое измерение — реализацию качественного продукта?

Как стать Delivery Manager

Наиболее простой эволюционный путь для специалиста, который в итоге займет позицию Delivery Manager, выглядит так.

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

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

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

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

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

Развенчаю слухи о том, что PM и другие нетехнические специалисты не могут стать Delivery Manager — для этого нет никаких преград. Нужно стечение обстоятельств, чтобы попасть на проекты и стать их лидером.

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

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

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

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

Что учить

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

В сети есть огромное количество теоретических материалов и курсов. Попрактиковаться в архитектуре сложнее. Можно поучаствовать в существующем проекте или самостоятельно развивать opensource-проект. В этом случае комьюнити наверняка придет на помощь.

Чтобы улучшить навыки в сфере управления проектами, помимо знания гибких методологий, которые набрали популярности, стоит не забывать «матчасть». Нет ничего лучше терминологии PMBook, и, возможно, стоит даже получить PMP-сертификат. Это не обязательная, но достаточно интересная и сложная задача. В рамках ее прохождения придется познакомиться с вещами, о которых даже не думаешь при работе «в полях», вроде просчета финансовых рисков или индексов выполнения сроков/стоимости.

Для улучшения коммуникативных навыков есть специализированные тренинги, вроде управленческих поединков Владимира Тарасова. Если говорить про классический менеджмент как дисциплину (что можно делегировать, leadership vs management и прочее), то можно начать с виртуальных курсов и участия в жизни комьюнити agile- и проектных менеджеров. Их полно на просторах сети.

Когда базовые знания получены, возникает главный вопрос — практика. Если в текущей компании нет подходящих условий, нужно либо создавать свой проект, либо участвовать в open-source. Можно собрать из друзей небольшую команду и сделать первое маленькое delivery. А вдруг еще и взлетит? За практикой на крупных и сложных проектах лучше идти в большие компании. В таких случаях самообразования, как и тренажера будущему пилоту A380, — не хватит.

Рынок Delivery Management в Украине и СНГ

Как профессия, Delivery Management, делает только первые шаги. Пока рекламы курсов подготовки DM нет в метро, говорить о ее зрелости рано.

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

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

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

Еще один источник развития DM — растущие количество продуктовых стартапов в нашем регионе. Их CTO, VP of Engineering обладают всеми качествами DM. Если их продукт успешен, то, очевидно, идти на позицию Delivery Manager в крупные сервисные компании они не захотят. Но в отличие от разработки одного продукта, здесь им могут предложить вариативность и возможность пробовать себя в работе с разными и сложными клиентами.

Путь в Delivery Management решает классическую проблему человека, который вчера писал код, и ему это по-прежнему нравится, и управленца, у которого еще не все получается, но он растет в этом направлении. Это ответ на вопрос: «Мне технологии забыть и идти в менеджмент или бросить лидерство и писать код?»

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

DOU Проектор: Domivka Coliving — совместная аренда жилья для IT-шников

$
0
0

В рубрике DOU Проекторвсе желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам есть о чем рассказать — приглашаем поучаствовать. Если нет — возможно, серия вдохновит на создание собственного made in Ukraine продукта. Вопросы и заявки на участие присылайте на editors@dou.ua.

Всем привет! Рада представить вам проект моей мечты — Domivka Coliving! Меня зовут Юлия Обозная, в IT я работаю с 2006 года, сменив несколько управленческих ролей в ауторсинге, а с весны этого года — и в продуктовой компании. Ну а главный герой этого рассказа — проект коливинга стартовал в июле этого года при удивительном стечении обстоятельств (но об этом позже!).

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

Коливинг («совместное проживание» в дословном переводе) — очень непривычное слово для киевского рынка аренды жилья. Но суть проста и в том или ином виде давно существует: мы ищем компаньонов/компаньонок, чтобы делить одну квартиру; в отпуск едем толпой друзей и там снимаем большую квартиру или дом, чтобы было веселее и дешевле; ночуем у знакомых при неожиданных поездках в другой город. Делать больше меньшими средствами. Так почему бы не привнести те же идеи в каноническую аренду квартир?

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

Идея

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

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

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

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

В одно июльское утро оказалось, что покупатель целого этажа в ЖК «Smart House» на Машиностроительной, 39 отказался от сделки, а меня как раз в это утро ветром перемен занесло в отдел продаж. Сердце замерло от счастья, ведь именно этот район и виделся мне как идеальный для запуска проекта: офисов вокруг множество, а качественного жилья в аренду — раз-два и обчелся. И меньше чем через 24 часа договора на 26 заветных квартир лежали в красной папке для документов у меня на столе.

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

Неожиданно сложным оказался брендинг. Прежде чем стать Domivka Coliving, как только не назывался проект — LiveHub, Knock-Knock, JoinUs, CoSpace, CoLand, Homely, LiveUp... Ответ пришёл из узора боковой стенки юсковской этажерки сразу в комплексе с лого и общей стилистикой. Удивляться к тому времени я уже перестала и наслаждалась общим процессом.

Команда

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

  • Никита Постолакий — CTO, CFO и любимый муж;
  • Сергей Обозный — OPR Director — главный мой проводник в сложном мире ремонтно-строительных работ и любимый папа;
  • Татьяна Обозная — главный консультант по всем вопросам недвижимости и любимая мама;
  • Артем Обозный, Серафима Амелина, Екатерина Овеченко, Александр Шаповал — инвестиции и общее стратегическое развитие проекта;
  • Карина и Георгий Постолакий — смелые первые жильцы и первопроходцы нашей Домивки, наша фокусная группа тестирования всех идей и предложений;
  • Ира Сосницкая — веб-дизайн;
  • Таня Лосева — дизайн помещений;
  • Елена Полянская — SMM;
  • Маша Осипова — админвопросы и договора.

И наша команда все время пополняется! Может быть хорошие идеи притягивают хороших людей? :) Даже старшая дочка Лиза собрала целое портфолио очаровательных брендированных картинок, пока мама носилась по всевозможным встречам.

Реализация

Самое главное проекте — для кого проект этот делается. И мы для себя определили, что особо интересным коливинг может быть:

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

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

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

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

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

  • Закрытый от посторонних этаж (4-йэтаж во 2-йсекции, ЖК «Smart House»).
  • 20 квартир по 18 м2, 5 квартир по 25 м2и 1 двухкомнатная квартира 44 м2. Итого спальных мест 20+10+2=32.
  • Общие пространства площадью 100 м2, в которых будет располагается зона отдыха в холле, общая кухня-гостиная (33 м2), отдельная кладовая, место для сушки белья. Огромный лифтовой холл хочется превратить в game zone с настольным футболом и аэрохоккеем, но сначала надо обжиться и определить, комфортно ли это будет нашим Domivka Citizens.

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

Сколько же будет стоить месячное проживание в Domivka Coliving? 7500 грн за квартиры 18 м2и 8500 грн — за 25 м2, 2 комнаты в классной двухкомнатной квартире с просторной кухней и гардеробной найдут своих жильцов за 6000 грн.

При этом мы не стремимся заселить наш коливинг как можно быстрее. Главное, чтобы ребята подобрались открытые, общительные и поддерживающие проект. Поэтому мы придумали, как нам кажется, гениальную акцию: «Приведи друга — получи месяц проживания бесплатно». По сути, самые быстрые и дружелюбные могут жить 2 года абсолютно бесплатно! А взамен Domivka получит сплоченный коллектив лучших в мире жильцов.

Результаты

Чем мы можем гордиться на данный момент:

  • Удивительно трудоемкий этап ремонтных и отделочных работ позади! Все наши квартиры закончены, с полностью оборудованной ванной комнатой и кухней. Шторы, диванчики заняли свои почетные места и ждут первых жильцов.
  • Мы окончательно определи стратегию использования и оснащения общих зон и приступили к реализации!
  • Мир узнал о нас! У Domivka Coliving есть своя страничка на фейсбукеи личное место в онлайн-пространстве.
  • У нас есть первые жильцы! И с ними весь этаж обрел жизнь :)

Что дальше: если честно, то очень хочется открыть еще один коливинг. В районе Подола, Лукьяновки или Протасова Яра. И тут нужна помощь! Один проект поднять силы есть, а вот на второй нужны верные и надежные партнеры и единомышленники!

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

Если вы поверили в наш проект, если хотите стать частью Domivka Community или просто заглянуть в гости и посмотреть, как все это выглядит вживую — ждем вас в городе Киеве, на улице Машиностроительной 39, секция B, 4 этаж!

Ну и, конечно, по любым вопросам мы доступны:

Заблуждения и ошибки приоритизации

$
0
0

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

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

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

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

«У нас у всех разные вкусы. Мама любит белый хлеб. Дети — сладкую сдобу. Дедушка — черный „Бородинский“. Но когда мы собираемся за столом, мы все едины в одном: пожалуй, старый хрыч обойдется без „Бородинского“».

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

Создать полноценную справедливую систему, которая подходит на все случаи жизни, — задача утопическая. Попробуйте решить ее хотя бы на примере покупки хлеба в семье. Постоянно будут всплывать ситуации, в которых чьи-то интересы будут учтены в большей или меньшей степени (может, бедный дедушка получит «Бородинский» на Рождество).

Цель приоритизации — согласие участников процесса с расставленными приоритетами. Методы приоритизации помогают синхронизировать для всех шкалу приоритизации (по какому принципу измерять-то будем?) и дать почву для обсуждений.

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

Ловушки приоритизации

Поговорим о базовых ошибках, которые зашиты в нас самих (BIOS, ДНК, называйте, как хотите, разобраться в этом — точно не цель статьи). Эти ошибки проявляются в восприятии мира вообще, страдает из-за них и приоритизация.

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

Ловушка «принадлежности»

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

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

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

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

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

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

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

Программисты даже приведут вам 100500 фактов, которые подтверждают их точку зрения: «В прошлом проекте у нас так было» или «В другом проекте не построили сначала платформу, а потом в этом давнокоде жили два года и плакали» (произносится замогильным голосом).

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

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

Кстати, такой же ловушке подвержены люди, которым вы не безразличны. Если спросите маму: «Как тебе мой новый продукт или идея?» — с большой долей вероятности получите позитивный отзыв. Личные симпатии сильно отражаются в процессе приоритизации, склоняя приоритеты в чью-то сторону. Просто понаблюдайте!

Как избежать ловушки принадлежности?

Избежать этого достаточно сложно. Мы люди, мы субъективны, и собственные идеи нам всегда будут ближе. Но осознание проблемы уже превращает задачу из невыполнимой просто в задачу «со звездочкой».

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

Та же техника Six Thinking Hatsподразумевает рассмотрение проблемы с разных сторон: факты, эмоции, позитивные идеи, критика и «креатив». Просто выделив время на каждый из аспектов (а чаще всего как минимум половину упускают), мы сможем привести группу к более удачному решению.

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

Если уходить от техник работы с группами, хорошие результаты показывает подход с data-driven decisions. Когда решения принимаются на основе цифр (конверсия, рост среднего чека, просмотры), а не просто красочного описания идей. Хотя, признаться честно, очень немного компаний доросло до такого подхода.

Можно назвать еще много приемов и техник для уменьшения влияния ловушки принадлежности. Но эта тема выходит далеко за рамки статьи.

Ловушка незнания

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

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

Степень влияния сильно зависит от того, насколько вы некомпетентны в вопросе и как далеко зашли по кривой Даннинга-Крюгера.

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

Разработчики говорят: «Вот разработаем приложение, сделаем кучу классных фич, дадим рекламу в Facebook или AppStore и наберем свои первые 10 000 активных пользователей. Дальше будет эффект сарафанного радио, главное — чтобы продукт был красивым. Т. е. давайте маркетинг отложим, пока нет всех фич».

Они явно недооценивают затраты на привлечение — цифра в 10 000 активных пользователей потребует сотен тысяч долларов на рекламу в AppStore. Маленькая компания редко может позволить себе такие прямые расходы. Надо искать более бюджетные и трудозатратные способы: блоги, growth hacking и т. д. Результаты они дают не быстро, поэтому срочность (а вместе с ней и приоритет) этой задачи возрастает.

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

Как избежать подобной ошибки?

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

Ловушка цифр

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

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

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

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

Переходя к вопросам продуктовой разработки и приоритизации, мы замечаем, что подход с получением интегральной оценки «вес фичи» уменьшит количество обсуждений (Ура! Мы же трушные инженеры, мы ненавидим болтать, нам надо работать!). Но он заставит проигноровать важный момент: мы не подумаем, почему цифры так близки. Что мы упускаем? Что еще поможет разобраться?

Как бороться с этой проблемой?

Чаще всего, для решения таких конфликтов нужно:

  • Понять, какое из значений в других измерениях дало такой высокий балл для фичи a или b. Выиграла чистота или состояние номера? Что важнее для нас сейчас? Я всегда в голове держу пример букинга и неказистого номера «зато в центре».
  • Если первый вариант не дал результатов, нужно добавлять дополнительные параметры, которые не участвовали в получении финального результата. Если мы делаем какой-то продукт, можно спросить: «А какой из этих запросов поможет создать дополнительные информационные поводы для прессы? Какую из этих фич больше ждут наши новые пользователи?» и т. п.

Вывод

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

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

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

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


Третья статья будет о том, как мы пытаемся обмануть систему приоритизации в вопросах прикладного планирования. Stay tuned!

Ігри розуму: український математик про красу науки, нелюбов до ІТ та безперспективність повернення

$
0
0

Віталій Сенін — неодноразовий призер всеукраїнських та міжнародних олімпіад з математики. Багато його однокласників з фізико-математичного ліцею в Києві пробивають дорогу в життя через ІТ. Проте сам Віталій відмовляється від цього шляху. Ще в університеті він допомагав колезі Дмитру Охоньку, тепер програмісту у Facebook, з підготовкою до міжнародної олімпіади, на якій згодом той здобув срібло.

Пристрасть Сеніна — абстрактне мислення й пошук ідеї, яка приведе до розв’язку задачі. Зараз він навчається на аспірантурі у Берлінському технічному університеті, досліджуючи нерозв’язані проблеми математики. Він зручно вмощується в кріслі у своєму офісі й намагається пояснити — чому математик схожий на художника, як правильно викладати, щоб закохатись в цю науку, та чому не планує повертатись до України.

Математика доволі проста, адже в ній завжди є прості моделі

— Як у вас склалось з математикою?

В п’ятому класі я вступив до фізико-математичного ліцею. Був учнем, який любив математику. Таких людей дуже багато. Мені дуже пощастило з вчителями математики. Переломний момент настав у сьомому класі, коли нас почав вчити Тимошкевич Тарас Дмитрович, син нашої вчительки. Він вчився на першому курсі університету. З ним ми займались олімпіадною математикою. І саме олімпіадна математика мене затягнула. Він розповідав про різні методи в математиці, які використовуються в олімпіадних задачах. Щоб записати відповідь, потрібно було мінімум часу, кілька рядків. Головне — додуматись. Ці задачі об’єднувала красива ідея, завдяки якій ми приходимо до розв’язку. Спочатку я готувався вдома як до домашнього завдання, далі все більше працював сам. Я побачив, що ця наука може бути дуже красивою і цікавою.

— Що маєте на увазі під ідеєю?

Наприклад, задача з п’ятаками на столі. Обабіч квадратного столу двоє гравців, які по черзі кладуть на стіл монету, яких в кожного безліч. Той, хто останнім покладе п’ятак на вільне місце столу, виграв. Питання: за якої стратегії один з гравців завжди виграватиме? Це базова задача на симетрію. Відповідь проста: перший гравець кладе монету в центр столу, а далі він ставить свій п’ятак абсолютно симетрично ходу іншого гравця. Виглядає лячно, але якщо знаєш метод, можеш розв’язати за одну секунду.

— Як викладати математику цікаво, на вашому досвіді?

Мені важко відповісти щодо стандартної математики, бо вона не дуже цікава. Цікавішою вона стає в університеті. З’являється більше моментів, коли тобі треба уявляти картинку в голові й нею оперувати. Це не складні формули чи інтеграли, а зображення в голові, за допомогою якого ти розв’язуєш задачу. Олімпіадні виглядають страшно, але такими не є.

Мені дуже пощастило з викладачами. Тарас Дмитрович — син вчительки, який у нас викладав, сам по собі дуже цікава людина. Математик з чорним поясом по карате. Він розповідав багато крутих історій, чимало з яких пережив сам чи то на олімпіадах, чи то у спорті. Вмів класно подати й був авторитетом для нас й знаходився на ближчій дистанції, ніж вчителі. Тому виявилось, що він не лише призер міжнародних олімпіад, але й дуже здібний вчитель. Я б намагався викладати так, як викладали мені: це було геніально. Прислів’я каже, що учень — це смолоскип, який потрібно запалити. Коли учень сам починає цікавитися, то він досягне дійсно хороших результатів. Якщо просто виконуватиме те, що кажуть, — це не те. Має бути більше практики і менше теорії. Тому що під час практики ти сам перевідкриваєш метод розв’язку задачі.

— Ви казали, що математика красива. Як би ви показали красу цієї науки?

В школі у звичайній математиці, напевно, через геометрію. Є котангенс, бісектриса, медіана. І вже той факт, що всі вони перетинаються в одній площині виглядає цікаво. Чи наприклад, маємо прямі. Вони не зобов’язані перетинатись, але всі вони перетинаються, хоча не завжди зрозуміло, чому це так. Але в цьому і є фішка, яка мотивує з’ясовувати, чому так трапляється. Перетин прямих, як правило, потрібно зводити до певних теорем і через них доводити. Саме доведення вже не таке цікаве. Цікаве формулювання. Повинна бути уява. На третьому курсі в університеті я займався випадковими блуканнями. А насправді це виглядає так: уявіть собі, наприклад, жабку. Вона стрибає по множині цілих чисел, її стрибки не залежать один від одного, й ми просто відслідковуємо її траєкторію, бо за наявною інформацією ніяк не можемо передбачити, куди вона стрибне. Це і є випадковим блуканням.

Я веду до того, що за усім цим стоїть доволі проста картинка. Головне, що потрібно зробити, — правильно зрозуміти, як діяти з цією картинкою, маючи інтуїцію. Продумувати її й аналізувати — ось що приємно й те, чому мені подобається дослідницька математика. Математика доволі проста, адже в ній завжди є прості моделі. Мені подобалось знаходити розв’язок задач. Хоча це не так, як в житті. В житті складніше, й моделі не спрощені. В олімпіадній математиці потрібно придумати метод. І коли ти придумуєш ідею. Це відчуття того, що ти винаходиш щось таке, що приводить до розв’язку. Це схоже на відчуття, коли твоя улюблена команда забиває гол.

— У 2014 році американський математик Джордан Елленберґ написав книжку «Як ніколи не помилятися. Сила математичного мислення». Вона про те, як математичне мислення допомагає вирішувати проблеми в політиці, медицині, бізнесі, богослов’ї й розкриває приховану красу й логіку світу. Як вам математичні здібності допомагають в повсякденному житті?

Логіка допомагає зекономити час й зробити правильний вибір. Це добре працює в плануванні особистого часу. Наприклад, з добрими пізнаннями теорії ймовірності ти простіше розумієш, що лотерея — щось невигідне. Зазвичай, коли думаєш про виграш, здається, що ти справді можеш бути щасливчиком. Хоча існує певна вірогідність твого виграшу. Проте зі значно більшою вірогідністю ти програєш. Якщо порахувати в середньому свої показники по лотереї, виявиться, що це число від’ємне, адже компанії працюють так, щоб вигравати. Дуже багато людей вважають, що коли ти граєш в рулетку, то твої результати якось залежні. Наприклад, якщо в тебе двічі випало на червоне, тоді втретє точно буде чорне. Завдяки математиці ти розумієш, що кожен кидок кульки незалежний від попереднього. За такою логікою, коли ми з друзями граємо в мафію, мені доводять: людина двічі була мафією, тому в третій раз вона точно нею бути не може. Хоча це не так.

Чотири роки життя я йшов саме до цієї останньої олімпіади

— У вас великий олімпіадний досвід у математиці. Чим є олімпіадна математика та з якими проблемами зіштовхувались на змаганнях?

Я завжди хвилювався перед олімпіадами. В мене якась спортивна натура, бо я люблю перемагати. Олімпіада — це ще дуже непевна річ. Багато залежить від задач, які тобі випадуть. Комусь дається краще один тип задач, комусь інший. До десятого класу геометрія давалась мені гірше, ніж інша математика. Не знаю, чому. Але у всіх так буває — сильні та слабкі сторони. Мені добре вдавалось якісь ймовірності на доведення. Хоча звісно, якщо ти багато працював перед олімпіадою, в тебе все ж більше шансів. Мої результати часто стрибали: добре виступив, погано, знову добре, знову не найкраще. Я брав участь у всеукраїнських олімпіадах чотири рази.

Але потрібно теж розуміти, що в математичних олімпіадах не все так жорстоко, як в олімпійських іграх. В нас є багато перших місць, багато других, багато третіх. Мені здається, це правильно тим, що дітей потрібно заохочувати. І це добрий спосіб. У восьмому класі посів перше місце, в дев’ятому я провалився, не зайняв жодного місця. В десятому класі було друге місце. В одинадцятому я зайняв перше місце. В абсолюті це було друге місце за балами.

Перша олімпіада IMO (International mathematical Olympiad — основна міжнародна олімпіада з математики для школярів на той час, зараз їх уже більше) відбувалася в Мадриді у 2008 р. Вона була надзвичайна! З одного боку, я, як завжди, хвилювався. Передусім, тому що представляю свою країну. Тоді, у 2008 р., нам пошили форму збірної, і це додатково мотивувало. З іншого боку, ця олімпіада стала дивною для мене. Я був десятикласником і знав, що в мене попереду ще рік, тому налаштовувався на неї як на тренування в бойових умовах, аби через рік видати справді максимум.

Це мене заспокоювало, але готувався я не так сильно, як в одинадцятому класі. В результаті — виступив не надто добре, хоч і взяв бронзову медаль. На цій олімпіаді половина учасників отримала якісь нагороди. Туди важко потрапити, але якщо ти вже там, то без медалі не залишишся. Я доклав не так багато зусиль, тому результат заслужений. Але важлива і психологія. При підготовці ти розв’язуєш завдання попередніх років і знаєш, скільки балів потрібно для третього чи другого місця — заздалегідь психологічно готуєш себе до певного результату, і, як правило, так воно й виходить. Коли я розв’язував задачі, то бачив, що все йде не дуже, і вже розумів, що, мабуть, буде бронза. Десятикласники, що приїжджали в попередні роки, виступали не надто вдало, і я тоді думав, що теж так виступлю.

— Пам’ятаєте завдання, над яким довго думали?

Точно пригадую, що там була простенька задача, де треба було підрахувати кількість ламаних на площині, які проходять через сусідні точки відповідно до певного правила. На олімпіаді так влаштовано, що перші задачі — для розминки, другі — середні, а треті — важкі. Також у перший день — легші, у другий — важчі. Це була перша задача другого туру — по суті, не складна, однак я себе так налаштував, що, мабуть, її не розв’яжу. Врешті-решт, так і сталося. А через кілька місяців я її за п’ять хвилин розв’язав, а на олімпіаді є аж чотири з половиною години. Це психологія. Якщо ти зможеш себе правильно налаштувати, то це допоможе. Однак це складно, бо коли ти готуєшся вдома, то приблизно розумієш, на що здатен, і не просто переконати себе в тому, що тобі вдасться абсолютно все. Я б міг взяти срібло, але психологічно налаштував себе на бронзу.

Остання моя олімпіада в статусі школяра відбувалась у Бремені в одинадцятому класі, тому я дуже серйозно налаштовувався, адже підходив до завершення певний етап у житті. Якщо у сьомому класі я ще не дуже вірив, що зможу дійти до міжнародного рівня, то з часом з’являлася впевненість, що це можливо. Чотири роки життя я йшов саме до цієї останньої олімпіади. Я готувався півроку, ретельно підбирав матеріали і дуже багато працював: по 7-8годин на день майже без вихідних. Нам дозволяли, можливо, не зовсім офіційно, відвідувати не всі заняття, щоб підготуватися до олімпіади. Кожен успішний виступ на всеукраїнському чи міжнародному рівню — це престиж ліцею. Тому я не часто ходив до школи останні півроку, був офіційно звільнений від випускних іспитів. Мене захищали, бо ставки були високі. В нашому ліцеї, по суті, до нас значних досягнень не було, тому в мене була можливість дійсно багато займатися.

Я налаштовував себе тільки на золото. Дуже хвилювався і відчував додаткову відповідальність за країну. Перші задачі я розв’язував без проблем, другі — теж, а от з третіми було важко. Як правило, я не міг їх розв’язати. Лише іноді це вдавалося. Тому я вже розумів, що у мене буде мінімальне золото. Золота медаль — від 32 до 42 балів. Я набрав — 33. Це нижнє золото. Сталося так, як я себе і налаштовував. Перші задачі пішли без проблем, другі — без проблем. Там я набрав максимум. А з третіми були великі проблеми. І це дивне відчуття, коли ти сидиш і розумієш, що ти вже нічого не вдієш, в голові вже просто немає ідей. Я фактично здався. Ти начебто і намагаєшся, але нічого не виходить. Але все-таки я готувався багато років і був дуже щасливий.

— Як математику вам притаманне раціональне мислення, однак щоразу на змаганнях ви неабияк хвилювалися, чому не вдавалося приборкувати емоції?

Я така людина. Навіть коли граю у боулінг чи теніс, я хвилююся за перемогу. Стрес з’являється автоматично. Хвилюватися — не вигідно, і я розумів це. Але переживання завжди мене супроводжували. От як футбольна серія пенальті — це катастрофа. Гравець може жахливо не влучити у ворота, при тому, що на тренуванні він пробиває без проблем. В Бремені, певною мірою, мені вдалося впоратися з хвилюванням, була впевненість. В іншому — це такий спортивний характер, я дуже хочу перемогти.

Коли досягнув усього — виникла порожнеча

— Олімпіада дала вам можливість побачити життя в інших країнах. Як це вплинуло на вас?

Справді, в десятому класі я вперше побував за кордоном. А в одинадцятому було дуже важко, бо зникла моя мета. Останні кілька років я прагнув отримати золото на олімпіаді в Бремені, а коли досягнув цього — виникла порожнеча. Почалася певна криза. На той момент я був дуже юним. В одинадцятому класі мені було всього шістнадцять. Безумовно, мене вразило те, як живуть люди за кордоном, але я був певний, що треба бути патріотом, жити і працювати у своїй країні. Я люблю спорт, і пам’ятаю, які умови були за кордоном: поля для футболу, тенісу, волейболу. Повертатися в Україну було непросто, але я не сумував, адже там усі мої друзі. Неприємно було через втрату цілі, через розуміння того, що казка завершилась, і треба все починати заново. На першому курсі університету я не уявляв, що зі мною буде, трішки розгубився.

— Після повернення в українські реалії постало питання: «Що робити далі?». Яку відповідь ви собі дали тоді?

Насправді, я не дуже розумів, як усе має відбуватися. Пари на мехматі, часто доволі нудні, — це зовсім не те, що олімпіада. Навчатися так шість років? Насправді важливо те, що ти робиш поза навчанням. Аби залишатися в академії, потрібно займатися науковою роботою, вчитися проводити наукові дослідження. Потім я зрозумів, що це мала би бути моя основна робота в університеті. На першому курсі я просто ходив на заняття з поглибленого вивчення математики до Олексія Кулика, а на другому курсі він став моїм науковим керівником. Я плив за течією, тому другий і третій курси теж були важкими.

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

Знання математики для програмістів дуже цінні

— Любити математику — вроджене чи набуте?

Набуте, однозначно. Я вірю, що в кожного є якийсь талант, але майже все, що ми маємо — це робота. З талантом легше, але все ж основне — працювати. На цьому базуються всі досягнення. Талант лише в тому, що тобі трішки легше. Хтось швидше буде вчитись математиці, хтось повільніше. Але талант не відіграє вирішальної ролі.

— Якби математика була людиною, який би вигляд вона мала?

Математика, безсумнівно, — творча наука. Процес пошуку розв’язку — це творчість. Ти уявляєш картину і маєш в голові інтуїтивно вирішити задачу. Особливо дослідження: ти розв’язуєш те, що досі ніхто не розв’язав. Вона, напевно, схожа на якогось художника чи художницю молодих років. Це людина висока на зріст, в окулярах, можливо, з довгим волоссям, в джинсах, кудлатому теплому светрі. Пік у математиці — приблизно 40 років. Це вік, в якому ти багато вже дізнався, і ще не пішов процес старіння. До цього треба багато вчитись. Після — це стає важче. Математики часто відірвані від життя, бо займаються абстрактними речами. Людина може бути розгубленою, але це не заважає їй думати, головне — створювати ідеї.

— Скидається на хіпстера.

Можливо, щось середнє між хіппі і хіпстерами.

— Доля чи випадковість?

У фізиків зараз дуже популярна квантова механіка. У квантовій механіці все моделюється так, що світ не є детермінований. Ця недетермінованість дає відповіді на дуже багато складних питаннь. Є, наприклад, вся інформація про наш всесвіт. Ви не можете передбачити майбутнє навіть з її наявністю. Навіть попри те, що раніше була популярною ньютонівська механіка. Якби світ був детермінований, він все ж дуже хаотичний. Як фільм «Ефект метелика» — помах крил метелика може розбудити цунамі на іншому кінці світу. Через те, що щось інакше відбувається, історія може піти зовсім не так, як передбачається. Я зараз займаюсь динамічними системами, й там так дуже часто буває: трохи змінюєш початковий стан — система стає зовсім інакшою. Тому я не вірю в долю.

— Які б ви порадили книжки, дотичні до математики, які б зацікавили людей, далеких від цієї науки?

Бенуа Мандельброт «(Не)слухняні ринки. Фрактальна революція у фінансах» — про фінансові біржі й теорію ймовірності. Друга — Роберт Аксельрод «Революція співпраці» — про двох в’язнів та теорію ігор.

— Ваш колега Дмитро Охонько, який зараз у Facebook, теж вправний у математиці. На співбесіді, як сам казав, він не зміг написати ні рядка коду, проте саме за високий рівень знань з математики йому вдалося потрапити спочатку до Microsoft, а потім і у Facebook. А ви пробували себе в ІТ?

Інколи думав. Десь 80% хлопців-однокласників пішли саме в ІТ. Проте я розумію, що це не моє, воно мене завжди лякало. Мені здається, в цій професії більш менш ясно, що саме ти маєш робити. Й писати коди мені видається марудно, при всій повазі до програмістів. Мені треба щось таке, де потрібно більше часу на роздуми, менше писанини. Але, як я знаю, знання в математиці для програмістів дуже цінні. Щоб досягти висот, думаю, добре мати за плечима повну шкільну програму й 1-2курс університету. Математичний аналіз та лінійна алгебра завжди знайдуть своє місце в ІТ.

Дуже круто, коли людина може працювати в Україні, але мені це було б складно

— Що саме ви досліджуєте в Берліні?

В Берлінському технічному університеті досліджую синтетичні властивості певних видів потоків, які добре підходять, щоб описувати рух рідин, течій. Є формула, яка поєднує ентропію системи з певними локальними властивостями. Я хочу отримати аналог цієї системи для наших потоків, попри те, що наші потоки в певному сенсі виходять за рамки звичайних і теорія не може бути у стандартному вигляді. Проблема в тому, що для моїх потоків ентропія невизначена.

— Звучить, як біологія.

Це може бути математична модель, яку я можу використати, щоб описати рух рідини у склянці, грубо кажучи. Навіть якщо склянку не чіпати, рух там все одно відбувається. Згоден, що ентропія — це фізичне явище, але є ентропія і в теорії динамічних систем, тобто в математиці. Я пов’язую цю міру хаосу — ентропію — з певними локальними характеристиками.

— Після захисту дисертації плануєте повернутись в Україну?

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

В Німеччині жити набагато зручніше, ніж в інших країнах. Деякі люди бояться їхати, мовляв, важко адаптуватись. Це правда лише до певної міри, адже адаптування проходить не так складно. Наприклад, Берлін — інтернаціональне місто. Якщо ти говориш англійською — в тебе взагалі проблем немає. Добре пожити в кількох країнах. Це допомагає розвивати світогляд й намагатись розуміти інших. Адже коли ти живеш лише в Києві — це дуже обмежує. Цікаво бути не лише в ролі туриста, а й заглибитись в життя, культуру цієї країни. На жаль, на добре майбутнє з математикою в Україні треба ще почекати.

— Яку роботу ви шукаєте?

В математиці є неймовірна кількість відкритих проблем. Це наче дірки, які математики не встигають зшивати. Тому ти можеш взяти будь-яку проблему й почати розв’язувати. Щойно ти розв’яжеш проблему, від цього з’являється кілька нових. Сподіваюсь мені вдасться щось серйозне довести, і воно було б корисне. Думаю, скоріше за все я також буду читати лекції в університеті. Коли ти займаєшся тільки дослідженнями, трохи забуваєш базу. Врешті-решт ти маєш змогу виховати здібних учнів. Це теж мотивація, яка дає відчуття, що ти робиш світ трохи кращим.


DOU Books: 5 книг для развития образного мышления от Виталия Коваленко, COO KeepSolid

$
0
0

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

[Виталий Коваленко, Сhief Operation Officer в компании KeepSolid. Автор курса «Основы UI/UX Design»на KS Summer Internship, преподает в LITs]

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

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

Тина Силиг «Почему никто не рассказал мне это в 20? Интенсив по поиску себя в этом мире»

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

Дэн Роэм «Практика визуального мышления. Оригинальный метод решения сложных проблем»

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

Стив Круг «Не заставляйте меня думать!»

Доступна бесплатно

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

Алан Купер «Об интерфейсе. Основы проектирования взаимодействия»

Доступна бесплатно

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

Тим Браун «Дизайн-мышление в бизнесе»

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

Советы сеньоров: как прокачать знания junior PHP

$
0
0

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

Александр Скакунов, PHP Architect, 14 лет опыта PHP разработки:

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

Пс, сядь-ка поближе, что скажу. Чисто между нами: РНР — действительно не самый лучший язык в мире. Основных причин я назову две — и тебе лучше о них знать.

Первая проблема РНР — это неконсистентность, то есть похожие вещи сделаны по-разному. Например, одни имена функций названы с подчёркиванием (str_replace), другие — без (strrev), а оператор «::» вообще называется «Paamayim Nekudotayim» (это иврит, детка). Это связано с тем, что язык развивался в разное время разными людьми, поэтому получился такой конгломерат разных подходов.

Вторая проблема РНР — это работа с памятью и скорость. Например, заявленным удобством РНР является динамическая типизация (когда выражение «1» может быть по ситуации использовано как строка или как число). И это же заставляет РНР проигрывать по скорости более строгим, статически типизированным языкам.

Но есть одно но. Каждый инструмент хорош для своего круга задач. РНР — не исключение. Этот язык хорош для создания быстрых прототипов веб-приложений, а это и нужно бизнесу — быстро проверить бизнес-гипотезы. Именно поэтому статистика DOU по реальной популярности языков программирования за 2017 годпоказывает, что РНР находится на 4 месте и обгоняет Python и Ruby (т. н. «модные языки», хе-хе). Пример — тот же WordPress: хотя программисты могли бы написать код и получше, всё же на этом движке работает четверть всех сайтов в мире (если точнее, то 26% в 2016 году).

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

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

И потом, когда уже матчасть будет освоена, переходи на более высокий уровень абстрагирования — изучи основные паттерны проектирования, прочитай «Чистый код», и, если хочешь стать совсем джедаем, то и «Domain Driven Design». Так постепенно ты станешь «language agnostic developer», т. е. программистом, которому не важно, на синтаксисе какого языка писать. Важно научиться «дистиллировать знания» из нечётких требований заказчика в готовый алгоритм. «Тогда, мой сын, ты будешь Человек».

Aндрей Федык, Senior Software Engineer в Intetics, 14 лет опыта PHP разработки:

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

Команда

Команда — это ваше все. Догонять проще, чем бежать впереди всех. Если вам тяжело идти вперед, и вы знаете о своих проблемах с мотивацией, ищите сильную команду, все просто! Сами не заметите, как пойдете вперед семимильными шагами. Причем начинать советую с больших компаний — там обучение эффективнее. Но, если вы пока что не соответствуете запросам большой компании, начать можно с маленькой, но не засиживайтесь там. А еще — делитесь знаниями со своей командой, она, в свою очередь, будет делиться с вами. Получается взаимовыгода. Ну и не забываем про оптимизацию рабочего места — не тратьте свою энергию (мыслетопливо) на рутинные задачи, постарайтесь их автоматизировать (самое простое — настройте в хроме search engines, либо с %S, либо без). Чем меньше рутинных задач, тем больше мозг работает над основными задачами.

Теория

Самоучкам очень рекомендую фундаментальные книги. Если читать лень — делайте аудиокниги (можно txt перевести в голос) или смотрите видеолекции. Вот подборка, которую я советую:

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

Опыт

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

Также не представляю PHP без JS — это вам такая пометка, что не стоит зацикливаться только на PHP. Расширяйте кругозор, смотрите по сторонам, выходите за пределы «зоны комфорта» в плане задач. Не делайте только то, что вам говорят — учите что-то новое, что вам интересно, обращайте внимание на другие задачи, которые могут вам дать в будущем. Не позволяйте мозгам простаивать, изучайте новое (даже если какие-то знания не лежат в вашей предметной области). Надо держать руку на пульсе — читать статьи, слушать подкасты (я лучше воспринимаю на слух, но опять же ищите свой вариант).

И еще раз — не ленитесь! Отговорки придумать можно всегда, но также можно всегда найти способ заняться образованием. Я, например, учусь в основном в маршрутке по дороге из дома на работу и наоборот. Лень идти к цели — лежите в направлении цели!

Александр Махомет, Product Architect в Upwork, 14 лет опыта PHP разработки:

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

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

Во-первых, программирование на PHP — это в первую очередь программирование, поэтому имеет смысл ознакомиться с общими парадигмами и подходами. Из классики это труды Martin Fowler, GOF, Robert Martin, Steve McConnel. Читать этих ребят — это не «Игры престолов» смотреть (не так увлекательно), но постепенно с фундаментальными вещами знакомиться стоит. На GitHub (если вы не в курсе, что такое Git, тоже в список to do на изучение) есть большой список бесплатных книг, по программированию и по PHPв частности.

PHP существенно изменился за десятилетия, а в интернетах много устаревших туториалов. К счастью, не утонуть в этом огромном количестве информации для новичков поможет ресурс phptherightway. В нем собраны актуальные бест практики для PHP разработчиков, причем там затрагивается не только PHP, но и смежные тематики, например, вопросы развертывания (deployment). Есть даже частично переведенная украинская версияэтого ресурса, но я настоятельно рекомендую работать с первоисточниками, иначе у вас будет неполная и неточная информация. Знание английского языка хотя бы на уровне чтения — must have. Изучение или прокачивание английского языка будет хорошей инвестицией в карьеру разработчика.

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

Еще бывают online-курсы, и тут одну хорошую ссылку я все же оставлю. Это курсы от hexlet (обучение частично платное, частично бесплатное).

Будьте в тренде. Следите за изменениями, новыми статьями и инструментами в мире PHP. Вам помогут два дайджеста: DOU PHP Digestи Habrahabr PHP Digest. Материалы этих дайджестов покрывают большую часть того, что происходит в PHP мире.

Читайте блоги и твиттеры передовых PHP разработчиков. В PHP сейчас эра фреймворков, стоит знать, кто такие и что такое Fabien Potencier (Symfony Framework), Taylor Otwell (Laravel Framework), Matthew Weier O’phinney (Zend Framework). Разберите по полочком код какого-то фреймворка, например, Symfony, попытайтесь написать свой.

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

Ходите на PHP митапы. В Украине и в частности Киеве проводятся как большие и платные конференции, например, PHP Fwdays, так и бесплатные встречи, например, PHP Friends Club, Symfony Cafeи другие. На таких встречах можно послушать доклады, но самое главное — пообщаться с более опытными коллегами, задать вопросы спикерам, к которым в обычном режиме достучаться сложно.

Успехов! :)

Сергій Камолов, Senior Software Developer в PROBEGIN, 10 років досвіду PHP розробки:

Перефразовуючи Марка Твена, можна назвати два найважливіші моменти у житті PHP розробника: рішення почати працювати з PHP та рішення перейти на Ruby. Це, звісно, жарт, але ще кілька років тому кар’єра PHP розробника виглядала саме так. Хіба що замість Ruby могла бути будь-яка інша мова програмування.

Із самого початку PHP вважалася мовою з найнижчим порогом входження, що, з одного боку, зумовило її стрімку популярність, а, з іншого, породило дещо зневажливе ставлення з боку представників інших мовних «філософій», адже розпочати кар’єру з PHP було набагато простіше, аніж, скажімо, з Java або .NET. Ще кілька років тому мінімальний перелік вимог на посаду Junior PHP Developer, окрім знання самої мови, обмежувався базовими знаннями HTML та MySQL, а знання JavaScript додавало неабияких переваг серед інших кандидатів.

Зараз ситуація інша, адже змінилися і сама мова PHP, і рівень задач, що вона вирішує. Навіть сам Расмус Лердорф, винахідник PHP, часом дивується, якого розвитку набуло його творіння. Якщо проаналізувати сучасний рівень вимог до кандидатів-початківців, то тут вже і знання з ООП та патерного програмування, досвід роботи з різними фронтенд-фреймворками, компіляторами та препроцесорами, SQL та NoSQL базами даних. А базові навички адміністрування Linux-систем тепер просто must have, як і розуміння ряду принципів, що формуються у зарозумілі слова із великих латинських літер (SOLID, KISS, DRY). І це ми навіть не дійшли до вимог щодо володіння самою мовою PHP, рівень знання якої має відповідати кільком рокам практичного досвіду. Звідси і виникає головне питання: як розпочати свою кар’єру в якості PHP розробника і як залишитися затребуваним фахівцем у галузі, де рівень вимог і технологій змінюється так стрімко і непередбачувано, як курс долара в нашій державі.

Перше, і, мабуть, найголовніше — це знання основ. І не стільки знання основ самої мови PHP та супутнього стеку, як розуміння принципів написання якісного коду як такого. Адже більшість проектів вимагають саме командної роботи, і володіння загально прийнятими практиками дозволяє створювати якісний продукт. Розвинути такі навички допоможуть:

Друге — це практичний досвід. Але тут важливо розуміти, що досвід може бути як корисний, так і не дуже, особливо з огляду перспектив у майбутньому. Як от, наприклад, тривалий досвід роботи лише з певною CMS чи застарілим фреймворком. Якщо врахувати, що за темпами появи нових трендів PHP відстає лише від JavaScript, можна зробити висновок, що за деякий час такий досвід може виявитися абсолютно не потрібним. Тому дуже важливо слідкувати за трендами та тенденціями у галузі веб-розробки. Створення додаткових проектів чи навіть просте проходження «туторіалів» дозволить залишатися затребуваним, навіть якщо основний проект все ще працює на PHP 5.3. На щастя, кожен популярний фреймворк має гарну документацію та добре організовані спільноти для обговорення нагальних проблем.

Третє — де шукати інформацію про тренди? Можна, звісно, скористатися сервісом GoogleTrends, але тут великий ризик дізнатися, що розробка на Python має набагато кращі перспективи. Можна переглядати різні рейтинги фреймворків на технічних сайтах чи блогах, але об’єктивну оцінку знайти там важко, бо кожен, як то кажуть, хвалить своє болото. То де ж шукати об’єктивність? На допомогу приходить DOU із розділом «Робота» (головне не переплутати із розділом «Зарплати»), адже, переглядаючи відкриті вакансії, можна дізнатися, що попит на знання Symfony 2 набагато перевищує попит на, здавалося б, сучасніший Symfony 3, а Full Stack Web Developer — це не міф, а реальна вакансія.

Четверте — вчитися на успішних прикладах. Здібності до програмування — це, звичайно, добре, але вони майже нічого не варті без вміння шукати якісну інформацію та здатності переймати чужий досвід. На жаль, деякі початківці починають створювати свої власні фреймворки та СMS, намагаючись самостійно розробити продукт, кращий за результат роботи цілої спільноти висококваліфікованих фахівців. Тим часом перспективність будь-якого розробника-початківця залежить від його відкритості до запитань та здібностей аналізувати чужий код.

Найкраще, звісно, шукати відповідей у більш досвідчених колег — вони і вкажуть правильний напрямок, і «носом ткнуть» у провалені тести, а ще ніщо так не збиває пиху, як код-рев’ю проведене тімлідом. Якщо ж такої можливості немає — тут вже тільки Google, тільки хардкор, тобто Хабрахабр. Хоча краще одразу налаштовуватися на пошук інформації в англомовному сегменті інтернету — більше шансів отримати якісну відповідь. Хоча бувають і винятки: так, наприклад, найбільшими дописувачами на відомому StackOverflow є саме початківці, а, отже, і якість інформації там відповідна. Дуже корисно переглядати проекти на GitHub з великою кількістю контриб’юторів, особливо коли потрібно вирішувати архітектурні питання. Головне розуміти, що використання чужих напрацювань — значно краще, ніж створення велосипеда самотужки. Ось, наприклад, підбірка кращих рішень на будь-які випадки життя: Awesome PHP.

Наостанок, якщо ви вже розробник-практик, можете похвалитися кількома завершеними проектами і навіть почали розглядати вакансії на посаду Middle або й Senior, то прийшов час відповісти самому собі на просте запитання: Why You’re a Bad PHP Programmer.

Ігор Петрович, Deputy Production Director в CoreValue, 10 років досвіду PHP розробки:

PHP — це мова, яка добре підходить для старту кар’єри в ІТ незалежно від того, як ви потім захочете розвиватись. Кожна мова має певні сильні та слабкі сторони. Існує багато дискусій про слабкі сторони PHP, такі як витоки пам’яті, масштабованість та швидкість, проте є більша неочевидна проблема, яку я виявив з власного досвіду. Через низький поріг входу та специфіку PHP багато розробників починають свій професійний шлях саме з цієї мови, але з часом вони не розвиваються і не вчаться писати правильний код.
Загальні рекомендації
Моя порада для новачків-розробників: важливіше навчитися правильно програмувати, ніж вивчити синтаксис. Ви повинні зосередитися на загальній практиці програмування, а не тільки на самій PHP.

Ось декілька важливих елементів в нашій галузі, які ви можете недооцінювати на старті кар’єри, але вам необхідно працювати над ними:

1. Структури даних. Я бачив надто часто, що люди не знають доступних структур даних і коли їх використовувати. Це призводить до низької продуктивності та поганого коду. Так само як шаблони проектування, структури даних — це елементи, які допоможуть вам вирішити конкретні проблеми.

2. Алгоритми. Потрібно спрощувати обчислювальну складністьалгоритмів для підвищення продуктивності. Часто розробники використовують алгоритми, надані сторонніми бібліотеками, не розуміючи, як вони працюють. Навчаючись в університеті, я витратив якийсь час на алгоритмічне програмування. Брав участь у конкурсах ACM ICPC, завдяки чому досяг кращого розуміння алгоритмів і їх обчислювальної складності. Не потрібно перемагати у цих конкурсах, потрібно просто брати участі. Навіть якщо ви навчитеся вирішувати лише частину завдань, будете краще розуміти тему.

3. SQL. На великих проектах зазвичай є спеціаліст, який обробляє запити баз даних, особливо складні. Але якийсь час вам потрібно буде це робити самостійно. Згодом вам доведеться розібратись і зрозуміти роботу ORМ. Наприклад, як там формуються SQL запити. Іноді краще писати ці запити самостійно, ніж покладатися на ORM.

4. Шаблони. Зосередьтеся на тому, коли ТРЕБА їх використовувати, а коли НЕ треба. Повторно перечитуйте шаблони кожного разу, коли думаєте, що досягнули нового рівня, адже кожного разу ви будете розуміти і сприймати їх по іншому. Ваша ціль — досягти рівня, коли ви зможете автоматично розпізнати чи потрібно використовувати певні шаблони.

5. «Як працює веб» на рівні, який комфортний для вас. Ви повинні почати з основ і поступово заглиблюватися в кожну тему. Деякі важливі з них:

a. Як запити надходять із вашого браузера на сервер і як дані повертаються.
b. Cookies / Sessions
c. SSL / HTTPS

6. Принципи, яких рекомендовано дотримуватися:

7. Англійська. Вам потрібен хороший рівень англійської, щоб правильно розуміти завдання та щоб комунікувати з клієнтами.
Конкретна PHP порада

При розробці на PHP надзвичайно рідко ви будете використовувати чисту PHP. Як правило, ви будете розробляти, застосовуючи один з таких підходів:

  1. Фреймворки (такі як Symfony, Lavarel, ZF, Yii).
  2. CMS (наприклад, WordPress, Drupal, Typo3).
  3. Платформи (наприклад, Magento).

Для розвитку в PHP можна опановувати будь-який з вищезазначених варіантів. Тим не менш існує певна крива навчання для кожного з цих підходів, тобто ефективність в одному стеку технологій не означає ефективність в іншому. Але не поспішайте вивчати їх всіх одразу, вибирайте один за покликом серця. Зазвичай розробники спеціалізуються не у всіх.

Щодо літератури, існує багато книжок із загального програмування, алгоритмів, патернів тощо. Багато було рекомендовано в попередніх серіях статей DOUдля інших технологій. Я можу порадити такі сайти для початку:
1. php.net/manual/en
2. www.phptherightway.com

P. S.: Наприклад, мені достатньо було лише документації від офіційного php.net, щоб отримати PHP сертифікацію.


Подписывайтесь на наш Telegram-канал для джуниоров, чтобы не пропустить интересные вакансии, стажировки, курсы, статьи.

Яким кандидатом не треба бути: 8 реальних історій

$
0
0

У вас бувають випадки, коли ви довго ходите, якусь думку думаєте, аналізуєте, чи варто тим з усіма ділитися? Як то сприймуть і т. д.? От і в мене схожа ситуація, бо сама дуже скептично ставлюся до постійних холіварів між рекрутерами та кандидатами, але настав той момент, коли думці пора на волю.

Цього року багатенько говорили про тренди, тенденції в рекрутменті, про автоматизацію HR-процесів і навіть про те, що скоро рекрутери не будуть потрібні, бо їх замінять роботи. Ніколи не повірю, що в соціумі, де трапляються ситуації, описані нижче, роботи приживуться і не покінчать життя самогубством. Окрім того, що кидати помідорів в мій бік, хотілося б, щоб обидві сторони — і рекрутери, і кандидати — на секунду подумали про свою поведінку. Саме так, обидві сторони. Бо ніщо так не любить рекрутер, як вчити іншого колєгу по цеху правильно працювати.

Так от, давайте поговоримо про речі, які, на мою думку, завжди будуть трендовими: дорослість та відповідальність. Далі декілька реальних історій із власного досвіду та з досвіду моїх колег, не називаючи конкретних імен, ясна річ. Постараюся коротко.

Історія перша. Довгенько ми шукали техліда на один із наших проектів. Шукали-співбесідували — знайшли! Переїхав до нас з іншого міста (не важливо вже з якого). Пропрацював декілька днів — звільнився. Запитаєте, чому? Тадааам! Бо у Львові мало великих торгових центрів, де він звик проводити свій вільний час. Аргументація техліда! Зі 100500-річнимдосвідом, Карл!

Ще одна історія. Кандидат прийшов на співбесіду, бо дуже його зацікавив проект, технології, компанія. Та й на попередньому проекті було не все гладко: менеджмент кульгає, технології старі, ну словом — стандартно все. Пройшов одну співбесіду, пройшов другу, отримав джоб офер — і відмовився від пропозиції. Чого? «Та бо в поточній компанії відпустки на 2 дні більше. Не готовий переходити на гірший соцпакет».

Спитаєте: «А як же на проекті бардак, технології старі і бла-бла?» Відповідь: а немає її. Не хочеться якось 2 вихідні людині брати із зарплатні, яку ми помножили у 2 рази.

The next one. Кандидат поспілкувався з рекрутером, виконав тестове завдання, пройшов співбесіду, отримав офер, почав процес звільнення на поточній роботі — і тут на тобі. Виявилося, що в нього в контракті час на перехід не тиждень, як він собі думав, а 2 місяці. Серйозно? Наро-о-од, ну почніть же нарешті читати, що ви підписуєте. Ну не в пісочниці ж бавитеся, а якісь серйозні речі робите. Нє?

Схожий кейс. Кандидат прийняв офер, ти дав фідбеки іншим кандидатам (серед яких, між іншим, були дуже навіть достойні), ти всім-всім повідомив про вихід людини. Вона через тиждень передумала і вирішила залишитися в своїй компанії. Бо так ся стало. А у вас терміни горять, замовник в шоці і взагалі no comments. Титри. Завіса.

Кейс з протилежного боку. Людина йде з компанії, у нашому контракті є пункт про конкретний час на попередження про звільнення. Ага, він є, уявляєте? Але твій ще вчорашній колєга говорить: «Ну я бачив цей пункт, ну а нашо вам аж стільки-то днів? Ну я думав, що це просто формальність. І взагалі, ви не people oriented!» Як побудований бізнес і які ризики несе у свою чергу роботодавець — не важливо.

Наступна історія — із тих, веселіших. Понеділок: «Остаточна відповідь щодо оферу буде в п’ятницю, але можу вам сказати, що на 90% рішення буде на вашу користь. П’ятниця: «На жаль, я не можу прийняти ваш офер. Справа не у вас, а в мені. Ви не можете вплинути на моє рішення». Що це — магнітні бурі? Порчу навели?

Думаєте, найважчі вакансії — технічні?Зараз буде трішки облом, життя нас теж до такого не готувало. У роботі вакансія бухгалтера. Ви скріните кандидата, з’ясовуєте, що кандидат стажується в іншій компанії на рекрутера, і, очевидно, відмовляєте. Кандидат у свою чергу усіма можливими і неможливими способами переконує вас, що стажування — то таке, то від нічого робити і просто важко знайти нормальну оплачувану роботу бухгалтером. Але він обожнює ті всі бухгалтерські штуки і навіть не уявляє свого життя без виплат винагород ФОПам. Переконав. Людям потрібно ж давати шанс, хіба ні?

Проходить тиждень, і ваш натхненний новою роботою співробітник каже: «У вас тут вакансія рекрутера відкрита. Я знала, що ви мене рекрутером не візьмете, бо ж зовсім досвіду не маю. От і пішла до вас бухгалтером. І зрозуміла, що це не моє. Можете мене розглянути?». Що не ясно. Все логічно. Женщіна передумала.

Дуже коротка історія, але теж про дорослість і відповідальність. Кандидат не приходить на співбесіду і через 10 хвилин від її початку пише тобі в скайпі: «Ой, а я передумав». І смайлик з язиком.

Про мейл чи скайп як «котік/рибка/самальотік» я писати не буду, бо то вже ну ду-у-уже заїжджено. Але, на жаль, люди й далі відправляють резюме з такими поштами. Журбинка.

Так до чого я це все... Вельмишановні кандидати, ми вас любимо, але інколи ви доводите нас до «сіпаючого ока» (і це в прямому сенсі). Не треба так.

Дорогі пані та панове рекрутери, я знову ж таки не буду оригінальною, але запрошуйте в свої команди дорослих людей, і самі будьте дорослими й відповідальними. Та й всі, хто працює з людьми, — будьте відповідальними. Не псуйте своїми діями і недбалістю репутацію нашої чудової професії.

P. S. Якщо хтось впізнав себе і образився... — то нормально. Значить не все втрачено. Як то кажуть в народі: «Правда очі коле».

P. P. S. А ви викидаєте жуйку перед співбесідою? Правильно, не треба! Так же краще думається, і відповіді на запитання колоритніші!

.NET дайджест #21: фичи .NET Framework 4.7.1, Ben.Demystifier, доступен пререлиз Rider 2017.3

$
0
0

В выпуске: основательный обзор .NET Core 2.0 и ASP.NET Core 2.0; Windows Compatibility Pack for .NET Core, который добавляет много новых API; как улучшить производительность приложений; Trunk Based Development.

.NET

.NET Framework 4.7.1 Runtime and Compiler Features
Поддержки .NET Standard 2.0 на уровне BCL, улучшение производительности GC, ValueTupleтеперь сериализуемые, Runtime Feature Detection.

DotNetAnywhere: An Alternative .NET Runtime
Осмотр древнего проекта, который используется в экспериментальном Blazorдля выполнения C# в браузере.

.NET Core 2.0 and ASP.NET Core 2.0 are Here
Основательный обзор нововведений, плюсов и минусов платформы.

Welcome to C# 7.1
Async Main, выведение имен элементов кортежа, default литералы.

Detect blocking waits
Интересный метод, как можно найти блокирующие ожидания задач, такие как Task.Resultили Task.Wait.

C# 7.2: Understanding Span
Хорошее вводное видео о Span<T>: для чего нужен и как помогает минимизировать аллокации при работе с массивами и строками.

Introducing Nullable Reference Types in C#

Plain Functional Programming by Martin Odersky
Еще не успел посмотреть видео, но там интересный слайд, что синтаксис C# сильно больше, чем в С++, Java, Haskell и многих других.

Announcing the Windows Compatibility Pack for .NET Core
Пакет, который добавляет много новых API, включая долгожданный System.Drawing. Некоторые только под Win.

HashCode based on xxHash32
Генератор хороших хеш-кодов в corefx.

Migrating from ASP.NET Identity to Service Stack Authentication

In C# 7 is it possible to deconstruct tuples as method arguments
Не сразу было очевидно, как использовать деконструктор в параметрах лямбда-выражения, поэтому решил поделиться: ((string s, int i) _) => ...

Архитектура

Using Akka.NET Actor Systems in Xamarin Apps

Why does Kafka scale better than other messaging systems like RabbitMQ?
Основной поинт в том, что MQ системы запоминают, какие сообщения какой потребитель обрабатывает, и это добавляет много накладных расходов. В Kafka (и EventStore) клиент сам запоминает позицию для чтения, освобождая ресурсы системы и увеличивая пропускную способность.

The Dark Side of Event Sourcing: Managing Data Conversion
Пока не читал, но должно быть интересно.

Software architecture is failing
Статья, вызвавшая много споров в интернетах. Опять же, нужно понимать, что делаешь и зачем. Дискуссия.

Scaling Event-Sourcing at Jet
Крутая статья о архитектуре ES системы, в которой EventStore используется как single source of truth, а проекции строятся на основе Kafka. Дискуссия.

Event Store Internals and SEDA
Интересное видео о внутренностях Event Store от разработчика, к сожалению, с плохим звуком и качеством картинки.

The 7 Ways to Wash Dishes and the Case for Message-driven Reactive Systems
Неблокирующая, асинхронная параллельная обработка сообщений на примере мытья посуды.

Инструменты

Real-World ASP.NET Core Logging Configuration

HashiCorp Consul 1.0

REST Client for VS Code, an elegant alternative to Postman

The Icon Journey
В VS Code вернули синюю иконку. Немного деталей и размышлений на тему.

Beta Docker for Mac and Windows with Kubernetes

Ben.Demystifier
Крутой инструмент для создания более читабельных stack-traces. Уже можно найти расширения для фреймворков логирования.

Bundling .NET build tools in NuGet
В новой системе пакетов PackageReference появилась возможность добавлять команды MSBuild. Новые версии OctoPack уже умеют с этим работать.

xUnit Roslyn Analyzers

Introducing API Analyzer

.NET debugger and assembly editor

dotnet xunit fails for .NET Core 2.0.3 with .NET Core SDK 2.0.3
Задуманное поведение, о котором стоит знать.

.NET (Micro)ORM fetch benchmark results and the fine details

Analyzing performance of asynchronous .NET code with dotTrace
Фича, которой очень не хватало и которую VS умела. Здорово, что они ее наконец добавили.

Code formatting engine updates in ReSharper and Rider

Rider 2017.3 Early Access Program is open
Помимо прочего, добавили поддержку PackageReference, отсутствие которой мешало нашей команде мигрировать на .NET Standard 2.0. Отличная новость для пятницы :)

UI

Vue 2.5 released

Documenting the Web together
MS решили использовать MDN как единый актуальный источник документации для веба.

2018: 120fps and no jank
Размышления о том, как можно добиться лучшей производительности приложений в виду того, что новые девайсы поддерживают частоту обновления 120 Гц.

The Cost Of JavaScript
Очень интересная статья о производительности JS.

Книги

Exploring .NET Core with Microservices, ASP.NET Core, and Entity Framework Core
Бесплатная книга, сам пока не читал, но, возможно, стоит полистать.

Free Ebook: The Cloud Native Attitude

Разное

5 challenges in the developer to CEO transition

Life Is About to Get a Whole Lot Harder for Websites Without HTTPS

Becoming Foolish
О том, почему стоит поинтересоваться функциональными языками программирования.

The QUIC transport protocol: design and Internet-scale deployment
Новый протокол от Гугла, который совершает шифрование и транспортировку за один запрос, т. е. экономит на запросах, но сильнее нагружает процессор.

My First Day at Accenture — The Start of the 104-Hour Workweek
О рабстве на работе.

Promise Theory — Basic Concepts (part 1)

Trunk Based Development
Сайт, посвященный Trunk Based Development. Отличный ресурс, чтобы понять почему, зачем и как.

Architecting for Continuous Delivery

How to choose (and contribute to) your first open source project


← Предыдущий выпуск: .NET Дайджест #20

PHP дайджест #10: готуємося до PHP 7.2, бенчмарки популярних PHP функцій, реліз Bolt 3.4.0

$
0
0

У випуску: як писався сайд проект на PHP для пошуку DNS записів, статистика версій PHP, онлайн-курс по front-end, ідея для open-source проекту.

Статті

Shorthand comparisons in PHP

List of Big-O for PHP functions, або ж Бенчмарки популярних PHP функцій

PHP використовується на 90% вебсайтів

Symfony 4: An Update on Flex

Детальний розбір SQL Injection в WordPress

The Magic Behind Async PHP

Буде цікаво початківцям. Як писався сайд проект на PHP для пошуку DNS записів

DDD, Hexagonal, Onion, Clean, CQRS, ... How I put it all together

PHP still missing bits: generics

Статистика версій PHP

Get ready for PHP 7.2

So you ran COMPOSER as root?

Implementing CORS in Zend Expressive

[RFC] Прийняли Flexible Heredoc and Nowdoc Syntaxes

Советы сеньоров: как прокачать знания junior PHP

Релізи

PHP 7.2.0RC6 Released

PHP 5.6.32

Bolt 3.4.0 released

Цікаві бібліотеки

Slug Generator Library for PHP, based on Unicode’s CLDR data

A Virtual DOM based templating-engine for PHP

An opinionated git prompt for bash and zsh

Різне

Я з командою готую крутий онлайн-курс по front-end. Якщо ти вже не раз заглядався на ReactJS або прагнеш пiдтягнути свої скіли, заповнюй заявку i дiзнайся про курс першим (-ою). В 2018 рік з новими скілами, або Почни 2018 рiк фул-стеком!

Visual Studio Code for PHP Developers

Думаєш про свій open-source проект? 2017 рік, нема ні одної бібліотеки для роботи з PDF

Цікавий проект з відкритим PHP кодом

Mac OS High Sierra йде з PHP 7.1


← Попередній випуск: PHP дайджест #9

Viewing all 8591 articles
Browse latest View live