Разработка инструментария для расчета трудоемкости и стоимости разработки программного продукта по методике CETIN

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,58 Мб
  • Опубликовано:
    2017-11-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка инструментария для расчета трудоемкости и стоимости разработки программного продукта по методике CETIN

Оглавление

Введение

1. Обзор и анализ методик управления проектами и оценки трудоемкости разработки проекта. Выбор и обоснование варианта решения

.1 Обзор и анализ существующих методик управления проектами и оценки трудоёмкости

.2 Формирование требований и выбор варианта решения

. Архитектура программного продукта и требования к платформе

3. Алгоритмизация и программирование

3.1 Разработка алгоритма задания параметров и вычисления трудоёмкости и стоимости программного продукта

3.2 Программная реализация

3.3 Разработка интерфейса пользователя

3.4 Разработка форм ввода параметров расчёта и статистики по собственным проектам, отчётных форм (не менее 2)

3.5 Разработка организационно-технических решений по обеспечению информационной безопасности применения продукта

4. Отладка и тестирование продукта

4.1 Подготовка данных контрольного примера

4.2 Анализ результатов расчёта и выводы

5. Разработка руководства пользователя

Заключение

Список использованных источников

Приложения

Введение

Информационные системы стали неотъемлемой частью современных компаний. ИТ-проекты становятся все более масштабными и охватывают все части бизнеса. Как следствие, срывы и провалы ИТ-проектов приводят к значительным потерям.

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

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

Превышение бюджета по провальным ИТ-проектам составляет более 200% от плановых значений. Проблемы, возникающие при реализации ИТ-проектов, влекут за собой существенные потери прибыли и наносят удар по репутации компании. [1]

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

Недооценка времени сказывается на увеличении бюджета, а при его невозможности увеличения на качестве проекта, что считается недопустимым. Недооценка бюджета также сказывается на качестве проекта. [2]

Согласно мнениям экспертов Standish Group среди причин неудач проектов либо выхода проекта за рамки сроков, бюджета и не достижения цели выделяются следующие:

  • неполные требования;
  • низкая степень вовлечения заказчика и конечных пользователей в процесс разработки;
  • недостаточное обеспечение ресурсами;
  • недостаток планирования;
  • и другие. [3]

Все причины напрямую связаны с планированием реализации ИТ-проектов, а именно с проектированием информационной системы и оценкой стоимости разработки.

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

В ходе выпускной квалификационной работы был разработан инструментарий для расчета трудоёмкости и стоимости разработки программного продукта по методике CETIN.

В процессе выполнения данной работы был проведен следующий комплекс работ:

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

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

разработан алгоритм программы, определены интерфейсы и все программно реализовано;

проведено тестирование системы;

разработано руководство пользователя системы;

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

1. Обзор и анализ методик управления проектами и оценки трудоемкости разработки проекта, Выбор и обоснование варианта решения

1.1 Обзор и анализ существующих методик управления проектами и оценки трудоёмкости

трудоемкость программный алгоритм

Исторически сложилось развитие методик оценки трудоемкости и стоимости разработки информационных систем в двух направлениях: измерение строк кода (SLOC) и измерение функционального размера (FPA).

С начала 80-х гг. прошлого века экспертами в области планирования ИТ-проектов был накоплен значительный опыт и разработаны эффективные подходы и методологии для оценки размера ИТ-проектов.

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

Таблица 1 - Преимущества и недостатки популярных методов расчета

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

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

На рисунке 1.1 приведена схема эволюции методик оценки стоимости разработки информационных систем.

Из мировых методик наиболее успешными и распространёнными в настоящее время являются COCOMO (Constructive Cost Model, модель издержек разработки) II и FPA IFPUG (International Function Point User Group, метод функциональных точек). Обе методики базируются на принципе оценки функционального размера:

·FPA IFPUG производит оценку функционального размера в функциональных точках;

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

Рисунок 1.1-Развитие методик оценки стоимости разработки

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

Для оценки трудоемкости по методике IFPUG необходимо достаточно детально смоделировать структуру информационной системы, ее функции, количество интерфейсов, структуру данных и атрибуты данных. В идеальном случае, все должно происходить именно так, т.е. должен быть разработан детальный проект информационной системы. Для оценки стоимости разработки информационной системы на стадии формирования бюджета государственного заказа либо при разработке требований при использовании методики FPA IFPUG необходимо иметь техническое задание и спецификации требований к программному обеспечению. Исходя из реалий процесса заказа и разработки информационных систем, данная задача представляется практически невозможной. Наиболее часто встречается практика заказа информационных систем по следующей схеме: формируется бюджет, затем разрабатывается ТЭО, впоследствии разрабатывается техническое задание и ведется разработка информационной системы.

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

На следующей схеме (Рис. 1.2) приведены два видения процесса разработки:

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

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

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

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

Рисунок 1.2 - Виды ведения процесса разработки

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

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

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

На II Съезде IT-Предприятий Казахстана были заявлены следующие требования к разрабатываемой методике оценки трудоемкости разработки ИС, которые позволять учесть недостатки существующих методик для применения планирования ИТ-проектов в:

·соответствие законодательству, стандартам и применяемым методам проектирования и разработки информационных систем в РК;

·принципы методики должны обеспечить ее применение, как на стороне Заказчика, так и на стороне Разработчика;

·методика должна базироваться на измерении функционального размера функциональных требований пользователя;

·методика должна основываться на процессах жизненного цикла информационных систем;

·в качестве входных данных должны использоваться требования к информационной системе;

·применение методики для оценки любых информационных систем.

·использование нотации UML, как унифицированного языка для описания требований и структуры информационной системы;

·использование сущностей UMLв качестве входных данных для методики.

За период 2010-2011 годы Ассоциаций IT-компаний была разработана Методика оценки трудоемкости и стоимости разработки и сопровождения прикладного программного обеспечения при создании информационных систем (Методика CETIN: C - Case, E - Entity, T - Tool, I - Interaction, N - Node.).

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

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

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

1.Понятийный аппарат

В методике применяются понятия и термины приведенные ниже:

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

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

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

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

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

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

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

Программное обеспечение (software): Набор машинных команд, программ, процедур, функций и связанных с ними артефактов.

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

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

Сопровождение прикладного программного обеспечения информационной системы - управление модификацией, миграцией и выводом из действия компонентов системы (например, ее аппаратного, программного и сетевого обеспечения и соответствующей документации) в соответствии с запросами заказчиков. Причинами таких запросов могут быть выявленная проблема или потребность в усовершенствовании или адаптации. Целью запросов могут быть модификация и/или вывод из действия существующих систем и/или программных средств при сохранении целостности деятельности организации. (ENG.2 СТ РК ИСО/МЭК ТО 15504-2).

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

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

Узел (node) - процессор или устройство.

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

Функциональный размер - размер прикладного программного обеспечения, измеряемый в функциональных единицах измерения и определяемый измерением количества функциональных требований пользователя.(Unified Modeling Language) - унифицированный язык моделирования, использующий графическую нотацию и предназначенный для спецификации, конструирования и документирования систем программного обеспечения, визуализации, разрабатываемых на основе объектно-ориентированных технологий и компонентного подхода. Язык универсальный, не от конкретных языков программирования, используемых при реализации разрабатываемых систем. Он не ориентируется также на какой-либо конкретный технологический процесс разработки. UML может быть адаптирован к различным процессам.

2.Порядок оценки трудоемкости разработки прикладного программного обеспечения

Порядок оценки трудоемкости разработки ППО представлен следующими этапами:

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

Оценка функционального размера информационной системы производится на основании модели информационной системы и функциональных требований пользователей. Функциональный размер ИС представляет собой пять функциональных единиц измерения.

этап. Оценка базовой трудоемкости

На данном этапе оценивается базовая трудоемкость каждого основного процесса разработки ППО ИС в человеко-месяцах. Базовая трудоемкость каждого процесса определяется на основе нормативов трудоемкости.

этап. Определение поправочных коэффициентов

Согласно выявленным характеристикам системы и внешним факторам по отношению к системе определяются значения поправочных коэффициентов.

этап. Расчет трудоемкости с учетом поправочных коэффициентов

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

этап. Оценка срока разработки информационной системы

На данном этапе оценивается средний срок разработки ППО ИС.

этап. Корректировка трудоемкости разработки ППО при уменьшении срока разработки.

На данном этапе производится корректировка трудоемкости разработки ППО ИС в случае уменьшения среднего срока разработки ППО ИС на основе коэффициента эластичности трудоемкости.

этап. Оценка стоимости разработки ППО

На данном этапе, на основании рассчитанной трудоемкости создания ППО ИС определяется стоимость создания ППО ИС.

.Оценка функционального размера ИС

Оценка функционального размера ИС производится на основании модели информационной системы и функциональных требований пользователей.

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

1) количество вариантов использования (Case) - C;

) количество типов объектов (бизнес объектов) (Entity) - Е;

) количество свойств типов объектов (Tool) - Т;

) количество взаимодействий между типами объектов (Interaction) - I;

) количество типов узлов (Node) - N.

Функциональный размер обозначается как SIZE={C, E, T, I ,N}

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

Для оценки функционального размера рекомендуется использовать модель информационной системы, реализованной на языке моделирования UML. Для применения методики желательно изначально иметь следующие диаграммы: диаграмма вариантов использования (Use case diagram, диаграмма прецедентов), диаграмма классов (Class diagram), диаграмма коммуникаций (Communication diagram) и диаграмма развертывания (Deployment diagram). Если необходимые диаграммы построены, то расчет выполняется следующим образом:

Шаг 1. Количество вариантов использования (С) определяется из диаграммы вариантов использования модели информационной системы.

Шаг 2. Количество типов объектов (E) оценивается подсчетом количества неодинаковых классов, изображенных на диаграммах классов;

Шаг 3. Количество свойств типов объектов (T) оценивается подсчетом количества свойств классов, изображенных на диаграммах классов;

Шаг 4. Количество взаимодействий между типами объектов (I) оценивается подсчетом количества связей (отношений) между классами на диаграмме коммуникаций;

Шаг 5. Количество типов узлов (N) оценивается подсчетом количества типов узлов на диаграмме развертывания.

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

4.Расчет базовой трудоемкости разработки ППО

Базовая трудоемкость создания ППО ИС {Sj, j=1-6} определяется на основе оценки трудоемкости каждого процесса разработки ППО ИС. Ниже приведен перечень основных процессов разработки ППО ИС согласно методологии RUP:

) бизнес моделирование;

) управление требованиями;

) проектирование;

) реализация;

) тестирование;

) развертывание.

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

Базовая трудоемкость Sj процесса разработки с номером j рассчитывается по следующей формуле:

Sj=1/165·[C*Sj(C)+E*Sj(E)+T*Sj(T)+I*Sj(I)+N*Sj(N)], (1)

Sj - трудоемкость процесса разработки с номером j в [человеко-месяц];- номер процесса разработки (значения от 1 до 6);(C) - норматив трудоемкости реализации одного варианта использования в процессе разработки с номером j=1,2,…,6, {[человеко-час]/[вариант использования]};(E) - норматив трудоемкости реализации одного типа объектов в процессе разработки с номером j=1,2,...,6. {[человеко-час]/[тип объектов]};(T) - норматив трудоемкости реализации одного свойства типа объекта в процессе разработки с номером j=1,2,...,6. {[человеко-час]/[свойство типа объектов]};(I) - норматив трудоемкости реализации одного взаимодействия между типами объектов в процессе разработки с номером j=1,2,...,6. {[человеко-час]/[взаимодействие между типами объектов]};(N) - норматив трудоемкости реализации одного типа узла в процессе разработки с номером j=1,2,...,6. {[человеко-час]/[узел]};

- количество человеко-часов в одном человеко-месяце;

{C, E,T,I,N} - функциональный размер ИС.

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

.Определение поправочных коэффициентов к трудоемкости

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

Поправочные коэффициенты трудоемкости процессов разработки ППО ИС определяются рассчитываются по формулам (2)-(7) через частные поправочные коэффициенты разработки и сопровождения ППО:

) КП1=К11·К16·К17; (2)

) КП2=К1·К2·К4·К5·К6·К7·К8·К9·К16·К17·К18; (3)

)КП3=К1·К2·К4·К5·К6·К7·К8·К9·К11·К12·К13·К14·К15·К16·К17·К18; (4) 4) КП4 = К1·К2·К4·К5·К6·К7· К8·К9·К10·К12· К13·К14·К15·К16· К17·К18;(5)

)КП5=К1·К2·К4·К5·К6·К7·К8·К9·К10·К11·К12·К13·К14·К15·К16·К17·К18; (6)

) КП6=К1·К2·К11·К16·К18. (7)

Перечень частных поправочных коэффициентов приведен в таблице П2.2 приложения 2.

Все частные поправочные коэффициенты являются безразмерными величинами и сгруппированы в три группы в зависимости от типов влияющих факторов:

-внутренние факторы,

-факторы среды;

-факторы данных.

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

Границы значений частных поправочных коэффициентов приведены в таблице П2.2 приложения 2.

. Расчет трудоемкости с учетом поправочных коэффициентов

На основании поправочных коэффициентов к трудоемкости разработки ППО делается расчет трудоемкости разработки ППО с учетом поправочных коэффициентов по следующей формуле:

S=КП1*S1+КП2*S2+КП3*S3+КП4*S4+КП5*S5+КП6*S6, (8)

где:- скорректированная трудоемкость процесса разработки ППО в человеко-месяцах;- базовая трудоемкость процесса разработки с номером j в человеко-месяцах;

КПj - поправочный коэффициент трудоемкости процесса разработки с номером j.

. Оценка срока разработки информационной системы

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

Зависимость срока разработки от трудоемкости приведена в таблице П2.3 приложения 2.

Для определения срока разработки ППО ИС необходимо для значения S (трудоемкости создания ППО ИС) найти минимальное и максимальное количество месяцев разработки ППО ИС по данным, указанным в таблице П2.3 приложения 2. Среднее арифметическое определенное по минимальному и максимальному значению количества месяцев разработки ППО ИС является оценкой срока разработки ППО ИС.

Срок разработки ППО может быть уменьшен до минимального срока разработки. При этом посчитанная трудоемкость разработки увеличивается пропорционально коэффициенту эластичности трудоемкости из таблицы П2.4 приложения 2. Если срок разработки уменьшается на Х%, то трудоемкость разработки увеличивается на L*X%, где L - коэффициент эластичности трудоемкости.

. Оценка стоимости разработки ППО

Определение стоимости создания ППО ИС основано на расчете средней стоимости одного человека-месяца инженера-программиста и трудоемкости создания ППО ИС.

На стоимость создания ИС влияют следующие факторы:

) срок разработки проекта;

) планируемое начало или конец проекта;

) место реализации;

) уровень ежегодной инфляции.

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

Определяется зарплата по профессии «Инженер программного обеспечения» для конкретного места реализации проекта за последний завершенный год -Зср0. Далее за предыдущие три года определяется средний размер инфляции как среднеарифметическое значение трех последних законченных-Иср. По формуле (9) определяем среднее количество лет реализации проекта:

, (9)

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

Для каждого года реализации i определяем среднемесячную номинальную заработную плату Зсрi по формуле (10):

, (10)

где i меняется от 1 до Гср.

Далее для каждого года реализации определяем соответствующую среднюю стоимость 1 человека-месяца инженера-программиста Сiср по формуле (11):

, (11)

где:меняется от 1 до Гср;

ПСН - социальный налог с учетом отчислений в фонд обязательного социального страхования в процентах от среднемесячной заработной платы;

ПНР - накладные расходы (аренда, командировочные, канцелярские товары, отпускные и др.) в процентах от среднемесячной заработной платы;

