QGIS
QGIS is a desktop geographic information system: load spatial data, style it, inspect it, run analyses, produce maps. It is the open-source counterpart to ArcGIS and is fully capable for most work.
Its place in my workflow is narrow and hard to replace: looking at data. Before writing code against an unfamiliar spatial dataset, opening it in QGIS answers questions that are tedious to establish programmatically — is the geometry where it should be, are there obviously broken features, does the attribute table contain what the documentation claims, is the projection what it says it is.
That last one is where it earns its place most often. A projection mismatch produces data that plots plausibly in the wrong location, and seeing a dataset against a basemap catches in seconds what could otherwise be a long confusion. Loading two layers and seeing whether they overlap correctly is a check with no convenient programmatic equivalent.
Where the boundary is
QGIS is for exploration and cartography. Reproducible analysis belongs in code.
The reason is that GUI operations are not recorded in any form anyone can review. A sequence of clicks producing a result cannot be re-run, diffed, or explained six months later, and the provenance is gone. The Processing Toolbox and the model builder mitigate this — and once an analysis needs to be reproducible, Python with GeoPandas or a PostGIS query is the better home for it.
So: QGIS to understand the data and to make the final map, code to do the analysis. Using it for the middle step is the mistake, and it is a tempting one because the tools are right there.
Practical notes
It connects directly to PostGIS, which is the fastest way to inspect what a spatial query actually returns — much better than exporting and reloading.
Its cartographic output is genuinely good, with fine control over symbology, labelling, and layout. For a publication figure it beats programmatic plotting for anything where placement judgment matters.
The plugin ecosystem is large and uneven in quality and maintenance, which is worth remembering before depending on one for anything reproducible.
Stability has improved a great deal, and it can still be unreliable with very large vector datasets. Filtering in PostGIS before loading avoids most of that.
See also: PostGIS, spatial reference systems, OpenLayers for the web equivalent, and ParaView for 3D and volumetric data.