Каминг-аут

Рыскал в поисках обсуждений «Элиты», нарыскал пару упоминаний от людей, которых знал лично и с которыми пересекался по работе, и чёт вот за живое взяло, потому что сам я на тогда происходившее смотрю иначе, как оказалось.
Есть ментальная ловушка, в которую часто попадают. Если Петя выйдет на площадь и начнёт кричать «все Пети дураки!», обязательно найдутся граждане, решившие напомнить Пете, что он сам Петя и ещё больший дурак. Кто желает, может ещё раз внимательно перечитать то эссе. В нём ни слова, ни символа о том, что я не такой. Более того, именно я и могу с полным правом писать о том, что программисты никудышние раздолбаи, ибо из всех ПОЧТИ 20 ЛЕТ (надо это ещё раз подчеркнуть, вдруг кто не заметил) не продолбал… 5 лет, пожалуй. А почти 15 лет продолбал.

Первые 2 года работы шпарил как проклятый. Первая нормальная официальная работа, да не эникейщиком, но программистом! Джуниор с горящими глазами. Обмазался книгами, журналами, весь лимит «интернета» (100MB в месяц) тратил на поиски информации. Очень плодотворное время, угар всего нового и сложного — C под MacOS.
Потом 8 лет не пойми чего. Задачи под C/C++ у нас закончились, контора в основном работала на Java, ну и я туда же. Уже не раз говорил, что народ в основном собрался на диво толковый, потому по мере сил старались делать всё правильно. Только вот оглядываюсь и вижу, что я эти годы спустил в унитаз.
Ровно та же фигня, которую тут в каждом втором тексте шваброй гоняю — набор знаний под задачи, а не под профессию. Вокруг меня были крутые специалисты, но я на работе молотил тикеты, трындел на кухне, дома пил пиво и занимался какой-то фигнёй, которую уже и не вспомню. Но не развитием.
Т.е. много делал, многому учился, работал не от звонка до звонка, но по 10..12 часов, только вот шёл туда, куда посылали. Ну а что? Всё было неплохо. Работа есть, зарплата есть, на жизнь хватало. Только вот… Ща разделитель поставлю и отдельно объясню.

Когда вы плывёте по течению, незаметно для себя теряете много очень полезного и важного. Это трудно объяснить так, чтобы стало прям ясно и понятно, потому сейчас над каждым словом хоть и десять раз подумаю, но не факт, что удачно выберу.
Во-первых, вы теряете инициативу. Всегда догоняющий, всегда принимающий. Скажем, индустрия переходит на Hibernate. Процесс виден по новостям, по журналам, по первым ласточкам в проектах вокруг. Но Hibernate вы учите тогда, когда попадаете в проект с ним, хоть давно было ясно, что рано или поздно, но это произойдёт. В сравнении с тем, кто подготовился заранее, вы проигрываете.
Во-вторых, вы не генерируете своё, не подаёте AND не реализуете идеи. Не вы обосновали переход на Spring. Не вы внедрили nginx. Не вы разработали общую библиотеку утилит. Оптимизация сборки. Maven вместо Ant. Ant вместо make. Linux вместо Windows. Всё не вы. Вы только исполнитель. Это отупляет.
В-третьих, вам становится пофиг. Год за годом вы автомат по изготовлению CRUD’ов. Локально, быть может, не пофиг. Вы вполне можете сражаться (в том числе уже и с собою) за то, чтобы делать что-то правильно, но с каждым годом это будет сложнее. Эта гниль пофигизма начнёт приводить к нездоровому отношению к фейлам. Ну да, не протестировал. Ну да, уронил сервер. Ну да, тикет не сделан. И что? Ща чай допью и сделаю. Или не сделаю.
В какой-то момент (ближе к тридцатнику) вы смотрите в закат и думаете. Ок, мне скоро 30 лет, я становлюсь игроманом и алкоголиком, мои сверстники опережают меня во всём на два корпуса, я занимаюсь программированием 10 лет, где, блин, результат? Знаете Виталия Харисова? Человек, который сидел за столом справа от меня. Я клепал CRUD’ы, а Виталя однажды встал, вышел и сделал Яндекс.Симферополь на голом месте. Обычно про такое только читаешь, а мне повезло быть свидетелем. Вот чувак. Ты у него тыришь бутерброды (реально вкусные были). У чувака две ноги, две руки и одна голова. Вот тот же чувак. Но внутри 7-этажного здания с толпой разработчиков. Всё, конечно, не так быстро произошло, но.
И вот ты опять сидишь и думаешь. У меня тоже две руки, две ноги и одна голова. Я тоже чувак. Но что со мною не так? Потрясающий по силе мотивирующий пинок. Правда, выводы я сделал лишь частично правильные.

К тому моменту череда кризисов привела к тому, что контора разваливалась. Нам снова задерживали зарплату, половина народа либо разбежалась, либо попала под сокращение, потому начал думать о переходе и я.
Тут-то и первое прямое следствие жизни по течению — с точки зрения внешнего рынка вы… ну, не нолик, но и не так уж хороши. Раз вы делали только то, что прилетало по работе… Раз вы учили только то, что надо было по работе… Вы не умеете и не знаете за рамками работы. Иначе говоря, вы не программист, но «программист ПупкинСофтваре». Таким макаром я классифицировал себя как профессионального CRUD’оклепателя с крайне фиговым знанием всего остального. Вот прям крайне фиговым. Довольно забавный типа специалиста: жру листья красиво и мощно, но только с одного вида эвкалиптов. Повторюсь, бьёт этим по башке тогда, когда эвкалипт падает. До этого момента вы считаете, что всё норм, и яростно огрызаетесь в спорах с теми, кто пытается вас сдвинуть с места.
Короче, я тогда немножко расстроился. Опять, да. Такое красивое резюме, но толку ноль. Разве что лететь в Москву в идентичные ПупкинСофтвари, да там и сдохнуть.

Но тут ангелом возникает снова Харисов (ну, Симферополь маленький город, там за любой угол заверни, или с соседкой поздороваешься, или с Виталей) и предлагает вариант ваять бекенд для фронтендеров на JavaScript. Я на почве прежнего бревнизма покочевряжился, но вовремя одумался. Так начался новый период — период Яндекса.
После вентилятора 2017 года почему-то сложилось мнение, что я не люблю Яндекс, считаю там всех плохими людьми и т.п. Обычная фигня, когда люди читают не то, что написано. Повторю для одарённых альтернативными нейронами: Яндекс меня очень многому научил, в Яндексе я встретил немало крутых людей и крутых специалистов, Яндекс хорошее место работы, если вы согласны с его обычаями и правилами, но такое согласие на любой работе требуется.
Там я сначала завёлся (и в непродолбанный срок включаю год разработки CSSO), но потом снова наступил на те же грабли, только с другой стороны огорода. Из прежнего «опыта» понял, что знаниями накачиваться надо постоянно и на системной основе. Тем и занимался. Но теперь возник человеческий фактор. Внезапно люди разные. Т.к. в Яндексе людей много, этой разности там тоже много. И после некоторой планки твой рост как специалиста невозможен, если у тебя нет наработанной позиции в отношениях с внешним миром.
Я тут не про soft skills. Больше про то, что у вас должен быть осознанный кодекс взаимодействия с людьми. Не аморфное нечто, прыгающее от настроения к настроению, но таки позиция, которая вчера, сегодня и завтра. Пусть даже идиотская и странная, но она должна быть. Без неё вас не включить в прогнозируемые планы, без неё вы тратите время своей жизни на людей, которых стоит обойти, без неё вы сами не можете понять, куда и чего вы хотите.
Так или иначе, но за 6 лет работы в Яндексе я писал на JavaScript, на Java, на Python. И снова обнаружил, что резюме всё красивее, а знаю намного меньше, чем стоило бы. Да и вообще здорово во многом разочаровался, снова сидел в персональном болоте и решил уйти. Три собеседования показали многое…
Знаете, вот хоть и ненавижу собеседования с обеих сторон, но подстёгивают они не хуже гранаты под зад. Все три были организованы отвратно. На всех трёх обнаруживалось, что собеседующим нужен человек не с теми skill’ами, что озвучивались сторонами до встречи. Уже на старте все понимали, что это ненужная встреча, но тянули унизительную резину до конца. Короче, феерично завалил. Но! Как минимум, получил отличное понимание того, как нельзя собеседовать. Как максимум, понял, что опять продолбал годы жизни.
Смотрю в закат (к тому моменту уже московский) и думаю. Так, мне 35 лет, у меня 17 лет опыта работы, но где результат? Я всё так же занимаюсь фигнёй. Всё так же не понимаю, зачем я ею занимаюсь. Всё так же мои знания и умения ооочень спорного уровня и я снова «специалист задачи X», а не специалист. Знаю много, но ничего. И я всё так же плыл по течению, хоть и энергичнее. Нервы ни к чёрту, желания так работать нет, по ряду областей ещё больше отставание.
С этого момента отсчитываю следующие (нынешние) 2 года не продолбанной рабочей жизни. С пару месяцев осмыслял, что снова сделал не так и почему снова оказался в тупике. В эту одну фразу уместились десятки часов кропотливого и крайне злого анализа. Перебирал в памяти эпизоды, мысли, решения. Читал истории других людей. Ещё внимательнее и прицельнее изучал истории тех, у кого вроде бы всё хорошо (что смешно, почти всегда это люди, которые не озвучивают «у меня всё хорошо», им нет в этом нужды).
Так не хотел продолбать ещё десяток лет жизни, что наконец-то начал всерьёз задавать себе вопросы и давать на них честные ответы. Что такое быть программистом? Что такое быть специалистом? Какой у меня уровень знаний? Кому я такой нужен? Чего я хочу? Что надо сделать, чтобы это получить? Что НЕЛЬЗЯ делать?
Тут надо ещё отметить, что я примитивный и прямолинейный. Всю метафизическую и ультрапсихологическую попсу считаю фигнёй, потому и ответы на вопросы старался давать прямые и простые. Ну т.е. если тебя годами во дворе старшие пацаны лупят, иди не на йогу и к психотерапевту, но в секцию драки арматурой, год там отжимайся, потом вломи ублюдкам, предварительно изучив УК. А до этого момента ты слабак и дрищ. Не идёшь отжиматься? Значит, тебя всё устраивает. Не устраивает? Иди отжиматься, а не ищи тысячу причин этого не делать.
Примерно в таком ключе и разложил себе всё по полочкам. После чего начал ежедневно ментально отжиматься по плану (блог, к слову, тоже инструмент этого плана). После чего однажды встал и вышел в другую жизнь, получив последнюю соломинку на хребет. Так сейчас и живу, об этих ответах на вопросы в блоге и пишу. Что характерно, наконец-то в полном согласии с собою. Не могу сказать, что ДОБИЛСЯ И ТЕПЕРЬ УСПЕШНЫЙ. Не-а. Просто раньше я продалбывал жизнь и работу, а сейчас не продалбываю. Если хочется красивого термина, пусть будет «осознанное программирование».

