SlideShare une entreprise Scribd logo
1  sur  32
A Tale of Two
Apps
WHY DEVELOPMENT PRACTICES MATTER
1
Who Am I?
 Chris Tankersley
 Been Doing PHP for 9+ Years
 Lots of projects no one uses, and
a few that some do:
 https://github.com/dragonmant
ank
 Worked in insurance for 4.5 years
 I know RPG!
2
What did we need to do?
“Build an app for agents to quote and
issues new policies online, print ID
cards, and policy documents, and all the
fun stuff associated with that.”
3
* „Fun Stuff‟ was subjective
We had this… kinda
 Backend iSeries vendor supplied a „solution‟ for
our Personal Auto policies
 Only worked with Personal Auto
 After many years, support was dropped
4
What did we have? 5
We needed a solution
 We needed something that worked with our
existing backend, which had all of our raters and
business logic. We didn‟t want to switch
processing systems.
 Turns out we had two things – a web app and a
“RESTful” interface to the iSeries. The interface
used ACORD XML, which is a standard XML
schema. We could replace the web app with a
new one that understood ACORD!
6
What we decided to do
 Build one!
7
What we decided to do
 Build one!
 Purchase one!
8
We went with a vendor with a pedigree in insurance. They had a
Tomcat+Postgres solution, and since the magical black box talked
XML, they were confident they could swap out their rating system with
theirs. We‟d be done in 6 months.
Their Solution 9
More on them later though
We finally build our own!
We needed to bring our commercial business online to
help sell it. We had the technology (but not $6 million)
10
Our Solution 11
Why Two Solutions?
Notice how I said that the Tomcat/Postgres app would
be done in 6 months?
12
Yeah…
The app took much more time and budget than originally thought.
How did we do a PHP app in 7 months and much less money?
What was different?
 Proper specifications
 Development Lifecycle
 Understanding your stack
 Testing and QA
 Deployment Practices
13
Proper Specifications
 Functional and technical specifications are a
must. If you don‟t know what you are
building, how will you know how to build it? Or
when it‟s finished?
14
There is a difference
between this
15
And This 16
Development Lifecycle
 Waterfall
 Spiral/Prototype
 Agile (SCRUM, Kanban, etc)
17
They used Waterfall 18
We used Agile-ish-stuff 19
Understanding Your Stack
 If you don‟t know how your stack works, it makes it
really hard to figure out problems with things go
belly up.
20
Their Stack 21
Our Stack 22
Testing and QA
 You do test your code, right?
 How do you prove your code works?
 Can anyone run your tests or are they only
accessible to certain people?
23
They used only “HP
Functional Testing”
 As the name implies, it just did functional testing.
In the end, it was a very expensive Selenium.
 While they wrote in Java, they did not use (nor
understand why anyone would use) JUnit or other
unit testing frameworks.
 Because it was cost prohibitive, we could not run
tests.
24
We used standard PHP
tools
 PHPUnit
 We settled on PHPUnit for unit testing. It was/is
widely documented and we even managed to get
it to run on the iSeries.
 Selenium
 We manually ran these tests as we hadn‟t worked
out how to get it to run headless. Not a big deal
because we had to support IE, which only
supported manually running it anyway.
 phpUnderControl
 This ran PHPUnit automatically for us and built our
documentation
25
Unit Testing Works!
 Using unit testing and continuous integration, we
were able to detect test failures right away. Being
able to run PHPUnit on the iSeries helped us
identify and fix platform-specific bugs. Since
developers could run PHPUnit and Selenium
locally, we had less regressions.
 Since HP Functional Testing was expensive, only
the vendor could run the functional tests so
developers (even at the vendor) never knew
when the tests broke. Since it was only
functional, it didn‟t find subtle bugs in the code.
26
Deployment Practices
 Continuous Integration Tools (Jenkins, xinc/phing)
 Build file with manual deployment
 Custom deployment script
 Hope and a Prayer
