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

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

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

 

 -Статистика

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

Habrahabr/New








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

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

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

[Из песочницы] Марк, Джек и Алишер! Миру нужен новый фейсбук — образовательный

Вторник, 27 Июня 2017 г. 16:23 + в цитатник
image

Дорогие Марк, Джек и Алишер!


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

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

Проблема бедности и ответственность богатых


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

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

Бедность — это личные и социальные привычки. Ученые из Массачусетского технологического университета выяснили, что старые привычки никогда не забываются, а только скрываются образованием новых. А на формирование новых нейронных связей нужно до 8,5 месяцев. Поэтому, чтобы заменить привычки поколенческой бедности — привычками процветания, человечеству понадобятся десятилетия напряженной и терпеливой работы. И этот путь сродни Исходу — 40-летнему обретению свободы под водительством Моисея.

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

10 атрибутов образовательного фейсбука


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

Философия новых отношений для выхода из бедности — Equal Educational Exchange (Равноправный Образовательный Обмен). Ему соответствует 10 атрибутов образовательного фейсбука.

Атрибут первый: глобальная электронная образовательная инфраструктура


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

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

Атрибут второй: учителем и учеником может стать каждый


Как учителем, так и учеником в образовательном фейсбуке может стать каждый. Каждый может создать свою образовательную программу для других. Онлайн-платформа нового фейсбука для создания учебных курсов, вебинаров, онлайн-тренингов и коуч-консультаций аналогична WordPress для личных сайтов. А большое количество добровольцев и организаций по всему миру будут оперативно выявлять и решать потребности пользователей для укрепления привычек процветания: от азов чтения до риторики, от Duolingo до Coursera. Кроме того, быть учителем в 9 раз эффективнее, чем учеником. «Хочешь изучить предмет — прочитай напиши книгу о нем». Каждый умеет в жизни делать что-то хорошо. И надо дать ему шанс научить этому других и справиться тем самым со своей депрессией, как это сделали Полковник Сандерс и Джоан Роулинг.

Атрибут третий: непрерывное образование на протяжении всей жизни


В мире VUCA — volatility (нестабильность), uncertainty (неопределенность), complexity (сложность) и ambiguity (неоднозначность) — следует признать, что учиться нужно всю жизнь. Традиционная образовательная траектория — одно высшее образование до 25 лет — устарела. Правильно говорить о трехпиковой модели: второй трудоспособный возраст 30–55 лет и третий — 55+. В среднем человек за жизнь меняет 8 сфер деятельности. Поэтому образовательный фейсбук должен стать площадкой для непрерывного обучения на протяжении всей жизни.

Атрибут четвертый: образование ради процветания, полезное для жизни


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

Атрибут пятый: персонализация обучения для раскрытия потенциала


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

Атрибут шестой: добровольческая поддержка изменений


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

Атрибут седьмой: практика уважительного диалога


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

Атрибут восьмой: система достижений, признаваемая оффлайн


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

Атрибут девятый: непрерывное развитие сервиса и научный подход


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

Атрибут десятый: прибыльная бизнес-модель сервиса


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

Будем начинать?


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

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

https://habrahabr.ru/post/331758/


Метки:  

Постквантовая реинкарнация алгоритма Диффи-Хеллмана

Вторник, 27 Июня 2017 г. 16:06 + в цитатник

Метки:  

Мониторинг задержек системы с помощью JHiccup

Вторник, 27 Июня 2017 г. 16:05 + в цитатник

О JHiccup


JHiccup это простая программа, которая позволяет измерить задержки операционной системы с точки зрения конечного приложения. Она была написана CTO компании Azul — Гилом Тени для измерения задержек ОС.



Почему задержки так важны


Мы в живем во времена сетевых приложений. Большинство программ запущенных на нашем компьютере регулярно ходят в интернет. Если мы запустим браузер и откроем google.com, то произойдет 50–60 запросов.



Для открытия google.com произошло 56 запросов


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


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


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


Зачем нужен мониторинг ОС


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


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


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


Вот несколько причин почему программа может “спать” не имея возможности выполнять полезные действия:


  • ОС может выполнять внутреннюю сборку мусора;
  • Другое ресурсоемкое приложение может использовать CPU или другие ресурсы;
  • ОС может выполняться поверх гипервизора и не зная об этом быть не единственной ос запущенной на этом железе.

Почему jHiccup?


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


  • Может ли эта метрика быть причиной задержки?
  • Является ли конкретное значение этой метрики аномальным?

jHiccup позволяет посмотреть на систему с точки зрения приложения. jHiccup это маленькое приложение с простой функцией : бесконечный поток засыпает и просит ос разбудить его через определенный период, например 1 секунду. Если ос была занят через 1 секунду и не смогла разбудить поток, то приложение это увидит сравнив время пробуждения с расчетным временем пробуждения (время засыпания + 1 сек). Мы можем построить график, где мы увидем задержки системы в течение выполнения программы.



На оси X время выполнения программы в секундах. На оси Y задержка пробуждения в миллисекундах (то сколько программа ждала, когда ОС даст ей возможность выполняться)


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


На предыдущем графике мы рассмотрели задержки относительно времени выполнения программы. Кроме этого бывает удобно взять все задержки и отсортировать по возрастанию. Это даст нам представление о распределении задержек и их вероятности.



Задержка в миллисекундах на оси y и ее вероятность на оси x


Некоторые особенности JHiccup:


  • не страдает проблемой Coordinate Omission хорошо описанной Гилом Тене в его видео

Внутри jHiccup использует гисторгамму как структуру данных. Обычная гисторамма разбивает весь интервал задержек (например от 1мс до 1 сек) на отрезки и подсчитывает сколько задержек попало в определенный интервал. Это позволяет представить данные о задержках в более компактном виде, чем просто список наблюдаемых значений (1.55мс, 2.6мс и тд). 


На самом деле в jHicuup используется специальная имплементация гистограммы — HDR-Histogram, которая обладает следующими свойствами:


  • Гистограммы имеют высокое разрешение. Мы можем видеть не только 95% и 99% худших результатов, но и намного более подробные данные ( 99.999%).
  • Хранит данные в компактном виде, что позволяет измерять производительность в течение долгого времени. Для этого размер сегмента гистограммы увеличивается экспоненциально. Благодаря этому получается более компактно хранить аномальные значения.

Библиотека HDR-Histogram получило широкое распространение. Можно найти имплементации на разных языках. Разные системы для сбора метрик стали поддерживать hdr-historgram как один из внутренних форматов, благодаря ее компактности и точности.


Зачем такая точность?


На графиках выше мы видели данные о 99.9999% случае. У многих возникает вопрос, нужна ли такая точность и надо ли рассматривать данные дальше 95% или 99% персентиля. Давайте рассмотрим два примера. В обоих примерах мы возьмем вероятность аномальной задержки P(A) как 5% и 1% соответственно. Нам надо ответь на вопрос, какова вероятность того, что пользователь увидит аномальный запрос P(B):


  • Мы видели что google.com делает около 60 запросов. Для примера рассмотрим сайт онлайн-магазина где для покупки необходимо выполнить 200 запросов. В случае P(A)=5%, P(B)=1–(0.95 в степени 200)=99.997%. В случае P(A)=1%, P(B)=1-(0.99 в степени 200)=86.6%
  • Пусть у нас есть 10 микро-сервисов. И каждый вызывается дважды во время выполнения определенного сценария, то есть происходит 20 вызовов. В случае P(A)=5%, P(B)=1–(0.95 в степени 20)=64.15%. В случае P(A)=1%, P(B)=1-(0.99 в степени 20)=18.2%.

Как мы видим, рассматривать данные только до 95-ого или 99-ого персентеля недостаточно.


Пример использования jHiccup


Скачать jhiccup можно с http://www.azul.com/downloads/jhiccup/ или https://github.com/giltene/jHiccup.


./jHiccup -d 4000 /usr/bin/java org.jhiccup.Idle -t 300000 
# первые 4 секунды старта не буду записаны, всего будет записано 300 секунд. По умолчанию поток будет просыпаться каждые 5 секунд (настраивается с помощью параметра -i).
# создан hiccup.170617.1120.3461.hlog
./jHiccupLogProcessor -i hiccup.170617.1120.3461.hlog -o hiccup.170617.1120.3461
# создан hiccup.170617.1120.3461 и hiccup.170617.1120.3461.hgrm

Файл hiccup.170617.1120.3461 можно просмотреть с помощью excel-файла jHiccupPlotter.xls.




Для просмотра hiccup.170617.1120.3461.hgrm можно воспользоваться онлайн приложением https://hdrhistogram.github.io/HdrHistogram/plotFiles.html. Оно также удобно для сравнения нескольких hdrm файлов (например, во время разной загрузки системы или с разных серверов).



Сравнивая график производительности нашей программы (например, задержки http-ответов) с полученной hdr-диаграммой, мы можем понять работала ли вся система медленно в определенный период или только наша программа.


Мы запускали jhiccup как отдельный процесс. Другой способ это запуск javaagent-а вместе с нашей программой.


java -javaagent:jHiccup.jar="-d 0 -i 1000 -l hiccuplog -c" MyProgram.jar -a -b -c

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


В этих двух способах запуска есть одно важное различие. В первом случае jHiccup запускается на отдельной JVM в другом на той же JVM. То есть во втором случае мы увидим задержки связанные с работой JVM (например паузы GC), на которой запущено основное приложение.


В файле jHiccupPlotter.xls есть возможность добавить линии SLA на график.



Я вижу два удобных применения для SLA:



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

https://habrahabr.ru/post/331436/


Метки:  

[recovery mode] На каких проектах становятся хорошими инженерами, а на каких – менеджерами?

Вторник, 27 Июня 2017 г. 15:28 + в цитатник
Руководитель команды Android-разработки в EPAM Андрей Сержантов рассказывает о двух типах проектов, о возможностях профессионального развития, а также делится своим опытом работы.

image


Почему ты занимаешься именно мобильной разработкой?

Она нравится мне потому, что можно написать приложение и сразу же увидеть, как оно работает на мобильном телефоне. Но я начинал свою карьеру как веб-девелопер, пока руководитель команды не уговорил меня перейти в мобильную разработку. В то время еще не было сматрфонов, и мы создавали приложения для обычных кнопочных телефонов, используя Java 2 Micro Edition.

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

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

Один из моих недавних проектов – создание приложения, которое по функционалу напоминает Skype for Business. Изначально общая логика была написана на JavaScript, и мы работали с такими развивающимися технологиями, как WebRTC для передачи аудио- и видеоинформации между смартфонами для организации онлайн-конференций. В нашей команде было около 10 разработчиков и 4 QA-специалиста. Работали по классическому Scrum с правильными процессами. Мы предлагали клиенту много архитектурных решений, 90% которых он одобрил. Это и перевод архитектурной логики на Clean Architecture, и внедрение архитекторного паттерна Model-View-Presenter, который позже перешел в VIPER, и переход на Rx (реактивный подход), и плавный перевод кода с Java на Kotlin. Проект следовал лучшим мировым практикам разработки и прошел соответствующую сертификацию в нашей компании.

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