ПРП - расходы периода (расходы на административный управленческий персонал и маркетинг) в процентах от среднемесячной заработной платы;

ПР - рентабельность,

ПНДС - налог на добавленную стоимость.

Значения нормативных коэффициентов расхода разработчика (ПНР, ПРП, ПР ) приведены в таблице П2.4 приложения 2.

Определяем трудоемкость разработки ИС по годам реализации Si по формуле (12):

= S/ГСР, (12)

где i меняется от 1 до ГСР.

Стоимость работ на создание ППО ИС - СППО производится по формуле (13):

, (13)

. Оценка трудоемкости и стоимости развития ППО ИС

Процесс развития ППО ИС заключается в создании новых компонентов или модулей ИС. Модификация и удаление существующих компонентов ИС производится в процессе сопровождения системы. Оценка трудоемкости и стоимости создания новых компонентов ИС является оценкой трудоемкости и стоимости развития ППО ИС. Оценка трудоемкости и стоимости создания новых компонентов ИС проводиться аналогично оценке трудоемкости и стоимости создания ППО ИС.

. Оценка стоимости сопровождения ППО ИС

Стоимость сопровождения ППО ИС оценивается как доля от стоимости создания текущей версии ППО. Стоимость сопровождения ППО ИС в течение одного года - ССППО определяется от стоимости создания текущей версии ППО по формуле (14):

, (14)

где:

частные поправочные коэффициенты разработки и сопровождения ППО К2, К3, К16 определяются в таблице П2.2 приложения 2,- коэффициент трудоемкости сопровождения ППО определяется из значений нормативных коэффициентов расхода разработчика в таблице П2.4 приложения 2. [6]

1.2 Формирование требований и выбор варианта решения

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

Оценка по методике COCOMO заключается в оценке строк кода разрабатываемой системы. Соответственно стоимость разработки можно оценить на основании реализованной системы.

Методики COCOMO и IFPUG не могут оценить стоимость разработки информационной системы на ранних этапах создания, в отличие от методики CETIN, которая применяется на этапе технико-экономического обоснования проекта создания информационной системы при планировании бюджета, что позволяет использовать её при осуществлении государственных закупок. Поэтому я выбираю методику CETIN для разработки инструментария в рамках ВКР.

2. Архитектура программного продукта и требования к платформе

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

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

Сначала вводится функциональный размер ИС, состоящий из пяти функциональных единиц измерения:

  • количество вариантов использования - C;
  • количество типов объектов - E;
  • количество свойств типов объектов - Т;
  • количество взаимодействий между типами объектов - I;
  • количество типов узлов - N.

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

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

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

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

В итоге пользователь видит срок разработки ИС, стоимость разработки и стоимость сопровождения ИС.

При разработке данной программы использовался язык программирования JavaScript, библиотеку jQuery, каскадные таблицы стилей (CSS). О них я расскажу подробнее чуть позже.код представляет собой обычный текстовый документ, который написан по специальным правилам.

Практически все современные браузеры поддерживают Javascript, например эти: Internet Explorer,Opera, Google Chrome, FireFox и др. В браузерах есть специальный модуль, который может обрабатывать команды, написанные на этом языке и приводить их в понятный вид. То есть никаких специальных программ для просмотра приложения не нужно.

На рисунке 2.1 показана архитектура программы.

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

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

Рисунок 2.1 - Архитектура приложения

3. Алгоритмизация и программирование

3.1 Разработка алгоритма задания параметров и вычисления трудоёмкости и стоимости программного продукта

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

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

3.2 Программная реализация

Исходные данные берутся из предварительно составленных диаграмм на языке UML, для этого разработаны различные программы. Например, ArgoUML. Если таких диаграмм нет, то может помочь метод из приложения 1.

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

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

Код приложения заказчика находится в пункте 1 приложения 1 , код приложения подрядчика - в пункте 2 приложения 1, функции JavaScript - в пункте 3 приложения 1 , текст файла CSS - в пункте 4 приложения 1, код страницы инициализации - в пункте 5 приложения 1.

Для программной реализации использовались JavaScript, CSS и JQuery.

  • JavaScript

JavaScript - это интерпретируемый язык программирования с объектно-ориентированными возможностями. С точки зрения синтаксиса базовый язык JavaScript напоминает C, C++ и Java такими программными конструкциями, как инструкция if, цикл while и оператор &&. Однако это подобие ограничивается синтаксической схожестью. JavaScript - это нетипизированный язык, т. е. в нем не требуется определять типы переменных. Объекты в JavaScript отображают имена свойств на произвольные значения. Этим они больше напоминают ассоциативные массивы Perl, чем структуры C или объекты C++ или Java. Механизм объектно-ориентированного наследования JavaScript сильно отличается от механизма наследования в C++ и Java. Как и Perl, JavaScript - это интерпретируемый язык, и некоторые его инструменты, например регулярные выражения и средства работы с массивами, реализованы по образу и подобию языка Perl. Ядро языка JavaScript поддерживает работу с такими простыми типами данных, как числа, строки и булевы значения. Помимо этого он обладает встроенной поддержкой массивов, дат и объектов регулярных выражений. Обычно JavaScript применяется в веб-браузерах, а расширение его возможностей за счет введения объектов позволяет организовать взаимодействие с пользователем, управлять веб-браузером и изменять содержимое документа, отображаемое в пределах окна веб-браузера. Эта встроенная версия JavaScript запускает сценарии, внедренные в HTML код веб-страниц. Как правило, эта версия называется клиентским языком JavaScript, чтобы подчеркнуть, что сценарий исполняется на клиентском компьютере, а не на веб-сервере. В основе языка JavaScript и поддерживаемых им типов данных лежат международные стандарты, благодаря чему обеспечивается прекрасная совместимость между реализациями.

В соответствии со стандартом ECMA_262 язык официально называется ECMAScript. Но это несколько неудобное название используется только в случае, если необходимо явно сослаться на стандарт. Чисто технически название «JavaScript» относится только к реализации, выполненной Netscape и Mozilla Foundation. Однако на практике все предпочитают использовать это название для обозначения любой реализации JavaScript [7].

  • JQuery

jQuery - библиотека JavaScript, фокусирующаяся на взаимодействии JavaScript и HTML. Библиотека jQuery помогает легко получать доступ к любому элементу DOM, обращаться к атрибутам и содержимому элементов DOM, манипулировать ими.

Основной целью создания jQuery автор видел возможность закодировать многоразовые куски кода, которые позволят упростить JavaScript и использовать их так, чтобы не беспокоиться о кросс-браузерных вопросах [8].

Благодаря использованию этой библиотеки и ее возможности закодировать многоразовые куски кода, была создана функция для генерации выпадающих списков (function generateSelect). Это позволило сократить количество кода, написав её лишь один раз, появилась возможность использовать её для выбора всех частных поправочных коэффициентов в приложении. Так как приложение построено пошагово, и каждый следующий шаг аналогичен предыдущему, то с использованием этой же возможности были написаны функции, например, для создания каждого шага, для обработки кнопок «НАЗАД» и «ДАЛЕЕ».

  • CSS

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

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

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

CSS состоит из селекторов и правил представления.

Селекторы определяют элементы HTML-документа, для которых описываются правила.

В своем приложении я использовала, например, такие селекторы, как H1- для описания заголовка и step - для описания шагов. Внутри селектора step существует несколько псевдоклассов. От основного элемента псевдоклассы отделяются двоеточиями. Были созданы псевдоклассы шагов, для активного (текущего) шага, заголовков, содержания, кнопок в обычном состоянии, при наведении на них курсором, при нажатии на них.

3.3 Разработка интерфейса пользователя

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

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

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

Первой рассмотрим страницу инициализации.

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

Рисунок 3.3.1-Страница инициализации

Рассмотрим форму заказчика.

Расчет состоит из семи шагов, на восьмом показывается итог.

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

Первый шаг - ввод функционального размера.

Второй и третий шаги - выяснение внутренних характеристик системы.

Четвертый шаг - факторы среды.

На пятом шаге показан средний срок разработки и предлагается уменьшить его.

Шестой шаг - скорректированный срок разработки.

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

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

Далее приведен интерфейс приложения заказчика.

Рисунок 3.3.2-Выбор внутренних факторов

Рисунок 3.3.3- Выбор факторов среды

Рисунок 3.3.4 - Результаты расчета трудоемкости

Рисунок 3.3.5 - Результаты расчета скорректированной трудоемкости

Рисунок 3.3.6 - Ввод данных для получения стоимости разработки

Рисунок 3.3.7-Результаты расчета

Рассмотрим форму подрядчика.

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

Интерфейс приложения подрядчика:

Рисунок 3.3.8-Ввод функционального размера

Первый шаг - ввод функционального размера.

Второй, третий и четвертый шаги - выяснение внутренних характеристик системы. Отличием является уточнение языка разработки.

Пятый шаг - факторы среды. Дополнительно выясняется готовность ИС

На шестом шаге выясняется, какое представление данных будет в ИС.

Седьмой шаг - расчет трудоемкости и предлагается уменьшить срок разработки.

Восьмой шаг - скорректированная трудоемкость и срок разработки.

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

Рисунок 3.3.9 -Ввод коэффмциентов базавой трудоемкости

Рисунок 3.3.10- Выяснение внутренних характеристик системы.

Рисунок 3.3.11 - Факторы среды

Рисунок 3.3.12 -Факторы данных

Рисунок 3.3.13-Результат расчета трудоемкости

Рисунок 3.3.14-Результат расчета скорректированной трудоемкости

Рисунок 3.3.15-Получение стоимости разработки

Рисунок 3.3.16-Результаты расчета

3.4 Разработка форм ввода параметров расчёта и статистики по собственным проектам, отчётных форм (не менее 2)

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

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

Учёт статистики по собственным проектам предполагает следующее:

Перед началом проекта были выполнены предварительные оценки размерности (CETIN), выбраны значения нормативной трудоёмкости и поправочных коэффициентов,

рассчитана базовая трудоёмкость и сделаны поправки на сокращение срока выполнения проекта.

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

Формы ввода для начала:

ввод реальной размерности (CETIN)

ввод данных по трудоёмкости составляющих каждого процесса

ввод значений коэффициентов из предварительного расчёта (в диалоге или из базы по номеру проекта)

Запуск расчётной процедуры

Запрос вывода реальных нормативов трудоёмкости по проекту и сравнения со стандартными

Решение о занесении результатов в базу, либо о корректировке значений поправочных коэффициентов.

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

Таблица 2- Статистика по собственным проектам

Исходные данныеколичество вариантов использования - C1212количество типов объектов - E2626количество свойств типов объектов - Т134134количество взаимодействий между типами объектов - I102102количество типов узлов - N44Характеристики:Коэффициент предлагаемыйКоэффициент корректированныйРежим эксплуатации ИС: обработка данных в режиме разделения времени;1,01,02Масштаб ИС: средние ИС (от 11 до 100 пользователей с длительным ЖЦ с возможностью роста до крупных систем);1,01,0Стабильность ИС: дискретное внесение изменений;1,01,0Защита от несанкционированного доступа: средняя;1,02Защита программ и данных (на уровне операционной системы, на уровне сетевого программного обеспечения, на уровне СУБД): средняя1,01,05Контрольный след операций: не имеется;1,01,0Отказоустойчивость: средняя;1,01,0Продолжение таблицы 2 - Статистика по собственным проектамВосстанавливаемость: средняя;1,01,0Длительность обработки (время отклика): умеренная;1,01,0Исходный язык разработки: объектно-ориентированный (С++ или эквивалентный);1,01,0Класс пользователя: специалист( эксперт);1,01,0Требования к центральному обрабатывающему устройству (процессору): средняя;1,01,0Требования к оперативной (основной) памяти: большая;1,00,7Требования к внешней памяти: большая;1,00,7Требования к локальной вычислительной сети: высокие требования;1,01,0Критичность ИС: организационная безопасность;1,01,0Готовность: общедоступная (известная методика);1,01,0Представление данных: индексируемый1,01,0Заработная плата разработчика60 00060 000Инфляция за 2013 год6,586,58Инфляция за 2014 год6,456,45Инфляция за 2015 год11,3611,36Процент социальных выплат , %;2222Процент НДС, %.1313Итоги:Трудоемкость, (человеко-месяцы)216,23231,89Срок разработки, (месяцы)54Число разработчиков, (человек)4358Стоимость разработки, (рубли)47215115,9650634309,49Стоимость сопровождения, (рубли)7082267,397595146,42

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

3.5 Разработка организационно-технических решений по обеспечению информационной безопасности применения продукта

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

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

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

Если все же возникает потребность передачи информации по каналам связи, выходящим за пределы предприятия, необходимо использовать защищенные каналы связи, в том числе защищенные волоконно-оптические линии связи или предназначенные для этого криптографические средства защиты информации, согласно пункту 5.3.5 СТР-К. [9]

4. Отладка и тестирование продукта

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

Тестирование начинается с разработки множества тестов и их исполнения на основе одной из выбранных методик.

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

Тестирование проводится для приложения подрядчика, так как ввод данных в обоих приложениях аналогичен.

Исходные данные и результаты тестирования сведены в таблицу 2. Графа оценка определяет соответствие результатов ожидаемым («+» - соответствуют, «-» - нет).

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

Как видно из таблицы 3 попытки ввода некорректных значений не привели к сбою работы системы. В целом спроектированная система соответствует предъявленным требованиям, что говорит о качественном программном продукте.

Таблица 3 - Тестирование программы

Исходные данныеРезультатОценкаЗапуск программыОткрытие программы в браузере. Пункты: Инициализация .+Ввод количества вариантов использования, количества типов объектов, количества свойств объектов, количества взаимодействий между типами объектов, количества типов узлов (числовое значение)Переход на следующий шаг с помощью кнопки «ДАЛЕЕ»+Нажатие на кнопку «ДАЛЕЕ» при некорректном вводе количества вариантов использования, количества типов объектов, количества свойств объектов, количества взаимодействий между типами объектов, количества типов узловСообщение «Некорректный ввод данных»+Ввод нового срока разработки на шаге «6. Результаты расчета трудоемкости» (числовое значение)Переход на следующий шаг с помощью кнопки «ДАЛЕЕ», или, при необходимости, на предыдущий шаг с помощью кнопки «НАЗАД»+Нажатие на кнопку «ДАЛЕЕ» при некорректном вводе нового срока разработкиСообщение «Некорректный ввод данных»+Нажатие на кнопку «НАЗАД» при некорректном вводе нового срока разработкиСообщение «Некорректный ввод данных»+Ввод заработной платы разработчика, инфляции за 3 предыдущих года, процента социальных выплат и процента НДС на шаге «8. Ввод данных для получения стоимости разработки» (числовое значение)Переход на следующий шаг с помощью кнопки «ДАЛЕЕ», или, при необходимости, на предыдущий шаг с помощью кнопки «НАЗАД»+Нажатие на кнопку «ДАЛЕЕ» при некорректном вводе заработной платы разработчика, инфляции за 3 предыдущих года, процента социальных выплат и процента НДССообщение «Некорректный ввод данных»+Нажатие на кнопку «НАЗАД» при некорректном вводе заработной платы разработчика, инфляции за 3 предыдущих года, процента социальных выплат и процента НДССообщение «Некорректный ввод данных»+Шаг «9. Итоги»На форме Результаты подсчета выведены все требующиеся результаты: трудоемкость, сроки разработки, число разработчиков, стоимость разработки, стоимость сопровождения.+

4.1 Подготовка данных контрольного примера

Для контрольного примера возьмем такой набор исходных данных:

количество вариантов использования - C = 12;

количество типов объектов - E = 26;

количество свойств типов объектов - Т = 134;

количество взаимодействий между типами объектов - I = 102;

количество типов узлов - N = 4.

