Monday, August 8th, 2016 02:01
Никогда не пишите личный дневник для себя. Пишите его для тех, кто клялся, что никогда не будет его читать.
Житейская мудрость.

Раньше, когда я был молодым и глупым программистом, я не понимал, почему работодатели спрашивают кандидата прежде всего о наличии подтверждённого опыта работы. А не о том, чем кандидат увлекается и что он, скорее всего, знает лучше, чем собственную работу. Ведь, казалось бы, в хобби, которое человеку априори интересно, он будет разбираться намного лучше, чем в работе, которая может быть интересной, а может и не быть. Неужели работодателю не нужен человек, который сам стал специалистом в нужной работодателю области?

Пример, основанный на художественной обработке реальных фактов: человек по восемь часов в день пишет скрипты для автоматизации тестирования, и получает за это зарплату. Но он мечтает портировать KDE2 под FreeBSD, и ещё по восемь часов в день, уже дома, тычется то в KDE2, то в FreeBSD, то в библиотеки Qt, пытаясь собрать одно с помощью второго, а второе — с помощью третьего.

Шутки шутками, но кухонный тостер под управлением операционной системы из семейства BSD — правда, не FreeBSD, а NetBSD — действительно существовал. KDE2 на этой версии тостера не запускали, исключительно по причине отсутствия средства графического вывода.

Человек искренне увлечён своим бессмысленным занятием, он назубок выдаст параметры configure для всех упомянутых пакетов, он достиг просветления и отрастил дзен толщиной с телеграфный столб, он может скомпилировать в FreeBSD не то что неправильно написанный код, но даже код, не написанный вообще, а KDE2 у него работает даже на тостере. То есть у работника есть хобби, он знает материал, он в своём хобби очень хорошо разбирается, и считает себя вправе претендовать на должность разработчика в фирме, специализирующейся на разработке с помощью Qt.

Возьмут ли его в эту фирму? При том, что он правда очень неплохой специалист и знает тему?

Возможно. Но есть отличная от нуля вероятность, что его на эту работу не возьмут. Почему?

Мне понадобилось добраться до самостоятельно проводимых собеседований, чтобы понять: именно из-за отсутствия опыта работы с этими же вещами в большой фирме.

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

Поясню на ещё одном примере:

Бадминтон — это не просто беготня по полю с ракетками. Это состязание примерно на уровне шахмат, или даже шахбокса. На каждый удар противника есть одно или несколько ответных шаблонных движений, которые позволяют с минимальными усилиями отбиться или перейти в атаку; результат игры зависит прежде всего от способности игрока думать: надо оценить действия противника и выбрать подходящий шаблон, отвечающий твоей стратегии. Потом надо ещё филигранно выбранный шаблон выполнить, но это уже дело тренировки. Главное — знание шаблонов, применяемых противником, умение их распознать и способность просчитать стратегию поединка хотя бы на два-три удара вперёд. И делать это надо быстро: скорость воланчика достигает 493 км/ч.

Когда я активно занимался бадминтоном, мой тренер Леонид Пугач (сейчас он тренирует юношескую сборную Израиля) рассказывал мне о некоем прибалте, который играл, абсолютно наплевав на технику. Он достиг впечатляющих результатов и был одним из лучших игроков в СССР. Он не знал ни единого шаблона, и ему совершенно не хотелось заниматься теорией. Вместо того, чтобы играть по шаблонам, экономя силы, этот прибалт бегал по корту. О, как он бегал! Он мог заткнуть за пояс любого кенийца. Вся его игра сводилась к тому, чтобы добежать до места, где будет пролетать воланчик, и шлёпнуть по нему ракеткой так, чтобы он перелетел через центральную сетку. Пока соперник, ожидавший хоть каких-то шаблонных решений, которые можно было бы просчитать и на основании этого просчёта создать какую-то стратегию, чинил собственный порванный шаблон, воланчик уже падал, и прибалт зарабатывал очередное очко.

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

Так вот, возвращаясь к программированию, — я знаю очень немногих программистов, которые при решении собственных задач потрудились бы составить вменяемое техническое задание, написать список требований к продукту, нарисовать хотя бы несколько UML-диаграмм, составить use cases, спланировать разбивку решения на модули и классы. Никто не составляет план будущих релизов со списком характеристик, которые будут включены в ту или иную версию. Никто не думает о том, чтобы сделать полное, экстенсивное тестирование для программы, написанной дома и в рамках собственного хобби; часто у энтузиаста нет даже оборудования, чтобы устроить тестирование своей разработки на разных аппаратных базах или запустить стресс-тестирование своего проекта. Я не говорю про полноценные проверки конечного продукта, на которые полагается выделять столько же времени, сколько занимает разработка; я говорю хотя бы про формальную проверку соответствия результата списку требований. Но я ведь уже упомянул, что мало кто пишет списки требований?.. Никто не проверяет эргономику пользовательского интерфейса, никто не следит за скоростью работы программы. О чём там можно говорить, если лишь в самое последнее время люди массово начали пользоваться системами контроля версий для собственных домашних проектов! А ведь открыть аккаунт на sourceforge или на github проще, чем С++ выучить!

