Category: it

default

Истории старого пердуна

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

Меня как-то наняли спасать проект с огромной базой кода на С++. Мягкий реалтайм, система управления буровой установкой для горизонтального бурения. Там был странный плавающий баг, который на симуляторе приводил к потере головки, то есть это нельзя было выпускать ни в коем случае. Они к моменту моего прихода искали баг всей командой уже три месяца. Я нашел баг (это было непросто и это оказался наш любимый off by one) исправил его, победно затрубил и запустил симулятор. Через 10 часов потерял головку. Стал искать баг опять. Нашел его снова, неисправленный. Тут Зоркий Глаз начал что-то подозревать и обнаружил 6 (шесть!) копий класса, который отвечал за считывание статуса и подачу команд на управляющую железку. Просто во всех местах где надо было пользоваться API этого класса, им надо было этот API чуть модифицировать и класс просто копировали, называли по-другому, подпиливали API и пользовались.

Кроме того, как выяснилось, железка не умела отвечать сразу нескольким клиентам, поэтому то, что у них все совсем не взорвалось было чистым везением (ну или невезением, взорвалось бы раньше, быстрее бы нашли).
default

Алгоритм найма на работу

Офигеть, 10 месяцев не писал. Тут возник вопрос в ФБ и поскольку там даже свои посты-то с трудом найдешь, что уж говорить о комментариях, то решил написать сюда, ибо вопрос возникает редко, но регулярно.

Как с моей точки зрения правильно нанимать программистов/девопсов на работу:

0. Правильно составить объявление о найме. Сжато и быстро написать bid и ask. Что надо делать (на самом деле, а не всё на свете + еще немножечко) и что за это предлагается. Что делает компания и где лежат грабли (это важнее чем расписывать какая она leading и какие технологии bleeding). Грабли могут быть технологические (адовое легаси например), организационные (адский режим работы например), финансовые (от последнего раунда осталось полгода runway, и следующий раунд зависит как раз от результатов работы) и так далее. Это все равно всплывет, но тогда, когда вы уже потратите кучу времени. Не надо надеяться что вы "продадите" хорошему программисту (то есть человеку, предположительно хорошо умеющему в рациональное мышление) свою компанию. Если он может проигнорировать какие-то грабли - он придет на интервью как минимум. Если не может - то и не сможет, значит и на интервью не придет. С граблями лучше сгущать краски чем приукрашивать, верьте мне, люди.

1. Читаем резюме. Если идет поток треша, мы что-то не то написали в №0, идем обратно туда. Если говна не больше 80% с этим можно работать, но лучше оптимизировать. Я иногда получал практически 100% выход годных (когда натурально хочется позвать всех) но не знаю как это синтезировать искусственно. Быстро валидируем резюме на непротиворечивость (даты, продолжительности, технологии), потом выделяем интересные моменты (технологии, компании, обучение), причем не обязательно интересные для данной позиции, а просто знакомые лично вам, то есть что можно обсудить на интервью. Резюме русские писать не умеют, причем как не умели 20 лет назад, так и сейчас не умеют. Немного лучше научились оформлять разве что. Впрочем лучше пусть дальше так не умеют как скажем индусы умеют, когда резюме читать вообще смысла не имеет. Обратите внимание на оформление, кстати, если вы просили в ворде, а прислали - пдф, это звоночек. Если вы просили на английском, а прислали на русском или наоборот - это тоже звоночек. Это на самом деле важно, как показывает практика.

