Как стать автором
Обновить

Комментарии 131

При этом некоторые компании отключают GIL на уровне интерпретатора. Например, Wargaming пишет свою систему оплаты в World of Tanks на Python, и он отключил GIL в угоду производительности.

Сходил по ссылке, там говорится, что они Garbage collector отключают, а не gil. Gil можно отключить в расширениях на си, только придется писать на си)

Спасибо огромное, действительно неточность. Убрал эту штуку из статьи.

new_data_struct = [[(k,v) for k,v in d.items() if k not in ['b','u']] for d in init_data_struct]

Можно использовать форматирование:


new_data_struct = [
    [
        (k, v)
        for k,v in d.items()
        if k not in ['b','u']
    ]
    for d in init_data_struct
]

Да, вы правы. Но, кажется, с форматированием, код не стал понятнее. Хотя это моя вкусовщина, но я бы точно поставил nitpick, когда ревьювил код.

Лёгкость понимания таких конструкций дело привычки, а форматировать их не можно, а нужно )

Тогда уж лучше просто:

new_data_struct = []
for d in init_data_struct:
    for k, v in d.items():
        if k in ['b', 'u']:
          new_data_struct.append((k, v)

Ииииии вы инвертировали условие для добавления ключа в new_data_struct

# нам нужно объединить два словаря внутри списка, выкинув оттуда ключи 'b','u'

[[('a', 10)], [('p', 10)]]

Так задача не выполнена. Получилось не объединение словарей внутри списка, а список списков кортежей

Хотел хитрый пример найти, но, видимо, не получилось ( замечание полностью валидно, сорян (

Те, кто пишут код на Python, давно просят разработчиков языка убрать GIL

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

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

Но зачем жить и страдать. Тоже как автор перекатился на Go.

Тогда поподробнее, в чем заключались ваши страдания?

  • GIL

  • Настройка venv для каждого проекта

  • Отсутствие типизации

Ещё конкретнее) GIL вам мешал в ситуации, когда... Я не издеваюсь, просто пишу конкурентные программы, и мне не мешает, вдруг я что-то не так делаю.

Не совсем про GIL, но все же: была задача распарсить лог апача на 10 гигов и собрать стату. Программа на питоне делала это час, программа на си — пять минут.

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

Создание venv — одноразовый процесс, который легко автоматизируется с помощью того же Poetry.

Про GIL было бы интересно послушать, как именно он мешал. Какие-то экзотические задачи были?

Отсутствие статической проверки типов — тут соглашусь, в больших проектах не хватает. Mypy, увы не очень удобен.

Мне нужно скачать 100k файлов с разных ресурсов и записвать в файлы. Может я что-то делаю не так, но работает это не очень быстро.

Это как раз типичная I/O-bound задача. Почему Вы думаете, что тормозит из-за GIL? Тут он как раз не очень мешает.

Посмотрите презентацию с EuroPython 2019. Там миллиард файлов скачивали примерно за 8 часов (синхронный код работал 48 дней). Использовали комбинированный подход: asyncio + потоки + процессы.

Съедается выгода от асинхронщины. Потому что весь флоу исполняется в один поток. Я не старался драматизировать, но многие говорят об этом. При этом, прекрасно понимаю, что не каждому сервису это нужно. Как я уже сказал в статье, Python решает свои задачи, и делает это хорошо.

Асинхронщина и многопоточность — вещи ортогональные. Она и без GIL однопоточная, если сами поток не запустите.

GIL мешает только если вы параллельно делаете вычисления на чистом Python (что бывает очень редко), то есть у вас CPU-bound задача. А большинство задач на чистом Python I/O-bound, и тут GIL не мешает вовсе.

К тому же в расширениях GIL можно отпускать, что и делают всякие числодробильные библиотеки (например, Numpy) — они многопоточные внутри. Можно в Cython легко отпускать его, если не хочется связываться с другими языками.

Разработчики давно говорят, что убрали бы GIL, если кто-то предложит реализацию, которая не замедлит однопоточные скрипты. Пока что такой реализации не видно. Даже в недавно попытке выпиливания GIL прирост скорости от оптимизаций, а не от убирания GIL.

Ну и наконец, есть реализации Python без GIL. Это особенность интерпретатора, а не языка.

Позвольте порассуждаю, если не прав, поправьте. Реально, хочу разобраться.

Работа какого-нибудь апи метода - это не на 100% i/o-bound задача. Там всегда есть cpu-bound составляющая. Парсинг запроса и json'а, формирование запроса в бд, манипуляция с полученными данными, какая-то дополнительная логика, формирование ответа и так далее. Это всё cpu-bound. Значит, что при каких-то понятных нагрузках, в сервисе всегда будут cpu-bound задачи, то есть вся система перейдёт в работу в один поток.

Запрос в БД — это I/O bound задача и она на порядок или два дольше, чем всё остальное.

Парсинг JSON — это код, вызывающий библиотеку, написанную на C или C++, и она, скорее всего, отпускает GIL, так что может работать в фоне.

Манипуляция с данными и формирование ответа — это маленький кусочек времени.

Да, на Go код будет работать быстрее, спорить смысла нет, но это больше заслуга того, что Go — компилируемый язык.

Ну и никто не отменял запуск отдельных процессов-воркеров. На процессы GIL никак не влияет.

Я не говорю, что GIL полезен. Нет, если бы можно было без него, то конечно было бы лучше. К сожалению, он появился не просто так и от него не так просто избавиться.

Я лишь хочу сказать, что GIL часто называют среди главных недостатков Python (точнее CPython). У языка много недостатков, но GIL далеко не главный, и Python медленный в типовых задачах вовсе не из-за него.

Парсинг JSON — это код, вызывающий библиотеку, написанную на C или C++, и она, скорее всего, отпускает GIL, так что может работать в фоне.

Парсинг json'a в недавнем проекте съедал 40% всего времени работы в профайлере

Я не говорил, что это быстро, я лишь утверждал, что это делается внутри библиотеки, которая теоретически может отпускать GIL. Впрочем, я подумал, там, скорее всего GIL всё же будет, так как внутри строится дерево питоновских объектов.

40 % выглядит как довольно большая доля. Не пользуетесь базой или у вас JSON такие большие?

В любом случае решение нужно принимать исходя из проекта. Если у вас нагрузка — запрос в минуту и 40 % — это процент от 10 мс, которые устраивают пользователя, то всё прекрасно.

Если вы не можете использовать процессы по каким-то причинам и нужны именно потоки, и упирается всё именно в то, что декодирование JSON не отпускает GIL, тогда Python не для вас.

Я вовсе не пропагандирую Python сейчас.

В любом случае решение нужно принимать исходя из проекта. Если у вас нагрузка — запрос в минуту и 40 % — это процент от 10 мс, которые устраивают пользователя, то всё прекрасно.

Я просто перекладываю json'ы из кафки в базу. И чем больше база, тем дольше перекладывать. Занимало в среднем 24-32 часов для базы ~500гиг. Переписали на го и теперь 12-14 часов. Json'ы сложные, многоуровневые документы

Ну дело тут не в Gil. Вполне ожидаемый результат, что го быстрее питона. Перепишите на асме и будет ещё быстрей.

Я не говорил ничего о GIL, при чем тут это?

Тут часто время зависит от того, какую библиотеку вы для этого использовали. Стандартная медленная, попробуйте https://github.com/ijl/orjson.

Пробовали, не пошла, уже даже не помню почему.

Стандартный парсер? Есть быстрые парсеры типа simdjson.

Спасибо большое, что объяснили, очень ценная инфа

Значит, что при каких-то понятных нагрузках, в сервисе всегда будут cpu-bound задачи, то есть вся система перейдёт в работу в один поток.

Что-то не то вы написали, программа работает в стольки потоках, сколько вы ей укажете.

Давайте, лучше я вам коротко объясню про Gil. Когда вы пишете программу, то она может утилизировать(нагружать) только одно ядро процессора, остальные будут простаивать. Если вам надо утилизировать все ядра и у вас какой-нибудь Go вы запускаете вашу функцию в 50 потоков(аналог Thread в питоне) и утилизируете все ядра. В питоне 50 потоков будут продолжать работать только с одним ядром. Всё. В этом только проблема gil. Но загрузить в питоне все ядра можно с помощью multiprocessing, просто он менее гибкий и чуть более ресурсоемкий, если коротко. Именно так работают gunicorn и uwsgi с помощью, которых вы сервите ваши flask, Django или fastapi. Так что утилизировать все ядра можно на питоне, а какой-то rocket science на чистом python считать все равно не получится хоть с gil, хоть без. Поэтому без gil-а жизнь может и была бы чуть лучше, но все и так работает.

«большого количества вакансий для Python-разработчиков — изи катка для входа в профессию» — это ложь, на бек на Python вакансий меньше, чем на C#/Java/PHP и там требуется сразу адекатные ребята с прямыми руками.

Лучше скажи автор честно — насмотрелся инфоцыган и повелся на хайп.

12 лет golang... Какой тут хайп? Вы о чём?

Ну типа многие сейчас говорят о golang. Как я сменил языки и тд

Иду прямо сейчас на hh.ru, выбираю Москва. Ищу только Junior вакансии:
"python junior": 264 вакансии;
"java junior": 192;
"php junior": 93;
"php junior": 93.

Ну и я сам нашёл работу джуном без проблем. Кажется, ваш поинт невалиден )

Может быть со знанием Django можно пойти на:

Product/Data Analyst (Junior)
Junior Data Scientist
Разработчик ботов (Python & JS)
Junior ML Engineer
Инженер поддержки (Junior)
Младший специалист по верификации RTL (Junior)
Стажёр-инженер АСУ / Automation junior engineer

И прочие непрофильные сферы, которые показываются по этому запросу? Или инфоцыгане научили, что на Питон вакансий куча, а то что, ты со знанием Django не сможешь пойти в условный ML или QA-Automation (так как это другая сфера и нужен другой стек знанаий) как-то забыли объяснить? Или вот Junior Devops тоже проходит как python junior?

Не понимаю, при чём здесь инфоцыгане? Я даже курс не покупал, когда начинал, учился сам. Вы хотите оспорить тезис про популярность языка Python? Пыху он точно подвинет. C# и Java, кажется, для других задач, Python им тоже не конкурент.

Есть ли в Go, какой-нибудь условно типовой стек наподобие Питоновского: Flask + SQL-Alchemy + Alembic? Было бы интересно узнать, насколько сложно было перейти с Python на Go в бэкенде, заменив один стек на другой, оставив при этом применяемые и тут и там: Docker, Postgersql и Postman?

Scratch, ptorobuf

Я не юзаю пока как таковые веб фреймворки. Мне роутера Gorilla/Mux за глаза.

С докером вообще круто - юзаешь самый минимальный контейнер после билда.

Я даже на Golang реализовывал немного машинного обучения (распознание лиц)

В докер go вообще можно собирать FROM SCRATCH (если cgo не нужен)

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

Не забудьте помимо бинарника скопировать корневые сертификаты, если делаете внешние запросы)

