Сообщество - Лига программистов
Добавить пост

Лига программистов

1 538 постов 11 434 подписчика

Популярные теги в сообществе:

Почему все ломается всегда в субботу утром?

Для понимания контекста: у меня небольшая IT компания по внедрению BPMS, ServiceDesk системы одного из российских вендоров.

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

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

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

Б#@ть, истек срок лицензий пользователей. Вендор забыл продлить.

Так что, правило "Не деплой в пятницу", не всегда спасает от проблем в субботу утром(

Другие интеграторские истории

Разбираем задачку с LeetCode на Dynamic Programming

Вчера у меня случилась великая радость - я наконец-то без подсказок написал решение medium DP задачи, используя bottom-up подход (то есть циклом вместо рекурсии). Рекурсивные (up-down) подходы более интуитивны, зато циклы дают лучшую производительность и меньшее потребление памяти. В общем, давайте попробуем разобрать daily-challenge c LeetCode за вчерашний день.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Дана строка, нужно найти и вернуть самый длинный палиндром из нее (если несколько одной длины, вернуть любой).

Начинаем с интуитивного решения. Рекурсивно переберем все возможные варианты.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Не самый красивый код, но со своей ролью справляется.

Предсказуемо работает - и вылетает по Time Limit. Еще бы, у нас Time Complexity O(n^3). Кошмар.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

А ведь это далеко не самая большая строка...

Но ведь это задачка на DP. Даже если бы этого не было в тегах - все равно можно понять, что места для оптимизации тут есть, ведь мы по факту обрабатываем некоторые подстроки по многу раз. Скажем, если мы возьмем слово длиной в 5 символом, то, построив стек вызовов в виде обычного бинарного дерева, можно убедиться, что подстрока [2,3] будет проверена трижды. Не круто.

Давайте-ка добавим мемоизацию.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

О, мы сразу прошли все тесты (снизили TC до O(n^2)). Но результаты не радуют.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Особенно ужасает потребление памяти. Даже для Java это перебор.

Плохо. В основном плохо из-за мемоизации строк (приходится тратить время и место на их обрезку и хранение), плюс недешевая проверка на палиндром в O(n). Давайте-ка перепишем на bottom-up.

Мы помним, что у задачек на палиндром есть три общих случая в зависимости от длины строки n:

  • Если n = 1, строка всегда палиндром (в каком направлении букву не читай, выйдет одно и то же).

  • Если n = 2, то строка палиндром, если первая буква равна последней.

  • Если n > 2, то строка считается палиндромом, если первая буква равна последней, и строка между ними - палиндром.

Собственно, мы просто заполняем dp таблицу прямо по этому принципу.

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Гораздо симпатичнее, но в разы менее интуитивно

Смотрите, какая красота

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Да, это все еще в нижней планке решений (благодаря тому, что существует довольно замысловатый алгоритм, решающий эту проблему за линейное время), но в три раза сократили Runtime, и в два - потребление памяти. Это все еще O(n^2), но скажем так, с куда более приемлимыми константами.

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

Разбираем задачку с LeetCode на Dynamic Programming IT, Faang, Длиннопост

Так что имеет смысл уметь решать dp алгоритмы и сверху вниз, и снизу вверу. Чисто на всякий)

Показать полностью 8

Интересные изменения в Golang 1.21

Golang 1.21 это новая версия языка программирования Go, которая была выпущена 15 октября 2023 года. В этой версии были внесены некоторые изменения в язык, инструменты и библиотеки.

