Можно ли научиться программировать на ruby on rails с нуля за 4 месяца

Требования

Мы не предъявляем никаких особенных требований для начала обучения веб-разработке на Ruby on Rails. Даже если ты ещё ничего не смыслишь в программировании, наши менторы сначала обучат тебя основам.

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

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

Примерно в это же время я искала работу. Не без трудностей меня взяли на испытательный срок backend rails junior разработчиком. И тут советы от ментора обрели свою истинную ценность. Потому что работа это поворот на 180 градусов от обучения. И иногда казалось, что я на этом повороте врежусь в столб и дальше не смогу поехать.

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

Также для тех, кто читает отзыв, но еще не читал про Кирилла — обратите внимание, что он ведет свой блог (который тоже полезно почитать) и посмотрите, какой порядок на рабочем столе (это можно сделать в статье про Кирилла на мкдев). Сам я рад, что нашел Кирилла и очень рекомендую его как ментора!

PS у меня пока идет вторая неделя обучения из 4х, поэтому возможно, отзыв еще дополню. к тому же сегодня Новый Год (а я читаю про VPC — вот такая мотивация от занятий!)

PPS 20.03.19 дополняю отзыв: мне уже в процессе обучения удалось начать использовать знания, полученные от Кирилла (terraform, aws) и примерно через месяц курс окупился в виде доп работ, которые ранее клиенты у меня не заказывали, а на данный момент уже 2 месяца получаю чистую прибыль. Кириллу еще раз спасибо! я доволен и всем рекомендую

Installers

If the version of Ruby provided by your system or package manager is out
of date, a newer one can be installed using a third-party installer.

Some installers allow you to install multiple versions on the same
system; associated managers can help to switch between the different
Rubies.

If you are planning to use as a version manager you don’t
need a separate installer, it comes with its own.

ruby-build

is a plugin for that allows you
to compile and install different versions of Ruby. ruby-build can also
be used as a standalone program without rbenv. It is available for macOS,
Linux, and other UNIX-like operating systems.

ruby-install

allows you to compile and install different
versions of Ruby into arbitrary directories. is a
complimentary tool used to switch between Ruby versions. It is available
for macOS, Linux, and other UNIX-like operating systems.

RubyInstaller

On Windows, RubyInstaller gives you everything you need
to set up a full Ruby development environment.

Just download it, run it, and you are done!

Ruby Stack

If you are installing Ruby in order to use Ruby on Rails,
you can use the following installer:

Bitnami Ruby Stack provides a complete development
environment for Rails. It supports macOS, Linux, Windows, virtual
machines, and cloud images.

2: Создание нового проекта Rails

Итак, теперь мы можем создать новый проект Rails и взглянуть на стандартный код, который Rails предоставляет с помощью .

Создайте проект по имени sharkapp с помощью следующей команды:

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

Вот о чем говорят эти фрагменты:

  • Gemfile: это файл, в котором перечислены все гемы и зависимости вашего приложения. Гем – это программный пакет Ruby. Файл Gemfile позволяет управлять этими пакетами и зависимостями вашего проекта.
  • app: этот каталог хранит главный код приложения. Он включает в себя модели, контроллеры и представления, активы, хелперы и почтовые программы, которые составляют само приложение. Rails предоставляет шаблон уровня приложения для модели MCV, который можно запустить в таких файлах, как app/models/application_record.rb, app/controllers/application_controller.rb, and app/views/layouts/application.html.erb.
  • config: этот каталог содержит настройки приложения. В config/routes.rb находятся объявления маршрутов вашего приложения. В config/application.rb хранятся общие настройки для компонентов вашего приложения.
  • config/environments: в этом каталоге находятся конфигурации сред. По умолчанию Rails включает в себя три среды: development, production и test (разработка, производство и тестирование).
  • config/database.yml: в этом файле находятся конфигурации базы данных. Файл разбит на четыре раздела: default, development, production и test. Благодаря Gemfile, поставляемому с командой rails new, которая включает гем sqlite3, файл config/database.yml уже имеет параметр adapter со значением sqlite3 (то есть мы можем использовать базу данных SQLite с этим приложением).
  • db: эта папка включает каталог для миграции баз данных под названием migrate, а также файлы schema.rb и seeds.rb files. Файл schema.db содержит данные о вашей БД, а seeds.rb хранит seed данные БД.

