Я бачу відповіді лише про те, що ми люди і схильні до помилок, що дуже вірно ... але я бачу ваше запитання з іншого погляду.
Я думаю, ви можете писати програми без помилок, але це, як правило, програми, які ви написали вже 10 або 12 разів. У 13-й раз ви пишете ту саму програму з нуля, ви вже знаєте, як це зробити: ви знаєте проблему, знаєте методи, ви знаєте бібліотеки, мову ... це ви бачите в своєму розумі. Усі зразки є на всіх рівнях.
Це трапляється зі мною дуже простими програмами, тому що я навчаю програмування. Вони прості для мене, але важкі для студентів. І я не говорю про рішення проблем, які я багато-багато разів робив на дошці. Звичайно, я це знаю. Я маю на увазі ~ 300-рядкових програм, які вирішують щось, використовуючи поняття, які я дуже добре знаю (поняття, які я викладаю). Я пишу ці програми без планування, і вони просто працюють, і я відчуваю, що знаю всі деталі, мені TDD взагалі не потрібен. Я отримую пару-три помилки компіляції (переважно друкарські помилки та інші подібні речі), і все. Я можу це зробити для невеликих програм, і я також вважаю, що деякі люди можуть це зробити для більш складних програм. Я думаю, що такі люди, як Лінус Торвальдс або Даніель Дж. Бернштейн, мають таку ясність думки, вони найближчі, до яких можна потрапити до кодера, що не містить помилок. Якщо вирозумію речі глибоко, я думаю, ти можеш це зробити. Я можу це зробити лише для простих програм, як я вже сказав.
Я вважаю, що якщо ти завжди намагатимешся робити програми, які значно перевищують твій рівень (я витрачав роки, роблячи саме це), ти заплутаєшся та помилишся. Великі помилки, як ті, в яких ви раптом розумієте, що ваше рішення не може працювати, коли ви нарешті зрозумієте проблему, і вам доведеться зробити зміни настільки складними, що можуть заважати вам вирішити вашу проблему або зробити код жахливим. Я вважаю, TDD для таких випадків. Ви знаєте, що не вирішуєте проблеми, яку вирішуєте, і тому всюди ставите тести, щоб переконатися, що у вас є міцна база. TDD не вирішує бачення на 10000 футів. Ви можете постійно ходити по колах із ідеально чистим кодом.
Однак якщо ви спробуєте зробити щось нове, але це трохи вище вашого рівня, можливо, ваша програма стане ідеальною або майже досконалою. Я думаю, що насправді важко дізнатися, які програми є у твоїй "межі знань", але теоретично це найкращий спосіб вчитися. Фактично я переписую програми з нуля. Деякі люди це роблять, але вам потрібно багато часу і терпіння, оскільки втретє повторюючи нетривіальну програму, ви не збуджуєтесь, як перший раз.
Тому моя порада: не думайте, що ви щось розумієте, поки не зможете написати програму без помилок саме для цього. А потім спробуйте поєднати два ті поняття, які ви добре знаєте, в одну програму. Я майже впевнений, що ви отримаєте це правильно з першого разу. Один з найкращих способів - переписати нетривіальне програмне забезпечення, що вимагало великих зусиль у перший раз (я зараз роблю це з додатками для Android). Кожен раз, коли я починаю заново, я щось міняю або додаю речі, просто щоб трохи повеселитися, і я можу сказати вам, що я все краще і краще і краще ... можливо, не помилка, але справді пишаюся.