Таким макаром… Это блог не того, кто совершенно точно знает, как правильно. Наоборот: я точно знаю, как неправильно. Вот эти полтора десятка лет туфты сделали из меня алкоголика, который за версту чует другого алкоголика даже с закрытыми глазами. У вас просто не получится, например, сказать мне «ты неудачник и ничего не добился, и вообще дурак» так, чтобы уязвить меня сильнее, чем я сам себя лупил и луплю. Потому даже не старайтесь. Разве что сделаете это как-то совсем идиотски, чем попадёте в мою коллекцию «а вот так выглядит программист вульгарис на вольном выпасе» (голосом Дроздова).
Но в этом опыте неудач и ценность же. В своей безграничной милоте я хочу, чтобы по моим граблям прошло меньше людей. Всё равно пройдут. Но хотя бы меньше. Один из ста задумается, да и откроет учебник. Другой из другой сотни узнает в описании себя и начнёт проект. Третий из третьей сотни вдруг поймёт, что надо встать и выйти в другую дверь, а не топить себя. Своим примером они могут зацепить соседа. И вот так медленно, партизански, но у кого-то что-то станет лучше. Я мессия, да. Красивый, умный, хороший и добрый. Доставайте свои тухлые яйца, анонимусы.

Когда вам с трибуны вещают, что алкоголизм зло, что алкоголики идиоты, что с алкоголизмом надо завязывать, задумайтесь. Может, за трибуной завязавший и осознавший алкоголик, пытающийся выпинать других с этого пути, а? Вроде не такая уж и сложная концепция.
Да, писать стараюсь жёстко и злобно. Так, чтобы пробрало. Другое вас не пробирает, как не пробирало и меня. Если человек пишет говнокод, надо говорить ему именно это, сопроводив аргументацией, а не неделями танцевать вокруг дипломатический вальс, обмазывая нежностью и размышляя, как бы не обидеть. Пока вы не обижаете, у человека пройдёт жизнь в уверенности, что он всё делает правильно.
PS. Тайминг по годам округлил, чтобы не было мельтешащей детализации вроде «не 7 лет, но 6 лет и 8 месяцев». Если кто из коллег разных работ получит нестыковку в год, знайте, она там есть, это нормально. На повествование не влияет.
PPS. Умоляю, избавляйтесь от одноклеточности. Утомляет читать комментарии уровня «ааа, так автор питонист!» (человек увидел название функции из Python в одном эссе и сделал выводы) или «ааа, так у него всё плохо, раз он о плохом пишет» (божественный уровень связи) или «ааа, пичот лол кек чебурек» (этих люблю, отличная иллюстрация того, о чём пишу). Я, конечно, почти все комментарии тут одобряю, «ибо сим всякого дурость явлена будет» (Пётр I по другому поводу), но становится всё скучнее и скучнее. Вы, ежели считаете, что программист представляет собою птицу умную и гордую, представляйте же собою, а. А то чёт смешно даже, когда оппонировать эссе «Программисты кидают какахами» приходят программисты и кидают какахами. Делайте это изящнее, кароч, всем задорнее будет.

Элита

Когда хочу дёшево аргументировать (вернее, когда не вижу смысла тратить время на верифицируемое со стороны подкрепление утверждений), упоминаю свой рабочий стаж. Типа это, пацаны, почти двадцать лет программистом по трудовой, разве ж скажу фигню? Не ок, согласен, но. Или вот дискутируешь с кем-то, а этот кто-то родился в год, когда я первую зарплату получил. Тоже, знаете, паспорт выпячиваешь, мол, пацан, ну шо ты супротив седой лысины? Сначала скушай столько пюре из баночки, сколько батя скушал, потом лапку задирай. В общем, обычное бум-бум по столу тем, что не контролируешь.
А сейчас упомяну этот стаж вполне всерьёз. Просто потому, что текст ниже максимально субъективный. За эти почти (в мае следующего года уже не почти) 20 лет лишь официальной работы программистом я видел, слушал, читал сотни разработчиков. А ещё короткие соприкосновения в интернете: форумы, чаты, Твиттер. Иными словами, эссе я строю… хотя бы на достаточном (относительно недостаточного) количестве информации, да. Другого основания у меня нет. И аргументов у меня нет. Потому к тухлым яйцам с гнилыми помидорами готов.
Рисуемый далее образ сборный. Всего несколько раз встречал людей, совмещающих в себе едва ли не все упоминаемые черты, но это было прям на краях распределения. Утверждения «программисты носят клетчатые рубашки» следует читать как «автор встретил столько программистов в клетчатых рубашках, что их количество заметно превысило ношение оной модели в других профессиональных группах, при этом встречал и программистов в рубашках иного узора, но их было меньше, да и полное утверждение настолько раздувает текст, что проще назвать всех программистов клетчатыми, чем в каждом абзаце чеканить формулировки, к которым не придолбается свежий выпускник матфака, а он всё-равно к чему-нибудь придолбается, потому и пофиг».
Так вот. Недавно осознал (смирился, принял), что программисты — обычные головой люди, их элитарность самодутая и не стоит ни гроша. Не самое приятное, что входило мне в мозг, признаюсь. Но и закрывать глаза уже не получается.

