Чи слід шукати код брехні?


9

Це стосується дискусії у відповіді та коментарів до цього питання: Що з відразою до документації в галузі? . У відповіді стверджувалося, що "код не може лежати", і, таким чином, він повинен бути місцем переходу до документації, а не документацією. У кількох коментарях зазначалося, що "код може брехати". Існує правда з обох сторін, принаймні частково через те, як погано та неналежно обробляється документація.

Чи варто нам шукати код брехні, порівнюючи його з будь-якою наявною документацією? Або зазвичай це найкраще джерело для того, що для цього потрібно робити? Якщо він є спритним кодом, чи менше шансів брехати, чи цей код не може лежати зовсім?


1
Не могли б ви пояснити, що ви маєте на увазі під «брехнею»? Нам не слід посилатися на коментарі в іншому питанні, щоб отримати ваш контекст.
user16764

@ user16764 Не дивлячись на іншу тему, перше, що потрібно
запам’ятати, це

Якщо в документації написано, що код повинен робити foo, а код - bar, чи означає це, що цей код повинен робити? Або ми припускаємо, що смужка - це правильна дія, тому що ми ніколи не читаємо документацію, оскільки код завжди правильний?
четверггек

Якщо код був прийнятий як штрих, то документація неправильна та застаріла. Але якщо foo та bar тісно пов’язані між собою, і користувачі не помітили, що це не зовсім вирішує їхні проблеми, як вони очікували, то, можливо, документація на foo не помиляється? Іншими словами, чи справді код є реальним і кінцевим, що повинен робити код?
четверггек

Відповіді:


9

Словами мирянина:

Так , вам слід шукати неправдивий код і змушувати його говорити правду. Але не шляхом порівняння його з документацією. Це був би метод виявлення неправдивої документації.

Код може лежати декількома способами, з яких я зазначу лише кілька:

  • Блоки коду, які ніколи не запускаються через умови, які ніколи не виконуються. Код бреше вас про те, скільки він робить.
  • Код, який додає зайвої складності, полягає в тому, наскільки складною є проблема насправді.
  • Код без обмежень щодо іменування неправдивий, тому що він вводить вас в оману, думаючи, що він робить щось інше, ніж те, що він насправді робить.

Чим коротше, тим менше лежить. Це очевидно.

Чим менш складний код, тим він прозоріший. Так лежить менше.

Таємні синтаксичні хитрощі лежать багато. Віддайте перевагу чітким поетапним алгоритмам. Вони лежать менше.

Хороший інструмент аналізу статичного коду допоможе вам знайти неправдивий код.

Також хороший автоматизований тестовий акумулятор змушує код говорити правду.


4
The shorter and terser the code is, the less it lies. It's self evident. Я навряд чи сказав би це. На мій досвід, чим коротший і терміниший код, тим більше можливостей його підмітати лежить під килимом, як правило, приховуючи їх у оманливих викликах функцій.
Мейсон Уілер

@MasonWheeler Ви праві. Я відредагував "невідкладну" частину.
Tulains Córdova

Мене не переконує "Кодекс, у якому немає брехні конвенцій про іменування". Це, звичайно, погано, але як можна брехати, якщо він нічого не каже? "Я вам не кажу!" є вперто обструктивним та неінформативним, але не оманливим. Безумовно, що "брехня" є тоді, коли існує умова про іменування, але вона використовується таким чином, що не відповідає тому, що працює насправді код - наприклад, якщо ви використовуєте угорський (yuck!), Але інколи мають префікс pзмінної, яка не вказівник.
Steve314

2
Власне, те, що ви пропонуєте, може бути краще описано як "софістику", ніж просто як "брехня". Софістика, як правило, багатослівна і складна саме тому, що складно бачити логічні недоліки, і поверхово розумна і впевнена, тому люди бояться поставити під сумнів, якщо вони виглядають дурними.
Steve314

Інший приклад: Код, який змінює основні властивості мови або часу виконання, наприклад, переосмислення або маскування примітивної поведінки.
JustinC

6

Код не може брехати.

Що в коді, це те, що зараз працює ваша програма - незалежно від того, яка документація, QA чи замовник каже. Особливо, якщо ваш код був випущений і деякий час був у полі, цю очікувану поведінку не слід ігнорувати.

Код, безумовно, може бути неправильним . Це, безумовно, може ввести в оману в своїй назві чи організації. Це, безумовно, може бути нечитабельним.

Але якщо ви хочете , щоб джерело істини для того , що ваш код робить , а не те , що він повинен робити, а не те , що він був розроблений , щоб зробити, а не те , що ви думали , що це робить ... якщо ви повинні знати , що це на насправді робить, перейти до коду.


