Upload
og-consulting
View
26
Download
1
Tags:
Embed Size (px)
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.
Citation preview
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?
Who we’re not
http://www.gamespot.com/pages/unions/forums/show_msgs.php?topic_id=26319887&union_id=16254http://scotlandonrails.com/speakers
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
Here’s howhttp://www.morningtoast.com/index.php/2007/08/im-sorry-i-missed-the-miss-teen-usa-pageant
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 ([email protected])
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...