Во-первых, программисты не инженеры. Раньше были, а всё. В массе своей это ремесленники уровня ПТУ. Наука не нужна, теория не нужна, культура не нужна, знания не нужны, нужно давать софтовые надои. Потому типичный средний программист дёргает корову за вымя, не особо желая разбираться в том, что именно и зачем он делает. Делает то, за что платят. Таксист в двигателях больше понимает, чем программист в компьютерах. Ну да, где-то там под крышкой процессор. И материнская плата. Штука, на которой процессор. По факту программист понятия не имеет, как всё это работает и от продавщицы Любы в ларьке отличается только тем, что Люба внутри ларька, а программист снаружи.
Во-вторых, программисты не учёные. Сосед Вася, может, и будет считать Петю в футболке «Е равно ЭмСиКвадрат» знатным ботаном с докторской степенью, но Петя ни фига не расскажет, почему квадрат, а не куб. Просто футболка прикольная, в «Теории большого взрыва» была. А так-то Петя тот же Олег из Кукуевки, только по верхам нахватался из ленты соцсеточек. И при работе с чем-либо опирается вовсе не на достижения научного метода последних ста лет, прямо скажем. Вне вымени Петя не знает ничего. Даже не запоминает. B-tree? Што? Мне это не надо.
В-третьих, программисты не работники. Рабочий день или рабочий режим — это вот не про Васю. Ну т.е. планета умеет с А утра до Бэ вечера головой думать и руками делать, а Васе для прикручивания кнопочки к верёвочке требуется нечто особое. Почитать новости. Полистать ленту. Обсудить осадок чая и ситуацию в Камбодже (о которой Вася только вчера из новостей прочёл два абзаца). Надо настроиться… Посмотреть в потолок… Возможно, почитать документацию (шутка, кто ж её читает, это же программисты). Опаньки, обед. Покушать. Разморило-то как… Где тикет? А вы читали, что вводят где-то 4-дневную рабочую неделю? И вообще хочу из дома работать, у меня там котик! Короче, работа — это не про программистов.
В-четвёртых, программисты неженки. Посмотрите на офисы топовых известных компаний, это ж детские сады. Зайка не сможет забить гвоздик, если над зайкой не будет стоять гурия с опахалом, за углом не будет велосипедика, а яблочки будут порезаны поперёк, а не вдоль. Т.е., блин, чуваки мирового уровня собирали из говна и палок первые компьютеры и софт следующих поколений в подвалах, а Серёже пальчиком тяжело шевелить, если на кофепоинте не десять сортов бесплатного печенья. И ладно бы гравицапу творил, так нет же, чинит свою же опечатку после опечатки, которую на прошлой неделе сделал в интересах исправления предыдущей опечатки.
В-пятых, программисты инфантильные. Тут это означает, что они понятия не имеют, как им справляться с собственной долбанутостью, не научились. Любая проблема, любая сложность, любое несовпадение реальности с внутренним миром Игоря — всё, мы все умрём. Апатия. Выгорание. Меланхолия. ДЕПРЕССИЯ. Блин, ясен пень, у тебя будет депрессия в предощущении того, как надерут жопу за десятки открытых тикетов, которые ты не сделал, ибо набирал мотивацию просмотром роликов, прослушиванием музыки и беседами о роли Путина в квантовой генетике Навального. Но нет, это не Игорь фигнёй страдал вместо написания тестов, это злые все обижали дражайший внутренний мир подростка с метрикой взрослого. Соответственно, токмо попробуй Игорю микрон критики в плечико вонзить… Страдания Вертера покажутся развесёлой комедией.
В-шестых, у программистов нулевая базовая литературная культура. Если пройдётесь по деревенскому рынку с опросом «читали ли вы Борхеса», результат будет тот же, что среди программистов. Разница лишь в том, что Нариман (вкусный абрикос! сладкий дыня!) может и устыдиться своего аборхесианства, зато программист Игнат с пеной на губах вам час будет плешь гладить обоснованием того, почему он не читает вообще, не читает книги, не читал Борхеса, почему культуры нет в принципе, человек современный вне культуры и т.д. Как вариант, ответно атакует глубоким знанием аниме и «Ричарда длинные грабли». Ну типа тоже культура. Великая японская. Ну и что, что не Кобо Абэ?
В-седьмых, программисты дремучи вне своей узкой сферы деятельности. Посмотрите в глаза Феди. Мудрость. Прищур. Всё понимающая роговица. На деле же Федя не знает ни.че.го. Биология. Химия. География. Литература. История (о, тут Федя скажет, что его обманули все историки, но не сможет назвать цвет обложки хоть одного исследования). Экономика. Физика. Социология. Ни. Че. Го. Я знал чуваков, что не могли указать, где у них печень, слева или справа. Просто не знали.
В-восьмых, отечественные программисты любят спорить. И ладно бы. Но предыдущий пункт же. Пример типичного спора: час бодаться про законодательство России, ни разу за жизнь не открыв УК. Википедия листается тут же по ходу обсуждения. Но мнение имеют. Уверенное такое мнение, увесистое. Вместо законодательства может быть хоть климат Венеры (Илья читал в детстве книгу про Венеру, потому невдолбический специалист), хоть сорта огурцов средней полосы (Павел помогал бабушке кушать огурчики, потому агроном).
В-девятых, программисты ощущают (и ведут) себя уникальными. Фиг с тем, что каждый год их миллионы. Но блин, овердофига специальностей, в которых извилины морщит так, что наш Стёпа помрёт на третий день. Более того, множество людей ещё и под стрессом ответственности за реальный мир морщатся, пока Стёпа оперирует виртуальными ценностями в песочнице. Бжчки, да сейчас софт даже дети пишут, выкладывают в магазины и этот софт покупается. А тот софт, что действительно крутой (ну-ка, моделирование нагрузки на конструкцию корабля в боковую качку), для Стёпы так же далёк, как Пугачёва во внучках.
В-десятых, программисты не читают. Типичный Алёша при задаче «сделать XYZ» пойдёт делать XYZ. Не хотя бы листать мануал. Не вникать в документацию. Что-нибудь нагуглит, как-нибудь сделает. Только если с десятого раза не заработает, нехотя подползёт к литературе и вытащит самую тоненькую книжечку, вдруг в ней ответы на главные вопросы. Лучше, чтобы один. На одну страничку. В 140 символов, как раньше было. Если тысячу лет протяну, всю тысячу лет буду помнить эпичный случай с человеком, писавшим софт 5+ лет. Человек очень плохо сделал генерацию уникального ID. Прям вот совсем на отвали. Я минут 15 объяснял, почему плохо и как надо, тут же пару раз сказал не использовать функцию id() у Python. Объяснил. Через час смотрю pull request. Там id(). На реактивной попотяге выясняю, что человек меня выслушал, открыл документацию к id(), прочёл первое предложение («Return the “identity” of an object») и решил, что норм. Первое. Одно. Он открыл документацию, прочёл шесть слов и закрыл документацию, не добравшись до следующих слов. 5+ лет разработки. Я плакал злыми слезами в углу. Совет RTFM придумали не химики и это не просто так. В детском саду детям больше текста читают, чем программист по специальности.
В-одиннадцатых, у программистов нет ответственности. Вот совсем. Ронять тесты, сервера, Боинги, Луну — задорно и молодёжно. Ежели слишком уж зарвался, всегда можно удрать на другую работу, в резюме же не пишут ДЕТАЛИ, а увольняют нынче красиво, без статьи. Лишь бы ушёл. Антону поди поясни, что такое ошибка, почему это плохо, зачем быть так, чтобы ошибок не было. Ну и что, что всё упало? Ну и что, что у клиентов убытки? Ну и что, что работодателю убытки? Ну и что, что коллеги через год застрелятся? Ну и что, что не по плану? Ну и что, что обещал? И вообще, я устал, у меня апатия, а вон там печеньки дают, я туда пошёл.

Единственная причина, по которой все эти слои всплыли и программисты как-то выделяются на фоне — мы живём в эпоху информатики и человечество пока не нагнало миллиарды выпускников ПТУ на новые станки. Первые операторы первых ткацких станков тоже были «элитой». Несколько десятилетий спустя превратились в обычнейшую профессию. Так и сейчас. Компьютеров и задач гораздо больше, чем людей, потому рынок поступает прямолинейно — рост условий работы (деньги, соцпакет, велосипедик за углом). Всё это в сумме даёт программистам ложное ощущение, что они важнее, лучше, умнее. Ну… Нет, ребята. Фигня в том, что компьютеров десять, а вас пятеро. И хвалить с поцелуями вас будут даже в случае, если IQ будет ниже планки армии США (81).
И мне чертовски любопытно дожить до эпохи десяти компьютеров на двадцать ребят. Уверен, будет весело.
PS. Читатель! Ты не такой! Ты трудолюбивый умница без снаряда в психике! Твоим воспитанием занимались не Наруто с кем-нибудь ещё крупноглазым, но Сенека с Вольтером! Всё будет хорошо! Это автор злобная скотина, а ты настоящая элита, правда-правда.
PPS. Не могу не проиллюстрировать вышесказанное прекрасным комментарием, полагаю, программиста. Тут и навык освоения материала до выводов. Тут и строгая логика. Тут и глубокое понимание связи возраста с используемым технологическим стеком. Тут и проверка сделанных выводов на дополнительном материале, вполне доступном, конечно же. В общем, если эссе нуждалось в картинке, то вот она.

ClickHouse: не сегодня

После месяцев экспериментов с ClickHouse отставляем в сторону. Не срослось, подождём ещё.
Прежде всего следует объяснить.
Во-первых, до этих экспериментов была изучена документация, был прочёсан интернет, были сделаны первые пробы. Про ограничения базы мы знали [ещё год назад], но решили проверить на практике, насколько нам (софту, процессам, людям) терпима та или иная особенность.
Во-вторых, интересно было поработать не только с аналитикой и бигдатой, но также и пощупать привычные сценарии. Что-то пощупали сами, что-то вычитали в чате и решили грабли обойти. На некоторые понаступали сознательно, измеряя толщину шишки.
В общем, если у вас при чтении возникнет желание сказать мне, что ClickHouse нидляэтава, не надо. Я знаю. ClickHouse сознательно прикручивался не только по прямому назначению. Получили в какой-то мере ожидаемый результат, зато теперь объективно знаем, с чем можем жить, а с чем не хотим.

