Почти любая статья про DevOps начинается с определения, что же представляет собой это понятие. Не нарушая традицию, отметим, что у слова DevOps два значения.  Во-первых, это набор методов для решения различных задач, с которыми сталкиваются разработчики. Это и написание сценариев для автоматизации инфраструктуры, и оптимизация процесса разработки программного обеспечения (например, развертывание приложений в различных средах). Сюда же относится управление инфраструктурой, в том числе мониторинг состояния и масштабирование серверной базы, обеспечение быстродействия при высокой нагрузке, а также задачи в области тестирования приложений и сетевой инфраструктуры. А во-вторых, под словом DevOps подразумевают тех людей, которые выполняют все эти задачи, то есть DevOps-инженеров. Нередко встречается мнение, что DevOps не профессия, а, цитируем, «прежде всего культура разработки, методология и только потом инструменты и специальности». Но одно другого не исключает, тем более, что в списке вакансий всё чаще фигурирует DevOps Engineer. Так что де-факто это уже стало профессией, но более грамотно всё же называть этих специалистов не просто «девопсами», а DevOps-инженерами или командой DevOps, если речь идет о целом отделе. Главными задачами DevOps-инженеров являются сокращение времени разработки ПО без потери качества, обеспечение безопасности, выявление и исправление ошибок и минимизация их возникновения в последующих версиях продукта. Целью команды DevOps является обеспечение наилучших результатов в кратчайшее время за счет постоянной обратной связи между остальными участниками процесса разработки. Фактически команда DevOps является связующим звеном между программистами, тестировщиками и администраторами. А вот более конкретное описание важных задач, решением которых занимаются DevOps-инженеры: Управление проектом. DevOps-инженеры следят за тем, чтобы все участники процесса разработки понимали, что и зачем они делают, помнили о сроках выполнения задач. Кроме того, DevOps-инженеры выступают посредниками между остальными, обеспечивая быструю и слаженную работу всей команды. Проектирование и совершенствование инфраструктуры. Инфраструктура может сдерживать разработчиков: инженер DevOps поможет определить, как можно улучшить ее, чтобы быстрее выводить новые версии продукта на рынок. Автоматизация. Одна из главных задач специалиста DevOps — сократить количество часов на разработку за счет использования полезных инструментов (их можно найти или написать самостоятельно), которые позволят автоматизировать выполнение важных повторяющихся задач. Обратная связь. Одна из главных задач инженера DevOps — наладить обратную связь с отделом разработки для сокращения времени обнаружения ошибок (TTD) и их минимизации (TTM). Безопасность разработки. SecDevOps — так называется специалист, который должен обеспечивать функциональную и безопасную инфраструктуру, а также качество автоматизации ключевых процессов. Одним из популярных вопросов является: «Должен ли инженер DevOps уметь программировать?» Здесь нужно понимать, что в зоне ответственности DevOps находится не только координация работы команды, но и, например, автоматизация рутинных задач, для чего потребуется подключать специальные инструменты. Поэтому умение хотя бы дорабатывать код — это обязательное условие, ведь найти готовые плагины или модули под специфические задачи порой невозможно, а тратить время программистов из отдела разработки на написание этих инструментов нецелесообразно. А вот ключевые навыки для тех, кто откликается на вакансию DevOps Engineer: Коммуникабельность, организаторские способности и ответственность. DevOps-инженеры регулярно проводят встречи, устанавливают графики для выполнения задач, руководят проверкой, а также выполняют большой объем другой работы, о которой мы говорили выше. Поэтому такой человек должен уметь организовать себя и других, а общение с коллегами не должно быть для него в тягость. Хороший DevOps-инженер не навязчив, однако вовремя напомнит о себе, доброжелателен, однако требователен. И всегда внимателен. Опыт работы в IT. Инженеров DevOps можно найти практически в любой области IT. Конечно, можно найти кого-то, кто работал только инженером DevOps, но так как эта дисциплина относительно молода (около 15 лет), это может несколько ограничить поиск. Бывшие программисты и другие профессионалы IT (например, сисадмины или администраторы баз данных) тоже могут стать превосходными DevOps-инженерами, ведь их опыт в конкретных областях дает практические знания, которые могут пригодиться в конкретном проекте. Тестирование программного обеспечения. Многое сейчас можно автоматизировать, но не менее полезно уметь выполнять тестирование вручную, когда это необходимо. Знакомство с распространенными инструментами разработки и отладки приложений. Это различные фреймворки, модули, платформы интеграции и т. п. Подробнее об этих инструментах рассказывается в главах, посвященных отдельным языкам программирования, к которым мы и переходим. Мы составили небольшой список языков программирования, с которыми приходится сталкиваться DevOps-инженерам. Подчеркнем, что это не рейтинг, и здесь нет лучших и худших языков — это лишь описание их возможностей и конкретных примеров применения для DevOps, что может оказаться полезным для новичков. Уже который год Python стабильно попадает в тройку самых востребованных языков программирования в мире (небольшое исследование на эту тему тут). Python имеет множество применений, а главные причины, по которым его активно используют в DevOps, следующие: Гибкость и удобный инструментарий. Python предоставляет множество доступных библиотек и модулей, что позволяет писать сценарии для взаимодействия с внутренними компонентами системы, управления сетями, различных действий с файлами и других задач. Хорошая структурируемость кода. Это позволяет существенно ускорить процесс разработки, тестирования и отладки приложений. Код на Python легко писать и читать, поскольку он однозначен. Python совместим с большинством систем и ПО для сетевой инфраструктуры. К тому же ряд популярных решений для управления конфигурацией групп серверов (например, Ansible и SaltStack) написаны именно на Python. Вот несколько полезных возможностей Python для задач DevOps: Модули, написанные на Python, значительно расширяют возможности облачной инфраструктуры, созданной с помощью OpenStack. Инструменты развертывания и отслеживания работы приложений Ansible и SaltStack написаны на чистом Python. Соответственно, модули для них пишутся на том же языке программирования. Фреймворк Selenium можно использовать для автоматизированного тестирования с использованием скриптов Python. На Python пишутся модули почти для всех систем управления базами данных, включая MongoDB, MySQL, PostgreSQL. DevOps используют Python для развертывания таких модулей, как Fabric, fabtools, cuisine. При использовании Bash или PowerShell могут возникать проблемы при изменениях в среде непрерывной интеграции (CI). Эти проблемы решаются при помощи Python. Python используется для SDK-модулей автоматизации boto и  google-cloud-storage в AWS и GCP (Google Cloud Platform) соответственно. Из более общих задач отметим важную роль Python при разработке программного обеспечения — это и тестирование, и программная поддержка на этапе разработки. А еще использование Python снижает потребность в дальнейшем обслуживании приложений благодаря широкому набору инструментов (включая уже упомянутые Salt и Ansible), которые помогают развертывать и отслеживать работу приложений. Python также можно использовать для разработки систем планирования ресурсов предприятия (ERP), приложений с графическим интерфейсом для рабочего стола (например, с использованием кроссплатформенной библиотеки Tk GUI). Кроме того, с помощью Python довольно удобно обрабатывать широко используемые веб-протоколы и данные в HTML и XML. С момента своего создания (а появился Go только в 2009 году) он уже успел стать одним из 10 наиболее распространенных языков программирования. А выучить Go стоит хотя бы потому, что его используют всё больше и больше продуктов, разработанных специально для DevOps. Один из самых популярных инструментов для контейнеризации приложений, Docker, написан именно на Golang, на том же Go пишутся и модули для него, позволяющие DevOps-инженерам решать локальные задачи. Система для автоматизации развертывания, масштабирования и управления контейнерными приложениями, Kubernetes, или K8s, также написана на Go. Собственно, Kubernetes был разработан именно для целей DevOps. K8s обеспечивает гибкость в разработке ПО и легко поддается кастомизации благодаря модулям. На Go написана и APM SigNoz, которая помогает инженерам DevOps отслеживать производительность приложений и устранять проблемы, возникающие в их работе. Что касается преимуществ Go для DevOps, то, в отличие от Python, который часто требует использования сторонних библиотек, Go имеет стандартную библиотеку, которая включает в себя множество встроенных функций. Это, например, обработка файлов, веб-протоколов, JSON, а также встроенные модули тестирования и профилирования, которые можно использовать для всех типов приложений. К другим преимуществам Golang относятся: Простота использования. В Go можно развертывать приложения напрямую, просто копируя их. Кроме того, здесь нет дженериков (как в Java) и неясностей шаблонного программирования. Многопоточность и параллелизм. Go поддерживает как многопоточную среду, так и параллелизм. Это обеспечивает полноценную поддержку многоядерных процессоров, что ставит Golang вне конкуренции по данному показателю. Переносимость. Программный код на Go можно без проблем переносить куда угодно: исполняемые файлы программ Go могут быть созданы для Windows, Linux и macOS и любой другой платформы. Чтобы двоичный файл поддерживался в разных операционных системах, достаточно установить две переменные среды: $GOOS и $GOARCH. Эффективное масштабирование. Красноречивый пример: еще в 2014 году популярный облачный сервис Dropbox перенес свои серверные части с Python на Go, объяснив это решение необходимостью найти способ более эффективного масштабирования. При этом команда Dropbox столкнулась с единственной проблемой — молодостью языка программирования. В Golang на тот момент не было библиотек, необходимых Dropbox для создания более крупных систем. Но «облачная команда» вышла из этой непростой ситуации, создав собственные библиотеки на Go: их исходный код можно посмотреть на GitHub. Подробнее об этом любопытном кейсе читайте здесь. Golang отлично показывает себя при разработке и серверных, и сетевых приложений. Этот язык оказался настолько мощным, что с самого начала детище программистов Google смогло вызвать интерес у таких организаций, как Uber, Twitter, BBC, IBM, Dropbox. Go был разработан для создания высоконагруженных систем, использующих многопроцессорную архитектуру на все 100%. Вот почему крупные организации переходят на Golang с других языков и разрабатывают более эффективное программное обеспечение именно на нем. Следующим в нашем списке идет один из самых самобытных языков программирования, который нравится многим разработчикам за возможность адаптировать код под новые требования. Ruby используется для управления сетевой инфраструктурой, но также подходит для создания фреймворков под структуры для баз данных, сайтов и сложных приложений. На Ruby написаны платформы для управления конфигурацией групп серверов Chef и Puppet, поэтому для расширения их возможностей команды DevOps используют именно этот язык программирования. У Ruby немало плюсов: Наличие большого количества модулей, создаваемых сообществом (они называются RubyGems). Эти модули, доступные на отдельном сайте или через GitHub, можно легко включить в свои приложения. Поэтому во многих случаях не придется писать много кода, что довольно удобно. Код Ruby позволяет развертывать серверы буквально за считанные минуты. С помощью Ruby удобно развертывать и приложения, что заметно облегчает работу командам DevOps. Также Ruby легко интегрируется с высокопроизводительными серверами баз данных. Фреймворк Ruby on Rails станет отличным выбором для создания жизнеспособного сетевого продукта, который планируется улучшать и/или развивать в будущем. Поддержка фреймворка со стороны разработчиков радует, к тому же Ruby on Rails может похвастаться довольно активным сообществом, а значит он будет развиваться и в будущем. Общим преимуществом этого языка является то, что Ruby избавляет от необходимости применять шаблонный подход к написанию кода, поскольку каждую задачу чаще всего можно решить несколькими способами. Язык этот довольно свободный, за что его, наряду с Perl, нередко называют одним из самых творческих. Однако последнее преимущество в то же время является и одним из недостатков Ruby. Возможность решать одинаковые задачи, используя разные синтаксические конструкции, может существенно затруднить чтение кода, если он написан другой командой или даже другим программистом в рамках одной команды. Эта особенность является обратной стороной гибкости синтаксиса данного языка и порой приводит к затруднениям в оптимизации кода и отладке приложений. Соответственно, поддержка кода на Ruby потребует от команды дополнительных усилий. Эти два близкородственных языка программирования остаются актуальными и сегодня. И несмотря на то, что те же «плюсы» были разработаны более трех десятилетий назад, а чистому C уже почти полвека, популярность C/C++ не снижается. C/C++ позволяют адаптировать код практически к любой системе, платформе или приложению: эти языки были разработаны очень давно и потому имеют все необходимые инструменты для этого. Это значительно упрощает такие задачи, как, например, пакетное управление, чем часто приходится заниматься DevOps-инженерам. С помощью C/C++ команда DevOps сможет эффективно использовать такие инструменты, как IDE и платформы непрерывной интеграции. Кроме того, эти языки обеспечивают отличную поддержку параллелизма. Когда проект требует высокой производительности (например, серверы баз данных, приложений, веб-серверы и т. д.), C++ нередко становится основным выбором. Еще один плюс C/C++ в том, что они близки к аппаратному обеспечению и дают возможность контролировать его работу напрямую, на что не способны языки более высокого уровня. А значит, C/C++ дают возможность тесно связывать программное обеспечение с аппаратным там, где это необходимо. А теперь конкретный пример использования C/C++ в среде DevOps. Главной проблемой C/C++ долгое время являлось отсутствие совместимости двоичных файлов на C, созданных в разных системах. Теперь это решается за счет использования менеджеров пакетов с поддержкой C/C++, в частности, Conan Center. Conan решает проблемы совместимости двоичных файлов, обеспечивая поддержку всех основных операционных систем. Этот децентрализованный менеджер пакетов для C/C++ дает возможность обмениваться пакетами с помощью модели push-pull: Conan обрабатывает двоичные файлы и позволяет легко загружать уже созданные файлы в Artifactory или Bintray, чтобы ими можно было эффективно обмениваться между командами. JavaScript — это легкий интерпретируемый язык сценариев, который может пригодиться командам, занимающимся разработкой веб-приложений. Использование JavaScript позволяет снижать нагрузку на сервер, значительно увеличивает интерактивные возможности, обеспечивает быструю связь с пользователями, дает возможность проектировать удобные интерфейсы. В последнее время этот язык программирования используется в разработке мобильных и десктопных приложений, а также в разработке игр. Главные преимущества JavaScript: все популярные браузеры поддерживают JavaScript, и код на нём можно вставить на любую веб-страницу; этот язык очень быстрый; работает на стороне клиента, что снижает нагрузку на сервер; дает возможность создавать сложные интерфейсы. Из недостатков выделим отсутствие возможностей для реализации многопоточности, невозможность использования JavaScript для сетевых приложений, а также видимость кода для пользователей. Некоторые наверняка знакомы с Node.js — кроссплатформенной средой выполнения для разработки серверных и сетевых приложений. Node.js является реализацией Javascript на стороне сервера, которая позволяет разработчикам узлов создавать API-интерфейсы для серверных приложений, а также сценарии командной строки. Приложения Node.js написаны на JavaScript и могут выполняться в среде выполнения Node.js в OS X, Microsoft Windows и Linux. Node.js также предоставляет богатую библиотеку различных модулей JavaScript, что значительно упрощает разработку веб-приложений с использованием Node.js. В Node.js доступно множество модулей для выполнения различных действий DevOps, таких как оптимизация процессов, связанных с развертыванием приложений. Node.js также предоставляет библиотеки для работы с инструментами непрерывной интеграции, такими как Jenkins или Travis CI. Bash — это язык сценариев, который используется разработчиками программного обеспечения и системными администраторами для автоматизации самых разных задач и процессов в Unix-подобных операционных системах. Его преимущества следующие: Это интерпретируемый язык, поэтому компиляция перед запуском не требуется. Код Bash может быть выполнен в любых Unix-подобных операционных системах без каких-либо модификаций. У Bash мало конкурентов, когда речь идет об автоматизации операций на системном уровне и автоматизации повторяющихся задач. Bash легко освоить, что может быть существенным плюсом в случае, если понадобится писать какие-либо скрипты. Последнее преимущество делает этот язык весьма популярным. Конечно, есть у Bash и недостатки. К ним отнесем прежде всего довольно низкую скорость исполнения кода в сравнении с любыми другими языками программирования, в том числе Python, Ruby, Perl и PHP. Кроме того, в Bash новый процесс запускается почти для каждой выполняемой команды оболочки. Если вы планируете решать проблемы разработки и совместимости приложений для Unix-подобных систем, вам, вероятно, понадобится писать скрипты для автоматизации и совместимости с различным ПО. Несколько сотен готовых скриптов Bash для популярных платформ, написанных на других языках, доступны здесь. Groovy обладает возможностями статической и динамической типизации. Этот язык быстрее и проще смогут освоить Java-разработчики, а вот другим программистам придется познакомиться также и с Java. Дело в том, что Groovy использует библиотеки Java и запускается на JVM (Java Virtual Machine, виртуальная машина Java). Более того, в настоящее время существует реализация Groovy исключительно на JVM, поэтому приложения на Groovy Java-зависимы. Кроме того, решения на Groovy могут оказаться весьма ресурсоемкими. Ценность Groovy для DevOps заключается в том, что у него есть поддержка модульного тестирования любого проекта на основе Java, а код на Groovy можно легко интегрировать с уже существующим интерфейсом. И конечно, существует немало  инфраструктурных решений, которые поддерживают Groovy. Одним из таких решений является платформа для автоматизации и управления системной инфраструктурой Jenkins CI/CD. Для примера возьмем Jenkins Pipeline — мощный инструмент, который устраняет разрывы между командами разработки и теми, кто занимается тестированием, отладкой и развертыванием приложений. Jenkins Pipeline представляет собой набор плагинов, которые поддерживают интеграцию и реализацию конвейеров непрерывной доставки с использованием инфраструктуры Jenkins. Jenkins Pipeline имеет возможности для создания простых или сложных конвейеров доставки через DSL. Также Groovy поддерживается широким спектром фреймворков, в том числе Spring Boot, Ratpack, Micronaut, Griffin и Gradle. Например, фреймворк Spring Boot существенно упрощает создание приложений на основе Spring. Он минимизирует усилия разработчиков по написанию кода и настройке приложений. PERL — высокоуровневый интерпретируемый язык программирования, изначально предназначавшийся для эффективного редактирования текста. Однако он перерос те задачи, для достижения которых задумывался, и сегодня Perl широко используется для целей системного администрирования, сетевого программирования и веб-разработки. С развитием DevOps Perl переживает «вторую молодость», поскольку этот язык: Подходит для многих целей: разработки веб-приложений, обеспечения взаимодействия с базами данных, разработки графического интерфейса. Perl может встраиваться в веб-серверы и серверы баз данных. Обеспечивает поддержку кроссплатформенности и совместим с другими языками программирования благодаря модулям, которые позволяют использовать код, написанный на Python, Java, C/C++, PHP, Ruby, ассемблере, Lua и многих других языках. Например, Python непосредственно встраивается в сценарий Perl командой Inline::Python, а затем вызывается сценарий командной строки. Таким образом, DevOps-инженер со знанием Perl сможет писать код на привычном языке. Поддерживает уже более 200 тысяч модулей с открытым исходным кодом на CPAN и имеет множество мощных расширений для стандартной библиотеки. Скачать нужные модули можно здесь. Таким образом, даже несмотря на свои недостатки (сложность поддержки кода из-за его неоднозначности, невысокая скорость исполнения), Perl является одним из наиболее перспективных языков для DevOps. Windows PowerShell представляет собой платформу для автоматизации с открытым исходным кодом и язык сценариев. PowerShell — это оболочка командной строки и язык сценариев, которые интегрированы с платформой .Net и могут быть встроены в другие приложения. Если у вас есть инфраструктура, работающая под Windows, PowerShell вам понадобится. Этот язык: позволяет автоматизировать повторяющиеся задачи; расширяем с помощью плагинов и командлетов; поддерживает объекты и формы .NET и может вызывать любые библиотеки .NET; может быть использован для создания, тестирования и развертывания решений в средах CI/CD; имеет встроенную поддержку распространенных форматов данных, таких как CSV, JSON и XML. PowerShell — отличный выбор для тех, кто работает в среде Windows. Этот язык останется основным для платформ Microsoft в обозримом будущем, и он помогает автоматизировать многие рутинные задачи и проблемы, с которыми программисты сталкиваются в процессе работы. Наиболее распространенными решениями автоматизации PowerShell, с которыми работают DevOps-инженеры, являются сценарии и модули сценариев. Например, на этом языке создаются собственные наборы инструментов и пишутся модули для Azure, облачной платформы Microsoft. Приведем еще несколько полезных инструментов для PowerShell. Pester — популярный фреймворк для тех, кому нужно имитировать работу приложений на PowerShell и тестировать их. Так, с помощью Pester можно реализовать модульное, интеграционное, инфраструктурное и ряд других видов тестирования. Наряду с тестированием кода PowerShell, Pester также поможет определить, какая часть кода покрыта тестами, то есть выполнить анализ покрытия кода, чтобы можно было увидеть, какие команды не были выполнены во время тестов. Таким образом, появляется возможность внедрить контроль качества в процесс сборки, чтобы сборка автоматически завершалась ошибкой, если общий процент покрытия кода падает ниже определенного, приемлемого для проекта, уровня. Еще один полезный инструмент — PSScriptAnalyzer, который используется для создания и проверки правил написания кода. Помимо встроенного набора правил проверки, он также позволяет создавать и использовать собственные. Интересно, что даже Visual Studio Code с его расширениями PowerShell использует PSScriptAnalyzer в фоновом режиме для анализа сценариев PowerShell. Модуль PlatyPS позволяет автоматизировать процесс создания документации. Этот инструмент создает документацию в формате Markdown, чтобы ее можно было опубликовать в Интернете. Его можно включить в сценарий сборки или конвейер, и документация всегда будет оставаться актуальной. Тот же Microsoft использует PlatyPS для создания справочного содержимого для тысяч своих командлетов. Вместо написания собственных сценариев сборки стоит обратить внимание на такие инструменты, как InvokeBuild или psake, которые могут помочь автоматизировать отдельные этапы процесса сборки, определить зависимости и создать решение с помощью вызова всего лишь одной команды. PowerShell как платформа также имеет широкий набор инструментов для работы с пакетами, но записывать все команды в сценарии сборки может быть утомительно. В таком случае можно использовать модуль PSDepend и определять зависимости проекта в простом файле данных PowerShell. Это сделает управление зависимостями намного яснее и проще в обслуживании. Scala, как и Groovy, является надстройкой над Java. Большинство недостатков исполняемых приложений Java в Scala были устранены. При этом все преимущества Java, такие как OOD (объектно-ориентированный дизайн) и потоки, сохранились, что и сделало Scala достаточно популярным языком, хотя, по ряду причин, он и не стал полноценной заменой Java. Одна из причин заключалась в том, что далеко не все руководители проектов хотели переводить свои проекты с привычного Java на перспективный Scala из-за более высокой стоимости разработки. Тем не менее сравнительно низкая популярность Scala не отменяет достоинств этого языка для целей DevOps: лаконичность кода, особенно в сравнении с Java; широкая линейка IDE (Scala IDE, Intellij IDEA, Emacs, Atom); отличная масштабируемость с возможностью создания обширных и устойчивых к сбоям систем. Под Scala были разработаны такие популярные фреймворки, как Play, Akka и Apache Spark, которые помогают создавать инструменты для веб-разработки и DevOps, а также внедрять решения для работы с большими массивами данных. Для проектов на Scala довольно просто организовать непрерывную интеграцию, поскольку для этого существует множество инструментов, таких как Travis, CircleCI, GitLabCI и ряд других. Scala поддерживают такие платформы для автоматизации развертывания приложений и контейнеризации, как Docker Swarm, Kubernetes, Apache Mesos, AWS ECS. С их помощью обеспечивается автоматизация процесса доставки программного обеспечения, чтобы команды могли быстрее и проще развертывать код в рабочей среде. И еще один язык, имеющий прямое отношение к Java и являющийся его очередным расширением. Однако включили мы Kotlin в этот список вовсе не потому, что он был создан российскими программистами и назван в честь известного острова в Финском заливе. Хоть это и приятно, главные достоинства Kotlin всё же в другом — этот молодой язык программирования превосходно справляется с задачами разработки мобильных приложений. «Котлин» идеально подойдет для команд, занятых разработкой мобильных приложений для Android, в том числе и игровых. Впрочем, одним лишь Android дело не ограничивается: его всё активнее начинают использовать и для бэкэнда, так что веб-разработчикам также стоит присмотреться к Kotlin. Весомое преимущество Kotlin заключается в том, что он обладает большинством полезных функций, но без сложности динамического языка сценариев. Из других плюсов отметим: сокращение времени разработки благодаря лаконичности кода и простоте освоения; полная совместимость с Java, но при этом более высокая надежность; функциональное и процедурное программирование идут в Kotlin рука об руку. Среди минусов Kotlin можно выделить разве что сравнительно низкую скорость компиляции.  Вот пара примеров, для чего DevOps-инженеру может пригодиться знание Kotlin: Прежде всего Kotlin отлично подходит для работы с Azure Pipelines, инструмента для непрерывной интеграции и развертывания приложений. При этом настроить Azure Pipeline для любого проекта на Kotlin довольно просто. Кроме того, Kotlin — один из немногих языков, поддерживаемых Gradle, являющейся лучшей системой автоматической сборки приложений на JVM. Таким образом, DevOps-инженеры смогут писать собственные сценарии сборки на Kotlin и пользоваться другими возможностями этой платформы. НЛО прилетело и оставило здесь промокод для читателей нашего блога: — 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.    Маркетолог