<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>XP Injection &#187; Статьи</title>
	<atom:link href="http://xpinjection.com/category/articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://xpinjection.com</link>
	<description>Inject Agile practices for project health</description>
	<lastBuildDate>Wed, 19 Jun 2013 08:35:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Отчет о конференции GeekOUT 2013</title>
		<link>http://xpinjection.com/2013/06/19/geekout-2013-report/</link>
		<comments>http://xpinjection.com/2013/06/19/geekout-2013-report/#comments</comments>
		<pubDate>Wed, 19 Jun 2013 08:35:10 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3386</guid>
		<description><![CDATA[Я уже упоминал в предыдущих статьях, что посетил конференцию GeekOUT 2013, которая проходила 12-14 июня в Таллине. Таллин оказался очень приятным городом: старый город особенно хорош и красив, достаточно много парков, недалеко море, не такое насыщенное автомобильное движение как в Киеве. К Таллину мы еще вернемся в конце статьи, а пока о конференции. Начнем с <a href="http://xpinjection.com/2013/06/19/geekout-2013-report/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="large" src="http://geekout.ee/wp-content/uploads/2013/05/geekout-slider.jpg" alt="GeekOUT 2013" /></p>
<p>Я уже упоминал в предыдущих статьях, что посетил конференцию <a href="http://geekout.ee/">GeekOUT 2013</a>, которая проходила <strong>12-14 июня</strong> в Таллине. Таллин оказался очень приятным городом: старый город особенно хорош и красив, достаточно много парков, недалеко море, не такое насыщенное автомобильное движение как в Киеве. К Таллину мы еще вернемся в конце статьи, а пока о конференции.</p>
<p>Начнем с того, что мне очень понравилась площадка для проведения самой конференции. Большой просторный главный зал, который в основное время служит театральной сценой, очень удобен для проведения докладов. Плюс много разного размера залов для мастер-классов, обсуждений и дискуссий. Я был приятно удивлен, потому что площадка построена еще в советское время и являлась Домом Культуры. Но теперь видно попала в хорошие руки.</p>
<p>Отдельного внимания заслуживает холл. Он был отлично оборудован плазмами в центре зала, благодаря чему с балконов второго этажа можно было легко наблюдать за демонстрациями продуктов. Это еще одна интересная идея организаторов &#8211; в перерывах на кофе давать возможность разным компаниям показывать свои продукты, которые имеют отношение к разработке на Java. Очень удобно &#8211; пьешь кофе и смотришь демо. Сами же стенды компаний располагались в холле и каждый мог подойти пообщаться и посмотреть демо от сотрудников компании, задать интересующие вопросы и набрать сувениров. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Еще приятно удивила работа интернета. Он был стабилен и работал без нареканий. Такую же картину можно наблюдать по всему Таллину. В каждом заведении есть интернет и многие точки не запаролены, поэтому на улице часто можно без проблем найти точку и подключиться. В общем, в Таллине с интернетом все отлично!</p>
<p>Обед и кофе-паузы тоже были неплохие, кейтеринг работал четко и слаженно. Мне понравилась идея с графинами холодной воды с кусочками лимона, лайма и апельсина. Достаточно просто и удобно.</p>
<p>Ну а афетпати в первый день конференции было вообще отлично организовано. Пиво, вино, еда и самое главное много места для общения. Недалеко от места проведения конференции было арендовано заведение в большом ангаре. Поэтому влезли все и это здорово! Мы отлично провели время и потом двинули в центр за продолжением.</p>
<p>Теперь кратенько о докладах. Многие из них были недостаточно техническими или с узкой практической направленностью, но тем не менее было интересно.</p>
<p>Открывал конференцию <a href="http://geekout.ee/speakers/geert-bevin/">Geert Bevin</a>, который в своем докладе продемонстрировал достижение современных технологий &#8211; музыкальный инструмент, который судя по демонстрациям может все. Причем снимает данные о движении рук, самого музыканта и окружающей обстановке, а потом из всей этой информации делает музыку. Это реально круто!</p>
<p>За ним выступил <a href="http://geekout.ee/speakers/attila-szegedi/">Attila Szegedi</a> с философским докладом о сложности систем и вычислений. Главный вывод &#8211; не создавайте сложности там, где это не нужно и пишите простые системы для решения задач бизнеса.</p>
<p>Доклад <a href="http://geekout.ee/speakers/kohsuke-kawaguchi/">Kohsuke Kawaguchi</a> я пропустил, потому что не вижу смысла в Jenkins когда есть TeamCity. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Следующий доклад был от <a href="http://geekout.ee/speakers/juergen-hoeller/">Juergen Hoeller</a> о будущем Spring 4 и Java 8. Я ожидал чего-то нового и интересного, но в очередной раз прошлись по больным местам Java, узнали что Spring 4 выпустит поддержку Java 8 раньше самой Java 8, а еще что Java 8 уже работает неплохо в заявленной комплектации. Самым интересным фактом стало то, что разработчики Spring спрыгивают с Eclipse и переходят на IDEA, потому что в ней уже есть ранняя поддержка Java 8.</p>
<p>Последний доклад в первый день был от <a href="http://geekout.ee/speakers/tobias-lindaaker/">Tobias Lindaaker</a> об инструментах в JDK, которые могут помочь делать разные хаки с вашим кодом. К примеру, при падении теста поставить туда break point или добавить поведение к методу. И даже затронули класс Instrumentation с его методом getObjectSize для любителей позамерять. Такие вещи полезно знать, но они редко применимы, если только вы не разрабатываете инструмент для разработчиков или библиотеку.</p>
<p>Во второй день работало уже два потока, поэтому приходилось выбирать. Первым докладом я выбрал <a href="http://geekout.ee/speakers/attila-szegedi/">Attila Szegedi</a> с его отчетом о состоянии дел в работе других языков на JVM. Сам Atilla трудится над <a href="http://openjdk.java.net/projects/nashorn/">Nashorn</a> чтобы дать разработчикам удобный инструмент для запуска JavaScript. В докладе было много живого кодирования и демонстраций. Получился очень полезный обзор для расширения кругозора.</p>
<p>Дальше я остался на главной сцене на совсем не технический доклад от <a href="http://geekout.ee/speakers/sven-peters-atlassian/">Sven Peters</a> из Atlassian. Доклад назывался <a href="http://geekout.ee/schedule/how-to-do-kick-ass-software-development-2/">&laquo;How To Do Kick-Ass Software Development&raquo;</a> и не имел никакого отношения к Java. Это был рассказ о том, как в компании Atlassian строят процессы разработки, какие практики применяют и как использую Agile подходы и принципы. Agile не умер, вы просто не умеете с ним жить! <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Доклад был мега-ярким и позитивным.</p>
<p>После обеда заглянул на доклад <a href="http://geekout.ee/speakers/vladimir-ivanov/">Вовы Иванова</a> о JIT. В очередной раз понял, что JIT много чего умеет и с каждым годом берет на себя все больше работы по ускорению кода на JVM. А это немаловажно для скептиков относительно скорости работы Java.</p>
<p>Дальше был доклад <a href="http://geekout.ee/speakers/andres-almiray/">Andres Almiray</a> об AST трансформациях и как классно они работают в Groovy. Действительно, можно одной аннотацией генерировать кучу кода или реализовывать шаблоны дизайна: @Singleton, @Immutable, @Lazy и другие. Это сильно упрощает код приложения, уменьшает число потенциальных ошибок и открывает возможности к повторному использованию целых решений. Да и сам докладчик был очень бодрый и активный, что добавило докладу живости.</p>
<p>Последнее выступление было от <a href="http://geekout.ee/speakers/talip-ozturk/">Talip Ozturk</a> на тему его детища <a href="http://www.hazelcast.com/">Hazelcast</a>. Если вы еще не знаете, что это такое, то обязательно посмотрите. Очень простое распределенное хранилище данных с натуральным доступом через Java API многим приложениям очень бы пригодилось. Я не имел возможности послушать этот доклад на <a href="http://jeeconf.com">JEEConf 2013</a>, поэтому тут наверстал упущенное. </p>
<p>Отдельное спасибо хочу сказать ребятам из ZeroTurnaround (особенно <a href="https://twitter.com/antonarhipov">Антону Архипову</a> и <a href="https://twitter.com/shelajev">Олегу Шелаеву</a>) за отличную конференцию, пригласительный для меня, много интересного общения и полезные советы по проведению времени в Таллине. Мы посетили практически все интересные места в старом городе, я забрался на самую высокую башню, погуляли по большому и очень красивому парку с фонтанами, увидели какое оно северное море, я организовал себе несколько пробежек, посетили морской музей и отлично провели время. Буду рад приехать в следующем году!</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3386"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F19%2Fgeekout-2013-report%2F' data-shr_title='%D0%9E%D1%82%D1%87%D0%B5%D1%82+%D0%BE+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%B8+GeekOUT+2013'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F19%2Fgeekout-2013-report%2F' data-shr_title='%D0%9E%D1%82%D1%87%D0%B5%D1%82+%D0%BE+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%B8+GeekOUT+2013'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F19%2Fgeekout-2013-report%2F' data-shr_title='%D0%9E%D1%82%D1%87%D0%B5%D1%82+%D0%BE+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%B8+GeekOUT+2013'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F19%2Fgeekout-2013-report%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/06/19/geekout-2013-report/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>О качестве отечественных стартапов</title>
		<link>http://xpinjection.com/2013/06/18/ukraine-startups-quality/</link>
		<comments>http://xpinjection.com/2013/06/18/ukraine-startups-quality/#comments</comments>
		<pubDate>Tue, 18 Jun 2013 11:40:16 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3383</guid>
		<description><![CDATA[Пока злость не улеглась надо написать эту статью. Сразу предупреждаю, что статья содержит грубости и представляет исключительно мой опыт и видение ситуации. Кому все таки любопытно, добро пожаловать. У меня очень негативное отношение к слову &#171;стартап&#187;. Причин несколько. Одна из них заключается в том, что большая часть из того, что называют в современном мире &#171;стартапами&#187; <a href="http://xpinjection.com/2013/06/18/ukraine-startups-quality/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Пока злость не улеглась надо написать эту статью. Сразу предупреждаю, что статья содержит грубости и представляет исключительно мой опыт и видение ситуации. Кому все таки любопытно, добро пожаловать.</p>
<p>У меня очень негативное отношение к слову &laquo;стартап&raquo;. Причин несколько. Одна из них заключается в том, что большая часть из того, что называют в современном мире &laquo;стартапами&raquo; &#8211; просто унылое никому не нужное говно, которое появилось на свет благодаря буму социализации и невнятным попыткам некоторых разработчиков &laquo;сказочно разбогатеть&raquo;. Это касается как зарубежных, так и отечественных стартапов. Достойных проектов среди них 0.01%, а технически грамотно реализованных и того меньше.</p>
<p>Вторая причина скорее относится к нашим отечественным &laquo;стартапам&raquo;. В современном мире большая часть новых проектов направлены на предоставление сервиса. Сервиса, который сделает жизнь пользователей проще, приятнее, безопаснее и всячески клевее. В украинской версии &laquo;сервис&raquo; сводится только к зарабатыванию денег на пользователях и уходе от какой-либо ответственности за некорректную работу.</p>
<p>Итак, чем же мне насолили? Давайте сначала, чтобы не быть голословным, я приведу <a href="http://focus.ua/tech/247826/">ссылку</a> об отношении сервиса к &laquo;звездным&raquo; отечественным стартапам. Речь пойдет о <a href="http://tickets.ua">tickets.ua</a>, который как вы видите занимает почетное 15-ое место, а также о его &laquo;собрате&raquo; &#8211; <a href="http://senturia.ua/">senturia.ua</a>. Оба сервиса предоставляют возможности бронирования и покупки билетов.</p>
<p>Начнем с senturia.ua. Я вообще стараюсь как можно меньше пользоваться отечественными приложениями по заказу билетов и предпочитаю сайт авиакомпании (если нет большой разницы в цене) или проверенные сервисы как Kayak, Expedia, Orbitz и т.д. Но тут возникла сложность &#8211; лететь надо было в Эстонию с Estonian Air (только у них есть прямой рейс в Таллин) и все мои попытки заказать билеты на сайте компании заканчивались неудачно. Но об Estonian Air пожалуй отдельно. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Итак, я нашел рейс, ввел все данные о пассажирах, информацию для оплаты кредитной картой, проверил правильность данных о рейсе и смело нажал на кнопку оплаты. Каково же было мое удивление, когда ни через минуту, ни через 10 минут я не получил никакого письма от сервиса о судьбе моего заказа. Вообще ничего! При этом деньги с карты снялись мгновенно. Я подождал еще и понял, что надо обращаться в службу поддержки.</p>
<p>Тут начинается классический знакомый многим не по наслышке отечественный сервис. Раза 3-4 мне обещали разобраться в проблеме в течение 30 минут, максимум часа. На вопрос что случилось и почему с моей карты сняли деньги без реального бронирования билетов никто ответить не мог. Прошли почти сутки. В результате моих многократных звонков в службу поддержки и угрозе сообщить в банк о пропаже денег с моего счета (что можно довести до внесения получателя в черный список) мне вернули деньги, прислав сухое письмо об отмене моего бронирования, подписанное Юлией 559. Шикарно!</p>
<p>После этого я совершил вторую ошибку и воспользовался tickets.ua. Мне понравился простой интерфейс, где после выбора маршрута с датами, заполнения информации о пассажирах и карте на той же странице, оплата была совершена. Выбор полей был минимальным и никакая дополнительная информация не отвлекала. Деньги сразу не сняли, прислали уведомление о бронировании. После этого часть денег ушла напрямую компании Estonian Air, а часть tickets.ua. Сразу после этого мне прислали билеты на рейс. После опыта с senturia.ua я остался доволен. Но не тут то было&#8230;</p>
<p>Спокойно улетев из Киева в Таллин, на обратном пути в аэропорту у стойки регистрации выяснилась неприятная особенность &#8211; обратный рейс у меня был без багажа. Сотрудники авиакомпании объяснили, что билет заказан на разные типы сервиса в оба конца и что эконом у них бывает разный. Вспоминаете ту минималистичную форму заказа билетов? За ее внешним удобством для покупателя скрывается система, которая принимает решения на свое усмотрение. Узнать о том, что обратный рейс предоставляется без багажа, можно было по записи 0PC в одном из полей детальной маршрутной квитанции на обратный рейс. Никаких предупреждений, просто одно из полей мелким шрифтом в маршрутной квитанции. Можно было такое предположить? Я за многие годы полетов с такой проблемой сталкиваюсь впервые!</p>
<p>В результате, заказ на tickets.ua обошелся мне в дополнительные 40 евро, потраченное время и кучу головняка. Ну, думаю, по возвращение обращусь к ним и выслушаю извинения с компенсацией потраченных средств. Вместо этого получилось совсем наоборот. Я вернулся в режим отечественного сервиса. Мне начали доказывать, что во всем виноват я, который сам выбрал такой тип билета. Потом, в ответ на мой аргумент о невозможности его выбрать на сайте, виноватой вдруг стала авиакомпания, которая так забронировала билет. А потом мне и вовсе ответили, что их сервис заключается просто в передаче брони авиакомпании, а все остальное их просто не касается. Ах да, и мне же выслали маршрутную квитанцию с 0PC на обратный рейс.</p>
<p>Очень смешно рассказывать эту чушь разработчикам. Мы то прекрасно понимаем, что у авиакомпаний есть сервис, торчащий наружу, который делает то, что его попросили. Все ошибки, состыковки, обработка и подготовка данных, ложится на вызывающую сервис сторону. В данном случае это tickets.ua. Но оказывается она не несет за это ответственности.</p>
<p>Мне кажется, все дело в том, что у отечественных &laquo;стартаперов&raquo; отсутствует понимание сервиса и его целей, не говоря уже о лояльности к своим клиентам. Ошибки нужно признавать и принимать меры, чтобы клиент остался доволен в любом случае. Если ты берешься за определенную нишу, то надо в ней предоставлять именно сервис, делающий жизнь проще для клиентов. И не только тогда, когда все пошло по плану, но и когда появились проблемы.</p>
<p>В конце душеизлияния хотелось бы пару слов сказать о компании Estonian Air. Я достаточно часто летаю и привык оценивать уровень авиакомпании по цене на билеты. Дешевые билеты &#8211; вероятнее всего лоукостер и не стоит ничего ждать от него, дорогие &#8211; ты можешь ожидать неплохого сервиса. Estonian Air поломала стереотипы. Стоимость самого дешевого билета Киев-Таллин-Киев составляет около $300 при времени полета 1 час 30 минут. Его нельзя ни вернуть ни поменять. Что же вы получаете за эти деньги? А ровным счетом ничего:</p>
<ul>
<li>Компания настолько экономит, что в Борисполе обслуживается в самом углу терминала B, не смотря на то, что вылет из терминала D.</li>
<li>На борту самолета все, включая обычную воду, исключительно за дополнительную плату.</li>
<li>С августа этого года за невыполнение онлайн регистрации будут брать штраф 10 евро.</li>
<li>Самолет ооочень маленький и шумный, некоторые пассажиры проходят в салоне только боком.</li>
<li>Туалет на борту один и такой маленький, что даже при моем росте 180 см мне приходилось изгибаться чтобы туда поместиться.</li>
<li>&laquo;Гибкие&raquo; опции помогают тебе улететь без багажа, когда ты этого не хотел.</li>
</ul>
<p>А теперь самое интересное. В кармашке кресла как обычно можно найти журнал авиакомпании. И обычно на первой странице там руководство компании рассказывает о том, как их авиакомпания развивается, что хорошего ждет пассажиров, какие новости позитивные есть. И тут главные новости были о сокращении расходов. О том, что компания полгода провела в разработке стратегии по снижению затрат во всех областях, много людей уволили, урезали все что можно. Какое мне до этого дело? Стоимость услуг осталась такой же! Только пострадало качество предоставляемого сервиса. Так что в этом позитивного для пассажиров? Должны порадоваться, что теперь компания больше зарабатывает? И это очень напомнило мне наш отечественный сервис&#8230;</p>
<p>В общем, будьте аккуратны в своем выборе сервиса и не повторяйте моих ошибок.</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3383"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F18%2Fukraine-startups-quality%2F' data-shr_title='%D0%9E+%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5+%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85+%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF%D0%BE%D0%B2'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F18%2Fukraine-startups-quality%2F' data-shr_title='%D0%9E+%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5+%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85+%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF%D0%BE%D0%B2'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F18%2Fukraine-startups-quality%2F' data-shr_title='%D0%9E+%D0%BA%D0%B0%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5+%D0%BE%D1%82%D0%B5%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85+%D1%81%D1%82%D0%B0%D1%80%D1%82%D0%B0%D0%BF%D0%BE%D0%B2'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F18%2Fukraine-startups-quality%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/06/18/ukraine-startups-quality/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>С кого начинать набирать хорошую команду</title>
		<link>http://xpinjection.com/2013/06/10/how-to-start-great-team/</link>
		<comments>http://xpinjection.com/2013/06/10/how-to-start-great-team/#comments</comments>
		<pubDate>Mon, 10 Jun 2013 10:59:01 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[команда]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3380</guid>
		<description><![CDATA[Новые проекты постоянно стартуют, новые продукты начинают разрабатывать, а значит постоянно нужны новые хорошие команды, которые смогут привести проект к успеху. И тут появляется очень интересный вопрос: &#171;кого нанимать в команду первым?&#187;. Казалось бы, что тут сложного в этом вопросе? Оказывается, что ситуация на проекте может очень сильно измениться от одного или иного решения. Давайте <a href="http://xpinjection.com/2013/06/10/how-to-start-great-team/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="article-left" src="/images/articles/great-team.jpg" alt="отличная команда" /></p>
<p>Новые проекты постоянно стартуют, новые продукты начинают разрабатывать, а значит постоянно нужны новые хорошие команды, которые смогут привести проект к успеху. И тут появляется очень интересный вопрос: &laquo;кого нанимать в команду первым?&raquo;. Казалось бы, что тут сложного в этом вопросе? Оказывается, что ситуация на проекте может очень сильно измениться от одного или иного решения.</p>
<p>Давайте предположим, что первым вы решили взять в команду очень крутого специалиста, так сказать &laquo;звезду&raquo;. У вас как раз был такой на примете, вы его заинтересовали и пригласили в проект. Естественно, он будет принимать участие в отборе остальных членов команды. Но кого он будет пытаться отобрать? Вероятнее всего, таких же &laquo;звезд&raquo; как и он или немножко слабее. Для проекта это может превратиться в бесконечную волокиту в попытках расширить команду. Причины такого поведения просты &#8211; сильным разработчикам интереснее работать с другими сильными разработчиками. Зато, если вам повезет, вы получите небольшую, но очень сильную и замотивированную команду. Ведь каждый будет понимать, что это отличный шанс поработать действительно со &laquo;звездами&raquo;. Если же не повезет, то вы не сможете набрать быстро людей, проект загнется или же вы не выдержите и переключитесь на второй вариант.</p>
<p>Во втором варианте вы берете первым в команду хорошего середняка. И тут вступает в силу второй интересный принцип &#8211; середняк не будет нанимать людей сильнее себя. Это будут либо люди слабее его, на фоне которых он будет чувствовать себя &laquo;звездой&raquo;, либо такие же как он. В результате, вы можете достаточно быстро укомплектовать среднюю команду, но вам будет очень тяжело затащить туда сильного разработчика. Демотиватором для него будет уровень других членов команды. Да и для команды одного уровня приход такого сильного разработчика будет демотиватором. Но не факт, что средняя команда сможет сделать именно ваш продукт или проект на высоком уровне качества. А дальше может сложиться так, что середняки уйдут и уровень команды по тому же принципу упадет еще больше. И наступит болото&#8230;</p>
<p>Вот такой сложный выбор стоит перед тем, кто собирается набирать команду. Поэтому будьте внимательны и найдите для себя верную комбинацию.</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3380"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F10%2Fhow-to-start-great-team%2F' data-shr_title='%D0%A1+%D0%BA%D0%BE%D0%B3%D0%BE+%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82%D1%8C+%D0%BD%D0%B0%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C+%D1%85%D0%BE%D1%80%D0%BE%D1%88%D1%83%D1%8E+%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F10%2Fhow-to-start-great-team%2F' data-shr_title='%D0%A1+%D0%BA%D0%BE%D0%B3%D0%BE+%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82%D1%8C+%D0%BD%D0%B0%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C+%D1%85%D0%BE%D1%80%D0%BE%D1%88%D1%83%D1%8E+%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F10%2Fhow-to-start-great-team%2F' data-shr_title='%D0%A1+%D0%BA%D0%BE%D0%B3%D0%BE+%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%82%D1%8C+%D0%BD%D0%B0%D0%B1%D0%B8%D1%80%D0%B0%D1%82%D1%8C+%D1%85%D0%BE%D1%80%D0%BE%D1%88%D1%83%D1%8E+%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F10%2Fhow-to-start-great-team%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/06/10/how-to-start-great-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Старый конь борозды не портит?</title>
		<link>http://xpinjection.com/2013/06/06/old-developers/</link>
		<comments>http://xpinjection.com/2013/06/06/old-developers/#comments</comments>
		<pubDate>Thu, 06 Jun 2013 09:20:17 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3374</guid>
		<description><![CDATA[Давненько я не писал провокационных статей. Сегодня хочу поднять очень интересную тему программистов/разработчиков в возрасте. Обычно к данной категории относят представителей нашей индустрии, которым 40+ лет и кто по прежнему непосредственно занимается разработкой. IT сообщество делится на 2 лагеря: считающие возрастных разработчиков очень грамотными, полезными в компании и те, кто наоборот считает их бесполезной массой, <a href="http://xpinjection.com/2013/06/06/old-developers/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="article-left" src="/images/articles/old-developer.png" alt="разработчик в возрасте" /></p>
<p>Давненько я не писал провокационных статей. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Сегодня хочу поднять очень интересную тему программистов/разработчиков в возрасте. Обычно к данной категории относят представителей нашей индустрии, которым 40+ лет и кто по прежнему непосредственно занимается разработкой. IT сообщество делится на 2 лагеря: считающие возрастных разработчиков очень грамотными, полезными в компании и те, кто наоборот считает их бесполезной массой, от которой давно пора избавиться. Тема спорная, но я постараюсь осветить свой взгляд на нее.</p>
<p>Я являюсь сторонником второго лагеря, но только по отношению к отечественным разработчикам. И мне кажется, что причина в них самих. За рубежом все совсем не так. Итак, начнем. Во-первых, для большей части долго проработавших на отечественном рынке разработчиков в определенном возрасте работа перестает приносить драйв и становится просто способом зарабатывать деньги. На первых позициях давно семья и хобби. Это значит, нет времени на самообразование, да и смысла в нем они не видят особого. Пилят старый проект на аутсорсе и деньги получают.</p>
<p>Вторая причина очень тесно связана с первой. Наш рынок очень специфичный, на нем возрастные разработчики с высокими требованиями по зарплате и малой отдачей попросту невыгодны. Поэтому они ищут способ оставаться при деле. Очевидный выход &#8211; разбираться в древних технологиях, которые молодым поколениям практически неизвестны. Тогда ты всегда будешь оставаться востребованным специалистом, ведь старых больших проектов пруд пруди и многие из них отдают на аутсорсинг (не так много людей хотят за границей такой дрянью заниматься). При таком подходе можно найти себе &laquo;тепленькое место&raquo; и не переживать за ближайшее будущее.</p>
<p>Следующая причина &#8211; это публичная активность. Если хочешь, чтобы о тебе было хорошее мнение, надо его заслужить. Если ты много знаешь, то поделись знаниями с коллегами, научи молодое поколение уму-разуму. И где все &laquo;опытнейшие разработчики&raquo;? Почему их нет на встречах сообществ и конференциях? А там где есть, большая часть слушателей остаются недовольными? Может быть не такие уж они и опытнейшие? Все с удовольствием слушают Мартина Фаулера, дядю Боба, J. B. Rainsberger, David Evans и других представителей зарубежной IT индустрии. А где наши гуру? Окучивают EJB 2.0 на WebSphere или переливают данные из внешних вебсервисов в старенькую версию Oracle, продолжая работать на Java 1.4?</p>
<p>Ну и последняя причина &#8211; это сопротивление изменениям. На многих проектах я наблюдал одну и ту же картину как разработчики в возрасте становились большой преградой на пути внедрения новых подходов и технологий. Оно и понятно &#8211; эти изменения выбивают их из привычного окружения, требуют учить что-то новое, снова становиться начинающим из &laquo;эксперта&raquo;. Мы все сопротивляемся изменениям, которые выбивают нас из зоны комфорта. <em>&laquo;Эти ваши Agile-шмаджайл, чего общаться? Код надо писать вместо этого!&raquo;</em>. <em>&laquo;Какой NoSQL? А ты потом будешь отвечать за потерянные транзакции?&raquo;</em>. <em>&laquo;Кто будет поддерживать эти open source поделки? Завтра их может уже не быть&#8230;&raquo;</em>.</p>
<p>Я считаю, что для хорошего мнения о себе надо многое сделать. Возраст и опыт не создаст на ровном месте хорошего мнения. Его надо заслужить! Хотелось бы услышать ваше мнение на данную тему в комментариях. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3374"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F06%2Fold-developers%2F' data-shr_title='%D0%A1%D1%82%D0%B0%D1%80%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%8C+%D0%B1%D0%BE%D1%80%D0%BE%D0%B7%D0%B4%D1%8B+%D0%BD%D0%B5+%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%82%3F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F06%2Fold-developers%2F' data-shr_title='%D0%A1%D1%82%D0%B0%D1%80%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%8C+%D0%B1%D0%BE%D1%80%D0%BE%D0%B7%D0%B4%D1%8B+%D0%BD%D0%B5+%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%82%3F'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F06%2Fold-developers%2F' data-shr_title='%D0%A1%D1%82%D0%B0%D1%80%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%8C+%D0%B1%D0%BE%D1%80%D0%BE%D0%B7%D0%B4%D1%8B+%D0%BD%D0%B5+%D0%BF%D0%BE%D1%80%D1%82%D0%B8%D1%82%3F'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F06%2F06%2Fold-developers%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/06/06/old-developers/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Проблема миграции данных в Big Data</title>
		<link>http://xpinjection.com/2013/05/31/data-migration-in-big-data/</link>
		<comments>http://xpinjection.com/2013/05/31/data-migration-in-big-data/#comments</comments>
		<pubDate>Fri, 31 May 2013 13:49:27 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[данные]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3368</guid>
		<description><![CDATA[Решил написать маленькую пятничную статью, целью которой является предупредить всех, кто дует щеки и через слово вставляет Big Data. Сколько бы я не читал статей или не общался с товарищами, которые претендуют на использование действительно больших объемов данных у себя в приложении, никто из них не упоминает миграцию данных. Говорят о скорости чтения и записи, <a href="http://xpinjection.com/2013/05/31/data-migration-in-big-data/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Решил написать маленькую пятничную статью, целью которой является предупредить всех, кто дует щеки и через слово вставляет Big Data. Сколько бы я не читал статей или не общался с товарищами, которые претендуют на использование действительно больших объемов данных у себя в приложении, никто из них не упоминает миграцию данных. Говорят о скорости чтения и записи, масштабировании, шардинге и прочих важных вещах. А о миграции ни слова.</p>
<p>Почему же эта самая миграция так важна? Когда ваш проект только стартовал или начал набирать обороты, вам действительно важнее всего обеспечить сохранность данных и быстрый доступ к ним. Но потом время идет, все развивается и вот в вашем хранилище данных уже не гигабайты, а десятки и сотни терабайт. И тут встает задача разделения или миграции данных. Причиной может быть шардинг данных по новому критерию, сегментация рынка с выделением отдельной инсталляции для некоторых клиентов, ускорение доступа данных для некоторых особо важных клиентов и т.д.</p>
<p>Когда такая задача возникает, может оказаться, что вы уже у разбитого корыта и сделать по этому поводу ничего нельзя. К примеру, вы генерируете идентификаторы записей, которые могут быть использованы только с соседними записями. Или ваши данные распределены по хранилищу таким образом, что для их миграции нужно блокировать все хранилище целиком. Или ваша структура данных не позволяет собрать цельный кусок большого объема без перелопачивания всех данных, что может занять недели. Тогда вы смело берете в руки костыли и начинаете строить из них аккуратную пирамидку, которая вот-вот рухнет и вы всеми силами поддерживаете ее.</p>
<p>Чтобы избежать подобных проблем, стоит в самом начале задать себе вопрос: &laquo;а что будет, если понадобится перенести данные для одного пользователя/клиента/проекта/заказчика/&#8230; в другое место?&raquo;. Еще более полезным вопросом при проектировании вашего хранения данных и выборе хранилища будет: &laquo;а какие данные у нас являются независимыми и как мы обеспечим эту независимость при хранении?&raquo;. Это гораздо более продуманный путь чем взять бездумно MongoDB или Cassandra только потому, что это модные технологии. Помните, успех проекта принесет новые, часто неожиданные задачи и проблемы&#8230;</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!   </p>
<div class="shr-publisher-3368"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F05%2F31%2Fdata-migration-in-big-data%2F' data-shr_title='%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0+%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+%D0%B2+Big+Data'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F05%2F31%2Fdata-migration-in-big-data%2F' data-shr_title='%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0+%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+%D0%B2+Big+Data'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F05%2F31%2Fdata-migration-in-big-data%2F' data-shr_title='%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0+%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%B8+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+%D0%B2+Big+Data'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F05%2F31%2Fdata-migration-in-big-data%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/05/31/data-migration-in-big-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Самоорганизация существует!</title>
		<link>http://xpinjection.com/2013/04/26/self-organization-exists/</link>
		<comments>http://xpinjection.com/2013/04/26/self-organization-exists/#comments</comments>
		<pubDate>Fri, 26 Apr 2013 07:53:20 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3329</guid>
		<description><![CDATA[Сегодня в который раз убедился, что самоорганизация существует и она свойственна людям. История очень короткая, чтобы не утомлять в пятницу чтением длинных заумных статей. Так вот, по дороге на работу уже второй день не работает светофор. Причем на пересечении двух достаточно активных дорог по 3 полосы в каждом направлении. Движение всегда оживленное, особенно в часы <a href="http://xpinjection.com/2013/04/26/self-organization-exists/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Сегодня в который раз убедился, что самоорганизация существует и она свойственна людям. История очень короткая, чтобы не утомлять в пятницу чтением длинных заумных статей. Так вот, по дороге на работу уже второй день не работает светофор. Причем на пересечении двух достаточно активных дорог по 3 полосы в каждом направлении. Движение всегда оживленное, особенно в часы пик. И что вы думаете? Пробки не образовываются. Водители медленно подъезжают к перекрестку, пропускают группу машин и потом едут. И никто не сигналит как бешеный, что он находится на главной дороге. Водители на главной ведут себя очень корректно, не парализуя движение на второстепенной.</p>
<p>Это ли не яркий пример самоорганизации? Почему так происходит? Ведь обычно в таких случаях приходит микро-менеджер в лице регулировщика. В результате все недовольны, стоят и нервничают. Да и ГАИ водители недолюбливают также как разработчики менеджеров. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  А тут раз и все само собой работает. Мне кажется, что водителями движут несколько вещей, которые и дают эту самоорганизацию:</p>
<ul>
<li>Каждый понимает, что он может завтра оказаться на второстепенной и точно так же стоять.</li>
<li>Никому не нужна авария на ровном месте, цель каждого &#8211; приехать побыстрее и без проблем в пункт назначения.</li>
<li>Внутреннее стремление доказать, что ты &#8211; классный водитель и &laquo;разрулишь&raquo; такую ситуацию легко.</li>
</ul>
<p>Конечно, иногда находятся &laquo;мудаки&raquo;, которые пытаются нарушить этот процесс. Но &laquo;мудаки&raquo; есть всегда и везде, с этим ничего не поделаешь. Избавляйтесь от таких людей в своих командах, проектах, компаниях и самоорганизация будет получаться гораздо проще. </p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3329"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F26%2Fself-organization-exists%2F' data-shr_title='%D0%A1%D0%B0%D0%BC%D0%BE%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%21'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F26%2Fself-organization-exists%2F' data-shr_title='%D0%A1%D0%B0%D0%BC%D0%BE%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%21'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F26%2Fself-organization-exists%2F' data-shr_title='%D0%A1%D0%B0%D0%BC%D0%BE%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%21'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F26%2Fself-organization-exists%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/04/26/self-organization-exists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate и аннотации &#8211; добро или зло?</title>
		<link>http://xpinjection.com/2013/04/23/hibernate-annotations-cool-or-evil/</link>
		<comments>http://xpinjection.com/2013/04/23/hibernate-annotations-cool-or-evil/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 11:44:35 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3326</guid>
		<description><![CDATA[Недавно снова вспомнил свой любимый Hibernate и извечный спор что использовать: XML или аннотации. Я в этом споре придерживаюсь старомодной позиции XML и в этой коротенькой статье объясню почему. Изначально весь маппинг писался в XML, но потом в Java 5 пришли на радость людям аннотации и большая часть ORM фреймворков тут же предложили решение для <a href="http://xpinjection.com/2013/04/23/hibernate-annotations-cool-or-evil/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Недавно снова вспомнил свой любимый Hibernate и извечный спор что использовать: XML или аннотации. Я в этом споре придерживаюсь старомодной позиции XML и в этой коротенькой статье объясню почему. Изначально весь маппинг писался в XML, но потом в Java 5 пришли на радость людям аннотации и большая часть ORM фреймворков тут же предложили решение для маппинга с их использованием. Вроде бы современный подход, но&#8230;</p>
<p>Давайте вспомним такой замечательный принцип как Single Responsibility Principle. Он гласит о том, что код должен иметь минимальное количество ответственностей, в идеале &#8211; ровно одну. Тогда он может меняться только по одной причине и это делает его более устойчивым, а значит ваше приложение и база кода будет меньше подвержена изменениям. Что же получается в случае использования аннотаций с ORM? В этом случае на наш POJO ложится сразу две ответственности &#8211; отвечать за объект доменной модели и хранить знания о способе хранения информации в БД. Некоторые сюда же добавляют еще одну ответственность &#8211; хранение запросов для вычитки данных (при использовании именованных запросов). Не слишком ли много всего для бедного маленького POJO? Да и после манипуляций с аннотациями это уже не такой и POJO. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Все перечисленные ответственности, собранные в одном месте делают классы доменной модели очень сильно подверженными изменениям, хотя в хорошем приложении должно быть наоборот &#8211; доменные объекты меняются крайне редко. В чем же тут дело? Неужели разработчики ORM инструментов толкают нас на нарушение правильных принципов дизайна? Вовсе нет! Кто читал документацию не между строк, заметил, что везде фигурирует понятие Entity. И это не объект доменной модели, а специально заведенный объект для уровня хранения данных, на котором и работает ORM. И тогда Entity имеет только одну ответственность &#8211; предоставлять доступ к хранилищу данных.</p>
<p>Но в этом случае вам понадобится отдельный набор доменных объектов и механизм трансформации Entity < -> доменный объект (в простонародье трансформер). И тогда все будет честно, никакие правила хорошего дизайна страдать не будут. Также можно будет избежать добавления дурацких equals и hashCode в доменные объекты, которым это совершенно не нужно. Можно будет делать доменные объекты максимально immutable и не плодить пустых конструкторов и get/set методов для всех свойств. Правда в этом случае придется платить дублированием данных и дополнительной работой над слоем трансформеров. Выбор за вами&#8230;</p>
<p>Мы все стремимся сэкономить время и разрабатывать быстро, поэтому многие прикручивают ORM прямо на доменные объекты. И вот в этом классическом случае аннотации являются скорее злом чем добром. А мы должны оставаться на стороне добра! <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P.S. Кто еще не смотрел видео моих выступлений на тему Hibernate, можете найти много для себя интересного. Найти их можно на <a href="/resources/">странице материалов</a>.</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3326"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F23%2Fhibernate-annotations-cool-or-evil%2F' data-shr_title='Hibernate+%D0%B8+%D0%B0%D0%BD%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D0%B8+-+%D0%B4%D0%BE%D0%B1%D1%80%D0%BE+%D0%B8%D0%BB%D0%B8+%D0%B7%D0%BB%D0%BE%3F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F23%2Fhibernate-annotations-cool-or-evil%2F' data-shr_title='Hibernate+%D0%B8+%D0%B0%D0%BD%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D0%B8+-+%D0%B4%D0%BE%D0%B1%D1%80%D0%BE+%D0%B8%D0%BB%D0%B8+%D0%B7%D0%BB%D0%BE%3F'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F23%2Fhibernate-annotations-cool-or-evil%2F' data-shr_title='Hibernate+%D0%B8+%D0%B0%D0%BD%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D0%B8+-+%D0%B4%D0%BE%D0%B1%D1%80%D0%BE+%D0%B8%D0%BB%D0%B8+%D0%B7%D0%BB%D0%BE%3F'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F23%2Fhibernate-annotations-cool-or-evil%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/04/23/hibernate-annotations-cool-or-evil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Командная поездка на конференцию &#8211; лучший тимбилдинг</title>
		<link>http://xpinjection.com/2013/04/17/best-team-building-at-conference/</link>
		<comments>http://xpinjection.com/2013/04/17/best-team-building-at-conference/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 10:20:29 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[команда]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3317</guid>
		<description><![CDATA[Я вот на днях подумал, что трудно придумать лучший тимбилдинг, чем поехать командой на конференцию в другой город. Приведу несколько доводов, которые мне по опыту кажутся очень вескими: Во-первых, поездка на конференцию ценна как источник новых знаний и пинок под зад в сторону самообразования. Причем, командой можно все обсуждать и обдумывать в применении к компании <a href="http://xpinjection.com/2013/04/17/best-team-building-at-conference/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="article-left" src="/images/articles/team-building.png" alt="team building" /></p>
<p>Я вот на днях подумал, что трудно придумать лучший тимбилдинг, чем поехать командой на конференцию в другой город. Приведу несколько доводов, которые мне по опыту кажутся очень вескими:</p>
<p>Во-первых, поездка на конференцию ценна как источник новых знаний и пинок под зад в сторону самообразования. Причем, командой можно все обсуждать и обдумывать в применении к компании и проекту сразу на месте, а не пересказывать потом по приезду. Можно разделиться по разным докладам и собрать еще больше полезных знаний и интересных мыслей. Все это можно будет хорошенько пережевать по дороге домой.</p>
<p>Во-вторых, сама совместная поездка в другой город является своего рода командной работой. Заказать билеты, отель, продумать план поездки, что посмотреть, посетить. Это же очень интересно. В детстве мы мечтали поехать в лагерь хорошей компанией, без родителей и отлично провести время. Еще лучше снять большую квартиру на всю команду и пожить вместе пару дней. Ничего не может быть лучше для понимания друг друга.</p>
<p>В-третьих, вы отрываетесь от повседневных дел и суеты. Вместо этого у вас появляется возможность пообщаться на интересные темы с коллегами. Едете вы на поезде или летите самолетом, времени на общение у вас будет предостаточно. А это и возможность лучше узнать друг друга, обсудить вещи в проекте, на которые никогда не хватает времени, получить много новой информации.</p>
<p>Ну и наконец, чтобы не томить вас длинной статьей, последний довод: путешествовать и знакомиться с новыми людьми &#8211; это интересно. А делать это хорошей командой еще интереснее. Ведь у вас будет не только возможность посетить конференцию, но и погулять по достопримечательностям, попить пива в новом месте, развиртуализироваться с людьми, которых вы вроде и знаете, но никогда не видели.</p>
<p>Каждый раз когда я еду на конференцию с кем-то, я привожу гораздо больше с нее. Новые идеи, планы, знакомства, материалы&#8230; Поэтому, организуя <a href="http://jeeconf.com">JEEConf</a>, <a href="http://seleniumcamp.com">Selenium Camp</a>, <a href="http://xpdays.com.ua">XP Days Ukraine</a> в Киеве, я немного вам завидую. <img src='http://xpinjection.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3317"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F17%2Fbest-team-building-at-conference%2F' data-shr_title='%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%B5%D0%B7%D0%B4%D0%BA%D0%B0+%D0%BD%D0%B0+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D1%8E+-+%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B9+%D1%82%D0%B8%D0%BC%D0%B1%D0%B8%D0%BB%D0%B4%D0%B8%D0%BD%D0%B3'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F17%2Fbest-team-building-at-conference%2F' data-shr_title='%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%B5%D0%B7%D0%B4%D0%BA%D0%B0+%D0%BD%D0%B0+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D1%8E+-+%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B9+%D1%82%D0%B8%D0%BC%D0%B1%D0%B8%D0%BB%D0%B4%D0%B8%D0%BD%D0%B3'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F17%2Fbest-team-building-at-conference%2F' data-shr_title='%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%B5%D0%B7%D0%B4%D0%BA%D0%B0+%D0%BD%D0%B0+%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D1%8E+-+%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B9+%D1%82%D0%B8%D0%BC%D0%B1%D0%B8%D0%BB%D0%B4%D0%B8%D0%BD%D0%B3'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F17%2Fbest-team-building-at-conference%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/04/17/best-team-building-at-conference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>А так ли важен уникальный контент?</title>
		<link>http://xpinjection.com/2013/04/05/is-unique-content-so-important/</link>
		<comments>http://xpinjection.com/2013/04/05/is-unique-content-so-important/#comments</comments>
		<pubDate>Fri, 05 Apr 2013 09:20:19 +0000</pubDate>
		<dc:creator>Николай Алименков</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[доклад]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3297</guid>
		<description><![CDATA[За последнее время несколько раз столкнулся с одной и той же странностью &#8211; организаторы конференции выдвигают требования к докладчикам на тему уникальности контента. Это значит, что докладчик должен подготовить для конференции новую тему, с которой он нигде не выступал до этого. Я считаю это полнейшей глупостью и постараюсь в этой статье объяснить почему. Один из <a href="http://xpinjection.com/2013/04/05/is-unique-content-so-important/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>За последнее время несколько раз столкнулся с одной и той же странностью &#8211; организаторы конференции выдвигают требования к докладчикам на тему уникальности контента. Это значит, что докладчик должен подготовить для конференции новую тему, с которой он нигде не выступал до этого. Я считаю это полнейшей глупостью и постараюсь в этой статье объяснить почему.</p>
<p>Один из главных доводов организаторов: каждый может зайти и посмотреть видео старого доклада с прошедшей конференции. А значит, доклад не будет таким интересным и на него никто придет. Давайте начнем издалека, с далеких от IT областей. Зачем люди идут на концерты популярных исполнителей? Ведь они же есть в записи. Сел себе спокойно и посмотрел в записи концерт пока занимаешься другими делами. Круто ведь? На самом деле не очень, явно драйва от такого просмотра будет на порядок меньше чем от живого выступления, не говоря уже про возможность сфотографироваться с кумиром, взять автограф и просто хорошо провести время в компании людей с похожими музыкальными предпочтениями. Точно так же и в выступлении &#8211; у вас есть возможность лучше проникнуться докладом, задать свои вопросы докладчику, открыть новые грани темы доклада, пообщаться на в кулуарах, лично познакомиться и взять контакты. И вы гораздо лучше воспримите доклад в живую потому что время для самообразования выделено вами специально, а не за другими делами.</p>
<p>Теперь давайте посмотрим, насколько может пересечься аудитория на одном и том же докладе на разных конференциях. Тут вступает в действие множество факторов. Я перечислю лишь несколько из них. Наиболее очевидный фактор &#8211; географический. Конференция в Питере и Киеве рискует пересечься по аудитории меньше 1%. Даже в пределах Украины при небольших масштабах конференции вы можете практически не встретить людей, видевших ваш доклад на конференции в другом городе. Следующий фактор &#8211; направление конференции. Конференции для менеджеров, админов, разработчиков и тестировщиков практически не пересекаются по аудитории (поверьте моему многолетнему опыту выступлений).</p>
<p>Видеозаписи докладов публикуются, но не на всех конференциях и не всегда быстро. Мы делаем это уже 3 года для всех наших мероприятий и я бы не сказал, что тысячи человек ждут этого и пересматривают все доклады. У большей части людей для этого нет ни времени ни желания. Но это уже совсем другая проблема.</p>
<p>Давайте задумаемся, почему докладчик выступает с одной и той же темой несколько раз. Во-первых, эта тема ему интересна и он ей занимается. Во-вторых, в этой темой он чувствует себя профессионалом и может очень уверенно делиться своими знаниями и опытом. Да и сам доклад по мере выступления изменяется, оттачивается и впитывает новые и новые полезности. У хороших докладчиков конечно. А еще докладчик, которого приглашают на несколько мероприятий в месяц, просто не в силах все время выдумывать новые темы для докладов. За такой короткий срок не случается чего-то нового, нельзя углубиться в новые практики и технологии. И что получается из таких попыток? Чаще всего притянутые за уши темы, скучные доклады, неграмотные ответы на вопросы участников и испорченное впечатление о докладе и самом докладчике.</p>
<p>Для меня как организатора выступление докладчика не первый раз с выбранной темой решает сразу много проблем. Я могу посмотреть как он выступает, может ли держать аудиторию, насколько много людей собирается на его доклад. Я могу почитать отзывы и даже найти участников, которые видели живое выступление и могут поделиться своими ощущениями. Дополнительно убирается много рисков, связанных с подготовкой презентации, продумыванием тайминга, объемом и качеством материала. Все это сильно упрощает жизнь организаторам и делает конференцию ярче и качественнее.</p>
<p>Давайте обратимся к опыту зарубежных коллег. На большей части конференций вы увидите в качестве приглашенных докладчиков одних и тех же людей с одними и теми же докладами. Просто их тематика актуальна и сами докладчики являются бесспорными экспертами в ней. Люди приходят даже не на тему доклада, а на докладчика, потому что его опыт и знания, манера изложения и подход к подготовке доклада гораздо лучше чем у других.</p>
<p>В заключение хочу отметить, что при текущем количестве публичных образовательных мероприятий (конференций, тренингов, семинаров, курсов, встреч и т.д.) новые темы стали настолько редкостью, что их приходится выискивать очень долго. Гораздо важнее уметь тему правильно раскрыть и подать, дать людям тот заряд энергии, которого им хватит для изменения своих подходов и практик. А это всецело зависит от докладчика, а не от уникальности темы. На днях я посмотрел запись доклада Мартина Фаулера <a href="http://architects.dzone.com/articles/martin-fowlers-introduction">&laquo;Введение в NoSQL&raquo;</a>. Тема избитая и я уже слышал много выступлений, читал-перечитал и сам попробовал большую часть решений на рынке NoSQL. Но Фаулер заставил меня посмотреть на вещи и концепции немного под другим углом, подумать над спецификой проблем и решений к ним, над которыми я раньше так детально не задумывался. И это круто, я из одного доклада узнал больше чем часто с целой конференции! Хотя тема далека от уникальности&#8230;</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3297"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F05%2Fis-unique-content-so-important%2F' data-shr_title='%D0%90+%D1%82%D0%B0%D0%BA+%D0%BB%D0%B8+%D0%B2%D0%B0%D0%B6%D0%B5%D0%BD+%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%3F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F05%2Fis-unique-content-so-important%2F' data-shr_title='%D0%90+%D1%82%D0%B0%D0%BA+%D0%BB%D0%B8+%D0%B2%D0%B0%D0%B6%D0%B5%D0%BD+%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%3F'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F05%2Fis-unique-content-so-important%2F' data-shr_title='%D0%90+%D1%82%D0%B0%D0%BA+%D0%BB%D0%B8+%D0%B2%D0%B0%D0%B6%D0%B5%D0%BD+%D1%83%D0%BD%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BD%D1%82%3F'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F05%2Fis-unique-content-so-important%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/04/05/is-unique-content-so-important/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Как работать c ожиданиями от WebDriver API</title>
		<link>http://xpinjection.com/2013/04/04/waits-and-timeouts-in-webdriver/</link>
		<comments>http://xpinjection.com/2013/04/04/waits-and-timeouts-in-webdriver/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 12:11:05 +0000</pubDate>
		<dc:creator>Андрей Дзыня</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[webdriver]]></category>
		<category><![CDATA[автоматизация тестирования]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://xpinjection.com/?p=3259</guid>
		<description><![CDATA[Как ожидать элементы или определенные состояния на странице? Наверное, один из самых интересных вопросов, которые могут возникать при первом использовании WebDriver. Разработчики инструмента потрудились на славу, чтобы сделать этот процесс максимально комфортным и гибким. В статье рассмотрены самые важные типы ожиданий, используя WebDriver API. Ожидание времени загрузки страницы Как известно WebDriver работает с DOM. Потому ожидание загрузки <a href="http://xpinjection.com/2013/04/04/waits-and-timeouts-in-webdriver/" class="more-link">More &#62;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://xpinjection.com/wp-content/uploads/2013/03/Hourglass_Timer_Stool_3.jpg"><img class="alignleft size-thumbnail wp-image-3265" src="http://xpinjection.com/wp-content/uploads/2013/03/Hourglass_Timer_Stool_3-150x150.jpg" alt="" width="150" height="150" /></a>Как ожидать элементы или определенные состояния на странице? Наверное, один из самых интересных вопросов, которые могут возникать при первом использовании WebDriver. Разработчики инструмента потрудились на славу, чтобы сделать этот процесс максимально комфортным и гибким.</p>
<p>В статье рассмотрены самые важные типы ожиданий, используя <strong>WebDriver API</strong>.</p>
<h2>Ожидание времени загрузки страницы</h2>
<p>Как известно <strong>WebDriver </strong>работает с <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a>. Потому ожидание загрузки страницы происходит через ожидание состояния <strong>document.readyState == complete</strong>. Это происходит автоматически после открытия страницы driver.get(), перезагрузки driver.navigate.refresh(), перехода на другие страницы посредством нажатия на веб элементы и т.д. <strong>WebDriver</strong> ожидает загрузку DOM-а страницы автоматически, потому уже не нужно вызывать<strong> waitForPageToLoad()</strong> после каждого действия, как это было в Selenium RC. Если же загрузка страницы длится очень долго и нужно прекратить ожидание, предусмотрена конфигурация <strong>pageLoadTimeout.</strong> Но стоит принимать во внимание, что если DOM не загрузился к тому моменту, вы получите TimeoutException.</p>
<pre>driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);</pre>
<blockquote><p>На момент написания статьи работает только для Firefox и InternetExplorer.</p></blockquote>
<h2>Ожидание выполнения JavaScript</h2>
<p>Используя JavascriptExecutor, есть возможность выполнять любой JS на Web странице. Для функции executeAsyncScript мы можем задать граничное значение времени ожидания завершения запроса:</p>
<pre>driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);</pre>
<h2>Неявные или скрытые(Implicit) ожидания.</h2>
<p>Их особенность в том, что ожидания указаны глобально на уровне объекта driver. И все вызовы элементов driver.findElement() будут продолжаться то тех пор, пока элемент не будет найден или будет достигунта граница времени ожидания.</p>
<pre>driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);</pre>
<p>В данном примере, при вызове функции driver.findElement(), если элемент не присутствует в DOM страницы, на протяжении 10 секунд будет происходить опрос браузера на наличие элемента. Это очень помогает при работе с AJAX компонентами.</p>
<h2>Явные(Explicit) ожидания</h2>
<p>Самая интересная тема &#8211; конфигурируемые ожидания.</p>
<p>Ведь очень сложно угодить всем компонентам на странице используя только стандартные средства неявных ожиданий. Особенно в тяжелых AJAX приложениях.</p>
<h3>Создание объекта WebDriverWait</h3>
<pre>private final Wait&lt;WebDriver&gt; wait = new WebDriverWait(driver, 5, 1000);</pre>
<p>Второй параметр принимает время timeout в секундах, третий параметр принимает время в milliseconds, которое нужно ожидать перед очередным вызовом проверки наличия элемента (500 milliseconds by default).</p>
<h3>Вывод сообщения в случае неуспешного завершения ожидания</h3>
<pre>private final Wait&lt;WebDriver&gt; wait = new WebDriverWait(driver, 5).withMessage("Element was not found");</pre>
<h3>Игнорирование определенных событий во время поиска</h3>
<p>Во время процесса поиска <strong>WebDriver</strong> регулярно опрашивает браузер на наличие элемента в DOM модели. При этом существует ряд исключительных ситуаций</p>
<ul>
<li>Если элемент доступен в DOM на момент поиска, но спустя время, в момент его вызова, DOM может измениться. Тогда мы получим <strong>StaleElementReferenceException</strong>.</li>
<li>Если элемент отсутствует в DOM на момент вызова &#8211; получим <strong>NoSuchElementException</strong>.</li>
<li>Если элемент был найдем в DOM, но не видим на странице &#8211; получим <strong>ElementNotVisibleException</strong>.</li>
<li>Если элемент изменил координаты &#8211; получим <strong>MoveTargetOutOfBoundsException</strong>.</li>
</ul>
<p>Когда пойман один из таких случаев, то цикл остановится и выбросит исключение.</p>
<p>Для того чтобы игнорировать исключения в объекте Wait предусмотрен метод <strong>ignoring</strong>:</p>
<pre>private final Wait&lt;WebDriver&gt; wait = new WebDriverWait(driver, 5).ignoring(StaleElementReferenceException.class, ElementNotVisibleException.class);</pre>
<h3>Еще один вариант создания объекта Wait</h3>
<pre>private final Wait&lt;WebDriver&gt; wait = new FluentWait&lt;WebDriver&gt;(driver).withMessage("Element was not found").withTimeout(10, TimeUnit.SECONDS).pollingEvery(1, TimeUnit.SECONDS);</pre>
<h3>Вызов объекта Wait</h3>
<p>Объект содержит в себе всего одну функцию <strong>until</strong>, которая представляет собой правило, по которому стоит ожидать элемент. Существует набор уже определенных правил для ожиданий. Находятся они в классе <strong>ExpectedConditions</strong>:</p>
<pre>wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("table"))));</pre>
<p>Часто используемые правила:</p>
<ul>
<li>titleContains(String title)</li>
<li>presenceOfElementLocated(By locator)</li>
<li>presenceOfAllElementsLocatedBy(By locator)</li>
<li>visibilityOfElementLocated(By locator)</li>
<li>visibilityOf(WebElement element)</li>
<li>textToBePresentInElement(By locator, String text)</li>
<li>invisibilityOfElementLocated(By locator)</li>
<li>invisibilityOfElementWithText(By locator, String text)</li>
<li>elementToBeClickable(By locator)</li>
<li>stalenessOf(WebElement element)</li>
<li>alertIsPresent()</li>
</ul>
<p>Есть возможность использовать негативные правила:</p>
<pre>wait.until(ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(By.id("link"))));</pre>
<p>Список всех функций <a href="http://htmlpreview.github.com/?https://github.com/SeleniumHQ/selenium/blob/master/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html">доступен по ссылке</a>.</p>
<h3>Создание индивидуальных ожиданий</h3>
<p>В тех случаях, когда ни одно из готовых правил не подходит, нужно создавать свое:</p>
<pre>Function&lt;? super WebDriver, Object&gt; isTextPresent = new ExpectedCondition&lt;Object&gt;() {
  @Override
  public Boolean apply(WebDriver webDriver) {
    return  webDriver.findElement(By.tagName("body")).getText().contains("New topic");
   }
};</pre>
<p>Если использовать объект типа WebDriverWait:</p>
<pre>//Link
private final WebDriverWait wait;

//Initialization
wait = new WebDriverWait(driver, 1);</pre>
<p>Можно создавать правило используя класс Predicate:</p>
<pre>Predicate&lt;WebDriver&gt; isTableLoaded = new Predicate&lt;WebDriver&gt;() {
  @Override
  public boolean apply(WebDriver webDriver) {
    List&lt;WebElement&gt; rows = webDriver.findElement(By.id("table")).findElements(By.tagName("tr"));
    return rows.size() &gt; 1;
  }
};</pre>
<p><strong>WebDriver API</strong> очень богат разного рода ожиданиями, для часто-встречающих ситуаций в автоматизации тестирования Web приложений. Чтобы упростить конфигурацию значений времени для ожиданий, их обычно выносятся в параметры запуска или сохраняют в property файл.</p>
<p>Используйте эти примеры для своих функциональных тестов с целью повысить их производительность и стабильность. Если какая-то из возможностей WebDriver API осталась не раскрытой, пожалуйста, напишите пример в комментариях.</p>
<p><strong>Не хочешь пропускать ничего интересного?</strong> Подпишись на ленту <a href="http://xpinjection.com/feed/">RSS</a> или следи за нами в <a href="http://www.twitter.com/xpinjection">Twitter</a>!</p>
<div class="shr-publisher-3259"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-tweetbutton' data-shr_count='horizontal' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F04%2Fwaits-and-timeouts-in-webdriver%2F' data-shr_title='%D0%9A%D0%B0%D0%BA+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C+c+%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8+%D0%BE%D1%82+WebDriver+API'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F04%2Fwaits-and-timeouts-in-webdriver%2F' data-shr_title='%D0%9A%D0%B0%D0%BA+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C+c+%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8+%D0%BE%D1%82+WebDriver+API'></a><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F04%2Fwaits-and-timeouts-in-webdriver%2F' data-shr_title='%D0%9A%D0%B0%D0%BA+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C+c+%D0%BE%D0%B6%D0%B8%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8+%D0%BE%D1%82+WebDriver+API'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fxpinjection.com%2F2013%2F04%2F04%2Fwaits-and-timeouts-in-webdriver%2F'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://xpinjection.com/2013/04/04/waits-and-timeouts-in-webdriver/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
