If you're a very old programmer like me you may have written stuff like this early on: DIM A, B, C LET A = 2 LET B = 2 GOSUB ADD PRINT C END ADD: LET C = A + B RETURN (Actually, if you're an assembly programmer, you may be stuck writing stuff like this anyway, but let's not digress.) Of course the modern approach would be more like this: var c = Add(2,2); Print(c); I understand the first pattern is obviously "bad;" that is not under dispute. I'm just trying to [explain to another engineer](https://softwareengineering.stackexchange.com/a/404762/115084) the specific technical reasons why, without injecting my own opinion. A good answer will strive to be exhaustive, and stick to technical reasons, risks, and potentially cite known code smells or other authoritative sources.