Лаборатория Математики и Программирования Сергея Бобровского – Telegram
Лаборатория Математики и Программирования Сергея Бобровского
1.29K subscribers
1.18K photos
24 videos
929 links
ЛаМПовое с Бобровским
Download Telegram
Наблюдаю, как сеньоры регулярно проваливают собеседования за собеседованием.

Они приходят такие, просидевшие 5-10 лет на одном месте, самодовольные (официально в должности "старший инженер-программист"), с внушительным многолетним опытом.

"Я работаю в крупной компании! Я заслуженный сеньор! Я буду тренироваться на этих ваших крошечных стартапах, чтобы попрактиковаться в прохождении интервью".

...

-- Спасибо, что пришли сегодня, Олег! Расскажите пожалуйста нам о проекте, которым вы гордитесь?

Минута молчания. Горжусь? Эммм...

-- Ну, понимаете, был один проект, в котором я участвовал... мы разработали бубулятор...

-- Отлично! Бубуляторы важны для основной деятельности вашей компании?

-- Ну.... думаю, да... ммм..

-- А почему вы его создали?

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

-- Джавалайзер? Странный выбор. Как же так получилось?

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

-- Понятно. И ваша компания размером с Шмандекс?

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

-- Хорошо, давайте двигаться дальше, Олег. Что вы делали в этом проекте?

-- Я помогал.

-- Как помогал?

-- Ну, я был вовлечен в это всё...

-- Что именно вы делали, Олег? Писали код? Проектировали классы? Решили сложную архитектурную проблему? Может быть, в свободное время написали промотрщик котиков?

Неловкое молчание.

...

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

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

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

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

Очень немногие проекты масштабируются "естественно".

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

Именно в этот момент нам как раз нужно набраться смелости и перестать механически делать проект ещё больше.
Поразительно конечно, насколько ИТ-мэйнстрим далёк от понимания самых элементарных принципов computer science.

Что любой язык программирования -- это прежде всего средство моделирования предметных областей, с различной степенью универсальности, и только математика и мат.логика даёт нам тут лучшие инструменты,
и соответственно, та же гомотопическая теория типов -- это самый сильный на сегодня такой инструмент моделирования.
А не эти ваши "наглядные" картиночки, "пояснительные" слайдики, диаграммки с текстами, и прочее хипстерство с нулевым формализмом...

"Types can also provide exact bounds on the number of evaluation steps and result size associated with lambda terms."
The Little Prover

Хотя этому подходу в лучших университетах учат многими десятилетиями, но сегодня уже и университетское образование в мэйнстриме не ценится ...
Джун-Книга.

Глава 1
Я писал код. Я сделал ошибку в коде. Прод упал. Я не виноват. Мне никогда не стать программистом.

Глава 2
Я писал код. Я сделал ту же ошибку в коде, но сделал вид, что не замечаю её. Прод упал. Опять. Я не могу поверить, что прод снова упал из-за той же самой ошибки! Но я опять не виноват. Мне придётся долго становиться программистом.

Глава 3
Я писал код. Я сделал ту же ошибку в коде. Я видел её, и прод снова упал (это уже его привычка!), но я чётко заметил её. Я знаю, в чём она заключается. Я признаю, что это моя вина. Я немедленно покрыл ошибочный код тестами.

Глава 4
Я писал код. Я сделал ту же ошибку в коде. Я написал тесты, и ошибка НЕ ПОПАЛА в прод.


Глава 5
Я писал код. Я НЕ СДЕЛАЛ той ошибки.
15-20 лет назад, если ты умел пользоваться компьютером, а уж тем более интернетом, большинство окружающих считало тебя волшебником.

Вопрос не в том, станем ли мы продуктивно использовать компьютерные технологии сегодняшнего поколения; вопрос лишь в том, как скоро нас принудит к этому жизнь?

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

