# Agile practices
{id: agile}

## What problems Agile tries to solve?
{id: what-problems-does-agile-solve}

* Failed projects
* Over budget, over time projects
* We don't know the future and it changes anyway
* Cost of change increases with time
* Fear of change in the code
* Employee satisfaction



## What is Agile?
{id: what-is-agile}

* The Agile Manifesto?
* Better (Software) development practice?
* A buzzword?



## Agile is a question
{id: agile-is-a-question}

* Why?
* Why do we do this?
* Why do we do this way?
* Is it beacuse the previous programmer did it this way?
* Is this working for us?
* Do we provide good value to our customers?
* Can we do better?



## The Agile Manifesto
{id: the-agile-manifesto}

We are uncovering better ways of developing
software by doing it and helping others do it.
Through this work we have come to value:



* 4 values
* 12 principles



## 4 values of the Agile Manifesto
{id: 4-values-of-the-agile-manifesto}

* **Individuals and interactions** over processes and tools
* **Working software** over comprehensive documentation
* **Customer collaboration** over contract negotiation
* **Responding to change** over following a plan



## 12 principles of the Agile Manifesto
{id: 12-princiles-of-the-agile-manifesto}

* Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
* Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
* Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
* Business people and developers must work together daily throughout the project.
* Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
* The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.
* Working software is the primary measure of progress.
* Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.
* Continuous attention to technical excellence and good design enhances agility.
* Simplicity--the art of maximizing the amount of work not done--is essential.
* The best architectures, requirements, and designs emerge from self-organizing teams.
* At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.



## Agile methodologies
{id: agile-methodologies}
{i: Scrum}

* Scrum
* XP - Extreme Programming
* Kanban



## Agile practices
{id: agile-practices}

* Estimations (flexible, changeable)
* Short iterations of development
* Autonomous (self organizing) teams
* Retrospective
* Continuous Improvement
* Continuous Learning
* Regular Feedback
* Communication (between team members, with clients, among teams)
* Trust - managers trust team members, team members trust each other and the manager
* Transparncy - visibility of decisions and statuses



## Engineering practices
{id: engineering-practices}

* Frequent commits to VCS
* Branching strategy that fits the process
* Test automation
* Continuous Integration
* Continuous Deployment
* TDD - Test Driven Development (or Test First programming)
* Pair programming
* [Mob programming](https://leanpub.com/mobprogramming)
* Refactoring (reducing technical debt)



## Feedback
{id: feedback}

* Automated tests, CI (less than 10 min build)
* From the Product owner (the representative of the client)
* From the clients
* Continuous Deployment, deployment circles, feature switches, A/B testing, easy rollback



## TDD - Test Driven Development
{id: test-driven-development}

* Write tests first that will fail
* Then imlement code


Benefits


* Avoid Scope Creep
* Build trust in team members
* Reduce coupling of code (avoide spaghetti code)



## Scrum
{id: scrum}


## XP - Extreme Programming
{id: extreme-programming}


## Open Questions
{id: open-questions}

* How to introduce Agile and better engineering practices in an organization?



## Resources
{id: resource}

* [Agile Software Development](https://www.coursera.org/learn/agile-software-development/) Coursera video course from IUniversity of Michigen
* [AB Testing podcast](http://www.angryweasel.com/ABTesting/)
* [Agile for Humans podcast](https://ryanripley.com/agile-for-humans/)
* [Agile in 3 minutes podcast](https://agilein3minut.es/)
* [Differences Between Scrum and Extreme Programming](https://www.mountaingoatsoftware.com/blog/differences-between-scrum-and-extreme-programming)
* [Manifesto for Agile Software Development ](http://agilemanifesto.org/)
* [Article about the Agile Manifesto ](http://www.drdobbs.com/open-source/the-agile-manifesto/184414755) by Martin Fowler and Jim Highsmith
* [Switch: How to Change Things When Change Is Hard](https://www.amazon.com/Switch-Change-Things-When-Hard/dp/0385528752?tag=szabgab-20) by Chip Heath and Dan Heath
* [Extreme Programming Explained: Embrace Change](https://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658?tag=szabgab-20) by Kent Beck and Cynthia Andres





