How can I improve the ease of which I can extend my software? I am thinking about how software like Microsoft Windows grows from small as MS-DOS to Windows 7, Adobe Photoshop from its first version to version CS5. What techniques were used to accomplish this? Did they extend their software from the existing software or redesign for the next version? Or have they already planned their software solidly before they built them?
It's hard for me to extend my application/software when I need to add new features and it makes a mess of other existing features. How can I improve my software's extensibility so that I can easily add new features to your software?

By Implementing A strongly Designed system. with the best design patterns suited for the job.

In software engineering, extensibility
  (sometimes confused with forward
  compatibility) is a system design
  principle where the implementation
  takes into consideration future
  growth. It is a systemic measure of
  the ability to extend a system and the
  level of effort required to implement
  the extension. Extensions can be
  through the addition of new
  functionality or through modification
  of existing functionality. The central
  theme is to provide for change while
  minimizing impact to existing system
  functions.

Few Important Aspects.


*

*The Philosophy of Extensible Software

*Designing extensible software 

*How extensible should code actually be?

Your code is more likely to be extensible if you follow the SOLID Priciple. Many of these come for free if you do testdriven development

Write modular code that is loosely coupled. This allows for extension in stages.