waxing ballroom floors on the titanic

Post on 28-Oct-2014

26 Views

Category:

Business

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Our talk from RailsConf 2008 goes over our experience in large-scale enterprise applications, leaving the enterprise, and finding similar problems as indepedent consultants.

TRANSCRIPT

Bunk Monkey

Just leave this up as people filter in to the room.

Start off panel with “This really has no bearing on anything. It’s just here to give you a taste of what’s to come for the next 45 minutes.”

Bunk MonkeySpunk Monkey

Just leave this up as people filter in to the room.

Start off panel with “This really has no bearing on anything. It’s just here to give you a taste of what’s to come for the next 45 minutes.”

Bunk MonkeySpunk Monkey

smegma

Just leave this up as people filter in to the room.

Start off panel with “This really has no bearing on anything. It’s just here to give you a taste of what’s to come for the next 45 minutes.”

Waxing Ballroom Floors on the Titanic

and other less seaworthy vessels

OG ConsultingKevin BarnesRick Bradley

Yossef Mendelssohn

be sure to start the meetronome at the beginning.

http://ogtastic.com/

http://ni.hili.st/

http://b.logi.cx -or- http://bl.ogtastic.com/

http://github.com/flogic/

OG Consulting

Awesomeness Competitors

OG Consulting?

This shit is hard

This shit is hardthat’s what she said

Do your besthttp://www.indorphyn.com/wp-content/uploads/2007/01/Sisyphus.jpg

No matter what the oddsThe Karate Kid, Columbia Pictures

t3h sinking ship

t3h project: goalsClinical system: 40,000+ patients / year

HIPAA, clinical trials, Sarbanes-Oxley

Full medical billing system

Share with 6-7 other large organizations

Common research community

Research-enabled clinical data

(t3h sinking ship)

t3h project: goalsClinical system: 40,000+ patients / year

HIPAA, clinical trials, Sarbanes-Oxley

Full medical billing system

Share with 6-7 other large organizations

Common research community

Research-enabled clinical data

(t3h sinking ship)

Save the world, yo

© Darrin Weissinger (darrin.weissinger@centerstone.org)

This picture you’ve all seen, we’re the source.

Look, there’s actually attribution.

(t3h sinking ship)

t3h specs

we want the same system as we currently have, only AWESOME, and OURS, so we can prove to everyone we’re the best in the world.

oh, and do some good.

http://i160.photobucket.com/albums/t189/rossmcgrath16/redneck-mansion.jpg (t3h sinking ship)

What is expected

please consult org chart for portrait and name to accompany statue. thx.

--t3h boss

(t3h sinking ship)

What they wanthttp://www.talendforge.org/wiki/doku.php?id=what_is_new1_1 (t3h sinking ship)

Problems

http://www.nsc.org/statinfo/odds_dying.jpg (t3h sinking ship)

http://z.about.com/d/politicalhumor/1/0/u/L/bush_strategery.jpg (t3h sinking ship)

Meetings

so we push to meet with the actual people who supposedly know what the business does and wants

http://www.business-marketing.com/store/termination.html#5578 (t3h sinking ship)

and, months later, when we get meetings with them, it’s a series of months of meetings with mostly Managers

http://www.growingcoaches.com/webinar.htm (t3h sinking ship)

and if that’s not enough, the CIO (who is a consultant) sets up his own Mega-Synergy Task Force™

http://www.brandascension.com/Elevation_Products.html (t3h sinking ship)

or “How to waste time and demoralize people.”

http://alternative-gifts.haluy.co.uk/product,details,,63e9efe53d8cd9167025f239b675592e.html (t3h sinking ship)

Be sure to quantify value

one way to make it clear how much of a waste of time meetings are is to track them via meetronome. compare with the cost of the most recent denied request for, say, keyboards, wireless router, non-paralyzing desk chairs, etc.

show the running meetronome now.

(t3h sinking ship)

The Enterprise Strikes Back

http://www.startrekdesktopwallpaper.com/wallpapers/StarTrek_starship_Enterprise_NCC1701A_firing_phasers_freecomputerdesktop_wallpaper_1024.shtml (t3h sinking ship)

Oracle

Java

cvs

svn trac

IRCPostgres

Ant

continuous integration

JUnit, etc.JBoss

EJB3.0

time

suckage

good

age

unit tests

SQL schemae

Hibernate

Big Design Up Front

domain driven design

AJAX

assigned tickets

pair-on-demand

Rails

for-profit partner

nightly conversions

public releases

CruiseControl

continuous builder

public trac

public IRC

public svn

mac laptops

wifi

lose technical lead

hire new developers

migrationsswitchtower

CTI

STI

1,000 meetings

