Recently I found myself in an uninspiring company meeting listening to a consultant drone on about what he felt were essential elements of successful software companies. He and I had both been hired to help this small, growing company buttress its revenue stream. The last thing I remember before I fell asleep was his blathering about the lessons he learned from the dozens of companies he had helped bury.

I’m not normally a cynic and I recognize it’s easy to dismiss others’ ideas as out-of-touch or impractical to implement. Pointing out deficiencies is not hard at all. A colleague of mine once reminded me that the burden of the complainer is to propose viable solutions to the problem.

Now, unlike the speaker, I was hired for tactical consulting, not strategic, but I thought of what I might be able to say in front of these twenty five developers, sales reps and customer support engineers. What are the core principles of great software companies?

Back in my MBA classes at the University of Utah, I concluded that it’s impossible to provide a formula that guarantees business success; there are just too many non-deterministic factors at play (timing, market conditions, actions of competitors, etc.) It is possible to list the common elements of thriving companies and to highlight the pitfalls you must avoid. Here is a brief list of some elements and principles I’ve found to be in place at great software companies:

Robust Software Framework

  • Reusable code/modules
  • Object oriented architecture
  • Services oriented architecture (interconnectable)
  • Error handling
  • Debugging
  • Profiling
  • Database abstraction

Well Structured Environment

  • Version control
  • Code to tests
  • Ticketing system
  • CMM/ITIL process management
  • Clear release process

Cultural Values

  • Mutual accountability
  • Productive conflict
  • Trust
  • Where possible, Keep It Simple
  • Work ethic
  • No hackery– be proud of code
  • Document! (all knowledge: code, methodologies, systems, etc)
  • Always add value
  • Don’t reinvent wheels (unless it’s a much better wheel)
  • Use standards where they make sense
  • Data security and backups, anticipate hackers

Misc

  • Under promise, over deliver. on time.
  • Customer-driven features
  • Quality Assurance with automated tests
  • Fast, Clean, Simple, Intuitive interface that just works
  • Fast/Agile
  • Scalable, Fault-Tolerant Architecture
  • Team-oriented
  • Hire and retain excited, passionate people
  • Growth focused

What did I miss? Would my presentation have been as lame as the one I fell asleep in? :)