We had a subroutine to convert numbers to printable form on the screen. And a different subroutine to convert numbers to the printer. And another to print to the comm port. Oh, yes, of course, everything optimized for purpose . . . because one generic routine to format a buffer, and then use the buffer for whatever purpose, would cost an extra subroutine call. This was before OO, but even Algol and PL/1 and Pascal had structures - so we had all sorts of structures that were just one or two items different from each other, and OF COURSE they had no common subsets - the differences were in different places in each one because it just "seemed like where that variable belonged" instead of saying "Hey, all of these have the same 10 things plus one or two other things, how about a nested structure?" So OF COURSE we needed completely different routines to perform essentially the same functions on the ever-so-slightly-different structures. That's not design, or functional decomposition, it's just writing code.