storiesrelocating

getting more “Real”

Rake

voluntary tickets

continuous integrationanalysis patterns

“deployments”

auto deployments

Perceived progressthis was presented in RailsConf 2006, some snazzy unfolding left to right, showing all the things that were improving

(t3h sinking ship)

time

suckage

good

age

The ice under the Titanic

Corporate Politics

Croneyism

Long-hidden incompetence

That Which Should Not Be

Ass-Covering

That Which Shall Not Be Named

Old age and treachery

Budget paddingCan’t-Do Attitude

Fear of ChangeTurf

Finger-pointing

Blame Shifting

visionquestswishful thinking by mgmt

storiesstories

t3h webinar

(t3h sinking ship)

Do your besthttp://www.sffringe.org/fringe06/06pix/sisyphus.jpg (t3h sinking ship)

Hiring

Hiring is purely about budgets and politics. A slot is open? Fill it with a warm body. A great person is available? No slot, no hire.

A great person is available and you have 5 shitty people on your team? No firing in t3h enterprise.

that’s what she said

that’s what she said(t3h sinking ship)

10 Interview QuestionsFor Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

• Singleton or Visitor?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

• Singleton or Visitor?

• Spolsky or Arrington?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

• Singleton or Visitor?

• Spolsky or Arrington?

• Have you implemented final, destructors, or xdoclet in Ruby?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

• Singleton or Visitor?

• Spolsky or Arrington?

• Have you implemented final, destructors, or xdoclet in Ruby?

• Have you ever written an empty if just to use the else?

For Developers

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• Perforce or Bitkeeper?

• Praise or Annotate?

• Java or PHP?

• Singleton or Visitor?

• Spolsky or Arrington?

• Have you implemented final, destructors, or xdoclet in Ruby?

• Have you ever written an empty if just to use the else?

• Who owns the code?

For Developers

(t3h sinking ship)

10 Interview QuestionsFor Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

• ksh or tcsh?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

• ksh or tcsh?

• Ant or Maven?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

• ksh or tcsh?

• Ant or Maven?

• ports or yum?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

• ksh or tcsh?

• Ant or Maven?

• ports or yum?

• Puppet or Cfengine?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

10 Interview Questions

• What’s your deployment process?

• Security or Availability?

• XP or Vista?

• Oracle or SQLServer?

• Java or Perl?

• ksh or tcsh?

• Ant or Maven?

• ports or yum?

• Puppet or Cfengine?

• CI?

For Sysadmins

“Puppet or Cfengine” may be the only question with a right answer

(t3h sinking ship)

http://stuartscustoms.freeyellow.com/Fairmont.html (t3h sinking ship)

Quality

Always strive for EPIC mfn quality.

Transparency

Be 100% transparent

http://www.brianmicklethwait.com/index.php/weblog/computer_transparency/ (t3h sinking ship)

Publicizing your transparency means never having to answer the question: “Why didn’t I know about this?”

http://drinkingliberally.org/blogs/idahofalls/archives/2007/02/his_head_will_g.html (t3h sinking ship)

Transparency

t3h rules

(t3h sinking ship)

The Gantt Chart

http://openproj.org/wiki/index.php?title=Gantt_Chart (t3h sinking ship)

Mr. Gantt Chart

http://www.gantt-chart.biz/gantt-charting-made-easy/ (t3h sinking ship)

(t3h sinking ship)

t3h Cant Chart

Mr. Cant Chart

http://www.flickr.com/photos/atmos/217012352/ (t3h sinking ship)

t3h Cant Chart

• Identify all the tasks that you are responsible for.

(t3h sinking ship)

• Plot out what depends on what.

(t3h sinking ship)

t3h Cant Chart

• From those tasks, find the CANT™ – who is holding up the works, and what are their excuses.

• A task can have many CANTs.

• Tally the CANTs.

(t3h sinking ship)

t3h Cant Chart

• Separate the tasks you will do from those with CANTs.

(t3h sinking ship)

t3h Cant Chart

• Apply the secret sauce CANT formula.

• The big tasks are where you need to be focused.

• Your enemies are those jerks with the highest CANT scores.

(t3h sinking ship)

t3h Cant Chart

• You either won or failed hardcore.

(t3h sinking ship)

t3h Cant Chart

10 Interview QuestionsFor the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• FogBugz or Excel?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• FogBugz or Excel?

• What’s your deployment process?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• FogBugz or Excel?

• What’s your deployment process?

• What’s your HR department like?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• FogBugz or Excel?

• What’s your deployment process?

• What’s your HR department like?

• Who owns the code?

For the company

(t3h sinking ship)

10 Interview Questions

• How’s your test coverage?