Мне неоднократно доставались проекты не лучшего качества, и постепенно, силами всей команды, их удавалось вывести в зеленую зону. Решение зависит от заказчика и цели, которую он преследует, – 1) хочет быстро получить продукт сомнительного качества и через два года, образно выражаясь, выкинуть его в мусорницу либо 2) качественное приложение, создание которого потребует больше времени и финансовых затрат. Здесь важен скоординированный подход, когда работает вся команда, включая технического лидера, который должен объяснить заказчику, во что выльется то или иное решение в будущем. Большинство заказчиков доверяет технической экспертизе команды и считается с ее рекомендациями, видит перспективу и готовы дать свободу команде, чтобы она успела создать качественное решение.

image

Над чем ты работаешь сейчас?

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

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

Продукт, над которым мы будем работать, – мобильное приложение для настройки индивидуальных параметров саунд-процессора, который примагничивается к ушному импланту. Приложение соединяется с саунд-процессором через Bluetooth. С помощью этого продукта доктор настраивает слуховой саунд-процессор для пациента. Или же человек сам может отрегулировать некоторые параметры, чтобы сделать звук максимально комфортным – например, находясь в метро, отсечь шумы и хорошо слышать собеседника. И хотя само приложение не такое уж сложное, оно должно быть хорошо защищенным от «падений» и хакерских атак. Поэтому разработка будет чередоваться с многоуровневым тестированием. Им занимается собственный QA-отдел заказчика. Приложение уже написано на iOS, и мы будем разрабатывать его на Android. Меня очень вдохновляет, когда я создаю не просто измеритель пульса, а продукт, который поможет улучшить уровень жизни человека. Только представьте – родился ребенок с нарушением слуха, и от качества импланта и его настройки зависит, научится ли он говорить и какой будет его жизнь. Ответственность мотивирует – вот почему мне нравится направление Health Care.

Какой ты видишь свою дальнейшую карьеру в компании?

Поскольку любой проект начинается с Solution Architecture, мне интересно развиваться в этом направлении. Стараюсь следить за тем, что происходит в Mobile-домене – быть в курсе новых практик и архитектур. Вижу себя как специалиста, который делает скелет приложения, а с ним уже в дальнейшем работает команда. Было полезно поучаствовать в Mobile Architecture School в EPAM, чтобы посмотреть, чем занимаются Solution Architects и повысить свой уровень знаний в этой сфере, так как архитектура охватывает и Clouds, и back-ends, и другие домены. Если заниматься мобильной разработкой, все время нужно держать ухо востро и следить за новинками, чтобы не выпасть из этой сферы.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331756/


Метки:  

Книга «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание»

Вторник, 27 Июня 2017 г. 15:24 + в цитатник
image Сценарии командной оболочки помогают системным администраторам и программистам автоматизировать рутинные задачи с тех самых пор, как появились первые компьютеры. С момента выхода первого издания этой книги в 2004 году многое изменилось, однако командная оболочка bash только упрочила свои лидирующие позиции. Поэтому умение использовать все ее возможности становится насущной необходимостью для системных администраторов, инженеров и энтузиастов. В этой книге описываются типичные проблемы, с которыми можно столкнуться, например, при сборке программного обеспечения или координации действий других программ. А решения даются так, что их легко можно взять за основу и экстраполировать на другие схожие задачи.

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


Что исчезло во втором издании


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

Эта книга для вас, если...


Bash остается основным инструментом для всех, кто работает с серверами или рабочими станциями, действующими под управлением Unix-подобных операционных систем, в том числе и для веб-разработчиков (многие из которых ведут разработку в OS X и развертывают свои приложения на серверах под Linux), аналитиков, разработчиков мобильных приложений и программистов. Кроме того, все больше появляется энтузиастов, запускающих Linux на своих микрокомпьютерах с открытой архитектурой, таких как Raspberry Pi, для автоматизации бытовых приборов. Сценарии командной оболочки отлично походят для всех этих случаев.

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

Эта книга — не учебник! Наша цель — продемонстрировать практические приемы программирования сценариев на bash и познакомить с распространенными утилитами на (в большинстве) коротких и компактных примерах, но мы не описываем их строку за строкой. Мы объясняем только самые основные части, а опытные создатели сценариев смогут сами понять, как действует остальной код, прочитав его. Мы надеемся, что вы, уважаемый читатель, будете экспериментировать с этими сценариями — ломать их, исправлять и приспосабливать под свои нужды — чтобы понять, как они работают. Главная наша цель — показать, как решать типичные задачи, такие как управление сетью или синхронизация файлов, которые встают перед любым техническим специалистом.

Структура книги


Это второе издание включает дополненные оригинальные 12 глав и 3 новые главы. Каждая глава демонстрирует новые особенности или варианты использования сценариев командной оболочки, и вместе они охватывают всю широту возможностей сценариев для более простой работы в Unix. Большинство сценариев, представленных в книге, будет работать и в Linux, и в OS X. В иных случаях мы напишем об этом прямо.

Глава 0: Краткое введение в сценарии командной оболочки
Это совершенно новая глава, появившаяся во втором издании, которая послужит начинающим пользователям Unix кратким введением в синтаксис языка командной оболочки bash и особенности его использования. Эта глава быстро и без лирических отступлений расскажет все, что потребуется для успешного чтения главы 1: от простого определения сценариев командной оболочки до создания и выполнения незамысловатых примеров.

Глава 1: Отсутствующая библиотека
Языки программирования, широко используемые в окружении Unix, такие как C, Perl и Python, имеют обширные библиотеки разнообразных функций и утилит для проверки форматов чисел, вычисления интервалов времени между датами и решения многих других задач. Но, работая с командной оболочкой, мы почти со всем вынуждены справляться самостоятельно, поэтому в данной главе рассказывается об инструментах и приемах, которые сделают сценарии командной оболочки более дружественными. Все, что вы узнаете в первой главе, поможет вам читать сценарии, с которыми вы встретитесь в этой книге, и писать свои. Мы включили сюда разные функции проверки ввода, простой и мощный интерфейс к bc, инструмент быстрого добавления запятых для улучшения читаемости больших чисел, прием для разновидностей Unix, в которых команда echo не поддерживает полезный флаг -n, и сценарий для использования ANSI-последовательностей определения цвета в сценариях.

Главы 2 и 3: Усовершенствование пользовательских команд и Создание утилит
Эти две главы представляют новые команды, дополняющие и расширяющие стандартный инструментарий Unix. В конце концов, постоянное развитие и совершенствование — одна из отличительных черт Unix. Мы также причастны к этому процессу и в главах 2 и 3 предлагаем сценарии, которые реализуют: дружественный интерактивный калькулятор, инструмент удаления файлов, не стирающий их с диска, две системы напоминаний и слежения за событиями, усовершенствованную версию команды locate, команду date с поддержкой нескольких часовых поясов и новую версию команды ls, добавляющую в списки содержимого каталогов дополнительные данные.

Глава 4: Тонкая настройка Unix
Может прозвучать как ересь, но некоторые аспекты Unix выглядят недоработанными даже спустя десятилетия развития. Если вам доведется пользоваться разными версиями Unix, например переходить со свободно распространяемых дистрибутивов Linux на коммерческие версии Unix, такие как OS X, Solaris или Red Hat, вы столкнетесь с отсутствующими флагами и командами, с противоречивым поведением некоторых команд и другими подобными проблемами. Поэтому в данной главе будут представлены переделанные версии и интерфейсы к командам Unix, которые делают их чуть более дружественными или более согласованными с другими разновидностями Unix. Среди всего прочего здесь описывается способ добавления длинных флагов в стиле GNU в команды, не являющиеся командами GNU. Здесь же вы найдете пару интеллектуальных сценариев, упрощающих работу с разными утилитами сжатия файлов.

Главы 5 и 6: Системное администрирование: управление пользователями и обслуживание системы
Если вас заинтересовала наша книга, вполне вероятно, что у вас есть привилегии администратора и вы несете ответственность за администрирование одной или нескольких систем Unix, даже если речь идет всего лишь о персональном компьютере с Ubuntu или BSD. Эти две главы содержат несколько сценариев, которые помогут вам в администрировании, в том числе: утилиты для анализа использования дискового пространства, система дисковых квот, которая автоматически извещает пользователей по электронной почте о превышении выделенного им места на диске, улучшенная реализация команды killall, сценарий проверки crontab, инструмент ротации файлов журналов и пара утилит для создания резервных копий.

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

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

Главы 9 и 10: Администрирование веб-сервера и Администрирование интернет-сервера
Эти две главы описывают решение проблем, с которыми часто сталкиваются администраторы серверов, имеющих выход в Интернет. Здесь вы найдете два сценария, анализирующие разные аспекты журналирования трафика веб-сервера, инструменты для выявления недействительных внутренних или внешних ссылок, имеющихся на веб-сайте, а также удобный инструмент управления паролями на веб-сервере Apache, упрощающий поддержку файлов .htaccess. Помимо этого исследуются приемы зеркалирования каталогов и целых веб-сайтов.

Глава 11: Сценарии для OS X
OS X, с ее коммерчески успешным и привлекательным графическим интерфейсом, стала огромным шагом вперед в превращении Unix в дружественную операционную систему. Что еще более важно, OS X — это полноценная операционная система Unix, скрытая за симпатичным интерфейсом, а значит, для нее можно написать много полезных и поучительных сценариев. Именно об этом рассказывается в данной главе. В дополнение к инструменту для автоматизации захвата изображения на экране, в этой главе представлены сценарии, помогающие исследовать структуру библиотеки музыкальных произведений iTunes, изменять заголовки окон программы Terminal и усовершенствовать команду open.

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

Глава 13: Работа в облаке
С момента выхода первого издания этой книги Интернет занимал все больше и больше места в нашей повседневной жизни. Особенно важна для нас тема синхронизации устройств и файлов с облачными службами, такими как iCloud, Dropbox и Google Drive. В главе демонстрируются сценарии командной оболочки, позволяющие в полной мере использовать эти службы и гарантировать своевременную синхронизацию и копирование файлов и каталогов. Кроме того, здесь вы найдете пару сценариев, использующих особенности OS X для работы с фотографиями и озвучивания текста.

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

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

Приложение A: Установка Bash в Windows 10
Пока мы работали над вторым изданием, компания Microsoft существенно изменила свое отношение к открытому программному обеспечению и в 2016 году даже выпустила полноценную систему bash для Windows 10. Несмотря на то что примеры из книги не тестировались в этой версии bash, многие идеи и решения будет нетрудно перенести в нее. В приложении мы опишем установку bash в Windows 10, чтобы вы могли попробовать свои силы в создании сценариев на компьютере с Windows!

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