Почитайте вот эту статью: habr.com/ru/company/agima/blog/591435. Для новичка в Го она будет неплохим стартом для погружения.
НЛО прилетело и опубликовало эту надпись здесь

В Go нет ORM. Точнее есть, но сообщество пришло к тому, что это не Go way.

По поводу фреймворка, они есть, но Golang используют в основном в крупных корпорациях, и там юзают свою обвязку на Golang.

Так что в Go фреймворк вторичен, нужно учить сам язык и синтаксис. Также советую посмотреть вот этот видосик, он прольёт больше света по проблеме, которую вы озвучили: https://youtu.be/XR9NiwuiK-k

В гугле "awesome go". Думаю все там есть. По крайней мере я не видел, чтобы отсутствовал какой-то инструмент под го.

Сам по себе переход на другой язык программирование — это сама по себе хорошая идея. Надо меняться.

А я недавно себе книжек по пайтону накупил.

Пойду теперь по Go покупать. :) Мне понравилось, что там код более понятный.

Сам перешел и не жалею! Это по моему мнению самый логичный язык программирования из всех, что я только учил (помимо Python JS,C#, Dart, Visual Basic, Delphi, Lua)

Интересно, что народ думает про Юлю? (Она же Julia.) Её разработчики утверждают, что она проста как Питон и при этом быстра как С, но у меня что-то нет особого впечатления, что ей кто-то пользуется. Почему?

Чтобы переползти на новый язык, нужна мотивация и немного любопытства. Юлия столь же молода, что и GoLang. При этом её изначально позиционировали как вычислительный язык. Ну, типа, фортран сегодня. Вернее, Матлаб, но быстрый. Вот название русскоязычного руководства: "Язык программирования математических вычислений JULIA". Это сильно сбивает, на самом деле. Язык современный, действительно очень простой, но при этом подключает питоновские библиотеки, например. И фортрановские. И сишные. Параллельный не хуже Go. Но вот кому он нужен и где используется - вопрос. Мне хорошо - я одиночка, программирую физические задачки, сделал пару проектов на Юлии просто из чистого любопытства. Поставил галочку - и вернулся обратно. Не думаю, что у этого чудесного языка есть какие-то широкие перспективы, кроме его узкой ниши. Ну, отрежет он что-то у R. Что-то у Питона (биг дату немножко). У Матлаба, безусловно (если он кому-то нужен). Это не тот размах, имхо.

Julia это достойная (и бесплатная) замена таким системам, как Matlab или R. Последнее время в неё вливаются колоссальные деньги https://juliacomputing.com/media/2021/07/series-a/. Но это не язык общего назначения, у неё очень тяжеловесная среда, примерно как Anaconda.

Если программу можно откомпилировать, кому потом помешает тяжеловесная среда?

В чём заключается это "не язык общего назначения"? Нет средств для HTML? GUI? Это вопрос наличия библиотек, а не языка.

Идея у языка интересная (хоть и есть странности в дизайне), но нет экосистемы, а без неё никто на Julia переходить не будет.

Вот что-то никогда го меня не возбуждал (хотя может я просто не понял чего, не углублялся):

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

  2. Компилятор не ловит null-pointer exception, можно получить его в проде, расты/хаскелы ловят на сталии компиляции.

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

  4. Нет механизма чистки языка от легаси, помню был какой-то косяк со строками, который видимо никогда не пофиксят из-за обратной совместимости. В расте вроде решили.

В расте все хорошо. Только попробуй найти работу на нем :)

