SlideShare a Scribd company logo
1 of 36
Download to read offline
RUBY (AND RAILS)
Jan Berdajs	

@mrbrdo
RUBY
•

Japan	


•

Yukihiro Matsumoto a.k.a. Matz	


•

24. Feb. 1993	


•

Matz is nice and so we are nice
(MINASWAN)
RAILS
•

Denmark	


•

David Heinemeier Hansson a.k.a
DHH	


•

BaseCamp / 37 signals	


•

July 2004	


•

“The best frameworks are in my
opinion extracted, not envisioned.
And the best way to extract is first
to actually do.”
STUFF ON RAILS
ECOSYSTEM
RubyGems
PACKAGES
ASP.NET NuGet:	

PHP	

Pear:	

Packagist/Composer:	

Python PyPI:	

Node.JS NPM:	

Ruby RubyGems:

17,770	

!

595	

21,754	

38,607	

53,740	

68,500

!

Honorable mention:	

Java, Scala: Maven etc, too many to count
INTERACTIVE CONSOLE
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
(1..n_presledkov).each do!
putc " "!
end!
!
(1..n_zvezdic).each do!
putc "*"!
end!
!
putc "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
n_presledkov.times do!
print " "!
end!
!
n_zvezdic.times do!
print "*"!
end!
!
print "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
print " " * n_presledkov!
!
!
!
print "*" * n_zvezdic!
!
!
!
print "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
puts " " * n_presledkov + "*" * n_zvezdic!
!
!
!
!
!
!
!
!
end!
!
MANY WAYS TO DO IT
n = 15!
!
n.times do |i|!
n_zvezdic = i * 2 + 1!
n_presledkov = n - i - 1!
!
puts " " * n_presledkov + "*" * n_zvezdic!
end!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
(1..n_presledkov).each do!
putc " "!
end!
!
(1..n_zvezdic).each do!
putc "*"!
end!
!
putc "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
Java:!
class Test { public static void main(String args[]) {} }!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
JUST COOL
Date.today.thursday? # => true!
!
10.seconds.ago # => 2014-01-09 09:15:10 +0100!
!
10.even? # => true!
!
102.megabytes + 24.kilobytes + 10.bytes # => 106,979,338!
!
10 + 1 # => 11!
!
class Fixnum!
def +(i)!
42!
end!
end!
!
10 + 1 # => 42!
JUST COOL
def alive?!
state != :dead!
end!

!

def clear!!
everything.remove!
end!

!

def setting=(value)!
raise "invalid value" unless value == 42!
end!
obj.setting = 5!

!

def [](key)!
key + 1!
end!
obj[1] # => 2!

!

def []=(key, value)!
whatevz!
end!
obj[1] = 2!
BEST PRACTICES

Short methods, self-commenting code	

+ readability	

+ testing	

!

You only need comments when you know your code	

is written so bad that people won’t understand it.
def clients!
User.where(user_type: "client")!
end!

!

def days_until_next_week(date)!
8 - date.cwday!
end!

!

def next_week_start(after_date)!
after_date + days_until_next_week(after_date).days!
end!
def payments_next_week!
payments = []!

!

User.where(user_type: "client").each do |user|!
next_week_start = Date.today + (8 Date.today.cwday).days!
next_week_end = next_week_start + 7.days!
payments = user.payments.where("due_on >= ? AND
due_on < 1.week.from_now", next_week_start,
next_week_end)!
payments.each do |payment|!
next if payment.due_on.saturday? ||
payment.due_on.sunday?!
payments << payment!
end!
end!
end!

!

def week_end(week_start)!
week_start + 7.days!
end!

!

def client_payments_between(client, range)!
client.payments!
.where("due_on >= ?", range.first)!
.where("due_on < ?", range.last)!
end!

!

def client_payments_next_week(client)!
start_day = next_week_start(Date.today)!
client_payments_between(client,!
start_day..week_end(start_day))!
end!

!

def payment_on_weekend?(payment)!
payment.due_on.saturday? || payment.due_on.sunday?!
end!