В конце Rails запускает команду bundle install для установки зависимостей, перечисленных в Gemfile.

Когда все будет настроено, перейдите в каталог sharkapp:

Теперь вы можете запустить сервер Rails, чтобы убедиться, что ваше приложение работает. Это можно сделать с помощью команды . Если вы работаете на локальном компьютере, введите:

Rails по умолчанию привязан к localhost, поэтому вы можете получить доступ к своему приложению, открыв в браузере locahost:3000. Здесь вы увидите следующую страницу:

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

Затем запустите сервер с флагом —binding, чтобы привязать IP-адрес вашего сервера:

Перейдите по адресу http://your_server_ip:3000 в браузере, где вы увидите приветственное сообщение Rails.

Убедившись, что все работает, вы можете остановить сервер, нажав CTRL+C.

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

Освоение Ruby on Rails начинается с азов программирования

Дети, начиная исследовать мир, задаются простыми вопросами, которые важны для понимания происходящего вокруг. Взрослея, мы во время обучения пытаемся сразу ухватиться за самую суть, не подготовив фундамент для этих знаний. В итоге предмет вроде осваиваем, но не хватает прочного основания, глубокого понимания логики процессов. Интенсив по Ruby on Rails от «Хорошего программиста» начинается с базовых понятий: что такое алгоритмы, как работают программы, как пишется хороший код, как думают программисты.

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

Цените интегрированные системы

Ruby on Rails можно использовать для разных целей, но его конек — это монолитные интегрированные системы. Такие системы нацелены на решение всей задачи совокупно. Через Rails проходит все, начиная от генерации JavaScript для мгновенного обновления страниц, и заканчивая миграцией базы данных от одной версии к другой, когда проект уже в эксплуатации.

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

Именно упор на расширение возможностей отдельного разработчика подталкивает нас к интегрированным системам. Интегрированная система позволяет убрать ненужные абстракции, уменьшить дублирование между слоями (например, использовать одни и те же шаблоны на сервере и на клиенте), а самое главное — до последнего не допустить перехода к распределенной архитектуре.

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

Увы, иногда без распределенной архитектуры не обойтись. Если вашему веб-приложению нужен API-интерфейс, к которому пользователи будут обращаться по HTTP, то ничего не поделаешь — придется решать почти все упомянутые проблемы. Остается порадоваться, что работа со входящими запросами куда проще, чем с исходящими, ведь если ваш интерфейс какое-то время не будет работать, то проблемы будут не у вас, а у потребителя этого интерфейса. По крайней мере в таком случае неудобства, которые вам как разработчику придется претерпеть, не столь велики.

Плохо, когда система преждевременно дробится на сервисы или, что еще хуже, на микросервисы. Бытует мнение, что при разработке «Современного Интернет-Приложения» неизбежно придется строить одну и ту же систему много раз: один раз на стороне сервера, один раз на стороне клиента в виде JavaScript MVC, по одному разу для каждой мобильной платформы, и так далее. Но это требование ничем не обусловлено, так делать совершенно необязательно.

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

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

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

Package Management Systems

If you cannot compile your own Ruby, and you do not want to use a
third-party tool, you can use your system’s package manager to install Ruby.

Some members of the Ruby community feel that you should avoid package
managers to install Ruby and that you should use dedicated tools instead.

It is possible that major package managers will install older Ruby
versions instead of the latest release. To use the latest Ruby release,
check that the package name matches its version number. Or use a
dedicated .

yum (CentOS, Fedora, or RHEL)

CentOS, Fedora, and RHEL use the yum package manager.
You can use it like this:

The installed version is typically the latest version of Ruby available
at the release time of the specific distribution version.

snap (Ubuntu or other Linux distributions)

Snap is a package manager developed by Canonical.
It is available out-of-the-box on Ubuntu, but snap also works
on many other Linux distributions.
You can use it like this:

We have several channels per Ruby minor series.
For instance, the following commands switch to Ruby 2.3:

portage (Gentoo)

Gentoo uses the portage package manager.

To install a specific version, set in your .
See the Gentoo Ruby Project website for details.

pacman (Arch Linux)

Arch Linux uses a package manager named pacman.
To get Ruby, just do this:

