Настоящие программисты

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

  • Знают ли разработчики историю профессии.
  • Умеют ли (хотят ли) от цитаты дойти до статьи.
  • Понимают ли контекст разработки разных периодов (статья 1972 года).
  • Понимают ли смысл, цели и причины цитаты / статьи такого рода.

Любопытство удовлетворил. Заодно подобрал типовую цепочку реакции, скажем так, ответ на которую попытаюсь дать в рамках темы. Итак (не досимвольно, исправил пару опечаток):

— Думаю, это самая цитируемая отечественная цитата о программистах за всю историю.
— Цитируется, потому что программистам нравится думать, что они особенные?
— Кто придумал это деление на программистов и просто кодеров? Это просто название профессии. Если в трудовой написано программист, значит, программист. Зачем придумывать словам новые значения?
— Кто такой настоящий программист? Повара, сантехники и проектировщики тоже делятся на настоящих и ненастоящих?

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

Начну с Ершова Андрея Петровича. О нём много статей и воспоминаний, потому кратко: один из первых программистов СССР, теоретик и практик, поднял Новосибирскую научную и практическую школу программирования, автор, глава, лауреат, инициатор, изобретатель и т.д. Во многом благодаря ему в школах появилась информатика. Плотно дружил с западными эквивалентами, был на диво выездной (хоть каждую поездку одобряли чуть ли не в ЦК). В общем, один из тех титанов, что это ваше программирование придумывал, когда программирования не было. Человек, с которым можно не соглашаться, но если он чего говорит о программировании, а вам на десятое прочтение в десятый раз кажется, что сказана чушь, читайте ещё и ещё, пока не снизойдёт просветление.
Продолжу эпохой. В 1960..1970 гг. программистов в СССР было мало, достаточно вспомнить справку 1970 года: «В СССР сейчас имеется порядка 3,5 тыс. ЭВМ и около 3 тыс. системных программистов». Это как если бы в современной России оставить только программистов Яндекса, остальных отправить на картошку. Почти все они были с хорошим высшим физмат-образованием, очень многие занимались тем, что сейчас можно с большой натяжкой классифицировать как системное программирование с одним важным уточнением. Если современный системный программист пользуется ассемблером и C, его коллега из прошлого создавал ассемблеры и C. Причина простая: многие модели ЭВМ поставлялись as is — вот железка, вот какой-нибудь базовый набор софта, дальше сами. К другу за чемоданом перфокарт не пойдёшь, т.к. у друга другая модель. А у другого друга третья. И документации мало.
В итоге с качеством, количеством и занятостью программистов тогда сложилась занятная ситуация: они часто и массово решали задачи «напередописать ОС», «напередописать язык» (транслятор, компилятор, интерпретатор) и т.п. По пути приобретали квалификацию, которая позволяла реализовывать собственные идеи (потому к 1980-м в СССР было 10+ диалектов Фортрана, например). Попробуйте сами: купите Arduino без ничего. Пока запустите на ней первую внятную программу, кандидатскую напишете.
Чем больше становилось компьютеров, тем больше становилось людей, решающих с помощью компьютера не задачи программирования, но задачи своих областей. Химики, физики, экономисты, биологи — все они учились программировать до уровня, который был достаточен, если хотели выполнение своих задач ВЦ. Биолог, моделирующий биоценоз подмосковного леса, не нуждался в знании того, как работает ЭВМ, не хотел возиться с нюансами выполнения разных команд, он хотел на ручки и работающую программу.
Интересный документ такого разделения — История Альфа-группы: «Это была первая группа, которая служила посредником между разработчиками и программистами». Обратите внимание на то, как первое поколение программистов в 1960-х начинает пополняться новыми классами. Появляется класс из предыдущего абзаца. Затем появляется класс программистов, которые уже не «разработчики [системных программ]», но сами по себе являются посредниками уже между, скажем, биологами (не желающими программировать) и программированием.
С годами слоёв «посредников» всё больше и больше. Вектор роста годовых колец — от разработчиков к «биологам». Каждое следующее кольцо по отношению к предыдущему поставляет пользователей. Очевидно, этот вектор на каждом слое избавляет разработчика от «лишних» знаний области программирования (информатики, кибернетики, etc). Всего спустя 45 лет между массовым разработчиком и знаниями с умениями, которые потребовались для того, чтобы этот разработчик мог программировать, находится огромная пропасть.

