среда, 24 апреля 2013 г.

А есть ли кризис ИТ-кадров в Ижевске?


Помнится, Олег Вылегжанин любит повторять, что в Ижевске настал кризис ИТ-кадров. Но так ли это на самом деле? Для компаний уровня ЦВТ или, скажем, НПО "Компьютер" - вполне возможно. А вот для менее крутых крупных компаний это зачастую не так. Или так, но они тщательно скрывают это от кандидатов на работу :-)

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

Пример первый и достаточно нетипичный - я. В 2012 году я стал серьезно подумывать о том, чтобы сделать свое хобби основной работой (переквалифицироваться из десктоп-разработчика в мобильного). К тому времени у меня уже был некоторый опыт разработки под Java (ME) и плюс я прокачивал свои скиллы в разработке под Android. Поскольку компания, где я тогда работал, не хотела заниматься разработкой мобильных приложений (предпочитая отдавать все на аутсорсинг или даже партнерам), то оставалось только искать другого работодателя. Поскольку я не был супервыгодным кандидатом (общие технологии разработки у меня, конечно, были прокачены довольно круто, но конкретно в Android я тянул только на джуниора), то начал я довольно осторожно - не с рассылки резюме, а с вопросов: какого уровня кандидаты вообще нужны. Результаты были довольно обескураживающие. Некоторые компании вообще не отвечали на вопросы (как так можно, я, честно говоря, до сих пор не представляю), некоторые открыто заявляли:"Нам нужен джуниор, если вы хотя бы мидл, то пообщаться можно, но все равно мы вам можем предоставить условия только как джуниору". Особенно странно это было слышать от тех компаний, где нет сильной команды способной быстро подтянуть джуниора до своего уровня. А может, я просто чего-то не понимаю в найме людей и теория, что лучше взять готового специалиста, который сможет писать продукт (и писать качественно) с первого рабочего дня, уже безнадежно устарела?

В 2013 я все-таки стал искать работу более активно. Но общение с компаниями только подтверждало выводы от предыдущих наблюдений.

Первая компания сказала: "Мы вас совсем не знаем, поэтому можем считать вас только джуниором и предоставить соответствующие условия". Мне до сих пор интересно, какое слово из моего резюме им неизвестно? Или им неизвестен уровень ПО, которое я разрабатывал (проектировал, руководил разработкой и т.д.)? Если так, то тут помочь я им не могу, оценивать уровень ПО, производимого компанией №1 в регионе, надо все таки уметь самостоятельно.

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

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

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

Второй случай произошел совсем недавно. Я пытался устроить одного своего знакомого, который (в отличие от меня) является сеньором безо всяких скидок и поправок. Причем устроить я его пытался на вакансию, которая максимально точно соответствовала его специализации. Ответ компании (а я общался тоже с хорошо знакомым мне человеком) меня совершенно убил: "Нам надо несколько джуниоров на смешную зарплату". Все, точка. И люди даже не хотят общаться на предмет того, что специалист на текущем месте легко выполняет объем работы за 3-4 джуниоров. Или что у него все скиллы прокачаны больше, чем у текущей команды вместе взятой. Просто не надо и все, хоть головой об стену убейся.

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

PS. Комментировать можно не только здесь, но и на ИжАйТи.

суббота, 20 апреля 2013 г.

Android: пишем свои стили для ActionBarSherlock и HoloEverywhere

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

Генератор стилей

Конечно же, начинать работу со стилями луче не с нуля, а с использования генератора стилей. И тут нас поджидает засада №1: генератор не может отдать пакет, который будет работать одновременно и в Android 2.* + ABS + HE, и в Android 4.*. Связано это с тем, что стили он именует либо в новой нотации ("android:actionBarStyle"), либо в старой ("actionBarStyle"), но не одновременно. Поэтому придется дописывать блок с именами стилей вручную. Ну и не забудьте, конечно, указать теме правильного родителя (например, Holo.Theme.Light.DarkActionBar).

Применение стилей

