Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Защо да учим (Ruby и Rails)

Защо да учим (Ruby и Rails)

Накратко за ползите от ученето на нови неща и на какво точно конкретно са ме научили Ruby като език за програмиране и Ruby on Rails като уеб фреймуърк. Няколко примера как съм приложил наученото в един legacy PHP проект.

Dimitar Dimitrov

July 06, 2013
Tweet

More Decks by Dimitar Dimitrov

Other Decks in Programming

Transcript

  1. John Doe http://ddimitrov.name @mitio в Twitter Лайв ООД Пиша основно

    уеб с Ruby on Rails и освирквам заслужили депутати
  2. Световно известни PHP проекти • album.bg • Беше трети по

    трафик в България • Клонинг на Flickr
  3. Световно известни PHP проекти • album.bg • Беше трети по

    трафик в България • Клонинг на Flickr • Написан на PHP
  4. Световно известни PHP проекти • album.bg • Беше трети по

    трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :)
  5. Световно известни PHP проекти • album.bg • Беше трети по

    трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :) • Работеше прилично бързо
  6. Световно известни PHP проекти • album.bg • Беше трети по

    трафик в България • Клонинг на Flickr • Написан на PHP • Отдавна не е наша собственост и, съответно, отдавна не е трети по трафик :) • Работеше прилично бързо • Беше приличен проект (въпреки PHP-то)
  7. Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python,

    Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина)
  8. Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python,

    Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина) • Изцяло обектно-ориентиран
  9. Ruby накратко • Скриптов (интерпретируем) език, подобно на PHP, Python,

    Perl и други • Отворен код • Набрал доста голяма популярност вече (особено в Силиконовата долина) • Изцяло обектно-ориентиран • Авторът му е Юкихиро Matz Мацумото
  10. Характерни черти • Много динамичен • Много консистентен • Много

    малко синтактичен шум • Изцяло обектно-ориентиран
  11. Характерни черти • Много динамичен • Много консистентен • Много

    малко синтактичен шум • Изцяло обектно-ориентиран • Функционални елементи
  12. Характерни черти • Много динамичен • Много консистентен • Много

    малко синтактичен шум • Изцяло обектно-ориентиран • Функционални елементи • Минимално количество “вграден” синтаксис
  13. Динамичен • Променливите ви не са обвързани с тип (duck

    typing) • Можете да променяте почти всичко, което ви идва наготово с езика и стандартната му библиотека (monkey- patching)
  14. Динамичен • Променливите ви не са обвързани с тип (duck

    typing) • Можете да променяте почти всичко, което ви идва наготово с езика и стандартната му библиотека (monkey- patching) • Можете да инспектирате или създавате “код” в движение, докато програмата ви работи (метапрограмиране)
  15. Консистентен • Принципът на най-малката изненада • За разлика от

    други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos()
  16. Консистентен • Принципът на най-малката изненада • За разлика от

    други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos() • А може би трябваше да кажа StrPos()?
  17. Консистентен • Принципът на най-малката изненада • За разлика от

    други езици... • Забравете за haystack и needle • Забравете реда на аргументите на in_array(), str_replace() и strpos() • А може би трябваше да кажа StrPos()? • Силен контраст с PHP в това отношение
  18. Малък синтактичен шум • Без долари пред променливите • Без

    къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи
  19. Малък синтактичен шум • Без долари пред променливите • Без

    къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи • Литерални (синтактични) конструктори за често употребявани типове данни като речници и списъци
  20. Малък синтактичен шум • Без долари пред променливите • Без

    къдрави скоби на традиционните места • Може да изпускате кръглите скоби при дефиниране и извикване на методи • Литерални (синтактични) конструктори за често употребявани типове данни като речници и списъци • Синтаксис, който подтиква към писане на код, четим като обикновен текст
  21. Обектно-ориентиран • Всичко е обект • Включително примитивните типове като

    true, false, nil, числа и прочее • Включително класовете • Класовете са инстанции на класа Class, а класът Class е наследник на модул; статичните методи са всъщност инстанционни методи на тази инстанция
  22. Функционални елементи • Работа с колекции е на много централно

    място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция
  23. Функционални елементи • Работа с колекции е на много централно

    място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции
  24. Функционални елементи • Работа с колекции е на много централно

    място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции • Функции, приемащи като аргументи други функции
  25. Функционални елементи • Работа с колекции е на много централно

    място в езика • Лесно може да направите ваш клас, който да се държи (да квака) като колекция • map/collect, filter/reject, select/ find_all работят над всички колекции • Функции, приемащи като аргументи други функции • Анонимни функции и блокове
  26. Блокове • Интересна и оригинална концепция • Навсякъде в езика,

    ползват се изключително много • Наподобяват анонимна функция/closure, “закачена” към метода, който извиквате
  27. Малко синтаксис • Ruby е написан на Ruby • Макар

    и преувеличено, това твърдение е част от философията на езика
  28. Малко синтаксис • Ruby е написан на Ruby • Макар

    и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули
  29. Малко синтаксис • Ruby е написан на Ruby • Макар

    и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули • Всичко, което не е ключова дума, може да бъде променено от вас
  30. Малко синтаксис • Ruby е написан на Ruby • Макар

    и преувеличено, това твърдение е част от философията на езика • Минимално количество синтаксис, повече методи в класове и модули • Всичко, което не е ключова дума, може да бъде променено от вас • Много малко неща са ключови думи
  31. Community • Ruby има много силно и развито community •

    Личи си от количеството и качеството на наличните библиотеки
  32. Community • Ruby има много силно и развито community •

    Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production
  33. Community • Ruby има много силно и развито community •

    Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production • Следва нови тенденции и добри практики
  34. Community • Ruby има много силно и развито community •

    Личи си от количеството и качеството на наличните библиотеки • Повечето от тях са ползваеми в production • Следва нови тенденции и добри практики • Бързо адаптира нови технологии и версии на езика
  35. Какво научих от Ruby? • Основни ползи от ООП •

    Колко е хубаво, когато има конвенции
  36. Какво научих от Ruby? • Основни ползи от ООП •

    Колко е хубаво, когато има конвенции • Силата на DSL-ите
  37. Какво научих от Ruby? • Основни ползи от ООП •

    Колко е хубаво, когато има конвенции • Силата на DSL-ите • Що е то наистина динамичен език
  38. Какво научих от Ruby? • Основни ползи от ООП •

    Колко е хубаво, когато има конвенции • Силата на DSL-ите • Що е то наистина динамичен език • Chaining, блокове, функционални закачки...
  39. Какво научих от Ruby? • Основни ползи от ООП •

    Колко е хубаво, когато има конвенции • Силата на DSL-ите • Що е то наистина динамичен език • Chaining, блокове, функционални закачки... • Какво е да пишеш на език, който те прави щастлив
  40. Ruby на релси? • Уеб фреймуърк • Солидна основа за

    вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още)
  41. Ruby на релси? • Уеб фреймуърк • Солидна основа за

    вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи
  42. Ruby на релси? • Уеб фреймуърк • Солидна основа за

    вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи • Ще ви направи по-щастливи програмисти
  43. Ruby на релси? • Уеб фреймуърк • Солидна основа за

    вашите уеб приложения • Написан на Ruby (наследява всички ползи и добавя още) • Много сериозна основа за всякакви приложения — от малки, до много големи • Ще ви направи по-щастливи програмисти • Ще ви направи по-добри програмисти
  44. Rails • Production-ready • Сигурността е на почит • Пълен

    с добри практики • Авангарден
  45. Rails • Production-ready • Сигурността е на почит • Пълен

    с добри практики • Авангарден • Модел, който много други уеб фреймуърци копират (например CakePHP)
  46. MVC

  47. MVC • Model-View-Controller архитектура • Бизнес логика в моделите •

    Презентационна логика (HTML) във файловете-изгледи
  48. MVC • Model-View-Controller архитектура • Бизнес логика в моделите •

    Презентационна логика (HTML) във файловете-изгледи • Навръзваща логика в контролерите
  49. ORM

  50. ORM • Object-relational mapping • Естествено продължение на MVC •

    Не пишете SQL директно • Това прави за вас ActiveRecord (или друг ORM)
  51. ORM • Object-relational mapping • Естествено продължение на MVC •

    Не пишете SQL директно • Това прави за вас ActiveRecord (или друг ORM) • На теория сте database-agnostic
  52. ActiveRecord • ORM, който идва по подразбиране с Rails •

    Поддържа PostgreSQL, MySQL, Sqlite3 • Може да го подкарате и с MSSQL, Oracle и други бази
  53. ActiveRecord • ORM, който идва по подразбиране с Rails •

    Поддържа PostgreSQL, MySQL, Sqlite3 • Може да го подкарате и с MSSQL, Oracle и други бази • При нужда, може да напишете и ваш адаптер
  54. ActiveRecord • ORM, който идва по подразбиране с Rails •

    Поддържа PostgreSQL, MySQL, Sqlite3 • Може да го подкарате и с MSSQL, Oracle и други бази • При нужда, може да напишете и ваш адаптер • Query интерфейс, поддържащ CRUD операции
  55. Валидации • Валидация на данните, постъпващи към вашите модели •

    Задължителни полета • Полета, които трябва да са само числа
  56. Валидации • Валидация на данните, постъпващи към вашите модели •

    Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал
  57. Валидации • Валидация на данните, постъпващи към вашите модели •

    Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина
  58. Валидации • Валидация на данните, постъпващи към вашите модели •

    Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина • Низове, отговарящи на определен формат
  59. Валидации • Валидация на данните, постъпващи към вашите модели •

    Задължителни полета • Полета, които трябва да са само числа • Числа в определен интервал • Низове с определена дължина • Низове, отговарящи на определен формат • Ваши валидатори
  60. Транзакции • Това е от мотиките • Задължително е да

    се ползват при писане в базата, особено ако трябва да пуснете няколко заявки
  61. Транзакции • Това е от мотиките • Задължително е да

    се ползват при писане в базата, особено ако трябва да пуснете няколко заявки • Централизиран ORM дава лесна възможност за добавяне на транзакции
  62. Транзакции • Това е от мотиките • Задължително е да

    се ползват при писане в базата, особено ако трябва да пуснете няколко заявки • Централизиран ORM дава лесна възможност за добавяне на транзакции • Ако знаех това през 2007-ма...
  63. Environments • Ясно разделение на обкръженията • Три обкръжения по

    подразбиране • Development • Test • Production • Може да добавите ваши
  64. Миграции • Структурата на базата ви е в кода •

    Създаване и премахване на таблици
  65. Миграции • Структурата на базата ви е в кода •

    Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее
  66. Миграции • Структурата на базата ви е в кода •

    Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код
  67. Миграции • Структурата на базата ви е в кода •

    Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код • Улеснява колаборацията
  68. Миграции • Структурата на базата ви е в кода •

    Създаване и премахване на таблици • Добавяне/премахване на колони, индекси и прочее • Всичко е във вашия код • Улеснява колаборацията • Улеснява deployment-а на вашето приложение
  69. Миграции и deployment • Имат up() и down() методи •

    Тоест, могат да бъдат “обръщани”
  70. Миграции и deployment • Имат up() и down() методи •

    Тоест, могат да бъдат “обръщани” • Качвате новата версия на базата заедно с новата версия на кода
  71. Миграции и deployment • Имат up() и down() методи •

    Тоест, могат да бъдат “обръщани” • Качвате новата версия на базата заедно с новата версия на кода • Ако нещо се обърка, down() ви спасява
  72. Миграции и deployment • Имат up() и down() методи •

    Тоест, могат да бъдат “обръщани” • Качвате новата версия на базата заедно с новата версия на кода • Ако нещо се обърка, down() ви спасява • Произволен Ruby-код в миграциите
  73. Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира”

    вашите asset-и (CSS, JavaScript, картинки и прочее)
  74. Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира”

    вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва
  75. Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира”

    вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва • Същото прави и за CSS
  76. Asset Pipeline • Зряло решение на сериозен проблем • “Пакетира”

    вашите asset-и (CSS, JavaScript, картинки и прочее) • Комбинира JavaScript файловете ви в един и го minify-ва и gzip-ва • Същото прави и за CSS • Имената на резултатните файлове съдържат хеш от съдържанието на файла
  77. Asset Pipeline • Лесен cache invalidation — при промяна съдържанието

    на файла се сменя хеша и следователно името му
  78. Asset Pipeline • Лесен cache invalidation — при промяна съдържанието

    на файла се сменя хеша и следователно името му • Кеширате во веки веков
  79. Asset Pipeline • Лесен cache invalidation — при промяна съдържанието

    на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN
  80. Asset Pipeline • Лесен cache invalidation — при промяна съдържанието

    на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN • Ползвате помощни функции, за да вкарвате линкове към вашите статични файлове
  81. Asset Pipeline • Лесен cache invalidation — при промяна съдържанието

    на файла се сменя хеша и следователно името му • Кеширате во веки веков • Поддръжка на CDN • Ползвате помощни функции, за да вкарвате линкове към вашите статични файлове • Горното важи за и за HTML, и за CSS
  82. Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки

    файлове = по-бързо • Кеширани файлове = по-бързо
  83. Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки

    файлове = по-бързо • Кеширани файлове = по-бързо • Употреба на CDN = по-бързо
  84. Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки

    файлове = по-бързо • Кеширани файлове = по-бързо • Употреба на CDN = по-бързо • Без главоболие от ваша страна
  85. Asset Pipeline • По-малко HTTP заявки = по-бързо • По-малки

    файлове = по-бързо • Кеширани файлове = по-бързо • Употреба на CDN = по-бързо • Без главоболие от ваша страна • Бонус — pre-processor-и на CSS и JavaScript!
  86. Други аспекти • Култура на добри практики и качествен код

    • Convention over configuration • The Rails Way™ • VCS — Git
  87. Други аспекти • Култура на добри практики и качествен код

    • Convention over configuration • The Rails Way™ • VCS — Git • Управление на зависимости от външни библиотеки — Bundler
  88. Други аспекти • Култура на добри практики и качествен код

    • Convention over configuration • The Rails Way™ • VCS — Git • Управление на зависимости от външни библиотеки — Bundler • Инфраструктура за пращане на мейли, с подобна на MVC-архитектура
  89. Какво научих от Rails? • Обкръжения (environments) и deployment •

    Миграции • Основите на шаблона MVC
  90. Какво научих от Rails? • Обкръжения (environments) и deployment •

    Миграции • Основите на шаблона MVC • Convention over configuration
  91. Какво научих от Rails? • Обкръжения (environments) и deployment •

    Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :)
  92. Какво научих от Rails? • Обкръжения (environments) и deployment •

    Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :) • Транзакции около всичко, що пише в базата!
  93. Какво научих от Rails? • Обкръжения (environments) и deployment •

    Миграции • Основите на шаблона MVC • Convention over configuration • Че ми трябват тестове :) • Транзакции около всичко, що пише в базата! • PostgreSQL > MySQL
  94. Ресурси за Ruby • Онлайн — без инсталация • RubyMonk

    — http://rubymonk.com/ • TryRuby — http://tryruby.org/levels/1/ challenges/0
  95. Ресурси за Ruby • Онлайн — без инсталация • RubyMonk

    — http://rubymonk.com/ • TryRuby — http://tryruby.org/levels/1/ challenges/0 • Тонове из интернет
  96. Ресурси за Rails • Oще на http://rubyonrails.org/documentation • Screencasts —

    http://rubyonrails.org/screencasts • Например RailsCasts
  97. Ресурси за Rails • Oще на http://rubyonrails.org/documentation • Screencasts —

    http://rubyonrails.org/screencasts • Например RailsCasts • AsciiCasts — текстов вариант на горното
  98. Учене от примери • Немалко Rails проекти с отворен код

    в GitHub • Например https://github.com/skanev/evans
  99. Учене от примери • Немалко Rails проекти с отворен код

    в GitHub • Например https://github.com/skanev/evans • Това е кодът зад http://fmi.ruby.bg