• Like
  • Save
From dot net_to_rails
Upcoming SlideShare
Loading in...5
×
 

From dot net_to_rails

on

  • 11,516 views

 

Statistics

Views

Total Views
11,516
Views on SlideShare
11,516
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    From dot net_to_rails From dot net_to_rails Presentation Transcript

    • From .NET to Rails,A Developers Story
    • 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
    • Why Ruby and RailsCheaper than developing with .NETArguably faster and more productiveEasier to test your codeOpen and free development
    • Why Ruby and RailsThis man pays me to. @chrisvmcd
    • .NET Development Environment Window XP/Vista/7 Visual Studio 20XX Resharper or Code Rush
    • My First RubyDevelopment Environment Window XP/Vista/7 Rubymine Cygwin Ruby Gems Interactive Ruby Console (irb)
    • Windows ProblemsRails traditionally deployed on Linux OSGem’s often use Linux kernal methodsor Linux LibrariesEngineyard investing on Rails development with windows
    • Development Environment VMware workstation Ubuntu Rubymine VIM + a lot of plugins Ruby Gems Interactive Ruby Console (irb)
    • Development Environment Find what is right for you.
    • RubyRuby Koans (http://rubykoans.com/)
    • Ruby and SOLIDSingle responsibilityOpen/ClosedLiskov SubstitutionInterface SegregationDependency Injection
    • 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……
    • Ruby and Monkey Patching
    • 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?
    • Changing implementation class ZombieKiller def kill self.shotgun.fire end end zombie_killer = ZombieKiller.new puts(zombie_killer.kill) === Zombie head explodes class ZombieKiller def kill self.axe.throw end end zombie_killer = ZombieKiller.new puts(zombie_killer.kill) === Zombie Falls off
    • 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 Atwoodhttp://www.codinghorror.com/blog/2008/07/monkeypatching-for-humans.html
    • Testing Ruby and Rails
    • Testing Ruby and RailsTesting ensures code behaves correctlyTests ensure code compilesDebugging support patchy at bestIts all right, testing is a lot simpler
    • 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"); }}
    • 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 = Zombie.new( #do some logic to see #what happened to zombie :strength => :week, :speed => :fast) self.save @zombie_killer = ZombieKiller.new( end :weapon => :axe) end @zombie_killer.kill(@zombie) end it "should be decapitated if hit with axe" do @zombie.status.should eql(:decapitated) endend
    • 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.
    • 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
    • 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
    • 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...
    • 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
    • .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
    • 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
    • DeploymentShock horror its a demo
    • From .NET to Rails, A Developers StoryAny Questions?E-mail: pythonandchips@gmail.comBlog: pythonandchips.netTwitter: @colin_gemmell
    • Rails Scaling
    • Scaling RailsJohn Adams, Twitter operations http://tinyurl.com/6j4mqqb