2. Если имеет смысл поговорить - договариваемся о телефонном интервью на полчаса-час, не больше. Сначала рассказываем о себе, о компании, плюсы-минусы и задаем уточняющие вопросы по плюсам-минусам, типа подходит ли вам расположение офиса или подходит ли вам удаленная работа или такой график, не важно. Предупреждаем про тестовое задание и выясняем есть ли у человека время на него и если да, то сколько. На этом этапе важно просто разговорить человека, это разминка. Ну и люди ценят что вы начинаете с себя а не тупого "расскажите о себе". Потом собственно переходим к "расскажите о себе" и просим человека изложить свой профессиональный опыт (если резюме очень длинное, то спрашиваем с какой-то точки, а про более раннее можно просто спросить "как же ты дошел до жизни такой, что стал программистом"). По мере изложения опыта читаем резюме и задаем вопросы по отмеченным местам. Поскольку эти области вам хорошо известны, то задаем вопросы, которые невозможно вычитать в интернете, если точно не знать что спросить. Про компании, технологии, языки программирования, совершенно безотносительно требуемого на данной позиции набора, ваша задача - в легком разговорном жанре выяснить степень владения "предметом" вообще, а также провалидировать резюме.

3. Задаем несколько вопросов как в №2, но по теме данной позиции и копаем вглубь пока лопата не зазвенит. Причем годятся любые вопросы, ответы на которые практически невозможно запомнить всухую. "А вы помните в каком релизе там фундепы внедрили?" Правильный ответ "что-то типа NNN или около того, но потом пришлось обратно всем откатываться, потому что оказывается что фундепы сломали тайпчекер, как оно тесты-то прошло, бгггг". Очень хорошо идут вопросы из резюме кандидата (из №2) но в приложении к технологиям из №3: "а вот вы рассказывали что вы делали ХХХ, а как бы вы сделали тоже самое, но уже с использованием YYY, которое нам нужно?". Тут люди очень часто заводятся и начинают увлеченно "проектировать" ибо чувствуют себя в своей тарелке. Вообще говоря, на этом месте иногда можно и закончить и послать человеку оффер (ну или наоборот), если повезет.
В завершение, если человек декларирует знание английского, то переходим на него и пару технических вопросов обсуждаем на английском.

4. Даем тестовое задание. Лучше иметь несколько на выбор, если ваше "основное" слишком длинное. Но в любом случае тестовое задание не должно быть больше 8 часов при требуемом вами уровне квалификации, а лучше меньше. Идеально - 4-5. Если есть возможность - не говорить кандидату на этапе №2 сколько именно вы рассчитываете займет задание. Просто отделайтесь "небольшое" и попросите его на этапе №5 оценить время самому.
Я стараюсь иметь бюджет на оплату тестовых заданий и плачу по разумной рыночной ставке, чтобы человеку было не обидно и замечено что люди даже за небольшие деньги гораздо внимательнее относятся к выполнению, включается психологический паттерн "работа". Задание даю так, чтобы его можно было сделать за отведенное время аккуратно, без висящих соплей. Стараюсь давать из существующего проекта, либо что-то новое (поскольку заплачено, то не стыдно и использовать будет) либо уже существующее (зато есть reference implementation и можно отдать на глубокое ревью тому, кто писал оригинал). Задание должно быть вырезано из существующего проекта аккуратно и не требовать экзотического тулинга и строго заданных ОС. Человек будет делать задание из дома, а там у него может не быть рабочего окружения, а просто игровой компутер с виндой. Можно дать доступ на EC2 инстанс, где уже все готовое установлено, а потом его просто убить.
Я читал много завываний что вырезать из существующего проекта небольшое изолированное задание очень тяжело, но что-то мне подсказывает что это у людей проблемы с проектированием и управлением проектом. У меня таких проблем никогда не было.
Задача должна быть реальная, делать что-то полезное, а не сортировать массив пузырьком, прости господи.

5. Ревью задания с кандидатом. Почему вы сделали так, а не иначе, что бы вы сделали если бы было больше времени, покрытие тестами, точки интеграции в "большой" проект, то есть обычная рабочая рутина. Посмотреть как человек вертится, как и что предлагает, насколько хорошо оценивает риски, и т.д. Желательно конечно убедиться что задание компилируется, работает и делает что обещано :-)

6. Мой любимый вопрос: "представьте себе что я вам дал миллион долларов и вы можете его потратить на что угодно в области вычислительной техники, что вы сделаете?". Это не решающий вопрос, но много интересного может рассказать о кандидате. А может и нет, но обычно впендюриваю. Бывало что по результатам я усердно гуглил потом и мне раскрывались разные бездны.

