Я вижу только ответы о том, что мы люди и подвержены ошибкам, что очень верно ... но я вижу ваш вопрос с другой точки зрения.
Я думаю, что вы можете писать программы без ошибок, но обычно это программы, которые вы написали уже 10 или 12 раз. В 13-й раз, когда вы пишете ту же самую программу с нуля, вы уже знаете, как это сделать: вы знаете проблему, вы знаете методы, вы знаете библиотеки, язык ... вы видите это в своем уме. Все модели есть на всех уровнях.
Это происходит со мной с очень простыми программами, потому что я преподаю программирование. Они простые для меня, но тяжелые для студентов. И я не говорю о решениях проблем, которые я делал много, много раз на доске. Конечно, я знаю их. Я имею в виду ~ 300-строчные программы, которые решают что-то, используя хорошо знакомые мне концепции (концепции, которым я учу). Я пишу эти программы без планирования, и они просто работают, и я чувствую, что знаю все детали, мне вообще не нужен TDD. Я получаю пару или три ошибки компиляции (в основном опечатки и тому подобное) и все. Я могу сделать это для небольших программ, и я также считаю, что некоторые люди могут сделать это для более сложных программ. Я думаю, что такие люди, как Линус Торвальдс или Даниэль Дж. Бернштейн, обладают такой ясностью ума, они ближе всего подходят к безошибочному кодеру. если тыпонимать вещи глубоко я думаю , что вы можете сделать это. Я могу сделать это только для простых программ, как я уже сказал.
Я считаю, что если вы всегда пытаетесь делать программы, которые намного превышают ваш уровень (я потратил на это годы), вы запутаетесь и совершите ошибки. Большие ошибки, подобные тем, в которых вы внезапно понимаете, что ваше решение не может работать, когда вы, наконец, понимаете проблему, и вынуждены вносить изменения настолько сложные, что они могут помешать вам решить вашу проблему или сделать код ужасным. TDD для этого случая, я считаю. Вы знаете, что не справляетесь с проблемой, которую решаете, и поэтому ставите тесты повсюду, чтобы убедиться, что у вас есть сильная база. TDD не решает зрение 10000 футов, хотя. Вы можете ходить по кругу с идеально чистым кодом все время.
Однако, если вы попытаетесь сделать что-то новое, но чуть выше вашего уровня, вы можете сделать вашу программу идеальной или почти идеальной. Я думаю, что действительно трудно узнать, какие программы находятся на вашей «границе знаний», но в теории это лучший способ обучения. На самом деле, я много переписываю программы с нуля. Некоторые люди делают, но вам нужно много времени и терпения, потому что в третий раз, когда вы повторяете нетривиальную программу, вы не волнуетесь, как в первый раз.
Итак, мой совет: не думайте, что вы что-то понимаете, пока не сможете написать программу без ошибок только для этой вещи. А затем попытайтесь объединить две из этих концепций, которые вы глубоко знаете, в одной программе. Я почти уверен, что вы поймете это правильно с первого раза. Один из лучших способов - переписать нетривиальное программное обеспечение, что потребовало много усилий в первый раз (сейчас я делаю это с приложениями для Android). Каждый раз, когда я начинаю снова, я что-то изменяю или добавляю, просто чтобы немного повеселиться, и я могу сказать вам, что становлюсь все лучше, лучше и лучше ... возможно, не без ошибок, но очень гордый.