SlideShare une entreprise Scribd logo
1  sur  15
Entaggle.com A Case Study in Agile Software Development with Rails Give Recognition Get Recognition Tag, you’re it. Elisabeth Hendrickson esh@qualitytree.com Last updated April 11, 2011 This presentation is licensed under the Creative Commons Attribution 3.0. Permission granted to distribute and excerpt. Attribute this work to Elisabeth Hendrickson, Quality Tree Software, Inc.
Overview First code written in October 2010. Announced to the public March 1, 2011. Automated continuous deploy in place from the beginning. Test-driven from the beginning. Built with Rails using Devise, Paperclip, Kaminari, HAML, SASS, JQueryUI with Rspec & Cucumber for testing and Fixjour for test data creation. Build w/ all tests currently takes 13 mins. …and it’s a “spare time” project.
Ch-ch-changes Two complete UI rewrites since the first placeholder UI put in place. (3 UI designs total since the beginning.) The core “Tagging” user flow has changed uncountable times based on feedback. New features added at least weekly. Backlog reprioritized frequently based on user feedback.
User Suggestions Come From… Email Conversations
Reprioritizing I thought these things would be critically important: Moderation & admin features User “credibility” and Tag “prestige” I was wrong. Turns out these things were more important: More engaging UI/flow “Since you were last here…” Instrumenting & Metrics
Key Factors for Agility Frequent checkins Automated “checks” at both unit & acceptance levels Automated deploy to Staging Relentless attention to removing sources of friction
My Workflow Develop until green & clean. Then check in. Pick up the next story. Back to start. If ready, manual deploy Build kicks off. If build passes, automatic deploy to Staging Exploratory Testing Go see it in multiple browsers. My CI Box (running Hudson) PRODUCTION STAGING
Frequent Checkins Github “Punchcard” Graph
Automated “checks” 239 Rspec examples (includes unit & integration tests) 90 Cucumber scenarios with 684 steps Over 93% code coverage All major user flows covered in Cucumber scenarios
Code Coverage (Rcov) WHY THE DIP? For no apparent reason, Rcov suddenly started counting coverage for standard ruby libraries. Edited the rake task to explicitly exclude them & coverage went back to normal.
Automated Deploy If the tests pass, Hudson CI server uses a shell command to deploy: git pull &&    bundle install &&   rake db:migrate &&   touch tmp/restart.txt (in the past I’ve used Capistrano; may decide I need it again. But not yet.)
Examples of Relentlessly Removing Sources of Friction Regularly refactoring to remove crufty code. Avoiding the generators: they spew large amounts of templated code. Investing in making deploy to staging automatic, smooth, & secure w/ RSA key authentication. Investing in making deploy to production trivially easy. Creating shell command aliases for frequent command sequences.
Results… Stats: 93 user stories completed including 22 user-requested enhancements 10 user reported bugs (only 1 critical in production). 41 self-reported bugs. 46 of 51 bugs closed. All 5 remaining open are self-reported. Production busted for ~3mins once on a bad deploy. Otherwise it’s been up. Almost non-existent “WTF?!?!” incident count.
Lessons Learned (and Reinforced) The tests are totally worth it, even when it is tempting to skip them. However, high code coverage != well tested. Exploratory Testing is essential. Building up an inventory of unused acceptance tests was an unfortunate waste. Splitting stories until they represent <= 2 days worth of work is essential for keeping momentum.
Appreciations… …to the following contributors: Pat Maddox, Dale Emery, Joseph Wilk, Michael Dowling, Richard Scherek, and LasseKoskela all paired with me on writing code. Andy Hohenner helped with System Administration. Yves Hannoulle has been an ardent supporter and evangelist. Marcus Smith created our cheerful “e” logo and Darren McMillan created the favicon. The Entaggle community has helped me steer the project with great suggestions. The Weekend Testers kept me busy with bug reports.

Contenu connexe

Tendances

Common Challenges & Best Practices for TDD on iOS
Common Challenges & Best Practices for TDD on iOSCommon Challenges & Best Practices for TDD on iOS
Common Challenges & Best Practices for TDD on iOSDerek Lee Boire
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven DevelopmentMireia Sangalo
 
A Not-So-Serious Introduction to Test Driven Development (TDD)
A Not-So-Serious Introduction to Test Driven Development (TDD) A Not-So-Serious Introduction to Test Driven Development (TDD)
A Not-So-Serious Introduction to Test Driven Development (TDD) CodeOps Technologies LLP
 