Об авторах


Дейв Тейлор (Dave Taylor) работает в компьютерной индустрии с 1980 года. Участвовал в создании BSD 4.4 UNIX, его программы включены во все основные дистрибутивы UNIX. Выдающийся оратор и автор тысяч статей для журналов и газет. Написал более 20 книг, включая «Learning Unix for OS X» (O’Reilly Media), «Solaris 9 for Dummies» (Wiley Publishing) и «Sams Teach Yourself Unix in 24 Hours» (Sams Publishing). Популярный колумнист журнала «Linux Journal» и основатель веб-сайта askdavetaylor.com, где осуществляет техническую поддержку пользователей и выкладывает обзоры новых гаджетов.

Брендон Перри (Brandon Perry) начал писать приложения на C# с выходом открытой реализации .NET — Mono. В свободное время любит писать модули для фреймворка Metasploit, исследовать двоичные файлы и тестировать всякие штуки.

О научном рецензенте


Джорди Гутьеррес Эрмосо (Jordi Guti'errez Hermoso) — программист, математик и вольный хакер. Начиная с 2002 года пользуется исключительно Debian GNU/Linux не только дома, но и на работе. Джорди участвует в разработке GNU Octave, бесплатной вычислительной среды, во многом совместимой с Matlab, а также Mercurial, распределенной системы управления версиями. Увлекается чистой и прикладной математикой, катанием на коньках, плаванием и вязанием. В последнее время много думает о проблемах выброса парниковых газов и участвует в акциях по сохранению носорогов.

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 25% по купону — Shell Scripts
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331734/


Метки:  

[Перевод] Табы, пробелы и ваша зарплата — какая связь?

Вторник, 27 Июня 2017 г. 14:43 + в цитатник

Метки:  

Как соответствовать ФЗ-152 «О персональных данных» c «Битрикс24» и «1С-Битрикс»

Вторник, 27 Июня 2017 г. 14:33 + в цитатник
С 1 июля 2017 года будет сильно ужесточена административная ответственность за нарушения при работе с персональными данными физических лиц. Это касается и владельцев сайтов, которые собирают такую информацию о посетителях. Как быть тем пользователям Битрикс24, кто собирал персональные данные автоматизированно, с помощью CRM-форм или Открытых линий? Мы решили помочь своим клиентам соблюсти закон и избежать штрафов. Автоматизируем и это!





Мы подготовили универсальное «Согласие на обработку персональных данных» для и разместили его в CRM-формах и Открытых линиях.

В CRM-формах


Что нужно сделать:

  1. Заполнить реквизиты своей компании в настройках CRM. Также это можно будет сделать при настройке согласия в CRM-форме.
  2. Указать e-mail, на который клиенты смогут отправлять запросы на удаление персональной информации. Согласно закону, на такие запросы необходимо отреагировать. Сейчас указан только пример e-mail адреса, можно оставить его или сменить в настройках формы.
  3. Проверить в настройках активных форм, что согласие подключено и корректно отображается для клиента.

Что вы получите:

  1. Два варианта подтверждения:

    • под формой стоит галочка — соответствует согласию «Нажимая кнопку «Отправить», я даю свое согласие...»



    • под формой нет галочки — ее нужно будет поставить перед отправкой заполненной формы.
  2. Поля CRM-формы будут автоматически включены в текст согласия как относящиеся к персональным данным, даже если это просто комментарий.
  3. В настройках формы по умолчанию есть галочка на согласие передачи персональных данных третьим лицам. Там можно указать эти лица (например, ООО «Почта России» или курьерская служба) — их тоже включат в текст согласия.
  4. Можно выбрать или добавить собственные варианты использования и сроков хранения персональных данных.
  5. В текст согласия также включается указанный e-mail для удаления данных. Если на портале меньше 20 пользователей, то автоматически будет проставлен e-mail администратора портала.

В итоге согласие будет выглядеть так:



В Открытых линиях

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



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



Если человек продолжит писать в открытую линию, то это будет считаться согласием. А если промолчит или прямо ответит, что не согласен, то его данные нужно удалить.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331748/


Метки:  

Скорочтение: работает или нет? Часть 3: простые советы

Вторник, 27 Июня 2017 г. 14:23 + в цитатник

Метки:  

[Из песочницы] Тестирование или парсинг сайтов с динамическим дом и многое другое. Nightmare.js — ему все равно

Вторник, 27 Июня 2017 г. 14:21 + в цитатник
Эта статья не будет содержать много лирики, марали или вводных зачем и кому это может быть надо.

В двух словах:


1. Пакет можно использовать для тестирования сайтов.
2. Пакет можно использовать для парсинга данных.
3. Пакет можно использовать для автоматизации ввода данных на сайты.

Альтернативы:


Casper.js, phantom.js, watir и много кто еще, в гугле полно всех и вся. Почему я за nightmare.js:

  1. Простота использования.
  2. Полная поддержка html5, никаких конфликтов с сайтами.
  3. Расширяемый через экшены.

Структура библиотеки


Nightmare класс использует фреймворк electron, для каждой страницы создавая объект (BrowserWindow) который запускает браузер оболочку Chromium.

Принцип работы


  1. Nightmare инициализирует новое приложение electron с стартовой страницей, которую необходимо подвергнуть дальнейшей обработке.
  2. Перед загрузкой исследуемой страницы загружаются скрипты, которые позволяют поддерживать двустороннее взаимодействие программиста и страницы через серию эмиттеров.
  3. Nightmare предоставляет программисту набор апи (цепочки действий), позволяющие произвести любые манипуляции с сайтом и получить требуемые данные.

Плюсы


  1. Код на стороне клиента и сайта написан на одном языке, никаких шаблонизаторов не требуется.
  2. Возможность расширять модулями через создание экшенов. Экшен может создаваться на уровне класса nightmare или на уровне класса nightmare и уровне electron (что в свою очередь дает возможность использовать devapi Chromium). В npm уже достаточно готовых модулей расширений, которые можно подключать к себе в проект (например realMouse полностью эмулирующую наведение мыши или работа с ифреймами, что блокируется безопасностью браузера).
  3. Все команды являются цепочками, каждая из которых возвращает промис, это позволяет писать код как в стиле промисов, так и внутри асинк функций или генераторов.
  4. Относительно небольшая нагрузка на процессор и память, нужно помнить, что сравнивать такой инструмент с простыми гет и пост запросами не этично, по скорости и памяти браузерные парсеры проигрывают без вариантов).
  5. Работа nightmare возможна в двух режимах, режим отображения браузера и режим фонового процесса.
  6. Поддерживает прокси. Установка юзерагента, выставление расширения браузера.
  7. Можно включать или отключать отображение изображений, поддержку webGL и еще кучу всего.
  8. Можно создавать прелоад скрипты, что позволяет добавлять на страницу до загрузки свои функции, библиотеки. Как частный пример можно переписать функцию addEventListener сделав ее декоратором для реальной + инжектировать аналитические функции для проверки того. Что в действительности делает сайт, когда вы на нем находитесь или бороться с навязчивостью фингер принт, который столь сильно полюбили все кому не лень, забывая о вашей «анонимности».

От эмоций к делу


Классический пример использования модуля из документации:

var Nightmare = require('nightmare');		
var nightmare = Nightmare({ show: true });

nightmare
  .goto('https://duckduckgo.com')
  .type('#search_form_input_homepage', 'github nightmare')
  .click('#search_button_homepage')
  .wait('#zero_click_wrapper .c-info__title a')
  .evaluate(function () {
    return document.querySelector('#zero_click_wrapper .c-info__title a').href;
  })
  .end()
  .then(function (result) {
    console.log(result);
  })
  .catch(function (error) {
    console.error('Search failed:', error);
  });

В двух словах о происходящем


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

const Nightmare = require('nightmare');		

(async ()=>{
let nightmare; 
try {
	nightmare = Nightmare({ show: true });
	await nightmare
  		.goto('https://duckduckgo.com')
 		 .type('#search_form_input_homepage', 'github nightmare')
		  .click('#search_button_homepage')
		  .wait('#zero_click_wrapper .c-info__title a');

	let siteData = await nightmare.evaluate(function () {
    		return document.querySelector('#zero_click_wrapper .c-info__title a').href;
  		});
	// последующая работа с данными
} catch (error) {
	console.error(error);
	throw error;
} finally {
	await nightmare.end();
}
})();

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

Можно последовательно переходить по страницам через await nightmare.goto(….), при том Nightmare будет дожидаться загрузки дом.

О задокументированных возможностях


Описывать все функции в примерах считаю бессмысленным, так как все это хорошо указано в документации. Скажу лишь то, что модуль умеет считывать любые данные, делать скриншоты, сохранять html страницы, pdf страницы, передавать на сайт данные. Через доп модули доступна загрузка файлов на сервер через form input type=”file”. Умеет реагировать на alert, prompt, confirm, может транслировать в виде событий данные из консоли.

Какие особенности стоит учитывать при работе с nightmare


Нужно понимать, что каждое действие будет либо совершено либо произойдет выброс исключительной ситуации, а потому в местах, где нет уверенности, что код пройдет 100% нужно обертывать запросы в try catch и обрабатывать из соответственно. Как пример wait(selector) данная инструкция даст команду приостановить выполнение скрипта до появления html элемента с соответствующим цсс селектором, но в модуле есть дефолтный таймаут, его можно изменять опционально, при наступлении которого будет выброшено исключение, соответственно можно будет обработать почему на странице нет чего-либо и как-то на это среагировать.

Резюме


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

Ссылки


-> Nigthmare.js
-> Electron

Спасибо за внимание!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331752/


Метки:  

[Перевод] Как HBO делала приложение Not Hotdog для сериала «Кремниевая долина»

Вторник, 27 Июня 2017 г. 13:53 + в цитатник

Использование Python и Excel для обработки и анализа данных. Часть 1: импорт данных и настройка среды

Вторник, 27 Июня 2017 г. 13:51 + в цитатник
Если Вы только начинаете свой путь знакомства с возможностями Python, ваши познания еще имеют начальный уровень — этот материал для Вас. В статье мы опишем, как можно извлекать информацию из данных, представленных в Excel файлах, работать с ними используя базовый функционал библиотек. В первой части статьи мы расскажем про установку необходимых библиотек и настройку среды. Во второй части — предоставим обзор библиотек, которые могут быть использованы для загрузки и записи таблиц в файлы с помощью Python и расскажем как работать с такими библиотеками как pandas, openpyxl, xlrd, xlutils, pyexcel.

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

Отправная точка — наличие данных