27
We went the custom route
1. Tagged trunk in SVN
2. Script checked out the build, SCP‟d it to the
iSeries
3. MySQL Updates were applied by the script
This worked pretty well considering we could tag a
revision in SVN that passed tests, which we could
check via phpUnderControl.
28
They went with the last
option
1. The code on the dev server was packaged as a
WAR file
2. The SQL needed for the upgrade was put into a file
1. Sometimes multiple SQL files that would need to be run
in order
3. A zip file was created from this
4. It was e-mailed to us
5. We put the WAR file into place and ran the SQL files
manually against Postgres
6. Tomcat was restarted
tl;dr: Stuff blew up regularly
29
Putting it all together
 Auto Quoter
 Originally 6 months to production and small price
tag. Ended up being way over budget and way
over time. When I left, it had just barely gotten to
where v1 had originally been. This was due to poor
specs, poor QA, and poor development practices.
 Artisan Quoter
 We ended up 1 month over time, but much
cheaper (even when payroll was considered). It ran
on existing hardware, so the software cost only
ended up being Zend Server.
30
Questions? 31
Thank You!
 chris@ctankersley.com
 @dragonmantank
 https://joind.in/9070
32

Contenu connexe

Tendances

Essentielle værktøjer for det agile team
Essentielle værktøjer for det agile teamEssentielle værktøjer for det agile team
Essentielle værktøjer for det agile team
BestBrains
 
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
Puppet
 

Tendances (20)

DevOpsGuys Performance Testing with APM Tools workshop
DevOpsGuys Performance Testing with APM Tools workshopDevOpsGuys Performance Testing with APM Tools workshop
DevOpsGuys Performance Testing with APM Tools workshop
 
Lets cook cucumber !!
Lets cook cucumber !!Lets cook cucumber !!
Lets cook cucumber !!
 
Continuous delivery - tools and techniques
Continuous delivery - tools and techniquesContinuous delivery - tools and techniques
Continuous delivery - tools and techniques
 
2012 - A Release Odyssey
2012 - A Release Odyssey2012 - A Release Odyssey
2012 - A Release Odyssey
 
Devopsdays.pl 2015 krzysztof_debski (2)
Devopsdays.pl 2015 krzysztof_debski (2)Devopsdays.pl 2015 krzysztof_debski (2)
Devopsdays.pl 2015 krzysztof_debski (2)
 
Come si applica l'OCP
Come si applica l'OCPCome si applica l'OCP
Come si applica l'OCP
 
London Atlassian User Group - February 2014
London Atlassian User Group - February 2014London Atlassian User Group - February 2014
London Atlassian User Group - February 2014
 
Closer To the Metal - Why and How We Use XCTest and Espresso by Mario Negro P...
Closer To the Metal - Why and How We Use XCTest and Espresso by Mario Negro P...Closer To the Metal - Why and How We Use XCTest and Espresso by Mario Negro P...
Closer To the Metal - Why and How We Use XCTest and Espresso by Mario Negro P...
 
Know the flow to master agility
Know the flow to master agilityKnow the flow to master agility
Know the flow to master agility
 
Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)Test Driven Development on Android (Kotlin Kenya)
Test Driven Development on Android (Kotlin Kenya)
 
Essentielle værktøjer for det agile team
Essentielle værktøjer for det agile teamEssentielle værktøjer for det agile team
Essentielle værktøjer for det agile team
 
Ntd2015_pt_kanban_ppt
Ntd2015_pt_kanban_pptNtd2015_pt_kanban_ppt
Ntd2015_pt_kanban_ppt
 
10/29 Austin Ansible MeetUp - AnsibleFest Talk & Extending Ansible
10/29 Austin Ansible MeetUp - AnsibleFest Talk & Extending Ansible10/29 Austin Ansible MeetUp - AnsibleFest Talk & Extending Ansible
10/29 Austin Ansible MeetUp - AnsibleFest Talk & Extending Ansible
 
Step away from that knife!
Step away from that knife!Step away from that knife!
Step away from that knife!
 
DevOPs Transformation Workshop
DevOPs Transformation WorkshopDevOPs Transformation Workshop
DevOPs Transformation Workshop
 
Running Automated Acceptance Tests On Rancher
Running Automated Acceptance Tests On RancherRunning Automated Acceptance Tests On Rancher
Running Automated Acceptance Tests On Rancher
 
DevOps for AI Apps
DevOps for AI AppsDevOps for AI Apps
DevOps for AI Apps
 
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
PuppetConf 2017: Test Driving Your Infrastructure with Jesus Alvarez & Jesse ...
 