Что, если, вместо того, чтобы сопротивляться State of the Art до тех пор, пока у нас не останется никакого выбора, мы наоборот решим стать первопроходцами?

P. S. Это верно и для любых других наших навыков, и хард- и софт-. Например, уже сейчас про профилю "киберспорт" выдаются сотни вакансий и будет только веселее. Бумерам действительно это сложно принять :) но это факт.
Почему стремиться стать full stack-разработчиком (позиционировать себя так в резюме) - это стратегическая ошибка?

Вот почему -- это слишком универсальное понятие, и на практике ваше общение с эйчаром будет постоянно сводиться примерно к такому.

- В вашем резюме говорится, что у вас есть опыт работы с HTML, CSS4, JQuery/React, JavaScript, SQL, Python и NodeJS, и что вы знакомы с настройкой и администрированием серверов Linux и Windows.

Вы: Да, все верно.

-- Хм, здорово, я просто пытаюсь определить, действительно ли вам подойдёт вакансия, которую мы обсуждаем. Потому что эта вакансия для full stack-специалиста, вы знакомы с full stack разработкой?

Вы: ...ну, да
(и хотите добавить, что ваши скиллы и есть full stack, но тактично молчите)

-- О, отлично, но этого ведь нету в вашем резюме, поэтому я не был уверен. Вам это надо обязательно подправить. Эти ребята ищут на full stack кого-то, кто умеет работать с CSS, но у вас есть только CSS4, вы знакомы также с CSS?

занавес.
Не один год постоянно наблюдаю, как занимающиеся сами себе часто усложняют процесс обучения. Регулярно отклоняются от темы, гуглят какую-то дикую фигню со stackoverflow, или наоборот, слишком заумные для их текущего уровня вещи, которые изучать будет смысл через 1-2-3 курса, не ранее, иначе в голове сложится странная каша кривейших скиллов. Хотя у меня вообще нету наверное ни одного занятия ни на одном курсе, где требовалось бы что-то дополнительно гуглить. Ну может в 3% занятий даю конкретные ссылочки, но не более.

Спрашиваешь:
- зачем это вам?
- интересненько!

Ну а как это вам поможет в прохождении текущего задания? или помогло уже может быть?

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

Ну и? (с) Карпин

Почаще напоминайте себе конкретную цель в том важном занятии, которым вы занимаетесь в текущий период времени, и обязательно спрашивайте при этом: а имеет ли значение для достижения этой цели то, на что я сейчас трачу своё время?
Стать сеньором в понимании мэйнстрима на самом деле легко. Вам надо проработать пару лет в быстро развивающемся стартапе, или пять лет в стабильной компании, и просто выполнять все рекомендации с моего курса карьеры. Те же, кто начал у меня учиться в 2020-м, и вот спустя год не повысил свою зарплату хотя бы на 15-20%, честно скажу, так ничему и не научился :)
Про продуктивность программистов x10 x100.
Где-то в середине 1990-х работал в фирме, где много программировали на C++ (тогда это был для того времени довольно новый, и при этом единственный, по сути, "серьёзный" язык, применяемый для всех почти проектов на персоналках, а потом Delphi подоспела, и началось тотальное формошлёпство :). И вот пришёл новый кандидат, уже с опытом программирования на C++, который успешно ответил на несколько довольно сложных, и даже экзотических вопросов по этому языку (фреймворков тогда не было, только скромные текстовые IDE - Borland C++ или Microsoft C++). При этом сам парень дружелюбный и коммуникабельный. Все были очень довольны, он, похоже, явно обходил по уровню большинство наших разработчиков.

Его взяли, он включился в проект, и тут стало быстро понятно, что он то ли не может, то ли не хочет заниматься рабочими задачками :)
Он игнорировал требования, делал явно не то, что нужно, не тестировал код... До сих пор так и не знаю, в чём было дело. Он был умен и прекрасно знал плюсы, ну возможно сама работа ему не нравилась, хотя ведь он в принципе знал, куда и на что шёл. В итоге он довольно быстро уволился (после некоторого давления :).

