Date: 2014-11-27 07:37 am (UTC)
From: [identity profile] besm6.livejournal.com
Вот я некоторое время назад подсел на Хаскель. Ключевое свойство - язык со строгой типизацией времени компиляции, но с выразительной системой типов. Вот там - вполне нормально. Почти все нетривиальные куски кода формулируются с помощью типов, и покрывать тестами остается пару-тройку мест, где реально посадить арифметическую ошибку или перепутать "меньше" с "больше".

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

Date: 2014-11-27 08:15 am (UTC)
abbra: (Default)
From: [personal profile] abbra
По аналогии переносить этот опыт на C, увы, сложно.

Date: 2014-11-27 08:44 am (UTC)
From: [identity profile] besm6.livejournal.com
На C, разумеется, нереально. Разве что посредством компиляции хаскеля в C (ghc так умеет, но с библиотеками, вероятно, будет немалый геморрой). Или посредством написания на хаскеле DSL и кодогенератора в C к нему, но это тоже немалый геморрой, я полагаю. Я поэтому стараюсь не писать на C. Пока получается :)

Date: 2014-11-27 08:46 am (UTC)
abbra: (Default)
From: [personal profile] abbra
Это я к тому, что FreeBSD не написан на хаскеле, так что аргументировать отсутствие тестов им сложнее.

Date: 2014-11-27 10:05 am (UTC)
From: [identity profile] besm6.livejournal.com
Ну почему, они могут сказать, что вот уже собираются переписать на хаскеле...

Как бы уже почти реально.

Вот аргументировать агдой будет сложнее. Хотя если бы удалось, там тесты вообще были бы не нужны, пруфчекер в комплекте. Но увы, говорят, что для взаимодействия с RealWorld агде пока приходится говорить "мамой клянус!".
Edited Date: 2014-11-27 10:07 am (UTC)

Date: 2014-11-27 10:08 am (UTC)
abbra: (Default)
From: [personal profile] abbra
Тебе попадались хоть какие-нибудь ядра ОС на хаскеле? House, по-моему, умер в 2009. Линуксовый эксперимент https://www.haskell.org/haskellwiki/Kernel_Modules тоже не обновлялся с 2009. Что еще есть?

Date: 2014-11-27 10:19 am (UTC)
From: [identity profile] besm6.livejournal.com
Мне притащили ссылку на Haskell Machine: https://github.com/GaloisInc/HaLVM

Это, конечно, не ядро ОС, но движение в нужном направлении.

Date: 2014-11-27 10:10 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
а зачем им аргументировать отсутсвием тестов?

Date: 2014-11-27 10:13 am (UTC)
abbra: (Default)
From: [personal profile] abbra
Отсутствием -- незачем. Доказывать, что тесты не нужны, потому что написано на языке икс или игрек, не получится.

Date: 2014-11-27 10:26 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
а зачем им это доказывать?

Date: 2014-11-27 10:29 am (UTC)
abbra: (Default)
From: [personal profile] abbra
Это у Аввы надо спрашивать, зачем ему покрытие тестами везде.

Date: 2014-11-27 10:34 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
снобизм.
да. именно снобизм.
причем программиста из компании с немерянным бюджетом и неадекватным ЧСВ.
и нет, я не про то, что тесты не нужны.
но написание тестов -- тоже требует ресурсов.
и если ты не гугл, то у тебя выбор -- или сделать новую фичу (даже, наеврное 3-4 новых фичи) или сделать тесты на старую фичу. в любом случае ты проиграл.

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

Date: 2014-11-27 10:48 am (UTC)
abbra: (Default)
From: [personal profile] abbra
Именно. С другой стороны, если писать что-то новое, то все же практика обкладывания тестами и документацией скорее доброе дело, чем снобизм.

(no subject)

From: [identity profile] http://users.livejournal.com/_slw/ - Date: 2014-11-27 11:51 am (UTC) - Expand

Date: 2014-11-27 10:39 am (UTC)
From: [identity profile] rmrfchik.livejournal.com
Типы не ловят логические ошибки. Хаскельными типами не выразишь, что sort возвращает отсортированный по возрастанию список.