An almost complete continuous delivery pipeline including configuration manag...
An almost complete continuous delivery pipeline including configuration manag...An almost complete continuous delivery pipeline including configuration manag...
An almost complete continuous delivery pipeline including configuration manag...
 
React Native: Expectations vs Reality
React Native: Expectations vs RealityReact Native: Expectations vs Reality
React Native: Expectations vs Reality
 

Similaire à A Tale of Two Apps

How to be proud when you are done
How to be proud when you are doneHow to be proud when you are done
How to be proud when you are done
Aleksey Solntsev
 
Smart Mirror Summer Report
Smart Mirror Summer ReportSmart Mirror Summer Report
Smart Mirror Summer Report
Jabari Barton
 

Similaire à A Tale of Two Apps (20)

Ambassador: Building a Control Plane for Envoy
Ambassador: Building a Control Plane for Envoy Ambassador: Building a Control Plane for Envoy
Ambassador: Building a Control Plane for Envoy
 
Build an Infra Product with AWS Fargate
Build an Infra Product with AWS FargateBuild an Infra Product with AWS Fargate
Build an Infra Product with AWS Fargate
 
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
End to end testing Single Page Apps & APIs with Cucumber.js and Puppeteer (Em...
 
Subverting the monolith!
Subverting the monolith!Subverting the monolith!
Subverting the monolith!
 
How to be proud when you are done
How to be proud when you are doneHow to be proud when you are done
How to be proud when you are done
 
How to be proud when you are done
How to be proud when you are doneHow to be proud when you are done
How to be proud when you are done
 
E2E testing Single Page Apps and APIs with Cucumber.js and Puppeteer
E2E testing Single Page Apps and APIs with Cucumber.js and PuppeteerE2E testing Single Page Apps and APIs with Cucumber.js and Puppeteer
E2E testing Single Page Apps and APIs with Cucumber.js and Puppeteer
 
Developer Week
Developer WeekDeveloper Week
Developer Week
 
The Development History of PVS-Studio for Linux
The Development History of PVS-Studio for LinuxThe Development History of PVS-Studio for Linux
The Development History of PVS-Studio for Linux
 
Pain Driven Development by Alexandr Sugak
Pain Driven Development by Alexandr SugakPain Driven Development by Alexandr Sugak
Pain Driven Development by Alexandr Sugak
 
CppCat, an Ambitious C++ Code Analyzer from Tula
CppCat, an Ambitious C++ Code Analyzer from TulaCppCat, an Ambitious C++ Code Analyzer from Tula
CppCat, an Ambitious C++ Code Analyzer from Tula
 
Smart Mirror Summer Report
Smart Mirror Summer ReportSmart Mirror Summer Report
Smart Mirror Summer Report
 
A Tale of Two Workflows - ChefConf 2014
A Tale of Two Workflows - ChefConf 2014A Tale of Two Workflows - ChefConf 2014
A Tale of Two Workflows - ChefConf 2014
 
PVS-Studio confesses its love for Linux
PVS-Studio confesses its love for LinuxPVS-Studio confesses its love for Linux
PVS-Studio confesses its love for Linux
 
Care and feeding notes
Care and feeding notesCare and feeding notes
Care and feeding notes
 
System design for Web Application
System design for Web ApplicationSystem design for Web Application
System design for Web Application
 
Ransack, an Application Built on Ansible's API for Rackspace -- AnsibleFest N...
Ransack, an Application Built on Ansible's API for Rackspace -- AnsibleFest N...Ransack, an Application Built on Ansible's API for Rackspace -- AnsibleFest N...
Ransack, an Application Built on Ansible's API for Rackspace -- AnsibleFest N...
 
SpringOne 2016 in a nutshell
SpringOne 2016 in a nutshellSpringOne 2016 in a nutshell
SpringOne 2016 in a nutshell
 
DevOps on AWS: Deep Dive on Continuous Delivery and the AWS Developer Tools
DevOps on AWS: Deep Dive on Continuous Delivery and the AWS Developer ToolsDevOps on AWS: Deep Dive on Continuous Delivery and the AWS Developer Tools
DevOps on AWS: Deep Dive on Continuous Delivery and the AWS Developer Tools
 
AppSec Pipelines and Event based Security
AppSec Pipelines and Event based SecurityAppSec Pipelines and Event based Security
AppSec Pipelines and Event based Security
 

Plus de Chris Tankersley

Plus de Chris Tankersley (20)

Docker is Dead: Long Live Containers
Docker is Dead: Long Live ContainersDocker is Dead: Long Live Containers
Docker is Dead: Long Live Containers
 
Bend time to your will with git
Bend time to your will with gitBend time to your will with git
Bend time to your will with git
 
Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)Using PHP Functions! (Not those functions, Google Cloud Functions)
Using PHP Functions! (Not those functions, Google Cloud Functions)
 
