суббота, 5 декабря 2009 г.

Жизнь идеи. Зачем.

Что такое идея?

  1. Идея содержит в себе задачу (цель, потребность).

  2. Идея подразумевает порядок достижения цели (укрупнённо).

  3. Особенности достижения как спутники на пути к цели.

  4. Применение идеи: где? Предложить, исходя из реальности на данный момент времени.


Аудитория делится на тех, кто выдаёт идеи (генераторы), и тех, кто доводи их до внедрения (реализаторы). Первые на реализацию не способны, или имеют чёткую установку: я - идею, а кто-то другой - результат.

вторник, 1 декабря 2009 г.

К вопросу о планировании

Немного философии на тему...

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

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

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

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

среда, 5 августа 2009 г.

Движение от макета к сценарию.

Функции программного обеспечения начинаются с интерфейса. Если бы было иначе, то он [этот самый интерфейс] был либо перегружен ненужными элементами управления, либо не давал представления о решаемой программой задаче. Поэтому вполне логично начинать движение именно с него.

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

Это - последовательность шагов или функциональных блоков (для тех, кто знаком с теорией управления), каждый из которых имеет входную, выходную последовательности, функцию (человеко-ориентированную). Более того, сценарий может и не иметь вида строгой линейной цепочки. Он может ветвиться на независимые во времени функции (как, например, в случае арифметических операций). Имея такие элементарные функциональные блоки, объединяя их в подсистемы, можно переходить собственно к архитектуре ПО, а далее уже к программной реализации.

Функции ПО: их роль.

Та или иная программа реализует некоторый набор функций. Это очевидно с позиции пользователя. С точки зрения программиста пользовательская функция представляется в виде структуры функций более мелких (вспомогательных), нередко обёрнутых в классы и интерфейсы. Для пользователя набор ему полезных функций растёт - таков уж он, подавай всего и сразу. Для программиста, который реализует все требования пользователя, расширение возможностей программы связано с увеличением числа его языковых функций (и, следовательно, числа классов и интерфейсов). Последние переплетаются под гнётом изобилия программного комбайна, делают проект запутанным, неповоротливым и мало пригодным для изменений.
Чтобы этого избежать нужно сделать следующее:

  1. Ограничить пользовательскую функциональность (заострить внимание на приоритетных вопросах, поскольку автоматизировать всё не имеет смысла; автоматизации подвергается лишь самое трудоёмкое).

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


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

суббота, 20 июня 2009 г.

Справка по git.

Кому-то (например, мне :)) будет интересно более тесно познакомится с git'ом, распределённой системой по контролю версий.

Посему привожу некоторые справочные ресурсы:

GitReady.com (для новичков и не только)


Git Community Book (ещё подсказки; теперь в формате книги)

Gitorious.com (хостинг opensource проектов)

четверг, 28 мая 2009 г.

Я заперт в клетке, которую построил Сам...

Я заперт в клетке, которую построил
Сам,
Схвачен стражниками, которых создаю
Каждый день,
Осуждён судьями, сидящими
Во мне,
Приволочен в камеру
Собственными руками,
Я - и тюрьма, и тюремщик,
И узник,
Сам себя запер
Внутри себя,
В кругу себя, который называю
Собой,
В кругах кругов
Только моих
Мы встретили Создателя, и Он - это Мы.

Люк Рейнхард, Трансформация

От экзистенциализма к прагматизму и ...

Хочу разобраться (ну или попытаться) вот в каком вопросе. Человек ответственен? За свои поступки и за мнения, которые складывают о нём другие люди (семья, друзья, враги и т.д.)?

среда, 27 мая 2009 г.

Про программирование и Enterprise в частности.

Редко случается наткнуться в сети на что-то, во-первых, здравое, а во-вторых, красивое. Так, например, случилось сегодня. The Enterprise is Broken - шедевр, подымающий один из вечных вопросов - столкновение личных ценностей с необходимостью подстраиваться под требования цивилизации. Разработчик ПО, охваченный страстью создать  новое, прекрасное, важное, словно художник, готов работать над своим детищем и днём, и ночью.  Для него это порыв, устремление вперёд, часть жизни и не второстепенная. Но зачастую эта часть существует отдельно от повседневных реалий. Автор утверждает, что Enterprise обезличен, находится в упадке. И всё потому, что люди не связывают свои устремления с ним. Для программиста работа в этой сфере связана со скукой, рутиной, страданиями. Нет вызова - нет ответа на него. Прозябание в повседневности. Какой же выход? Научится совмещать собственные устремления, цели, установки с корпоративными. И поэтому, наверняка, мы видим сейчас внедрение так называемых гибких (agile) методологий разработки ПО (по части менеджмента - Scrum; по части инжениринга - XP). Но самая суть - понять, что любое начинание достигает успеха только в том случае, когда отдаёшься ему полностью, без остатка. И это осознание приводит к выводу: невозможно отдаться одинаково полностью любому проекту, в любой организации, в любом коллективе. Такое возможно лишь при соблюдении определённых условий, которые уникальны для конкретной ситуации, индивидуальны для группы или даже человека. Все разные, поэтому ошибкой будет навязывание статичной модели разработки (да и организации в целом) каждому проекту, под копирку.

понедельник, 25 мая 2009 г.

Программирование на основе прототипов (prototype): понятие, смысл.

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

воскресенье, 24 мая 2009 г.

Clojure: туториал по внедрению в массы ФП-программистов.

Императивщине привет! Приверженцы ООП, у вас есть шанс перебежать на сторону ФП. Например, воспользовавшись туториалом , вводящим в дебри Clojure - сравнительно молодого языка для виртуальной машины Java. С одной стороны вы можете использовать все существующие библиотеки, а с другой  - комбинировать подходы программирования там, где это необходимо. В тексте приводятся модели использования переменных, списков, классов, сборок. В целом - отправная точка для прогрессивного Java-программиста.

Функциональное программирование: обучить легко!

Очень интересный пост воссоздал Джек Коф по следам научения своего восьмилетнего сына программированию. Начал он - что наиболее отрадно - с функционального подхода.  Испытывалось обучение на ребёнке, но сама концепция, поданная в очень доступной форме, может сыграть на руку и взрослому человеку, который хочет проникнуться функциональной идеей.

Я попытаюсь кратко пробежать по всем ярким эпизодам "учебного процесса".

среда, 20 мая 2009 г.

Средненький от хорошего: есть отличия?

Речь о разработчиках ПО. Животрепещущая тема: разглядеть посредственность или мастера своего дела.

понедельник, 18 мая 2009 г.

Изменение размеров поля textarea - вторая редакция.

Ранее я писал о принципе увеличения высоты поля textarea в зависимости от набранного текста. Зачем это нужно? Всегда приятнее видеть весь набранный (или скопированный) текст целиком, не задействуя прокрутку полей (фактически вторую, так как скроллинг самой страницы никто не отменял). Наблюдая картину целиком (или близко к тому), оценив объем и формат, можно с лёгкой душой приступать к опубликованию.

воскресенье, 17 мая 2009 г.

Скрипт блога на scheme (код. название VBSX): первый шаг сделан

Какая стояла задача?
В любых скриптах (будь то блог или система управления контентом) разделяют административную часть и клиентскую. Написание новых сообщений осуществляется в своём окружении, независимо от конечного представления. С одной стороны это понятно: стилистически легче поменять дизайн (шаблон) сайта, не затрагивая админку. Но меня такое положение дел не очень устраивает, и вот почему. Представим, например, типичную ситуацию написания сообщения. Что вы видите? Поля ввода для заголовка, текста сообщения, тегов и прочего малозначительного. Более - ничего. Какая-то изолированность: ни подглядеть что уже написано тобою ранее, ни сослаться на определённые сообщения, набранные по теме. Приходится совершать лишние движения, а там уже и нить мысли потерялась.

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

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

Итак, во главе угла подход, его развивать я и буду в дальнейшем. А потому ничего грандиозного не намечается. Скрипт блога будет наипростейшим: один пользователь, сообщения+категории+теги+комментарии. Писать буду (продолжать) на scheme.

Что сделано?
А сделано ровно вот что:

1) Предметная область включает собственно сообщения (дата, название, тело), комментарии (дата, ссылка-на-сообщение, автор, домашняя страница, почтовый ящик, тело).
2) Для каждой сущности там где это необходимо реализованы операции: создание (сообщение, комментарий), чтение (сообщение, комментарий), изменение (сообщение), удаление (сообщение, комментарий).
3) На типичной странице для каждого блока информации (например, блок сообщения) имеются ссылки на операции из п.2
4) Почти все операции реализуются с помощью использовании технологии Ajax (фреймворк - prototype). Подгрузка данных и форм редактирования происходит порционно и в фоне.
5) Поля textarea растягиваются при вводе, что позволяет видеть весь набранный текст целиком.