Когда перед тобой сидит явно неглупый парень и с энтузиазмом рассказывает, какую шикарную прогу он написал на каникулах, и ты видишь, что он в самом деле разбирается в вопросе, и что его программа в самом деле должна работать, но на вопрос: «Какой методологии разработки вы придерживались во время работы над проектом? Выбрали ли вы каскадную модель, итеративную разработку или спиральную? В чём преимущество выбранной вами методологии перед альтернативами?» — он открывает рот и начинает мямлить, что не рассматривал вопрос с такой точки зрения, на лицо так и просится фейспалм. И ты чувствуешь себя пророком, потому что видишь так же ясно, как Божий день, что сейчас его программа работает, но завтра он добавит в неё ещё модуль, послезавтра — ещё два, на следующей неделе уберёт что-то, а через месяц ему самому будет проще переписать программу с нуля, чем пытаться в ней разобраться. А что будет, если пустить его в проект, в который ты набираешь людей? Проект и без того состоит из костылей, сложенных в виде ажурной хрупкой конструкции и держащихся исключительно на честном слове вице-президента по разработкам. Этот бегемот, умеющий бегать с ракеткой в руках и знающий, что бе́гом он умеет достигать результатов быстро, попробует применить свои отточенные навыки в ажурном коде проекта, и в результате плоды его трудов твои сотрудники будут разгребать годами.

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

У этой мысли есть далеко идущие последствия.

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

Именно поэтому все операционные системы, мобильные или десктопные, пытаются ввести систему сертификации программ на соответствие неким стандартам. Чтобы программу приняли в Apple AppStore, она должна пройти серию проверок, в том числе и на соответствие правилам внешнего оформления интерфейса. Эти проверки ставят какую-то минимальную планку, задают высоту, отсеивающую однозначно неудачные (но при этом вполне работающие!) программы. К сожалению, Linux в силу собственной идеологии не может заставить пользователей устанавливать только сертифицированные программы, поэтому средняя поделка под Linux пишется студентом, решающим свою частную задачу, без серьёзного тестирования, и в результате даёт абсолютно неприемлемый результат, если пользователь отклоняется от линии ожидаемого поведения.

Вы думаете, я исключение из этого правила? Да ни в одном глазу. Я тоже сначала сажусь программировать, а только потом думаю, что я, собственно, собираюсь написать. Это только в последнее время я начал заставлять себя работать над домашними проектами так, как если бы я был на работе: техническое задание, список требований, список способностей, которые могут удовлетворить эти требования, дизайн-документы двух или трёх уровней, use cases, UML, разбивка на модули и на классы, итеративная методология разработки, модель V, список тестов, стресс-тесты и регрессионное тестирование, ну и список багов с исправлениями в конце. И мне до сих пор приходится силой удерживать себя над документацией, когда хочется вот прямо сейчас начать писать код. В результате на разработку проекта, которую, по хорошему, можно было бы закончить за неделю, тратится несколько месяцев, зато я буду уверен: результат можно выпускать в свет и гордиться конечным продуктом.

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

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

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

Sunday, August 7th, 2016 23:42 (UTC)
Спасибо за вправление мозгов. До меня такое не доходило.
Уволоку-ка в свою копилочку...
Monday, August 8th, 2016 04:39 (UTC)
Отлично подмечено!
тоже утащу.
Monday, August 8th, 2016 19:30 (UTC)

Приятно, блин :) Мои мысли растаскивают :)

Monday, August 8th, 2016 19:29 (UTC)

На здоровье :)

Monday, August 8th, 2016 00:11 (UTC)
Так вот что имел в виду Семёнов, когда писал характеристику Штирлицу "Отличный спортсмен: чемпион Берлина по теннису.". :)
Monday, August 8th, 2016 19:29 (UTC)

Это означало, что у Штирлица отличный удар правой :)