Dead Simple APIs with OpenAPI
Dead Simple APIs with OpenAPIDead Simple APIs with OpenAPI
Dead Simple APIs with OpenAPI
 
Killer Docker Workflows for Development
Killer Docker Workflows for DevelopmentKiller Docker Workflows for Development
Killer Docker Workflows for Development
 
You Got Async in my PHP!
You Got Async in my PHP!You Got Async in my PHP!
You Got Async in my PHP!
 
Docker for Developers - PHP Detroit 2018
Docker for Developers - PHP Detroit 2018Docker for Developers - PHP Detroit 2018
Docker for Developers - PHP Detroit 2018
 
Docker for Developers
Docker for DevelopersDocker for Developers
Docker for Developers
 
They are Watching You
They are Watching YouThey are Watching You
They are Watching You
 
BASHing at the CLI - Midwest PHP 2018
BASHing at the CLI - Midwest PHP 2018BASHing at the CLI - Midwest PHP 2018
BASHing at the CLI - Midwest PHP 2018
 
You Were Lied To About Optimization
You Were Lied To About OptimizationYou Were Lied To About Optimization
You Were Lied To About Optimization
 
Docker for PHP Developers - php[world] 2017
Docker for PHP Developers - php[world] 2017Docker for PHP Developers - php[world] 2017
Docker for PHP Developers - php[world] 2017
 
Docker for PHP Developers - Madison PHP 2017
Docker for PHP Developers - Madison PHP 2017Docker for PHP Developers - Madison PHP 2017
Docker for PHP Developers - Madison PHP 2017
 
Docker for Developers - php[tek] 2017
Docker for Developers - php[tek] 2017Docker for Developers - php[tek] 2017
Docker for Developers - php[tek] 2017
 
Why Docker? Dayton PHP, April 2017
Why Docker? Dayton PHP, April 2017Why Docker? Dayton PHP, April 2017
Why Docker? Dayton PHP, April 2017
 
OOP Is More Then Cars and Dogs - Midwest PHP 2017
OOP Is More Then Cars and Dogs - Midwest PHP 2017OOP Is More Then Cars and Dogs - Midwest PHP 2017
OOP Is More Then Cars and Dogs - Midwest PHP 2017
 
From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017From Docker to Production - SunshinePHP 2017
From Docker to Production - SunshinePHP 2017
 
Docker for Developers - Sunshine PHP
Docker for Developers - Sunshine PHPDocker for Developers - Sunshine PHP
Docker for Developers - Sunshine PHP
 
Coming to Terms with OOP In Drupal - php[world] 2016
Coming to Terms with OOP In Drupal - php[world] 2016Coming to Terms with OOP In Drupal - php[world] 2016
Coming to Terms with OOP In Drupal - php[world] 2016
 
How We Got Here: A Brief History of Open Source
How We Got Here: A Brief History of Open SourceHow We Got Here: A Brief History of Open Source
How We Got Here: A Brief History of Open Source
 

Dernier

