Your SlideShare is downloading. ×
From dot net_to_rails
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

From dot net_to_rails


Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. From .NET to Rails,A Developers Story
  • 2. Who the f**k is Colin Gemmell.NET Dev for 3.5 yearsWebforms, MVC, UmbracoBig on ALT.NET idealsMoved to Ruby on Rails in May 2010Started the Glasgow Ruby User Group in March 2011
  • 3. Why Ruby and RailsCheaper than developing with .NETArguably faster and more productiveEasier to test your codeOpen and free development
  • 4. Why Ruby and RailsThis man pays me to. @chrisvmcd
  • 5. .NET Development Environment Window XP/Vista/7 Visual Studio 20XX Resharper or Code Rush
  • 6. My First RubyDevelopment Environment Window XP/Vista/7 Rubymine Cygwin Ruby Gems Interactive Ruby Console (irb)
  • 7. Windows ProblemsRails traditionally deployed on Linux OSGem’s often use Linux kernal methodsor Linux LibrariesEngineyard investing on Rails development with windows
  • 8. Development Environment VMware workstation Ubuntu Rubymine VIM + a lot of plugins Ruby Gems Interactive Ruby Console (irb)
  • 9. Development Environment Find what is right for you.
  • 10. RubyRuby Koans (
  • 11. Ruby and SOLIDSingle responsibilityOpen/ClosedLiskov SubstitutionInterface SegregationDependency Injection
  • 12. Ruby and loose couplingIn .NET we use Interface and Dependency Injection to achieve loose couplingRuby is loosely coupled by design.Everything and anything can be changed.Thanks to being a dynamic language and……
  • 13. Ruby and Monkey Patching
  • 14. Add New Functionality to Ruby"Developer Developer Developer is awesome".second_wordNoMethodError: undefined method `second_word for "developer developer developer":Stringclass String def second_work return self.split( )[1] endend"Developer Developer Developer is awesome".second_word=== “Developer” Extension methods anyone?
  • 15. Changing implementation class ZombieKiller def kill end end zombie_killer = puts(zombie_killer.kill) === Zombie head explodes class ZombieKiller def kill self.axe.throw end end zombie_killer = puts(zombie_killer.kill) === Zombie Falls off
  • 16. Are you scared yet?If the idea of monkey patching scares you a little, it probably should. Can you imagine debugging code where the String class had subtly different behaviours from the String youve learned to use? Monkey patching can be incredibly dangerous in the wrong hands. Jeff Atwood
  • 17. Testing Ruby and Rails
  • 18. Testing Ruby and RailsTesting ensures code behaves correctlyTests ensure code compilesDebugging support patchy at bestIts all right, testing is a lot simpler
  • 19. How I Tested .NET[TestFixture] public class ZombieKiller : IZombieKiller {public class ZombieKillerTest : SpecificationBase{ private IZombieKillerRepository _repo; private ZombieKiller zombieKiller; public ZombieKiller( private Zombie zombie; IZombieKillerRepository repo){ _repo = repo; } public override void Given(){ var repo = Mock<IZombieKillerRepository>(); public void Kill(Zombie zombie){ zombie = new Zombie(Strength.Week, zombie.status = "decapitated“; Speed.Fast); repo.UpdateZombie(zombie); zombieKiller = new ZombieKiller(repo); } repo.stub(x => x.UpdateZombie).returns(true); } zombieKiller.weapon = Weapon.Axe; } public override void When(){ zombieKiller.kill(zombie); } [Test] public void should_depacite_zombie(){ zombie.status.should_eqaul("decapitated"); }}
  • 20. Example RSpec testdescribe "when killing a zombie" do class ZombieKiller class Zombie def kill zombie def save zombie.attack_with self.weapon true end end End end class Zombie < ActiveRecord::Base before do def attack_with weapon @zombie = #do some logic to see #what happened to zombie :strength => :week, :speed => :fast) @zombie_killer = end :weapon => :axe) end @zombie_killer.kill(@zombie) end it "should be decapitated if hit with axe" do @zombie.status.should eql(:decapitated) endend
  • 21. Range of TestingIn .NET there are a lot of test frameworksRuby test frameworks include TestUnit, RSpec, Shoulda and CucumberRails encourages testing at all levels.All extremely well documented.
  • 22. The Rails WayOne project layout and only one layoutPrinciple of least surpriseChange it at your own riskHeavily based on conventions e.g. ZombieController > ZombieControllerSpec Zombie > ZombieSpec (or ZombieTest) Zombie > ZombieControllerThis can be applied to .NET too
  • 23. The Curse of Active RecordMakes really fast to get going with projectThe number one reason for slow apps (IMHO)Is to easy to write code that over uses the databaseOften don’t/forget to think about DB
  • 24. The Curse of Active Record1 class Session < ActiveRecord::Base 19 module SessionModel2 # name > string 20 def self.included klass3 # code > string 21 klass.extend ClassMethods 22 end4 235 validates_uniqueness_of :name, :code 24 module ClassMethods6 include SessionModel 25 def code_is_unique?(code)7 26 return self.find_by_code(code).nil?8 def generate_code 27 end 28 end9 return if !(self.code.nil? || 29 end self.code.empty?)10 full_code = ""11 while (true)12 code = "%04d" % rand(9999)13 full_code = “ABC#{code}"14 break if Session.code_is_unique?(full_code)15 end16 self.code = full_code17 end18 endSpot the database calls...
  • 25. The Curse of Active Recordclass Session < ActiveRecord::Base module SessionModel # name > string def self.included klass # code > string klass.extend ClassMethods end validates_uniqueness_of :name, :code x 2 module ClassMethods include SessionModel def code_is_unique?(code) return self.find_by_code(code).nil? def generate_code end end return if !(self.code.nil? || end self.code.empty?) full_code = "" while (true) code = "%04d" % rand(9999) full_code = “ABC#{code}" break if Session.code_is_unique?(full_code) end self.code = full_code endendThis was production code. The names havebeen changed to protect the innocent
  • 26. .NET Deployment.NET deployment predominantly through FTP or copy to file shareBut what about databases, migrations, queues, externals dependencies etc.Fear common place on deployment day
  • 27. Ruby DeploymentDeployment is a solved problem in RailsBuilt on several partsDatabase migration come out of the boxBundler gets dependencyUse of Chef or Capistrano for externals or configuration changesPlatform as a service combine all of these e.g. Heroku, Engineyard, Brightbox
  • 28. DeploymentShock horror its a demo
  • 29. From .NET to Rails, A Developers StoryAny Questions?E-mail: pythonandchips@gmail.comBlog: pythonandchips.netTwitter: @colin_gemmell
  • 30. Rails Scaling
  • 31. Scaling RailsJohn Adams, Twitter operations