7. Никаких, упаси господь, задач из области компутер саейнса, вы программистов нанимаете, а не компутерных сайентистов. Если человек хорошо знает алгебру, логику, теорию категорий, графов, игр - это будет написано у него в резюме.
Никакого программирования в реальном времени на собеседовании, вообще кандидат должен при таком предложении вежливо распрощаться, это бред сивой кобылы (ну, кроме случаев когда надо в боевом режиме так программировать и это соответственно оплачивается). Никакого тестирования "стрессоустойчивости" при этом не происходит, ну что за бред.
Можно порисовать диаграммки на доске если интервью личное.
Если у вас так уж пригорает на тему "формального тестирования", то разработайте квиз с парой десятков вопросов системы "выбор из 4-5 вариантов". Но это пустая трата времени.
Никаких вопросов про пол, ориентацию, семейное положение, возраст, детей, etc. Это правонарушение и даже если вы нанимаете в какую-нибудь условную Руанду, где это не так, все равно ведите себя цивилизованно. Допустимо задать вопрос про командировки, если это требуется.

Нигде не написано в какой момент надо пригласить в офис посмотреть в глаза и поговорить. Это зависит от массы факторов, удаленности, бюджета, etc. Чем ближе к концу тем ниже риск, очевидно. Само очное интервью - это что-то из №2 и №3, но с бОльшим числом людей. Я нанимаю как с очным интервью, так и чисто удаленно и никакой разницы по качеству набора не вижу.

Набираю я хорошо, это по-моему, лучшее что я научился делать за 25 лет в этом вашем IT. К сожалению, я надеялся что научусь большему.

Пост наверное через некоторое время уберу во френдз-онли ибо я тут под своим настоящим именем и незачем давать готовую инструкцию "по прохождению интервью".
default

(no subject)

Читая обсуждение http://ivan-gandhi.livejournal.com/3329246.html и ответы на мой коммент, я вдруг понял почему так тяжело идет. У меня нет никаких проблем барабанить на Erlang'е например, а Purescript, Elm или их идейный отэц Haskell (ну или ML) идет с гораздо большим трудом.

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

Потом как-то программирование на ассемблере превратилось в программирование на С, но компиляторы для этих микропроцессоров были таковы, что регулярно генерировали последовательности типа

mov bx, ax
mov dx, ax
mov bx, dx
mov ax, bx

Потому что так у него оптимизатор работает, видите ли. Ну или еще почему. И надо было компилировать в ассемблерный листинг, читать его и руками чистить от этого мусора, потому что иначе в ПЗУ не лезло.

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

В результате я всегда когда программирую или читаю программу, симулирую в голове стековую-регистровую машину и "исполняю" на ней программу. И какие-нибудь list comprehensions, лямбды или хвостовые рекурсии отлично на такой голове исполняются. А вот стрелки и монады - почему-то нет.

Нужна книжка или статья "Функциональное программирование для недохардверных недоинженеров". Реквестирую у мироздания.
default

Need Mercurial guru

На короткий консалтинговый проект нужен subj. У нас есть заказчик, который нанял индусов, которые запороли репозиторий, создав в нем 100500 бранчей, кучу брошенных на полдороги мерджей и whatnot. Надо взять это в руки, починить, привести обратно в мерджащееся состояние, выяснить какие бранчи таки нужны, какие нет, и т.д. Почасовая оплата (you name the price). Расположение неважно, важна квалификация. Код в репозитории на яве. Классический такой кровавый энтерпрайз.

Если у вас в багаже есть ява (томкат, джбосс, вебсфера), питон, линукс и желание работать в девопсе (собственно продукт моего подразделения - это готовые CI/CD окружения для разработки страхового энтерпрайза на яве) то возможно долговременное сотрудничество. $2500-$3500/mo, либо в офисе (Питер, Минск, Одесса, Рига) либо удаленно. Трактор потенциально возможен. Командировки в вышеперечисленные офисы и штабквартиру в СФ.

