Faster! Faster! • Accelerating your business with blazing prototypes Drew Engelson @handofdoom
I’m Drew Engelson • I work for Celerity • “The business acceleration consultancy” • We help get companies “unstuck” • I help organizations decide what tech to buy or build • National Geographic Society • PBS • American Diabetes Association • Then we make it happen
First… a disclaimer • I’m a Pythonista • I’m a Djangonaut • Blame OSCON 2006
Hence, my huge man-crush on JKM Photo: Jason Samsa @ Flickr
"Innovation is R&D’s job” a.k.a. Not your job
Cultures of Innovation Props to Josh Linkner
“COTS is the safer choice” No one ever got fired for choosing ___________.
“COTS does it out of the box” That’s horse crap!
Developers [sometimes] have good ideas Give ‘em a chance!
Reduce the potential cost of failure;Timebox the experiment “OK, you get 2 days”
The challenge • Build a simple, fully functional prototype • A basic web service for image transformation • Requirements • Pass in a source image url, desired height and width • Pull down the image to server • Resize the image on the server • Return derivative image
The challenge url = http://farm8.staticflickr.com/7138/7576110858_d66eec09f5_z.jpg width = 200 height = 200 Photo: Tomcrenshaw @ Flickr
I’m talking REAL functional code;minimize throw away work Evolve to production
Surveyed a few frameworks • PHP • Zend • CodeIgniter • Python • Django • Flask • Bottle • I know, there are many other choices… Which is your favorite?
Compared on • Learning curve • Ease of bootstrapping dev environment • Ease of development • # of files created or touched • # of lines written or modified • Complexity of code • Speed of deployment • Need to share with others, right? • Note: This is a very non-scientific study
$ pip install Flask requests PIL Then write ~19 lines of Python
import cStringIO import requests from PIL import Image from flask import Flask, request, send_file app = Flask(__name__) @app.route('/', methods=['GET', ]) def resize(): url = request.values['url'] req = requests.get(url) resource = cStringIO.StringIO(req.content) image = Image.open(resource) image = image.resize((int(request.values['w']), int(request.values['h'])), Image.ANTIALIAS) resource = cStringIO.StringIO() image.save(resource, 'JPEG') resource.seek(0) return send_file(resource, mimetype='image/jpeg') if __name__ == '__main__': app.run(debug=True)
Quick and easy local server Django: manage.pyrunserver Flask: app.run()
Don’t trust anything that has built-in smilies Sorry, CodeIgniter
$ git push heroku master Really... does anything else matter?
Use what you know! Learning curve is biggest time suck.
Keep it real Don’t assume failure… this may have legs.
Don’t be afraid of… Failure; the unknown; the undead
Give ‘em a little rope… But don’t hang ‘em with it
Spread knowledge;Hold sessions to share ideas I call these “mind melds”