Когда вы начинаете проект по анализу данных, вы часто сталкиваетесь со статистикой собранной, возможно, при помощи счетчиков, возможно, при помощи выгрузок данных из систем типа Kaggle, Quandl и т. д. Но большая часть данных все-таки находится в Google или репозиториях, которыми поделились другие пользователи. Эти данные могут быть в формате Excel или в файле с .csv расширением.

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

Проверка качества таблицы

Чтобы проверить качество таблицы, обычно используют простой чек-лист. Отвечают ли данные в таблице следующим условиям:
  • данные являются статистикой;
  • различные типы данных: время, вычисления, результат;
  • данные полные и консистентные: структура данных в таблице — систематическая, а присутствующие формулы — работающие.

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

Бест-практикс табличных данных

Читать данные таблицы при помощи Python — это хорошо. Но данные хочется еще и редактировать. Причем редактирование данных в таблице, должно соответствовать следующим условиям:
  • первая строка таблицы зарезервирована для заголовка, а первый столбец используется для идентификации единицы выборки;
  • избегайте имен, значений или полей с пробелами. В противном случае, каждое слово будет интерпретироваться как отдельная переменная, что приведет к ошибкам, связанным с количеством элементов в строке в наборе данных. Лучше использовать подчеркивания, регистр (первая буква каждого раздела текста — заглавная) или соединительные слова;
  • отдавайте предпочтение коротким названиям;
  • старайтесь избегать использования названий, которые содержат символы ?, $,%, ^, &, *, (,),-,#, ?,,,<,>, /, |, \, [ ,] ,{, и };
  • удаляйте любые комментарии, которые вы сделали в файле, чтобы избежать дополнительных столбцов или полей со значением NA;
  • убедитесь, что любые недостающие значения в наборе данных отображаются как NA.


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

Если вы работаете с Microsoft Excel, вы наверняка знаете, что есть большое количество вариантов сохранения файла помимо используемых по умолчанию расширения: .xls или .xlsx (переходим на вкладку “файл”, “сохранить как” и выбираем другое расширение (наиболее часто используемые расширения для сохранения данных с целью анализа — .CSV и.ТХТ)). В зависимости от варианта сохранения поля данных будут разделены знаками табуляции или запятыми, которые составляют поле “разделитель”. Итак, данные проверены и сохранены. Начинаем готовить рабочее пространство.

Подготовка рабочего пространства

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

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

# Import `os`
import os

# Retrieve current working directory (`cwd`)
cwd = os.getcwd()
cwd

# Change directory
os.chdir("/path/to/your/folder")

# List all files and directories in current directory
os.listdir('.')


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

Установка пакетов для чтения и записи Excel файлов

Несмотря на то, что вы еще не знаете, какие библиотеки будут нужны для импорта данных, нужно убедиться, что у все готово для установки этих библиотек. Если у вас установлен Python 2> = 2.7.9 или Python 3> = 3.4, нет повода для беспокойства — обычно, в этих версиях уже все подготовлено. Поэтому просто убедитесь, что вы обновились до последней версии :)

Для этого запустите в своем компьютере следующую команду:
# For Linux/OS X
pip install -U pip setuptools

# For Windows
python -m pip install -U pip setuptools


В случае, если вы еще не установили pip, запустите скрипт python get-pip.py, который вы можете найти здесь (там же есть инструкции по установке и help).

Установка Anaconda

Установка дистрибутива Anaconda Python — альтернативный вариант, если вы используете Python для анализа данных. Это простой и быстрый способ начать работу с анализом данных — ведь отдельно устанавливать пакеты, необходимые для data science не придется.
Это особенно удобно для новичков, однако даже опытные разработчики часто идут этим путем, ведь Anakonda — удобный способ быстро протестировать некоторые вещи без необходимости устанавливать каждый пакет отдельно.

Anaconda включает в себя 100 наиболее популярных библиотек Python, R и Scala для анализа данных в нескольких средах разработки с открытым исходным кодом, таких как Jupyter и Spyder. Если вы хотите начать работу с Jupyter Notebook, то вам сюда .

Чтобы установить Anaconda — вам сюда .

Загрузка файлов Excel как Pandas DataFrame

Ну что ж, мы сделали все, чтобы настроить среду! Теперь самое время начать импорт файлов.

Один из способов, которым вы будете часто пользоваться для импорта файлов с целью анализа данных — импорт с помощью библиотеки Pandas (Pandas — программная библиотека на языке Python для обработки и анализа данных). Работа Pandas с данными происходит поверх библиотеки NumPy, являющейся инструментом более низкого уровня. Pandas — мощная и гибкая библиотека и она очень часто используется для структуризации данных в целях облегчения анализа.
Если у вас уже есть Pandas в Anaconda, вы можете просто загрузить файлы в Pandas DataFrames с помощью pd.Excelfile ():
# Import pandas
import pandas as pd

# Assign spreadsheet filename to `file`
file = 'example.xlsx'

# Load spreadsheet
xl = pd.ExcelFile(file)

# Print the sheet names
print(xl.sheet_names)

# Load a sheet into a DataFrame by name: df1
df1 = xl.parse('Sheet1')


Если вы не установили Anaconda, просто запустите pip install pandas, чтобы установить пакет Pandas в вашей среде, а затем выполните команды, приведенные выше.

Для чтения .csv-файлов есть аналогичная функция загрузки данных в DataFrame: read_csv (). Вот пример того, как вы можете использовать эту функцию:
# Import pandas
import pandas as pd

# Load csv
df = pd.read_csv(«example.csv»)


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

Как записывать Pandas DataFrame в Excel файл

Предположим, после анализа данных вы хотите записать данные в новый файл. Существует способ записать данные Pandas DataFrames (с помощью функции to_excel ). Но, прежде чем использовать эту функцию, убедитесь, что у вас установлен XlsxWriter, если вы хотите записать свои данные на несколько листов в файле .xlsx:

# Install `XlsxWriter`
pip install XlsxWriter

# Specify a writer
writer = pd.ExcelWriter('example.xlsx', engine='xlsxwriter')

# Write your DataFrame to a file
yourData.to_excel(writer, 'Sheet1')

# Save the result
writer.save()

Обратите внимание, что в фрагменте кода используется объект ExcelWriter для вывода DataFrame. Иными словами, вы передаете переменную writer в функцию to_excel (), и указываете имя листа. Таким образом, вы добавляете лист с данными в существующую книгу. Также можно использовать ExcelWriter для сохранения нескольких разных DataFrames в одной книге.
То есть если вы просто хотите сохранить один файл DataFrame в файл, вы можете обойтись без установки библиотеки XlsxWriter. Просто не указываете аргумент, который передается функции pd.ExcelWriter (), остальные шаги остаются неизменными.

Подобно функциям, которые используются для чтения в .csv-файлах, есть также функция to_csv () для записи результатов обратно в файл с разделителями-запятыми. Он работает так же, как когда мы использовали ее для чтения в файле:
# Write the DataFrame to csv
df.to_csv(«example.csv»)


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

Использование виртуальной среды

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

Чтобы начать работу с virtualenv, сначала нужно его установить. Потом перейти в директорию, где будет находится проект. Создать virtualenv в этой папке и загрузить, если нужно, в определенную версию Python. После этого активируете виртуальную среду. Теперь можно начинать загрузку других библиотек и начинать работать с ними.
Не забудьте отключить среду, когда вы закончите!

# Install virtualenv
$ pip install virtualenv

# Go to the folder of your project
$ cd my_folder

# Create a virtual environment `venv`
$ virtualenv venv

# Indicate the Python interpreter to use for `venv`
$ virtualenv -p /usr/bin/python2.7 venv

# Activate `venv`
$ source venv/bin/activate

# Deactivate `venv`
$ deactivate

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

Во второй части статьи мы расскажем об основных библиотеках для анализа данных.
Продолжение следует…
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331746/


Метки:  

Как организовать Performance Review в IT-компании: опыт Badoo

Вторник, 27 Июня 2017 г. 13:49 + в цитатник


Привет, Хабр! Меня зовут Алексей Рыбак, я – глава разработки в Badoo. В феврале в нашем московском офисе Badoo проходил Techleads-митап, где я рассказывал про наш процесс Performance Review. Эта статья написана по мотивам моего выступления.


Performance review – тема крайне спорная. В России до сих пор распространено мнение, что никакие KPI, “измерения”, performance review – в программистских компаниях не только не работают, но и вовсе вредны. Эта категоричность меня всегда удивляла, но окончательное решение осветить эту тему подробно созрело у меня после прочтения статьи аж на самом РБК.


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


Бесспорную ценность этих отрицательных примеров для объективности стоить дополнить примерами других компаний: Google, Facebook и многих других, – в которых Performance Review как раз успешно работает. Это лишь иллюстрирует, что можно внедрить процесс ревью как успешно, так и неуспешно. Поэтому основной целью этой статьи является рассказать об одном из подходов, который приводит к работающему ревью. В Badoo этот подход работает уже почти семь лет, и, пользуясь случаем, я хочу выразить большую благодарность Жене Соколову (ex-Google, ex-Badoo), который нас этим подходом “заразил”.


В этом посте я:


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

Ревью и ценности компании


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


Ценности Badoo


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


Badoo занимается разработкой dating-приложений и социальных сетей для знакомства с новыми людьми. Наши основные продукты находятся в нише “dating”, но мы также развиваем проекты в области social discovery – поиск поблизости людей по интересам. В некотором смысле Badoo представляет платформу, на базе которой делается много разных приложений. Внутри проекты могут быть очень сложные, но снаружи всё выглядит достаточно просто. Очень большое количество команд в мире одновременно делают примерно такие же проекты. Таким образом, на рынке, на котором мы работаем, нужно быть очень быстрым: очень быстро пилить фичи, тестировать их, если они не пошли – закрывать, если пошли – что-то подкручивать и снова повторять цикл экспериментов. Это определяет всю культуру нашей компании. И всю боль инженеров: им достаточно сложно найти баланс между этой скоростью и комфортной неспешной разработкой, когда везде, что называется, соломка постелена.


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


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


На данном этапе наша система ценностей состоит из трёх составляющих.


Ценность 1: Delivery

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


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


Ценность 2: Quality

Drawing На втором месте quality – качество. Один из наших подходов заключается в том, что quality и QA в целом – это часть организации, которая владеет процессами наравне с инженерами и программистами, и даже в большей степени, чем они. Таким образом, мы получаем сбалансированное распределение ролей, потому что программисты (особенно те, кто работают быстро) на какие-то вещи, которые их ограничивают, попросту забивают, и без баланса в виде QA – полностью независимого от разработки – мы рискуем получить продукт низкого качества. А это совсем не то, к чему мы стремимся.


Ценность 3: Retention

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


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


Кому и для чего нужно ревью?


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


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