Test Driven Development (C#)
Test Driven Development (C#)Test Driven Development (C#)
Test Driven Development (C#)Alan Dean
 
Test Drive Development
Test Drive DevelopmentTest Drive Development
Test Drive Developmentsatya sudheer
 
Test driven-development
Test driven-developmentTest driven-development
Test driven-developmentDavid Paluy
 
Unit Testing, TDD and the Walking Skeleton
Unit Testing, TDD and the Walking SkeletonUnit Testing, TDD and the Walking Skeleton
Unit Testing, TDD and the Walking SkeletonSeb Rose
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven DevelopmentDhaval Dalal
 
Rapid software testing
Rapid software testingRapid software testing
Rapid software testingSachin MK
 
5-Ways-to-Revolutionize-Your-Software-Testing
5-Ways-to-Revolutionize-Your-Software-Testing5-Ways-to-Revolutionize-Your-Software-Testing
5-Ways-to-Revolutionize-Your-Software-TestingMary Clemons
 
DevOps - Boldly Go for Distro
DevOps - Boldly Go for DistroDevOps - Boldly Go for Distro
DevOps - Boldly Go for DistroPaul Boos
 
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in FlexassertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flexmichael.labriola
 
Dependency Injection in iOS
Dependency Injection in iOSDependency Injection in iOS
Dependency Injection in iOSPablo Villar
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Developmentguestc8093a6
 
Software Design for Testability
Software Design for TestabilitySoftware Design for Testability
Software Design for Testabilityamr0mt
 
Unit testing
Unit testingUnit testing
Unit testingPiXeL16
 
Exploratory testing
Exploratory testingExploratory testing
Exploratory testingHuib Schoots
 

Tendances (20)

Common Challenges & Best Practices for TDD on iOS
Common Challenges & Best Practices for TDD on iOSCommon Challenges & Best Practices for TDD on iOS
Common Challenges & Best Practices for TDD on iOS
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
A Not-So-Serious Introduction to Test Driven Development (TDD)
A Not-So-Serious Introduction to Test Driven Development (TDD) A Not-So-Serious Introduction to Test Driven Development (TDD)
A Not-So-Serious Introduction to Test Driven Development (TDD)
 
Test Driven Development (C#)
Test Driven Development (C#)Test Driven Development (C#)
Test Driven Development (C#)
 
Test Drive Development
Test Drive DevelopmentTest Drive Development
Test Drive Development
 
Test driven-development
Test driven-developmentTest driven-development
Test driven-development
 
Unit Testing, TDD and the Walking Skeleton
Unit Testing, TDD and the Walking SkeletonUnit Testing, TDD and the Walking Skeleton
Unit Testing, TDD and the Walking Skeleton
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Rapid software testing
Rapid software testingRapid software testing
Rapid software testing
 
5-Ways-to-Revolutionize-Your-Software-Testing
5-Ways-to-Revolutionize-Your-Software-Testing5-Ways-to-Revolutionize-Your-Software-Testing
5-Ways-to-Revolutionize-Your-Software-Testing
 
DevOps - Boldly Go for Distro
DevOps - Boldly Go for DistroDevOps - Boldly Go for Distro
DevOps - Boldly Go for Distro
 
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in FlexassertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Testing 101
Testing 101Testing 101
Testing 101
 
Dependency Injection in iOS
Dependency Injection in iOSDependency Injection in iOS
Dependency Injection in iOS
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
TDD Basics with Angular.js and Jasmine
TDD Basics with Angular.js and JasmineTDD Basics with Angular.js and Jasmine
TDD Basics with Angular.js and Jasmine
 
Software Design for Testability
Software Design for TestabilitySoftware Design for Testability
Software Design for Testability
 
Unit testing
Unit testingUnit testing
Unit testing
 
Exploratory testing
Exploratory testingExploratory testing
Exploratory testing
 

En vedette

Agile Testing, Uncertainty, Risk, and Why It All Works
Agile Testing, Uncertainty, Risk, and Why It All WorksAgile Testing, Uncertainty, Risk, and Why It All Works
Agile Testing, Uncertainty, Risk, and Why It All WorksElisabeth Hendrickson
 
On the Care and Feeding of Feedback Cycles
On the Care and Feeding of Feedback CyclesOn the Care and Feeding of Feedback Cycles
On the Care and Feeding of Feedback CyclesElisabeth Hendrickson
 
Introduction to Acceptance Test Driven Development
Introduction to Acceptance Test Driven DevelopmentIntroduction to Acceptance Test Driven Development
Introduction to Acceptance Test Driven DevelopmentElisabeth Hendrickson
 
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILO
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILOPresenter Slides - E-Workshop: Agricultural risk management with FAO and ILO
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILOMicrocredit Summit Campaign
 
P&msp2010 07 risk-and-change-management
P&msp2010 07 risk-and-change-managementP&msp2010 07 risk-and-change-management
P&msp2010 07 risk-and-change-managementEmanuele Della Valle
 
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...Troy Magennis
 
02 - Testing Management - Crash Slides
02 - Testing Management - Crash Slides02 - Testing Management - Crash Slides
02 - Testing Management - Crash SlidesSamer Desouky
 
Improving Financial Management
Improving Financial ManagementImproving Financial Management
Improving Financial ManagementCherry_Birch
 
Chapter 12 - Operational risk management
Chapter 12 - Operational risk managementChapter 12 - Operational risk management
Chapter 12 - Operational risk managementQuan Risk
 
Measuring operational risk
Measuring operational riskMeasuring operational risk
Measuring operational riskUjjwal 'Shanu'
 
Leading Change Workshop
Leading Change WorkshopLeading Change Workshop
Leading Change WorkshopMichael Barker
 
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...SABPP
 
Operational risk management and measurement
Operational risk management and measurementOperational risk management and measurement
Operational risk management and measurementRahmat Mulyana
 
Operation Risk Management in Banking Sector
Operation Risk Management in Banking SectorOperation Risk Management in Banking Sector
Operation Risk Management in Banking SectorSanjay Kumbhar
 
Agile Development using HP Agile Manager and HP Quality Center / ALM
Agile Development using HP Agile Manager and HP Quality Center / ALMAgile Development using HP Agile Manager and HP Quality Center / ALM
Agile Development using HP Agile Manager and HP Quality Center / ALMpd7.group
 

En vedette (20)

Agile Testing, Uncertainty, Risk, and Why It All Works
Agile Testing, Uncertainty, Risk, and Why It All WorksAgile Testing, Uncertainty, Risk, and Why It All Works
Agile Testing, Uncertainty, Risk, and Why It All Works
 
Agile Quality and Risk Management
Agile Quality and Risk ManagementAgile Quality and Risk Management
Agile Quality and Risk Management
 
AGILEEE Friday 17:15 Talk
AGILEEE Friday 17:15 TalkAGILEEE Friday 17:15 Talk
AGILEEE Friday 17:15 Talk
 
Agile: Get Real
Agile: Get RealAgile: Get Real
Agile: Get Real
 
Wclessons atd-sm
Wclessons atd-smWclessons atd-sm
Wclessons atd-sm
 
On the Care and Feeding of Feedback Cycles
On the Care and Feeding of Feedback CyclesOn the Care and Feeding of Feedback Cycles
On the Care and Feeding of Feedback Cycles
 
Introduction to Acceptance Test Driven Development
Introduction to Acceptance Test Driven DevelopmentIntroduction to Acceptance Test Driven Development
Introduction to Acceptance Test Driven Development
 
Agile quality management
Agile quality managementAgile quality management
Agile quality management
 
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILO
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILOPresenter Slides - E-Workshop: Agricultural risk management with FAO and ILO
Presenter Slides - E-Workshop: Agricultural risk management with FAO and ILO
 
P&msp2010 07 risk-and-change-management
P&msp2010 07 risk-and-change-managementP&msp2010 07 risk-and-change-management
P&msp2010 07 risk-and-change-management
 
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...
Risk Management and Reliable Forecasting using Un-reliable Data (magennis) - ...
 
02 - Testing Management - Crash Slides
02 - Testing Management - Crash Slides02 - Testing Management - Crash Slides
02 - Testing Management - Crash Slides
 
Improving Financial Management
Improving Financial ManagementImproving Financial Management
Improving Financial Management
 
Chapter 12 - Operational risk management
Chapter 12 - Operational risk managementChapter 12 - Operational risk management
Chapter 12 - Operational risk management
 
Measuring operational risk
Measuring operational riskMeasuring operational risk
Measuring operational risk
 
Leading Change Workshop
Leading Change WorkshopLeading Change Workshop
Leading Change Workshop
 
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...
HR Governance, Risk, Compliance slides at 13th African Corporate Governance C...
 
Operational risk management and measurement
Operational risk management and measurementOperational risk management and measurement
Operational risk management and measurement
 
Operation Risk Management in Banking Sector
Operation Risk Management in Banking SectorOperation Risk Management in Banking Sector
Operation Risk Management in Banking Sector
 
Agile Development using HP Agile Manager and HP Quality Center / ALM
Agile Development using HP Agile Manager and HP Quality Center / ALMAgile Development using HP Agile Manager and HP Quality Center / ALM
Agile Development using HP Agile Manager and HP Quality Center / ALM
 

Similaire à Entaggle: an Agile Software Development Case Study

DevOps - Introduction to data science
DevOps - Introduction to data scienceDevOps - Introduction to data science
DevOps - Introduction to data scienceFrank Kienle
 
Simplified DevOps Bliss -with OpenAI API
Simplified DevOps Bliss -with OpenAI APISimplified DevOps Bliss -with OpenAI API
Simplified DevOps Bliss -with OpenAI APIVictorSzoltysek
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsErik Osterman
 
Test parallelization using Jenkins
Test parallelization using JenkinsTest parallelization using Jenkins
Test parallelization using JenkinsRogue Wave Software
 
Part 2 improving your software development v1.0
Part 2   improving your software development v1.0Part 2   improving your software development v1.0
Part 2 improving your software development v1.0Jasmine Conseil
 
30 days or less: New Features to Production
30 days or less: New Features to Production30 days or less: New Features to Production
30 days or less: New Features to ProductionKarthik Gaekwad
 
Hudson
HudsonHudson
Hudson8x8
 
Waterfallacies V1 1
Waterfallacies V1 1Waterfallacies V1 1
Waterfallacies V1 1Jorge Boria
 
DevQAOps - Surviving in a DevOps World
DevQAOps - Surviving in a DevOps WorldDevQAOps - Surviving in a DevOps World
DevQAOps - Surviving in a DevOps WorldWinston Laoh
 
Devops interview questions 2 www.bigclasses.com
Devops interview questions  2  www.bigclasses.comDevops interview questions  2  www.bigclasses.com
Devops interview questions 2 www.bigclasses.combigclasses.com
 
Continuous Integration at T3CON08
Continuous Integration at T3CON08Continuous Integration at T3CON08
Continuous Integration at T3CON08Sebastian Kurfürst
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningAmazon Web Services
 
DevOps interview questions and answers
DevOps interview questions and answersDevOps interview questions and answers
DevOps interview questions and answersHopeTutors1
 
Principles and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyPrinciples and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyMike Brittain
 

Similaire à Entaggle: an Agile Software Development Case Study (20)

Continuous Integration & the Release Maturity Model
Continuous Integration & the Release Maturity Model Continuous Integration & the Release Maturity Model
Continuous Integration & the Release Maturity Model
 
DevOps demystified
DevOps demystifiedDevOps demystified
DevOps demystified
 
Drupal 7 ci and testing
Drupal 7 ci and testingDrupal 7 ci and testing
Drupal 7 ci and testing
 
DevOps - Introduction to data science
DevOps - Introduction to data scienceDevOps - Introduction to data science
DevOps - Introduction to data science
 
Simplified DevOps Bliss -with OpenAI API
Simplified DevOps Bliss -with OpenAI APISimplified DevOps Bliss -with OpenAI API
Simplified DevOps Bliss -with OpenAI API
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/Ops
 
Continuous Testing
Continuous TestingContinuous Testing
Continuous Testing
 
Test parallelization using Jenkins
Test parallelization using JenkinsTest parallelization using Jenkins
Test parallelization using Jenkins
 
Part 2 improving your software development v1.0
Part 2   improving your software development v1.0Part 2   improving your software development v1.0
Part 2 improving your software development v1.0
 
30 days or less: New Features to Production
30 days or less: New Features to Production30 days or less: New Features to Production
30 days or less: New Features to Production
 
Hudson
HudsonHudson
Hudson
 
What DevOps Isn't
What DevOps Isn'tWhat DevOps Isn't
What DevOps Isn't
 
Waterfallacies V1 1
Waterfallacies V1 1Waterfallacies V1 1
Waterfallacies V1 1
 
DevQAOps - Surviving in a DevOps World
DevQAOps - Surviving in a DevOps WorldDevQAOps - Surviving in a DevOps World
DevQAOps - Surviving in a DevOps World
 
Devops interview questions 2 www.bigclasses.com
Devops interview questions  2  www.bigclasses.comDevops interview questions  2  www.bigclasses.com
Devops interview questions 2 www.bigclasses.com
 
Continuous Integration at T3CON08
Continuous Integration at T3CON08Continuous Integration at T3CON08
Continuous Integration at T3CON08
 
Operations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from HappeningOperations: Production Readiness Review – How to stop bad things from Happening
Operations: Production Readiness Review – How to stop bad things from Happening
 
Agile
AgileAgile
Agile
 
DevOps interview questions and answers
DevOps interview questions and answersDevOps interview questions and answers
DevOps interview questions and answers
 
Principles and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at EtsyPrinciples and Practices in Continuous Deployment at Etsy
Principles and Practices in Continuous Deployment at Etsy
 

Entaggle: an Agile Software Development Case Study

  • 1. Entaggle.com A Case Study in Agile Software Development with Rails Give Recognition Get Recognition Tag, you’re it. Elisabeth Hendrickson esh@qualitytree.com Last updated April 11, 2011 This presentation is licensed under the Creative Commons Attribution 3.0. Permission granted to distribute and excerpt. Attribute this work to Elisabeth Hendrickson, Quality Tree Software, Inc.
  • 2. Overview First code written in October 2010. Announced to the public March 1, 2011. Automated continuous deploy in place from the beginning. Test-driven from the beginning. Built with Rails using Devise, Paperclip, Kaminari, HAML, SASS, JQueryUI with Rspec & Cucumber for testing and Fixjour for test data creation. Build w/ all tests currently takes 13 mins. …and it’s a “spare time” project.
  • 3. Ch-ch-changes Two complete UI rewrites since the first placeholder UI put in place. (3 UI designs total since the beginning.) The core “Tagging” user flow has changed uncountable times based on feedback. New features added at least weekly. Backlog reprioritized frequently based on user feedback.
  • 4. User Suggestions Come From… Email Conversations
  • 5. Reprioritizing I thought these things would be critically important: Moderation & admin features User “credibility” and Tag “prestige” I was wrong. Turns out these things were more important: More engaging UI/flow “Since you were last here…” Instrumenting & Metrics
  • 6. Key Factors for Agility Frequent checkins Automated “checks” at both unit & acceptance levels Automated deploy to Staging Relentless attention to removing sources of friction
  • 7. My Workflow Develop until green & clean. Then check in. Pick up the next story. Back to start. If ready, manual deploy Build kicks off. If build passes, automatic deploy to Staging Exploratory Testing Go see it in multiple browsers. My CI Box (running Hudson) PRODUCTION STAGING
  • 8. Frequent Checkins Github “Punchcard” Graph
  • 9. Automated “checks” 239 Rspec examples (includes unit & integration tests) 90 Cucumber scenarios with 684 steps Over 93% code coverage All major user flows covered in Cucumber scenarios
  • 10. Code Coverage (Rcov) WHY THE DIP? For no apparent reason, Rcov suddenly started counting coverage for standard ruby libraries. Edited the rake task to explicitly exclude them & coverage went back to normal.
  • 11. Automated Deploy If the tests pass, Hudson CI server uses a shell command to deploy: git pull && bundle install && rake db:migrate && touch tmp/restart.txt (in the past I’ve used Capistrano; may decide I need it again. But not yet.)
  • 12. Examples of Relentlessly Removing Sources of Friction Regularly refactoring to remove crufty code. Avoiding the generators: they spew large amounts of templated code. Investing in making deploy to staging automatic, smooth, & secure w/ RSA key authentication. Investing in making deploy to production trivially easy. Creating shell command aliases for frequent command sequences.
  • 13. Results… Stats: 93 user stories completed including 22 user-requested enhancements 10 user reported bugs (only 1 critical in production). 41 self-reported bugs. 46 of 51 bugs closed. All 5 remaining open are self-reported. Production busted for ~3mins once on a bad deploy. Otherwise it’s been up. Almost non-existent “WTF?!?!” incident count.
  • 14. Lessons Learned (and Reinforced) The tests are totally worth it, even when it is tempting to skip them. However, high code coverage != well tested. Exploratory Testing is essential. Building up an inventory of unused acceptance tests was an unfortunate waste. Splitting stories until they represent <= 2 days worth of work is essential for keeping momentum.
  • 15. Appreciations… …to the following contributors: Pat Maddox, Dale Emery, Joseph Wilk, Michael Dowling, Richard Scherek, and LasseKoskela all paired with me on writing code. Andy Hohenner helped with System Administration. Yves Hannoulle has been an ardent supporter and evangelist. Marcus Smith created our cheerful “e” logo and Darren McMillan created the favicon. The Entaggle community has helped me steer the project with great suggestions. The Weekend Testers kept me busy with bug reports.