Что вы считаете основной причиной дефектов программного обеспечения (и как их минимизировать) [закрыто]

14

Я определяю дефект , как:

«что-то в дизайне или коде приложения, которое мешает его функционированию в соответствии с требованиями».

Я ищу идеи о причинах дефектов, например, человеческий фактор, отсутствие тестирования, отсутствие прототипирования и возможные идеи для их устранения.

Крис Бакетт
источник
5
Я бы заменил «требования» на «потребности пользователя» или «ожидаемое поведение», поскольку даже требования могут быть неверными.
Mouviciel
Что требования неверны? (а код правильный?)

Ответы:

13

Основной причиной дефектов программного обеспечения является интерпретация.

Интерпретация клиентом функции отличается от интерпретации дизайнера.

Дизайнерская интерпретация отличается от интерпретации программиста.

Большинство методологий изобрели способы противодействия этому эффекту. Но, в конце концов, мы всего лишь люди, и мы не безупречны. Кроме того, часто возникает нехватка времени, и большинство методологических приемов часто пропускается, когда они находятся под давлением.

Тестирование может выявить проблемы только на ранней стадии. Но даже тестеры - люди, и 100% невозможно проверить. Если вы хотите выпустить до конца вселенной.

Тун Крижте
источник
Если бы я только мог заставить работать этот проклятый модуль чтения мыслей, все было бы хорошо.
HLGEM 12.10.10
@ Gamecat: и это становится еще хуже, когда работаешь с людьми по всему миру. Существует не только языковой барьер (часто, по крайней мере, один из участников не настолько хорошо владеет английским языком), но есть и культурные различия.
Матье М.
2
Вы пропустили одно - «интерпретация программиста отличается от интерпретации компилятора» ...;)
Алекс Фейнман
@ Алекс: Я знаю, что компилятор будет делать с кодом, который я пишу. Это знание было нелегко приобрести, но я сделал это. Теперь у нас есть моя интерпретация кода, который я не писал, в отличие от данных компилятора и времени выполнения.
Дэвид Торнли
@ Дэвид, если вы не написали и не поддержали компилятор, ваши знания о том, что делают внутренности, являются абстракцией того, что происходит на самом деле - и это, вероятно, к лучшему, так как позволяет вам тратить мозговое пространство на реальное приложение.
Алекс Фейнман
8

Я считаю, что основной причиной дефектов программного обеспечения являются программисты.

Не то чтобы просто смешно, а потому, что одной из больших проблем, с которыми я столкнулся на своей работе, является плохой сбор требований в сочетании с плохим пониманием проблемной области, вызывающей серьезные дефекты и проблемы с юзабилити в проекте.

Частично это происходит из-за нежелания изучать / понимать терминологию конечного пользователя, что вызывает недоразумения.

Частично это происходит из-за слишком раннего разговора о технологиях с людьми, которые не понимают, о чем вы говорите или почему это важно.

Лучший пример этого был, когда я услышал, как один из программистов пытался выяснить, как долго будут содержаться вопросы / ответы в символах ... Я знал, что он пытался выяснить, какое поле размера использовать в базе данных, но Департамент, запрашивающий это, не имел ни малейшего понятия, почему это имеет значение - или что пробелы учитываются. Для нас это кажется очевидным, но для них это было настоящим откровением.

AnonJr
источник
8

Основной причиной дефектов является плохое управление ;)

Серьезно, разработчик, который работает в хорошем состоянии, которого не просят переутомиться, сокращать качество, иметь надлежащие инструменты, тихие условия труда и т. Д., Будет производить меньше ошибок, чем кто-то, работающий под жестким давлением.

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

Плохое управление .

(отказ от ответственности: я должен нанимать и управлять разработчиками)


источник
не думайте, что это основная проблема, большинство разработчиков работают в спокойной обстановке. Я согласен с AnonJr и Gamecat - неспособность полностью понять проблемную область, могут помочь только быстрые итерации и тестирование.
radekg
1
Почему большинство разработчиков работают в спокойной обстановке? В дюжине компаний, которые я посетил за последний год, ни одна не была спокойной.
Хорошее управление может увести вас далеко, плохое управление может вас никуда не увести!
Крис
+1 относительно тихих условий труда. Каждая компания, в которой я когда-либо работал, была фермерским хозяйством в Дилбертеске, где вы можете постоянно слышать, как люди в 4 футах от вас стригут ногти, жуют еду и принимают телефонные звонки.
Бобби Столы
5

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