Ниже изображены скриншоты работающего блога:

Создание нового сообщения
При создании сообщения подгрузилась форма с полями Заголовок и Тело
При создании сообщения подгрузилась форма с полями Заголовок и Тело




Редактирование сообщения

Подгруженная форма заполнена существующими данными
Подгруженная форма заполнена существующими данными




Представление сообщения (генерируется сообщение и относящиеся к нему комментарии)

Само сообщение и список относящихся к нему комментариев
Само сообщение и список относящихся к нему комментариев




Создание комментария

Форма для комментария включает автора, его домашнюю страницу, почту и сам текст комментария
Форма для комментария включает автора, его домашнюю страницу, почту и сам текст комментария



Какие планы?
Второй технический релиз внесёт новшества в виде: (а) категорий и (б) построения страниц (и блоков) на основе шаблонов. Кроме того в голову пришла мысль о динамической подгрузке более ранних сообщений (которые изначально не видны) внизу страницы: задействуя либо скроллинг, либо какой-нибудь элемент управления. То есть было бы неплохо сделать так: скролишься вниз, а там появляются ранее написанные сообщения (совсем как в Google Reader).

Кому интересно, вот тарбол.

пятница, 15 мая 2009 г.

ООП: король умер, да здравствует...

Предпосылки. Всё ли вас устраивает в объектно-ориентированном программировании (ООП)? Все ли трудности разрешаются? Эти трудности случайно не являются следствием того, что подход ООП неверен, другими словами: какова переносимость человеко-ориентированного понимания проблемы на семантику ООП? Что у него лишнее, неправильное?

Девиз дня

Человеческий разум по своей склонности легко предполагает в вещах больше порядка и едино­образия, чем их находит. И в то время как мно­гое в природе единично и совершенно не имеет себе подобия, он придумывает параллели, соответствия, отношения, которых нет…

Ф. Бэкон

четверг, 2 апреля 2009 г.

Социальное. Тезисный взгляд.

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

1. Люди разные.
2. Деление на сообщества неизбежно.
3. Сообщество несёт мысль, девиз, принцип, закон, etc.
3' Создать сообщество без девиза равносильно провалу.
3'' Успех сообщества - в правильно выбранном и корректно сформулированном девизе.
3''' Девиз - цель.
3'''' Достижение цели должно вызывать повторное движение к этой цели ("Я знаю только то, что ничего не знаю").
4. Сообщество основано на доверительных отношениях.
5. Сообществу необходимы авторитеты.
6. Сообщество - средство (само)выражения членов.
7. Цель сообщества - производство.
8. Сообщество ограничено законами.
9. Законы могут быть нарушены.
10. Всякое нарушение закона - явление самореализации члена (группы) сообщества.
11. Активность регулируется законом.

Социальные сети как каркас социальных взаимоотношений

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

Самым загадочным аспектом социальной структуры является доверие. Доверие устанавливает подлинность, неискажённость человеческих отношений. Установление отношений связано с понятием индивидуальности: люди, как элементы механизма реализации доверия, составляют ту основу с её уникальными и разносторонними качествами, которая выдерживает натиск недосказанностей, сомнений, разочарований, как в реальной жизни, так и в виртуальной. Индивидуальности совмещаются в едином информационном пространстве, запускается процесс взаимообогащения. В реальной жизни механизм известен, подобен необходимости. В жизни on-line немного иначе. Здесь нет принуждения, нет острой потребности, здесь лишь желание самоутверждения, познания (в меньшей степени).

Итак, человек находится в виртуально сформированном мире. Запускается процесс открытия. Начинают с того, что дают вводную информацию о себе, своей биографии, фактах. В целом, речь идёт о профиле. Но профиль вещь специфичная, аспектная. С одной стороны могут освещаться профессиональные данные человека, с другой - интимные. Именно это порождает многообразие социальных сетей (ориентация на бизнес, развлечения). Вторым после профилирования следует явление присутствия: выражение своих мыслей, желаний, побуждений. Взаимодействие с другими порождает ответную реакцию, корректировку своих мыслей, желаний. Вот здесь можно перейти к активности. Именно активность, то есть работа на чётко обозначенную группу людей (объединённых по каким-то признакам), ради аудитории (или скорее на неё), выражает направление движения человека, его цель, средства, методы. Какие, например, возможны варианты активности? Во-первых, обмен информацией, выраженный в файловой форме. Он объединяет по потребностям, поэтому его можно назвать отправной точкой активности, которая со временем будет только нарастать. Во-вторых, собственно коммуникация (общение), которое есть аналог реальной жизни: происходит передача знаний или суждений. Наконец, высшей формой активности можно назвать сотрудничество. Оно построено исключительно на действиях, на выполнении совместных проектов, направленных на получение чётко очерченных результатов.

А когда присутствие обозначено? Запускается параллельный процесс - генерирование репутации человека. Очевидно, что на одних словах репутация быть основана не может (исключение - плохая репутация). Она - плод труда, который оценен по достоинству. Оценивающей стороной выступает сообщество (или группа), в которую входит человек. Показателем же репутации могут выступать всевозможные топы, рейтинги. А созданы они для поддержания активности.

Внутренне взаимоотношения - многоцелевые. То или иное сообщество задаёт определённое направление и ритм. Например, twitter провозглашает цель как "Мне интересно (чем ты сейчас занят)". Но цели могут дробиться даже внутри определённого сообщества. Это объясняет другими участниками и их ролью для конкретного человека. Именно поэтому появляются такие объединения пользователей как "семья", "друзья", "контакты" (остальные). Особое значение приобретают нормы, закреплённые за социальной сетью. Поддержание порядка и регуляция (даже саморегуляции) - первоочередная задача администрации. Зачем она? Наверно, для того же самого, для чего правительство в оффлайне.

А что насчёт людей? Каждому человеку свойственны личные желания, потребности, которые его ведут по пути реализации. Кто-то реализуется ярко, кто-то незаметно, но каждый хочет. Человек может в одно время быть заметным, в другое - скрытым; вовлечённым в обсуждение или уединённым. Примером его вовлечённости и публичности могут быть комментарии (на определённые новости), а скрытность реализуется в игнорировании знаковых событий. Подобно городу с его микрорайонами возникают социальные сети с явно обозначенными сообществами, которые эмулируют реальность. Вот только не полностью.

Что в сумме? Социальная сеть держится на доверии (вынужденном ли, приобретённом), а составляют её люди, которым нужна аналогия реального мира (а именно - правила; следствия могут быть другие).

The Elements of Social Architecture

понедельник, 30 марта 2009 г.

Проект vbsx. Наброски архитектуры.

Постановка задачи

Ниже будет рассмотрена вольная интерпретация архитектуры MVC (Модель-вид-контроллер), применительно к скрипту блога. Сам блог ещё не существует, а его создание предполагается начать от уровня представления. Здесь описывается конкретный подход к реализации взаимодействия между сервером и собственно страницей (в браузере) с применением технологии Ajax. Будут рассмотрены основные сценарии.

1. Серверная сторона

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

1.1 Модель


Модель реализует работу с базой данных, предоставляет элементарные действия по включению, чтению, изменению экземпляров сущностей.
Предметная область включает (для рассматриваемого случая): сообщение (заголовок, тело, другие поля); комментарий (тело). Сообщение имеет некоторое количество комментариев.

1.2 Контроллер


Контроллер рассматривается как диспетчер, принимающий запросы и формирующий ответы. Каждый запрос (за исключением некоторых) трансформируется в отклик, который содержит блок данных. То есть он не формирует всю страницу целиком, а отсылает порциями. Эти порции информации уже на уровне представления распределяются по странице (c использованием JavaScript). Отмечу, что блоки информации, отсылаемые клиенту даются в HTML-нотации, поэтому происходит некоторая подмена понятий. Контроллер, который использовал бы XML-нотацию или JSON был бы полноценным контроллером. А так... В общем выбран путь наименьшего сопротивления, так как проект не ориентируется на архитектурную эволюцию и конечную универсальность.

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

2. Уровень представления


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

2.1 Технология Ajax


Ajax именно этим и занимается. Выбор фреймворка не принципиален (я использую prototype). На уровне представления необходимо реализовать ряд операций, которые завязаны на отправке запросов.

2.2 Операции

Создание
Сообщение - createPost()
+ Запрос формы под новое сообщение - getFormForNewPost()
Комментарий - createComment()
Чтение
Список сообщений - getPosts()
Сообщение - getPost(post_id)
Список комментариев - getComments()
Обновление
Сообщение - updatePost(post_id)
+ Запрос формы, содержащей сообщение - getFormForPost(post_id)
Удаление
Сообщение - deletePost(post_id)
Комментарий - deleteComment(comment_id)

