Software Creation Mystery - http://softwarecreation.org

The Toolkit for Increasing Productivity of Software Teams

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.

Strategies

There are several strategies that lead to increase in productivity – how many units of scope software team can produce within fixed time.

  1. Increase Capacity (Capacity) - increase capacity by hiring more people or increasing work hours
    • productivity is increased as result of more resources and hours available
  2. 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
  3. 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
  4. Empower Individuals (Individuals) - boost people knowledge, skills, morale and focus
    • productivity is increased as result of higher individual performance and motivation
  5. 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
  6. 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
  7. Expand Expertise (Expertise) - increase range of skills and services offered by team
    • productivity is increased as result of better execution of necessary project activities
  8. Scale Externally (Externality) – outsourcing and involvement of external communities
    • productivity is increased as result of involvement of more people outside of team
  9. Tame Complexity (Design) – manage complexity and provide simple and well designed solutions
    • productivity is increased as result of reducing complexity burden on software development
  10. 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
I separated tools into three categories:
  • 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

People-oriented tools

1. Hire New People

Strategies: Capacity good, Expertise good, Communication poor,  Organization poor

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.

Tips: Form few small teams to avoid large group overhead and scale by parallel development of system components and sync within team of teams. Also remember what Fred Brook said: Adding manpower to a late software project makes it later.

Resources:

2. Motivate

Strategies: Individuals good, Quality good

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.
See Also:
  • Professional Growth

Tips: Motivate individually, but set also group targets to encourage cooperation

Resources:

3. Professional Growth

Strategies: Individuals good, Expertise good, Quality good, Adaptation good

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. :)

Tips: Give opportunity for people to learn things that are beyond immediate needs of the project. Ability to learn and perspectives of growth are the strongest motivation factors for majority of software professionals.
Resources:

4. Overtime

Strategies: Capacity good, Individuals poor, Quality poor

Nobody recommends involuntary overtime for a long time as benefits will disappear quickly when a stressed team lowers quality and starts breaking apart.

Tips: Use overtime as a last resort for very short period.
Resources:

5. Right leaders

Strategies: Communication good, Organization good

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

Resources:
6. Specialize

Strategies: Expertise good, Organization good

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.

Tips: A high degree of specialization and separation of roles is inevitable for large teams and projects. However specialization can hurt the project as people forget about big picture, holistic solutions and instead focus on what is important for their local area. The team leaders should pay a lot of attention to Alignment to counter-attack sub-optimization and locally focused decisions.

Resources:

7. Outsource

Strategies: Capacity good, Expertise good, Externality good, Organization poor, Communication poor

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.

Tips: It is more difficult to align outsiders, who don’t have long-term commitment and interest in the end result. Communication and clear understanding are hard to achieve. Preferably, outsiders should be assigned well-defined tasks and sub-projects with clear outcome and frequent validation points.
Resources:
8. Induce Individual Flow
Strategies: Individuals good

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.

Tips: Flow conditions:
  • ability to focus
  • clear goals
  • immediate feedback
  • control over actions, activities and the environment
Resources:
9. Discipline
Strategies: Quality good, Organization good, Individuals poor

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.

Tips: Too much discipline could significantly deprive productivity, motivation and promote compliance instead of dedication.

Resources:

Process-oriented tools

10. Increase feedback and early practical use of ideas

Strategies: Adaptation good, Quality good, Value good

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.

Resources:

11. Build alignment

Strategies: Communication good, Organization good

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.

Tips: Take care about important alignment elements:
  • 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
Resources:

12. Integrated decision making

Strategies: Communication good, Quality good, Adaptation good

Quality of decisions cause projects failure or success. Good decisions are based on correct information, experience, goals, feedback, expert opinions and so on. Decisions could be centralized, consensus based or delegated to lower level. The project should have right mix of these styles, but most effective decisions are made by people who will implement them.
In addition, involvement in decision making empower people and give them sense of control.

See Also:

  • Self-organization
Tips: Decisions often won’t be perfect, but they more chances on success if
  • 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)

Resources:

13. Verification (QA) and Stopping to Fix Problems

Strategies: Quality good, Capacity poor

