?

Log in

No account? Create an account
November 2016   01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
cartoon

Инструмент планирования - notepad (2)

Posted on 2011.01.05 at 15:29
Tags:
В прошлой части была описана базовая текстовая нотация и семантика декларативного плана. Базовая нотация, в принципе, уже вполне годна для разработки структуры плана - WBS. Но в плане нет конкретных времен! Более того - и действий тоже нет! Как же быть?

На самом деле, декларативное планирование, несмотря на простоту, по своей выразительной силе превосходит сетевой график, который является частным случаем данного плана. Достаточно ввести в план временные задержки. В этом посте я покажу, как это делать, и продемонстрирую связь с сетевым графиком.


[осторожно, наброс умняка! Можно пропустить без ущерба для изложения]
И кстати - строя план в ее терминах, вы, сами того не зная, оперируете линейной темпоральной логикой, которая лежит в основе семантики такого плана. Я специально не давал на это отсылок, ибо знать это может и прикольно, но совсем не обязательно. Так же, как не обязательно знать лямбда-исчисление, чтобы программировать на функциональных языках.

Чем линейная темпоральная логика отличается от обычной человеческой, и что это вообще за нах? Тем, что в состав гражданских логических операций добавлена пара "однажды случится событие(логическое условие, когда оно станет истинным, тогда и случится)", и "событие А произойдет не позднее, чем Б". Что мы и сделали. С одним нюансом - мы работает с условиями событий, которые однажды став true, навсегда таковыми и останутся. Такова природа проектной деятельности.

План, таким образом, представляет собой логическое утверждение. О том, что свойства "мира" будут меняться вот в такой последовательности. Каждое событие - это утверждение, что "однажды мир станет таким". Логическое условие его наступления мы заменили простым чеклистом - все галки стоят, значит true. Вот и все.

Именно потому, что план является логическим утверждением, появляется возможность его _проверять_. И дерьмовый план видно сразу.

Однако, в нашем плане нет конкретных времен. Чтобы их ввести - мы перейдем от линейной темпоральной логики к интервальной, где у "стрелок" добавляется условие. Например, "событие А произойдет не ранее, чем за 5 дней до Б".

А теперь забудьте, что я здесь написал, и читайте дальше.
[/умняк]

В этот раз начнем с другого конца, и посмотрим внимательно на задачу-активность, которых, как известно, в декларативном плане нет.

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

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

|Начало
=>
|Конец


Теперь самое время познакомится с важным правилом нотации. Событие может не иметь названия, но должно иметь хотя бы один пункт в чеклисте, иначе оно имеет [пустое] условие, которое всегда истино, и событие, таким образом, _уже_ произошло. Название служит только для ссылок на заданное чеклистом событие. То есть, что? А вот что:

|[]Начало
=>
|[]Конец


И мы сразу видим, что условия в чеклисте какие-то херовые. Когда мы готовы идти в магазин за продуктами? Когда у нас будут деньги, не так ли?

|[] Имеется 100 рублей.
=>
|[] Куплены продукты к новому году.


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

У задачи есть длительность, а здесь ее нет, так что пока это хуже, чем задача. Как мы введем длительность? Мы введем ее, наложив ограничение на временную связь. Вот так:

|[] Имеется 1000 рублей.
=> 1 час
|[] Куплены продукты к новому году


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

Ах да, на задачу ведь можно назначить исполнителя. А здесь как это делать? А вот так:

|[] Имеется 1000 рублей.
=> 1 час/Вася
|[] Куплены продукты к новому году


Что означает - не менее часа, при условии наличия этого часа в очереди "Вася". Мы не оперируем понятием "ресурсов", вместо этого у нас "очереди". В очередях есть время. И каждая очередь сама знает, каким образом она выделяет время. В простейшем случае, как здесь, очередь - это одна тупая очередь для одного человека, и выделение времени из нее происходит строго последовательно. Но это реально простейший случай. На самом деле, в очередях таится великая сила, раскрывать которую пока рановато. Но пытливый ум может включить фантазию, и догадаться.

[умняк] С очередями мы вышли за рамки интервальной темпоральной логики, теперь у нас свой, более продвинутый ее подвид.[/умняк]

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

|[] Имеется 1000 рублей.
=> 1 час/Вася
|[] Куплены продукты
|[до] 1 января 2011


Вот так. Тока эта - купленные продукты надо успеть приготовить. И вообще.

|[] Дома имеется 1000 рублей. 
=> 1 час/Вася
|[] Купленные продукты доставлены домой
|[] Сдача, сцуко, тоже доставлена домой, ибо нехрен
=> 3 часа/Маша
|[] Приготовлены салаты оливье
=> 15 мин
|[] Накрыт стол
|->
   |[] Пришли гости
   |[от] 21:00 31 декабря 2011
=>
|[] Все сидят за столом
|[] Приготовлены шампанское и бокалы 
|[до] 23:50 31 декабря 2011


Как-то вот так. Так что же в декларативном планировании является "задачей"? Любая группа событий, уважаемые коллеги. Не обязательно два. И не обязательно связанных между собой временными ограничениями.

Такие дела. Но это все ерунда. Самое интересное - впереди. Это, например, "задачи", a.k.a. "процессы", параметризуемые списками. Забавная такая штука, я вам скажу :). Позволяет отделить прогнозы сроков и списки фич-модулей от описания структуры плана-процесса, так, что система выполнит пересечение автоматически. :) Клевое свойство, правда? :)