Так вот ревью – это процесс, позволяющий системно бороться с подобным “протуханием”. Ревью не является панацеей, но я смотрю на него как на один из способов обеспечить регулярную проверку производительности по всей компании. И сделать это ценой небольшого “налога” (бонусной системы).


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


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


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


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


Итак, ревью:


  • регулярно показывает, что где “глохнет”;
  • рассказывает об успехах (или неудачах);
  • актуализирует долгосрочные и краткосрочные ожидания, учит “хорошему”;
  • принуждает регулярно говорить “спасибо” и замечать недостатки;
  • всё удовольствие за небольшой “налог”.

Ревью плохое и хорошее


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


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


Наконец, плохое ревью не содержит явных ценностей, и нет никакого смысла в нём участвовать. Этих ценностей может быть много, но все-таки основная (что бы вы думали?) – деньги.


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


Таким образом, хорошее ревью


  • просто;
  • применимо к любой ситуации;
  • быстро/актуально и регулярно;
  • понятно;
  • приятно ($).

Из чего состоит ревью


Я смотрю на ревью как на процесс вокруг какого-то фреймворка. Из чего он состоит? 3 части:


  • peers – коллеги;
  • сам процесс review;
  • ladders – карьерные уровни; а также brackets – привязанные к ним зарплатные “вилки”.

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


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


Есть совсем простые формулы, есть улётные варианты с хитрыми KPI. Я придерживаюсь принципа простоты, поэтому считаю что лучше всего выстроить шкалу либо вокруг степеней “хорошо”, либо вокруг степеней “соответствия ожиданиям”. Например, сотрудник полностью соответствует ожиданиям, или с какими-то предложениями по улучшению, или не соответствует им, или наоборот превышает ожидания, или превышает ожидания настолько, что заслуживает продвижения (promotion) и так далее. Promotion – это долгосрочная часть фреймворка, которая позволяет двигать человека по карьерной лестнице.


Карьерная лестница в больших компаниях зачастую достаточно длинная, с кучей цифр: вице-президент №1, вице-президент №2 и так далее. Мы в Badoo практикуем более простую систему и, как многие софтверные компании, даём возможность инженерам двигаться как по карьерной лестнице менеджера, так и по карьерной лестнице инженера. И одна из самых важных составляющих документа, который это регламентирует, – работа с ожиданиями сотрудника. Если он хочет расти как эксперт, вот ему описание уровней по этой лестнице. Таким образом, у человека есть понимание, на какой ступени карьерной лестницы он находится. Это довольно скучная история, но в компаниях с большим количеством сотрудников без этого не обойтись.


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


Сам процесс ревью


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


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


У нас есть OKRs (objectives and keys results) для сотрудников, которые работают над долгосрочными задачами. Иногда мы занимаемся сравнением того, что мы планировали и что сделали, но в целом эти показатели отвязаны от ревью. Повторюсь, это очень важно, потому что может приводить к серьезному раздражению. Поскольку Badoo – очень динамичная компания, мы не можем использовать такой подход. Поэтому ревью делается по факту: сделано это и то.


Пиры (peers)


Чтобы получить оценку, сначала нужно собрать отзыв от коллег. Самая важная часть фреймворка – пиры (peers). Сотрудники выбирают пиров, коллег, с которыми работали на проектах, тестировщиков, с которыми тестировали задачи, членов продуктовой команды, с которыми взаимодействовали, – кого угодно, кроме их менеджера. После этого менеджер смотрит на пиров и говорит что-то вроде: «Слушай, а почему я не вижу ни одного QA-инженера здесь? У тебя была важная задача, был хороший (или не очень хороший) фидбэк. Хотелось бы получить отзыв QA-инженера для полноты картины». Происходит некий процесс согласования, менеджер может добавить или убрать сотрудника.


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


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


Калибрация


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


Личная беседа


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


Так в целом работает наш фреймворк.


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


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


Проблемы ревью


Проблема 1: бонусы


Drawing Первая проблема, с которой мы столкнулись, – разное отношение к бонусам. Здесь есть два подхода. Один подход (он особенно популярен на Западе) опирается на почти гарантированный годовой бонус: в процентах к годовому он у тебя составляет столько-то, и если всё нормально, он выплачивается в полном объёме. Если есть какие-то вопросы или были установлены какие-то KPI, то, как говорится, возможны варианты… В общем, при таком подходе бонус, как правило, выплачивается либо полностью, либо почти полностью – то есть изменение бонуса однозначно является “наказанием”. Но чем сильнее пытаться играть им, тем хуже, потому что сотрудник ожидает, что эта часть дохода ему гарантирована.


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


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


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


Проблема 2: поиск алгоритма оценки


Drawing Следующая проблема – попытка найти простой “алгоритм оценки”. Большинство программистов по природе своей аналитики и пытаются выстроить чёткую схему получения максимальной оценки. Более того, менеджеры перенимают этот подход и начинают придумывать свои истории о том, как и почему они дали ту или иную оценку, тем самым снимая с себя ответственность (это не я! – это машина тебе посчитала).


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


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


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


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


Проблема 3: инфляция оценок и уровней


Drawing Следующий момент – инфляция. Различают инфляцию оценок и инфляцию уровней.


С инфляцией оценок всё достаточно просто – она происходит, как правило, в нормальном диапазоне. Что такое превышение ожиданий и чем оно отличается от оценки «Полностью соответствует ожиданиям»? Моя позиция такова, что, если было какое-то количество проектов и они все реализованы в срок или с небольшой задержкой (до 25% – но единого правила нет), то это – превышение ожидания. Не мне вам рассказывать, что обычно сроки срываются. :) Некоторые менеджеры придерживаются другого подхода. Но в любом случае, как только речь заходит о сроках, это значит, что в процедуру ревью должен попасть какой-то документ, содержащий информацию о том, какие сроки были установлены и когда в итоге всё было выполнено. Это само по себе очень здорово – приучает к ответственности за дедлайны.


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


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


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


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


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


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


Как понять, нужно ли вам ревью


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


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


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


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


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


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


Заключение


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


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


Мучают сложные формулы и KPI? Может, стоит отказаться от них в пользу простых оценок? R&D задачи сложны в планировании? Возможно, стоит научиться планировать исследовательские проекты – независимо от сложности общей задачи каждый проект все равно разделяется на более мелкие подпроекты, планирование которых по отдельности прекрасно укладывается в традиционный подход, даже если это проверка гипотез.


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


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


Если вы хотите подробнее узнать, как устроены системы ревью в других компаниях, рекомендую прочитать книжку Ласло Бока “Работа рулит!”, где в нескольких главах подробно рассматривается система оценки производительности в компании Google (наш процесс во многом повторяет процесс в Google).


А с какими проблемами сталкивались вы? Давайте обсудим это в комментариях.

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

https://habrahabr.ru/post/331570/


Метки:  

Как внедрить процессы управления конфигурацией

Вторник, 27 Июня 2017 г. 12:34 + в цитатник
Правильная реализация процессов управления конфигурацией позволяет не только решать проблемы путем идентификации причины «поломки» (какой элемент вышел из строя, и как его «починить»), но и полностью предотвращать их возникновение за счет оценки логики работы с данными. Грамотная оценка производимых изменений позволяет поддерживать системы в работоспособном состоянии, а неправильная — приводит к пустой трате денежных средств.

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

Изображение Kenny Louie CC

С чего начать


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

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


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

Составление плана


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

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

Определение исходного состояния


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

Как только исходное состояние определено, следует убедиться, что ему соответствуют соглашения об уровне услуг (SLAs), операционные соглашения (OLAs), внешние договоры (UCs), связанные с IT-инфраструктурой и сервисами организации.

Определение исходного состояния стоит начинать с какого-либо одного сервиса, расписав все его компоненты. При этом полученная информация должна заноситься в базу данных ITSM-платформы, например ServiceNow, или простую базу данных CMDB — это может быть таблица в Excel или Access.



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



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

Контроль


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

  • Тесно сотрудничать с работниками, осуществляющими контроль изменений, дабы работа управления конфигурациями следовала корпоративным политикам об изменениях. Без контроля изменений CMS/CMDB быстро устареет.
  • Конфигурационные единицы, участвующие в процессе оказания услуги, должны быть с ней связаны. Это даст пользователю возможность быстро выбрать требуемый сервис. В этом случае все CI добавятся автоматически.
  • ИТ-специалисты, отвечающие за систему управления конфигурацией, должны участвовать в консультативных советах по изменениям (CAB), чтобы отображать в CMS и CMDB производимые с инфраструктурой изменения. При этом все вносимые изменения должны проверяться, перед закрытием тикета как успешного.

Учет состояния


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

Аудит


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

  • Имеются ли специальные инструменты для проведения проверок?
  • Требуется ли физическая проверка?
  • Каковы нормативные требования?
  • Есть ли сертификация по стандарту ISO 20000 и должны ли выполняться IL3, BASEL 3 или NGN224, требующие вмешательства третьей стороны?

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

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

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

P.S. Другие материалы из нашего блога «ИТ Гильдия»:


P.P.S. И пара материалов из нашего блога на Хабре:

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

https://habrahabr.ru/post/331374/


Метки:  

Визуализация целей повышает их достижение на 46%. Как мы решаем это в WebCanape?

Вторник, 27 Июня 2017 г. 11:00 + в цитатник


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

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

Эти проблемы мы четко осознали, когда нас стало более 30 человек (сейчас уже 90+). В этот момент я начал всерьез работать над задачей синхронизации действий всей команды вокруг конкретных задач. И лучше, чем визуализировать цели в зонах постоянного внимания сотрудников, я ничего не придумал. Делюсь с вами наиболее удачными решениями из своего опыта.

Страшно не много тратить, страшно – мало зарабатывать


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


Пример показателей достижения плана в Canape CRM

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

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

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

Чтобы все могли воспользоваться этой идеей, мы попросили наше подразделение Canape CRM разработать инструмент визуализации целей и сделать его более доступным. Пробуйте, спрашивайте.

Чтобы что-то улучшать, это нужно считать


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

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

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

О достижениях отдельных людей должны знать все


Продажи делаются по одной. Продажа соседа — это продажа всей команды, о ней должны знать все. Этот лайфхак мы взяли у Максима Батырева в книге «45 татуировок менеджера». Работа в сверхконкурентном рынке продаж и внедрения «Консультант плюс» заставила его применять все возможные инструменты стимулирования. Одним из таких был «колокол продаж». Когда сотрудник закрывал сделку, он подходил к колоколу и звонил в него.


Оповещение о продаже. Фото — maznij.ru

Мы немного доработали (оцифровали) эту идею, превратив звон колокола в денежный дождь. Помните, как у google, первые продажи контекстной рекламы звучали нотами денежного дождя. Так и в Canape CRM, при закрытии сделки можно настроить приятные душе звуки :)

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

