John Puopolo is, with Sandy Squires, the author of the F#
Survivial Guide, on which this article is based. The F#
Survivial Guide covers all of the essential elements of
functional programming and the F# language. There are many ways
to examine problems and model their solutions. In software, we
tend to look at problems through the lens of our experiences and
the tools that we have at our disposal. In other words, our
experiences and the tools we know influence how we approach
solving problems. For example, in the days of structured
programming, we solved many problems using procedural
decomposition and subroutines, focusing on internal cohesion and
loose coupling. Building on these successful techniques, we
transitioned to modeling solutions using objects and object-
oriented techniques, further encapsulating imperative code and
its data. While object-oriented design and object-oriented
programming will continue to play a significant role in years to
come, I believe we are facing challenges that require new w