2.3 Структура страницы и сфера ответственности методов


Примерная структура страницы для сообщений (стрелкой показано, какая функция заполняет/изменяет блок; буквой "x" обозначается идентификатор сообщения):

← getFormForNewPost()← getPosts(), createPost()← getPost(post_id), deletePost(post_id)← getFormForPost(post_id)← updatePost(post_id)

Фрагмент структуры для комментариев:

← getComments(), createComment()← deleteComment(comment_id)

3. Требования к уровню контроллера


Контроллер должен иметь соответствующие функции, которые возвращают блоки. А именно: нужно однозначно определить адреса этих функций:

// postsvar url_posts_read = ''; // скрипт получения всех постов блогаvar url_post_create = ''; // скрипт создания блока сообщения (+ передача ему атрибутов нового сообщения)var url_post_read = ''; // скрипт получения блока сообщения (требуется идентификатор записи)var url_post_update = ''; // скрипт редактирования сообщения (+ передача изменённых атрибутов сообщения)var url_post_delete = ''; // скрипт удаления сообщения (требуется идентификатор записи)var url_post_form = ''; // скрипт получения формы сообщения (атрибут new=1 создаётся для принятия пустой формы; атрибут pid=x - для заполненной формы)
// commentsvar url_comments_read = ''; // скрипт получения всех комментариев для сообщения (требуется идентификатор записи)var url_comment_create = ''; // скрипт создания нового комментария (+ передача атрибутов комментария)var url_comment_delete = ''; // скрипт удаления комментария (требуется запрос с идентификатором комментария)var url_comment_form = ''; // скрипт получения формы комментария

пятница, 27 марта 2009 г.

Unix way + ООП: постановка вопроса

Unix way гласит: "Write small simple things that do one thing well". Интересна мне не сама постановка, а то, к чему привести может следование этому пути. В компост можно добавить также слова Robert C. Martin'а: "Functions should do one thing. They should do it well. They should do it only."

Сначала об очевидном. Программа, как система - традиционно сложное изваяние, исправлять недостатки которой затруднительно, добавлять новые функции тем паче. Как вариант можно разбить программу на маленькие составляющие, каждая из которых имеет свою сферу ответственности. Встаёт вопрос: "А как осуществлять взаимодействие разрозненных частей?"

Тестирование. В современных методологиях разработки программного обеспечения этот пункт ключевой, даже опорный. Тестировать проще маленькие модули. Причём, особое значение приобретают зависимости между модулями: что если они кольцевые? Такого нужно избегать; даже ценой полной переработки (рефакторинга). Функционально законченные модули - это хорошо. В идеале зависимости должны иметь односторонний характер (если рассматривать всю систему, то структура её приобретёт вид направленного ацикличного графа). Можно даже аналогию провести, например, с простой арифметической последовательностью действий: 1 + (4-6*7) - на самом низком уровне будет расположено умножение; выше - вычитание; наверху - сложение. Если это изобразить на листе бумаги, получится древовидная карта вычисления. Наподобие этой карты будет выглядеть эталонная архитектура программы. Кстати замечу, что "unix way" тут раскроется во всей красе.

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

Вопрос. Хорошо ли соотносится модульная структура с парадигмой ООП? Пакеты, модули, классы, методы (классов) подходят к "unix way"? Речь не идёт о множестве программ (уже готовых) и их объединении, речь идёт о разработке конкретной программы и подходе к разработке (деление на модули, слои, уровни, модели, контроллеры, etc.).

Sun Cloud Platform: выход в открытое плавание

На днях Sun анонсировала платформу для облачных вычислений. Предлагаются следующие технологии: Java, MySQL, OpenSolaris, Open Storage. Главными и самым будоражащими терминами объявляются так называемые public clouds. Фактически Sun таким подходом перерубает пути движения проприетарщины (в лице, например, Microsoft) и ориентирует на своего рода свободу выбора. Sun Cloud Platform есть подход, реализация уже в конкретной операционной среде ей не затрагивается. Следовательно, разработчики вольны использовать или Linux, или OpenSolaris, или Windows. Проекта open source. Вектор движение направлен в сторону совместимости, открытости разработок. "Ранее писалось":http://twowords.ru/findings/38/sun-cloud, что API опубликован под лицензией Creative Commons license, что подчёркивает гибкость (например, в реализации инновационных технологий и методов), ориентирование на результате.

Анонсированная платформа (её ядро) состоит из двух составляющих: Sub Cloud Storage Service; Sun Cloud Compute Service. Последняя появится летом этого года и будет на практике выглядеть как Virtual Data Center (VDS). VDS - интерфейс, который позволит запуск и управление приложениями в рамках облака и средства администрирования через веб-интерфейс (само приложение может работать под контролем различных операционных систем). Особенностью Sun Cloud Storage Service является гибкость в масштабировании объёмов хранилища (как увеличении, так и уменьшении).

Sun Microsystems Unveils Open Cloud Platform

понедельник, 23 марта 2009 г.

xmonad + xmobar: заголовки окон

После того, как произошла стыковка xmonad и xmobar, последний (при должной конфигурации) начинает отображать заголовок активного окна. Да вот незадача: в заголовках с русскоязычными словами и буквами появляются странного вида символы, опознать которые не представляется возможным. Для решения этой закавыки нужно изменить файл конфигурации xmonad.hs следующим образом:

...import System.IO.UTF8...main = doxmproc <- spawnPipe "xmobar" -- стартует xmobarxmonad $ defaultConfig{ ...-- вот здесь указывает кодировку выходной последовательности (utf8, которая была ранее объявлена через "import System.IO.UTF8")
, logHook = dynamicLogWithPP $ xmobarPP{ ppOutput = System.IO.UTF8.hPutStrLn xmproc, ppTitle = xmobarColor "green" "" . shorten 50}...}

Файл настройки xmobar (мой) такой:

Config { font = "xft:Consolas-9", bgColor = "black", fgColor = "grey", position = Top, lowerOnStart = True, commands = [
Run Network "ppp0" ["-L","0","-H","32","--normal","green","--high","red"] 10, Run Network "ppp1" ["-L","0","-H","32","--normal","green","--high","red"] 10, Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10, Run Memory ["-t","Mem: %"] 10
, Run Swap [] 10
, Run Date "%a %b %_d %Y %H:%M:%S" "date" 10
, Run StdinReader
]
, sepChar = "%"
, alignSep = "}{"
, template = "%StdinReader% }{ %cpu% | %memory% * %swap% | %ppp0% - %ppp1% |
%date%"
}


Результат


пятница, 20 марта 2009 г.

Java: а стоит оно того?

Навеяно этим.

Что можно почерпнуть из Java? Можно ли рассматривать Java как отправную точку при разработке программного обеспечения любой сложности, любого масштаба?

Начну, пожалуй, с причин создания. Java (а под этим термином понимается целая система, подход к разработке) включает: виртуальную машину; систему пакетов (библиотек), использование которых прозрачно, перспективно (с позиции эволюции разрабатываемого ПО). Иначе, Java - платформа. Цель - получить пространство, ориентированное на безопасное исполнение кода, его повторное использование, стабильность, изолированность.

Другими словами, это весьма серьёзная штуковина. Сложная, да. Перспективная, да. Стоит ли на ней остановиться? Нет. Сложность Java породила множество паттернов, пытающихся укротить эту махину. Она заточена под крупные проекты, масштабируемые, распределённые. Реализовывать проекты средней и малой величины уже дело затратное (время), не оправданное какими-то явными преимуществами.

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

четверг, 19 марта 2009 г.

Sun Cloud

В этом году появится проект Sun Cloud. Вернее, всё уже готово: архитектура проработана, уровни взаимодействия реализованы. Что это такое? Во-первых, это сервис хранения данных, который управляется WebDAV. Во-вторых, это сервис предоставления вычислительных мощностей, основанный на технологии Q-layer.

Для управления всем этим паровозом разработано API, включающее два уровня. Нижний уровень основан на HTTP и исповедует философию REST. Главным термином в сетевых сервисах (подхватываемый REST) является ресурс. Ресурс (а это может быть сервер, целая сеть; более общий случай - виртуальный дата центр) представляется в виде JSON. Причём представление иерархическое, древовидное. То есть: целое облако описано JSON верхнего уровня, включающим, например, кластеры. Обращаясь к кластеру по URI, выходят на JSON, который описывает уже серверы. Верхний уровень, с одной стороны, представлен библиотеками, обслуживающими сообщения, поступающие с нижнего уровня (HTTP); они могут быть реализованы на Java, Ruby, Python. С другой стороны, имеется веб-интерфейс, через который управляют конкретным виртуальным дата центром.