!

def payments_next_week!
clients.flat_map do |client|!
client_payments_next_week(client).reject do |payment|!
payment_on_weekend?(payment)!
end!
end!
end!
BEST PRACTICES
Testing
!
!

!
!

describe "#decline!" do!
subject { create :booking }!
context "without reason" do!
before { subject.decline! }!
its(:status) { should == "declined" }!
its(:declined?) { should be_true }!
end!
context "with reason" do!
before { subject.decline!("REASON!") }!
its(:status) { should == "declined" }!
its(:declined?) { should be_true }!
its(:status_reason) { should == "REASON!" }!
end!
end!
BEST PRACTICES

TEST FIRST => great object interfaces/APIs
Write how you want to use it, before you implement it.
BEST PRACTICES
Don’t repeat yourself!
Extract duplicate logic
# user.rb!

!

# file1.rb!

!
User.where(user_type:
!
# file2.rb!
!

"client").first!

User.where(user_type: "client", active: false).first!

class User!
def self.client!
where(user_type: "client")!
end!
end!

!

# file1.rb!

!

User.client.first!

!

# file2.rb!

!

User.client.where(active: false).first!
BEST PRACTICES
Don’t repeat yourself!
Extract duplicate logic
# user.rb!

!

class User!
def self.client!
where(user_type: "client")!
end!
end!

# file1.rb!

!
User.where(user_type:
!
# file2.rb!
!

"client").first!

!

# file1.rb!

User.where(user_type: "client", active: false).first!

!

User.client.first!

!

# file2.rb!

2 places to fix

1 place to fix

!

User.client.where(active: false).first!

+ easier to test
BEST PRACTICES

Convention over configuration
Sensible defaults
MY STUFF
MY JOB STUFF @ D-LABS
QUESTIONS

More Related Content

Similar to Ruby and Rails Basics

Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Rubymametter
 
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...Pilot
 
Python Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The GloryPython Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The Gloryemptysquare
 
Hadoop Streaming Tutorial With Python
Hadoop Streaming Tutorial With PythonHadoop Streaming Tutorial With Python
Hadoop Streaming Tutorial With PythonJoe Stein
 
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan  Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan edthix
 
An Introduction to Go
An Introduction to GoAn Introduction to Go
An Introduction to GoCloudflare
 
Front End Dependency Management at CascadiaJS
Front End Dependency Management at CascadiaJSFront End Dependency Management at CascadiaJS
Front End Dependency Management at CascadiaJSJoe Sepi
 
Fluent Refactoring (Lone Star Ruby Conf 2013)
Fluent Refactoring (Lone Star Ruby Conf 2013)Fluent Refactoring (Lone Star Ruby Conf 2013)
Fluent Refactoring (Lone Star Ruby Conf 2013)Sam Livingston-Gray
 
Impossible Programs
Impossible ProgramsImpossible Programs
Impossible ProgramsC4Media
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Coxlachie
 
Migrating To Ruby1.9
Migrating To Ruby1.9Migrating To Ruby1.9
Migrating To Ruby1.9tomaspavelka
 
An Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptAn Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptPeter-Paul Koch
 
Ruby - Uma Introdução
Ruby - Uma IntroduçãoRuby - Uma Introdução
Ruby - Uma IntroduçãoÍgor Bonadio
 
Class 12 CBSE Computer Science Investigatory Project
Class 12 CBSE Computer Science Investigatory ProjectClass 12 CBSE Computer Science Investigatory Project
Class 12 CBSE Computer Science Investigatory ProjectNandanRamesh2
 
Tour of language landscape (katsconf)
Tour of language landscape (katsconf)Tour of language landscape (katsconf)
Tour of language landscape (katsconf)Yan Cui
 
Test First Teaching
Test First TeachingTest First Teaching
Test First TeachingSarah Allen
 

Similar to Ruby and Rails Basics (20)

Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Ruby
 
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
 
