Сообщение Re[30]: Да ну и фиг с этой Java-ой. .Net будет убит Rust-ом от 10.08.2016 17:30
Изменено 10.08.2016 17:33 Evgeny.Panasyuk
Здравствуйте, ·, Вы писали:
EP>>более того — для формально верифицированного кода они не нужны.
·>Для формально верифицированного их разве кто-то пишет?
Я имею в виду то, что после того как есть результат формальной верификации, можно их выключить и это никак не повлияют на корректность.
EP>>·>Если медленно — это уже проблема алгоритма.
EP>>Это ещё почему?
·>Точнее не так. Если медленно, то можно перенести ассерт в юнит-тест.
Sinix выше правильно заметил — assert'ы отрабатывают во время всех тестов, как юнит, так и интеграционных, и поэтому есть приличный шанс того что они поймают баг пропущенный непосредственно юнит-тестированием.
Более того, юнит-тест конкретного компонента может успешно пройти при наличии бага, или например двойного бага — то есть false positive. При этом внутренний assert мог поймать эти баги на этом же прогоне. То есть assert'ы это отличное дополнение unit-тестов.
EP>>·>При хорошем покрытии тестами ценность ассертов падает до нуля.
EP>>Точно также как и ценность других defensive примочек, а-ля bounds checking
·>Не точно также же. В проде bounds checking валит исключения
Да какая разница если у тебя в оттестированном и корректном коде не будет этих исключений?
То есть ты определись — либо у тебя код оттестирован и defensive programming не нужен, либо не оттестирован и ты тестируешь его на своих пользователях
EP>>>>С другой стороны, выключение части из проверок в runtime'е, ровно как и отсутствии часть проверок вообще — не делает программу некорректной.
EP>>·>Но только если ассерты расставлены корректно.
EP>>Что ты имеешь в виду? То что проверка внутри assert'а может иметь side-effect?
·>Да, и такое бывает, к сожалению.
Я уже сказал что это ловится тестированием и debug и release версий. Но встречается крайне редко — я видел подобное только когда человек не знал что такое assert.
EP>>·>Я что-то не понял что это. Судя по if (!condition)throw это не ассерты в понимании С++.
EP>>Там некоторые из них опциональные, и не попадают в Release.
·>Ух ты. Это как устроено? Что-то не могу разобраться...
Conditional
EP>>·>В unmanaged наоборот: когда может — работает правильно, и всегда быстро.
EP>>Не всегда быстро, только когда assert'ы отключены.
·>При релизном использовании отключены.
Совсем необязательно — я их видел в коммерческом продукте имеющим сотни миллионов установок
·>>>Есть конечно. Я говорю о корректности самого кода, а не логических ошибок в алгоритме.
EP>>В чём ты видишь отличие? Выход за пределы bounds это есть логическая ошибка, которой в корректном коде нет
·>Эта ошибка явно прописана в спеке языка
Да какая разница — это и есть логическая ошибка в твоём алгоритме.
EP>>>>P.S. Ничто не мешает оставить часть assert'ов включенных в Release. Для этого их обычно разбивают на классы "быстрые", "медленные", "очень медленные" — и уже пользователь библиотеки решает что попадёт в Release.
EP>>·>По-моему излишнее усложнение. Собственно на основании чего пользователь будет принимать решение?
EP>>1. На основании того какое быстродействие его устраивает
·>Чем быстрее, тем лучше, очевидно.
Совсем не очевидно, ибо это не единственный критерий.
EP>>2. На основании того насколько корректен его код (здесь речь идёт про библиотеку и пользовательский код, ассерты внутри библиотеки могут ловить ошибки в пользовательском коде).
·>Конечно, корректен, я что ламер некорректный код писать?
Тогда тебе и не нужен никакой defensive programming
·>А ты как корректность своего кода оцениваешь?
Зависит от конкретного случая — различные комбинации unit/integration тестов, разбиение на классы эквивалентности, поиск изоморфизмов, assert'ы на пред/пост-условия и ванрианты/инварианты, доказательства. Вот до чего пока не доходил, так это до выражения доказательств на формальных языках и их дальнейшей автоматизированной проверки.
·>А вообще для этого сценария придумали логи и кастомизируемые (в т.ч. в рантайм) уровни логгирования. Ассерты тут пихать не надо.
А причём тут логи? Если у тебя условие assert'а сфейлилось — то дальше всё может полететь в тартарары, и лучше всего пристрелить такую программу.
EP>>более того — для формально верифицированного кода они не нужны.
·>Для формально верифицированного их разве кто-то пишет?
Я имею в виду то, что после того как есть результат формальной верификации, можно их выключить и это никак не повлияют на корректность.
EP>>·>Если медленно — это уже проблема алгоритма.
EP>>Это ещё почему?
·>Точнее не так. Если медленно, то можно перенести ассерт в юнит-тест.
Sinix выше правильно заметил — assert'ы отрабатывают во время всех тестов, как юнит, так и интеграционных, и поэтому есть приличный шанс того что они поймают баг пропущенный непосредственно юнит-тестированием.
Более того, юнит-тест конкретного компонента может успешно пройти при наличии бага, или например двойного бага — то есть false positive. При этом внутренний assert мог поймать эти баги на этом же прогоне. То есть assert'ы это отличное дополнение unit-тестов.
EP>>·>При хорошем покрытии тестами ценность ассертов падает до нуля.
EP>>Точно также как и ценность других defensive примочек, а-ля bounds checking
·>Не точно также же. В проде bounds checking валит исключения
Да какая разница если у тебя в оттестированном и корректном коде не будет этих исключений?
То есть ты определись — либо у тебя код оттестирован и defensive programming не нужен, либо не оттестирован и ты тестируешь его на своих пользователях
EP>>>>С другой стороны, выключение части из проверок в runtime'е, ровно как и отсутствии часть проверок вообще — не делает программу некорректной.
EP>>·>Но только если ассерты расставлены корректно.
EP>>Что ты имеешь в виду? То что проверка внутри assert'а может иметь side-effect?
·>Да, и такое бывает, к сожалению.
Я уже сказал что это ловится тестированием и debug и release версий. Но встречается крайне редко — я видел подобное только когда человек не знал что такое assert.
EP>>·>Я что-то не понял что это. Судя по if (!condition)throw это не ассерты в понимании С++.
EP>>Там некоторые из них опциональные, и не попадают в Release.
·>Ух ты. Это как устроено? Что-то не могу разобраться...
Conditional
Conditional methods allow developers to create methods whose calls can be placed in the code and then either included or omitted during compilation based on a preprocessing symbol.
EP>>·>В unmanaged наоборот: когда может — работает правильно, и всегда быстро.
EP>>Не всегда быстро, только когда assert'ы отключены.
·>При релизном использовании отключены.
Совсем необязательно — я их видел в коммерческом продукте имеющим сотни миллионов установок
·>>>Есть конечно. Я говорю о корректности самого кода, а не логических ошибок в алгоритме.
EP>>В чём ты видишь отличие? Выход за пределы bounds это есть логическая ошибка, которой в корректном коде нет
·>Эта ошибка явно прописана в спеке языка
Да какая разница — это и есть логическая ошибка в твоём алгоритме.
EP>>>>P.S. Ничто не мешает оставить часть assert'ов включенных в Release. Для этого их обычно разбивают на классы "быстрые", "медленные", "очень медленные" — и уже пользователь библиотеки решает что попадёт в Release.
EP>>·>По-моему излишнее усложнение. Собственно на основании чего пользователь будет принимать решение?
EP>>1. На основании того какое быстродействие его устраивает
·>Чем быстрее, тем лучше, очевидно.
Совсем не очевидно, ибо это не единственный критерий.
EP>>2. На основании того насколько корректен его код (здесь речь идёт про библиотеку и пользовательский код, ассерты внутри библиотеки могут ловить ошибки в пользовательском коде).
·>Конечно, корректен, я что ламер некорректный код писать?
Тогда тебе и не нужен никакой defensive programming
·>А ты как корректность своего кода оцениваешь?
Зависит от конкретного случая — различные комбинации unit/integration тестов, разбиение на классы эквивалентности, поиск изоморфизмов, assert'ы на пред/пост-условия и ванрианты/инварианты, доказательства. Вот до чего пока не доходил, так это до выражения доказательств на формальных языках и их дальнейшей автоматизированной проверки.
·>А вообще для этого сценария придумали логи и кастомизируемые (в т.ч. в рантайм) уровни логгирования. Ассерты тут пихать не надо.
А причём тут логи? Если у тебя условие assert'а сфейлилось — то дальше всё может полететь в тартарары, и лучше всего пристрелить такую программу.
Re[30]: Да ну и фиг с этой Java-ой. .Net будет убит Rust-ом
Здравствуйте, ·, Вы писали:
EP>>более того — для формально верифицированного кода они не нужны.
·>Для формально верифицированного их разве кто-то пишет?
Я имею в виду то, что после того как есть результат формальной верификации, можно их выключить и это никак не повлияют на корректность.
EP>>·>Если медленно — это уже проблема алгоритма.
EP>>Это ещё почему?
·>Точнее не так. Если медленно, то можно перенести ассерт в юнит-тест.
Sinix выше правильно заметил — assert'ы отрабатывают во время всех тестов, как юнит, так и интеграционных, и поэтому есть приличный шанс того что они поймают баг пропущенный непосредственно юнит-тестированием.
Более того, юнит-тест конкретного компонента может успешно пройти при наличии бага, или например двойного бага — то есть false positive. При этом внутренний assert мог поймать эти баги на этом же прогоне. То есть assert'ы это отличное дополнение unit-тестов.
EP>>·>При хорошем покрытии тестами ценность ассертов падает до нуля.
EP>>Точно также как и ценность других defensive примочек, а-ля bounds checking
·>Не точно также же. В проде bounds checking валит исключения
Да какая разница если у тебя в оттестированном и корректном коде не будет этих исключений?
То есть ты определись — либо у тебя код оттестирован и defensive programming не нужен, либо не оттестирован и ты тестируешь его на своих пользователях
EP>>>>С другой стороны, выключение части из проверок в runtime'е, ровно как и отсутствии часть проверок вообще — не делает программу некорректной.
EP>>·>Но только если ассерты расставлены корректно.
EP>>Что ты имеешь в виду? То что проверка внутри assert'а может иметь side-effect?
·>Да, и такое бывает, к сожалению.
Я уже сказал что это ловится тестированием и debug и release версий. Но встречается крайне редко — я видел подобное только когда человек не знал что такое assert.
EP>>·>Я что-то не понял что это. Судя по if (!condition)throw это не ассерты в понимании С++.
EP>>Там некоторые из них опциональные, и не попадают в Release.
·>Ух ты. Это как устроено? Что-то не могу разобраться...
Conditional
EP>>·>В unmanaged наоборот: когда может — работает правильно, и всегда быстро.
EP>>Не всегда быстро, только когда assert'ы отключены.
·>При релизном использовании отключены.
Совсем необязательно — я их видел в коммерческом продукте имеющем сотни миллионов установок
·>>>Есть конечно. Я говорю о корректности самого кода, а не логических ошибок в алгоритме.
EP>>В чём ты видишь отличие? Выход за пределы bounds это есть логическая ошибка, которой в корректном коде нет
·>Эта ошибка явно прописана в спеке языка
Да какая разница — это и есть логическая ошибка в твоём алгоритме.
EP>>>>P.S. Ничто не мешает оставить часть assert'ов включенных в Release. Для этого их обычно разбивают на классы "быстрые", "медленные", "очень медленные" — и уже пользователь библиотеки решает что попадёт в Release.
EP>>·>По-моему излишнее усложнение. Собственно на основании чего пользователь будет принимать решение?
EP>>1. На основании того какое быстродействие его устраивает
·>Чем быстрее, тем лучше, очевидно.
Совсем не очевидно, ибо это не единственный критерий.
EP>>2. На основании того насколько корректен его код (здесь речь идёт про библиотеку и пользовательский код, ассерты внутри библиотеки могут ловить ошибки в пользовательском коде).
·>Конечно, корректен, я что ламер некорректный код писать?
Тогда тебе и не нужен никакой defensive programming
·>А ты как корректность своего кода оцениваешь?
Зависит от конкретного случая — различные комбинации unit/integration тестов, разбиение на классы эквивалентности, поиск изоморфизмов, assert'ы на пред/пост-условия и ванрианты/инварианты, доказательства. Вот до чего пока не доходил, так это до выражения доказательств на формальных языках и их дальнейшей автоматизированной проверки.
·>А вообще для этого сценария придумали логи и кастомизируемые (в т.ч. в рантайм) уровни логгирования. Ассерты тут пихать не надо.
А причём тут логи? Если у тебя условие assert'а сфейлилось — то дальше всё может полететь в тартарары, и лучше всего пристрелить такую программу.
EP>>более того — для формально верифицированного кода они не нужны.
·>Для формально верифицированного их разве кто-то пишет?
Я имею в виду то, что после того как есть результат формальной верификации, можно их выключить и это никак не повлияют на корректность.
EP>>·>Если медленно — это уже проблема алгоритма.
EP>>Это ещё почему?
·>Точнее не так. Если медленно, то можно перенести ассерт в юнит-тест.
Sinix выше правильно заметил — assert'ы отрабатывают во время всех тестов, как юнит, так и интеграционных, и поэтому есть приличный шанс того что они поймают баг пропущенный непосредственно юнит-тестированием.
Более того, юнит-тест конкретного компонента может успешно пройти при наличии бага, или например двойного бага — то есть false positive. При этом внутренний assert мог поймать эти баги на этом же прогоне. То есть assert'ы это отличное дополнение unit-тестов.
EP>>·>При хорошем покрытии тестами ценность ассертов падает до нуля.
EP>>Точно также как и ценность других defensive примочек, а-ля bounds checking
·>Не точно также же. В проде bounds checking валит исключения
Да какая разница если у тебя в оттестированном и корректном коде не будет этих исключений?
То есть ты определись — либо у тебя код оттестирован и defensive programming не нужен, либо не оттестирован и ты тестируешь его на своих пользователях
EP>>>>С другой стороны, выключение части из проверок в runtime'е, ровно как и отсутствии часть проверок вообще — не делает программу некорректной.
EP>>·>Но только если ассерты расставлены корректно.
EP>>Что ты имеешь в виду? То что проверка внутри assert'а может иметь side-effect?
·>Да, и такое бывает, к сожалению.
Я уже сказал что это ловится тестированием и debug и release версий. Но встречается крайне редко — я видел подобное только когда человек не знал что такое assert.
EP>>·>Я что-то не понял что это. Судя по if (!condition)throw это не ассерты в понимании С++.
EP>>Там некоторые из них опциональные, и не попадают в Release.
·>Ух ты. Это как устроено? Что-то не могу разобраться...
Conditional
Conditional methods allow developers to create methods whose calls can be placed in the code and then either included or omitted during compilation based on a preprocessing symbol.
EP>>·>В unmanaged наоборот: когда может — работает правильно, и всегда быстро.
EP>>Не всегда быстро, только когда assert'ы отключены.
·>При релизном использовании отключены.
Совсем необязательно — я их видел в коммерческом продукте имеющем сотни миллионов установок
·>>>Есть конечно. Я говорю о корректности самого кода, а не логических ошибок в алгоритме.
EP>>В чём ты видишь отличие? Выход за пределы bounds это есть логическая ошибка, которой в корректном коде нет
·>Эта ошибка явно прописана в спеке языка
Да какая разница — это и есть логическая ошибка в твоём алгоритме.
EP>>>>P.S. Ничто не мешает оставить часть assert'ов включенных в Release. Для этого их обычно разбивают на классы "быстрые", "медленные", "очень медленные" — и уже пользователь библиотеки решает что попадёт в Release.
EP>>·>По-моему излишнее усложнение. Собственно на основании чего пользователь будет принимать решение?
EP>>1. На основании того какое быстродействие его устраивает
·>Чем быстрее, тем лучше, очевидно.
Совсем не очевидно, ибо это не единственный критерий.
EP>>2. На основании того насколько корректен его код (здесь речь идёт про библиотеку и пользовательский код, ассерты внутри библиотеки могут ловить ошибки в пользовательском коде).
·>Конечно, корректен, я что ламер некорректный код писать?
Тогда тебе и не нужен никакой defensive programming
·>А ты как корректность своего кода оцениваешь?
Зависит от конкретного случая — различные комбинации unit/integration тестов, разбиение на классы эквивалентности, поиск изоморфизмов, assert'ы на пред/пост-условия и ванрианты/инварианты, доказательства. Вот до чего пока не доходил, так это до выражения доказательств на формальных языках и их дальнейшей автоматизированной проверки.
·>А вообще для этого сценария придумали логи и кастомизируемые (в т.ч. в рантайм) уровни логгирования. Ассерты тут пихать не надо.
А причём тут логи? Если у тебя условие assert'а сфейлилось — то дальше всё может полететь в тартарары, и лучше всего пристрелить такую программу.