Интересные изменения в Golang 1.21 Программирование, Программист, IT, Разработка, Golang
  • В язык были добавлены три новых встроенных функции: min, max и clear. Функции min и max вычисляют наименьшее (или наибольшее, для max) значение из фиксированного числа аргументов. Функция clear удаляет все элементы из карты или обнуляет все элементы среза. Подробнее см. спецификацию языка.

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

  • Было сделано несколько улучшений, которые повышают мощность и точность вывода типов. Теперь (возможно частично инстанцированная обобщенная) функция может быть вызвана с аргументами, которые сами являются (возможно частично инстанцированными) обобщенными функциями. Компилятор будет пытаться вывести отсутствующие типовые аргументы вызываемой функции (как и раньше) и, для каждого аргумента, который является обобщенной функцией, которая не полностью инстанцирована, ее отсутствующие типовые аргументы (новое). Типичные случаи использования - это вызовы обобщенных функций, работающих с контейнерами (например, slices.IndexFunc), где функциональный аргумент также может быть обобщенным, и где типовой аргумент вызываемой функции и ее аргументов выводится из типа контейнера.

  • В инструментах были сделаны различные улучшения производительности и исправления ошибок. Например: go build теперь поддерживает флаг -trimpath для удаления всей информации о файловой системе из скомпилированных исполняемых файлов; go vet теперь проверяет корректность использования R15 при динамической компоновке на amd64; go mod tidy теперь удаляет неиспользуемые замены из go.mod.

  • В библиотеках были добавлены новые пакеты и улучшены существующие. Например: был добавлен новый пакет log/slog для структурированного логирования; был добавлен новый пакет testing/slogtest для поддержки тестирования кода, использующего log/slog; был добавлен новый пакет slices для работы со срезами любого типа; был добавлен новый пакет maps для работы с картами любого типа; был добавлен новый пакет cmp для сравнения значений разных типов.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью

Есть ли какой то толк от сертификатов coursera при трудоустройстве на работу?

Смотря на вообще на них?

Есть ли какой то толк от сертификатов coursera при трудоустройстве на работу? Сертификат, Coursera, Работа, IT, Курсы
Есть ли какой то толк от сертификатов coursera при трудоустройстве на работу? Сертификат, Coursera, Работа, IT, Курсы
Показать полностью 2

Ацтань, я не хочу в офис

Ацтань, я не хочу в офис

Ответ на пост «Пузырь ВойтиВАйти»

Вместо вступления

Ну, йобанный свет! У меня 16 лет стажа в "АйТи" сфере. Знаете, как мы в нулевых "входили в АйТи"? Берешь, блядь, и входишь! Вот, так:

Ответ на пост «Пузырь ВойтиВАйти» Успех, Карьера, Личный опыт, Мотивация, Опыт, Саморазвитие, IT, Длиннопост, Текст, Мат, Ответ на пост

Лучший гуру методик входа в любое место.

Т.е. поступаешь в универ, первый год нихрена не делаешь, ибо охуеваешь от происходящего и количество новизны для тебя. А вот второй год начинаешь вникать и "тыкаться". У тебя впереди четыре года - ты можешь "потыкаться" хоть в веб, хоть в финтех, хоть в embeded, хоть куда. Это шикарное время для наработки опыта.
Кто-то скажет, мол-де: "А учиться когда?!" - ко-ко-ко... Когда надо, тогда и учишься. Берешь - и учишься! Я официально, по ТК, устроился сайты писать летом после 3-го курса, имея уже за плечами почти год шабашек фриланса.
Прелесть работы во время учебы в универе в том, что вы можете ее менять, как перчатки,Ю и и можете соглашаться на совершенно безумные условия, хоть за еду - вам нужен опыт.

И вот, вы заканчиваете универ, а у вас уже 2-3 года коммерческой разработки. Да, работодателям не просто знание и абстрактный опыт нужны, а именно коммерческая разработка. Это термин подразумевает под собой не просто академические знания, но понимание культуры. И речь не только про разрабов, речь про всех: дизайнеров, манагеров, продактов, аналитегов и тд.

Естественно, выходя совсем "сухими" из универа, вы нафиг никому не нужны. А что с вами делать?! Обучать вас? Так это не +1 человек, а -1 из команды - еще хуже.

Что делать, если тебе уже 35, а ты никуда не вошел, кроме ипотеки?

Учиться. Опять. Но на этот раз платно. Желательно найти школы/курсы при реальных конторах: Самокат, Йандекс, Газпром, SkyEng, Авито - их много. Смотреть самостоятельные конторы, которые не аффилированы ни с кем, и тем более которые не предлагают заключить официальные договоры, не нужно. Серьезно.
Тут, правда, одна проблема: если денег кандидат может еще накопить, то со временем свободным могут быть проблемы. Но тут решение только одно: посмотреть на картинку выше. К сожалению, иначе никак.

