
- •Міністерство освіти та науки України в.В. Литвин, н.Б. Шаховська Проектування інформаційних систем
- •Передмова наукового редактора серії підручників «комп’ютинґ»
- •1.1. Складність програмного забезпечення
- •1.2. Структура складних систем
- •1.2.1. Приклади складних систем
- •1.2.2. П'ять ознак складної системи
- •1.2.3. Організована і неорганізована складність
- •1.3. Методи подолання складності
- •1.3.1. Роль декомпозиції
- •1.3.3. Роль абстракції
- •1.3.4. Роль ієрархії
- •1.4. Про проектування складних систем
- •1.4.1. Інженерна справа як наука і мистецтво
- •1.4.2. Сенс проектування
- •4. Методи подолання складності.
- •2.1. Базові означення
- •2.2. Методи проектування інформаційних систем
- •2.3. Види інформаційних систем
- •2.4. Рівні моделей даних
- •3. Види інформаційних систем.
- •3.1. Методологія процедурно-орієнтованого програмування
- •3.2. Методологія об'єктно-орієнтованого програмування
- •3.3. Методологія об'єктно-орієнтованого аналізу і проектування
- •3.4. Методологія системного аналізу і системного моделювання
- •4.1. Передісторія. Математичні основи
- •4.1.1. Теорія множин
- •4.1.2. Теорія графів
- •4.1.3. Семантичні мережі
- •4.2. Діаграми структурного системного аналізу
- •4.3. Основні етапи розвитку uml
- •3. Семантичні мережі.
- •5.1. Принципи структурного підходу до проектування
- •5.2. Структурний аналіз
- •5.3. Структурне проектування
- •5.4. Методологія структурного аналізу
- •5.5. Інструментальні засоби структурного аналізу та проектування
- •6.1. Основні елементи
- •6.2. Типи зв’язків
- •6.3. Техніка побудови
- •6.4. Діаграма бізнес – функцій
- •6.4.1. Призначення діаграми бізнес-функцій
- •6.4.2. Основні елементи
- •7.1. Призначення діаграм потоків даних та основні елементи
- •7.1.1. Зовнішні сутності
- •7.1.2. Процеси
- •7.1.3. Накопичувачі даних
- •7.1.4. Потоки даних
- •7.2. Методологія побудови dfd.
- •8.1. Діаграма «сутність-зв’язок»
- •8.2. Діаграма атрибутів
- •8.3. Діаграма категоризації
- •8.4. Обмеження діаграм сутність-зв’язок
- •8.5. Методологія idef1
- •9.1. Основні елементи
- •9.2. Типи керуючих потоків
- •9.3. Принципи побудови
- •10.1. Структурні карти Константайна
- •10.2. Структурні карти Джексона
- •11.1. Призначення case-технологій
- •11.2. Інструментальний засіб bPwin
- •11.2.4. Інші діаграми bpWin
- •11.2.5. Моделі as is і to be
- •11.3.1. Основні властивості
- •11.3.2. Стандарт idef1x
- •11.4. Програмний засіб Visio
- •12.1. Системний аналіз області наукових досліджень
- •12.1.1. Аналіз предметної області
- •12.2. Системний аналіз біржі праці
- •12.2.1. Дерево цілей
- •12.2.2. Опис об’єктів предметної області
- •12.2.3. Концептуальна модель
- •14.1. Еволюція об'єктної моделі
- •14.1.1. Основні положення об'єктної моделі
- •14.2. Складові частини об'єктного підходу
- •14.2.1. Парадигми програмування
- •14.2.2. Абстрагування
- •14.2.3. Інкапсуляція
- •14.2.4. Модульність
- •14.2.5. Ієрархія
- •14.2.7. Паралелізм
- •14.2.8. Збереженість
- •14.3. Застосування об'єктної моделі
- •14.3.1. Переваги об'єктної моделі
- •14.3.2. Використання об'єктного підходу
- •14.3.3. Відкриті питання
- •15.1. Природа об'єкта
- •15.1.1. Що є й що не є об'єктом?
- •15.1.2. Стан
- •15.1.3. Поведінка
- •15.1.4. Ідентичність
- •Void drag(DisplayItem I); // Небезпечно
- •15.2. Відношення між об'єктами
- •15.2.1. Типи відношень
- •15.2.2. Зв'язки
- •15.2.3. Агрегація
- •15.3. Природа класів
- •15.3.1. Що таке клас?
- •15.3.2. Інтерфейс і реалізація
- •15.3.3. Життєвий цикл класу
- •15.4. Відношення між класами
- •15.4.1. Типи відношень
- •15.4.2. Асоціація
- •15.4.3. Успадкування
- •15.4.4. Агрегація
- •15.4.5. Використання
- •15.4.6. Інсталювання (Параметризація)
- •15.4.6. Метакласи
- •15.5. Взаємозв'язок класів і об'єктів
- •15.5.1. Відношення між класами й об'єктами
- •15.5.2. Роль класів і об'єктів в аналізі й проектуванні
- •16.1. Важливість правильної класифікації
- •16.1.1. Класифікація й об’єктно-орієнтовне проектування
- •16.1.2. Труднощі класифікації
- •16.2. Ідентифікація класів і об'єктів
- •16.2.1. Класичний і сучасний підходи
- •16.2.2. Об’єктно-орієнтований аналіз
- •16.3. Ключові абстракції й механізми
- •16.3.1. Ключові абстракції
- •16.3.2. Ідентифікація механізмів
- •17.1. Призначення мови uml
- •17.2. Загальна структура мови uml
- •17.3. Пакети в мові uml
- •17.4. Основні пакети мета-моделі мови uml
- •17.5. Специфіка опису мета-моделі мови uml
- •17.6. Особливості зображення діаграм мови uml
- •18.1. Варіант використання
- •18.2. Актори
- •18.3. Інтерфейси
- •18.4. Примітки
- •18.5. Відношення на діаграмі варіантів використання
- •18.5.1. Відношення асоціації
- •13.5.2. Відношення розширення
- •18.5.3. Відношення узагальнення
- •18.5.4. Відношення включення
- •18.6. Приклад побудови діаграми варіантів використання
- •18.7. Рекомендації з розроблення діаграм варіантів використання
- •19.1. Клас
- •19.1.1. Ім'я класу
- •19.1.2. Атрибути класу
- •19.1.3. Операція
- •19.2. Відношення між класами
- •19.2.1. Відношення залежності
- •19.2.2. Відношення асоціації
- •19.2.3. Відношення агрегації
- •19.2.4. Відношення композиції
- •19.2.5. Відношення узагальнення
- •19.3. Інтерфейси
- •19.5. Шаблони або параметризовані класи
- •19.6. Рекомендації з побудови діаграми класів
- •20.1. Автомати
- •20.2. Стан
- •20.2.1. Ім'я стану
- •20.2.2. Список внутрішніх дій
- •20.2.3. Початковий стан
- •20.2.4. Кінцевий стан
- •20.3. Перехід
- •20.3.2. Сторожова умова
- •20.3.3.Вираз дії
- •15.4. Складений стан і підстан
- •20.4.1. Послідовні підстани
- •20.4.2. Паралельні підстани
- •15.5. Історичний стан
- •20.6. Складні переходи
- •15.6.1. Переходи між паралельними станами
- •20.6.2. Переходи між складеними станами
- •20.6.3. Синхронізуючі стани
- •20.7. Рекомендації з побудови діаграм станів
- •21.1. Стан дії
- •21.2. Переходи
- •21.5. Рекомендації до побудови діаграм діяльності
- •22.1.1. Лінія життя об'єкта
- •22.1.2. Фокус керування
- •22.2. Повідомлення
- •22.2.1. Розгалуження потоку керування
- •22.2.2. Стереотипи повідомлень
- •22.2.3. Тимчасові обмеження на діаграмах послідовності
- •22.2.4. Коментарі або примітки
- •22.3. Приклад побудови діаграми послідовності
- •22.4. Рекомендації з побудови діаграм послідовності
- •23.1. Кооперація
- •23.2.1. Мультиоб'єкт
- •23.2.2. Активний об'єкт
- •23.2.3. Складений об'єкт
- •23.3. Зв'язки
- •23.3.1. Стереотипи зв'язків
- •23.4. Повідомлення
- •23.4.1. Формат запису повідомлень
- •23.5. Приклад побудови діаграми кооперації
- •23.6. Рекомендації з побудови діаграм кооперації
- •24.1. Компоненти
- •24.1.1. Ім'я компоненту
- •24.1.2. Види компонент
- •24.2. Інтерфейси
- •24.3. Залежності
- •24.4. Рекомендації з побудови діаграми компонент
- •25.1. Вузол
- •25.2. З'єднання
- •25.3. Рекомендації з побудови діаграми розгортання
- •26.1. Загальна характеристика case-засобу Rational Rose
- •26.2. Особливості робочого інтерфейсу Rational Rose
- •26.1.1. Головне меню програми
- •26.1.2. Стандартна панель інструментів
- •26.1.3. Вікно браузера
- •26.1.4. Спеціальна панель інструментів
- •26.1.5. Вікно діаграми
- •26.1.6. Вікно документації
- •26.1.7. Вікно журналу
- •26.3. Початок роботи над проектом у середовищі Rational Rose
- •26.4. Розроблення діаграми варіантів використання в середовищі Rational Rose
- •26.5. Розроблення діаграми класів у середовищі Rational Rose
- •26.6. Розроблення діаграми станів у середовищі Rational Rose
- •26.7. Розроблення діаграми послідовності в середовищі Rational Rose
- •26.8. Розроблення діаграми кооперації в середовищі Rational Rose
- •26.9. Розроблення діаграми компонентів у середовищі Rational Rose
- •26.10. Розроблення діаграми розгортання в середовищі Rational Rose
1.1. Складність програмного забезпечення
Складність програмного забезпечення - зовсім не випадкова її властивість. Складність виникає через чотири основні причини:
складністю реальної ПО, з якої виходить замовлення на розроблення програмного забезпечення (ПЗ);
складністю керування процесом розроблення;
необхідністю забезпечити достатню гнучкість програми;
незадовільними способами опису поведінки великих дискретних систем.
Складність реального світу. Проблеми, які ми намагаємося вирішити за допомогою ПЗ, часто неминуче містять складні елементи, а до відповідних програм пред'являються різні, інколи взаємовиключні вимоги. Розглянемо необхідні характеристики електронної системи багатомоторного літака, стільникової телефонної комутаторної системи і робота. Досить важко зрозуміти, навіть у загальних рисах, як працює кожна така система. Тепер додайте до цього додаткові вимоги (часто не формульовані явно), такі як зручність, продуктивність, вартість, виживаність і надійність! Складність завдання і породжує складність програмного продукту.
Ця зовнішня складність зазвичай виникає через "нестикування" між користувачами системи і її розробниками: користувачі насилу можуть пояснити у формі, зрозумілій розробникам, що насправді потрібно зробити. Бувають випадки, коли користувач лише поверхнево уявляє, що йому потрібно від майбутньої ІС. Це в основному відбувається не через помилки з тієї чи іншої сторони; просто кожна з груп спеціалізується в своїй області, і їй бракує знання партнера. У користувачів і розробників різні погляди на суть проблеми, і вони роблять різні виведення про можливі шляхи їх рішення. Насправді, навіть якщо користувач точно знає, що йому потрібно, важко однозначно зафіксувати всі його вимоги. Зазвичай вони фіксуються на багатьох сторінках тексту, "розбавлених" небагатьма рисунками. Такі документи важко піддаються розумінню, вони відкриті для різних інтерпретацій і часто містять елементи, що відносяться швидше до дизайну, ніж до необхідних вимог розроблення.
Додаткові складнощі виникають в результаті змін вимог до програмної системи вже в процесі розроблення. В основному вимоги коректуються через те, що сама реалізація програмного проекту часто змінює проблему. Розгляд перших результатів - схем, прототипів, - і використання системи після того, як вона розроблена і встановлена, заставляють користувачів краще зрозуміти і виразніше сформулювати те, що їм дійсно потрібно. В той же час цей процес підвищує кваліфікацію розробників у ПО і дозволяє їм ставити більш осмислені питання, які пояснюють „темні місця” в проектованій системі.
Велика програмна система - це крупне капіталовкладення, і ми не можемо дозволити собі викидати зроблений програмний продукт при кожній зміні зовнішніх вимог. Проте навіть великі системи мають тенденцію до еволюції в процесі їх використання: отже, постає задача про те, що часто неправильно називають супроводом ПЗ. Аби бути точнішими, введемо декілька термінів:
під супроводом розуміється усунення помилок;
під еволюцією - внесення змін до системи у відповідь на вимоги, що змінилися, до неї;
під збереженням - використання всіх можливих і неможливих способів для підтримки життя в „дряхлій” системі, що розпадається на частини.
На жаль, досвід показує, що істотний відсоток витрат на розроблення ІС витрачається саме на збереження.
Труднощі керування процесом розроблення. Основне завдання розробників полягає в створенні ілюзії простоти, в захисті користувачів від складності описуваного предмету або процесу. Розмір вихідних текстів ІС зовсім не входить до числа її головних переваг, тому ми прагнемо робити вихідні тексти компактнішими, видумуючи хитромудрі і потужні методи, а також використовуючи середовища розроблення вже існуючих проектів і програм. Проте нові вимоги для кожної нової системи неминучі, вони змушують створювати багато програм "з нуля", або намагатися по-новому використовувати вже існуючі. Всього 30 років тому програми об'ємом в декілька тисяч рядків на асемблері виходили за межі наших можливостей. Сьогодні звичайними стали ІС, розмір яких обчислюється десятками тисяч або навіть мільйонами рядків на мовах високого рівня. Жодна людина ніколи не зможе повністю зрозуміти таку систему. Навіть якщо ми правильно розкладемо її на складові частини, ми все одно отримаємо сотні, а інколи і тисячі окремих модулів. Тому такий об'єм робіт вимагає залучення команди розробників, в ідеалі як можна з меншою чисельністю. Але якою б вона не була, завжди виникатимуть значні труднощі, пов'язані з організацією колективної розробки. Чим більше розробників, тим складніше зв'язки між ними і тим складніша координація, особливо якщо учасники робіт географічно віддалені один від одного, що типово в разі дуже великих проектів. Таким чином, при колективному виконанні проекту головним завданням керівництва є підтримка єдності і цілісності розробки.
Гнучкість програмного забезпечення. Домобудівна компанія зазвичай не має власного лісгоспу, який би їй поставляв ліс для пиломатеріалів; абсолютно незвично, щоб монтажна фірма спорудила свій завод для виготовлення сталевих балок під майбутню будівлю. Проте в програмній індустрії така практика - справа звичайна. Програмування володіє граничною гнучкістю, і розробник може сам забезпечити себе всіма необхідними елементами, що відносяться до будь-якого рівня абстракції. Така гнучкість надзвичайно спокуслива. Вона заставляє розробника створювати своїми силами всі базові будівельні блоки майбутньої конструкції, з яких складаються елементи вищих рівнів абстракції. На відміну від будівельної індустрії, де існують єдині стандарти на конструктивні елементи і якісні матеріали, в програмній індустрії таких стандартів майже немає. Тому програмні розробки залишаються дуже трудомісткою справою.
Проблема опису поведінки великих дискретних систем. Коли ми кидаємо вгору м'яч, ми можемо достовірно передбачити його траєкторію, тому що знаємо, що в нормальних умовах тут діють відомі закони фізики. Ми б дуже здивувалися, якби, кинувши м'яч з ледве більшою швидкістю, побачили, що він на середині дороги несподівано зупинився і різко змінив напрям руху. У недостатньо відлагодженій програмі моделювання польоту м'яча така ситуація легко може виникнути.
Всередині великої прикладної програми можуть існувати сотні і навіть тисячі змінних і декілька потоків керування. Повний набір цих змінних, їх поточних значень, поточної адреси і стеку виклику для кожного процесу описує стан прикладної програми в кожний момент часу. Оскільки виконання нашої програми здійснюється на цифровому комп'ютері, ми маємо систему з дискретними станами. Аналогові системи, такі, як рух кинутого м'яча, навпаки, є безперервними. Коли ми говоримо, що система описується безперервною функцією, ми маємо на увазі, що в ній немає прихованих сюрпризів. Невеликі зміни вхідних параметрів завжди викличуть невеликі зміни вихідних. З іншої сторони, дискретні системи за своєю природою мають кінцеве число можливих станів, хоча у великих системах це число відповідно до правил комбінаторики дуже велике. Ми прагнемо проектувати системи, розділяючи їх на частини так, щоб одна частина мінімально впливало на іншу. Проте переходи між дискретними станами не можуть моделюватися безперервними функціями. Кожна подія, зовнішня по відношенню до програмної системи, може перевести її в новий стан, і, більш того, перехід з одного стану в інший не завжди детермінований. За несприятливих умов зовнішня подія може порушити поточний стан системи через те, що її творці не змогли передбачити всі можливі варіанти. Уявимо собі пасажирський літак, в якому система керування польотом і система електропостачання об'єднані. Було б дуже неприємно, якби від включення пасажиром, що сидить на місці 17В, індивідуального освітлення літак негайно увійшов би у глибокого піке. У безперервних системах така поведінка була б неможливою, але в дискретних системах будь-яка зовнішня подія може вплинути на будь-яку частину внутрішнього стану системи. Це, вочевидь, і є головною причиною обов'язкового тестування наших систем; але річ у тому, що за винятком найтривіальніших випадків, всеосяжне тестування таких програм провести неможливо. І доки у нас немає ні математичних інструментів, ні інтелектуальних можливостей для повного моделювання поведінки великих дискретних систем, ми повинні задовольнитися розумним рівнем упевненості в їх правильності.
Наслідки необмеженої складності. Чим складніша система, тим легше її повністю розвалити. Будівельник навряд чи погодиться розширити фундамент вже побудованої 100-поверхової будівлі. Це не просто дорого: робити такі речі означає напрошуватися на неприємності. Але що дивно, користувачі програмних систем, не замислюючись, ставлять подібні завдання перед розробниками. Це, стверджують вони, всього лише технічне питання для програмістів.
Наше невміння створювати складні ІС виявляється в проектах, які виходять за рамки встановлених термінів і бюджетів і до того ж не відповідають початковим вимогам. Ми часто називаємо це кризою ПЗ, але, чесно кажучи, нездужання, яке тягнеться так довго, стає нормою. На жаль, ця криза наводить до розбазарювання людських ресурсів - найдорогоціннішого товару - і до істотного обмеження можливостей створення нових продуктів. Зараз просто не вистачає хороших програмістів, аби забезпечити всіх користувачів потрібними програмами. Більше того, істотний відсоток персоналу, зайнятого розробками, в будь-якій організації часто повинен займатися супроводом і збереженням застарілих програм. З врахуванням прямого і непрямого внеску індустрії ПЗ у розвиток економіки більшості провідних країн, не можна дозволити, аби існуюча ситуація залишилася без змін.
Як ми можемо змінити ці справи? Оскільки проблема виникає в результаті складності структури програмних продуктів, ми пропонуємо спочатку розглянути способи роботи із складними структурами в інших областях. Насправді, можна навести безліч прикладів успішно функціонуючих складних систем. Деякі з них створені людиною, наприклад: космічний човник Space Shuttle, тунель під Ла-Маншем, великі фірми типу Microsoft або General Electric. У природі існують ще складніші системи, наприклад система кровообігу людини або рослина.