Характеристики:

Режим эксплуатации ИС: обработка данных в режиме разделения времени;

Масштаб ИС: средние ИС (от 11 до 100 пользователей с длительным ЖЦ с

возможностью роста до крупных систем);

Стабильность ИС: дискретное внесение изменений;

Защита от несанкционированного доступа: средняя;

Защита программ и данных (на уровне операционной системы, на уровне сетевого программного обеспечения, на уровне СУБД): средняя;

Отказоустойчивость: средняя;

Восстанавливаемость: средняя;

Длительность обработки (время отклика): умеренная;

Исходный язык разработки: объектно-ориентированный (С++ или эквивалентный);

Класс пользователя: специалист( эксперт);

Требования к центральному обрабатывающему устройству (процессору): средняя;

Требования к оперативной (основной) памяти: большая;

Требования к внешней памяти: большая;

Требования к локальной вычислительной сети: высокие требования;

Критичность ИС: организационная безопасность;

Готовность: общедоступная (известная методика);

Представление данных: индексируемый (иерархический).

Заработная плата разработчика: 60 000 руб.;

Инфляция за 2012 год: 6,58;

Инфляция за 2013 год: 6,45;

Инфляция за 2014 год: 11,36;

Процент социальных выплат = 22 %;

Процент НДС = 13%.

Срок разработки уменьшать не будем.

В ходе расчетов определяем базовые трудоемкости основных процессов:

Бизнес моделирование: S1 = 15,55;

Управление требованиями: S2 = 21,2;

Проектирование: S3 = 62,27;

Реализация: S4 = 78,65;

Тестирование: S5 = 6,47;

Развертывание: S6 = 1,21;

На основе выбранных характеристик считаем поправочные коэффициенты:

КП1=КП2=КП3=КП4=КП5=КП6=1;

Трудоемкость разработки : S=185, 35 (человеко-месяцев)

На основе таблицы П2.3 приложения 3 находим минимальный и максимальный сроки разработки, рассчитываем средний срок разработки: 8,5 месяцев.

Средняя стоимость 1 человека-месяца разработчика: Сср = 228996,2 руб.;

Стоимость работ на создание ППО ИС: СППО = 185.35*228996 =42444451.23 руб.;

Стоимость сопровождения ППО ИС: CCППО = 6366667,685 руб.

4.2 Анализ результатов расчёта и выводы

Произведем расчет с помощью приложения, введя те же исходные данные.

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

Рисунок 4.1 - Результат контрольного примера

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

5. Разработка руководства пользователя

Система обладает интуитивно понятным web-интерфейсом, поэтому пользователю нужно лишь освоиться на начальном этапе работы.

Инструкция по использованию:

  1. Запустите файл zakaz.html в любом браузере.
  2. На первом шаге Вам необходимо ввести функциональные единицы измерения C, E, T, I, N.
  3. Дальнейшие действия направлены на уточнение характеристик ИС. Переходя по шагам, необходимо в выпадающих списках выбрать те варианты, которые Вы считаете адекватными.
  4. На пятом шаге будет показан предполагаемый срок разработки. Если Вы желаете его уменьшить, то можно ввести новый срок. Но стоит учесть, что в таком случае увеличится трудоёмкость разработки и, соответственно, затраты на разработку. На следующем шаге Вы увидите скорректированный срок разработки.
  5. Следующим шагом нужно ввести значения заработной платы разработчика в Вашем регионе, уровень инфляции за последние три года. Процент социальных выплат и НДС.
  6. В итоге будет показан срок разработки, стоимость разработки и сопровождения программного продукта.
  7. Если Вы хотите изменить какие- либо характеристики или значения, то есть возможность вернуться на тот шаг, где они выбираются, и выбрать новое значение.
  8. Для закрытия программы можно закрыть вкладку или весь браузер полностью.

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

Для разработки руководства пользователя я решила использовать программу HTML Help Workshop.

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

Возможности HTML Help Workshop имеют некоторые преимущества перед стандартным гипертекстом - это способность снабжения справочной системы комбинированной таблицей содержания и перечнем указателей, а также использование ключевых слов для дополнительной гиперссылочной производительности. Компилятор HTML Help, являющийся частью HTML Help Workshop, делает возможным сжатие гипертекста, графики и других файлов в сравнительно небольшой компилированный справочный файл (.chm), который может затем распространяться с программным обеспечением или загружаться из сети.Help Workshop состоит из неавтономной программы просмотра справки (Help Viewer), связанных с ней справочных компонентов и авторских систем по разработке справки от корпорации Microsoft. Программа просмотра справки использует лежащие в ее основе компоненты Microsoft Internet Explorer для отображения справочного содержимого. Программа просмотра поддерживает гипертекст, ActiveX, Java, языки скриптов (JScript и Microsoft Visual Basic Scripting Edition), а также сетевые форматы изображений (файлы .jpeg, .gif и .png).

  • Структура CHM-документа
  • Простейший CHM-документ состоит из обычных гипертекстовых страниц, объединенных впоследствии в сжатый (откомпилированный) сборочный файл. После создания подобного документа для того, чтобы преобразовать его в полнофункциональный справочный файл, можно добавить к нему ряд навигационных панелей, облегчающих поиск информации в проекте.
  • Например, закладка TOC "Содержание" (Table of Contents, таблица содержания), куда можно вывести ссылки на гипертекстовые страницы, помещенные в документ, образовав иерархическую структуру с разворачивающимися и сворачивающимися сегментами.
  • Индексная закладка "Указатель", позволяет по ключевому слову найти требуемую страницу или совокупность страниц.
  • Закладка "Поиск" производит поиск введенного слова в тексте и просматривает страницы, содержащие это .
  • Достоинства HTML Help Workshop
  • При создании страниц проекта можно использовать весь механизм языка разметки гипертекста, добавлять скрипты JavaScript и VBScript или каскадные таблицы стилей CSS.
  • Возможность быстро открыть любую страницу справочного документа, выбрав из меню "Параметры" команду "Перейти по адресу...".
  • Возможность просмотреть любую страницу в исходном гипертекстовом коде.
  • Недостатки HTML Help Workshop

Возможность смотреть CHM-файлы присутствует только в операционных системах семейства Windows, где установлен Internet Explorer не ниже 4-й версии. [10]

На рисунках 5.1 - 5.2 приведены примеры интерфейса справки.

Рисунок. 5.1 - Интерфейс руководства пользователя

Рисунок 5.2 - Интерфейс руководства пользователя

Заключение

В ходе выпускной квалификационной работы был разработан инструментарий для расчета трудоёмкости и стоимости разработки программного продукта по методике CETIN.

В процессе выполнения данной работы был проведен следующий комплекс работ:

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

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

разработан алгоритм программы, определены интерфейсы и все программно реализовано;

проведено функциональное тестирование системы;

разработано руководство пользователя системы;

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

Таким образом, разработанная программа является готовым и работоспособным продуктом.

Список использованных источников

  1. Группа компаний SRG. [Электронный ресурс]: статья - Режим доступа: #"justify">КСИ Фактор. Проектирование и разработка ПО. [Электронный ресурс]: статья - Режим доступа: #"justify">Портал выбора технологий и поставщиков. [Электронный ресурс]: статья - Режим доступа: #"justify">Портал «Корпоративный менеджмент». [Электронный ресурс]: статья - Режим доступа: #"justify">Кафедра экономической кибернетики ДВНЗ УАБС НБУ. [Электронный ресурс]: статья - Режим доступа: #"justify">Об утверждении нормативов затрат на создание, развитие и сопровождение информационных систем: Приказ и.о. Министра транспорта и коммуникаций Республики Казахстан от 25 октября 2012 года № 722. Зарегистрирован в Министерстве юстиции Республики Казахстан 12 ноября 2012 года № 8075
  2. JavaScript. Подробное руководство. - Пер. с англ/. Флэнаган Д. - СПб: Символ_Плюс, 2008. - 992 с., ил.
  3. AJAX: программирование для Интернета / Е.С. Бенкен, Г.А. Самков. - СПб.: БХВ-Петербург, 2009. - 464 с.
  4. Об утверждении специальных требований и рекомендаций по технической защите конфиденциальной информации: Решение Коллегии Гостехкомиссии от 02 марта 2001 года № 7.
  5. Технологии разработки программного обеспечения: методические указания к выполнению лабораторной работы «Разработка справочной системы с помощью программы HTML Help Workshop». - Вологда. ВоГТУ, 2013. - 23 с.

Приложение 1

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

  1. Оценка количества вариантов использования информационной системы.

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

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

Помощь в выявлении актеров окажут ответы на вопросы, приведенные в следующей таблице, которую рекомендуется заполнить.

Таблица П1.1 - рекомендуемые вопросы для выявления актеров

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

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

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

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

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

Таблица П1.2 - рекомендуемые вопросы для выявления вариантов использования

ВопросыОтветыКакие задачи решает каждый актер?Способен ли тот или иной актер создавать, сохранять, изменять, удалять или считывать фрагменты данных в контексте системы?Какие варианты использования гарантируют выполнение указанных выше функций обработки данных?Какие варианты использования связаны с поддержкой и администрированием системы?Какие специфические функциональные требования предъявляет каждый актер к информационной системе?

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

Таблица П1.3 - перечень актеров и вариантов использования

№Наименование актераНаименование варианта использования1Актер 1Вариант использования 1Вариант использования 22Актер 2Вариант использования 2Вариант использования 43Актер 3Вариант использования 1Вариант использования 3

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

Таблица П1.4 - перечень вариантов использования

№Наименование варианта использования1.Вариант использования 12.Вариант использования 23.Вариант использования 34.Вариант использования 4

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

-Количество вариантов использования (С) - количество записей таблицы 4.

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

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

Таблица П1.5 - перечень типов объектов предметной области

№АктерВариант использованияТипы объектов предметной области1.Актер 1Вариант использования 11.1.Тип объекта 11.2.Тип объекта 21.3.Тип объекта 31.4Вариант использования 21.5Тип объекта 41.6Тип объекта 51.7Тип объекта 22.Актер 2Вариант использования 22.1.Тип объекта 42.2.Тип объекта 52.3.Тип объекта 22.4Вариант использования 42.5Тип объекта 22.6Тип объекта 53.Актер 3Вариант использования 13.1.Тип объекта 13.2.Тип объекта 23.3.Тип объекта 33.4Вариант использования 33.5Тип объекта 13.6Тип объекта 43.7Тип объекта 6

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

-Количество типов объектов (E) - количество различных (неодинаковых) типов объектов, полученных из столбца «типы объектов предметной области»

  1. Оценка количества свойств типов объектов

Для оценки размера функциональной единицы «Количество свойств типов объектов» достаточно посчитать количество свойств классов на диаграммах классов. Если диаграмма классов не построена, тогда оценщик определяет для каждого типа объекта количество его свойств и заносить результат в следующую таблицу 6.

Таблица П1.6 - количество свойств типов объектов

№АктерыВарианты использованияТипы объектов предметной областиКоличество свойств (атрибутов), которые не являются ссылкой

На основании записей таблицы можно сделать оценку следующей функциональной единицы измерения:

-Количество свойств типов объектов (T) - сумма значений столбца «Атрибуты, которые не являются ссылкой», для различных (не одинаковых) типов объектов.

  1. Оценка количества взаимодействий между типами объектов

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

Таблица П1.7 - Взаимодействия между типами объектов

Тип (1)Тип (2)Тип (3)…Тип (n-1)Тип (n)Тип (1)101…10Тип (2)0…11Тип (3)110…11…001…10Тип (n-1)010…00Тип (n)011…00

Каждая ячейка таблицы равна либо 0, либо 1. Если тип объектов строки взаимодействует с типом объектов столбца таблицы, то в ячейку на пересечении соответствующей строки и столбца записывается значение 1, в противном случае - 0.

На основании записей в таблице 7 производится оценка следующей функциональной единицы измерения:

-Количество взаимодействий между типами объектов (I) - сумма значений всех ячеек таблицы 7.

  1. Оценка количества типов узлов

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

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

Оценка функциональной единицы измерения производится следующим образом:

-Количество типов узлов (N) - количество типов процессоров и устройств, используемых при функционировании системы.

  1. Определение функционального размера

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

Таблица П1.8 - функциональный размер

количество вариантов использованияколичество типов объектовколичество свойств типов объектовколичество взаимодействий между типами объектовколичество узловSIZEСETIN

Приложение 2

Таблица П2.1 - Нормативы трудоемкости по процессам в разрезе функциональных единиц

№Наименование процессаФункциональная единица измерениявариант использованиятип объектасвойства типа объектсвойства взаимоотношения между объектамитип узлаТрудоемкость, чел.час1Бизнес моделирование32,1228,330,0014,150,002Управление требованиями58,0328,040,0020,320,003Проектирование45,4261,7531,3537,5224,024Реализация31,5781,5150,7236,110,005Тестирование88,960,000,000,000,006Развертывание8,690,000,000,0023,74

Таблица П2.2 - Частные поправочные коэффициенты трудоемкости разработки и сопровождения прикладного программного обеспечения

Группа частных поправочных коэффициентовФактор и обозначение частного поправочного коэффициентаОписание фактора частного поправочного коэффициентаЗначениеВнутренние факторыРежим эксплуатации ИС К1Определяется в зависимости от конкретных технологий или типов обработки, принятых в системе программного обеспечения. Принимает следующие значения:обработка данных в режиме разделения времени1параллельная обработка данных1,04обработка данных в режиме реального времени1,05совмещенная обработка данных1,07Масштаб ИС К2Масштаб может быть определен количеством одновременно работающих пользователей. Принимает следующие значения:малые ИС (до 10 пользователей с непродолжительным ЖЦ)0,95средние ИС (от 11 до 100 пользователей с длительным ЖЦ с возможностью роста до крупных систем)1крупные ИС (от 101 до 1000 пользователей с длительным ЖЦ и миграцией унаследованных систем)1,05сверхбольшие (свыше 1000 пользователей)1,08Стабильность ИС К3Определяется в зависимости от ее внутренних эволюционных аспектов или стабильности в процессе сопровождения. Принимает следующие значения:постоянное внесение изменений1,1дискретное внесение изменений1маловероятное внесение изменений0,95Защита от несанкционированного доступа К4Предотвращение или существенное затруднение несанкционированного доступа. Принимает следующие значения:Сильная1,05Средняя1Слабая0,98Защита программ и данных (на уровне операционной системы, на уровне сетевого программного обеспечения, на уровне СУБД) К5Сильная1,03Средняя1Слабая0,97Контрольный след операций К6Возможность фиксации несанкционированных изменений в системе:не имеется1выборочное отслеживание1,08полное отслеживание1,13Отказоустойчивость К7Свойство системы непрерывно сохранять работоспособное состояние в течении некоторого времени. Принимает следующие значения:Высокая1,15Средняя1Низкая0,92Восстанавливаемость К8Среднее время восстановления работоспособности после отказаПринимает следующие значенияВысокая1,12Средняя1Низкая0,98Длительность обработки (время отклика) К9Быстрота реакции системы на входные воздействия. Принимает следующие значения:Быстрая1,21Умеренная1Медленная0,92Исходный язык разработки ИС К10Определяется в зависимости от типа исходного языка, используемого при разработке ИС. Принимает следующие значения:традиционный (Кобол, Фортран и т.д.)1,08процедурный (Си или эквивалентный)1,09функциональный (Лисп или эквивалентный)1,07объектно-ориентированный (Си++ или эквивалентный)1Факторы средыКласс пользователя К11Определяется в зависимости от уровня мастерства или характеристик определенного класса пользователей. Пользователем может быть система, являющаяся внешней по отношении к рассматриваемой системе. Принимает следующие значения:Начинающий1,12Средний1,07специалист (эксперт)1Случайный1,14другая ИС (ПО)1,06технические средства1,09Требования к центральному обрабатывающему устройству (процессору) К12Определяются требованиями к тактовой частоте процессора (скорости процессора). Принимает следующие значения:Высокая0,99Средняя1Требования к оперативной (основной) памяти К13ИС должна быть идентифицировано по требованиям, предъявляемым к оперативной памяти (объем, быстродействие). Принимает следующие значения:Большая1Малая1,04 Требования к внешней памяти К14ИС должна быть идентифицировано по требованиям, предъявляемым к внешней памяти (объем, быстродействие). Принимает следующие значения:Большая1Малая1,01Требования к локальной вычислительной сети К15ИС должна быть идентифицировано по требованиям, предъявляемым к ЛВС (пропускная способность, зашита информации в сети). Принимает следующие значения:высокие требования1средние требования1,02Критичность ИС К16Определяется в зависимости от уровня целостности продукции, с учетом конкретной методологии оценки. Принимает следующие значения:человеческая жизнь1,18национальная безопасность1,16социальный хаос и паника1,13организационная безопасность1Готовность К17Определяется в зависимости от типа имеющегося в наличии ППО. Принимает следующие значения:наличие в готовом виде (есть альтернативные продукты)0,99общедоступная (известная методика)1заказное (методика заказчика специфическая)1,11запатентованное (методика разработчика)1,09Факторы данныхПредставление данных К18Определяется в зависимости от элементов, типов и структур данных. Принимает следующие значения:Реляционный1индексируемый (иерархический)1Сетевой1,08Объектный1,09форматированный файл0,95