Good Quality Assurance makes projects solid and expose not only bugs, but serious system flaws – requirements discrepancies, problems with user experience and system inconsistencies. Low tolerance to quality problems should be a working principle. The team should have mandate to stop and fix root problems immediately and avoid patching that causes painful chronic problems.

Tips: Productivity could decrease if QA becoming ceremony and impede efficiency and speed of software team. Automation of routine testing could help.

Resources:
14. Continuous improvements (Kaizen)

Strategies: Adaptation good, Quality good, Value good

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.

See Also:
  • Feedback

Resources:

15. Focus on distinctive core

Strategies: Individuals good, Quality good, Value good

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.

See also :
  • Outsource
  • More integration – less innovation
Tips: Qualities that support focus on Core (high value-added distinctive work for business):
  • 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
Resources:

16. Engage developer and user communities

Strategies: Capacity good, Expertise good, Externality good, Organization poor

Experienced users can support beginners, and provide valuable advices on forums and social applications. They can be co-creators of content and even functionality. Passionate users can promote and market your software better than advertisers. They can generate great ideas and provide valuable feedback about your applications.
Go open-source if your problem is complex, large and interesting for other developers (and is not important part of your market advantage). Contribute to other projects and get value by using it for own needs (examples are Linux, Firefox)

Tips: Community groups could pursue own goals and sometimes are difficult to align.

17. Actively work with customer ideas

Strategies: Value good, Communication good

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
Tips: Productivity could be improved by
  • reducing scope
  • simplifying solutions
  • finding good enough alternatives
Resources:

18. Select Right Process Flow

Strategies: Organization good, Value good

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.

Resources:

19. Self-Organization
Strategies: Communication good, Individuals good, Adaptation good, Value good

Connect a software team to a customer and allow them to make most project decisions based on brainstorming, learning and changing situations.

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).

Resources:

Development-oriented tools

20. Increase reuse

Strategies: Design good, Quality good, Adaptation poor

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.

See Also:

  • Evolution

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.

Resources:

21. Generalize and Simplify
Strategies: Design good, Quality good, Communication good

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.

See Also:
  • Follow Design Principles
  • Evolution
  • Domain Specific Design

Tips: Great design achieve simplicity by abstracting numerous details into simple concepts in process of solution evolution and learning from implementation.

Resources:
22. More integration, less innovation

Strategies: Value good, Design good,  Adaptation poor

Innovation is expensive, uncertain and leave you with custom solutions on your own for support and future development. Piggyback on actively involving products, especially for non-core problems where good and proven solutions are available.Tips: Innovate to gain business advantage or solve serious technical challenges if you have an outstanding team and well-defined problems.

Resources:
23. Domain Specific Design

Strategies: Design good, Communication good

Keep technical ideas and code concepts close to the customer domain. You will achieve consistency, better sync between system and business concepts. You can easier translate customer ideas into the system and customers will understand your implementation better.Tips: Domain Driven Design is one the best approaches to achieve synthesis of technical and business ideas for complex domains.

Resources:

24. Evolution

Strategies: Adaptation good, Value good, Design good
Start with the simplest primitive solutions, enforce early use and seek for feedback. Adjust and improve design before continuing adding new features. Look for better ideas and abstractions. Delay fundamental design decisions until you are confident about system development direction and validated ideas on practice. Do not over-engineer and add unnecessary features.

Tips: Evolution main deficiency is slowness. Modern businesses often don’t have time for many improvement cycles – they want results now.

Resources:
25. Open architecture and API

Strategies: Externality good, Designgood

Open your solution for external developers who can extend and add more useful features. If you are lucky, you will get much more functionality than you can build internally while still controlling a core solution (iPhone is a perfect example).
Also Open API (convenient and supported by good documentation) give developers eligible ways to interact with you system without hacking or completely ignoring it.

Tips: Once Open API is used it becomes liability – next design decisions will be affected by compatibility and legacy concerns.
Resources:

26. Follow Design Principles

Strategies: Design good

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.
Famous design patterns are built around these principles. Follow sound design principles to build flexible, easy to expand system.

Resources:

27. Shared Code, Ideas and Standards

Strategies: Design good, Expertise good, Communication good, Quality good

The team should collectively own code and pursue consistency and use of best practices. Otherwise the system will become clash of isolated impassible code islands – scary for people who didn’t build them. Share code and learn from each other to build outstanding system with high quality and integrity of every component.

Tips: Pair Programming is one the best ways to share code, ideas and best practices
Resources:

28. Use Better technology and tools

Strategies: Individuals good, Design good, Value good

Technologies and outside world expectations are changing. Shift to better technology and tools allows effective solution of new challenges and meeting new needs without pushing people and old technologies to grinding.

Tips: Obsession with new technologies and race to use them is dangerous for project. Keep sanity until new technology is proven to be beneficial :)

Resources:

Guide for increasing team productivity

Consider strategies for implementation if you cannot give positive answer on the following questions
Questions Strategy Tools Side-effects
Is team clear about what should be done and have necessary information? Do people exchange ideas and help each other? Enhance Communication
  • Leaders
  • Alignment
  • Integrated Decisions
  • Customer Ideas
  • Self-Organization
  • Generalize and Simplify
  • Domain Specific Design
  • Shared Code and Standards
  • Hiring
  • Outsource
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
  • Feedback
  • Continuous Improvement
  • Focus on Core
  • Customer Ideas
  • Process Flow
  • Self-Organization
  • More Integration
Is team capable and experienced to implement the project? Expand Expertise
  • Hiring
  • Professional Growth
  • Specialize
  • Outsource
  • Engage communities
  • Shared Code and Standards
Do team members effectively make decisions, assign and execute tasks and know their responsibilities? Organize Better
  • Leaders
  • Alignment
  • Specialize
  • Process Flow
  • Discipline
  • Hiring
  • Outsource
  • Engage communities
Does team learn from practical results and mistakes? Do they consistently improve and correct how things are done? Adapt to Reality
  • Feedback
  • Continuous Improvement
  • Evolution
  • Integrated Decisions
  • Self-Organization
  • Professional Growth
  • Reuse
  • More Integration
Are people motivated, productive and focused on outcomes? Empower Individuals
  • Motivate
  • Professional Growth
  • Individual Flow
  • Focus on Core
  • Self-Organization
  • Overtime
  • Discipline
Is system design sound and code easy to understand and maintain? Design: Taming Complexity
  • Evolution
  • Reuse
  • Generalize and Simplify
  • Design Principles
  • Domain Specific Design
  • More Integration
  • Open API
  • Shared Code and Standards
Does system have high quality? Does team solves problem quickly and eliminate root causes? Preserve Quality
  • Quality Assurance
  • Feedback
  • Continuous Improvement
  • Professional Growth
  • Integrated Decisions
  • Focus on Core
  • Motivate
  • Discipline
  • Reuse
  • Generalize and Simplify
  • Shared Code and Standards
  • Overtime
Do you outsource non-core activities or involve external communities for improving or extending system? Scale Externally
  • Outsource
  • Engage communities
  • Open API
Did you try other strategies and still require more people? Increase Capacity
  • Hiring
  • Overtime
  • Outsource
  • Engage communities
  • Quality Assurance

Questions

Did I miss any tools? What tools do you know and successfully use?
AddThis Social Bookmark Button AddThis Feed Button


Comments

this article is quite big for my head to digest, nevertheless i can try to give an answer to your question.

here’s what has proven successful in my work as developer in a team:
– working in small steps (helps tackle problems more easily); solving a problem becomes a process in two steps: identifying steps and solving smaller problems; “divide and conquer” for the win ! :P
– continuous curiosity about new stuff in the domain (helps not get bored in keep motivation up); i prefer news feeds and small introductions into new technologies; i’m talking about the software development domain here
– shared knowledge; run your ideas through the heads of your colleagues; express your purpose, your concerns and ask for an opinion
– focus on what your client asks (a client being not necessarily the one who pays you, but even your boss); in a professional environment, people usually know what they want; providing what you have been asked is a good thing (even if it only helps your client see that it was something useless or less necessary; more points for you)

this was more or less of what you said, but from a different view

Comment by belun | September 16, 2010 8:47 am

This blog have little value without you and your comments, thoughts and discussions. Please, leave your comments. You are welcome to debate and criticize any idea, but, please, don't attack other people. Thanks for your contribution!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting

Software Creation Mystery - http://softwarecreation.org
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License .