• Oracle or SQLServer?

• FogBugz or Excel?

• What’s your deployment process?

• What’s your HR department like?

• Who owns the code?

For the company

6

(t3h sinking ship)

Plowing a new fieldDonald Miralle/Getty Images, http://recipes.howstuffworks.com/salt5.htm

Any code can be legacy code

this is Karl, or a we call him Karlsbad (at testing)

def associate( association, options = {} ) return false unless association && association.account_id == self.account_id && association.uniq_id != self.uniq_id options = { :update_record => true }.merge( options ) self.associations.each do |a| if association.uniq_id == a.uniq_id return false end end associations << association self.save_with_validation false association.associate( self, :update_record => false ) self.save_with_validation false if options[:update_record] if self.record self.record.update_build() if self.record else self.record = Record.build_with self end endend

Legacy Code

(Legacy Code)

(plowing a new field)

Legacy Code

class RecursiveMock def initialize(args = {}) @stubs = {}.merge(args) end def method_missing(meth, *args) if @stubs.has_key?(meth.to_sym) return @stubs[meth.to_sym] end self endend

(Legacy Code)

Characterization Tests

module Spec::Example::ExampleGroupMethods def currently(name, &block) it("*** CURRENTLY *** #{name}", &block) end

alias_method :she, :itend

Characterization Tests

(Legacy Code)

describe YourMom do before :each { @your_mom = YourMom.new } currently "is at my house" do @your_mom.should be_at_my_house end describe "when at my house" do before :each do @your_mom.stubs(:at_my_house?).returns(true) end she "should take the bus home" endend

(Legacy Code)

Characterization Tests

YourMom- *** CURRENTLY *** is at my house

YourMom when at my house- should take the bus home (PENDING: Not Yet Implemented)

Pending:YourMom when at my house should take the bus home (Not Yet Implemented)

Finished in 0.174782 seconds

2 examples, 0 failures, 1 pending

(Legacy Code)

Characterization Tests

currently "has a summary which includes the amount truncated to dollars" do @payment.stubs(:account).returns(stub('acct', :name => 'acct 1')) @payment.amount_in_cents = 1234 @payment.summary.should match(/\$12\b/) end

currently "has a summary which fails if payment amount is not set" do @payment.stubs(:account).returns(stub('acct', :name => 'acct 1')) @payment.amount_in_cents = nil lambda { @payment.summary }.should raise_error end

(Legacy Code)

Characterization Tests

(plowing a new field)

Legacy Code

old-school cod3rz

(plowing a new field)http://www.geneontology.org/images/go-database-ER-diagram.png

Feedback Loops

(feedback loops)

(feedback loops)

(feedback loops)

Feedback

http://www.etsu.edu/philos/classes/rk/postmodern/htmdescriptionpages/30paik2desc.jpg (feedback loops)

• Cruisecontrol.rb; flog, heckle, flame; Use EC2 or slices if needed; Do short iterations, perform post-mortems

What Rails gets wrongand when you should care

Fixtures

(rails == wrong)

Fixtures

(rails == wrong)

Fixtures

(rails == wrong)

Fixtures

(rails == wrong)

Fixtures

(rails == wrong)

Fixtures

(rails == wrong)

Fixtures == Cargo Cult

(rails == wrong)

Solution?

http://www.imagechef.com/ic/make.jsp?tid=Bling+Necklace (rails == wrong)

http://github.com/flogic/object_daddy

(rails == wrong)

object_daddy

class Category < ActiveRecord::Base has_many :items validates_presence_of :name validates_uniqueness_of :nameend

class Item < ActiveRecord::Base belongs_to :category validates_presence_of :category validates_presence_of :code validates_uniqueness_of :code validates_format_of :code, :with => /^[a-zA-Z]+-\d+$/end

Object Daddy

(rails == wrong)

Models

class Category < ActiveRecord::Base has_many :items validates_presence_of :name validates_uniqueness_of :nameend

(rails == wrong)

class Category generator_for :name, :start => 'test' do |prev| prev.succ endend

Model

Exemplar

Object Daddy

class Item < ActiveRecord::Base belongs_to :category validates_presence_of :category validates_presence_of :code validates_uniqueness_of :code validates_format_of :code, :with => /^[a-zA-Z]+-\d+$/end

(rails == wrong)

class Item generator_for :code, :start => 'test-001' do |prev| prefix, number = prev.split('-') [prefix, number.succ].join('-') endend

Model

Exemplar

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>>

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

=> #<Category id: 27, name: "tesu">>>

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>> Category.generate

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

=> #<Category id: 27, name: "tesu">>> => #<Item id: 4, code: "test-001", category_id: 28>>>

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>> Category.generate