Информации не хватает со старта. Вы ставите базу, заливаете первые десятки миллионов записей, выполняете простой SELECT и… он медленнее текущего решения в несколько раз. Т.к. «ClickHouse не тормозит», пытаетесь избавиться от тормоза в руках. Но как? Документация всё ещё декларативна. Она неплохо описывает то, что есть в базе, но не отвечает на вопросы «как?», «зачем?» и «почему?»
Учебников нет. Курсов нет. Доклады на конфах на такие вопросы обычно ответов не содержат. Community ещё крайне мало и не успело нагенерировать фигалиарды ответов на все вопросы. Исходник у ClickHouse в целом понятный и местами даже красивый, но вы точно хотите проводить обеды в листании тысяч строк на C++? Остаётся только чат: t.me. Он хороший и интересный, особенно когда народ новые билды пробует, но основным источником быть не может, да и не должен.
Потому сидишь и часами бьёшься бабочком об лампочку, перебирая варианты и в сотый раз перечитывая документацию вслух с выражением. А ежедневное чтение чата приводит к диалогам вроде «давай эту штуку не юзать, я чёт такое нехорошее про неё неделю назад читал от того бойца, что… блин, забыл, кароч, что там у него было, но у него не получилось».

Чтобы построить минимальный кластер ClickHouse, требуется пять машин: 2xClickHouse, 3xZooKeeper.
Этот показатель (количество машин) тоже важен, когда вы сравниваете траты и профиты на решение задач. Если база X при 10 машинах отдаёт данные по запросу S за 50ms, а база Y на 5 машинах по тому же S за 60ms, задумаешься. Это очень примитивный пример, но демонстрирует.
Другой показатель: количество разного софта. В одной схеме у вас на 10 машинах стоят 10 инстансов софта X, в другой схеме на 10 машинах 5 инстансов A, 3 инстанса B и 2 инстанса C. Разница в первую очередь заметна эксплуатации (админам, девопсам), но и разработчики не всегда рады, прямо скажем.

У ClickHouse было и осталось некоторое эмпирическое правило: вставлять по одной строке плохо, брать одну строку плохо. Ну т.е. медленно. В идеале бомбить пачками от тысячи строк.
Если вы не можете обеспечить без бубна эту пачечность, приходится ставить оный. Обычным уже решением Kafka. Источники в неё льют так, как получается, а на выходе стоит скрипт, который с некоторой периодичностью (раз в секунду, например) выгребает накопленное и льёт в ClickHouse. Казалось бы, ну ладно. Но помните про кластер 2xCH + 3xZK? Добавляем к нему минимальный 3xKafka, используя в целях уплотнения имеющий ZK. Уже восемь машин.
Можно бы пойти прямым путём: есть Buffer engine, вроде ровно то, что надо? Ну… Прочтите текст по ссылке внимательнее. С такими особенностями работы более прямым путём всё-таки кажется вариант с Kafka.
Особым местом оказывается и то, что переливает из Kafka в ClickHouse. В нашем варианте это простейший Python-скрипт, но у меня хватает фантазии, чтобы в будущем из этого скрипта вырос микросервис, сам по себе являющийся потенциальной точкой отказа. Не воодушевило.

Почти отсутствуют UPDATE и DELETE. Ещё недавно я бы не добавлял слово «почти», но дело сдвинулось с мёртвой точки и теперь есть ALTER TABLE DELETE, пусть и «in beta stage» — уже ништяк! Но чёт как-то… Да, у нас есть данные, которые иногда приходится менять, пусть эти данные в теории и не должны меняться. Мир живой, люди живые, сплошь мутации и т.п. Реальность лупит теорию по голове и после пяти шаманств по изменению (фактически переналивались) захотелось больше так не жить.
С вариантом извращения в ситуации, когда UPDATE отсутствует, но очень хочется, можно познакомиться здесь. Вот тоже не воодушевило.

Нет транзакций и в целом не очень понятно, какие гарантии и чего есть. Мы смелые и сердцем молодые, потому последний месяц наблюдали за ClickHouse, в который лились важные (те, что вот должны сохраняться, а если что, так откатить сохранение в случае ошибки) данные с production’а. И знаете… мне не очень понравился этот месяц.
MongoDB вам даёт «транзакцию» на уровне документа (про 4.0 пока не будем). Elastic тоже на уровне документа, если не ошибаюсь. Про всякие MygrescleSQL с их ACID и так все знают. Если база в ответ на INSERT мне ответила 200 OK, я спокойно переворачиваюсь на другой бок и сплю дальше. Если ClickHouse ответил мне 200 OK, хоть убейте, а сна нет. В общем случае я понятия не имею, сохранятся ли мои данные. Обычно сохраняются, но могут же и не.
Да, это привычно бойцам из мира аналитических баз и вообще бигдаты, ну а мне тревожно.

Тут россыпью всякое.
Внезапным камнем в ботинке оказался insert_quorum. Сначала мы хотели при INSERT в инстанс-A тут же убеждаться, что отреплицировалось в инстанс-B, но всё сломалось уже на этапе миграции данных в ClickHouse. Если слишком быстро писать в несколько потоков, начинаются (как я понял) конфликты вида «я тут ещё не отреплицировал, а ты уже новое сбоку подкидываешь». В итоге insert_quorum выключили, что плохо. В чате потом ещё был народ с такой же проблемой, решения пока нет, окромя как лить в один поток.
Нет EXPLAIN. Хороший инструмент для анализа узких место в запросах, а нема. Есть со стороны совет включить trace и читать логи, но я пока не созрел для того, чтобы на production’е трейсы оставлять. Смотреть на test / dev некоторые запросы смысла нет, современные планировщики учитывают и развёрнутые кэши, и статистику запросов и остальное, что вне боевой нагрузки в состоянии бутончика.
Всё так же пока нет окружения из удобных, наглядных и стабильных инструментов. Ткнёшься в угол, а там либо пусто, либо снова переписывают. Мне бы хотелось из DataGrip, но нет (впроечем, уже делают, если не ошибаюсь). Вроде мелочь, да и суровым постсоветским разработчикам хоть топором запросы делай, но таки хочется больше цивилизации с мещанскими окошками, кнопочками и графиками.
Индексы побаливают. Я привык к тому, что в MysgrecleSQL или в MongoDB накинул на десяток полей индексов и всё, живи, радуйся. В ClickHouse сложнее. У вас не получится использовать индексы произвольно. Технически говоря, отсутствуют secondary indexes, потому шаг влево-вправо вполне приводит к деградации скорости ответа.

Что в итоге? ClickHouse для big data, где big начинается с миллиардов строк и сотен гигабайтов. С этой планки вас начинают интересовать уже другие запросы (и они в ClickHouse отлично работают). До этой планки ClickHouse совершенно не нужен и даже вреден. Ничем иным, кроме как прям вот большими данными с только лишь аналитикой в ClickHouse ехать не следует. Транзакции, индексы, изменение данных, точечные запросы — все эти штуки из другого мира. Вернее, ClickHouse из другого мира.
Раньше я это понимал головой, ну а теперь и руками. Ну ок, будем ждать, вдруг база станет ближе повседневности. Появился же DELETE.

Зачем читать книги

С первых же строк скажу, что разработчику можно книги не читать. Более того, подавляющее большинство не читало и не читает. В интернете хватает статей и форумов, StackOverflow открыт круглосуточно, документация щедра, наконец, исходники часто открыты. Так и справляются вплоть до senior’ов и руководителей разных мастей. Короче говоря, я в курсе.
И это не очень хорошо. Дальше вразброс и кратко накидаю, чтобы больше уместить, полноты и цельности не будет. Скорее, россыпь аргументов и примеров для осмысления.

Вне книг вам доступно не всё.
Во-первых, часть информации существует только в книгах. Если вы не читаете, значит, не читаете [Frederick P. Brooks Jr. The Mythical Man-Month. Addison-Wesley, 1995] или [Robert C. Martin. Clean Architecture. Prentice Hall, 2017]. Вам, быть может, такое и не надо, но вполне можно представить текст, что нужен, а проходит мимо. Также стоит упомянуть, что некоторые книги в наличии только в бумажном качестве. Из недавних примеров [Фельдман Б.Я. От калькулятора к суперкомпьютеру. РТСофт, 2014]. Интереснейшие мемуары, а тираж с гулькин нос.
Во-вторых, иная информация такого объёма, что даже в цикл статей не укладывается, а если уложить, получится та же книга, а распиливать её на автономные клочки глупо, т.к. главы опираются одна на другую. Обычно это фундаментальные труды по фундаментальным знаниям. Примером могут служить талмуды вроде [Andrew S. Tanenbaum, Herbert Bos. Modern Operating Systems. Pearson, 2014] или [Олифер В., Олифер Н. Компьютерные сети. Питер, 2017].
Как ни крути, а лишаете себя не свежих похождений клоунов из телевизора отказом от телевизора, но профессиональных знаний.

