Накратко за ползите от ученето на нови неща и на какво точно конкретно са ме научили Ruby като език за програмиране и Ruby on Rails като уеб фреймуърк. Няколко примера как съм приложил наученото в един legacy PHP проект.
Световно известни PHP проекти • album.bg • Беше трети по трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :)
Световно известни PHP проекти • album.bg • Беше трети по трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :) • Работеше прилично бързо
Световно известни PHP проекти • album.bg • Беше трети по трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :) • Работеше прилично бързо • Беше приличен проект (въпреки PHP-то)
Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python, Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина)
Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python, Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина) • Изцяло обектно-ориентиран
Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python, Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина) • Изцяло обектно-ориентиран • Авторът му е Юкихиро Matz Мацумото
Характерни черти • Много динамичен • Много консистентен • Много малко синтактичен шум • Изцяло обектно-ориентиран • Функционални елементи • Минимално количество “вграден” синтаксис
Динамичен • Променливите ви не са обвързани с тип (duck typing) • Можете да променяте почти всичко, което ви идва наготово с езика и стандартната му библиотека (monkey- patching)
Динамичен • Променливите ви не са обвързани с тип (duck typing) • Можете да променяте почти всичко, което ви идва наготово с езика и стандартната му библиотека (monkey- patching) • Можете да инспектирате или създавате “код” в движение, докато програмата ви работи (метапрограмиране)
Консистентен • Принципът на най-малката изненада • За разлика от други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos()
Консистентен • Принципът на най-малката изненада • За разлика от други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos() • А може би трябваше да кажа StrPos()?
Консистентен • Принципът на най-малката изненада • За разлика от други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos() • А може би трябваше да кажа StrPos()? • Силен контраст с PHP в това отношение
Малък синтактичен шум • Без долари пред променливите • Без къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи
Малък синтактичен шум • Без долари пред променливите • Без къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи • Литерални (синтактични) конструктори за често употребявани типове данни като речници и списъци
Малък синтактичен шум • Без долари пред променливите • Без къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи • Литерални (синтактични) конструктори за често употребявани типове данни като речници и списъци • Синтаксис, който подтиква към писане на код, четим като обикновен текст
Обектно-ориентиран • Всичко е обект • Включително примитивните типове като true, false, nil, числа и прочее • Включително класовете • Класовете са инстанции на класа Class, а класът Class е наследник на модул; статичните методи са всъщност инстанционни методи на тази инстанция
Функционални елементи • Работа с колекции е на много централно място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция
Функционални елементи • Работа с колекции е на много централно място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции
Функционални елементи • Работа с колекции е на много централно място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции • Функции, приемащи като аргументи други функции
Функционални елементи • Работа с колекции е на много централно място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции • Функции, приемащи като аргументи други функции • Анонимни функции и блокове
Блокове • Интересна и оригинална концепция • Навсякъде в езика, ползват се изключително много • Наподобяват анонимна функция/closure, “закачена” към метода, който извиквате
Малко синтаксис • Ruby е написан на Ruby • Макар и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули
Малко синтаксис • Ruby е написан на Ruby • Макар и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули • Всичко, което не е ключова дума, може да бъде променено от вас
Малко синтаксис • Ruby е написан на Ruby • Макар и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули • Всичко, което не е ключова дума, може да бъде променено от вас • Много малко неща са ключови думи
Community • Ruby има много силно и развито community • Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production
Community • Ruby има много силно и развито community • Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production • Следва нови тенденции и добри практики
Community • Ruby има много силно и развито community • Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production • Следва нови тенденции и добри практики • Бързо адаптира нови технологии и версии на езика
Какво научих от Ruby? • Основни ползи от ООП • Колко е хубаво, когато има конвенции • Силата на DSL-ите • Що е то наистина динамичен език • Chaining, блокове, функционални закачки...
Какво научих от Ruby? • Основни ползи от ООП • Колко е хубаво, когато има конвенции • Силата на DSL-ите • Що е то наистина динамичен език • Chaining, блокове, функционални закачки... • Какво е да пишеш на език, който те прави щастлив
Ruby на релси? • Уеб фреймуърк • Солидна основа за вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи
Ruby на релси? • Уеб фреймуърк • Солидна основа за вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи • Ще ви направи по-щастливи програмисти
Ruby на релси? • Уеб фреймуърк • Солидна основа за вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи • Ще ви направи по-щастливи програмисти • Ще ви направи по-добри програмисти
Rails • Production-ready • Сигурността е на почит • Пълен с добри практики • Авангарден • Модел, който много други уеб фреймуърци копират (например CakePHP)
ORM • Object-relational mapping • Естествено продължение на MVC • Не пишете SQL директно • Това прави за вас ActiveRecord (или друг ORM) • На теория сте database-agnostic
ActiveRecord • ORM, който идва по подразбиране с Rails • Поддържа PostgreSQL, MySQL, Sqlite3 • Може да го подкарате и с MSSQL, Oracle и други бази • При нужда, може да напишете и ваш адаптер
ActiveRecord • ORM, който идва по подразбиране с Rails • Поддържа PostgreSQL, MySQL, Sqlite3 • Може да го подкарате и с MSSQL, Oracle и други бази • При нужда, може да напишете и ваш адаптер • Query интерфейс, поддържащ CRUD операции
Валидации • Валидация на данните, постъпващи към вашите модели • Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал
Валидации • Валидация на данните, постъпващи към вашите модели • Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина
Валидации • Валидация на данните, постъпващи към вашите модели • Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина • Низове, отговарящи на определен формат
Валидации • Валидация на данните, постъпващи към вашите модели • Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина • Низове, отговарящи на определен формат • Ваши валидатори
Транзакции • Това е от мотиките • Задължително е да се ползват при писане в базата, особено ако трябва да пуснете няколко заявки • Централизиран ORM дава лесна възможност за добавяне на транзакции
Транзакции • Това е от мотиките • Задължително е да се ползват при писане в базата, особено ако трябва да пуснете няколко заявки • Централизиран ORM дава лесна възможност за добавяне на транзакции • Ако знаех това през 2007-ма...
Миграции • Структурата на базата ви е в кода • Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код
Миграции • Структурата на базата ви е в кода • Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код • Улеснява колаборацията
Миграции • Структурата на базата ви е в кода • Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код • Улеснява колаборацията • Улеснява deployment-а на вашето приложение
Миграции и deployment • Имат up() и down() методи • Тоест, могат да бъдат “обръщани” • Качвате новата версия на базата заедно с новата версия на кода • Ако нещо се обърка, down() ви спасява
Миграции и deployment • Имат up() и down() методи • Тоест, могат да бъдат “обръщани” • Качвате новата версия на базата заедно с новата версия на кода • Ако нещо се обърка, down() ви спасява • Произволен Ruby-код в миграциите
Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира” вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва
Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира” вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва • Същото прави и за CSS
Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира” вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва • Същото прави и за CSS • Имената на резултатните файлове съдържат хеш от съдържанието на файла
Asset Pipeline • Лесен cache invalidation — при промяна съдържанието на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN
Asset Pipeline • Лесен cache invalidation — при промяна съдържанието на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN • Ползвате помощни функции, за да вкарвате линкове към вашите статични файлове
Asset Pipeline • Лесен cache invalidation — при промяна съдържанието на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN • Ползвате помощни функции, за да вкарвате линкове към вашите статични файлове • Горното важи за и за HTML, и за CSS
Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки файлове = по-бързо • Кеширани файлове = по-бързо • Употреба на CDN = по-бързо • Без главоболие от ваша страна
Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки файлове = по-бързо • Кеширани файлове = по-бързо • Употреба на CDN = по-бързо • Без главоболие от ваша страна • Бонус — pre-processor-и на CSS и JavaScript!
Други аспекти • Култура на добри практики и качествен код • Convention over configuration • The Rails Way™ • VCS — Git • Управление на зависимости от външни библиотеки — Bundler
Други аспекти • Култура на добри практики и качествен код • Convention over configuration • The Rails Way™ • VCS — Git • Управление на зависимости от външни библиотеки — Bundler • Инфраструктура за пращане на мейли, с подобна на MVC-архитектура
Какво научих от Rails? • Обкръжения (environments) и deployment • Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :)
Какво научих от Rails? • Обкръжения (environments) и deployment • Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :) • Транзакции около всичко, що пише в базата!
Какво научих от Rails? • Обкръжения (environments) и deployment • Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :) • Транзакции около всичко, що пише в базата! • PostgreSQL > MySQL
Ресурси за Rails • Oще на http://rubyonrails.org/documentation • Screencasts — http://rubyonrails.org/screencasts • Например RailsCasts • AsciiCasts — текстов вариант на горното