great developers steal

62
GREAT DEVELOPERS STEAL ben scofield / @bscofield / scottish ruby conference / 8 april 2011

Upload: ben-scofield

Post on 17-May-2015

2.142 views

Category:

Technology


1 download

DESCRIPTION

There are more smart people building software now than there have been at any point in the past, which means that it's more important than ever to stay on top of new developments, libraries, frameworks, and everything else. To really take advantage of this wealth of innovation, however, you've got to look beyond your normal community -- what's going on in Python? And how can we use that to make our Ruby lives easier? In this session, we'll explore that question. We'll look at actual examples of code and concepts borrowed and reimplemented to form a better idea of when it's appropriate and when it'll fall flat.

TRANSCRIPT

Page 1: Great Developers Steal

GREATDEVELOPERS

STEAL

ben scofield / @bscofield / scottish ruby conference / 8 april 2011

Page 2: Great Developers Steal

flickr: hisgett

Page 3: Great Developers Steal

ART

Page 4: Great Developers Steal

http://obeygiant.com/headlines/obey-x-austin-sxsw

Page 5: Great Developers Steal

I’M NOART HISTORIAN

Page 6: Great Developers Steal

Mythology

Page 7: Great Developers Steal

http://www.saversplanet.com/wallpapers/one-ring-wallpapers_3072_1600.jpg

Page 8: Great Developers Steal

http://www.xibalba.demon.co.uk/jbr/trek/gen.html

Page 9: Great Developers Steal

http://www.scifinow.co.uk/news/top-five-sci-fi-vehicles/

Page 10: Great Developers Steal

MusicV U

Page 11: Great Developers Steal

http://www.wired.com/special_multimedia/2008/pl_music_1609

Page 12: Great Developers Steal

http://www.soulculture.co.uk/features/jimi-hendrix-the-epitome-of-a-legend/

Page 13: Great Developers Steal

http://upload.wikimedia.org/wikipedia/commons/d/d3/Eleanor_Rigby_-_DSC05154.JPG (Benkid77)

Page 14: Great Developers Steal

Software Development

Page 15: Great Developers Steal

Software Development

Page 16: Great Developers Steal

xUnitSUnitJUnitCppUnitNUnitLapidary Test::Unit

Page 17: Great Developers Steal

BDDJBehaveRBehave RSpecNBehavePHPSpecJasmine

Page 18: Great Developers Steal

RailsRailsCakePHPGrailsRhino on RailsASP.NET MVC

Page 19: Great Developers Steal

ORM Hibernate NHibernateActiveRecord SubSonic

Page 20: Great Developers Steal

mod_*mod_perlmod_pythonmod_phpmod_rails Passenger

Page 21: Great Developers Steal

WSGIPasteRackJackPlackHack

Page 22: Great Developers Steal

WSGIdef simple_app(environ, start_response):    """Simplest possible application object"""    status = '200 OK'    response_headers = [('Content-type', 'text/html')] start_response(status, response_headers)    return ['Hello World\n']

http://www.python.org/dev/peps/pep-0333/

Page 23: Great Developers Steal

Pastedef app(environ, start_response):    start_response('200 OK', [('content-type', 'text/html')])    return ['Hello world']

https://bitbucket.org/ianb/paste

Page 24: Great Developers Steal

Rackdef call(env)  [200, {'Content-Type' => 'text/html'}, 'Hello World']end

https://github.com/rack/rack

Page 25: Great Developers Steal

Plackmy $app = sub {  my $env = shift;  return [ 200, [ 'Content-Type' => 'text/html' ], 'Hello World' ];};

https://github.com/miyagawa/Plack

Page 26: Great Developers Steal

Jackfunction(env){  return [200, {'Content-Type': 'text/html'}, "Hello World"];};

https://github.com/JackDanger/jack

Page 27: Great Developers Steal

Hackapp :: Applicationapp = \env -> return $  Response 200 [ ("Content-Type", "text/plain") ] (pack "Hello World")

main = run app

https://github.com/nfjinjing/hack

Page 28: Great Developers Steal

SinatraExpress.jsRatpackSammy.jsFitzgeraldSlimScalatraNancy

Page 29: Great Developers Steal

Sinatrarequire 'rubygems'require 'sinatra'

get '/' do erb :homepageend