Спецификации API опубликованы под лицензией Creative Commons 'Attribution' license. Всё открыто, прозрачно и подаёт надежды на облачное будущее. Так что вопрос решён: сначала интерпрайз, потом уже простые смертные.

среда, 18 марта 2009 г.

SCRUM: характеристика. Часть 2

продолжение части 1.

Планирование спринта


Длительность. Спринт имеет фиксированные временные рамки. Обычно это период от недели до месяца. Что это даёт? Осознание и следование такой модели - последовательность спринтов фиксированной продолжительности - связано с предсказуемостью, а процесс становится ритмичным, детерминированным.

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

Время. На данном этапе (рассмотрение итерации) сложность возможностей и требований рассматривается с позиции времени. С одной стороны, команда располагает временным резервом - бюджетом - который включает часы каждого члена коллектива. Например, трудовой день программиста может составлять 6 часов. Суммируя часы, оценивают возможности команды. С другой стороны, происходит работа с требованиями: они разбиваются на задачи. Причём, чем меньше они по сложности (проще), тем точнее можно оценить количество времени, которое потребуется затратить на их решение. После того, как все текущие задачи оценены, время на разработку рассчитано, происходит их сопоставление. Если разногласий между требованиями и возможностями нет, то переходят к непосредственной реализации спринта. В обратном случае необходима повторная работа с заказчиком: корректирование задач (включение новых или исключение лишних).

Спринт


План составлен, задачи определены. Главное - следовать намеченному и исключить деструктивное влияние на процесс. Это касается заказчика в первую очередь. Внезапные изменения требований не влияют на текущую итерацию, а учитываются на следующих.

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

Тестирование здесь на ведущем месте (TDD). Оно всегда интегрировано в процесс, подчас определяет его.

Типичный день


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

Прогресс. Оценить прогресс, даже тот, который связан с решением конкретной задачи (сложность задач такова, что время на решение не превышает одного рабочего дня), помогают специальные диаграммы. Эти визуальные средства показывают находится ли проект в рамках допустимых границ: всё идёт согласно плану или же происходит опережение/отставание. В случае отставания переключаются на наиболее приоритетные задачи и корректируют план следующей итераций. Несоответствие процесса плану показывает лишь одно: команда "не вошла в ритм", переоценила свои возможности. Спустя пару итераций команда достигнет установившегося состояния, будет способна оценивать и задачи, и свои шансы на успех достоверно.

Итоги спринта


В конце каждого спринта демонстрируется проект со всеми достижениями и неудачами. Это встреча заказчика и команды, на которой последняя может продемонстрировать результаты своей работы, доложить о проблемах, с которыми она столкнулась. Что это даёт? Во-первых, это психологический deadline, по-другому - стимул (для команды, разумеется). Во-вторых, происходит конструктивный диалог между представителями бизнеса и исполнителями. В результате этого диалога проясняются новые моменты, достигается (иногда) взаимопонимание. Обратная связь здесь неоценима: заказчик контролирует ход работы и, в конечном счёте, получает то, что ему нужно. В-третьих, для разработчиков важно отметить (повторить) для себя ошибки и ответить на вопросы: "Всё ли продвигалось согласно плану?", "Правильно ли оценена сложность задач?". А ответив на них, скоординировать свои дальнейшие действия.

Масштабирование Scrum


В случаях распределённых команд, работающих над одним проектом предлагают следующие положения:


  • лидер (ScrumMaster) не управляет в прямом смысле, он направляет;
  • каждая команда разработчиков автономна за исключением случаев, когда затрагиваются вопросы, касающиеся других команд или организацию в целом;
  • каждая команда разработчиков занимается тем, что делает своё итерационное дело и передаёт результат заказчику.


Что в сумме?


Scrum - это agile-процесс для управления разработкой программного обеспечения. Scrum идёт навстречу изменениям, наделяет властью (равноправием) команду и обеспечивает прозрачность всех взаимодействий. Владелец (заказчик) вовлекается в диалоги с командой разработчиков с целью реализации наиболее значимых с его точки зрения возможностей. Команда регулярно демонстрирует достигаемые результаты работы на презентациях. Scrum следует простым правилам и делегирует ответственность за успех всей команде. Команда самоорганизующаяся, точно знает свои цели и необходимый результат. Важно понимание заказчиком приоритетов существующих требований и новых (появляющихся в процессе взаимодействия с командой), а также необходимости сохранения темпов работы в новых условиях. Scrum выставляет на обозрение все проблемы, разногласия внутри команды и по части организации в целом. Требует выполнение взятых обязательств на всех уровнях.

воскресенье, 15 марта 2009 г.

SCRUM: характеристика. Часть 1

Цели


Рассмотреть пожалуй самого яркого представителя из мира Agile - методологию Scrum. Описать типичный процесс работы в условиях этого подхода. Выделить достоинства и недостатки.

Предисловие


Это уже вторая заметка на тему Agile, конкретизированная в реальном приложении. Первая - Extreme Programming - инженерного плана методология, более конкретная и близкая к насущным вопросам, таким как тестирование, парное программирования.
Scrum, в отличие от Extreme Programming предлагает подход не к разработке программного обеспечения, а более акцентирует внимание на управлении этим процессом. И с точки зрения управления (менеджмента) для реализации всех принципов (о них далее) необходимо наличие, во-первых, заказчика (или его представителя), который отдаст проекту своё время и мысли (выражающие желаемый результат, требования), а во-вторых, команды первоклассных специалистов по части проектирования и реализации кода.

Термины


Scrum - методология управления разработкой ПО, включающая множество моделей (о которых ниже) и ролей (ScrumMaster, Product Owner, Team).
ScrumMaster - руководитель, направляет команду по пути Scrum.
Product Owner - заказчик, клиент.
Team - команда разработчиков.
Backlog - список требований.
Sprint - фиксированная итерация, термин сугубо Scum'овский; далее по тексту "спринт".

Порядок изложения


Для начала выделяются общие требования, которые свойственны Scrum, а также следствия из свойств. Далее будут показаны основные этапы (модели или практики), которые с позиции именно менеджмента, что есть особенность подхода: составление списка требований, оценка сложности реализации, планирование спринта (этот пункт и далее в части 2), собственно спринт, тактическое планирование (на один день), оценки прогресса, подведение итогов по итерации. Последним этапом рассматривается вопрос масштабирования методологии Scrum на крупные проекты.

Общие положения


Как было отмечено выше, для нормального Scrum понадобятся: заказчик и команда. Заказчик вовлечён в процесс разработки, это одна из ключевых претензий. Команда состоит из профессионалов, видавших виды людей. Члены коллектива равноправны, то есть не выделяется определённого механизма подчинения: каждый участник имеет право голоса и его голос может стать ключевым. Основное свойство команды: взаимодействие. Только посредством общих усилий достигаются все поставленные цели. Главный инструмент в их руках - коммуникации, общение, прямой разговор (друг с другом, с заказчиком).

Другим моментом является планирование, которое не пытается предвосхитить все детали и проработать все ответы на возникающие (а что там будет?) трудности. По факту планирование занимается разрешением текущих задач и знаменует собой лишь направление движения. Оно и понятно: изменяющиеся условия делают невозможным (или в крайнем случае затруднительным) учёт всех факторов, хотя сам учёт (в традиционной модели) отнимает очень много времени, производя документацию.

Большое внимание уделяется организации рабочего пространства и инструментарию для, например, оценки прогресса. Одним из атрибутов Scrum является доска (настенная либо реализуемая программно), на которой крепятся: список требований, текущие задачи, задачи в процессе выполнения, готовые для тестирования, наконец, полностью законченные. Таким образом, можно оперативно узнать на каком этапе находится программный продукт, какие задачи ключевые, какие выполнены.

Следствия. Команда и её численность такова, чтобы гармонично кооперировать. Очевидно, большими такие команды быть не могут. А значит, это накладывает ограничение на величину проекта. Для крупных проектов применяется модель распределённых (по всему миру) команд. Как согласовывать их действия? Это проблемное положение, но выходы находятся (об этом в части 2).

Список требований


Список требования (backlog) может быть пополнен каждым членом команды. Но приоритеты расставляет только заказчик. В результате получается список, наверху которого расположены наиболее важные требования (которые звучат по типу "Я как (роль пользователя) имею возможность (действие) для достижения (результат)"). Каждый пункт составляется только с позиции бизнеса: наиболее приближенным к клиенту и исключающим техническую сторону. Делается это для большей наглядности с целью исключения непонимания со стороны заказчика. Будучи составленными (а на деле они всегда эволюционируют) требования должны быть всегда "под рукой", доступны для команды (вспоминаем доску на стене).

