Functions: Functions are self-contained blocks of code that perform specific tasks. They enable procedural abstraction by encapsulating reusable pieces of code.
Decomposition: Decomposition is the process of breaking down complex problems or tasks into smaller, more manageable subproblems.
Reusability: Reusability refers to writing code in such a way that it can be used again in different parts of your program without having to rewrite it.