Working in any application with complicity similar to Blenders’ it is very useful to know how things works underneath GUI, how all the entities relate to each other in your scene. Knowing that, you will intuitively build your workflow more efficiently. Let’s take a simple example: say you have a nice model of a tree, and you want to manually scatter a few copies of it across the ground. Naturally, you’re going to copy/paste original tree, or, in case of Blender duplicate it, then place all the copies in its’ places. Sounds logical, right? But being new to Blender and its’ concept of datablocks (which is not unique to Blender, btw) you might not know that objects’ position in space and its’ data (vertices, faces, spline points, etc.) are two independent types of datablocks that are not hard binded to each other. This allows us to use same single dataset of vertices, faces, UVs that define our tree shape and look for all the tree objects in our scene without actually copying this data for each tree instance and thus avoiding scene cluttering and saving disk space and RAM, which might be crucial when we’re talking about hundreds and thousands of detailed objects.
And this concept applies virtually to everything in you .blend file: scenes, lights, curves, text objects, screen spaces, actions, materials, etc. So, for example, if you want a number of copies of some object in you scene with different colors, but same shader properties, instead of making a copy of the material datablock and tweaking color parameter in each copy, simply tell your shader to use objects’ color from object datablock. This way, instead of let’s say 100 object datablocks with 100 almost identical material datablocks, you’ll end up with 100 object datablocks with 1 material datablock. Feel the difference. And besides scene optimisation this gives you the flexibility to edit shape/look/behaviour of tens, hundreds and thousands of instances quick and painless.