Mad Devs Channel
1.6K subscribers
664 photos
30 videos
1 file
867 links
Канал Mad Devs.🤘Здесь мы рассказываем о жизни компании и инсайтах. Делимся знаниями и лайфхаками IT-индустрии.
Download Telegram
Невозможно просто взять и не поделиться с вами новой задачей 🤩

Вам даны 2 строки: str1 и str2. Вам нужно вывести все возможные варианты преобразования str1 в str2. К str1 применимы операции:

🔸 вставки;
🔸 удаления;
🔸 замены.

Все операции имеют одинаковую стоимость.

Задача: Вам нужно вывести все варианты преобразования str1 в str2 с использованием минимального количества шагов.

Подсказка: последовательность операций является вариантом ответа.

Приступим. Вход: str1 = «abcdef», str2 = «axcdfdh»

Выход:

Вариант 1:

Вставить h;
Заменить f на d;
Заменить e на f;
Заменить b на x.

Вариант 2:

Заменить f на h;
Вставить d;
Заменить e на f;
Заменить b на x.

Вариант 3:

Заменить f на h;
Заменить e на d;
Вставить f;
Заменить b на x.

Как вы бы ее решили? Пишите в комментариях.

Если же вы не можете справиться с задачей, но хотите узнать решение, то оставляйте реакцию 🔥
🔥7
PM Conference в ololoAkJol на Иссык-Куле уже в эти выходные ⚡️

Конференция проводится для проджект-менеджеров, управленцев различного уровня, hr-менеджеров и для всех, кто получает удовольствие от организации процессов в работе и жизни.

Мы также примем участие в данном мероприятии и в роли спикера выступит наш Marketing Project Manager Мария Заиченко с темой о построении процессов в маркетинге.

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

С программой ивента, а также стоимостью вы можете ознакомиться здесь

Бронь:
📞 +996 (777) 1000 30
💬 +996 (504) 1000 30 (W/A)
📍с. Кош-Кель, всего 220 км от Бишкека
🔥5👍2
Особенности языка Swift

В какой-то момент истории Apple решили разработать еще один язык, простой, гибкий, быстрый, и безопасный. Так на свет появился Swift, который они даже сделали Open Source для создания большей активности вокруг него. Ему пророчили большое будущее, и ожидалось его широкое использование далеко за пределами Apple, значительно потеснив Rust и Python.

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

Давайте же разберемся почему и посмотрим на некоторые его особенности 🤟

📌 Опционалы - это специальный тип данных, который может содержать значение или не содержать его. Он используется для предотвращения ошибок при работе с nil значениями, которые часто возникали во время выполнения программы на Objective C из-за неожиданных значений nil. При создании переменной с типом Optional, ей автоматически присваивается значение nil. Для доступа к значению Optional, необходимо его извлечь с помощью оператора !, что именуется как force unwrap или с использованием других безопасных методов.

📌 Оператор guard совершенствует функции if и позволяет более читабельно и безопасно написать код для проверки условий, и выполнять действия в случае, если эти условия не выполнены. Guard проверяет условие, и если оно не выполнено, то выполняет действие, определенное в блоке else. Если же условие выполнено, то дальнейший код выполняется без изменений, при этом программа не падает как если бы это был if.

📌 Wildcard - это специальный символ в языке Swift, который позволяет опустить имя переменной или параметра при вызове функции. Это особенно полезно, когда функция имеет только один параметр и имя параметра занимает много места в коде. Перед именем параметра ставится символ подчеркивания, и при вызове функции можно просто передать значение параметра, не указывая его имя. Это делает код более компактным и читабельным.

📌 Константы обозначаются ключевым словом let и представляют собой особый тип данных. Он позволяет определить значение, которое не может быть изменено после присвоения, иначе компилятор просто выдаст ошибку. В отличие от Objective-C, где использовался атрибут const для объявления констант, который является частью указателя на объект - let может использоваться в различных областях, включая функции и классы.