А дженерики через пару месяцев завезут, но их отсутствие не проблема

Да, работы нет.

Ну поглядим, давно говорят, если дженерики заведут, то по идее и null-pointer проблему можно пофиксить, но опять же на практике обратная совместимость не позволит.

обратная совместимость не позволит.

Для этого есть абстрактный Go2)

Да вот пока нет его, ждём-с

Не понял, а как дженерики связаны с NPE?
NPE - это же завезти "засахаренную ad-hoc монаду Maybe" + поломать обратную совместимость (в Java / С# вон уже сколько лет пытаются - не выходит аленький цветочке).

Да, согласен, просто без дженериков надо Maybe пол каждый тип.

Ну в c# получилось (почти) для новых проектов (хотя для value и reference сделано по разному), а в Java получился Kotlin. Стало получше. Но в общем случае вы правы, надо вообще к херам систему типов ломать, чтобы совсем null победить

Но в общем случае вы правы, надо вообще к херам систему типов ломать, чтобы совсем null победить

Нет, нет, нет. Само наличие null в системе типов — это баг, который пошёл ещё от Алгола. Убрать null — это не сломать систему типов, а, наоборот, починить.

Компилятор не ловит null-pointer exception, можно получить его в проде, расты/хаскелы ловят на сталии компиляции.

Существует линтер: https://staticcheck.io/docs/checks#SA5011

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

  1. Линтеры приучают писать корректный и правильный код.

  2. Код надо покрывать тестами.

И уже научившись писать правильно у тебя не будет проблем с nil-pointer.

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

Насколько знаю го появился как раз потому что умные и талантливые гуглеры (знающие почему люки круглые и решающие весь letitcode за вечер) не осиливали писать правильный код.

В 18 версии дженерики. Я либу пишу, чтоб перенести Option, Result, Either в Go. Конечно enum типа нет и размер структуры будет из за этого больше, но проблема с nil pointer будет решена, как в скале. Если все просто начнут использовать option и явно его обрабатывать

Не, надо чтобы по умолчанию nil был невалидным значением для типа указатель.

НЛО прилетело и опубликовало эту надпись здесь

Panic это не замена для всех исключений.

  1. Да, по началу самого бесили эти постоянные if err != nil, но сейчас привык, и мне нравится. Перехват ошибки может осуществляться где-то в непонятном месте, что увеличивает когнитивную сложность системы, а тут ты ошибки протягиваешь через цепочку исполнения и явно видишь их.

  2. Проблема, согласен.

  3. Дженерики завозят скоро.

  4. Всё-таки, к этому можно по-разному относится. Для кого-то это преимущество, и возможность без проблем обновлять систему на новую версию языка.

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

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

сейчас привык, и мне нравится

Стокгольмский синдром. :)

