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

Вариант для C/C++. Увлеченно используем арифметику указателей.

char* reverse(char *s) {
    char *s0, *s1;

    for (s1 = s; *(s1) != '\0'; s1++);
    s1--;
    for (s0 = s; s0 < s1; s0++ && s1--) {
        char c = *(s0);
        *(s0) = *(s1);
        *(s1) = c;
    }
    return s;
}

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

  • фактически первый цикл — это вычисление длины строки, т.е. быстрее или медленнее это место, по сравнению со strlen, зависит от реализации strlen. Не знаю что конкретно там обычно написано, спекулировать не буду. Но думается, что что-то типа того и написано 🙂 С другой стороны, если вдруг окажется, что strlen работает быстрее чем просто поиск конца, в цикле, то никто не мешает нам написать конструкцию вида s1 = s+strlen (s). А дальше продолжить делать как тут.
  • Во время самого обмена значениями мы заметно сокращаем количество вычислений, т.к. вместо s+i и s+len-i, на каждом присваивании, мы все указатели вычисляем один раз, на проход.

На Java так красиво не получится. За отсутствием собственно указателей. Но близко к этому будет вариант с запуском навстречу двух счетчиков массива...

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

Постараюсь выделить простые принципы общения, которые помогают мне жить. Вдруг, ещё кому-нибудь пригодятся.

Читать далее

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

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

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

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

Другое дело, что нужно сразу осознавать и обозначить три вещи:

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

Задачка, которую используют на собеседования в Microsoft. Исключительно на сообразительность.

Задача

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

Как, за один поход в первую комнату, узнать какой выключатель включает какую лампочку?

Решение

Включаем первый выключатель и ждем некоторое время, затем выключаем. Включаем еще один выключатель и идём в первую комнату. Лампочка, включаемая вторым выключателем горит. Лампочка, включаемая первым выключателем, теплая.

NB: Очевидно, что задача применима только к лампочкам накаливания.

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

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

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

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

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

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

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

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

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

Задача

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

Решение

Решений опять же много. Предлагаю все решения, где для разворота массива понадобился еще один массив считать незачётом. Можно это требование внести в условие, но, ИМХО, лучше посмотреть не предложит ли вдруг кандидат подобного решения и уже потом ввести это дополнительное ограничение. Единственным оправданием можно считать вопрос о том необходимо ли сохранить исходную строчку. Но это замечание не относится к 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--;
        }
    }
}

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

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

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

Один из самых простых и самых действенных способов мотивировать своего сотрудника — похвала. Как бы банально это не звучало!

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

И это практически ничего не стоит 🙂

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

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

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

И не стесняйтесь хвалить даже за самые мелочи!