Я не думаю, что речь идет именно об утке. Например, C # уже поддерживает ограниченную типизацию утки - например, вы можете использовать foreach для любого класса, который реализует MoveNext и Current.
Концепция утиной типизации совместима со статически типизированными языками, такими как Java и C #, в основном это расширение отражения.
Это действительно случай статической и динамической типизации. И то, и другое - правильное, настолько, насколько это возможно. За пределами академии это действительно не стоит обсуждать.
Мусорный код может быть написан любым из них. Отличный код может быть написан на любом. Нет абсолютно никакой функциональности, которую может сделать одна модель, а другая - нет.
Реальная разница заключается в характере выполненного кодирования. Статические типы уменьшают свободу, но преимущество в том, что все знают, с чем имеют дело. Возможность менять экземпляры на лету очень мощная, но цена заключается в том, что становится трудно понять, с чем ты умрешь.
Например, для Java или C # intellisense очень просто - IDE может быстро создать список возможностей. Для Javascript или Ruby это становится намного сложнее.
Для определенных вещей, например, для создания API, с которым кто-то будет кодировать, есть реальное преимущество в статической типизации. Для других, например, для быстрого изготовления прототипов, преимущество заключается в динамике.
Стоит иметь понимание того и другого в вашем наборе навыков, но далеко не так важно, как понимание того, что вы уже используете в реальной глубине.