Date: 2014-11-27 11:52 am (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
а уж ошибки в тз или ошибки прочтения тз...

Date: 2014-11-27 03:00 pm (UTC)
From: [identity profile] besm6.livejournal.com
А вот их, кстати, часто ловят. Когда начинаешь строить систему типов для прочитанной задачи и видишь, что получается какая-то корявая фигня, идешь уточнять, и находишь ошибку. Были случаи.

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

Date: 2014-11-27 02:57 pm (UTC)
From: [identity profile] besm6.livejournal.com
Скорее всего, уже можно выразить, если копнуть в область зависимых типов, в той мере, в которой ghc их уже научился.

Но так вот сходу не поручусь, я туда только издалека заглядывал.

Date: 2014-11-28 07:31 am (UTC)
From: [identity profile] rmrfchik.livejournal.com
Не все знания о системе можно запихать в зависимые типы.
Тем более знания о взаимодействии с внешним миром.
Собственно, типы и прочий текст программмы следует рассматривать с точки зрения "что мы сделали", а тесты с точки зрения "что мы хотели".
Ощибки могут быть и там и там, и хотеть мы можем странного и сделать по кривому.
Но имея два взгляда на одну проблему легче поймать ошибки.

Date: 2014-11-29 07:28 pm (UTC)
From: [identity profile] thesz.livejournal.com
Вот какие сведения о системе нельзя запихнуть в зависимые типы? Особенно знания о взаимодействии с внешним миром.

Вот какие?

Date: 2014-11-29 09:34 pm (UTC)
From: [identity profile] rmrfchik.livejournal.com
thesz зачем-то скрыл комментарий, отвечаю в пустоту.
Возьмём, к примеру, Oracle, с которым общается наша программа. Посредством sql, который поверх net8, который поверх tcp, который поверх ip, далее ethernet, всякая физика и лирика в виде сетевых карточек.
В каком состоянии должна находиться вся эта конструкция, чтобы мы могли сделать select? И что мы можем получить в ответ? Какие возможные состояния у этой конструкции?
Должны ли мы предусмотреть просто реакцию на ORA-? Что происходит с коннектом после ошибки? А после таймаута? Не придётся ли нам воспроизвести в программе модель всей этой машинерии или мы будем упрощать?
А как мы будем упрощать? Можно свести всё безумное состояние к паре Ok,Fail. Ну, или, к 3-4-10 более понятным состояниям.
Насколько это упрощение верно отражает наш замысел?
А верно ли мы поняли всю внешнюю модель?
Всё это зависимыми типами не выразить, мы вынуждены сильно упрощать.А когда мы упрощаем, нам нужны тесты, чтобы убедиться, что упростили верно.

Date: 2014-11-30 03:35 am (UTC)
From: [identity profile] thesz.livejournal.com
Скрытие комментариев - свойство сего блога. Видимо, комментарии не от друзей скрываются.

Ответ прост - нам не надо воспроизводить и/или перечислять все возможные состояния внешней системы. Достаточно отклассифицировать их настолько, чтобы было удобно.

Да, здесь нужны тесты. Но 1) мы и работаем с системой, что не имеет зависимых типов и 2) тесты будут высокоуровневыми, функциональными.

Date: 2014-11-30 10:06 am (UTC)
From: [identity profile] thesz.livejournal.com
1. Это важно при работе с юнитами с состоянием и (вот здесь очень важное) со слабой системой типов.

2. Рефакторинг не вносит нового функционала и не исправляет старые оошибки (он должен их сохранить - функционал не меняется). Это практически бесполезная деятельность.

3. Поскольку я имел счастье работать с системами без юнитов с состоянием и с хорошей системой типов, я уже не могу прорезонировать с вашим посылом.

Date: 2014-12-01 11:56 am (UTC)
From: [identity profile] thesz.livejournal.com
Из этого можно заключить, что вы согласны с моими пунктами. Я редко встречаю столь ярко выраженное одобрение, поэтому на некоторое время растерялся.

Большое спасибо за вашу поддержку.

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 12:04 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 12:20 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 01:02 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:18 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:37 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:49 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 11:50 am (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-01 05:45 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 11:47 am (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 12:20 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 12:29 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 12:36 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 01:04 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 01:24 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 01:43 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 03:03 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 03:34 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 03:37 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 03:40 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 03:49 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 06:51 pm (UTC) - Expand

(no subject)

From: [identity profile] rmrfchik.livejournal.com - Date: 2014-12-02 08:58 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:20 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:40 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:54 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:35 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-01 02:51 pm (UTC) - Expand

(no subject)

From: [identity profile] thesz.livejournal.com - Date: 2014-12-02 11:52 am (UTC) - Expand

Profile

tobotras: (Default)
tobotras

December 2024

S M T W T F S
123 4567
891011121314
15161718192021
22232425262728
293031    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 13th, 2026 02:08 am
Powered by Dreamwidth Studios