I’ve started adopting what I could call “agile” way of developing software only in 2007-2008. Since then I’ve become a Certified Scrum Master and trying to adopt as much techniques and methodologies to make the process of developing software in my team as much as possible. I am sure that I am still far from saying that it is perfect and there is always room for improvement :). Agile for me is definitively the way to go, but be aware, it is not a silver bullet.
Personally I would divide Agile into two distinct parts
- Agile Project Management and
- Agile approach to Coding
both concepts are interlaced and the best option is to adopt both at the same time.
Agile Project Management
The following is a citation taken from Wikipedia and describes what is the Agile Project Management.
“Agile project management is an iterative method of determining requirements for engineering and information technology development projects in a highly flexible and interactive manner, for example agile software development. It requires empowered individuals from the relevant business, with supplier and customer input. … Agile techniques are best used in small-scale projects or on elements of a wider programme of work, or on projects that are too complex for the customer to understand and specify before testing prototypes.”
In other words, what we call Agile, is a great way of managing the software development in a process that is highly flexible and that requires empowered individuals that would drive this process successfully. In my experience I could see that Agile won’t work properly if one of the following haven’t been met:
- True collaboration between all the stakeholders (users, developers, testers, managers, etc..)
- Common agreement on the process and common goals
- Willingness for knowledge sharing
Project Management Methodologies/Frameworks
There are different methodologies when it comes to the agile process definition itself. Each of the methodologies, or frameworks is pretty much similar as it requires the iterative process, but on the other side each methodology has its own particularities.
Examples of agile software project management frameworks (or methodologies):
- Scrum is an iterative and incremental agile software development method for managing software projects and product or application development
- Extreme Programming (XP) is a software development methodology which is intended to improve software quality and responsiveness to changing customer requirements. As a type of agile software development, it advocates frequent “releases” in short development cycles (timeboxing), which is intended to improve productivity and introduce checkpoints where new customer requirements can be adopted.
- Kanban is a method for developing software products and processes with an emphasis on just-in-time delivery while not overloading the software developers. It emphasizes that developers pull work from a queue, and the process, from definition of a task to its delivery to the customer, is displayed for participants to see
Agile coding techniques
As mentioned earlier, together with the Agile Project Management, there is a part of agile that is connected to the code development techniques
“Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily – leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly. This article is a quick overview of Continuous Integration summarizing the technique and its current usage” — Source: Martin Fowler’s article.
“In computer programming, unit testing is a method by which individual units of source code, sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures, are tested to determine if they are fit for use. Intuitively, one can view a unit as the smallest testable part of an application.” — Source: Wikipedia
Previously I have written some posts about Unit Testing or related, so you may check it here:
Test Driven Development
“Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test and finally refactors the new code to acceptable standards. Kent Beck, who is credited with having developed or ‘rediscovered’ the technique, stated in 2003 that TDD encourages simple designs and inspires confidence.” — Source: Wikipedia
“Pair programming is an agile software development technique in which two programmers work together at one workstation. One, the driver, writes code while the other, the observer (or navigator), reviews each line of code as it is typed in. The two programmers switch roles frequently.” — Source: Wikipedia
“In software engineering, a design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. A design pattern is not a finished design that can be transformed directly into code. It is a description or template for how to solve a problem that can be used in many different situations. Patterns are formalized best practices that the programmer must implement themselves in the application. Object-oriented design patterns typically show relationships and interactions between classes or objects, without specifying the final application classes or objects that are involved. Many patterns imply object-orientation or more generally mutable state, and so may not be as applicable in functional programming languages, in which data is immutable or treated as such.” — Source: Wikipedia
“Domain-driven design (DDD) is an approach to developing software for complex needs by deeply connecting the implementation to an evolving model of the core business concepts. The premise of domain-driven design is the following:
– Placing the project’s primary focus on the core domain and domain logic
– Basing complex designs on a model
Initiating a creative collaboration between technical and domain experts to iteratively cut ever closer to the conceptual heart of the problem.
Domain-driven design is not a technology or a methodology. DDD provides a structure of practices and terminology for making design decisions that focus and accelerate software projects dealing with complicated domains.” — Source: Wikipedia
“Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure.” — MartinFowler in Refactoring – Improving The Design Of Existing Code
If you are looking for some code refactoring software I have listed some of them in this blog post: List of Visual Studio Code Refactoring tools. On the other hand you may have more info about Refactoring with Composed Method pattern.
A fantastic article that explains code refactoring could be found here: http://c2.com/cgi/wiki?WhatIsRefactoring
In one of my previous posts I have written about Top 10 books every microsoft software developer should have where a lot of concepts here mentioned (if not all of them) are discussed in depth.
References and resources.