Monday, August 8th, 2016 19:32 (UTC)
А я подумал на отличного стратега. :) Хотя, про шахматы в книжке тоже было. :)
Monday, August 8th, 2016 01:49 (UTC)
Ты говоришь какие-то странные вещи.
Мой опыт чуть ли не ровно наоборот.

И мои, и чужие код — ровное аккуратное творение, подразумевающее модификацию.
Однажды я уволилась с работы и привела на своё место человека, который спустя месяцы и годы звонил мне и восторженно кричал "спасибо!!", потому что ему поставили задачу, он открыл мой код, а там всё под эту совершенно новую задачу оказалось почему-то предусмотрено.

И напротив, творения больших фирм это страшный сон. Начиная с виндовз (онетонетобожемой) и заканчивая знаменитым 1С, чья техподдержка Самого Высокого Уровня мне такое несла, что в приличном обществе повторить неловко.

Боюсь, здесь у тебя классическое "каждый судит по себе", и оно, классически, не очень совпадает с реальностью. ;-)
Monday, August 8th, 2016 11:14 (UTC)
Почитала комментарии; последний абзац про "не очень совпадает с реальностью", кажется, был таки ошибочным.
Monday, August 8th, 2016 19:29 (UTC)

ЧТД :)

Monday, August 8th, 2016 19:29 (UTC)

Возможно, ты — то самое исключение, которое подтверждает правило. :)

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

Monday, August 8th, 2016 04:21 (UTC)
Я с тобой согласна. проблема в том, где ж его этого опыта в большой фирме взять, если, допустим, ты устраиваешься на свою первую работу? (;
Monday, August 8th, 2016 19:27 (UTC)

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

Monday, August 8th, 2016 05:12 (UTC)
Интересно. Спасибо.
Но, мне кажется, Вы не правильно прилагаете человека к месту. На этой неделе, я уже второй раз нескромно привожу себя в пример...
Я не пишу программу - я нахожу невероятные решения. К примеру, нужно из программы "достать" драйвер сканера или наладить асинхронный факс-сервер или... Для этого нужны как раз такие способности волка-одиночки. Самое тяжёлое в моей работе - я знаю что если не нахожу решения некому мне помочь.
Потом другие берут этот код и, по правилам, которые я терпеть не могу вставляют его в программу.
Monday, August 8th, 2016 19:35 (UTC)
Во время подобной работы по нескольку раз за час считаешь себя гением и последним тупицей. :)
Monday, August 8th, 2016 19:46 (UTC)

Это не взаимоисключающие характеристики :)

Tuesday, August 9th, 2016 04:33 (UTC)
Именно так :)
Monday, August 8th, 2016 19:41 (UTC)

Вы — уникальный специалист, которых почти нет и скоро совсем не будет :)

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

Я знаю лично нескольких гениальных хакеров-одиночек, работающих в больших фирмах. Но они крайне редко трудятся в составе единой команды, в основном выполняя "spikes" или выполняя работу SWAT в проектах.

Tuesday, August 9th, 2016 04:35 (UTC)
Нарвался на комплимент :) Рад, что мы воспринимаем это с достаточной долей юмора :)
В общем, как всегда с Вами согласен.
Monday, August 8th, 2016 06:53 (UTC)
для себя всегда можно допустить какие-то огрехи с мыслью: "потом переделаю" или "и так сойдет, оно не мешается". А со временем забывается и в один момент сидишь и пытаешься понять, что же там такого наворотила и как это работает?)
Monday, August 8th, 2016 19:45 (UTC)

Я уже написал Паше внизу: весь вопрос в том, кто ставит задачу и как контролирует её выполнение. Если контроль возлагается на себя самого, то "тяп-ляп" — это хороший результат :)

Monday, August 8th, 2016 07:51 (UTC)
Хорошая статья, спасибо! Муж у меня ux/ui, сейчас для удовольствия начал изучать Apple swift, отправила ему.
Monday, August 8th, 2016 19:44 (UTC)

На здоровье :)

Monday, August 8th, 2016 07:57 (UTC)
1. Порвал эпиграф
2. Для себя - точно "и так сойдет", очень знакомо :)))
Monday, August 8th, 2016 19:44 (UTC)

Я вообще стараюсь выбирать максимально жизненные эпиграфы:)

Monday, August 8th, 2016 08:40 (UTC)
Срезонировало с моей текущей ситуацией и помогло сложить мысли в кучку)). Спасибо!
Monday, August 8th, 2016 19:26 (UTC)

На здоровье :)

