Pull to refresh

Comments 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?

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

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

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

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

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

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

UFO just landed and posted this here

В 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 был невалидным значением для типа указатель.

UFO just landed and posted this here

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

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

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

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

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

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

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

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

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

UFO just landed and posted this here

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

UFO just landed and posted this here

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

У меня ровно обратные ощущения после перехода на го, на питон смотреть больно. А вообще изучение новых языков сильно помогает развить кругозор, замыкаясь в одном языке перестаешь видеть его проблемы, например питонисты до сих пор считают что 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

UFO just landed and posted this here

Не согласен. Благодаря простоте 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

Вот не понимаю я этого гонева на 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 строит все при каждом обращении насколько я знаю...

В китайском 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% штука тоже относительная .Одно дело, когда было 50тр, стало 65тр. А другое дело, когда было 400, стало 520.

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

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

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

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

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

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

Sign up to leave a comment.