Agile without technical practices isn’t agile
What is agile?
Ninja
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collabora...
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collabora...
Test-driven
Development
A
A
A
A rrange
A
A
A rrange
A ct
A
A rrange
A ct
A ssert
require 'rspec'
require './invoice'
describe Invoice do
context 'when in draft state' do
let(:invoice) { Invoice.new }
it ...
let(:invoice)	
  {	
  Invoice.new	
  }
require 'rspec'
require './invoice'
describe Invoice do
context 'when in draft stat...
invoice.invoice_number.start_with?(‘IDFT-­‐’)
require 'rspec'
require './invoice'
describe Invoice do
context 'when in dra...
expect	
  to	
  be	
  true
require 'rspec'
require './invoice'
describe Invoice do
context 'when in draft state' do
let(:i...
/Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/
custom_require.rb:36:in `require': cannot load such fil...
/Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/
custom_require.rb:36:in `require': cannot load such fil...
class Invoice
end
Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec
invoice_spec.rb
F
Failures:
1) Invoice when in draft state
Failure/Err...
Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec
invoice_spec.rb
F
Failures:
1) Invoice when in draft state
Failure/Err...
def invoice_number
end
Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec
invoice_spec.rb
F
Failures:
1) Invoice when in draft state
Failure/Err...
Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec
invoice_spec.rb
F
Failures:
1) Invoice when in draft state
Failure/Err...
def invoice_number
self.invoice_number = “I-DFT-#{next_seq_val}”
end
def invoice_number
self.invoice_number = “I-DFT-#{next_seq_val}”
end
def next_seq_val
...
end
Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec
invoice_spec.rb
.
Finished in 0.00287 seconds
1 example, 0 failures
Refactor
Refactor
refactoring, n., a change made to the internal
structure of software to make it easier to
understand and cheaper ...
Make it work
Make it right
Make it fast
Cost of change
Estimation
Refactoring
Improves software design
A very busy method
public void addLineToFile(String lineToAdd, String sourceFile,
String destFile)
{
	 List<String> sourceLines = getLines(so...
private List<String> addLine(String line, List<String>
lines)
{
	 List<String> newLines = new ArrayList<String>(lines);
	 ...
private List<String> sortLines(List<String> lines)
{
	 List<String> newLines = new ArrayList<String>(lines);
	 Collections...
Refactoring makes
software easier to
understand
Refactoring helps you
program

FASTER
Now that we have TDD
and refactoring...
Continuous Integration
Single source
repository
Automate the build
Make your build
self-testing
Everyone commits to
mainline (several times)
every day
Every commit builds
the mainline
Don’t check in on a
broken build
Keep the build fast
Keep the build green
Wait for green build
before moving on
Make build status
visible
Deployment pipeline
Automate deployments
Infrastructure as code
Propagate each change
through the pipeline
Stop the line if any part
fails
http://www.snap-ci.com
Backing out changes
Feature toggle
Respond to changes
Unattainable goals
Continuous
Improvements
Questions?
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Agile without technical practices isn't agile
Upcoming SlideShare
Loading in …5
×

Agile without technical practices isn't agile

569 views

Published on

An conference talk I gave at AgileTour Bangkok 2013 on what agile really is, what agile isn't about, and how agile is possible only with technical practices.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
569
On SlideShare
0
From Embeds
0
Number of Embeds
87
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Agile without technical practices isn't agile

  1. 1. Agile without technical practices isn’t agile
  2. 2. What is agile?
  3. 3. Ninja
  4. 4. Individuals and interactions over processes and tools Working software over comprehensive documentation Customer collaboration over contract negotiation Responding to change over NOT following a plan Cowboy hacking Ninja
  5. 5. Individuals and interactions over processes and tools Working software over comprehensive documentation Customer collaboration over contract negotiation Responding to change over NOT following a plan Cowboy hacking Learners/ Practitioners Ninja
  6. 6. Test-driven Development
  7. 7. A A A
  8. 8. A rrange A A
  9. 9. A rrange A ct A
  10. 10. A rrange A ct A ssert
  11. 11. require 'rspec' require './invoice' describe Invoice do context 'when in draft state' do let(:invoice) { Invoice.new } it { expect(invoice.invoice_number.start_with? ('IDFT-')).to be_true } end end
  12. 12. let(:invoice)  {  Invoice.new  } require 'rspec' require './invoice' describe Invoice do context 'when in draft state' do let(:invoice) { Invoice.new } it { expect(invoice.invoice_number.start_with? ('IDFT-')).to be_true } end end
  13. 13. invoice.invoice_number.start_with?(‘IDFT-­‐’) require 'rspec' require './invoice' describe Invoice do context 'when in draft state' do let(:invoice) { Invoice.new } it { expect(invoice.invoice_number.start_with? ('IDFT-')).to be_true } end end
  14. 14. expect  to  be  true require 'rspec' require './invoice' describe Invoice do context 'when in draft state' do let(:invoice) { Invoice.new } it { expect(invoice.invoice_number.start_with? ('IDFT-')).to be_true } end end
  15. 15. /Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/ custom_require.rb:36:in `require': cannot load such file -- ./invoice (LoadError) from /Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/ custom_require.rb:36:in `require' from /Users/kyeung/RubymineProjects/agiletour_bangkok/invoice_spec.rb: 2:in `<top (required)>' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `load' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `block in load_spec_files' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `each' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `load_spec_files' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/command_line.rb:22:in `run' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/runner.rb:80:in `run' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/runner.rb:17:in `block in autorun'
  16. 16. /Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/ custom_require.rb:36:in `require': cannot load such file -- ./invoice (LoadError) from /Users/kyeung/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/rubygems/ custom_require.rb:36:in `require' from /Users/kyeung/RubymineProjects/agiletour_bangkok/invoice_spec.rb: 2:in `<top (required)>' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `load' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `block in load_spec_files' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `each' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/configuration.rb:789:in `load_spec_files' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/command_line.rb:22:in `run' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/runner.rb:80:in `run' from /Users/kyeung/.rvm/gems/ruby-1.9.3-p327/gems/rspec-core-2.12.1/ lib/rspec/core/runner.rb:17:in `block in autorun' `require': cannot load such file -- ./invoice (LoadError)
  17. 17. class Invoice end
  18. 18. Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec invoice_spec.rb F Failures: 1) Invoice when in draft state Failure/Error: it { expect(invoice.invoice_number.start_with?('I-DFT-')).to be_true } NoMethodError: undefined method `invoice_number' for #<Invoice: 0x007fe5732b4ca0> # ./invoice_spec.rb:7:in `block (3 levels) in <top (required)>' Finished in 0.00048 seconds 1 example, 1 failure Failed examples:
  19. 19. Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec invoice_spec.rb F Failures: 1) Invoice when in draft state Failure/Error: it { expect(invoice.invoice_number.start_with?('I-DFT-')).to be_true } NoMethodError: undefined method `invoice_number' for #<Invoice: 0x007fe5732b4ca0> # ./invoice_spec.rb:7:in `block (3 levels) in <top (required)>' NoMethodError: undefined method `invoice_number' for #<Invoice Finished in 0.00048 seconds 1 example, 1 failure Failed examples:
  20. 20. def invoice_number end
  21. 21. Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec invoice_spec.rb F Failures: 1) Invoice when in draft state Failure/Error: it { expect(invoice.invoice_number.start_with?('IDFT-')).to be_true } NoMethodError: undefined method `start_with?' for nil:NilClass # ./invoice_spec.rb:7:in `block (3 levels) in <top (required)>' Finished in 0.0005 seconds 1 example, 1 failure
  22. 22. Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec invoice_spec.rb F Failures: 1) Invoice when in draft state Failure/Error: it { expect(invoice.invoice_number.start_with?('IDFT-')).to be_true } NoMethodError: undefined method `start_with?' for nil:NilClass # ./invoice_spec.rb:7:in `block (3 levels) in <top (required)>' NoMethodError: undefined method `start_with?' for nil:NilClass Finished in 0.0005 seconds 1 example, 1 failure
  23. 23. def invoice_number self.invoice_number = “I-DFT-#{next_seq_val}” end
  24. 24. def invoice_number self.invoice_number = “I-DFT-#{next_seq_val}” end def next_seq_val ... end
  25. 25. Admin-MacBook-Air-3:agiletour_bangkok kyeung$ rspec invoice_spec.rb . Finished in 0.00287 seconds 1 example, 0 failures
  26. 26. Refactor
  27. 27. Refactor refactoring, n., a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behaviour.
  28. 28. Make it work
  29. 29. Make it right
  30. 30. Make it fast
  31. 31. Cost of change
  32. 32. Estimation
  33. 33. Refactoring
  34. 34. Improves software design
  35. 35. A very busy method
  36. 36. public void addLineToFile(String lineToAdd, String sourceFile, String destFile) { List<String> sourceLines = getLines(sourceFile); List<String> newLines = addLine(lineToAdd, sourceLines); List<String> sortedLines = sortLines(newLines); writeLines(sortedLines, destFile); }
  37. 37. private List<String> addLine(String line, List<String> lines) { List<String> newLines = new ArrayList<String>(lines); newLines.add(line); return newLines; }
  38. 38. private List<String> sortLines(List<String> lines) { List<String> newLines = new ArrayList<String>(lines); Collections.sort(newLines); return newLines; }
  39. 39. Refactoring makes software easier to understand
  40. 40. Refactoring helps you program FASTER
  41. 41. Now that we have TDD and refactoring...
  42. 42. Continuous Integration
  43. 43. Single source repository
  44. 44. Automate the build
  45. 45. Make your build self-testing
  46. 46. Everyone commits to mainline (several times) every day
  47. 47. Every commit builds the mainline
  48. 48. Don’t check in on a broken build
  49. 49. Keep the build fast
  50. 50. Keep the build green
  51. 51. Wait for green build before moving on
  52. 52. Make build status visible
  53. 53. Deployment pipeline
  54. 54. Automate deployments
  55. 55. Infrastructure as code
  56. 56. Propagate each change through the pipeline
  57. 57. Stop the line if any part fails
  58. 58. http://www.snap-ci.com
  59. 59. Backing out changes
  60. 60. Feature toggle
  61. 61. Respond to changes
  62. 62. Unattainable goals
  63. 63. Continuous Improvements
  64. 64. Questions?

×