Можно быть хоть 1000-кратно круче других разработчиков, но если не хватает мотивации, этот множитель становится совершенно неважным.
💯1
В ИТ кстати не очень любят не только "джуниоров без опыта", но и слишком квалифицированных сеньоров. Действительно, довольно многие из них -- и совсем начинающие, и самые "старшие" кандидаты подчас не справляются с типовыми задачками, предлагаемыми на собеседовании. Причём эти задачки, вызывающие проблемы и у начинающих, и у оверинженеров -- отнюдь не академические алгоритмы, а вполне реальные проблемы. Джун как правило пока просто не знает, какие абстракции/технологии/инструменты/практики ему лучше выбрать и применить, а сеньор, наоборот, знает их столько, что довольно часто не может эффективно ими распорядиться.

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

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

Самостоятельность означает, что когда вы берётесь за проект, он будет гарантированно выполнен. Несмотря ни на что.

Единственная причина отказа от проекта -- когда он потерял главный приоритет, вот тогда его надо немедленно прекратить.

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

Поэтому критериев, когда ваш текущий проект теряет свой приоритет, только два: либо вам так сказал начальник, либо (когда начальника нету, например, вы делаете проекты на фрилансе) новый проект принесёт вам на 30+% больше денег, нежели текущий.

Во всех остальных случаях без исключения (например, делаете проект просто для себя, для изучения какой-то технологии) вы абсолютно обязаны его завершить.
по мнению начинающего программиста, язык программирования -- это Angular или Блокчейн :)

по мнению миддла, язык программирования -- это Python или Java, C++ или C#

по мнению сеньора, язык программирования -- это F#, Haskell, Coq, TLA+, Arend.
Если N > 1 компаний предлагают одинаковые курсы, например "в профессию Java-программист за 9 месяцев с нуля", значит, N-1 компаний из них не нужны :)

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

Это очень частый вопрос, но проблема у вас в 99% случаев не конкретно с задачами по программированию, а с логическим мышлением в целом. А проблема логическим мышлением в целом связана с тем, что вы лентяи, в школе вы очень плохо изучали математику (или вообще не изучали), а теперь вообще тупите по жизни :)

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

У меня просят периодически что-то волшебное, чтобы прочитать не особо напрягаясь, посмотреть видосик, и ум вдруг станет сильным и начнёт решать сложные задачи. Такие глупые вопросы собственно и объясняются отсутствием даже 1% логического мышления.

Рецепт: начьните :) с школьной математики, именно с самого первого класса. Вы знаете, что такое разряд числа? Ну вот значит вам в первый класс.

Решаете абсолютно все задачки, сколь бы простыми они вам не казались. Не выбирайте, не думайте "а, это я прекрасно знаю", нет -- делайте всё подряд без исключения. С 1-го по 11-й класс всю-всю-всю математику.

Однако, уверен, 100% тех, кому эта рекомендация очень полезна,
ей следовать не будет, а будет откладывать и ждать, когда же появятся волшебные курсы, магические видеоуроки "полным дебилом с нуля в профессию программист за 9 месяцев", которые загрузят в голову знания без тяжёлого труда.

Ждать и откладывать, откладывать и ждать, ждать и откладывать...

Но в таком случае ваша жизнь никогда не cтанет лучше.
В воскресенье я написал пост, как в США топовые учёные ведут научные исследования в области стратегических кибератак, равных которым по масштабам пока не было, а через несколько часов была обрушена работа сети автозаправок по всему Ирану (местные власти обвинили американских хакеров), спровоцировав народные волнения :) даже не знаю, случались ли ранее столь масштабные по социальным последствиям кибернападения.
Совпадение? Не думаю.
Точнее, не думаю, что это было именно такое научно обоснованное нападение, скорее всего, ну в любой реализации TCP-стека например найдётся куча непропатченных багов, да и официально невыявленных ошибок тоже полно.