Існує школа думки, що якщо ти навмисно оманливий, але педантично правильний, то ти не брешеш. Це не єдина школа думки. Наприклад, у мене є старе видання « Виявлення брехні та обману» Альдерта Врія . Одним з перших речей, що це робиться, є розгляд різних визначень брехні та обману, вибір включення педантично правильних, але навмисно оманливих тверджень частково, тому що це все одно загальне розуміння.
Steve314

Вибачте, але сказати "але це було педантично правильно" не означає, що вас не можна назвати брехуном - навіть якщо люди не сперечаються, вони все одно знають це.
Steve314

@ steve314 - pssh. Первісне питання було навколо коментарів. Побудувати солом’яного чоловіка для цих рідкісних сценаріїв, де код вводиться в оману, щоб стверджувати на користь коментування (і ігноруючи давно поширений сценарій застарілих коментарів), є абсурдом.
Теластин

1
Я з цим погоджуюся - я не сперечаюся з точкою, яку ви висловлюєте, лише очевидне визначення поняття «брехня», яке ви використовуєте, роблячи це. Код може брехати - не для компілятора, але, звичайно, для людських читачів. Це навіть навмисна мета в деяких випадках - такі речі, як замучений конкурс C, можуть бути порівняно доброякісним прикладом. Софістика, як я пропоную у своєму коментарі до користувача61852. Просто те, що компілятор бачить через брехню, не означає, що це не брехня.
Steve314

@Telastyn Я здогадуюсь, що у вас ніколи не було фільтру робити переадресацію, що спричиняє перехід фактично до білого простору, а потім перейти в код, не викликаний цим методом, ніколи не повертатися, чи не так? Боже, я ненавиджу! @ # $ Java-розробники з Java.
Ерік Реппен

0

Ви ставите кілька запитань.

Чи варто нам оглядати брехливий код?

Звичайно!

Чи слід порівнювати [код] з будь-якою наявною документацією?

Це ніколи не зашкодить, хоча, як зазначено в інших відповідях, частіше за все це призведе до того, що ви знайдете проблеми в документації , а не в коді .

Або зазвичай [код] найкраще джерело для того, що він повинен робити?

Це завжди краще джерело для того, що він буде робити. Найкращим джерелом для того, який код слід робити, можуть бути (комбінація) різних речей, хоча основні з них:

  • Сам код;
  • Код виклику;
  • Коментарі в цьому коді;
  • Документація;
  • Одиничні випробування;
  • Інтеграційні та регресійні тести;
  • Програміст;
  • Кінцевий користувач;

Яке "найкраще" джерело (або їх комбінація) залежить від вашої ситуації.

Якщо він є спритним кодом, чи менше шансів брехати, чи цей код не може лежати зовсім?

Я не впевнений, що ви маєте на увазі під "спритним кодом", AFAIK "agile" зазвичай стосується процесу кодування. Припустимо, ви маєте на увазі "код, створений у процесі спритного програмування", тоді я думаю, що можна впевнено сказати, що він все ще може брехати. Наскільки це брехня, порівняно з кодом, створеним, наприклад, у проектах у стилі водоспад - суб'єктивна справа (особисто я не думаю, що це великий зв’язок).


Виноски
Все вищесказане висловлюється з припущення, що код може лежати і що це основний (хоча і трохи надуманий) приклад:

public int DivideByTwo(int input) 
{
    return input / 3;
}

Це лише один приклад, де я б сказав "код лежить", @ user61852 є кілька інших (недоступний код, складність коду, що не відповідає складності проблеми, неправильне іменування), і я думаю, що існує ще багато. У Вікіпедії є дещо гідне резюме брехні , у багатьох з них можна знайти код.

Зауважте, що якщо ви з кимось посперечаєтесь, будьте впевнені, що це означає не те, що "людина не може брехати", що "код робить те, що робить". По суті, інша людина тут визначає використання визначення для "брехні", яке є настільки вузьким, що може оголосити твердження "код не може брехати" як аксіома / основна істина. У цьому випадку, мабуть, найкраще погодитися з його аксіомою.


0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

Ви можете посперечатися, чи слово "брехня" технічно доречне, але цей код чітко означає, що х іноді буде більше 5, а іноді - ні. Якщо ви подивитесь на повну програму і виявите, що ця функція коли-небудь викликається лише в одному місці, і що x завжди встановлено на постійну 6, то це брехня.

Більше того, компілятор, можливо, помітив це і замінив цей блок коду просто

doSomething()

Якщо doADifferentThing не називається ніде у вашій програмі, він може бути видалений повністю з програми.

Якщо ваша мова підтримує assertякийсь тип, який вимкнено у виробничих складах, кожне assertтвердження потенційно може бути брехнею. Друге твердження, яке може бути брехнею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.