Большинство методов разработки, которые я изучаю, сводятся к сокращению N, потому что сложность программы, по крайней мере O(N^2)и возможно O(k^N). Определение Nоставлено в качестве упражнения для читателя, но я думаю о таких вещах, как цикломатическая сложность. Инкапсуляция логики и данных приводит к уменьшению N путем разделения проблемы.

Алекс Фейнман
источник
4

Невозможность думать обо всем.

JeffO
источник
4

Разрыв связи. В сборнике требований. По расписанию. В оформлении документа. В функциональной спецификации. В коде (разрыв между тем, что хочет программист и что он говорит компилятору).

Социальный этикет. Социально недопустимо называть кого-то недееспособным.

aufather
источник
3

Бросаться в вещи, не понимая их полностью. Начиная писать код без полного понимания функциональных требований или технической архитектуры.

Программирование должно быть почти автоматическим, просто записывать то, что самоочевидно и уже выработано в уме. На практике, я вижу, что в коде много проблем, чтобы попытаться понять, что именно должен делать код. Я сам был виновен в этом много раз.

Джори Себрехтс
источник
Четыре месяца на новой работе, и я все еще не очень хорошо разбираюсь во всем. Я не собираюсь спешить; то, что вы говорите, правда. Отстой, чтобы быть непродуктивным так долго, хотя.
DarenW
Мне потребовался год или два, чтобы полностью освоить систему, в которой я работаю (система с 2 миллионами линий). Даже тогда есть большие сегменты этого, которых я просто не знаю.
Джори Себрехтс
2

График Давление определенно является сильным источником.

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

AShelly
источник
2

Еще одна вещь, которая должна быть упомянута, это не иметь постороннего теста. Когда разработчик пишет тесты и запускает их, он проверяет только свою интерпретацию, а не фактическое требование. Хотя модульный тест, написанный разработчиками, полезен для выявления некоторых ошибок, большинство ошибок пройдет эти тесты, но не будет тем, что пользователь хочет или нуждается. Любое программное обеспечение, не протестированное кем-либо, кроме разработчика, не тестируется (и я не имею в виду просто запуск тестов разработчика).

HLGEM
источник
2

Это потому, что разработка программного обеспечения по своей сути сложна. Эссе "Нет серебряной пули" обсуждает это.

По иронии судьбы, многие другие ответы здесь затрагивают темы, которые являются «случайно сложными», на языке этого эссе, в то время как на самом деле большинство того, что делают разработчики программного обеспечения, «существенно сложны», так что это просто по своей природе, что создание Программное обеспечение сложно, в программном обеспечении будут ошибки, и наша задача - справиться с ним.

Питер Айзентраут
источник
1

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

Huperniketes
источник
1

Написание кода, который молча терпит неудачу, против кода, который сообщает обо всех ошибках.

bjornl
источник
1

Отсутствие проверки на вещи, которые «не могут произойти» или вряд ли произойдут, является серьезной проблемой. Иногда совершенное - враг хорошего. Если это не стоит хорошо продуманной иерархии исключений, некоторая быстрая и грязная обработка всегда лучше, чем ничего. Я огромныйфанат быстрых неудач, утверждений и оставлений утверждений, которые оказывают незначительное влияние на производительность в сборках релизов. Даже в быстрых и грязных одноразовых скриптах, где я контролирую все входные данные, я включаю некоторую быструю / грязную обработку ошибок, обычно просто с помощью функции, которая эквивалентна утверждению, но остается включенной все время. Мое эмпирическое правило заключается в том, что, если это вряд ли произойдет, или вы думаете, что это не может произойти, ему не нужно изящно проваливаться с удобным сообщением об ошибке, но оно должно по крайней мере быстро проваливаться с сообщением об ошибке дает программисту некоторые подсказки о том, что пошло не так.

Редактировать: одна из полезных тактик - использовать утверждения в качестве основного инструмента отладки и оставлять их там после завершения сеанса отладки. С этого момента ваша кодовая база будет иметь несколько встроенных проверок работоспособности, которые сильно затруднят повторное возникновение связанных ошибок. Это особенно полезно для кода, который трудно протестировать.

dsimcha
источник
1

Основной причиной дефектов программного обеспечения является написание кода.

Пишите меньше кода, и у вас будет меньше ошибок ;-)

nlawalker
источник
0

На одном уровне управление. Но это не только PHB. Это управление самим кодом, который может отражать или не отражать корпоративное управление.

Участники всего «жизненного цикла» должны быть полностью инвестированы в качество и создание продукта, который просто не умирает . Само программное обеспечение обещает никогда не ломаться, учитывая надлежащую надежность абстракции. Вопрос только в том, заинтересованы ли конструкторы программного обеспечения в совершенной работе.

Пол Натан
источник