📌 Функции высшего порядка позволяют передавать функции в качестве аргументов другим функциям и возвращать функции как результат. Это реализовано с помощью замыканий (closures) поддерживающих захват значений из функции, что позволяет избежать потенциальных проблем с изменением переменных внутри замыкания, что не было возможно в Objective-C, где передача функций в качестве аргументов реализовывалась с помощью указателей на функции.

📌 Атрибуты доступа в Swift являются очень продуманной и гибкой системой. Public означает, что класс, метод или свойство открыты для использования из любого файла в приложении. Private ограничивает доступ к элементу только внутри текущего блока кода. Protected - наследуется только дочерними классами. В свою очередь Open и Closed касаются наследования. Если класс помечен как Open, его можно наследовать и переопределять в других классах. Closed запрещает наследование и переопределение. Fileprivate ограничивает доступ к элементу только в пределах файла, в котором он объявлен. Все это создает идеальный баланс между порядком и возможностями в коде.

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

А за что вы любите Swift? Поделитесь с нами!
👍9
Готовы узнать решение задачи, которой мы делились?

Для начала создайте коллекцию строк для хранения необходимых операций. Данная коллекция может быть реализована через vector строк в C++ или List строк в Java. После добавьте операции в эту коллекцию, а затем создайте коллекцию таких коллекций. В которой будут храниться несколько методов (наборов строковых операций).

Для проверки наследования от DP[i][j] используйте Else-if. После чего проверьте все условия, чтобы убедиться, что существуют более одного способа получить элемент коллекции.

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

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

Вам удалось найти решение? Расскажите в комментариях, что у вас получилось 👇
🔥2🤔1
Асинхронные запросы с AbortController

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

AbortController — это класс в JavaScript, позволяющий отменять один или несколько запросов. Это достигается с помощью сигналов, которые генерируются экземпляром AbortController и передаются в функции, поддерживающие отмену, как Fetch, Promise, setTimout, setInterval и fs.

Достоинства AbortController

🔹Безопасность. Использование AbortController позволяет отказаться от сложных и потенциально ненадежных методов для отмены асинхронных запросов.

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

🔹Гибкость. AbortController может быть использован с различными асинхронными API, предоставляя единый интерфейс для отмены запросов.

Какие проблемы решает AbortController?

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

🔹Сложность управления. Без AbortController, управление отменой операций может стать сложным и запутанным, особенно при использовании внешних библиотек или кастомных решений.

Ключевые функции AbortController

🔹Fetch запросы. AbortController позволяет отменять Fetch запросы. Просто создайте экземпляр AbortController, передайте его сигнал в опции Fetch запроса, и при необходимости вызовите метод abort() для отмены запроса.

🔹Promise. AbortController также может быть использован для отмены операций, возвращаемых в виде промисов. Для этого добавьте AbortController к промису и вызовите метод abort(), чтобы отменить операцию. Внутри промиса проверяйте состояние signal.aborted и, если оно true, завершайте промис.

🔹setTimeout и setInterval. Эти функции могут быть обернуты таким образом, чтобы поддерживать AbortController. При вызове abort(), вы отмените соответствующий таймер.

Какие особенности использования AbortController?

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

🔹Одноразовое использование. AbortController не может быть повторно использован после вызова метода abort(), поскольку сигнал становится "отмененным" и остается в этом состоянии и при повторном использовании экземпляра AbortController могут возникнуть проблемы. Поэтому, если вам нужно повторно использовать отмену, вам нужно создать новый экземпляр AbortController.

А насколько полезным находите AbortController вы? Поделитесь вашим опытом в комментариях!
👍5
Такое явление как asService не теряет свою популярность, и их различные разновидности продолжают активно развиваться, во многом избавляя многие бизнесы от необходимости разработки собственных решений.

Сегодня поговорим об одном из них, а именно ServiceNow.

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

Ключевые возможности.

🔹Автоматизация бизнес-процессов. С помощью ServiceNow компании могут автоматизировать свои бизнес-процессы, устранить рутинные и повторяющиеся задачи, оптимизировать рабочие процессы и улучшить операционную эффективность.