Книга — удобный контейнер для плавного и последовательного строительства системы знаний в голове. Это давно опробованный и оформившийся формат обучения. Современная практика делит ремесленный учебник на следующие части:

  1. Введение — небольшой рассказ о том, что за текст, как его читать, что пропускать можно, а что не рекомендуется и т.п.
  2. Софт — если нужен софт, тут объяснят, как его ставить, какие версии нужны, как вообще оборудовать рабочее место.
  3. Главы основы (entry level) — в голову внедряются понятия, без которых более сложные темы не понять. Здесь же иногда объясняют, для каких целей появился объект учебника, дают немножко теории. Для языков программирования вводят понятия функций, типов данных, элементы ООП и т.д.
  4. Специальные главы (middle level) — после того, как отработали первые helloworld’ы, переходят к более другим задачам: работа с RDBMS, графика, сеть, всё такое. В некоторых учебниках эта часть построена на микропроектах, чтобы собрать на одну нитку сведения из предыдущих глав: а давайте напишем небольшой почтовый сервер, ага.
  5. Дополнительные главы — сюда авторы скидывают style guides, best practices, немножко справочной информации, нужной для книги, и всё такое.
  6. Библиография — иногда невероятно важная и полезная штука, если хотите углубиться в какую-либо тему.

Таким макаром легко изучать что-то новое. Джависту вёрстку, фронтендеру Python, джуниору SQL, начинающему пользователю ClickHouse осваивать Kafka. Т.е. нет, книга не пересказывает документацию (иначе это плохая книга, я о таких иногда гадости тут пишу), она таки даёт курс от и дальше.


Иногда книга — продукт работы автора, дизайнера, вёрстки. Сам по себе файл / бумажный том сделаны так, что усвоение информации облегчается, да и вообще превращается в удовольствие. Элементы инфографики, разрежающие вставки, пиктограммы, выделение блоками. Шедевром считаю [Jon Duckett. HTML and CSS: Design and Build Websites. Wiley, 2011], вот уж где красота.
Мне очень нравится и то, как издают учебники западные лидеры мануалостроения, так сказать: Addison-Wesley, O’Reilly, Pearson, Prentice Hall, Wiley, MIT Press. Из относительных новичков отмечу ещё No Starch Press. Ни авторам, ни издательствам не интересно, чтобы у читателя вспухла и взорвалась голова, в которую всунули гранитную плиту знаний. Интересно, чтобы книга понравилась, информация дошла, автор запомнился. Если вам кажется, что до сих пор текст подаётся так, как подавался в учебниках издательства «Наука» (и как же прекрасно на их фоне выглядели издания, которые переводил и печатал с соблюдением формата «Мир»), прекращайте. С этим нынче всё хорошо, глаза под веки стекать не будут.

Если авторы хотят текстом повлиять на мышление и дать устойчивое мнение, без объёма никуда. Люди так устроены. Вас не убедит один пример и не убедят даже пять. Ну типа да, какую-то там стачку в 1903 году разогнали залпами, поубивав народ, и шо? А если таких стачек десятки, да ещё с годами, да ещё с фамилиями, да ещё с причинами каждой? Тут и дурак задумается о том, чем булки в России пахли. Только вот все эти примеры занимают место. Хочет автор или нет, а для подтверждения своих утверждений он будет страницу за страницей исписывать текстом. Объём, объём… Нет объёма и уместить в статью? Значит, минус примеры. Значит, минус убедительность. Значит, часть читателей пройдёт мимо чего-то важного, быть может.
Примером такой книги в разработке могу назвать [Jonathan Shariat, Cynthia Savard Saucier. Tragic Design: The Impact of Bad Product Design and How to Fix It. O’Reilly, 2017]. Как показать читателю (дизайнеру, разработчику, менеджеру), что он не просто делает софт, но делает продукты, которые влияют на жизнь людей? Как показать, что ошибки могут привести к трагедии (и хорошо, если только лишь к снижению потока пользователей)? Убедит ли читателя текстик в пять страниц (столько в распечатке занимает одна среднего объёма статья блогов)? Не думаю.
Кто книги не читает, тот среди прочего не знакомится и с культурой вот такого обоснования, понижая планку качества убеждений. Не ок.

Иногда встречаю узкий взгляд на профессиональную литературу: разработчики сводят книги к сугубо техническим мануалам. Словно книги и документация дублируют друг друга. Повторюсь, если книга дублирует документацию, автор плохой и книга его плохая (любители такую фигню выпускать: Packt и Apress). Реальный репертуар же намного шире.
Во-первых, есть «культурные» книги. То, что не научит вас циклы правильно лепить, но расскажет историю того, в чём вы варитесь. Может, даже воодушевит. К персональным историям этой категории можно отнести [Linus Torvalds, David Diamond. Just for Fun. HarperCollins, 2001] или [Kevin Mitnick. Ghost in the Wires. Back Bay Books, 2012]. Истории корпораций не менее интересны: [Tim Jackson. Inside Intel. Dutton Adult, 1997]. Как и их сражения: [Fred Vogelstein. Dogfight: How Apple and Google Went to War and Started a Revolution. Sarah Crichton Books, 2013].
Во-вторых, есть мануалы не к софту или технологии, но к профессии. Пишут их вполне толковые люди, а уровень текстов… В общем, когда подобное читаю, представляю, как сижу с автором в пабе, цежу пиво, заодно слушая детальный и любопытный рассказ о том, как писать софт, как проектировать, в чём сила. Такие книги всем известны, но напомню пару примеров: [Steve McConnell. Code Complete. Microsoft Press, 2004] и [Martin Fowler с толпой чуваков. Refactoring. Addison-Wesley, 1999]. Из недавних снова упомяну задорную [Катрин Пассиг, Йоханнес Яндер. Программирование без дураков. Питер, 2017].
В-третьих, есть книги по довольно специальным темам, совершенно не укладывающимся в статью. Известные труды такого рода написаны хорошим языком, глубоко и профессионально разбирают объект по косточкам, да и просто интересные. Вот некоторые. [Henry S. Warren. Hacker’s Delight. Addison-Wesley, 2012] — распрекрасные игры с битами и байтами от аксакала индустрии. [Robert Love. Linux Kernel Development. Addison-Wesley, 2010] — интересная книга о том, как работает ядро Linux. [Jeff Duntemann. Assembly Language Step-by-Step. Wiley, 2009] — настолько доступно, толково и занятно рассказать про не самую весёлую область — автор гений.
А ещё сборники интервью [Federico Biancuzzi. Masterminds of Programming. O’Reilly, 2009] и [Peter Seibel. Coders at Work. Apress, 2009]. И классика азов информатики с 400+ customer reviews на Amazon [Charles Petzold. Code. Microsoft Press, 2000]. И взорвавшая девопсами мир [Gene Kim, Kevin Behr, George Spafford. The Phoenix Project. IT Revolution Press, 2013]. И до опупения ещё всякого. В общем, не мануалами едиными.

Чтение книг представляет собою определённый вид активности головного мозга. Вы учитесь впитывать массив информации. Не белый шум Твиттера, не десять статей на разные темы за день, не развлекающую техномелочь с Хабра. Пять сотен страниц. Открываете книгу и день за днём. Она оседает в памяти, встраивается в вашу систему взгляда на мир. Если вы потребляете знания отрывочно, вы кидаете в котлован кирпичи в надежде, что там сам собою сварится дом. Если читаете книги, в котлован опускаются готовые блоки.
Ну ок, это лирика. Не лирика (накидаю всякое просто для демонстрации, что чтение книг не просто ужасная советская пропаганда, чтобы люди на баррикады не шли, а занимали себя тихо в хатах):

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


Как-то так. Вряд ли скажу лучше или обосную глубже, т.к. всю хоть сколь объективную аргументацию исчерпал. Для меня вопрос «зачем читать книги» звучит как «зачем быть здоровым, умным и [разумно] богатым», настолько лежащими на поверхности кажутся ответы.
Но в стопицотый скажу: вы можете не читать. Вас не заставляют. Чтение книг само по себе не делает человека умнее или глупее (если он не ребёнок, тут уже в тысячный раз упомяну [Манфред Шпитцер. Антимозг. Цифровые технологии и мозг. АСТ, Кладезь, 2013]). Как говорят наблюдения, семь миллиардов разработчиков не читали и не читают, но при этом работают, успешно зарабатывая евродоллары в кубышку. Джуниоры, сеньоры, руководители. Так зачем книги читать-то, раз всё хорошо и без них? Затем, что, быть может, всё-таки всё не так уж и хорошо. Просто достаточно.

Почему Python и Django

После ряда вопросов дополню предыдущую простынку ответами на вопросы ряда «почему [не] XYZ».
По себе знаю, профессиональная деформация меняет угол оценки людей. Если день за днём 90% круга общения могут читать исходники, упоминать big O, ностальгировать по ZX Spectrum и гадать про Эльбрус, забываешь очевидное — другим людям бывает сложно даже AND от OR отличить. Они умеют включать компьютер, гулять в интернете, писать письма. Всё. Это раз.
Программирование не является естественной деятельностью человека. Фактически никакой предварительный опыт к ЭТОМУ не готовит. Сугубо умственное самонасилие, структурирующее мысли так, чтобы после конвертированиях оных в примитивные инструкции процессора что-то заработало. Вспомните, как мучительно застывал народ перед первыми банкоматами. Итическая мощь цивилизации, какую же кнопку нажать, чтобы денег дало..? Левую или правую? Или вот эту посерёдке? Аааа, оно жужжит! Вот первый опыт разработки круче банкомата.
Короче говоря, я не сторонник фантазий о том, как из толпы выдёргивают рандомную репку и за месяц из неё куют разработчика на любом языке. Выдрессировать обезьяну, бездумно повторяющую действия по шаблону — да, реально. Остальное считаю кунсткамерными казусами, цели и нюансы которых многое бы объяснили. Ну и да, великий рандом существует.