Python Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The GloryPython Performance Profiling: The Guts And The Glory
Python Performance Profiling: The Guts And The Glory
 
Hadoop Streaming Tutorial With Python
Hadoop Streaming Tutorial With PythonHadoop Streaming Tutorial With Python
Hadoop Streaming Tutorial With Python
 
An introduction to Ruby
An introduction to RubyAn introduction to Ruby
An introduction to Ruby
 
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan  Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
 
An Introduction to Go
An Introduction to GoAn Introduction to Go
An Introduction to Go
 
Front End Dependency Management at CascadiaJS
Front End Dependency Management at CascadiaJSFront End Dependency Management at CascadiaJS
Front End Dependency Management at CascadiaJS
 
Fluent Refactoring (Lone Star Ruby Conf 2013)
Fluent Refactoring (Lone Star Ruby Conf 2013)Fluent Refactoring (Lone Star Ruby Conf 2013)
Fluent Refactoring (Lone Star Ruby Conf 2013)
 
Impossible Programs
Impossible ProgramsImpossible Programs
Impossible Programs
 
Blocks by Lachs Cox
Blocks by Lachs CoxBlocks by Lachs Cox
Blocks by Lachs Cox
 
Migrating To Ruby1.9
Migrating To Ruby1.9Migrating To Ruby1.9
Migrating To Ruby1.9
 
An Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScriptAn Event Apart Boston: Principles of Unobtrusive JavaScript
An Event Apart Boston: Principles of Unobtrusive JavaScript
 
Ruby - Uma Introdução
Ruby - Uma IntroduçãoRuby - Uma Introdução
Ruby - Uma Introdução
 
Class 12 CBSE Computer Science Investigatory Project
Class 12 CBSE Computer Science Investigatory ProjectClass 12 CBSE Computer Science Investigatory Project
Class 12 CBSE Computer Science Investigatory Project
 
Automate Yo' Self
Automate Yo' SelfAutomate Yo' Self
Automate Yo' Self
 
Tour of language landscape (katsconf)
Tour of language landscape (katsconf)Tour of language landscape (katsconf)
Tour of language landscape (katsconf)
 
Test First Teaching
Test First TeachingTest First Teaching
Test First Teaching
 
go.ppt
go.pptgo.ppt
go.ppt
 
Perfect Code
Perfect CodePerfect Code
Perfect Code
 

Recently uploaded

Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