НЛО прилетело и опубликовало эту надпись здесь

"На самом деле, после питона на голанг пишешь и страдаешь" - все очень индивидуально, у меня как раз ровно обратное впечатление :)

НЛО прилетело и опубликовало эту надпись здесь

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

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

например питонисты до сих пор считают что GIL не проблема

Приведите, пожалуйста, какой-то конкретный пример из Вашей практики, когда GIL сильно мешал и ничего нельзя было сделать.

или что питон быстрый язык.

Это где такие утверждения? Питонисты так не считают.

Dropbox, изначально написанный на Python, переписали часть бэка именно на Golang.

А я помню эту историю, когда пошел хайп, переписывать все на Go, хипстеры из Dropbox тутже кинулись перписывать все с python на golang, конференции, статьи, много шума, закончилось тем, что часть они таки перписали, но вот производительность была не на много выше чем у python, а тут rust пошел на хайп и что? правильно - перпишем все на rust. И в результате, пока google drive, onedrive? да тот же yandex пилили новые фичи, команда dropbox занималась перписыванием старых, кончилось все закономерно, а ведь когда то dropbox был №1 в мире облачных хранилищ.

Чтобы чип не искрился при виде [[(k,v) for k,v in d.items() if k not in ['b','u']] for d in init_data_struct] нужно было учить Хаскель. Кстати, на нём даже веб-сервисы можно программировать (наверное).