Итак, формулируем задачу.
Дано: обычный человек без опыта, но умеющий пользоваться компьютером. Мощность мозга примерно на уровне хорошиста с дипломом. Инициативность и воля на уровне «готов оторвать жопу от дивана, чтобы жить иначе». Снижать планку не считаю интересным — люди с тройками и двойками, продавливающие телами печку в надежде на чудо… тоже чего-нибудь как-нибудь найдут своими методами, пусть их. Мне такие тоскливы, потому избегаю. Повышать же планку неспортивно, современный толковый физмат применение себя уже во время учёбы может найти без проблем.
Задача обширнее, многоэтапная и на века:

  • Попасть на высокооплачиваемую (относительно другой «обычной») первую работу.
  • Удержаться год на этой работе.
  • Полученными знаниями и опытом значительно расширить выбор следующих мест и вариантов работы.

Ограничения:

  • Самостоятельная учёба. Во-первых, проверка мотивации — не тянешь, значит, не хочешь, пока-пока. Во-вторых, не тратимся на бесполезные курсы, повторяющие то же, что есть либо бесплатно, либо за весьма меньшие суммы.
  • Уложиться в год по два-три часа в день. Вполне возможно, человек уже работает или учится [на кассира в свободной кассе с высшим филологическим]. А года хватит на всё. Если потребовалось больше, что-то не так.
  • Москва. Просто трусливый выбор, т.к. понятия не имею, как джуниору найти работу в Красноярске или в Бахчисарае.

Временные затраты: при режиме будень(30м чтение + 90м практика) и выходной(60м чтение + 120м практика) получаем на год с округлениями… около 250ч чтения и 600ч практики, если я не обсчитался по производственному календарю.


