Being able to preserve the ability to alter any of the edits you have already made while working on a photo is critical to ensuring that you are able to maximize the influence of your creative vision on a photo. There are few greater frustrations than realizing that an adjustment you have made was not quite right but it is so far back in the history that it cannot be altered without starting over. In order to avoid such situations it becomes quite critical to build an editing workflow designed to let you make alterations at any time to any aspect of the photo without the need to start over to undo work.
Always Use Adjustment Layers
Adjustment layers are the most obvious and commonly used tool for non destructive editing. Many of the tools within the Image adjustment menu are also available as adjustment layers. There really is never a situation where it is a superior choice to use a destructive adjustment instead of its relative adjustment layer. Not only do adjustment layers avoid harming the actual data on the layer they are adjusting they also empower to editor to further fine tune the adjustments with the help of masking, opacity, and blend modes.
Use Masks Instead of The Eraser Tool
One of my core Photoshop Philosophies is: "The eraser tool does not exist." In my workflow if I am ever tempted to use the eraser tool that suggests that I am fundamentally doing something wrong as the eraser tool is functionally designed to be destructive. Masks are one of the most valuable tools in all of Photoshop and are designed to achieve the same result of the eraser without forcing the user to make a permanent commitment. For this reason I also would never recommend "applying" a mask so that it is removed and the pixels it is masking are simply deleted.
Use Smart Filters
By default, when you apply a Photoshop filter to a layer the filter destructively edits the pixels of that layer without any allowance for future adjustments. This is where smart filters come into play. A smart filter is a filter applied to a smart object layer that is a non destructive alternative to standard filters. In order to use smart filters, first you must transform the target layer into a smart object by right clicking on it and selecting "Convert to Smart Object." Once this has been done any filters applied to the layer will now be applied as smart filters. If you wish to edit the source layer again in the future you can access it by double clicking on the layer thumbnail and it will launch as a separate document that can be saved back to its parent again at will.
Avoid Creating Flat Layers
I often cringe when watching tutorials where the teacher advises the frequent creation of flat layers in order to apply some sort of effect. It almost always involves creating a new empty layer and hitting cmd/control-shift-e to create a flat layer of the entire document. Not only does frequently creating these sort of layers massively increase the file size of your working files it also is effectively locking down previous changes in a way that prevents future edits to them. Even if you preserve the other layers below your new flat layer if you ever want to actually edit any of them you must redo any future edits to the flat layer. As a whole, flattening down your document is incredibly inefficient and drastically limits the degree that you can make alterations in the future.
In my experience there is almost always an alternative method than can be used for techniques that require a flat layer. One common example that I often see is the use of a flat layer as a final step in order to add noise to the image. An alternate to this that is nondestructive is to create a layer filled with 50% grey which the noise is then applied to. Then simply change the layer's blend mode to soft light and you will have the exact same effect that using a flat layer would have without any of the destruction and far more control to adjust.
For anyone who is familiar with computer programming they will be also quite be well acquainted with the concept of object oriented programming. It is a tremendously valuable technique that allows software to be developed in a highly organized, useful manner. I always try to leverage those same principles when working in Photoshop so that I am layering my document with concise, non destructive objects that function in isolation and can always be adjusted in the future. This philosophy ensures near unlimited editability that doesn't require dependency on the history panel which can save countless hours of work when a client or you decide that an edit needs to be slightly different.