Monday, August 8th, 2016 12:04 (UTC)
Просьба не считать за "сперва добейся", но вот вопрос: расскажи, есть ли какие-то написанные тобой в одиночку (или преимущественно в одиночку) программы, которые бы сгодились рядовым пользователям, не упоротым энтузиастам, а вот обычным пк-юзерам?
Monday, August 8th, 2016 19:25 (UTC)

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

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

В 99-м я познакомился с BeOS и выложил несколько программ на BeBits. Пользовались ими или нет, не знаю, но их скачивали, и на баги не жаловались. Просмотрщик картинок, спирограф, шашки, алгебраическая программа, ещё какая-то мелочёвка.

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

Tuesday, August 9th, 2016 12:39 (UTC)
Ничоси. да ты прям как Стив Возняк, который тоже с телефонными коробочками возился :)
Tuesday, August 9th, 2016 14:38 (UTC)
Если бы я был, как Возняк, я бы уже основал собственный Apple :)
Monday, August 8th, 2016 14:31 (UTC)
Подумал что ты довольно неплохо описал разницу между моим внутренним любителем и профессионалом - как любитель я умеренно неплохо рисую, но боже упаси меня взяться за какой нибудь прожект, который меня внутренне не возбуждает, а как профи я могу взяться дизайнерить для кого угодно рекламу чего угодно - от листовок-стриптиз клубов до мультфильмов, пропагандирующих новые банковские продукты.
Ну, правда, своими любительскими картинками меня хвастаться во всяких соц-сетях тянет, а професионально сделаными модулями в прессу - нет.
Monday, August 8th, 2016 19:42 (UTC)

Вся разница в том, кто ставит тебе цель и контролирует качество выполнения.

Monday, August 8th, 2016 20:54 (UTC)
знаю людей совсем и окончательно бросивших рисовать благодаря прекрасным людям, ставящим цель и контролирующим качество выполнения. Довели.
Monday, August 8th, 2016 21:32 (UTC)

А никто и не говорит, что работа в команде — это для слабых духом ;)

Monday, August 8th, 2016 22:00 (UTC)
Wednesday, August 10th, 2016 03:30 (UTC)
Напомнило замечательную фразу: "Забудь дедукцию, забудь индукцию, здесь ты будешь давать продукцию", в шутку сказанную на заре карьеры кем-то.
Вообще описанная фигня легко (при условии что человек не упертый баран) лечится. Даешь такому крутому самсебережиссеру чей-то код, где афтар через 5 минут не помнит что и зачем было сделанно, ставишь творческую задачу... Через две недельки ударов головой товарисч становится ярым приверженцем методологий и комментариев и готов убить адептов "quick and dirty solutions".
Есть, конечно, мазохисты, которым нравится сам процесс, но большинство абсолютно вменяемы :) и больше не хотят повторения.
Wednesday, August 10th, 2016 20:47 (UTC)
Ну, я примерно таким способом и переучился 🤓
Wednesday, August 10th, 2016 20:50 (UTC)
Та же херня ...
Saturday, August 13th, 2016 22:48 (UTC)
А ведь я тоже на это натыкалась в чисто бытовом смысле. Двоюродный брат, взявшийся помочь безвозмездно с ремонтом, так изгваздал пол в коридоре, что неприятно было уже дверь в квартиру открывать, не то что ходить по нему. "А что такого, это же пол!" Принцип действий был тот же, как для себя. Хотя, когда я помогала лучшей подруге писать диплом "как для себя", она чуть ли аплодисменты сорвала.
Sunday, August 14th, 2016 09:13 (UTC)
У разных людей понятие "для себя" очень сильно различается. И чаще "для себя" будет хуже, чем "для других".
Tuesday, August 16th, 2016 04:03 (UTC)
Внезапно результат надёжный, повторяемый и документированный лучше, чем результат гениальный, но уникальный.
И что характерно, верно это во всех случаях, не только в программизме.
Tuesday, August 16th, 2016 13:15 (UTC)
Да, неожиданный результат :)

Это, кстати, объясняет, почему я предпочитаю макдоналдсовские гамбургеры ресторанным антрекотам. Потому что макдоналдсовский гамбургер даёт стабильно надёжный и хороший результат, раз уж в его приготовлении человек участвует только на стадиях "положить в машину" и "вынуть из машины". Тогда как испортить ресторанный антрекот повар может просто и легко. Согласен, часто антрекот вкуснее, но гамбургер надёжен и стабилен.
Edited Aug. 16th, 2016 13:17 (UTC)
Wednesday, August 17th, 2016 01:55 (UTC)
Это вообще основа успеха современной цивилизации. Надо не лучшее, надо даже не хорошее, надо чтобы оно могло быть у всех кому надо.