Programming is a process of translating ideas into code, or so we have been told by B.S. Understanding of [even your own] code becomes a huge problem once a code base has been grown, and many people are involved.
Figuring out (or even mere guessing) valid arguments or return value types of a function (could I return
-1) becomes a headache.
To use correctly a dynamically-typed code you have to read it, which takes lots of time and results in frustration, lose of motivation (most of the code is fucking crap) and burnout.
With proper (sound) static typing it could be proved (rigorously verified) that there is no inconsistencies between how abstractions are declared and actually used. This is the point. You don't have to read the fucking code.
Boy, even C++ is a huge improvement against plain
C, whose type system is completely unsound (for the most part of C++ types are sound, except C-compatibility stuff, of course).
Good languages allow you to pattern-match on Algebraic Data Types so your code will be more safe (handling of all the special cases (
Nones) will be ensured (guaranteed) at compile time). Non-exhaustive matching will be warned. This is big.
Just use good languages.