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

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

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

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

Поэтому критериев, когда ваш текущий проект теряет свой приоритет, только два: либо вам так сказал начальник, либо (когда начальника нету, например, вы делаете проекты на фрилансе) новый проект принесёт вам на 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-и. Они сперва откроют типизированное лямбда-исчисление (которое будет очень похожее на то, которое знаем мы и которое исчезающее малое к сожалению число адекватных людей умеет использовать на практике сегодня), и их мир автоматически станет прекрасным и идеальным.
Очень люблю F# и считаю, что изучение ФП надо начинать с языков семейства ML, но всё же следует признать, что из всех функциональных языков Haskell -- самый очевидный и в то же время самый сложный язык ФП из всех.

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

Сложный? ровно потому, что в мире найдётся всего несколько просветлённых мудрецов (на пальцах одной-двух рук), умеющие качественно объяснять Haskell другим.
Что нужно знать младшему разработчику? Вот что.

Ваш код -- отстой.
Ваш дизайн, ваша архитектура -- отстой.
Ваш выбор имён для классов/переменных/и т. д. -- отстой.
Ваш выбор инструментов и технологий -- отстой.

Но это нормально -- до тех пор, пока вы понимаете одну важную вещь...

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

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

Все эти элиты когда-то были на вашем месте.

Что нужно знать джуниору прежде всего? Вы должны чётко знать и понимать свой путь, прежде чем даже пытаться по нему идти.
А если без компаса, то это просто брести неведомо куда (чаще всего по кругу).
Дядюшка Боб на днях написал:
"You should definitely learn GO, F#, Scala, Elixr, Rust, Elm, Kotlin, Swift, etc.
But first, learn Clojure."

Солидарен! Круче Лиспа в ФП ничего не было придумано, и уже не будет.

наблюдение: если из Лиспа удалить скобочки, то мы получим ML :)
Почему крупные компании используют Java, хотя на самом деле C# в плане системы типов например явно получше, чем Java?
Потому что Microsoft (как обычно) потребовалось много времени, чтобы понять, что языки должны быть кросс-платформными. Если бы они создали что-то вроде .net core на 10 лет раньше, Java, вероятно, уже вымерла бы.
"I just recently finished my job search and a lot of the startups I interviewed at were using typenoscript. So if you want to do frontend work at unicorn startups I suggest you get experience with that."
https://news.ycombinator.com/item?id=29140062

Сам по себе TS сегодня прежде всего для строчки в резюме must have (изучить хороший учебник + запилить пару проектов на гитхаб),
стратегически его Microsoft конечно достаточно сильно продавит,

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

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

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

Передача кода другому разработчику на code review перед тем, как отправить его в продакшен -- это всё та же защита от дурака, которая всегда работает очень хорошо.

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

Типовые рекомендации по подобным защитам:
https://habr.com/ru/company/badoo/blog/333592/
Ситуация в ИТ сегодня такая скоростная, что если к вам персонально (а не эйчаровским спамом) за последние полгода по поводу перехода на другую работу программистом никто не обращался, если именно вас, лично, давно никуда не зовут, значит ваша карьера стремительно летит под откос.
В 1984-м 37% программистов в мире были женщины, а сегодня их в ИТ около 10%. Я работал в 1980-е в ГВЦ Миноборонпрома СССР, ну там прикладными программистами работало вообще 80% женщин. Не знаю почему так сегодня всё изменилось, реально не понимаю: из занимающихся у меня представительницы прекрасного пола в целом существенно лучше учатся и понимают программирование, нежели ребята.
Регулярно рекомендую язык+экосистему Erlang
https://www.erlang.org
для практики в парадигме акторов (математическая модель параллельных вычислений, единственная практическая на сегодня, которая преодолевает ограничения недетерминированной машины Тьюринга).

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

Ну может быть какие-то тайные работы ведутся, хотя очень сомневаюсь,

а сам эрланг ну совершенно несекьюрный язык )))
Полезно ли указывать в резюме знание C++?

Почему бы и нет, если вы действительно в нём компетентны?

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

Возможно, вы программируете на Java или C#, не особо завязываясь на какие-то специфические фичи стандартных библиотек, и способны быстро перенести 80% своего кода с этих языков на С++ просто на уровне синтаксиса и описания классов, с минимальными правками -- для этого достаточно просто почитать несколько часов какие-то быстрые старты в синтаксис плюсов на уровне википедии.

Так вот, этот уровень совершенно не соответствует знанию C++.

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

Конечно, вы можете просто написать в резюме, что "немного знакомы с C++", или что имеете небольшое рабочее понимание, но зачем?

Потому что никому нету до этого дела.

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

Неважно, пишете вы на Java или C++ или Python, или на чём угодно другом, это не имеет особого значения. И если вам задают вопрос о многопоточности, вероятно, не стоит вдаваться в детали её реализации в JavaScript.

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