Будем рады услышать о вашем опыте визуализации целей. Выкладывайте скриншоты, фотографии. Уверен, будет интересно. Желаем всем достижения самых сложных и заветных целей!

* фото на обложке с сайта gallery.world/wallpaper/313281.html
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331476/


Бешеные псы: Angular 2 vs React: доклад Евгения Гусева и Ильи Таратухина

Вторник, 27 Июня 2017 г. 10:52 + в цитатник
Angular2 отрелижен, React и подавно. Копья поломаны, мечи перекованы на орала, страсти уже поутихли и, вроде как, статус кво восстановлен. Кто-то использует один инструмент, кто-то другой, разве что, иногда раздаются возгласы: «А у них...!»


Однако не всё так просто. В конце концов, мы не только пишем код, но и решаем однотипные проблемы:
  • Как сделать наше приложение быстрым?
  • Как писать понятнее и проще?
  • Как писать быстрее?


Кто-то может сказать: «Эту тему уже миллион раз обсасывали, зачем опять?». Но, все же, если вы запускаете новый проект или решили переписать старый, перед вами всё равно встанет проблема выбора. И даже если вы считаете, что всё очевидно — это далеко не так.



Вот уже год как Wrike использует Angular 2 в бою. И вроде всё хорошо, но иногда закрадываются сомнения: “А вдруг мы свернули не туда?”

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

Мистер Красный (Евгений Гусев) и мистер Синий (Илья Таратухин) спорят, доказывают, демонстрируют примеры, пытаясь понять, что же лучше.

Будет боль, будет спор, будет вывод (видеозапись доклада с фестиваля РИТ++, Москва 5.06.2017).



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

https://habrahabr.ru/post/330872/


Статический анализ как часть процесса разработки Unreal Engine

Вторник, 27 Июня 2017 г. 10:49 + в цитатник
PVS-Studio & Unreal Engine

Проект Unreal Engine развивается — добавляется новый код и изменятся уже написанный. Неизбежное следствие развития проекта — появление в коде новых ошибок, которые желательно выявлять как можно раньше. Одним из способов сокращения количества ошибок является использование статического анализатора кода PVS-Studio. Причем анализатор также быстро развивается и учится находить новые паттерны ошибок, некоторые из которых будут рассмотрены в этой статье. Если вас заботит качество кода ваших проектов, то эта статья для вас.

Публикацию подготовил Андрей Карпов, примеры кода предоставили Илья Иванов и Сергей Васильев из команды PVS-Studio. Первоисточником является Unreal Engine Blog: "Static Analysis as Part of the Development Process in Unreal Engine".

Статический анализ кода, теория


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

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

Как правило, обзор кода хорошо работает, так как программисты намного легче замечают ошибки в чужом коде. Более подробно с методикой обзора кода можно познакомиться в замечательной книге Стива Макконнелла «Совершенный код» (Steve McConnell, «Code Complete»).

У методологии обзора кода можно выделить два недостатка:
  1. Крайне высокая цена. Необходимо регулярно отвлекать нескольких программистов от их основной работы для обзора нового кода или повторного обзора кода после внесения рекомендаций. При этом программисты должны регулярно делать перерывы для отдыха. Если пытаться просматривать сразу большие фрагменты кода, то внимание быстро притупляется, и польза от обзора кода быстро сходит на нет.
  2. Людям трудно обнаружить ошибки, которые напрямую не связаны с новым/изменённым кодом. Рассматривая свеженаписанный фрагмент, сложно предположить, что функция malloc работает в нём неправильно из-за того, что не подключен заголовочный файл stdlib.h. Подробнее эта ситуация описана в статье "Красивая 64-битная ошибка на языке Си". Ещё пример: изменение типа функции или переменной в заголовочном файле. По идее, после таких изменений надо просматривать весь код, в котором используется эта функция или переменная. На практике это слишком трудоёмко и, как правило, обзор ограничивается только теми местами, где программист что-то изменял.

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

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

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

Дело в том, что чем раньше ошибка выявлена, тем меньше стоимость ее исправления. Так, согласно данным, приведенным в книге Макконнелла «Совершенный Код», исправление ошибки на этапе тестирования обойдется в десять раз дороже, чем на этапе кодирования (написания кода):

Таблица 1. Средняя стоимость исправления дефектов в зависимости от времени их обнаружения (данные для таблицы взяты из книги С. Макконнелла "Совершенный Код").

Таблица 1. Средняя стоимость исправления дефектов в зависимости от времени их обнаружения (данные для таблицы взяты из книги С. Макконнелла «Совершенный Код»).

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

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

Чем больше проект, тем больше ошибок на 1000 строк кода он содержит. Взгляните на эту интересную таблицу:

Таблица 2. Размер проекта и типичная плотность ошибок. Источники данных: "Program Quality and Programmer Productivity" (Jones, 1977), "Estimating Software Costs" (Jones, 1998).

Таблица 2. Размер проекта и типичная плотность ошибок. Источники данных: «Program Quality and Programmer Productivity» (Jones, 1977), «Estimating Software Costs» (Jones, 1998).

Чтобы было легче воспринимать данные, построим графики.

Типичная плотность ошибок в проекте


График 1. Типичная плотность ошибок в проекте. Синий — максимальное количество. Красный — среднее количество. Зелёный — наименьшее количество.

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

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

Если читатель ещё не был знаком с методологией статического анализа кода, я надеюсь, мне удалось его заинтересовать. Для более подробного знакомства с ней я предлагаю несколько ссылок:
  1. Джон Кармак. Статический анализ кода.
  2. Википедия. Статический анализ кода.
  3. Википедия. List of tools for static code analysis.
  4. Al Bessey, Ken Block, Ben Chelf, Andy Chou, Bryan Fulton, Seth Hallem, Charles Henri-Gros, Asya Kamsky, Scott McPeak, Dawson Engler. A Few Billion Lines of Code Later: Using Static Analysis to Find Bugs in the Real World.
  5. Екатерина Миловидова. Подборка видео о статическом анализе кода.
  6. Блог команды PVS-Studio.

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

Unreal Engine


Нашей команде вновь выпала честь поработать с кодом Unreal Engine!

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

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

За два года кодовая база Unreal Engine менялась достаточно сильно. Какие-то фрагменты пропадали, какие-то добавлялись. Иногда даже целые папки. Поэтому не все части кода получали достаточно внимания, а значит, там тоже есть работа для PVS-Studio.

Хочется похвалить компанию Epic Games за то, что она уделяет большое внимание качеству кода и использует такие инструменты как PVS-Studio. Читатель, конечно, может усмехнуться: «Конечно, ваша команда должна похвалить компанию Epic Games, ведь она является вашим клиентом». Не скрою, у нас есть мотив оставить положительный отзыв о разработчиках из Epic Games. Однако, похвалил я компанию совершенно искренне. То, что используются инструменты статического анализа кода, говорит о зрелости цикла разработки проектов и заботе компании о надёжности и безопасности кода.

Почему я уверен, что использование PVS-Studio способно заметно повысить качество кода? Потому что это один из самых мощных статических анализаторов, который легко обнаруживает ошибки даже в таких проектах, как:
Использование PVS-Studio поднимает качество кода на одну дополнительную ступеньку. Компания Epic Games заботится о всех, кто использует движок Unreal Engine в своих проектах. Каждая исправленная ошибка уменьшит чью-то головную боль.

Интересные ошибки


Рассказывать о всех найденных и исправленных нами ошибках в Unreal Engine я не буду, а выделю только несколько, которые, на мой взгляд, заслуживают внимания. Желающие могут ознакомиться с другими ошибками, заглянув в pull request на GitHub. Для доступа к исходному коду и указанному pull request у вас должен быть доступ к репозиторию Unreal Engine на GitHub. Для этого необходимо иметь учётные записи GitHub и EpicGames, которые должны быть связаны на сайте unrealengine.com. После этого нужно принять приглашение на вступление в сообщество Epic Games на GitHub. Инструкция.

Развитие анализатора PVS-Studio связано не только с появлением новых диагностик, но и с совершенствованием уже имеющихся. Например, улучшаются алгоритмы вычисления возможных значений переменных. Благодаря этому анализатор около года назад начал выявлять ошибки вот такого вида:
uint8* Data = (uint8*)PointerVal;

if (Data != nullptr || DataLen == 0)
{
  NUTDebug::LogHexDump(Data, DataLen);
}
else if (Data == nullptr)
{
  Ar.Logf(TEXT("Invalid Data parameter."));
}
else // if (DataLen == 0)
{
  Ar.Logf(TEXT("Invalid DataLen parameter."));
}

Предупреждение анализатора PVS-Studio: V547 Expression 'Data == nullptr' is always true. unittestmanager.cpp 1924

Если условие (Data != nullptr || DataLen == 0) не выполнилось, то это означает, что указатель Data точно равен nullptr. Следовательно, дальнейшая проверка (Data == nullptr) не имеет смысла.

Правильный вариант кода:
if (Data != nullptr && DataLen > 0)

Диагностика V547 существует в анализаторе с 2010 года. Однако, несовершенство механизма вычисления значений переменных не позволяло найти эту ошибку. Анализатор видел наличие в первом условии проверки значения переменной DataLen, и не мог разобраться, чему равны значения переменных в различных условиях. Для человека анализ приведённого кода не составляет никаких проблем, а вот с точки зрения написания алгоритмов для поиска таких ошибок, не всё так просто.

Я продемонстрировал усовершенствование внутренних механизмов PVS-Studio, которые позволили выявить новую ошибку. Образно говоря, эти улучшения были сделаны «вглубь», т.е. анализатор начал работать более точно.

Делаем мы и улучшения «вширь», поддерживая новые конструкции, которые появляются в новых версиях языка C++. Недостаточно учиться парсить код C++11, C++14 и так далее. Столь же важно совершенствовать старые диагностики и реализовывать новые, для выявления ошибок в новых конструкциях языка. В качестве примера приведу диагностику V714, которая ищет неправильные range-based циклы. В Unreal Engine диагностика V714 указывает на следующий цикл:
for (TSharedPtr SlateWidget : SlateWidgets)
{
  SlateWidget = nullptr; 
}

Предупреждение PVS-Studio: V714 Variable is not passed into foreach loop by a reference, but its value is changed inside of the loop. vreditorradialfloatingui.cpp 170

Программист хотел присвоить значение nullptr всем элементам в контейнере SlateWidgets. Ошибка в том, что SlateWidget — это обыкновенная локальная переменная, создаваемая вновь на каждой итерации цикла. Запись в эту переменную значения не приводит к изменению элемента в контейнере. Чтобы код работал правильно, нужно создавать ссылку:
for (TSharedPtr &SlateWidget : SlateWidgets)
{
  SlateWidget = nullptr; 
}