В 1972 году такое развитие было ясно Ершову. Во всяком случае, я в этом уверен. Конец 60-х — раскрутка маховика тотальной ЭВМизации вместе с переходом железа на IBM System/360 (модели Ряда 1 вышли в производство уже с 1971 года). Массово поднималось обучение информатике в вузах, сам Ершов бульдозером двигал информатику в школы (и додвигал до 1985 года — тогда на высшем уровне приняли решение), требовалось всё больше инструментов (ОС, языков, программных пакетов) для тех, у кого нет возможности получить специальное образование с углублением. Отсюда в статье упоминание «конвейера», «работы ради работы» и «работы ради денег», наконец, финальным аккордом «Сделав искусство программирования общим достоянием, мы лишимся своей элитарной исключительности перед лицом повзрослевшего человечества» (NB: не поймёте message этой фразы, не прочитав всю статью).
Потому, думается, Ершов описывал идеального программиста, того инженера и учёного, которого хотел сохранить под грядущим валом массового программирования и неизбежной «конвейеризации». Началось размытие профессии, размытие понятия «программист» с размытием всего того, что делало программирование элитарным занятием. В 1950..1960 гг. определять эталон не требовалось. Почти любой программист самим занятием принуждался быть эталоном — умным, талантливым, образованным, изобретательным и энергичным. А потом всё, началось.
В книге [Нариньяни А.С. Перспективы развития вычислительной техники и интеллектуализация ЭВМ. Новосибирск, 1984] граница проведена уже чётче:

Системный программист — специалист по разработке универсальных компонентов матобеспечения. Обладает профессиональной подготовкой, владеет инструментальными средствами разного уровня.

Прикладной программист — специалист по разработке проблемно-ориентированных систем; как правило, владеет средствами, специализированными для соответствующей области применения.

Обратите внимание на разницу: прикладной программист уже не обладает «профессиональной подготовкой» и не владеет средствами «разного уровня».

Прошло 30 лет. Современный прикладной программист представляет собою на историческом фоне любопытное создание. Профессиональная подготовка либо отсутствует, либо сугубо прикладная (учим языки, а не теории языков). Проблемная область от него зачастую настолько закрыта удобными абстракциями, что не вникает и на мизинчик (всё равно, что в базу сохранять, яблоки или запчасти Роскосмоса). Изобретательство… ну, как бы ловчее один готовый кирпич к другому пристроить, да чтобы вся стена трещинами не покрылась. Самоограничение (о да, я снова сегодня спорил на тему «знаний вне текущих задач») приводит к тому, о чём Ершов косвенно упомянул:

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

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


И вот тут каждый сам решает, кто он. Программист? Настоящий программист? Кодер? Не программист вовсе, но пользователь? Программист, который специализируется на написании DAO на языке XYZ определённых версий в определённых проблемных областях? В какой мере красивые слова Ершова применимы к вам? Всё это не так уж важно. Разве что для горячих дискуссий годится. Всё, мне кажется, за десятилетия уже на наших глазах выйдет на другой уровень того, с чего началось. Программировать станет настолько легко и просто, что это станет общим знанием. Собери из миллиона готовых кубиков типовое решение своей типовой задачи. Продавщица Люся в киоске в ожидании вечерних бухариков будет лениво таскать по экрану компоненты с очередными эмодзи, позитивно изображающими циклы и ветвления.
Но на горизонте в горах в высоких хрустальных башнях будут сидеть новые «системные программисты» 1950-х, только уже 2050-х.

Факультативное чтение для любознательных:

ССИ: Учебник советского военного программиста

Под шквалом разнообразных лидерских курсов может сформироваться впечатление, что в былые времена разработчики представляли собою участников броуновского движения, ни в малейшей степени не заботясь ни об организации собственного труда, ни о подготовке свежих кадров, ни о формировании корпуса руководителей.
С экранов всемирной системы видеовещания YouTube и трибун конференций в слушателя вливают тривиальные или давно известные утверждения так, словно они являются недавними открытиями, способными развернуть отрасль в новые, неизведанные и прекрасные дали. Особую опасность несут адепты так называемых Софт Скиллс (soft skills — англ. мягкие, нетвёрдые умения), уже самоназвание которых должно отвратить сознательного человека, но отвращает, к сожалению, не всех.
Потому книга, которую я почти случайно обнаружил при поиске материалов для цикла статей, потрясла уместностью и актуальностью изложенных методик.
Небольшой томик 1978 года издания предназначался для обучения руководителей нижнего звена, которых сейчас на американский манер принято называть тимлидами (team lead — англ. вожак, руководитель команды). Прошло сорок лет с момента, как текст вышел в свет, а под слоем несколько архаичного и непривычного языка буднично предлагается то же, что с таким запалом проповедуют нам евангелисты Софт Скиллс!
Ценность этого текста кажется настолько высокой, что в сторону были отложены другие статьи и эссе, и я направил все силы на публикацию находки.
После месяца кропотливой работы по восстановлению и оцифровке текста предлагаю обществу разработчиков ознакомиться с маленьким шедевром корпуса нашей профессиональной литературы — [Крыжановский С.В. Учебник советского военного программиста. СамСверсталИздат, 2018]: PDF