Однако, даже описанная "ерунда" позволяет мне сейчас разрабатывать планы в текстовом редакторе. Удобно. Даже без инструментальной поддержки. Рекомендую.

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

Кстати, Kenneth Iverson говорит о том же в своей тьюринговской лекции "Notation as a tool of thought"
http://www.jdl.ac.cn/turing/pdf/p444-iverson.pdf

Поэтому я и уделяю основное внимание нотации. Это важно. Остальное второстепенно.

Засим - прощаюсь. Мне, видите-ли, надо заколбасить просто херову тучу годных планов :), и написание этой пары статей - типичнейшая прокрастинация. :) Хоть они и являются определяющим руководством по "декларативному планированию" - это первоисточник.

Удачи в новом году, друзья!

Comments:


Иван Тищенко
t7ko at 2011-01-05 14:49 (UTC) (Link)
Хотелось уточнить семантику "стрелочки"

=>

Как её интерпретировать?

Например:

|[] A
|[] B
=> 1 час
|[] C
|[] D

Стрелочка и "1 час" -- это "свойство" у В? Или у группы "А и В"? Или может это свойство С? Или С+D? Или вообще это свойство всех ABCD сразу?

Я к чему: как в подобной нотации уяснить, какие из задач могут быть начаты в данный конкретный момент?

И как быть с сложными зависимостями?
A, B, C независимы
D зависит от А+С
E зависит от B+D
- Как этот план описать в предлагаемой нотации?
Gaperton
gaperton at 2011-01-05 16:57 (UTC) (Link)
В данном примере утверждается буквально следующее - однажды настанет момент, что будет одновременно выполнятся A и B. Не менее чем через час после этого настанет момент, когда одновременно выполнятся C и D.

Стрелка, строго говоря, не является свойством событий A&B и C&D. Это логическая операция.

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

Со сложными зависимостями покажу, когда доберусь до ноутбука. На телефоне нет вертикальной черты :). Если кратко - имя события используется как референс, и пишется справа от стрелок через вертикальную черту. С этим можно произвольный граф задать.
Gaperton
gaperton at 2011-01-05 21:53 (UTC) (Link)

Как этот план описать в предлагаемой нотации?

Раз:
|[]E
|<-
    |[]B
|<-
    |[]D
    |<-
        |[]A
    |<-
        |[]C


Два:
|[]D
|<-
    |[]A
|<-
    |[]C
=>    
|[]E
|<-
    |[]B


Три:


|[]A
=>
|[]D
|<-
    |[]C
=>    
|[]E
|<-
    |[]B
Gaperton
gaperton at 2011-01-05 21:55 (UTC) (Link)

Re: Как этот план описать в предлагаемой нотации?

Даже без референсов обошлось.

Интереснее когда в плане есть ромбики по зависимостям. Тогда придется залействовать референсы. Выглядит вот так:

|Root
|[]A
=>
|[]B
=>
|[]C
|<-
   |[]D
   |<- |Root
Gaperton
gaperton at 2011-01-05 21:59 (UTC) (Link)

Re: Как этот план описать в предлагаемой нотации?

Или так:

|[]A
|->
   |Branch
   |[]B
|->
   |[]D
   |->
      |[]C
      |<- |Branch


Впрочем, не обязательно все мутить в виде дерева. Пользуясь именами-референсами, можно все это довольно аккуратно разбить на линейные описания.
Gaperton
gaperton at 2011-01-05 22:02 (UTC) (Link)

Re: Как этот план описать в предлагаемой нотации?

Не-не-не. Немного не так.

Вот так:

|[]A
|->
   |Branch
   |[]B
|->
   |[]D
   |->
      |<- |Branch
      |[]C


Да. Ибо, ссылки и пункты чеклиста могут идти в любом порядке. А так - круче.
Inspiration book
insanegigolo at 2011-01-05 16:30 (UTC) (Link)

С новым годом!

Еще пара итераций и получится Erlang =)
(Deleted comment)
http://www.google.com/profiles/greyver at 2011-02-24 15:29 (UTC) (Link)
|[] Куплены продукты
|[до] 1 января 2011
...
|->
|[] Пришли гости
|[от] 21:00 31 декабря 2011


Гостей ждем от 31 декабря 2011, а продукты покупаем до 1 января 2011. За год еда испортится может.
Gaperton
gaperton at 2011-02-24 19:44 (UTC) (Link)
Все верно :). С другой стороны - в течении года гости уж точно подтянутся успеют :)
Viktor Korshunov
vekk at 2011-03-01 15:49 (UTC) (Link)
жжешь, как обычно, спасибо.
и тебе удачи, уже в этом году :)
pingback_bot
pingback_bot at 2011-07-04 15:13 (UTC) (Link)

[само]организация

User gds referenced to your post from [само]организация saying: [...] и посте2 [...]
Борись Tsema
Борись Tsema at 2013-08-19 12:51 (UTC) (Link)

просим продолжения

>Самое интересное - впереди. Это, например, "задачи", a.k.a. "процессы", параметризуемые списками. Забавная такая штука, я вам скажу :). Позволяет отделить прогнозы сроков и списки фич-модулей от описания структуры плана-процесса, так, что система выполнит пересечение автоматически. :) Клевое свойство, правда? :)

Правда клёвое)
Заинтриговали, напишете?

Previous Entry  Next Entry