This should install the latest stable Ruby version.

Homebrew (macOS)

Ruby versions 2.0 and above are included by default in macOS releases
since at least El Capitan (10.11).

Homebrew is a commonly used package manager on macOS.
Installing Ruby using Homebrew is easy:

This should install the latest Ruby version.

FreeBSD

FreeBSD offers both pre-packaged and source-based methods to install Ruby.
Prebuilt packages can be installed via the pkg tool:

A source-based method can be used to install Ruby using the
Ports Collection. This is useful if you want
to customize the build configuration options.

More information about Ruby and its surrounding ecosystem on FreeBSD
can be found on the FreeBSD Ruby Project website.

Ruby on OpenIndiana

To install Ruby on OpenIndiana, please use the
Image Packaging System (IPS) client.
This will install the Ruby binaries and RubyGems directly
from the OpenIndiana repositories. It’s easy:

However, the third-party tools might be a good way to obtain the
latest version of Ruby.

Other Distributions

On other systems, you can search the package repository of your Linux
distribution’s manager for Ruby. Alternatively, you can use a
.

4: Создание корневого представления приложения и тестирование функций

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

Вы можете сделать это несколькими способами: например, можно создать контроллер Welcome и связанное с ним представление index, которое предоставит пользователям посадочную страницу, откуда можно ссылаться на различные части приложения. Но в нашем случае достаточно будет поместить пользователей в представление index.

Для этого нужно изменить настройки маршрутизации в config/routes.rb и указать корневой каталог приложения.

Откройте файл config/routes.rb в текстовом редакторе:

Он выглядит так:

Если не указать что-то более конкретное, страницей приветствия Rails по умолчанию будет стандартное представление по адресу http://localhost:3000 or http://your_server_ip:3000.

Чтобы связать корневое представление приложения с представлением index контроллера sharks, вам необходимо добавить в файл следующую строку:

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

Сохраните файл и выйдите из редактора. Если вы использовали nano, вы можете нажать CTRL + X, Y, затем ENTER.

Теперь можно запустить миграцию с помощью команды:

Вы увидите вывод, подтверждающий миграцию.

Запустите свой сервер Rails еще раз. Если вы работаете локально, введите:

На сервере разработки нужно ввести:

Перейдите на localhost:3000, если вы работаете локально, или на http://your_server_ip:3000, если вы работаете на сервере разработки.

Целевая страница вашего приложения будет выглядеть так:

Чтобы создать новую запись об акуле, нажмите на ссылку New Shark в нижней части страницы, что проведет вас по маршруту sharks/new:

Давайте добавим какую-то информацию, чтобы протестировать наше приложение. Введите Great White в поле Name и Scary в поле Facts.

Нажмите на кнопку Create, чтобы создать запись.

Это направит вас к маршруту show, который устанавливается с помощью метода set_shark благодаря фильтру before_action. Метод получает id только что созданной записи об акуле:

Вы получите:

Теперь вы можете протестировать функцию редактирования, нажав кнопку Edit. Это приведет вас к маршруту edit для этой записи:

Измените facts о Great White: введите Large вместо Scary и нажмите Update Shark. Это вернет вас к маршруту show:

Нажав кнопку Back, вы перейдете к обновленному представлению index:

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

Плюсы Ruby для новичка

Когда я входил в Ruby-мир, на Ruby уже было реализовано достаточно большое количество решений: были написаны Twitter, Aviasales, OneTwoTrip, Onlinetours. Множество решений для выкатки приложений тоже написаны на Ruby, например Puppet, Chef — это инструменты, с помощью которых приложения выкатывают на сервер, или Vagrant — виртуализация приложений — написана тоже на Ruby.

Некоторые государственные компании начали использовать язык Ruby, потому что он занял свою нишу как язык быстрого прототипирования проектов. Если вы сейчас хотите запустить свой стартап, то в 99% лучше использовать Ruby — как язык, который поможет вам очень быстро писать, двигаться по проекту и выкатывать его. На слайде пример синтаксиса.

Многие воспринимают Ruby как кукольный, детский язык, но это только начальное восприятие. Первое моё ощущение от Ruby — язык показался магически простым, потому что очень многое происходит за кадром. Он читается, как обычный текст. Меня подкупило, что можно опускать какие-то скобочки, какие-то вещи можно было писать более нативно. Когда вы понимаете язык, вы понимаете, что там нет никакой магии и всё достаточно предсказуемо работает.