Таблица П2.3 - Зависимость срока разработки от трудоемкости

№Срок разработки ППОТрудоемкость (человеко-месяц)1.1 месяц5 - 302.2 месяца10 - 803.3 месяца17 - 1404.4 месяца26 - 2105.5 месяцев37 - 2806.6 месяцев50 - 3407.7 месяцев65 - 4008.8 месяцев80 - 4509.9 месяцев100 - 50010.10 месяцев120 - 55011.11 месяцев140 - 61012.12 месяцев160 - 67013.13 месяцев180 - 72014.14 месяцев200 - 77015.15 месяцев230 - 82016.16 месяцев260 - 87017.17 месяцев290 - 93018.18 месяцев330 - 99019.19 месяцев370 - 104020.20 месяцев420 - 109021.21 месяц470 - 115022.22 месяца530 - 120023.23 месяца600 - 125024.24 месяца670 - 130025.25 месяцев750 - 135026.26 месяцев830 - 140027.27 месяцев900 - 145028.28 месяцев970 - 150029.29 месяцев1150 - 155030.30 месяцев1230 - 160031.31 месяц1310 - 166032.32 месяца1390 - 172033.33 месяца1470 - 178034.34 месяца1520 - 184035.35 месяцев1570 - 190036.36 месяцев1620 - 196037.37 месяцев1680 - 202038.За каждый последующий месяцДобавляется 40 чел-мес.

Таблица П2.4 - Значения нормативных коэффициентов расхода разработчика.

№Наименование показателяОбозначениеНорматив1Накладные расходы (аренда, командировочные, канцелярские товары, отпускные и др.)ПНР71,5 %2Расходы периода (расходы на административный управленческий персонал и маркетинг)ПРП48 %3РентабельностьПР25 %4Коэффициент эластичности трудоемкостиL0,755Коэффициент трудоемкости сопровождения ППОN15%

Приложение 3

Блок- схема алгоритма

Приложение 4

Код приложения заказчика

<%@page import="ru.cetin.CetinForm"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@ taglib uri="#"justify"><%@ taglib uri="#"justify"><html>

<head>

<title>CETIN</title>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width">

<script type="text/javascript" src="js/libs/jquery/jquery.js"></script>

<script type="text/javascript" src="js/cetin.js"></script>

<link href="css/style.css" type="text/css" rel="stylesheet">

</head>

<body id="body">

<html:form method="POST" action="/cetin">

<h1>Методика оценки трудоемкости программного продукта CETIN</h1>

<script type="text/javascript">cetin = new Cetin();stepManager = new StepManager("body", "stepManager");

<% CetinForm form = (CetinForm)pageContext.getAttribute("Cetin", PageContext.REQUEST_SCOPE); %>.params.c = <% out.write(Integer.toString(form.getCase())); %>;.params.e = <% out.write(Integer.toString(form.getEntity())); %>;.params.t = <% out.write(Integer.toString(form.getTool())); %>;.params.i = <% out.write(Integer.toString(form.getInteraction())); %>;.params.n = <% out.write(Integer.toString(form.getNode())); %>;.paramsEdited.c = [

<% out.write(Double.toString(form.getC1())); %>,

<% out.write(Double.toString(form.getC2())); %>,

<% out.write(Double.toString(form.getC3())); %>,

<% out.write(Double.toString(form.getC4())); %>,

<% out.write(Double.toString(form.getC5())); %>,

<% out.write(Double.toString(form.getC6())); %>

];.paramsEdited.e = [

<% out.write(Double.toString(form.getE1())); %>,

<% out.write(Double.toString(form.getE2())); %>,

<% out.write(Double.toString(form.getE3())); %>,

<% out.write(Double.toString(form.getE4())); %>,

<% out.write(Double.toString(form.getE5())); %>,

<% out.write(Double.toString(form.getE6())); %>

];.paramsEdited.t = [

<% out.write(Double.toString(form.getT1())); %>,

<% out.write(Double.toString(form.getT2())); %>,

<% out.write(Double.toString(form.getT3())); %>,

<% out.write(Double.toString(form.getT4())); %>,

<% out.write(Double.toString(form.getT5())); %>,

<% out.write(Double.toString(form.getT6())); %>

];.paramsEdited.i = [

<% out.write(Double.toString(form.getI1())); %>,

<% out.write(Double.toString(form.getI2())); %>,

<% out.write(Double.toString(form.getI3())); %>,

<% out.write(Double.toString(form.getI4())); %>,

<% out.write(Double.toString(form.getI5())); %>,

<% out.write(Double.toString(form.getI6())); %>

];.paramsEdited.n = [

<% out.write(Double.toString(form.getN1())); %>,

<% out.write(Double.toString(form.getN2())); %>,

<% out.write(Double.toString(form.getN3())); %>,

<% out.write(Double.toString(form.getN4())); %>,

<% out.write(Double.toString(form.getN5())); %>,

<% out.write(Double.toString(form.getN6())); %>

];.s[0] = [

<% out.write(Double.toString(form.getSc1())); %>,

<% out.write(Double.toString(form.getSe1())); %>,

<% out.write(Double.toString(form.getSt1())); %>,

<% out.write(Double.toString(form.getSi1())); %>,

<% out.write(Double.toString(form.getSn1())); %>

];.s[1] = [

<% out.write(Double.toString(form.getSc2())); %>,

<% out.write(Double.toString(form.getSe2())); %>,

<% out.write(Double.toString(form.getSt2())); %>,

<% out.write(Double.toString(form.getSi2())); %>,

<% out.write(Double.toString(form.getSn2())); %>

];.s[2] = [

<% out.write(Double.toString(form.getSc3())); %>,

<% out.write(Double.toString(form.getSe3())); %>,

<% out.write(Double.toString(form.getSt3())); %>,

<% out.write(Double.toString(form.getSi3())); %>,

<% out.write(Double.toString(form.getSn3())); %>

];.s[3] = [

<% out.write(Double.toString(form.getSc4())); %>,

<% out.write(Double.toString(form.getSe4())); %>,

<% out.write(Double.toString(form.getSt4())); %>,

<% out.write(Double.toString(form.getSi4())); %>,

<% out.write(Double.toString(form.getSn4())); %>

];.s[4] = [

<% out.write(Double.toString(form.getSc5())); %>,

<% out.write(Double.toString(form.getSe5())); %>,

<% out.write(Double.toString(form.getSt5())); %>,

<% out.write(Double.toString(form.getSi5())); %>,

<% out.write(Double.toString(form.getSn5())); %>

];.s[5] = [

<% out.write(Double.toString(form.getSc6())); %>,

<% out.write(Double.toString(form.getSe6())); %>,

<% out.write(Double.toString(form.getSt6())); %>,

<% out.write(Double.toString(form.getSi6())); %>,

<% out.write(Double.toString(form.getSn6())); %>

];.k = [

<% out.write(Double.toString(form.getK1Text())); %>,

<% out.write(Double.toString(form.getK2Text())); %>,

<% out.write(Double.toString(form.getK3Text())); %>,

<% out.write(Double.toString(form.getK4Text())); %>,

<% out.write(Double.toString(form.getK5Text())); %>,

<% out.write(Double.toString(form.getK6Text())); %>,

<% out.write(Double.toString(form.getK7Text())); %>,

<% out.write(Double.toString(form.getK8Text())); %>,

<% out.write(Double.toString(form.getK9Text())); %>,

<% out.write(Double.toString(form.getK10Text())); %>,

<% out.write(Double.toString(form.getK11Text())); %>,

<% out.write(Double.toString(form.getK12Text())); %>,

<% out.write(Double.toString(form.getK13Text())); %>,

<% out.write(Double.toString(form.getK14Text())); %>,

<% out.write(Double.toString(form.getK15Text())); %>,

<% out.write(Double.toString(form.getK16Text())); %>,

<% out.write(Double.toString(form.getK17Text())); %>,

<% out.write(Double.toString(form.getK18Text())); %>

];.cost.cost = <% out.write(Double.toString(form.getZp0())); %>;.cost.psn = <% out.write(Double.toString(form.getPsn())); %>;.cost.pnds = <% out.write(Double.toString(form.getPnds())); %>;.cost.inflation[0] = <% out.write(Double.toString(form.getInf0())); %>;.cost.inflation[1] = <% out.write(Double.toString(form.getInf1())); %>;.cost.inflation[2] = <% out.write(Double.toString(form.getInf2())); %>;cachedParams = {c:0, e:0, t:0, i:0, n:0};

</script>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="1"/>

<tiles:put name="isFirstStep" value="true"/>

<tiles:put name="title" value="Инициализация"/>

<tiles:put name="onOpenFunction">() {params = cetin.params;

$("#case").val(params.c);

$("#entity").val(params.e);

$("#tool").val(params.t);

$("#interaction").val(params.i);

$("#node").val(params.n);.c = params.c;.e = params.e;.t = params.t;.i = params.i;.n = params.n;

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.params.c = parseInt($("#case").val());.params.e = parseInt($("#entity").val());.params.t = parseInt($("#tool").val());.params.i = parseInt($("#interaction").val());.params.n = parseInt($("#node").val());calc = 0;changed = (cachedParams.c !== cetin.params.c) ||

(cachedParams.e !== cetin.params.e) ||

(cachedParams.t !== cetin.params.t) ||

(cachedParams.i !== cetin.params.i) ||

(cachedParams.n !== cetin.params.n);(var j = 0; j < 6; j++) {p = cetin.params;(changed)

{.paramsEdited.c[j] = p.c;.paramsEdited.e[j] = p.e;.paramsEdited.t[j] = p.t;.paramsEdited.i[j] = p.i;.paramsEdited.n[j] = p.n;sji = cetin.s[j];sj = 1.0 / 165 * (p.c * sji[0] + p.e * sji[1] + p.t * sji[2] + p.i * sji[3] + p.n * sji[4]);.sj[j] = sj;

}

}();

}

</tiles:put>

<tiles:put name="validators">

