Software developers spend a large fraction of their time dealing with intent, seeking to answer questions like
Does this code really do what it is expected to do?
Is this module used appropriately?
Is this code easy to modify or extend?
Can this code be used in a different context?
As a result, developers make many mutually-dependent design decisions to express intentions about software and try to convert them into code precisely.