Когда узнаёшь этот язык, начинаешь его любить, потому что вещи, которые делаются очень долго на других языках, здесь можно сделать очень быстро. В среднем скорость разработки на Ruby на 30−50% выше, чем на других языках. В два раза, если мы говорим о Java и .NET. Язык действительно очень красивый и простой для понимания, что привлекает всё большее количество разработчиков.

Я вошёл в Ruby-мир как фронтендер. После чистого фронтенда для Pyramid меня пригласили работать в компанию, которая занимается разработкой на Ruby on Rails. В компанию зашёл как фронтенд-разработчик на Ruby и именно в это время и познакомился с самим фреймворком Ruby on Rails. Очень часто ребята начинают сразу учить сам фреймворк с минимальными знаниями языка. Моё мнение, что это ошибка и надо знать язык, потому что понимание языка даст вам большее понимание фреймворка Ruby on Rails.

Читать ещё: «Как стать суперпрограммистом?»

Не будем забывать, что у Ruby on Rails тоже есть свои проблемы, которые сейчас пытаются решить. Нет ни одного языка, который мог бы решить все задачи: каждый язык берётся под определённое решение, идеального языка нет. Ruby on Rails и Ruby заняли свою нишу как стандарт разработки веб-приложений. Есть библиотеки, которые помогают писать JavaScript, такие как Opal, компилируются из Ruby в JavaScript; есть фреймворки, которые помогают писать приложения для мобильной разработки, например, RubyMotion.

4: Обновление видов

Сейчас нам нужно изменить шаблоны, относящиеся к постам, а также представления show для акул (чтобы пользователи видели посты, связанные с конкретными акулами).

Давайте начнем с основного шаблона для постов – с партиала form, который повторно используется в нескольких шаблонах постов. Откройте его:

Мы не будем передавать хелперу формы form_with не только модель post, а обе модели shark и post, при этом post будет задан как дочерний ресурс.

Измените первую строку файла следующим образом, чтобы отразить отношения между ресурсами shark и post:

Затем удалите раздел, в котором указан shark_id связанной акулы, так как эта информация в представлении не нужна.

С учетом правок файл form  будет выглядеть так:

Сохраните и закройте файл.

Теперь откройте представление index, которое показывает посты, связанные с определенной акулой.

С помощью команды rails generate scaffold Rails сгенерировал большую часть шаблона вместе с таблицей, которая показывает поле body для каждого поста и связанную с ним shark.

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

В теле таблицы внесите следующие обновления.

Во-первых, измените post.shark на post.shark.name, чтобы таблица включала поле для названия акулы (вместо идентифицирующей информации о самом объекте):

Затем измените перенаправление Show, чтобы направить пользователей в представление show  нужной акулы (если они захотят вернуться к исходной акуле). Здесь можно использовать переменную экземпляра @shark, которую мы установили в контроллере, поскольку Rails делает переменные экземпляра, созданные в контроллере, доступными для всех представлений. Также давайте изменим текст ссылки: вместо Show будет Show Shark, чтобы пользователи лучше понимали ее функцию.

Затем нужно убедиться, что пользователи перенаправляются по правильному вложенному пути при редактировании постов. То есть вместо posts/post_id/edit пользователи будут перенаправлены на sharks/shark_id/posts/post_id/edit. Для этого мы используем хелпера маршрутизации shark_post_path и модели, которые Rails будет рассматривать как URL-адреса. Мы также обновим текст ссылки, чтобы сделать его функцию более понятной.

После обновления строка Edit будет выглядеть следующим образом:

Далее нужно внести аналогичное изменение в ссылку Destroy, обновить ее функцию в строке и добавить ресурсы shark и post:

Остается только обновить путь к новому посту в нижней части формы, чтобы пользователи могли перейти по соответствующему вложенному пути, когда они захотят создать новый пост. Обновите последнюю строку файла, чтобы использовать хелпер маршрутизации new_shark_post_path (@shark):

В результате файл будет выглядеть так:

Сохраните и закройте файл, когда закончите редактирование.

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

Откройте app/views/posts/new.html.erb:

Ссылка link_to в конце файла должна использовать хелпер shark_posts_path(@shark):

