Факты излагаются известные, по отдельности справедливые - вся картинка нелогичная.
Особенно противопоставление разных средств.

Про хорошее качество результата в динамических языках типа Smalltalk хорошо известно. Это позволяет только утверждать, что перенос проверок на runtime кардинально не бьёт по надёжности, при прочих равных (нормальный язык и т.п.) Что типизация не позволяет гарантировать правильность - банальность, и ежу понятно

Её задача - срезать как можно раньше ряд ошибок и дать концентрироваться на других. Чем о меньших вещах в один момент времени мы думаем, тем производительнее мы работаем. Статика с динамикой может отлично сочетаться. Например, в Обероне я перейду на типизированные сообщения в тех местах, где мне нужна гибкость, как они называют, "утиной типизации". Но я знаю, что у меня не будет просадки на операциях с атомарными типами и т.п.

Примеры о вредности ранней и удобстве поздней типизации в основном связаны с ОО-иерархиями - тоже ежу понятно, что иметь возможность послать сообщение без оглядки на тип позволяет разрешить ситуации, где строгое дерево расширения "жмёт" (и в Обероне этот приём сплошь и рядом). Можно также прикинуть, что ошибки, связанные с такими ОО-местами, будут хорошо выявляться динамически даже без серьёзного покрытия кода (если есть ошибка, где-нибудь да выстрелит). На алгоритмоёмких же приложениях, где обрабатываются данные, будет гораздо веселее, с учётом возможных случайных опечаток.

Про тестирование тоже какие-то банальности - нашли панацею.В первую бы очередь о контрактах и неотключаемых ассертах поговорили - вот пример нужнейших поздних проверок! - поверх чего и гонять бы уже "модульные тесты"...

Ну и, конечно, потрясающий перл в конце: "единственной гарантией правиль­ности является прохождение всех тестов, определяющих правильность програм­мы". Аж десять раз )