Ruby and Rails Basics

  • 1. RUBY (AND RAILS) Jan Berdajs @mrbrdo
  • 2. RUBY • Japan • Yukihiro Matsumoto a.k.a. Matz • 24. Feb. 1993 • Matz is nice and so we are nice (MINASWAN)
  • 3. RAILS • Denmark • David Heinemeier Hansson a.k.a DHH • BaseCamp / 37 signals • July 2004 • “The best frameworks are in my opinion extracted, not envisioned. And the best way to extract is first to actually do.”
  • 6. PACKAGES ASP.NET NuGet: PHP Pear: Packagist/Composer: Python PyPI: Node.JS NPM: Ruby RubyGems: 17,770 ! 595 21,754 38,607 53,740 68,500 ! Honorable mention: Java, Scala: Maven etc, too many to count
  • 8. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! (1..n_presledkov).each do! putc " "! end! ! (1..n_zvezdic).each do! putc "*"! end! ! putc "n"! end! !
  • 9. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! n_presledkov.times do! print " "! end! ! n_zvezdic.times do! print "*"! end! ! print "n"! end! !
  • 10. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! print " " * n_presledkov! ! ! ! print "*" * n_zvezdic! ! ! ! print "n"! end! !
  • 11. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! puts " " * n_presledkov + "*" * n_zvezdic! ! ! ! ! ! ! ! ! end! !
  • 12. MANY WAYS TO DO IT n = 15! ! n.times do |i|! n_zvezdic = i * 2 + 1! n_presledkov = n - i - 1! ! puts " " * n_presledkov + "*" * n_zvezdic! end! ! ! ! ! ! ! ! ! !
  • 13. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 14. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! (1..n_presledkov).each do! putc " "! end! ! (1..n_zvezdic).each do! putc "*"! end! ! putc "n"! end! !
  • 15. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 16. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! Java:! class Test { public static void main(String args[]) {} }! ! ! ! ! ! ! !
  • 17. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 18. JUST COOL Date.today.thursday? # => true! ! 10.seconds.ago # => 2014-01-09 09:15:10 +0100! ! 10.even? # => true! ! 102.megabytes + 24.kilobytes + 10.bytes # => 106,979,338! ! 10 + 1 # => 11! ! class Fixnum! def +(i)! 42! end! end! ! 10 + 1 # => 42!
  • 19. JUST COOL def alive?! state != :dead! end! ! def clear!! everything.remove! end! ! def setting=(value)! raise "invalid value" unless value == 42! end! obj.setting = 5! ! def [](key)! key + 1! end! obj[1] # => 2! ! def []=(key, value)! whatevz! end! obj[1] = 2!
  • 20. BEST PRACTICES Short methods, self-commenting code + readability + testing ! You only need comments when you know your code is written so bad that people won’t understand it.
  • 21. def clients! User.where(user_type: "client")! end! ! def days_until_next_week(date)! 8 - date.cwday! end! ! def next_week_start(after_date)! after_date + days_until_next_week(after_date).days! end! def payments_next_week! payments = []! ! User.where(user_type: "client").each do |user|! next_week_start = Date.today + (8 Date.today.cwday).days! next_week_end = next_week_start + 7.days! payments = user.payments.where("due_on >= ? AND due_on < 1.week.from_now", next_week_start, next_week_end)! payments.each do |payment|! next if payment.due_on.saturday? || payment.due_on.sunday?! payments << payment! end! end! end! ! def week_end(week_start)! week_start + 7.days! end! ! def client_payments_between(client, range)! client.payments! .where("due_on >= ?", range.first)! .where("due_on < ?", range.last)! end! ! def client_payments_next_week(client)! start_day = next_week_start(Date.today)! client_payments_between(client,! start_day..week_end(start_day))! end! ! def payment_on_weekend?(payment)! payment.due_on.saturday? || payment.due_on.sunday?! end! ! def payments_next_week! clients.flat_map do |client|! client_payments_next_week(client).reject do |payment|! payment_on_weekend?(payment)! end! end! end!
  • 22. BEST PRACTICES Testing ! ! ! ! describe "#decline!" do! subject { create :booking }! context "without reason" do! before { subject.decline! }! its(:status) { should == "declined" }! its(:declined?) { should be_true }! end! context "with reason" do! before { subject.decline!("REASON!") }! its(:status) { should == "declined" }! its(:declined?) { should be_true }! its(:status_reason) { should == "REASON!" }! end! end!
  • 23. BEST PRACTICES TEST FIRST => great object interfaces/APIs Write how you want to use it, before you implement it.
  • 24. BEST PRACTICES Don’t repeat yourself! Extract duplicate logic # user.rb! ! # file1.rb! ! User.where(user_type: ! # file2.rb! ! "client").first! User.where(user_type: "client", active: false).first! class User! def self.client! where(user_type: "client")! end! end! ! # file1.rb! ! User.client.first! ! # file2.rb! ! User.client.where(active: false).first!
  • 25. BEST PRACTICES Don’t repeat yourself! Extract duplicate logic # user.rb! ! class User! def self.client! where(user_type: "client")! end! end! # file1.rb! ! User.where(user_type: ! # file2.rb! ! "client").first! ! # file1.rb! User.where(user_type: "client", active: false).first! ! User.client.first! ! # file2.rb! 2 places to fix 1 place to fix ! User.client.where(active: false).first! + easier to test
  • 26. BEST PRACTICES Convention over configuration Sensible defaults
  • 28.
  • 29.
  • 30.
  • 31.
  • 32. MY JOB STUFF @ D-LABS
  • 33.
  • 34.
  • 35.