CI/CD означает непрерывную интеграцию (Continuous Integration) и непрерывное развертывание (Continuous Deployment) или непрерывную доставку (Continuous Delivery). Эти практики взаимосвязаны, но служат разным этапам в жизненном цикле разработки приложений.
CI — это практика частой интеграции изменений кода в общий репозиторий, идеально — несколько раз в день. Основная цель CI — как можно быстрее обнаруживать и исправлять ошибки интеграции. Автоматизированные шаги сборки и тестирования являются неотъемлемой частью CI, обеспечивая, что новые изменения кода не нарушают работу приложения. CI помогает поддерживать высокое качество кодовой базы и ускоряет процесс разработки, предоставляя немедленную обратную связь о статусе интеграции.
CD расширяет CI, автоматически развертывая все изменения кода в тестовой или производственной среде после этапа сборки. Существуют две основные концепции в рамках CD:
Непрерывное развертывание: Эта практика идет на шаг дальше, чем непрерывная доставка. Здесь каждое изменение, которое проходит все этапы вашего производственного конвейера, автоматически выпускается вашим клиентам, без необходимости явного утверждения каждого релиза. Это более автоматизированный подход, обеспечивающий быструю доставку новых функций, исправлений и изменений пользователям способом, максимально упрощающим процесс.
Непрерывная доставка: Это практика автоматизации всего процесса выпуска программного обеспечения. Изменения кода автоматически собираются, тестируются и готовятся к выпуску в производство. Это позволяет разработчикам убедиться, что их код всегда находится в состоянии готовности к развертыванию. Окончательное развертывание в производство часто требует ручного утверждения, хотя процесс до этого момента автоматизирован.
В заключение, CI/CD - это методология, охватывающая как Непрерывную Интеграцию, так и Непрерывное Развертывание/Доставку. CI - это первая часть процесса, обеспечивающая готовность кода к развертыванию, в то время как CD доводит процесс до конца, автоматизируя развертывание этого кода в различных средах.
Одной из наиболее впечатляющих особенностей JavaScript является его поддержка асинхронного программирования. Это метод обработки операций, который позволяет другим задачам продолжать работать в фоновом режиме, ожидая завершения операции.
В JavaScript две функции, которые делают асинхронное программирование более управляемым, это Promises и синтаксис async/await.
Promise - это объект, представляющий значение, которое может быть еще не доступно, но которое будет решено в какой-то момент в будущем. Promises помогают управлять асинхронными операциями, не застревая в "аду обратных вызовов".
Async/await - это синтаксический сахар, построенный на основе Promises, который был представлен в ES2017 и делает асинхронный код более похожим на синхронный. Ключевое слово async делает функцию возвращающей Promise, а ключевое слово await может быть использовано внутри async функции, чтобы дождаться выполнения Promise.
Эти функции значительно улучшили способность JavaScript обрабатывать сложные операции без блокировки основного потока, тем самым улучшая пользовательский опыт на сайтах и приложениях, работающих на JavaScript.
Quite interesting and useful talk from Dave Thomas, back from 2009.
Self - if you understand "self", and if you can work out what "self" is, at any point in your running code, you basically understand all there is to know about metaprogramming.
If your doing metaprogramming, whenever you get stuck trying to work out "How come thats nil", I guarantee, if you track the value of self, you'll understand it"
- Instance variables: look up in "self"
- Methods: look up in self's class
Ruby вернулся в первую десятку рейтинга TIOBE, и аналитики считают это хорошим знаком. Язык появился очень давно, но оставался в тени до релиза Ruby on Rails в 2006 году. Фреймворк подкинул его на тридцать позиций вверх до топ-10 и обеспечил звание «Язык 2006 года».
После пика популярности в 2008 году Ruby начал сдавать позиции под натиском новых языков, но теперь постепенно взбирается обратно. По мнению экспертов, подобная динамика свидетельствует о естественном росте популярности.
Потому что Руби самый удобный язык программирования, а пока программируют люди - удобство значит многое!
Depend on abstractions, not on concretions.
Что такое модули верхних уровней? Как определить этот уровень? Как оказалось, все очень просто. Чем ближе модуль к вводу/выводу, тем ниже уровень модуля. Т.е. модули, работающие с BD, интерфейсом пользователя, низкого уровня. А модули, реализующие бизнес-логику — высокого уровня.
Что такое зависимость модулей? Это ссылка на модуль в исходном коде, т.е. import, require и т.п. С помощью динамического полиморфизма в runtime можно обратить эту зависимость.