<?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>Мысли вслух &#187; Подбор сотрудников</title>
	<atom:link href="http://caphome.com/category/rabota/podbor-sotrudnikov/feed/" rel="self" type="application/rss+xml" />
	<link>http://caphome.com</link>
	<description>Мысли вслух и глупые программистские вопросы</description>
	<lastBuildDate>Sun, 29 Jan 2012 18:27:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Почему плохо вести блог с задачками</title>
		<link>http://caphome.com/2011/03/pochemu-plokho-vesti-blog-s-zadachkami/</link>
		<comments>http://caphome.com/2011/03/pochemu-plokho-vesti-blog-s-zadachkami/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 09:17:09 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Подбор сотрудников]]></category>

		<guid isPermaLink="false">http://caphome.com/2011/03/pochemu-plokho-vesti-blog-s-zadachkami/</guid>
		<description><![CDATA[Сейчас, после длительного перерыва, активно пошел найм новых людей, уже в мою новую группу. И тут обнаружилась обратная сторона выкладывания задач в блог&#160;&#8212; некоторые кандидаты приходят уже &#171;подготовленными&#187; благо, при определенной сноровке, обнаружить мой блог несложно. Но, хорошая часть, плохим кандидатам это не помогает...]]></description>
			<content:encoded><![CDATA[<p>Сейчас, после длительного перерыва, активно пошел найм новых людей, уже в мою новую группу. И тут обнаружилась обратная сторона выкладывания задач в блог&nbsp;&mdash; некоторые кандидаты приходят уже &laquo;подготовленными&raquo; благо, при определенной сноровке, обнаружить мой блог несложно.</p>
<p>Но, хорошая часть, плохим кандидатам это не помогает... <img src='http://caphome.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2011/03/pochemu-plokho-vesti-blog-s-zadachkami/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Разворот строчки — новый вариант</title>
		<link>http://caphome.com/2011/03/razvorot-strochki-novyjj-variant/</link>
		<comments>http://caphome.com/2011/03/razvorot-strochki-novyjj-variant/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 19:05:55 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[построение команды]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=1559</guid>
		<description><![CDATA[Вчера, обсуждая с очередным кандидатом, на должность тестера в нашу команду, задачу про разворот строчки, мне на ум пришло новое забавное решение этой задачки. Вариант для C/C++. Увлеченно используем арифметику указателей. char* reverse(char *s) { char *s0, *s1; for (s1 = s; *(s1) != '\0'; s1++); s1--; for (s0 = s; s0 &#60; s1; s0++ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.visual-basic-tutorials.com/Tutorials/Strings/Images/ReverseT.png" rel="lightbox[1559]"><img class="alignleft size-full wp-image-1564" title="Reverse String" src="http://caphome.com/wp-content/uploads/2011/03/ReverseT.png" alt="" width="213" height="94" /></a>Вчера, обсуждая с очередным кандидатом, на <a href="http://emeajobs.oracle.com/pls/webdep_www/wd_portal.show_job?p_web_site_id=582&amp;p_web_page_id=81639">должность тестера</a> в нашу команду, <a href="http://caphome.com/2009/01/razvorot-strochki/">задачу про разворот строчки</a>, мне на ум пришло новое забавное решение этой задачки.</p>
<p>Вариант для C/C++. Увлеченно используем арифметику указателей.</p>
<pre>char* reverse(char *s) {
    char *s0, *s1;

    for (s1 = s; *(s1) != '\0'; s1++);
    s1--;
    for (s0 = s; s0 &lt; s1; s0++ &amp;&amp; s1--) {
        char c = *(s0);
        *(s0) = *(s1);
        *(s1) = c;
    }
    return s;
}</pre>
<p>Сравнивая производительность с предыдущими вариантами, надо обратить внимание на два момента:</p>
<ul>
<li>фактически первый цикл — это 	вычисление длины строки, т.е. быстрее 	или медленнее это место, по сравнению 	со strlen, зависит от реализации strlen. Не 	знаю что конкретно там обычно написано, 	спекулировать не буду. Но думается, что 	что-то типа того и написано <img src='http://caphome.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  С другой 	стороны, если вдруг окажется, что strlen 	работает быстрее чем просто поиск 	конца, в цикле, то никто не мешает нам 	написать конструкцию вида s1 = s+strlen (s). А 	дальше продолжить делать как тут.</li>
<li>Во время самого обмена значениями 	мы заметно сокращаем количество 	вычислений, т.к. вместо s+i и s+len-i, на 	каждом присваивании, мы все указатели 	вычисляем один раз, на проход.</li>
</ul>
<p>На Java так красиво не получится. За отсутствием собственно указателей. Но близко к этому будет вариант с запуском навстречу двух счетчиков массива...</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2011/03/razvorot-strochki-novyjj-variant/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Непарный элемент</title>
		<link>http://caphome.com/2009/04/neparnyjj-ehlement/</link>
		<comments>http://caphome.com/2009/04/neparnyjj-ehlement/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 21:19:46 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://www.caphome.com/?p=225</guid>
		<description><![CDATA[Задача Дан массив нечётной длины. Известно, что все элементы массива, кроме одного, имеют пару. Необходимо найти элемент не имеющий пары. Решение Для нахождения ответа необходимо последовательно выполнить операцию XOR со всеми элементами массива. Результатом и будет непарный элемент. Что проверяем Достаточно простая задача на знание свойств бинарных операций.]]></description>
			<content:encoded><![CDATA[<h3>Задача</h3>
<p>Дан массив нечётной длины. Известно, что все элементы массива, кроме одного, имеют пару. Необходимо найти элемент не имеющий пары.</p>
<h3>Решение</h3>
<p>Для нахождения ответа необходимо последовательно выполнить операцию XOR со всеми элементами массива. Результатом и будет непарный элемент.</p>
<h3>Что проверяем</h3>
<p>Достаточно простая задача на знание свойств бинарных операций.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/04/neparnyjj-ehlement/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Задача про банкомат</title>
		<link>http://caphome.com/2009/02/zadacha-pro-bankomat/</link>
		<comments>http://caphome.com/2009/02/zadacha-pro-bankomat/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 19:48:43 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://www.caphome.com/?p=189</guid>
		<description><![CDATA[Решение этой задачи потребует большего количества программирования. Поэтому её имеет смысл давать интересным кандидатам, как домашнее задание. Если хотите посмотреть как человек реально пишет код. Кроме того, задача содержит внутри себя возможность для выбора решения из нескольких возможных. Посмотреть на то увидит ли кандидат разные возможности и чем будет руководствоваться при выборе, так же интересно. [...]]]></description>
			<content:encoded><![CDATA[<p>Решение этой задачи потребует большего количества программирования. Поэтому её имеет смысл давать интересным кандидатам, как домашнее задание. Если хотите посмотреть как человек реально пишет код. Кроме того, задача содержит внутри себя возможность для выбора решения из нескольких возможных. Посмотреть на то увидит ли кандидат разные возможности и чем будет руководствоваться при выборе, так же интересно.</p>
<p>Мне её давали на собеседовании в Exigen.</p>
<h3>Задача</h3>
<p>Реализовать интерфейс для банкомата. Устройство получает запросы через стандартный ввод и отправляет ответы в стандартный вывод. Все команды возвращают OK, в случае успеха, и ERROR, в случае ошибки.</p>
<p><span id="more-189"></span><br />
Возможны следующие команды.</p>
<p>1. Внести купюры.<br />
+ &lt;валюта&gt; &lt;номинал купюры&gt; &lt;количество&gt;<br />
&lt;валюта&gt;&nbsp;&mdash; три любые заглавные буквы.<br />
&lt;номинал купюры&gt;&nbsp;&mdash; допустимые значения: 10<sup>n</sup> и 5*10<sup>n</sup>, 0&lt;=n&lt;=3.<br />
&lt;количество&gt;&nbsp;&mdash; любое положительное, целое число.</p>
<p>2. Выдать наличные.<br />
&mdash; &lt;валюта&gt; &lt;сумма&gt;<br />
&lt;валюта&gt;&nbsp;&mdash; валюта.<br />
&lt;сумма&gt;&nbsp;&mdash; любое положительное, целое число.</p>
<p>3. Распечатать имеющиеся купюры.<br />
?<br />
На каждую пару валюта/купюра печатает строку следующего вида:<br />
&lt;валюта&gt; &lt;номинал купюры&gt; &lt;количество&gt;<br />
Строки сгруппированы по валютам и отсортированы по номиналам.</p>
<h3>Решение</h3>
<p>В задаче, на мой взгляд, имеются несколько моментов, на реализацию которых нужно обратить внимание.</p>
<p>Первый&nbsp;&mdash; классическая задача о том, как выдать какую-то сумму имеющимися купюрами. Эта задача должна быть известна любому приличному программисту.</p>
<p>Второй&nbsp;&mdash;  если нам не удалось выдать запрашиваемую сумму, то количество купюр в банкомате не должно измениться.</p>
<p>Третий&nbsp;&mdash; самый интересный. Как  хранить информацию о количестве имеющихся купюр так, чтобы к ней можно было быстро и удобно получать доступ.</p>
<p>С учётом жёстких ограничений на номиналы купюр, напрашивается хранить количество купюр в массиве длины 8 и вычислением индекса массива следующим образом:<br />
int index = value.charAt (0) -&#39;2&#39;+value.length ();<br />
Подозреваю, что именно этот ход и ожидали увидеть авторы. Решение милое, но очень сильно завязано на указанные в задании номиналы банкнот.</p>
<p>Более разумным мне кажется решение, которое, по моим прикидкам, не должно сильно отличаться по производительности, но дает значительную гибкость в определении номиналов. Кроме того, из ATM не требуется выжимать максимальную производительность.</p>
<p>Идея в том, что номиналы и количество хранятся в двух массивах, длины 8. Массив с номиналами отсортирован, для возможности бинарного поиска по нему. При необходимости найти индекс массива, где хранится информация о количестве купюр необходимого номинала, мы ищем соостветствующий номинал в первом массиве и используем этот индекс, для доступа ко второму.</p>
<p>При таком подходе нам совершенно всё равно, какие конкретно номиналы допустимы.</p>
<p>Предлагаемое решение можно посмотреть тут: <a class="downloadlink" href="http://caphome.com/download/ATMDemo.zip" title=" downloaded 438 times" >Реализация задачи про банкомат (438)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/02/zadacha-pro-bankomat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft и 3 лампочки</title>
		<link>http://caphome.com/2009/02/microsoft-i-3-lampochki/</link>
		<comments>http://caphome.com/2009/02/microsoft-i-3-lampochki/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 10:49:17 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[построение команды]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://www.caphome.com/?p=175</guid>
		<description><![CDATA[Задачка, которую используют на собеседования в Microsoft. Исключительно на сообразительность. Задача В комнате есть три лампочки. В другой комнате есть три выключателя, включающие эти лампочки. Как, за один поход в первую комнату, узнать какой выключатель включает какую лампочку? Решение Включаем первый выключатель и ждем некоторое время, затем выключаем. Включаем еще один выключатель и идём в [...]]]></description>
			<content:encoded><![CDATA[<p>Задачка, которую используют на собеседования в Microsoft. Исключительно на сообразительность.</p>
<h3>Задача</h3>
<p>В комнате есть три лампочки. В другой комнате есть три выключателя, включающие эти лампочки.</p>
<p>Как, за один поход в первую комнату, узнать какой выключатель включает какую лампочку?</p>
<h3>Решение</h3>
<p>Включаем первый выключатель и ждем некоторое время, затем выключаем. Включаем еще один выключатель и идём в первую комнату. Лампочка, включаемая вторым выключателем горит. Лампочка, включаемая первым выключателем, теплая.</p>
<p><strong>NB:</strong> Очевидно, что задача применима только к лампочкам накаливания.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/02/microsoft-i-3-lampochki/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Разворот строчки</title>
		<link>http://caphome.com/2009/01/razvorot-strochki/</link>
		<comments>http://caphome.com/2009/01/razvorot-strochki/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 07:43:35 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[построение команды]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=85</guid>
		<description><![CDATA[Задачка классическая и очень простая. Посему имеет смысл ее использовать только для совсем уж начинающих программистов. Хотя меня как-то недавно тоже попросили ее решить Задача Развернуть строку символов. Как вариант, можно попросить развернуть массив. Решение Решений опять же много. Предлагаю все решения, где для разворота массива понадобился еще один массив считать незачётом. Можно это требование [...]]]></description>
			<content:encoded><![CDATA[<p>Задачка классическая и очень простая. Посему имеет смысл ее использовать только для совсем уж начинающих программистов.</p>
<p>Хотя меня как-то недавно тоже попросили ее решить <img src='http://caphome.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Задача</h3>
<p>Развернуть строку символов. Как вариант, можно попросить развернуть массив.</p>
<h3>Решение</h3>
<p>Решений опять же много. Предлагаю все решения, где для разворота массива понадобился еще один массив считать незачётом. Можно это требование внести в условие, но, ИМХО, лучше посмотреть не предложит ли вдруг кандидат подобного решения и уже потом ввести это дополнительное ограничение. Единственным оправданием можно считать вопрос о том необходимо ли сохранить исходную строчку. Но это замечание не относится к Java, т.к. там придется выносить символы из строки в массив. И этот массив, очевидно, беречь нам ни к чему.</p>
<p>Краше всего на C/C++, где строчки&nbsp;&mdash; те же самые массивы. Будем использовать такую милую любому настоящему программисту на C арифметику указателей.</p>
<pre>void reverseString(char *str)
{
    int i = 0;
    int len = strlen(str)-1;
    for (; i &lt;= len/2; i++)
    {
        char c = *(str+i);
        *(str+i) = *(str+len-i);
        *(str+len-i) = c;
    }
}</pre>
<p>На Java, как я говорил, выглядит менее элегантно, т.к. со строкой нельзя работать, как с массивом. И получатеся нечто вроде:</p>
<pre>String reverseString(String s) {
    char []str = s.toCharArray();
    int len = str.length-1;
    for (int i = 0; i &lt;= len/2; i++) {
        char c = str[i];
        str[i] = str[len-i];
        str[len-i] = c;
    }
    return new String(str);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/01/razvorot-strochki/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Сортировка массива из единиц и двоек</title>
		<link>http://caphome.com/2009/01/sortirovka-massiva-iz-edinic-i-dvoek/</link>
		<comments>http://caphome.com/2009/01/sortirovka-massiva-iz-edinic-i-dvoek/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 07:38:48 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[построение команды]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=80</guid>
		<description><![CDATA[Эта задачка применялась, как минимум, на собеседованиях в Sun Microsystems. Задачка миленькая, несложная, на сообразительность. Задача Отсортировать массив, состоящий только из единиц и двоек. Решения Решений, как у большинства задачек много. Приведем некоторые. Сложить все  элементы массива и вычесть из суммы длину массива. Результатом будет количество двоек в массиве. Далее массив заливается нужным количеством последовательных [...]]]></description>
			<content:encoded><![CDATA[<p>Эта задачка применялась, как минимум, на собеседованиях в Sun Microsystems. Задачка миленькая, несложная, на сообразительность.</p>
<h3>Задача</h3>
<p>Отсортировать массив, состоящий только из единиц и двоек.</p>
<h3>Решения</h3>
<p>Решений, как у большинства задачек много. Приведем некоторые.</p>
<ol>
<li>Сложить все  элементы массива и вычесть из суммы длину массива. Результатом будет количество двоек в массиве. Далее массив заливается нужным количеством последовательных двоек и единиц.</li>
<li>Посчитать количество единиц и двоек, пройдя по массиву. Далее опять заливаем массив нужным количеством двоек и единиц.</li>
<li>Запускаем в цикле два счетчика, сближающихся с противоположных концов массива. Меняем местами соответствующие значения, по необходимости.</li>
</ol>
<p>В третьем варианте что-то вроде:</p>
<pre>public void sort12(int []array) {
    int i = 0;
    int j = array.length-1;
    for (; i&lt;j; i++) {
        // Сортируем по возрастанию
        if (array[i] == 2) {
            for (; array[j] == 2; j--);
            array[i] = 1;
            array[j] = 2;
            j--;
        }
    }
}</pre>
<p>Первый вариант представляется самым оптимальным, с точки зрения производительности: сравнений нет, все действия с массивом последовательные. В нём как раз проявляется сообразительность <img src='http://caphome.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Второй вариант похуже, но тоже ничего.</p>
<p>Третий вариант видится близким ко второму, на достаточно небольших массивах (влезающих в кэш) и похуже на больших массивах.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/01/sortirovka-massiva-iz-edinic-i-dvoek/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Позвони мне, позвони!</title>
		<link>http://caphome.com/2009/01/pozvoni-mne-pozvoni/</link>
		<comments>http://caphome.com/2009/01/pozvoni-mne-pozvoni/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 22:52:58 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Глупые программистские вопросы]]></category>
		<category><![CDATA[Подбор сотрудников]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[управление]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=49</guid>
		<description><![CDATA[Вот я не понимаю! Почему подавляющее большинство HR&#39;ов или нанимающих менеджеров не звонит и не пишет проинтервьюированному кандидату об отказе, если он не подошел?! Что это? Гипертрофированное чувство собственной важности, корона на мозг давит или просто разгильдяйство? Это ведь так просто! Сделал шаблон вида: &#171;Здравствуйте. &#60;бла-бла-бла&#62; К сожалению, Вы нам не подошли. &#60;бла-бла-бла&#62;. С уважением, [...]]]></description>
			<content:encoded><![CDATA[<p>Вот я не понимаю!</p>
<p>Почему подавляющее большинство HR&#39;ов или нанимающих менеджеров не звонит и не пишет проинтервьюированному кандидату об отказе, если он не подошел?!</p>
<p>Что это? Гипертрофированное чувство собственной важности, корона на мозг давит или просто разгильдяйство?</p>
<p>Это ведь так просто! Сделал шаблон вида: &laquo;Здравствуйте. &lt;бла-бла-бла&gt; К сожалению, Вы нам не подошли. &lt;бла-бла-бла&gt;. С уважением, я&raquo; и отправляешь его. Отправка занимает секунд 10, приблизительно. Зато, если что-то изменится вы сможете спокойно к этому человеку подъехать снова и он не расскажет своим друзьям, что в компании XXX работают одни YYY. А вдруг у него друзья&nbsp;&mdash; мегакрутые специалисты, которые вам край как нужны?</p>
<p>Добрее надо быть к людям и они к вам потянутся!</p>
<p>Работа с людьми, создание  и поддержание имиджа&nbsp;&mdash; это вообще кропотливая работа, состоящая из мелочей. И &laquo;сохранив&raquo; сегодня минуту, поправляя корону и не отправив человеку вежливый отказ, никогда не знаешь чем такая &laquo;экономия&raquo; аукнется завтра.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/01/pozvoni-mne-pozvoni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чем грозит нам Hibernate?</title>
		<link>http://caphome.com/2009/01/chem-grozit-nam-hibernate/</link>
		<comments>http://caphome.com/2009/01/chem-grozit-nam-hibernate/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 16:43:34 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[persistence]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[поиск сотрудников]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>
		<category><![CDATA[управление]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=44</guid>
		<description><![CDATA[Hibernate&#160;&#8212; достаточно популярный пакет для упрощения работы с базой данных. Упрощение достигается путем автоматизации мапинга объектов в базу данных. Таким образом программисту не надо писать SQL запросы, а можно напрямую сохранять и загружать экземпляры классов. Но, как обычно, в каждой бочке  мёда найдётся своя ложка дёгтя. Суть одной из проблем в том, как хранятся и [...]]]></description>
			<content:encoded><![CDATA[<p>Hibernate&nbsp;&mdash; достаточно популярный пакет для упрощения работы с базой данных. Упрощение достигается путем автоматизации мапинга объектов в базу данных. Таким образом программисту не надо писать SQL запросы, а можно напрямую сохранять и загружать экземпляры классов.</p>
<p>Но, как обычно, в каждой бочке  мёда найдётся своя ложка дёгтя. Суть одной из проблем в том, как хранятся и представляются связи между объектами.</p>
<h3>Задача</h3>
<p>Есть две таблицы&nbsp;&mdash; People и Events. Между ними установлена связь &laquo;Многие ко многим&raquo;, т.е. один человек может пойти на много событий и на одно событие пойдет много людей.</p>
<p>В Java, с использованием Hibernate, это будет реализовано следующим образом:</p>
<pre>public class Man {
    private String name;
    private Vector events;
}
public class Event {
    private String name;
    private Vector people;
}</pre>
<h3>Вопросы</h3>
<ol>
<li>Где проблема?</li>
<li>Как бороться?</li>
<li>Для всех ли случаев поможет lazy loading?</li>
</ol>
<h3>Ожидаемые ответы</h3>
<ol>
<li>Проблема в том, что Hibernate будет загружать объект Man (или Event) целиком, включая все события, на которые пойдет человек. События, в свою очередь будут загружать людей, которые будут в них учавствовать. Таким образом, захотев посмотреть имя одного человека, мы имеем шанс загрузить все содержимое базы данных, с соответствующим влиянием на производительность приложения и сервера, объём памяти и загрузку каналов передачи.</li>
<li>Правильный ответ на этот вопрос имеется в третьем вопросе и называется lazy loading. Включение этой опции позволяет загружать связи лишь при первом к ним обращении.</li>
<li>К сожалению, даже lazy loading не решает проблему загрузки ненужных данных до конца. Например, мы хотим добавить одно новое событие к человеку и все остальные события, куда он собирается, нам безразличны. Но в момент добавления события мы обращаемся к вектору, т.е. тут же будут загружены все события. С этой бедой уже так просто не поборешься <img src='http://caphome.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </li>
</ol>
<h3>Что проверяем</h3>
<p>Проверяем задумывается ли человек к чему ведут его действия на более низком уровне. И как у него это получается.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/01/chem-grozit-nam-hibernate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Генератор кода</title>
		<link>http://caphome.com/2009/01/generator-koda/</link>
		<comments>http://caphome.com/2009/01/generator-koda/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 19:36:46 +0000</pubDate>
		<dc:creator>Алексей Петренко</dc:creator>
				<category><![CDATA[Задачки]]></category>
		<category><![CDATA[найм программистов]]></category>
		<category><![CDATA[поиск программистов]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[тесты для программистов]]></category>

		<guid isPermaLink="false">http://caphome.com/?p=34</guid>
		<description><![CDATA[В последнее время, на собеседованиях с новыми кандидатами, мне нравится использовать задачку про генератор кода. Подсмотрел я эту задачку на сайте Яндекса. Задача Существует генератор кода на разных языках, реализованный следующим образом: public class Generator { private final int language; // Language constants public static final int JAVA = 1; public static final int C [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время, на собеседованиях с новыми кандидатами, мне нравится использовать задачку про генератор кода. Подсмотрел я эту задачку на сайте Яндекса.</p>
<h3>Задача</h3>
<p>Существует генератор кода на разных языках, реализованный следующим образом:</p>
<pre>public class Generator {
    private final int language;

    // Language constants
    public static final int JAVA = 1;
    public static final int C = 2;
    public static final int CPP = 3;

    public Generator(int language) {
        this.language = language;
    }

    public void generateIF() {
        switch (language) {
        case JAVA:&lt;Код, генерирующий Java&gt;
            break;
        case C:&lt;Код, генерирующий C&gt;
            break;
        case CPP:&lt;Код, генерирующий C++&gt;
            break;
        }
    public void generateFOR() {
        switch (language) {
        case JAVA:&lt;Код, генерирующий Java&gt;
            break;
        case C:&lt;Код, генерирующий C&gt;
            break;
        case CPP:&lt;Код, генерирующий C++&gt;
            break;
        }
    }&lt;И так далее&gt;
}</pre>
<h3>Вопросы</h3>
<ol>
<li>Что не нравится в коде и почему?</li>
<li>Как изменить?</li>
</ol>
<h3>Ожидаемые ответы</h3>
<ol>
<li> Должна не нравиться повторяемость кусков кода и их влияние на производительность. А так же, трудности с расширением подобной реализации на новые языки.</li>
<li>Необходимо выделить общего предка или интерфейс, который будет определять список методов, для генератора каждого языка. Затем для каждого языка реализовать отдельный класс.</li>
</ol>
<h3>Что проверяем</h3>
<p>Проверяем умение кандидата работать с ООП и способность видеть несовершенство чужого кода.</p>
]]></content:encoded>
			<wfw:commentRss>http://caphome.com/2009/01/generator-koda/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