get '/names/:name' do  "Hello, #{params[:name]}"end

post '/login' do # data is in request.body # validate loginend

https://github.com/bmizerany/sinatra

Page 30: Great Developers Steal

Express.jsvar express = require('express');var app = express.createServer();

app.configure(function(){ app.use(express.bodyParser());});

app.get('/', function(request, response) { response.render('homepage.ejs');});

app.get('/names/:name', function(request, response) { response.send('Hello, ' + request.param('name'));

});

app.post('/login', function(request, response) { // data is in request.body // validate login});

https://github.com/visionmedia/express

Page 31: Great Developers Steal

Ratpackget("/") { render "homepage.html"}

get("/names/:name") {   "Hello, ${urlparams.name}"}

post("/login") { // data is in params.field  // validate login}

https://github.com/bleedingwolf/Ratpack

Page 32: Great Developers Steal

Slim<?phprequire 'Slim/Slim.php';Slim::init();

Slim::get('/', function () {  Slim::render('homepage.php');});

Slim::get('/names/:name', function ($name) { echo "Hello, $name";});

Slim::post('/login', function () {  # data is in Slim::request()->post('field')  # validate login});

Slim::run();?>

https://github.com/codeguy/Slim

Page 33: Great Developers Steal

Nancypublic class Sample : NancyModule{ public Module()  { Get["/"] = params => {      return View.Spark("homepage.spark", params);    };

    Get["/names/{name}"] = params => { return string.Concat("Hello, ", params.name);    };

    Post["/login"] = params => { /// data is in params.field /// validate login }; }}

https://github.com/thecodejunkie/Nancy

Page 34: Great Developers Steal

Sammy.js(function($) {  var app = $.sammy('#main', function() {    this.get('#/', function() {      this.partial('files/homepage.html');    });

    this.post('#/login', function() {      // data is in params.field      // validate login    });  });

  $(function() { app.run('#/'); });})(jQuery);

https://github.com/quirkey/sammy

Page 35: Great Developers Steal

Interlude

On Naming

Page 36: Great Developers Steal

Scalatraimport org.scalatra._import org.scalatra.scalate._

class Example extends ScalatraServlet with ScalateSupport { get("/") {    templateEngine.layout("homepage.scaml")  }

get("/names/:name") { <p>Hello, {params("name")}</p>  }   post("/login") { // data is in params{"field"} // validate login  }}

https://github.com/scalatra/scalatra

Page 37: Great Developers Steal

Software Theft 101

Page 38: Great Developers Steal

Software Theft 101

Page 39: Great Developers Steal

Need-Driven

Page 40: Great Developers Steal

1 Find a problem

Page 41: Great Developers Steal

2 Pick a target

Page 42: Great Developers Steal

3 Case the joint

Page 43: Great Developers Steal

Opportunity-Driven

Page 44: Great Developers Steal

1 Pick a target

Page 45: Great Developers Steal

2 Case the joint

Page 46: Great Developers Steal

3 Wait for your chance

Page 47: Great Developers Steal

Casing the Joint

Page 48: Great Developers Steal

Searching

Page 49: Great Developers Steal

GeneralGitHubBitBucketSourceForgeGoogle Code

Page 50: Great Developers Steal

SpecificRubygemsPEPsPyPICPAN

Page 51: Great Developers Steal

Evaluating

Page 52: Great Developers Steal

GoodForks and watchersActive repositoriesEdge case tests IssuesCitationsDocumentationHistoryStrong opinions

Page 53: Great Developers Steal

Perpetration

Page 54: Great Developers Steal

LocationParadigmIdiomStyle

Trouble

Page 55: Great Developers Steal

Inspire JBehave RSpec

Page 56: Great Developers Steal

Sample Sinatra Padrino

Page 57: Great Developers Steal

Cover JUnit NUnitWSGI Rack

Page 58: Great Developers Steal

RUBYISTScan steal from

EVERYONE

Page 59: Great Developers Steal

ProceduralObject-OrientedFunctional

Page 60: Great Developers Steal

Metaprogramming

Page 61: Great Developers Steal

Test-focused

Page 62: Great Developers Steal

THANK YOU!now go burgle something

Ben Scofield / @bscofieldhttp://benscofield.comhttp://speakerrate.com/t/7099