Мы, конечно, постепенно добавляем в анализатор и диагностики, которые мало связаны с языком. Например, диагностика V767 ещё не существовала в 2015 году, когда наша команда писала предыдущую статью про проверку проекта Unreal Engine. Диагностика появилась в PVS-Studio версии 6.07 (8 августа 2016). Благодаря её появлению была выявлена вот такая ошибка:
for(int i = 0; i < SelectedObjects.Num(); ++i)
{
  UObject* Obj = SelectedObjects[0].Get();
  EdObj = Cast(Obj);
  if(EdObj)
  {
    break;
  }
}

Предупреждение PVS-Studio: V767 Suspicious access to element of 'SelectedObjects' array by a constant index inside a loop. skeletonnotifydetails.cpp 38

В цикле должен осуществляться поиск элемента, который имеет тип UEditorSkeletonNotifyObj. Из-за случайной опечатки при выборе элемента вместо переменной i написан числовой литерал 0.

Корректный вариант кода:
UObject* Obj = SelectedObjects[i].Get();

Давайте рассмотрим ещё одну из не так давно созданных диагностик V763, которая, как и V767, появилась в PVS-Studio версии 6.07. Ошибка интересная, но, чтобы её показать, мне придётся привести в статье достаточно длинное тело функции RunTest:
bool FCreateBPTemplateProjectAutomationTests::RunTest(
  const FString& Parameters)
{
  TSharedPtr NewProjectWizard;
  NewProjectWizard = SNew(SNewProjectWizard);

  TMap> >& Templates =
    NewProjectWizard->FindTemplateProjects();
  int32 OutMatchedProjectsDesk = 0;
  int32 OutCreatedProjectsDesk = 0;
  GameProjectAutomationUtils::CreateProjectSet(Templates, 
    EHardwareClass::Desktop, 
    EGraphicsPreset::Maximum, 
    EContentSourceCategory::BlueprintFeature,
    false,
    OutMatchedProjectsDesk,
    OutCreatedProjectsDesk);

  int32 OutMatchedProjectsMob = 0;
  int32 OutCreatedProjectsMob = 0;
  GameProjectAutomationUtils::CreateProjectSet(Templates, 
    EHardwareClass::Mobile,
    EGraphicsPreset::Maximum,
    EContentSourceCategory::BlueprintFeature,
    false,
    OutMatchedProjectsMob,
    OutCreatedProjectsMob);

  return ( OutMatchedProjectsDesk == OutCreatedProjectsDesk ) &&
         ( OutMatchedProjectsMob  == OutCreatedProjectsMob  );
}

Из приведённого кода нам важно следующее:
  • С помощью первого вызова функции CreateProjectSet пытаются инициализировать переменные OutMatchedProjectsDesk и OutCreatedProjectsDesk.
  • С помощью второго вызова функции CreateProjectSet пытаются инициализировать переменные OutMatchedProjectsMob и OutCreatedProjectsMob.

Далее следует проверка, что значения этих переменных удовлетворяют условию:
return ( OutMatchedProjectsDesk == OutCreatedProjectsDesk ) &&
       ( OutMatchedProjectsMob  == OutCreatedProjectsMob  );

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

Ошибка подстерегает нас как раз в функции CreateProjectSet:
static void CreateProjectSet(.... int32 OutCreatedProjects,
                                  int32 OutMatchedProjects)
{
  ....
  OutCreatedProjects = 0;
  OutMatchedProjects = 0;
  ....
  OutMatchedProjects++;
  ....
  OutCreatedProjects++;
  ....
}

Инструмент PVS-Studio выдаст здесь два предупреждения:
  • V763 Parameter 'OutCreatedProjects' is always rewritten in function body before being used. gameprojectautomationtests.cpp 88
  • V763 Parameter 'OutMatchedProjects' is always rewritten in function body before being used. gameprojectautomationtests.cpp 89

Анализатор совершенно прав, когда предупреждает, что значения аргументов OutCreatedProjects и OutMatchedProjects никак не используются, а сразу перезаписываются значением 0.

Ошибка проста: забыли сделать переменные ссылками. Правильный вариант кода:
static void CreateProjectSet(.... int32 &OutCreatedProjects,
                                  int32 &OutMatchedProjects)

Выше я привёл ошибки, которые требуют хоть какой-то внимательности для своего обнаружения. Но намного больше совсем простых ошибок. Например, пропущены операторы break:
{
  case EWidgetBlendMode::Opaque:
    ActualBackgroundColor.A = 1.0f;
  case EWidgetBlendMode::Masked:
    ActualBackgroundColor.A = 0.0f;
}

Или неправильное сравнение нескольких переменных на равенство:
checkf(GPixelFormats[PixelFormat].BlockSizeX 
    == GPixelFormats[PixelFormat].BlockSizeY 
    == GPixelFormats[PixelFormat].BlockSizeZ 
    == 1, 
  TEXT("Tried to use compressed format?"));

Если кто-то является новичком в C++ и не понял, что в этом сравнении неправильного, предлагаю заглянуть в описание диагностики V709.

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

Эти ошибки просты, когда они вот так вот выделены в статье для читателя. В коде реальных приложений заметить их крайне сложно. Даже при обзорах кода взгляд может скользить по блоку
{
  case EWidgetBlendMode::Opaque:
    ActualBackgroundColor.A = 1.0f;
  case EWidgetBlendMode::Masked:
    ActualBackgroundColor.A = 0.0f;
}

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

Давайте теперь немного обсудим вопрос: можно ли как-то сократить количество таких ошибок?

Рекомендация


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

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

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

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

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

Это проблема переоценки человеком своего уровня. Про нее хорошо написано в статье "Программисты 'выше среднего'" (en). Процитирую отрывок:

Как вы оцениваете свой уровень как программиста (ниже среднего, средний, выше среднего)?

Согласно психологическим опросам среди разных групп, около 90% программистов отвечают «Выше среднего».

Очевидно, это не может быть правдой. В группе из 100 человек 50 всегда будут выше и 50 — ниже среднего. Этот эффект известен как иллюзия превосходства. Он описан во многих областях, но даже если вы об этом слышали, вы всё равно, вероятно, ответите «выше среднего».

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

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

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

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

И ещё: не ищите серебряную пулю. Используйте сочетание различных элементов, таких как:
  • Выбросить из головы «наша команда выше среднего»;
  • Стандарт кодирования, которого придерживаются все разработчики в команде;
  • Обзоры кода (хотя бы самых важных участков и участков, написанных новыми сотрудниками);
  • Статический анализ кода;
  • Динамический анализ кода;
  • Регрессионное тестирование, дымовое тестирование;
  • Использование юнит тестов, TDD;
  • и так далее.

Я не призываю начать использовать сразу всё перечисленное. В разных проектах что-то будет более полезным, что-то менее. Главное — не надеяться на что-то одно, а использовать разумное сочетание методик. Только это даст повышение качества и надёжности кода.

Заключение


Разработчики Unreal Engine заботятся о качестве своего кода, а команда PVS-Studio, по мере своих сил, помогает им в этом.

Команда PVS-Studio готова поработать с кодом и ваших проектов. Помимо продажи анализатора PVS-Studio и его сопровождения, мы проводим аудит кода, миграцию кода и т.д.

Желаю всем как можно меньше багов в программах.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331724/


Анонс SmartData 2017 Piter: Можно ли говорить о больших и умных данных без булшиттинга?

Вторник, 27 Июня 2017 г. 10:36 + в цитатник


О Big Data в последнее время говорят все: от школьников до Германа Грефа. И вот тут возникает некоторый диалектический дуализм: о проблемах работы с большими данными говорят много, вот только все разговоры — это переливание из пустого в порожнее или какой-нибудь махровый маркетинговый вздор. Больше всего пугает, что люди начинают верить в то, что где-то лежит несколько петабайт «больших данных», и их можно взять и «отбольшеданнить». За советом я обратился к Виталию Худобахшову из «Одноклассников», и я придерживаюсь схожей точки зрения, судите сами:

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

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

Возникает другая проблема — эти вычисления с данными в таком объеме нужно уметь произвести и произвести эффективно. А это значит, что с большими данными можно ассоциировать и технологии их сбора и обработки, такие как Spark, Hadoop, Kafka и прочие.

Программа конференции



На этом простом примере я хочу показать тот уровень, на котором будет строиться программа новой конференции JUG.ru Group по большим и умным данным SmartData 2017 Piter. Конференция пройдет 21 октября в Петербурге. Не будем говорить, зачем нужны большие данные, что из них можно получить и почему это все хорошо и полезно. Сконцентрируемся на трех аспектах:

  • Data Science, с точки зрения научного подхода;
  • Решение практических задач при помощи Big Data и использованием умных данных;
  • Тулинг и решения, позволяющие решать задачи правильно и быстро.


Data Science



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


Сергей Николенко – Data Scientist из ПОМИ РАН, работающий с машинным обучением и сетевыми алгоритмами. Ранее занимался криптографией, теоретической computer science и алгеброй. Сергей готовит доклад, посвященный научному подходу в разработке глубоких свёрточных сетей для сегментации изображений.


Практика


Александр Сербул — куратор направления контроля качества интеграции и внедрений «1С-Битрикс», а также направления AI, deep learning и big data. Архитектор и разработчик в проектах компании, связанных с высокой нагрузкой и отказоустойчивостью, эффективным использованием технологий кластеризации продуктов «1С-Битрикс» в современных облачных сервисах (Amazon Web Services и др.)

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

Татьяна Ландо — какая же бигдата, да без Google? Сейчас мы работаем над тем, чтобы к нам приехала Татьяна Ландо, эксперт в области лингвистики и анализа данных и организатор AINL: Artificial Intelligence & Natural Language, предварительное подтверждение уже получено. В этом месте возможны изменения, однако кто-то из Google к нам точно приедет.

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

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


Tools&Solutions



Не обойдем стороной и тулинг. В конце концов, то, как быстро и удобно будет решена задача, очень сильно зависит от инструментария. Свои доклады уже подтвердили разработчики Яндекс.Толоки, сервиса для обучения машинного интеллекта, Алексей Миловидов из ClickHouse и Александр Сибиряков из ScrapingHub. Естественно, это не все доклады, программа еще только начала набираться, всего будет три трека и не меньше 17 докладов, так что следите за изменениями на сайте. Из интересного — пытаемся вытащить кого-нибудь из PornHub, вот уж где highload и горы данных: по интересам, по географии, предпочтениям и куче всего такого.

Подавайте доклад




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

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

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

  • Данные и их обработка (Spark, Kafka, Storm, Flink)
  • Storages (Базы данных, NoSQL, IMDG, Hadoop, облачные хранилища)
  • Data Science (Machine learning, нейросети, анализ данных)


Дискуссионные зоны




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

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

Регистрация