Dernier (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 

A Tale of Two Apps

  • 1. A Tale of Two Apps WHY DEVELOPMENT PRACTICES MATTER 1
  • 2. Who Am I?  Chris Tankersley  Been Doing PHP for 9+ Years  Lots of projects no one uses, and a few that some do:  https://github.com/dragonmant ank  Worked in insurance for 4.5 years  I know RPG! 2
  • 3. What did we need to do? “Build an app for agents to quote and issues new policies online, print ID cards, and policy documents, and all the fun stuff associated with that.” 3 * „Fun Stuff‟ was subjective
  • 4. We had this… kinda  Backend iSeries vendor supplied a „solution‟ for our Personal Auto policies  Only worked with Personal Auto  After many years, support was dropped 4
  • 5. What did we have? 5
  • 6. We needed a solution  We needed something that worked with our existing backend, which had all of our raters and business logic. We didn‟t want to switch processing systems.  Turns out we had two things – a web app and a “RESTful” interface to the iSeries. The interface used ACORD XML, which is a standard XML schema. We could replace the web app with a new one that understood ACORD! 6
  • 7. What we decided to do  Build one! 7
  • 8. What we decided to do  Build one!  Purchase one! 8 We went with a vendor with a pedigree in insurance. They had a Tomcat+Postgres solution, and since the magical black box talked XML, they were confident they could swap out their rating system with theirs. We‟d be done in 6 months.
  • 9. Their Solution 9 More on them later though
  • 10. We finally build our own! We needed to bring our commercial business online to help sell it. We had the technology (but not $6 million) 10
  • 12. Why Two Solutions? Notice how I said that the Tomcat/Postgres app would be done in 6 months? 12 Yeah… The app took much more time and budget than originally thought. How did we do a PHP app in 7 months and much less money?
  • 13. What was different?  Proper specifications  Development Lifecycle  Understanding your stack  Testing and QA  Deployment Practices 13
  • 14. Proper Specifications  Functional and technical specifications are a must. If you don‟t know what you are building, how will you know how to build it? Or when it‟s finished? 14
  • 15. There is a difference between this 15
  • 17. Development Lifecycle  Waterfall  Spiral/Prototype  Agile (SCRUM, Kanban, etc) 17
  • 20. Understanding Your Stack  If you don‟t know how your stack works, it makes it really hard to figure out problems with things go belly up. 20
  • 23. Testing and QA  You do test your code, right?  How do you prove your code works?  Can anyone run your tests or are they only accessible to certain people? 23
  • 24. They used only “HP Functional Testing”  As the name implies, it just did functional testing. In the end, it was a very expensive Selenium.  While they wrote in Java, they did not use (nor understand why anyone would use) JUnit or other unit testing frameworks.  Because it was cost prohibitive, we could not run tests. 24
  • 25. We used standard PHP tools  PHPUnit  We settled on PHPUnit for unit testing. It was/is widely documented and we even managed to get it to run on the iSeries.  Selenium  We manually ran these tests as we hadn‟t worked out how to get it to run headless. Not a big deal because we had to support IE, which only supported manually running it anyway.  phpUnderControl  This ran PHPUnit automatically for us and built our documentation 25
  • 26. Unit Testing Works!  Using unit testing and continuous integration, we were able to detect test failures right away. Being able to run PHPUnit on the iSeries helped us identify and fix platform-specific bugs. Since developers could run PHPUnit and Selenium locally, we had less regressions.  Since HP Functional Testing was expensive, only the vendor could run the functional tests so developers (even at the vendor) never knew when the tests broke. Since it was only functional, it didn‟t find subtle bugs in the code. 26
  • 27. Deployment Practices  Continuous Integration Tools (Jenkins, xinc/phing)  Build file with manual deployment  Custom deployment script  Hope and a Prayer 27
  • 28. We went the custom route 1. Tagged trunk in SVN 2. Script checked out the build, SCP‟d it to the iSeries 3. MySQL Updates were applied by the script This worked pretty well considering we could tag a revision in SVN that passed tests, which we could check via phpUnderControl. 28
  • 29. They went with the last option 1. The code on the dev server was packaged as a WAR file 2. The SQL needed for the upgrade was put into a file 1. Sometimes multiple SQL files that would need to be run in order 3. A zip file was created from this 4. It was e-mailed to us 5. We put the WAR file into place and ran the SQL files manually against Postgres 6. Tomcat was restarted tl;dr: Stuff blew up regularly 29
  • 30. Putting it all together  Auto Quoter  Originally 6 months to production and small price tag. Ended up being way over budget and way over time. When I left, it had just barely gotten to where v1 had originally been. This was due to poor specs, poor QA, and poor development practices.  Artisan Quoter  We ended up 1 month over time, but much cheaper (even when payroll was considered). It ran on existing hardware, so the software cost only ended up being Zend Server. 30
  • 32. Thank You!  chris@ctankersley.com  @dragonmantank  https://joind.in/9070 32