Можно, я пробовал WAI/Warp. Проблема в том, что хаскель -- это такой C++ от мира функциональщины, и я в один момент начал болеть и перестал справляться с его сложностью. А ещё Servant -- фреймворк не для начинающих, проверено на личном опыте.

В тему с пояснениями, почему хаскель рано или поздно должен сдохнуть, кастуется @0xd34df00d

НЛО прилетело и опубликовало эту надпись здесь

Не согласен. Благодаря простоте Go, его код легко читаем. Из-за знакомых конструкций глаз сразу цепляется за нужные места и в целом чтение кода похоже на чтение книги.

Тогда как в языках с сахаром часто приходится ломать голову. Особенно если ты только познакомился с каким-то языком на базовом уровне и начинаешь разбираться в коде какого-то проекта или библиотеки. И такие конструкции часто сложно как-то загуглить.

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

Go — достаточно молодой язык. Ему всего 12 лет, и он сразу делался с
оглядкой на то, что код будет выполняться на нескольких ядрах
процессора. И в этом его невероятная сила.

Тут я с вами немножко поспорю. Go это результат опыта полученного от работ над такими языками как Alef и Limbo, а так же платформой plan9. В первых версиях Go был полностью основан на plan9. А это внимание: 1989 год!

Настоятельно рекомендую посмотреть доклад Филиппа Кулина: https://www.youtube.com/watch?v=ql-uncsqoAU