Резюме и почасовую ставку - kika АТ kikap ДОТ com
default

Kiddie labor

http://kika.livejournal.com/32433.html?thread=188849#t188849

Вопрос простой - а где у нас в ЗАО РФ нынче учат на программистов? В смысле учат, а не "учат", то есть не читают лекции про эльбарроуз, а откуда выходят неплохие хакеры, способные аргументированно обсуждать стиль написания ядра Линукса и BSD. Ну или еще что-либо такое же высокодуховное и бесполезное.
  • Current Music
    Modern Talking - Win the Race
  • Tags
default

Я забыл как программировать?

pzz написал код, который приводит в изумление компилятор MS VS 2005 в режиме С, но отлично потребляется им же в режиме C++ и gcc в любом режиме.
Выжимка этого кода:
typedef union { char a; } u;
typedef struct{ u a1; } s;
void foo(u *up) { s s1 = { *up }; }

Приводит к
error C2440: 'initializing' : cannot convert from 'u' to 'char'

Кротофф, скажи что я лох?
default

Вышел новый Visual Assist

Для тех кто не в курсе, это такая довольно глючная и дорогая как самолет фигулина, которая из MS Visual Studio делает бледное подобие Эклипса или IDEA.
Не прошло и пяти лет как НебитыеПомидоры изобрели рефакторинг. Сижу, читаю про этот рефакторинг, и в конце там есть абзац про то что VAX нынче умеет автоматично документировать методы. То есть по нажатию кнопули генерит что-то типа

Я вот второй день пытаюсь понять - а зачем это? Вот что такого написано в первых 10-ти строчках, чего не написано в 11-ой? Разве что квалификатор public. Вообще, люди, которые называют это "документированием кода" и придумали такую "документацию", они как, головным мозгом оснащены или все же конструкцией не предусмотрено? Типа как поворотники у Волги?

UPD: Имеет место быть непонимание. Я знаю зачем нужна документация хотя бы на "экспортируемый" код и вообще знаю зачем нужно документировать. И я сам пользуюсь частично автоматично сгенерированной документацией (Qt). Я не это спрашивал. Я спрашивал зачем нужна конкретно вот эта вот (ну или аналогичная) хуйня, которую генерирует VAX в виде якобы заготовки документации. Информационно он мог бы генерировать /* */ и это было бы ровно тоже самое.
default

One piece of experience

Человек захотел заплатить мне денег и у него были Яндекс.Деньги. У меня тоже оказался аккаунт, 270 рублей на нем и даже живая программа "Интернет.Кошелек". Ну я ее запустил, программа сказала что у меня 272 рубля с копейками, я скопировал из нее реквизиты (чуток погеморроившись) и послал человеку. Человек деньги перевел и тут я выяснил что программа-то ни фига не работает. Эти 272 рубля с копейками - чистая фикцыя, это закешированные локально данные. А связаться с сервером программа не может. Ну фигня дело-то, я пользовался года полтора назад последний раз, скачал новую версию, проапргейдил, и ноль на массу.... Проапргейдил еще раз, ноль на массу, поставил старую отдельно, новую отдельно. Новая отдельно работает. Скопировал в нее часть данных из старой, не трогая информацию о банке - не работает, видимо зашифровано по разному. Нажимаю кнопку "Обновить информацию о банке" - ничего не происходит.

Collapse )
  • Current Mood
    annoyed annoyed
default

(no subject)

Написал за сегодня дикую груду кода, причем вполне на вид даже приличного. Написал, решил скомпилировать, высыпалась куча всяких противных ошибок, типа забытых инклюдов, лишних точек, пропавших двоеточий и так далее. Посмотрел, загрустил и решил написать test harness вместо исправления ошибок. Написал. Понял что таки надо хоть как-то скомпилировать, пошел исправлять синтаксические ошибки. Исправил, скомпилировал. Запустил тесты, все сработало. Какова реакция настоящего программиста на такое поведение тестов? Правильно, пошел искать ошибку в тестах.

Не нашел...
  • Current Mood
    confused confused