Дальше мы начинаем применять стили и... HoloEverywhere тупо вылетает на том, что это не его стандартный стиль. Что же делать? Иногда помогает переименование своего стиля в "AppTheme", но если серьезно доработать стиль (чтобы применять его для элементов HE, а не только ABS), то и это не помогает. На помощь приходит решение, подсмотренное на (сюрприз! сюрприз!) Stack Overflow: в design-time выставляем стандартную тему, а первой строкой onCreate(), даже до вызова super пишем:
setTheme(R.style.AppTheme);
И voila, как говорят французы. Все работает!

вторник, 16 апреля 2013 г.

Android: настоящий wrap_content по ширине для ListView

По умолчанию список (ListView) в Android растягивается на всю ширину контейнера. Иногда это бывает не слишком удобно и хочется сделать так, чтобы он занимал ширину строго по содержимому. Как же быть?

Начинающий разработчик воскликнет: "Элементарно! Выставим для ширины значение "wrap_content" и все станет шоколадно!" Я сегодня сказал так же. И даже сделал. Но ничего не сработало.

Как обычно ответ нашелся на stack overflow. Самый популярный ответ говорил, что ничего сделать нельзя. Ведь элементов списка может быть несколько миллионов и на вычисление ширины может уйти несколько часов. Но если промотать ветку до конца, то там обнаружится вполне себе рабочее решение, которое отлично работает для небольшого списка. Единственное, что мне там не понравилось - так это не очень удобные параметры для вызова извне. Поэтому я доработал код до обертки, которую удобно вызывать:
public class ViewUtils {
    private static int getWidestView(Context context, Adapter adapter) {
        int maxWidth = 0;
        View view = null;
        FrameLayout fakeParent = new FrameLayout(context);
        for (int i = 0, count = adapter.getCount(); i < count; i++) {
            view = adapter.getView(i, view, fakeParent);
            view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
            int width = view.getMeasuredWidth();
            if (width > maxWidth) {
                maxWidth = width;
            }
        }
        return maxWidth;
    }

    public static void setListViewWidthByContent(ListView listView) {
        listView.getLayoutParams().width = (int) (getWidestView(listView.getContext(),
                listView.getAdapter()) * 1.05);
    }
}

суббота, 6 апреля 2013 г.

Как мы не стали чемпионами


6 апреля состоялся первый открытый чемпионат Ижевска по игре "Что? Где? Когда?".

Когда я в первый раз прочитал анонс турнира, то мне захотелось тряхнуть стариной и собрать старый добрый сильный состав команды "НПО Компьютер". Сказано -- сделано. Удалось собрать почти что самый первый состав команды (с которым мы играли на первом этапе Кубка Мира в 2003 году): Анна Тернавская, Артем Старыгин, Василий Бабинцев, Константин Чермак, Андрей Подкин и, капитан команды, Рафаэль Гиззатуллин.

Организация турнира была на высоте. Место проведения: Театр оперы и балета. Спонсор: Ростелеком. Собственно проведение: Ижевский клуб "Что? Где? Когда". К слову сказать, на этом мероприятии раздавала свои визитки конкурирующая организация, клуб "60 секунд", проводящий игры в гриль-баре BBQ.

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

После получения бланков немного удивила вопросная дистанция -- всего 24 вопроса. Мы, конечно, не ждали 75 или даже 90 вопросов, как бывает на иных турнирах, но все же для чемпионата (или более правильно -- кубка) города логично ждать хотя бы 36 вопросов.

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

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

После объявления итогов оказалось, что впереди нас 8 команд, причем лидеры опережают нас на 2 очка (они взяли 11 из 12). Неприятно, но не смертельно.

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

Лидеры же -- напротив, несколько сдали и после 24 вопросов мы делили места с 1 по 4. А это значит, что началась перестрелка из 3 вопросов.

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

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

Третий вопрос перестрелки мы слили, имея правильную версию на столе. Впрочем, как оказалось позже, это ни на что не повлияло бы. При равенстве баллов места между командами распределялись согласно рейтинга взятых ими вопросов (у вопроса тем больше рейтинг, чем меньше команд его взяло). Мы по такому показателю оказались на чистом втором месте, пропустив вперед только команду "Habemus Papam".

В качестве приза мы получили по "электронной книге" (по сути это мини-планшет с резистивным экраном) Ritmix на каждого игрока, одну грамоту и один сертификат на бесплатную игру в Dozor.

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