Сохраните и закройте файл.

Откройте шаблон edit:

Давайте обновим пути Back и Show, чтобы отразить наши вложенные ресурсы. Измените последние две строки файла, чтобы они выглядели так:

Сохраните и закройте файл.

Далее откройте шаблон show:

Внесите следующие изменения в пути Edit и Back в нижней части файла:

Сохраните и закройте файл, когда закончите.

Теперь осталось только обновить представление show для sharks, чтобы посты отображались отдельно. Откройте этот файл:

Здесь нужно добавить раздел Posts в форму и ссылку Add Post в конце файла.

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

Добавьте следующий код под разделом Facts и над редиректами в конце файла:

Затем добавьте новый редирект, чтобы позволить пользователям добавлять новые посты.

Сохраните и закройте файл.

Теперь модели, контроллеры и представления вашего приложения настроены правильно. Давайте добавим пару проверок в модель Post, чтобы обеспечить согласованность данных в БД.

Магия (задачка на подумать, если есть время и желание)

Безотносительно перехода на новые рельсы, просто странный код, который раскопали в ходе перехода и который работал, хотя не должен (краткое содержание трёх файлов AR-классов):

Эта штука по всем законам жанра работать не может (да в общем-то и не работает на чистых проектах под Rails 4/5). Так как при обращении к кому-либо из наследников автолоад уходит в циклическую загрузку классов и падает. Если же сначала обращаться к базовому классу, а потом к наследникам, то всё хорошо. Но у нас почему-то работало в Rails 4, но отвалилось в Rails 5, хотя явного обращения к для его загрузки ранее, нежели все остальные, мы не нашли, да и вообще не трогали ничего, связанного с автолоадом. Если кто-то знает ещё способы как оно может работать или что интересного случилось с автолоадом в Rails 5 — сообщите, пожалуйста.

Прогресс превыше стабильности

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

Но, если мы будем слишком внимательно прислушиваться к голосам консерватизма, мы никогда не увидим другой стороны медали. Мы должны иногда брать на себя смелость и изменять условия, по каким все должно развиваться и расти. Именно это развитие сохранит Rails: и его выживание, и процветание в течение десятилетия (десятилетий?) в будущем.

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

Это не некая вседозволенность причинять кому-то ненужную или чрезмерную боль. Большой Переход от Rails с версии 2.x до версии 3 все еще будоражит раны тех, кто был причастен к этому переходу. Это было тяжело. Серьезный переполох, который многих оставил на версии 2.x на долгое время, причем некоторых из них уже было оттуда не вернуть. Но, по великой схеме вещей, это все равно стоило того.

Это тяжелые решения, которые мы должны продолжать делать. Сделают ли Rails лучше в течении будущих пяти лет изменения, которые мы делаем сегодня? Станет ли Rails лучше для адаптации стека новых задач, например очередей сообщений или WebSockets, в ближайшие годы? Если да, то давайте закатаем рукава и займемся работой.

Эта работа — не просто то, что должно произойти исключительно в Rails, но и в более крупном сообществе самого языка Ruby. Rails должен находиться на переднем крае разработки, помогая продвижению Ruby, заставляя его составляющие быстрее использовать более поздние версии.

До сих пор мы очень хорошо справлялись с этим. С того момента, как я начал, мы прошли через Ruby версий 1.6, 1.8, 1.9, 2.0, 2.1, 2.2 и теперь на 2.3. Множество серьезных изменений произошло на этом пути, но Rails непосредственно присутствовал и участвовал в них, чтобы иметь под капотом Ruby, и помочь каждому быстрее осуществлять процесс разработки. Эта отчасти привилегия, а отчасти и обязательство Rails, является основой популяризации Ruby.

Это также верно для вспомогательных инструментов рабочего процесса. Bundler когда-то был спорной идеей, но по настоянию Rails о том, что это будет краеугольным камнем совместного будущего, сегодня это само собой разумеющийся инструмент де-факто. Это так же касается таких инструментов и технологий как asset pipeline (файлопровод) и Spring, предварительный загрузчик приложений Rails. Все три инструмента прошли стадию укоренения, или же продолжали переживать боль роста, но очевидность их ценности в долгосрочной перспективе помогла нам преодалеть это.

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector