Progressive Enhancement is a methodology where a web application is developed in layers. Each layer works correctly on its own, and additional layers on top enhance the user experience.
The justifications for Progressive Enhancement are usually around graceful degradation — people using older technologies are not left out in the cold, while better technologies are exploited for more cutting edge users.
Those are fine things, but there are more compelling reasons to use PE, in my opinion.
Easier to develop
When developing a modern web app, we’ll likely want to use Ajax, to make efficient and responsive UIs. Great!
We avoid this mystery by separating concerns.
First, we develop a web app that works reliably without Ajax. We focus on the HTML experience — buttons that submit forms and links that navigate to real URLs. A back button that works!
We work it to the point that we know the server-side is reliable, and ship it.
Now let’s sprinkle Ajax on top. Intercept clicks and submits, and route them to your Ajax bits. During this process, if something doesn’t work, we can say with reasonable confidence that the problem is client-side.
(Tip: use the same “end point” on the server for both Ajax and traditional requests. In MVC, this would be the controller action URL. Vary vary the end point’s response depending on the request type — a partial instead of a full layout, say.)
Robust against humans using a failure-prone language
If we’ve authored the non-JS experience correctly and separately, then the experience should fall back to a plain HTML experience. Graceful degradation is an insurance policy for our shortcomings, too.
Division of labor
Each of these layers (JS, HTML, server) is a specialty. If our site gets big, we might have separate people working on each. Make sure the jQuery person and the Django person can work independently.
Now keep up the discipline
Over time, it’s easy to forget the HTML experience, since your Ajax stuff works so well. Remember, each time you want to add a new feature, stick with the above methodology.
Turn off JS in your browser. Develop the feature. Test it thoroughly. Then, turn JS back on and delight your users.