Программа конференции будет постепенно пополняться, и следить за её самым актуальным состоянием можно на сайте SmartData 2017 Piter. А уже сейчас на этом сайте открыта продажа билетов — ближайшие две недели действует early bird цена. Поэтому за развитием программы лучше следить с билетом в кармане:)

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

https://habrahabr.ru/post/331686/


Метки:  

[Перевод] Постмортем Age of Empires

Вторник, 27 Июня 2017 г. 10:28 + в цитатник

Метки:  

Как эффективнее читать данные с диска (при условии, что у вас .Net)

Вторник, 27 Июня 2017 г. 10:12 + в цитатник


Привет, Хабр!

Некоторое время назад меня заинтересовал вопрос: как эффективнее всего читать данные с диска (при условии, что у вас .Net)? Задача чтения кучи файлов встречается во множестве программ, которые при самом старте начинают вычитывать конфигурации, некоторые самостоятельно подгружают модули и т.д.

В интернете я не нашел подобных сравнений (если не считать тюнинга под определенные конфигурации).

Результаты можно посмотреть на GithubSSDHDD.

Способы чтения и алгоритм тестирования


Есть несколько основных способов:


Тестировал я все на SSD и HDD (в первом случае был компьютер с Xeon 24 cores и 16 Гб памяти и Intel SSD, во втором — Mac Mini MGEM2LL/A с Core i5, 4 Гб RAM и HDD 5400-rpm). Системы такие, чтобы по результатам можно было бы понять, как лучше вести себя на относительно современных системах и на не очень новых.

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

  1. Запуск exe-файла, который посчитает чистое время.

  2. Раз в секунду проверяется нагрузка на процессор, потребление оперативной памяти, нагрузка на диск и еще ряд производных параметров (с помощью Performance Counters).

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

Подготовка к тесту более хитрая. Итак, перед запуском:

  1. Определяемся с размером файлов и с их числом (я выбрал такие, чтобы суммарный объем был больше, чем объем RAM, чтобы подавить влияние дискового кеша);

  2. Ищем на компьютере файлы заданного размера (а заодно игнорируем недоступные файлы и еще ряд спецпапок, про которые написано ниже);

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

И не забываем про обработку ошибок:

  1. Программа выдаст код возврата 0 только в случае, если все файлы были прочитаны.

  2. Иногда весь тест падает, если вдруг система начинает активно читать файл. Вздыхаем и перезапускаем еще раз, добавляя файл (или папку) в игнорируемые. Так как я использовал каталоги Windows & Program Files как хороший источник файлов, наиболее реалистично размазанный по диску, некоторые файлы могли быть ненадолго заблокированы.

  3. Иногда один Performance Counter мог выдать ошибку, так как процесс, например, уже начал завершаться. В этом случае игнорируются все счетчики за эту секунду.

  4. На больших файлах некоторые тесты стабильно выдавали Out Of Memory исключения. Их я убрал из результатов.

И плюс стандартные моменты про нагрузочное тестирование:

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

  2. Антивирус отключен, обновление системы остановлено, активные программы остановлены тоже. Больше никаких тюнингов не было, по той же причине.

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

  4. Некоторые Performance Counters выдавали нулевой результат всегда для HDD/SSD. Так как набор счетчиков вшит в программу, я их оставил.

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

  6. Thread Priority и пр. тюнинги не использовались, так как не было попыток выжать именно максимум (который будет сильно зависеть от намного большего числа факторов).
  7. Технологии: .Net 4.6, x64

Результаты


Как я уже написал в шапке, результаты есть на GithubSSDHDD.

SSD диск


Минимальный размер файла (байты): 2, максимальный размер (байты): 25720320, средний размер (байты): 40953.1175
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.2260000
ScenarioAsyncWithMaxParallelCount8
00:00:00.5080000
ScenarioAsyncWithMaxParallelCount16
00:00:00.1120000
ScenarioAsyncWithMaxParallelCount24
00:00:00.1540000
ScenarioAsyncWithMaxParallelCount32
00:00:00.2510000
ScenarioAsyncWithMaxParallelCount64
00:00:00.5240000
ScenarioAsyncWithMaxParallelCount128
00:00:00.5970000
ScenarioAsyncWithMaxParallelCount256
00:00:00.7610000
ScenarioSyncAsParallel
00:00:00.9340000
ScenarioReadAllAsParallel
00:00:00.3360000
ScenarioAsync
00:00:00.8150000
ScenarioAsync2
00:00:00.0710000
ScenarioNewThread
00:00:00.6320000

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

По сути обе программы различались наличием или отсутствием ActionBlock для ScenarioAsyncWithMaxParallelCount32 (с ограничением), в итоге получилось, что чтение лучше не ограничивать, тогда будет использоваться больше памяти (в моем случае в 1,5 раза), а ограничение будет просто на уровне стандартных настроек (т.к. Thread Pool зависит от числа ядер и т.д.)

Минимальный размер файла (байты): 1001, максимальный размер (байты): 25720320, средний размер (байты): 42907.8608
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.4070000
ScenarioAsyncWithMaxParallelCount8
00:00:00.2210000
ScenarioAsyncWithMaxParallelCount16
00:00:00.1240000
ScenarioAsyncWithMaxParallelCount24
00:00:00.2430000
ScenarioAsyncWithMaxParallelCount32
00:00:00.3180000
ScenarioAsyncWithMaxParallelCount64
00:00:00.5100000
ScenarioAsyncWithMaxParallelCount128
00:00:00.7270000
ScenarioAsyncWithMaxParallelCount256
00:00:00.8190000
ScenarioSyncAsParallel
00:00:00.7590000
ScenarioReadAllAsParallel
00:00:00.3120000
ScenarioAsync
00:00:00.5080000
ScenarioAsync2
00:00:00.0670000
ScenarioNewThread
00:00:00.6090000

Увеличив минимальный размер файла, я получил:

  1. В лидерах остался запуск программы с числом потоков, близким к числу ядер процессоров.
  2. В ряде тестов один из потоков постоянно ждал освобождение блокировки (см. Performance Counter «Concurrent Queue Length»).
  3. Синхронный способ чтение с диска все еще в аутсайдерах.


Минимальный размер файла (байты): 10007, максимальный размер (байты): 62 444 171, средний размер (байты): 205102.2773
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.6830000
ScenarioAsyncWithMaxParallelCount8
00:00:00.5440000
ScenarioAsyncWithMaxParallelCount16
00:00:00.6620000
ScenarioAsyncWithMaxParallelCount24
00:00:00.8690000
ScenarioAsyncWithMaxParallelCount32
00:00:00.5630000
ScenarioAsyncWithMaxParallelCount64
00:00:00.2050000
ScenarioAsyncWithMaxParallelCount128
00:00:00.1600000
ScenarioAsyncWithMaxParallelCount256
00:00:00.4890000
ScenarioSyncAsParallel
00:00:00.7090000
ScenarioReadAllAsParallel
00:00:00.9320000
ScenarioAsync
00:00:00.7160000
ScenarioAsync2
00:00:00.6530000
ScenarioNewThread
00:00:00.4290000

И последний тест для SSD: файлы от 10 Кб, их число меньше, однако сами они больше. И как результат:

  1. Если не ограничивать число потоков, то время чтения становится ближе к синхронным операциям
  2. Ограничивать уже желательнее как (число ядер) * [2.5 — 5.5]

HDD диск


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

Минимальный размер файла (байты): 1001, максимальный размер (байты): 54989002, средний размер (байты): 210818,0652
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.3410000
ScenarioAsyncWithMaxParallelCount8
00:00:00.3050000
ScenarioAsyncWithMaxParallelCount16
00:00:00.2470000
ScenarioAsyncWithMaxParallelCount24
00:00:00.1290000
ScenarioAsyncWithMaxParallelCount32
00:00:00.1810000
ScenarioAsyncWithMaxParallelCount64
00:00:00.1940000
ScenarioAsyncWithMaxParallelCount128
00:00:00.4010000
ScenarioAsyncWithMaxParallelCount256
00:00:00.5170000
ScenarioSyncAsParallel
00:00:00.3120000
ScenarioReadAllAsParallel
00:00:00.5190000
ScenarioAsync
00:00:00.4370000
ScenarioAsync2
00:00:00.5990000
ScenarioNewThread
00:00:00.5300000


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

Минимальный размер файла (байты): 1001, максимальный размер (байты): 54989002, средний размер (байты): 208913,2665
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.6880000
ScenarioAsyncWithMaxParallelCount8
00:00:00.2160000
ScenarioAsyncWithMaxParallelCount16
00:00:00.5870000
ScenarioAsyncWithMaxParallelCount32
00:00:00.5700000
ScenarioAsyncWithMaxParallelCount64
00:00:00.5070000
ScenarioAsyncWithMaxParallelCount128
00:00:00.4060000
ScenarioAsyncWithMaxParallelCount256
00:00:00.4800000
ScenarioSyncAsParallel
00:00:00.4680000
ScenarioReadAllAsParallel
00:00:00.4680000
ScenarioAsync
00:00:00.3780000
ScenarioAsync2
00:00:00.5390000
ScenarioNewThread
00:00:00.6730000


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

Минимальный размер файла (байты): 10008, максимальный размер (байты): 138634176, средний размер (байты): 429888,6019
Сценарий
Время
ScenarioAsyncWithMaxParallelCount4
00:00:00.5230000
ScenarioAsyncWithMaxParallelCount8
00:00:00.4110000
ScenarioAsyncWithMaxParallelCount16
00:00:00.4790000
ScenarioAsyncWithMaxParallelCount24
00:00:00.3870000
ScenarioAsyncWithMaxParallelCount32
00:00:00.4530000
ScenarioAsyncWithMaxParallelCount64
00:00:00.5060000
ScenarioAsyncWithMaxParallelCount128
00:00:00.5810000
ScenarioAsyncWithMaxParallelCount256
00:00:00.5540000
ScenarioReadAllAsParallel
00:00:00.5850000
ScenarioAsync
00:00:00.5530000
ScenarioAsync2
00:00:00.4440000


Опять в лидерах асинхронное чтение с ограничением на число параллельных операций. Причем, рекомендуемое число потоков стало еще меньше. А параллельное синхронное чтение стабильно стало показывать Out Of Memory.

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

Итог


Какой же результат можно почерпнуть из этих тестов?

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

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

  • Во всех случаях не было радикально большого прироста в производительности, максимум — в 2-3 раза. А потому возможно, что переписывать старое legacy приложение на асинхронное чтение не стоит.

  • Однако для новых программ async доступ к файлам как минимум уменьшит вероятность падений и увеличит скорость.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331668/


Тюнинг сетевого стэка Linux для ленивых

Вторник, 27 Июня 2017 г. 09:59 + в цитатник


Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1025 1024 [1023] 1022 1021 ..
.. 1 Календарь