Seasoned project managers will tell that delivery of software is result of many trade offs. The main trade off is between Time (when project will finish) and Scope (how much will be done). This post will show that using right tools you could gain improvement for both variables.
While it is possible to create orderly step-by-step process for increasing productivity of software teams, it will never be ideal – too many variations and situations will hinder it usefulness. I believe in set of useful tool that could be combined to craft custom optimal solution.
There are several strategies that lead to increase in productivity – how many units of scope software team can produce within fixed time.
- Increase Capacity (Capacity) - increase capacity by hiring more people or increasing work hours
- productivity is increased as result of more resources and hours available
- Improve Value Stream (Value) - increase added business value on each step and reduce waste and overhead
- productivity is increased as result of optimized delivery of value
- Adaptat to Reality (Adaptation)- learn from practice and mistakes, validation of ideas by reality, adapt to changing situation
- productivity increased as result of early corrections and improving how things are done
- Empower Individuals (Individuals) - boost people knowledge, skills, morale and focus
- productivity is increased as result of higher individual performance and motivation
- Enhance Communication (Communication) - improve communication and mutual understanding inside and outside of the team
- productivity is increased as result of availability of necessary information, clarity of what should be done and exchange of ideas for implementation
- Organize Better (Organization) – structure team and assign roles for better coordination and decision making
- productivity is increased as result of better decisions and focus on important areas
- Expand Expertise (Expertise) - increase range of skills and services offered by team
- productivity is increased as result of better execution of necessary project activities
- Scale Externally (Externality) – outsourcing and involvement of external communities
- productivity is increased as result of involvement of more people outside of team
- Tame Complexity (Design) – manage complexity and provide simple and well designed solutions
- productivity is increased as result of reducing complexity burden on software development
- Preserve Quality (Quality) – use defensive tactics to ensure high quality
- productivity is increased as result of preventing system flaws and reduced effort to fix bugs
- People-oriented – people are the creators of software and have major effect on output
- Process-oriented – the way how people work has significant impact on outcome
- Development-oriented – development practices and approach to the system implementation matters a lot
Strategies: Capacity , Expertise , Communication , Organization
New people increase volume of possible work within the same time and new expertise increases range and quality of tasks. However, the increase in output is not linear and quickly diminishes, because more people cause communication and coordination overhead. In addition, compensation increase make this tool expensive and less attractive.
Happy motivated people are more productive, focused and concerned about quality and end result. While there is no common receipt for each individual, I believe there are some strong motivators: interesting and meaningful work, fair compensation, control over own tasks and outcomes, ability to learn and professionally grow, comfortable workplace and adequate tools, empathetical and caring management and so on.
Daniel H. Pink in Drive thinks that people are motivated by three elements:
- Autonomy: People want to have control over their work.
- Mastery: People want to get better at what they do.
- Purpose: People want to be part of something that is bigger than they are.
- Professional Growth
Tips: Motivate individually, but set also group targets to encourage cooperation
3. Professional Growth
Strategies: Individuals , Expertise , Quality , Adaptation
Software professionals should learn a lot to become productive and proficient. People learn in several ways and learning from mistakes is the most memorable, but expensive way. Learning by self-study, formal training and coaching by experienced colleagues are more effective ways. Encourage and direct learning to grow high performance experts and team. And certainly, continue learning as much as possible from mistakes and practice.
Nobody recommends involuntary overtime for a long time as benefits will disappear quickly when a stressed team lowers quality and starts breaking apart.
5. Right leaders
Good leaders jell teams, align people with goals, boost energy and remove barriers. Leaders vary from commanders to visionaries and each style has merits under specific circumstances. Right leaders are essential for the project success.
Tips: Adjust leadership style to situation
Strategies: Expertise , Organization
A software team requires range of skills and involved in different activities to achieve end goal – implemented software system for customer needs. Beyond software implementation the team deals with a customer domain, company vision, market demands, technologies, operation environments and other project aspects. The team is involved in research, analysis, coordination, design, architecture, usability, testing, deployment, hosting and other activities. Therefore team players should be able to play different roles and have expertise to cover various aspects to ensure good end results.
Strategies: Capacity , Expertise , Externality , Organization , Communication
Tasks and challenges should match skills and experience of team players. It doesn’t make sense for backend developers to convert Photoshop files into html or conduct marketing research and focus groups. If team cannot afford to hire a permanent specialist, they should try to find professional mercenaries who will do work faster on higher quality level.
Flow (or Immersion) is a state of mental focus so intense that awareness of the real world is lost, generally resulting in a feeling of joy and satisfaction. When learning and tasks are too easy, people become bored. If they are too complex they become stressed and frustrated. Flow happens when perception and understanding are challenged near capacity without being exceeded.
- ability to focus
- clear goals
- immediate feedback
- control over actions, activities and the environment
Flow: The Psychology of Optimal Experience, Mihaly Csikszentmihalyi
Few people will be always disciplined no matter what and few will always violate rules. Majority are context sensitive – relax than discipline is low and work hard when discipline is enforced. Build a minimal set of rules approved by majority and stick to these rules.
10. Increase feedback and early practical use of ideas
Reality is complex, fluid and unclear. Many assumptions and plans quickly go bust. The process that has built-in mechanism for signaling problems and self-correction is the most effective. Rapid feedback is the core part of such process.
Tips: Iterative development is one of the best examples of the process that relies heavily on feedback.
11. Build alignment
People jump significant gaps to understand each other – sometimes without much success. Clear vision, smart priorities and honest evaluation allow team players moving in unison and enforce each other. Good understanding focus people on right goals and reduce wasteful activities. Communication and trust are important for alignment.
- vision – project direction and top-level goals
- interests – mix of personal, customer and companies interests (sometimes conflicting)
- understanding – clarity about what others mean
- trust – confidence in other people intentions and promises
12. Integrated decision making
Strategies: Communication , Quality , Adaptation
In addition, involvement in decision making empower people and give them sense of control.
- underlying causes are understood
- decisions are early validated on practice
- diverse group of people is involved
- goals and background for decision are clearly communicated (preferably on one sheet of paper)
Strategies: Quality , Capacity
Tips: Productivity could decrease if QA becoming ceremony and impede efficiency and speed of software team. Automation of routine testing could help.
Strategies: Adaptation , Quality , Value
As project progresses you will find problems, wrong assumptions and challenges. You will have better experience and understanding. Even brightest ideas, best practices and excellent analysis and design could become outdated and ineffective. Continuously look for improvements, eliminate waste and bottlenecks.
Strategies: Individuals , Quality , Value
Highly productive team shouldn’t waste time on routine or non-core activities. Routine work should be automated and non-core work outsourced or covered by external components. The team should focus on high value-added distinctive work for business and application domain – this will bring maximum business results with minimal development effort.
- More integration – less innovation
- system thinking
- understanding what really matters and what are limitations
- broad vision and out-of-the box thinking
- knowledge of environment, context and system outside relations
- synthesis of concepts, information and experience
Strategies: Capacity , Expertise , Externality , Organization
Tips: Community groups could pursue own goals and sometimes are difficult to align.
17. Actively work with customer ideas
Strategies: Value , Communication
You can better understand and change scope of application if you actively work with customers and become partners
- establish ubiquitous language – for better understanding of ideas and translation them into code
- tap into experience and get better insight for business domain and processes
- transform ideas – simplify and find better alternatives
- reducing scope
- simplifying solutions
- finding good enough alternatives
- Pareto Principle
- Ubiquitous Language
- Software Development is The Flow of Ideas. The Rest is Secondary
18. Select Right Process Flow
Strategies: Organization , Value
Select most optimal process for creating value.
- real-time flow – immediately push tasks for implementation (continuous development flow for highly organized co-located teams)
- pull systems (Kanban) – pull tasks when previous batch is finished and the team is ready to continue (iterations and backlog)
- schedule the workload (Heijunka) – create schedule for contributors with limited availability (outside consultants or shared specialists as designers)
Tips: Use different flows for distinct stages of software creation. For example, a team process can internally use real-time flow, with external teams – Kanban and with consultants Heijunka.
Strategies: Communication , Individuals , Adaptation , Value
Tips: Not every team can self-organize – it requires maturity. And loss of direct control could be a problem for management if a project departs from company strategy and desired parameters (as budget, standards, resources).
- What is The Best Leadership Style for The Software Team?
- Organizing Self-organizing Teams
- Agile Self-Organizing Teams
20. Increase reuse
Strategies: Design , Quality , Adaptation
Reuse code (components, libraries, solutions) as much as possible to speed up development and minimize code base. Reuse will bring familiar tested solutions and prevent frequent re-inventions of the wheel.
Tips: Design for reuse requires skills and time. It is easy to overly complicate the system by pursuing reusable code. Evolve and refactor code to achieve practically good reusability. Sometimes custome solutions are lighter and better suited for specific purposes than generic and reusable.
21. Generalize and Simplify
Strategies: Design , Quality , Communication
Complexity and poor understanding of the system is one of the worst problems in development. Design, code and concepts should be as simple as possible and clearly understood by the team. Simplicity and clarity are difficult to achieve and require special effort. It is much easier to produce convoluted over-engineered solution for complex problem (Ball of Mud) than simple and elegant solution.
- Follow Design Principles
- Domain Specific Design
Tips: Great design achieve simplicity by abstracting numerous details into simple concepts in process of solution evolution and learning from implementation.
- Big Ball of Mud, Brian Foote
- 11 Laws of The System Thinking in Software Development
- The Elements of Pragmatic Programming Style. Approach.
Strategies: Value , Design , Adaptation
- Should An Effective Developer Innovate, Imitate or just Integrate?
- Selecting The Best Strategy for Software Teams: Retreat, Evolution or Revolution
Strategies: Design , Communication
- Domain Driven Design, Eric Evans
- The Secret of Building Effective Software Systems
- The Elements of Pragmatic Programming Style. Composition.
Tips: Evolution main deficiency is slowness. Modern businesses often don’t have time for many improvement cycles – they want results now.
- What can Software Development learn from Biological Evolution?
- Ideas in Software Development: Revolution vs. Evolution. Part 1.
Strategies: Externality , Design
Tips: Once Open API is used it becomes liability – next design decisions will be affected by compatibility and legacy concerns.
Some of design principles
- You should be able to extend system without modifying it
- A class should have one, and only one, reason to change
- Depend on abstractions, not on concretions.
- Make fine grained interfaces that are client specific.
- Principles of OOD, Rob Martin
- The Elements of Pragmatic Programming Style. Approach.
- The Elements of Pragmatic Programming Style. Composition.
Strategies: Design , Expertise , Communication , Quality
Tips: Pair Programming is one the best ways to share code, ideas and best practices
Strategies: Individuals , Design , Value
Tips: Obsession with new technologies and race to use them is dangerous for project. Keep sanity until new technology is proven to be beneficial
Guide for increasing team productivity
|Is team clear about what should be done and have necessary information? Do people exchange ideas and help each other?||Enhance Communication||
|Does team know how they build value for customer and what is important for the project success? Do you have wasteful activities and overhead?||Improve Value Stream||
|Is team capable and experienced to implement the project?||Expand Expertise||
|Do team members effectively make decisions, assign and execute tasks and know their responsibilities?||Organize Better||
|Does team learn from practical results and mistakes? Do they consistently improve and correct how things are done?||Adapt to Reality||
|Are people motivated, productive and focused on outcomes?||Empower Individuals||
|Is system design sound and code easy to understand and maintain?||Design: Taming Complexity||
|Does system have high quality? Does team solves problem quickly and eliminate root causes?||Preserve Quality||
|Do you outsource non-core activities or involve external communities for improving or extending system?||Scale Externally||
|Did you try other strategies and still require more people?||Increase Capacity||