Комментарии по исходному посту

  1. Профзаболевания - подберите нормальную периферию к компу, и проблем не будет.
    2. Удаленка - да, по началу может слегка напрягать, но тут главное - завести угол, в который вы не будете заходить вне работы. Все, проблема решена. А вот, что делать, если у вас есть семья с детьми, я не знаю, но как минимум, понадобятся две вещи: хорошие наушники и место с дверью.
    3. Отношение российского менеджмента и эффективных сов - проблем не вижу. Дерьма везде и вегда хватало, потому что везде - на минуточку! - работают живые люди, как и вы сами. Нужно просто понимать специфику конкретной конторы, и все: вы либо уходите из конторы, если совсем никак, либо подстраиваетесь, либо что-то меняете, если можете - ебать моск никому не нужно из-за этого.
    4. Постоянная гонка знаний - ДА! А как иначе? Мир развивается - нужно успевать за ним.
    5. Объем знаний что нужно освоить - мама не горюй - опять: ДА!
    6. Зачастую не нормированный рабочий график, дедлайны, стрессы - в стартапах - да, так и бывает. Если нет, то см. п.3. Т.е. это опять же - вопрос выбора.
    7. Что еще сказать - ничего не надо, итак уже наговорили :)

В качестве заключения

Блядь, АйТи - это просто работа, коих тысячи. Не хотите/не можете, идите на завод, на электростнацию, на другое предприятие. Мой одногруппник стал зам.начальника цеха на хим.комбинате местном - шикарно живет и отлично себя чувствует. Он пошел туда работать, когда 13 лет назад его не взяли в ФСБ после армии. Другой открыл контору, продает карнизы - растет и он, и его контора. Третий открыл пекарню - уже сеть по городу! Четвертый франшизу купил у CoffeeLike 10 лет назад, когда над ним друзья ржали. Сейчас - всю областную агломерацию точками покрыл.

Суть не в АйТи, суть в том, что у вас получается, и что вам нравится. Все остальное - демагогия и пиздострадания, прекращайте!

Показать полностью

Небольшое сравнение C# и Go для backend

Выбор между C# и Go (Golang) для backend веб-разработки зависит от различных факторов, таких как требования проекта, опыт команды разработчиков и предпочтения.

Небольшое сравнение C# и Go для backend IT, Программист, Golang, Разработка, Backend, Программирование

C# является объектно-ориентированным языком программирования, разработанным Microsoft. Он широко используется для создания веб-приложений на платформе .NET. C# имеет мощную экосистему инструментов и библиотек, которые обеспечивают высокую производительность и эффективность разработки. Он также поддерживает многопоточность, асинхронное программирование и взаимодействие с базами данных. Если у вас есть опыт работы с .NET или если ваша команда уже знакома с C#, то он может быть хорошим выбором для backend веб-разработки.

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

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью

Готовы к Евро-2024? А ну-ка, проверим!

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

А если не любите полагаться на случай и сразу отправляетесь за техникой Hisense, не прячьте далеко чек. Загрузите на сайт и получите подписку на Wink на 3 месяца в подарок.

Готовы к Евро-2024? А ну-ка, проверим! Футбол, Тест, Евро 2024, Болельщики, ВКонтакте (ссылка)

Реклама ООО «Горенье БТ», ИНН: 7704722037

Что же такое замыкание в Javascript

Замыкание (closure) в JavaScript - это функция, которая имеет доступ к своему собственному лексическому окружению, а также к окружениям внешних функций, в которых она была определена.

Что же такое замыкание в Javascript Программирование, IT, Программист, Javascript, Разработка, Web-программирование

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

Замыкание создается, когда внутренняя функция ссылается на переменные из внешней функции. Например:

function outerFunction() {

var outerVariable = 10;

function innerFunction() {

console.log(outerVariable);

}

return innerFunction;

}

var closure = outerFunction();

closure(); // Выведет 10

В данном примере функция innerFunction является замыканием, так как она ссылается на переменную outerVariable из внешней функции outerFunction. Даже после того, как outerFunction завершила свое выполнение и переменная outerVariable вышла из области видимости, замыкание все еще имеет доступ к этой переменной.

Замыкания часто используются в JavaScript для создания приватных переменных и методов. Они позволяют скрыть внутренние детали реализации и предоставить только необходимый интерфейс для работы с объектом.

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

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью
Отличная работа, все прочитано!