Cитуация в мире совсем печальная: профессор Карл Хьюитт, автор парадигмы стратегических кибератак, заявил в октябре 2021-го, что в США киберзащита во многих государственных ведомствах организована "на уровне детского сада". У нас, думаю, всё ещё печальнее -- ясли :) ну хотя бы потому, что практически весь софт западного производства. Поможет ли введение Чебурнета? Ну тактически, на несколько лет, возможно, но тут равняться на Китай глупо: и они и США сейчас с огромным отрывом в плане научных исследований лидируют (по криптографии например в США ежегодно международные научные конференции проводятся, а у нас в последний раз была такая 15 лет назад). Отключение от всемирного Интернета нам, в отличие от Китая, стратегически сделает совсем плохо, станут недоступны все научно-информационные ресурсы, и за считанные годы американский AI просто поглотит Чебурнет с потрохами.

Правильно -- активнейшая вписка в мировое научное сообщество, научно-промышленный шпионаж :) , очень качественная подготовка специалистов по computer science мирового уровня, и переформатирование учебных программ российских университетов по информатике.
"Я использую Ubuntu на отдельном ноутбуке. На нём нету интернет-соединения. Я переношу данные на обычной флешке между ним и Маками, на которых я работаю в интернете, или если нужна хорошая графика, но мои семейные драгоценности я доверяю только Linux. Кстати, для наилучшей клавиатурной фокусировки я работаю в классическом менеджере FVWM, а не в GNOME или KDE."
Дональд Кнут
Услуга: уговариваю за небольшие деньги не пытаться войти в ИТ :)
Программная инженерия -- очень молодая профессия. Мы тут многого ещё не знаем и не умеем, а что-то сейчас изобретаем в процессе. Однако у нас есть известные практики, которые стабильно дают хорошие результаты; практики, которые, увы, слишком мало кто применяет.
Вот например очень важный свод знаний, на который можно опираться:
https://www.computer.org/education/bodies-of-knowledge/software-engineering

Однако, уверен, 100% прочитавших это не осилят даже оглавление SWEBOK на уровне 15 топиков :)

Я раньше искренне верил, что со временем большинство людей в ИТ станет придерживаться более формальных, инженерных подходов к созданию программного обеспечения, будет активнее использовать метрики для управления разработкой, потому что всё больше информации становится свободно доступной... однако идут десятилетия, но ситуация только заметно ухудшилась :)
Все эти сервисы-микросервисы, фактически всё то же классическое ООП по Алану Кею: позднее связывание, обмен сообщениями, скрытие состояния и его локальное сохранение.
Объектно-ориентированные языки доминируют на протяжении десятилетий, всё это время занимая удивительно маленькую долю основных научных исследований в области ЯП, если судить по тематике практически всех ведущих международных конференций по computer science.

Академики всё ещё надеются, что ОО-языки волшебным образом исчезнут, что означает, что они просто не понимают, почему ООП выигрывает на практике с огромным преимуществом.

В ФП тратится очень много времени на то, чтобы научиться писать правильные (корректные) программы. Это замечательно, но после этого надо переключиться на то, как научиться писать полезные программы.

P.S. Другое дело, что путь ФП -> ООП очень хороший, но вот путь ООП -> ФП сильно кривой и часто мозги не вправляет, а запутывает ещё больше.
Когда нонешняя человеческая раса исчезнет, и на её место придёт новый, более разумный вид, они уже не будут писать ни на чём привычном нам: ни на C++, ни на Python, ни на Java, не будут использовать ужасающие k8s, react-ы и webpack-и. Они сперва откроют типизированное лямбда-исчисление (которое будет очень похожее на то, которое знаем мы и которое исчезающее малое к сожалению число адекватных людей умеет использовать на практике сегодня), и их мир автоматически станет прекрасным и идеальным.