Download pdf - Great Developers Steal

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