Оценка сложности требований


Оценка требований производится на верхнем уровне. До конца глубина задачи не ясна, поэтому это оптимальный вариант. По каждому пункту из списка требований команда делает вывод о том, насколько сложной является реализация. Вывод, как не сложно догадаться, основан на опыте разработчиков. Более того, ценным является индивидуальный подход, то есть требование не обсуждается совместно, а каждый член коллектива даёт свою оценку. Далее оценки усредняются здравым смыслом. Как показывает практика, вариант действенен. Теперь о системе баллов. Оценка производится исключительно с использованием своей системы (численной). Что это будет за система, не имеет особого значения. Основной смыл - выразить относительную сложность. Временные оценки исключены (никаких человеко-часов). Участие заказчика в этом процессе ни к чему, он не имеет представления о системе координат команды, а вводить его в курс дела затратное по времени и нервам занятие.

продолжение в части 2.

суббота, 14 марта 2009 г.

47% американцев не в курсе, что Земля вращается вокруг Солнца

Совсем трудные времена настали для штатов, хоть плачь. Ну о том, что там стали совсем непросвещёнными (а зачем, когда жизнь малина?), известно давно (из ящика пропихивали, да и на генном уровне чётко пропечатано :)). Больший интерес вызвали рассуждения "осведомлённой" части, светочей ихней науки, о там, как жить и что делать. Навзрыд встречены повсеместная глупость, запущенность образования, декаданс. Но, конечно, в дискуссию вступила и та часть аудитории, которая вхожа в 47%-ный резерв. Для них, например, всё хорошо и объясняется по типу "зачем учить, если всего познать нельзя". Зачем тебе жить, баран, если сдохнешь в конце? Между делом началась игра у кого длиннее на вопрос "А скока процентов площади планеты покрыто водой?", хорошо, что до тысячных не дошли. Находятся даже идеалисты, которые убеждены, что дети _по определению_ стремятся к знаниям, мол это биологическая привязанность. Ну да, кругом там академики. Промелькнуло интересное выражение "silly cow" (тупая корова), но бы запомнить.
В общем, советую почитать, сбросить излишки нервной энергии :), хороший тренажёр.

пятница, 13 марта 2009 г.

Extreme programming: характеристика

Цели


Раскрыть сущность Extreme programming (XP), выделить основные компоненты модели, коротко их охарактеризовать.

Предисловие


Ранее рассматривалась концепция Agile для разработки программного обеспечения. Это отправная точка для конкретных методик, в число которых входит и XP. Agile очень ёмкое понятие, больше философия, ряд предписаний и тезисов. Последнее время она стала очень актуальной, объясняется это тем, что традиционный способ разработки ПО сталкивается с препятствиями, неудачами, причина которых заложена в самой модели. Как раз здесь Agile (и XP в частности) предлагает пути преодоления трудностей путём тесного взаимодействия с заказчиком, командной работы, фокусировании на достижении требований, а не написания документации (корень зла традиционной модели).

Термины


Термин (и методологию) Extreme Programming ввели в обиход Kent Beck и Ward Cunningham в 90-е годы двадцатого столетия, в дальнейшем корректировали основные положения.

Порядок изложения


Ниже будут рассмотрены, во-первых, заимствования из Agile, во-вторых, основные черты планирования, релизов, подготовки прецедентов, характер программирования, коллективная работа, тестирование.

XP is an Agile Methodology (Agile is not XP)


XP исповедует Agile. Это значит, что процесс разработки эволюционный. С одной стороны, наращивание функциональности от релиза к релизу. С другой, гибкость по отношению к требованиям и их изменениям; подстраивание под реалии среды. Административная составляющая упрощается ввиду несостоятельности и ненужности. Фактически команда саморегулируемая, участники уравнены в правах.

Планирование и релизы


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

Система прецедентов


Прецеденты (или сценарии) составляются совместно с заказчиком, расставляются приоритеты. Отмечу, что когда стоит вопрос о проработке определённой функции, которая нужна для следующего релиза (не для текущего), руководствуются фразой YAGNI - "You Aren’t Going to Need It" ("вам это не нужно"). На деле это значит, что не стоит работать над тем, что может поменяться, и в последствии потребует полностью переписать код.

(Собственно) программирование


XP предлагает использовать подход Pair Programming (два человека за компьютером). Здесь ключевую роль играет кооперация между коллегами, которые общими усилиями достигают значительных (по факту и времени) результатов.

Тестирование


Очень большое внимание уделяется тестированию. Оно всегда продолжительное, интегрированное в процесс разработки. Тесты пишут до написания кода приложения. Это называют Test-driven Development. Порядок следующий: написать тесты, написать код, проверить код тестами, в случае ошибок исправить код и повторить тестирование. Достоинства: тесты пишутся; у программистов возникает чувство удовлетворения (преодоление теста - вызов, процесс преодоления - fun); становятся ясны детали программного продукта; имеется возможность автоматизации этого процесса.

Коллектив


Команда разработчиков - единый организм. Здесь нет уединённых участников. Члены коллектива имеют равные права по вкладу в результат и это делает их сплочёнными. Однако команда немногочисленна (иначе начинаются трудности и деление на группы) и требует привлечения профессионалов.

Что в сумме?


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

***


Кроме XP к Agile относятся Scrum, Crystal, RUP. Они будут рассмотрены позже.

вторник, 10 марта 2009 г.

СГТУ, конференция "Teaching English Professionally and CommunicationCompetently". 10 марта

Сего дня посетил конференцию, главным образом адресованную преподавателям английского языка - школ и вузов. За день прошло пять выступлений: два до кофе-брейка, три - после. Наиболее яркой считаю первую часть: интересно и, главное, по делу. После перерыва понесли околесицу. Но по порядку.

Первым выступал Wayne Rimmer с докладом на тему "Changes in Contemporary English Grammar". Познавательно о тенденциях последнего времени эволюции английского языка. Например, отмечено, что увеличилось употребление таких оборотов как need to (123%), want to (70%), going to (50%), used to (45%). В Великобритании (а докладчик родом от туда) почти вымерло слово shall, указующее на будущее время. В штатах так вообще давно не употребляется, а вот в старой доброй бывает, но исключительно в таких словосочетаниях, которые гуляют между друзьями, подругами по типу "А не пойти ли нам на звёзды поглядеть?". Так что можно смело вычёркивать это слово из постоянного обращения, но вписать в графу интимных фраз. Другие изменения коснулись глагола be (теперь его употребляют в меньшей степени, -20%), ему за замену пришёл get (+60% в частоте использования). Докладчик заметил, что get пользуют для передачи сенсационного сообщения, например, криминального толка, преступления.
В обыденной речи возросла роль оборота to have a ..., обозначающего общее событие (позавтракал, принял душ).
Возросла роль слов which и that, раскрывающих характеристики объекта. Принадлежность сущности чему(кому)-либо обозначают добавкой 's. Другой возможностью является использование предлога of. Так вот: последний вариант употребляется реже, чем первый, оно и понятно, так как проще.
Нельзя не отметить употребление слова like (его часто используют), которое эквивалентно as.

Это что касается первого доклада. Второй озвучивала Людмила Кожевникова (Cambridge University Press), тема звучала как "Alternative Assessment", а суть состояла в ответах на вопросы "Каким образом оценивать знания?", "Какова роль учителя?", "Какой подход необходим к ученику?". В целом неплохо, предлагается индивидуальная работа (на первом этапе) с обучающимися: выделение сильных сторон, уровней восприятия информации, деление по результатам на родственные по ряду признаков группы. Тестовая система отвергается, предлагается введение портфолио и уже на его основе судить о знаниях. Что понравилось: начинают об этом задумываться, какие-то попытки совершаются (предлагаются взвешенные варианты). Что не понравилось: подстраивание под реалии, поверхностно копают. Обсуждаемый вопрос - обучение иностранному (в данном случае - английскому) языку. Как недостаток отмечено длительное время ученичества, так прорабатываются все уровни восприятия (визуальный, аудиальный, чувственный), но и результат ожидается лучший.

После перерыва 50 минут тратил David Fay с темой "Testing English as an International Language", на мой взгляд совершенно напрасно. Основная мысль: существует множество разновидностей (диалектов) английского языка (индийский английский, афро-американский и проч.); позиция - принять эти разновидности, иметь их в виду и использовать, когда нужно. Высосано из пальца, моё мнение.

Дальше был Eric Sandeen, американский ирландец. Рассказывал в картинках сначала про Нью-Йорк, затем про штаты. Пускал в зал разговоры американизировавшихся китайцев, африканцев. Собравшиеся насладились ирландской песней невидимой девушки, видами направлений миграции иноземцев в глубь США. Интересно? Быть может...