Item.generate

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

=> #<Category id: 27, name: "tesu">>> => #<Item id: 4, code: "test-001", category_id: 28>>>

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>> Category.generate

Item.generate

cat = Category.find :first

cat.items.generate=> #<Category id: 26, name: "test">>>=> #<Item id: 5, code: "test-002", category_id: 26>>>

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

=> #<Category id: 27, name: "tesu">>> => #<Item id: 4, code: "test-001", category_id: 28>>>

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>> Category.generate

Item.generate

cat = Category.find :first

cat.items.generate=> #<Category id: 26, name: "test">>>=> #<Item id: 5, code: "test-002", category_id: 26>>>=> #<Category id: 29, name: "things">>>

Category.generate(:name => 'things')

Object Daddy

Loading development environment (Rails 2.0.2)>>

(rails == wrong)

=> #<Category id: 27, name: "tesu">>> => #<Item id: 4, code: "test-001", category_id: 28>>>

=> #<Category id: 30, name: "tesw">

some unexpected problems came up while making this slide.

OD is intended for use in tests, not the console. This is just an example for illumination.

It’s kind of difficult to write tests for how something works in a non-test setting.

Category.generate=> #<Category id: 26, name: "test">>> Category.generate

Item.generate

cat = Category.find :first

cat.items.generate=> #<Category id: 26, name: "test">>>=> #<Item id: 5, code: "test-002", category_id: 26>>>=> #<Category id: 29, name: "things">>>

Category.generate(:name => 'things')

Category.generate

Object Daddy

class Employee # calls Employee.next_username generator_for :username, :method => :next_username

# calls SSNGenerator.next generator_for :ssn, :class => SSNGenerator

generator_for(:hired_on) { Date.today }

generator_for :nickname, 'Bruce'

generator_for :fingers => 5end

(rails == wrong)

Object Daddy

The New Hotness

The New Hotness

Sinatra

http://www.amazon.com/Capitol-Years-Frank-Sinatra/dp/B000002UWM

The New Hotness

Hobo

http://akugel.wordpress.com/2007/03/27/the-hobo-code/

The New Hotness

Camping

http://fiberfib.com/en/benicassim/where-to-sleep/camping-areas/

The New Hotness

Merb

http://www.pastdeadline.com/2007/08/merv-a-man-for-.html

The New Hotness

Ramaze

http://www.geocities.com/athens/2962/colourbook/http://www.descendingashtray.com/index.php?s=labyrinth

The New Hotness

Documentation

Questionable

or Trustworthy

The if expression - evaluates body if expression is true - does not evaluate body if expression is false - does not evaluate else-body if expression is true - evaluates only else-body if expression is false - returns result of then-body evaluation if expression is true - returns result of last statement in then-body if expression is true

Useful

or not

w00t

(rails == wrong)

Then

http://www.juixe.com/techknow/wp-content/uploads/2008/04/ruby_books.png

Now

Metrics

Metrics

Transactions Per Secondhttp://www.flickr.com/photos/edame/351834048/

Metrics

Consider the following numbers.(expected)

Metrics

• Transactions per second

Consider the following numbers.(expected)

Metrics

• Transactions per second

• Users per year

Consider the following numbers.(expected)

Metrics

• Transactions per second

• Users per year

Consider the following numbers.(expected)

Which is larger?

Metrics

One more important number to consider.

Metrics

• Dollars per transaction

One more important number to consider.

Metrics

• Dollars per transaction

One more important number to consider.

Metrics

• object_daddy

• timely

• shmemeter

• autochronic

• freshtrack

• nihilist_bot (& http://ni.hili.st/)

• ultrasphinx_search_wrapper

• flame (aka flog w/ tests & blame)

What has OG done for me lately?

Check it out on githubuser: flogic

Free Shizzle

The 2 Down Days in pr0n

That’s what she said.

(free shizzle)

What does OG stand for?

(free shizzle)

What does OG stand for?

http://www.hermes-press.com/music_portal.htmhttp://www.hermes-press.com/ice-t.jpg (free shizzle)

What does OG stand for?

(free shizzle)

What does OG stand for?

http://www.freefoto.com/preview/09-14-57?ffid=09-14-57 (free shizzle)

What does OG stand for?

http://www.nypost.com/seven/03032007/tv/so_easy__even_abc_can_do_it_tv_.htm (free shizzle)

What does OG stand for?

http://www.samsquanch.ca/images/Friends/the%20riddler.jpg (free shizzle)

How much did this meeting cost?

It’s all about the cheddar.

(free shizzle)

In a landmark Bon Jovi song, why does Jon Bon “play for keeps?”

Questions?

and as promised...

top related