🔹Управление ИТ-инфраструктурой. ServiceNow предоставляет возможности управления ИТ-инфраструктурой, включая управление инцидентами, управление изменениями, управление конфигурацией и другие. Это помогает ИТ-отделам эффективно контролировать и поддерживать свою инфраструктуру и улучшать качество обслуживания.

🔹Интеграция с другими системами. ServiceNow предлагает набор API и инструменты для интеграции с другими системами, такими как CRM, ERP и др., которые компания уже использует. Это обеспечивает согласованность данных, повышает эффективность работы и устраняет необходимость в ручном вводе информации в разные системы.

🔹Платформа как сервис. ServiceNow базируется на модели "платформа как сервис" (PaaS), что позволяет компаниям быстро разрабатывать и внедрять новые приложения, а также легко масштабировать их при необходимости.

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

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

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

А что вы думаете о еще одном asService? Поделитесь с нами в комментариях!
👍3
RociFi и Mad Devs покоряют новые вершины! ⚡️

Проект RociFi, над которым работала наша команда, был выбран в программу MasterCard Start Path!

Start Path - это программа по привлечению стартапов. Она включает в себя несколько направлений: привлечение капитала, подключение к широкой экосистеме платежей, создание более инклюзивной экономики и многое другое.

Всего было отобрано 6 финтех компаний со всего мира, чтобы масштабировать инновационные решения и строить будущее коммерции. Мы очень гордимся этим достижением и рады поделиться этой новостью вместе с вами.

RociFi - это сетевой скоринг и протокол кредитования с высокой капиталоемкостью для Polygon и zkSync. Подробнее о том, как мы работали над проектом, вы можете узнать на нашем сайте.
7🔥2
CORS

CORS (Cross-Origin Resource Sharing) - важный механизм, который позволяет веб-браузерам запрашивать ресурсы с сервера, находящегося на другом источнике (домене, протоколе или порту), отличном от того, с которого был исходный запрос.

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

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

Однако по умолчанию браузеры блокируют такие кросс-доменные запросы в соответствии с политикой одного источника (Same-Origin Policy), которая предотвращает возможность межсайтовой атаки (Cross-Site Request Forgery, CSRF).

Как работает CORS?

🔹Предварительный запрос. Перед отправкой основного запроса, браузер отправляет предварительный запрос на сервер с использованием метода HTTP OPTIONS. Этот запрос содержит заголовки, такие как Origin (содержащий источник запроса) и Access-Control-Request-Method (содержащий HTTP метод, который будет использоваться в основном запросе), чтобы указать серверу, какой именно запрос он планирует сделать.

🔹Ответ сервера. Сервер затем отвечает на этот предварительный запрос, отправляя свои заголовки CORS в ответ. Это может включать в себя такие заголовки как Access-Control-Allow-Origin (указывает источники, которым разрешено делать кросс-доменные запросы), Access-Control-Allow-Methods (указывает, какие HTTP методы разрешены) и Access-Control-Allow-Headers (указывает, какие HTTP заголовки разрешены).

🔹Основной запрос. Если сервер поддерживает CORS и разрешает исходный запрос, браузер затем отправляет основной запрос к серверу. Если нет, браузер блокирует запрос и выдает ошибку CORS.

Конечно, тема CORS намного более обширная, и если вам интересны более углубленный разбор и примеры настроек CORS для конкретных случаев - дайте знать в комментариях!
👍9🔥2
Наверное, все так или иначе задумывались, смогли бы работать в Google. Давайте проверим, прошли бы вы собеседование? 🤔

Итак, решите классическую задачу с собеседования в комментариях:⬇️

Есть порядок чисел – 10, 9, 60, 90, 70, 66
Какое число следующее?
🤔13
Mad Devs Channel
Наверное, все так или иначе задумывались, смогли бы работать в Google. Давайте проверим, прошли бы вы собеседование? 🤔 Итак, решите классическую задачу с собеседования в комментариях:⬇️ Есть порядок чисел – 10, 9, 60, 90, 70, 66 Какое число следующее?
Разгадка – здесь необходимо не использовать математику.

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