Про ответственность

Раз заговорили про ответственность, давайте глубже.
За кадром в интересах другого эссе оставлю тему «а за что же отвечает-то программист», ибо велика она, необъятна и по всей поверхности обмазана программистами, не желающими ни за что отвечать. Предположим, что общественность содрогнулась разумом и смогла сформулировать эти зоны. Скажем, раз ты эту строчку кода написал, ты за неё и отвечаешь. Раз ревьюирующий её вмёржил в мастер, он ТОЖЕ отвечает. И так дальше по цепочке до руководителей, пустивших код в продукт наружу. Утопия прям, ага.
Предположим, что в УК ввели статьи, предусматривающие наказание от 1 года до 15 лет за решёткой. А также ввели в культуру производства штрафы за то, что в УК не уместилось. Тут важно уточнить, что введут именно про программистов и для программистов, так-то и сейчас можно залететь на общих основаниях, если под режимом или по хитрому договору. А предположение затронет всех и везде. Твой код убил людей? Садись. Твой код привёл к простою завода на сутки? Штраф на пару пожизненных. Твой код продолбал миллион полезных чисел? Ну вот миллион и плати. Жёстко, угрюмо, но для модели самое то. К чему это приведёт?

Разработка разделится на две части: «сажабельная» и «всем пофиг». Произойдёт распределение кадров между потоками, подавляющее большинство прыгнет в ту, где риска меньше. Так же распределятся и входящие в профессию. Образуется и пограничная область «не посадим, но штрафами ушатаем», но её судьба после десятка громких дел категории «Петя поставил лишний плюсик, а его за это в рабство! Ироды! Сатрапы!» будет равна «сажабельной».
И да, первые громкие дела будут болезненными. Мало внести изменения в УК, надо воспитать поколения, привыкшие к ответственности. Пока воспитываются новые, будут страдать старые, ползущие в будущее на старой инерции. Бунты будут проходить под лозунгами «мы всегда так делали!», «деды не тестировали и мы не будем!», «все ошибаются, сажайте страну!»
В «сажабельной» оклады будут выше. Просто потому, что кадров у них будет намного меньше. А во «всем пофиг» оклады могут упасть, т.к. они в свою очередь испытают резкий рост кандидатов, готовых работать даже с понижением (лишь бы не посадили). Но не сразу. Долгий период игры и контрактов по новым правилам. Не все работодатели и не сразу осознают, что уже через сутки без дополнительной мотивации у них вообще никто на работу не выйдет, потом от испуга задерут оклад до небес, потом индустрия обвыкнется и нормализует. Но эти качели с дикими индивидуальными случаями войдут в легенду.
Резко скакнёт вверх рынок сертификаций как софта, так и людей. Законодательство может не сразу успеть за практикой, но подтянется (уж что, а регулировать государства любят). Если можно будет делегировать ответственность на других, появятся как другие, так и плата за их услуги. Хотите использовать последнюю версию MongoDB? Либо на свой страх и риск используйте, либо ждите, пока сертифицирующий центр её проверит, поставит штампик «ОТК принял», после чего и. И даже если баги там окажутся, и даже если из-за них нанесён ущерб, вы уже не отвечаете, ответит центр.
Людей тоже начнут сегрегировать. Если Игорю во «всем пофиг», всем пофиг. А вот если в «сажабельную», работодатель захочет больше гарантий того, что ты не просто хипстер с клетчатой рубашкой, но действительно знаешь. Потому сертификации, тесты, экзамены по всем областям. Потому каждый год подтверждение квалификации. Это несколько формализует рынок труда и переведёт его в область «докажи дипломом, а не языком».
Программисты научатся говорить «нет», а бизнес научится их слышать. Тут в целом начнётся интересный психологический сдвиг. Одно дело со стороны рассуждать о том, что тебя не касается и не коснётся. Другое дело не встретить сегодня на работе Васю потому, что он в суде приговор выслушивает. А через месяц увидеть offline у Вани, который в бегах в тайгу подался, дабы не выплачивать огромный штраф. Пока снаряды за горизонтом, сарказьм сарказьмирует, но тут-то они в окошко постучат, сразу интереснее жить и думать.
Так вот. Нет досрочной выкатке в продакшены. Нет нарушениям цикла. Нет работе с низкоквалифицированными коллегами. Нет поблажкам на собеседованиях. Нет внедрению непроверенных решений. Нет «у нас сроки горят, потому катим как есть». Повторю, всё очень просто: если неудачная выкатка подведёт Игната под статью, Игнат предпочтёт потерять работу, отказавшись от выкатки, но не свободу. Если эта же выкатка тянет за собою по цепочке в посадку и руководителей, руководители начнут внимательнее слушать разработку.
Но так будет не со всеми. В Китае 46 преступлений, за которые смертная казнь (от коррупции до наркотиков), всё равно 5000 казней в год. В новой разработке тоже найдутся камикадзе. Первыми падут те, кто не понял, что шутки кончились. Ребята, которым надо пять раз сказать «не влезай, убьёт», а они всё равно на шестой раз влезут, т.к. надо было сказать семь раз. Падут оставшиеся под стрелой за бабло, но без умения обеспечить качество. Падут случайные и племяши знакомых, которых не успеют вычистить руководители. Также падут и руководители, переоценившие уровень своей разработки и решившие, что с той же пионерской бригадой можно жить в новом мире. Жатва будет собираться ежегодно, прореживая контингент.
Разделение пойдёт и в области прогресса. Чем толще регламент, тем медленнее повозка. Бойцы из «всем пофиг» так и будут выпускать по десять фреймворков в год, а вот «сажабельные» бойцы начнут осторожничать и предпочитать проверенные годами решения. Соответственно, снова захватится и рынок. Часть вакансий и кандидатов с условно устаревшим стеком, часть с опережающим здравый смысл. Более того, не все технологии пройдут сертификацию, потому и стек «сажабельных» будет заметно меньше. Правда, это компенсируется нуждой в хороших знаниях.
Возможно, активизируется рынок «заградительных» решений. Более тонкие анализаторы кода, многослойное автоматическое тестирование, автоматические проверки безопасности, легко разворачиваемые стенды проверки на отказоустойчивость. Это тоже может породить свою нишу, в которой специализированные конторы смогут предоставлять недорогие облачные решения и сервисы, прохождение которых тоже могут прикрутить к сертификату качества.
Но всё равно ошибки будут. Меньше на пару порядков, а просочатся. Каждый такой случай будет вызывать шумиху в прессе и в тусовочке, раз за разом поднимая волну. Но общество, обнаружившее, что в каждом углу по десять программ (от прошивки утюга до «прошивки» Боинга), за сбои в работе которых наконец-то можно кого-то наказать, будет так же раз за разом эту волну гасить.

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

