Семантическое управление версиями (SemVer) — это схема управления версиями программного обеспечения, цель которой — передать смысл основных изменений в выпуске.
🔹 SemVer использует трехкомпонентный номер версии: MAJOR.MINOR.PATCH.
- Старшая версия (MAJOR): увеличивается при наличии несовместимых изменений API.
- Младшая версия (MINOR): увеличивается при добавлении функциональности с сохранением обратной совместимости.
- Версия патчей (PATCH): увеличивается при внесении обратно совместимых исправлений ошибок.
🔹 Пример рабочего процесса
1 — Начальная фаза разработки
Начинаем с версии 0.1.0.
2 - Первый стабильный релиз
Выпуск стабильной версии: 1.0.0.
3 - Последующие изменения
Выпуск патча: Требуется исправление ошибки для 1.0.0. Обновите до 1.0.1.
Второстепенный релиз (увеличиваем младшую версию): новая, обратно совместимая функция добавлена в 1.0.3. Обновление до 1.1.0.
Основной релиз (увеличиваем старшую версию): В версии 1.2.2 введено существенное изменение, несовместимое с предыдущими версиями. Обновление до версии 2.0.0.
4 - Специальные версии и предварительные релизы
Предварительные версии: 1.0.0-alpha, 1.0.0-beta, 1.0.0-rc.1.
Метаданные сборки: 1.0.0+20130313144700.
🔹 SemVer использует трехкомпонентный номер версии: MAJOR.MINOR.PATCH.
- Старшая версия (MAJOR): увеличивается при наличии несовместимых изменений API.
- Младшая версия (MINOR): увеличивается при добавлении функциональности с сохранением обратной совместимости.
- Версия патчей (PATCH): увеличивается при внесении обратно совместимых исправлений ошибок.
🔹 Пример рабочего процесса
1 — Начальная фаза разработки
Начинаем с версии 0.1.0.
2 - Первый стабильный релиз
Выпуск стабильной версии: 1.0.0.
3 - Последующие изменения
Выпуск патча: Требуется исправление ошибки для 1.0.0. Обновите до 1.0.1.
Второстепенный релиз (увеличиваем младшую версию): новая, обратно совместимая функция добавлена в 1.0.3. Обновление до 1.1.0.
Основной релиз (увеличиваем старшую версию): В версии 1.2.2 введено существенное изменение, несовместимое с предыдущими версиями. Обновление до версии 2.0.0.
4 - Специальные версии и предварительные релизы
Предварительные версии: 1.0.0-alpha, 1.0.0-beta, 1.0.0-rc.1.
Метаданные сборки: 1.0.0+20130313144700.
👍13🔥2❤1👏1
Тестирование API вносит значительный вклад в обеспечение надежности, безопасности, функциональности и эффективности приложений за счет оценки маршрутов связи между компонентами программного обеспечения.
Рассмотрим 6 наиболее распростраенных форм тестирования API:
🔹 Тестирование рабочего процесса (Workflow Testing)
Проверяет, правильно ли работает последовательность вызовов API для завершения определенного процесса.
Часто такие тесты рабочего процесса связаны с какой-либо бизнес-целью, например, с совершением покупки на платформе электронной коммерции.
🔹 Тестирование производительности (Performance Testing)
Он оценивает скорость, отзывчивость и стабильность API в различных условиях, чтобы убедиться, что он соответствует контрольным показателям и ожиданиям пользователей.
Он оценивает ключевые факторы, такие как скорость обработки, использование памяти, нагрузка на соединение, время отклика и пропускная способность сети, чтобы выявить потенциальные узкие места.
Цель состоит в том, чтобы убедиться, что система выдает ожидаемые ответы в разумные сроки, даже при различных уровнях нагрузки.
🔹 Тестирование безопасности (Security Testing)
Выявляет уязвимости, которые потенциально могут привести к несанкционированному доступу или утечке данных.
Он включает в себя строгие проверки, чтобы гарантировать, что меры безопасности достаточно надежны, чтобы предотвратить атаки и утечки данных.
Он использует такие методы, как тестирование на проникновение (penetration testing) и нечеткое тестирование (fuzz testing) для выявления уязвимостей. В качестве отправной точки можно начать со списка безопасности API OWASP.
🔹 Тестирование на основе данных (Data-driven Testing)
Передает различные наборы и типы входных данных в API, чтобы гарантировать его корректную работу в различных сценариях.
Он включает в себя использование таблицы входных данных, сопоставленных с ожидаемыми выходными данными, прогон этих входных данных через систему и проверку того, соответствуют ли фактические выходные данные ожидаемым результатам.
🔹 Тестирование конечной точки (Endpoint Testing)
Проверяет, правильно ли отдельные конечные точки API реагируют на запросы и возвращают ли ожидаемый ответ, данные, коды состояния и сообщения об ошибках.
🔹 Тестирование контракта (Contract Testing)
Проверяет, что взаимодействие между поставщиком API и потребителем соответствует предопределенному соглашению / контракту, включая ожидаемые структуры запросов, форматы ответов и типы данных.
Его основная задача — гарантировать, что поставщик API не вносит критических изменений, которые могут повлиять на потребителей, использующих API.
Рассмотрим 6 наиболее распростраенных форм тестирования API:
🔹 Тестирование рабочего процесса (Workflow Testing)
Проверяет, правильно ли работает последовательность вызовов API для завершения определенного процесса.
Часто такие тесты рабочего процесса связаны с какой-либо бизнес-целью, например, с совершением покупки на платформе электронной коммерции.
🔹 Тестирование производительности (Performance Testing)
Он оценивает скорость, отзывчивость и стабильность API в различных условиях, чтобы убедиться, что он соответствует контрольным показателям и ожиданиям пользователей.
Он оценивает ключевые факторы, такие как скорость обработки, использование памяти, нагрузка на соединение, время отклика и пропускная способность сети, чтобы выявить потенциальные узкие места.
Цель состоит в том, чтобы убедиться, что система выдает ожидаемые ответы в разумные сроки, даже при различных уровнях нагрузки.
🔹 Тестирование безопасности (Security Testing)
Выявляет уязвимости, которые потенциально могут привести к несанкционированному доступу или утечке данных.
Он включает в себя строгие проверки, чтобы гарантировать, что меры безопасности достаточно надежны, чтобы предотвратить атаки и утечки данных.
Он использует такие методы, как тестирование на проникновение (penetration testing) и нечеткое тестирование (fuzz testing) для выявления уязвимостей. В качестве отправной точки можно начать со списка безопасности API OWASP.
🔹 Тестирование на основе данных (Data-driven Testing)
Передает различные наборы и типы входных данных в API, чтобы гарантировать его корректную работу в различных сценариях.
Он включает в себя использование таблицы входных данных, сопоставленных с ожидаемыми выходными данными, прогон этих входных данных через систему и проверку того, соответствуют ли фактические выходные данные ожидаемым результатам.
🔹 Тестирование конечной точки (Endpoint Testing)
Проверяет, правильно ли отдельные конечные точки API реагируют на запросы и возвращают ли ожидаемый ответ, данные, коды состояния и сообщения об ошибках.
🔹 Тестирование контракта (Contract Testing)
Проверяет, что взаимодействие между поставщиком API и потребителем соответствует предопределенному соглашению / контракту, включая ожидаемые структуры запросов, форматы ответов и типы данных.
Его основная задача — гарантировать, что поставщик API не вносит критических изменений, которые могут повлиять на потребителей, использующих API.
🔥10
При построении отпимальной архитектуры часто обрщают внимание на две концепции: отказоустойчивость (Failover) и репликация ( Replication). Что представляют эти две концепции?
➤ Отказоустойчивость (Failover) заключается в переключении систем/узлов, когда один из этих узлов выходит из строя. Есть два типа реализации данной концепции:
Активный узел -активный узел: Все узлы обрабатывают трафик. Если один выходит из строя, другой продолжает работать.
Плюсы: нулевое время простоя, высокое использование ресурсов.
Минусы: сложная координация, риск гоночных состояний
Активный узел - Пассивный узел: один узел работает, другой ждет.
Плюсы: легче управлять, меньше конфликтов
Минусы: простои во время переключения, возможная потеря данных в случае задержки репликации.
➤ Репликация (Replication) — это хранение одних и тех же данных в разных местах. Здесь распространены два типа реализации:
Одна ведущая реплика (Single-Leader): один узел пишет, остальные читают.
Плюсы: Более простая последовательность
Минусы: одно узкое место при записи, задержка при чтении реплик
Несколько ведущих реплик (Multileader): запись могут осуществлять несколько узлов.
Плюсы: Все могут писать, более высокая доступность
Минусы: конфликты данных, сложное согласование данных
Что это значит:
1. Репликация НЕ означает нулевую потерю данных.
2. Отказоустойчивость НЕ означает нулевое время простоя.
3. Не стоит выбирать шаблон на основе популярности, а стоит выбирать на основе времени восстановления, допустимой задержки и требований к согласованности.
➤ Отказоустойчивость (Failover) заключается в переключении систем/узлов, когда один из этих узлов выходит из строя. Есть два типа реализации данной концепции:
Активный узел -активный узел: Все узлы обрабатывают трафик. Если один выходит из строя, другой продолжает работать.
Плюсы: нулевое время простоя, высокое использование ресурсов.
Минусы: сложная координация, риск гоночных состояний
Активный узел - Пассивный узел: один узел работает, другой ждет.
Плюсы: легче управлять, меньше конфликтов
Минусы: простои во время переключения, возможная потеря данных в случае задержки репликации.
➤ Репликация (Replication) — это хранение одних и тех же данных в разных местах. Здесь распространены два типа реализации:
Одна ведущая реплика (Single-Leader): один узел пишет, остальные читают.
Плюсы: Более простая последовательность
Минусы: одно узкое место при записи, задержка при чтении реплик
Несколько ведущих реплик (Multileader): запись могут осуществлять несколько узлов.
Плюсы: Все могут писать, более высокая доступность
Минусы: конфликты данных, сложное согласование данных
Что это значит:
1. Репликация НЕ означает нулевую потерю данных.
2. Отказоустойчивость НЕ означает нулевое время простоя.
3. Не стоит выбирать шаблон на основе популярности, а стоит выбирать на основе времени восстановления, допустимой задержки и требований к согласованности.
👍6🔥1🥰1
Иностранные компании снова активно нанимают российских IT-специалистов
По итогам 2024 года они наняли порядка 5 тыс. сотрудников, что в два раза больше, чем годом ранее. Среди наиболее активных работодателей, утверждают отечественные разработчики, китайские Huawei, Alibaba и Tencent, однако активизировались и европейские SAP, Delivery Hero и американские Amazon, OpenAI и т.д.. Спрос на российские IT-кадры вырос и со стороны ОАЭ, особенно в финтех-сегменте, а также есть рост со стороны индийских IT-аутсорсеров
Теперь иностранные компании не только напрямую нанимают сотрудников в качестве фрилансеров. Часть найма происходит через договоры оказания услуг, когда коллективы российских инженеров фактически работают над задачами зарубежных вендоров, не меняя своей юрисдикции
В Минцифры в курсе ситуации, но подчеркивают, что речь идет о частных случаях и массового характера они не носят.
https://www.kommersant.ru/doc/7675878
По итогам 2024 года они наняли порядка 5 тыс. сотрудников, что в два раза больше, чем годом ранее. Среди наиболее активных работодателей, утверждают отечественные разработчики, китайские Huawei, Alibaba и Tencent, однако активизировались и европейские SAP, Delivery Hero и американские Amazon, OpenAI и т.д.. Спрос на российские IT-кадры вырос и со стороны ОАЭ, особенно в финтех-сегменте, а также есть рост со стороны индийских IT-аутсорсеров
Теперь иностранные компании не только напрямую нанимают сотрудников в качестве фрилансеров. Часть найма происходит через договоры оказания услуг, когда коллективы российских инженеров фактически работают над задачами зарубежных вендоров, не меняя своей юрисдикции
В Минцифры в курсе ситуации, но подчеркивают, что речь идет о частных случаях и массового характера они не носят.
https://www.kommersant.ru/doc/7675878
Коммерсантъ
Куда б айти работать
Иностранные компании снова активно нанимают российских IT-специалистов
👍12🙏2
Добавлено руководство по созданию графических приложений с помощью GTK на C#
https://metanit.com/sharp/gtk/1.1.php
#csharp #gtk
https://metanit.com/sharp/gtk/1.1.php
#csharp #gtk
👍33🔥6❤3🤨3💩1
Concurrency (конкурентность) и Parallelism (параллелизм) — два термина, которые часто путают. Но понимание параллелизма и конкурентности имеет важное значение для создания высокопроизводительных и эффективных программных решений.
Конкурентность предполагает управление несколькими задачами одновременно, их смешивание для оптимизации использования ресурсов.
Параллелизм предполагает выполнение нескольких задач одновременно.
Как лаконично выразился Роб Пайк (один из создателей Golang): «конкурентность — это работа с большим количеством вещей одновременно. Параллелизм — это выполнение большого количества вещей одновременно».
Что такое конкурентность?
В современных системах конкурентность обусловлена принципами проектирования, которые гарантируют эффективную работу задач или процессов независимо от того, имеет ли оборудование один или несколько процессоров.
Даже при наличии одного процессора/ядра шаблоны конкурентности позволяют задачам эффективно разделять процессорное время. Это создает иллюзию параллельного выполнения.
Эти шаблоны также позволяют выполнять части программы не по порядку, а в частичном порядке, сохраняя при этом предполагаемое поведение программы.
Что такое параллелизм?
В то время как параллелизм заключается в обработке многих задач одновременно (управление задачами), параллелизм заключается в выполнении многих задач одновременно (выполнение задач).
Параллелизм требует аппаратной поддержки, например многоядерных или многопроцессорных систем, чтобы обеспечить одновременное выполнение различных задач.
Это различие между конкурентностью (управлением задачами) и параллелизмом (выполнением задач) существенно влияет на производительность и эффективность приложений.
Параллелизм особенно полезен для приложений с интенсивными вычислениями, где задачи можно распределить между несколькими процессорами для конкуретного выполнения, что обеспечивает более быструю и эффективную обработку.
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Такой подход позволяет программе инициировать задачи, не дожидаясь завершения предыдущих, управляя несколькими задачами неблокирующим образом.
Отличным примером является Node.js, который применяет конкурентность в однопоточной модели с использованием обратных вызовов и циклов событий.
Между тем, многопоточные среды (например, C#) способствуют как параллелизму, так и конкурентности. Они обеспечивают как конкурентное выполнение задач, так и настоящее параллельное выполнение на нескольких процессорах или ядрах одновременно.
Конкурентность предполагает управление несколькими задачами одновременно, их смешивание для оптимизации использования ресурсов.
Параллелизм предполагает выполнение нескольких задач одновременно.
Как лаконично выразился Роб Пайк (один из создателей Golang): «конкурентность — это работа с большим количеством вещей одновременно. Параллелизм — это выполнение большого количества вещей одновременно».
Что такое конкурентность?
В современных системах конкурентность обусловлена принципами проектирования, которые гарантируют эффективную работу задач или процессов независимо от того, имеет ли оборудование один или несколько процессоров.
Даже при наличии одного процессора/ядра шаблоны конкурентности позволяют задачам эффективно разделять процессорное время. Это создает иллюзию параллельного выполнения.
Эти шаблоны также позволяют выполнять части программы не по порядку, а в частичном порядке, сохраняя при этом предполагаемое поведение программы.
Что такое параллелизм?
В то время как параллелизм заключается в обработке многих задач одновременно (управление задачами), параллелизм заключается в выполнении многих задач одновременно (выполнение задач).
Параллелизм требует аппаратной поддержки, например многоядерных или многопроцессорных систем, чтобы обеспечить одновременное выполнение различных задач.
Это различие между конкурентностью (управлением задачами) и параллелизмом (выполнением задач) существенно влияет на производительность и эффективность приложений.
Параллелизм особенно полезен для приложений с интенсивными вычислениями, где задачи можно распределить между несколькими процессорами для конкуретного выполнения, что обеспечивает более быструю и эффективную обработку.
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Такой подход позволяет программе инициировать задачи, не дожидаясь завершения предыдущих, управляя несколькими задачами неблокирующим образом.
Отличным примером является Node.js, который применяет конкурентность в однопоточной модели с использованием обратных вызовов и циклов событий.
Между тем, многопоточные среды (например, C#) способствуют как параллелизму, так и конкурентности. Они обеспечивают как конкурентное выполнение задач, так и настоящее параллельное выполнение на нескольких процессорах или ядрах одновременно.
👍18🔥2👏2
This media is not supported in your browser
VIEW IN TELEGRAM
(Анимация к предыдущему посту)
👍23🔥5👎1👏1
11 ключевых аспектов проектирования системы и системного дизайна:
1. Основы проектирования систем
Основа дизайна приложений представляют следующие концепции: масштабируемость, типы архитектуры, прокси, балансировщики нагрузки, монолит/микросервисы.
2. Сетевое взаимодействие и коммуникация
Принципы работы служб — от IP-адресации и межсетевых экранов до REST и gRPC, TLS, шлюзов API и обнаружения служб.
3. Кэширование
Стратегии кэширования и связанные темы — Redis, TTL, аннулировании кэша, CDN и локальных и глобальных уровнях кэширования.
4. Балансировка нагрузки
Эффективное распределение трафика, такие стратегии, как Round Robin, Least Connections, IP Hash, global LB, sticky sessions и проверки работоспособности.
5. Управление данными
Управление выбором базы и схемы данных с учетом принципов SQL/NoSQL, ACID или BASE, сегментирования, репликации и разделения данных.
6. Асинхронная обработка
Отвязывание систем друг от друга, применение очередей, событийно-ориентированная архитектура, Pub/Sub, веб-хуки, очереди повторных попыток (retry queue) и такие шаблоны, как исходящие сообщения (outbox) и источник событий (event sourcing).
7. Системы хранения и файловые системы
Неструктурированные и структурированные данные с помощью S3, EFS, BLOB-объектов, фрагментации, сжатия, озер данных и последовательного хеширования.
8. Последовательность и доступность
Обеспечение корректности распределенных систем с помощью строгой/конечной согласованности (strong/eventual consistency), протоколов консенсуса (consensus protocols), распределенных блокировок (distributed lock), векторных часов (vector clock) и кворума (quorum).
9. Отказоустойчивость
Проектирование систем, которые сами восстанавливаются с помощью повторных попыток, автоматических выключателей (circuit breaker), переборок (bulkhead), хаос-инжиниринга и стратегий постепенной деградации.
10. Мониторинг
Отслеживание, отладка и оптимизация производительности с помощью метрик, трассировок, стека ELK, OpenTelemetry, проверок работоспособности и инструментов оповещения.
11. Безопасность и аутентификация
Защита системы с помощью OAuth, JWT, RBAC, защиты от CSRF/XSS, TLS и поставщиков удостоверений, таких как Auth0 и Okta.
1. Основы проектирования систем
Основа дизайна приложений представляют следующие концепции: масштабируемость, типы архитектуры, прокси, балансировщики нагрузки, монолит/микросервисы.
2. Сетевое взаимодействие и коммуникация
Принципы работы служб — от IP-адресации и межсетевых экранов до REST и gRPC, TLS, шлюзов API и обнаружения служб.
3. Кэширование
Стратегии кэширования и связанные темы — Redis, TTL, аннулировании кэша, CDN и локальных и глобальных уровнях кэширования.
4. Балансировка нагрузки
Эффективное распределение трафика, такие стратегии, как Round Robin, Least Connections, IP Hash, global LB, sticky sessions и проверки работоспособности.
5. Управление данными
Управление выбором базы и схемы данных с учетом принципов SQL/NoSQL, ACID или BASE, сегментирования, репликации и разделения данных.
6. Асинхронная обработка
Отвязывание систем друг от друга, применение очередей, событийно-ориентированная архитектура, Pub/Sub, веб-хуки, очереди повторных попыток (retry queue) и такие шаблоны, как исходящие сообщения (outbox) и источник событий (event sourcing).
7. Системы хранения и файловые системы
Неструктурированные и структурированные данные с помощью S3, EFS, BLOB-объектов, фрагментации, сжатия, озер данных и последовательного хеширования.
8. Последовательность и доступность
Обеспечение корректности распределенных систем с помощью строгой/конечной согласованности (strong/eventual consistency), протоколов консенсуса (consensus protocols), распределенных блокировок (distributed lock), векторных часов (vector clock) и кворума (quorum).
9. Отказоустойчивость
Проектирование систем, которые сами восстанавливаются с помощью повторных попыток, автоматических выключателей (circuit breaker), переборок (bulkhead), хаос-инжиниринга и стратегий постепенной деградации.
10. Мониторинг
Отслеживание, отладка и оптимизация производительности с помощью метрик, трассировок, стека ELK, OpenTelemetry, проверок работоспособности и инструментов оповещения.
11. Безопасность и аутентификация
Защита системы с помощью OAuth, JWT, RBAC, защиты от CSRF/XSS, TLS и поставщиков удостоверений, таких как Auth0 и Okta.
👍6👏2🔥1
Вышла новая версия популярного набора компиляторов GCC - GCC 15 (формально GCC 15.1). Напомню, что каждый новый релиз мажорной версии выходит раз в год (так GCC 14 вышел в мае 2024 года.)
Основные изменения в GCC 15:
- добавлен интерфейс компилятора COBOL;
- доработаны интерфейсы GCC на языках D и Modula-2, а также интерфейс Fortran.
- улучшена поддержка новых стандартов языков C и C++ (для C по умолчанию применяется стандарт C23);
- добавлена поддержка новых процессоров (AMD Zen 5 и znver5 среди других новых оптимизаций AMD Zen, Intel Xeon 7 Diamond Rapids, поддержка Intel AVX10.2, больше возможностей Intel Advanced Performance Extensions APX, удалена поддержка Xeon Phi, улучшения в работе с OpenMP);
- доработаны возможности ISA;
- улучшена поддержка для языка Rust (для gccrs);
- бекэнд AMDGPU для графических процессоров AMD теперь также поддерживает стандартную библиотеку C++ (libstdc++);
- улучшена экспериментальная поддержка для универсальных устройств;
- бекэнд NVIDIA NVPTX с GCC15 также поддерживает libstdc++;
https://gcc.gnu.org/gcc-15/changes.html
Основные изменения в GCC 15:
- добавлен интерфейс компилятора COBOL;
- доработаны интерфейсы GCC на языках D и Modula-2, а также интерфейс Fortran.
- улучшена поддержка новых стандартов языков C и C++ (для C по умолчанию применяется стандарт C23);
- добавлена поддержка новых процессоров (AMD Zen 5 и znver5 среди других новых оптимизаций AMD Zen, Intel Xeon 7 Diamond Rapids, поддержка Intel AVX10.2, больше возможностей Intel Advanced Performance Extensions APX, удалена поддержка Xeon Phi, улучшения в работе с OpenMP);
- доработаны возможности ISA;
- улучшена поддержка для языка Rust (для gccrs);
- бекэнд AMDGPU для графических процессоров AMD теперь также поддерживает стандартную библиотеку C++ (libstdc++);
- улучшена экспериментальная поддержка для универсальных устройств;
- бекэнд NVIDIA NVPTX с GCC15 также поддерживает libstdc++;
https://gcc.gnu.org/gcc-15/changes.html
🔥9👍4❤2👏1
Вышла в релиз первая версия среды разработки OpenIDE. Решение создано компаниями «Группа Астра», Axiom JDK и Haulmont на базе IntelliJ IDEA. OpenIDE представляет собой бесплатный и полностью открытый инструмент для Java‑программистов. Среда готова к использованию в реальных проектах.
Основные моменты первого релиза:
-поддержка самой свежей Java 24 "из коробки",
-собственный маркетплейс с 350+ плагинами,
-полноценная работа с Git, Gradle, Maven
-LSP-расширения для Python, Scala, Kotlin,
-открытый исходный код (AGPLv3), собственные серверы обновлений и телеметрии (никакой привязки к JetBrains)
-поддержка Spring и корпоративных технологий.
Оф сайт: https://openide.ru/
Основные моменты первого релиза:
-поддержка самой свежей Java 24 "из коробки",
-собственный маркетплейс с 350+ плагинами,
-полноценная работа с Git, Gradle, Maven
-LSP-расширения для Python, Scala, Kotlin,
-открытый исходный код (AGPLv3), собственные серверы обновлений и телеметрии (никакой привязки к JetBrains)
-поддержка Spring и корпоративных технологий.
Оф сайт: https://openide.ru/
👍14🎃8👎3🔥2