Так что истоки у Go очень древние. Это кстати объясняет подход к работе с ошибками, так как тогда ещё подход с exceptions был не столь популярным среди языков.

медианная зарплата Go-разработчиков выше, чем у разработчиков на Python

Есть предположение, что в этом виноват финтех.

Что странно, в го работать с финансовыми данными не удобно, есть пропозал на добавление нативного decimal64 и decimal128, но это не так модно как дженерики и поэтому движения в эту сторону никакого нету. Кстати кому не лень найдите и лайкните )

Язык-то для сетевых микросервисов, на универсальность не претендовал вроде.

Кстати, пример пхп показывает, что идея языка под задачу не работает в этом мире.

Даже сетевые микросервисы ходят за данными в базу, где денежнве величины хранятся в decimal

Видимо у гугла таких нет.

Лайкнул

"Ответка" о Haskell https://leetcode.com/discuss/feedback/136097/please-provide-haskell-language-support (немного offtop): на момент коммента 96 лайков. Во время того поста на Хабре было 50 голосов на Leetcode https://habr.com/ru/post/569522/comments/#comment_23297884

Вот не понимаю я этого гонева на GIL. Всё равно в проде запускаешь всё через какой-нибудь uwsgi с кучей воркеров, которые рассаживаются по разным ядрам. Концепция многопоточности может и не идеальная, но вполне стройная и понятная. Т.е. по факту проигрыш в скорости не такой уж и значительный. Особенно, если запариться над оптимизацией некоторых моментов.

Но в рамках воркера с async/await синтаксисом всё исполняется в рамках одного треда.

И? Процессоры-то все утилизированы. А то, что сделано не так, как в другом языке... Ну тык языки-то разные!

Но в рамках воркера с async/await синтаксисом всё исполняется в рамках одного треда.

Если это какой-то веб-сервис, который большую часть времени сидит в ожидании I/O, то в чём проблема? Ожидание не блокирует исполнение.

Как я понял, вот откуда "гонево" на GIL:

Основной язык бэкенда компании Lyft — Python. Агрегатор вычислил
стоимость железа на одну поездку в такси, заказанную через приложение, —
14 центов. Количество поездок, совершённых в 2018 году, — порядка 650 миллионов.
Lyft тратил 100 миллионов долларов в год на инфраструктуру, и сейчас
эта сумма ещё больше. Если бы это был Golang стоимость железа могла бы
быть меньше на несколько десятков миллионов долларов.

А где в цитате GIL? Тут о Python в целом. Python менее производительный как минимум потому, что он интерпретируемый, и это не исправить убрав GIL.

Речь не о том, быстрый Python или нет. Очевидно, он проигрывает комилируемым языкам. Речь о том, что если убрать GIL, то код вообще может замедлится.

Ну и ко всему прочему You are not Google.

Я даже не про конкретно эту статью, а в целом. Любят у питона GIL покритиковать. Есть что-то стереотипное в этом наезде.

Докину 5 копеек. В C# быстрее всего поняли, что постоянно трактовая частота расти не будет и завезли async/await, который затем победоносно завезли в JS и Python почти один в один. Плюс у .NET'а сразу был мощный интероп, unsafe и value type. А с появлением .NET 6 с pgo и кучей оптимизаций asp.net вообще ворвался в топ самых быстрых фреймворков по версии tech empower. И все это с дженериками, орм, исключением и возможностью писать коротко. Так что аргумент go моложе, там по-умолчанию все круче, чем в старших собратьях - ну такое:)

Там немного другая история. Async в f# - это computation expression (ближе к корутинам в Kotlin, но немного другая штука). В c# ввели именнно ключевые слова в язык, которые копипастнули в is и python. Ну и f# все же не mainstream-язык. Можно по этой логике добавить, что IO в хаскеле вообще с прошлого века

