I first encountered the notion of complex/complicated in Antifragile I believe, and IIRC it's based on the [Cynefin framework](
https://en.wikipedia.org/wiki/Cynefin_framework).
My understanding is that:
* Complex domains lend themselves to experimentation and emergent behavior.
* Complicated domains lend themselves to analysis, expertise, and rule following.
The Wikipedia article offers the domains as containing "unknown unknowns" and "known unknowns" respectively.
I'm trying to think how this maps to Python -- the language is complicated, while the problems we're solving are expected to be complex?
Or, maybe, the language lives at the boundary between complicated and complex. We push complicated procedures into the language, and let the programmers deal with complex issues?