Заканчивал снова Wayne Rimmer. Говорил об ошибках, которые преследуют наших (российских) студентов в терниях английского языка. Спешил, так как время подходило. Зал устал, а кто-то даже спал. Завтра продолжение.

воскресенье, 8 марта 2009 г.

Мастерство программирования

Кооперативы программистов? Да пожалуйста. Цель: взять новичка, обучить его, вырастить мастера, посвящённого во все тонкости разработки. Конвейер по производству спецов. Неплохо. Такие цели преследует, например, 8th light. Основные моменты, ею предлагаемые изложены в манифесте, который подписали около 600 человек из разных уголков цивилизованного мира. Вообще многое перекликается c agile, конкретно следующее: нацеленность на тесный контакт с заказчиком, внутрикомандное взаимодействие, возможность быстрого реагирование на изменение требований.

Компания занимается ученичеством, да таким плотным, что держись крепче. Вырабатывают единый стиль программирования, единый стиль думания, единый взгляд на будущее программного обеспечения. Кузница работает денно и нощно, в массовом порядке плодя мастеров своего дела. По истине завораживающе звучит фраза "We build software that we are proud to have built and that our clients are proud to have." Сразу ясно, светлые головы занимаются тем, делают своё дело верно, охотно и столь же охотно гордятся своими успехами. Молодцы!

четверг, 5 марта 2009 г.

Maestro: очередное извращение Microsoft

Судя по описанному, Maestro не есть очередной объектно-ориентированный язык. Это - фокус, который даёт возможность меньше думать о параллельных вычислениях (вспоминаем сразу облачный рай; плюс ко всему у Microsoft есть проект Azure), оставаясь приверженцем объектно-ориентированному подходу. Взаимодействие компонентов происходит с помощью сообщений, а компоненты сами изолированы друг от друга. С тексте промелькнуло сравнение с Erlang'ом. Позиция Microsoft ясна, она идёт на поводу большинства. Нужен инструментарий для параллельных вычислений - сделают; программистам не надо переучиваться: как знали ООП, так и будут. А что предлагает функциональная парадигма? А она по определению параллельная, каждая функция изолированная. Считай-не-хочу. Но Microsoft, конечно, виднее.

Книги: новые издания в области программирования.

Книги важны. Пожалуй ничего лучшего ещё не придумали для передачи опыта. Для разработчика (да и вообще любого специалиста) читать по своей (и не только) тематике жизненно необходимо. Актуальным становится поиск источников знаний: не каждая книга одинаково полезна, шлака хватает. Для разработчика ПО необходимо быть в курсе современных тенденций. И что знаменательно, тенденции в сторону Agile. Пишут много, пишут по делу. Не упускают из виду проект-менеджмент - организация есть ключевой момент, иной раз решающий. Стратегии рефакторинга, тестирования как никогда актуальны. В общем направление дадено. Книги есть, нужно их только найти.

Интерпретируемые языки программирования. Уровень удовлетворения.

Интересные результаты соревнования интерпретируемых языков программирования приведены на просторах интернета.
Рассматриваются следующие:


  • Actionscript
  • Flex
  • Javascript
  • Microsoft F#
  • Microsoft Powershell
  • Perl
  • PHP
  • Python
  • Ruby
  • VB Script


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

На первом месте расположился PHP. Его сильными сторонами оказались беспроблемное внедрение и платформонезависимость, доступность и качество средств разработки и быстродействие.

Замечу, однако, что один язык выделяется из общего строя - F#. По сути функциональный, по родословной - наследник OCaml (а первопричина и того - Lisp). Оказался он на восьмом месте (третьем с конца). Однако...

вторник, 3 марта 2009 г.

Технические несовершенства = загубленные нервы и деньги

Кто постигает новое, лелея старое, Тот может быть учителем.
Конфуций

По мотивам.

Начинающие команды разработчиков. Как оно случается.

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

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

понедельник, 2 марта 2009 г.

PHP: компоненты и инструкции к действию

Вот тут приводятся инструменты полезные разработчикам сайтов, регулярно сталкивающимся с задачами совершенствования дизайна и эффектов юзабилити.
Что тут есть:
Главным образом представлены инструкции, компоненты (исключительно бесплатные) ориентированные на визуальную часть. Рассматриваются темы: построение дерева директорий (с привлечением также Ajax), метод нумерации страниц, построение диаграмм. Кроме того, такие мелочи как визуализация форм, проверка на валидность ввода данных (с участием как PHP, так и JS), скрипты ресайза и нарезки изображений и их вывода. Есть даже тьюториал для создания собственной CMS. Большинство инструкций сопровождается демонстрацией результата - можно пощупать предварительно и сделать вывод "а надо ли".

воскресенье, 1 марта 2009 г.

Scheme: функциональный рай

1. Функциональное прошлое и будущее


Выдержки из учебного пособия:

bq. На функциональном языке программист не должен описывать порядок вычислений. Нужно просто описать желаемый результат как систему функций.
В чистом функциональном программировании оператор присваивания отсутствует, объекты нельзя изменять и уничтожать, можно только создавать новые путём разбора и сбора существующих.
Каковы же преимущества чистых функциональных языков? Помимо упрощения анализа программ есть ещё одно — параллелизм. Раз все функции для вычислений используют только свои параметры, мы можем вычислять независимые функции в произвольном порядке или параллельно, на результат вычислений это не повлияет. Причём параллелизм этот может быть организован не только на уровне компилятора языка, но и на уровне архитектуры.

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

1.1 Происхождение


Lisp как первый функциональный язык придуман давно, диалектов создано тоже предостаточно. Императивные языки, в основной массе которые объектно ориентированные, начинаю разрастаться лямбда расширениями. Что это даёт: мешанину мух и котлет, вопросы по типу "А чем пользоваться?", разрываться. Переходный момент? Возможно. Что останется? Если будущее за параллельными вычислениями - функциональные, а потом и другие, более совершенные, более абстрактны, человеко-ориентированные. Если провести параллель с искусственным интеллектом - самое то: распределённая сеть функциональных узлов, завязанная на знании, опыте.

1.2 Концепция


Центральным понятием является функция, она же атрибут, она же цель вычисления. Пример ниже, я думаю, раскрывает логику.

2. Совмещение


2.1 Java


Что есть здесь? А здесь пожалуйста: тот же scheme в ре-инкарнации kawa: (пишите на scheme, компилируете в байт-код, исполняемый на виртуальной машине java; плюс ко всему доступ к бесчисленным библиотекам).
Нашёлся ещё один язык для jvm - Clojure. Подробное введение описано здесь. Ну и scala не будь дурой также для jvm.

2.2 CSharp


В .net 3.0 появились безымянные функции, придумали даже F#. Тенденция, однако.

2.3 Others


Насколько я помню, собираются лямбда расширение прикрутить и к PHP. Ну что ж, весьма. Ребята не отстают.

3. Web


Для web-сервисов применение функциональных языков более, чем оправданно. Наткнулся на пример выполнения скрипта на scheme. Интересно дико. А главное - прозрачно и открывает глаза на то, как доступно и понятно можно описать. Однозначно - не зря мигрируют на эту парадигму. Если кого заинтересовало, то вот проект PLT-Scheme в состав которого входят IDE, JIT, web server, библиотеки и документация. Кросс-платформенный. Кроме того, имеются хорошее пособие по scheme и книга рецептов.

3.1 CGI


Запускать веб-приложения можно как fastCGI, или же "нативно" - посредством PLT-Scheme.

4. ПО


Scheme как самостоятельный продукт - используем DrScheme, входящий в PLT-Scheme.
Ниже окно программы: лаконичное, минимальный функционал. Пример такой: нужно добавить к слову заданную последовательность символов дважды. В данном случае - к "hello" дважды восклицательный знак. Сверху функции, снизу исполнение.

Облака не за горами, они уже стелятся по земле

Возвращаемся к истокам: зачем тебе реляционная база данных, когда лучше объектная: и семантически верно и управлять легко? Зачем тебе дома компьютер, платить за его обслуживание, нести накладные расходы, когда можно арендовать у дяди за "символическую денужку" и радоваться "Ах, как хорошо-то!". Вот и родятся такие проекты как LightCloud. Во-первых опенсурс, что уже радует, во-вторых, по уверениям - быстродействие на уровне memcached. Распределённая объектная база - вот что это.
Из возможностей / особенностей:


  • лёгкое масштабирование, заключающееся в добавлении очередного узла в базу;
  • расширение функциональности посредством языка Lua, скорость исполнения соотносимая с C;
  • написана на python, но в силу простоты может быть портирована на другие языки.

Html, css: делаем, смотрим результат

