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

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

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

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

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

А IT рынок маленький, кто знает где еще придется встретиться 🙂

А конкуренция? Не нужно её бояться, нужно самому развиваться и расти. У тебя ведь тоже есть амбиции и ты не собираешься сидеть на этом месте до пенсии 🙂

Закончился полугодовой период работы в Лаборатории Модульной Автоматизации. Что-то было хорошо, что-то не очень. Познакомился с хорошими людьми. Потренировал свои умения общаться с заказчиком, которые в Intel практически спали. Умения оказались в приличной форме, заказчик остался полностью удовлетворён и даже предложил конторе расширить количество работ 🙂

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

Всем остающимся в ЛМА удачи и успехов!

Следующим местом моей работы будет компания Sun Microsystems. Команда релиз инжиниринга J2ME проектов. В России я буду единственным членом команды, остальные в Штатах, включая менеджера (work from home! 🙂 ).

Это, фактически, возвращение в родные пенаты, т.к. я проработал на эту компанию более 5 лет и многих там знаю. Кроме того, это компания с которой мы конкурировали в проекте Apache Harmony.

Труба зовёт! И впереди меня ждут новые люди, новая работа и новый опыт.

Удачи и успехов мне! 🙂

P.S. Теперь опять придется говорить про Sun исключительно в рамках корпоративной этики 🙂

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

Вскрытие показало, что по запросу «сортировка массива» мой блог находится всего на второй странице результатов. По запросу «построение команды» на первой. И, самое удивительное, по запросу «hibernate» на третей!

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

При этом Яндекс про мой сайт вообще не в курсе. И добавить его не удается, вываливается следующая ошибка: «Сервер недоступен, либо возвращает код статуса http, отличный от 200». При этом сам сервер спокойно работает...

Поизучать чтоли как поисковики работают...

Кстати, что нет, ни одной ссылки — странно, т.к., как минимум, известны ссылки c people.apache.org, linkedin.com  и пары форумов, где у меня адрес в профиле. Может я что-то не так делаю? Искать пробовал запросом вида «link:caphome.com»

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

Хотя меня как-то недавно тоже попросили ее решить 🙂

Задача

Развернуть строку символов. Как вариант, можно попросить развернуть массив.

Решение

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

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

void reverseString(char *str)
{
    int i = 0;
    int len = strlen(str)-1;
    for (; i <= len/2; i++)
    {
        char c = *(str+i);
        *(str+i) = *(str+len-i);
        *(str+len-i) = c;
    }
}

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

String reverseString(String s) {
    char []str = s.toCharArray();
    int len = str.length-1;
    for (int i = 0; i <= len/2; i++) {
        char c = str[i];
        str[i] = str[len-i];
        str[len-i] = c;
    }
    return new String(str);
}

Эта задачка применялась, как минимум, на собеседованиях в Sun Microsystems. Задачка миленькая, несложная, на сообразительность.

Задача

Отсортировать массив, состоящий только из единиц и двоек.

Решения

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

  1. Сложить все  элементы массива и вычесть из суммы длину массива. Результатом будет количество двоек в массиве. Далее массив заливается нужным количеством последовательных двоек и единиц.
  2. Посчитать количество единиц и двоек, пройдя по массиву. Далее опять заливаем массив нужным количеством двоек и единиц.
  3. Запускаем в цикле два счетчика, сближающихся с противоположных концов массива. Меняем местами соответствующие значения, по необходимости.

В третьем варианте что-то вроде:

public void sort12(int []array) {
    int i = 0;
    int j = array.length-1;
    for (; i<j; i++) {
        // Сортируем по возрастанию
        if (array[i] == 2) {
            for (; array[j] == 2; j--);
            array[i] = 1;
            array[j] = 2;
            j--;
        }
    }
}

Первый вариант представляется самым оптимальным, с точки зрения производительности: сравнений нет, все действия с массивом последовательные. В нём как раз проявляется сообразительность 🙂

Второй вариант похуже, но тоже ничего.

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

Как ни странно. И что самое приятное, целой шоколадки отлично хватает на двоих.

chocolate

Детки-конфетки были счастливы и лучились радостью не один час.

Родители берут в руки мочалку и стиральную машинку...

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

imgp5754 Исследователи остались довольны результатом. Родители берут в руки пылесос.

Вот я не понимаю!

Почему подавляющее большинство HR'ов или нанимающих менеджеров не звонит и не пишет проинтервьюированному кандидату об отказе, если он не подошел?!

Что это? Гипертрофированное чувство собственной важности, корона на мозг давит или просто разгильдяйство?

Это ведь так просто! Сделал шаблон вида: «Здравствуйте. <бла-бла-бла> К сожалению, Вы нам не подошли. <бла-бла-бла>. С уважением, я» и отправляешь его. Отправка занимает секунд 10, приблизительно. Зато, если что-то изменится вы сможете спокойно к этому человеку подъехать снова и он не расскажет своим друзьям, что в компании XXX работают одни YYY. А вдруг у него друзья — мегакрутые специалисты, которые вам край как нужны?

Добрее надо быть к людям и они к вам потянутся!

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

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

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

Задача

Есть две таблицы — People и Events. Между ними установлена связь «Многие ко многим», т.е. один человек может пойти на много событий и на одно событие пойдет много людей.

В Java, с использованием Hibernate, это будет реализовано следующим образом:

public class Man {
    private String name;
    private Vector events;
}
public class Event {
    private String name;
    private Vector people;
}

Вопросы

  1. Где проблема?
  2. Как бороться?
  3. Для всех ли случаев поможет lazy loading?

Ожидаемые ответы

  1. Проблема в том, что Hibernate будет загружать объект Man (или Event) целиком, включая все события, на которые пойдет человек. События, в свою очередь будут загружать людей, которые будут в них учавствовать. Таким образом, захотев посмотреть имя одного человека, мы имеем шанс загрузить все содержимое базы данных, с соответствующим влиянием на производительность приложения и сервера, объём памяти и загрузку каналов передачи.
  2. Правильный ответ на этот вопрос имеется в третьем вопросе и называется lazy loading. Включение этой опции позволяет загружать связи лишь при первом к ним обращении.
  3. К сожалению, даже lazy loading не решает проблему загрузки ненужных данных до конца. Например, мы хотим добавить одно новое событие к человеку и все остальные события, куда он собирается, нам безразличны. Но в момент добавления события мы обращаемся к вектору, т.е. тут же будут загружены все события. С этой бедой уже так просто не поборешься 🙁

Что проверяем

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