Самое это самое: какой язык? Мы можем выбрать только один основной. Выбирать, понятно, топовый. Много учебных материалов, вероятность найти советчика под боком, больше вакансий и т.д.
Go и Rust отметаем — хватит и того, что работы мало. Swift мог быть вариантом, но мобильная разработка специфична и всё то же количество вакансий. C / C++… хороши, но для изначально профессиональных джуниоров, я бы сказал — многое надо знать дополнительно, на собеседовании спросят и про разный low level, а у рандомной репки беда. Ну и снова вакансий так себе. Есть ещё кластер всякого вокруг Microsoft (C#, например), но у меня в этом месте лакуна, а гадать не хочу. Может, у них всё офигительно. С другой стороны, учебной литературы на порядок меньше, да и платформа ограничивает вакансии. У Ruby всё плохо с количеством информации, вакансии тоже не очень. Остаются Java, JavaScript и Python.
Java великолепна на рынке труда. Работу найдёт даже джавист с тремя судимостями, опытом в месяц, образованием в два класса церковно-приходской в деревне староверов, глазами наркомана и повадками сомалийского гопника. Но это не язык для начинающих с самостоятельным обучением. Чтобы начать на ней писать хотя бы похоже на правильную Java, надо прям вот долго и с ментором, ещё и помнить тонну нюансов. Собсно, потому количество литературы по ней огромно, но доля учебников для самых маленьких исчезающе мизерная. Маленьким этот язык не дают.
JavaScript тоже прям сверкает вакансиями. И материала много. И в каждой щели он. И учить просто, да ещё снежинки с часиками на экране. Одна фигня: рынок JavaScript — это рынок фронтенда с редкими вкраплениями «мы пишем на Node.js« (скорее, на Ноде будете вспомогательные скрипты фронту писать). Иногда в дискуссиях с матёрыми джаваскриптизёрами начинается выдвижение списка софта на Node.js, но в сравнении с Java / Python… вышла шаланда под ГРКР «Москва». Также фронтенд со старта не учит многому хорошему (нафига снежинкам алгоритмы, например?), да и вообще ограничен в качестве вакансий. Оптимистично говоря, бекендер может вчера писать банковский софт, сегодня геймдевить, завтра машинное обучение в Hadoop ломать. Фронтендер вчера верстает страничку для банковского софта, сегодня страничку для игры, завтра страничку для админки машинного обучения. Утрирую, да. Но и нет. При этом просто знакомить с разработкой на примере JavaScript отлично.
Python достаточен вакансиями. У него всё замечательно с литературой (даже детской хватает). Его берут учебным языком в вузах — современный BASIC, чё, вона как SICP им… не подберу глагол. Он нередко приветствуется вторым языком. Переживает второе рождение в ML. Многолетние legacy на нём ещё ваших внуков пережить могут. И для простых задач он простой как ведро с краской. И, что очень важно в контексте, питонистам не надо знать ничего (заранее отключить комментарии к эссе, шоле…)! Плюсовиков погоняют по low level и OS. Джавистов по ООП, шаблонам, API и GC, придавив многопоточностью и «ну, теперь давай про базы данных». Этих, которые JavaScript, будут спрашивать про React во Vue.js с AngularJS в соусе из jQuery в Internet Explorer на семиугольном мониторе. Питонистов не спрашивают ни о чём, окромя Python и одного из фреймворков, да и тому научат. Лишь бы лапками по кнопкам нужным попадал в первый год. Ну не прелесть? А уж освоить и запомнить за год Python так, чтобы от зубов отлетал, не хитрое дело.
Потому и Python. Что, впрочем, не помешает в дальнейшем изучить другой язык, было бы желание. Ещё отмечу наблюдение из практики: очень, очень часто питонисты (как живые люди, так и резюме) — выходцы из тестировщиков, 1С, поддержки и прочих мест, в коих разработка на зачаточном уровне, если вообще есть. Python — их первый и нередко единственный язык. Они смогли, сможет и наша репка.

Подчеркну всё-таки важное. Начинающему следует не просто найти первую работу, но за два года учёбы и работы открыть себе двери в разные ветви разработки. Ведь лучше работать тем, что нравится, а не только тем, что умеешь. В Python легко войти и с Python легче пойти дальше в девопсы, в админство, в web, в ML, в сбор данных и т.д. Когда первый голод удовлетворён (ура, я пишу программы! ура, мой первый миллион [рублей]!), бывший начинающий пойдёт дальше. И вот тут должны выстрелить дополнительные знания и появившаяся привычка учиться. В этой же точке привычка быть бездумной обезьяной с сотней CtrlC/CtrlV на пальцах закроет ряд вариантов, я уверен.
А вот это не подчеркну, но отмечу [ещё раз]: разработка софта очень толерантна к разным людям разного уровня. Войти в разработку можно миллиардом путей. Если у начинающего есть явные наклонности к несколько иной ветви развития (пусть даже ценою снижения универсальности), может хоть Fortran осваивать по аудиозаписям лекций. Фишка в доступности. Запрыгнуть на первую ступеньку может любой с желанием, волей и достаточным количеством полезных клеток в черепе.
PS. Выбор Django в качестве фреймворка объясняется просто. Во-первых, в ней (нём?) есть всё для обучения, ничего дополнительного ставить не надо. Во-вторых, количество вакансий с упоминанием Django довольно велико — прям сейчас 200+, например. В-третьих, после Django освоить другое не так уж сложно.

Как заработать больше посудомойки

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

1. Надо меньше тратить. То, что вы экономите, не оплачивая фигню, вы пустите дальше на учёбу и работу. Как минимум, вам нужны компьютер и интернет.
2. Напишите список из десяти специальностей, которыми вам хотелось бы заниматься. Откройте сайты вакансий, найдите эти специальности и в своём списке напротив каждой проставьте минимальную зарплату начинающего без опыта. Порыдайте над результатом.
3. Оставьте все специальности, у которых устраивает минимальная зарплата. Теперь уберите из них все, которые невозможно освоить самостоятельно. Оперный певец круто, но нет. Экономист круто, но без диплома нет.
4. После этого у вас либо пустой список, либо остаётся «разработчик [программного обеспечения]». Да, это единственная специальность, которую вы можете освоить прям дома самостоятельно в разумные сроки, и войти в тусовочку пацанов, упоротых по смузи и Лондону.
5. Если у вас нет компьютера, купите. Лучше ноутбук 13″..15″, можно б/у. Главное в нём — процессор и оперативная память. Остальное пофиг, только на экран сначала посмотрите. От совсем плохих глаза вытекут за сутки.
6. Вы будете учить язык Python. Нет, не JavaScript и не вёрстку. Именно Python, т.к. только так вы дёшево для головы получите хоть поверхностное и немного ущербное, но знание разных вариантов разработки.
7. Освободите в будни 2 часа (30 минут чтение, 90 минут практика) без разрыва, которые вы обязательно используете для учёбы. В эти часы вас запрещено трогать, вы не пьёте, не тусите, не смотрите кино, вы учитесь. В выходные 3 часа (60 минут чтение, 120 минут практика).
8. Ваша первая книга [Bryson Payne. Teach Your Kids to Code. No Starch Press, 2015]. Вы ничего не знаете, она вам норм. 300 страниц очень, очень лёгкого текста с картинками. Так вы проведёте первый месяц, пробивая порог входа и набивая первые шишки.
9. На второй месяц пора ставить IDE. Это будет PyCharm CE. Неделю потратите на то, чтобы настроить, обнаружить и запомнить нужные кнопки, запустить в нём ваши ранние эксперименты. Нет, другие IDE ставить не надо. Станете старше, решите сами. Сейчас PyCharm.
10. Теперь вам надо набивать руку на микропроектиках и заполнять память языком. Ну и не помереть с непривычки. Потому [Paul Barry. Head First Python. O’Reilly, 2016]. Книга на два месяца, много картинок, язык простой, всё на пальцах, но информации больше.
11. Всё, вы офигенно крутой питониста, потому учите Django в качестве первого фреймворка. Помогут Django Tutorial, чугуниевый зад и любые книги, т.к. хороших всё равно нет. Придумайте себе простой проект (магазин вышиванок, например) и делайте его, пока не сделаете.
12. Ладно, пошутил. Вы всё ещё ничего не знаете, потому месяц поиграйте с алгоритмами и структурами данных: Problem Solving with Algorithms and Data Structures using Python Хоть базовое, хоть простое, но в голову должно войти. Если не войдёт, вас никто не будет любить так, как надо.
13. Отворачиваемся от Python, смотрим на базы данных. Берём книгу [Thomas Nield. Getting Started with SQL. O’Reilly, 2016] и прорабатываем её всю от обложки до обложки. На неё у вас должно уйти 2..3 недели, не больше.
14. Если ещё почему-то не, заведите аккаунт на GitHub и перевезите все свои поделки на него. Да, они ужасные и корявые, никто не будет читать, всем пофиг, а вам надо освоить git. Пусть уйдёт неделя.
15. Отдых! Читаем [Катрин Пассиг, Йоханнес Яндер. Программирование без дураков. Питер, 2017]. Весёлая и толковая книга, заменяющая будущим джуниорам более серьёзные труды. Выделяем на неё месяц. Читать вдумчиво, осмыслять, примерять к прошедшим месяцам.
16. Чарующий мир красивых страничек со снежинками откроет книга [Jon Duckett. HTML and CSS: Design and Build Websites. Wiley, 2011]. Ей семь лет, она знатно устарела, но я не знаю более крутой, красивой и доступной книги, вводящей в вёрстку. Полтора месяца, наслаждайтесь.
17. После отдыха и красот вернёмся к пункту 11. Django и маленький магазин чего-нибудь. Чтобы база данных была, странички и всё прочее. Вы всё равно напишете фигню, но старайтесь. Не ленитесь возвращаться к раннему материалу. Один месяц.
18. Прошло 8.5 месяцев. Отдохните. Топайте на HackerRank и прорешайте там задачки из всех областей, на которые вас хватает. Заодно подтянете снова забытое, набьёте пальцы на новом. Две недели.
19. Теперь важное. Вы должны понимать тестирование своего кода и уметь. Без этого вы мина под попой, а не джуниор. Упорно осваиваем [Harry J. W. Percival. Test-Driven Development with Python. O’Reilly, 2017]. Полтора месяца. Книга годная, в ней не только про тестирование есть.
20. Ожидаемый пункт: обложите тестами свой магазин вышиванок. Все триста ошибок надо будет исправить. Потом те сто, что появились из-за исправлений. Две недели.
21. Теперь думаем (наконец-то). Что больше нравится, страницы верстать или остальное? Выбор между фронтендом и бекендом. Погуглите про эти специальности, подумайте много раз. Они разные. Сразу развивать обе надорвётесь. Если выбрали бекенд, читаем дальше.
22. Идём на HeadHunter, ищем Python junior. Выписываем из требований всё, что вы не знаете, сортируем список по кол-ву вакансий. Если в 10 вакансиях слово «MongoDB» попадается 10 раз, вам есть куда развиваться. Ещё пару месяцев учите то, что сверху списка.
23. Переписывайте магазин вышиванок с использованием максимального кол-ва технологий, требуемых в вакансиях Python junior. Не забываем про тесты. Ну… Ещё месяц. По пути добавляйте в магазин фенечки. Корзину, письма заказов, рекомендации нейронной сети (хаха) и т.п.
24. Неделю отдыхайте, потом тридцать три раза вылизывайте код магазина. Это ваш magnum opus, который покажете и будете защищать на собеседованиях, если захотят посмотреть на исходник. Оформите проект так, как делают крутые пацаны — изучите чужие проекты, ту же Django.
25. Теперь соберите ВСЕ вакансии Python junior, которые хоть как вас втискивают (если от джуна ждут 5 лет опыта, вы не). Разделите на три части: «не хочу», «фиг знает», «хочу». Идите на собеседования к первым. Смысл в получении опыта собеседований, а не в офере.
26. Вам причинили боль, унизили, показали, что вы на дне знаний. Это обычно. Главное не хлопать ушами и запоминать, что спрашивают. Чем частотнее вопрос, тем лучше, значит, модно сейчас. После этой стопки учите то, отсутствие чего выявили собеседования. Для того и ходили.
27. Иди во вторую часть списка. Тот же алгоритм действий, но вы уже морально готовы и знаете больше. Если не тупили за год, один-два офера получите. Это запасной вариант, к нему можно будет вернуться, если не спешно давят с наймом (что подозрительно).
28. Третья часть списка интересная. Многие годные вакансии от джуна чудес не ждут, окромя «уверенного» или «хорошего» знания языка. Ну т.е. фиг с опытом, но заучить синтаксис и библиотеки мозгов должно хватить, иначе смысл. Потому пока мы туда не идём.
29. Две недели вы готовитесь. А именно учите Python снова, но по взрослой книге: [Alex Martelli. Python in a Nutshell. O’Reilly, 2017]. Даже не учите, но выбираете из неё то, что забыли, не выучили раньше, не поняли и т.п. Книга-справочник.
30. Топайте на собеседования в третью часть списка. Выспитесь. Отдохните. Не напрягайте нервы. Все знают, что вы джуниор. Если память не дырявая, слова складывать умеете и что-то осмысляли, а не только зубрили, оферы у вас будут. От 50К до 100К в зависимости от.
31. Главная задача — проработать не меньше года. Учитесь работать как вообще, так и в коллективе. Берите все знания, что дают. Это будет адовый год работы, учёбы и «я тупое ничтожество и ничего не умею». Это нормально. Вы ничего не умеете. Учитесь уметь.
32.0. Также вы должны продолжать накачиваться книгами. В них системные знания, они трамплин для дальнейшего освоения. Важно понять и принять, что вы пока junior junior, а не junior. Очень мало знаний про OS, базы данных, шаблоны, архитектуры, компьютеры, разный нужный софт.
32.1. Потому читаем. Python: [Mike Pirnat. How to Make Mistakes in Python. O’Reilly, 2015] — полезная брошюра, старая [David Beazley, Brian K. Jones. Python Cookbook. O’Reilly, 2013] и новая [Steven F. Lott. Modern Python Cookbook. Packt, 2016] для мелких хинтов.
32.2. Потому читаем. Эрудиция: серия In Seven Weeks попсовая, но даст вам понять, что мир сложнее и многомернее. Попробуйте [Luc Perkins, Eric Redmond, Jim Wilson. Seven Databases. Pragmatic, 2018] и [Paul Butcher. Seven Concurrency Models. Pragmatic, 2014].
32.3. Потому читаем. Linux: [Christine Bresnahan, Richard Blum. Linux Essentials. Sybex, 2015] — чуть устарела, скучновата, но простым языком для самых маленьких. Пробить порог входа, а дальше уже крутиться, как получится. Без Linux вы будете страдать, потому надо, надо.
32.4. Потому читаем. Классика: [Charles Petzold. Code. Microsoft Press, 2000] — очень доступная книга о битах, байтах, кодах и т.п. Я б её школоте в информатику добавил. Если вштырит, читайте [Henry S. Warren. Hacker’s Delight. Addison-Wesley, 2012] — брулянт, а не книга.
33. Всё. После года учёбы и года работы вы должны понимать, что вам нравится, в чём вы сильны, а в чём слабы. У вас год опыта в трудовой, что открывает двери к вакансиям, на которых не хотят учить малышей (потому ставят лимит в год+). И да, зарплата посудомойки 30К. У вас больше.

При чтении этого списка надо помнить следующее: список для тех, кто прям совсем нулевой. Не выпускник годного физмата с опытом трёхлетнего фриланса, например, но человек, который только пользуется компьютером, но хочет попробовать пользоваться им круче, да и вообще уехать в Дублин или Лондон кошмарить тамошних CEO от Google и Facebook. Также должно быть понятно, что таким новичкам не надо давать читать Кнута, Мартина (он лёгкий и клёвый, но слишком много спорного), Макконнелла, Дейта и т.д. В голове у начинающих и без того каша, а такими снарядами только волю к жизни убивать в первый год этой жизни. Станут старше в специальности, тогда и осилят. Наконец, текст выше про ремесло. Так не получить конструктора, инженера, изобретателя за год. Получится боец, умело красящий заборы или таскающий мешки с песком в нужные для мешков места. На старте больше и не требуется.
PS. Ну и да, всё станет интереснее, если вам будет помогать знакомый разработчик. В идеале муж или жена, чтобы можно было ночью разбудить и красными глазами напугать. Дерзайте, в общем. У девяти уже к третьему месяцу азарт пропадёт, а вот один прорвётся к финишу.

Памятка рекрутеру

Совершенно не считаю рекрутеров бесполезными людьми, они полезные, нередко адекватные и разумные (в той же пропорции, в которой адекватность встречается в социуме), но раз за разом умудряются совершать одни и те же ошибки, что потихоньку выбешивает. Дайте ссылку на это эссе знакомому IT-рекрутеру, пусть проникнется.

Во-первых, не надо мне звонить. НЕ НАДО. ЗВОНИТЬ НЕ НАДО, БЛИН ВАШУ. Разговор голосом в отношениях «разработчик vs рекрутер» — это финальная стадия отношений, не стартовая. Во время вашего звонка я могу быть фиг знает где, услышать фиг знает что (если вообще захочу), вы всё равно весь текст вакансии мне не расскажете (а если расскажете, я треть не услышу) и т.д. Внезапно звонящий рекрутер звучит как стопицотый телефонный спамер, вносимый в чёрный список, не более. Если у вас есть мой номер телефона, у вас должен быть и email. Как вы, блин, вообще представляете себе процесс? Оу, звонит незнакомая девушка, тарабанит два-три предложения, а я «уря! хотеть к вам сходить прям сейчас вечером нет сейчас хотеть берите аааа»? Нет, правда?
Во-вторых, читайте резюме. Рекрутер, предлагающий мне вакансию фронта, изумляет до невозможности. Рекрутер, спрашивающий, какой у меня стаж и опыт, тоже. Рекрутер из Екатеринбурга, удивлённый «ой, а вы не в Е.?», удивил взаимно. Вы потратите пять минут на человеко-кандидата, но избежите кучи нелепостей, после которых у разработчика подозрения, что всё у них так, потому нафиг надо.
В-третьих, почта. Офигенное изобретение человечества, позволяющее рекрутеру дать мне 1) много нужной информации, 2) возможность вдумчиво исследовать вакансию. Погуглю контору. Посмотрю на карте офис. Прикину требования к себе. Вдруг у меня знакомые есть в конторе, им напишу, спрошу. Вот только после этого процесса что-то внятное отвечу. Не потому, что я сноб и зануда (хоть я сноб и зануда). Потому, что вакансий много, рекрутеров много, у меня есть выбор. Если рекрутер не осиливает в этот выбор доложить свой лист текста, для меня это точно не трагедия, просто я не нужен этому рекрутеру, а этот рекрутер мне.
В-четвёртых, общение, личность, социализация, всё такое. Пункт со звёздочкой, да. Письма из шаблона убогие («Уважаемый(я) Сергей», ага). Рекрутер, общающийся не со мною, но с анонимным ресурсом, от найма которого рекрутер получит копеечку, скучен и ничем не выделяется на общем фоне. С таким же успехом могу HeadHunter полистать. Особенно несчастно выглядит на фоне рекрутеров, с которыми сложились товарищеские отношения. Разница в том, что они начинали не шаблоном. Попробуйте написать простое человеческое письмо. Не надо стихами, не надо клоунады. Простое человеческое. Можно даже без полной вакансии сразу. Устроит «Сергей, привет. Знаю, что не в поиске работы, но не считаю лишним обменяться контактами, если вы не против. Вы всё так же джавист, специализацию не сменили?» и т.п. Я общительный и отвечу. А рекрутер мне ответит. А я. Но вот именно с человеческим общением у рекрутеров не складывается, сплошной равнодушный поток.