[Validator("case", /^\d+$/, "Необходимо ввести число"),Validator("entity", /^\d+$/, "Необходимо ввести число"),Validator("tool", /^\d+$/, "Необходимо ввести число"),Validator("interaction", /^\d+$/, "Необходимо ввести число"),Validator("node", /^\d+$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

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

</p>

<p>

По полученным данным диаграмм необходимо заполнить следующие поля:

</p>

<p>

Количество вариантов использования (case):

<html:text property="case" styleId="case" size="8"/>

</p>

<p>

Количество типов объектов (entity):

<html:text property="entity" styleId="entity" size="8"/>

</p>

<p>

Количество свойств типов объектов (tool):

<html:text property="tool" styleId="tool" size="8"/>

</p>

<p>

Количество взаимодействий между типами объектов (interaction):

<html:text property="interaction" styleId="interaction" size="8"/>

</p>

<p>

Количество типов узлов (node):

<html:text property="node" styleId="node" size="8"/>

</p>

</tiles:put>

</tiles:insert>

<script type="text/javascript">recalcSj() {{(var j = 0; j < 6; j++) {cc = cetin.params.c;ce = cetin.params.e;ct = cetin.params.t;ci = cetin.params.i;cn = cetin.params.n;scc = parseFloat($("#sc" + (j + 1)).val());sce = parseFloat($("#se" + (j + 1)).val());sct = parseFloat($("#st" + (j + 1)).val());sci = parseFloat($("#si" + (j + 1)).val());scn = parseFloat($("#sn" + (j + 1)).val());.paramsEdited.c[j] = cc;.paramsEdited.e[j] = ce;.paramsEdited.t[j] = ct;.paramsEdited.i[j] = ci;.paramsEdited.n[j] = cn;.s[j][0] = scc;.s[j][1] = sce;.s[j][2] = sct;.s[j][3] = sci;.s[j][4] = scn;.sj[j] = 1.0 / 165 * (cc * scc + ce * sce + ct * sct + ci * sci + cn * scn);

}

} catch(err) {}

}

</script>

<html:hidden property="c1" styleId="c1"/><html:hidden property="sc1" styleId="sc1"/>

<html:hidden property="e1" styleId="e1"/><html:hidden property="se1" styleId="se1"/>

<html:hidden property="t1" styleId="t1"/><html:hidden property="st1" styleId="st1"/>

<html:hidden property="i1" styleId="i1"/><html:hidden property="si1" styleId="si1"/>

<html:hidden property="n1" styleId="n1"/><html:hidden property="sn1" styleId="sn1"/>

<html:hidden property="c2" styleId="c2"/><html:hidden property="sc2" styleId="sc2"/>

<html:hidden property="e2" styleId="e2"/><html:hidden property="se2" styleId="se2"/>

<html:hidden property="t2" styleId="t2"/><html:hidden property="st2" styleId="st2"/>

<html:hidden property="i2" styleId="i2"/><html:hidden property="si2" styleId="si2"/>

<html:hidden property="n2" styleId="n2"/><html:hidden property="sn2" styleId="sn2"/>

<html:hidden property="c3" styleId="c3"/><html:hidden property="sc3" styleId="sc3"/>

<html:hidden property="e3" styleId="e3"/><html:hidden property="se3" styleId="se3"/>

<html:hidden property="t3" styleId="t3"/><html:hidden property="st3" styleId="st3"/>

<html:hidden property="i3" styleId="i3"/><html:hidden property="si3" styleId="si3"/>

<html:hidden property="n3" styleId="n3"/><html:hidden property="sn3" styleId="sn3"/>

<html:hidden property="c4" styleId="c4"/><html:hidden property="sc4" styleId="sc4"/>

<html:hidden property="e4" styleId="e4"/><html:hidden property="se4" styleId="se4"/>

<html:hidden property="t4" styleId="t4"/><html:hidden property="st4" styleId="st4"/>

<html:hidden property="i4" styleId="i4"/><html:hidden property="si4" styleId="si4"/>

<html:hidden property="n4" styleId="n4"/><html:hidden property="sn4" styleId="sn4"/>

<html:hidden property="c5" styleId="c5"/><html:hidden property="sc5" styleId="sc5"/>

<html:hidden property="e5" styleId="e5"/><html:hidden property="se5" styleId="se5"/>

<html:hidden property="t5" styleId="t5"/><html:hidden property="st5" styleId="st5"/>

<html:hidden property="i5" styleId="i5"/><html:hidden property="si5" styleId="si5"/>

<html:hidden property="n5" styleId="n5"/><html:hidden property="sn5" styleId="sn5"/>

<html:hidden property="c6" styleId="c6"/><html:hidden property="sc6" styleId="sc6"/>

<html:hidden property="e6" styleId="e6"/><html:hidden property="se6" styleId="se6"/>

<html:hidden property="t6" styleId="t6"/><html:hidden property="st6" styleId="st6"/>

<html:hidden property="i6" styleId="i6"/><html:hidden property="si6" styleId="si6"/>

<html:hidden property="n6" styleId="n6"/><html:hidden property="sn6" styleId="sn6"/>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="2"/>

<tiles:put name="title" value="Внутренние факторы 1"/>

<tiles:put name="onOpenFunction">() {("k1", cetin.k[0]);("k2", cetin.k[1]);("k3", cetin.k[2]);("k4", cetin.k[3]);("k5", cetin.k[4]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[0] = getSelectedValue("k1");.k[1] = getSelectedValue("k2");.k[2] = getSelectedValue("k3");.k[3] = getSelectedValue("k4");.k[4] = getSelectedValue("k5");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Режим эксплуатации ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от конкретных технологий или типов обработки, принятых в системе программного обеспечения"/>

<tiles:put name="selectNumber" value="1"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

обработка данных в режиме разделения времени

</option>

<option value="1.04">

параллельная обработка данных

</option>

<option value="1.05">

обработка данных в режиме реального времени

</option>

<option value="1.07">

совмещенная обработка данных

</option>

</tiles:put>

</tiles:insert>

<tiles:put name="selectName" value="Масштаб ИС"/>

<tiles:put name="selectHint" value="Масштаб может быть определен количеством одновременно работающих пользователей"/>

<tiles:put name="selectNumber" value="2"/>

<tiles:put name="selectOptions" type="page">

<option value="0.95">

малые ИС (до 10 пользователей с непродолжительным ЖЦ)

</option>

<option value="1">

средние ИС (от 11 до 100 пользователей с длительным ЖЦ с возможностью роста до крупных систем)

</option>

<option value="1.05">

крупные ИС (от 101 до 1000 пользователей с длительным ЖЦ и миграцией унаследованных систем

</option>

<option value="1.08">

сверхбольшие (свыше 1000 пользователей)

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Стабильность ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от ее внутренних эволюционных аспектов или стабильности в процессе сопровождения"/>

<tiles:put name="selectNumber" value="3"/>

<tiles:put name="selectOptions" type="page">

<option value="1.1">

постоянное внесение изменений

</option>

<option value="1">

дискретное внесение изменений

</option>

<option value="0.95">

маловероятное внесение изменений

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Защита от несанкционированного доступа"/>

<tiles:put name="selectHint" value="Предотвращение или существенное затруднение несанкционированного доступа"/>

<tiles:put name="selectNumber" value="4"/>

<tiles:put name="selectOptions" type="page">

<option value="1.05">

сильная

</option>

<option value="1">

средняя

</option>

<option value="0.98">

слабая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Защита программ и данных"/>

<tiles:put name="selectHint" value="на уровне операционной системы, на уровне сетевого программного обеспечения, на уровне СУБД"/>

<tiles:put name="selectNumber" value="5"/>

<tiles:put name="selectOptions" type="page">

<option value="1.03">

сильная

</option>

<option value="1">

средняя

</option>

<option value="0.97">

слабая

</option>

</tiles:put>

</tiles:insert>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="3"/>

<tiles:put name="title" value="Внутренние факторы 2"/>

<tiles:put name="onOpenFunction">() {("k6", cetin.k[5]);("k7", cetin.k[6]);("k8", cetin.k[7]);("k9", cetin.k[8]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[5] = getSelectedValue("k6");.k[6] = getSelectedValue("k7");.k[7] = getSelectedValue("k8");.k[8] = getSelectedValue("k9");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Контрольный след операций"/>

<tiles:put name="selectHint" value="Возможность фиксации несанкционированных изменений в системе"/>

<tiles:put name="selectNumber" value="6"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

не имеется

</option>

<option value="1.08">

выборочное отслеживание

</option>

<option value="1.13">

полное отслеживание

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Отказоустойчивость"/>

<tiles:put name="selectHint" value="Свойство системы непрерывно сохранять работоспособное состояние в течении некоторого времени"/>

<tiles:put name="selectNumber" value="7"/>

<tiles:put name="selectOptions" type="page">

<option value="1.15">

Высокая

</option>

<option value="1">

Средняя

</option>

<option value="0.92">

Низкая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Восстанавливаемость"/>

<tiles:put name="selectHint" value="Среднее время восстановления работоспособности после отказа"/>

<tiles:put name="selectNumber" value="8"/>

<tiles:put name="selectOptions" type="page">

<option value="1.12">

Высокая

</option>

<option value="1">

Средняя

</option>

<option value="0.98">

Низкая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Длительность обработки (время отклика)"/>

<tiles:put name="selectHint" value="Быстрота реакции системы на входные воздействия"/>

<tiles:put name="selectNumber" value="9"/>

<tiles:put name="selectOptions" type="page">

<option value="1.21">

быстрая</option>

<option value="1">

умеренная</option>

<option value="0.92">

медленная</option>

</tiles:put>

</tiles:insert>

<html:hidden property="k10Text"/>

<html:hidden property="k10"/>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="4"/>

<tiles:put name="title" value="Факторы среды"/>

<tiles:put name="onOpenFunction">() {("k11", cetin.k[10]);("k12", cetin.k[11]);("k13", cetin.k[12]);("k14", cetin.k[13]);("k15", cetin.k[14]);("k16", cetin.k[15]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[10] = getSelectedValue("k11");.k[11] = getSelectedValue("k12");.k[12] = getSelectedValue("k13");.k[13] = getSelectedValue("k14");.k[14] = getSelectedValue("k15");.k[15] = getSelectedValue("k16");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Класс пользователя"/>

<tiles:put name="selectHint" value="Определяется в зависимости от уровня мастерства или характеристик определенного класса пользователей. Пользователем может быть система, являющаяся внешней по отношении к рассматриваемой системе"/>

<tiles:put name="selectNumber" value="11"/>

<tiles:put name="selectOptions" type="page">

<option value="1.12">

начинающий

</option>

<option value="1.07">

средний

</option>

<option value="1">

специалист (эксперт)

</option>

<option value="1.14">

случайный

</option>

<option value="1.06">

другая ИС (ПО)

</option>

<option value="1.09">

технические средства

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к центральному обрабатывающему устройству (процессору)"/>

<tiles:put name="selectHint" value="Определяются требованиями к тактовой частоте процессора (скорости процессора)"/>

<tiles:put name="selectNumber" value="12"/>

<tiles:put name="selectOptions" type="page">

<option value="0.99">

высокая

</option>

<option value="1">

средняя

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к оперативной (основной) памяти"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к оперативной памяти (объем, быстродействие)"/>

<tiles:put name="selectNumber" value="13"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

большая

</option>

<option value="1.04">

малая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к внешней памяти"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к оперативной памяти (объем, быстродействие)"/>

<tiles:put name="selectNumber" value="14"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

большая

</option>

<option value="1.01">

малая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к локальной вычислительной сети"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к ЛВС (пропускная способность, зашита информации в сети)"/>

<tiles:put name="selectNumber" value="15"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

высокие требования

</option>

<option value="1.02">

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

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Критичность ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от уровня целостности продукции, с учетом конкретной методологии оценки"/>

<tiles:put name="selectNumber" value="16"/>

<tiles:put name="selectOptions" type="page">

<option value="1.18">

человеческая жизнь

</option>

<option value="1.16">

национальная безопасность

</option>

<option value="1.13">

социальный хаос и паника

</option>

<option value="1">

организационная безопасность

</option>

</tiles:put>

</tiles:insert>

<html:hidden property="k17Text"/>

<html:hidden property="k17"/>

</tiles:put>

</tiles:insert>

<html:hidden property="k18Text"/>

<html:hidden property="k18"/>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="5"/>

<tiles:put name="title" value="Результаты расчета трудоемкости"/>

<tiles:put name="onOpenFunction">() {

$("#trud").html((cetin.peopleMonth()).toFixed(2));res = cetin.time();

$("#term").html(((res.min + res.max) / 2).toFixed(2));

$("#minTerm").html(res.min.toFixed(2));

$("#newTerm").val(cetin.newTerm);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.newTerm = parseFloat($("#newTerm").val());

}

</tiles:put>

<tiles:put name="validators">

[Validator("newTerm", /^\d+(.\d+)?$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="trud"></span> (человеко-месяцы)

</p>

<p>

Средний срок разработки: <span id="term"></span> (месяцы)

</p>

<p>

&nbsp;

</p>

<p>

Вы можете уменьшить срок разработки до <span id="minTerm"></span> (месяцы)

</p>

<p>

Новый срок разработки (месяцы) <html:text property="newTerm" styleId="newTerm"/>

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="6"/>

<tiles:put name="title" value="Результаты расчета скорректированной трудоемкости"/>

<tiles:put name="onOpenFunction">() {.recalcPeopleMonth();

$("#newtrud").html((cetin.newPeopleMonth).toFixed(2));

$("#newterm").html((cetin.newTerm).toFixed(2));

}

</tiles:put>

<tiles:put name="onCloseFunction">() {

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="newtrud"></span> (человеко-месяцы)

</p>

<p>

Срок разработки: <span id="newterm"></span> (месяцы)

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="7"/>

<tiles:put name="title" value="Ввод данных для получения стоимости разработки"/>

<tiles:put name="onOpenFunction">() {

$("#zp0").val(cetin.cost.cost);

$("#psn").val(cetin.cost.psn);

$("#pnds").val(cetin.cost.pnds);(var i = 0; i < 3; i++) {

$("#inf" + i).val(cetin.cost.inflation[i]);

$("#god" + i).html(new Date().getFullYear() - 3 + i);

}

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.cost.cost = parseFloat($("#zp0").val());.cost.psn = parseFloat($("#psn").val());.cost.pnds = parseFloat($("#pnds").val());(var i = 0; i < 3; i++) {.cost.inflation[i] = parseFloat($("#inf" + i).val());

}

}

</tiles:put>

<tiles:put name="validators">

[Validator("zp0", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("psn", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("pnds", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf0", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf1", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf2", /^\d+(.\d+)?$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Для оценки стоимости разработки необхоимо указать заработную плату одного программиста (по статистике за прошедший год), а также инфляцию за три прошедших года.

</p>

<p>

Заработная плата разработчику: <html:text property="zp0" styleId="zp0"/>

</p>

<p>

Инфляция за <span id="god0"></span> год: <html:text property="inf0" styleId="inf0"/>

</p>

<p>

</p>

<p>

Инфляция за <span id="god2"></span> год: <html:text property="inf2" styleId="inf2"/>

</p>

<p>

Процент социальных выплат: <html:text property="psn" styleId="psn"/>

</p>

<p>

Процент НДС: <html:text property="pnds" styleId="pnds"/>

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="8"/>

<tiles:put name="title" value="Итоги"/>

<tiles:put name="onOpenFunction">() {.recalcPeopleMonth();

$("#newtrud1").html((cetin.newPeopleMonth).toFixed(2));

$("#newterm1").html((cetin.newTerm).toFixed(2));

$("#peoples").html(Math.round(cetin.newPeopleMonth / cetin.newTerm));c = cetin.calcCost();

$("#totalCost").html((c.sppo).toFixed(2));

$("#totalCostSopr").html((c.ssppo).toFixed(2));

}

</tiles:put>

<tiles:put name="onCloseFunction">() {

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="isLastStep" value="true"/>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="newtrud1"></span> (человеко-месяцы)

</p>

<p>

Срок разработки: <span id="newterm1"></span> (месяцы)

</p>

<p>

Число разработчиков: <span id="peoples"></span> (человек)

</p>

<p>

Стоимость разработки: <span id="totalCost"></span> (рубли)

</p>

<p>

Стоимость сопровождения: <span id="totalCostSopr"></span> (рубли)

</p>

<p>Сохранить параметры: Название <html:text property="name" styleId="name"/></p>

<html:hidden property="id"/>

<html:hidden property="type" value="zakaz"/>

<html:hidden property="operation" value="save"/>

<html:submit property="savee" value="Сохранить" styleId="saveButton"/>

</tiles:put>

</tiles:insert>

</html:form>

</body>

</html>

Код приложения подрядчика

<%@page import="ru.cetin.CetinForm"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@ taglib uri="#"justify"><%@ taglib uri="#"justify"><html>

<head>

<title>CETIN</title>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width">

<script type="text/javascript" src="js/libs/jquery/jquery.js"></script>

<script type="text/javascript" src="js/cetin.js"></script>

<link href="css/style.css" type="text/css" rel="stylesheet">

</head>

<body id="body">

<html:form method="POST" action="/cetin">

<h1>Методика оценки трудоемкости программного продукта CETIN</h1>

<script type="text/javascript">cetin = new Cetin();stepManager = new StepManager("body", "stepManager");

<% CetinForm form = (CetinForm)pageContext.getAttribute("Cetin", PageContext.REQUEST_SCOPE); %>.params.c = <% out.write(Integer.toString(form.getCase())); %>;.params.e = <% out.write(Integer.toString(form.getEntity())); %>;.params.t = <% out.write(Integer.toString(form.getTool())); %>;.params.i = <% out.write(Integer.toString(form.getInteraction())); %>;.params.n = <% out.write(Integer.toString(form.getNode())); %>;.paramsEdited.c = [

<% out.write(Double.toString(form.getC1())); %>,

<% out.write(Double.toString(form.getC2())); %>,

<% out.write(Double.toString(form.getC3())); %>,

<% out.write(Double.toString(form.getC4())); %>,

<% out.write(Double.toString(form.getC5())); %>,

<% out.write(Double.toString(form.getC6())); %>

];.paramsEdited.e = [

<% out.write(Double.toString(form.getE1())); %>,

<% out.write(Double.toString(form.getE2())); %>,

<% out.write(Double.toString(form.getE3())); %>,

<% out.write(Double.toString(form.getE4())); %>,

<% out.write(Double.toString(form.getE5())); %>,

<% out.write(Double.toString(form.getE6())); %>

];.paramsEdited.t = [

<% out.write(Double.toString(form.getT1())); %>,

<% out.write(Double.toString(form.getT2())); %>,

<% out.write(Double.toString(form.getT3())); %>,

<% out.write(Double.toString(form.getT4())); %>,

<% out.write(Double.toString(form.getT5())); %>,

<% out.write(Double.toString(form.getT6())); %>

];.paramsEdited.i = [

<% out.write(Double.toString(form.getI1())); %>,

<% out.write(Double.toString(form.getI2())); %>,

<% out.write(Double.toString(form.getI3())); %>,

<% out.write(Double.toString(form.getI4())); %>,

<% out.write(Double.toString(form.getI5())); %>,

<% out.write(Double.toString(form.getI6())); %>

];.paramsEdited.n = [

<% out.write(Double.toString(form.getN1())); %>,

<% out.write(Double.toString(form.getN2())); %>,

<% out.write(Double.toString(form.getN3())); %>,

<% out.write(Double.toString(form.getN4())); %>,

<% out.write(Double.toString(form.getN5())); %>,

<% out.write(Double.toString(form.getN6())); %>

];.s[0] = [

<% out.write(Double.toString(form.getSc1())); %>,

<% out.write(Double.toString(form.getSe1())); %>,

<% out.write(Double.toString(form.getSt1())); %>,

<% out.write(Double.toString(form.getSi1())); %>,

<% out.write(Double.toString(form.getSn1())); %>

];.s[1] = [

<% out.write(Double.toString(form.getSc2())); %>,

<% out.write(Double.toString(form.getSe2())); %>,

<% out.write(Double.toString(form.getSt2())); %>,

<% out.write(Double.toString(form.getSi2())); %>,

<% out.write(Double.toString(form.getSn2())); %>

];.s[2] = [

<% out.write(Double.toString(form.getSc3())); %>,

<% out.write(Double.toString(form.getSe3())); %>,

<% out.write(Double.toString(form.getSt3())); %>,

<% out.write(Double.toString(form.getSi3())); %>,

<% out.write(Double.toString(form.getSn3())); %>

];.s[3] = [

<% out.write(Double.toString(form.getSc4())); %>,

<% out.write(Double.toString(form.getSe4())); %>,

<% out.write(Double.toString(form.getSt4())); %>,

<% out.write(Double.toString(form.getSi4())); %>,

<% out.write(Double.toString(form.getSn4())); %>

];.s[4] = [

<% out.write(Double.toString(form.getSc5())); %>,

<% out.write(Double.toString(form.getSe5())); %>,

<% out.write(Double.toString(form.getSt5())); %>,

<% out.write(Double.toString(form.getSi5())); %>,

<% out.write(Double.toString(form.getSn5())); %>

];.s[5] = [

<% out.write(Double.toString(form.getSc6())); %>,

<% out.write(Double.toString(form.getSe6())); %>,

<% out.write(Double.toString(form.getSt6())); %>,

<% out.write(Double.toString(form.getSi6())); %>,

<% out.write(Double.toString(form.getSn6())); %>

];.k = [

<% out.write(Double.toString(form.getK1Text())); %>,

<% out.write(Double.toString(form.getK2Text())); %>,

<% out.write(Double.toString(form.getK3Text())); %>,

<% out.write(Double.toString(form.getK4Text())); %>,

<% out.write(Double.toString(form.getK5Text())); %>,

<% out.write(Double.toString(form.getK6Text())); %>,

<% out.write(Double.toString(form.getK7Text())); %>,

<% out.write(Double.toString(form.getK8Text())); %>,

<% out.write(Double.toString(form.getK9Text())); %>,

<% out.write(Double.toString(form.getK10Text())); %>,

<% out.write(Double.toString(form.getK11Text())); %>,

<% out.write(Double.toString(form.getK12Text())); %>,

<% out.write(Double.toString(form.getK13Text())); %>,

<% out.write(Double.toString(form.getK14Text())); %>,

<% out.write(Double.toString(form.getK15Text())); %>,

<% out.write(Double.toString(form.getK16Text())); %>,

<% out.write(Double.toString(form.getK17Text())); %>,

<% out.write(Double.toString(form.getK18Text())); %>

];.cost.cost = <% out.write(Double.toString(form.getZp0())); %>;.cost.psn = <% out.write(Double.toString(form.getPsn())); %>;.cost.pnds = <% out.write(Double.toString(form.getPnds())); %>;.cost.inflation[0] = <% out.write(Double.toString(form.getInf0())); %>;.cost.inflation[1] = <% out.write(Double.toString(form.getInf1())); %>;.cost.inflation[2] = <% out.write(Double.toString(form.getInf2())); %>;cachedParams = {c:0, e:0, t:0, i:0, n:0};

</script>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="1"/>

<tiles:put name="isFirstStep" value="true"/>

<tiles:put name="title" value="Инициализация"/>

<tiles:put name="onOpenFunction">() {params = cetin.params;

$("#case").val(params.c);

$("#entity").val(params.e);

$("#tool").val(params.t);

$("#interaction").val(params.i);

$("#node").val(params.n);.c = params.c;.e = params.e;.t = params.t;.i = params.i;.n = params.n;

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.params.c = parseInt($("#case").val());.params.e = parseInt($("#entity").val());.params.t = parseInt($("#tool").val());.params.i = parseInt($("#interaction").val());.params.n = parseInt($("#node").val());calc = 0;changed = (cachedParams.c !== cetin.params.c) ||

(cachedParams.e !== cetin.params.e) ||

(cachedParams.t !== cetin.params.t) ||

(cachedParams.i !== cetin.params.i) ||

(cachedParams.n !== cetin.params.n);(var j = 0; j < 6; j++) {p = cetin.params;(changed)

{.paramsEdited.c[j] = p.c;.paramsEdited.e[j] = p.e;.paramsEdited.t[j] = p.t;.paramsEdited.i[j] = p.i;.paramsEdited.n[j] = p.n;sji = cetin.s[j];sj = 1.0 / 165 * (p.c * sji[0] + p.e * sji[1] + p.t * sji[2] + p.i * sji[3] + p.n * sji[4]);.sj[j] = sj;

}

}

}

</tiles:put>

<tiles:put name="validators">

[Validator("case", /^\d+$/, "Необходимо ввести число"),

new Validator("entity", /^\d+$/, "Необходимо ввести число"),Validator("tool", /^\d+$/, "Необходимо ввести число"),Validator("interaction", /^\d+$/, "Необходимо ввести число"),Validator("node", /^\d+$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

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

</p>

<p>

По полученным данным диаграмм необходимо заполнить следующие поля:

</p>

<p>

Количество вариантов использования (case):

<html:text property="case" styleId="case" size="8"/>

</p>

<p>

Количество типов объектов (entity):

<html:text property="entity" styleId="entity" size="8"/>

</p>

<p>

Количество свойств типов объектов (tool):

<html:text property="tool" styleId="tool" size="8"/>

</p>

<p>

Количество взаимодействий между типами объектов (interaction):

<html:text property="interaction" styleId="interaction" size="8"/>

</p>

<p>

Количество типов узлов (node):

<html:text property="node" styleId="node" size="8"/>

</p>

</tiles:put>

</tiles:insert>

<script type="text/javascript">recalcSj() {{(var j = 0; j < 6; j++) {cc = parseFloat($("#c" + (j + 1)).val());ce = parseFloat($("#e" + (j + 1)).val());ct = parseFloat($("#t" + (j + 1)).val());ci = parseFloat($("#i" + (j + 1)).val());cn = parseFloat($("#n" + (j + 1)).val());scc = parseFloat($("#sc" + (j + 1)).val());sce = parseFloat($("#se" + (j + 1)).val());sct = parseFloat($("#st" + (j + 1)).val());sci = parseFloat($("#si" + (j + 1)).val());scn = parseFloat($("#sn" + (j + 1)).val());.paramsEdited.c[j] = cc;.paramsEdited.e[j] = ce;.paramsEdited.t[j] = ct;.paramsEdited.i[j] = ci;.paramsEdited.n[j] = cn;.s[j][0] = scc;.s[j][1] = sce;.s[j][2] = sct;.s[j][3] = sci;.s[j][4] = scn;.sj[j] = 1.0 / 165 * (cc * scc + ce * sce + ct * sct + ci * sci + cn * scn);

$("#s" + (j + 1)).text(cetin.sj[j].toFixed(5));

}

} catch(err) {}

}

</script>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="2"/>

<tiles:put name="title" value="Базовая трудоемкость"/>

<tiles:put name="onOpenFunction">() {params = cetin.paramsEdited;(var i = 1; i <= 6; i++)

{

$("#c" + i).val(params.c[i - 1]);

$("#e" + i).val(params.e[i - 1]);

$("#t" + i).val(params.t[i - 1]);

$("#i" + i).val(params.i[i - 1]);

$("#n" + i).val(params.n[i - 1]);

$("#sc" + i).val(cetin.s[i - 1][0]);

$("#se" + i).val(cetin.s[i - 1][1]);

$("#st" + i).val(cetin.s[i - 1][2]);

$("#si" + i).val(cetin.s[i - 1][3]);

$("#sn" + i).val(cetin.s[i - 1][4]);

$("#s" + i).text(cetin.sj[i - 1].toFixed(5));

}();

}

</tiles:put>

<tiles:put name="onCloseFunction">

</tiles:put>

<tiles:put name="validators">

[

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Базовая трудоемкость Sj процесса разработки с номером j, где j - номер процесса разработки (значения от 1 до 6)

расчитывается по следующей формуле:

</p>

<table>

<tr>

<td>1/165*(</td>

<td>C</td><td>*</td><td>S<sub>j</sub>(C)</td><td>+</td>

<td>E</td><td>*</td><td>S<sub>j</sub>(E)</td><td>+</td>

<td>T</td><td>*</td><td>S<sub>j</sub>(T)</td><td>+</td>

<td>I</td><td>*</td><td>S<sub>j</sub>(I)</td><td>+</td>

<td>N</td><td>*</td><td>S<sub>j</sub>(N)</td>

<td>)=</td><td>S<sub>j</sub></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Бизнес-моделирование</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c1" styleId="c1" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc1" styleId="sc1" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e1" styleId="e1" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se1" styleId="se1" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t1" styleId="t1" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st1" styleId="st1" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i1" styleId="i1" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si1" styleId="si1" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n1" styleId="n1" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn1" styleId="sn1" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s1"></span></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Управление требованиями</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c2" styleId="c2" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc2" styleId="sc2" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e2" styleId="e2" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se2" styleId="se2" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t2" styleId="t2" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st2" styleId="st2" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i2" styleId="i2" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si2" styleId="si2" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n2" styleId="n2" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn2" styleId="sn2" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s2"></span></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Проектирование</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c3" styleId="c3" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc3" styleId="sc3" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e3" styleId="e3" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se3" styleId="se3" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t3" styleId="t3" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st3" styleId="st3" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i3" styleId="i3" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si3" styleId="si3" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n3" styleId="n3" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn3" styleId="sn3" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s3"></span></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Реализация</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c4" styleId="c4" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc4" styleId="sc4" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e4" styleId="e4" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se4" styleId="se4" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t4" styleId="t4" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st4" styleId="st4" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i4" styleId="i4" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si4" styleId="si4" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n4" styleId="n4" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn4" styleId="sn4" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s4"></span></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Тестирование</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c5" styleId="c5" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc5" styleId="sc5" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e5" styleId="e5" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se5" styleId="se5" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t5" styleId="t5" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st5" styleId="st5" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i5" styleId="i5" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si5" styleId="si5" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n5" styleId="n5" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn5" styleId="sn5" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s5"></span></td>

</tr>

<tr>

<td colspan="21" style="padding-top: 12px;">Норматив трудоемкости: Развертывание</td>

</tr>

<tr>

<td>1/165*(</td>

<td><html:text property="c6" styleId="c6" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sc6" styleId="sc6" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="e6" styleId="e6" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="se6" styleId="se6" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="t6" styleId="t6" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="st6" styleId="st6" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="i6" styleId="i6" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="si6" styleId="si6" onkeyup="recalcSj();"/></td><td>+</td>

<td><html:text property="n6" styleId="n6" onkeyup="recalcSj();"/></td><td>*</td><td><html:text property="sn6" styleId="sn6" onkeyup="recalcSj();"/></td>

<td>)=</td><td><span id="s6"></span></td>

</tr>

</table>

<div>

&mdash; количество человеко-часов в одном человеко-месяце.</div>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="3"/>

<tiles:put name="title" value="Внутренние факторы 1"/>

<tiles:put name="onOpenFunction">() {("k1", cetin.k[0]);("k2", cetin.k[1]);("k3", cetin.k[2]);("k4", cetin.k[3]);("k5", cetin.k[4]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[0] = getSelectedValue("k1");.k[1] = getSelectedValue("k2");.k[2] = getSelectedValue("k3");.k[3] = getSelectedValue("k4");.k[4] = getSelectedValue("k5");

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Режим эксплуатации ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от конкретных технологий или типов обработки, принятых в системе программного обеспечения"/>

<tiles:put name="selectNumber" value="1"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

обработка данных в режиме разделения времени

</option>

<option value="1.04">

параллельная обработка данных

</option>

<option value="1.05">

обработка данных в режиме реального времени

</option>

<option value="1.07">

совмещенная обработка данных

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Масштаб ИС"/>

<tiles:put name="selectHint" value="Масштаб может быть определен количеством одновременно работающих пользователей"/>

<tiles:put name="selectNumber" value="2"/>

<tiles:put name="selectOptions" type="page">

<option value="0.95">

малые ИС (до 10 пользователей с непродолжительным ЖЦ)

</option>

<option value="1">

средние ИС (от 11 до 100 пользователей с длительным ЖЦ с возможностью роста до крупных систем)

</option>

<option value="1.05">

крупные ИС (от 101 до 1000 пользователей с длительным ЖЦ и миграцией унаследованных систем

</option>

<option value="1.08">

сверхбольшие (свыше 1000 пользователей)

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Стабильность ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от ее внутренних эволюционных аспектов или стабильности в процессе сопровождения"/>

<tiles:put name="selectNumber" value="3"/>

<tiles:put name="selectOptions" type="page">

<option value="1.1">

постоянное внесение изменений

</option>

<option value="1">

дискретное внесение изменений

</option>

<option value="0.95">

маловероятное внесение изменений

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Защита от несанкционированного доступа"/>

<tiles:put name="selectHint" value="Предотвращение или существенное затруднение несанкционированного доступа"/>

<tiles:put name="selectNumber" value="4"/>

<tiles:put name="selectOptions" type="page">

<option value="1.05">

сильная

</option>

<option value="1">

средняя

</option>

<option value="0.98">

слабая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Защита программ и данных"/>

<tiles:put name="selectHint" value="на уровне операционной системы, на уровне сетевого программного обеспечения, на уровне СУБД"/>

<tiles:put name="selectNumber" value="5"/>

<tiles:put name="selectOptions" type="page">

<option value="1.03">

сильная

</option>

<option value="1">

средняя

</option>

<option value="0.97">

слабая

</option>

</tiles:put>

</tiles:insert>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="4"/>

<tiles:put name="title" value="Внутренние факторы 2"/>

<tiles:put name="onOpenFunction">() {("k6", cetin.k[5]);("k7", cetin.k[6]);("k8", cetin.k[7]);("k9", cetin.k[8]);("k10", cetin.k[9]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[5] = getSelectedValue("k6");.k[6] = getSelectedValue("k7");.k[7] = getSelectedValue("k8");.k[8] = getSelectedValue("k9");.k[9] = getSelectedValue("k10");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Контрольный след операций"/>

<tiles:put name="selectHint" value="Возможность фиксации несанкционированных изменений в системе"/>

<tiles:put name="selectNumber" value="6"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

не имеется

</option>

<option value="1.08">

выборочное отслеживание

</option>

<option value="1.13">

полное отслеживание

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Отказоустойчивость"/>

<tiles:put name="selectHint" value="Свойство системы непрерывно сохранять работоспособное состояние в течении некоторого времени"/>

<tiles:put name="selectNumber" value="7"/>

<tiles:put name="selectOptions" type="page">

<option value="1.15">

Высокая

</option>

<option value="1">

Средняя

</option>

<option value="0.92">

Низкая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Восстанавливаемость"/>

<tiles:put name="selectHint" value="Среднее время восстановления работоспособности после отказа"/>

<tiles:put name="selectNumber" value="8"/>

<tiles:put name="selectOptions" type="page">

<option value="1.12">

Высокая

</option>

<option value="1">

Средняя

</option>

<option value="0.98">

Низкая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Длительность обработки (время отклика)"/>

<tiles:put name="selectHint" value="Быстрота реакции системы на входные воздействия"/>

<tiles:put name="selectNumber" value="9"/>

<tiles:put name="selectOptions" type="page">

<option value="1.21">

быстрая</option>

<option value="1">

умеренная</option>

<option value="0.92">

медленная</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Исходный язык разработки ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от типа исходного языка, используемого при разработке ИС"/>

<tiles:put name="selectNumber" value="10"/>

<tiles:put name="selectOptions" type="page">

<option value="1.08">

традиционный (Кобол, Фортран и т.д.)

</option>

<option value="1.09">

процедурный (Си или эквивалентный)

</option>

<option value="1.07">

функциональный (Лисп или эквивалентный)

</option>

<option value="1">

объектно-ориентированный (Си++ или эквивалентный)

</option>

</tiles:put>

</tiles:insert>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="5"/>

<tiles:put name="title" value="Факторы среды"/>

<tiles:put name="onOpenFunction">() {("k11", cetin.k[10]);("k12", cetin.k[11]);("k13", cetin.k[12]);("k14", cetin.k[13]);("k15", cetin.k[14]);("k16", cetin.k[15]);("k17", cetin.k[16]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[10] = getSelectedValue("k11");.k[11] = getSelectedValue("k12");.k[12] = getSelectedValue("k13");.k[13] = getSelectedValue("k14");.k[14] = getSelectedValue("k15");.k[15] = getSelectedValue("k16");.k[16] = getSelectedValue("k17");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Класс пользователя"/>

<tiles:put name="selectHint" value="Определяется в зависимости от уровня мастерства или характеристик определенного класса пользователей. Пользователем может быть система, являющаяся внешней по отношении к рассматриваемой системе"/>

<tiles:put name="selectNumber" value="11"/>

<tiles:put name="selectOptions" type="page">

<option value="1.12">

начинающий

</option>

<option value="1.07">

средний

</option>

<option value="1">

специалист (эксперт)

</option>

<option value="1.14">

случайный

</option>

<option value="1.06">

другая ИС (ПО)

</option>

<option value="1.09">

технические средства

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к центральному обрабатывающему устройству (процессору)"/>

<tiles:put name="selectHint" value="Определяются требованиями к тактовой частоте процессора (скорости процессора)"/>

<tiles:put name="selectNumber" value="12"/>

<tiles:put name="selectOptions" type="page">

<option value="0.99">

высокая

</option>

<option value="1">

средняя

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к оперативной (основной) памяти"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к оперативной памяти (объем, быстродействие)"/>

<tiles:put name="selectNumber" value="13"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

большая

</option>

<option value="1.04">

малая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к внешней памяти"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к оперативной памяти (объем, быстродействие)"/>

<tiles:put name="selectNumber" value="14"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

большая

</option>

<option value="1.01">

малая

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Требования к локальной вычислительной сети"/>

<tiles:put name="selectHint" value="ИС должна быть идентифицирована по требованиям, предъявляемым к ЛВС (пропускная способность, зашита информации в сети)"/>

<tiles:put name="selectNumber" value="15"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

высокие требования

</option>

<option value="1.02">

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

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Критичность ИС"/>

<tiles:put name="selectHint" value="Определяется в зависимости от уровня целостности продукции, с учетом конкретной методологии оценки"/>

<tiles:put name="selectNumber" value="16"/>

<tiles:put name="selectOptions" type="page">

<option value="1.18">

человеческая жизнь

</option>

<option value="1.16">

национальная безопасность

</option>

<option value="1.13">

социальный хаос и паника

</option>

<option value="1">

организационная безопасность

</option>

</tiles:put>

</tiles:insert>

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Готовность"/>

<tiles:put name="selectHint" value="Определяется в зависимости от типа имеющегося в наличии ППО"/>

<tiles:put name="selectNumber" value="17"/>

<tiles:put name="selectOptions" type="page">

<option value="0.99">

наличие в готовом виде (есть альтернативные продукты)</option>

<option value="1">

общедоступная (известная методика)</option>

<option value="1.11">

заказная (методика заказчика специфическая)</option>

<option value="1.09">

запатентованная (методика разработчика)</option>

</tiles:put>

</tiles:insert>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="6"/>

<tiles:put name="title" value="Факторы данных"/>

<tiles:put name="onOpenFunction">() {("k18", cetin.k[17]);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.k[17] = getSelectedValue("k18");

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<tiles:insert definition="select" flush="false">

<tiles:put name="selectName" value="Представление данных"/>

<tiles:put name="selectHint" value="Определяется в зависимости от элементов, типов и структур данных"/>

<tiles:put name="selectNumber" value="18"/>

<tiles:put name="selectOptions" type="page">

<option value="1">

реляционный

</option>

<option value="1">

индексируемый (иерархический)

</option>

<option value="1.08">

сетевой

</option>

<option value="1.09">

объектный

</option>

<option value="0.95">

форматированный файл

</option>

</tiles:put>

</tiles:insert>

</tiles:put>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="7"/>

<tiles:put name="title" value="Результаты расчета трудоемкости"/>

<tiles:put name="onOpenFunction">() {

$("#trud").html((cetin.peopleMonth()).toFixed(2));res = cetin.time();

$("#term").html(((res.min + res.max) / 2).toFixed(2));

$("#minTerm").html(res.min.toFixed(2));

$("#newTerm").val(cetin.newTerm);

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.newTerm = parseFloat($("#newTerm").val());

}

</tiles:put>

<tiles:put name="validators">

[Validator("newTerm", /^\d+(.\d+)?$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="trud"></span> (человеко-месяцы)

</p>

<p>

Средний срок разработки: <span id="term"></span> (месяцы)

</p>

<p>

&nbsp;

</p>

<p>

Вы можете уменьшить срок разработки до <span id="minTerm"></span> (месяцы)

</p>

<p>

Новый срок разработки (месяцы) <html:text property="newTerm" styleId="newTerm"/>

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="8"/>

<tiles:put name="title" value="Результаты расчета скорректированной трудоемкости"/>

<tiles:put name="onOpenFunction">() {.recalcPeopleMonth();

$("#newtrud").html((cetin.newPeopleMonth).toFixed(2));

$("#newterm").html((cetin.newTerm).toFixed(2));

}

</tiles:put>

<tiles:put name="onCloseFunction">() {

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="newtrud"></span> (человеко-месяцы)

</p>

<p>

Срок разработки: <span id="newterm"></span> (месяцы)

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="9"/>

<tiles:put name="title" value="Ввод данных для получения стоимости разработки"/>

<tiles:put name="onOpenFunction">() {

$("#zp0").val(cetin.cost.cost);

$("#psn").val(cetin.cost.psn);

$("#pnds").val(cetin.cost.pnds);(var i = 0; i < 3; i++) {

$("#inf" + i).val(cetin.cost.inflation[i]);

$("#god" + i).html(new Date().getFullYear() - 3 + i);

}

}

</tiles:put>

<tiles:put name="onCloseFunction">() {.cost.cost = parseFloat($("#zp0").val());.cost.psn = parseFloat($("#psn").val());.cost.pnds = parseFloat($("#pnds").val());(var i = 0; i < 3; i++) {.cost.inflation[i] = parseFloat($("#inf" + i).val());

}

}

</tiles:put>

<tiles:put name="validators">

[Validator("zp0", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("psn", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("pnds", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf0", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf1", /^\d+(.\d+)?$/, "Необходимо ввести число"),Validator("inf2", /^\d+(.\d+)?$/, "Необходимо ввести число")

]

</tiles:put>

<tiles:put name="data" type="page">

<p>

Для оценки стоимости разработки необхоимо указать заработную плату одного программиста (по статистике за прошедший год), а также инфляцию за три прошедших года.

</p>

<p>

Заработная плата разработчику: <html:text property="zp0" styleId="zp0"/>

</p>

<p>

Инфляция за <span id="god0"></span> год: <html:text property="inf0" styleId="inf0"/>

</p>

<p>

Инфляция за <span id="god1"></span> год: <html:text property="inf1" styleId="inf1"/>

</p>

<p>

Инфляция за <span id="god2"></span> год: <html:text property="inf2" styleId="inf2"/>

</p>

<p>

Процент социальных выплат: <html:text property="psn" styleId="psn"/>

</p>

<p>

Процент НДС: <html:text property="pnds" styleId="pnds"/>

</p>

</tiles:put>

</tiles:insert>

<tiles:insert definition="step" flush="false">

<tiles:put name="stepNumber" value="10"/>

<tiles:put name="title" value="Итоги"/>

<tiles:put name="onOpenFunction">() {.recalcPeopleMonth();

$("#newtrud1").html((cetin.newPeopleMonth).toFixed(2));

$("#newterm1").html((cetin.newTerm).toFixed(2));

$("#peoples").html(Math.round(cetin.newPeopleMonth / cetin.newTerm));c = cetin.calcCost();

$("#totalCost").html((c.sppo).toFixed(2));

$("#totalCostSopr").html((c.ssppo).toFixed(2));

}

</tiles:put>

<tiles:put name="onCloseFunction">() {

}

</tiles:put>

<tiles:put name="validators">

[]

</tiles:put>

<tiles:put name="isLastStep" value="true"/>

<tiles:put name="data" type="page">

<p>

Трудоемкость: <span id="newtrud1"></span> (человеко-месяцы)

</p>

<p>

Срок разработки: <span id="newterm1"></span> (месяцы)

</p>

<p>

Число разработчиков: <span id="peoples"></span> (человек)

</p>

<p>

Стоимость разработки: <span id="totalCost"></span> (рубли)

</p>

<p>

Стоимость сопровождения: <span id="totalCostSopr"></span> (рубли)

</p>

<p>Сохранить параметры: Название <html:text property="name" styleId="name"/></p>

<html:hidden property="id"/>

<html:hidden property="type" value="admin"/>

<html:hidden property="operation" value="save"/>

<html:submit property="savee" value="Сохранить" styleId="saveButton"/>

</tiles:put>

</tiles:insert>

</html:form>

</body>

</html>

Приложение 5

Функции JavaScript

/**

* Методика оценки трудоемкости проекта CETIN.

*/Cetin = function() {self = this;

/**

* Список начальных параметров:

* -Количество вариантов использования (c)

* -Количество типов объектов (e)

* -Количество свойств типов объектов (t)

* -Количество взаимодействий между типами объектов (i)

* -Количество типов узлов (n)

*/.params = {c: 0, e: 0, t: 0, i: 0, n: 0};

/**

* Список начальных параметров отредактированный.

*/.paramsEdited =

{: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0],: [0, 0, 0, 0, 0, 0]

};

/**

* Нормативы трудоемкости по процессам в разрезе функциональных единиц

*/.s = [

/* c e t i n */

[32.12, 28.33, 0.000, 14.15, 0.000], //Бизнес-моделирование

[58.03, 28.04, 0.000, 20.32, 0.000], //Управление требованиями

[45.42, 61.75, 31.35, 37.52, 24.02], //Проектирование

[31.57, 81.51, 50.72, 36.11, 0.000], //Реализация

[88.96, 0.000, 0.000, 0.000, 0.000], //Тестирование

[8.690, 0.000, 0.000, 0.000, 23.74] //Развертывание

];

/**

* Трудоемкость по процессам в разрезе функциональных единиц

*/.sj = [

, //Бизнес-моделирование

, //Управление требованиями

, //Проектирование

, //Реализация

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

//Развертывание

];

/**

* Формула для определения поправочного коэффициента.

* В данной таблице представлены индексы коэффициентов, которые необходимо перемножить.

*/.kp = [

[11, 16, 17], //Бизнес-моделирование

[1, 2, 4, 5, 6, 7, 8, 9, 16, 17, 18], //Управление требованиями

[1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], //Проектирование

[1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18], //Реализация

[1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], //Тестирование

[1, 2, 11, 16, 18] //Развертывание

];

/**

* Срок разработки в трудоемкость.

*/.terms = [

[5, 30], //1 месяц

[10, 80], //2 месяца

[17, 140], //3 месяца

[26, 210], //4 месяца

[37, 280], //5 месяцев

[50, 340], //6 месяцев

[65, 400], //7 месяцев

[80, 450], //8 месяцев

[100, 500], //9 месяцев

[120, 550], //10 месяцев

[140, 610], //11 месяцев

[160, 670], //12 месяцев

[180, 720], //13 месяцев

[200, 770], //14 месяцев

[230, 820], //15 месяцев

[260, 870], //16 месяцев

[290, 930], //17 месяцев

[330, 990], //18 месяцев

[370, 1040], //19 месяцев

[420, 1090], //20 месяцев

[470, 1150], //21 месяц

[530, 1200], //22 месяца

[600, 1250], //23 месяца

[670, 1300], //24 месяца

[750, 1350], //25 месяцев

[830, 1400], //26 месяцев

[900, 1450], //27 месяцев

[970, 1500], //28 месяцев

[1150, 1550], //29 месяцев

[1230, 1600], //30 месяцев

[1310, 1660], //31 месяц

[1390, 1720], //32 месяца

[1470, 1780], //33 месяца

[1520, 1840], //34 месяца

[1570, 1900], //35 месяцев

[1620, 1960], //36 месяцев

[1680, 2020] //37 месяцев

];

/**

* Нормативные коэффициенты расхода разработчиков

*/.nkr = [71.5, 48, 25, 0.75, 15];

/* ПНР ПРП ПР L N */

/**

* Значения поправочных коэффициентов трудоемкости.

* По-умолчанию 1, т.е. всегда средние значения.

*/.k = [

, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

];

/**

* Подсчет трудоемкости.

* @returns {Number} трудоемкость (человеко-месяц).

*/.peopleMonth = function() {calc = 0;(var j = 0; j < 6; j++) {kpj = 1;(var kk in self.kp[j]) {*= self.k[self.kp[j][kk] - 1];

}+= self.sj[j] * kpj;

}calc;

};

/**

* Подсчет среднего срока разрабокти.

*

* @returns {Cetin.time.res} минимальное и максимально время разработки (месяцы).

*/.time = function() {pt = self.peopleMonth();res = {max: 0, min: self.terms.length - 1};

//Если трудоемкость превышает минимум левой границы.(pt > 1680) {.min = 36; //Конец массива..max = 31; //Начало массива, где начинается превышение.

//Если трудоемкость не превышает известной правой границы.

if (pt < 2020) {(res.min >= 0 && self.terms[res.min][1] > pt) {.min--;

}.min++;.max = Math.round(36 + (pt - 1680) / 40);

//Если превышает известную правую границу.

} else {.min = Math.round(36 + (pt - 2020) / 40);.max = Math.round(36 + (pt - 1680) / 40);

}

//Параметры срока можно расчитать на основании таблицы.

} else {(res.min >= 0 && self.terms[res.min][1] > pt) {.min--;

}.min++;(res.max < self.terms.length && self.terms[res.max][0] < pt) {.max++;

}.max--;

}.min++;.max++;(self.newTerm === 0).newTerm = (res.min + res.max) / 2;

return res;

};

/**

* Новый срок разработки, введенный пользователем.

*/.newTerm = 0;

/**

* Расчитанная новая трудоемкость, на основании нового срока разработки.

*/.newPeopleMonth = 0;

/**

* Пересчет трудоемкости.

*/.recalcPeopleMonth = function() {terms = self.time();avgTerm = (terms.min + terms.max) / 2;incr = (avgTerm - self.newTerm) / avgTerm * 100;.newPeopleMonth = self.peopleMonth() + incr * self.nkr[3]; //Коэффициент элластичности.

};

/**

* Введенные параметры цены.

* cost - зарплата.

* inflation - нфляция за три года (указывается процент).

* psn - процент социальных выплат.

* pnds - процент НДС.

*/.cost = {cost: 0, inflation: [0, 0, 0], psn: 0, pnds: 0};

/**

* Расчет стоимости разработки.

*

* @returns {Cetin.calcCost.res} включает в себя стоимость разработки и стоимость сопровождения.

*/.calcCost = function() {c = self.cost;isr = (c.inflation[0] + c.inflation[1] + c.inflation[2]) / 3;gsr = Math.floor(self.newTerm / 12) + 1;costs = [];csr = [];[0] = c.cost * (1 + isr / 100);(var i = 1; i < gsr; i++) {[i] = costs[i - 1] * (1 + isr / 100);

}(var i = 0; i < gsr; i++) {[i] = costs[i] * (1 + (0.9 * c.psn + self.nkr[0] + self.nkr[1]) / 100) * (1 + self.nkr[2] / 100) * (1 + c.pnds / 100);

}res = {sppo: 0, ssppo: 0};(var i = 0; i < gsr; i++) {.sppo += self.newPeopleMonth / gsr * csr[i];

}.ssppo = res.sppo * self.nkr[4] / 100 * self.k[1] * self.k[2] * self.k[15];

return res;

};

};

/**

* Менеджер шагов.

*

* @param {type} containerId идентификатор контейнера для вставки отображаемых шагов.

* @param {type} stepManagerName название менеджера шагов для обращения при кликах на шаги.

*/StepManager = function(containerId, stepManagerName) {self = this;.containerId = containerId;.stepManagerName = stepManagerName;.steps = [];

/**

* Текущий шаг.

*/.currentStep = "empty";

/**

* Переход к шагу с номеров stepNum.

* @param {type} stepNum номер шага для перехода.

*/.goStep = function(stepNum) {

/*

* При переходе к другому шагу необходимо сделать следующее:

* -проверить правильность заполнения полей.

* -снять активность с текущего шага.

* -выполнить дейстивя по сохранения данных введенных с формы в объект.

* -установаить активным шаг stepNum.

* -выполнить действия по обновлению отображаемых полей.

*

* -прокрутить экран к текущему шагу.

*/(self.currentStep !== "empty") {

$("#error" + self.currentStep).html("");(self.steps[self.currentStep].validators)

{validators = self.steps[self.currentStep].validators;(validators) {(var i = 0; i < validators.length; i++) {c = validators[i].validate();(c.error)

{

$("#" + c.id).addClass("error");

$("#error" + self.currentStep).html(c.error);;

} else {

$("#" + c.id).removeClass("error");

}

}

}

}

$("#step" + self.currentStep).removeClass("active");.steps[self.currentStep].onCloseFunction();(var qq = self.currentStep + 1; qq < stepNum; qq++) {.steps[qq].onOpenFunction();.steps[qq].onCloseFunction();

}

}.currentStep = stepNum;

$("#step" + self.currentStep).addClass("active");.steps[self.currentStep].onOpenFunction();

$('html, body').animate({: $("#step" + self.currentStep).offset().top - (stepNum === 0 ? 100 : 0)

}, 480);

};

/**

* Переход к предыдущему шагу.

*/.goPrev = function() {.goStep(self.steps[self.currentStep].prevStep);

};

/**

* Переход к следующему шагу.

*/.goNext = function() {

self.goStep(self.steps[self.currentStep].nextStep);

};

/**

* Шаг.

* @param onOpenFunction функция, вызываемая при открытии шага.

* @param onCloseFunction функция, вызываемая при закрытии шага.

* @param prevStep номер предыдущего шага.

* @param nextStep номер следующего шага.

* @param validators список валидаторов.

*/Step = function(onOpenFunction, onCloseFunction, prevStep, nextStep, validators) {

var self = this;

/**

* Функция при открытии шага (обновление параметров формы).

*/.onOpenFunction = onOpenFunction;

/**

* Функция при закрытии шага (сохранение параметров формы).

*/.onCloseFunction = onCloseFunction;

/**

* Номер предыдущего шага.

*/.prevStep = prevStep;

/**

* Номер следущего шага.

*/.nextStep = nextStep;

/**

* Проверки правильности введенных данных.

*/.validators = validators;

};

/**

* Функция установки значения в селект.

*

* @param {type} selectName название селекта.

* @param {type} value новое значение.

*/setSelected(selectName, value) {

$("select[name=" + selectName + "] option:selected").attr("selected", "");

$("select[name=" + selectName + "] option[value=\"" + value + "\"]").attr("selected", "selected");

}

/**

* Функция получения значения текущего селекта.

*

* @param {type} selectName навзвание селекта.

* @returns значение селекта.

*/getSelectedValue(selectName) {$("input[name=" + selectName + "Text]").val();

}

/**

* Смена значения поля Коэффициент у выбранного селекта.

*

* @param {type} selectName

* @returns {undefined}

*/changeSelected(selectName) {

$("input[name=" + selectName + "Text]").val($("select[name=" + selectName + "] option:selected").val());

}

/**

* Валидатор.

*

* @param {type} id поле для валидации.

* @param {type} regexp регулярное выражение валидации.

* @param {type} errorMessage сообщение при ошибке.

*/Validator = function(id, regexp, errorMessage)

{self = this;.id = id;.regexp = regexp;.errorMessage = errorMessage;

/**

* Функция для валидации.

* @returns {Validator.validate.Anonym$50|String}

*/.validate = function() {(!$("#" + self.id).val().match(self.regexp)) {{"id": self.id, "error": self.errorMessage};

}{"id": self.id};

};

};

Приложение 6

Текст файла CSS

body

{: 0; margin: 0;: 209mm;

}{: bold 8mm 'Arial';: #00688B;

}

.step {radius: 7px;color: #00688B;: 5px;

}

.step.active {color: #ecf5ff;

}

.step.active .title {color: #1dacd6;: #F0FFFF;radius: 7px 7px 0 0;

}

.step.active .footer {color: #e0efff;: #393939;radius: 0 0 7px 7px;: block;

}

.step.active .content {: block;

}

.step .title{: 2mm;: bold 7mm 'Arial';: #E0EEEE;: pointer;

}

.step .content{: 3mm;: 5mm 'Arial';: #36648B;: none;

}

.step .content .error {color: #ff7f7f;: #7f0000;

}

.step .content p, .step .content .p{indent: 1cm;height: 1.5;: 0.5mm 0;

}

.step .content .p {padding: 8px 0;}

.step .content .p {width: 1px 0;color: #cccccc;style: solid;

}

.step .content .p.error {color: #ff7f7f;

}

.step .content .hint {: #797979;: 3mm 'Arial';height: 1.0;

}

.step .content p input, .step .content .p input {float: right;}

.step .content p .select, .step .content .p .select {text-align: center;}

.step .content .p .select .hint {margin-top: 5px; margin-left: 1cm;}

.step .content .p .select input {float: none; width: 1.5cm;}.step .footer{: 2mm;: bold 7mm 'Arial';: #797979;: 0 auto;: none;align: center;

}

.step .footer .button {color: #00CD00;radius: 5px;: 2mm;: pointer;: 5cm;: 0 2px;align: center;: #ffffff;: inline-block;

}

.step .footer .button:hover {color: #7FFF00;: #3f7f3f;

}

.step .footer .button:pressed {color: #5da130;: #393939;

}{text-align: center; border-width: 0;}input {width: 40px; text-align: center;}

.step .legend {size: 12px;

}

#saveButton {left: 657px;: 100px;

height: 26px;

}

Приложение 7

Код страницы инициализации.

<%@page import="java.util.Map"%>

<%@page import="ru.cetin.InitForm"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@ taglib uri="#"justify"><%@ taglib uri="#"justify"><html>

<head>

<title>Инициализация</title>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width">

</head>

<body style="background-image:url(1.jpg)" >

<font color="#008B8B">

<h1 align="center" >Методика оценки трудоемкости программного продукта CETIN</h1>

<h2>Выбор сохраненных парамтеров</h2>

<%form = (InitForm)pageContext.getAttribute("InitForm", PageContext.REQUEST_SCOPE);(Map.Entry<Integer, String> entry: form.getIndexToName().entrySet())

{

%> <a>

<% out.append(entry.getValue()); %>

</a><br> <%

%>

<a>

<br></br>

<br></br>

<% out.append(entry.getValue()); %> (заказчик)

</a><br> <%

}

%>

<a href="cetin.do">

<a href="cetin.do?type=zakaz">

</body>

</html>

Приложение 8

Код страниц Сайта-Визитки

1 страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="2.html"">Принципы расчета трудоемкости и стоимости</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<ul>

<li>Расчет трудоемкости разработки ИС</li>

<li>Расчет стоимости разработки ИС</li>

<li>Расчет срока разработки ИС</li>

<li>Расчет трудоемкости развития ИС</li>

<li>Расчет стоимости развития ИС</li>

<li>Расчет стоимости годового сопровождения ИС</li>

</ul>

<hr>

</div>

</body>

</html>

страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="2.html"">Принципы расчета трудоемкости и стоимости</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<ul>

<li>Принцип поддержки жизненого цикла</li>

<li>Принцип измерения функционального размера</li>

<li>Принцип универсальности</li>

<li>Принцип улучшающейся оценки</li>

<li>Принцип учета технологии производства программного обеспечения</li>

</ul>

<hr>

</div>

</body>

</html>

страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="2.html"">Принципы расчета трудоемкост и стоимости</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<ul>

<li>Бизнес моделирование</li>

<li>Управление требованиями</li>

<li>Проектирование</li>

<li>Реализация</li>

<li>Тестирование</li>

<li>Развертывание</li>

</ul>

<hr>

</div>

</body>

</html>

страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="2.html"">Принципы расчета трудоемкости и стоимости</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<ul>

<li>Колличество вариантов использования (Case)-C</li>

<li>Колличество типов объектов(бизнес объектов)(Entity)-E</li>

<li>Колличество свойств типов объектов(Yool)-T</li>

<li>Колличество взаимодействий между типами объектов (Interaction)-I</li>

<li>Колличество типов узлов(Node)-N</li>

</ul>

<hr>

</div>

</body>

</html>

страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<ul>

<li>Оценка функционального размера разрабатываемой ИС</li>

<li>Оценка базовой трудоемкости разработки ППО</li>

<li>Определение значений поправочных коэффициентов трудоемкости</li>

<li>Расчет трудоемкости разработки ППО с учетом поправочных коэффициентов</li>

<li>Оценка срока разработки ППО</li>

<li>Корректировка трудоемкости разработки ППо при уменьшении срока разработки</li>

<li>Оценка стоимости разработки ППО</li>

</ul>

<hr>

</div>

</body>

</html>

страница.

<html>

<head>

<title>CETIN</title>

<link href="default.css" rel="stylesheet" type="text/css" />

</head>

<body>

<!-- start header -->

<div id="header">

<div id="logo">

<h1>CETIN</a></h1>

<h2><a>прогнозирование трудоемкостии </a></h2>

<h2><a>стоимости создания</a></h2>

<h2><a>программного продукта</a></h2>

</div>

<div id="menu">

<ul>

<li><a href="1.html">Назначение методики</a></li>

<li><a href="2.html"">Принципы расчета трудоемкости и стоимости</a></li>

<li><a href="3.html"">Основные процессы разработки</a></li>

<li><a href="4.html"">Функциональный размер ИС</a></li>

<li><a href="5.html"">Процесс расчета разработки ППО</a></li>

<li><a href="6.html"">Демонстрация программы</a></li>

</ul>

</div>

</div>

<!-- end header -->

<!-- start page -->

<div id="page">

<!-- start content -->

<div id="content">

<!-- start latest-post -->

<div id="latest-post">

<h1>

<hr>

<div>

<a tabindex="1"><img src="11.jpg"></a>

<a tabindex="2"><img src="12.jpg"></a>

<a tabindex="3"><img src="13.jpg"></a>

<a tabindex="4"><img src="14.jpg"></a>

<a tabindex="5"><img src="15.jpg"></a>

<a tabindex="6"><img src="16.jpg"></a>

<a tabindex="7"><img src="17.jpg"></a>

<a tabindex="8"><img src="18.jpg"></a>

<a tabindex="9"><img src="19.jpg"></a>

<a tabindex="10"><img src="110.jpg"></a>

<a tabindex="11"><img src="111.jpg"></a>

</div>

<hr>

</div>

</body>

</html>

Файл CSS{: 0;: 0;: #FFFFFF url(images/img01.jpg) repeat-x;family: "Trebuchet MS", Arial, Helvetica, sans-serif;size: 13px;: #666666;

}{: 0;: 0;

}{: 0;: 0;: none;

}, textarea, select {: normal 1em "Trebuchet MS", Arial, Helvetica, sans-serif;

}, h2 {weight: normal;: #7CD300;

}{spacing: -1px;size: 2.6em;

}{size: 1.8em;

}{size: 2em;weight: bold;

}, ul, ol {

}{

}{style: italic;

}{

}{

}{: #7CD300;

}:hover {decoration: none;

}{

}{: none;

}{: none;

}.left {: left;: 0 15px 0 0;

}.right {: left;: 0 0 0 15px;

}

/* Header */

#header {: 920px;: 160px;: 0 auto;

}

/* Logo */

#logo {: left;

}

#logo h1, #logo h2 {: 0;transform: lowercase;

}

#logo h1 {top: 52px;size: 4em;: #554D49;

}

#logo h1 a {: #554D49;

}

#logo h2 {top: -10px;left: 1px;spacing: -1px;size: 1.8em;: #7F7772;

}

#logo h2 a {: #7F7772;

}

#logo a {decoration: none;

}

/* Menu */

#menu {: right;

}

#menu ul {: 0;: 40px 0 0 0;style: none;

}

#menu li {: inline;

}

#menu a {: block;: left;: 184px;: 100px;top: 30px;: #73D000 url(images/img02111.jpg) no-repeat;align: center;decoration: none;transform: lowercase;size: 1.5em;: #FFFFFF;

}

/* Page */

#page {: 980px;: 0 auto;top: 20px;

}

#latest-post {: left;:1000px;

}

.post .title {: 0;

}

.post .meta {: 0;bottom: 10px;height: normal;family: Arial, Helvetica, sans-serif;: #BABABA;

}

.post .meta a {: #BABABA;

}

.post .entry {bottom: 10px;bottom: 5px;

}

.gallery a img{

/* округления старт */

webkit-border-radius: 25px;

moz-border-radius: 25px;radius: 25px;

/* округления конец */

/* transition старт */

webkit-transition:All 1s ease;

moz-transition:All 1s ease;

o-transition:All 1s ease;: all 1.0s ease;

/* transition конец */

/* Тень старт */

webkit-box-shadow: 0px 2px 4px 1px #DFDFDF;

moz-box-shadow: 0px 2px 4px 1px #DFDFDF;shadow: 0px 2px 4px 1px #DFDFDF;

/* Тень конец */

/* Прозрачнсоть старт */

moz-opacity: 0.70;

opacity: 0.70;

ms-filter:"progid:DXImageTransform.Microsoft.Alpha"(Opacity=70);

/* Прозрачнсоть конец */

margin-right:5px; /* Отступ справа */

padding:10px; /* Внутренние отступы */

display:inline-block; /* отображение */

height:150px; /* Высота */

}

.gallery a img:hover{

moz-opacity: 1;: 1;

ms-filter:"progid:DXImageTransform.Microsoft.Alpha"(Opacity=100);

}

.gallery a:focus img{: relative; /* Позиционирование */:500px; /* Высота */: pointer; /* Вид курсора */

/* transition старт */

webkit-transition:All 1s ease;

moz-transition:All 1s ease;

o-transition:All 1s ease;: all 1.0s ease;

/* transition конец */

/* Тень старт */

webkit-box-shadow: 0px 4px 4px 1px #DFDFDF;

moz-box-shadow: 0px 4px 4px 1px #DFDFDF;shadow: 0px 4px 4px 1px #DFDFDF;

/* Тень конец */

}

Похожие работы на - Разработка инструментария для расчета трудоемкости и стоимости разработки программного продукта по методике CETIN

 

Не нашел материал для своей работы?
Поможем написать качественную работу
Без плагиата!