Нашёл сегодня сервис http://htmlplayground.com/, который служит для создания набросков, размеченных html и css. Весьма удобный интерфейс: страница поделена на четыре части (теги, их описание, атрибуты, собственно код и его отображение). Не очень понравилось, что результат набранного выводится в ограниченном пространстве, грандиозного не накидаешь. А так весьма полезно, особенно когда нет под рукой стационарного средства работы со стилями. Короче, если надо что-то поправить, а из доступного только интернет, то непременно штука полезная.

JDK7: горсть изменений

В Java DevKit 7 появятся некоторые улучшения, призванные скрасить жизнь программиста. Мелочь как говорится, а приятно.

1. Блок исключений приобретёт более логичный и лаконичный вид:

try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}

вместо

BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}

2. Самое интересное, по моему мнению, введение блоковой структуры наподобие следующего:

double pi2 = (double pi = Math.PI ; pi*pi)**;

3. Проще стало с generics: по всей видимости, чтоб не править долго и во многих местах.


Map<String, List<String>> anagrams = new HashMap
<String, List<String>>();

примет вид


Map<String, List<String>> anagrams = new HashMap<>();

Источник

суббота, 28 февраля 2009 г.

Agile: этапы, условия разработки

h4. 1. Введение в этапы разработки.

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

h5. 1.1 Этапы разработки

*Описание предметной области*
Происходит набор информации, касающейся предметной области, выделяются прецеденты, или сценарии. Прецеденты являются последовательностью действий по достижению заданной цели и служат для выявления требований. Это всегда человеко-ориентированное описание, которое будет происходить на самом верхнем уровне (как правило уровень интерфейса). Например, сценарий "Заказ товара" можно понимать как последовательность: выбор позиции, указание количества, оплата.
*Анализ предметной области и проектирование*
На основании сформулированных прецедентов начинается выделение сущностей, строятся модели предметной области, затем модели классов (с позиции объектно-ориентированного программирования). Разрабатывается архитектура проекта.
*Реализация в программном коде*
Прецеденты служат отправной точкой для написания тестов. Код самого приложения реализуется исключительно под тесты, что приводит к простому достижению результата, исключая всё лишнее.
*Контрольное тестирование*
Проверка на достижение функционала и безошибочность на основании ранее написанных тестов. Тесты пишутся один раз за всё время (см. предыдущий пункт), они редко изменяются.
*Интеграция, внедрение*
Интеграция в рамках Agile является последовательной (от релиза к релизу), то есть она растянута во времени. Однако такой подход позволяет в кратчайшие сроки начать адаптацию персонала клиента к продукту, усиливает эффект обратной связи по требованиям / недостаткам.

Каждая итерация проходит все этапы, причём она распоряжается лишь своим ограниченным списком задач: список требований, которые оценены по сложности (продолжительности работ); выводы по результатам.

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

h4. 2. Динамика разработки, некоторые условия рабочего процесса.

Чем характерны выше приведённые этапы? На первом - описании предметной области - происходит тесное взаимодействие с заказчиком. При этом в идеализированной модели Agile, он обладает некоторой свободой по принятию конечного решения, но не всегда. Его полномочия должны быть ограничены здравым смыслом команды разработчиков. При проектировании упор делается на командном взаимодействии, причём важно, чтобы каждый член был свободен в выборе и реализации своих идей, то есть доверие должно иметь место. Это справедливо также и на этапе реализации. В дополнение сюда входит также работа тестировщика с заказчиком для составления сценариев тестирования. Любая интеграция, как было отмечено выше, имеет своей целью усилить вовлечение заказчика в процесс разработки. Это необходимо осуществлять регулярно и часто.

Приведённые тезисы возможны в случае, если:

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

среда, 25 февраля 2009 г.

Иностранный язык

Сегодня увидал интересный способ-упражнение по английскому языку. Заключается в следующем (пишу как было): даются несколько имён собственных, например, Jane, Helene, Pete и им в соответствие ставятся характеристики. Вот как это выглядит
Jane - my friend
Helene - my relative
Pete - a famous person

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

Такую бы систему с 1-го класс гнать, а то и в детсадах: интересно, действенно, практика. Посему вопрос: кто-нибудь знает ресурсы, посвящённые таким вот упражнениям или целым методикам? Очень бы хотелось ознакомиться.

Ницше. Система поведения. Кому это надо?

Сейчас.

bq. Первый принцип: здоровье души рассматривается как болезнь, с крайним недоверием...
Второй принцип: предпосылки сильной и полноцветной жизни, сильные влечения и страсти, слывут препонами для сильной и полноцветной жизни.
Третий принцип: все, что грозит человеку опасностью, все, что может возобладать над ним или погубить его, считается злом и пороком,— его надлежит вырвать из души с корнем.
Четвёртый принцип: человек, сделанный безопасным для себя и других, слабый, низринутый в унижение и скромность, в осознание своей слабости, «грешник» — это и есть самый желательный тип, тот, кого при посредстве некоторой хирургии души можно потом и излечить...

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

bq>. Ф. Ницше, Воля к власти, 248-249.

Что выдвигается на первое место? Природное, божественное, обладающее сверхпланом. Расписание глобального обустройства, в центре которого находятся слабые, уравнённые индивиды. Отрицание естественной селекции: теперь живёт и убогий (как в духовном плане, так и в физическом). Жизнь реализует модель медленного самоубийства, тянущегося существования от рождения до старости. Повседневность, выкорчёвывающая цель человека, удушающее спокойствие. Сколько раз вера в божественный промысел была условием кровопролития? Люди уничтожаются с завидной регулярностью. Сегодняшний человек - ничтожество, животное, принадлежащее среде. Кроткая скотина, лишённая воли. Для него мораль - самосохранение, последняя инстанция, переросшая в привычку. Это инструмент в руках определённой группы людей, умело навязываемый и тиражируемый. Мораль произрастает изо лжи. Как часто человек, говорящий о каком-либо явлении, вещи, не обладая ей, выносит обличающие вердикты, штампует "истины"? Это тот, кто изолирован, лишён системы оценок, лишён опыта. Псевдооценки происходят из морали, подпитываются ей.

понедельник, 23 февраля 2009 г.

Философия техники. История (коротенько)

Технику изучали (ну или пытались изучать) с давних пор. В античности происходило разделение теоретического знания (которое понималось как искусство и носило развлекательный характер) и техники (которая привносила полезность - водопровод, дороги), более того, они противопоставлялись.

В средние века, когда внимание было устремлено на духовную сторону, а труд возводился в обязанность (перед Богом), техника тянула независимое существование. Появляются цеха, весьма консервативные учреждения со своим внутренним уставом. В эту же пору намечается обогащение знания: с востока (арабы и Китай) на запад привносится новое (математика). Техника в это время набирает силу, появляются суда, военная техника, развивается горное дело. Где-то в 15 веке требуется большее от техники, начинается повсеместное строительство сложных сооружений. Очевидно, что для его реализации нужен более развитый подход (строительные планы, вспомогательные конструкции).

С 17 века в сознании происходит чёткое разделение на природное (организм) и разумное (механизм). Первое определяет ментальную сторону, второе - материальную, выраженную категориями полезности, проективности.

В 18 веке техника обрастает научным знанием, поскольку требуется своя теоретическая проработка. Аналогично и с наукой, она технизируется.

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

С конца 19 века и весь 20 век техника подвергалась критике. Одни её осуждали (гуманитарии, экзистенциалисты: Хайдеггер, Ортега-и-Гассет, Бердяев), другие видели в ней раскрытие человека как творца (теоретики: Дессауэр).

В общем весьма интересно и нужно. Советую почитать выше обозначенных лиц.

суббота, 21 февраля 2009 г.

GUI Builder для Eclipse

Столкнулся с необходимостью набросать графический интерфейс для java-приложения. Среда разработки - Eclipse - не предоставляет такой функционал по умолчанию, поэтому пришлось порыскать. Отыскал "Jigloo":http://www.cloudgarden.com/jigloo/, бесплатное для некоммерческого использования средство. Со своими задачами справляется, имеется возможность работы с SWT и Swing. Сам я набрасываю на SWT, и что характерно, плагин успешно подцепил рукописный вариант интерфейса.
Устанавливается просто - через update-менеджер: добавляете сайт _http://cloudgarden1.com/update-site_, ищете соответствующую строчку, инсталлируете.

среда, 18 февраля 2009 г.

Уровень громкости

У fluxbox нет стандартного средства контроля и отображения уровня громкости системы. Поэтому, во-первых, нужно средство регулирования, а во-вторых, отображения. У меня рабочий инструмент - ноутбук - снабжён мультимедийными клавишами, среди которых наличествуют "Mute", "Volume+", "Volume-". Поэтому с первой частью уже проще. Задача - привязать кнопки к звуковушке.
Это не сложно: fluxbox предоставляет возможность задать горячие клавиши в файле /home/_user_/.fluxbox/keys.
Добавил вот эти строчки:

bc. # volume settings, using common keycodes
# if these don't work, use xev to find out your real keycodes
123 :Exec amixer -c 0 set Master 3dB+
122 :Exec amixer -c 0 set Master 3dB-
121 :Exec amixer sset Master,0 toggle

Для моего ноута клавиши 123, 122, 121. Для вашего спросите у _xev_

Клавиши привязаны, теперь про визуализацию. Есть такое средство, называющееся xosd_cat, которое входит в состав пакета _xosd_. Эта программулька позволяет отображать текст и полоски прогресса (или как их там) на экране, поверх всего происходящего. Сразу меня заинтересовала возможность вывода горизонтального бара, которому передаётся процент наполнения (естественно, меньший или равный 100).
В общем получился вот такой скриптик:

bc. #! /bin/sh
channel="$1"
pers=$(amixer -c 0 get "$channel" | grep -o -P '[(d{1,3}%)]' | grep -o -P 'd{1,3}')
killall -KILL osd_cat
osd_cat -A center -p middle -d 1 -b percentage -P "$pers"

Переменная _channel_ содержит название ползунка, который я двигаю и, следовательно, уровень громкости которого я хочу отобразить. Переменная _pers_ извлекает информацию об уровне громкости, далее ищет нужное поле о проценте и в конце получает число (от 0 до 100). Дальше убивается уже существующий процесс отрисовки уровня, рисуется новая картина. Для пущей доступности я нарёк этот скрипт как "osd_volume.sh" и скопировал его по назначению /usr/bin/.

Последний штрих - меняю файл /home/_user_/.fluxbox/keys

bc. 123 :Exec amixer -c 0 set Master 3dB+ ; osd_volume.sh Master
122 :Exec amixer -c 0 set Master 3dB- ; osd_volume.sh Master
121 :Exec amixer sset Master,0 toggle

суббота, 14 февраля 2009 г.

Шаблон Expert

Я подробнее рассмотрю каждый шаблон. Начинаю с Expert, так как он первый по списку. Продолжу в прямой последовательности без прыжков через.
Общие замечания были "перечислены ранее":http://twowords.ru/development/15/osnovnye-shablony-proektirovaniya, сейчас же хочу проиллюстрировать диаграммой и кодом.

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

Я рассматриваю следующую ситуацию: есть кот, холодильник и сосиски в холодильнике. Кот открывает дверцу и оглядывается. Конечно, в реальности кот бы сам подсчитал количество сосисок, но в мире ПО этим непременно должен заняться сам холодильник. Почему? А всё потому, что он, как хранитель питательного мяса, _знает_ достаточно.

Ниже диаграмма.
!http://twowords.ru/images/3.gif!

На данный момент не располагаю инструментом для построения диаграмм последовательностей (ну нет их в Eclipse в стандартном плагине UML2). Посему пока диаграмма классов.

Код для каждого класса в отдельности.

public class Cat {
public void myau(){
System.out.print("myau!");
}
public void lookRound() {
Refrigerator.getInstance().Initialize();
Integer weight = Refrigerator.getInstance().getSausagesWeight();
System.out.println(weight.toString());
}
}


public class Refrigerator {
private List sausages;
static Refrigerator instance;
public void Initialize() {
sausages = new Vector();
sausages.add(new Sausage(50));
sausages.add(new Sausage(100));
}
private Refrigerator() { }
public static synchronized Refrigerator getInstance() {
if (instance == null) {
instance = new Refrigerator();
}
return instance;
}
public Integer getSausagesWeight() {
Integer weight = 0;
for (Sausage s : sausages) {
weight += s.getWeight();
}
return weight;
}
}


public class Sausage {
private Integer weight;
public Sausage(Integer w) {
weight = w;
}
public Integer getWeight() {
return weight;
}
}

Последовательность такая:
Cat c = new Cat();
c.myau();
c.lookRound();

Вывод:

bc. myau!150

пятница, 13 февраля 2009 г.

Основные шаблоны проектирования.

В тексте будут использоваться следующие обозначения. A, B, C - классы (или объекты). (X), (Y) - действия, обязанности или методы. Рассматриваются следующие шаблоны:
  • Expert
  • Creator
  • Low Coupling
  • High Cohesion
  • Controller
  • Polymorphism
  • Pure Fabrication
  • Indirection
  • Protected Variations
Expert Шаблон Expert предполагает следующее: обязанность объекту назначается из способности объекта выполнить эту обязанность. Другими словами, когда встаёт вопрос "Кто должен предоставлять эти данные?", обязанность о предоставлении переходит к объекту, который имеет возможность их предоставить (имеет знания или имеет выход на объекты, которые помогут получить эти знания). Пример: А знает о В; необходимо произвести действие (X); если А имеет всю необходимую информацию для выполнения (X) (в том числе ту, которая содержится в подчинённом классе B), то он и будет его выполнять. Creator Паттерн Creator распределяет обязанности о создании объектов. A будет являться создателем экземпляров B в том случае, если подразумевается, что: он включает в свой состав экземпляры В; обращается к их методам. Нередко роль создателя отдаётся более высшему элементу по иерархии (например, клетка будет создателем попугайчиков). Low Coupling Шаблон Low Coupling исповедует принцип низкой степени связывания. Связывание определяется как знание класса о других классах (например, тех, которые являются его атрибутами). Чем меньше связан объект А с объектами {B, C...}, тем более податлив он. В обратном случае - создание супер-класса, обладающего знаниями о множестве других классах - возникает эффект зависимости (необходимо отслеживать изменения в подчинённых объектах) и неповоротливости (сложность расширения возможностей или перестраивания логики). Как это выглядит: объект А создаёт экземпляр класса В и добавляет этот экземпляр в хранилище С. В этом случае А должен знать о В и С. В одном случае он - создатель В, во другом он - эксперт С. Если, например, класс А делегирует С о создании экземпляра В, то он будет обладать меньшей степенью связывания. Цепочка будет: А делегирует С создание В; В создаёт С. High Cohesion Шаблон High Cohesion звучит как большая степень зацепления. Это значит, что объект должен стремиться к функциональной обособленности и узкой специализации. Необходимо избегать раздутых интерфейсов путём их дробления на малые интерфейсы. Правда существуют ситуации, когда в интерфейсах царит функциональный хаос и когда это оправданно. А оправданно это может быть лишь с точки доступности и лёгкости использования. При этом создаётся супер-интерфейс, в который включаются разнородные методы и свойства, но, поскольку они собраны в одном месте, для некоторых лиц это скорее достоинство. Данный шаблон связан с Low Coupling: необходимо стремится с одной стороны к функциональному разграничению обязанностей, а с другой - к такому распределению обязанностей, чтобы связывание оставалось на низком уровне. Controller Шаблон Controller подразумевает создание такого интерфейса (или класса), который сам не обрабатывает запросы, а делегирует их. Как правило, используется сценарный подход: под прецедент разрабатывается интерфейс, который включает все методы, необходимые для его выполнения. Например, контроллер может быть промежуточным слоем между интерфейсом пользователя и логическим уровнем программы. Сюда же может быть применим принцип High Cohesion. Polymorphism Нужно заложить основу - абстрактные классы и интерфейсы - на базе которой будет наращиваться весь функционал. Жёсткая логика (if-then-else) заменяется на логику реализаций. Что это даёт: каждая реализация уникальна, прорабатывается в соответствии с намерениями разработчика; изменение части кода программы не обязывает вносить исправления в других частях. Pure Fabrication Шаблон предполагает введение искусственного объекта, которые не является частью предметной области, но несёт вспомогательный функционал. Используется для повышения степени зацепления. Indirection Когда необходимо связать два класса, которые относятся к различным аспектам, то в этом случае используется шаблон Indirection. В самом простом случае шаблон может работать так: А знает о В (знает о интерфейсе), но не подозревает о С (реализации этого интерфейса); А делает запрос у В, а реализация С, проделав некоторые вычисления, возвращает результат А. Protected Variations Этот шаблон гласит: распоряжайся только своими знаниями, а к чужим не смей обращаться. Если объект А в числе своих атрибутов содержит В, который в свою очередь включает С, то А следует работать исключительно с В, но не лезть в дела С ("вассал моего вассала - не мой вассал"). Что это даёт: прыжки через головы вложенных зависимостей выходят боком при изменении логики программы. Если что-то поменяется, то не исключена переработка этой цепочки взаимодействия. Кроме того, такая ситуация своего рода повышение смыслового связывания, а оно как и простое недопустимо.