А так-то ребята и девчата нужную работу делают, аки пчёлки, цветочки опыляющие.

Главный рефакторинг

Посмотрел вчера на код после джуниора, сделал всего один рефакторинг и тут же удалил 380 строк. Задумался, вспоминая последние 10..15 рефакторингов, что делал. По сути все они были одним и тем же: убийство копипасты. Нет, иногда копипаста не плохо. Иногда она даже нужна и является элементом архитектуры. Но часто она всё-таки фу и бяка. И один из skill’ов, что разработчик должен натачивать в себе с первого же молочного зуба — чутьё на плохую копипасту и практику её уничтожения. Если этого нет, нет и хорошего разработчика, даже не надейтесь.

Более культурно это нынче называется DRY (Don’t repeat yourself) и за последние лет двадцать каждый уважающий себя учебник рекомендует следовать этому принципу (ещё до того, как его сформулировали).
Например, [Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts. Refactoring. Addison-Wesley, 1999]: «Number one in the stink parade is duplicated code. If you see the same code structure in more than one place, you can be sure that your program will be better if you find a way to unify them».
Например, [Steve McConnell. Code Complete. Microsoft Press, 2004]: «Duplicated code almost always represents a failure to fully factor the design in the first place». (на деле у него примерно такой же текст уже в 1998 году был.
Например, [Robert C. Martin. Clean Code. Prentice Hall, 2008]: «Every time you see duplication in the code, it represents a missed opportunity for abstraction. .. Find and eliminate duplication wherever you can».

Почему это важно? Даже вот не с позиции абстракций и прочего, но сугубо прагматично кодерски.
Во-первых, вы мешаете JIT’у и прочим оптимизациям. Если исходник в одном месте и часто вызывается, у него гораздо больше шансов на автоматическую оптимизацию, чем у того же исходника в двадцати местах с размазанными вызовами.
Во-вторых, вы мешаете коллегам изучать код не только увеличенным объёмом текста и пустыми ожиданиями «раз оно двоится, может, не просто так», но и тем, что в IDE не получится тыцнуть в один метод и найти его использование.
В-третьих, вы очевидно мешаете исправлять этот код. Я и в самом деле сегодня вынужден был заменить 20+ копипаст. Предположим, правил бы багу. Мне пришлось бы править её в 20+ местах, после чего генератор копипасты был бы упомянут в разных позах и разных занятиях. Не говоря уж о том, что в случае баги я мог бы в одном-двух местах её и не исправить, пропустив. В общем, беда.
В-четвёртых, вы мешаете делать рефакторинг. Довольно часто бывает так, что после выноса копипасты становится очевидным следующий шаг. А потом ещё один. Рефакторинг похож на падающие доминошки, после одной каки чистятся ещё десять и в конце красивый компактный понятный код. А когда перед глазами портянки, сложно сразу уцепить возможность улучшения.

В общем, дорогие джуниоры, учитесь это самое. Даже если у вас в телах if’а повторы, уже повод почесать репку. Чешите репку чаще, оно полезно.

Лучшие ошибки софта VII

Довольно смешная (не смешная для авторов, конечно) ошибка произошла несколько лет назад. Игра Aliens: Colonial Marines вышла в феврале 2013 года и быстро получила шквал критики. Ну очень сырой продукт выпустили. Нещадно бажило всё, от графики до AI. И вот спустя четыре с хвостиком года обнаружился символ, исправление которого привело к наизаметнейшему улучшению поведения монстров. Достаточно было заменить ошибочное «Teather» на верное «Tether». Тестирование? Не, не слышал.

Автомобильная индустрия вовсю напичкивает машины сложным софтом, потому очередная проблема не удивляет. Но масштаб последствий интересный. Итак, Fiat Chrysler Automobiles NV отзывает около 4.8M автомобилей в США по причине баги в круиз-контроле. Вернее, с ним-то всё хорошо. Просто при схождении звёзд в 15 моделях этот контроль потом не выключить, да ещё и замыкание происходит. В общем, веселье, если ты не за рулём.

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

На дне у Ларнаки с 1980 года лежит большой и красивый кораблик MS Zenobia. А лежит он там потому, что в софте, управляющем закачкой балластной воды, выстрелила бага, закачавшая слишком много воды слишком не вовремя. Жертв нет. Как и Зенобии. Зато дайверам раздолье, внесено в карты годных мест.

Долго колебался, добавлять эту историю или нет. Решил добавить, т.к. можно считать примером того, с какой стороны в софт может прилететь проблема и как легко всё испортить, не учитывая все векторы «атаки». На юге Финляндии 12 апреля 1997 года поезда не ходили целый час. Всё потому, что на клавиатуру упала скрепка. Упала под пробел и, как понимаю, накрыла контакты. Дальше я не понял причины (машина запрашивала логин три дня и переполнила винт?), но в итоге сигналы на железке были переведены автоматикой в «стоп». Ну всё и остановилось. В общем, учитывайте и такие случаи, да.