Например, число 10 - не единственное число, содержащее три буквы. На его месте могли быть числа 1, 2 и 6 (one, two и six). Аналогично, число 9 может быть заменено числами 0, 4 и 5 (zero, four и five). Следовательно, в список включены самые большие числа, которые можно записать словами с определенным количеством букв.

Какое число является правильным ответом? Следующее число после 66 должно содержать девять букв (не считая дефиса) и быть самым большим в своей категории. Если хорошенько поразмышлять, то можно установить, что ответ - 96 (ninety-six). Потому что числа, превышающие 100, не подходят, поскольку для написания "one hundred" требуется десять букв.

Вы можете задать вопрос, почему на месте 70 не стоит "hundred" или "million" или "billion", которые также содержат семь букв для записи? Скорее всего, это связано с тем, что на правильном английском языке не говорят "сто", а "одна сотня", что же касается двух других случаев.

Правильный ответ не совсем очевиден. Google считает ответ 96 приемлемым, но не самым идеальным.

Существует число, которое больше: "one googol" (десять в степени ста). Это число записывается с помощью девяти букв. Однако даже это не самый лучший вариант.

Идеальный ответ: "ten googol", что означает десять в степени ста.
👍4🤔2
Как построить современную архитектуру стартапа

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

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

Сегодня мы обсудим некоторые из самых популярных архитектурных шаблонов для стартапов.

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

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

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

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

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

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

Какие задачи в тестировании ИИ помогает выполнять уже сейчас?

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

🔹Генерация тестовых кейсов, на основе требований и спецификаций, сокращая необходимые при ручном создании время и усилия.

🔹Анализ данных, выявляя неочевидные шаблоны, указывающие на потенциальные проблемы.

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

🔹Тестирование безопасности, выявляя потенциальные уязвимости безопасности, упущенные при ручном тестировании.

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

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

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

Продуктивная коммуникация
Критическое мышление
Эмоциональный интеллект
Нестандартные знания предметной области
И креативный подход к решению проблем.

Развивайте эти навыки, и точно останетесь востребованным при любых обстоятельствах!
👍7
Тренды веб-разработки в 2023

📌 (Мета) фреймворки

Одностраничные приложения (SPAs) и соответствующие фреймворки (React.js, Vue.js, Svelte.js) пережили свои пики популярности и теперь наблюдается тренд перехода от CSR к SSR. Next.js, основанный на React.js, является популярным мета-фреймворком, но есть и альтернативы, такие как Remix. Другие фреймворки, включая SvelteKit и SolidStart, также заслуживают внимания.

📌Utility-first CSS

Tailwind CSS, утилитарный CSS-фреймворк, вызывает различные оценки среди разработчиков. Одним не нравится его громоздкость в коде пользовательского интерфейса, другие высоко оценивают его удобство для разработчиков. Однако с ростом важности SSR, CSS-in-JS решения, такие как Styled Components и Emotion, сталкиваются с проблемами из-за увеличения размера пакета и накладных расходов во время выполнения. В результате разработчики ищут альтернативы, дружественные к SSR, такие как CSS-фреймворки с предустановленными компонентами пользовательского интерфейса, CSS-модули или новые варианты CSS-in-JS с нулевым временем выполнения/компиляции.

📌E2E безопасность

Для фулл стак приложений обеспечение безопасности типов во всем стеке имеет решающее значение. REST и GraphQL были популярными вариантами взаимодействия клиент-сервер, но восходящая звезда под названием tRPC предлагает альтернативу с безопасностью типов. С помощью таких инструментов, как OpenAPI и GraphQL Code Generator, можно создавать типовые схемы для внешнего интерфейса.

📌Инструменты

Create-react-app (CRA) произвел революцию в разработке React, предоставив готовый стартовый проект без необходимости сложных конфигураций Webpack. Однако Webpack устарел, что привело к появлению Vite. Vite, разработанный Эваном Ю (создателем Vue.js), представляет собой следующее поколение фронтенд-инструментов для одностраничных приложений (SPA). Работающий на esbuild, бандлере на базе Go, Vite обеспечивает значительно более быструю упаковку зависимостей по сравнению с Webpack.
Экосистема Vite расширяется за счет таких дополнений, как Vitest, альтернативное решение для тестирования Jest.