Балуюсь временами на .NET. Помогаю жене с проектом, ну и так, по мелочи... После этого немного тяжко возвращаться обратно к PHP и Go, которые пока что деньги приносят. В первом нет нормальной типизации, а во втором простыни кода на любой чих, и логика ускользает в процессе парсинга этого кода мозгом. Всё еще не пойму, в чём прикол Go, когда есть Rust.

На сколько я понимаю прикол Go в следующем: делаешь 100500 микро-сервисов, каждый из которых пишет команда обезьянок. Поэтому язык нужен такой, чтобы прям сильно поломать ничего нельзя было. А если код не очень окажется, так не жалко все выкинуть и начать с чистого листа. Зерг раш на максималках такой.

Однажды было высказано такое мнение: Rust — когда надо качественно, на годы вперед. Go — когда надо всё делать побыстрому. Что в итоге выбрали, догадаться несложно :) Опять же, в разрез с командой не пойдешь, когда уже вагон и маленькая тележка сервисов на Go. Смысла еще и Rust добавлять особо нет. Разве что proof of concept запилить в какие-нибудь 5% рабочего времени.

Rust — когда надо качественно, на годы вперед. Go — когда надо всё делать побыстрому.

Вопрос квалификации, на Rust так-то тоже можно быстро.

а во втором простыни кода на любой чих

Так это наверное проблема организации кода, а не языка.

Я имел в виду отсутствие некоторых привычных вещей в стандартной библиотеке.

отсутствие некоторых привычных вещей в стандартной библиотеке.

Можете привести пример?

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

Ну, например поиск элемента в массиве или слайсе. Вместо одной функции приходится писать цикл.

Этот пример я уже привёл и решится он с вводом дженериков. Есть ли у вас ещё какие-то примеры? Хочется подумать над их решениями.

Тоже подумывал перейти с PHP на Go, потом посмотрел сравнение производительности Go и PHP8 и передумал.

Может начну изучать Rust...

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

Нет, php всё ещё умирает)

В китайском Swoole и других похожий фреймворках (ReactPHP, Amphp, RoadRunner, PHP-PM) php не умирает.

Позвольте возразить.
Вы сравниваете несравниваемое. Два совершенно разных языка для совершенно разных задач.
Как человек, некогда писавший на PHP и перешедший на Go, говорю Вам об этом.

Свои пять копеек.

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

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

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

Согласен почти со всем! Особенно про неявность в Python.
Предрекали что он уничтожит неявность, а не будет её плодить.

Тоже перешёл на Golang в качестве основного. Спустя пару лет некоторых вещей всё-таки не хватает.

Спасибо за статью ! Очень интересно )
Сам изучаю Golang в качестве дополнения к основному языку Java )

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

Даже если это переход в рамках одной области ? (с одного back-end языка на другой )
на вашем опыте, сильно ли упала зарплата (в %) ?
P.S
Я понимаю почему упадет зп если ты писал несколько лет сервисы на бэке , а потом решил перейти в ios разработку...Это другая область, которая требует других навыков....А вот если ты писал несколько лет бэк на С++ а потом перешел на Java ...то почему должна падать зп ?)

на вашем опыте, сильно ли упала зарплата (в %) ?

У меня при переходе с Python на Go зп выросла на 30% но корреляции тут нет никакой, просто на предыдущем месте сильно отстали от роста рынка за время пандемии

30% неплохой рост , поздравляю !

Рост на 30% штука тоже относительная .Одно дело, когда было 50тр, стало 65тр. А другое дело, когда было 400, стало 520.

Я живу в Европе и тут зп в тысячах евро в год меряется

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

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

Получается что ваш пример и пример компании Ozon показывает что переход между языками в рамках одной области (back-end) не просто возможен, а необходим для дальнейшего развития карьеры ...Так как существует ряд задач для которых хорошо подойдет python , но плохо подойдет golang , но бывают задачи для который наоборот необходим именно golang...И для компании ценность Вас как специалиста который разбирается в двух языках (инструментах) куда выше если бы знали только python так как найм нового сотрудника это всегда риск и лучше использовать действующий штат)

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

P.S
Интересно ваше мнение на сие сочинение)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий