Search code examples
hudsonagileorganization

What good practice strategies and technologies can my company adopt that would save them potentially hundreds of thousands of dollars?


Basically we have rows upon rows of programmers that do mundane tasks every day. This would involve writing code that is not very effective, is not unit tested, and often integrates poorly with the application. Not to mention that there is no accountability in terms of hours spent versus hours worked. I am not trying to get people fired or make life miserable for anyone. All I want is a stream line agile (word is banned in our company) process.Would this involve setting up something like a Hudson integration server? Version control that is tied to project management software?


Solution

  • This is the perfect question for a plug of the Seven Principles of Lean Software Development:

    1. Eliminate Waste
      • Provide market and technical leadership - your company can be successful by producing innovative and technologically advanced products but you must understand what your customers value and you know what technology you're using can deliver
      • Create nothing but value - you have to be careful with all the processes you follow i.e. be sure that all of them are required and they are focused on creating value
      • Write less code - the more code you have the more tests you need thus it requires more work and if you're writing tests for features that are not needed you are simply wasting time
    2. Create Knowledge
      • Create design-build teams - leader of the development team has to listen to his/her members and ask smart questions encouraging them to look for the answers and to get back with encountered problems or invented solutions as soon as possible
      • Maintain a culture of constant improvement - create environment in which people will be constantly improving what they are working on - they should know that they are not and should not be perfect - they always have a field to improve and they should do it
      • Teach problem-solving methods - development team should behave like small research institute, they should establish hypotheses and conduct many rapid experiments in order to verify them
    3. Build Quality In
      • Synchronize - in order to achieve high quality in your software you should start worrying about it before you write single line of working code - don't wait with synchronization because it will hurt
      • Automate - automate testing, building, installations, anything that is routine, but do it smartly, do it in a way people can improve the process and change anything they want without worrying that after the change is done the software will stop working
      • Refactor - eliminate code duplication to ZERO - every time it shows up refactor the code, the tests, and the documentation to minimize the complexity
    4. Defer Commitment
      • Schedule Irreversible Decisions at the Last Responsible Moment - you should know where you want to go but you don't know the road very well, you will be discovering it day after day - the most important thing is to keep the right direction
      • Break Dependencies - components should be coupled as loosely as possible to enable implementation in any order
      • Maintain Options - develop multiple solutions for all critical decisions and see which one works best
    5. Optimize the Whole
      • Focus on the Entire Value Stream - focus on winning the whole race which is the software - don't optimize local inefficiencies, see the whole and optimize the whole organization
      • Deliver a Complete Product - teams need to have great leaders as well as great engineers, sales, marketing specialists, secretaries, etc. - they together can deliver great final products to their customers
    6. Deliver Fast
      • Work in small batches - reduce projects size, shorten release cycles, stabilize work environment (listen to what your velocity tells you), repeat what's good and eradicate practices that creates obstacles
      • Limit work to capacity - limit tasks queue to minimum (one or two iterations ahead is enough), don't be afraid of removing items from the queue - reject any work until you have an empty slot in your queue
      • Focus on cycle time, not utilization - put in your queue small tasks that cannot clog the process for a long time - reduce cycle time and have fewer things to process in your queue
    7. Respect People
      • Train team leaders/supervisors - give team leaders the training, the guidance and some free space to implement lean thinking in their environment
      • Move responsibility and decision making to the lowest possible level - let your people think and decide on their own - they know better how to implement difficult algorithms and apply state-of-the-art software frameworks
      • Foster pride in workmanship - encourage passionate involvement of your team members to what and how they do

    My point is that you can certainly adopt engineering practices like automated testing, refactoring, coding standards, pair programming, code reviews, continuous integration, etc. They will definitely not hurt. But they should be part of a bigger plan that involves organizational practices and, ultimately, the way your company drives the business. Agile is actually a business oriented thing, engineering practices and tools are just a small part of the story and won't be enough by themselves to save hundreds of thousands of dollars.

    In short, whatever you'll use, if your current (probably sequential and defined) process produces poor results, not changing the process won't drastically change the results.

    I thus believe that enabling "inspect and adapt" cycles and feedback loops would be the most important thing to do.

    But change usually involves the management.

    See also