📌Разработка с ИИ

Разработка с использованием ИИ набирает обороты, благодаря появлению таких инструментов, как GitHub Copilot и ChatGPT от OpenAI.
GitHub Copilot, выпущенный в 2022 году, объединяет разработчиков с ИИ в предпочитаемом IDE. Он помогает разработчикам, автоматически дорабатывая код на основе их ввода или комментариев о желаемой функциональности.
ChatGPT, более общая языковая модель, также справляется с задачами программирования. Разработчики начали использовать ChatGPT в качестве замены таких платформ, как StackOverflow. Хотя ChatGPT может давать полезные ответы, он не всегда выдает безупречные результаты. Возможность обучения ChatGPT на собственном сгенерированном контенте вызывает опасения по поводу качества и надежности информации в будущем.

Делитесь в комментариях, что вы используете при веб-разработке?
👍4
Как браузеры рендерят страницы?

Все мы знаем, что HTML задает структуру, а CSS задает стили. Но как браузер реально отрисовывает страницу на экране?

Давайте немного разберёмся в основных элементах и их взаимодействии.

DOM (Document Object Model) представляет структуру веб-страницы в виде иерархического дерева объектов. Когда браузер читает HTML-код, он создает объекты JavaScript, называемые узлами (Nodes), для каждого HTML-элемента, таких, как html, body, div и т. д. Узлы содержат информацию о типе элемента, его атрибутах и дочерних элементах. DOM позволяет программам и скриптам взаимодействовать с элементами страницы, изменять их свойства, добавлять или удалять элементы.

CSSOM (CSS Object Model) представляет собой дерево объектов, которое определяет стили элементов веб-страницы. С помощью CSS-селекторов мы можем ориентироваться на элементы DOM и задавать значения для свойств стилей, таких как color (цвет) или font-size (размер шрифта). CSSOM содержит информацию о стилях, примененных к каждому элементу, и позволяет программам и скриптам изменять стили элементов.

Render-Tree строится путем объединения деревьев DOM и CSSOM и представляет собой низкоуровневое представление того, как элементы будут отображены на экране. Браузер проходит по Render-Tree и выполняет расчет лейаута, определяя размеры, позиции и прочие характеристики каждого видимого элемента, последовательно отрисовывая их на странице. В случае изменений, таких как пользовательские взаимодействия или динамическое обновление содержимого, браузер повторяет необходимые шаги для обновления Render-Tree и перерасчета лейаута.

Конечно, данная тема намного сложнее, если еще больше уходить в детали. Но основные технические принципы теперь вам известны, и вы можете оттолкнуться от них для более глубокого изучения.
👍8
В нынешнюю цифровую эпоху организации здравоохранения обратились к облачным вычислениям для хранения и доступа к электронной медицинской информации из-за ее многочисленных преимуществ.

Недавно на Хабре была опубликована статья нашего СIO Андрея Сапожникова, в которой он с разных сторон рассматривает почему важно соответствовать требованиям HIPAA в облачной инфраструктуре: https://habr.com/ru/articles/731428/

Приятного чтения!
👍5😁1
Mad Stream возвращается 🔥

8 июня рекрутер Mad Devs Маргарита Мысина выступит на онлайн-стриме с темой: «Как попасть в Mad Devs начинающему разработчику».

Пожалуй, самый частый вопрос, который мы получаем в ответ на наши посты в социальных сетях это «Я хочу работать в Mad Devs. Как мне к вам попасть?» и именно на него мы постараемся ответить в этом стриме. Наша ключевая задача - рассказать вам на какие нюансы мы обращаем внимание, чем отдает приоритет и что рекомендуем сделать, чтобы увеличить шансы на успешное трудоустройство к нам (да и не только).

Когда: 8 июня (четверг) в 19:00 (UTC 6+)

Вход на стрим – свободный! Ссылка будет доступна в нашем Telegram-канале за 15 минут до начала ивента.
🔥22👍71