Каминг-аут

Рыскал в поисках обсуждений «Элиты», нарыскал пару упоминаний от людей, которых знал лично и с которыми пересекался по работе, и чёт вот за живое взяло, потому что сам я на тогда происходившее смотрю иначе, как оказалось.
Есть ментальная ловушка, в которую часто попадают. Если Петя выйдет на площадь и начнёт кричать «все Пети дураки!», обязательно найдутся граждане, решившие напомнить Пете, что он сам Петя и ещё больший дурак. Кто желает, может ещё раз внимательно перечитать то эссе. В нём ни слова, ни символа о том, что я не такой. Более того, именно я и могу с полным правом писать о том, что программисты никудышние раздолбаи, ибо из всех ПОЧТИ 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. Не могу не проиллюстрировать вышесказанное прекрасным комментарием, полагаю, программиста. Тут и навык освоения материала до выводов. Тут и строгая логика. Тут и глубокое понимание связи возраста с используемым технологическим стеком. Тут и проверка сделанных выводов на дополнительном материале, вполне доступном, конечно же. В общем, если эссе нуждалось в картинке, то вот она.
PPPS. Тем, кто дочитал до этого блока, забавные числа покажу. Есть книга [Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка. Питер, 2018]. Действительно хорошая, довольно известная в мире. Я сначала увидел её на чужом мониторе, а потом на радостях купил отечественное издание в бумаге. Так вот у неё первый российский тираж 700 экземпляров. Потом меленькие допечаточки. Так издатели поступают в России с профессиональной литературой, т.к. (сюрприз!) умеющих читать всё меньше. Спустя пару месяцев книги в больших магазинах уже нет. Повторю: 700. На Россию. Книгу, которая вне России bestseller. Второе число: эссе, в котором говорится по сути, что программистам в голову только короткие тексты лезут, что программисты не могут в учёбу, что книги не читаются и вообще готовы фигнёй страдать, лишь бы не работать — подбирается к 7000 прочтений. В десять раз больше. По данным Роскомстата в 2016 году в IT было 440К+ человек. Пусть [с потолка] программистов 10%. Пусть из них половина бекендеры. 22К человек. И тираж в 700 экземпляров. Может, вы, на самом деле крутые перцы, сплошь PDF’ку купили или с торрентов скачали? Хорошо. А почему в англоязычных интернетах программисты эту книгу на форумах обсуждают, в блогах упоминают, друганам советуют, а в нашем сегменте болота тишина? Sapienti sat, не?

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. Ну и да, всё станет интереснее, если вам будет помогать знакомый разработчик. В идеале муж или жена, чтобы можно было ночью разбудить и красными глазами напугать. Дерзайте, в общем. У девяти уже к третьему месяцу азарт пропадёт, а вот один прорвётся к финишу.