2062 lines
1.2 MiB
2062 lines
1.2 MiB
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "70fb0fd0",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Лабораторная работа 12\n",
|
||
"\n",
|
||
"## Классификация набора изображений\n",
|
||
"\n",
|
||
"Для выполнения первой части лабораторной работы будет использован датасет Satellite Image Classification по следующей ссылке: https://www.kaggle.com/datasets/mahmoudreda55/satellite-image-classification?resource=download\n",
|
||
"\n",
|
||
"Этот набор данных содержит 4 различных вида спутниковых снимков: cloudy, desert, green_area, water. Задачей является классификация изображений в соответствии с этими категориями."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 65,
|
||
"id": "7e323722",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Всего классов: 4\n",
|
||
"Список классов: ['cloudy', 'desert', 'green_area', 'water']\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import os\n",
|
||
"os.environ[\"KERAS_BACKEND\"] = \"jax\"\n",
|
||
"\n",
|
||
"from keras import backend as K\n",
|
||
"K.clear_session()\n",
|
||
"\n",
|
||
"dataset_path = \"../../static/images\"\n",
|
||
"\n",
|
||
"classes = os.listdir(dataset_path)\n",
|
||
"num_classes = len(classes)\n",
|
||
"\n",
|
||
"print(f\"Всего классов: {num_classes}\")\n",
|
||
"print(\"Список классов:\", classes)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "3f566535",
|
||
"metadata": {},
|
||
"source": [
|
||
"Перед классификацией предобработаем изображения и разделим их на выборки:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 66,
|
||
"id": "3aba5907",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Размер обучающей выборки: (4504, 224, 224, 3)\n",
|
||
"Размер тестовой выборки: (1127, 224, 224, 3)\n",
|
||
"Количество классов: 4\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import numpy as np\n",
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"from keras.api.utils import to_categorical\n",
|
||
"from PIL import Image\n",
|
||
"\n",
|
||
"img_width, img_height = 224, 224\n",
|
||
"input_shape = (img_width, img_height, 3) \n",
|
||
"\n",
|
||
"X = []\n",
|
||
"y = []\n",
|
||
"\n",
|
||
"for i, image_class in enumerate(classes):\n",
|
||
" class_dir = os.path.join(dataset_path, image_class)\n",
|
||
" for img_file in os.listdir(class_dir):\n",
|
||
" try:\n",
|
||
" img_path = os.path.join(class_dir, img_file)\n",
|
||
" img = Image.open(img_path).convert('RGB') # приводим к RGB\n",
|
||
" img = img.resize((img_width, img_height)) # изменяем размер\n",
|
||
" img_array = np.array(img) / 255.0 # нормализация [0, 1]\n",
|
||
" X.append(img_array)\n",
|
||
" y.append(i)\n",
|
||
" except Exception as e:\n",
|
||
" print(f\"Ошибка при загрузке {img_path}: {e}\")\n",
|
||
"\n",
|
||
"X = np.array(X)\n",
|
||
"y = np.array(y)\n",
|
||
"\n",
|
||
"y = to_categorical(y, num_classes=num_classes)\n",
|
||
"\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(\n",
|
||
" X, y, test_size=0.2, random_state=42, stratify=y\n",
|
||
")\n",
|
||
"\n",
|
||
"print(f\"Размер обучающей выборки: {X_train.shape}\")\n",
|
||
"print(f\"Размер тестовой выборки: {X_test.shape}\")\n",
|
||
"print(f\"Количество классов: {num_classes}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2e3ff06f",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Перейдем к проектированию глубокой сверточной нейронной сети.\n",
|
||
"\n",
|
||
"Для этого используем одну из самых известных архитектур сверточных нейросетей – AlexNet, которая стала победителем соревнований ILSVRC в 2012 году с большим отрывом.\n",
|
||
"\n",
|
||
"Её архитектура предназначена для работы с изображениями размером 224×224×3 и включает:\n",
|
||
"* 5 свёрточных слоёв с фильтрами разных размеров (11×11, 5×5, 3×3);\n",
|
||
"* Между ними — MaxPooling-слои для уменьшения размерности;\n",
|
||
"* Для ускорения и стабильности обучения добавлена Batch Normalization, которой не было в изначальной AlexNet;\n",
|
||
"* 3 полносвязных слоя: 2 по 4096 нейронов с активацией ReLU или tanh (тут используется tanh), выходной слой с количеством нейронов по числу классов (4 в нашем случае) и функцией активации softmax;\n",
|
||
"* Dropout 50% после полносвязных слоёв для борьбы с переобучением."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 67,
|
||
"id": "e4907e96",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">54</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">54</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">34,944</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">22</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">22</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">614,656</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization_1 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,024</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">590,080</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">6</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">6</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">885,120</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,327,488</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">MaxPooling2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization_2 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,536</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">BatchNormalization</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">384</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,576,960</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,781,312</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4096</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,388</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m54\u001b[0m, \u001b[38;5;34m54\u001b[0m, \u001b[38;5;34m96\u001b[0m) │ \u001b[38;5;34m34,944\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m96\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m96\u001b[0m) │ \u001b[38;5;34m384\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m22\u001b[0m, \u001b[38;5;34m22\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m614,656\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d_1 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization_1 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m1,024\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m8\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m590,080\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m6\u001b[0m, \u001b[38;5;34m6\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m885,120\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv2d_4 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m1,327,488\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ max_pooling2d_2 (\u001b[38;5;33mMaxPooling2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ batch_normalization_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m1,536\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mBatchNormalization\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m384\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m) │ \u001b[38;5;34m1,576,960\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m) │ \u001b[38;5;34m16,781,312\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_1 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4096\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m) │ \u001b[38;5;34m16,388\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">21,829,892</span> (83.27 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m21,829,892\u001b[0m (83.27 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">21,828,420</span> (83.27 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m21,828,420\u001b[0m (83.27 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,472</span> (5.75 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m1,472\u001b[0m (5.75 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from keras.api.models import Sequential\n",
|
||
"from keras.api.layers import InputLayer, Conv2D, MaxPooling2D, Dropout, Flatten, Dense, BatchNormalization\n",
|
||
"\n",
|
||
"alexnet_model = Sequential()\n",
|
||
"\n",
|
||
"# Входной слой\n",
|
||
"alexnet_model.add(InputLayer(shape=(224, 224, 3)))\n",
|
||
"\n",
|
||
"# Первый скрытый слой\n",
|
||
"alexnet_model.add(Conv2D(96, kernel_size=(11, 11), strides=(4, 4), activation=\"relu\"))\n",
|
||
"alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))\n",
|
||
"alexnet_model.add(BatchNormalization())\n",
|
||
"\n",
|
||
"# Второй скрытый слой\n",
|
||
"alexnet_model.add(Conv2D(256, kernel_size=(5, 5), activation=\"relu\"))\n",
|
||
"alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))\n",
|
||
"alexnet_model.add(BatchNormalization())\n",
|
||
"\n",
|
||
"# Третий скрытый слой\n",
|
||
"alexnet_model.add(Conv2D(256, kernel_size=(3, 3), activation=\"relu\"))\n",
|
||
"\n",
|
||
"# Четвертый скрытый слой\n",
|
||
"alexnet_model.add(Conv2D(384, kernel_size=(3, 3), activation=\"relu\"))\n",
|
||
"\n",
|
||
"# Пятый скрытый слой\n",
|
||
"alexnet_model.add(Conv2D(384, kernel_size=(3, 3), activation=\"relu\"))\n",
|
||
"alexnet_model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))\n",
|
||
"alexnet_model.add(BatchNormalization())\n",
|
||
"\n",
|
||
"# Шестой скрытый слой\n",
|
||
"alexnet_model.add(Flatten())\n",
|
||
"alexnet_model.add(Dense(4096, activation=\"tanh\"))\n",
|
||
"alexnet_model.add(Dropout(0.5))\n",
|
||
"\n",
|
||
"# Седьмой скрытый слой\n",
|
||
"alexnet_model.add(Dense(4096, activation=\"tanh\"))\n",
|
||
"alexnet_model.add(Dropout(0.5))\n",
|
||
"\n",
|
||
"# Выходной слой\n",
|
||
"alexnet_model.add(Dense(num_classes, activation=\"softmax\"))\n",
|
||
"\n",
|
||
"alexnet_model.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "6089df1f",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучим получившуюся модель.\n",
|
||
"\n",
|
||
"Для того чтобы не переобучать ее и сэкономить время, добавим callback EarlyStopping. Он следит за некоторой метрикой во время обучения (например, val_accuracy или val_loss) и останавливает обучение, если метрика перестаёт улучшаться определённое количество эпох подряд."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 68,
|
||
"id": "877a978d",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m76s\u001b[0m 508ms/step - accuracy: 0.5802 - loss: 3.0494 - val_accuracy: 0.6078 - val_loss: 1.1478\n",
|
||
"Epoch 2/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m86s\u001b[0m 492ms/step - accuracy: 0.6539 - loss: 1.4671 - val_accuracy: 0.5759 - val_loss: 1.8511\n",
|
||
"Epoch 3/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m72s\u001b[0m 480ms/step - accuracy: 0.6790 - loss: 1.0421 - val_accuracy: 0.6761 - val_loss: 1.1706\n",
|
||
"Epoch 4/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m71s\u001b[0m 482ms/step - accuracy: 0.6985 - loss: 0.9528 - val_accuracy: 0.8802 - val_loss: 0.3724\n",
|
||
"Epoch 5/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m70s\u001b[0m 478ms/step - accuracy: 0.7758 - loss: 0.6725 - val_accuracy: 0.7924 - val_loss: 0.7113\n",
|
||
"Epoch 6/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m69s\u001b[0m 479ms/step - accuracy: 0.7931 - loss: 0.6899 - val_accuracy: 0.6832 - val_loss: 1.3199\n",
|
||
"Epoch 7/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m70s\u001b[0m 479ms/step - accuracy: 0.7704 - loss: 0.8175 - val_accuracy: 0.7897 - val_loss: 0.4727\n",
|
||
"Epoch 8/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m71s\u001b[0m 479ms/step - accuracy: 0.7928 - loss: 0.6901 - val_accuracy: 0.7311 - val_loss: 0.9552\n",
|
||
"Epoch 9/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m71s\u001b[0m 475ms/step - accuracy: 0.7991 - loss: 0.6318 - val_accuracy: 0.7755 - val_loss: 0.6109\n",
|
||
"Epoch 10/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m70s\u001b[0m 479ms/step - accuracy: 0.7945 - loss: 0.7600 - val_accuracy: 0.6486 - val_loss: 2.5368\n",
|
||
"Epoch 11/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m68s\u001b[0m 476ms/step - accuracy: 0.8092 - loss: 0.6147 - val_accuracy: 0.6575 - val_loss: 1.9477\n",
|
||
"Epoch 12/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m70s\u001b[0m 476ms/step - accuracy: 0.7876 - loss: 0.7289 - val_accuracy: 0.8642 - val_loss: 0.4350\n",
|
||
"Epoch 13/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m69s\u001b[0m 475ms/step - accuracy: 0.8161 - loss: 0.6355 - val_accuracy: 0.7001 - val_loss: 1.3853\n",
|
||
"Epoch 14/100\n",
|
||
"\u001b[1m141/141\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m70s\u001b[0m 492ms/step - accuracy: 0.8322 - loss: 0.6484 - val_accuracy: 0.6318 - val_loss: 1.6794\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<keras.src.callbacks.history.History at 0x1ece2829250>"
|
||
]
|
||
},
|
||
"execution_count": 68,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from keras.api.callbacks import EarlyStopping\n",
|
||
"\n",
|
||
"alexnet_model.compile(\n",
|
||
" loss=\"categorical_crossentropy\",\n",
|
||
" optimizer=\"adam\",\n",
|
||
" metrics=[\"accuracy\"]\n",
|
||
")\n",
|
||
"\n",
|
||
"early_stop = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=True)\n",
|
||
"alexnet_model.fit(\n",
|
||
" x=X_train, \n",
|
||
" y=y_train,\n",
|
||
" epochs=100,\n",
|
||
" validation_data=(X_test, y_test),\n",
|
||
" callbacks=[early_stop]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "08805e4a",
|
||
"metadata": {},
|
||
"source": [
|
||
"И оценим ее качество:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 69,
|
||
"id": "c6dc544c",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m36/36\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 121ms/step - accuracy: 0.8781 - loss: 0.3756\n",
|
||
"Loss на тестовой выборке: 0.3724\n",
|
||
"Accuracy на тестовой выборке: 0.8802\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"def evaluate_model(model, X_test, y_test):\n",
|
||
" loss, accuracy = model.evaluate(X_test, y_test)\n",
|
||
" print(f\"Loss на тестовой выборке: {loss:.4f}\")\n",
|
||
" print(f\"Accuracy на тестовой выборке: {accuracy:.4f}\")\n",
|
||
"\n",
|
||
"evaluate_model(alexnet_model, X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "70dc3a13",
|
||
"metadata": {},
|
||
"source": [
|
||
"Качество модели - 88.02%, это лучше качества модели как из 9 ЛР (71%), так и из 11 (79.41%)."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "b8768dd8",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Классификация текстов"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "a5cc2114",
|
||
"metadata": {},
|
||
"source": [
|
||
"### В первую очередь необходимо предобработать данные. \n",
|
||
"\n",
|
||
"В 8 лабораторной был выбран датасет, содержащий ТЗ и статьи по ИТ. Поэтому задачей здесь будет разработка модели, которая сможет автоматически определять категорию, к которой относится текст (ТЗ или статья).\n",
|
||
"\n",
|
||
"Проинициализируем spacy, загрузим модель для русского языка."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 70,
|
||
"id": "e9d9f6cd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import spacy\n",
|
||
"\n",
|
||
"sp = spacy.load(\"ru_core_news_lg\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "5818412f",
|
||
"metadata": {},
|
||
"source": [
|
||
"Загрузим тексты из файлов с расширением .docx в датафрейм:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 71,
|
||
"id": "7395003a",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
|
||
"columns": [
|
||
{
|
||
"name": "index",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "doc",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "text",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
}
|
||
],
|
||
"conversionMethod": "pd.DataFrame",
|
||
"ref": "b684f6e3-a654-43b6-a675-531f2a538863",
|
||
"rows": [
|
||
[
|
||
"0",
|
||
"tz_01.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения\nполное наименование системы и ее условное обозначение: Конфигурация «Бухгалтерия предприятия» в среде «1С: Предприятие 8.1»; \nшифр темы: ДП – УлГТУ – 08080165 – 00/00000 – 2010;\nнаименование предприятий разработчика и заказчика системы, их реквизиты: УМКУП «Городской градостроительный сервис», .Ульяновск, пер.Комсомольский 3, 8-962-633-01-77;\nперечень документов, на основании которых создается информационная система: ; \nплановые сроки начала и окончания работ:1 апреля . – 15 июня .;\nсведения об источниках и порядке финансирования работ: работа проводится на безвозмездной основе, не финансируется;\nпорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику передается установочный диск со всеми дистрибутивами, необходимыми для функционирования разработанного программного продукта, а так же сопроводительная документация: техническое задание и методические указания пользователю и программисту.\n\nНазначение и цели создания системы\nРазработанный программный продукт предназначен для обеспечения полноты автоматизации деятельности бухгалтера организации УМКУП «Городской градостроительный сервис» при использовании конфигурации «Бухгалтерия предприятия» на платформе «1С: Предприятие 8.1» в части расчета заработной платы и учета деятельности сотрудников организации. Предполагается использование системы на автоматизированном рабочем месте главного бухгалтера организации.\nОсновными целями создания системы являются:\nдополнение существующей информационной системы, которая не предоставляет возможность расчета заработной платы организации, имеющей специфические принципы оплаты труда соответствующим функционалом, который, кроме того, затрагивает автоматизацию процессов, влияющих на процесс формирования сумм заработной платы;\nповышение эффективности исполнения автоматизируемых процессов, путем сокращения непроизводительных и дублирующих операций, операций, выполняемых «вручную», оптимизации информационного взаимодействие участников процессов; \nповышение качества принятия управленческих решений за счет оперативности представления, полноты, достоверности и удобства форматов отображения информации;\n\nХарактеристика объектов автоматизации\nОбъектом автоматизации является процесс учета расчетов с работниками по оплате труда в организации, имеющей специфические принципы формирования расчетных сумм, в части расчета этих сумм и сбора данных из документов оперативного учета для проведения расчета.\n\nТребования к системе\nТребования к системе в целом\nа) Требования к структуре и функционированию системы\nНазначение и цели создания системы должны быть реализованы в двух подсистемах конфигурации «Бухгалтерия предприятия» на платформе «1С: Предприятие8.1»:\nСистема бухгалтерского учета\nСистема оперативного учета\nПодсистема оперативного учета должна содержать механизмы, позволяющие вводить в систему и хранить в ней информацию о текущей деятельности организации. В этой подсистеме должны фиксироваться и систематизироваться данные, необходимые для реализации расчета сумм начислений. \nПодсистема бухгалтерского учета должна содержать в себе механизмы для реализации учета расчетов с сотрудниками организации. Именно эта подсистема должна реализовывать процесс расчета, используя данные, содержащиеся в подсистеме оперативного учета.\nб) Требования к персоналу\nДля наиболее эффективного функционирования системы помимо пользователя – главного бухгалтера организации, для автоматизации деятельности которого предназначена система, необходимо иметь специалиста технической поддержки данного программного продукта. \nв) Показатели назначения \nСистема должна предусматривать возможность масштабирования по производительности и объему обрабатываемой информации без модификации ее программного обеспечения путем модернизации используемого комплекса технических средств. Изменение процессов управления не должно отражаться на правильности функционирования системы.\nг) Требования к надежности, эргономике, защите и сохранности информации, защите от внешних воздействий.\nСистема должна сохранять работоспособность и обеспечивать восстановление своих функций при возникновении следующих внештатных ситуаций:\nпри сбоях в системе электроснабжения аппаратной части, приводящих к перезагрузке ОС;\nпри ошибках в работе аппаратных средств (кроме носителей данных и программ) восстановление функции системы возлагается на ОС;\nпри ошибках, связанных с программным обеспечением (ОС и драйверы устройств), восстановление работоспособности возлагается на ОС\nсистема должна обеспечивать корректную обработку аварийных ситуаций, вызванных неверными действиями пользователей, неверным форматом или недопустимыми значениями входных данных. В указанных случаях система должна выдавать пользователю соответствующие сообщения, после чего возвращаться в рабочее состояние, предшествовавшее неверной (недопустимой) команде или некорректному вводу данных. \nСистема должна быть эргономичной. Интерфейс системы должен быть понятным и удобным, не должен быть перегружен графическими элементами и должен обеспечивать быстрое отображение экранных форм. Навигационные элементы должны быть выполнены в удобной для пользователя форме. Средства редактирования информации должны удовлетворять принятым соглашениям в части использования функциональных клавиш, режимов работы, поиска, использования оконной системы. Ввод-вывод данных системы, прием управляющих команд и отображение результатов их исполнения должны выполняться в интерактивном режиме. Интерфейс должен соответствовать современным эргономическим требованиям и обеспечивать удобный доступ к основным функциям и операциям системы.\nИнтерфейс должен быть рассчитан на преимущественное использование манипулятора типа «мышь», то есть управление системой должно осуществляться с помощью набора экранных меню, кнопок, значков и т. п. элементов. Клавиатурный режим ввода должен используется главным образом при заполнении и/или редактировании текстовых и числовых полей экранных форм.\nВсе надписи экранных форм, а также сообщения, выдаваемые пользователю (кроме системных сообщений) должны быть на русском языке.\nИС должна обеспечивать защиту от несанкционированного доступа. Компоненты подсистемы защиты от несанкционированного доступа должны обеспечивать:\nидентификацию пользователя;\nпроверку полномочий пользователя при работе с системой;\nразграничение доступа пользователей на уровне задач и информационных массивов.\n\nТребования к функциям (по подсистемам)\nПодсистема оперативного учета\nПодсистема оперативного учета должна осуществлять ввод и хранение оперативных данных системы, данных для формирования аналитических отчетов, документов системы, сформированных в процессе работы.\nВсе элементы, входящие в состав подсистемы оперативного учета, должны обладать следующей основной функциональностью:\nПостоянное хранение данных;\nДобавление новых элементов;\nРедактирование элементов;\nУдаление (удаление элементов возможно лишь в том случае, если другие существующие объекты системы не ссылаются на удаляемый элемент);\nПросмотр элементов;\nПросмотр списка элементов;\nФильтрация и сортировка списка элементов;\nПоиск элементов;\nЭкспорт и импорт элементов.\nПодсистема бухгалтерского учета\nПодсистема бухгалтерского учета должна иметь средства для регистрации бухгалтерских операций и формирования на их основе соответствующей итоговой информации, а также подготовки произвольных бухгалтерских отчетов. Подсистема бухгалтерского учета должна вести учет, ориентированный на первичные документы, относящиеся к подсистеме оперативного учета, и иметь функцию расчета сумм начислений заработной платы сотрудникам на основе этих документов.\n\nТребования к видам обеспечения\nК видам обеспечения предъявляются следующие требования:\nа) математическому: не предъявляются;\nб) информационному: уровень хранения данных в системе должен быть построен на основе современных СУБД. Для обеспечения целостности данных должны использоваться встроенные механизмы СУБД. Доступ к данным должен быть предоставлен только авторизованным пользователям с учетом их служебных полномочий, а также с учетом категории запрашиваемой информации. Технические средства, обеспечивающие хранение информации, должны использовать современные технологии, позволяющие обеспечить повышенную надежность хранения данных и оперативную замену оборудования.\nв) лингвистическому: система создана на основе языка программирования «1С 8.1»;\nг) программному и техническому:\nКомпьютер конечного пользователя \nоперационная систему: MS Windows 98/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium II 400 МГц и выше (рекомендуется Intel Pentium III 866 МГц);\nоперативная память 128 Мбайт и выше (рекомендуется 256 Мбайт);\nжесткий диск (при установке используется около 120 Мбайт).\nКомпьютер, используемый для разработки конфигураций\nоперационная система: MS Windows 2000/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium III 866 МГц и выше (рекомендуется Intel Pentium IV/Celeron 1800 МГц);\nоперативная память 256 Мбайт и выше (рекомендуется 512 Мбайт);\nжесткий диск (при установке используется около 120 Мбайт).\nКомпьютер сервера 1С:Предприятия 8.1\nоперационная система: MS Windows 2000/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium III 866 МГц и выше (рекомендуется Intel Pentium IV/Xeon 2,4 ГГц, для лучшей масштабируемости рекомендуется два и более процессоров);\nоперативная память 512 Мбайт и выше (рекомендуется 1024 Мбайт).\nСервер баз данных\nMicrosoft SQL Server 2000 + Service Pack 2 (рекомендуется Service Pack 3a) или Microsoft SQL Server 2005.\nКомпьютер сервера баз данных\nоперационная система: в соответствии с требованиями Microsoft SQL Server;\nтехнические характеристики компьютера должны соответствовать требованиям используемой версии сервера баз данных MS SQL Server.\nд) метрологическому: требования не предъявляются;\nе) организационному: для эффективного функционирования системы помимо пользователя необходим специалист по технической поддержке. К работе с системой должны допускаться сотрудники, имеющие навыки работы на персональном компьютере, ознакомленные с правилами эксплуатации и прошедшие обучение работе с системой.\nж) методическому: в состав методического обеспечения системы должны входить: инструкция программисту, инструкция пользователю.\n\nСостав и содержание работ по созданию системы\nПеречень стадий и этапов работ, а так же сроки их исполнения представлены в Таблице 2.\nТаблица 2.\nЭтапы и сроки исполнения работ\nРаботы по созданию системы проводились физическим лицом – студенткой группы ИСЭд-51 УлГТУ, Башаровой И.С. Консультантом при разработке являлась Суркова Е.В., доцент кафедры «Информационные системы» УлГТУ, руководитель дипломного проекта.\n\nПорядок контроля и приемки системы\nПриемочные испытания должны включать проверку:\nполноты и качества реализации необходимых функций;\nвыполнения каждого требования, относящегося к эргономике;\nработы пользователей в диалоговом режиме;\nсредств и методов восстановления работоспособности системы после отказов;\nполноты действий, доступных пользователю, и их достаточность для функционирования системы;\nреакции системы на ошибки пользователя;\nтестирование на скорость реакции системы на команды пользователя.\n\nТребования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nДля подготовки объекта автоматизации к вводу системы в действие необходимо при помощи специалиста технической поддержки, осуществляющего обслуживание используемой в организации базовой конфигурации «Бухгалтерия предприятия», выгрузить все информацию, содержащуюся в этой конфигурации, для дальнейшего ее использования в разработанной системе. Загрузка информации в новую конфигурацию должна так же осуществляться специалистом технической поддержки.\nПеред началом использования системы пользователю необходимо ознакомится с руководством пользователя, содержащимся в сопроводительной документации разработанной системы и пройти обучение для ознакомления с принципами ее функционирования в течение 1 академического часа (при условии владения пользователя навыками работы в базовой конфигурации «Бухгалтерия предприятия» платформы «1С: Предприятие 8.1»). \n\nТребования к документированию\nРазработке подлежит следующая документация:\nИнструкция пользователю;\nИнструкция программисту.\n",
|
||
"0"
|
||
],
|
||
[
|
||
"1",
|
||
"tz_02.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения\nПолное наименование системы: «Автоматизированное рабочее место продавца-консультанта в салоне фотоуслуг» в среде «1С: Предприятие 8.1».\nШифр темы: ДП–УлГТУ– 08080165–05/0978–2010.\nНаименование предприятия заказчика системы, его реквизиты: ООО «УмКо», г.Ульяновск;\nПлановые сроки начала и окончания работ: 1 апреля 2009 года — 15 июня 2009 года;\nСведения об источниках и порядке финансирования работ: данные работы проводятся на безвозмездной основе;\nПорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы все необходимые дистрибутивы, набор инструкций и документации.\n\n2.2.2 Назначение и цели создания системы\nРазработанная система предназначена для автоматизации работы продавца-консультанта салона фотоуслуг по принятию заказов и выполнению различного рода операций над ними, ведению учета принятых, выполненных и выданных заказов.\nЦелью создания системы является повышение скорости и качества работы продавца-консультанта, упрощение выполнения им ряда операций, повышение качества обслуживания клиентов за счет актуальности и достоверности хранимой информации по заказам. \n\n2.2.3 Характеристика объектов автоматизации\nОбъектом автоматизации является торговый зал салона фотоуслуг, в котором осуществляется продажа фототоваров и реализация услуг.\n\n2.2.3.1 Требования к системе в целом \nТребования к структуре и функционированию системы\nПрограммный продукт должен представлять собой единую систему, без разделения на подсистемы. Система должна функционировать в монопольном режиме.\nТребования к персоналу\nДля работы с программой пользователи должны обладать навыками работы на ПЭВМ под управлением операционной системы семейства Windows. Кроме того, пользователи должны обладать знанием предметной области, связанной с оказанием фотоуслуг, а также иметь представление о работе продавца-консультанта, выполняемых им операциях. \nТребования к надежности\nПрограммный продукт должен отслеживать ошибки в работе программы, возникающие при некорректном вводе информации и других ошибочных действий пользователя, обеспечивать максимально возможное сохранение данных и реагировать специальными сообщениями для оповещения пользователя о его некорректных действиях.\nНеобходимо использование лицензионной копии программы «1С: Предприятие».\nТребования к эргономике и технической эстетике\nРазрабатываемая система должна обладать удобным, простым, интуитивно понятным интерфейсом. \nТребования к защите информации от несанкционированного доступа\nВ системе должна быть реализована аутентификация пользователей. Необходимо реализовать хранение данных пользователей и их паролей. Также необходима регулярная смена паролей. \n\n2.2.3.2 Требования к функциям\nПеречень подлежащих автоматизации задач\nРазрабатываемая система должна поддерживать выполнение следующих задач:\nведение учета заказов на всех стадиях их жизненного цикла: прием, выполнение, оплата, выдача;\nоформление и регистрация нового заказа;\nрегистрация полного и частичного выполнения заказа;\nрегистрация оплаты заказа;\nрегистрация выдачи заказа;\nобмен данными между центральным подразделением и филиалами;\nформирование отчетов:\nпо принятым, но невыполненным заказам;\nпо выполненным, но невыданным заказам;\nпо выданным заказам;\nпо выработке сотрудников;\nпо оплатам;\nпо сертификатам.\n\n2.2.3.3 Требования к видам обеспечения\nТребования к техническому обеспечению\nВ состав технических средств должен входить IBM-совместимый персональный компьютер (ПЭВМ), включающий в себя:\nпроцессор – не менее Pentium, 2.0 Hz ;\nОЗУ – не менее 216 Мб;\nоперационная система – Windows 2000, XP, Vista.\nТребования к программному обеспечению\nДля функционирования разрабатываемой системы необходимо наличие:\nоперационной системы MS Windows 98/Me/2000/XP;\n1С: Предприятие 8.1.\nТребования к лингвистическому обеспечению\nПри создании программного продукта необходимо использовать язык программирования «1С v8.1».\nТребования к методическому обеспечению\nНеобходимо наличие следующей нормативно-технической документации:\nинструкция программисту; \nинструкция пользователю.\n\n2.2.4 Перечень этапов работ и сроки исполнения\nЭтапы и сроки проведения работ приведены в таблице 1.\n\nТаблица 1\nЭтапы и сроки выполнения работ\n\n2.2.5 Состав исполнителей работ\nРаботы по созданию системы проводятся физическим лицом, Гайдуковой Марией Николаевной, студенткой УлГТУ.\nПри этом консультантом выступает руководитель дипломного проекта Суркова Елена Викторовна.\n\n2.2.6 Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nВ рамках подготовки объекта автоматизации к вводу системы необходимо заполнить следующие справочники для получения актуальной информации и возможности работы с системой:\nсправочник Подразделения;\nсправочник Номенклатура;\nсправочник Клиенты;\nсправочник Вид услуги;\nсправочник Скидка;\nсправочник Пользователи.\nКроме того, необходимо настроить план обмена «Основной». Для этого нужно заполнить данные текущего узла, а также тех узлов, с которыми он будет производить обмен данными. Необходимо указать узел, который будет считаться Центральным, так как обмен производится в следующих направлениях:\nвыгрузка данных производится со всех узлов, кроме Центрального;\nзагрузка данных производится только центральным узлом. \n\n2.2.7 Требования к документированию\nНеобходимо наличие следующих документов: \nинструкция пользователю;\nинструкция программисту.",
|
||
"0"
|
||
],
|
||
[
|
||
"2",
|
||
"tz_03.docx",
|
||
"2.2. Техническое задание\nОбщие сведения:\nВ данной главе представлены общие сведения о системе:\nполное наименование системы и ее условное обозначение:\nWeb-ориентированная автоматизированная система учета услуг туристической фирмы;\nшифр темы или шифр (номер) договора: данный программный продукт разрабатывался в рамках дипломного проектирования, какой-либо договор не заключался; \nнаименование предприятий разработчика и заказчика системы, их реквизиты:\nпредприятие-разработчик: ООО «Волгасофт» (ИНН/КПП 7325082859/73251001, г.Ульяновск, ул.Брестская, 78);\nпредприятие-заказчик: ООО «Goodline» (ИНН/КПП 6313535100/631301001, г.Самара, МОСКОВСКОЕ ШОССЕ,81а);\nперечень документов, на основании которых создается информационная база: спецпредложения туроператора.\nплановые сроки начала и окончания работ:\nначало работы: 1 марта 2010 года;\nокончание работы: 31 мая 2010 года;\nсведения об источниках и порядке финансирования работ: данные работы проводятся на безвозмездной основе;\nпорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы установочный диск со всеми необходимыми дистрибутивами, набор инструкций и документации для полноценного функционирования указанной системы.\n\nНазначение и цели создания системы\nвид автоматизируемой деятельности.\nРазработанная система предназначена для автоматизации бронирования туров, учета клиентов, ведения базы данных туров.\nперечень объектов, на которых предполагается использование системы. \nДанную систему предполагается использовать в ООО «Goodline».\nнаименование и требуемые значения технических, технологических, производственно-экономических и др. показателей объекта, которые должны быть достигнуты при внедрении ИС.\n При внедрении ИС должны быть достигнуты следующие цели: \nс технологической точки зрения: должен быть упрощен процесс взаимодействия турагента с клиентами, улучшено качество работы с клиентом;\nс производственно-экономической точки зрения: должно быть сокращено время на организацию работы с клиентами и формирование соответствующей отчетности.\n\nХарактеристика объектов автоматизации\nОбъектом автоматизации является ООО «Goodline». Это предприятие специализируется в области предоставления туристических услуг. В фирме существуют разные типы туров: горнолыжные, отдых на море, лечебные и др. Осуществляются поездки по различным направлениям.\nВ своей работе ООО «Goodline» использует только зарекомендовавшие себя в российских условиях туроператоры, таких как Coral Travel, Pegas Touristic, Ingtour. Профессиональные и доброжелательные сотрудники, оказывают внимание каждому клиенту. Фирма предлагает идеальное соотношение цены и качества. В программы включено максимальное количество оригинальных экскурсий. Большой выбор отелей и апартаментов любой категории по конкурентоспособным ценам. Турфирма предлагает гибкую систему скидок клиентам. Оплата услуг осуществляется в любой удобной для клиента форме – наличный и безналичный расчет\nПолитика организации нацелена на обслуживание клиентов по популярным направлениям а также принятие заказов на индивидуальные туры.\n\nТребования к системе\nТребования к системе в целом\nТребования к структуре и функционированию системы\nРазработанная система должна состоять из следующих подсистем:\nпланирование работы с клиентами;\nанализ сбытовой деятельности.\nПервая подсистема должна предоставить турагенту возможность спланировать своевременное взаимодействие с клиентом с тем, чтобы ни один клиент не оказался «забытым».\nВторая подсистема должна подсчитывать и наглядно представлять экономический результат деятельности, сбыт товаров и услуг.\nТребования к персоналу\nЧисло человек, работающих с системой, неограниченно. Оно определяется количеством турагентов в организации. Кроме того, необходим системный администратор.\nСистемный администратор должен обладать знаниями по настройке веб-сервера, а также выполнять соответствующую настройку и поддержку.\nТурагент должен иметь соответственно квалификацию турагента и быть уверенным пользователем интернет и обладать навыками работы с браузерами.\nСтепень приспособляемости системы\nДанная система должна быть гибкой в отношении изменения отчетов, должна обеспечивать настройку их параметров.\nТребования к надежности, безопасности, эргономике, транспортабельности, эксплуатации, техническому обслуживанию и ремонту, защите и сохранности информации, защите от внешних воздействий, к патентной чистоте, по стандартизации и унификации.\nСистема должна быть надежной, т.е. отказоустойчивой к ошибкам пользователя (нарушения правильной последовательности действий).\nОна должна быть удобна для работы пользователя. \n\tДолжна быть предусмотрена возможность обслуживания системы, в том числе и сторонними разработчиками.\n\tДолжна присутствовать авторизация и аутентификация пользователя, возможность тонкой настройки доступа к объектам и функциям системы. \nПрограммный продукт должен быть патентно чист и иметь возможность законно использоваться в коммерческих целях. Разрабатываемый программный продукт является патентно-чистым. Для функционирования системы необходима покупка либо аренда веб-сервера.\n\n2.2.4.2 Требования к функциям (по подсистемам)\nПеречень подлежащих автоматизации задач:\nбронирование тура;\nголосование;\nобратная связь;\nхранение базы клиентов;\nхранение и обновление базы туров;\nудобный интерфейс;\nдружественный дизайн;\nтуристический форум;\nпередача ссылки;\nновости.\nВременной регламент реализации каждой функции.\nРеализация всех функций должна быть выполнена согласно с этапами и сроками выполнения работ.\nТребования к качеству реализации каждой функции, к форме представления выходной информации, характеристики точности, достоверности выдачи результатов.\nПеречень и критерии отказов.\n\n2.2.4.3 Требования к видам обеспечения\nСистема предъявляет следующие требования к видам обеспечения:\nа) математическому: пользователь должен быть знаком с методикой проведения горизонтального (временного) анализа, вертикального (структурного) анализа;\nб) информационному: Denwer 3 (Apache, PHP, MySQL) – набор дистрибутивов (Apache, PHP, MySQL, Perl и т.д.) и программная оболочка, используемые Web-разработчиками для разработки сайтов на «домашней» (локальной) Windows-машине без необходимости выхода в Интернет. Главная особенность Денвера — удобство при удаленной работе сразу над несколькими независимыми проектами и возможность размещения на Flash-накопителе.;\nв) лингвистическому: используется язык программирования «PHP» и Java-script;\nг) программному и техническому: \n 1) компьютер конечного пользователя (рекомендуемые параметры): \nоперационная система: MS Windows 2000/ XP / Server 2003; \nпроцессор Intel Pentium III 866 МГц; \nоперативная память 256 Мбайт; \n2) компьютер, используемый для разработки конфигураций: \nоперационная система: MS Windows 2000/ XP / Server 2003; \nIntel Pentium IV/Celeron 1800 МГц ; \nоперативная память 512 Мбайт; \n3) сервер ПП: \nоперационная система: MS Windows 2000/Server 2003, ОС семейства UNIX; \nпроцессор Intel Pentium IV/Xeon 2,4 ГГц, рекомендуется два и более процессоров; \nоперативная память 1024 Мбайт; \n4) сервер баз данных: \nтехнические характеристики компьютера и операционная система должны соответствовать требованиям Microsoft SQL Server 2005, MYSQL Server; \nд) организационному: для функционирования системы необходимы системный администратор и несколько менеджеров;\nе) методическому (состав нормативно-технической документации):\nинструкция программисту; \nинструкция пользователю.\n\nСостав и содержание работ по созданию системы\nПеречень этапов работ и сроки исполнения\nПеречень этапов работ и сроки исполнения представлены в таблице 2.1\nТаблица 2.1 \nОсновные этапы работ и сроки их исполнения\n\nСостав исполнителей работ\nРаботы по созданию системы проводились физическим лицом – Гимадиевой Ч.Р., студенткой УлГТУ, под руководством преподавателя кафедры «Информационные системы» Наместникова Алексея Михайловича.\n\n2.2.6 Требования к программной документации\nТехническое задание\nЭкономическая часть\nИнструкция пользователя ГОСТ 19.505-79 \"РУКОВОДСТВО ОПЕРАТОРА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\"\nИнструкция программиста ГОСТ 19.503-79 \"РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\" и ГОСТ 19.504-79 \"РУКОВОДСТВО ПРОГРАММИСТА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\"\nПояснительная записка",
|
||
"0"
|
||
],
|
||
[
|
||
"3",
|
||
"tz_04.docx",
|
||
"Техническое задание\n2.2.1 Общие сведения\nИнтернет-магазин ООО «Практика» разработан для осуществления торгоаой деятельности через Интернет. Данный продукт разработала Громакова Елена для ООО «Практика». Плановый срок начала работ — февраль 2010 года, окончание работ — июнь 2010 года. Данный программный родукт выполняется безвозмездно. \n\n2.2.2 Назначение и цели создания системы\nИнтернет-магазин ООО «Практика» разрабатывается для \nосуществления оптовой и розничной реализации товаров через Интернет. \nОсновными элементами прикладного решения являются:\nОформление заказа;\nОповещение покупателя об успешном совершении заказа;\nОповещение продавца о новом заказе.\nДанный интернет-магазин разрабатывается для удобства поупателей, чтобы они могли наглядно ознакомиться с предлагаемой продукцией. А также для удобства менеджеров которые будут обрабатывать эти заказы, т.к. намного проще обработать готовый заказ, чем вначале записать на листок, затем перенести эти данные в базу, после чего согласовать счет. В интернет-магазине покупатель самостоятельно будет формировать свой заказ, где будет видеть цены и итоговую сумму.\n\n2.2.3 Характеристика объектов автоматизации\nИнтернет-магазин – это магазин, «витрина» которого расположена в интернете и который дает возможность заказывать товар через интернет. \nНа сайте магазина представлен подробный каталог товаров с ценами, на основе которого пользователь формирует свой заказ. Заказывая товары в интернет-магазине, покупатель может получать их с курьером, а расплачиваться наличным или безналичным расчетом.\nПреимущества которые дает интернет-магазин:\nИнтернет-магазин работает 24 часа в сутки, 365 дней в году, без перерыва на обед, без выходных и праздничных дней.\nДоступ к виртуальной витрине магазина может получить любой покупатель.\nИнтернет-магазин не имеет ограничений на виртуальную площадь. Можно разместить сколь угодно товаров.\nСрок и стоимость создания интернет-магазина несоизмеримо ниже, чем обычного магазина.\nДля создания интернет-магазина не требуется получения многочисленных разрешений и лицензий. Его не проверяет пожарный инспектор, санэпидемстанция и другие службы.\nИнтернет-магазины — это наше недалекое будущее. В городах миллионниках они пользуются большим спросом. Кажется что их уже достаточно много, но перенасыщенности в этой сфере пока нет. Содержать интернет-магазин намного выгоднее чем его аналог. За него не нужно платить арендную плату или зарплату продавцам. Он прост и удобен в применении. Экспуатировать его так же легко. Все что для этого нужно — это подключение к сети Интернет.\n\n2.2.4 Требования к системе\nТребования к системе в целом:\n- удобный интерфейс, рассчитанный на неопытного пользователя;\n- возможность быстрого поиска как по наименованию товара, так и по его характеристикам;\n- возможность ввода и хранения данных неограниченного числа зарегистрированных пользователей;\n- защита от ошибок пользователей (не заполнение всех необходимы полей при регистрации пользователя или при оформлении заказа);\n- воозможность необходимых настроек системы.\nТребования к составу функций:\nВсе пользователи, работающие с программой могут иметь разные права. В пользовательском режиме это может быть, например, группа «оптовики» (их преимущество в том, что когда они зайдут на сайт под своим пролем - получат 5% скидку на весь товар). В режиме администратора также может быть несколько пользователей. Наделяет пользователей правами главный администратор. \nГлавный администратор может:\n1. Добавлять и удалять любую информацию на сайте (новости, товар, описание продукции, баннеры и т.д.);\n2. Изменять внешний вид сайта;\n3. Наделять правами пользователей.\nТребования к инструментальным средствам\nДля разработки программного продукта использовать систему управления сайтом (CMS) Joomla 1.5 и расширение Virtuemart 1.1. Если разработка осуществляется на локальном компьютере, то необходимо использовать Денвер. Денвер — набор дистрибутивов и программная оболочка, предназначенный для создания и отладки сайтов на локальной Windows-машине, без подключения к сети Интернет. \nТребования к системному ПО и техническому обеспечению\nПрограммный продукт ориентирован на работу под управлением операционной системы Windows: 98, 2000, XP, Vista, 7, CPU 1 Ghz, 256 Мб оперативной памяти, подключение к интернет.\nТребования к интерфейсу\nПрограммный продукт должен быть ориентирован на неподготовленного пользователя ЭВМ, имеющего начальные навыки работы с ОС Windows и Internet. Общение с компьютером должно осуществляться на основе графического оконного интерфейса в виде меню, списков, кнопок, полей ввода данных. \nПеречень этапов работ и сроки исполнения \nПеречень этапов работ и сроки исполнения представлены в таблице 2.1\n Таблица 2.1 Перечень этапов работ и сроки исполнения.",
|
||
"0"
|
||
],
|
||
[
|
||
"4",
|
||
"tz_05.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения.\n1) полное наименование системы и ее условное обозначение: АРМ сотрудника организационно-методического кабинета МУЗ «Сенгилеевская ЦРБ»;\n2) шифр темы или шифр (номер договора): данный программный продукт разрабатывался вне рамок какого-либо договора;\n3) наименование предприятий разработчика и заказчика системы, их реквизиты: МУЗ «Сенгилеевская ЦРБ», . Сенгилей, ул. Н. Выборная, 8.;\n4) перечень документов, на основании которых создается информационная система:\n1.Приказ Минздрава РФ от 30 декабря . N 413 «Об утверждении учетной и отчетной медицинской документации»\n2. Распоряжение Минздрава Ульяновской области РФ от 15 декабря . №512 «О проведении временной оперативной отчетности о деятельности учреждений здравоохранения»\n5) плановые сроки начала и окончания работ: 29 марта 2010 года – 7 мая 2010 года;\n6) сведения об источниках и порядке финансирования работ: данные работы проводятся на некоммерческой основе;\n7) порядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы установочный диск со всеми необходимыми дистрибутивами, набор инструкций и документации для полноценного функционирования системы.\n \n2.2.2 Назначение и цели создания системы\nРазработанная система призвана автоматизировать процессы организационно-методического кабинета. Данная система предназначена для использования в ОМК МУЗ «Сенгилеевская ЦРБ», а также в организационно-методических кабинетах других лечебно-профилактических учреждений. После доработок продукта предполагается возможность его внедрения и использования.\nПри внедрении данной системы должны быть следующие показатели:\nтехнические: показателей нет;\nтехнологические: уменьшение числа этапов выполнения расчетов численных показателей при подготовке отчетной информации;\nпроизводственно-экономические: сокращение времени на расчеты при подготовке отчетной информации, повышение производительности работы организационно-методического кабинета.\n\n2.2.3 Характеристика объектов автоматизации\n\tОбъектом автоматизации является Организационно-методический кабинет МУЗ «Сенгилеевская центральная районная больница».\n\tОсновные: учет первичной медицинской документации (талон амбулаторного пациента, карта выбывшего из стационара)\n\tВспомогательные: вывод отчетов на экран.\n\n2.2.4 Требования к системе в целом\n2.1.4.1 Требования к структуре и функционированию системы\n\tСистема должна обеспечивать выполнение перечисленных ниже функций:\n\t\t- добавление новой учетной медицинской документации;\n- редактирование и удаление существующей учетной медицинской документации;\n- формирование отчетной медицинской документации\n\n2.2.4.2 Требования к персоналу\n\tДля функционирования системы необходим сотрудник организационно-методического кабинета. Он должен обладать знаниями в области статистического учета медицинской информации, а так же навыками заполнения учетной медицинской документации и работы с программой на базе платформы 1С:Предприятие 8.1.\n\n2.2.4.3 Степень приспособляемости системы\n\tСистема должна легко дорабатываться для добавления новых или изменения имеющихся функций.\n\n2.2.4.4 Требования к надежности\n\tНадежность и отказоустойчивость системы к ошибкам пользователей и ошибкам загружаемых данных обеспечивают внутренние средства 1С.\n\tИнтерфейс системы должен быть эргономичным с точки зрения пользователя. Интерфейсы программных продуктов на базе «1С:Предприятие 8.1» ориентированы на удобную работу и простоту освоения.\n\tСистема должна обладать патентной чистотой. Это предполагает использование программы на лицензионных копиях программ «1С:Предприятие».\n\tДолжен быть предусмотрен режим раздельной работы с конфигурацией нескольких пользователей. Для этого необходимо, чтобы при входе в конфигурацию присутствовала авторизация и аутентификация пользователей, а значит, каждый пользователь должен иметь свой прописанный в конфигурации набор прав.\n\n2.2.5 Требования к функциям\n2.2.5.1 Перечень подлежащих автоматизации задач\n\tДля системы должны быть реализованы следующие возможности:\nФормирование документов (Талон амбулаторного пациента, Карта выбывшего из стационара), а также по скорой помощи и выполненным объемам учреждений;\nВведение амбулаторной карты пациента;\nРегистрация заболеваний;\nУчет врачебного посещения;\nУчет движения больных;\nФормирование отчетной медицинской документации.\n\n2.2.5.2 Перечень критериев и отказов\n\tФатальные ошибки. Сбои в системе, которые приводят к потере ее работоспособности или порче данных.\n\tСерьезные ошибки. Ошибки, которые не позволяют достичь желаемого результата при использовании некоторого средства или функции программного продукта, включая невозможность исполнения содержащейся в меню или диалоговом окне команды, выполнения процесса или формирования текста.\n\tМаленькие ошибки. Ошибки, которые вызывают неудобство работы с системой, например, ошибки в задании порядка перехода от одного элемента управления к другому в форме ввода информации. К данному типу ошибок можно отнести также беспричинные сообщения об ошибках.\n\tНезначительные ошибки. К данному типу ошибок относятся орфографические ошибки в надписях или не выровненные элементы управления.\n\n2.2.6 Требования к видам обеспечения\n\tСистема предъявляет следующие требования к видам обеспечения:\n\tа) математическому: к пользователю конфигурации не предъявляется особых требований в области математического анализа;\n\tб) информационному: конфигурация доступна для использования только при установленной платформе 1С:Предприятие 8.1, которая в свою очередь рекомендуется к использованию совместно с операционной системой Windows 98/2000/XP/Vista/7.\n\tв) лингвистическому: для написания системы конфигурации использовался встроенный язык системы 1С:Предприятие 8.1. Изменением конфигурации рекомендуется заниматься только специалистам, владеющим этим языком.\n\tг) программному и техническому: для работы с «1С:Предприятием 8.1» рекомендуемая конфигурация компьютера, приведенная «Руководстве по установке и запуску» имеет следующие характеристики:\n\t1) компьютер конечного пользователя:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium III 866 МГц;\n\t\tc) оперативная память 256 Мбайт;\n\t2) компьютер, используемый для разработки конфигураций:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium IV/Celeron 1800 МГц;\n\t\tc) оперативная память 512 Мбайт;\n\t3) сервер «1С:Предприятие 8.0»:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium IV/Xeon 2,4 ГГц;\n\t\tc) оперативная память 1024 Мбайт;\n\tИз программных средств необходимы: платформа «1С:Предприятие 8.1».\n\tд) метрологическому: нет требований к данному виду обеспечения.\n\tе) организационному: при работе с конфигурацией сразу нескольких пользователей существует требование каждому пользователю входить в информационную базу только со своими правами.\n\tж) методическому (состав нормативно-технической документации):\n\t\ta) инструкция программисту;\n\t\tb) инструкция пользователю;\n\t\tc) презентация программного продукта.\n\n2.2.7 Перечень этапов работ и сроки исполнения\n\n2.2.8 Состав исполнителей работ\nРаботы по созданию системы проводились физическим лицом, Давыдовым Денисом Васильевичем студентом УлГТУ. При этом консультантами выступали:\n\tа) Меркулова Тамара Алексеевна – УлГТУ, доцент кафедры «Информационные системы», руководитель дипломного проекта.\n\tб) Давыдова Ольга Николаевна – заведующий организационно-методическим кабинетом МУЗ «Сенгилеевская ЦРБ».\n\n2.2.9 Порядок контроля системы\nДля контроля необходимо провести следующие виды тестирования:\n\tФункциональное тестирование. Оно включает проверку каждой команды меню, панели инструментов и каждой операции, которую выполняет система.\n\tТестирование приложения. При выполнении тестирования приложения испытатель моделирует действия пользователя. Воспроизводя различные комбинации действий, можно найти ошибки, относящиеся к интеграции компонентов, а также недоработки, которые не были обнаружены при функциональном тестировании.\n\tТестирование на скорость выполнения. Измеряется время отклика системы на некоторое действие, документа. Обычно при этом определяются параметры эффективности. Одновременно с измерением времени на выполнение запроса записать также размер базы данных.\n\tВсе этапы тестирования программы проводились непосредственным разработчиком Давыдовым Денисом Васильевичем.\n\n2.2.10 Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nДля ввода системы в эксплуатацию необходимо провести обучение персонала с программой с использованием всех ее возможностей: сотрудника организационно-методического кабинета – 2 академических часа.\n\tНеобходимо заполнить во внедряемой системе справочники.\n\n2.2.11 Перечень подлежащих разработке документов\n\t- инструкция пользователю;\n\t- инструкция администратору;\n\t- презентация программного продукта.",
|
||
"0"
|
||
]
|
||
],
|
||
"shape": {
|
||
"columns": 3,
|
||
"rows": 5
|
||
}
|
||
},
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>doc</th>\n",
|
||
" <th>text</th>\n",
|
||
" <th>type</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>tz_01.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения\\...</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>tz_02.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения\\...</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>tz_03.docx</td>\n",
|
||
" <td>2.2. Техническое задание\\nОбщие сведения:\\nВ д...</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>tz_04.docx</td>\n",
|
||
" <td>Техническое задание\\n2.2.1 Общие сведения\\nИнт...</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>tz_05.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения....</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" doc text type\n",
|
||
"0 tz_01.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0\n",
|
||
"1 tz_02.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0\n",
|
||
"2 tz_03.docx 2.2. Техническое задание\\nОбщие сведения:\\nВ д... 0\n",
|
||
"3 tz_04.docx Техническое задание\\n2.2.1 Общие сведения\\nИнт... 0\n",
|
||
"4 tz_05.docx 2.2 Техническое задание\\n2.2.1 Общие сведения.... 0"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
|
||
"columns": [
|
||
{
|
||
"name": "index",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "doc",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "text",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
}
|
||
],
|
||
"conversionMethod": "pd.DataFrame",
|
||
"ref": "6ba42166-16ff-4b5e-b4fb-af49346627e4",
|
||
"rows": [
|
||
[
|
||
"36",
|
||
"Этапы разработки проекта2.docx",
|
||
"Этапы разработки проекта: заключительные стадии проектирования, схема базы данных\nЗаключительные стадии проектирования \nПроектирование процесса тестирования \nПроектирование процесса тестирования, как правило, следует за процессом функционального проектирования и проектирования схемы базы данных. На этом этапе можно использовать сложные схемы тестирования, а можно ограничиться и простыми. Здесь мы приведем некоторые принципы, которых нужно придерживаться при проектировании любой информационной системы.\nКогда генерация модуля завершена, выполняют автономный тест, который преследует две основные цели:\nобнаружение отказов модуля (жестких сбоев); \nсоответствие модуля спецификации (наличие всех необходимых функций, отсутствие лишних функций). \nПосле того как автономный тест прошел успешно, группа сгенерированных модулей проходит тесты связей, которые должны отследить взаимное влияние модулей.\nДалее группа модулей тестируется на надежность работы, то есть проходят, во-первых, тесты имитации отказов системы, а во-вторых, тесты наработки на отказ. Первая группа тестов показывает, насколько хорошо система восстанавливается после сбоев программного обеспечения, отказов аппаратного обеспечения. Вторая группа тестов определяет степень устойчивости системы при штатной работе и позволяет оценить время безотказной работы системы. В комплект тестов устойчивости должны входить тесты, имитирующие пиковую нагрузку на систему.\nЗатем весь комплект модулей проходит системный тест - тест внутренней приемки продукта, показывающий уровень его качества. Сюда входят тесты функциональности и тесты надежности системы.\nПоследний тест информационной системы - приемо-сдаточные испытания. Такой тест предусматривает показ информационной системы заказчику и должен содержать группу тестов, моделирующих реальные бизнес-процессы, чтобы показать соответствие реализации требованиям заказчика.\n\nТребования к безопасности, доступу, обслуживанию системы \nКаждая информационная система содержит определенные требования к защите от несанкционированного доступа, к регистрации событий системы, аудиту, резервному копированию, восстановлению информации, которые в начале проектирования должны быть формализованы аналитиками. Проектировщики строят стратегию безопасности системы. В частности, ими должны быть определены категории пользователей системы, которые имеют доступ к тем или иным данным посредством соответствующих компонентов. Кроме того, определяются объекты и субъекты защиты. Следует отметить, что стратегия безопасности не ограничивается только ПО - это должен быть целый комплекс мер и правил ведения бизнеса. Нужно четко определить, какой уровень защиты данных необходим для каждого из компонентов информационной системы, и выделить критичные данные, доступ к которым строго ограничен. Пользователи информационной системы регистрируются, поэтому проектируются модули, отвечающие за идентификацию и аутентификацию пользователя. В большинстве СУБД реализована дискреционная защита данных, то есть регламентирован доступ к объектам данных (например, к таблицам, представлениям). Если же требуется ограничение доступа собственно к данным (к отдельным записям в таблице, к отдельным полям записи в таблице и т.п.), то следует реализовать мандатную защиту. Проектировщики должны иметь четкое представление о том, какой уровень защиты той или иной единицы информации является необходимым, а какой достаточным.\nВопросы восстановления, хранения резервных копий базы данных, архивов базы данных относятся к мероприятиям поддержки бесперебойного функционирования информационной системы. Необходимо внимательно изучить возможности, предоставляемые СУБД, а затем проанализировать, как следует использовать возможности СУБД для обеспечения требуемого уровня бесперебойной работы системы.\n\nСоставление спецификаций \nРезультаты проектирования отражаются в документе - функциональной спецификации. Этот документ пишется для заказчика, чтобы получить его санкцию на завершение проектирования и начало разработки, и обычно не содержит большого количества технических деталей. Второй документ - техническая спецификация, являющаяся основным документом для разработчиков моделей и групп тестирования, и здесь описаны детали проекта. Если использовались CASE-средства, то техническая спецификация обязательно содержит ряд отчетов из репозитария.\n\nПолнота проектирования \nПеред началом разработки модулей нужно еще раз проверить полноту проектирования. Один из полезных инструментов - матрица использования таблиц схемы базы данных по модулям.\n\nПереход к реализации \nИтак, начата реализация модулей. Означает ли это, что работа проектировщиков на этом завершена полностью? На практике это далеко не так. Довольно часто разработчик сталкивается с медленно работающими или не реализуемыми в данной схеме запросами. Подобные ситуации инициируют изменение модели данных, а значит, и информационной модели. Однако изменение информационной модели производится не только по этой причине. Хорошему проектировщику необходим практический опыт работы с аппаратным и программным обеспечением - вот одна из причин участия проектировщиков в составе групп разработчиков. Нередко ведущие сотрудники групп разработчиков одновременно являются проектировщиками.\nКак можно использовать проектировщиков на этапе разработки? Приведем некоторые примеры:\nПроектировщик, написавший спецификацию модуля, проводит семинар с разработчиками и демонстрирует необходимые прототипы (семинар предполагает диалог двух сторон). \nКогда модуль передан разработчику, проектировщик может участвовать в его пересмотре, а также выполнять контрольные функции по реализации проектных решений. \nДля крупных проектов характерно поэтапное выполнение работ, так что вполне вероятно, что после завершения реализации группы модулей и сдачи очередного этапа процесс проектирования будет продолжен для новой группы модулей. \nПроектировщики должны обеспечить быстрое реагирование на возможные изменения требований заказчика, поскольку своевременная обработка такой информации является их обязанностью. Кроме того, необходимо и участие системных аналитиков, так как именно они общаются с заказчиком проекта.\n\nСхема базы данных\nСхема базы данных содержит описание всех объектов базы данных: пользователей, их привилегий, таблиц, представлений, индексов, кластеров, ограничений, пакетов, хранимых процедур, триггеров и т.п. При этом создаются не только определения этих объектов, но и сами объекты, с которыми потом работают разработчики.\n\nER-модель и ее отображение на схему данных \nРезультат этапа анализа - построение информационной модели. Казалось бы, дело это простое: сущности становятся таблицами, а атрибуты сущностей - столбцами таблиц; ключи становятся первичными ключами, для возможных ключей определяется ограничение unique, внешние ключи становятся декларациями ссылочной целостности. Аналитики, как правило, не вникают в особенности реализации той или иной СУБД, поэтому при проектировании схемы базы данных проектировщик сталкивается с конструкциями в информационной модели, которые не реализуемы или трудно реализуемы в выбранной СУБД.\nПриведем несколько примеров ограничений реализации СУБД:\nВ информационной модели описаны три сущности - A, B, C. Сущности B и C содержат внешние ключи, ссылающиеся на сущность A. В СУБД поддерживается возможность определения внешнего ключа только для первичного ключа, а для возможного ключа определить декларативную ссылочную целостность нельзя. В этом случае отображение ER-модели на физическую модель данных невозможно без изменения информационной модели. \nВ информационной модели описан внешний ключ с каскадным удалением и модификацией. В СУБД поддерживаются внешние ключи только для варианта действия no action (то есть каскадные изменения в явном виде не поддерживаются). Реализация ссылочной целостности посредством триггеров ограничена уровнем каскадирования триггеров (например, 32 вызовами триггера). В этом случае потребуется также изменение информационной модели. \nВ информационной модели определен атрибут, представляющий собой строку длиной в 500 символов. По этому атрибуту часто осуществляется поиск в информационной системе; объем данных велик. В СУБД можно индексировать строки символов не длиннее чем 128 или 256 символов. Если осуществлять поиск без индекса, то время ответа информационной системы существенно превышает допустимое, вследствие чего придется изменить описание сущности. \nВ информационной модели описана сущность A, которая содержит по крайней мере два атрибута BLOB (например, требуется отдельно хранить и звук и изображение). В СУБД невозможно создать таблицу с двумя атрибутами BLOB и в этом случае нужно изменить описание сущности. Из отношения A исключаются два атрибута BLOB, и добавляется один атрибут AK типа integer. Добавляются две дополнительные сущности - и . Каждая из них будет содержать один атрибут BLOB и один ключевой атрибут K типа integer, который станет внешним ключом у каждого из новых отношений и будет ссылаться на атрибут AK в отношении A (тип внешнего ключа - on delete cascade, on update cascade). \nЖизненный цикл сущности определен в информационной модели соответствующей диаграммой. В описании сущности отсутствует атрибут, который отражает изменение состояния сущности. В этой ситуации проектировщики добавляют атрибут status, для которого определяется ограничение допустимых значений (из списка допустимых состояний), а изменение состояния сущности описывается триггером, проверяющим допустимость сочетания нового и старого значения атрибута. \nДве диаграммы потока данных описывают различные бизнес-процессы, работающие над одними и теми же данными. Допустим, первая диаграмма описывает выписку товара со склада, а вторая - сложный отчет, отражающий состояние склада. Один процесс интенсивно модифицирует данные, второй работает в режиме чтения данных, но требует согласованности данных в течение длительного времени. Каждый из процессов описывается транзакцией над данными. В СУБД уровни изолированности транзакций реализованы так, что читающие транзакции конфликтуют с модифицирующими транзакциями. Это приводит к остановке выписки товаров со склада на время выполнения отчета, что неприемлемо для заказчика. Здесь может потребоваться очень серьезное изменение информационной модели. \nПодобных примеров, когда не только ER-модель, но и другие продукты анализа не могут быть перенесены автоматически на модель данных, можно привести множество. Каждый такой случай инициирует изменение информационной модели. Решение проблемы определяется возможностями СУБД, выбранной для реализации проекта. Если проблем, не разрешаемых в рамках данной СУБД, накапливается очень много, то проектировщики могут поставить вопрос о смене СУБД. Такой вопрос поднимается именно на стадии проектирования, поскольку если уже разработчики столкнутся с подобными проблемами, то цена смены СУБД будет выше. Ясно, что одинаковых СУБД не бывает: то, что хорошо работает в одной, может плохо работать или вообще не работать в другой, несмотря на уверения производителей СУБД в поддержке стандартов SQL. Что касается хранимых процедур и триггеров, то здесь вообще трудно говорить о поддержке SQL92/PSM.\nВопросы производительности информационной системы также влияют на отображение ER-модели на модель данных. За счет мощного сервера баз данных можно добиться большей скорости реакции системы, но мощность аппаратного комплекса ограниченна. Производительность системы в целом зависит в том числе и от нормализации. Часто до 80% запросов к базе данных являются выборками данных, а соединение по тому или иному атрибуту относится к затратным операциям, в первую очередь соединение по нечисловым атрибутам. Увеличить производительность системы можно посредством введения избыточной информации - денормализации. Следует отметить, что решение об этом не принимается на основе одной ER-модели - требуется внимательно проанализировать потоки данных. Критичные процессы являются хорошими кандидатами для денормализации: по времени выполнения, по частоте выполнения, по большому объему обрабатываемых данных, по частоте изменения обрабатываемой информации, по явному приоритету. Часто к денормализации прибегают в целях ускорения выполнения отчетов. Для проверки эффективности той или иной денормализации привлекаются тестеры.\n\nТипы данных \nКак правило, СУБД поддерживают небольшой набор базовых типов данных: числовые типы (целые, вещественные с плавающей и фиксированной точкой), строки (символов и байт), дата и время (или комбинированный тип datetime), BLOB (и его разновидности, например BLOB-поля для хранения только текста). В информационной модели каждому атрибуту соответствует домен. Поскольку не все реализации СУБД поддерживают домены, то в этом случае при определении модели данных ограничения домена описывают как ограничения столбца таблицы (если такое возможно); в частности используют check constraints, триггеры. Следует отметить, что при определении типов столбцов таблиц нужно учитывать, какие типы данных поддерживаются в словаре данных СУБД. Например, в Oracle ключевые слова integer, smallint, real поддерживаются транслятором SQL, но в словаре данных им соответствуют number(38), number(38), float(63), так как Oracle хранит данные в двоично-десятичном формате с плавающей точкой, а не в двоичном формате с плавающей точкой, и 38-восьмизначное число никак нельзя назвать словом smallint.\nСУБД поддерживают два вида строковых типов: с фиксированной длиной (например, char), когда хранится ровно столько символов, сколько указано в описании атрибута, и с переменной длиной (например, varchar), когда хранится реальная длина значения атрибута, а концевые пробелы строки усекаются. Семантика сравнения строк в СУБД также различная, и если ваше мнение о сравнении строк расходится с тем, как это реализовано в СУБД, то придется смириться с этим как с особенностью СУБД. Например (описано поведение Oracle 7.x), если сравниваются значения A равное ‘ab’ и B равное ‘ab’ двух атрибутов типа varchar разной длины, то sql сообщит, что . Чтобы избежать подобных «фокусов», нужно, в частности, следить за тем, чтобы приложение не вставляло незначащие концевые пробелы в значения атрибутов этих типов.\n\nИндексы, кластеры \nВ правильно спроектированной базе данных каждая таблица содержит первичный ключ, что означает наличие индекса. В большинстве СУБД используются индексы . Отметим, что если используется составной индекс, то поиск по всем атрибутам, входящим в индекс, начиная со второго, будет медленным. Допустим, определен индекс index1(id1, id2), в этом случае поиск значений, удовлетворяющих условию id2=1, будет медленным (не исключено, что оптимизатор вообще не будет использовать этот индекс для обработки данного условия и будет принято решение о полном сканировании данных), а поиск значений, удовлетворяющих условию id1=1 and id2=1, будет быстрым. Данные особенности следует учитывать при определении индексов в схеме базы данных, а именно:\nиндексировать нужно атрибуты, по которым наиболее часто осуществляется поиск или соединение. Наличие индекса замедляет операции модификации, но ускоряет поиск; \nналичие индекса обязательно, если для атрибута или набора атрибутов указано ограничение unique. Такие индексы СУБД создает автоматически, если в описании таблицы указаны ограничения unique; \nиндекс может быть использован для выборки данных в заданном порядке. В этом случае не вызывается процесс сортировки ответа, а используется уже готовый индекс; \nатрибуты, входящие во внешний ключ, также следует индексировать, если СУБД не делает эту операцию автоматически при декларации внешнего ключа; \nв некоторых СУБД поддерживаются bitmap-индексы, которые очень эффективны при поиске на равенство, но для поиска на этот тип индексов не годится; \nв некоторых СУБД поддерживаются хеш-индексы, например для кластеров. Такие индексы эффективно используются при поиске на равенство. \nКластеризация - это попытка разместить рядом в одном физическом блоке данных те строки, доступ к которым осуществляется при помощи одинаковых значений ключа. Индексные кластеры, например, удобно использовать для хранения родительской и дочерних строк таблиц, связанных ссылочной целостностью. Кластеры удобно определять для тех наборов атрибутов, соединение по которым проводится наиболее часто, поскольку это увеличивает скорость поиска. Следует отметить, что в реализациях СУБД существуют жесткие ограничения на количество кластеров для таблицы, как правило, это один кластер. Особенности реализации кластеров в СУБД необходимо учитывать при проектировании критичных по времени выполнения модулей. Нужно обратить внимание, насколько сильно влияет наличие кластера на производительность DML-операций. Чаще всего это оказывает отрицательное влияние, которое в некоторых реализациях распространяется на DML-операции над любой таблицей базы данных, а не только над той, для которой определен кластер. Эти особенности СУБД также следует учитывать при проектировании.\nДля того чтобы выбрать тот или иной тип индекса, требуется внимательно изучить руководство администратора СУБД. Оптимизатор SQL использует различные типы доступа к данным при обработке запросов, и индексирование существенно влияет на выбор оптимизатора.\nПриведем некоторые способы доступа к данным на примере выборки select id, name from xtable where id=10:\nТаблица не индексирована. В этом случае применяется полное сканирование, которое не является эффективным, если объем данных большой, в таблице много данных, не удовлетворяющих условию, размер кортежа существенно превосходит размер атрибута id. \nАтрибут id индексирован; тип индекса - . Тогда применяется индексное сканирование; полное сканирование может быть выбрано только в случае, если объем данных, удовлетворяющих данному условию, является большим (эта информация анализируется статистическим оптимизатором) и сравним с количеством записей в таблице. Индексное сканирование применяется лишь тогда, когда размер индексированных атрибутов меньше размера кортежа и все необходимые для обработки запроса данные могут быть получены из индекса; в остальных случаях может быть применено полное сканирование. \nАтрибут id входит в составной индекс, и является первым (лидирующим) атрибутом индекса, при этом тип индекса - . Аналогично предыдущему примеру, применяется индексное сканирование. \nАтрибут id входит в составной индекс, он не первый атрибут индекса; тип индекса - . Индексное сканирование применяется лишь тогда, когда размер индексированных атрибутов меньше размера кортежа и все необходимые для обработки запроса данные могут быть получены из индекса; в остальных случаях применяется полное сканирование. \nАтрибут id индексирован; тип индекса - хеш. Здесь применяется индексное сканирование для поиска на =; если бы условие было id <=10, то применение хеш-индекса для такого поиска не эффективно. \nАтрибут id индексирован; тип индекса - bitmap. Здесь применяется индексное сканирование для поиска на =; если бы условие было id <=10, то применение bitmap-индекса для такого поиска не эффективно. \nАтрибут id является ключом хеш-кластера. В этом случае применяется алгоритм хеширования при поиске блока данных для чтения. При хорошем алгоритме и правильном размере кластера поиск может быть осуществлен за одно чтение; при ошибках в выборе алгоритма и блока кластера это может составить до нескольких тысяч операций чтения блоков. \nАтрибут id является ключом индексного кластера. Здесь применяется индексное сканирование, почти аналогично случаю с индексом . \nТаблица кластеризована, id не является ни кластерным ключом, ни лидирующим в составном индексе . В этой ситуации для кластера применяется полное сканирование. \nМы привели только некоторые правила выполнения операции поиска в зависимости от наличия и типа индекса. В реализации используемой вами СУБД могут быть приняты иные принципы. Подробности использования типов сканирования при поиске данных даются в руководстве по настройке СУБД и в руководстве администратора СУБД.\nА почему бы не проиндексировать все, если индексный поиск быстрее полного сканирования? Очевидно, что индекс занимает место на диске, вопрос в том - сколько. Например, индексируется атрибут integer - это 4 байта. Но в кроме собственно значения ключа в индексе хранятся и внутренний идентификатор кортежа, и некоторая служебная информация, так что все вместе может составлять 4-8 байт. Чтобы точно посчитать эту величину для используемой вами СУБД, следует обратиться к руководству администратора: посмотрите размер идентификаторов ROWID (Oracle), RID (DB2) и т.д., а также размер страницы индекса (как правило, это 4 Кбайт).\nПри выборе стратегии индексации следует придерживаться двух простых принципов:\nчем больше индексов, тем выше затраты на выполнение DML-операций. По грубым оценкам затрат: если принять за 1 работу по вставке строки в таблицу, то работа по вставке той же записи в один индекс равна 2 или 3 (для разных СУБД); \nв любое значение может быть найдено за такое количество операций чтения, сколько уровней у дерева (дерево трех уровней для значений integer, например, содержит порядка 533 731 324 ключей, если страница дерева 4 Кбайт). Такие индексы отлично используются при поиске на =, <, >, <=, >=, between, и достаточно хорошо модифицируются. В bitmap-индексах содержатся готовые битовые векторы, отражающие вхождение или невхождение значения в ответ при поиске на равенство, но такие индексы плохо модифицируются и больше подходят для хранилищ данных, например для индексирования вхождения слов в текстовый документ. Хеш-индексы позволяют осуществлять поиск на равенство, хеш-функция используется для поиска блока кластеризованных данных, содержащего нужные значения. Если алгоритм хеш-функции хорош и размер кластера указан верно, то поиск может быть осуществлен за одно чтение. Эти индексы, как правило, используют для создания кластеров. \nОбратите внимание, хранит ли СУБД в индексах NULL. Если NULL в индексе не хранится, то вероятность использования полного сканирования для атрибутов без декларации not NULL резко повышается. Если NULL хранится в индексе (обычно его считают самым большим или самым маленьким при построении и специальным значением при построении bitmap и хеш-индексов), то выясните, для каких операций поиска индексы будут использованы оптимизатором SQL. Эта информация, как правило, содержится в руководстве администратора. Можно проверить и экспериментально, создав тестовую таблицу с объемом данных примерно 20 тыс. записей (чтобы оптимизатор не выбирал полное сканирование по причине малого объема) и выполнив исследуемый запрос, а затем произвести explain плана запроса (если подобный сервис предоставляется СУБД).\n\nВременные данные \nВременными данными, или временными рядами, называют данные, содержащие дату и время. Неправильная обработка таких данных в некоторых СУБД может служить одной из основных причин низкой функциональности и производительности информационной системы. Временные ряды не очень хорошо вписываются в двухмерную реляционную модель. SQL поддерживает соединения, не основанные на равенстве, но большинство разработчиков СУБД ограничиваются эквисоединением. Для временных данных часто приходится соединять таблицы на основе перекрытия одного диапазона дат другим. В SQL не существуют операции, которая позволяла бы задать такое соединение непосредственно.\nРяд атрибутов, например курс валюты или цена товара, изменяются во времени. Такие атрибуты действительны по дате, то есть актуальны только в течение определенного интервала времени, например дня для курса валюты.\nЕсли СУБД позволяет обрабатывать многомерные данные, то обработка временных рядов может использовать эти механизмы и тогда время будет являться одним из измерений. Подобные многомерные процессоры применяются для обработки геофизических и географических данных. В таких системах используются индексы , и их клоны.\nПриведем пример обработки цены товара (код товара, начальная дата, конечная дата, цена):\ncreate table prices \n(id integer, date_from date not null, \ndate_to date, price decimal not null, \nconstraint p_range check date_from < date_to); \nОтметим, что здесь в отношении не задан первичный ключ, а сама задача определения ключа в таких отношениях отличается сложностью. Известно, что момент изменения цены заранее не известен, этим и объясняется отсутствие ограничения not null для атрибута date_to:\nselect price from prices \nwhere id = :PRODUCT_CODE \nand date_from < :WHEN_DATE \nand date_to >= \nnvl(:WHEN_DATE, to_date(’01/12/4721’, ’DD/MM/YYYY’); \nЗдесь :PRODUCT_CODE и :WHEN_DATE обозначают переменные включающего языка, дата ’01/12/4721’ является самой большой из поддерживаемых СУБД (эта дата может быть и другой). Подобные операции лучше оформлять в виде хранимых процедур, функций или претранслированных запросов. В хранилищах данных часто обрабатываются архивные данные, для которых обработка временных рядов также актуальна.\nВозникают также вопросы по поводу точности дат, например: они актуальны для курсов валют, биржевых сделок. Следует определить, достаточна ли точность даты до секунды или нет. Существует проблема и с тем, как зарегистрировать сделку, если цена акции постоянно меняется. Некоторые проектировщики в этом случае обрабатывают временной ряд, но есть и более простое решение - отследить цену акции на момент прохождения биржевой транзакции и сохранить эту цену как часть информации, которую модифицировала транзакция. Поэтому сначала следует рассмотреть простые варианты решения задач, и если ни один из них не подходит, то использовать временные ряды.\nА также как нужно показывать не известную на текущий момент дату, например момент, когда цена товара перестанет быть актуальной? Сделайте это значение равным NULL или самым большим значением (определите его как default-значение для атрибута). Следует отметить, что значения default в большинстве реализаций СУБД работают только при вставке новых записей. Можно, конечно, создать триггер, который срабатывает после выполнения операции insert или update и преобразует null в наибольшее из допустимых значений даты. Но в этом случае, когда пользователь будет работать с подобной информацией, то может забыть, откуда взялась та или иная дата. Если вы спроектировали схему базы данных и запросы таким образом, то все приложения, работающие с выборками данных, должны отвечать следующим требованиям:\nпринудительно конвертировать в null такие даты и не показывать их пользователю; \nиспользовать соответствующие представления, содержащие decode (или иное средство конвертации «больших» дат); \nвызывать хранимую процедуру, которая выполнит все нужные преобразования. \nВыше только что были перечислены возможные проектные решения. Отметим, что для эффективного поиска следует создать составной индекс с атрибутами (date_from, date_to), но не все СУБД будут использовать такой составной индекс, если для одного из атрибутов допустимы значения null. Поэтому довольно простая для аналитиков задача представления временных рядов может повлечь за собой множество неприятных моментов при проектировании.\nТеперь рассмотрим проблему поиска первичного ключа для подобных отношений. Оказывается, что единственный разумный вариант предотвращения дубликатов таков: каждому единичному интервалу соответствует отдельная строка. Для биржевых операций этот интервал может быть равен, например, одной секунде, а в некоторых системах он еще меньше. У таких таблиц только одно преимущество - результат из них можно выбирать при помощи эквисоединения, однако объемы обрабатываемых данных велики.\nИспользование временных рядов, как правило, является одной из наиболее актуальных тем в разговоре с аналитиками. Какое решение будет лучшим - зависит от используемой СУБД и от ее особенностей, а именно: оптимизатора запросов, особенностей использования индексов, мощности SQL, хранимых процедур и триггеров.\n\nХранение объектов данных \nЭто одна из самых сложных задач проектирования схемы базы данных, для решения которой привлекаются администраторы баз данных. Универсальных решений, которые подошли бы для любой СУБД, не существует, так каждый производитель СУБД создает свой способ хранения и доступа к данным, считает его лучшим и очень им гордится. На проектирование схемы базы данных влияют следующие параметры, общие для большинства СУБД:\nразмер табличных пространств для хранения таблиц; \nразмер табличных пространств для хранения индексов; \nразмер табличных пространств для хранения BLOB; \nкластеры и их параметры; \nразмер словаря данных, включая код всех хранимых процедур, функций, триггеров, пакетов, статического SQL (реализован только в DB2); \nуправляющие файлы; \nфайлы журнала; \nинтенсивность потока запросов, модифицирующих данные и индексы; \nфалы временных табличных пространств (для хранения временных таблиц, которые строятся, например, при выполнении group by, а также других временных объектов); \nинтенсивность потока запросов, инициирующих создание временных таблиц; \nпотоки транзакций read-write, read-only, объем модифицируемых и считываемых ими данных, характеристики параллельной работы транзакций (какие и сколько их); \nколичество приложений, работающих параллельно с базой данных; \nколичество соединений с базой данных для каждого приложения; \nфайлы параметров старта ядра СУБД; \nзагрузочные модули ядра СУБД и утилиты СУБД; \nвходные и выходные данные, генерируемые пользовательскими программами; \nскрипты управления СУБД. \nПостарайтесь описать эти параметры хотя бы в общем виде, обсудите все вопросы с администратором баз данных и внимательно выслушайте его рекомендации. Если же его мнение может расходится с вашим представлением о том, как должна работать СУБД, попытайтесь понять его аргументы и запомните, с какими особенностями СУБД это связано. Все данные следует отразить в журнале проектирования. Следует иметь в виду, что многие нюансы размещения объектов данных и конфигурации сервера баз данных не могут быть учтены на этапе проектирования, так как требует полномасштабного тестирования. Конечно, избежать некоторых ошибок проектирования можно, но приготовьтесь к тому, что схема базы данных будет меняться и на этапе реализации, причем неоднократно.\n\nЗащита данных\nСтратегия защиты определяется на этапе анализа, а на этапе проектирования предстоит реализовать эту стратегию, спроектировав соответствующие структуры в схеме базы данных и модули. Большинство СУБД имеют развитые средства дискреционной защиты, а ряд СУБД имеют встроенные подсистемы аудита, что освобождает от необходимости создания собственных средств защиты.\nОбычно СУБД предоставляют набор пакетированных привилегий для управления данными, например: connect, которая разрешает соединение с базой данных; resource, которая дополнительно разрешает создание собственных объектов базы данных, dba, которая позволяет выполнять функции администратора конкретной базы данных, и др. Дискреционная защита предполагает разграничение доступа к объектам данных (таблиц, представлений, и т.п.), а не собственно к данным, которые хранятся в этих объектах. Дискреционная защита также обеспечивает создание пользовательских пакетированных привилегий - ролей или групп привилегий. В этом случае набор привилегий на те или иные объекты данных назначается группе или роли, а затем эта группа или роль назначается пользователю; таким образом пользователь получает привилегии на выполнение тех или иных операций над объектами данных косвенно - через группу или роль.\nВ некоторых реализациях допускается выполнение определенного набора операций от имени другого пользователя и с его привилегиями - в частности вызовы пакетов и хранимых процедур. Пользователь, вызывающий такой объект, не может ни изменить пакет или хранимую процедуру, ни получить доступ к ее коду, но операции над данными, которые выполняются в хранимой процедуре или пакете, будут выполнены от имени владельца хранимой процедуры или пакета. То же самое относится и к триггерам.\nНекоторые проектировщики очень любят использовать описанный выше метод защиты данных - это похоже на инкапсуляцию. Иногда проектировщики строят на каскадирующих вызовах хранимых процедур весьма сложные протоколы доступа к данным, имитируя мандатную защиту. Такой подход имеет свои преимущества и недостатки. С одной стороны, любой доступ к данным скрыт хранимой процедурой или пакетом, но с другой - в этом случае словарь данных сильно перегружен. Однако далеко не все реализации СУБД хорошо работают с курсорами в хранимых процедурах и пакетах, поскольку это вызывает чрезмерную загрузку процессора. Кроме того, в большинстве реализаций СУБД предложения SQL, выполняемые из хранимой процедуры или пакета, имеют более высокий приоритет, чем операции SQL, выполняемые из приложения пользователя. В связи с этим большое количество вызовов хранимых процедур может существенно замедлить выполнение запросов непосредственно из приложений пользователя. В любом случае, чтобы сделать защиту данных, «закрывая» любой запрос хранимой процедурой, требуется, чтобы СУБД имела достаточно развитый язык и позволяла, например, выполнять синтаксический разбор и чтобы внутри самой хранимой процедуры можно было строить как статические, так и динамические предложения SQL.\nК сфере защиты данных относятся также сохранность данных и восстановление их после сбоя системы. Для обеспечения бесперебойной работы часто применяют архивирование (в том числе инкрементное) базы данных и журнала транзакций, а в случае отказа системы при следующем старте операции над данными восстанавливают по журналу транзакций (например, производят их откат до определенного момента времени). Применяют также методы горячего резервирования, когда работают два сервера: основной, обрабатывающий запросы пользователей, и резервный, который продолжает работу основного сервера в случае его отказа. Состояние хранилищ данных на основном и резервном серверах согласовано и поддерживается СУБД автоматически, что позволяет проектировщикам не разрабатывать собственные механизмы репликации данных.\nРабота серверов в режиме горячего резервирования не избавляет от необходимости хранения резервных копий данных, это может быть и не очевидно для аналитиков и не предусмотрено ими. Некоторые бизнес-процессы по своей природе требуют от информационной системы работы в режиме 24x7, и любой простой стоит очень дорого. В этих случаях работают две или три параллельные системы, и при отказе одного из серверов резервные серверы немедленно принимают управление на себя. Эффективным, но дорогостоящим способом реализации таких задач являются предоставляемые СУБД технологии симметричной репликации. Еще один вариант - архивирование журналов транзакций на резервном узле на специальное устройство и немедленный докат по этому журналу резервного узла в случае отказа основного. Разные СУБД предлагают разные механизмы реализации подобной бесперебойной работы, и для принятия верного проектного решения необходимы консультации проектировщиков с администраторами баз данных.\nВ простых ситуациях, когда информационная система используется в основном для операций чтения данных, а сами данные меняются редко, резервное копирование может вообще не требоваться, если данные одной такой системы могут быть легко восстановлены из данных других работающих систем. Достаточно будет обеспечить наличие образа базы данных (архив всех файлов базы данных, а также управляющих файлов - это должен быть снимок базы данных на определенный момент времени; проще всего такой снимок получить, остановив СУБД и сделав резервную копию всех указанных файлов).\nВ большинстве информационных систем необходимо обеспечение безотказной работы системы в ситуации, представляющей собой нечто среднее между описанными выше двумя крайними случаями. Проектировщики должны пересмотреть результаты анализа, исходя из ответов на следующие вопросы:\nкаков график необходимой доступности системы для запросов пользователя (то есть когда система обязательно должна работать); \nдопустимы ли вообще и когда допустимы периоды профилактического простоя системы; \nдопустимы ли и когда допустимы периоды ограничения доступа к системе; \nкакие данные после отказа системы нельзя получить из других источников (часто это ввод новых документов, например накладных, операции со счетами, заказы на телефонные переговоры, информация с автоматизированных датчиков и т.п.); \nесли данные можно получить, то каков объем повторно вводимой информации; \nкаково допустимое время восстановления системы после сбоя; \nимеется ли график пакетных суточных заданий; \nкакие еще приложения, кроме информационной системы, работают на данном оборудовании; \nимеются ли резервные аппаратные средства на случай отказа основных; \nимеется ли запас мощности оборудования, на котором функционирует информационная система; \nкакова скорость передачи данных при резервном копировании; \nимеются ли специальные отказоустойчивые носители для хранения резервных копий; \nимеется ли правило циклического использования резервных носителей; \nимеется ли специальное защищенное место для хранения резервных носителей. \nОтветы на эти вопросы позволят более реально оценить ситуацию и уточнить требования заказчика, формализованные аналитики. Бывает, что заказ работоспособности системы в режиме 24х7 вовсе не является обоснованным и система простаивает, например, 50% времени. Если же требование 24х7 действительно отражает особенности данного бизнеса, то эти вопросы помогут построить соответствующую стратегию защиты данных от сбоев. Качество построенной при проектировании стратегии защиты должно быть проверено тестерами, причем их работа по генерации и проведению тестов, имитирующих отказы оборудования, должна проводиться как на этапе проектирования, так и в течение всего этапа разработки - в целях раннего обнаружения дефектов стратегии защиты данных от сбоев.\n\nОбмен данными с внешними системами \nБольшинство аналитиков считают задачи обмена с внешними системами чисто физическими, решенными априори и, как следствие, не уделяют этим вопросам внимания при анализе. Поэтому зачастую проектировщики вынуждены нести на себе всю нагрузку по созданию таких систем обмена.\nИмпорт и экспорт данных во внешние системы могут обеспечиваться как утилитами, поставляемыми в составе СУБД, так и специальными средствами обмена данными проектируемой информационной системы. Прежде чем писать код собственно системы обмена данными, внимательно изучите сервис, который предоставляет СУБД, и используйте его полностью. Если обмен данными идет между двумя однородными базами данных (одного производителя и одной версии), то средства импорта и экспорта данных во внутреннем формате данной СУБД могут быть использованы без ограничений. Если же обмен данными осуществляется между СУБД разных производителей, то для импорта и экспорта собственно данных можно использовать текстовые файлы. Следует при этом обратить особое внимание на особенности представления null, пустых строк символов и BLOB, так как здесь потенциально присутствует расхождение интерпретации содержимого файлов загрузчиками данных.\nИмпорт и экспорт схем может оказаться более сложным делом. Производители СУБД часто заявляют о поддержке стандартов ANSI, но на практике большинство баз данных не удовлетворяют им полностью. Синтаксисы операций создания таблиц существенно различаются, а синтаксисы определения хранимых процедур и триггеров большинства СУБД вообще несовместимы. Информация о схеме базы данных может быть получена из системного каталога посредством анализа данных в системных представлениях, но и здесь нет полной поддержки стандарта. Когда информационной системе требуется обмен данными между СУБД разных производителей, то, как правило, проектировщики принимают решение о создании специализированного средства. Даже если оно не будет полнофункциональным и не может быть применено для решения задачи конвертации данных между любыми СУБД, то решить локальную задачу оно способно.\nИнтерфейсы обмена с внешними системами можно разбить на следующие категории:\nодноразовый импорт данных, унаследованных, как правило, из старой системы; \nпериодический обмен данными между узлами информационной системы (внутренний обмен); \nпериодический обмен данных с другими информационными системами (внешний обмен). \nЕсли обмен данными должен осуществляться в режиме, близком к реальному времени, то это будет задача о распределенной базе данных, а не о простой передаче данных.\nПри анализе задач загрузки и выгрузки данных проектировщик должен рассмотреть:\nкаким подсистемам нужен интерфейс выгрузки данных и каков должен быть интерфейс загрузки данных из внешней системы; \nкаковы периодичность обмена данными и объем передаваемых данных; \nкакая требуется степень синхронизации двух систем; \nкаковы возможные методы транспортировки данных; \nа также:\nсогласовать формат данных для обмена; \nопределить зависимости загрузки и выгрузки, например порядок выполнения операций; \nопределить мероприятия, которые необходимо выполнить при сбое во время загрузки и выгрузки данных; \nсформулировать правила определения ошибочных записей (при загрузке); \nопределить правила регистрации операций передачи и приема данных; \nопределить график передачи данных (в большинстве информационных систем эти операции выполняются в ночное время); \nсоставить график разработки и тестирования собственных утилит или скриптов обмена данными; \nсоставить график разовой загрузки данных, наследуемых из старой системы, и подготовить методику проверки корректности этой операции. \nСледует отметить, что при наследовании данных из старой системы проектировщикам не приходится надеяться на то, что кто-то создаст утилиту, позволяющую достать данные из старой системы, - обычно это становится задачей самих проектировщиков новой системы. Может случиться так, что вам придется работать в жестких условиях, когда не будет возможности выделить время для тестирования новой программы извлечения данных. В этом случае нужно разработать набор тестовых данных. Если в старой системе имеется какое-то средство извлечения данных - используйте его; часто это самый разумный выход.\nПри загрузке данных из старой системы проектировщики могут столкнуться с большим объемом неочищенных данных - с нарушениями целостности данных, возникшими из-за сбоев системы, «заплаток» разработчиков, иных неприятностей. Возможно, что на вас будет оказано давление с тем, чтобы допустить наличие неочищенных данных в новой системе. Если не принять мер по очистке данных, то, вероятно, большинство спроектированных ограничений целостности нужно будет ослабить, чтобы загрузить хоть какую-то часть данных. Цена такой уступки достаточно высока: данные вы приняли, но ослабленные ранее ограничения уже нельзя восстановить, так как они уже нарушены (это отслеживается СУБД автоматически). Отсюда следует вывод: поддаваться давлению нельзя, так как несколько дней, потраченных на очистку данных, стоят так мало по сравнению с наличием в информационной системе данных, не обладающих элементарной целостностью.\nЧто делать с данными, которые содержат ошибки или не согласованы? Самое простое решение - пропускать такие данные, собирать их отдельно и анализировать. Здесь вас могут ждать некоторые проблемы: не все СУБД при загрузке данных их собственными утилитами позволяют в случае возврата кода ошибки указать запись, на которой произошел сбой. Если это так, то данные следует загружать небольшими порциями, чтобы можно было легче найти запись, которая повлекла сбой. Можно разместить данные с нарушениями целостности в отдельных таблицах, а потом обработать их. Подобную операцию (которую аналитики, как правило, не предусматривают) лучше автоматизировать посредством отдельного компонента. Проектировщикам придется либо озадачить аналитиков исследованием правил корректности данных, либо выполнить эту работу самим, причем необходима помощь опытных пользователей старой информационной системы. Здесь крайне важно найти данные, которые являются надежными, то есть те, которые с большой вероятностью указаны правильно. От таких данных и надо отталкиваться при создании программ проверки корректности данных.\nДалеко не все СУБД предоставляют средства, позволяющие выгрузить схему данных, хранимые процедуры и триггеры, но имеется достаточное количество ПО сторонних фирм, способного на это. Самым привлекательным будет ПО, осуществляющее выгрузку указанных объектов в виде скриптов, описывающих их создание. Если ПО позволяет сначала создать объекты данных без ограничений ссылочной целостности, а потом изменить их, добавив эти ограничения, то такой опцией рекомендуется пользоваться всегда. Дело в том, что большинство утилит выгрузки схемы опрашивают системный каталог и генерируют скрипт создания таблиц в том порядке, в котором имена таблиц встречаются в системном каталоге. Но вы не застрахованы от того, что имя таблицы-потомка будет считано раньше имени таблицы-предка. От исправления операций создания объектов данных вы также не застрахованы, так как у большинства СУБД разный синтаксис определения ограничений ссылочной целостности, серверных ограничений, индексов. Например, перечисленные ниже определения ссылочной целостности для таблицы tx:\ncreate table t(id int primary key, name char(10); \ncreate table tx(i int, j int references t(id)); \ncreate table tx(i int, j int references t(id) on delete no action on update no action); \ncreate table tx(i int, j int, foreign key j references t(id) on delete no action on update no action); \ncreate table tx(i int, j int, foreign key j references t on delete no action on update no action); \ncreate table tx(i int, j int, constraint t_ref_cascade foreign key j references t(id) on delete no action on update no action); \nвсе означают в точности одно и то же, но синтаксис у них разный. Для преобразования предложений SQL в требуемый формат могут быть созданы специальные утилиты. Поскольку в этом случае требуется разбор текста, то весьма нецелесообразно применение инструмента Perl. К сожалению, операция переноса хранимых процедур и триггеров не может быть в такой же степени автоматизирована вследствие существенных различий в языках их написания в разных СУБД. Некоторые СУБД совместимы по синтаксису хотя бы частично, но если этого нет, то большой доли ручной работы не избежать.\n",
|
||
"1"
|
||
],
|
||
[
|
||
"37",
|
||
"Этапы разработки проекта3.docx",
|
||
"Этапы разработки проекта: определение стратегии тестирования и проектирование\nОпределение стратегии тестирования\nКак отмечалось ранее, на этапе анализа привлекаются группы тестирования, например для получения сравнительных характеристик предполагаемых к использованию аппаратных платформ, операционных систем, СУБД, иного окружения. Кроме того, на данном этапе определяется план работ по обеспечению надежности информационной системы и ее тестирования. Для любых проектов целесообразным является привлечение тестеров на ранних этапах разработки, в частности на этапе анализа и проектирования. Если проектное решение оказалось неудачным и это обнаружено слишком поздно - на этапе разработки или, что еще хуже, на этапе внедрения в эксплуатацию, - то исправление ошибки проектирования может обойтись очень дорого. Чем раньше группы тестирования выявляют ошибки в информационной системе, тем ниже стоимость сопровождения системы. Время на тестирование системы и на исправление обнаруженных ошибок следует предусматривать не только на этапе разработки, но и на этапе проектирования.\nДля автоматизации тестирования следует использовать системы отслеживания ошибок (bug tracking). Это позволяет иметь единое хранилище ошибок, отслеживать их повторное появление, контролировать скорость и эффективность исправления ошибок, видеть наиболее нестабильные компоненты системы, а также поддерживать связь между группой разработчиков и группой тестирования (уведомления об изменениях по e-mail и т.п.). Чем больше проект, тем сильнее потребность в bug tracking.\n\nПроектирование\nНа этапе проектирования формируется модель данных. Проектировщики в качестве исходной информации получают результаты анализа. Конечным продуктом этапа проектирования являются:\nсхема базы данных (на основании ER-модели, разработанной на этапе анализа); \nнабор спецификаций модулей системы (они строятся на базе моделей функций). \nЕсли проект небольшой, то в качестве аналитиков, проектировщиков и разработчиков могут выступать одни и те же люди. Возникает вопрос: насколько вообще актуальна передача результатов самому себе? Думаем, что актуальна. Представьте себе, что вы передаете данные кому-либо, кто мало знает о системе. Зачастую это помогает, например, найти не описанные вообще, нечетко описанные, противоречиво описанные компоненты системы.\nВсе спецификации должны быть точными. План тестирования системы дорабатывается также на этом этапе разработки. Во многих проектах результаты этапа проектирования оформляются единым документом, который называют технической спецификацией. В нем также описывают принятый подход к решению каких-либо сложных технических вопросов.\n\nЖурнал проектирования\nПри проектировании возникает необходимость регистрировать все обсуждаемые варианты и окончательные решения. Не секрет, что проектировщики порой меняют первоначальные решения. Это может происходить потому, что со временем участники проекта забывают аргументы в пользу принятого решения. Подобную информацию можно хранить в репозитарии используемого CASE-средства, в текстовых файлах, просто на бумаге. Журнал проектирования является полезным материалом для новых членов групп проектировщиков, а также для разработчиков и тестировщиков.\nТакой журнал может вестись как на этапе анализа, так и на этапе разработки и тестирования.\n\nПланирование этапа проектирования\nТщательное планирование важно для любого проекта. Это входит в обязанности руководителя проекта и руководителя группы проектирования (консультации с аналитиками в этом случае будут обязательными). Это позволяет:\nРазбить глобальную задачу на небольшие, независимые задачи. Такими задачами легче управлять, такие задачи легче реализовывать. \nОпределить контрольные даты (этапы сдачи), которые позволят определить, насколько успешно продвигается проект, какие направления отстают, какие недогружены, какие работают успешно. Это позволяет обнаружить отставание от сроков сдачи и вовремя предотвратить авралы. \nОпределить зависимости между задачами, а также последовательность завершения задач. \nПрогнозировать загрузку персонала, наем временных работников, привлечение других групп разработчиков, привлечение консультантов (если это необходимо). \nПолучить четкое представление о том, когда можно начать этап реализации. \nПолучить четкое представление о том, когда можно начать этап опытной эксплуатации. \n\nПерепланирование\nЗаказчики всегда хотят, чтобы план выполнения работ оставался неизменным. На практике этого редко удается достичь в полном объеме. Определенным компромиссом здесь может стать неизменность установленных сроков сдачи компонентов системы в эксплуатацию.\nЗадачи проектирования.\n\nРанние стадии\nРассмотрение результатов анализа\nЭто собственно процесс передачи информации от аналитиков проектировщикам. На практике это итерактивный процесс. У проектировщиков неизбежно будут возникать вопросы к аналитикам, и наоборот. Информация о системе будет постоянно уточняться. При разработке схемы базы данных может измениться информационная модель, полученная на этапе анализа, например потому, что имеющееся проектное решение нестабильно либо медленно работает при реализации его посредством выбранной СУБД или в силу иных причин. Проверить, охватывает ли анализ все бизнес-процессы системы (то есть осуществить проверку на полноту), проектировщики не в состоянии, но проверку информационной модели на непротиворечивость и корректность проектировщики провести могут. Это позволяет отследить ошибки в информационной модели и не повторить их в модели данных. Если результаты хранятся в репозитарии CASE-средства, то такая проверка на корректность может быть произведена автоматически.\n\nСеминары\nРанние стадии проектирования сопряжены с нудной и утомительной работой. Проектировщики и аналитики должны достигнуть полного понимания требований заказчика. Семинары являются быстрым и эффективным способом обмена информацией. Хороший способ убедиться в том, правильно ли проектировщики понимают назначение той или иной подсистемы, - взять один или несколько сценариев бизнес-процессов и проиграть их. Это можно сделать в форме простой диаграммы потока данных, причем необходимо указать не только автоматизированные, но и ручные функции.\n\nКритические участки\nКритические участки системы изучаются при первом обследовании системы и уточняются на этапе анализа. Термин «критические» может означать жизненно важные как для нормального функционирования информационной системы с точки зрения бизнеса (например, время простоя автоматизированной линии изготовления материала X не должно превышать одной минуты), так и для успешной реализации и приемки проекта. Критические с точки зрения бизнеса участки информационной системы хорошо подходят для макетирования. На основе этих макетов (работы макетирования выполняют проектировщики и группы тестирования) тестеры дают оценку качества как информационной модели, так и модели данных. Также макетирование позволяет показать, какие требования и какими средствами могут быть выполнены, а какие требования - не могут.\nЧасто на этапе проектирования выявляются критические участки, которые не были очевидными на этапе анализа. Это влечет за собой необходимость уточнения информационной модели. Часто это связано с особенностями реализации тех или иных возможностей в выбранной СУБД. Некоторые функции, которые на этапе анализа выглядят простыми, могут стать очень сложными, когда дело дойдет до физической реализации. Например:\nВ выбранной СУБД отсутствует эффективный механизм сканирования деревьев, а при анализе выявлено большое количество справочников и выбраны интерфейсы представления в виде деревьев, кроме того это понравилось заказчику, а СУБД при большом справочнике работает слишком медленно. \nДругая распространенная неприятность - неполно реализованная ссылочная целостность. В СУБД не реализованы каскадные модификации, в информационной модели нормализованные отношения предполагают наличие каскадных удалений и обновлений. Реализация же таких механизмов посредством триггеров оказалась слишком медленной, и уровень каскадирования триггеров ниже, чем уровень каскадных операций, определенных в информационной модели. \nТакие моменты могут инициировать не только изменение информационной модели, но и смену СУБД.\nМежду критическими участками проекта и его рисками существует тесная связь. Критический участок разработки (например, срыв сроков первого этапа сдачи проекта заказчику) может стоить целого проекта. Причинами срыва могут быть как ошибки проектирования, так и нехватка персонала.\n\nОценка ограничений\nОграничениями, известными с момента обследования бизнес-процессов, являются смета затрат и сроки внедрения. Могут быть и другие ограничения, например допуск персонала к той или иной информации (группы аналитиков к информации о бизнес-процессах в фирме, ограничения доступа к секретной информации и т.п.).\nРешения относительно выбора аппаратной платформы, как правило, необратимы, поскольку тесно связаны со сметой затрат и наличием обслуживающего персонала. Например, решения на платформе RS/6000 и Intel с точки зрения сметы затрат выглядят одинаково, но персонала, способного квалифицированно обслуживать RS/6000, нет, и руководство не согласно оплатить обучение сотрудников, хотя решение на основе RS/6000 обладает более высокой масштабируемостью. Это может послужить причиной выбора платформы Intel. Аналогичные причины могут влиять и на выбор операционной системы.\nЕсли проект является расширением или модернизацией существующей информационной системы, то число унаследованных ограничений также может быть большим. На этапе проектирования осуществляется обязательная проверка требований к информационной системе в свете выявленных ограничений. Менять платформу, операционную систему или СУБД на этапе реализации сложно, а на этапе опытной эксплуатации практически невозможно (на это просто не хватит времени, если не произойдет чудо). Чем большее количество компонентов системы уже реализовано, тем сложнее произвести подобную замену. Большинство СУБД сейчас работают на нескольких аппаратных платформах и нескольких операционных системах, но если есть участки кода проекта, зависимые от операционной системы или аппаратной платформы, то их изменение может обойтись очень дорого. В данной статье мы не будем обсуждать вопросы переносимости кода, поскольку они выходят за рамки этого цикла.\nЕсли какие-либо требования не могут быть удовлетворены в принципе, принимается решение о доведении этого факта до сведения спонсоров проекта (руководства фирмы). Обнаружение неработоспособности системы в процессе эксплуатации ничем хорошим обернуться не может, особенно если до руководства фирмы дойдет информация о том, что невыполнимость требований была известна заранее.\n\nОпределение целевой архитектуры\nПод выбором архитектуры мы понимаем и выбор платформы (платформ), и выбор операционной системы (операционных систем). В системе могут работать несколько компьютеров на разных аппаратных платформах и под управлением различных операционных систем. Если к автоматизации того или иного бизнеса до вас уже приложили руки, причем неоднократно, вы можете обнаружить настоящий «зверинец» платформ и операционных систем. Перенос ПО на ту или иную платформу - процесс не безболезненный, да и управление разнородной сетью может также стать делом проблемным. Если же обстоятельства таковы, что ПО на рабочих местах конечных пользователей должно работать под управлением нескольких операционных систем (ОС), то следует обязательно выделить зависимые от ОС участки кода и жестко описать интерфейсы обмена компонентов информационной системы, сделав их независимыми от ОС. При написании кода модулей, работающих под управлением нескольких ОС, следует ориентироваться на ту из них, которая обладает наиболее жесткими требованиями.\nКроме определения платформы следует выяснить следующее:\nБудет ли это архитектура «файл-сервер» или «клиент-сервер». \nБудет ли это 3-уровневая архитектура со следующими слоями: сервер, ПО промежуточного слоя (сервер приложений), клиентское ПО. \nБудет ли база данных централизованной или распределенной. Если база данных будет распределенной, то какие механизмы поддержки согласованности и актуальности данных будут использоваться. \nБудет ли база данных однородной, то есть будут ли все серверы баз данных продуктами одного и того же производителя (например, все серверы только Oracle или все серверы только DB2 UDB). Если база данных небудет однородной, то какое ПО будет использовано для обмена данными между СУБД разных производителей (уже существующее или разработанное специально как часть проекта). \nБудут ли для достижения должной производительности использоваться параллельные серверы баз данных (например, Oracle Parallel Server, DB2 UDB и т.п.). \nЭти решения часто принимаются до начала этапа проектирования (на этапе анализа). На этапе проектирования полезно еще раз рассмотреть все причины выбора той или иной архитектуры, провести тесты производительности и надежности критических участков информационной системы. Это позволит избежать тяжело устраняемых ошибок проектирования. Довольно часто на этапе проектирования возникают непредвиденные технические проблемы, например аналитики не учитывают группу пользователей, имеющих доступ к информационной системе посредством текстовых терминалов. Это ошибка анализа, но выявляется она только на этапе проектирования. Такие проблемы должны решаться вместе с аналитиками, которые инициируют изменение информационной модели.\nЕсли в среде используется сеть, то на этапе проектирования необходимо определить требуемые уровни сервиса сети и спроектировать ее топологию. Необходимо также провести тесты сети, чтобы увидеть, обеспечивает ли существующая сеть должную пропускную способность и имеется ли резерв пропускной способности сети. Если результат отрицательный, то следует четко описать необходимые изменения аппаратного обеспечения и топологии сети.\n\nВыделение потенциальных узких мест в информационной системе\nЕсли заказчик заявит, что производительность системы не имеет никакого значения, примите это замечание с юмором. Это означает лишь то, что время ответа системы на запрос не является (или не кажется заказчику в данный момент) критическим. Попробуйте спросить, приемлемо ли время ответа системы, равное одному часу или одному дню. Вряд ли ответ на этот вопрос будет положительным.\nПроизводительность важна для любой информационной системы. Узким местом называют момент падения производительности системы. Конкретный ответ на вопрос, где узкие места данной системы, может дать лишь специальное направленное тестирование. Но это не означает, что оценка потенциальных узких мест невозможна. Одним из хороших методов является график нагрузки на систему в течение дня, недели, месяца и т.п. Можно построить диаграмму, на которой будет отражено время работы тех или иных бизнес-процессов, а также требуемое для данного бизнес-процесса время ответа системы. Такие диаграммы помогают выявить момент, когда нагрузка будет наиболее интенсивной. Количество пользователей, одновременно работающих с тем или иным компонентом, отражается на диаграмме посредством весового коэффициента (рис. 1).\nВ приведенном примере явно видны 3 пика активности системы, максимальный из которых приходится на 11 часов. Использован тип диаграммы с накоплением.\nА в диаграмме, представленной на рис. 2, видна активность касс в течение рабочего дня и повышение активности загрузки данных в нерабочее время. В такие диаграммы следует также добавлять вес, отражающий сложность бизнес-процесса, например в данном примере самый высокий весовой коэффициент будут иметь отчеты. Оценка весов определяется особенностями каждого конкретного бизнеса - где-то она может быть высокой, где-то низкой.\nОтвет на вопрос, насколько потенциальные узкие места являются реальными, может дать только тестирование. Здесь оправданно применение специальных средств моделирования сценариев приложений. Следует отметить, что оценка точности детектирования узкого места в системе очень зависит от объема обрабатываемых данных. Следует уделить внимание генерации тестовых данных и проверке узких мест уже на этих данных. Часто информационная система не сразу выходит на проектную мощность, как правило, она работает некоторое время в режиме первоначального накопления информации, которое может продолжаться и несколько дней, и несколько месяцев. Как правило, предполагаемый порог объема обрабатываемых данных известен на этапе анализа, но реальный объем физических данных можно точно оценить только на этапе проектирования. Если сгенерировать предполагаемый объем тестовых данных нельзя (не хватает мощности техники или есть иные причины), то тесты проводят на меньшем объеме данных и пытаются построить оценки поведения системы на реальном объеме данных.\nБолее точно узкие места системы оцениваются на этапе разработки. Здесь уже есть реализованные компоненты системы. Средства автоматизации тестирования (например, LoadRunner, WinRunner и др.) позволяют отследить операции, которые выполняет то или иное приложение (но данные средства могут отследить далеко не все возможные типы приложений и то, насколько они подходят для тестирования вашего проекта, - это решение такого же порядка, что и выбор средства разработки приложения), автоматически сгенерировать сценарий запуска имитаторов работы реальных приложений и построить оценки узких мест системы.\n\nПродукты третьих фирм\nНа этапе проектирования оценивают возможность и эффективность использования продуктов третьих форм в разработке данной информационной системы. Например, существует задача выполнения некоторого набора работ (определенных пакетных заданий и т.п.) по заданному графику. Далеко не всегда целесообразно включать в проект создание утилиты контроля запуска приложений, поскольку есть масса утилит, выполняющих эти операции, в том числе и свободно распространяемых. Существует и другая причина, по которой с ПО третьих фирм следует хотя бы ознакомиться. Не факт, что в мировой практике решения задач, подобных вашей, не встречаются. Если реализации третьих фирм известны, то следует с ними ознакомиться хотя бы для того, чтобы не повторять неудачные решения и взять на заметку удачные. Вероятно, какой-либо из существующих продуктов может быть интегрирован в создаваемую вами информационную систему. Для этого, возможно, потребуется создать интерфейс обмена данными между ПО третьей фирмы и вашим. Следует оценить целесообразность как разработки собственного компонента, так и интеграции уже готового аналогичного компонента.\n\nИспользование CASE-средств\nCASE-средства предоставляют много преимуществ. На одной чаше весов будет автоматизация работы, предоставляемая CASE, а на другой - ненавистная задача преобразования результатов анализа в формат этого CASE (если для формализации результатов анализа использовался другой CASE-инструмент или не использовался никакой). Некоторые CASE-средства позволяют непосредственно перейти к проектированию, а к анализу можно вернуться путем обратного проектирования. К сожалению, при использовании обратного проектирования в CASE-средстве создается весьма вредная иллюзия того, что данные анализа регистрируются, хотя на самом деле этого практически никогда не происходит, поскольку информация, содержащаяся в спроектированной структуре, отличается от результатов анализа. Некоторые полезные данные получить можно, но построить полную картину вряд ли удастся.\n\nИнфраструктура\nДля проектирования и реализации необходимы аппаратные ресурсы и специальное программное обеспечение. Кроме того, требуется механизм, позволяющий контролировать создаваемую документацию и код. Эти вопросы лучше решать на ранних стадиях проектирования, а не на стадии разработки. Мы поговорим об этом ниже, в разделе «Проектирование процессов и кода». При групповой разработке вам понадобятся средства контроля согласованности кода. Если разработка идет под разными платформами (аппаратная платформа и ОС), то хорошим решением может оказаться PVCS. Для платформ Windows 98, NT, 2000 может оказаться приемлемым решение, предлагаемое Microsoft - MS Source Save. Кроме того, многие средства разработки также предоставляют возможности контроля исходного кода.\n\nПроектирование базы данных\nЗдесь мы изложим задачи, касающиеся проектирования реальной базы данных.\n\nПостроение модели данных\nРабота проектировщиков базы данных в значительной степени зависит от качества информационной модели. Информационная модель не должна содержать никаких непонятных конструкций, которые нельзя реализовать в рамках выбранной СУБД. Следует отметить, что информационная модель создается для того, чтобы на ее основе можно было построить модель данных, то есть должна учитывать особенности реализации выбранной СУБД. Если те или иные особенности СУБД не позволяют отразить в модели данных то, что описывает информационная модель, значит, надо менять информационную модель, так как производитель СУБД вряд ли будет оперативно менять собственно СУБД ради вашего конкретного проекта (хотя и такие, правда единичные, случаи имели место).\nПостроение логической и физической моделей данных является основной частью проектирования базы данных. Полученная в процессе анализа информационная модель сначала преобразуется в логическую, а затем в физическую модель данных. После этого для разработчиков информационной системы создается пробная база данных. С ней начинают работать разработчики кода. В идеале к моменту начала разработки модель данных должна быть устойчива. Проектирование базы данных не может быть оторвано от проектирования модулей и приложений, поскольку бизнес-правила могут создавать объекты в базе данных, например серверные ограничения (constraints), а также хранимые процедуры и триггеры, - в этом случае часто говорят, что часть бизнес-логики переносится в базу данных. Проектирование модели данных для каждой СУБД содержит свои особенности, проектные решения, которые дают хороший результат для одной СУБД, но могут оказаться совершенно неприемлемыми для другой. Ниже перечислим задачи, которые являются общими для проектирования моделей данных:\nвыявление нереализуемых или необычных конструкций в ER-модели и в определениях сущностей; \nразрешение всех дуг, подтипов и супертипов; \nизучение возможных, первичных, внешних ключей, описание ссылочной целостности (в зависимости от реализации декларативно или с использованием триггеров); \nпроектирование и реализация денормализации базы данных в целях повышения производительности; \nопределение части бизнес-логики, которую следует реализовать в базе данных (пакеты, хранимые процедуры); \nреализация ограничений (ограничений и триггеров), отражающих все централизованно определенные бизнес-правила, генерация ограничений и триггеров; \nопределение набора бизнес-правил, которые не могут быть заданы как ограничения в базе данных; \nопределение необходимых индексов, кластеров (если таковые реализованы в СУБД), определение горизонтальной фрагментации таблиц (если это реализовано в СУБД); \nоценка размеров всех таблиц, индексов, кластеров; \nопределение размеров табличных пространств и особенностей их размещения на носителях информации, определение спецификации носителей информации для промышленной системы (например, тип raid-массивов, их количество, какие табличные пространства на них размещаются), определение размеров необходимых системных табличных пространств (например, системного каталога, журнала транзакций, временного табличного пространства и т.п.); \nопределение пользователей базы данных, их уровней доступа, разработка и внедрение правил безопасности доступа, аудита (если это необходимо), создание пакетированных привилегий (в зависимости от реализации СУБД это роли или группы), синонимов; \nразработка топологии базы данных в случае распределенной базы данных, определение механизмов доступа к удаленным данным. \nПодробнее на каждом из перечисленных пунктов мы остановимся в части «Схема базы данных».\n\nСоздание базы данных для разработчика\nЧаще всего базу данных создает администратор баз данных - если он есть; в противном случае это приходится делать проектировщикам. Физическая база данных нужна разработчикам информационной системы для разработки кода, а проектировщикам для проверки их идей. Проектировщики и разработчики могут работать как с одной и той же схемой, так и с разными схемами. В процессе разработки проекта, как правило, создается несколько версий схемы базы данных. Следует обязательно вести журнал изменений схемы (вручную или в репозитарии case) и жестко контролировать версии схемы.\n\nПроектирование процессов и кода\nПараллельно с проектированием схемы базы данных требуется выполнить проектирование процессов, чтобы получить спецификации всех модулей. Если часть бизнес-логики хранится в базе данных (ограничения, триггеры, хранимые процедуры), то оба эти процесса проектирования тесно связаны. Главная цель проектирования заключается в отображении функций, полученных на этапе анализа, в модули информационной системы. Определения модулей раскрываются в технической спецификации программ. Возможно, что некоторые атомарные функции, полученные на этапе анализа, вообще не будут отображены в какие-либо модули, а будут преобразованы в ручные процедуры или принципы работы.\n\nВыбор средств разработки\nНе следует откладывать выбор средств разработки на самый последний момент. Если проектировщик не слишком хорошо представляет себе набор средств, которые будут использованы для разработки проекта, то следует для начала составить перечень возможных средств, затем провести консультации с техническими специалистами (хорошо знающими средства-кандидаты), оценить, с какими средствами персонал уже работал, а какие являются для них абсолютно новыми. Часто выбор средств разработки определяет именно фактор квалификации персонала.\nОтображение функций на модули\nНа этапе анализа уже разработан перечень функций, которые будут реализованы. На этапе проектирования этот перечень еще раз анализируется и корректируется. Однозначное соответствие между функцией и модулем вряд ли возможно. Дело в том, что на этапе анализа функции организованы по бизнес-категориям, а на этапе проектирования их придется реорганизовывать для упрощения разработки. Проектировщики могут принять решение объединить несколько функций, обладающих общими свойствами, или выделить какое-то общее свойство (или их набор) в отдельный модуль, а также разбить сложную функцию на несколько модулей. Подробнее эти вопросы рассматриваются в разделе «Спецификации функций».\n\nИнтерфейсы программ\nПри проектировании модулей определяют разметку меню, вид окон, горячие клавиши и связанные с ними вызовы. Существуют два вида перемещения по программам:\nс контекстом, когда целевая экранная форма частично или полностью заполняется автоматически данными, связанными с теми, что находятся в исходной экранной форме; \nбез контекста, когда целевая экранная форма не заполняется вовсе или частично заполняется автоматически данными, не связанными с теми, что находятся в исходной экранной форме. \nЧасто автоматически заполняемые данные экранной формы группируют (располагают рядом), а перемещение по заполняемым пользователем полям организуют так, как это делал бы сам пользователь, работая с реальным бумажным документом. Такие интерфейсы воспринимаются пользователем легче, и он намного быстрее осваивает новое ПО.\n\nИнтегрирование и наследование механизмов обмена данными\nИнформационная система редко разрабатывается с нуля. Чаще проектировщики сталкиваются с задачами наследования данных из старых систем, которые уже выполняют какие-либо задачи автоматизации бизнеса. Такие системы могут на начальном этапе быть интегрированы в новую систему и постепенно заменяться новыми, более современными модулями. Этот подход может навязываться руководством фирмы для того, чтобы ускорить ввод новой информационной системы. Следует рассмотреть все плюсы и минусы такой постепенной интеграции (минусов, как правило, оказывается больше). Одну операцию придется делать в любом случае: переносить ценные данные, хранящиеся в старой информационной системе, в новую, то есть проектировать механизмы конвертации данных. Возможно, что придется делать конвертацию данных не только из старой системы в новую, но и обратно (полную или частичную), поскольку возможен вариант развития событий, при котором старая и новая информационные системы будут работать параллельно - хотя бы в период опытной эксплуатации новой системы.\nКроме вопросов наследования собственно данных из старых информационных систем, возможно, вам придется также решать задачи взаимодействия вашего ПО с продуктами третьих фирм. В этом случае вам следует изучить интерфейсы обмена данными ПО других разработчиков и обеспечить должный уровень поддержки этих интерфейсов в разрабатываемой информационной системе.\n\nОпределение спецификаций модулей\nЭто основная часть функционального проектирования. Здесь решаются следующие задачи:\nпреобразование функциональных определений анализа в реализуемые модули; \nспецификации, которые выражают функциональные возможности каждого модуля в физических категориях; \nопределение средств разработки для каждого модуля (или выделенных групп модулей), если используются несколько средств разработки в одном проекте; \nопределение последовательности реализации модулей и зависимостей модулей. \nСпецификации модулей различают по степени детализации и содержанию даже в рамках одного проекта. Определяют, сколько времени требуется для того, чтобы сгенерировать тот или иной модуль, сколько необходимо на тестирование того или иного модуля, а также на тестирование совокупности сгенерированных модулей. Кроме того, следует разработать специальные метрики - шаблоны, которые позволяют оценить, сколько времени потребуется на создание исходного кода модуля. Для ускорения процесса разработки следует рассмотреть возможность использования генераторов исходного кода - это целесообразно, если вам предстоит разработать большое количество несложных модулей, а время разработки ограничено. Следует использовать шаблоны кода для устранения рутинных операций. Подробнее эти вопросы рассматриваются в разделе, посвященном спецификациям функций, - вы найдете его в одной из следующих статей данного цикла.\n",
|
||
"1"
|
||
],
|
||
[
|
||
"38",
|
||
"Этапы разработки проекта4.docx",
|
||
"Этапы разработки проекта: реализация, тестирование, эксплуатация и сопровождение\nРеализация\nТрудно давать советы по реализации кода модулей, так как каждый разработчик имеет какие-то привычки и свой стиль разработки кода. При реализации проекта важно координировать группу (группы) разработчиков. Все разработчики должны подчиняться жестким правилам контроля исходных тестов. Группа разработчиков, получив технический проект, начинает писать код модулей, и в этом случае основная задача состоит в том, чтобы уяснить спецификацию. Проектировщик указал, что необходимо сделать, а разработчик определяет способы выполнения.\nНа этапе разработки осуществляется тесное взаимодействие проектировщиков, разработчиков и групп тестеров. В случае интенсивной разработки тестер буквально «пристегивается» к разработчику, фактически являясь членом группы разработки.\nПроектировщик на данном этапе выполняет функции «ходячего справочника», поскольку постоянно отвечает на вопросы разработчиков, касающиеся технической спецификации.\nЧаще всего на этапе разработки меняются интерфейсы пользователя. Это обусловлено в том числе и тем, что модули периодически демонстрируются заказчику. Существенно могут меняться и запросы к данным.\nСледует отметить, что для сборки всего проекта должно быть выделенное рабочее место. Именно эти модули передаются на тестирование. Взаимодействие тестера и разработчика без централизованной передачи частей проекта допустимо, но только в случае, если необходимо срочно проверить какую-то правку. Очень часто этап разработки и этап тестирования взаимосвязаны и идут параллельно. Синхронизирует действия тестеров и разработчиков система bug tracking.\nПри разработке должны быть организованы постоянно обновляемые хранилища готовых модулей проекта и библиотек, которые используются при сборке модулей. Желательно, чтобы процесс обновления хранилищ контролировал один человек. Одно из хранилищ должно быть предназначено для модулей, прошедших функциональное тестирование, а другое - для модулей, прошедших тестирование связей. Первое из них - это черновики. Второе - то, из чего уже можно собирать дистрибутив системы и демонстрировать его заказчику для проведения контрольных испытаний или сдачи каких-либо этапов работ.\nДокументация создается в течение всего процесса разработки. Как только модуль прошел тестирование связей, его можно описывать в документации. В случае если модули изменяются часто, к описанию приступают только тогда, когда модуль становится более или менее стабильным.\n\nОбработка результатов проектирования\nНа этапе разработки, как правило, еще раз проверяется атомарность функций, а также отсутствие их дублирования.\nЖелательно, чтобы на этапе проектирования уже была построена матрица «функции-сущности». Это фактически формализованное представление того, что фирма пытается сделать (функции) и какую информацию требуется обработать для достижения результата (сущности). Подобная матрица позволяет проверить следующие моменты:\nимеет ли каждая сущность конструктор - функцию, создающую экземпляры сущности (create); \nесть ли ссылки на данную сущность, то есть используется ли где-либо данная сущность (references); \nимеют ли место изменения данной сущности (update); \nимеет ли каждая сущность деструктор - функцию, которая удаляет экземпляры сущности (delete). \nЧасто роль деструктора выполняет комплект программ архивирования данных. Нередко в информационных системах информацию просто накапливают. Это допустимо лишь в том случае, если в течение всего периода накопления информации (а фактически в течение всей жизнедеятельности информационной системы) характеристики ее производительности удовлетворяют требованиям заказчика. На практике это чрезвычайно редкое стечение обстоятельств. Связано это в основном с ростом обрабатываемых объемов информации. Следует отметить, что надеяться в этом случае только на мощность СУБД или аппаратного обеспечения нельзя, так как подобные экстенсивные методы повышения производительности дают низкий расчетный прирост скорости. Фактически задача реагирования системы или отдельных ее частей на рост объема обрабатываемых данных является наиболее вероятной задачей тестирования. В таком случае группа тестирования создает модуль генерации (пусть даже абстрактных) данных, выбирается набор запросов, для которых скоростные характеристики критичны, далее производятся замеры и строится зависимость скорости выполнения от объема данных для каждого из запросов. Такое простое действие позволит избежать серьезных ошибок и в проектировании, и в реализации информационной системы.\nСпецификация модулей должна быть выполнена еще на этапе проектирования, чему в реальных проектах зачастую просто не придают значения. И напрасно - ведь из-за непродуманной реализации модулей любые достоинства схемы базы данных могут быть утрачены. Так, пренебрегая спецификациями модулей, вы рискуете заложить в информационную систему:\nнеконтролируемый рост объемов данных; \nпотоки запросов с изначально высокой вероятностью конфликта или потоки запросов, которые будут выполняться «вечно» (попытка выполнить поток, обнаружение конфликта и откат всех действий, новая попытка и т.д.) из-за конфликтующих с ними потоков; \nсмешивание системных и интерфейсных модулей; \nдублирование модулей; \nошибки в размещении бизнес-логики; \nотсутствие реализации или неполная реализация требуемых заказчиком функций системы. \nЭто далеко не полный список проблем, которые будут обнаружены или на этапе комплексного тестирования, или при вводе системы в эксплуатацию, а может быть, даже в процессе эксплуатации системы (когда начнут реально использоваться модули).\nКроме того, отсутствие спецификаций модулей не позволит точно оценить сложность каждого модуля и, как следствие, определить последовательность создания модулей и правильно распределить нагрузку персонала. Обычная ситуация в подобном случае - «кто-то кого-то ждет», при этом процесс создания информационной системы стоит на месте.\n\nСистемные модули \nЧасто приходится рассматривать большое количество обслуживающих или вспомогательных процессов, которые непосредственно не связаны со сформулированной бизнес-функцией. Как правило, это системные функции, имеющиеся в любой информационной системе, такие как:\nдиспетчер очередей или планировщик заданий; \nдиспетчер печати; \nсредства доступа к данным и создания нерегламентированных запросов (часто это генераторы отчетов); \nуправление каталогами и иными ресурсами файловой системы; \nавтоматическое резервное копирование; \nавтоматическое восстановление после сбоя системы; \nсредства регламентирования доступа пользователей к системе (состоящие из средства создания пользователей и средства назначения им привилегий); \nсредство настройки среды для пользователя информационной системы; \nсредство изменения пользователем своих настроек (в том числе и пароля); \nсредство управления приложениями; \nсреда администратора информационной системы. \nЧасть этих функций должна выполнять операционная система, но если она будет работать в неоднородной среде, то нет гарантии, что пользователям придется по вкусу наличие различных интерфейсов в разных операционных системах. В идеале все приложения-клиенты должны работать в одной операционной системе, однако на практике разработчикам часто приходится сталкиваться с целым «зоопарком» различных рабочих станций у заказчика - итогом нескольких попыток автоматизировать бизнес. Цель разработчика - довести систему до максимально однородного состояния либо сделать похожими хотя бы рабочие места конечных пользователей.\nЗадача создания информационной системы в разнородной среде существенно повышает требования к разработчикам кода и к выбираемому средству разработки. Особенно это касается разработки системных модулей. Следует уделить внимание модулям, реализация кода которых зависит от операционной системы. Подобные модули должны быть выделены отдельно для каждой из операционных систем в группы, например Win98, WinNT и т.д. Модули каждой из групп должны иметь строгие интерфейсы обмена - данные, которые они передают и получают, строго определены, любое отклонение от спецификации наказуемо. Ни один из модулей вне этой группы не может использовать никаких других вызовов, кроме интерфейсов обмена. Таким образом модули, зависящие от операционнй системы, изолируются от других модулей.\nВообще говоря, практика изолирования системных модулей посредством строгой регламентации их интерфейсов обмена существенно минимизирует затраты по исправлению ошибок и поддержке системы. Кроме того, это облегчает и тестирование, а именно детектирование ошибок и их отладку. Другая сторона вопроса - требования к коду интерфейса обмена системных модулей резко повышаются. Это то, что отлаживается в первую очередь и должно работать очень четко.\n\nСредства мониторинга информационной системы \nЕсли информационная система велика, то следует рассмотреть задачу ее администрирования с одной рабочей станции. Необходимо заботиться не только о конечном пользователе информационной системы, но и о персонале, который будет ее обслуживать. Особое внимание следует уделить мониторингу критических участков информационной системы, поскольку сбой зачастую проще предотвратить, чем исправлять его последствия. Мониторинг относится к тем задачам, о необходимости решения которых заказчик, как правило, не задумывается и которые обычно отсутствуют и в аналитическом исследовании, и даже при проектировании. Потребность в средствах мониторинга становится очевидной лишь на этапе ввода системы в эксплуатацию, причем потребность эта тем выше, чем сложнее система и чем больше в ней критических участков.\nРазработчикам и проектироващикам следует проводить оценку сложности системы. Если принимается решение о написании комплексного средства администрирования и мониторинга, не предусмотренного техническим заданием, то в этом случае следует менять техническое задание, а не идти на поводу у заказчика. В сложной системе отслеживать критические процессы все равно придется. Внедрять подобные средства в уже готовую систему очень сложно, поскольку исходные данные мониторы часто получают от системных модулей достаточно низкого уровня. Без изменений схемы базы данных здесь тоже вряд ли можно будет обойтись, и нет никакой гарантии, что подобное изменение не ухудшит производительность системы.\nРазработка мониторов - это довольно специфический класс задач: с одной стороны, они должны обрабатывать достаточный объем информации, с другой - не должны существенно влиять на работу других компонентов информационной системы. Это заставляет разработчиков с особой тщательностью подходить к проектированию мониторов и очень аккуратно писать код их модулей.\n\nИнтерфейсы \nИнтерфейсы конечного пользователя - это то, что заказчик критикует в наибольшей степени, в силу того что именно эти части информационной системы он может более или менее квалифицированно оценить - обычно только их он и видит. Это означает, что интерфейсы являются наиболее часто изменяемым элементом информационной системы именно на этапе реализации.\nЧасто изменяемый компонент (компоненты) информационной системы следует изолировать от редко изменяемых компонентов, чтобы одни изменения не влекли за собой другие. Один из приемов подобной изоляции - изоляция запросов к данным от интерфейса следующим образом:\nкаждый из запросов кодируется идентификатором или «закрывается» определенной системной функцией; \nразработчик интерфейса не знает о запросе к данным ничего, кроме параметров атрибутов выборки - их типа и, возможно, количества строк в выборке; \nобработка ошибок в запросах данных представляет собой отдельный модуль; \nобработка ошибок в интерпретации результата запроса также представляет собой отдельный модуль. \nПри обработке результатов запросов данных следует также особое внимание уделить вопросам соответствия типов включающего языка и СУБД, в том числе вопросам точности числовых типов, так как представление их у разных СУБД существенно различается. Кроме того, обратите внимание на запросы к данным, которые используют функции, зависящие от операционной системы, например функции работы с байтами и словами значения атрибута (например, на Intel и SUN SPARC эти функции будут работать по-разному). Типы данных могут быть приведены или явно в запросе функциями приведения cast и встроенными в СУБД функциями, или в функции прикладной программы. Не для всех СУБД неявное преобразование типов дает один и тот же результат, поэтому если информационая система использует данные из нескольких баз данных под управлением разных СУБД, то неявных преобразований типов лучше избегать.\nСледует также установить достаточно жесткие правила для внешнего вида интерфейсов пользователя. Должно создаваться впечатление единого стиля для всех компонентов информационной системы.\n\nВерсии базы данных \nПервую версию базы данных проекта в большинстве случаев создают достаточно быстро - это реализация полностью нормализованной структуры, которую получают на этапе анализа. Основным назначением этой базы данных является обеспечение макетирования, демонстрационных показов, некоторых экспериментов разработчиков и проектировщиков.\nСкрипты создания базы данных и заполнения ее стартовыми данными - это тоже исходный код информационной системы, и на него распространяются правила контроля версий. Следует отметить, что поддерживать версии базы даных на уровне скриптов все же проще, чем на уровне средств выгрузки и загрузки данных, предоставляемых самой СУБД, так как в подавляющем большинстве случаев подобные средства не могут предоставить несколько простых, но необходимых функций:\nпроконтролировать, какие объекты данных и данные имеют место в объектах загрузки A и B, и загрузить в базу данных только «разницу» A и B (произвести обновление версии); \nпроконтролировать, не конфликтуют ли изменения, имеющие место в объектах выгрузки C и D, по сравнению с объектом выгрузки A (произвести слияние версий). \nCASE-инструменты имеют средства контроля версий схемы базы данных, некоторые имеют настройки, позволяющие также контролировать и стартовые данные. Это дает возможность использовать указанные средства для обеспечения контроля версий базы данных.\nКонтроль версий исходного кода триггеров, хранимых процедур надежнее осуществлять путем использования той же системы контроля версий, что принята для хранения исходных текстов самого проекта.\n\nРазмещение логики обработки \nОдим из важных вопросов проектирования является способ размещения бизнес-логики обработки данных: размещать ее (и какую часть) либо на сервере в виде хранимых процедур, пакетов, триггеров, иных ограничений целостности непосредственно на сервере баз данных, либо в виде функций на клиенте (в составе ПО клиента). Местонахождение правил интерфейса и правил данных задано точно: первые всегда размещены на клиенте, вторые - на сервере. Правила бизнес-логики в современных СУБД могут быть размещены как на клиенте, так и на сервере. Рассмотрим один из примеров простейшего бизнес-правила:\nЗначение в поле экранной формы вводится пользователем, а не выбирается из списка, но набор допустимых значений строго ограничен (например, два или три различных значения). \nС одной стороны, пользователь требует немедленной реакции системы на ошибку ввода данных, с другой - недопустимы значения в поле базы данных, отличные от заданных (двух или трех). На самом деле в этой ситуации должны быть реализованы два правила. Правило данных в этом случае будет организовано в виде ограничения check, а правило интерфейса, запрещающее вводить значения, отличные от заданных, будет в точности повторять правило даных, но будет реализовано на уровне интерфейса пользователя. Казалось бы, реализация формы со списком в этом случае является идеальным решением, но большинство операторов предпочитают именно набор в форме, особенно если длина вводимого значения невелика. Формы с большим количеством списков достаточно трудны для обработки конечными пользователями. В случае набора значений в форме следует также позаботиться о приведении регистров строк символов (там, где регистр не существенен) к верхнему или нижнему регистру, на уровне интерфейса прикладной программы.\n\nШаблоны \nИспользование шаблонов и библиотек для построения «похожих» модулей - достаточно распространенная практика. Что использовать в этом случае - объекты и классы или библиотеки - решает конкретная группа разработчиков. Диктовать способ разработки в большинстве случаев бессмысленно, потому что разработчик пишет код так, как умеет или как привык. Эти моменты обычно контролирует руководитель проекта.\nВ любом проекте запрещается копирование кода, поскольку это ведет к возникновению различных версий одного и того же кода в разных фрагментах прикладной программы и, как следствие, к сложно детектируемым и исправляемым ошибкам. Следует установить жесткое правило: используется вызов функции, а не его копия в коде; любое отклонение от данного правила наказуемо.\n\nТестирование \nКак было сказано выше, группы тестирования могут привлекаться уже на ранних стадиях разработки проекта. Собственно комплексное тестирование действительно следует выделять в отдельный этап разработки. В зависимости от сложности проекта тестирование и исправление ошибок могут занимать треть, половину и больше времени разработки всего проекта.\nЧем сложнее проект, тем больше будет потребность в автоматизации системы хранения ошибок - bug tracking. Подобная система обеспечивает следующие функции:\nхранение сообщения об ошибке (с обязательной информацией о том, к какому компоненту системы относится ошибка, кто ее нашел, как ее воспроизвести, кто отвечает за ее исправление и когда она должна быть исправлена); \nсистема уведомления о появлении новых ошибок, об изменении статуса известных в системе ошибок (как правило, это уведомления по электронной почте); \nотчеты об актуальных ошибках по компонентам системы, по интервалам времени, по группам разработчиков и разработчикам; \nинформация об истории ошибки (в том числе отслеживание похожих ошибок, отслеживание повторного возникновения ошибки); \nправила доступа к ошибкам тех или иных категорий; \nинтерфейс ограниченного доступа к системе bug tracking для конечного пользователя информационной системы, который используется как интерфейс обмена информацией между пользователем и службой технической поддержки системы. \nПодобные системы снимают множество организационных проблем, в частности вопросы автоматического уведомления об ошибках.\nСобственно тесты систем можно разделить на несколько категорий:\nавтономные тесты модулей - используются уже на этапе разработки компонентов системы и позволяют отслеживать ошибки отдельных компонентов; \nтесты связей компонентов системы - используются и на этапе разработки, и на этапе тестирования и позволяют отслеживать правильность взаимодействия и обмена информацией компонентов системы; \nсистемный тест - является основным критерием приемки системы. Как правило, это группа тестов, включающая в себя и автономные тесты, и тесты связей и модели. Данный тест должен воспроизводить работу всех компонентов и функций системы, его основная цель - внутренняя приемка системы и оценка ее качества; \nприемо-сдаточный тест - используется при сдаче системы заказчику. Здесь разработчики часто занижают требования к системе по сравнению с системным тестом, и в общем-то понятно, почему это оправданно; \nтесты производительности и нагрузки - входят в системный тест, но достойны отдельного упоминания, так как именно эта группа тестов является основной для оценки надежности системы. \nВ тесты каждой группы обязательно входят тесты моделирования отказов. Здесь проверяется реакция компонента, группы компонентов, системы в целом на отказы следующего типа:\nотказ отдельного компонента информационной системы; \nотказ группы компонентов информационной системы; \nотказ основных модулей информационной системы; \nотказ операционной системы; \n«жесткий» сбой (отказ питания, жестких дисков). \nЭти тесты позволяют оценить качество подсистемы восстановления корректного состояния информационной системы и служат основным источником информации для разработки стратегий предотвращения негативных последствий сбоев при промышленной эксплуатации. Как правило, это тот класс тестов, которым разработчики пренебрегают, а затем борются с последствиями сбоев на промышленной системе.\nЕще одним важным моментом программы тестирования информационных систем является наличие генераторов тестовых данных. Они используются для проведения как тестов функциональности системы, так и тестов надежности системы, а также тестов производительности системы. Задача оценки характеристик зависимости производительности информационной системы от роста объемов обрабатываемой информации не может быть решена без генераторов данных.\n\nЭксплуатация и сопровождение \nОпытная эксплуатация перекрывает процесс тестирования. Как правило, система вводится в эксплуатацию не полностью, постепенно.\nВвод в эксплуатацию проходит по крайней мере три фазы:\nпервоначальная загрузка информации; \nнакопление информации; \nвыход на проектную мощность. \nПервоначальная загрузка информации инициирует довольно узкий круг ошибок - в основном это проблемы рассогласования данных при загрузке и собственные ошибки загрузчиков, то есть то, что не было отслежено на тестовых данных. Подобные ошибки должны быть исправлены как можно быстрее. Не поленитесь поставить отладочную версию системы (если, конечно, вам позволят развернуть весь комплекс сопровождающего отладку информационной системы ПО на месте). Если отладку «на живых» данных производить невозможно, то придется моделировать ситуацию, причем быстро. Здесь требуются очень квалифицированные тестеры.\nВ период накопления информации проявится наибольшее количество ошибок, допущенных при создании информационной системы. Как правило, это ошибки, связанные с многопользовательским доступом. Часто на этапе тестирования таким ошибкам не уделяется должного внимания - видимо, из-за сложности моделирования и дороговизны средств автоматизации процесса тестирования информационной системы в условиях многопользовательского доступа . Некоторые ошибки исправить будет довольно сложно, так как они являются ошибками проектирования. Ни один самый хороший проект от них не застрахован. Это значит, что на всякий случай надо резервировать время на локализацию и исправление таких ошибок.\nВторая категория исправлений связана с тем, что пользователя не устраивает интерфейс. Здесь не всегда нужно выполнять абсолютно все пожелания пользователя, иначе процесс ввода в эксплуатацию не кончится никогда.\nВ период накопления информации можно столкнуться со знаменитым «упала база». При самом плохом раскладе окажется, что СУБД не выдерживает потока информации. При хорошем - просто параметры конфигурации неверны. Первый случай опасен, так как повлиять на производителя СУБД довольно сложно, а заказчик очень не любит ссылок на службу технической поддержки СУБД. Решать проблему отказа СУБД придется не производителю, а вам - менять схему, снижать поток запросов, менять сами запросы; в общем - вариантов много. Хорошо, если время восстановления базы вписывается в запланированное.\nВыход системы на проектную мощность при удачном стечении обстоятельств - это исправление ряда мелких ошибок, и изредка - ошибок серьезных.\n\nДругие подходы к разработке приложений \nКак правило, конечные пользователи и руководство полагают, что процесс проектирования не дал никаких результатов, поскольку отсутствуют готовые компоненты, которые можно было бы «пощупать». Зачастую заказчик настаивает на досрочном проведении этапа реализации проекта, для того чтобы как можно быстрее получить какой-то результат и продемонстрировать его. В таком случае существует большой соблазн выбрать ускоренную разработку приложений (УРП) или совместную разработку приложений (СРП). Подобные методы предусматривают разработку рабочего прототипа с последующей демонстрацией его пользователям. Пользователи отмечают, что им нравится, а что - нет. Проектировщик дорабатывает прототип с учетом сделанных замечаний, после чего снова демонстрирует то, что получилось. И так далее. Процесс повторяется до тех пор, пока пользователям не понравится то, что они видят, а прототип не станет рабочим приложением. Обычно устанавливается лимит времени и количество итераций, иначе пользователи будут совершенствовать прототип вечно. Теоретически это позволяет получить ту систему, которая требуется пользователям. На практике подобный подход к разработке приложений сопряжен с серьезными проблемами.\nВсе внимание сконцентрировано на экранных формах, а то, что касается правил обработки данных и системных функций, остается за кадром. Есть соблазн начать работу с отчетов, в то время как отчет является не стартовым, а производным продуктом информационной системы. \nПользователи полагают, что если вариант прототипа согласован, то модуль готов. На самом деле это может быть всего лишь картинка с набором «заглушек» для вызовов системных функций и взаимодействия с другими модулями. \nМодули проектируются изолированно друг от друга (наверное, большинство из вас сталкивались с бухгалтерскими программами, где каждый АРМ является автономным и функции часто дублируются). Следствием этого являются противоречия модулей, дублирование функций и данных, что может быть выявлено только при тестировании комплекса модулей. \nФункциональные возможности наращиваются параллельно в нескольких направлениях, значит, структура базы данных должна контролироваться жестко. При УРП схема базы данных превращается в свалку, где таблицы «лепятся» наскоро, в результате чего имеет место набор противоречивых и дублирующихся данных. \nДокументация при использовании метода УРП, как правило, отсутствует, а вернее, о необходимости документировать систему забывают, поскольку создается иллюзия, что пользователь и без того понимает, что происходит. Когда же приложение начинает работать не так, как предполагает пользователь, возникает масса проблем. \nОбработка исключительных ситуаций для каждого модуля производится своя. \nЦелостная система, как правило, не получается, скорее всего, это будет некий набор автоматизированных рабочих мест, наскоро связанных между собой. \nМетоды УРП и СРП можно использовать далеко не всегда, а лишь в том случае, если:\nобъем проекта и требования бизнеса четко определены, не изменяются, а сам проект невелик; \nпроект не зависит от других средств автоматизации бизнеса, количество внешних интерфейсов, с которыми придется иметь дело, ограниченно; \nсистема ориентирована на экранные формы, обработка данных и системные функции составляют незначительную часть, удобство экранных форм входит в пятерку важнейших факторов успеха проекта; \nпользователи имеют высокую квалификацию и априори положительно оценивают идею создания нового ПО. \nТем не менее методом УРП лучше разрабатывать небольшие и, желательно, автономные части проекта.\nВ настоящее время предпринята попытка представить еще один способ быстрого написания проекта - метод экстремального программирования. Ниже будут рассмотрены принципы данного подхода.\nЭтап планирования (planning game). На основании оценок, сделанных программистами, заказчик определяет функциональные возможности и срок реализации версий системы. Программисты реализуют только те функции, которые необходимы для возможностей, выбранных на данной итерации.\nВ результате такого решения «за кадром» остается развитие системы, вследствие чего при разработке возникает необходимость строить «заглушки» и переписывать код. Непонятно, почему срок реализации определяет заказчик, ведь на самом деле это прямая обязанность группы проектировщиков. Заказчик, вообще говоря, может лишь выразить свои пожелания по поводу сроков («хочу, чтобы к такому-то числу»), но определить срок может только проектировщик («выполнимо не меньше чем за такое-то время»).\nЧастая смена версий (small releases). Систему запускают в эксплуатацию уже через несколько месяцев после начала реализации, не дожидаясь окончательного разрешения всех поставленных проблем. Выпуск новых версий может происходить с периодичностью от ежедневного до ежемесячного.\nВсе хорошо, кроме одного: протестировать за такой срок более или менее сложный компонент невозможно. Заказчик фактически выступает в роли бета-тестера. В этом случае он может видеть, что разработчики трудятся и даже ошибки исправляют. Однако возникают резонные вопросы: стоит ли посвящать заказчика в рабочий процесс и нужно ли ставить эксперименты на рабочей системе? В дополнение к сказанному необходимо отметить, что подобный принцип вряд ли может быть реализован для частей проекта, которые требуют работы в режиме 24x7.\nМетафора (metaphor). Общий вид системы определяется при помощи метафоры или набора метафор, над которыми совместно работают заказчик и программисты.\nС одной стороны, этот постулат кажется неплохим, а с другой - имеет ли смысл посвящать заказчика во внутренние дела группы разработчиков? То, что касается общего вида (интерфейсы, отчеты и т.п.), действительно может находиться в компетенции заказчика, но когда речь идет об особенностях реализации тех или иных компонентов, заказчик вряд ли может быть полезен из-за отсутствия у него необходимых знаний.\nПростой проект (simple design). В каждый момент времени разрабатываемая система выполняет все тесты и поддерживает все взаимосвязи, определяемые программистом, не имеет дубликатов кода и содержит минимально возможное количество классов и методов. Это правило кратко можно выразить так: «Каждую мысль формулируй один и только один раз».\nЭта мысль тоже хороша, но она не вполне согласуется с принципом быстрого написания кода. Может быть, стоит все-таки сначала подумать, как делать тот или иной модуль, группу модулей, и лишь потом заняться написанием кода?\nТесты (tests). Программисты постоянно пишут тесты для модулей (unit tests). Собранные вместе, эти тесты должны работать корректно. Для этапов в итерации заказчики пишут функциональные тесты (functional tests), которые также должны работать правильно. Однако на практике это не всегда достижимо. Чтобы принять правильное решение, необходимо понять, во сколько обойдется сдача системы с заранее известным дефектом, и сравнить это с ценой задержки на исправление дефекта.\nПри написании тестов самими программистами (особенно в условиях сверхурочных работ) эти тесты не полнофункциональны, и уж тем более не учитывают особенностей многопользовательской работы. На более продвинутые тесты у разработчиков обычно не хватает времени. Можно, конечно, построить систему разработки так, что всем будут заниматься одни и те же люди, но все-таки не стоит превращать проект в аналог телепередачи «Сам себе режиссер». К сказанному необходимо добавить, что тестирование системы вовсе не исчерпывается тестами компонентов (units); не менее важны тесты взаимодействия между ними, это же относится и к тестам надежности работы. И тем не менее метод экстремального программирования не предусматривает создания тестов данного класса. Это объясняется тем, что сами такие тесты могут представлять достаточно сложный код (особенно это касается тестов-имитаторов реальной работы системы). В данной технологии также никак не учитывается еще один важный класс тестов - тесты поведения системы при росте объемов обрабатываемой информации. При высокой скорости изменения версий выполнить такой тест технологически невозможно, поскольку его проведение требует стабильного и неизменного кода проекта, например, в течение недели. Подобные сроки, вообще говоря, не гарантируются из-за частой смены версий. В таком случае придется или приостанавливать разработку компонентов, или на время проведения теста создавать параллельную версию проекта, которая будет сохраняться неизменной, тогда как вторая при этом будет изменяться. Потом нужно будет выполнять процесс слияния кода. Но в этом случае тест придется создавать снова, так как методы экстремального программирования просто не предусматривают разработку средств, позволяющих прогнозировать поведение системы при тех или иных изменениях.\nПереработка системы (refactoring). Архитектура системы постоянно эволюционирует. Текущий проект трансформируется, при этом гарантируется правильное выполнение всех тестов.\nВот тут-то и начинается самое интересное. Экстремальное программирование исходит из того, что переделать всегда можно, причем без особых затрат. Однако практика свидетельствует об обратном.\nПрограммирование в паре (pair programming). Весь код проекта пишут два человека, которые используют одну настольную систему.\nВозникает вопрос: кто-нибудь видел двух совершенно одинаковых программистов, каждый из которых к тому же в конце рабочего дня успевал бы писать документацию для напарника? Можно ли найти таких программистов-близнецов, согласных во всем?\nА главное, зачем нужна такая пара программистов? Причина, в общем-то, простая: не все выдерживают навязываемый при экстремальном программировании высокий темп работ, неизбежен отток персонала. Подобная пара может дать некую страховку - если уволится один, то, может быть, второй доведет дело до конца. Правда, оставшийся попадет в еще более жесткие временные рамки - ведь объем работ останется прежним же, а дублера уже не будет, по крайней мере какое-то время. Далее следует естественный процесс передачи информации новому дублеру, что опять-таки требует времени. И так без конца.\nНепрерывная интеграция (continuous integration). Новый код интегрируется в существующую систему не позднее, чем через несколько часов. После этого система вновь собирается в единое целое и прогоняются все тесты. Если хотя бы один из них не выполняется корректно, внесенные изменения отменяются.\nЭтот постулат предоставляется по меньшей мере спорным, поскольку непонятно, кто будет исправлять ошибки, причем не только локальные, но и наведенные неправильным кодом. Ведь проведение комплексных тестов не предполагается на данном этапе, кроме того, изменения остаются даже в том случае, когда ошибка детектирована. В то же самое время метод экстремального программирования не предусматривает наличия системы отслеживания ошибок.\nКоллективное владение (collective ownership). Каждый программист имеет возможность в любое время усовершенствовать любую часть кода в системе, если сочтет это необходимым.\nВам это анархию не напоминает? Как в этом случае искать автора изменений? Встречал ли кто-либо при разработке большого проекта такого «на все руки доку» и сколько подобный «умелец» сумел бы продержаться на своем рабочем месте? Правильно, не слишком долго.\nЗаказчик с постоянным участием (on-site customer). Заказчик, который в период работы над системой находится в команде разработчиков.\nЭто, конечно, хорошо, но непонятна цель: то ли посвятить заказчика в суть дела, то ли сделать его соавтором? Вряд ли только у заказчика найдется столь высококвалифицированный специалист.\n40-часовая неделя (40-hour weeks). Объем сверхурочных работ не может превышать по длительности одну рабочую неделю. Даже отдельные случаи сверхурочных работ, повторяющиеся слишком часто, являются сигналом серьезных проблем, которые требуют безотлагательного решения.\nКак показывает практика применения экстремального программирования (несмотря на целый ряд положительных примеров, приводимых сторонниками данного метода), сверхурочные при таком подходе - это правило, а не исключение, и борьба с проблемами в данном случае - явление постоянное. Усиливается она в период замены текущей сырой версии продукта очередной, опять же сырой, версией. Заказчик, посвященный в процесс, испытывает все прелести проявления ошибок работы системы на себе. Как вы думаете, надолго ли хватит у заказчика терпения при таком положении дел? Ему ведь надо, чтобы система работала...\nОткрытое рабочее пространство (open workspace). Команда разработчиков располагается в большом помещении, окруженном комнатами меньшей площади. В центре рабочего пространства устанавливаются компьютеры, на которых работают пары программистов.\nПричем все это, судя по предыдущим принципам, должно располагаться на территории заказчика, раз он весьма активно привлекается к процессу разработки. Возникает вопрос: реально ли столь удачное стечение обстоятельств?\nНе более чем правила (just rules). Члены коллектива, работающего по технологии экстремального программирования, обязуются выполнять изложенные правила. Однако это не более чем правила и команда может в любой момент поменять их, если ее члены достигли принципиального соглашения по поводу внесенных изменений.\nМожет быть, в конце концов и будет выработано одно полезное правило: «сначала подумай, потом сделай». В этом случае мы будем иметь схему, весьма похожую на «водопад». Почему-то сторонники экстремального программирования убеждены, что при использовании «водопада» и его клонов цикл разработки обязательно должен быть длинным. Непонятно, чем обусловлена такая уверенность. Ведь не запрещено дробить проект на этапы. Почему-то считается, что планирование обязательно будет одноразовым и неизменным, хотя на самом деле это не соответствует истине, в том числе и в случае «водопада».\nВ итоге мы получаем метод, потенциально обладающий высокой адаптируемостью к сильно изменяющимся требованиям к проекту, но в то же время не свободный от ряда серьезных недостатков. Последнее обстоятельство не позволяет рекомендовать данный метод к применению для проектов, требующих высокой или как минимум достаточной надежности работы.\n",
|
||
"1"
|
||
],
|
||
[
|
||
"39",
|
||
"Этапы разработки проекта5.docx",
|
||
"Этапы разработки проекта: стратегия и анализ\nВведение\nПроектирование информационных систем всегда начинается с определения цели проекта. Основная задача любого успешного проекта заключается в том, чтобы на момент запуска системы и в течение всего времени ее эксплуатации можно было обеспечить:\nтребуемую функциональность системы и степень адаптации к изменяющимся условиям ее функционирования; \nтребуемую пропускную способность системы; \nтребуемое время реакции системы на запрос; \nбезотказную работу системы в требуемом режиме, иными словами - готовность и доступность системы для обработки запросов пользователей; \nпростоту эксплуатации и поддержки системы; \nнеобходимую безопасность. \nПроизводительность является главным фактором, определяющим эффективность системы. Хорошее проектное решение служит основой высокопроизводительной системы.\nПроектирование информационных систем охватывает три основные области:\nпроектирование объектов данных, которые будут реализованы в базе данных; \nпроектирование программ, экранных форм, отчетов, которые будут обеспечивать выполнение запросов к данным; \nучет конкретной среды или технологии, а именно: топологии сети, конфигурации аппаратных средств, используемой архитектуры (файл-сервер или клиент-сервер), параллельной обработки, распределенной обработки данных и т.п. \nВ реальных условиях проектирование - это поиск способа, который удовлетворяет требованиям функциональности системы средствами имеющихся технологий с учетом заданных ограничений.\nК любому проекту предъявляется ряд абсолютных требований, например максимальное время разработки проекта, максимальные денежные вложения в проект и т.д. Одна из сложностей проектирования состоит в том, что оно не является такой структурированной задачей, как анализ требований к проекту или реализация того или иного проектного решения.\nСчитается, что сложную систему невозможно описать в принципе. Это, в частности, касается систем управления предприятием. Одним из основных аргументов является изменение условий функционирования системы, например директивное изменение тех или иных потоков информации новым руководством. Еще один аргумент - объемы технического задания, которые для крупного проекта могут составлять сотни страниц, в то время как технический проект может содержать ошибки. Возникает вопрос: а может, лучше вообще не проводить обследования и не делать никакого технического проекта, а писать систему «с чистого листа» в надежде на то, что произойдет некое чудесное совпадение желания заказчика с тем, что написали программисты, а также на то, что все это будет стабильно работать?\nЕсли разобраться, то так ли уж непредсказуемо развитие системы и действительно ли получить информацию о ней невозможно? Вероятно, представление о системе в целом и о предполагаемых (руководством) путях ее развития можно получить посредством семинаров. После этого разбить сложную систему на более простые компоненты, упростить связи между компонентами, предусмотреть независимость компонентов и описать интерфейсы между ними (чтобы изменение одного компонента автоматически не влекло за собой существенного изменения другого компонента), а также возможности расширения системы и «заглушки» для нереализуемых в той или иной версии системы функций. Исходя из подобных элементарных соображений описание того, что предполагается реализовать в информационной системе, уже не кажется столь нереальным. Можно придерживаться классических подходов к разработке информационных систем, один из которых - схема «водопада» (рис. 1) - описан ниже. Кратко будут рассмотрены и некоторые другие подходы к разработке информационных систем, где использование элементов, описанных в схеме «водопада», также допустимо. Какого подхода из описываемых ниже придерживаться (и есть ли смысл придумывать собственный подход) - в какой-то мере дело вкуса и обстоятельств.\nЖизненный цикл программного обеспечения представляет собой модель его создания и использования. Модель отражает его различные состояния, начиная с момента возникновения необходимости в данном ПО и заканчивая моментом его полного выхода из употребления у всех пользователей. Известны следующие модели жизненного цикла:\nКаскадная модель. Переход на следующий этап означает полное завершение работ на предыдущем этапе. \nПоэтапная модель с промежуточным контролем. Разработка ПО ведется итерациями с циклами обратной связи между этапами. Межэтапные корректировки позволяют уменьшить трудоемкость процесса разработки по сравнению с каскадной моделью; время жизни каждого из этапов растягивается на весь период разработки. \nСпиральная модель. Особое внимание уделяется начальным этапам разработки - выработке стратегии, анализу и проектированию, где реализуемость тех или иных технических решений проверяется и обосновывается посредством создания прототипов (макетирования). Каждый виток спирали предполагает создание некой версии продукта или какого-либо его компонента, при этом уточняются характеристики и цели проекта, определяется его качество и планируются работы следующего витка спирали. \nНиже мы рассмотрим некоторые схемы разработки проекта.\n\n«Водопад» - схема разработки проекта\nОчень часто проектирование описывают как отдельный этап разработки проекта между анализом и разработкой. Однако в действительности четкого деления этапов разработки проекта нет - проектирование, как правило, не имеет явно выраженного начала и окончания и часто продолжается на этапах тестирования и реализации. Говоря об этапе тестирования, также следует отметить, что и этап анализа, и этап проектирования содержат элементы работы тестеров, например для получения экспериментального обоснования выбора того или иного решения, а также для оценки критериев качества получаемой системы. На этапе эксплуатации уместен разговор и о сопровождении системы.\nНиже мы рассмотрим каждый из этапов, подробнее остановившись на этапе проектирования.\n\nСтратегия\nОпределение стратегии предполагает обследование системы. Основная задача обследования - оценка реального объема проекта, его целей и задач, а также получение определений сущностей и функций на высоком уровне.\nНа этом этапе привлекаются высококвалифицированные бизнес-аналитики, которые имеют постоянный доступ к руководству фирмы; этап предполагает тесное взаимодействие с основными пользователями системы и бизнес-экспертами. Основная задача взаимодействия - получить как можно более полную информацию о системе (полное и однозначное понимание требований заказчика) и передать данную информацию в формализованном виде системным аналитикам для последующего проведения этапа анализа. Как правило, информация о системе может быть получена в результате бесед или семинаров с руководством, экспертами и пользователями. Таким образом определяются суть данного бизнеса, перспективы его развития и требования к системе.\nПо завершении основной стадии обследования системы технические специалисты формируют вероятные технические подходы и приблизительно рассчитывают затраты на аппаратное обеспечение, закупаемое программное обеспечение и разработку нового программного обеспечения (что, собственно, и предполагается проектом).\nРезультатом этапа определения стратегии является документ, где четко сформулировано, что получит заказчик, если согласится финансировать проект; когда он получит готовый продукт (график выполнения работ); сколько это будет стоить (для крупных проектов должен быть составлен график финансирования на разных этапах работ). В документе должны быть отражены не только затраты, но и выгода, например время окупаемости проекта, ожидаемый экономический эффект (если его удается оценить).\nВ документе обязательно должны быть описаны:\nограничения, риски, критические факторы, влияющие на успешность проекта, например время реакции системы на запрос является заданным ограничением, а не желательным фактором; \nсовокупность условий, при которых предполагается эксплуатировать будущую систему: архитектура системы, аппаратные и программные ресурсы, предоставляемые системе, внешние условия ее функционирования, состав людей и работ, которые обеспечивают бесперебойное функционирование системы; \nсроки завершения отдельных этапов, форма сдачи работ, ресурсы, привлекаемые в процессе разработки проекта, меры по защите информации; \nописание выполняемых системой функций; \nбудущие требования к системе в случае ее развития, например возможность работы пользователя с системой с помощью Интернета и т.п.; \nсущности, необходимые для выполнения функций системы; \nинтерфейсы и распределение функций между человеком и системой; \nтребования к программным и информационным компонентам ПО, требования к СУБД (если проект предполагается реализовывать для нескольких СУБД, то требования к каждой из них, или общие требования к абстрактной СУБД и список рекомендуемых для данного проекта СУБД, которые удовлетворяют заданным условиям); \nчто не будет реализовано в рамках проекта. \nВыполненная на данном этапе работа позволяет ответить на вопрос, стоит ли продолжать данный проект и какие требования заказчика могут быть удовлетворены при тех или иных условиях. Может оказаться, что проект продолжать не имеет смысла, например из-за того, что те или иные требования не могут быть удовлетворены по каким-то объективным причинам. Если принимается решение о продолжении проекта, то для проведения следующего этапа анализа уже имеются представление об объеме проекта и смета затрат.\nСледует отметить, что и на этапе выбора стратегии, и на этапе анализа, и при проектировании независимо от метода, применяемого при разработке проекта, всегда следует классифицировать планируемые функции системы по степени важности. Один из возможных форматов представления такой классификации - MoSCoW - предложен в Clegg, Dai and Richard Barker, Case Method Fast-track: A RAD Approach, Adison-Wesley, 1994.\nЭта аббревиатура расшифровывается так: Must have - необходимые функции; Should have - желательные функции; Could have - возможные функции; Won’t have - отсутствующие функции.\nФункции первой категории обеспечивают критичные для успешной работы системы возможности.\nРеализация функций второй и третьей категорий ограничивается временными и финансовыми рамками: разрабатываем то, что необходимо, а также максимально возможное в порядке приоритета число функций второй и третьей категорий.\nПоследняя категория функций особенно важна, поскольку необходимо четко представлять границы проекта и набор функций, которые будут отсутствовать в системе.\n\nАнализ\nЭтап анализа предполагает подробное исследование бизнес-процессов (функций, определенных на этапе выбора стратегии) и информации, необходимой для их выполнения (сущностей, их атрибутов и связей (отношений)). На этом этапе создается информационная модель, а на следующем за ним этапе проектирования - модель данных.\nВся информация о системе, собранная на этапе определения стратегии, формализуется и уточняется на этапе анализа. Особое внимание следует уделить полноте переданной информации, анализу информации на предмет отсутствия противоречий, а также поиску неиспользуемой вообще или дублирующейся информации. Как правило, заказчик не сразу формирует требования к системе в целом, а формулирует требования к отдельным ее компонентам. Уделите внимание согласованности этих компонентов.\nАналитики собирают и фиксируют информацию в двух взаимосвязанных формах:\nфункции - информация о событиях и процессах, которые происходят в бизнесе; \nсущности - информация о вещах, имеющих значение для организации и о которых что-то известно. \nДвумя классическими результатами анализа являются:\nиерархия функций, которая разбивает процесс обработки на составные части (что делается и из чего это состоит); \nмодель «сущность-связь» (Entry Relationship model, ER-модель), которая описывает сущности, их атрибуты и связи (отношения) между ними. \nЭти результаты являются необходимыми, но не достаточными. К достаточным результатам следует отнести диаграммы потоков данных и диаграммы жизненных циклов сущностей. Довольно часто ошибки анализа возникают при попытке показать жизненный цикл сущности на диаграмме ER.\nНиже мы рассмотрим три наиболее часто применяемые методологии структурного анализа:\nдиаграммы «сущность-связь» (Entity-Relationship Diagrams, ERD), которые служат для формализации информации о сущностях и их отношениях; \nдиаграммы потоков данных (Data Flow Diagrams, DFD), которые служат для формализации представления функций системы; \nдиаграммы переходов состояний (State Transition Diagrams, STD), которые отражают поведение системы, зависящее от времени; диаграммы жизненных циклов сущностей относятся именно к этому классу диаграмм. \n\nER-диаграммы\nER-диаграммы (рис. 2) используются для разработки данных и представляют собой стандартный способ определения данных и отношений между ними. Таким образом, осуществляется детализация хранилищ данных. ER-диаграмма содержит информацию о сущностях системы и способах их взаимодействия, включает идентификацию объектов, важных для предметной области (сущностей), свойств этих объектов (атрибутов) и их отношений с другими объектами (связей). Во многих случаях информационная модель очень сложна и содержит множество объектов.\nСущность изображается в виде прямоугольника, вверху которого располагается имя сущности (например, TITLES). В прямоугольнике могут быть перечислены атрибуты сущности; атрибуты ER-диаграмм, набранные полужирным шрифтом1, являются ключевыми (так Title Identity - ключевой атрибут сущности TITLES, остальные атрибуты ключевыми не являются).\nОтношение изображается линией между двумя сущностями (синие линии на рисунке).\nОдиночная линия справа (рис. 3) означает «один», «птичья лапка» слева - «многие», а отношение читается вдоль линии, например «один ко многим». Вертикальная черта означает «обязательно», кружок - «не обязательно», например для каждого издания в TITLE обязательно должен быть указан издатель в PUBLISHERS, а один издатель в PUBLISHERS может выпускать несколько наименований изданий в TITLES. Следует отметить, что связи всегда комментируются (надпись на линии, изображающей связь).\n\nРис. 3. Элемент ER-диаграммы\nПриведем также пример (рис. 4) изображения рефлексивного отношения «сотрудник», где один сотрудник может руководить несколькими подчиненными и так далее вниз по иерархии должностей.\nСледует обратить внимание на то, что такое отношение всегда является необязательным, в противном случае это будет бесконечная иерархия.\nАтрибуты сущностей могут быть ключевыми - они выделяются полужирным шрифтом; обязательными - перед ними ставится знак «*», то есть их значение всегда известно, необязательными (optional) - перед ними ставится О, то есть значения этого атрибута в какие-то моменты могут отсутствовать или быть неопределенными.\n\nДуги\nЕсли сущность имеет набор взаимоисключающих отношений с другими сущностями, то говорят, что такие отношения находятся в дуге. Например, банковский счет может быть оформлен или для юридического лица, или для физического лица. Фрагмент ER-диаграммы для такого типа отношений приведен на рис. 5.\nВ этом случае атрибут ВЛАДЕЛЕЦ сущности СЧЕТ имеет особое значение для данной сущности - сущность делится на типы по категориям: «для физического лица» и «для юридического лица». Полученные в результате сущности называют подтипами, а исходная сущность становится супертипом. Чтобы понять, нужен супертип или нет, надо установить, сколько одинаковых свойств имеют различные подтипы. Следует отметить, что злоупотребление подтипами и супертипами является довольно распространенной ошибкой. Изображают их так, как показано на рис. 6.\n\nНормализация\nЧтобы не допустить аномалий при обработке данных, используют нормализацию. Принципы нормализации для объектов информационной модели в точности такие же, как и для моделей данных.\nДопустимые типы связей. При ближайшем рассмотрении связи типа «один к одному» (рис. 7) почти всегда оказывается, что A и B представляют собой в действительности разные подмножества одного и того же предмета или разные точки зрения на него, просто имеющие отличные имена и по-разному описанные связи и атрибуты.\nСвязи «многие к одному» представлены на рис. 8.\nI - достаточно сильная конструкция, предполагающая, что вхождение сущности B не может быть создано без одновременного создания по меньшей мере одного связанного с ним вхождения сущности A.\nII - это наиболее часто встречающаяся форма связи. Она предполагает, что каждое и любое вхождение сущности A может существовать только в контексте одного (и только одного) вхождения сущности B. В свою очередь, вхождения B могут существовать как в связи с вхождениями A, так и без нее.\nIII - применяется редко. Как A, так и B могут существовать без связи между ними.\nСвязи «многие ко многим» представлены на рис. 9.\nI - такая конструкция часто имеет место в начале этапа анализа и означает связь - либо понятую не до конца и требующую дополнительного разрешения, либо отражающую простое коллективное отношение - двунаправленный список.\nII - применяется редко. Такие связи всегда подлежат дальнейшей детализации.\nРассмотрим теперь рекурсивные связи (рис. 10).\nI - редко, но имеет место. Отражает связи альтернативного типа.\nII - достаточно часто применяется для описания иерархий с любым числом уровней.\nIII - имеет место на ранних этапах. Часто отражает структуру «перечня материалов» (взаимная вложенность компонентов). Пример: каждый КОМПОНЕНТ может состоять из одного и более (других) КОМПОНЕНТОВ и каждый КОМПОНЕНТ может использоваться в одном и более (других) КОМПОНЕНТОВ.\nНедопустимые типы связей. К недопустимым типам связей относятся следующие: обязательная связь «многие ко многим» (рис. 11) и ряд рекурсивных связей (рис. 12).\nОбязательная связь «многие ко многим» в принципе невозможна. Такая связь означала бы, что ни одно из вхождений A не может существовать без B, и наоборот. На деле каждая подобная конструкция всегда оказывается ошибочной.\n\nДиаграммы потоков данных \nЛогическая DFD (рис. 13) показывает внешние по отношению к системе источники и стоки (адресаты) данных, идентифицирует логические функции (процессы) и группы элементов данных, связывающие одну функцию с другой (потоки), а также идентифицирует хранилища (накопители) данных, к которым осуществляется доступ. Структуры потоков данных и определения их компонентов хранятся и анализируются в словаре данных. Каждая логическая функция (процесс) может быть детализирована с помощью DFD нижнего уровня; когда дальнейшая детализация перестает быть полезной, переходят к выражению логики функции при помощи спецификации процесса (мини-спецификации). Содержимое каждого хранилища также сохраняют в словаре данных, модель данных хранилища раскрывается с помощью ER-диаграмм.\nВ частности, в DFD не показываются процессы, которые управляют собственно потоком данных и не приводятся различия между допустимыми и недопустимыми путями. DFD содержат множество полезной информации, а кроме того:\nпозволяют представить систему с точки зрения данных; \nиллюстрируют внешние механизмы подачи данных, которые потребуют наличия специальных интерфейсов; \nпозволяют представить как автоматизированные, так и ручные процессы системы; \nвыполняют ориентированное на данные секционирование всей системы. \nПотоки данных используются для моделирования передачи информации (или даже физических компонентов) из одной части системы в другую. Потоки на диаграммах изображаются именованными стрелками, стрелки указывают направление движения информации. Иногда информация может двигаться в одном направлении, обрабатываться и возвращаться в ее источник. Такая ситуация может моделироваться либо двумя различными потоками, либо одним двунаправленным.\nПроцесс преобразует входной поток данных в выходной в соответствии с действием, задаваемым именем процесса. Каждый процесс должен иметь уникальный номер для ссылок на него внутри диаграммы. Этот номер может использоваться совместно с номером диаграммы для получения уникального индекса процесса во всей модели.\nХранилище данных (data storage) позволяет на ряде участков определять данные, которые будут сохраняться в памяти между процессами. Фактически хранилище представляет «срезы» потоков данных во времени. Информацию, которую оно содержит, можно использовать в любое время после ее определения, при этом данные могут выбираться в произвольном порядке. Имя хранилища должно идентифицировать его содержимое. В случае когда поток данных входит (выходит) в (из) хранилище и его структура соответствует структуре хранилища, он должен иметь то же самое имя, которое нет необходимости отражать на диаграмме.\nВнешняя сущность (терминатор) представляет сущность вне контекста системы, являющуюся источником или приемником системных данных. Ее имя должно содержать существительное, например «Клиент». Предполагается, что объекты, представленные такими узлами, не должны участвовать ни в какой обработке.\n\nДиаграммы изменения состояний STD\nЖизненный цикл сущности относится к классу STD-диаграмм (рис. 14). Эта диаграмма отражает изменение состояния объекта с течением времени. Например, рассмотрим состояние товара на складе: товар может быть заказан у поставщика, поступить на склад, храниться на складе, проходить контроль качества, может быть продан, забракован, возвращен поставщику. Стрелки на диаграмме показывают допустимые изменения состояний.\nСуществует несколько различных вариантов изображения подобных диаграмм, на рисунке приведен лишь один из них.\n\nНекоторые принципы проверки качества и полноты информационной модели \n(источник - Richard Barker, Case Method: Entity Relationship Modelling, Addison-Wesley, 1990)\nЕсли вы хотите создать качественную модель, то придется прибегать к помощи аналитиков, хорошо владеющих CASE-технологией. Однако это не означает, что построением и контролем информационной модели должны заниматься только аналитики. Помощь коллег также может оказаться весьма полезной. Привлекайте их к проверке поставленной цели и к детальному изучению построенной модели как с точки зрения логики, так и с точки зрения учета аспектов предметной области. Большинство людей легче находят недостатки в чужой работе.\nРегулярно представляйте вашу информационную модель или ее отдельные фрагменты, относительно которых у вас возникают сомнения, на одобрение пользователей. Особое внимание уделяйте исключениям из правил и ограничениям.\n\nКачество сущностей\nОсновной гарантией качества сущности является ответ на вопрос, действительно ли объект является сущностью, то есть важным объектом или явлением, информация о котором должна храниться в базе данных.\nСписок проверочных вопросов для сущности:\nОтражает ли имя сущности суть данного объекта? \nНет ли пересечения с другими сущностями? \nИмеются ли хотя бы два атрибута? \nВсего атрибутов не более восьми? \nЕсть ли синонимы/омонимы данной сущности? \nСущность определена полностью? \nЕсть ли уникальный идентификатор? \nИмеется ли хотя бы одна связь? \nСуществует ли хотя бы одна функция по созданию, поиску, корректировке, удалению, архивированию и использованию значения сущности? \nВедется ли история изменений? \nИмеет ли место соответствие принципам нормализации данных? \nНет ли такой же сущности в другой прикладной системе, возможно, под другим именем? \nНе имеет ли сущность слишком общий смысл? \nДостаточен ли уровень обобщения, воплощенный в ней? \nСписок проверочных вопросов для подтипа:\nОтсутствуют ли пересечения с другими подтипами? \nИмеет ли подтип какие-нибудь атрибуты и/или связи? \nИмеют ли они все свои собственные уникальные идентификаторы или наследуют один на всех от супертипа? \nИмеется ли исчерпывающий набор подтипов? \nНе является ли подтип примером вхождения сущности? \nЗнаете ли вы какие-нибудь атрибуты, связи и условия, отличающие данный подтип от других? \n\nКачество атрибутов\nСледует выяснить, а действительно ли это атрибуты, то есть описывают ли они тем или иным образом данную сущность.\nСписок проверочных вопросов для атрибута:\nЯвляется ли наименование атрибута существительным единственного числа, отражающим суть обозначаемого атрибутом свойства? \nНе включает ли в себя наименование атрибута имя сущности (этого быть не должно)? \nИмеет ли атрибут только одно значение в каждый момент времени? \nОтсутствуют ли повторяющиеся значения (или группы)? \nОписаны ли формат, длина, допустимые значения, алгоритм получения и т.п.? \nНе может ли этот атрибут быть пропущенной сущностью, которая пригодилась бы для другой прикладной системы (уже существующей или предполагаемой)? \nНе может ли он быть пропущенной связью? \nНет ли где-нибудь ссылки на атрибут как на «особенность проекта», которая при переходе на прикладной уровень должна исчезнуть? \nЕсть ли необходимость в истории изменений? \nЗависит ли его значение только от данной сущности? \nЕсли значение атрибута является обязательным, всегда ли оно известно? \nЕсть ли необходимость в создании домена для этого и ему подобных атрибутов? \nЗависит ли его значение только от какой-то части уникального идентификатора? \nЗависит ли его значение от значений некоторых атрибутов, не включенных в уникальный идентификатор? \n\nКачество связи\nНужно выяснить, отражают ли связи действительно важные отношения, наблюдаемые между сущностями.\nСписок проверочных вопросов для связи:\nИмеется ли ее описание для каждой участвующей стороны, точно ли оно отражает содержание связи и вписывается ли в принятый синтаксис? \nУчаствуют ли в ней только две стороны? \nНе является ли связь переносимой?\nЗаданы ли степень связи и обязательность для каждой стороны? \nДопустима ли конструкция связи? \nНе относится ли конструкция связи к редко используемым?\nНе является ли она избыточной? \nНе изменяется ли она с течением времени? \nЕсли связь обязательная, всегда ли она отражает отношение к сущности, представляющей противоположную сторону? \nДля исключающей связи:\nВсе ли концы связей, покрываемые исключающей дугой, имеют один и тот же тип обязательности? \nВсе ли из них относятся к одной и той же сущности? \nОбычно дуги пересекают разветвляющиеся концы - что вы можете сказать о данном случае? \nСвязь может покрываться только одной дугой. Так ли это? \nВсе ли концы связей, покрываемые дугой, входят в уникальный идентификатор? \n\nФункции системы\nЧасто аналитикам приходится описывать достаточно сложные бизнес-процессы. В этом случае прибегают к функциональной декомпозиции, которая показывает разбиение одного процесса на ряд более мелких функций до тех пор, пока каждую из них уже нельзя будет разбить без ущерба для смысла. Конечный продукт декомпозиции представляет собой иерархию функций, на самом нижнем уровне которой находятся атомарные с точки зрения смысловой нагрузки функции. Приведем простой пример (рис. 15) такой декомпозиции. Рассмотрим простейшую задачу выписки счета клиенту при отпуске товара со склада при условии, что набор товаров, которые хочет приобрести клиент, уже известен (не будем рассматривать в данном примере задачу выбора товаров).\nОчевидно, что операция выбора и расчета скидок может быть также разбита на более мелкие операции, например на расчет скидок за приверженность (клиент покупает товары в течение долгого времени) и на расчет скидок за количество покупаемого товара. Атомарные функции описываются подробно, например с помощью DFD и STD. Очевидно, что такое описание функций не исключает и дополнительное словесное описание (например, комментарии).\nСледует отметить, что на этапе анализа следует уделить внимание функциям анализа и обработки возможных ошибок и отклонений от предполагаемого эталона работы системы. Следует выделить наиболее критичные для работы системы процессы и обеспечить для них особенно строгий анализ ошибок. Обработка ошибок СУБД (коды возврата), как правило, представляет собой обособленный набор функций или одну-единственную функцию.\n\nУточнение стратегии\nНа этапе анализа происходит уточнение выбранных для конечной реализации аппаратных и программных средств. Для этого могут привлекаться группы тестирования, технические специалисты. При проектировании информационной системы важно учесть и дальнейшее развитие системы, например рост объемов обрабатываемых данных, увеличение интенсивности потока запросов, изменение требований надежности информационной системы.\nНа этапе анализа определяются наборы моделей задач для получения сравнительных характеристик тех или иных СУБД, которые рассматривались на этапе определения стратегии для реализации информационной системы. На этапе определения стратегии может быть осуществлен выбор одной СУБД. Данных о системе на этапе анализа уже намного больше, и они более подробны. Полученные данные, а также характеристики, переданные группами тестирования, могут показать, что выбор СУБД на этапе определения стратегии был неверным и что выбранная СУБД не может удовлетворять тем или иным требованиям информационной системы. Такие же данные могут быть получены относительно выбора аппаратной платформы и операционной системы. Получение подобных результатов инициирует изменение данных, полученных на этапе определения стратегии, например пересчитывается смета затрат на проект.\nВыбор средств разработки также уточняется на этапе анализа. В силу того что этап анализа дает более полное представление об информационной системе, чем оно было на этапе определения стратегии, план работ может быть скорректирован. Если выбранное на предыдущем этапе средство разработки не позволяет выполнить ту или иную часть работ в заданный срок, то принимается решение об изменении сроков (как правило, это увеличение срока разработки) или о смене средства разработки. Осуществляя выбор тех или иных средств, следует учитывать наличие высококвалифицированного персонала, который владеет выбранными средствами разработки, а также наличие администраторов выбранной СУБД. Эти рекомендации также будут уточнять данные этапа выбора стратегии (совокупность условий, при которых предполагается эксплуатировать будущую систему).\nУточняются также ограничения, риски, критические факторы. Если какие-либо требования не могут быть удовлетворены в информационной системе, реализованной с использованием СУБД и программных средств, выбранных на этапе определения стратегии, то это также инициирует уточнение и изменение получаемых данных (в конечном итоге сметы затрат и планов работ, а возможно, и изменение требований заказчика к системе, например их ослабление). Более подробно описываются те возможности, которые не будут реализованы в системе.\n",
|
||
"1"
|
||
],
|
||
[
|
||
"40",
|
||
"Язык манипуляции данными.docx",
|
||
"2.1.3. Язык манипуляции данными (ЯМД)\nЯзык манипуляции данными (ЯМД) обеспечивает эффективные команды манипуляции сетевой системой базы данных. ЯМД позволяет пользователям выполнять над базой данных операции в целях получения информации, создания отчетов, а также обновления и изменения содержимого записей. \nОсновные команды ЯМД можно классифицировать следующим образом: команды передвижения, команды извлечения, команды обновления записей, команды обновления наборов. \nТабл.2. Основные типы команд ЯМД. \nЗаключение \nПроцесс преобразования функциональной модели в реляционную включает создание реляционной таблицы для каждого объектного множества модели. Атрибуты объектного множества становятся атрибутами реляционной таблицы. Если в функциональной модели существует ключевой атрибут, то он может использоваться в качестве ключа реляционной таблицы. В противном случае ключевой атрибут таблицы может быть создан аналитиком. Однако, лучше всего, если такой атрибут естественным образом возникает из моделируемого приложения. Отношения один-к-одному и один-ко-многим преобразуются в реляционную модель путем превращения их в атрибуты соответствующей таблицы. Отношения многие-ко-многим соответствуют многозначным атрибутам и преобразуются в четвертую нормальную форму путем создания ключа из двух столбцов, соответствующих ключам двух объектных множеств, участвующих в отношении. Конкретизирующие множества преобразуются путем создания отдельных реляционных таблиц, ключи которых совпадают с ключами обобщающих объектных множеств. Рекурсивные отношения также можно смоделировать, создав новое смысловое имя атрибута, обозначающее отношение. \n\n2.2. Архитектуры реализации корпоративных информационных систем.\nПри построении корпоративных информационных сетей, как правило, используются две базовые архитектуры: Клиент-сервер и Интернет/Интранет. В чем же преимущества и недостатки использования каждой из данных архитектур и когда их применение оправдано? Найти ответы на эти вопросы мы постараемся в данном разделе. \nОдной из самых распространенных на сегодня архитектур построения корпоративных информационных систем является архитектура КЛИЕНТ-СЕРВЕР. \nВ реализованной по данной архитектуре информационной сети клиенту предоставлен широкий спектр приложений и инструментов разработки, которые ориентированы на максимальное использование вычислительных возможностей клиентских рабочих мест, используя ресурсы сервера в основном для хранения и обмена документами, а также для выхода во внешнюю среду. Для тех программных систем, которые имеют разделение на клиентскую и серверную части, применение данной архитектуры позволяет лучше защитить серверную часть приложений, при этом, предоставляя возможность приложениям либо непосредственно адресоваться к другим серверным приложениям, либо маршрутизировать запросы к ним. Средством (инструментарием) для реализации клиентских модулей для ОС Windows в данном случае является, как правило, Delpfi. \nОднако при этом частые обращения клиента к серверу снижают производительность работы сети, кроме этого приходится решать вопросы безопасной работы в сети, так как приложения и данные распределены между различными клиентами. Распределенный характер построения системы обуславливает сложность ее настройки и сопровождения. Чем сложнее структура сети, построенной по архитектуре КЛИЕНТ-СЕРВЕР, тем выше вероятность отказа любого из ее компонентов. \nВ последнее время все большее развитие получает архитектура Интернет/Интранет. В основе реализации корпоративных информационных систем на базе данной архитектуры лежит принцип \"открытой архитектуры\", что во многом определяет независимость реализации корпоративной системы от конкретного производителя. Все программное обеспечение таких систем реализуется в виде аплетов или сервлетов (программ написанных на языке JAVA) или в виде cgi модулей (программ написанных как правило на Perl или С). \nОсновными экономическими преимуществами данной архитектуры являются: \nотносительно низкие затраты на внедрение и эксплуатацию; \nвысокая способность к интеграции существующих гетерогенных информационных ресурсов корпораций; \nповышение уровня эффективности использования оборудования (сохранение инвестиций). \nприкладные программные средства доступны с любого рабочего места, имеющего соответствующие права доступа; \nминимальный состав программно-технических средств на клиентском рабочем месте (теоретически необходима лишь программа просмотра - броузер и общесистемное ПО); \nминимальные затраты на настройку и сопровождение клиентских рабочих мест, что позволяет реализовывать системы с тысячами пользователей (причем многие из которых могут работать за удаленными терминалами). \nВ общем случае АИС, реализованная с использованием данной архитектуры включает Web-узлы с интерактивным информационным наполнением, реализованных при помощи технологий Java, JavaBeans и JavaScript, взаимодействующих с предметной базой данных, с одной стороны, и с клиентским местом с другой. База данных, в свою очередь, является источником информации для интерактивных приложений реального времени. \nПо запросу клиента WEB узел осуществляет следующие операции (рис.7): \nОтправляет ASCII коды HTML страниц (или VRML документов), включающие при необходимости элементы javaScript; \nОтсылает двоичный код запрошенного ресурса (изображения, адио-, видеофайла, архива и т.п.); \nОтсылает байт коды JAVA апплетов. \nПринимает конкретную информацию от пользователя (результат заполнения активной формы, или статистическую информацию запрошенную CGI скриптом); \nОсуществляет заполнение базы данных; \nПринимает сообщения от пользователя и регламентирует доступ к ресурсам Web узла на основе анализа принятой информации (проверка паролей и т.п.); \nПринимает информацию от пользователя и в зависимости от нее динамически формирует HTML страницы, либо VRML документы, обращаясь, при необходимости, к базам данных и существующим на WEB узле HTML страницам и VRML документам.\nПосле того, как клиент получил ответ WEB сервера, он осуществляет следующие операции: \nвизуализирует HTML страницу либо VRML документ в окне броузера; \nинтерпретирует команды JavaScript, модифицирует образ HTML страницы и т.п.; \nинтерпретируя байт коды JAVA апплетов, позволяет загружать и выполнять активные приложения; \nведет диалог с пользователем, заполняющим формы, и создает новые запросы к WEB серверу; \nс помощью утилит воспроизводит коды аудио и видео файлов, поддерживает мультимедийные средства; \nобеспечивает моделирование виртуальной реальности просматривая VRML документы.\nПеречисленные задачи WEB клиента обеспечиваются возможностями броузера и специализированным программным обеспечением (утилитами), размещенными на рабочей станции клиента. Следует отметить и тот факт, что жестких стандартов на построение WEB клиента пока нет и его компонентный состав может различаться. \nНа сегодняшний день известны и широко применяются три основных технологии создания интерактивного взаимодействия с пользователем в Web. Первый путь заключается в использовании Стандартного Интерфейса Шлюза (Commom Gateway Interface) - CGI. Второй - включение JavaScript - сценариев в тело Web-страниц. И наконец самый мощный, предоставляющий практически неограниченные возможности способ - применение технологии Java (ипользование Java-аплетов). \nCGI - это механизм для выбора, обработки и форматирования информации. Возможность взаимодействия, обеспечиваемая CGI, предоставляется во многих формах, но в основном это динамический доступ к информации, содержащейся в базах данных. Например, многие узлы применяют CGI для того, чтобы пользователи могли запрашивать базы данных и получать ответы в виде динамически сформированных Web-страниц (рис.17). \nИмеются в виду узлы, предоставляющие доступ к базам данных, средствам поиска, и даже информационные системы, предающие сообщения в ответ на ввод пользователя. Все эти узлы используют CGI, чтобы принять ввод пользователя и передать его с сервера Web базе данных. База данных обрабатывает запрос и возвращает ответ серверу, который в свою очередь пересылает его опять броузеру для отображения. Без СGI база данных этого не смогла бы. Данный интерфейс можно считать посредником между броузером, сервером и любой информацией которая должна передаваться между ними. \nВ отличии от HTML, CGI не является языком описания документов. Собственно, это и не язык вообще; это стандарт. Он просто определяет, как серверы Web передают информацию, используя приложения, исполняемые на сервере. Это способ расширения возможностей сервера Web без преобразования при этом его самого. Подобно тому как броузер Web обращается к вспомогательным приложениям для обработки информации, которую он не понимает, CGI предоставляет серверу Web возможность преложить работу на другие приложения, такие как базы данных и средства поиска. \nПри написании программы шлюза (которая может конвертировать ввод из одной системы в другую) CGI позволяет использовать почти любой язык программирования. Способность использовать при написании программы шлюза любой язык, даже язык сценариев, чрезвычайно важна. Самыми популярными языками являются shell, Perl, C и С++. Сценарием традиционно называют программу, которая выполняется с помощью интерпретатора, выполняющего каждую строку программы по мере ее считывания. \nПоследовательность действий при взаимодействии клиента с программой запущенной на Web-сервере можно сформулировать как следующая последовательность шагов. \nБроузер принимает введенную пользователем информацию, как правило с помощью форы. \nБроузер помещает введенную пользователем информацию в URL, указывающий имя и местоположение сценария CGI, который требуется ввести в действие. \nБроузер подключается к серверу Web и запрашивает URL. Сервер определяет, что URL должен ввести в действие сценарий CGI, и запускает указанный сценарий. \nСценарий CGI выполняется, обрабатывая все передаваемые ему данные. \nСценарий CGI динамически формирует Web-страницу и возвращает результат серверу. \nСервер возвращает результат клиенту. \nБроузер отображает результат пользователю \nЭто является упрощенной схемой взаимодействия между броузером, сервером и сценарием CGI. Наибольшую популярность CGI - сценарии нашли при использовании в качестве обработчиков форм, средства доступа к базам данных, средства осуществления локального и глобального поиска, шлюзовых протоколов. \nНаибольшей мощью в реализации клиентского программного обеспечения обладают аплеты - программы написанные на языке JAVA. В узком смысле слова Java - это объектно-ориентированный язык, напоминающий C++, но более простой для освоения и использования. В более широком смысле Java - это целая технология программирования, изначально рассчитанная на интеграцию с Web-сервисом, то есть на использование в сетевой среде. Поскольку Web-навигаторы существуют практически для всех аппаратно-программных платформ, Java-среда должна быть как можно более мобильной, в идеале полностью независимой от платформы. \nС целью решения перечисленных проблем были приняты, помимо интеграции с Web-навигатором, два других важнейших постулата. \nБыла специфицирована виртуальная Java-машина (JVM), на которой должны выполняться (интерпретироваться) Java-программы. Определены архитектура, представление элементов данных и система команд Java-машины. Исходные Java-тексты транслируются в коды этой машины. Тем самым, при появлении новой аппаратно-программной платформы в портировании будет нуждаться только Java-машина; все программы, написанные на Java, пойдут без изменений. \nОпределено, что при редактировании внешних связей Java-программы и при работе Web-навигатора прозрачным для пользователя образом может осуществляться поиск необходимых объектов не только на локальной машине, но и на других компьютерах, доступных по сети (в частности, на WWW-сервере). Найденные объекты загружаются, а их методы выполняются затем на машине пользователя. \nНесомненно, между двумя сформулированными положениями существует тесная связь. В компилируемой среде трудно абстрагироваться от аппаратных особенностей компьютера, как трудно (хотя и можно) реализовать прозрачную динамическую загрузку по сети. С другой стороны, прием объектов извне требует повышенной осторожности при работе с ними, а, значит, и со всеми Java-программами. Принимать необходимые меры безопасности проще всего в интерпретируемой, а не компилируемой среде. Вообще, мобильность, динамизм и безопасность - спутники интерпретатора, а не компилятора. \nПринятые решения делают Java-среду идеальным средством разработки интерактивных клиентских компонентов (апплетов) Web-систем. Особо отметим прозрачную для пользователя динамическую загрузку объектов по сети. Из этого вытекает такое важнейшее достоинство, как нулевая стоимость администрирования клиентских систем, написанных на Java. Достаточно обновить версию объекта на сервере, после чего клиент автоматически получит именно ее, а не старый вариант. Без этого реальная работа с развитой сетевой инфраструктурой практически невозможна. \nСтандартный реляционный доступ к данным очень важен для программ на Java, потому что Java-апплеты по природе своей не являются монолитными, самодостаточными программами. Будучи модульными, апплеты должны получать информацию из хранилищ данных, обрабатывать ее и записывать обратно для последующей обработки другими апплетами. Монолитные программы могут себе позволить иметь собственные схемы обработки данных, но Java-апплеты, пересекающие границы операционных систем и компьютерных сетей, нуждаются в опубликовании открытых схем доступа к данным. \nИнтерфейс JDBC (Java Database Connectivity - связанность баз данных Java) является первой попыткой реализации доступа к данным из программ Java, не зависящего от платформы и базы данных. В версии JDK 1.1 JDBC является составной частью основного Java API. \nJDBC - это набор реляционных объектов и методов взаимодействия с источниками данных. Программа на языке Java открывает связь с таблицей, создает объект оператор, передает через него операторы SQL системе управления базой данных получает результаты и служебную информацию о них. В типичном случае файлы .class JDBC и апплет/приложение на языке Java находятся на компьютере клиенте. Хотя они могут быть загружены из сети, для минимизации задержек во время выполнения лучше иметь классы JDBC у клиента. Система управления базой данных (CУБД) и источник данных обычно расположены на удаленном сервере. \nНа рисунке 19 показаны различные варианты реализаций связи JDBC с базой данных. Апплет/приложение взаимодействует с JDBC в системе клиента, драйвер отвечает за обмен информацией с базой данных через сеть. \nКлассы JDBC находятся в пакете java.sql.*. Все программы Java используют объекты и методы из этого пакета для чтения и записи в источник данных. Программе, использующей JDBC, требуется драйвер к источнику данных, с которым она будет взаимодействовать. Этот драйвер может быть написан на другом (не Java) языке программирования, или он может являться программой на языке Java, которая общается с сервером, используя RPC (Remote Procedure Call) - удаленный вызов процедур или HTTP. Обе схемы приведены на рис.19. Драйвер JDBC может быть библиотекой на другом (не Java), как программа сопряжения ODBC - JDBC, или классом Java, который общается через сеть с сервером базы данных, используя RPC или HTTP. \nДопускается, что приложение будет иметь дело с несколькими источниками данных, возможно, с неоднородными. По этой причине у JDBC есть диспетчер драйверов, чьи обязанность заключаются в управлении драйверами и предоставлении программе списка загруженных драйверов. \nХотя словосочетание \"База данных\" входит в расшифровку аббревиатуры JDBC, форма, содержание и расположение данных не интересуют программу Java, использующую JDBC, поскольку существует драйвер к этим данным. \n\nСопряжение JDBC - ODBC \nВ качестве составной части JDBC поставляется драйвер для доступа из JDBC к источникам данных ODBC (Open Database Connectivity), и называется \"программа сопряжения JDBC - ODBC\". Эта программа сопряжения реализована в виде JdbcOdbc.class и является библиотекой для доступа к драйверу ODBC. \nПоскольку JDBC конструктивно близок к ODBC, программа сопряжения является несложной надстройкой над JDBC. На внутреннем уровне этот драйвер отображает методы Java в вызовы ODBC и тем самым взаимодействует с любым ODBC - драйвером. Достоинство такой программы сопряжения состоит в том, что JDBC имеет доступ к любым базам данных, поскольку ODBC - драйверы распространены очень широко. \nВ соответствии с правилами Internet JDBC идентифицирует базу данных при помощи URL, который имеет форму: \njdbc:<субпротокол>:<имя, связанное с СУБД или Протоколом> \nУ баз данных в Internet/intranet \"имя\" может содержать сетевой URL \n//<имя хоста>:<порт>/.. \n<субпротокол> может быть любым именем, которое понимает база данных. Имя субпротокола \"odbc\" зарезервированно для источников данных формата ODBC. Типичный JDBC URL для базы данных ODBC выглядит следующим образом: \njdbc:odbc:<DNS - имя ODBC>;User=<имя пользователя>; PW=<пароль> \n\nВнутреннее устройство JDBC - приложения \nЧтобы обработать информацию из базы данных, информационно-обучающая система на языке Java выполняет ряд шагов. На рис.20 показаны основные объекты JDBC, методы и последовательность выполнения, Во-первых, программа вызывает метод getConnection (), чтобы получить объект Connection.Затем она создает объект Statement и подготавливает оператор SQL. \nОператор SQL может быть выполнен немедленно (объект Statement), а может быть откомпилирован (объект PreparedStatement) или представлен в виде вызова процедуры (объект CallableStatement). Когда выполняется метод executeQuery(), возвращается объект ResultSet. Операторы SQL, такие как updatе или delete не возвращают ResultSet. Для таких операторов используется метод executeUpdate(). Он возвращает целое, указывающее количество рядов, затронутых оператором SQL. \nResultSet содержит ряды данных и анализируетcя методом next(). Если приложение обрабатывает транзакции, можно пользоваться методами rollback() и commit() для отмены или подтверждения изменений, внесенных оператором \nSQL. \n\nПримеры запроса и модификации базы данных с использованием JDBC \nДанный пример иллюстрирует как при помощи SQL - опрератора SELECT составляется список всех студентов из базы данных. Ниже приводятся шаги, которые необходимы для выполнения этого задания при помощи API JDBC. Каждый шаг имеет форму текста на языке Java с комментариями. \n// описать методы и переменные\npublic void ListStudents () throws SQLException\n{\nint i, noOfColumns;\nString stNo, stFName, stLName;\n// инициализировать и загрузить драйвер JDBC-ODBC\nClass.forName (\"jdbc.odbc.JdbcOdbcDriver\");\n// создать объект Connection\nConnection ex1Con = DriverManager.getConnection (\n\"jdbc:odbc:StudentDB;uid=\"admin\";pw=\"sa\"\");\n// создать простой объект Statement\nStatement ex1Stmt = ex1Con.createStatement ();\n// Создать строку SQL, передать ее СУБД и\n// выполнить SQL-оператор\nResultSet ex1rs = ex1Stmt.executeQuery (\n\"SELECT StudentNumber, FirstName, LastName FROM Students\");\n// Обработать каждый ряд и вывести результат на консоль\nSystem.out.println (\"Student Number First Name Last Name\");\nwhile (ex1rs.next())\n{\nstNo = ex1rs.getString (1);\nstFName = ex1rs.getString (2);\nstLName = ex1rs.getString (3);\nSystem.out.println (stNo, stFName, stLName);\n}\n}\nВ следующем примере поле firstName таблицы Students изменяется. Доступ осуществляется через поле StudentNumber. \n// описать методы, переменные и параметры \npublic void UpdateStudentName (String stFName, String stLName, String stNo) \nthrows SQLException\n{\nint retValue;\n//инициализировать и загрузить драйвер JDBC-ODBC\nClass.forName (\"jdbc.odbc.JdbcOdbcDriver\");\n// создать объект Connection\nConnection ex1Con = DriverManager.getConnection (\n\"jdbc:odbc:StudentDB;uid=\"admin\";pw=\"sa\"\");\n// создать простой объект Statement\nStatement ex1Stmt = ex1Con.createStatement ();\n// Создать строку SQL, передать ее СУБД и\n// выполнить SQL-оператор\nString SQLBuffer = \"UPDATE Students SET FirstName =\" +\nstFName + \", lastName =\" + stLName +\n\"WHERE StudentNumber = \" + stNo;\nretValue = ex1Stmt.executeUpdate (SQLBuffer);\nSystem.out.println (\"Модифицированно \" + retValue +\n\" строк в базе данных.\")\n}\nРис.21. Интерфейс для регистрации пользователя в АИС. \nТаким образом, взаимодействие с базами данных из Java также отличается простотой и гибкостью, связанной с эффективной реализацией JDBC API. В сочетании со своей природной платформо-независимостью, Java предоставляет уникальный инструмент для создания интерактивных распределенных информационно-обучающих систем на база Internet/Intranet - технологий. \nОсновными сложностями при реализации корпоративных систем на базе данной архитектуры являются: \nотсутствие многих популярных приложений и средств разработки реализованных в виде JAVA аплетов; \nотносительное высокое время компиляции аплетов на клиентских местах (временно); \nвопросы безопасной работы в сети. \n\n2.2.1. Сравнительные исследования типовых серверных платформ.\nВыбирая платформу для АИС, нужно учитывать множество аспектов. На решение влияют соображения, связанные с надежностью (кластеризация и балансировка нагрузки), среды разработки, работы над содержанием узла и защиты информации. Результаты тестирования различных платформ широко представлены в периодической печати, представим здесь лишь некоторые обобщения материалов тестирования []. \nПри проведении испытаний оценивались Solaris 2.6, Windows NT Server 4 и Red Hat Linux 6.02 (ядро 2.2.11) при эксплуатации четырех web-серверов, занимающих ведущие позиции в мире: Microsoft Internet Information Server 4 (IIS), Netscape Enterprise Server 3.61, Web Server 2.1 корпорации Sun и Stronghold Web Server 2.4.1 (популярный вариант Web-сервера Apache с функциями защиты от несанкционированного доступа) (на тестах использовались триал версии указанного программного обеспечения). Все платформы были испытаны с помощью новой версии эталонного теста WebBench отделения Ziff-Davis Benchmark Operation. \n\n2.2.1.2. Особенности функционирования АИС на платформе Sun.\nSolaris - это современная операционная система UNIX клона. Примечательно, что она, опережая свое время, позволяет работать с 64-разрядными прикладными программами и имеет собственные расширения, которые помогают ей выдерживать высокие пользовательские нагрузки Web-узлов с интенсивным обменом информацией. В Solaris также предусмотрены замечательные возможности применения серверных прикладных программ и средств разработки сторонних производителей. \nКлючевой момент для понимания различий между платформами Linux, Microsoft и Sun - способ, которым серверные программы каждой из них обрабатывают большое число подключений. Обычно это делается в многопотоковом режиме. Многопотоковый режим возникает, когда прикладная программа (также называемая процессом) содержит множество небольших блоков исполняемого кода, работающих независимо друг от друга и, возможно, одновременно на разных процессорах. Эти потоки могут совместно пользоваться ресурсами и представляют собой способ организации программы, позволяющий одновременно выполнять несколько задач. \nМодель потоков Solaris весьма сложна. Она состоит из потоков на уровне ядра (kthreads) - реальных объектов, передаваемых отдельному процессору; потоков на пользовательском уровне и промежуточной структуры, называемой облегченным (lightweight) процессом. Это позволяет тонко управлять структурой прикладной программы и реализации в ней прикладной многозадачности. \n\nStronghhold на платформе Solaris \nСоздатели Web-сервера Stronghold (и Apache, основы Stronghold) считают, что многопотоковые программы обычно менее надежны, чем \"монолитные\". Такое различие стратегий объясняет значительные расхождения показателей производительности, поскольку и Sun Web Server 2.1, и Netscape Enterprise используют второй процессор, установленный в испытательных системах. Поэтому Stronghold, в зависимости от прикладного ПО, не столь эффективно использует оборудование Sun, содержащее до 64 процессоров. \n\nNetscape на платформе Solaris \nNetscape Enterprise Server 3.61 - Web-сервер, избранный для реализации большинства крупных узлов на основе Solaris, в том числе и корпорации Sun. Инструментальные средства фирмы Netscape, а также предлагаемые независимыми производителями, способствуют разработке сложных прикладных программ для Web с помощью сценариев на языках JavaScript, CORBA, Java. \nЕще одна важнейшая система, стоящая за добротными программами для Web на серверах Netscape, - сервер прикладных программ Netscape Application Server (NAS). Сервер NAS - среда программирования для объектов на языках C++ и Java - обеспечивает масштабируемость и устойчивость к сбоям прикладных программ. В NAS имеются инструменты для создания многоуровневых программ, объединяющих HTML и запросы к базам данных на серверах NAS. \n\nSun Web Server \nSun Web Server (SWS) обеспечивает разработку программ, конечно же, на языке Java. На SWS можно использовать сервлеты и разнообразные возможности, такие как CORBA. Сервлеты (servlet) - это Java-программы, запускаемые на сервере и, подобно CGI, передающие сверстанные HTML-страницы браузеру. Для сервлет существует собственный API к функциям рабочей среды сервера. В SWS также предусмотрена возможность использования серверных Java-страниц (Java Server Pages) - способа обращения к серверным функциям Java со страниц Web и из CGI-программ. \nПри соответствующем использовании Web-серверов на платформе Solaris, эта операционная система на многопроцессорных станциях превосходит по производительности Windows NT. Такого результата достигла Sun Microsystems благодаря использованию Solaris Network Cache and Accelerator (SNCA) - мощного механизма кэширования для Web-сервера. SWS победил в испытаниях при обслуживании статических страниц. При выполнении динамических CGI-испытаний Netscape на платформе Solaris превзошел и SWS, и IIS для Windows NT. \n\n2.2.1.3. Особенности функционирования АИС на платформе Microsoft.\nMicrosoft Windows NT Server \nWindows NT 4 Server и Internet Information Server (IIS) являются исключительно коммерческой web-платформой, разработанной компанией Microsoft. Данная ОС имеет удобный интуитивно понятный интерфейс взаимодействия с пользователем, что делает её довольно привлекательной для использования. Windows NT 4 Server оснащена службой балансировки нагрузки (Windows NT Load Balancing Services), которая позволяет создавать группу серверов и распределять нагрузку между ними. Пользователи при этом видят только один IP-адрес и полагают, что существует только один сервер. Однако служба Load Balancing Services - это неполноценная кластерная система, поэтому она не способна обеспечить такое высокое быстродействие, как настоящий кластер. Windows NT не может работать с мощными аппаратными и программными средствами кластеров, в том числе с собственной службой Microsoft Cluster Service, продуктами серии Infinity компании IBM и продуктами NonStop производства Compaq. У Microsoft есть продукты всех этапов разработки для Web, однако обычно их заменяют изделиями других фирм. Пакет Allaire ColdFusion 4.0, как среда разработки для Web, - отличный пример этого. \n\nNetscape Enterprise на платформе Windows NT \nNetscape Enterprise в среде Windows NT представляет собой Web-сервер, ориентированный на большие нагрузки. Для него имеется множество моделей программирования. Например, помимо общепринятых моделей разработки HTML и CGI в продукте Netscape предусмотрены возможности работы с JavaScript на стороне сервера. Почти все функции сервера Netscape для Solaris работают и на платформе Windows NT. \nПри тестировании на производительность IIS показал неплохие результаты. Скорость при работе IIS достигнута за счет хорошо организованной обработкой файлового ввода-вывода. Дополняет обработку сообщений в Windows NT возможность асинхронного ввода-вывода, позволяющая обрабатывать запрос одновременно с выполнением операций ввода-вывода в файл или ЛВС. Подобная функция имеется в Solaris, но до сих пор не полностью реализована в Linux. По результатам теста IIS проигрывает SWW при обработке статических страниц, а Netscape Enterprise на платформе NT оказался менее производительным во всех режимах, чем на платформе Solaris. \n\n2.2.1.4. Особенности функционирования АИС на основе Linux.\nВсе больше растет популярность Linux и её респектабельность как платформы разработки для Web и корпоративных сред. Linux характеризуется рядом преимуществ, таких как широкое сообщество разработчиков открытого кода, поддержка многих моделей комплектующих, и, главная особенность состоит в том, что Linux полностью бесплатная ОС. Linux является разновидностью Unix и изначально создавалась для работы в сетях. В каждой новой версии Linux появляются некоторые усовершенствования, направленные на повышение масштабируемости и производительности серверных прикладных программ. \n\nApache и Stronghold \nДля тестов в среде Linux был использован Stronghold Web Server 2.4.1 компании C2Net. Stronghold - это сервер с возможностями применения технологии SSL, в основе которого лежит Web-сервер Apache. Сервер Stronghold обладает всеми преимуществами Apache, в том числе мощными средствами обеспечения работы с виртуальными базовыми машинами (способность одного web-сервера обслуживать несколько машин одновременно). \nПлатформа Stronghold, подобно Linux, имеет заслуженную репутацию надежной и стабильной системы. Но Stronghold - и, следовательно, Apache - не оптимизированы для многопроцессорных сред. Поэтому Web-узлы, основанные на серверах Apache, лучше масштабировать путем добавления серверов, а не процессоров. \nНапротив, IIS и Netscape Enterprise имеют многопотоковую архитектуру, которая масштабируется на несколько процессоров одного сервера. При испытаниях на многопроцессорных станциях они, как правило, обгоняли Stronghold. \nApache позволяет тонко настраивать ряд параметров (такие как число процессов, доступных клиентам). Для Apache, как и для других серверов, есть механизм работы сервлетам (Apache Jserv). Механизм работы с сервлетами встраивается в Apache в виде модуля и работает с любой совместимой с JDK 1.1 виртуальной Java-машиной. По производительности дуэт Apache-Linux оказался оптимальным для однопроцессорных систем. По обработке статических страниц он немного уступал SWW и IIS, а по стабильности работы превосходил серверы на платформеWindows NT. \nLinux - это функциональность UNIX + пользовательско-ориентированный интерфейс Windows-систем. Большая часть поддерживаемого Linux оборудования - это то, что пользователи реально у себя имеют. Как в результате оказалось - большая часть популярной периферии для 80386/80486 поддерживается (действительно, Linux поддерживает оборудование, которое в ряде случаев не поддерживают некоторые коммерческие UNIX). Хотя некоторые достаточно экзотические устройства пока не поддерживаются. \nВажным вопросом при создании АИС является обеспечение жизнестойкости и надежности работы информационных серверов. В качестве иллюстрации эффективности платформы приведем расчет параметров для сервера с 25000 посетителей в день []. Подсчет загрузки: 24ч*60мин*60 сек=86400 секунд в сутках, если каждый посетитель берет с сервера по 10 документов (*.html + графика) то при равномерном распределении загрузки получается 3 обращения к серверу в секунду. Реальное распределение трафика носит характер кривой Гаусса либо синусоиды (в зависимости от содержания сервера), в максимумах которых загрузка достигает 10-20 обр/с. Для нормальной работы такому серверу необходимо около 400 Mb RAM, при хорошей настройке - не менее 200. \nПри правильной конфигурации сервера не рекомендуется использовать swap. все должно помещаться в оперативной памяти (имеется ввиду, что у сервера swap-область быть должна, но она обязана быть пустой). Для предотвращения перегрузок рекомендуется пользоваться несколькими правилами, снижающими загрузку сервера. Придерживаясь этих правил можно съэкономить около 30% ресурсов сервера. \nДля статической информации всегда ставить last-modified в атрибут выдачу CGI-скриптов - документ без временного штампа не сохраняется в локальном кэше, и постоянно перезаписывается при просмотре. \nCGI программы хранить в любом каталоге кроме /CGI-BIN/, т.к. proxy-серверы не кэшируют файлы, находящиеся в этих каталогах, и каждый раз вынуждены обращаться к вам на сервер. \nУстанавливать поле last-modified у русского apache с автоматическим определением кодировки, чтобы на proxy-серверах не оставались файлы в некорректной кодировке. \nНе применять авторедирект по чарсету в русском apache. \nНе использовать фреймы, т.к. вместо одного файла появляется минимум 3. \nНе использовать анимированные *.gif, т.к. некоторые NN обращаются к серверу перед каждым циклом. \n404 код не делать cgi-скриптом, 404 код не делать \"красивым\" - с графическими изображениями и указаниями на прочие разделы, т.к. сошедший с ума робот собирает невероятное количество 404 ошибок, зацикливаясь в них на веки. \nСоздать на сервере файл robot.txt, т.к. это самый запрашиваемый документ на сервере, и иначе порождает массу 404 (см. п. 7). А также разумные роботы слушаются запретов в этом файле, что уменьшает нагрузку на сервер. \nНе ставить баннеры наверху страницы, т.к. баннер сверху отнимает 1-2 реквеста из 4-х и в итоге грузится вперед тормозя ваши сайтовые картинки. \nПри вызове баннера не обращаться каждый раз к CGI, а подставлять вместо случайного числа любое число, что можно сделать, например, получив дату на JavaScript. \nВызывать баннеры программами на Си, т.к. Perl работает медленнее. \nНа одной машине должен размещаться только информационный сервер, не одновременно с почтой и др. сервисами. \nНа сегодня архитектура Internet/Intranet, в том числе и на платформе LINUX, уже используется при построении корпоративных ИС для решения задач автоматизации управления банками, управления проектированием, управления ТП, АСУ ТП, электронной коммерции, оперативной информации по курсу валют и акций и т.п. ",
|
||
"1"
|
||
]
|
||
],
|
||
"shape": {
|
||
"columns": 3,
|
||
"rows": 5
|
||
}
|
||
},
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>doc</th>\n",
|
||
" <th>text</th>\n",
|
||
" <th>type</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>36</th>\n",
|
||
" <td>Этапы разработки проекта2.docx</td>\n",
|
||
" <td>Этапы разработки проекта: заключительные стади...</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>37</th>\n",
|
||
" <td>Этапы разработки проекта3.docx</td>\n",
|
||
" <td>Этапы разработки проекта: определение стратеги...</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>38</th>\n",
|
||
" <td>Этапы разработки проекта4.docx</td>\n",
|
||
" <td>Этапы разработки проекта: реализация, тестиров...</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>39</th>\n",
|
||
" <td>Этапы разработки проекта5.docx</td>\n",
|
||
" <td>Этапы разработки проекта: стратегия и анализ\\n...</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40</th>\n",
|
||
" <td>Язык манипуляции данными.docx</td>\n",
|
||
" <td>2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма...</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" doc \\\n",
|
||
"36 Этапы разработки проекта2.docx \n",
|
||
"37 Этапы разработки проекта3.docx \n",
|
||
"38 Этапы разработки проекта4.docx \n",
|
||
"39 Этапы разработки проекта5.docx \n",
|
||
"40 Язык манипуляции данными.docx \n",
|
||
"\n",
|
||
" text type \n",
|
||
"36 Этапы разработки проекта: заключительные стади... 1 \n",
|
||
"37 Этапы разработки проекта: определение стратеги... 1 \n",
|
||
"38 Этапы разработки проекта: реализация, тестиров... 1 \n",
|
||
"39 Этапы разработки проекта: стратегия и анализ\\n... 1 \n",
|
||
"40 2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма... 1 "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"from docx import Document\n",
|
||
"\n",
|
||
"def read_docx(file_path):\n",
|
||
" doc = Document(file_path)\n",
|
||
" full_text = []\n",
|
||
" for paragraph in doc.paragraphs:\n",
|
||
" full_text.append(paragraph.text)\n",
|
||
" return \"\\n\".join(full_text)\n",
|
||
"\n",
|
||
"def load_docs(dataset_path):\n",
|
||
" df = pd.DataFrame(columns=[\"doc\", \"text\"])\n",
|
||
" for file_path in os.listdir(dataset_path):\n",
|
||
" if file_path.startswith(\"~$\"):\n",
|
||
" continue\n",
|
||
" text = read_docx(dataset_path + file_path)\n",
|
||
" df.loc[len(df.index)] = [file_path, text]\n",
|
||
" return df\n",
|
||
"\n",
|
||
"df = load_docs(\"../../static/tz_itdocs/\")\n",
|
||
"df[\"type\"] = df.apply(lambda row: 0 if str(row[\"doc\"]).startswith(\"tz_\") else 1, axis=1)\n",
|
||
"df.sort_values(by=[\"doc\"], inplace=True)\n",
|
||
"\n",
|
||
"display(df.head(), df.tail())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ca303a99",
|
||
"metadata": {},
|
||
"source": [
|
||
"Используем методы предобработки (приведение к нижнему регистру, удаление стоп-слов, удаление знаков препинания и спец-символов, лемматизация, формирование би-грамм с помощью Phraser, Phrases):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 72,
|
||
"id": "7056f5f1",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
|
||
"columns": [
|
||
{
|
||
"name": "index",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "doc",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "text",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "prep_text",
|
||
"rawType": "object",
|
||
"type": "unknown"
|
||
}
|
||
],
|
||
"conversionMethod": "pd.DataFrame",
|
||
"ref": "81013c5e-a781-49b9-8658-5c7100591f9d",
|
||
"rows": [
|
||
[
|
||
"0",
|
||
"tz_01.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения\nполное наименование системы и ее условное обозначение: Конфигурация «Бухгалтерия предприятия» в среде «1С: Предприятие 8.1»; \nшифр темы: ДП – УлГТУ – 08080165 – 00/00000 – 2010;\nнаименование предприятий разработчика и заказчика системы, их реквизиты: УМКУП «Городской градостроительный сервис», .Ульяновск, пер.Комсомольский 3, 8-962-633-01-77;\nперечень документов, на основании которых создается информационная система: ; \nплановые сроки начала и окончания работ:1 апреля . – 15 июня .;\nсведения об источниках и порядке финансирования работ: работа проводится на безвозмездной основе, не финансируется;\nпорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику передается установочный диск со всеми дистрибутивами, необходимыми для функционирования разработанного программного продукта, а так же сопроводительная документация: техническое задание и методические указания пользователю и программисту.\n\nНазначение и цели создания системы\nРазработанный программный продукт предназначен для обеспечения полноты автоматизации деятельности бухгалтера организации УМКУП «Городской градостроительный сервис» при использовании конфигурации «Бухгалтерия предприятия» на платформе «1С: Предприятие 8.1» в части расчета заработной платы и учета деятельности сотрудников организации. Предполагается использование системы на автоматизированном рабочем месте главного бухгалтера организации.\nОсновными целями создания системы являются:\nдополнение существующей информационной системы, которая не предоставляет возможность расчета заработной платы организации, имеющей специфические принципы оплаты труда соответствующим функционалом, который, кроме того, затрагивает автоматизацию процессов, влияющих на процесс формирования сумм заработной платы;\nповышение эффективности исполнения автоматизируемых процессов, путем сокращения непроизводительных и дублирующих операций, операций, выполняемых «вручную», оптимизации информационного взаимодействие участников процессов; \nповышение качества принятия управленческих решений за счет оперативности представления, полноты, достоверности и удобства форматов отображения информации;\n\nХарактеристика объектов автоматизации\nОбъектом автоматизации является процесс учета расчетов с работниками по оплате труда в организации, имеющей специфические принципы формирования расчетных сумм, в части расчета этих сумм и сбора данных из документов оперативного учета для проведения расчета.\n\nТребования к системе\nТребования к системе в целом\nа) Требования к структуре и функционированию системы\nНазначение и цели создания системы должны быть реализованы в двух подсистемах конфигурации «Бухгалтерия предприятия» на платформе «1С: Предприятие8.1»:\nСистема бухгалтерского учета\nСистема оперативного учета\nПодсистема оперативного учета должна содержать механизмы, позволяющие вводить в систему и хранить в ней информацию о текущей деятельности организации. В этой подсистеме должны фиксироваться и систематизироваться данные, необходимые для реализации расчета сумм начислений. \nПодсистема бухгалтерского учета должна содержать в себе механизмы для реализации учета расчетов с сотрудниками организации. Именно эта подсистема должна реализовывать процесс расчета, используя данные, содержащиеся в подсистеме оперативного учета.\nб) Требования к персоналу\nДля наиболее эффективного функционирования системы помимо пользователя – главного бухгалтера организации, для автоматизации деятельности которого предназначена система, необходимо иметь специалиста технической поддержки данного программного продукта. \nв) Показатели назначения \nСистема должна предусматривать возможность масштабирования по производительности и объему обрабатываемой информации без модификации ее программного обеспечения путем модернизации используемого комплекса технических средств. Изменение процессов управления не должно отражаться на правильности функционирования системы.\nг) Требования к надежности, эргономике, защите и сохранности информации, защите от внешних воздействий.\nСистема должна сохранять работоспособность и обеспечивать восстановление своих функций при возникновении следующих внештатных ситуаций:\nпри сбоях в системе электроснабжения аппаратной части, приводящих к перезагрузке ОС;\nпри ошибках в работе аппаратных средств (кроме носителей данных и программ) восстановление функции системы возлагается на ОС;\nпри ошибках, связанных с программным обеспечением (ОС и драйверы устройств), восстановление работоспособности возлагается на ОС\nсистема должна обеспечивать корректную обработку аварийных ситуаций, вызванных неверными действиями пользователей, неверным форматом или недопустимыми значениями входных данных. В указанных случаях система должна выдавать пользователю соответствующие сообщения, после чего возвращаться в рабочее состояние, предшествовавшее неверной (недопустимой) команде или некорректному вводу данных. \nСистема должна быть эргономичной. Интерфейс системы должен быть понятным и удобным, не должен быть перегружен графическими элементами и должен обеспечивать быстрое отображение экранных форм. Навигационные элементы должны быть выполнены в удобной для пользователя форме. Средства редактирования информации должны удовлетворять принятым соглашениям в части использования функциональных клавиш, режимов работы, поиска, использования оконной системы. Ввод-вывод данных системы, прием управляющих команд и отображение результатов их исполнения должны выполняться в интерактивном режиме. Интерфейс должен соответствовать современным эргономическим требованиям и обеспечивать удобный доступ к основным функциям и операциям системы.\nИнтерфейс должен быть рассчитан на преимущественное использование манипулятора типа «мышь», то есть управление системой должно осуществляться с помощью набора экранных меню, кнопок, значков и т. п. элементов. Клавиатурный режим ввода должен используется главным образом при заполнении и/или редактировании текстовых и числовых полей экранных форм.\nВсе надписи экранных форм, а также сообщения, выдаваемые пользователю (кроме системных сообщений) должны быть на русском языке.\nИС должна обеспечивать защиту от несанкционированного доступа. Компоненты подсистемы защиты от несанкционированного доступа должны обеспечивать:\nидентификацию пользователя;\nпроверку полномочий пользователя при работе с системой;\nразграничение доступа пользователей на уровне задач и информационных массивов.\n\nТребования к функциям (по подсистемам)\nПодсистема оперативного учета\nПодсистема оперативного учета должна осуществлять ввод и хранение оперативных данных системы, данных для формирования аналитических отчетов, документов системы, сформированных в процессе работы.\nВсе элементы, входящие в состав подсистемы оперативного учета, должны обладать следующей основной функциональностью:\nПостоянное хранение данных;\nДобавление новых элементов;\nРедактирование элементов;\nУдаление (удаление элементов возможно лишь в том случае, если другие существующие объекты системы не ссылаются на удаляемый элемент);\nПросмотр элементов;\nПросмотр списка элементов;\nФильтрация и сортировка списка элементов;\nПоиск элементов;\nЭкспорт и импорт элементов.\nПодсистема бухгалтерского учета\nПодсистема бухгалтерского учета должна иметь средства для регистрации бухгалтерских операций и формирования на их основе соответствующей итоговой информации, а также подготовки произвольных бухгалтерских отчетов. Подсистема бухгалтерского учета должна вести учет, ориентированный на первичные документы, относящиеся к подсистеме оперативного учета, и иметь функцию расчета сумм начислений заработной платы сотрудникам на основе этих документов.\n\nТребования к видам обеспечения\nК видам обеспечения предъявляются следующие требования:\nа) математическому: не предъявляются;\nб) информационному: уровень хранения данных в системе должен быть построен на основе современных СУБД. Для обеспечения целостности данных должны использоваться встроенные механизмы СУБД. Доступ к данным должен быть предоставлен только авторизованным пользователям с учетом их служебных полномочий, а также с учетом категории запрашиваемой информации. Технические средства, обеспечивающие хранение информации, должны использовать современные технологии, позволяющие обеспечить повышенную надежность хранения данных и оперативную замену оборудования.\nв) лингвистическому: система создана на основе языка программирования «1С 8.1»;\nг) программному и техническому:\nКомпьютер конечного пользователя \nоперационная систему: MS Windows 98/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium II 400 МГц и выше (рекомендуется Intel Pentium III 866 МГц);\nоперативная память 128 Мбайт и выше (рекомендуется 256 Мбайт);\nжесткий диск (при установке используется около 120 Мбайт).\nКомпьютер, используемый для разработки конфигураций\nоперационная система: MS Windows 2000/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium III 866 МГц и выше (рекомендуется Intel Pentium IV/Celeron 1800 МГц);\nоперативная память 256 Мбайт и выше (рекомендуется 512 Мбайт);\nжесткий диск (при установке используется около 120 Мбайт).\nКомпьютер сервера 1С:Предприятия 8.1\nоперационная система: MS Windows 2000/XP/Vista/Server 2003/2008;\nпроцессор Intel Pentium III 866 МГц и выше (рекомендуется Intel Pentium IV/Xeon 2,4 ГГц, для лучшей масштабируемости рекомендуется два и более процессоров);\nоперативная память 512 Мбайт и выше (рекомендуется 1024 Мбайт).\nСервер баз данных\nMicrosoft SQL Server 2000 + Service Pack 2 (рекомендуется Service Pack 3a) или Microsoft SQL Server 2005.\nКомпьютер сервера баз данных\nоперационная система: в соответствии с требованиями Microsoft SQL Server;\nтехнические характеристики компьютера должны соответствовать требованиям используемой версии сервера баз данных MS SQL Server.\nд) метрологическому: требования не предъявляются;\nе) организационному: для эффективного функционирования системы помимо пользователя необходим специалист по технической поддержке. К работе с системой должны допускаться сотрудники, имеющие навыки работы на персональном компьютере, ознакомленные с правилами эксплуатации и прошедшие обучение работе с системой.\nж) методическому: в состав методического обеспечения системы должны входить: инструкция программисту, инструкция пользователю.\n\nСостав и содержание работ по созданию системы\nПеречень стадий и этапов работ, а так же сроки их исполнения представлены в Таблице 2.\nТаблица 2.\nЭтапы и сроки исполнения работ\nРаботы по созданию системы проводились физическим лицом – студенткой группы ИСЭд-51 УлГТУ, Башаровой И.С. Консультантом при разработке являлась Суркова Е.В., доцент кафедры «Информационные системы» УлГТУ, руководитель дипломного проекта.\n\nПорядок контроля и приемки системы\nПриемочные испытания должны включать проверку:\nполноты и качества реализации необходимых функций;\nвыполнения каждого требования, относящегося к эргономике;\nработы пользователей в диалоговом режиме;\nсредств и методов восстановления работоспособности системы после отказов;\nполноты действий, доступных пользователю, и их достаточность для функционирования системы;\nреакции системы на ошибки пользователя;\nтестирование на скорость реакции системы на команды пользователя.\n\nТребования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nДля подготовки объекта автоматизации к вводу системы в действие необходимо при помощи специалиста технической поддержки, осуществляющего обслуживание используемой в организации базовой конфигурации «Бухгалтерия предприятия», выгрузить все информацию, содержащуюся в этой конфигурации, для дальнейшего ее использования в разработанной системе. Загрузка информации в новую конфигурацию должна так же осуществляться специалистом технической поддержки.\nПеред началом использования системы пользователю необходимо ознакомится с руководством пользователя, содержащимся в сопроводительной документации разработанной системы и пройти обучение для ознакомления с принципами ее функционирования в течение 1 академического часа (при условии владения пользователя навыками работы в базовой конфигурации «Бухгалтерия предприятия» платформы «1С: Предприятие 8.1»). \n\nТребования к документированию\nРазработке подлежит следующая документация:\nИнструкция пользователю;\nИнструкция программисту.\n",
|
||
"0",
|
||
"[['2.2', 'технический', 'задание', '2.2.1', 'общий', 'сведение', 'полный', 'наименование', 'система', 'условный', 'обозначение', 'конфигурация', 'бухгалтерия', 'предприятие', 'среда', '1с', 'предприятие', '8.1', 'шифр', 'тема', 'дп', 'улгту', '08080165', '00/00000', '2010', 'наименование', 'предприятие', 'разработчик', 'заказчик', 'система', 'реквизит', 'умкуп', 'городской', 'градостроительный', 'сервис', '.ульяновск', 'пер.', 'комсомольский', '3', '8', '962', '633', '01', '77', 'перечень', 'документ', 'основание', 'создаваться', 'информационный', 'система', 'плановый', 'срок', 'окончание', 'работ:1', 'апрель'], ['15', 'июнь'], ['сведение', 'источник', 'порядок', 'финансирование', 'работа', 'работа', 'проводиться', 'безвозмездный', 'основа', 'финансироваться', 'порядок', 'оформление', 'предъявление', 'заказчик', 'результат', 'работа', 'создание', 'система', 'часть', 'отдельный', 'средство', 'окончание', 'работа', 'заказчик', 'передаваться', 'установочный', 'диск', 'дистрибутив', 'необходимый', 'функционирование', 'разработать', 'программный', 'продукт', 'сопроводительный', 'документация', 'технический', 'задание', 'методический', 'указание', 'пользователь', 'программист'], ['назначение', 'цель', 'создание', 'система', 'разработанный', 'программный', 'продукт', 'предназначить', 'обеспечение', 'полнота', 'автоматизация', 'деятельность', 'бухгалтер', 'организация', 'умкуп', 'городской', 'градостроительный', 'сервис', 'использование', 'конфигурация', 'бухгалтерия', 'предприятие', 'платформа', '1с', 'предприятие', '8.1', 'часть', 'расчёт', 'заработный', 'плата', 'учёт', 'деятельность', 'сотрудник', 'организация'], ['предполагаться', 'использование', 'система', 'автоматизированный', 'рабочий', 'место', 'главный', 'бухгалтер', 'организация'], ['основный', 'цель', 'создание', 'система', 'являться', 'дополнение', 'существовать', 'информационный', 'система', 'предоставлять', 'возможность', 'расчёт', 'заработный', 'плата', 'организация', 'иметь', 'специфический', 'принцип', 'оплата', 'труд', 'соответствующий', 'функционал', 'затрагивать', 'автоматизация', 'процесс', 'влиять', 'процесс', 'формирование', 'сумма', 'заработный', 'плата', 'повышение', 'эффективность', 'исполнение', 'автоматизируемых', 'процесс', 'путем', 'сокращение', 'непроизводительный', 'дублировать', 'операция', 'операция', 'выполнять', 'вручную', 'оптимизация', 'информационный', 'взаимодействие', 'участник', 'процесс', 'повышение', 'качество', 'принятие', 'управленческий', 'решение', 'счёт', 'оперативность', 'представление', 'полнота', 'достоверность', 'удобство', 'формат', 'отображение', 'информация', 'характеристика', 'объект', 'автоматизация', 'объект', 'автоматизация', 'являться', 'процесс', 'учёт', 'расчёт', 'работник', 'оплата', 'труд', 'организация', 'иметь', 'специфический', 'принцип', 'формирование', 'расчётный', 'сумма', 'часть', 'расчёт', 'сумма', 'сбор', 'документ', 'оперативный_учёт', 'проведение', 'расчёт'], ['требование', 'система', 'требование', 'система', 'целое', 'требование', 'структура', 'функционирование', 'система', 'назначение', 'цель', 'создание', 'система', 'реализовать', 'два', 'подсистема', 'конфигурация', 'бухгалтерия', 'предприятие', 'платформа', '1с', 'предприятие8.1', 'система', 'бухгалтерский', 'учёт', 'система', 'оперативный_учёт', 'подсистема', 'оперативный_учёт', 'содержать', 'механизм', 'позволять', 'вводить', 'система', 'хранить', 'информация', 'текущий', 'деятельность', 'организация'], ['подсистема', 'фиксироваться', 'систематизироваться', 'реализация', 'расчёт', 'сумма', 'начисление'], ['подсистема', 'бухгалтерский', 'учёт', 'содержать', 'механизм', 'реализация', 'учёт', 'расчёт', 'сотрудник', 'организация'], ['подсистема', 'реализовывать', 'процесс', 'расчёт', 'использовать', 'содержаться', 'подсистема', 'оперативный_учёт'], [], ['требование', 'персонал', 'эффективный', 'функционирование', 'система', 'пользователь', 'главный', 'бухгалтер', 'организация', 'автоматизация', 'деятельность', 'предназначить', 'система', 'специалист', 'технический', 'поддержка', 'программный', 'продукт'], [], ['показатель', 'назначение', 'система', 'предусматривать', 'возможность', 'масштабирование', 'производительность', 'объём', 'обрабатывать', 'информация', 'модификация', 'программный', 'обеспечение', 'путем', 'модернизация', 'использовать', 'комплекс', 'технический', 'средство'], ['изменение', 'процесс', 'управление', 'отражаться', 'правильность', 'функционирование', 'система', 'требование', 'надёжность', 'эргономика', 'защита', 'сохранность', 'информация', 'защита', 'внешний', 'воздействие'], ['система', 'сохранять', 'работоспособность', 'обеспечивать', 'восстановление', 'функция', 'возникновение', 'следующий', 'внештатный', 'ситуация', 'сбой', 'система', 'электроснабжение', 'аппаратный', 'часть', 'приводить', 'перезагрузка', 'ос', 'ошибка', 'работа', 'аппаратный', 'средство', 'носитель', 'программа', 'восстановление', 'функция', 'система', 'возлагаться', 'ос', 'ошибка', 'связать', 'программный', 'обеспечение', 'ос', 'драйвер', 'устройство', 'восстановление', 'работоспособность', 'возлагаться', 'ос', 'система', 'обеспечивать', 'корректный', 'обработка', 'аварийный', 'ситуация', 'вызвать', 'неверный', 'действие', 'пользователь', 'неверный', 'формат', 'недопустимый', 'значение', 'входной'], ['указать', 'случай', 'система', 'выдавать', 'пользователь', 'соответствующий', 'сообщение', 'возвращаться', 'рабочий', 'состояние', 'предшествовать', 'неверный', 'недопустимый', 'команда', 'некорректный', 'ввод'], ['система', 'эргономичный'], ['интерфейс', 'система', 'понятный', 'удобный', 'перегрузить', 'графический', 'элемент', 'обеспечивать', 'быстрый', 'отображение', 'экранный', 'форма'], ['навигационный', 'элемент', 'выполнить', 'удобный', 'пользователь', 'форма'], ['средство', 'редактирование', 'информация', 'удовлетворять', 'принять', 'соглашение', 'часть', 'использование', 'функциональный', 'клавиш', 'режим', 'работа', 'поиск', 'использование', 'оконный', 'система'], ['ввод', 'вывод', 'система', 'приём', 'управлять', 'команда', 'отображение', 'результат', 'исполнение', 'выполняться', 'интерактивный', 'режим'], ['интерфейс', 'соответствовать', 'современный', 'эргономический', 'требование', 'обеспечивать', 'удобный', 'доступ', 'основный', 'функция', 'операция', 'система'], ['интерфейс', 'рассчитать', 'преимущественный', 'использование', 'манипулятор', 'тип', 'мышь', 'управление', 'система', 'осуществляться', 'помощь', 'набор', 'экранный', 'меню', 'кнопка', 'значок', 'т'], ['п.', 'элемент'], ['клавиатурный', 'режим', 'ввод', 'использоваться', 'главный', 'образ', 'заполнение', 'редактирование', 'текстовый', 'числовой', 'поле', 'экранный', 'форма'], ['надпись', 'экранный', 'форма', 'сообщение', 'выдавать', 'пользователь', 'системный', 'сообщение', 'русский', 'язык'], ['ис', 'обеспечивать', 'защита', 'несанкционированный', 'доступ'], ['компонент', 'подсистема', 'защита', 'несанкционированный', 'доступ', 'обеспечивать', 'идентификация', 'пользователь', 'проверка', 'полномочие', 'пользователь', 'работа', 'система', 'разграничение', 'доступ', 'пользователь', 'уровень', 'задача', 'информационный', 'массив'], ['требование', 'функциям', 'подсистемам', 'подсистема', 'оперативный_учёт', 'подсистема', 'оперативный_учёт', 'осуществлять', 'ввод', 'хранение', 'оперативный', 'система', 'формирование', 'аналитический', 'отчёт', 'документ', 'система', 'сформировать', 'процесс', 'работа'], ['элемент', 'входить', 'состав', 'подсистема', 'оперативный_учёт', 'обладать', 'следующий', 'основный', 'функциональность', 'постоянный', 'хранение', 'добавление', 'новый', 'элемент', 'редактирование', 'элемент', 'удаление', 'удаление', 'элемент', 'случай', 'существовать', 'объект', 'система', 'ссылаться', 'удалять', 'элемент', 'просмотр', 'элемент', 'просмотр', 'список', 'элемент', 'фильтрация', 'сортировка', 'список', 'элемент', 'поиск', 'элемент', 'экспорт', 'импорт', 'элемент'], ['подсистема', 'бухгалтерский', 'учёт', 'подсистема', 'бухгалтерский', 'учёт', 'средство', 'регистрация', 'бухгалтерский', 'операция', 'формирование', 'основа', 'соответствующий', 'итоговый', 'информация', 'подготовка', 'произвольный', 'бухгалтерский', 'отчёт'], ['подсистема', 'бухгалтерский', 'учёт', 'вести', 'учёт', 'ориентировать', 'первичный', 'документ', 'относиться', 'подсистема', 'оперативный_учёт', 'функция', 'расчёт', 'сумма', 'начисление', 'заработный', 'плата', 'сотрудник', 'основа', 'документ'], ['требование', 'вид', 'обеспечение', 'вид', 'обеспечение', 'предъявляться', 'следующий', 'требование', 'математический', 'предъявляться', 'информационный', 'уровень', 'хранение', 'система', 'построить', 'основа', 'современный', 'субд'], ['обеспечение', 'целостность', 'использоваться', 'встроенные', 'механизм', 'субд'], ['доступ', 'данным', 'предоставить', 'авторизованный', 'пользователь', 'учёт', 'служебный', 'полномочие', 'учёт', 'категория', 'запрашивать', 'информация'], ['технический', 'средство', 'обеспечивать', 'хранение', 'информация', 'использовать', 'современный', 'технология', 'позволять', 'обеспечить', 'повышенный', 'надёжность', 'хранение', 'оперативный', 'замена', 'оборудование'], ['лингвистический', 'система', 'создать', 'основа', 'язык', 'программирование', '1с', '8.1', 'программный', 'технический', 'компьютер', 'конечный', 'пользователь', 'операционный', 'система', 'ms', 'windows', '98', 'xp', 'vista', 'server', '2003/2008', 'процессор', 'intel_pentium', 'ii', '400', 'мгц', 'высоко_рекомендоваться', 'intel_pentium', 'iii', '866', 'мгц', 'оперативный', 'память', '128', 'мбайт', 'высоко_рекомендоваться', '256', 'мбайт', 'жёсткий', 'диск', 'установка', 'использоваться', '120', 'мбайт'], ['компьютер', 'использовать', 'разработка', 'конфигурация', 'операционный', 'система', 'ms', 'windows', '2000', 'xp', 'vista', 'server', '2003/2008', 'процессор', 'intel_pentium', 'iii', '866', 'мгц', 'высоко_рекомендоваться', 'intel_pentium', 'iv', 'celeron', '1800', 'мгц', 'оперативный', 'память', '256', 'мбайт', 'высоко_рекомендоваться', '512', 'мбайт', 'жёсткий', 'диск', 'установка', 'использоваться', '120', 'мбайт', 'компьютер', 'сервер', '1с', 'предприятия', '8.1', 'операционный', 'система', 'ms', 'windows', '2000', 'xp', 'vista', 'server', '2003/2008', 'процессор', 'intel_pentium', 'iii', '866', 'мгц', 'высоко_рекомендоваться', 'intel_pentium', 'iv', 'xeon', '2,4', 'ггц', 'хороший', 'масштабируемость', 'рекомендоваться', 'два', 'процессор', 'оперативный', 'память', '512', 'мбайт', 'высоко_рекомендоваться', '1024', 'мбайт'], ['сервер', 'база', 'microsoft', 'sql', 'server', '2000', '+', 'service', 'pack', '2', 'рекомендоваться', 'service', 'pack', '3a', 'microsoft', 'sql', 'server', '2005'], ['компьютер', 'сервер', 'база', 'операционный', 'система', 'соответствие', 'требование', 'microsoft', 'sql', 'server', 'технический', 'характеристика', 'компьютер', 'соответствовать', 'требование', 'использовать', 'версия', 'сервер', 'база', 'ms', 'sql', 'server', 'метрологический', 'требование', 'предъявляться', 'организационный', 'эффективный', 'функционирование', 'система', 'пользователь', 'необходимый', 'специалист', 'технический', 'поддержка'], ['работа', 'система', 'допускаться', 'сотрудник', 'иметь', 'навык', 'работа', 'персональный', 'компьютер', 'ознакомить', 'правило', 'эксплуатация', 'пройти', 'обучение', 'работа', 'система', 'методический', 'состав', 'методический', 'обеспечение', 'система', 'входить', 'инструкция', 'программист', 'инструкция', 'пользователь'], ['состав', 'содержание', 'работа', 'создание', 'система', 'перечень', 'стадия', 'этап', 'работа', 'срок', 'исполнение', 'представить', 'таблица', '2'], ['таблица', '2'], ['этапы', 'срок', 'исполнение', 'работа', 'работа', 'создание', 'система', 'проводиться', 'физический', 'лицо', 'студентка', 'группа', 'исэд-51', 'улгту', 'башаровой', 'и.с.', 'консультант', 'разработка', 'являться', 'сурков', 'е.в.', 'доцент', 'кафедра', 'информационный', 'система', 'улгту', 'руководитель', 'дипломный', 'проект'], ['порядок', 'контроль', 'приёмка', 'система', 'приёмочный', 'испытание', 'включать', 'проверка', 'полнота', 'качество', 'реализация', 'необходимый', 'функция', 'выполнение', 'каждый', 'требование', 'относиться', 'эргономика', 'работа', 'пользователь', 'диалоговый', 'режим', 'средство', 'метод', 'восстановление', 'работоспособность', 'система', 'отказ', 'полнота', 'действие', 'доступный', 'пользователь', 'достаточность', 'функционирование', 'система', 'реакция', 'система', 'ошибка', 'пользователь'], ['тестирование', 'скорость', 'реакция', 'система', 'команда', 'пользователь'], ['требование', 'состав', 'содержание', 'работа', 'подготовка', 'объект', 'автоматизация', 'ввод', 'система', 'действие', 'подготовка', 'объект', 'автоматизация', 'ввод', 'система', 'действие', 'помощь', 'специалист', 'технический', 'поддержка', 'осуществлять', 'обслуживание', 'использовать', 'организация', 'базовый', 'конфигурация', 'бухгалтерия', 'предприятие', 'выгрузить', 'информация', 'содержаться', 'конфигурация', 'дальнейший', 'использование', 'разработать', 'система'], ['загрузка', 'информация', 'новый', 'конфигурация', 'осуществляться', 'специалист', 'технический', 'поддержка'], ['начало', 'использование', 'система', 'пользователь', 'ознакомиться', 'руководство', 'пользователь', 'содержащимся', 'сопроводительный', 'документация', 'разработать', 'система', 'пройти', 'обучение', 'ознакомление', 'принцип', 'функционирование', 'течение', '1', 'академический', 'час', 'условие', 'владение', 'пользователь', 'навык', 'работа', 'базовый', 'конфигурация', 'бухгалтерия', 'предприятие', 'платформа', '1с', 'предприятие', '8.1'], ['требование', 'документирование', 'разработке', 'подлежать', 'следующий', 'документация', 'инструкция', 'пользователь', 'инструкция', 'программист']]"
|
||
],
|
||
[
|
||
"1",
|
||
"tz_02.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения\nПолное наименование системы: «Автоматизированное рабочее место продавца-консультанта в салоне фотоуслуг» в среде «1С: Предприятие 8.1».\nШифр темы: ДП–УлГТУ– 08080165–05/0978–2010.\nНаименование предприятия заказчика системы, его реквизиты: ООО «УмКо», г.Ульяновск;\nПлановые сроки начала и окончания работ: 1 апреля 2009 года — 15 июня 2009 года;\nСведения об источниках и порядке финансирования работ: данные работы проводятся на безвозмездной основе;\nПорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы все необходимые дистрибутивы, набор инструкций и документации.\n\n2.2.2 Назначение и цели создания системы\nРазработанная система предназначена для автоматизации работы продавца-консультанта салона фотоуслуг по принятию заказов и выполнению различного рода операций над ними, ведению учета принятых, выполненных и выданных заказов.\nЦелью создания системы является повышение скорости и качества работы продавца-консультанта, упрощение выполнения им ряда операций, повышение качества обслуживания клиентов за счет актуальности и достоверности хранимой информации по заказам. \n\n2.2.3 Характеристика объектов автоматизации\nОбъектом автоматизации является торговый зал салона фотоуслуг, в котором осуществляется продажа фототоваров и реализация услуг.\n\n2.2.3.1 Требования к системе в целом \nТребования к структуре и функционированию системы\nПрограммный продукт должен представлять собой единую систему, без разделения на подсистемы. Система должна функционировать в монопольном режиме.\nТребования к персоналу\nДля работы с программой пользователи должны обладать навыками работы на ПЭВМ под управлением операционной системы семейства Windows. Кроме того, пользователи должны обладать знанием предметной области, связанной с оказанием фотоуслуг, а также иметь представление о работе продавца-консультанта, выполняемых им операциях. \nТребования к надежности\nПрограммный продукт должен отслеживать ошибки в работе программы, возникающие при некорректном вводе информации и других ошибочных действий пользователя, обеспечивать максимально возможное сохранение данных и реагировать специальными сообщениями для оповещения пользователя о его некорректных действиях.\nНеобходимо использование лицензионной копии программы «1С: Предприятие».\nТребования к эргономике и технической эстетике\nРазрабатываемая система должна обладать удобным, простым, интуитивно понятным интерфейсом. \nТребования к защите информации от несанкционированного доступа\nВ системе должна быть реализована аутентификация пользователей. Необходимо реализовать хранение данных пользователей и их паролей. Также необходима регулярная смена паролей. \n\n2.2.3.2 Требования к функциям\nПеречень подлежащих автоматизации задач\nРазрабатываемая система должна поддерживать выполнение следующих задач:\nведение учета заказов на всех стадиях их жизненного цикла: прием, выполнение, оплата, выдача;\nоформление и регистрация нового заказа;\nрегистрация полного и частичного выполнения заказа;\nрегистрация оплаты заказа;\nрегистрация выдачи заказа;\nобмен данными между центральным подразделением и филиалами;\nформирование отчетов:\nпо принятым, но невыполненным заказам;\nпо выполненным, но невыданным заказам;\nпо выданным заказам;\nпо выработке сотрудников;\nпо оплатам;\nпо сертификатам.\n\n2.2.3.3 Требования к видам обеспечения\nТребования к техническому обеспечению\nВ состав технических средств должен входить IBM-совместимый персональный компьютер (ПЭВМ), включающий в себя:\nпроцессор – не менее Pentium, 2.0 Hz ;\nОЗУ – не менее 216 Мб;\nоперационная система – Windows 2000, XP, Vista.\nТребования к программному обеспечению\nДля функционирования разрабатываемой системы необходимо наличие:\nоперационной системы MS Windows 98/Me/2000/XP;\n1С: Предприятие 8.1.\nТребования к лингвистическому обеспечению\nПри создании программного продукта необходимо использовать язык программирования «1С v8.1».\nТребования к методическому обеспечению\nНеобходимо наличие следующей нормативно-технической документации:\nинструкция программисту; \nинструкция пользователю.\n\n2.2.4 Перечень этапов работ и сроки исполнения\nЭтапы и сроки проведения работ приведены в таблице 1.\n\nТаблица 1\nЭтапы и сроки выполнения работ\n\n2.2.5 Состав исполнителей работ\nРаботы по созданию системы проводятся физическим лицом, Гайдуковой Марией Николаевной, студенткой УлГТУ.\nПри этом консультантом выступает руководитель дипломного проекта Суркова Елена Викторовна.\n\n2.2.6 Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nВ рамках подготовки объекта автоматизации к вводу системы необходимо заполнить следующие справочники для получения актуальной информации и возможности работы с системой:\nсправочник Подразделения;\nсправочник Номенклатура;\nсправочник Клиенты;\nсправочник Вид услуги;\nсправочник Скидка;\nсправочник Пользователи.\nКроме того, необходимо настроить план обмена «Основной». Для этого нужно заполнить данные текущего узла, а также тех узлов, с которыми он будет производить обмен данными. Необходимо указать узел, который будет считаться Центральным, так как обмен производится в следующих направлениях:\nвыгрузка данных производится со всех узлов, кроме Центрального;\nзагрузка данных производится только центральным узлом. \n\n2.2.7 Требования к документированию\nНеобходимо наличие следующих документов: \nинструкция пользователю;\nинструкция программисту.",
|
||
"0",
|
||
"[['2.2', 'технический', 'задание', '2.2.1', 'общий', 'сведение', 'полный', 'наименование', 'система', 'автоматизированный', 'рабочий', 'место', 'продавец', 'консультант', 'салон', 'фотоуслуг', 'среда', '1с', 'предприятие', '8.1'], ['шифр', 'тема', 'дп', 'улгту', '08080165–05/0978–2010'], ['наименование', 'предприятие', 'заказчик', 'система', 'реквизит', 'ооо', 'умко', 'г.', 'ульяновск', 'плановый', 'срок', 'окончание', 'работа', '1', 'апрель', '2009', 'год', '15', 'июнь', '2009', 'год', 'сведение', 'источник', 'порядок', 'финансирование', 'работа', 'работа', 'проводиться', 'безвозмездный', 'основа', 'порядок', 'оформление', 'предъявление', 'заказчик', 'результат', 'работа', 'создание', 'система', 'часть', 'отдельный', 'средство', 'окончание', 'работа', 'заказчик', 'предъявить', 'передать', 'дистрибутив', 'набор', 'инструкция', 'документация'], ['2.2.2', 'назначение', 'цель', 'создание', 'система', 'разработанная', 'система', 'предназначить', 'автоматизация', 'работа', 'продавец', 'консультант', 'салон', 'фотоуслуг', 'принятие', 'заказ', 'выполнение', 'различный', 'род', 'операция', 'ведение', 'учёт', 'принять', 'выполнить', 'выдать', 'заказ'], ['цель', 'создание', 'система', 'являться', 'повышение', 'скорость', 'качество', 'работа', 'продавец', 'консультант', 'упрощение', 'выполнение', 'ряд', 'операция', 'повышение', 'качество', 'обслуживание', 'клиент', 'счёт', 'актуальность', 'достоверность', 'хранить', 'информация', 'заказ'], ['2.2.3', 'характеристика', 'объект', 'автоматизация', 'объект', 'автоматизация', 'являться', 'торговый', 'зал', 'салон', 'фотоуслуг', 'осуществляться', 'продажа', 'фототоваров', 'реализация', 'услуга'], ['2.2.3.1', 'требование', 'система', 'целое', 'требование', 'структура', 'функционирование', 'система', 'программный', 'продукт', 'представлять', 'единый', 'система', 'разделение', 'подсистема'], ['система', 'функционировать', 'монопольный', 'режим'], ['требование', 'персонал', 'работа', 'программа', 'пользователь', 'обладать', 'навык', 'работа', 'пэвм', 'управление', 'операционный', 'система', 'семейство', 'windows'], ['пользователь', 'обладать', 'знание', 'предметный', 'область', 'связать', 'оказание', 'фотоуслуг', 'представление', 'работа', 'продавец', 'консультант', 'выполнять', 'операция'], ['требование', 'надёжность', 'программный', 'продукт', 'отслеживать', 'ошибка', 'работа', 'программа', 'возникать', 'некорректный', 'ввод', 'информация', 'ошибочный', 'действие', 'пользователь', 'обеспечивать', 'максимально', 'возможный', 'сохранение', 'реагировать', 'специальный', 'сообщение', 'оповещение', 'пользователь', 'некорректный', 'действие'], ['использование', 'лицензионный', 'копия', 'программа', '1с', 'предприятие'], ['требование', 'эргономика', 'технический', 'эстетика', 'разрабатываемая', 'система', 'обладать', 'удобный', 'простой', 'интуитивно', 'понятный', 'интерфейс'], ['требование', 'защита', 'информация', 'несанкционированный', 'доступ', 'система', 'реализовать', 'аутентификация', 'пользователь'], ['реализовать', 'хранение', 'пользователь', 'пароль'], ['необходимый', 'регулярный', 'смена', 'пароль'], ['2.2.3.2', 'требование', 'функция', 'перечень', 'подлежать', 'автоматизация', 'задача', 'разрабатываемая', 'система', 'поддерживать', 'выполнение', 'следующий', 'задача', 'ведение', 'учёт', 'заказ', 'стадия', 'жизненный', 'цикл', 'приём', 'выполнение', 'оплата', 'выдача', 'оформление', 'регистрация', 'новый', 'заказ', 'регистрация', 'полный', 'частичный', 'выполнение', 'заказ', 'регистрация', 'оплата', 'заказ', 'регистрация', 'выдача', 'заказ', 'обмен', 'данными', 'центральный', 'подразделение', 'филиал', 'формирование', 'отчёт', 'принять', 'невыполненный', 'заказ', 'выполнить', 'невыданным', 'заказ', 'выдать', 'заказ', 'выработка', 'сотрудник', 'оплатам', 'сертификат'], ['2.2.3.3', 'требование', 'вид', 'обеспечение', 'требование', 'технический', 'обеспечение', 'состав', 'технический', 'средство', 'входить', 'ibm', 'совместимый', 'персональный', 'компьютер', 'пэвм', 'включать', 'процессор', 'pentium', '2.0', 'hz', 'озу', '216', 'мб', 'операционный', 'система', 'windows', '2000', 'xp', 'vista'], ['требование', 'программный', 'обеспечение', 'функционирование', 'разрабатывать', 'система', 'наличие', 'операционный', 'система', 'ms', 'windows', '98', 'me/2000', 'xp', '1с', 'предприятие', '8.1'], ['требование', 'лингвистический', 'обеспечение', 'создание', 'программный', 'продукт', 'использовать', 'язык', 'программирование', '1с', 'v8.1'], ['требование', 'методический', 'обеспечение', 'наличие', 'следующий', 'нормативный', 'технический', 'документация', 'инструкция', 'программист', 'инструкция', 'пользователь'], ['2.2.4', 'перечень', 'этап', 'работа', 'срок', 'исполнение', 'этапы', 'срок', 'проведение', 'работа', 'привести', 'таблица', '1'], ['таблица', '1', 'этапы', 'срок', 'выполнение', 'работа', '2.2.5', 'состав', 'исполнитель', 'работа', 'работа', 'создание', 'система', 'проводиться', 'физический', 'лицо', 'гайдуковой', 'мария', 'николаевич', 'студентка', 'улгту'], ['консультант', 'выступать', 'руководитель', 'дипломный', 'проект', 'сурков', 'елена', 'викторович'], ['2.2.6', 'требование', 'состав', 'содержание', 'работа', 'подготовка', 'объект', 'автоматизация', 'ввод', 'система', 'действие', 'рамка', 'подготовка', 'объект', 'автоматизация', 'ввод', 'система', 'заполнить', 'следующий', 'справочник', 'получение', 'актуальный', 'информация', 'возможность', 'работа', 'система', 'справочник', 'подразделение', 'справочник', 'номенклатура', 'справочник', 'клиенты', 'справочник', 'вид', 'услуга', 'справочник', 'скидка', 'справочник', 'пользователь'], ['настроить', 'план', 'обмен', 'основной'], ['заполнить', 'текущий', 'узел', 'узел', 'производить', 'обмен', 'данными'], ['указать', 'узел', 'считаться', 'центральным', 'обмен', 'производиться', 'следующий', 'направление', 'выгрузка', 'производиться', 'узел', 'центральный', 'загрузка', 'производиться', 'центральный', 'узел'], ['2.2.7', 'требование', 'документирование', 'наличие', 'следующий', 'документ', 'инструкция', 'пользователь', 'инструкция', 'программист']]"
|
||
],
|
||
[
|
||
"2",
|
||
"tz_03.docx",
|
||
"2.2. Техническое задание\nОбщие сведения:\nВ данной главе представлены общие сведения о системе:\nполное наименование системы и ее условное обозначение:\nWeb-ориентированная автоматизированная система учета услуг туристической фирмы;\nшифр темы или шифр (номер) договора: данный программный продукт разрабатывался в рамках дипломного проектирования, какой-либо договор не заключался; \nнаименование предприятий разработчика и заказчика системы, их реквизиты:\nпредприятие-разработчик: ООО «Волгасофт» (ИНН/КПП 7325082859/73251001, г.Ульяновск, ул.Брестская, 78);\nпредприятие-заказчик: ООО «Goodline» (ИНН/КПП 6313535100/631301001, г.Самара, МОСКОВСКОЕ ШОССЕ,81а);\nперечень документов, на основании которых создается информационная база: спецпредложения туроператора.\nплановые сроки начала и окончания работ:\nначало работы: 1 марта 2010 года;\nокончание работы: 31 мая 2010 года;\nсведения об источниках и порядке финансирования работ: данные работы проводятся на безвозмездной основе;\nпорядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы установочный диск со всеми необходимыми дистрибутивами, набор инструкций и документации для полноценного функционирования указанной системы.\n\nНазначение и цели создания системы\nвид автоматизируемой деятельности.\nРазработанная система предназначена для автоматизации бронирования туров, учета клиентов, ведения базы данных туров.\nперечень объектов, на которых предполагается использование системы. \nДанную систему предполагается использовать в ООО «Goodline».\nнаименование и требуемые значения технических, технологических, производственно-экономических и др. показателей объекта, которые должны быть достигнуты при внедрении ИС.\n При внедрении ИС должны быть достигнуты следующие цели: \nс технологической точки зрения: должен быть упрощен процесс взаимодействия турагента с клиентами, улучшено качество работы с клиентом;\nс производственно-экономической точки зрения: должно быть сокращено время на организацию работы с клиентами и формирование соответствующей отчетности.\n\nХарактеристика объектов автоматизации\nОбъектом автоматизации является ООО «Goodline». Это предприятие специализируется в области предоставления туристических услуг. В фирме существуют разные типы туров: горнолыжные, отдых на море, лечебные и др. Осуществляются поездки по различным направлениям.\nВ своей работе ООО «Goodline» использует только зарекомендовавшие себя в российских условиях туроператоры, таких как Coral Travel, Pegas Touristic, Ingtour. Профессиональные и доброжелательные сотрудники, оказывают внимание каждому клиенту. Фирма предлагает идеальное соотношение цены и качества. В программы включено максимальное количество оригинальных экскурсий. Большой выбор отелей и апартаментов любой категории по конкурентоспособным ценам. Турфирма предлагает гибкую систему скидок клиентам. Оплата услуг осуществляется в любой удобной для клиента форме – наличный и безналичный расчет\nПолитика организации нацелена на обслуживание клиентов по популярным направлениям а также принятие заказов на индивидуальные туры.\n\nТребования к системе\nТребования к системе в целом\nТребования к структуре и функционированию системы\nРазработанная система должна состоять из следующих подсистем:\nпланирование работы с клиентами;\nанализ сбытовой деятельности.\nПервая подсистема должна предоставить турагенту возможность спланировать своевременное взаимодействие с клиентом с тем, чтобы ни один клиент не оказался «забытым».\nВторая подсистема должна подсчитывать и наглядно представлять экономический результат деятельности, сбыт товаров и услуг.\nТребования к персоналу\nЧисло человек, работающих с системой, неограниченно. Оно определяется количеством турагентов в организации. Кроме того, необходим системный администратор.\nСистемный администратор должен обладать знаниями по настройке веб-сервера, а также выполнять соответствующую настройку и поддержку.\nТурагент должен иметь соответственно квалификацию турагента и быть уверенным пользователем интернет и обладать навыками работы с браузерами.\nСтепень приспособляемости системы\nДанная система должна быть гибкой в отношении изменения отчетов, должна обеспечивать настройку их параметров.\nТребования к надежности, безопасности, эргономике, транспортабельности, эксплуатации, техническому обслуживанию и ремонту, защите и сохранности информации, защите от внешних воздействий, к патентной чистоте, по стандартизации и унификации.\nСистема должна быть надежной, т.е. отказоустойчивой к ошибкам пользователя (нарушения правильной последовательности действий).\nОна должна быть удобна для работы пользователя. \n\tДолжна быть предусмотрена возможность обслуживания системы, в том числе и сторонними разработчиками.\n\tДолжна присутствовать авторизация и аутентификация пользователя, возможность тонкой настройки доступа к объектам и функциям системы. \nПрограммный продукт должен быть патентно чист и иметь возможность законно использоваться в коммерческих целях. Разрабатываемый программный продукт является патентно-чистым. Для функционирования системы необходима покупка либо аренда веб-сервера.\n\n2.2.4.2 Требования к функциям (по подсистемам)\nПеречень подлежащих автоматизации задач:\nбронирование тура;\nголосование;\nобратная связь;\nхранение базы клиентов;\nхранение и обновление базы туров;\nудобный интерфейс;\nдружественный дизайн;\nтуристический форум;\nпередача ссылки;\nновости.\nВременной регламент реализации каждой функции.\nРеализация всех функций должна быть выполнена согласно с этапами и сроками выполнения работ.\nТребования к качеству реализации каждой функции, к форме представления выходной информации, характеристики точности, достоверности выдачи результатов.\nПеречень и критерии отказов.\n\n2.2.4.3 Требования к видам обеспечения\nСистема предъявляет следующие требования к видам обеспечения:\nа) математическому: пользователь должен быть знаком с методикой проведения горизонтального (временного) анализа, вертикального (структурного) анализа;\nб) информационному: Denwer 3 (Apache, PHP, MySQL) – набор дистрибутивов (Apache, PHP, MySQL, Perl и т.д.) и программная оболочка, используемые Web-разработчиками для разработки сайтов на «домашней» (локальной) Windows-машине без необходимости выхода в Интернет. Главная особенность Денвера — удобство при удаленной работе сразу над несколькими независимыми проектами и возможность размещения на Flash-накопителе.;\nв) лингвистическому: используется язык программирования «PHP» и Java-script;\nг) программному и техническому: \n 1) компьютер конечного пользователя (рекомендуемые параметры): \nоперационная система: MS Windows 2000/ XP / Server 2003; \nпроцессор Intel Pentium III 866 МГц; \nоперативная память 256 Мбайт; \n2) компьютер, используемый для разработки конфигураций: \nоперационная система: MS Windows 2000/ XP / Server 2003; \nIntel Pentium IV/Celeron 1800 МГц ; \nоперативная память 512 Мбайт; \n3) сервер ПП: \nоперационная система: MS Windows 2000/Server 2003, ОС семейства UNIX; \nпроцессор Intel Pentium IV/Xeon 2,4 ГГц, рекомендуется два и более процессоров; \nоперативная память 1024 Мбайт; \n4) сервер баз данных: \nтехнические характеристики компьютера и операционная система должны соответствовать требованиям Microsoft SQL Server 2005, MYSQL Server; \nд) организационному: для функционирования системы необходимы системный администратор и несколько менеджеров;\nе) методическому (состав нормативно-технической документации):\nинструкция программисту; \nинструкция пользователю.\n\nСостав и содержание работ по созданию системы\nПеречень этапов работ и сроки исполнения\nПеречень этапов работ и сроки исполнения представлены в таблице 2.1\nТаблица 2.1 \nОсновные этапы работ и сроки их исполнения\n\nСостав исполнителей работ\nРаботы по созданию системы проводились физическим лицом – Гимадиевой Ч.Р., студенткой УлГТУ, под руководством преподавателя кафедры «Информационные системы» Наместникова Алексея Михайловича.\n\n2.2.6 Требования к программной документации\nТехническое задание\nЭкономическая часть\nИнструкция пользователя ГОСТ 19.505-79 \"РУКОВОДСТВО ОПЕРАТОРА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\"\nИнструкция программиста ГОСТ 19.503-79 \"РУКОВОДСТВО СИСТЕМНОГО ПРОГРАММИСТА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\" и ГОСТ 19.504-79 \"РУКОВОДСТВО ПРОГРАММИСТА. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ\"\nПояснительная записка",
|
||
"0",
|
||
"[['2.2'], ['технический', 'задание', 'общий', 'сведение', 'глава', 'представить', 'общий', 'сведение', 'система', 'полный', 'наименование', 'система', 'условный', 'обозначение', 'web', 'ориентированный', 'автоматизированный', 'система', 'учёт', 'услуга', 'туристический', 'фирма', 'шифр', 'тема', 'шифр', 'номер', 'договор', 'программный', 'продукт', 'разрабатываться', 'рамка', 'дипломный', 'проектирование', 'договор', 'заключаться', 'наименование', 'предприятие', 'разработчик', 'заказчик', 'система', 'реквизит', 'предприятие', 'разработчик', 'ооо', 'волгасофт', 'инн', 'кпп', '7325082859/73251001', 'г.', 'ульяновск', 'ул.', 'брестский', '78', 'предприятие', 'заказчик', 'ооо', 'goodline', 'инн', 'кпп', '6313535100/631301001', 'г.', 'самара', 'московское', 'шоссе,81а', 'перечень', 'документ', 'основание', 'создаваться', 'информационный', 'база', 'спецпредложения', 'туроператор'], ['плановый', 'срок', 'окончание', 'работа', 'начало', 'работа', '1', 'март', '2010', 'год', 'окончание', 'работа', '31', 'май', '2010', 'год', 'сведение', 'источник', 'порядок', 'финансирование', 'работа', 'работа', 'проводиться', 'безвозмездный', 'основа', 'порядок', 'оформление', 'предъявление', 'заказчик', 'результат', 'работа', 'создание', 'система', 'часть', 'отдельный', 'средство', 'окончание', 'работа', 'заказчик', 'предъявить', 'передать', 'установочный', 'диск', 'необходимый', 'дистрибутив', 'набор', 'инструкция', 'документация', 'полноценный', 'функционирование', 'указать', 'система'], ['назначение', 'цель', 'создание', 'система', 'вид', 'автоматизировать', 'деятельность', 'разработанная', 'система', 'предназначить', 'автоматизация', 'бронирование', 'тур', 'учёт', 'клиент', 'ведение', 'база', 'тур'], ['перечень', 'объект', 'предполагаться', 'использование', 'система'], ['данную', 'система', 'предполагаться', 'использовать', 'ооо', 'goodline'], ['наименование', 'требуемые', 'значение', 'технический', 'технологический', 'производственный', 'экономический', 'и др.'], ['показатель', 'объект', 'достигнуть', 'внедрение', 'ис'], ['внедрение', 'ис', 'достигнуть', 'следующий', 'цель', 'технологический', 'точка', 'зрение', 'упростить', 'процесс', 'взаимодействие', 'турагента', 'клиент', 'улучшить', 'качество', 'работа', 'клиент', 'производственный', 'экономический', 'точка', 'зрение', 'сократить', 'время', 'организация', 'работа', 'клиент', 'формирование', 'соответствующий', 'отчётность'], ['характеристика', 'объект', 'автоматизация', 'объект', 'автоматизация', 'являться', 'ооо', 'goodline'], ['предприятие', 'специализироваться', 'область', 'предоставление', 'туристический', 'услуга'], ['фирма', 'существовать', 'разный', 'тип', 'тур', 'горнолыжный', 'отдых', 'море', 'лечебный', 'и др.'], ['осуществляться', 'поездка', 'различный', 'направление'], ['работа', 'ооо', 'goodline', 'использовать', 'зарекомендовать', 'российский', 'условие', 'туроператор', 'coral', 'travel', 'pegas', 'touristic', 'ingtour'], ['профессиональный', 'доброжелательный', 'сотрудник', 'оказывать', 'внимание', 'каждый', 'клиент'], ['фирма', 'предлагать', 'идеальный', 'соотношение', 'цена', 'качество'], ['программы', 'включить', 'максимальный', 'количество', 'оригинальный', 'экскурсия'], ['большой', 'выбор', 'отель', 'апартамент', 'категория', 'конкурентоспособный', 'цена'], ['турфирма', 'предлагать', 'гибкий', 'система', 'скидка', 'клиент'], ['оплата', 'услуга', 'осуществляться', 'удобный', 'клиент', 'форме', 'наличный', 'безналичный', 'расчёт', 'политик', 'организация', 'нацелить', 'обслуживание', 'клиент', 'популярный', 'направление', 'принятие', 'заказ', 'индивидуальный', 'тур'], ['требование', 'система', 'требование', 'система', 'целое', 'требование', 'структура', 'функционирование', 'система', 'разработанная', 'система', 'состоять', 'следующий', 'подсистема', 'планирование', 'работа', 'клиент', 'анализ', 'сбытовый', 'деятельность'], ['первый', 'подсистема', 'предоставить', 'турагенту', 'возможность', 'спланировать', 'своевременный', 'взаимодействие', 'клиент', 'ни', 'клиент', 'оказаться', 'забыть'], ['второй', 'подсистема', 'подсчитывать', 'наглядно', 'представлять', 'экономический', 'результат', 'деятельность', 'сбыт', 'товар', 'услуга'], ['требование', 'персонал', 'число', 'человек', 'работать', 'система', 'неограниченный'], ['определяться', 'количество', 'турагентов', 'организация'], ['необходимый', 'системный', 'администратор'], ['системный', 'администратор', 'обладать', 'знание', 'настройка', 'веб', 'сервера', 'выполнять', 'соответствующий', 'настройка', 'поддержка'], ['турагент', 'соответственно', 'квалификация', 'турагента', 'уверенный', 'пользователь', 'интернет', 'обладать', 'навык', 'работа', 'браузер'], ['степень', 'приспособляемость', 'система', 'система', 'гибкий', 'отношение', 'изменение', 'отчёт', 'обеспечивать', 'настройка', 'параметр'], ['требование', 'надёжность', 'безопасность', 'эргономика', 'транспортабельность', 'эксплуатация', 'технический', 'обслуживание', 'ремонт', 'защита', 'сохранность', 'информация', 'защита', 'внешний', 'воздействие', 'патентный', 'чистота', 'стандартизация', 'унификация'], ['система', 'надёжный', 'т.е.', 'отказоустойчивой', 'ошибка', 'пользователь', 'нарушение', 'правильный', 'последовательность', 'действие'], ['удобный', 'работа', 'пользователь'], ['предусмотреть', 'возможность', 'обслуживание', 'система', 'число', 'сторонний', 'разработчик'], ['присутствовать', 'авторизация', 'аутентификация', 'пользователь', 'возможность', 'тонкий', 'настройка', 'доступ', 'объект', 'функция', 'система'], ['программный', 'продукт', 'патентный', 'чистый', 'возможность', 'законно', 'использоваться', 'коммерческий', 'цель'], ['разрабатываемый', 'программный', 'продукт', 'являться', 'патентный', 'чистый'], ['функционирование', 'система', 'необходимый', 'покупка', 'аренда', 'веб', 'сервера'], ['2.2.4.2', 'требование', 'функциям', 'подсистемам', 'перечень', 'подлежать', 'автоматизация', 'задача', 'бронирование', 'тур', 'голосование', 'обратный', 'связь', 'хранение', 'база', 'клиент', 'хранение', 'обновление', 'база', 'тур', 'удобный', 'интерфейс', 'дружественный', 'дизайн', 'туристический', 'форум', 'передача', 'ссылка', 'новость'], ['временной', 'регламент', 'реализация', 'каждый', 'функция'], ['реализация', 'функция', 'выполнить', 'согласно', 'этап', 'срок', 'выполнение', 'работа'], ['требование', 'качество', 'реализация', 'каждый', 'функция', 'форма', 'представление', 'выходной', 'информация', 'характеристика', 'точность', 'достоверность', 'выдача', 'результат'], ['перечень', 'критерий', 'отказ'], ['2.2.4.3', 'требование', 'вид', 'обеспечение', 'система', 'предъявлять', 'следующий', 'требование', 'вид', 'обеспечение', 'математический', 'пользователь', 'знакомый', 'методика', 'проведение', 'горизонтальный', 'временной', 'анализ', 'вертикальный', 'структурный', 'анализ', 'информационный', 'denwer', '3', 'apache', 'php', 'mysql', 'набор', 'дистрибутив', 'apache', 'php', 'mysql', 'perl', 'т.д.', 'программный', 'оболочка', 'использовать', 'web', 'разработчик', 'разработка', 'сайт', 'домашний', 'локальный', 'windows', 'машина', 'выход', 'интернет'], ['главный', 'особенность', 'денвер', 'удобство', 'удалённый', 'работа', 'несколько', 'независимый', 'проект', 'возможность', 'размещение', 'flash', 'накопитель'], ['лингвистический', 'использоваться', 'язык', 'программирование', 'php', 'java', 'script', 'программный', 'технический', '1', 'компьютер', 'конечный', 'пользователь', 'рекомендовать', 'параметр', 'операционный', 'система', 'ms', 'windows', '2000/', 'xp', 'server', '2003', 'процессор', 'intel', 'pentium', 'iii', '866', 'мгц', 'оперативный', 'память', '256', 'мбайт', '2', 'компьютер', 'использовать', 'разработка', 'конфигурация', 'операционный', 'система', 'ms', 'windows', '2000/', 'xp', 'server', '2003', 'intel', 'pentium', 'iv', 'celeron', '1800', 'мгц', 'оперативный', 'память', '512', 'мбайт', '3', 'сервер', 'пп', 'операционный', 'система', 'ms', 'windows', '2000', 'server', '2003', 'ос', 'семейство', 'unix', 'процессор', 'intel', 'pentium', 'iv', 'xeon', '2,4', 'ггц', 'рекомендоваться', 'два', 'процессор', 'оперативный', 'память', '1024', 'мбайт', '4', 'сервер', 'база', 'технический', 'характеристика', 'компьютер', 'операционный', 'система', 'соответствовать', 'требование', 'microsoft', 'sql', 'server', '2005', 'mysql', 'server', 'организационный', 'функционирование', 'система', 'необходимый', 'системный', 'администратор', 'менеджер', 'методический', 'состав', 'нормативный', 'технический', 'документация', 'инструкция', 'программист', 'инструкция', 'пользователь'], ['состав', 'содержание', 'работа', 'создание', 'система', 'перечень', 'этап', 'работа', 'срок', 'исполнение', 'перечень', 'этап', 'работа', 'срок', 'исполнение', 'представить', 'таблица', '2.1', 'таблица', '2.1', 'основной', 'этап', 'работа', 'срок', 'исполнение', 'состав', 'исполнитель', 'работа', 'работа', 'создание', 'система', 'проводиться', 'физический', 'лицо', 'гимадиевой', 'ч.р.', 'студентка', 'улгту', 'руководство', 'преподаватель', 'кафедра', 'информационный', 'система', 'наместникова', 'алексей', 'михаилович'], ['2.2.6', 'требование', 'программный', 'документация', 'технический', 'задание', 'экономический', 'часть', 'инструкция', 'пользователь', 'гост', '19.505', '79', 'руководство', 'оператора'], ['требования', 'содержанию', 'оформлению', 'инструкция', 'программист', 'гост', '19.503', '79', 'руководство', 'системного', 'программист'], ['требования', 'содержанию', 'оформлению', 'гост', '19.504', '79', 'руководство', 'программист'], ['требования', 'содержанию', 'оформлению', 'пояснительный', 'записка']]"
|
||
],
|
||
[
|
||
"3",
|
||
"tz_04.docx",
|
||
"Техническое задание\n2.2.1 Общие сведения\nИнтернет-магазин ООО «Практика» разработан для осуществления торгоаой деятельности через Интернет. Данный продукт разработала Громакова Елена для ООО «Практика». Плановый срок начала работ — февраль 2010 года, окончание работ — июнь 2010 года. Данный программный родукт выполняется безвозмездно. \n\n2.2.2 Назначение и цели создания системы\nИнтернет-магазин ООО «Практика» разрабатывается для \nосуществления оптовой и розничной реализации товаров через Интернет. \nОсновными элементами прикладного решения являются:\nОформление заказа;\nОповещение покупателя об успешном совершении заказа;\nОповещение продавца о новом заказе.\nДанный интернет-магазин разрабатывается для удобства поупателей, чтобы они могли наглядно ознакомиться с предлагаемой продукцией. А также для удобства менеджеров которые будут обрабатывать эти заказы, т.к. намного проще обработать готовый заказ, чем вначале записать на листок, затем перенести эти данные в базу, после чего согласовать счет. В интернет-магазине покупатель самостоятельно будет формировать свой заказ, где будет видеть цены и итоговую сумму.\n\n2.2.3 Характеристика объектов автоматизации\nИнтернет-магазин – это магазин, «витрина» которого расположена в интернете и который дает возможность заказывать товар через интернет. \nНа сайте магазина представлен подробный каталог товаров с ценами, на основе которого пользователь формирует свой заказ. Заказывая товары в интернет-магазине, покупатель может получать их с курьером, а расплачиваться наличным или безналичным расчетом.\nПреимущества которые дает интернет-магазин:\nИнтернет-магазин работает 24 часа в сутки, 365 дней в году, без перерыва на обед, без выходных и праздничных дней.\nДоступ к виртуальной витрине магазина может получить любой покупатель.\nИнтернет-магазин не имеет ограничений на виртуальную площадь. Можно разместить сколь угодно товаров.\nСрок и стоимость создания интернет-магазина несоизмеримо ниже, чем обычного магазина.\nДля создания интернет-магазина не требуется получения многочисленных разрешений и лицензий. Его не проверяет пожарный инспектор, санэпидемстанция и другие службы.\nИнтернет-магазины — это наше недалекое будущее. В городах миллионниках они пользуются большим спросом. Кажется что их уже достаточно много, но перенасыщенности в этой сфере пока нет. Содержать интернет-магазин намного выгоднее чем его аналог. За него не нужно платить арендную плату или зарплату продавцам. Он прост и удобен в применении. Экспуатировать его так же легко. Все что для этого нужно — это подключение к сети Интернет.\n\n2.2.4 Требования к системе\nТребования к системе в целом:\n- удобный интерфейс, рассчитанный на неопытного пользователя;\n- возможность быстрого поиска как по наименованию товара, так и по его характеристикам;\n- возможность ввода и хранения данных неограниченного числа зарегистрированных пользователей;\n- защита от ошибок пользователей (не заполнение всех необходимы полей при регистрации пользователя или при оформлении заказа);\n- воозможность необходимых настроек системы.\nТребования к составу функций:\nВсе пользователи, работающие с программой могут иметь разные права. В пользовательском режиме это может быть, например, группа «оптовики» (их преимущество в том, что когда они зайдут на сайт под своим пролем - получат 5% скидку на весь товар). В режиме администратора также может быть несколько пользователей. Наделяет пользователей правами главный администратор. \nГлавный администратор может:\n1. Добавлять и удалять любую информацию на сайте (новости, товар, описание продукции, баннеры и т.д.);\n2. Изменять внешний вид сайта;\n3. Наделять правами пользователей.\nТребования к инструментальным средствам\nДля разработки программного продукта использовать систему управления сайтом (CMS) Joomla 1.5 и расширение Virtuemart 1.1. Если разработка осуществляется на локальном компьютере, то необходимо использовать Денвер. Денвер — набор дистрибутивов и программная оболочка, предназначенный для создания и отладки сайтов на локальной Windows-машине, без подключения к сети Интернет. \nТребования к системному ПО и техническому обеспечению\nПрограммный продукт ориентирован на работу под управлением операционной системы Windows: 98, 2000, XP, Vista, 7, CPU 1 Ghz, 256 Мб оперативной памяти, подключение к интернет.\nТребования к интерфейсу\nПрограммный продукт должен быть ориентирован на неподготовленного пользователя ЭВМ, имеющего начальные навыки работы с ОС Windows и Internet. Общение с компьютером должно осуществляться на основе графического оконного интерфейса в виде меню, списков, кнопок, полей ввода данных. \nПеречень этапов работ и сроки исполнения \nПеречень этапов работ и сроки исполнения представлены в таблице 2.1\n Таблица 2.1 Перечень этапов работ и сроки исполнения.",
|
||
"0",
|
||
"[['технический', 'задание', '2.2.1', 'общий', 'сведение', 'интернет', 'магазин', 'ооо', 'практика', 'разработать', 'осуществление', 'торгоаой', 'деятельность', 'интернет'], ['продукт', 'разработать', 'громаков', 'елена', 'ооо', 'практика'], ['плановый', 'срок', 'работа', 'февраль', '2010', 'год', 'окончание', 'работа', 'июнь', '2010', 'год'], ['программный', 'родукт', 'выполняться', 'безвозмездно'], ['2.2.2', 'назначение', 'цель', 'создание', 'система', 'интернет', 'магазин', 'ооо', 'практика', 'разрабатываться', 'осуществление', 'оптовый', 'розничный', 'реализация', 'товар', 'интернет'], ['основный', 'элемент', 'прикладной', 'решение', 'являться', 'оформление', 'заказ', 'оповещение', 'покупатель', 'успешный', 'совершение', 'заказ', 'оповещение', 'продавец', 'новый', 'заказ'], ['интернет', 'магазин', 'разрабатываться', 'удобство', 'поупателей', 'наглядно', 'ознакомиться', 'предлагать', 'продукция'], ['удобство', 'менеджер', 'обрабатывать', 'заказ', 'т.к.', 'намного', 'обработать', 'готовый', 'заказ', 'записать', 'листок', 'перенести', 'база', 'согласовать', 'счёт'], ['интернет', 'магазине', 'покупатель', 'самостоятельно', 'формировать', 'заказ', 'видеть', 'цена', 'итоговый', 'сумма'], ['2.2.3', 'характеристика', 'объект', 'автоматизация', 'интернет', 'магазин', 'магазин', 'витрина', 'расположена', 'интернет', 'давать', 'возможность', 'заказывать', 'товар', 'интернет'], ['сайт', 'магазин', 'представить', 'подробный', 'каталог', 'товар', 'цена', 'основа', 'пользователь', 'формировать', 'заказ'], ['заказывать', 'товар', 'интернет', 'магазине', 'покупатель', 'получать', 'курьер', 'расплачиваться', 'наличный', 'безналичный', 'расчёт'], ['преимущество', 'давать', 'интернет', 'магазин', 'интернет', 'магазин', 'работать', '24', 'час', 'сутки', '365', 'день', 'год', 'перерыв', 'обед', 'выходной', 'праздничный', 'день'], ['доступ', 'виртуальный', 'витрина', 'магазин', 'получить', 'покупатель'], ['интернет', 'магазин', 'ограничение', 'виртуальный', 'площадь'], ['разместить', 'сколь', 'угодно', 'товар'], ['срок', 'стоимость', 'создание', 'интернет', 'магазина', 'несоизмеримый', 'обычный', 'магазин'], ['создание', 'интернет', 'магазина', 'требоваться', 'получение', 'многочисленный', 'разрешение', 'лицензия'], ['проверять', 'пожарный', 'инспектор', 'санэпидемстанция', 'служба'], ['интернет', 'магазины', 'недалёкий', 'будущее'], ['город', 'миллионник', 'пользоваться', 'больший', 'спрос'], ['достаточно', 'перенасыщенность', 'сфера'], ['содержать', 'интернет', 'магазин', 'намного', 'выгодный', 'аналог'], ['платить', 'арендный', 'плата', 'зарплата', 'продавец'], ['простой', 'удобный', 'применение'], ['экспуатировать', 'лёгкий'], ['подключение', 'сеть', 'интернет'], ['2.2.4', 'требование', 'система', 'требование', 'система', 'целое', 'удобный', 'интерфейс', 'рассчитать', 'неопытный', 'пользователь', 'возможность', 'быстрый', 'поиск', 'наименование', 'товар', 'характеристика', 'возможность', 'ввод', 'хранение', 'неограниченный', 'число', 'зарегистрировать', 'пользователь', 'защита', 'ошибка', 'пользователь', 'заполнение', 'необходимый', 'поле', 'регистрация', 'пользователь', 'оформление', 'заказ', 'воозможность', 'необходимый', 'настройка', 'система'], ['требование', 'состав', 'функция', 'пользователь', 'работать', 'программа', 'разный', 'право'], ['пользовательский', 'режим', 'группа', 'оптовик', 'преимущество', 'зайти', 'сайт', 'пролем', 'получить', '5', 'скидка', 'товар'], ['режим', 'администратор', 'пользователь'], ['наделять', 'пользователь', 'право', 'главный', 'администратор'], ['главный', 'администратор', '1'], ['добавлять', 'удалять', 'информация', 'сайт', 'новость', 'товар', 'описание', 'продукция', 'баннер', 'т.д.', '2'], ['изменять', 'внешний', 'вид', 'сайт', '3'], ['наделять', 'право', 'пользователь'], ['требование', 'инструментальный', 'средство', 'разработка', 'программный', 'продукт', 'использовать', 'система', 'управление', 'сайт', 'cms', 'joomla', '1.5', 'расширение', 'virtuemart', '1.1'], ['разработка', 'осуществляться', 'локальный', 'компьютер', 'использовать', 'денвер'], ['денвер', 'набор', 'дистрибутив', 'программный', 'оболочка', 'предназначить', 'создание', 'отладка', 'сайт', 'локальный', 'windows', 'машина', 'подключение', 'сеть', 'интернет'], ['требование', 'системный', 'технический', 'обеспечение', 'программный', 'продукт', 'ориентировать', 'работа', 'управление', 'операционный', 'система', 'windows', '98', '2000', 'xp', 'vista', '7', 'cpu', '1', 'ghz', '256', 'мб', 'оперативный', 'память', 'подключение', 'интернет'], ['требование', 'интерфейс', 'программный', 'продукт', 'ориентировать', 'неподготовленный', 'пользователь', 'эвм', 'иметь', 'начальный', 'навык', 'работа', 'ос', 'windows', 'internet'], ['общение', 'компьютер', 'осуществляться', 'основа', 'графический', 'оконный', 'интерфейс', 'вид', 'меню', 'список', 'кнопка', 'поле', 'ввод'], ['перечень', 'этап', 'работа', 'срок', 'исполнение', 'перечень', 'этап', 'работа', 'срок', 'исполнение', 'представить', 'таблица', '2.1', 'таблица', '2.1', 'перечень', 'этап', 'работа', 'срок', 'исполнение']]"
|
||
],
|
||
[
|
||
"4",
|
||
"tz_05.docx",
|
||
"2.2 Техническое задание\n2.2.1 Общие сведения.\n1) полное наименование системы и ее условное обозначение: АРМ сотрудника организационно-методического кабинета МУЗ «Сенгилеевская ЦРБ»;\n2) шифр темы или шифр (номер договора): данный программный продукт разрабатывался вне рамок какого-либо договора;\n3) наименование предприятий разработчика и заказчика системы, их реквизиты: МУЗ «Сенгилеевская ЦРБ», . Сенгилей, ул. Н. Выборная, 8.;\n4) перечень документов, на основании которых создается информационная система:\n1.Приказ Минздрава РФ от 30 декабря . N 413 «Об утверждении учетной и отчетной медицинской документации»\n2. Распоряжение Минздрава Ульяновской области РФ от 15 декабря . №512 «О проведении временной оперативной отчетности о деятельности учреждений здравоохранения»\n5) плановые сроки начала и окончания работ: 29 марта 2010 года – 7 мая 2010 года;\n6) сведения об источниках и порядке финансирования работ: данные работы проводятся на некоммерческой основе;\n7) порядок оформления и предъявления заказчику результатов работ по созданию системы, ее частей и отдельных средств: по окончанию работ заказчику должны быть предъявлены и переданы установочный диск со всеми необходимыми дистрибутивами, набор инструкций и документации для полноценного функционирования системы.\n \n2.2.2 Назначение и цели создания системы\nРазработанная система призвана автоматизировать процессы организационно-методического кабинета. Данная система предназначена для использования в ОМК МУЗ «Сенгилеевская ЦРБ», а также в организационно-методических кабинетах других лечебно-профилактических учреждений. После доработок продукта предполагается возможность его внедрения и использования.\nПри внедрении данной системы должны быть следующие показатели:\nтехнические: показателей нет;\nтехнологические: уменьшение числа этапов выполнения расчетов численных показателей при подготовке отчетной информации;\nпроизводственно-экономические: сокращение времени на расчеты при подготовке отчетной информации, повышение производительности работы организационно-методического кабинета.\n\n2.2.3 Характеристика объектов автоматизации\n\tОбъектом автоматизации является Организационно-методический кабинет МУЗ «Сенгилеевская центральная районная больница».\n\tОсновные: учет первичной медицинской документации (талон амбулаторного пациента, карта выбывшего из стационара)\n\tВспомогательные: вывод отчетов на экран.\n\n2.2.4 Требования к системе в целом\n2.1.4.1 Требования к структуре и функционированию системы\n\tСистема должна обеспечивать выполнение перечисленных ниже функций:\n\t\t- добавление новой учетной медицинской документации;\n- редактирование и удаление существующей учетной медицинской документации;\n- формирование отчетной медицинской документации\n\n2.2.4.2 Требования к персоналу\n\tДля функционирования системы необходим сотрудник организационно-методического кабинета. Он должен обладать знаниями в области статистического учета медицинской информации, а так же навыками заполнения учетной медицинской документации и работы с программой на базе платформы 1С:Предприятие 8.1.\n\n2.2.4.3 Степень приспособляемости системы\n\tСистема должна легко дорабатываться для добавления новых или изменения имеющихся функций.\n\n2.2.4.4 Требования к надежности\n\tНадежность и отказоустойчивость системы к ошибкам пользователей и ошибкам загружаемых данных обеспечивают внутренние средства 1С.\n\tИнтерфейс системы должен быть эргономичным с точки зрения пользователя. Интерфейсы программных продуктов на базе «1С:Предприятие 8.1» ориентированы на удобную работу и простоту освоения.\n\tСистема должна обладать патентной чистотой. Это предполагает использование программы на лицензионных копиях программ «1С:Предприятие».\n\tДолжен быть предусмотрен режим раздельной работы с конфигурацией нескольких пользователей. Для этого необходимо, чтобы при входе в конфигурацию присутствовала авторизация и аутентификация пользователей, а значит, каждый пользователь должен иметь свой прописанный в конфигурации набор прав.\n\n2.2.5 Требования к функциям\n2.2.5.1 Перечень подлежащих автоматизации задач\n\tДля системы должны быть реализованы следующие возможности:\nФормирование документов (Талон амбулаторного пациента, Карта выбывшего из стационара), а также по скорой помощи и выполненным объемам учреждений;\nВведение амбулаторной карты пациента;\nРегистрация заболеваний;\nУчет врачебного посещения;\nУчет движения больных;\nФормирование отчетной медицинской документации.\n\n2.2.5.2 Перечень критериев и отказов\n\tФатальные ошибки. Сбои в системе, которые приводят к потере ее работоспособности или порче данных.\n\tСерьезные ошибки. Ошибки, которые не позволяют достичь желаемого результата при использовании некоторого средства или функции программного продукта, включая невозможность исполнения содержащейся в меню или диалоговом окне команды, выполнения процесса или формирования текста.\n\tМаленькие ошибки. Ошибки, которые вызывают неудобство работы с системой, например, ошибки в задании порядка перехода от одного элемента управления к другому в форме ввода информации. К данному типу ошибок можно отнести также беспричинные сообщения об ошибках.\n\tНезначительные ошибки. К данному типу ошибок относятся орфографические ошибки в надписях или не выровненные элементы управления.\n\n2.2.6 Требования к видам обеспечения\n\tСистема предъявляет следующие требования к видам обеспечения:\n\tа) математическому: к пользователю конфигурации не предъявляется особых требований в области математического анализа;\n\tб) информационному: конфигурация доступна для использования только при установленной платформе 1С:Предприятие 8.1, которая в свою очередь рекомендуется к использованию совместно с операционной системой Windows 98/2000/XP/Vista/7.\n\tв) лингвистическому: для написания системы конфигурации использовался встроенный язык системы 1С:Предприятие 8.1. Изменением конфигурации рекомендуется заниматься только специалистам, владеющим этим языком.\n\tг) программному и техническому: для работы с «1С:Предприятием 8.1» рекомендуемая конфигурация компьютера, приведенная «Руководстве по установке и запуску» имеет следующие характеристики:\n\t1) компьютер конечного пользователя:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium III 866 МГц;\n\t\tc) оперативная память 256 Мбайт;\n\t2) компьютер, используемый для разработки конфигураций:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium IV/Celeron 1800 МГц;\n\t\tc) оперативная память 512 Мбайт;\n\t3) сервер «1С:Предприятие 8.0»:\n\t\ta) операционная система: MS Windows 2000 / XP / Server 2003;\n\t\tb) процессор Intel Pentium IV/Xeon 2,4 ГГц;\n\t\tc) оперативная память 1024 Мбайт;\n\tИз программных средств необходимы: платформа «1С:Предприятие 8.1».\n\tд) метрологическому: нет требований к данному виду обеспечения.\n\tе) организационному: при работе с конфигурацией сразу нескольких пользователей существует требование каждому пользователю входить в информационную базу только со своими правами.\n\tж) методическому (состав нормативно-технической документации):\n\t\ta) инструкция программисту;\n\t\tb) инструкция пользователю;\n\t\tc) презентация программного продукта.\n\n2.2.7 Перечень этапов работ и сроки исполнения\n\n2.2.8 Состав исполнителей работ\nРаботы по созданию системы проводились физическим лицом, Давыдовым Денисом Васильевичем студентом УлГТУ. При этом консультантами выступали:\n\tа) Меркулова Тамара Алексеевна – УлГТУ, доцент кафедры «Информационные системы», руководитель дипломного проекта.\n\tб) Давыдова Ольга Николаевна – заведующий организационно-методическим кабинетом МУЗ «Сенгилеевская ЦРБ».\n\n2.2.9 Порядок контроля системы\nДля контроля необходимо провести следующие виды тестирования:\n\tФункциональное тестирование. Оно включает проверку каждой команды меню, панели инструментов и каждой операции, которую выполняет система.\n\tТестирование приложения. При выполнении тестирования приложения испытатель моделирует действия пользователя. Воспроизводя различные комбинации действий, можно найти ошибки, относящиеся к интеграции компонентов, а также недоработки, которые не были обнаружены при функциональном тестировании.\n\tТестирование на скорость выполнения. Измеряется время отклика системы на некоторое действие, документа. Обычно при этом определяются параметры эффективности. Одновременно с измерением времени на выполнение запроса записать также размер базы данных.\n\tВсе этапы тестирования программы проводились непосредственным разработчиком Давыдовым Денисом Васильевичем.\n\n2.2.10 Требования к составу и содержанию работ по подготовке объекта автоматизации к вводу системы в действие\nДля ввода системы в эксплуатацию необходимо провести обучение персонала с программой с использованием всех ее возможностей: сотрудника организационно-методического кабинета – 2 академических часа.\n\tНеобходимо заполнить во внедряемой системе справочники.\n\n2.2.11 Перечень подлежащих разработке документов\n\t- инструкция пользователю;\n\t- инструкция администратору;\n\t- презентация программного продукта.",
|
||
"0",
|
||
"[['2.2', 'технический', 'задание', '2.2.1', 'общий', 'сведение'], ['1'], ['полный', 'наименование', 'система', 'условный', 'обозначение', 'арм', 'сотрудник', 'организационный_методический', 'кабинет', 'муз', 'сенгилеевский', 'црб', '2', 'шифр', 'тема', 'шифр', 'номер', 'договор', 'программный', 'продукт', 'разрабатываться', 'рамка', 'договор', '3', 'наименование', 'предприятие', 'разработчик', 'заказчик', 'система', 'реквизит', 'муз', 'сенгилеевский', 'црб'], ['сенгилей', 'ул.', 'н.', 'выборный', '8', '4', 'перечень', 'документ', 'основание', 'создаваться', 'информационный', 'система', '1.приказ', 'минздрав', 'рф', '30', 'декабрь'], ['n', '413', 'утверждение', 'учётный', 'отчётный', 'медицинский_документация', '2'], ['распоряжение', 'минздрав', 'ульяновский', 'область', 'рф', '15', 'декабрь'], ['№', '512', 'проведение', 'временной', 'оперативный', 'отчётность', 'деятельность', 'учреждение', 'здравоохранение', '5', 'плановый', 'срок', 'окончание', 'работа', '29', 'март', '2010', 'год', '7', 'май', '2010', 'год', '6', 'сведение', 'источник', 'порядок', 'финансирование', 'работа', 'работа', 'проводиться', 'некоммерческий', 'основа', '7', 'порядок', 'оформление', 'предъявление', 'заказчик', 'результат', 'работа', 'создание', 'система', 'часть', 'отдельный', 'средство', 'окончание', 'работа', 'заказчик', 'предъявить', 'передать', 'установочный', 'диск', 'необходимый', 'дистрибутив', 'набор', 'инструкция', 'документация', 'полноценный', 'функционирование', 'система'], ['2.2.2', 'назначение', 'цель', 'создание', 'система', 'разработанная', 'система', 'призвана', 'автоматизировать', 'процесс', 'организационный_методический', 'кабинет'], ['система', 'предназначить', 'использование', 'омк', 'муз', 'сенгилеевский', 'црб', 'организационный_методический', 'кабинет', 'лечебно', 'профилактический', 'учреждение'], ['доработка', 'продукт', 'предполагаться', 'возможность', 'внедрение', 'использование'], ['внедрение', 'система', 'следующий', 'показатель', 'технический', 'показатель', 'технологический', 'уменьшение', 'число', 'этап', 'выполнение', 'расчёт', 'численный', 'показатель', 'подготовка', 'отчётный', 'информация', 'производственный', 'экономический', 'сокращение', 'время', 'расчёт', 'подготовка', 'отчётный', 'информация', 'повышение', 'производительность', 'работа', 'организационный_методический', 'кабинет'], ['2.2.3', 'характеристика', 'объект', 'автоматизация', 'объект', 'автоматизация', 'являться', 'организационный_методический', 'кабинет', 'муз', 'сенгилеевский', 'центральный', 'районный', 'больница'], ['основной', 'учёт', 'первичный', 'медицинский_документация', 'талон', 'амбулаторный', 'пациент', 'карта', 'выбыть', 'стационар', 'вспомогательный', 'вывод', 'отчёт', 'экран'], ['2.2.4', 'требование', 'система', 'целое', '2.1.4.1', 'требование', 'структура', 'функционирование', 'система', 'система', 'обеспечивать', 'выполнение', 'перечислить', 'функция', 'добавление', 'новый', 'учётный', 'медицинский_документация', 'редактирование', 'удаление', 'существовать', 'учётный', 'медицинский_документация', 'формирование', 'отчётный', 'медицинский_документация', '2.2.4.2', 'требование', 'персонал', 'функционирование', 'система', 'необходимый', 'сотрудник', 'организационный_методический', 'кабинет'], ['обладать', 'знание', 'область', 'статистический', 'учёт', 'медицинский', 'информация', 'навык', 'заполнение', 'учётный', 'медицинский_документация', 'работа', 'программа', 'база', 'платформа', '1с_предприятие', '8.1'], ['2.2.4.3', 'степень', 'приспособляемость', 'система', 'система', 'легко', 'дорабатываться', 'добавление', 'новый', 'изменение', 'иметься', 'функция'], ['2.2.4.4', 'требование', 'надёжность', 'надёжность', 'отказоустойчивость', 'система', 'ошибка', 'пользователь', 'ошибка', 'загружать', 'обеспечивать', 'внутренний', 'средство', '1с.', 'интерфейс', 'система', 'эргономичный', 'точка', 'зрение', 'пользователь'], ['интерфейсы', 'программный', 'продукт', 'база', '1с_предприятие', '8.1', 'ориентировать', 'удобный', 'работа', 'простота', 'освоение'], ['система', 'обладать', 'патентный', 'чистота'], ['предполагать', 'использование', 'программа', 'лицензионный', 'копия', 'программа', '1с_предприятие'], ['предусмотреть', 'режим', 'раздельный', 'работа', 'конфигурация', 'несколько', 'пользователь'], ['вход', 'конфигурация', 'присутствовать', 'авторизация', 'аутентификация', 'пользователь', 'пользователь', 'прописать', 'конфигурация', 'набор', 'право'], ['2.2.5', 'требование', 'функция', '2.2.5.1', 'перечень', 'подлежать', 'автоматизация', 'задача', 'система', 'реализовать', 'следующий', 'возможность', 'формирование', 'документ', 'талон', 'амбулаторный', 'пациент', 'карта', 'выбыть', 'стационар', 'скорый', 'помощь', 'выполнить', 'объём', 'учреждение', 'введение', 'амбулаторный', 'карта', 'пациент', 'регистрация', 'заболевание', 'учёт', 'врачебный', 'посещение', 'учёт', 'движение', 'больных', 'формирование', 'отчётный', 'медицинский_документация'], ['2.2.5.2', 'перечень', 'критерий', 'отказ', 'фатальный', 'ошибка'], ['сбой', 'система', 'приводить', 'потеря', 'работоспособность', 'порча'], ['серьёзный', 'ошибка'], ['ошибка', 'позволять', 'достигнуть', 'желаемого', 'результат', 'использование', 'некоторый', 'средство', 'функция', 'программный', 'продукт', 'невозможность', 'исполнение', 'содержаться', 'меню', 'диалоговый', 'окно', 'команда', 'выполнение', 'процесс', 'формирование', 'текст'], ['маленький', 'ошибка'], ['ошибка', 'вызывать', 'неудобство', 'работа', 'система', 'ошибка', 'задание', 'порядок', 'переход', 'элемент', 'управление', 'другому', 'форма', 'ввод', 'информация'], ['тип', 'ошибка', 'отнести', 'беспричинный', 'сообщение', 'ошибка'], ['незначительный', 'ошибка'], ['тип', 'ошибка', 'относиться', 'орфографический', 'ошибка', 'надпись', 'выровнять', 'элемент', 'управление'], ['2.2.6', 'требование', 'вид', 'обеспечение', 'система', 'предъявлять', 'следующий', 'требование', 'вид', 'обеспечение', 'математический', 'пользователь', 'конфигурация', 'предъявляться', 'особый', 'требование', 'область', 'математический', 'анализ', 'информационный', 'конфигурация', 'доступный', 'использование', 'установить', 'платформа', '1с_предприятие', '8.1', 'очередь', 'рекомендоваться', 'использование', 'совместно', 'операционный', 'система', 'windows', '98/2000', 'xp', 'vista/7'], ['лингвистический', 'написание', 'система', 'конфигурация', 'использоваться', 'встроенный', 'язык', 'система', '1с_предприятие', '8.1'], ['изменение', 'конфигурация', 'рекомендоваться', 'заниматься', 'специалист', 'владеть', 'язык', 'программный', 'технический', 'работа', '1с_предприятие', '8.1', 'рекомендовать', 'конфигурация', 'компьютер', 'привести', 'руководство', 'установка', 'запуск', 'следующий', 'характеристика', '1', 'компьютер', 'конечный', 'пользователь', 'a', 'операционный', 'система', 'ms', 'windows', '2000', 'xp', 'server', '2003', 'b', 'процессор', 'intel', 'pentium', 'iii', '866', 'мгц', 'c', 'оперативный', 'память', '256', 'мбайт', '2', 'компьютер', 'использовать', 'разработка', 'конфигурация', 'a', 'операционный', 'система', 'ms', 'windows', '2000', 'xp', 'server', '2003', 'b', 'процессор', 'intel', 'pentium', 'iv', 'celeron', '1800', 'мгц', 'c', 'оперативный', 'память', '512', 'мбайт', '3', 'сервер', '1с_предприятие', '8.0', 'a', 'операционный', 'система', 'ms', 'windows', '2000', 'xp', 'server', '2003', 'b', 'процессор', 'intel', 'pentium', 'iv', 'xeon', '2,4', 'ггц', 'c', 'оперативный', 'память', '1024', 'мбайт', 'программный', 'средство', 'необходимый', 'платформа', '1с_предприятие', '8.1', 'метрологический', 'требование', 'вид', 'обеспечение', 'организационный', 'работа', 'конфигурация', 'несколько', 'пользователь', 'существовать', 'требование', 'каждый', 'пользователь', 'входить', 'информационный', 'база', 'право', 'методический', 'состав', 'нормативный', 'технический', 'документация', 'a', 'инструкция', 'программист', 'b', 'инструкция', 'пользователь', 'c', 'презентация', 'программный', 'продукт'], ['2.2.7', 'перечень', 'этап', 'работа', 'срок', 'исполнение', '2.2.8', 'состав', 'исполнитель', 'работа', 'работа', 'создание', 'система', 'проводиться', 'физический', 'лицо', 'давыдов', 'денис', 'василиевич', 'студент', 'улгту'], ['консультант', 'выступать', 'меркулов', 'тамара', 'алексеевич', 'улгту', 'доцент', 'кафедра', 'информационный', 'система', 'руководитель', 'дипломный', 'проект', 'давыдов', 'ольга', 'николаевич', 'заведующий', 'организационный_методический', 'кабинет', 'муз', 'сенгилеевский', 'црб'], ['2.2.9', 'порядок', 'контроль', 'система', 'контроль', 'провести', 'следующий', 'вид', 'тестирование', 'функциональный', 'тестирование'], ['включать', 'проверка', 'каждый', 'команда', 'меню', 'панель', 'инструмент', 'каждый', 'операция', 'выполнять', 'система'], ['тестирование', 'приложение'], ['выполнение', 'тестирование', 'приложение', 'испытатель', 'моделировать', 'действие', 'пользователь'], ['воспроизводить', 'различный', 'комбинация', 'действие', 'найти', 'ошибка', 'относиться', 'интеграция', 'компонент', 'недоработка', 'обнаружить', 'функциональный', 'тестирование'], ['тестирование', 'скорость', 'выполнение'], ['измеряться', 'время', 'отклик', 'система', 'некоторый', 'действие', 'документ'], ['определяться', 'параметр', 'эффективность'], ['одновременно', 'измерение', 'время', 'выполнение', 'запрос', 'записать', 'размер', 'база'], ['этап', 'тестирование', 'программа', 'проводиться', 'непосредственный', 'разработчик', 'давыдов', 'денис', 'василиевич'], ['2.2.10', 'требование', 'состав', 'содержание', 'работа', 'подготовка', 'объект', 'автоматизация', 'ввод', 'система', 'действие', 'ввод', 'система', 'эксплуатация', 'провести', 'обучение', 'персонал', 'программа', 'использование', 'возможность', 'сотрудник', 'организационный_методический', 'кабинет', '2', 'академический', 'час'], ['заполнить', 'внедрять', 'система', 'справочник'], ['2.2.11', 'перечень', 'подлежать', 'разработка', 'документ', 'инструкция', 'пользователь', 'инструкция', 'администратор', 'презентация', 'программный', 'продукт']]"
|
||
]
|
||
],
|
||
"shape": {
|
||
"columns": 4,
|
||
"rows": 5
|
||
}
|
||
},
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>doc</th>\n",
|
||
" <th>text</th>\n",
|
||
" <th>type</th>\n",
|
||
" <th>prep_text</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>tz_01.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения\\...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>[[2.2, технический, задание, 2.2.1, общий, све...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>tz_02.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения\\...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>[[2.2, технический, задание, 2.2.1, общий, све...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>tz_03.docx</td>\n",
|
||
" <td>2.2. Техническое задание\\nОбщие сведения:\\nВ д...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>[[2.2], [технический, задание, общий, сведение...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>tz_04.docx</td>\n",
|
||
" <td>Техническое задание\\n2.2.1 Общие сведения\\nИнт...</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>[[технический, задание, 2.2.1, общий, сведение...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>tz_05.docx</td>\n",
|
||
" <td>2.2 Техническое задание\\n2.2.1 Общие сведения....</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>[[2.2, технический, задание, 2.2.1, общий, све...</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" doc text type \\\n",
|
||
"0 tz_01.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0 \n",
|
||
"1 tz_02.docx 2.2 Техническое задание\\n2.2.1 Общие сведения\\... 0 \n",
|
||
"2 tz_03.docx 2.2. Техническое задание\\nОбщие сведения:\\nВ д... 0 \n",
|
||
"3 tz_04.docx Техническое задание\\n2.2.1 Общие сведения\\nИнт... 0 \n",
|
||
"4 tz_05.docx 2.2 Техническое задание\\n2.2.1 Общие сведения.... 0 \n",
|
||
"\n",
|
||
" prep_text \n",
|
||
"0 [[2.2, технический, задание, 2.2.1, общий, све... \n",
|
||
"1 [[2.2, технический, задание, 2.2.1, общий, све... \n",
|
||
"2 [[2.2], [технический, задание, общий, сведение... \n",
|
||
"3 [[технический, задание, 2.2.1, общий, сведение... \n",
|
||
"4 [[2.2, технический, задание, 2.2.1, общий, све... "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
|
||
"columns": [
|
||
{
|
||
"name": "index",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "doc",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "text",
|
||
"rawType": "object",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "type",
|
||
"rawType": "int64",
|
||
"type": "integer"
|
||
},
|
||
{
|
||
"name": "prep_text",
|
||
"rawType": "object",
|
||
"type": "unknown"
|
||
}
|
||
],
|
||
"conversionMethod": "pd.DataFrame",
|
||
"ref": "e7c48fc4-4265-4055-bd38-369131c8346f",
|
||
"rows": [
|
||
[
|
||
"36",
|
||
"Этапы разработки проекта2.docx",
|
||
"Этапы разработки проекта: заключительные стадии проектирования, схема базы данных\nЗаключительные стадии проектирования \nПроектирование процесса тестирования \nПроектирование процесса тестирования, как правило, следует за процессом функционального проектирования и проектирования схемы базы данных. На этом этапе можно использовать сложные схемы тестирования, а можно ограничиться и простыми. Здесь мы приведем некоторые принципы, которых нужно придерживаться при проектировании любой информационной системы.\nКогда генерация модуля завершена, выполняют автономный тест, который преследует две основные цели:\nобнаружение отказов модуля (жестких сбоев); \nсоответствие модуля спецификации (наличие всех необходимых функций, отсутствие лишних функций). \nПосле того как автономный тест прошел успешно, группа сгенерированных модулей проходит тесты связей, которые должны отследить взаимное влияние модулей.\nДалее группа модулей тестируется на надежность работы, то есть проходят, во-первых, тесты имитации отказов системы, а во-вторых, тесты наработки на отказ. Первая группа тестов показывает, насколько хорошо система восстанавливается после сбоев программного обеспечения, отказов аппаратного обеспечения. Вторая группа тестов определяет степень устойчивости системы при штатной работе и позволяет оценить время безотказной работы системы. В комплект тестов устойчивости должны входить тесты, имитирующие пиковую нагрузку на систему.\nЗатем весь комплект модулей проходит системный тест - тест внутренней приемки продукта, показывающий уровень его качества. Сюда входят тесты функциональности и тесты надежности системы.\nПоследний тест информационной системы - приемо-сдаточные испытания. Такой тест предусматривает показ информационной системы заказчику и должен содержать группу тестов, моделирующих реальные бизнес-процессы, чтобы показать соответствие реализации требованиям заказчика.\n\nТребования к безопасности, доступу, обслуживанию системы \nКаждая информационная система содержит определенные требования к защите от несанкционированного доступа, к регистрации событий системы, аудиту, резервному копированию, восстановлению информации, которые в начале проектирования должны быть формализованы аналитиками. Проектировщики строят стратегию безопасности системы. В частности, ими должны быть определены категории пользователей системы, которые имеют доступ к тем или иным данным посредством соответствующих компонентов. Кроме того, определяются объекты и субъекты защиты. Следует отметить, что стратегия безопасности не ограничивается только ПО - это должен быть целый комплекс мер и правил ведения бизнеса. Нужно четко определить, какой уровень защиты данных необходим для каждого из компонентов информационной системы, и выделить критичные данные, доступ к которым строго ограничен. Пользователи информационной системы регистрируются, поэтому проектируются модули, отвечающие за идентификацию и аутентификацию пользователя. В большинстве СУБД реализована дискреционная защита данных, то есть регламентирован доступ к объектам данных (например, к таблицам, представлениям). Если же требуется ограничение доступа собственно к данным (к отдельным записям в таблице, к отдельным полям записи в таблице и т.п.), то следует реализовать мандатную защиту. Проектировщики должны иметь четкое представление о том, какой уровень защиты той или иной единицы информации является необходимым, а какой достаточным.\nВопросы восстановления, хранения резервных копий базы данных, архивов базы данных относятся к мероприятиям поддержки бесперебойного функционирования информационной системы. Необходимо внимательно изучить возможности, предоставляемые СУБД, а затем проанализировать, как следует использовать возможности СУБД для обеспечения требуемого уровня бесперебойной работы системы.\n\nСоставление спецификаций \nРезультаты проектирования отражаются в документе - функциональной спецификации. Этот документ пишется для заказчика, чтобы получить его санкцию на завершение проектирования и начало разработки, и обычно не содержит большого количества технических деталей. Второй документ - техническая спецификация, являющаяся основным документом для разработчиков моделей и групп тестирования, и здесь описаны детали проекта. Если использовались CASE-средства, то техническая спецификация обязательно содержит ряд отчетов из репозитария.\n\nПолнота проектирования \nПеред началом разработки модулей нужно еще раз проверить полноту проектирования. Один из полезных инструментов - матрица использования таблиц схемы базы данных по модулям.\n\nПереход к реализации \nИтак, начата реализация модулей. Означает ли это, что работа проектировщиков на этом завершена полностью? На практике это далеко не так. Довольно часто разработчик сталкивается с медленно работающими или не реализуемыми в данной схеме запросами. Подобные ситуации инициируют изменение модели данных, а значит, и информационной модели. Однако изменение информационной модели производится не только по этой причине. Хорошему проектировщику необходим практический опыт работы с аппаратным и программным обеспечением - вот одна из причин участия проектировщиков в составе групп разработчиков. Нередко ведущие сотрудники групп разработчиков одновременно являются проектировщиками.\nКак можно использовать проектировщиков на этапе разработки? Приведем некоторые примеры:\nПроектировщик, написавший спецификацию модуля, проводит семинар с разработчиками и демонстрирует необходимые прототипы (семинар предполагает диалог двух сторон). \nКогда модуль передан разработчику, проектировщик может участвовать в его пересмотре, а также выполнять контрольные функции по реализации проектных решений. \nДля крупных проектов характерно поэтапное выполнение работ, так что вполне вероятно, что после завершения реализации группы модулей и сдачи очередного этапа процесс проектирования будет продолжен для новой группы модулей. \nПроектировщики должны обеспечить быстрое реагирование на возможные изменения требований заказчика, поскольку своевременная обработка такой информации является их обязанностью. Кроме того, необходимо и участие системных аналитиков, так как именно они общаются с заказчиком проекта.\n\nСхема базы данных\nСхема базы данных содержит описание всех объектов базы данных: пользователей, их привилегий, таблиц, представлений, индексов, кластеров, ограничений, пакетов, хранимых процедур, триггеров и т.п. При этом создаются не только определения этих объектов, но и сами объекты, с которыми потом работают разработчики.\n\nER-модель и ее отображение на схему данных \nРезультат этапа анализа - построение информационной модели. Казалось бы, дело это простое: сущности становятся таблицами, а атрибуты сущностей - столбцами таблиц; ключи становятся первичными ключами, для возможных ключей определяется ограничение unique, внешние ключи становятся декларациями ссылочной целостности. Аналитики, как правило, не вникают в особенности реализации той или иной СУБД, поэтому при проектировании схемы базы данных проектировщик сталкивается с конструкциями в информационной модели, которые не реализуемы или трудно реализуемы в выбранной СУБД.\nПриведем несколько примеров ограничений реализации СУБД:\nВ информационной модели описаны три сущности - A, B, C. Сущности B и C содержат внешние ключи, ссылающиеся на сущность A. В СУБД поддерживается возможность определения внешнего ключа только для первичного ключа, а для возможного ключа определить декларативную ссылочную целостность нельзя. В этом случае отображение ER-модели на физическую модель данных невозможно без изменения информационной модели. \nВ информационной модели описан внешний ключ с каскадным удалением и модификацией. В СУБД поддерживаются внешние ключи только для варианта действия no action (то есть каскадные изменения в явном виде не поддерживаются). Реализация ссылочной целостности посредством триггеров ограничена уровнем каскадирования триггеров (например, 32 вызовами триггера). В этом случае потребуется также изменение информационной модели. \nВ информационной модели определен атрибут, представляющий собой строку длиной в 500 символов. По этому атрибуту часто осуществляется поиск в информационной системе; объем данных велик. В СУБД можно индексировать строки символов не длиннее чем 128 или 256 символов. Если осуществлять поиск без индекса, то время ответа информационной системы существенно превышает допустимое, вследствие чего придется изменить описание сущности. \nВ информационной модели описана сущность A, которая содержит по крайней мере два атрибута BLOB (например, требуется отдельно хранить и звук и изображение). В СУБД невозможно создать таблицу с двумя атрибутами BLOB и в этом случае нужно изменить описание сущности. Из отношения A исключаются два атрибута BLOB, и добавляется один атрибут AK типа integer. Добавляются две дополнительные сущности - и . Каждая из них будет содержать один атрибут BLOB и один ключевой атрибут K типа integer, который станет внешним ключом у каждого из новых отношений и будет ссылаться на атрибут AK в отношении A (тип внешнего ключа - on delete cascade, on update cascade). \nЖизненный цикл сущности определен в информационной модели соответствующей диаграммой. В описании сущности отсутствует атрибут, который отражает изменение состояния сущности. В этой ситуации проектировщики добавляют атрибут status, для которого определяется ограничение допустимых значений (из списка допустимых состояний), а изменение состояния сущности описывается триггером, проверяющим допустимость сочетания нового и старого значения атрибута. \nДве диаграммы потока данных описывают различные бизнес-процессы, работающие над одними и теми же данными. Допустим, первая диаграмма описывает выписку товара со склада, а вторая - сложный отчет, отражающий состояние склада. Один процесс интенсивно модифицирует данные, второй работает в режиме чтения данных, но требует согласованности данных в течение длительного времени. Каждый из процессов описывается транзакцией над данными. В СУБД уровни изолированности транзакций реализованы так, что читающие транзакции конфликтуют с модифицирующими транзакциями. Это приводит к остановке выписки товаров со склада на время выполнения отчета, что неприемлемо для заказчика. Здесь может потребоваться очень серьезное изменение информационной модели. \nПодобных примеров, когда не только ER-модель, но и другие продукты анализа не могут быть перенесены автоматически на модель данных, можно привести множество. Каждый такой случай инициирует изменение информационной модели. Решение проблемы определяется возможностями СУБД, выбранной для реализации проекта. Если проблем, не разрешаемых в рамках данной СУБД, накапливается очень много, то проектировщики могут поставить вопрос о смене СУБД. Такой вопрос поднимается именно на стадии проектирования, поскольку если уже разработчики столкнутся с подобными проблемами, то цена смены СУБД будет выше. Ясно, что одинаковых СУБД не бывает: то, что хорошо работает в одной, может плохо работать или вообще не работать в другой, несмотря на уверения производителей СУБД в поддержке стандартов SQL. Что касается хранимых процедур и триггеров, то здесь вообще трудно говорить о поддержке SQL92/PSM.\nВопросы производительности информационной системы также влияют на отображение ER-модели на модель данных. За счет мощного сервера баз данных можно добиться большей скорости реакции системы, но мощность аппаратного комплекса ограниченна. Производительность системы в целом зависит в том числе и от нормализации. Часто до 80% запросов к базе данных являются выборками данных, а соединение по тому или иному атрибуту относится к затратным операциям, в первую очередь соединение по нечисловым атрибутам. Увеличить производительность системы можно посредством введения избыточной информации - денормализации. Следует отметить, что решение об этом не принимается на основе одной ER-модели - требуется внимательно проанализировать потоки данных. Критичные процессы являются хорошими кандидатами для денормализации: по времени выполнения, по частоте выполнения, по большому объему обрабатываемых данных, по частоте изменения обрабатываемой информации, по явному приоритету. Часто к денормализации прибегают в целях ускорения выполнения отчетов. Для проверки эффективности той или иной денормализации привлекаются тестеры.\n\nТипы данных \nКак правило, СУБД поддерживают небольшой набор базовых типов данных: числовые типы (целые, вещественные с плавающей и фиксированной точкой), строки (символов и байт), дата и время (или комбинированный тип datetime), BLOB (и его разновидности, например BLOB-поля для хранения только текста). В информационной модели каждому атрибуту соответствует домен. Поскольку не все реализации СУБД поддерживают домены, то в этом случае при определении модели данных ограничения домена описывают как ограничения столбца таблицы (если такое возможно); в частности используют check constraints, триггеры. Следует отметить, что при определении типов столбцов таблиц нужно учитывать, какие типы данных поддерживаются в словаре данных СУБД. Например, в Oracle ключевые слова integer, smallint, real поддерживаются транслятором SQL, но в словаре данных им соответствуют number(38), number(38), float(63), так как Oracle хранит данные в двоично-десятичном формате с плавающей точкой, а не в двоичном формате с плавающей точкой, и 38-восьмизначное число никак нельзя назвать словом smallint.\nСУБД поддерживают два вида строковых типов: с фиксированной длиной (например, char), когда хранится ровно столько символов, сколько указано в описании атрибута, и с переменной длиной (например, varchar), когда хранится реальная длина значения атрибута, а концевые пробелы строки усекаются. Семантика сравнения строк в СУБД также различная, и если ваше мнение о сравнении строк расходится с тем, как это реализовано в СУБД, то придется смириться с этим как с особенностью СУБД. Например (описано поведение Oracle 7.x), если сравниваются значения A равное ‘ab’ и B равное ‘ab’ двух атрибутов типа varchar разной длины, то sql сообщит, что . Чтобы избежать подобных «фокусов», нужно, в частности, следить за тем, чтобы приложение не вставляло незначащие концевые пробелы в значения атрибутов этих типов.\n\nИндексы, кластеры \nВ правильно спроектированной базе данных каждая таблица содержит первичный ключ, что означает наличие индекса. В большинстве СУБД используются индексы . Отметим, что если используется составной индекс, то поиск по всем атрибутам, входящим в индекс, начиная со второго, будет медленным. Допустим, определен индекс index1(id1, id2), в этом случае поиск значений, удовлетворяющих условию id2=1, будет медленным (не исключено, что оптимизатор вообще не будет использовать этот индекс для обработки данного условия и будет принято решение о полном сканировании данных), а поиск значений, удовлетворяющих условию id1=1 and id2=1, будет быстрым. Данные особенности следует учитывать при определении индексов в схеме базы данных, а именно:\nиндексировать нужно атрибуты, по которым наиболее часто осуществляется поиск или соединение. Наличие индекса замедляет операции модификации, но ускоряет поиск; \nналичие индекса обязательно, если для атрибута или набора атрибутов указано ограничение unique. Такие индексы СУБД создает автоматически, если в описании таблицы указаны ограничения unique; \nиндекс может быть использован для выборки данных в заданном порядке. В этом случае не вызывается процесс сортировки ответа, а используется уже готовый индекс; \nатрибуты, входящие во внешний ключ, также следует индексировать, если СУБД не делает эту операцию автоматически при декларации внешнего ключа; \nв некоторых СУБД поддерживаются bitmap-индексы, которые очень эффективны при поиске на равенство, но для поиска на этот тип индексов не годится; \nв некоторых СУБД поддерживаются хеш-индексы, например для кластеров. Такие индексы эффективно используются при поиске на равенство. \nКластеризация - это попытка разместить рядом в одном физическом блоке данных те строки, доступ к которым осуществляется при помощи одинаковых значений ключа. Индексные кластеры, например, удобно использовать для хранения родительской и дочерних строк таблиц, связанных ссылочной целостностью. Кластеры удобно определять для тех наборов атрибутов, соединение по которым проводится наиболее часто, поскольку это увеличивает скорость поиска. Следует отметить, что в реализациях СУБД существуют жесткие ограничения на количество кластеров для таблицы, как правило, это один кластер. Особенности реализации кластеров в СУБД необходимо учитывать при проектировании критичных по времени выполнения модулей. Нужно обратить внимание, насколько сильно влияет наличие кластера на производительность DML-операций. Чаще всего это оказывает отрицательное влияние, которое в некоторых реализациях распространяется на DML-операции над любой таблицей базы данных, а не только над той, для которой определен кластер. Эти особенности СУБД также следует учитывать при проектировании.\nДля того чтобы выбрать тот или иной тип индекса, требуется внимательно изучить руководство администратора СУБД. Оптимизатор SQL использует различные типы доступа к данным при обработке запросов, и индексирование существенно влияет на выбор оптимизатора.\nПриведем некоторые способы доступа к данным на примере выборки select id, name from xtable where id=10:\nТаблица не индексирована. В этом случае применяется полное сканирование, которое не является эффективным, если объем данных большой, в таблице много данных, не удовлетворяющих условию, размер кортежа существенно превосходит размер атрибута id. \nАтрибут id индексирован; тип индекса - . Тогда применяется индексное сканирование; полное сканирование может быть выбрано только в случае, если объем данных, удовлетворяющих данному условию, является большим (эта информация анализируется статистическим оптимизатором) и сравним с количеством записей в таблице. Индексное сканирование применяется лишь тогда, когда размер индексированных атрибутов меньше размера кортежа и все необходимые для обработки запроса данные могут быть получены из индекса; в остальных случаях может быть применено полное сканирование. \nАтрибут id входит в составной индекс, и является первым (лидирующим) атрибутом индекса, при этом тип индекса - . Аналогично предыдущему примеру, применяется индексное сканирование. \nАтрибут id входит в составной индекс, он не первый атрибут индекса; тип индекса - . Индексное сканирование применяется лишь тогда, когда размер индексированных атрибутов меньше размера кортежа и все необходимые для обработки запроса данные могут быть получены из индекса; в остальных случаях применяется полное сканирование. \nАтрибут id индексирован; тип индекса - хеш. Здесь применяется индексное сканирование для поиска на =; если бы условие было id <=10, то применение хеш-индекса для такого поиска не эффективно. \nАтрибут id индексирован; тип индекса - bitmap. Здесь применяется индексное сканирование для поиска на =; если бы условие было id <=10, то применение bitmap-индекса для такого поиска не эффективно. \nАтрибут id является ключом хеш-кластера. В этом случае применяется алгоритм хеширования при поиске блока данных для чтения. При хорошем алгоритме и правильном размере кластера поиск может быть осуществлен за одно чтение; при ошибках в выборе алгоритма и блока кластера это может составить до нескольких тысяч операций чтения блоков. \nАтрибут id является ключом индексного кластера. Здесь применяется индексное сканирование, почти аналогично случаю с индексом . \nТаблица кластеризована, id не является ни кластерным ключом, ни лидирующим в составном индексе . В этой ситуации для кластера применяется полное сканирование. \nМы привели только некоторые правила выполнения операции поиска в зависимости от наличия и типа индекса. В реализации используемой вами СУБД могут быть приняты иные принципы. Подробности использования типов сканирования при поиске данных даются в руководстве по настройке СУБД и в руководстве администратора СУБД.\nА почему бы не проиндексировать все, если индексный поиск быстрее полного сканирования? Очевидно, что индекс занимает место на диске, вопрос в том - сколько. Например, индексируется атрибут integer - это 4 байта. Но в кроме собственно значения ключа в индексе хранятся и внутренний идентификатор кортежа, и некоторая служебная информация, так что все вместе может составлять 4-8 байт. Чтобы точно посчитать эту величину для используемой вами СУБД, следует обратиться к руководству администратора: посмотрите размер идентификаторов ROWID (Oracle), RID (DB2) и т.д., а также размер страницы индекса (как правило, это 4 Кбайт).\nПри выборе стратегии индексации следует придерживаться двух простых принципов:\nчем больше индексов, тем выше затраты на выполнение DML-операций. По грубым оценкам затрат: если принять за 1 работу по вставке строки в таблицу, то работа по вставке той же записи в один индекс равна 2 или 3 (для разных СУБД); \nв любое значение может быть найдено за такое количество операций чтения, сколько уровней у дерева (дерево трех уровней для значений integer, например, содержит порядка 533 731 324 ключей, если страница дерева 4 Кбайт). Такие индексы отлично используются при поиске на =, <, >, <=, >=, between, и достаточно хорошо модифицируются. В bitmap-индексах содержатся готовые битовые векторы, отражающие вхождение или невхождение значения в ответ при поиске на равенство, но такие индексы плохо модифицируются и больше подходят для хранилищ данных, например для индексирования вхождения слов в текстовый документ. Хеш-индексы позволяют осуществлять поиск на равенство, хеш-функция используется для поиска блока кластеризованных данных, содержащего нужные значения. Если алгоритм хеш-функции хорош и размер кластера указан верно, то поиск может быть осуществлен за одно чтение. Эти индексы, как правило, используют для создания кластеров. \nОбратите внимание, хранит ли СУБД в индексах NULL. Если NULL в индексе не хранится, то вероятность использования полного сканирования для атрибутов без декларации not NULL резко повышается. Если NULL хранится в индексе (обычно его считают самым большим или самым маленьким при построении и специальным значением при построении bitmap и хеш-индексов), то выясните, для каких операций поиска индексы будут использованы оптимизатором SQL. Эта информация, как правило, содержится в руководстве администратора. Можно проверить и экспериментально, создав тестовую таблицу с объемом данных примерно 20 тыс. записей (чтобы оптимизатор не выбирал полное сканирование по причине малого объема) и выполнив исследуемый запрос, а затем произвести explain плана запроса (если подобный сервис предоставляется СУБД).\n\nВременные данные \nВременными данными, или временными рядами, называют данные, содержащие дату и время. Неправильная обработка таких данных в некоторых СУБД может служить одной из основных причин низкой функциональности и производительности информационной системы. Временные ряды не очень хорошо вписываются в двухмерную реляционную модель. SQL поддерживает соединения, не основанные на равенстве, но большинство разработчиков СУБД ограничиваются эквисоединением. Для временных данных часто приходится соединять таблицы на основе перекрытия одного диапазона дат другим. В SQL не существуют операции, которая позволяла бы задать такое соединение непосредственно.\nРяд атрибутов, например курс валюты или цена товара, изменяются во времени. Такие атрибуты действительны по дате, то есть актуальны только в течение определенного интервала времени, например дня для курса валюты.\nЕсли СУБД позволяет обрабатывать многомерные данные, то обработка временных рядов может использовать эти механизмы и тогда время будет являться одним из измерений. Подобные многомерные процессоры применяются для обработки геофизических и географических данных. В таких системах используются индексы , и их клоны.\nПриведем пример обработки цены товара (код товара, начальная дата, конечная дата, цена):\ncreate table prices \n(id integer, date_from date not null, \ndate_to date, price decimal not null, \nconstraint p_range check date_from < date_to); \nОтметим, что здесь в отношении не задан первичный ключ, а сама задача определения ключа в таких отношениях отличается сложностью. Известно, что момент изменения цены заранее не известен, этим и объясняется отсутствие ограничения not null для атрибута date_to:\nselect price from prices \nwhere id = :PRODUCT_CODE \nand date_from < :WHEN_DATE \nand date_to >= \nnvl(:WHEN_DATE, to_date(’01/12/4721’, ’DD/MM/YYYY’); \nЗдесь :PRODUCT_CODE и :WHEN_DATE обозначают переменные включающего языка, дата ’01/12/4721’ является самой большой из поддерживаемых СУБД (эта дата может быть и другой). Подобные операции лучше оформлять в виде хранимых процедур, функций или претранслированных запросов. В хранилищах данных часто обрабатываются архивные данные, для которых обработка временных рядов также актуальна.\nВозникают также вопросы по поводу точности дат, например: они актуальны для курсов валют, биржевых сделок. Следует определить, достаточна ли точность даты до секунды или нет. Существует проблема и с тем, как зарегистрировать сделку, если цена акции постоянно меняется. Некоторые проектировщики в этом случае обрабатывают временной ряд, но есть и более простое решение - отследить цену акции на момент прохождения биржевой транзакции и сохранить эту цену как часть информации, которую модифицировала транзакция. Поэтому сначала следует рассмотреть простые варианты решения задач, и если ни один из них не подходит, то использовать временные ряды.\nА также как нужно показывать не известную на текущий момент дату, например момент, когда цена товара перестанет быть актуальной? Сделайте это значение равным NULL или самым большим значением (определите его как default-значение для атрибута). Следует отметить, что значения default в большинстве реализаций СУБД работают только при вставке новых записей. Можно, конечно, создать триггер, который срабатывает после выполнения операции insert или update и преобразует null в наибольшее из допустимых значений даты. Но в этом случае, когда пользователь будет работать с подобной информацией, то может забыть, откуда взялась та или иная дата. Если вы спроектировали схему базы данных и запросы таким образом, то все приложения, работающие с выборками данных, должны отвечать следующим требованиям:\nпринудительно конвертировать в null такие даты и не показывать их пользователю; \nиспользовать соответствующие представления, содержащие decode (или иное средство конвертации «больших» дат); \nвызывать хранимую процедуру, которая выполнит все нужные преобразования. \nВыше только что были перечислены возможные проектные решения. Отметим, что для эффективного поиска следует создать составной индекс с атрибутами (date_from, date_to), но не все СУБД будут использовать такой составной индекс, если для одного из атрибутов допустимы значения null. Поэтому довольно простая для аналитиков задача представления временных рядов может повлечь за собой множество неприятных моментов при проектировании.\nТеперь рассмотрим проблему поиска первичного ключа для подобных отношений. Оказывается, что единственный разумный вариант предотвращения дубликатов таков: каждому единичному интервалу соответствует отдельная строка. Для биржевых операций этот интервал может быть равен, например, одной секунде, а в некоторых системах он еще меньше. У таких таблиц только одно преимущество - результат из них можно выбирать при помощи эквисоединения, однако объемы обрабатываемых данных велики.\nИспользование временных рядов, как правило, является одной из наиболее актуальных тем в разговоре с аналитиками. Какое решение будет лучшим - зависит от используемой СУБД и от ее особенностей, а именно: оптимизатора запросов, особенностей использования индексов, мощности SQL, хранимых процедур и триггеров.\n\nХранение объектов данных \nЭто одна из самых сложных задач проектирования схемы базы данных, для решения которой привлекаются администраторы баз данных. Универсальных решений, которые подошли бы для любой СУБД, не существует, так каждый производитель СУБД создает свой способ хранения и доступа к данным, считает его лучшим и очень им гордится. На проектирование схемы базы данных влияют следующие параметры, общие для большинства СУБД:\nразмер табличных пространств для хранения таблиц; \nразмер табличных пространств для хранения индексов; \nразмер табличных пространств для хранения BLOB; \nкластеры и их параметры; \nразмер словаря данных, включая код всех хранимых процедур, функций, триггеров, пакетов, статического SQL (реализован только в DB2); \nуправляющие файлы; \nфайлы журнала; \nинтенсивность потока запросов, модифицирующих данные и индексы; \nфалы временных табличных пространств (для хранения временных таблиц, которые строятся, например, при выполнении group by, а также других временных объектов); \nинтенсивность потока запросов, инициирующих создание временных таблиц; \nпотоки транзакций read-write, read-only, объем модифицируемых и считываемых ими данных, характеристики параллельной работы транзакций (какие и сколько их); \nколичество приложений, работающих параллельно с базой данных; \nколичество соединений с базой данных для каждого приложения; \nфайлы параметров старта ядра СУБД; \nзагрузочные модули ядра СУБД и утилиты СУБД; \nвходные и выходные данные, генерируемые пользовательскими программами; \nскрипты управления СУБД. \nПостарайтесь описать эти параметры хотя бы в общем виде, обсудите все вопросы с администратором баз данных и внимательно выслушайте его рекомендации. Если же его мнение может расходится с вашим представлением о том, как должна работать СУБД, попытайтесь понять его аргументы и запомните, с какими особенностями СУБД это связано. Все данные следует отразить в журнале проектирования. Следует иметь в виду, что многие нюансы размещения объектов данных и конфигурации сервера баз данных не могут быть учтены на этапе проектирования, так как требует полномасштабного тестирования. Конечно, избежать некоторых ошибок проектирования можно, но приготовьтесь к тому, что схема базы данных будет меняться и на этапе реализации, причем неоднократно.\n\nЗащита данных\nСтратегия защиты определяется на этапе анализа, а на этапе проектирования предстоит реализовать эту стратегию, спроектировав соответствующие структуры в схеме базы данных и модули. Большинство СУБД имеют развитые средства дискреционной защиты, а ряд СУБД имеют встроенные подсистемы аудита, что освобождает от необходимости создания собственных средств защиты.\nОбычно СУБД предоставляют набор пакетированных привилегий для управления данными, например: connect, которая разрешает соединение с базой данных; resource, которая дополнительно разрешает создание собственных объектов базы данных, dba, которая позволяет выполнять функции администратора конкретной базы данных, и др. Дискреционная защита предполагает разграничение доступа к объектам данных (таблиц, представлений, и т.п.), а не собственно к данным, которые хранятся в этих объектах. Дискреционная защита также обеспечивает создание пользовательских пакетированных привилегий - ролей или групп привилегий. В этом случае набор привилегий на те или иные объекты данных назначается группе или роли, а затем эта группа или роль назначается пользователю; таким образом пользователь получает привилегии на выполнение тех или иных операций над объектами данных косвенно - через группу или роль.\nВ некоторых реализациях допускается выполнение определенного набора операций от имени другого пользователя и с его привилегиями - в частности вызовы пакетов и хранимых процедур. Пользователь, вызывающий такой объект, не может ни изменить пакет или хранимую процедуру, ни получить доступ к ее коду, но операции над данными, которые выполняются в хранимой процедуре или пакете, будут выполнены от имени владельца хранимой процедуры или пакета. То же самое относится и к триггерам.\nНекоторые проектировщики очень любят использовать описанный выше метод защиты данных - это похоже на инкапсуляцию. Иногда проектировщики строят на каскадирующих вызовах хранимых процедур весьма сложные протоколы доступа к данным, имитируя мандатную защиту. Такой подход имеет свои преимущества и недостатки. С одной стороны, любой доступ к данным скрыт хранимой процедурой или пакетом, но с другой - в этом случае словарь данных сильно перегружен. Однако далеко не все реализации СУБД хорошо работают с курсорами в хранимых процедурах и пакетах, поскольку это вызывает чрезмерную загрузку процессора. Кроме того, в большинстве реализаций СУБД предложения SQL, выполняемые из хранимой процедуры или пакета, имеют более высокий приоритет, чем операции SQL, выполняемые из приложения пользователя. В связи с этим большое количество вызовов хранимых процедур может существенно замедлить выполнение запросов непосредственно из приложений пользователя. В любом случае, чтобы сделать защиту данных, «закрывая» любой запрос хранимой процедурой, требуется, чтобы СУБД имела достаточно развитый язык и позволяла, например, выполнять синтаксический разбор и чтобы внутри самой хранимой процедуры можно было строить как статические, так и динамические предложения SQL.\nК сфере защиты данных относятся также сохранность данных и восстановление их после сбоя системы. Для обеспечения бесперебойной работы часто применяют архивирование (в том числе инкрементное) базы данных и журнала транзакций, а в случае отказа системы при следующем старте операции над данными восстанавливают по журналу транзакций (например, производят их откат до определенного момента времени). Применяют также методы горячего резервирования, когда работают два сервера: основной, обрабатывающий запросы пользователей, и резервный, который продолжает работу основного сервера в случае его отказа. Состояние хранилищ данных на основном и резервном серверах согласовано и поддерживается СУБД автоматически, что позволяет проектировщикам не разрабатывать собственные механизмы репликации данных.\nРабота серверов в режиме горячего резервирования не избавляет от необходимости хранения резервных копий данных, это может быть и не очевидно для аналитиков и не предусмотрено ими. Некоторые бизнес-процессы по своей природе требуют от информационной системы работы в режиме 24x7, и любой простой стоит очень дорого. В этих случаях работают две или три параллельные системы, и при отказе одного из серверов резервные серверы немедленно принимают управление на себя. Эффективным, но дорогостоящим способом реализации таких задач являются предоставляемые СУБД технологии симметричной репликации. Еще один вариант - архивирование журналов транзакций на резервном узле на специальное устройство и немедленный докат по этому журналу резервного узла в случае отказа основного. Разные СУБД предлагают разные механизмы реализации подобной бесперебойной работы, и для принятия верного проектного решения необходимы консультации проектировщиков с администраторами баз данных.\nВ простых ситуациях, когда информационная система используется в основном для операций чтения данных, а сами данные меняются редко, резервное копирование может вообще не требоваться, если данные одной такой системы могут быть легко восстановлены из данных других работающих систем. Достаточно будет обеспечить наличие образа базы данных (архив всех файлов базы данных, а также управляющих файлов - это должен быть снимок базы данных на определенный момент времени; проще всего такой снимок получить, остановив СУБД и сделав резервную копию всех указанных файлов).\nВ большинстве информационных систем необходимо обеспечение безотказной работы системы в ситуации, представляющей собой нечто среднее между описанными выше двумя крайними случаями. Проектировщики должны пересмотреть результаты анализа, исходя из ответов на следующие вопросы:\nкаков график необходимой доступности системы для запросов пользователя (то есть когда система обязательно должна работать); \nдопустимы ли вообще и когда допустимы периоды профилактического простоя системы; \nдопустимы ли и когда допустимы периоды ограничения доступа к системе; \nкакие данные после отказа системы нельзя получить из других источников (часто это ввод новых документов, например накладных, операции со счетами, заказы на телефонные переговоры, информация с автоматизированных датчиков и т.п.); \nесли данные можно получить, то каков объем повторно вводимой информации; \nкаково допустимое время восстановления системы после сбоя; \nимеется ли график пакетных суточных заданий; \nкакие еще приложения, кроме информационной системы, работают на данном оборудовании; \nимеются ли резервные аппаратные средства на случай отказа основных; \nимеется ли запас мощности оборудования, на котором функционирует информационная система; \nкакова скорость передачи данных при резервном копировании; \nимеются ли специальные отказоустойчивые носители для хранения резервных копий; \nимеется ли правило циклического использования резервных носителей; \nимеется ли специальное защищенное место для хранения резервных носителей. \nОтветы на эти вопросы позволят более реально оценить ситуацию и уточнить требования заказчика, формализованные аналитики. Бывает, что заказ работоспособности системы в режиме 24х7 вовсе не является обоснованным и система простаивает, например, 50% времени. Если же требование 24х7 действительно отражает особенности данного бизнеса, то эти вопросы помогут построить соответствующую стратегию защиты данных от сбоев. Качество построенной при проектировании стратегии защиты должно быть проверено тестерами, причем их работа по генерации и проведению тестов, имитирующих отказы оборудования, должна проводиться как на этапе проектирования, так и в течение всего этапа разработки - в целях раннего обнаружения дефектов стратегии защиты данных от сбоев.\n\nОбмен данными с внешними системами \nБольшинство аналитиков считают задачи обмена с внешними системами чисто физическими, решенными априори и, как следствие, не уделяют этим вопросам внимания при анализе. Поэтому зачастую проектировщики вынуждены нести на себе всю нагрузку по созданию таких систем обмена.\nИмпорт и экспорт данных во внешние системы могут обеспечиваться как утилитами, поставляемыми в составе СУБД, так и специальными средствами обмена данными проектируемой информационной системы. Прежде чем писать код собственно системы обмена данными, внимательно изучите сервис, который предоставляет СУБД, и используйте его полностью. Если обмен данными идет между двумя однородными базами данных (одного производителя и одной версии), то средства импорта и экспорта данных во внутреннем формате данной СУБД могут быть использованы без ограничений. Если же обмен данными осуществляется между СУБД разных производителей, то для импорта и экспорта собственно данных можно использовать текстовые файлы. Следует при этом обратить особое внимание на особенности представления null, пустых строк символов и BLOB, так как здесь потенциально присутствует расхождение интерпретации содержимого файлов загрузчиками данных.\nИмпорт и экспорт схем может оказаться более сложным делом. Производители СУБД часто заявляют о поддержке стандартов ANSI, но на практике большинство баз данных не удовлетворяют им полностью. Синтаксисы операций создания таблиц существенно различаются, а синтаксисы определения хранимых процедур и триггеров большинства СУБД вообще несовместимы. Информация о схеме базы данных может быть получена из системного каталога посредством анализа данных в системных представлениях, но и здесь нет полной поддержки стандарта. Когда информационной системе требуется обмен данными между СУБД разных производителей, то, как правило, проектировщики принимают решение о создании специализированного средства. Даже если оно не будет полнофункциональным и не может быть применено для решения задачи конвертации данных между любыми СУБД, то решить локальную задачу оно способно.\nИнтерфейсы обмена с внешними системами можно разбить на следующие категории:\nодноразовый импорт данных, унаследованных, как правило, из старой системы; \nпериодический обмен данными между узлами информационной системы (внутренний обмен); \nпериодический обмен данных с другими информационными системами (внешний обмен). \nЕсли обмен данными должен осуществляться в режиме, близком к реальному времени, то это будет задача о распределенной базе данных, а не о простой передаче данных.\nПри анализе задач загрузки и выгрузки данных проектировщик должен рассмотреть:\nкаким подсистемам нужен интерфейс выгрузки данных и каков должен быть интерфейс загрузки данных из внешней системы; \nкаковы периодичность обмена данными и объем передаваемых данных; \nкакая требуется степень синхронизации двух систем; \nкаковы возможные методы транспортировки данных; \nа также:\nсогласовать формат данных для обмена; \nопределить зависимости загрузки и выгрузки, например порядок выполнения операций; \nопределить мероприятия, которые необходимо выполнить при сбое во время загрузки и выгрузки данных; \nсформулировать правила определения ошибочных записей (при загрузке); \nопределить правила регистрации операций передачи и приема данных; \nопределить график передачи данных (в большинстве информационных систем эти операции выполняются в ночное время); \nсоставить график разработки и тестирования собственных утилит или скриптов обмена данными; \nсоставить график разовой загрузки данных, наследуемых из старой системы, и подготовить методику проверки корректности этой операции. \nСледует отметить, что при наследовании данных из старой системы проектировщикам не приходится надеяться на то, что кто-то создаст утилиту, позволяющую достать данные из старой системы, - обычно это становится задачей самих проектировщиков новой системы. Может случиться так, что вам придется работать в жестких условиях, когда не будет возможности выделить время для тестирования новой программы извлечения данных. В этом случае нужно разработать набор тестовых данных. Если в старой системе имеется какое-то средство извлечения данных - используйте его; часто это самый разумный выход.\nПри загрузке данных из старой системы проектировщики могут столкнуться с большим объемом неочищенных данных - с нарушениями целостности данных, возникшими из-за сбоев системы, «заплаток» разработчиков, иных неприятностей. Возможно, что на вас будет оказано давление с тем, чтобы допустить наличие неочищенных данных в новой системе. Если не принять мер по очистке данных, то, вероятно, большинство спроектированных ограничений целостности нужно будет ослабить, чтобы загрузить хоть какую-то часть данных. Цена такой уступки достаточно высока: данные вы приняли, но ослабленные ранее ограничения уже нельзя восстановить, так как они уже нарушены (это отслеживается СУБД автоматически). Отсюда следует вывод: поддаваться давлению нельзя, так как несколько дней, потраченных на очистку данных, стоят так мало по сравнению с наличием в информационной системе данных, не обладающих элементарной целостностью.\nЧто делать с данными, которые содержат ошибки или не согласованы? Самое простое решение - пропускать такие данные, собирать их отдельно и анализировать. Здесь вас могут ждать некоторые проблемы: не все СУБД при загрузке данных их собственными утилитами позволяют в случае возврата кода ошибки указать запись, на которой произошел сбой. Если это так, то данные следует загружать небольшими порциями, чтобы можно было легче найти запись, которая повлекла сбой. Можно разместить данные с нарушениями целостности в отдельных таблицах, а потом обработать их. Подобную операцию (которую аналитики, как правило, не предусматривают) лучше автоматизировать посредством отдельного компонента. Проектировщикам придется либо озадачить аналитиков исследованием правил корректности данных, либо выполнить эту работу самим, причем необходима помощь опытных пользователей старой информационной системы. Здесь крайне важно найти данные, которые являются надежными, то есть те, которые с большой вероятностью указаны правильно. От таких данных и надо отталкиваться при создании программ проверки корректности данных.\nДалеко не все СУБД предоставляют средства, позволяющие выгрузить схему данных, хранимые процедуры и триггеры, но имеется достаточное количество ПО сторонних фирм, способного на это. Самым привлекательным будет ПО, осуществляющее выгрузку указанных объектов в виде скриптов, описывающих их создание. Если ПО позволяет сначала создать объекты данных без ограничений ссылочной целостности, а потом изменить их, добавив эти ограничения, то такой опцией рекомендуется пользоваться всегда. Дело в том, что большинство утилит выгрузки схемы опрашивают системный каталог и генерируют скрипт создания таблиц в том порядке, в котором имена таблиц встречаются в системном каталоге. Но вы не застрахованы от того, что имя таблицы-потомка будет считано раньше имени таблицы-предка. От исправления операций создания объектов данных вы также не застрахованы, так как у большинства СУБД разный синтаксис определения ограничений ссылочной целостности, серверных ограничений, индексов. Например, перечисленные ниже определения ссылочной целостности для таблицы tx:\ncreate table t(id int primary key, name char(10); \ncreate table tx(i int, j int references t(id)); \ncreate table tx(i int, j int references t(id) on delete no action on update no action); \ncreate table tx(i int, j int, foreign key j references t(id) on delete no action on update no action); \ncreate table tx(i int, j int, foreign key j references t on delete no action on update no action); \ncreate table tx(i int, j int, constraint t_ref_cascade foreign key j references t(id) on delete no action on update no action); \nвсе означают в точности одно и то же, но синтаксис у них разный. Для преобразования предложений SQL в требуемый формат могут быть созданы специальные утилиты. Поскольку в этом случае требуется разбор текста, то весьма нецелесообразно применение инструмента Perl. К сожалению, операция переноса хранимых процедур и триггеров не может быть в такой же степени автоматизирована вследствие существенных различий в языках их написания в разных СУБД. Некоторые СУБД совместимы по синтаксису хотя бы частично, но если этого нет, то большой доли ручной работы не избежать.\n",
|
||
"1",
|
||
"[['этап', 'разработка', 'проект', 'заключительные', 'стадия', 'проектирование', 'схема_база', 'заключительный', 'стадия', 'проектирование', 'проектирование', 'процесс', 'тестирование', 'проектирование', 'процесс', 'тестирование', 'правило', 'процесс', 'функциональный', 'проектирование', 'проектирование', 'схема_база'], ['этап', 'использовать', 'сложный', 'схема', 'тестирование', 'ограничиться', 'простой'], ['привести', 'принцип', 'придерживаться', 'проектирование', 'информационный_система'], ['генерация', 'модуль', 'завершить', 'выполнять', 'автономный', 'тест', 'преследовать', 'два', 'основный', 'цель', 'обнаружение', 'отказ', 'модуль', 'жёсткий', 'сбой', 'соответствие', 'модуль', 'спецификация', 'наличие', 'необходимый', 'функция', 'отсутствие', 'лишний', 'функция'], ['автономный', 'тест', 'пройти', 'успешно', 'группа', 'сгенерированных', 'модуль', 'проходить', 'тест', 'связь', 'отследить', 'взаимный', 'влияние', 'модуль'], ['группа', 'модуль', 'тестироваться', 'надёжность', 'работа', 'проходить', 'первых', 'тест', 'имитация', 'отказ', 'система', 'вторых', 'тест', 'наработка', 'отказ'], ['первый', 'группа', 'тест', 'показывать', 'насколько', 'система', 'восстанавливаться', 'сбой', 'программный', 'обеспечение', 'отказ', 'аппаратный', 'обеспечение'], ['второй', 'группа', 'тест', 'определять', 'степень', 'устойчивость', 'система', 'штатный', 'работа', 'позволять', 'оценить', 'время', 'безотказный', 'работа', 'система'], ['комплект', 'тест', 'устойчивость', 'входить', 'тест', 'имитировать', 'пиковый', 'нагрузка', 'система'], ['комплект', 'модуль', 'проходить', 'системный', 'тест', 'тест', 'внутренний', 'приёмка', 'продукт', 'показывать', 'уровень', 'качество'], ['сюда', 'входить', 'тест', 'функциональность', 'тест', 'надёжность', 'система'], ['последний', 'тест', 'информационный_система', 'приемо', 'сдаточный', 'испытание'], ['тест', 'предусматривать', 'показ', 'информационный_система', 'заказчик', 'содержать', 'группа', 'тест', 'моделировать', 'реальный', 'бизнес', 'процессы', 'показать', 'соответствие', 'реализация', 'требование', 'заказчик'], ['требование', 'безопасность', 'доступ', 'обслуживание', 'система', 'информационный_система', 'содержать', 'определённый', 'требование', 'защита', 'несанкционированный', 'доступ', 'регистрация', 'событие', 'система', 'аудит', 'резервный', 'копирование', 'восстановление', 'информация', 'проектирование', 'формализовать', 'аналитик'], ['проектировщик', 'строить', 'стратегия', 'безопасность', 'система'], ['частность', 'определить', 'категория', 'пользователь', 'система', 'иметь', 'доступ_данным', 'соответствующий', 'компонент'], ['определяться', 'объект', 'субъект', 'защита'], ['отметить', 'стратегия', 'безопасность', 'ограничиваться', 'целый', 'комплекс', 'мера', 'правило', 'ведение', 'бизнес'], ['четко', 'определить', 'уровень', 'защита', 'необходимый', 'каждый', 'компонент', 'информационный_система', 'выделить', 'критичный', 'доступ', 'строго', 'ограничить'], ['пользователь', 'информационный_система', 'регистрироваться', 'проектироваться', 'модуль', 'отвечать', 'идентификация', 'аутентификация', 'пользователь'], ['большинство', 'субд', 'реализовать', 'дискреционный', 'защита', 'регламентировать', 'доступ', 'объект', 'таблица', 'представление'], ['требоваться', 'ограничение', 'доступ_данным', 'отдельный', 'запись', 'таблица', 'отдельный', 'поле', 'запись', 'таблица', 'т.п.', 'реализовать', 'мандатный', 'защита'], ['проектировщик', 'чёткий', 'представление', 'уровень', 'защита', 'иной', 'единица', 'информация', 'являться', 'достаточный'], ['вопрос', 'восстановление', 'хранение', 'резервный', 'копия', 'база', 'архив', 'база', 'относиться', 'мероприятие', 'поддержка', 'бесперебойный', 'функционирование', 'информационный_система'], ['внимательно', 'изучить', 'возможность', 'предоставлять', 'субд', 'проанализировать', 'использовать', 'возможность', 'субд', 'обеспечение', 'требуемого', 'уровень', 'бесперебойный', 'работа', 'система'], ['составление', 'спецификация', 'результат', 'проектирование', 'отражаться', 'документ', 'функциональный', 'спецификация'], ['документ', 'писаться', 'заказчик', 'получить', 'санкция', 'завершение', 'проектирование', 'начало', 'разработка', 'содержать', 'большой', 'количество', 'технический', 'деталь'], ['второй', 'документ', 'технический', 'спецификация', 'являться', 'основный', 'документ', 'разработчик', 'модель', 'группа', 'тестирование', 'описать', 'деталь', 'проект'], ['использоваться', 'case', 'средство', 'технический', 'спецификация', 'обязательно', 'содержать', 'ряд', 'отчёт', 'репозитария'], ['полнота', 'проектирование', 'начало', 'разработка', 'модуль', 'раз', 'проверить', 'полнота', 'проектирование'], ['полезный', 'инструмент', 'матрица', 'использование', 'таблица', 'схема_база', 'модулям'], ['переход', 'реализация', 'начать', 'реализация', 'модуль'], ['означать', 'работа', 'проектировщик', 'завершить', 'полностью'], ['практика'], ['разработчик', 'сталкиваться', 'медленно', 'работать', 'реализуемыми', 'схема', 'запрос'], ['ситуация', 'инициировать', 'изменение', 'модель', 'информационный_модель'], ['изменение', 'информационный_модель', 'производиться', 'причина'], ['хороший', 'проектировщик', 'необходимый', 'практический', 'опыт', 'работа', 'аппаратный', 'программный', 'обеспечение', 'причина', 'участие', 'проектировщик', 'состав', 'группа', 'разработчик'], ['ведущий', 'сотрудник', 'группа', 'разработчик', 'одновременно', 'являться', 'проектировщик'], ['использовать', 'проектировщик', 'этап', 'разработка'], ['привести', 'пример', 'проектировщик', 'написать', 'спецификация', 'модуль', 'проводить', 'семинар', 'разработчик', 'демонстрировать', 'прототип', 'семинар', 'предполагать', 'диалог', 'два', 'сторона'], ['модуль', 'передать', 'разработчик', 'проектировщик', 'участвовать', 'пересмотр', 'выполнять', 'контрольный', 'функция', 'реализация', 'проектный', 'решение'], ['крупный', 'проект', 'характерный', 'поэтапный', 'выполнение', 'работа', 'вероятный', 'завершение', 'реализация', 'группа', 'модуль', 'сдача', 'очередной', 'этап', 'процесс', 'проектирование', 'продолжить', 'новый', 'группа', 'модуль'], ['проектировщик', 'обеспечить', 'быстрый', 'реагирование', 'возможный', 'изменение', 'требование', 'заказчик', 'своевременный', 'обработка', 'информация', 'являться', 'обязанность'], ['участие', 'системный', 'аналитик', 'общаться', 'заказчик', 'проект'], ['схема_база', 'схема_база', 'содержать', 'описание', 'объект', 'база', 'пользователь', 'привилегия', 'таблица', 'представление', 'индекс', 'кластер', 'ограничение', 'пакет', 'хранить_процедура', 'триггер', 'т.п.', 'создаваться', 'определение', 'объект', 'объект', 'работать', 'разработчик'], ['er', 'модель', 'отображение', 'схема', 'результат', 'этап', 'анализ', 'построение', 'информационный_модель'], ['дело', 'простой', 'сущность', 'становиться', 'таблицами', 'атрибут', 'сущность', 'столбец', 'таблица', 'ключ', 'становиться', 'первичный', 'ключ', 'возможный', 'ключ', 'определяться', 'ограничение', 'unique', 'внешний_ключ', 'становиться', 'декларация', 'ссылочный_целостность'], ['аналитик', 'правило', 'вникать', 'особенность', 'реализация', 'иной', 'субд', 'проектирование', 'схема_база', 'проектировщик', 'сталкиваться', 'конструкция', 'информационный_модель', 'реализуемы', 'трудный', 'реализуемы', 'выбрать', 'субд'], ['привести', 'пример', 'ограничение', 'реализация', 'субд', 'информационный_модель', 'описать', 'три', 'сущность', 'a', 'b', 'c.', 'сущность', 'b', 'c', 'содержать', 'внешний_ключ', 'ссылающиеся', 'сущность', 'a.', 'субд', 'поддерживаться', 'возможность', 'определение', 'внешний_ключ', 'первичный', 'ключ', 'возможный', 'ключ', 'определить', 'декларативный', 'ссылочный_целостность'], ['случай', 'отображение', 'er', 'модель', 'физический', 'модель', 'невозможный', 'изменение', 'информационный_модель'], ['информационный_модель', 'описать', 'внешний_ключ', 'каскадный', 'удаление', 'модификация'], ['субд', 'поддерживаться', 'внешний_ключ', 'вариант', 'действие', 'no_action', 'каскадный', 'изменение', 'явный', 'вид', 'поддерживаться'], ['реализация', 'ссылочный_целостность', 'триггер', 'ограничить', 'уровень', 'каскадирования', 'триггер', '32', 'вызов', 'триггер'], ['случай', 'потребоваться', 'изменение', 'информационный_модель'], ['информационный_модель', 'определить', 'атрибут', 'представлять', 'строка', 'длина', '500', 'символ'], ['атрибут', 'осуществляться', 'поиск', 'информационный_система', 'объём', 'большой'], ['субд', 'индексировать', 'строка', 'символ', 'длинный', '128', '256', 'символ'], ['осуществлять', 'поиск', 'индекс', 'время', 'ответ', 'информационный_система', 'существенно', 'превышать', 'допустимый', 'вследствие', 'прийтись', 'изменить', 'описание', 'сущность'], ['информационный_модель', 'описать', 'сущность', 'a', 'содержать', 'крайний', 'мера', 'два', 'атрибут', 'blob', 'требоваться', 'отдельно', 'хранить', 'звук', 'изображение'], ['субд', 'невозможный', 'создать', 'таблица', 'два', 'атрибут', 'blob', 'случай', 'изменить', 'описание', 'сущность'], ['отношение', 'a', 'исключаться', 'два', 'атрибут', 'blob', 'добавляться', 'атрибут', 'ak', 'тип', 'integer'], ['добавляются', 'два', 'дополнительный', 'сущность'], ['содержать', 'атрибут', 'blob', 'ключевой', 'атрибут', 'k', 'тип', 'integer', 'стать', 'внешний_ключ', 'каждый', 'новый', 'отношение', 'ссылаться', 'атрибут', 'ak', 'отношение', 'a', 'тип', 'внешний_ключ', 'on', 'delete', 'cascade', 'on', 'update', 'cascade'], ['жизненный', 'цикл', 'сущность', 'определить', 'информационный_модель', 'соответствующий', 'диаграмма'], ['описание', 'сущность', 'отсутствовать', 'атрибут', 'отражать', 'изменение', 'состояние', 'сущность'], ['ситуация', 'проектировщик', 'добавлять', 'атрибут', 'status', 'определяться', 'ограничение', 'допустимый', 'значение', 'список', 'допустимый', 'состояние', 'изменение', 'состояние', 'сущность', 'описываться', 'триггер', 'проверять', 'допустимость', 'сочетание', 'новый', 'старый', 'значение', 'атрибут'], ['два', 'диаграмма', 'поток', 'описывать', 'различный', 'бизнес', 'процессы', 'работать', 'данными'], ['допустить', 'первый', 'диаграмма', 'описывать', 'выписка', 'товар', 'склад', 'второй', 'сложный', 'отчёт', 'отражать', 'состояние', 'склад'], ['процесс', 'интенсивно', 'модифицировать', 'второй', 'работать', 'режим', 'чтение', 'требовать', 'согласованность', 'течение', 'длительный', 'время'], ['процесс', 'описываться', 'транзакция', 'данными'], ['субд', 'уровень', 'изолированность', 'транзакция', 'реализовать', 'читать', 'транзакция', 'конфликтовать', 'модифицирующими', 'транзакция'], ['приводить', 'остановка', 'выписка', 'товар', 'склад', 'время', 'выполнение', 'отчёт', 'неприемлемый', 'заказчик'], ['потребоваться', 'серьёзный', 'изменение', 'информационный_модель'], ['пример', 'er', 'модель', 'продукт', 'анализ', 'перенести', 'автоматически', 'модель', 'привести', 'множество'], ['случай', 'инициировать', 'изменение', 'информационный_модель'], ['решение', 'проблема', 'определяться', 'возможность', 'субд', 'выбрать', 'реализация', 'проект'], ['проблема', 'разрешать', 'рамка', 'субд', 'накапливаться', 'проектировщик', 'поставить', 'вопрос', 'смена', 'субд'], ['вопрос', 'подниматься', 'стадия', 'проектирование', 'разработчик', 'столкнуться', 'подобный', 'проблема', 'цена', 'смена', 'субд', 'высоко'], ['ясный', 'одинаковый', 'субд', 'работать', 'плохо', 'работать', 'работать', 'несмотря', 'уверение', 'производитель', 'субд', 'поддержка', 'стандарт', 'sql'], ['касаться', 'хранить_процедура', 'триггер', 'трудный', 'говорить', 'поддержка', 'sql92', 'psm'], ['вопрос', 'производительность', 'информационный_система', 'влиять', 'отображение', 'er', 'модель', 'модель'], ['счёт', 'мощный', 'сервер', 'база', 'добиться', 'больший', 'скорость', 'реакция', 'система', 'мощность', 'аппаратный', 'комплекс', 'ограниченный'], ['производительность', 'система', 'целое', 'зависеть', 'число', 'нормализация'], ['80', 'запрос', 'база', 'являться', 'выборками', 'соединение', 'иному', 'атрибут', 'относиться', 'затратный', 'операция', 'первый', 'очередь', 'соединение', 'нечисловой', 'атрибут'], ['увеличить', 'производительность', 'система', 'введение', 'избыточный', 'информация', 'денормализации'], ['отметить', 'решение', 'приниматься', 'основа', 'er', 'модель', 'требоваться', 'внимательно', 'проанализировать', 'поток'], ['критичный', 'процесс', 'являться', 'хороший', 'кандидат', 'денормализации', 'время', 'выполнение', 'частота', 'выполнение', 'большой', 'объём', 'обрабатывать', 'частота', 'изменение', 'обрабатывать', 'информация', 'явный', 'приоритет'], ['денормализации', 'прибегать', 'цель', 'ускорение', 'выполнение', 'отчёт'], ['проверка', 'эффективность', 'иной', 'денормализации', 'привлекаться', 'тестер'], ['тип', 'правило', 'субд', 'поддерживать', 'небольшой', 'набор', 'базовый', 'тип', 'числовой', 'тип', 'целый', 'вещественный', 'плавать', 'фиксированный', 'точка', 'строка', 'символ', 'байт', 'дата', 'время', 'комбинированный', 'тип', 'datetime', 'blob', 'разновидность', 'blob', 'поле', 'хранение', 'текст'], ['информационный_модель', 'каждый', 'атрибут', 'соответствовать', 'домен'], ['реализация', 'субд', 'поддерживать', 'домен', 'случай', 'определение', 'модель', 'ограничение', 'домен', 'описывать', 'ограничение', 'столбец', 'таблица', 'частность', 'использовать', 'check', 'constraints', 'триггеры'], ['отметить', 'определение', 'тип', 'столбец', 'таблица', 'учитывать', 'тип', 'поддерживаться', 'словарь', 'субд'], ['oracle', 'ключевой', 'слово', 'integer', 'smallint', 'real', 'поддерживаться', 'транслятор', 'sql', 'словарь', 'соответствовать', 'number(38', 'number(38', 'float(63', 'oracle', 'хранить', 'двоичный', 'десятичный', 'формат', 'плавать', 'точка', 'двоичный', 'формат', 'плавать', 'точка', '38-восьмизначное', 'число', 'назвать', 'слово', 'smallint'], ['субд', 'поддерживать', 'два', 'вид', 'строковый', 'тип', 'фиксированный', 'длина', 'char', 'храниться', 'ровно', 'столько', 'символ', 'указать', 'описание', 'атрибут', 'переменный', 'длина', 'varchar', 'храниться', 'реальный', 'длина', 'значение', 'атрибут', 'концевой', 'пробел', 'строка', 'усекаются'], ['семантика', 'сравнение', 'строка', 'субд', 'различный', 'мнение', 'сравнение', 'строка', 'расходиться', 'реализовать', 'субд', 'прийтись', 'смириться', 'особенность', 'субд'], ['описать', 'поведение', 'oracle', '7.x', 'сравниваться', 'значение', 'a', 'равный', 'ab', 'b', 'равный', 'ab', 'два', 'атрибут', 'тип', 'varchar', 'разный', 'длина', 'sql', 'сообщить'], ['избежать', 'фокус', 'частность', 'следить', 'приложение', 'вставляло', 'незначащие', 'концевой', 'пробел', 'значение', 'атрибут', 'тип'], ['индекс', 'кластер', 'правильно', 'спроектировать', 'база', 'таблица', 'содержать', 'первичный', 'ключ', 'означать', 'наличие', 'индекс'], ['большинство', 'субд', 'использоваться', 'индекс'], ['отметить', 'использоваться', 'составной_индекс', 'поиск', 'атрибут', 'входить', 'индекс', 'начинать', 'второй', 'медленный'], ['допустить', 'определить', 'индекс', 'index1(id1', 'id2', 'случай', 'поиск', 'значение', 'удовлетворять', 'условие', 'id2=1', 'медленный', 'исключить', 'оптимизатор', 'использовать', 'индекс', 'обработка', 'условие', 'принять', 'решение', 'полный_сканирование', 'поиск', 'значение', 'удовлетворять', 'условие', 'id1=1', 'and', 'id2=1', 'быстрый'], ['особенность', 'учитывать', 'определение', 'индекс', 'схема_база', 'индексировать', 'атрибут', 'осуществляться', 'поиск', 'соединение'], ['наличие', 'индекс', 'замедлять', 'операция', 'модификация', 'ускорять', 'поиск', 'наличие', 'индекс', 'обязательно', 'атрибут', 'набор', 'атрибут', 'указать', 'ограничение', 'unique'], ['индекс', 'субд', 'создавать', 'автоматически', 'описание', 'таблица', 'указать', 'ограничение', 'unique'], ['индекс', 'использовать', 'выборка', 'заданный', 'порядок'], ['случай', 'вызываться', 'процесс', 'сортировка', 'ответ', 'использоваться', 'готовый', 'индекс', 'атрибут', 'входить', 'внешний_ключ', 'индексировать', 'субд', 'делать', 'операция', 'автоматически', 'декларация', 'внешний_ключ', 'субд', 'поддерживаться', 'bitmap', 'индекс', 'эффективный', 'поиск', 'равенство', 'поиск', 'тип', 'индекс', 'годиться', 'субд', 'поддерживаться', 'хеш', 'индекс', 'кластер'], ['индекс', 'эффективно', 'использоваться', 'поиск', 'равенство'], ['кластеризация', 'попытка', 'разместить', 'физический', 'блок', 'строка', 'доступ', 'осуществляться', 'помощь', 'одинаковый', 'значение', 'ключ'], ['индексный', 'кластер', 'удобный', 'использовать', 'хранение', 'родительский', 'дочерний', 'строка', 'таблица', 'связать', 'ссылочный_целостность'], ['кластер', 'удобный', 'определять', 'набор', 'атрибут', 'соединение', 'проводиться', 'увеличивать', 'скорость', 'поиск'], ['отметить', 'реализация', 'субд', 'существовать', 'жёсткий', 'ограничение', 'количество', 'кластер', 'таблица', 'правило', 'кластер'], ['особенность', 'реализация', 'кластер', 'субд', 'учитывать', 'проектирование', 'критичный', 'время', 'выполнение', 'модуль'], ['обратить', 'внимание', 'насколько', 'сильно', 'влиять', 'наличие', 'кластер', 'производительность', 'dml', 'операция'], ['оказывать', 'отрицательный', 'влияние', 'реализация', 'распространяться', 'dml', 'операция', 'таблица', 'база', 'определить', 'кластер'], ['особенность', 'субд', 'учитывать', 'проектирование'], ['выбрать', 'иной', 'тип', 'индекс', 'требоваться', 'внимательно', 'изучить', 'руководство', 'администратор', 'субд'], ['оптимизатор', 'sql', 'использовать', 'различный', 'тип', 'доступ_данным', 'обработка', 'запрос', 'индексирование', 'существенно', 'влиять', 'выбор', 'оптимизатор'], ['привести', 'способ', 'доступ_данным', 'пример', 'выборка', 'select', 'id', 'name', 'from', 'xtable', 'where', 'id=10', 'таблица', 'индексировать'], ['случай', 'применяться', 'полный_сканирование', 'являться', 'эффективный', 'объём', 'большой', 'таблица', 'удовлетворять', 'условие', 'размер', 'кортеж', 'существенно', 'превосходить', 'размер', 'атрибут_id'], ['атрибут_id', 'индексировать', 'тип', 'индекс'], ['применяться', 'индексный_сканирование', 'полный_сканирование', 'выбрать', 'случай', 'объём', 'удовлетворять', 'условие', 'являться', 'больший', 'информация', 'анализироваться', 'статистический', 'оптимизатор', 'сравнимый', 'количество', 'запись', 'таблица'], ['индексный_сканирование', 'применяться', 'размер', 'индексированных', 'атрибут', 'размер', 'кортеж', 'обработка', 'запрос', 'получить', 'индекс', 'остальных', 'случай', 'применить', 'полный_сканирование'], ['атрибут_id', 'входить', 'составной_индекс', 'являться', 'первый', 'лидировать', 'атрибут', 'индекс', 'тип', 'индекс'], ['аналогично', 'предыдущий', 'пример', 'применяться', 'индексный_сканирование'], ['атрибут_id', 'входить', 'составной_индекс', 'первый', 'атрибут', 'индекс', 'тип', 'индекс'], ['индексный_сканирование', 'применяться', 'размер', 'индексированных', 'атрибут', 'размер', 'кортеж', 'обработка', 'запрос', 'получить', 'индекс', 'остальных', 'случай', 'применяться', 'полный_сканирование'], ['атрибут_id', 'индексировать', 'тип', 'индекс', 'хеш'], ['применяться', 'индексный_сканирование', 'поиск', '=', 'условие', 'id', '<', '=', '10', 'применение', 'хеш', 'индекс', 'поиск', 'эффективно'], ['атрибут_id', 'индексировать', 'тип', 'индекс', 'bitmap'], ['применяться', 'индексный_сканирование', 'поиск', '=', 'условие', 'id', '<', '=', '10', 'применение', 'bitmap', 'индекс', 'поиск', 'эффективно'], ['атрибут_id', 'являться', 'ключ', 'хеш', 'кластер'], ['случай', 'применяться', 'алгоритм', 'хеширование', 'поиск', 'блок', 'чтение'], ['хороший', 'алгоритм', 'правильный', 'размер', 'кластер', 'поиск', 'осуществить', 'чтение', 'ошибка', 'выбор', 'алгоритм', 'блок', 'кластер', 'составить', 'несколько', 'тысяча', 'операция', 'чтение', 'блок'], ['атрибут_id', 'являться', 'ключ', 'индексный', 'кластер'], ['применяться', 'индексный_сканирование', 'аналогично', 'случай', 'индекс'], ['таблица', 'кластеризована', 'id', 'являться', 'ни', 'кластерный', 'ключ', 'ни', 'лидировать', 'составной_индекс'], ['ситуация', 'кластер', 'применяться', 'полный_сканирование'], ['привести', 'правило', 'выполнение', 'операция', 'поиск', 'зависимость', 'наличие', 'тип', 'индекс'], ['реализация', 'использовать', 'субд', 'принять', 'иные', 'принцип'], ['подробность', 'использование', 'тип', 'сканирование', 'поиск', 'даваться', 'руководство', 'настройка', 'субд', 'руководство', 'администратор', 'субд'], ['проиндексировать', 'индексный', 'поиск', 'быстрый', 'полный_сканирование'], ['индекс', 'занимать', 'место', 'диск', 'вопрос'], ['индексироваться', 'атрибут', 'integer', '4', 'байт'], ['значение', 'ключ', 'индекс', 'храниться', 'внутренний', 'идентификатор', 'кортеж', 'служебный', 'информация', 'вместе', 'составлять', '4', '8', 'байт'], ['посчитать', 'величина', 'использовать', 'субд', 'обратиться', 'руководство', 'администратор', 'посмотреть', 'размер', 'идентификатор', 'rowid', 'oracle', 'rid', 'db2', 'т.д.', 'размер', 'страница', 'индекс', 'правило', '4', 'кбайт'], ['выбор', 'стратегия', 'индексация', 'придерживаться', 'два', 'простой', 'принцип', 'индекс', 'высоко', 'затрата', 'выполнение', 'dml', 'операция'], ['грубый', 'оценка', 'затрата', 'принять', '1', 'работа', 'вставка', 'строка', 'таблица', 'работа', 'вставка', 'запись', 'индекс', 'равный', '2', '3', 'разный', 'субд', 'значение', 'найти', 'количество', 'операция', 'чтение', 'уровень', 'дерево', 'дерево', 'три', 'уровень', 'значение', 'integer', 'содержать', 'порядок', '533', '731', '324', 'ключ', 'страница', 'дерево', '4', 'кбайт'], ['индекс', 'отлично', 'использоваться', 'поиск', '=', '<', '>', '<', '=', '>', '=', 'between', 'достаточно', 'модифицируются'], ['bitmap', 'индекс', 'содержаться', 'готовый', 'битовый', 'вектор', 'отражать', 'вхождение', 'невхождение', 'значение', 'ответ', 'поиск', 'равенство', 'индекс', 'плохо', 'модифицируются', 'подходить', 'хранилище', 'индексирование', 'вхождение', 'слово', 'текстовый', 'документ'], ['хеш', 'индекс', 'позволять', 'осуществлять', 'поиск', 'равенство', 'хеш', 'функция', 'использоваться', 'поиск', 'блок', 'кластеризованных', 'содержать', 'значение'], ['алгоритм', 'хеш', 'функции', 'хороший', 'размер', 'кластер', 'указать', 'верно', 'поиск', 'осуществить', 'чтение'], ['индекс', 'правило', 'использовать', 'создание', 'кластер'], ['обратить', 'внимание', 'хранить', 'субд', 'индекс', 'null'], ['null', 'индекс', 'храниться', 'вероятность', 'использование', 'полный_сканирование', 'атрибут', 'декларация', 'not', 'null', 'резко', 'повышаться'], ['null', 'храниться', 'индекс', 'считать', 'самым', 'больший', 'самым', 'маленький', 'построение', 'специальный', 'значение', 'построение', 'bitmap', 'хеш', 'индекс', 'выяснить', 'какой', 'операция', 'поиск', 'индекс', 'использовать', 'оптимизатор', 'sql'], ['информация', 'правило', 'содержаться', 'руководство', 'администратор'], ['проверить', 'экспериментально', 'создать', 'тестовый', 'таблица', 'объём', 'примерно', '20', 'тыс.', 'запись', 'оптимизатор', 'выбирать', 'полный_сканирование', 'причина', 'малый', 'объём', 'выполнить', 'исследовать', 'запрос', 'произвести', 'explain', 'план', 'запрос', 'сервис', 'предоставляться', 'субд'], ['временной', 'временной', 'данными', 'временной_ряд', 'называть', 'содержать', 'дата', 'время'], ['неправильный', 'обработка', 'субд', 'служить', 'основный', 'причина', 'низкий', 'функциональность', 'производительность', 'информационный_система'], ['временной_ряд', 'вписываться', 'двухмерный', 'реляционный', 'модель'], ['sql', 'поддерживать', 'соединение', 'основать', 'равенство', 'большинство', 'разработчик', 'субд', 'ограничиваться', 'эквисоединением'], ['временной', 'приходиться', 'соединять', 'таблица', 'основа', 'перекрытие', 'диапазон', 'дата'], ['sql', 'существовать', 'операция', 'позволять', 'задать', 'соединение', 'непосредственно'], ['ряд', 'атрибут', 'курс', 'валюта', 'цена', 'товар', 'изменяться', 'время'], ['атрибут', 'действительный', 'дата', 'актуальный', 'течение', 'определённый', 'интервал', 'время', 'день', 'курс', 'валюта'], ['субд', 'позволять', 'обрабатывать', 'многомерный', 'обработка', 'временной_ряд', 'использовать', 'механизм', 'время', 'являться', 'измерение'], ['многомерный', 'процессор', 'применяться', 'обработка', 'геофизический', 'географический'], ['система', 'использоваться', 'индекс', 'клон'], ['привести', 'пример', 'обработка', 'цена', 'товар', 'код', 'товар', 'начальный', 'дата', 'конечный', 'дата', 'цена', 'create_table', 'prices', 'id', 'integer', 'date_from', 'date', 'not', 'null', 'date_to', 'date', 'price', 'decimal', 'not', 'null', 'constraint', 'p_range', 'check', 'date_from', '<', 'date_to', 'отметить', 'отношение', 'задать', 'первичный', 'ключ', 'задача', 'определение', 'ключ', 'отношение', 'отличаться', 'сложность'], ['известный', 'момент', 'изменение', 'цена', 'заранее', 'известный', 'объясняться', 'отсутствие', 'ограничение', 'not', 'null', 'атрибут', 'date_to', 'select', 'price', 'from', 'prices', 'where', 'id', '=', 'product_code', 'and', 'date_from', '<', 'when_date', 'and', 'date_to', '>', '=', 'nvl(:when_date', 'to_date(’01/12/4721', 'dd', 'mm', 'yyyy', 'product_code', 'when_date', 'обозначать', 'переменный', 'включающего', 'язык', 'дата', '01/12/4721', 'являться', 'большой', 'поддерживать', 'субд', 'дата'], ['операция', 'лучше', 'оформлять', 'вид', 'хранить_процедура', 'функция', 'претранслированных', 'запрос'], ['хранилище', 'обрабатываться', 'архивный', 'обработка', 'временной_ряд', 'актуальный'], ['возникать', 'вопрос', 'повод', 'точность', 'дата', 'актуальный', 'курс', 'валюта', 'биржевой', 'сделка'], ['определить', 'достаточный', 'точность', 'дата', 'секунда'], ['существовать', 'проблема', 'зарегистрировать', 'сделка', 'цена', 'акция', 'постоянно', 'меняться'], ['проектировщик', 'случай', 'обрабатывать', 'временной_ряд', 'простой', 'решение', 'отследить', 'цена', 'акция', 'момент', 'прохождение', 'биржевой', 'транзакция', 'сохранить', 'цена', 'часть', 'информация', 'модифицировать', 'транзакция'], ['рассмотреть', 'простой', 'вариант', 'решение', 'задача', 'ни', 'подходить', 'использовать', 'временной_ряд'], ['показывать', 'известный', 'текущий', 'момент', 'дата', 'момент', 'цена', 'товар', 'перестать', 'актуальный'], ['сделать', 'значение', 'равный', 'null', 'самым', 'больший', 'значение', 'определить', 'default', 'значение', 'атрибут'], ['отметить', 'значение', 'default', 'большинство', 'реализация', 'субд', 'работать', 'вставка', 'новый', 'запись'], ['создать', 'триггер', 'срабатывать', 'выполнение', 'операция', 'insert', 'update', 'преобразует', 'null', 'больший', 'допустимый', 'значение', 'дата'], ['случай', 'пользователь', 'работать', 'подобный', 'информация', 'забыть', 'взяться', 'иная', 'дата'], ['спроектировать', 'схема_база', 'запрос', 'образ', 'приложение', 'работать', 'выборками', 'отвечать', 'следующий', 'требование', 'принудительно', 'конвертировать', 'null', 'дата', 'показывать', 'пользователь', 'использовать', 'соответствующий', 'представление', 'содержать', 'decode', 'иное', 'средство', 'конвертация', 'больший', 'дата', 'вызывать', 'хранимую', 'процедура', 'выполнить', 'преобразование'], ['высоко', 'перечислить', 'возможный', 'проектный', 'решение'], ['отметить', 'эффективный', 'поиск', 'создать', 'составной_индекс', 'атрибут', 'date_from', 'date_to', 'субд', 'использовать', 'составной_индекс', 'атрибут', 'допустимый', 'значение', 'null'], ['простой', 'аналитик', 'задача', 'представление', 'временной_ряд', 'повлечь', 'множество', 'неприятный', 'момент', 'проектирование'], ['рассмотреть', 'проблема', 'поиск', 'первичный', 'ключ', 'отношение'], ['оказываться', 'единственный', 'разумный', 'вариант', 'предотвращение', 'дубликат', 'каждый', 'единичный', 'интервал', 'соответствовать', 'отдельный', 'строка'], ['биржевой', 'операция', 'интервал', 'равный', 'секунда', 'система'], ['таблица', 'преимущество', 'результат', 'выбирать', 'помощь', 'эквисоединения', 'объём', 'обрабатывать', 'большой'], ['использование', 'временной_ряд', 'правило', 'являться', 'актуальный', 'разговор', 'аналитик'], ['какой', 'решение', 'хороший', 'зависеть', 'использовать', 'субд', 'особенность', 'оптимизатор', 'запрос', 'особенность', 'использование', 'индекс', 'мощность', 'sql', 'хранить_процедура', 'триггер'], ['хранение', 'объект', 'сложный', 'задача', 'проектирование', 'схема_база', 'решение', 'привлекаться', 'администратор', 'база'], ['универсальный', 'решение', 'подойти', 'субд', 'существовать', 'производитель', 'субд', 'создавать', 'способ', 'хранение', 'доступ_данным', 'считать', 'хороший', 'гордиться'], ['проектирование', 'схема_база', 'влиять', 'следующий', 'параметр', 'общий', 'большинство', 'субд', 'размер', 'табличный', 'пространство', 'хранение', 'таблица', 'размер', 'табличный', 'пространство', 'хранение', 'индекс', 'размер', 'табличный', 'пространство', 'хранение', 'blob', 'кластер', 'параметр', 'размер', 'словарь', 'код', 'хранить_процедура', 'функция', 'триггер', 'пакет', 'статический', 'sql', 'реализовать', 'db2', 'управлять', 'файл', 'файл', 'журнал', 'интенсивность', 'поток', 'запрос', 'модифицировать', 'индекс', 'фал', 'временной', 'табличный', 'пространство', 'хранение', 'временной', 'таблица', 'строиться', 'выполнение', 'group', 'by', 'временной', 'объект', 'интенсивность', 'поток', 'запрос', 'инициировать', 'создание', 'временной', 'таблица', 'поток', 'транзакция', 'read', 'write', 'read', 'only', 'объём', 'модифицировать', 'считывать', 'характеристика', 'параллельный', 'работа', 'транзакция', 'количество', 'приложение', 'работать', 'параллельно', 'база', 'количество', 'соединение', 'база', 'каждый', 'приложение', 'файл', 'параметр', 'старт', 'ядро', 'субд', 'загрузочный', 'модуль', 'ядро', 'субд', 'утилит', 'субд', 'входной', 'выходной', 'генерировать', 'пользовательский', 'программа', 'скрипт', 'управление', 'субд'], ['постарайтесь', 'описать', 'параметр', 'общий', 'вид', 'обсудить', 'вопрос', 'администратор', 'база', 'внимательно', 'выслушайте', 'рекомендация'], ['мнение', 'расходиться', 'ваш', 'представление', 'работать', 'субд', 'попытаться', 'понять', 'аргумент', 'запомнить', 'особенность', 'субд', 'связать'], ['отразить', 'журнал', 'проектирование'], ['вид', 'нюанс', 'размещение', 'объект', 'конфигурация', 'сервер', 'база', 'учесть', 'этап', 'проектирование', 'требовать', 'полномасштабный', 'тестирование'], ['избежать', 'ошибка', 'проектирование', 'приготовиться', 'схема_база', 'меняться', 'этап', 'реализация', 'неоднократно'], ['защита', 'стратегия', 'защита', 'определяться', 'этап', 'анализ', 'этап', 'проектирование', 'предстоять', 'реализовать', 'стратегия', 'спроектировав', 'соответствующий', 'структура', 'схема_база', 'модуль'], ['большинство', 'субд', 'иметь', 'развитой', 'средство', 'дискреционный', 'защита', 'ряд', 'субд', 'иметь', 'встроенные', 'подсистема', 'аудит', 'освобождать', 'создание', 'собственный', 'средство', 'защита'], ['субд', 'предоставлять', 'набор', 'пакетированных', 'привилегия', 'управление', 'данными', 'connect', 'разрешать', 'соединение', 'база', 'resource', 'разрешать', 'создание', 'собственный', 'объект', 'база', 'dba', 'позволять', 'выполнять', 'функция', 'администратор', 'конкретный', 'база', 'и др.'], ['дискреционный', 'защита', 'предполагать', 'разграничение', 'доступ', 'объект', 'таблица', 'представление', 'т.п.', 'данным', 'храниться', 'объект'], ['дискреционный', 'защита', 'обеспечивать', 'создание', 'пользовательский', 'пакетированных', 'привилегия', 'роль', 'группа', 'привилегия'], ['случай', 'набор', 'привилегия', 'иные', 'объект', 'назначаться', 'группа', 'роль', 'группа', 'роль', 'назначаться', 'пользователь', 'образ', 'пользователь', 'получать', 'привилегия', 'выполнение', 'иных', 'операция', 'объект', 'косвенно', 'группа', 'роль'], ['реализация', 'допускаться', 'выполнение', 'определённый', 'набор', 'операция', 'имя', 'другого', 'пользователь', 'привилегия', 'частность', 'вызов', 'пакет', 'хранить_процедура'], ['пользователь', 'вызывать', 'объект', 'ни', 'изменить', 'пакет', 'хранимую', 'процедура', 'ни', 'получить', 'доступ', 'код', 'операция', 'данными', 'выполняться', 'хранить_процедура', 'пакет', 'выполнить', 'имя', 'владелец', 'хранить_процедура', 'пакет'], ['относиться', 'триггер'], ['проектировщик', 'любить', 'использовать', 'описать', 'выше', 'метод', 'защита', 'похожий', 'инкапсуляция'], ['проектировщик', 'строить', 'каскадировать', 'вызов', 'хранить_процедура', 'весьма', 'сложный', 'протокол', 'доступ_данным', 'имитировать', 'мандатный', 'защита'], ['подход', 'преимущество', 'недостаток'], ['сторона', 'доступ_данным', 'скрыть', 'хранить_процедура', 'пакет', 'случай', 'словарь', 'сильно', 'перегрузить'], ['реализация', 'субд', 'работать', 'курсор', 'хранить', 'процедурах', 'пакет', 'вызывать', 'чрезмерный', 'загрузка', 'процессор'], ['большинство', 'реализация', 'субд', 'предложение', 'sql', 'выполнять', 'хранить_процедура', 'пакет', 'иметь', 'высокий', 'приоритет', 'операция', 'sql', 'выполнять', 'приложение', 'пользователь'], ['связь', 'большой', 'количество', 'вызов', 'хранить_процедура', 'существенно', 'замедлить', 'выполнение', 'запрос', 'непосредственно', 'приложение', 'пользователь'], ['случай', 'сделать', 'защита', 'закрывать', 'запрос', 'хранить_процедура', 'требоваться', 'субд', 'достаточно', 'развить', 'язык', 'позволять', 'выполнять', 'синтаксический', 'разбор', 'внутри', 'хранить_процедура', 'строить', 'статический', 'динамический', 'предложение', 'sql'], ['сфера', 'защита', 'относиться', 'сохранность', 'восстановление', 'сбой', 'система'], ['обеспечение', 'бесперебойный', 'работа', 'применять', 'архивирование', 'число', 'инкрементный', 'база', 'журнал', 'транзакция', 'случай', 'отказ', 'система', 'следующий', 'старт', 'операция', 'данными', 'восстанавливать', 'журналу', 'транзакция', 'производить', 'откат', 'определённый', 'момент', 'время'], ['применять', 'метод', 'горячий', 'резервирование', 'работать', 'два', 'сервер', 'основной', 'обрабатывать', 'запрос', 'пользователь', 'резервный', 'продолжать', 'работа', 'основный', 'сервер', 'случай', 'отказ'], ['состояние', 'хранилище', 'основный', 'резервный', 'сервер', 'согласовать', 'поддерживаться', 'субд', 'автоматически', 'позволять', 'проектировщик', 'разрабатывать', 'собственный', 'механизм', 'репликация'], ['работа', 'сервер', 'режим', 'горячий', 'резервирование', 'избавлять', 'хранение', 'резервный', 'копия', 'аналитик', 'предусмотреть'], ['бизнес', 'процессы', 'природа', 'требовать', 'информационный_система', 'работа', 'режим', '24x7', 'простой', 'стоить', 'дорого'], ['случай', 'работать', 'два', 'три', 'параллельный', 'система', 'отказ', 'сервер', 'резервный', 'сервер', 'немедленно', 'принимать', 'управление'], ['эффективный', 'дорогостоящий', 'способ', 'реализация', 'задача', 'являться', 'предоставлять', 'субд', 'технология', 'симметричный', 'репликация'], ['вариант', 'архивирование', 'журнал', 'транзакция', 'резервный', 'узел', 'специальный', 'устройство', 'немедленный', 'докат', 'журнал', 'резервный', 'узел', 'случай', 'отказ', 'основный'], ['разные', 'субд', 'предлагать', 'разный', 'механизм', 'реализация', 'подобный', 'бесперебойный', 'работа', 'принятие', 'верный', 'проектный', 'решение', 'необходимый', 'консультация', 'проектировщик', 'администратор', 'база'], ['простой', 'ситуация', 'информационный_система', 'использоваться', 'основный', 'операция', 'чтение', 'меняться', 'редко', 'резервный', 'копирование', 'требоваться', 'система', 'легко', 'восстановить', 'работать', 'система'], ['достаточный', 'обеспечить', 'наличие', 'образ', 'база', 'архив', 'файл', 'база', 'управлять', 'файл', 'снимок', 'база', 'определённый', 'момент', 'время', 'снимок', 'получить', 'остановить', 'субд', 'сделать', 'резервный', 'копия', 'указать', 'файл'], ['большинство', 'информационный_система', 'обеспечение', 'безотказный', 'работа', 'система', 'ситуация', 'представлять', 'средний', 'описать', 'выше', 'два', 'крайний', 'случай'], ['проектировщик', 'пересмотреть', 'результат', 'анализ', 'исходить', 'ответ', 'следующий', 'вопрос', 'график', 'необходимый', 'доступность', 'система', 'запрос', 'пользователь', 'система', 'обязательно', 'работать', 'допустимый', 'допустимый', 'период', 'профилактический', 'простой', 'система', 'допустимый', 'допустимый', 'период', 'ограничение', 'доступ', 'система', 'отказ', 'система', 'получить', 'источник', 'ввод', 'новый', 'документ', 'накладный', 'операция', 'счёт', 'заказ', 'телефонный', 'переговоры', 'информация', 'автоматизированный', 'датчик', 'т.п.', 'получить', 'объём', 'повторно', 'вводить', 'информация', 'каково', 'допустимый', 'время', 'восстановление', 'система', 'сбой', 'иметься', 'график', 'пакетный', 'суточный', 'задание', 'приложение', 'информационный_система', 'работать', 'оборудование', 'иметься', 'резервный', 'аппаратный', 'средство', 'случай', 'отказ', 'основный', 'иметься', 'запас', 'мощность', 'оборудование', 'функционировать', 'информационный_система', 'какова', 'скорость', 'передача', 'резервный', 'копирование', 'иметься', 'специальный', 'отказоустойчивый', 'носитель', 'хранение', 'резервный', 'копия', 'иметься', 'правило', 'циклический', 'использование', 'резервный', 'носитель', 'иметься', 'специальный', 'защитить', 'место', 'хранение', 'резервный', 'носитель'], ['ответ', 'вопрос', 'позволить', 'реально', 'оценить', 'ситуация', 'уточнить', 'требование', 'заказчик', 'формализованный', 'аналитик'], ['заказ', 'работоспособность', 'система', 'режим', '24х7', 'являться', 'обоснованный', 'система', 'простаивать', '50', 'время'], ['требование', '24х7', 'отражать', 'особенность', 'бизнес', 'вопрос', 'помочь', 'построить', 'соответствующий', 'стратегия', 'защита', 'сбой'], ['качество', 'построить', 'проектирование', 'стратегия', 'защита', 'проверить', 'тестер', 'работа', 'генерация', 'проведение', 'тест', 'имитировать', 'отказ', 'оборудование', 'проводиться', 'этап', 'проектирование', 'течение', 'этап', 'разработка', 'цель', 'ранний', 'обнаружение', 'дефект', 'стратегия', 'защита', 'сбой'], ['обмен_данными', 'внешний', 'система', 'большинство', 'аналитик', 'считать', 'задача', 'обмен', 'внешний', 'система', 'чисто', 'физический', 'решить', 'априори', 'следствие', 'уделять', 'вопрос', 'внимание', 'анализ'], ['зачастую', 'проектировщик', 'вынуждены', 'нести', 'нагрузка', 'создание', 'система', 'обмен'], ['импорт', 'экспорт', 'внешний', 'система', 'обеспечиваться', 'утилит', 'поставляемыми', 'состав', 'субд', 'специальный', 'средство', 'обмен_данными', 'проектируемой', 'информационный_система'], ['писать', 'код', 'система', 'обмен_данными', 'внимательно', 'изучить', 'сервис', 'предоставлять', 'субд', 'использовать', 'полностью'], ['обмен_данными', 'идти', 'два', 'однородный', 'база', 'производитель', 'версия', 'средство', 'импорт', 'экспорт', 'внутренний', 'формат', 'субд', 'использовать', 'ограничение'], ['обмен_данными', 'осуществляться', 'субд', 'разный', 'производитель', 'импорт', 'экспорт', 'использовать', 'текстовый', 'файл'], ['обратить', 'особый', 'внимание', 'особенность', 'представление', 'null', 'пустой', 'строка', 'символ', 'blob', 'потенциально', 'присутствовать', 'расхождение', 'интерпретация', 'содержимого', 'файл', 'загрузчик'], ['импорт', 'экспорт', 'схема', 'оказаться', 'сложный', 'дело'], ['производитель', 'субд', 'заявлять', 'поддержка', 'стандарт', 'ansi', 'практика', 'большинство', 'база', 'удовлетворять', 'полностью'], ['синтаксис', 'операция', 'создание', 'таблица', 'существенно', 'различаться', 'синтаксис', 'определение', 'хранить_процедура', 'триггер', 'большинство', 'субд', 'несовместимый'], ['информация', 'схема_база', 'получить', 'системный', 'каталог', 'анализ', 'системный', 'представление', 'полный', 'поддержка', 'стандарт'], ['информационный_система', 'требоваться', 'обмен_данными', 'субд', 'разный', 'производитель', 'правило', 'проектировщик', 'принимать', 'решение', 'создание', 'специализированный', 'средство'], ['полнофункциональным', 'применить', 'решение', 'задача', 'конвертация', 'субд', 'решить', 'локальный', 'задача', 'способный'], ['интерфейсы', 'обмен', 'внешний', 'система', 'разбить', 'следующий', 'категория', 'одноразовый', 'импорт', 'унаследовать', 'правило', 'старый', 'система', 'периодический', 'обмен_данными', 'узел', 'информационный_система', 'внутренний', 'обмен', 'периодический', 'обмен', 'информационный_система', 'внешний', 'обмен'], ['обмен_данными', 'осуществляться', 'режим', 'близкий', 'реальный', 'время', 'задача', 'распределить', 'база', 'простой', 'передача'], ['анализ', 'задача', 'загрузка', 'выгрузка', 'проектировщик', 'рассмотреть', 'подсистемам', 'нужный', 'интерфейс', 'выгрузка', 'интерфейс', 'загрузка', 'внешний', 'система', 'каковы', 'периодичность', 'обмен_данными', 'объём', 'передавать', 'требоваться', 'степень', 'синхронизация', 'два', 'система', 'каковы', 'возможный', 'метод', 'транспортировка', 'согласовать', 'формат', 'обмен', 'определить', 'зависимость', 'загрузка', 'выгрузка', 'порядок', 'выполнение', 'операция', 'определить', 'мероприятие', 'выполнить', 'сбой', 'время', 'загрузка', 'выгрузка', 'сформулировать', 'правило', 'определение', 'ошибочный', 'запись', 'загрузка', 'определить', 'правило', 'регистрация', 'операция', 'передача', 'приём', 'определить', 'график', 'передача', 'большинство', 'информационный_система', 'операция', 'выполняться', 'ночной', 'время', 'составить', 'график', 'разработка', 'тестирование', 'собственный', 'утилита', 'скрипт', 'обмен_данными', 'составить', 'график', 'разовый', 'загрузка', 'наследовать', 'старый', 'система', 'подготовить', 'методика', 'проверка', 'корректность', 'операция'], ['отметить', 'наследование', 'старый', 'система', 'проектировщик', 'приходиться', 'надеяться', 'создать', 'утилита', 'позволять', 'достать', 'старый', 'система', 'становиться', 'задача', 'проектировщик', 'новый', 'система'], ['случиться', 'прийтись', 'работать', 'жёсткий', 'условие', 'возможность', 'выделить', 'время', 'тестирование', 'новый', 'программа', 'извлечение'], ['случай', 'разработать', 'набор', 'тестовый'], ['старый', 'система', 'иметься', 'какой', 'средство', 'извлечение', 'использовать', 'разумный', 'выход'], ['загрузка', 'старый', 'система', 'проектировщик', 'столкнуться', 'больший', 'объём', 'неочищенный', 'нарушение', 'целостность', 'возникнуть', 'сбой', 'система', 'заплатка', 'разработчик', 'иных', 'неприятность'], ['оказать', 'давление', 'допустить', 'наличие', 'неочищенный', 'новый', 'система'], ['принять', 'мера', 'очистка', 'вероятно', 'большинство', 'спроектировать', 'ограничение', 'целостность', 'ослабить', 'загрузить', 'какой', 'часть'], ['цена', 'уступка', 'достаточно', 'высокий', 'принять', 'ослабить', 'ограничение', 'восстановить', 'нарушить', 'отслеживаться', 'субд', 'автоматически'], ['вывод', 'поддаваться', 'давление', 'день', 'потратить', 'очистка', 'стоять', 'сравнение', 'наличие', 'информационный_система', 'обладать', 'элементарный', 'целостность'], ['делать', 'данными', 'содержать', 'ошибка', 'согласовать'], ['простой', 'решение', 'пропускать', 'собирать', 'отдельно', 'анализировать'], ['ждать', 'проблема', 'субд', 'загрузка', 'собственный', 'утилит', 'позволять', 'случай', 'возврат', 'код', 'ошибка', 'указать', 'запись', 'произойти', 'сбой'], ['загружать', 'небольшой', 'порция', 'лёгкий', 'найти', 'запись', 'повлечь', 'сбой'], ['разместить', 'нарушение', 'целостность', 'отдельный', 'таблица', 'обработать'], ['подобный', 'операция', 'аналитик', 'правило', 'предусматривать', 'лучше', 'автоматизировать', 'отдельный', 'компонент'], ['проектировщик', 'прийтись', 'озадачить', 'аналитик', 'исследование', 'правило', 'корректность', 'выполнить', 'работа', 'необходимый', 'помощь', 'опытный', 'пользователь', 'старый', 'информационный_система'], ['крайне', 'важный', 'найти', 'являться', 'надёжный', 'большой', 'вероятность', 'указать', 'правильно'], ['отталкиваться', 'создание', 'программа', 'проверка', 'корректность'], ['субд', 'предоставлять', 'средство', 'позволять', 'выгрузить', 'схема', 'хранить_процедура', 'триггеры', 'иметься', 'достаточный', 'количество', 'сторонний', 'фирма', 'способный'], ['самым', 'привлекательный', 'осуществлять', 'выгрузка', 'указать', 'объект', 'вид', 'скрипт', 'описывать', 'создание'], ['позволять', 'создать', 'объект', 'ограничение', 'ссылочный_целостность', 'изменить', 'добавить', 'ограничение', 'опция', 'рекомендоваться', 'пользоваться'], ['дело', 'большинство', 'утилита', 'выгрузка', 'схема', 'опрашивать', 'системный', 'каталог', 'генерировать', 'скрипт', 'создание', 'таблица', 'порядок', 'имя', 'таблица', 'встречаться', 'системный', 'каталог'], ['застраховать', 'имя', 'таблица', 'потомка', 'считать', 'имя', 'таблица', 'предок'], ['исправление', 'операция', 'создание', 'объект', 'застраховать', 'большинство', 'субд', 'разный', 'синтаксис', 'определение', 'ограничение', 'ссылочный_целостность', 'серверный', 'ограничение', 'индекс'], ['перечислить', 'определение', 'ссылочный_целостность', 'таблица', 'tx', 'create_table', 't(id', 'int', 'primary', 'key', 'name', 'char(10', 'create_table', 'tx(i', 'int', 'j', 'int', 'references', 't(id'], ['create_table', 'tx(i', 'int', 'j', 'int', 'references', 't(id', 'on', 'delete', 'no_action', 'on', 'update', 'no_action'], ['create_table', 'tx(i', 'int', 'j', 'int', 'foreign', 'key', 'j', 'references', 't(id', 'on', 'delete', 'no_action', 'on', 'update', 'no_action'], ['create_table', 'tx(i', 'int', 'j', 'int', 'foreign', 'key', 'j', 'references', 't', 'on', 'delete', 'no_action', 'on', 'update', 'no_action'], ['create_table', 'tx(i', 'int', 'j', 'int', 'constraint', 't_ref_cascade', 'foreign', 'key', 'j', 'references', 't(id', 'on', 'delete', 'no_action', 'on', 'update', 'no_action', 'означать', 'точность', 'синтаксис', 'разный'], ['преобразование', 'предложение', 'sql', 'требуемый', 'формат', 'создать', 'специальный', 'утилит'], ['случай', 'требоваться', 'разбор', 'текст', 'весьма', 'нецелесообразный', 'применение', 'инструмент', 'perl'], ['сожаление', 'операция', 'перенос', 'хранить_процедура', 'триггер', 'степень', 'автоматизировать', 'вследствие', 'существенный', 'различие', 'язык', 'написание', 'разный', 'субд'], ['субд', 'совместимый', 'синтаксис', 'частично', 'большой', 'доля', 'ручной', 'работа', 'избежать']]"
|
||
],
|
||
[
|
||
"37",
|
||
"Этапы разработки проекта3.docx",
|
||
"Этапы разработки проекта: определение стратегии тестирования и проектирование\nОпределение стратегии тестирования\nКак отмечалось ранее, на этапе анализа привлекаются группы тестирования, например для получения сравнительных характеристик предполагаемых к использованию аппаратных платформ, операционных систем, СУБД, иного окружения. Кроме того, на данном этапе определяется план работ по обеспечению надежности информационной системы и ее тестирования. Для любых проектов целесообразным является привлечение тестеров на ранних этапах разработки, в частности на этапе анализа и проектирования. Если проектное решение оказалось неудачным и это обнаружено слишком поздно - на этапе разработки или, что еще хуже, на этапе внедрения в эксплуатацию, - то исправление ошибки проектирования может обойтись очень дорого. Чем раньше группы тестирования выявляют ошибки в информационной системе, тем ниже стоимость сопровождения системы. Время на тестирование системы и на исправление обнаруженных ошибок следует предусматривать не только на этапе разработки, но и на этапе проектирования.\nДля автоматизации тестирования следует использовать системы отслеживания ошибок (bug tracking). Это позволяет иметь единое хранилище ошибок, отслеживать их повторное появление, контролировать скорость и эффективность исправления ошибок, видеть наиболее нестабильные компоненты системы, а также поддерживать связь между группой разработчиков и группой тестирования (уведомления об изменениях по e-mail и т.п.). Чем больше проект, тем сильнее потребность в bug tracking.\n\nПроектирование\nНа этапе проектирования формируется модель данных. Проектировщики в качестве исходной информации получают результаты анализа. Конечным продуктом этапа проектирования являются:\nсхема базы данных (на основании ER-модели, разработанной на этапе анализа); \nнабор спецификаций модулей системы (они строятся на базе моделей функций). \nЕсли проект небольшой, то в качестве аналитиков, проектировщиков и разработчиков могут выступать одни и те же люди. Возникает вопрос: насколько вообще актуальна передача результатов самому себе? Думаем, что актуальна. Представьте себе, что вы передаете данные кому-либо, кто мало знает о системе. Зачастую это помогает, например, найти не описанные вообще, нечетко описанные, противоречиво описанные компоненты системы.\nВсе спецификации должны быть точными. План тестирования системы дорабатывается также на этом этапе разработки. Во многих проектах результаты этапа проектирования оформляются единым документом, который называют технической спецификацией. В нем также описывают принятый подход к решению каких-либо сложных технических вопросов.\n\nЖурнал проектирования\nПри проектировании возникает необходимость регистрировать все обсуждаемые варианты и окончательные решения. Не секрет, что проектировщики порой меняют первоначальные решения. Это может происходить потому, что со временем участники проекта забывают аргументы в пользу принятого решения. Подобную информацию можно хранить в репозитарии используемого CASE-средства, в текстовых файлах, просто на бумаге. Журнал проектирования является полезным материалом для новых членов групп проектировщиков, а также для разработчиков и тестировщиков.\nТакой журнал может вестись как на этапе анализа, так и на этапе разработки и тестирования.\n\nПланирование этапа проектирования\nТщательное планирование важно для любого проекта. Это входит в обязанности руководителя проекта и руководителя группы проектирования (консультации с аналитиками в этом случае будут обязательными). Это позволяет:\nРазбить глобальную задачу на небольшие, независимые задачи. Такими задачами легче управлять, такие задачи легче реализовывать. \nОпределить контрольные даты (этапы сдачи), которые позволят определить, насколько успешно продвигается проект, какие направления отстают, какие недогружены, какие работают успешно. Это позволяет обнаружить отставание от сроков сдачи и вовремя предотвратить авралы. \nОпределить зависимости между задачами, а также последовательность завершения задач. \nПрогнозировать загрузку персонала, наем временных работников, привлечение других групп разработчиков, привлечение консультантов (если это необходимо). \nПолучить четкое представление о том, когда можно начать этап реализации. \nПолучить четкое представление о том, когда можно начать этап опытной эксплуатации. \n\nПерепланирование\nЗаказчики всегда хотят, чтобы план выполнения работ оставался неизменным. На практике этого редко удается достичь в полном объеме. Определенным компромиссом здесь может стать неизменность установленных сроков сдачи компонентов системы в эксплуатацию.\nЗадачи проектирования.\n\nРанние стадии\nРассмотрение результатов анализа\nЭто собственно процесс передачи информации от аналитиков проектировщикам. На практике это итерактивный процесс. У проектировщиков неизбежно будут возникать вопросы к аналитикам, и наоборот. Информация о системе будет постоянно уточняться. При разработке схемы базы данных может измениться информационная модель, полученная на этапе анализа, например потому, что имеющееся проектное решение нестабильно либо медленно работает при реализации его посредством выбранной СУБД или в силу иных причин. Проверить, охватывает ли анализ все бизнес-процессы системы (то есть осуществить проверку на полноту), проектировщики не в состоянии, но проверку информационной модели на непротиворечивость и корректность проектировщики провести могут. Это позволяет отследить ошибки в информационной модели и не повторить их в модели данных. Если результаты хранятся в репозитарии CASE-средства, то такая проверка на корректность может быть произведена автоматически.\n\nСеминары\nРанние стадии проектирования сопряжены с нудной и утомительной работой. Проектировщики и аналитики должны достигнуть полного понимания требований заказчика. Семинары являются быстрым и эффективным способом обмена информацией. Хороший способ убедиться в том, правильно ли проектировщики понимают назначение той или иной подсистемы, - взять один или несколько сценариев бизнес-процессов и проиграть их. Это можно сделать в форме простой диаграммы потока данных, причем необходимо указать не только автоматизированные, но и ручные функции.\n\nКритические участки\nКритические участки системы изучаются при первом обследовании системы и уточняются на этапе анализа. Термин «критические» может означать жизненно важные как для нормального функционирования информационной системы с точки зрения бизнеса (например, время простоя автоматизированной линии изготовления материала X не должно превышать одной минуты), так и для успешной реализации и приемки проекта. Критические с точки зрения бизнеса участки информационной системы хорошо подходят для макетирования. На основе этих макетов (работы макетирования выполняют проектировщики и группы тестирования) тестеры дают оценку качества как информационной модели, так и модели данных. Также макетирование позволяет показать, какие требования и какими средствами могут быть выполнены, а какие требования - не могут.\nЧасто на этапе проектирования выявляются критические участки, которые не были очевидными на этапе анализа. Это влечет за собой необходимость уточнения информационной модели. Часто это связано с особенностями реализации тех или иных возможностей в выбранной СУБД. Некоторые функции, которые на этапе анализа выглядят простыми, могут стать очень сложными, когда дело дойдет до физической реализации. Например:\nВ выбранной СУБД отсутствует эффективный механизм сканирования деревьев, а при анализе выявлено большое количество справочников и выбраны интерфейсы представления в виде деревьев, кроме того это понравилось заказчику, а СУБД при большом справочнике работает слишком медленно. \nДругая распространенная неприятность - неполно реализованная ссылочная целостность. В СУБД не реализованы каскадные модификации, в информационной модели нормализованные отношения предполагают наличие каскадных удалений и обновлений. Реализация же таких механизмов посредством триггеров оказалась слишком медленной, и уровень каскадирования триггеров ниже, чем уровень каскадных операций, определенных в информационной модели. \nТакие моменты могут инициировать не только изменение информационной модели, но и смену СУБД.\nМежду критическими участками проекта и его рисками существует тесная связь. Критический участок разработки (например, срыв сроков первого этапа сдачи проекта заказчику) может стоить целого проекта. Причинами срыва могут быть как ошибки проектирования, так и нехватка персонала.\n\nОценка ограничений\nОграничениями, известными с момента обследования бизнес-процессов, являются смета затрат и сроки внедрения. Могут быть и другие ограничения, например допуск персонала к той или иной информации (группы аналитиков к информации о бизнес-процессах в фирме, ограничения доступа к секретной информации и т.п.).\nРешения относительно выбора аппаратной платформы, как правило, необратимы, поскольку тесно связаны со сметой затрат и наличием обслуживающего персонала. Например, решения на платформе RS/6000 и Intel с точки зрения сметы затрат выглядят одинаково, но персонала, способного квалифицированно обслуживать RS/6000, нет, и руководство не согласно оплатить обучение сотрудников, хотя решение на основе RS/6000 обладает более высокой масштабируемостью. Это может послужить причиной выбора платформы Intel. Аналогичные причины могут влиять и на выбор операционной системы.\nЕсли проект является расширением или модернизацией существующей информационной системы, то число унаследованных ограничений также может быть большим. На этапе проектирования осуществляется обязательная проверка требований к информационной системе в свете выявленных ограничений. Менять платформу, операционную систему или СУБД на этапе реализации сложно, а на этапе опытной эксплуатации практически невозможно (на это просто не хватит времени, если не произойдет чудо). Чем большее количество компонентов системы уже реализовано, тем сложнее произвести подобную замену. Большинство СУБД сейчас работают на нескольких аппаратных платформах и нескольких операционных системах, но если есть участки кода проекта, зависимые от операционной системы или аппаратной платформы, то их изменение может обойтись очень дорого. В данной статье мы не будем обсуждать вопросы переносимости кода, поскольку они выходят за рамки этого цикла.\nЕсли какие-либо требования не могут быть удовлетворены в принципе, принимается решение о доведении этого факта до сведения спонсоров проекта (руководства фирмы). Обнаружение неработоспособности системы в процессе эксплуатации ничем хорошим обернуться не может, особенно если до руководства фирмы дойдет информация о том, что невыполнимость требований была известна заранее.\n\nОпределение целевой архитектуры\nПод выбором архитектуры мы понимаем и выбор платформы (платформ), и выбор операционной системы (операционных систем). В системе могут работать несколько компьютеров на разных аппаратных платформах и под управлением различных операционных систем. Если к автоматизации того или иного бизнеса до вас уже приложили руки, причем неоднократно, вы можете обнаружить настоящий «зверинец» платформ и операционных систем. Перенос ПО на ту или иную платформу - процесс не безболезненный, да и управление разнородной сетью может также стать делом проблемным. Если же обстоятельства таковы, что ПО на рабочих местах конечных пользователей должно работать под управлением нескольких операционных систем (ОС), то следует обязательно выделить зависимые от ОС участки кода и жестко описать интерфейсы обмена компонентов информационной системы, сделав их независимыми от ОС. При написании кода модулей, работающих под управлением нескольких ОС, следует ориентироваться на ту из них, которая обладает наиболее жесткими требованиями.\nКроме определения платформы следует выяснить следующее:\nБудет ли это архитектура «файл-сервер» или «клиент-сервер». \nБудет ли это 3-уровневая архитектура со следующими слоями: сервер, ПО промежуточного слоя (сервер приложений), клиентское ПО. \nБудет ли база данных централизованной или распределенной. Если база данных будет распределенной, то какие механизмы поддержки согласованности и актуальности данных будут использоваться. \nБудет ли база данных однородной, то есть будут ли все серверы баз данных продуктами одного и того же производителя (например, все серверы только Oracle или все серверы только DB2 UDB). Если база данных небудет однородной, то какое ПО будет использовано для обмена данными между СУБД разных производителей (уже существующее или разработанное специально как часть проекта). \nБудут ли для достижения должной производительности использоваться параллельные серверы баз данных (например, Oracle Parallel Server, DB2 UDB и т.п.). \nЭти решения часто принимаются до начала этапа проектирования (на этапе анализа). На этапе проектирования полезно еще раз рассмотреть все причины выбора той или иной архитектуры, провести тесты производительности и надежности критических участков информационной системы. Это позволит избежать тяжело устраняемых ошибок проектирования. Довольно часто на этапе проектирования возникают непредвиденные технические проблемы, например аналитики не учитывают группу пользователей, имеющих доступ к информационной системе посредством текстовых терминалов. Это ошибка анализа, но выявляется она только на этапе проектирования. Такие проблемы должны решаться вместе с аналитиками, которые инициируют изменение информационной модели.\nЕсли в среде используется сеть, то на этапе проектирования необходимо определить требуемые уровни сервиса сети и спроектировать ее топологию. Необходимо также провести тесты сети, чтобы увидеть, обеспечивает ли существующая сеть должную пропускную способность и имеется ли резерв пропускной способности сети. Если результат отрицательный, то следует четко описать необходимые изменения аппаратного обеспечения и топологии сети.\n\nВыделение потенциальных узких мест в информационной системе\nЕсли заказчик заявит, что производительность системы не имеет никакого значения, примите это замечание с юмором. Это означает лишь то, что время ответа системы на запрос не является (или не кажется заказчику в данный момент) критическим. Попробуйте спросить, приемлемо ли время ответа системы, равное одному часу или одному дню. Вряд ли ответ на этот вопрос будет положительным.\nПроизводительность важна для любой информационной системы. Узким местом называют момент падения производительности системы. Конкретный ответ на вопрос, где узкие места данной системы, может дать лишь специальное направленное тестирование. Но это не означает, что оценка потенциальных узких мест невозможна. Одним из хороших методов является график нагрузки на систему в течение дня, недели, месяца и т.п. Можно построить диаграмму, на которой будет отражено время работы тех или иных бизнес-процессов, а также требуемое для данного бизнес-процесса время ответа системы. Такие диаграммы помогают выявить момент, когда нагрузка будет наиболее интенсивной. Количество пользователей, одновременно работающих с тем или иным компонентом, отражается на диаграмме посредством весового коэффициента (рис. 1).\nВ приведенном примере явно видны 3 пика активности системы, максимальный из которых приходится на 11 часов. Использован тип диаграммы с накоплением.\nА в диаграмме, представленной на рис. 2, видна активность касс в течение рабочего дня и повышение активности загрузки данных в нерабочее время. В такие диаграммы следует также добавлять вес, отражающий сложность бизнес-процесса, например в данном примере самый высокий весовой коэффициент будут иметь отчеты. Оценка весов определяется особенностями каждого конкретного бизнеса - где-то она может быть высокой, где-то низкой.\nОтвет на вопрос, насколько потенциальные узкие места являются реальными, может дать только тестирование. Здесь оправданно применение специальных средств моделирования сценариев приложений. Следует отметить, что оценка точности детектирования узкого места в системе очень зависит от объема обрабатываемых данных. Следует уделить внимание генерации тестовых данных и проверке узких мест уже на этих данных. Часто информационная система не сразу выходит на проектную мощность, как правило, она работает некоторое время в режиме первоначального накопления информации, которое может продолжаться и несколько дней, и несколько месяцев. Как правило, предполагаемый порог объема обрабатываемых данных известен на этапе анализа, но реальный объем физических данных можно точно оценить только на этапе проектирования. Если сгенерировать предполагаемый объем тестовых данных нельзя (не хватает мощности техники или есть иные причины), то тесты проводят на меньшем объеме данных и пытаются построить оценки поведения системы на реальном объеме данных.\nБолее точно узкие места системы оцениваются на этапе разработки. Здесь уже есть реализованные компоненты системы. Средства автоматизации тестирования (например, LoadRunner, WinRunner и др.) позволяют отследить операции, которые выполняет то или иное приложение (но данные средства могут отследить далеко не все возможные типы приложений и то, насколько они подходят для тестирования вашего проекта, - это решение такого же порядка, что и выбор средства разработки приложения), автоматически сгенерировать сценарий запуска имитаторов работы реальных приложений и построить оценки узких мест системы.\n\nПродукты третьих фирм\nНа этапе проектирования оценивают возможность и эффективность использования продуктов третьих форм в разработке данной информационной системы. Например, существует задача выполнения некоторого набора работ (определенных пакетных заданий и т.п.) по заданному графику. Далеко не всегда целесообразно включать в проект создание утилиты контроля запуска приложений, поскольку есть масса утилит, выполняющих эти операции, в том числе и свободно распространяемых. Существует и другая причина, по которой с ПО третьих фирм следует хотя бы ознакомиться. Не факт, что в мировой практике решения задач, подобных вашей, не встречаются. Если реализации третьих фирм известны, то следует с ними ознакомиться хотя бы для того, чтобы не повторять неудачные решения и взять на заметку удачные. Вероятно, какой-либо из существующих продуктов может быть интегрирован в создаваемую вами информационную систему. Для этого, возможно, потребуется создать интерфейс обмена данными между ПО третьей фирмы и вашим. Следует оценить целесообразность как разработки собственного компонента, так и интеграции уже готового аналогичного компонента.\n\nИспользование CASE-средств\nCASE-средства предоставляют много преимуществ. На одной чаше весов будет автоматизация работы, предоставляемая CASE, а на другой - ненавистная задача преобразования результатов анализа в формат этого CASE (если для формализации результатов анализа использовался другой CASE-инструмент или не использовался никакой). Некоторые CASE-средства позволяют непосредственно перейти к проектированию, а к анализу можно вернуться путем обратного проектирования. К сожалению, при использовании обратного проектирования в CASE-средстве создается весьма вредная иллюзия того, что данные анализа регистрируются, хотя на самом деле этого практически никогда не происходит, поскольку информация, содержащаяся в спроектированной структуре, отличается от результатов анализа. Некоторые полезные данные получить можно, но построить полную картину вряд ли удастся.\n\nИнфраструктура\nДля проектирования и реализации необходимы аппаратные ресурсы и специальное программное обеспечение. Кроме того, требуется механизм, позволяющий контролировать создаваемую документацию и код. Эти вопросы лучше решать на ранних стадиях проектирования, а не на стадии разработки. Мы поговорим об этом ниже, в разделе «Проектирование процессов и кода». При групповой разработке вам понадобятся средства контроля согласованности кода. Если разработка идет под разными платформами (аппаратная платформа и ОС), то хорошим решением может оказаться PVCS. Для платформ Windows 98, NT, 2000 может оказаться приемлемым решение, предлагаемое Microsoft - MS Source Save. Кроме того, многие средства разработки также предоставляют возможности контроля исходного кода.\n\nПроектирование базы данных\nЗдесь мы изложим задачи, касающиеся проектирования реальной базы данных.\n\nПостроение модели данных\nРабота проектировщиков базы данных в значительной степени зависит от качества информационной модели. Информационная модель не должна содержать никаких непонятных конструкций, которые нельзя реализовать в рамках выбранной СУБД. Следует отметить, что информационная модель создается для того, чтобы на ее основе можно было построить модель данных, то есть должна учитывать особенности реализации выбранной СУБД. Если те или иные особенности СУБД не позволяют отразить в модели данных то, что описывает информационная модель, значит, надо менять информационную модель, так как производитель СУБД вряд ли будет оперативно менять собственно СУБД ради вашего конкретного проекта (хотя и такие, правда единичные, случаи имели место).\nПостроение логической и физической моделей данных является основной частью проектирования базы данных. Полученная в процессе анализа информационная модель сначала преобразуется в логическую, а затем в физическую модель данных. После этого для разработчиков информационной системы создается пробная база данных. С ней начинают работать разработчики кода. В идеале к моменту начала разработки модель данных должна быть устойчива. Проектирование базы данных не может быть оторвано от проектирования модулей и приложений, поскольку бизнес-правила могут создавать объекты в базе данных, например серверные ограничения (constraints), а также хранимые процедуры и триггеры, - в этом случае часто говорят, что часть бизнес-логики переносится в базу данных. Проектирование модели данных для каждой СУБД содержит свои особенности, проектные решения, которые дают хороший результат для одной СУБД, но могут оказаться совершенно неприемлемыми для другой. Ниже перечислим задачи, которые являются общими для проектирования моделей данных:\nвыявление нереализуемых или необычных конструкций в ER-модели и в определениях сущностей; \nразрешение всех дуг, подтипов и супертипов; \nизучение возможных, первичных, внешних ключей, описание ссылочной целостности (в зависимости от реализации декларативно или с использованием триггеров); \nпроектирование и реализация денормализации базы данных в целях повышения производительности; \nопределение части бизнес-логики, которую следует реализовать в базе данных (пакеты, хранимые процедуры); \nреализация ограничений (ограничений и триггеров), отражающих все централизованно определенные бизнес-правила, генерация ограничений и триггеров; \nопределение набора бизнес-правил, которые не могут быть заданы как ограничения в базе данных; \nопределение необходимых индексов, кластеров (если таковые реализованы в СУБД), определение горизонтальной фрагментации таблиц (если это реализовано в СУБД); \nоценка размеров всех таблиц, индексов, кластеров; \nопределение размеров табличных пространств и особенностей их размещения на носителях информации, определение спецификации носителей информации для промышленной системы (например, тип raid-массивов, их количество, какие табличные пространства на них размещаются), определение размеров необходимых системных табличных пространств (например, системного каталога, журнала транзакций, временного табличного пространства и т.п.); \nопределение пользователей базы данных, их уровней доступа, разработка и внедрение правил безопасности доступа, аудита (если это необходимо), создание пакетированных привилегий (в зависимости от реализации СУБД это роли или группы), синонимов; \nразработка топологии базы данных в случае распределенной базы данных, определение механизмов доступа к удаленным данным. \nПодробнее на каждом из перечисленных пунктов мы остановимся в части «Схема базы данных».\n\nСоздание базы данных для разработчика\nЧаще всего базу данных создает администратор баз данных - если он есть; в противном случае это приходится делать проектировщикам. Физическая база данных нужна разработчикам информационной системы для разработки кода, а проектировщикам для проверки их идей. Проектировщики и разработчики могут работать как с одной и той же схемой, так и с разными схемами. В процессе разработки проекта, как правило, создается несколько версий схемы базы данных. Следует обязательно вести журнал изменений схемы (вручную или в репозитарии case) и жестко контролировать версии схемы.\n\nПроектирование процессов и кода\nПараллельно с проектированием схемы базы данных требуется выполнить проектирование процессов, чтобы получить спецификации всех модулей. Если часть бизнес-логики хранится в базе данных (ограничения, триггеры, хранимые процедуры), то оба эти процесса проектирования тесно связаны. Главная цель проектирования заключается в отображении функций, полученных на этапе анализа, в модули информационной системы. Определения модулей раскрываются в технической спецификации программ. Возможно, что некоторые атомарные функции, полученные на этапе анализа, вообще не будут отображены в какие-либо модули, а будут преобразованы в ручные процедуры или принципы работы.\n\nВыбор средств разработки\nНе следует откладывать выбор средств разработки на самый последний момент. Если проектировщик не слишком хорошо представляет себе набор средств, которые будут использованы для разработки проекта, то следует для начала составить перечень возможных средств, затем провести консультации с техническими специалистами (хорошо знающими средства-кандидаты), оценить, с какими средствами персонал уже работал, а какие являются для них абсолютно новыми. Часто выбор средств разработки определяет именно фактор квалификации персонала.\nОтображение функций на модули\nНа этапе анализа уже разработан перечень функций, которые будут реализованы. На этапе проектирования этот перечень еще раз анализируется и корректируется. Однозначное соответствие между функцией и модулем вряд ли возможно. Дело в том, что на этапе анализа функции организованы по бизнес-категориям, а на этапе проектирования их придется реорганизовывать для упрощения разработки. Проектировщики могут принять решение объединить несколько функций, обладающих общими свойствами, или выделить какое-то общее свойство (или их набор) в отдельный модуль, а также разбить сложную функцию на несколько модулей. Подробнее эти вопросы рассматриваются в разделе «Спецификации функций».\n\nИнтерфейсы программ\nПри проектировании модулей определяют разметку меню, вид окон, горячие клавиши и связанные с ними вызовы. Существуют два вида перемещения по программам:\nс контекстом, когда целевая экранная форма частично или полностью заполняется автоматически данными, связанными с теми, что находятся в исходной экранной форме; \nбез контекста, когда целевая экранная форма не заполняется вовсе или частично заполняется автоматически данными, не связанными с теми, что находятся в исходной экранной форме. \nЧасто автоматически заполняемые данные экранной формы группируют (располагают рядом), а перемещение по заполняемым пользователем полям организуют так, как это делал бы сам пользователь, работая с реальным бумажным документом. Такие интерфейсы воспринимаются пользователем легче, и он намного быстрее осваивает новое ПО.\n\nИнтегрирование и наследование механизмов обмена данными\nИнформационная система редко разрабатывается с нуля. Чаще проектировщики сталкиваются с задачами наследования данных из старых систем, которые уже выполняют какие-либо задачи автоматизации бизнеса. Такие системы могут на начальном этапе быть интегрированы в новую систему и постепенно заменяться новыми, более современными модулями. Этот подход может навязываться руководством фирмы для того, чтобы ускорить ввод новой информационной системы. Следует рассмотреть все плюсы и минусы такой постепенной интеграции (минусов, как правило, оказывается больше). Одну операцию придется делать в любом случае: переносить ценные данные, хранящиеся в старой информационной системе, в новую, то есть проектировать механизмы конвертации данных. Возможно, что придется делать конвертацию данных не только из старой системы в новую, но и обратно (полную или частичную), поскольку возможен вариант развития событий, при котором старая и новая информационные системы будут работать параллельно - хотя бы в период опытной эксплуатации новой системы.\nКроме вопросов наследования собственно данных из старых информационных систем, возможно, вам придется также решать задачи взаимодействия вашего ПО с продуктами третьих фирм. В этом случае вам следует изучить интерфейсы обмена данными ПО других разработчиков и обеспечить должный уровень поддержки этих интерфейсов в разрабатываемой информационной системе.\n\nОпределение спецификаций модулей\nЭто основная часть функционального проектирования. Здесь решаются следующие задачи:\nпреобразование функциональных определений анализа в реализуемые модули; \nспецификации, которые выражают функциональные возможности каждого модуля в физических категориях; \nопределение средств разработки для каждого модуля (или выделенных групп модулей), если используются несколько средств разработки в одном проекте; \nопределение последовательности реализации модулей и зависимостей модулей. \nСпецификации модулей различают по степени детализации и содержанию даже в рамках одного проекта. Определяют, сколько времени требуется для того, чтобы сгенерировать тот или иной модуль, сколько необходимо на тестирование того или иного модуля, а также на тестирование совокупности сгенерированных модулей. Кроме того, следует разработать специальные метрики - шаблоны, которые позволяют оценить, сколько времени потребуется на создание исходного кода модуля. Для ускорения процесса разработки следует рассмотреть возможность использования генераторов исходного кода - это целесообразно, если вам предстоит разработать большое количество несложных модулей, а время разработки ограничено. Следует использовать шаблоны кода для устранения рутинных операций. Подробнее эти вопросы рассматриваются в разделе, посвященном спецификациям функций, - вы найдете его в одной из следующих статей данного цикла.\n",
|
||
"1",
|
||
"[['этап', 'разработка', 'проект', 'определение', 'стратегия', 'тестирование', 'проектирование', 'определение', 'стратегия', 'тестирование', 'отмечаться', 'этап_анализ', 'привлекаться', 'группа', 'тестирование', 'получение', 'сравнительный', 'характеристика', 'предполагать', 'использование', 'аппаратный_платформа', 'операционный_система', 'субд', 'иного', 'окружение'], ['этап', 'определяться', 'план', 'работа', 'обеспечение', 'надёжность', 'информационный_система', 'тестирование'], ['проект', 'целесообразный', 'являться', 'привлечение', 'тестер', 'ранний', 'этап', 'разработка', 'частность', 'этап_анализ', 'проектирование'], ['проектный', 'решение', 'оказаться', 'неудачный', 'обнаружить', 'поздно', 'этап', 'разработка', 'этап', 'внедрение', 'эксплуатация', 'исправление', 'ошибка', 'проектирование', 'обойтись', 'дорогой'], ['группа', 'тестирование', 'выявлять', 'ошибка', 'информационный_система', 'стоимость', 'сопровождение', 'система'], ['время', 'тестирование', 'система', 'исправление', 'обнаружить', 'ошибка', 'предусматривать', 'этап', 'разработка', 'этап_проектирование'], ['автоматизация', 'тестирование', 'использовать', 'система', 'отслеживание', 'ошибка', 'bug', 'tracking'], ['позволять', 'единый', 'хранилище', 'ошибка', 'отслеживать', 'повторный', 'появление', 'контролировать', 'скорость', 'эффективность', 'исправление', 'ошибка', 'видеть', 'нестабильный', 'компонент', 'система', 'поддерживать', 'связь', 'группа', 'разработчик', 'группа', 'тестирование', 'уведомление', 'изменение', 'e', 'mail', 'т.п.'], ['проект', 'сильный', 'потребность', 'bug', 'tracking'], ['проектирование', 'этап_проектирование', 'формироваться', 'модель'], ['проектировщик', 'качество', 'исходный', 'информация', 'получать', 'результат', 'анализ'], ['конечный', 'продукт', 'этап_проектирование', 'являться', 'схема', 'база', 'основание', 'er', 'модель', 'разработать', 'этап_анализ', 'набор', 'спецификация', 'модуль', 'система', 'строиться', 'база', 'модель', 'функция'], ['проект', 'небольшой', 'качество', 'аналитик', 'проектировщик', 'разработчик', 'выступать', 'человек'], ['возникать', 'вопрос', 'насколько', 'актуальный', 'передача', 'результат'], ['думать', 'актуальный'], ['представить', 'передавать', 'знать', 'система'], ['зачастую', 'помогать', 'найти', 'описать', 'нечетко', 'описать', 'противоречивый', 'описать', 'компонент', 'система'], ['спецификация', 'точный'], ['план', 'тестирование', 'система', 'дорабатывается', 'этап', 'разработка'], ['многих', 'проект', 'результат', 'этап_проектирование', 'оформляться', 'единый', 'документ', 'называть', 'технический', 'спецификация'], ['описывать', 'принять', 'подход', 'решение', 'какой', 'сложный', 'технический', 'вопрос'], ['журнал', 'проектирование', 'проектирование', 'возникать', 'необходимость', 'регистрировать', 'обсуждать', 'вариант', 'окончательный', 'решение'], ['секрет', 'проектировщик', 'порой', 'менять', 'первоначальный', 'решение'], ['происходить', 'время', 'участник', 'проект', 'забывать', 'аргумент', 'польза', 'принять', 'решение'], ['подобный', 'информация', 'хранить', 'репозитарии', 'использовать', 'case_средство', 'текстовый', 'файл', 'бумага'], ['журнал', 'проектирование', 'являться', 'полезный', 'материал', 'новый', 'член', 'группа', 'проектировщик', 'разработчик', 'тестировщиков'], ['журнал', 'вестись', 'этап_анализ', 'этап', 'разработка', 'тестирование'], ['планирование', 'этап_проектирование', 'тщательный', 'планирование', 'важный', 'проект'], ['входить', 'обязанность', 'руководитель', 'проект', 'руководитель', 'группа', 'проектирование', 'консультация', 'аналитик', 'случай', 'обязательный'], ['позволять', 'разбить', 'глобальный', 'задача', 'небольшой', 'независимый', 'задача'], ['задача', 'лёгкий', 'управлять', 'задача', 'лёгкий', 'реализовывать'], ['определить', 'контрольный', 'дата', 'этап', 'сдача', 'позволить', 'определить', 'насколько', 'успешно', 'продвигаться', 'проект', 'направление', 'отставать', 'недогрузить', 'работать', 'успешно'], ['позволять', 'обнаружить', 'отставание', 'срок', 'сдача', 'вовремя', 'предотвратить', 'аврал'], ['определить', 'зависимость', 'задача', 'последовательность', 'завершение', 'задача'], ['прогнозировать', 'загрузка', 'персонал', 'наём', 'временной', 'работник', 'привлечение', 'группа', 'разработчик', 'привлечение', 'консультант'], ['получить', 'чёткий', 'представление', 'начать', 'этап', 'реализация'], ['получить', 'чёткий', 'представление', 'начать', 'этап', 'опытный', 'эксплуатация'], ['перепланирование', 'заказчик', 'хотеть', 'план', 'выполнение', 'работа', 'оставаться', 'неизменный'], ['практика', 'редко', 'удаваться', 'достигнуть', 'полный', 'объём'], ['определённый', 'компромисс', 'неизменность', 'установить', 'срок', 'сдача', 'компонент', 'система', 'эксплуатация'], ['задача', 'проектирование'], ['ранние', 'стадия', 'рассмотрение', 'результат', 'анализ', 'процесс', 'передача', 'информация', 'аналитик', 'проектировщик'], ['практика', 'итерактивный', 'процесс'], ['проектировщик', 'неизбежно', 'возникать', 'вопрос', 'аналитик'], ['информация', 'система', 'постоянно', 'уточняться'], ['разработка', 'схема', 'база', 'измениться', 'информационный_модель', 'получить', 'этап_анализ', 'иметься', 'проектный', 'решение', 'нестабильный', 'медленно', 'работать', 'реализация', 'выбрать', 'субд', 'сила', 'иных', 'причина'], ['проверить', 'охватывать', 'анализ', 'бизнес', 'процессы', 'система', 'осуществить', 'проверка', 'полнота', 'проектировщик', 'состояние', 'проверка', 'информационный_модель', 'непротиворечивость', 'корректность', 'проектировщик', 'провести'], ['позволять', 'отследить', 'ошибка', 'информационный_модель', 'повторить', 'модель'], ['результат', 'храниться', 'репозитарии', 'case_средство', 'проверка', 'корректность', 'произвести', 'автоматически'], ['семинар', 'ранние', 'стадия', 'проектирование', 'сопрячь', 'нудный', 'утомительный', 'работа'], ['проектировщик', 'аналитик', 'достигнуть', 'полный', 'понимание', 'требование', 'заказчик'], ['семинар', 'являться', 'быстрый', 'эффективный', 'способ', 'обмен', 'информация'], ['хороший', 'способ', 'убедиться', 'правильно', 'проектировщик', 'понимать', 'назначение', 'иной', 'подсистема', 'взять', 'сценарий', 'бизнес', 'процессов', 'проиграть'], ['сделать', 'форма', 'простой', 'диаграмма', 'поток', 'указать', 'автоматизированный', 'ручной', 'функция'], ['критический_участок', 'критический_участок', 'система', 'изучаться', 'первый', 'обследование', 'система', 'уточняться', 'этап_анализ'], ['термин', 'критический', 'означать', 'жизненно', 'важный', 'нормальный', 'функционирование', 'информационный_система', 'точка', 'зрение', 'бизнес', 'время', 'простой', 'автоматизировать', 'линия', 'изготовление', 'материал', 'x', 'превышать', 'минута', 'успешный', 'реализация', 'приёмка', 'проект'], ['критический', 'точка', 'зрение', 'бизнес', 'участок', 'информационный_система', 'подходить', 'макетирование'], ['основа', 'макет', 'работа', 'макетирование', 'выполнять', 'проектировщик', 'группа', 'тестирование', 'тестер', 'давать', 'оценка', 'качество', 'информационный_модель', 'модель'], ['макетирование', 'позволять', 'показать', 'требование', 'средство', 'выполнить', 'требование'], ['этап_проектирование', 'выявляться', 'критический_участок', 'очевидный', 'этап_анализ'], ['влечь', 'необходимость', 'уточнение', 'информационный_модель'], ['связать', 'особенность', 'реализация', 'иных', 'возможность', 'выбрать', 'субд'], ['функция', 'этап_анализ', 'выглядеть', 'простой', 'сложный', 'дело', 'дойти', 'физический', 'реализация'], ['выбрать', 'субд', 'отсутствовать', 'эффективный', 'механизм', 'сканирование', 'дерево', 'анализ', 'выявить', 'большой', 'количество', 'справочник', 'выбрать', 'интерфейс', 'представление', 'вид', 'дерево', 'понравиться', 'заказчик', 'субд', 'большой', 'справочник', 'работать', 'медленно'], ['распространенная', 'неприятность', 'неполно', 'реализовать', 'ссылочный', 'целостность'], ['субд', 'реализовать', 'каскадный', 'модификация', 'информационный_модель', 'нормализованные', 'отношение', 'предполагать', 'наличие', 'каскадный', 'удаление', 'обновление'], ['реализация', 'механизм', 'триггер', 'оказаться', 'медленный', 'уровень', 'каскадирования', 'триггер', 'уровень', 'каскадный', 'операция', 'определить', 'информационный_модель'], ['момент', 'инициировать', 'изменение', 'информационный_модель', 'смена', 'субд'], ['критический_участок', 'проект', 'риск', 'существовать', 'тесный', 'связь'], ['критический_участок', 'разработка', 'срыв', 'срок', 'первый', 'этап', 'сдача', 'проект', 'заказчик', 'стоить', 'целый', 'проект'], ['причина', 'срыв', 'ошибка', 'проектирование', 'нехватка', 'персонал'], ['оценка', 'ограничение', 'ограничение', 'известный', 'момент', 'обследование', 'бизнес', 'процессов', 'являться', 'смета', 'затрата', 'срок', 'внедрение'], ['ограничение', 'допуск', 'персонал', 'иной', 'информация', 'группа', 'аналитик', 'информация', 'бизнес', 'процессах', 'фирма', 'ограничение', 'доступ', 'секретный', 'информация', 'т.п.'], ['решение', 'относительно', 'выбор', 'аппаратный_платформа', 'правило', 'необратимый', 'тесно', 'связать', 'смета', 'затрата', 'наличие', 'обслуживать', 'персонал'], ['решение', 'платформа', 'rs/6000', 'intel', 'точка', 'зрение', 'смета', 'затрата', 'выглядеть', 'одинаково', 'персонал', 'способный', 'квалифицированно', 'обслуживать', 'rs/6000', 'руководство', 'согласно', 'оплатить', 'обучение', 'сотрудник', 'решение', 'основа', 'rs/6000', 'обладать', 'высокий', 'масштабируемость'], ['послужить', 'причина', 'выбор', 'платформа', 'intel'], ['аналогичный', 'причина', 'влиять', 'выбор', 'операционный_система'], ['проект', 'являться', 'расширение', 'модернизация', 'существовать', 'информационный_система', 'число', 'унаследовать', 'ограничение', 'больший'], ['этап_проектирование', 'осуществляться', 'обязательный', 'проверка', 'требование', 'информационный_система', 'свет', 'выявить', 'ограничение'], ['менять', 'платформа', 'операционный_система', 'субд', 'этап', 'реализация', 'сложный', 'этап', 'опытный', 'эксплуатация', 'практически', 'невозможный', 'хватить', 'время', 'произойти', 'чудо'], ['больший', 'количество', 'компонент', 'система', 'реализовать', 'сложный', 'произвести', 'подобный', 'замена'], ['большинство', 'субд', 'работать', 'несколько', 'аппаратный_платформа', 'несколько', 'операционный_система', 'участок', 'код', 'проект', 'зависимый', 'операционный_система', 'аппаратный_платформа', 'изменение', 'обойтись', 'дорого'], ['статья', 'обсуждать', 'вопрос', 'переносимость', 'код', 'выходить', 'рамка', 'цикл'], ['требование', 'удовлетворить', 'принцип', 'приниматься', 'решение', 'доведение', 'факт', 'сведение', 'спонсор', 'проект', 'руководство', 'фирма'], ['обнаружение', 'неработоспособность', 'система', 'процесс', 'эксплуатация', 'хороший', 'обернуться', 'руководство', 'фирма', 'дойти', 'информация', 'невыполнимость', 'требование', 'известный', 'заранее'], ['определение', 'целевой', 'архитектура', 'выбор', 'архитектура', 'понимать', 'выбор', 'платформа', 'платформа', 'выбор', 'операционный_система', 'операционный_система'], ['система', 'работать', 'компьютер', 'разный', 'аппаратный_платформа', 'управление', 'различный', 'операционный_система'], ['автоматизация', 'иного', 'бизнес', 'приложить', 'рука', 'неоднократно', 'обнаружить', 'зверинец', 'платформа', 'операционный_система'], ['перенос', 'иную', 'платформа', 'процесс', 'безболезненный', 'управление', 'разнородный', 'сеть', 'дело', 'проблемный'], ['обстоятельство', 'таковы', 'рабочий', 'место', 'конечный', 'пользователь', 'работать', 'управление', 'несколько', 'операционный_система', 'ос', 'обязательно', 'выделить', 'зависимый', 'ос', 'участок', 'код', 'жестко', 'описать', 'интерфейс', 'обмен', 'компонент', 'информационный_система', 'сделать', 'независимый', 'ос'], ['написание', 'код', 'модуль', 'работать', 'управление', 'несколько', 'ос', 'ориентироваться', 'обладать', 'жёсткий', 'требование'], ['определение', 'платформа', 'выяснить', 'следующий', 'архитектура', 'файл', 'сервер', 'клиент', 'сервер'], ['3-уровневая', 'архитектура', 'следующий', 'слой', 'сервер', 'промежуточный', 'слой', 'сервер', 'приложение', 'клиентский'], ['база', 'централизовать', 'распределить'], ['база', 'распределить', 'механизм', 'поддержка', 'согласованность', 'актуальность', 'использоваться'], ['база', 'однородный', 'сервер', 'база', 'продукт', 'производитель', 'сервер', 'oracle', 'сервер', 'db2', 'udb'], ['база', 'небудет', 'однородный', 'какой', 'использовать', 'обмен', 'данными', 'субд', 'разный', 'производитель', 'существовать', 'разработать', 'специально', 'часть', 'проект'], ['достижение', 'должный', 'производительность', 'использоваться', 'параллельный', 'сервер', 'база', 'oracle', 'parallel', 'server', 'db2', 'udb', 'т.п.'], ['решение', 'приниматься', 'этап_проектирование', 'этап_анализ'], ['этап_проектирование', 'полезный', 'раз', 'рассмотреть', 'причина', 'выбор', 'иной', 'архитектура', 'провести', 'тест', 'производительность', 'надёжность', 'критический_участок', 'информационный_система'], ['позволить', 'избежать', 'тяжело', 'устранять', 'ошибка', 'проектирование'], ['этап_проектирование', 'возникать', 'непредвиденный', 'технический', 'проблема', 'аналитик', 'учитывать', 'группа', 'пользователь', 'иметь', 'доступ', 'информационный_система', 'текстовый', 'терминал'], ['ошибка', 'анализ', 'выявляться', 'этап_проектирование'], ['проблема', 'решаться', 'вместе', 'аналитик', 'инициировать', 'изменение', 'информационный_модель'], ['среда', 'использоваться', 'сеть', 'этап_проектирование', 'определить', 'требуемые', 'уровень', 'сервис', 'сеть', 'спроектировать', 'топология'], ['провести', 'тест', 'сеть', 'увидеть', 'обеспечивать', 'существовать', 'сеть', 'должный', 'пропускной', 'способность', 'иметься', 'резерв', 'пропускной', 'способность', 'сеть'], ['результат', 'отрицательный', 'четко', 'описать', 'изменение', 'аппаратный', 'обеспечение', 'топология', 'сеть'], ['выделение', 'потенциальный', 'узкий_место', 'информационный_система', 'заказчик', 'заявить', 'производительность', 'система', 'никакой', 'значение', 'принять', 'замечание', 'юмор'], ['означать', 'время', 'ответ', 'система', 'запрос', 'являться', 'заказчик', 'момент', 'критический'], ['попробуйте', 'спросить', 'приемлемый', 'время', 'ответ', 'система', 'равный', 'час', 'день'], ['ответ', 'вопрос', 'положительный'], ['производительность', 'важный', 'информационный_система'], ['узкий_место', 'называть', 'момент', 'падение', 'производительность', 'система'], ['конкретный', 'ответ', 'вопрос', 'узкий_место', 'система', 'дать', 'специальный', 'направленное', 'тестирование'], ['означать', 'оценка', 'потенциальный', 'узкий_место', 'невозможный'], ['хороший', 'метод', 'являться', 'график', 'нагрузка', 'система', 'течение', 'день', 'неделя', 'месяц', 'т.п.', 'построить', 'диаграмма', 'отразить', 'время', 'работа', 'иных', 'бизнес', 'процессов', 'требуемое', 'бизнес', 'процесса', 'время', 'ответ', 'система'], ['диаграмма', 'помогать', 'выявить', 'момент', 'нагрузка', 'интенсивный'], ['количество', 'пользователь', 'одновременно', 'работать', 'компонент', 'отражаться', 'диаграмма', 'весовой', 'коэффициент', 'рис'], ['1'], ['привести', 'пример', 'видный', '3', 'пик', 'активность', 'система', 'максимальный', 'приходиться', '11', 'час'], ['использовать', 'тип', 'диаграмма', 'накопление'], ['диаграмма', 'представить', 'рис'], ['2', 'видный', 'активность', 'касса', 'течение', 'рабочий', 'день', 'повышение', 'активность', 'загрузка', 'нерабочий', 'время'], ['диаграмма', 'добавлять', 'вес', 'отражать', 'сложность', 'бизнес', 'процесса', 'пример', 'высокий', 'весовой', 'коэффициент', 'отчёт'], ['оценка', 'вес', 'определяться', 'особенность', 'каждый', 'конкретный', 'бизнес', 'высокий', 'низкий'], ['ответ', 'вопрос', 'насколько', 'потенциальный', 'узкий_место', 'являться', 'реальный', 'дать', 'тестирование'], ['оправданный', 'применение', 'специальный', 'средство', 'моделирование', 'сценарий', 'приложение'], ['отметить', 'оценка', 'точность', 'детектирование', 'узкий_место', 'система', 'зависеть', 'объём', 'обрабатывать'], ['уделить', 'внимание', 'генерация', 'тестовый', 'проверка', 'узкий_место'], ['информационный_система', 'выходить', 'проектный', 'мощность', 'правило', 'работать', 'некоторый', 'время', 'режим', 'первоначальный', 'накопление', 'информация', 'продолжаться', 'день', 'месяц'], ['правило', 'предполагать', 'порог', 'объём', 'обрабатывать', 'известный', 'этап_анализ', 'реальный', 'объём', 'физический', 'оценить', 'этап_проектирование'], ['сгенерировать', 'предполагать', 'объём', 'тестовый', 'хватать', 'мощность', 'техника', 'иные', 'причина', 'тест', 'проводить', 'малый', 'объём', 'пытаться', 'построить', 'оценка', 'поведение', 'система', 'реальный', 'объём'], ['узкий_место', 'система', 'оцениваться', 'этап', 'разработка'], ['реализовать', 'компонент', 'система'], ['средство', 'автоматизация', 'тестирование', 'loadrunner', 'winrunner', 'и др.', 'позволять', 'отследить', 'операция', 'выполнять', 'иное', 'приложение', 'средство', 'отследить', 'возможный', 'тип', 'приложение', 'насколько', 'подходить', 'тестирование', 'ваш', 'проект', 'решение', 'порядок', 'выбор', 'средство', 'разработка', 'приложение', 'автоматически', 'сгенерировать', 'сценарий', 'запуск', 'имитатор', 'работа', 'реальный', 'приложение', 'построить', 'оценка', 'узкий_место', 'система'], ['продукт', 'третий', 'фирма', 'этап_проектирование', 'оценивать', 'возможность', 'эффективность', 'использование', 'продукт', 'третий', 'форма', 'разработка', 'информационный_система'], ['существовать', 'задача', 'выполнение', 'некоторый', 'набор', 'работа', 'определённый', 'пакетный', 'задание', 'т.п.', 'задать', 'график'], ['целесообразный', 'включать', 'проект', 'создание', 'утилита', 'контроль', 'запуск', 'приложение', 'масса', 'утилита', 'выполнять', 'операция', 'число', 'свободно', 'распространять'], ['существовать', 'причина', 'третий', 'фирма', 'ознакомиться'], ['факт', 'мировой', 'практика', 'решение', 'задача', 'ваш', 'встречаться'], ['реализация', 'третий', 'фирма', 'известный', 'ознакомиться', 'повторять', 'неудачный', 'решение', 'взять', 'заметка', 'удачный'], ['вероятно', 'существовать', 'продукт', 'интегрировать', 'создавать', 'информационный_система'], ['потребоваться', 'создать', 'интерфейс', 'обмен', 'данными', 'третий', 'фирма', 'ваш'], ['оценить', 'целесообразность', 'разработка', 'собственный', 'компонент', 'интеграция', 'готовый', 'аналогичный', 'компонент'], ['использование', 'case_средство', 'case_средство', 'предоставлять', 'преимущество'], ['чаша', 'вес', 'автоматизация', 'работа', 'предоставлять', 'case', 'ненавистный', 'задача', 'преобразование', 'результат', 'анализ', 'формат', 'case', 'формализация', 'результат', 'анализ', 'использоваться', 'case', 'инструмент', 'использоваться'], ['case_средство', 'позволять', 'непосредственно', 'перейти', 'проектирование', 'анализ', 'вернуться', 'путем', 'обратный', 'проектирование'], ['сожаление', 'использование', 'обратный', 'проектирование', 'case_средство', 'создаваться', 'весьма', 'вредный', 'иллюзия', 'анализ', 'регистрироваться', 'дело', 'практически', 'происходить', 'информация', 'содержаться', 'спроектировать', 'структура', 'отличаться', 'результат', 'анализ'], ['полезный', 'получить', 'построить', 'полный', 'картина', 'удаться'], ['инфраструктура', 'проектирование', 'реализация', 'необходимый', 'аппаратный', 'ресурс', 'специальный', 'программный', 'обеспечение'], ['требоваться', 'механизм', 'позволять', 'контролировать', 'создавать', 'документация', 'код'], ['вопрос', 'лучше', 'решать', 'ранний', 'стадия', 'проектирование', 'стадия', 'разработка'], ['поговорить', 'раздел', 'проектирование', 'процесс', 'код'], ['групповой', 'разработка', 'понадобиться', 'средство', 'контроль', 'согласованность', 'код'], ['разработка', 'идти', 'разный', 'платформа', 'аппаратный_платформа', 'ос', 'хороший', 'решение', 'оказаться', 'pvcs'], ['платформа', 'windows', '98', 'nt', '2000', 'оказаться', 'приемлемый', 'решение', 'предлагать', 'microsoft', 'ms', 'source', 'save'], ['средство', 'разработка', 'предоставлять', 'возможность', 'контроль', 'исходный', 'код'], ['проектирование', 'база', 'изложить', 'задача', 'касаться', 'проектирование', 'реальный', 'база'], ['построение', 'модель', 'работа', 'проектировщик', 'база', 'значительный', 'степень', 'зависеть', 'качество', 'информационный_модель'], ['информационный_модель', 'содержать', 'никакой', 'непонятный', 'конструкция', 'реализовать', 'рамка', 'выбрать', 'субд'], ['отметить', 'информационный_модель', 'создаваться', 'основа', 'построить', 'модель', 'учитывать', 'особенность', 'реализация', 'выбрать', 'субд'], ['иные', 'особенность', 'субд', 'позволять', 'отразить', 'модель', 'описывать', 'информационный_модель', 'менять', 'информационный_модель', 'производитель', 'субд', 'оперативно', 'менять', 'субд', 'ваш', 'конкретный', 'проект', 'правда', 'единичный', 'случай', 'иметь', 'место'], ['построение', 'логический', 'физический', 'модель', 'являться', 'основный', 'часть', 'проектирование', 'база'], ['получить', 'процесс', 'анализ', 'информационный_модель', 'преобразуется', 'логический', 'физический', 'модель'], ['разработчик', 'информационный_система', 'создаваться', 'пробный', 'база'], ['начинать', 'работать', 'разработчик', 'код'], ['идеал', 'момент', 'разработка', 'модель', 'устойчивый'], ['проектирование', 'база', 'оторвать', 'проектирование', 'модуль', 'приложение', 'бизнес', 'правила', 'создавать', 'объект', 'база', 'серверный', 'ограничение', 'constraints', 'хранить', 'процедура', 'триггеры', 'случай', 'говорить', 'часть', 'бизнес', 'логики', 'переноситься', 'база'], ['проектирование', 'модель', 'каждый', 'субд', 'содержать', 'особенность', 'проектный', 'решение', 'давать', 'хороший', 'результат', 'субд', 'оказаться', 'совершенно', 'неприемлемый'], ['перечислим', 'задача', 'являться', 'общий', 'проектирование', 'модель', 'выявление', 'нереализуемый', 'необычный', 'конструкция', 'er', 'модель', 'определение', 'сущность', 'разрешение', 'дуга', 'подтип', 'супертипов', 'изучение', 'возможный', 'первичный', 'внешний', 'ключ', 'описание', 'ссылочный', 'целостность', 'зависимость', 'реализация', 'декларативный', 'использование', 'триггер', 'проектирование', 'реализация', 'денормализации', 'база', 'цель', 'повышение', 'производительность', 'определение', 'часть', 'бизнес', 'логики', 'реализовать', 'база', 'пакет', 'хранить', 'процедура', 'реализация', 'ограничение', 'ограничение', 'триггер', 'отражать', 'централизованно', 'определённый', 'бизнес', 'правила', 'генерация', 'ограничение', 'триггер', 'определение', 'набор', 'бизнес', 'правил', 'задать', 'ограничение', 'база', 'определение', 'необходимый', 'индекс', 'кластер', 'таковые', 'реализовать', 'субд', 'определение', 'горизонтальный', 'фрагментация', 'таблица', 'реализовать', 'субд', 'оценка', 'размер', 'таблица', 'индекс', 'кластер', 'определение', 'размер', 'табличный', 'пространство', 'особенность', 'размещение', 'носитель', 'информация', 'определение', 'спецификация', 'носитель', 'информация', 'промышленный', 'система', 'тип', 'raid', 'массив', 'количество', 'табличный', 'пространство', 'размещаться', 'определение', 'размер', 'необходимый', 'системный', 'табличный', 'пространство', 'системный', 'каталог', 'журнал', 'транзакция', 'временной', 'табличный', 'пространство', 'т.п.', 'определение', 'пользователь', 'база', 'уровень', 'доступ', 'разработка', 'внедрение', 'правило', 'безопасность', 'доступ', 'аудит', 'создание', 'пакетированных', 'привилегия', 'зависимость', 'реализация', 'субд', 'роль', 'группа', 'синоним', 'разработка', 'топология', 'база', 'случай', 'распределить', 'база', 'определение', 'механизм', 'доступ', 'удалить', 'данным'], ['подробный', 'каждый', 'перечислить', 'пункт', 'остановиться', 'часть', 'схема', 'база'], ['создание', 'база', 'разработчик', 'база', 'создавать', 'администратор', 'база', 'противный', 'случай', 'приходиться', 'делать', 'проектировщик'], ['физический', 'база', 'нужный', 'разработчик', 'информационный_система', 'разработка', 'код', 'проектировщик', 'проверка', 'идея'], ['проектировщик', 'разработчик', 'работать', 'схема', 'разный', 'схема'], ['процесс', 'разработка', 'проект', 'правило', 'создаваться', 'версия', 'схема', 'база'], ['обязательно', 'вести', 'журнал', 'изменение', 'схема', 'вручную', 'репозитарии', 'case', 'жестко', 'контролировать', 'версия', 'схема'], ['проектирование', 'процесс', 'код', 'параллельно', 'проектирование', 'схема', 'база', 'требоваться', 'выполнить', 'проектирование', 'процесс', 'получить', 'спецификация', 'модуль'], ['часть', 'бизнес', 'логики', 'храниться', 'база', 'ограничение', 'триггеры', 'хранить', 'процедура', 'процесс', 'проектирование', 'тесно', 'связать'], ['главный', 'цель', 'проектирование', 'заключаться', 'отображение', 'функция', 'получить', 'этап_анализ', 'модуль', 'информационный_система'], ['определение', 'модуль', 'раскрываться', 'технический', 'спецификация', 'программа'], ['атомарный', 'функция', 'получить', 'этап_анализ', 'отобразить', 'модуль', 'преобразовать', 'ручной', 'процедура', 'принцип', 'работа'], ['выбор', 'средство', 'разработка', 'откладывать', 'выбор', 'средство', 'разработка', 'последний', 'момент'], ['проектировщик', 'представлять', 'набор', 'средство', 'использовать', 'разработка', 'проект', 'составить', 'перечень', 'возможный', 'средство', 'провести', 'консультация', 'технический', 'специалист', 'знать', 'средство', 'кандидаты', 'оценить', 'средство', 'персонал', 'работать', 'являться', 'абсолютно', 'новый'], ['выбор', 'средство', 'разработка', 'определять', 'фактор', 'квалификация', 'персонал'], ['отображение', 'функция', 'модуль', 'этап_анализ', 'разработать', 'перечень', 'функция', 'реализовать'], ['этап_проектирование', 'перечень', 'раз', 'анализироваться', 'корректироваться'], ['однозначный', 'соответствие', 'функция', 'модуль'], ['дело', 'этап_анализ', 'функция', 'организовать', 'бизнес', 'категориям', 'этап_проектирование', 'прийтись', 'реорганизовывать', 'упрощение', 'разработка'], ['проектировщик', 'принять', 'решение', 'объединить', 'функция', 'обладать', 'общий', 'свойство', 'выделить', 'какой', 'общий', 'свойство', 'набор', 'отдельный', 'модуль', 'разбить', 'сложный', 'функция', 'модуль'], ['подробный', 'вопрос', 'рассматриваться', 'раздел', 'спецификация', 'функция'], ['интерфейсы', 'программа', 'проектирование', 'модуль', 'определять', 'разметка', 'меню', 'вид', 'окно', 'горячий', 'клавиша', 'связать', 'вызов'], ['существовать', 'два', 'вид', 'перемещение', 'программа', 'контекст', 'целевой', 'экранный', 'форма', 'частично', 'полностью', 'заполняться', 'автоматически', 'данными', 'связать', 'находиться', 'исходный', 'экранный', 'форма', 'контекст', 'целевой', 'экранный', 'форма', 'заполняться', 'частично', 'заполняться', 'автоматически', 'данными', 'связать', 'находиться', 'исходный', 'экранный', 'форма'], ['автоматически', 'заполнять', 'экранный', 'форма', 'группировать', 'располагать', 'перемещение', 'заполнять', 'пользователь', 'поле', 'организовать', 'делать', 'пользователь', 'работать', 'реальный', 'бумажный', 'документ'], ['интерфейс', 'восприниматься', 'пользователь', 'лёгкий', 'намного', 'быстрый', 'осваивать', 'новый'], ['интегрирование', 'наследование', 'механизм', 'обмен', 'данными', 'информационный_система', 'редко', 'разрабатываться', 'нуль'], ['проектировщик', 'сталкиваться', 'задача', 'наследование', 'старый', 'система', 'выполнять', 'задача', 'автоматизация', 'бизнес'], ['система', 'начальный', 'этап', 'интегрировать', 'новый', 'система', 'постепенно', 'заменяться', 'новый', 'современный', 'модуль'], ['подход', 'навязываться', 'руководство', 'фирма', 'ускорить', 'ввод', 'новый', 'информационный_система'], ['рассмотреть', 'плюс', 'минус', 'постепенный', 'интеграция', 'минус', 'правило', 'оказываться'], ['операция', 'прийтись', 'делать', 'случай', 'переносить', 'ценный', 'храниться', 'старый', 'информационный_система', 'новый', 'проектировать', 'механизм', 'конвертация'], ['прийтись', 'делать', 'конвертация', 'старый', 'система', 'новый', 'обратно', 'полный', 'частичный', 'возможный', 'вариант', 'развитие', 'событие', 'старый', 'новый', 'информационный_система', 'работать', 'параллельно', 'период', 'опытный', 'эксплуатация', 'новый', 'система'], ['вопрос', 'наследование', 'старый', 'информационный_система', 'прийтись', 'решать', 'задача', 'взаимодействие', 'ваш', 'продукт', 'третий', 'фирма'], ['случай', 'изучить', 'интерфейс', 'обмен', 'данными', 'разработчик', 'обеспечить', 'уровень', 'поддержка', 'интерфейс', 'разрабатывать', 'информационный_система'], ['определение', 'спецификация', 'модуль', 'основный', 'часть', 'функциональный', 'проектирование'], ['решаться', 'следующий', 'задача', 'преобразование', 'функциональный', 'определение', 'анализ', 'реализовать', 'модуль', 'спецификация', 'выражать', 'функциональный', 'возможность', 'каждый', 'модуль', 'физический', 'категория', 'определение', 'средство', 'разработка', 'каждый', 'модуль', 'выделить', 'группа', 'модуль', 'использоваться', 'средство', 'разработка', 'проект', 'определение', 'последовательность', 'реализация', 'модуль', 'зависимость', 'модуль'], ['спецификация', 'модуль', 'различать', 'степень', 'детализация', 'содержание', 'рамка', 'проект'], ['определять', 'время', 'требоваться', 'сгенерировать', 'иной', 'модуль', 'тестирование', 'иного', 'модуль', 'тестирование', 'совокупность', 'сгенерированных', 'модуль'], ['разработать', 'специальный', 'метрики', 'шаблон', 'позволять', 'оценить', 'время', 'потребоваться', 'создание', 'исходный', 'код', 'модуль'], ['ускорение', 'процесс', 'разработка', 'рассмотреть', 'возможность', 'использование', 'генератор', 'исходный', 'код', 'целесообразный', 'предстоять', 'разработать', 'большой', 'количество', 'несложный', 'модуль', 'время', 'разработка', 'ограничить'], ['использовать', 'шаблон', 'код', 'устранение', 'рутинный', 'операция'], ['подробный', 'вопрос', 'рассматриваться', 'раздел', 'посвятить', 'спецификация', 'функция', 'найти', 'следующий', 'стать', 'цикл']]"
|
||
],
|
||
[
|
||
"38",
|
||
"Этапы разработки проекта4.docx",
|
||
"Этапы разработки проекта: реализация, тестирование, эксплуатация и сопровождение\nРеализация\nТрудно давать советы по реализации кода модулей, так как каждый разработчик имеет какие-то привычки и свой стиль разработки кода. При реализации проекта важно координировать группу (группы) разработчиков. Все разработчики должны подчиняться жестким правилам контроля исходных тестов. Группа разработчиков, получив технический проект, начинает писать код модулей, и в этом случае основная задача состоит в том, чтобы уяснить спецификацию. Проектировщик указал, что необходимо сделать, а разработчик определяет способы выполнения.\nНа этапе разработки осуществляется тесное взаимодействие проектировщиков, разработчиков и групп тестеров. В случае интенсивной разработки тестер буквально «пристегивается» к разработчику, фактически являясь членом группы разработки.\nПроектировщик на данном этапе выполняет функции «ходячего справочника», поскольку постоянно отвечает на вопросы разработчиков, касающиеся технической спецификации.\nЧаще всего на этапе разработки меняются интерфейсы пользователя. Это обусловлено в том числе и тем, что модули периодически демонстрируются заказчику. Существенно могут меняться и запросы к данным.\nСледует отметить, что для сборки всего проекта должно быть выделенное рабочее место. Именно эти модули передаются на тестирование. Взаимодействие тестера и разработчика без централизованной передачи частей проекта допустимо, но только в случае, если необходимо срочно проверить какую-то правку. Очень часто этап разработки и этап тестирования взаимосвязаны и идут параллельно. Синхронизирует действия тестеров и разработчиков система bug tracking.\nПри разработке должны быть организованы постоянно обновляемые хранилища готовых модулей проекта и библиотек, которые используются при сборке модулей. Желательно, чтобы процесс обновления хранилищ контролировал один человек. Одно из хранилищ должно быть предназначено для модулей, прошедших функциональное тестирование, а другое - для модулей, прошедших тестирование связей. Первое из них - это черновики. Второе - то, из чего уже можно собирать дистрибутив системы и демонстрировать его заказчику для проведения контрольных испытаний или сдачи каких-либо этапов работ.\nДокументация создается в течение всего процесса разработки. Как только модуль прошел тестирование связей, его можно описывать в документации. В случае если модули изменяются часто, к описанию приступают только тогда, когда модуль становится более или менее стабильным.\n\nОбработка результатов проектирования\nНа этапе разработки, как правило, еще раз проверяется атомарность функций, а также отсутствие их дублирования.\nЖелательно, чтобы на этапе проектирования уже была построена матрица «функции-сущности». Это фактически формализованное представление того, что фирма пытается сделать (функции) и какую информацию требуется обработать для достижения результата (сущности). Подобная матрица позволяет проверить следующие моменты:\nимеет ли каждая сущность конструктор - функцию, создающую экземпляры сущности (create); \nесть ли ссылки на данную сущность, то есть используется ли где-либо данная сущность (references); \nимеют ли место изменения данной сущности (update); \nимеет ли каждая сущность деструктор - функцию, которая удаляет экземпляры сущности (delete). \nЧасто роль деструктора выполняет комплект программ архивирования данных. Нередко в информационных системах информацию просто накапливают. Это допустимо лишь в том случае, если в течение всего периода накопления информации (а фактически в течение всей жизнедеятельности информационной системы) характеристики ее производительности удовлетворяют требованиям заказчика. На практике это чрезвычайно редкое стечение обстоятельств. Связано это в основном с ростом обрабатываемых объемов информации. Следует отметить, что надеяться в этом случае только на мощность СУБД или аппаратного обеспечения нельзя, так как подобные экстенсивные методы повышения производительности дают низкий расчетный прирост скорости. Фактически задача реагирования системы или отдельных ее частей на рост объема обрабатываемых данных является наиболее вероятной задачей тестирования. В таком случае группа тестирования создает модуль генерации (пусть даже абстрактных) данных, выбирается набор запросов, для которых скоростные характеристики критичны, далее производятся замеры и строится зависимость скорости выполнения от объема данных для каждого из запросов. Такое простое действие позволит избежать серьезных ошибок и в проектировании, и в реализации информационной системы.\nСпецификация модулей должна быть выполнена еще на этапе проектирования, чему в реальных проектах зачастую просто не придают значения. И напрасно - ведь из-за непродуманной реализации модулей любые достоинства схемы базы данных могут быть утрачены. Так, пренебрегая спецификациями модулей, вы рискуете заложить в информационную систему:\nнеконтролируемый рост объемов данных; \nпотоки запросов с изначально высокой вероятностью конфликта или потоки запросов, которые будут выполняться «вечно» (попытка выполнить поток, обнаружение конфликта и откат всех действий, новая попытка и т.д.) из-за конфликтующих с ними потоков; \nсмешивание системных и интерфейсных модулей; \nдублирование модулей; \nошибки в размещении бизнес-логики; \nотсутствие реализации или неполная реализация требуемых заказчиком функций системы. \nЭто далеко не полный список проблем, которые будут обнаружены или на этапе комплексного тестирования, или при вводе системы в эксплуатацию, а может быть, даже в процессе эксплуатации системы (когда начнут реально использоваться модули).\nКроме того, отсутствие спецификаций модулей не позволит точно оценить сложность каждого модуля и, как следствие, определить последовательность создания модулей и правильно распределить нагрузку персонала. Обычная ситуация в подобном случае - «кто-то кого-то ждет», при этом процесс создания информационной системы стоит на месте.\n\nСистемные модули \nЧасто приходится рассматривать большое количество обслуживающих или вспомогательных процессов, которые непосредственно не связаны со сформулированной бизнес-функцией. Как правило, это системные функции, имеющиеся в любой информационной системе, такие как:\nдиспетчер очередей или планировщик заданий; \nдиспетчер печати; \nсредства доступа к данным и создания нерегламентированных запросов (часто это генераторы отчетов); \nуправление каталогами и иными ресурсами файловой системы; \nавтоматическое резервное копирование; \nавтоматическое восстановление после сбоя системы; \nсредства регламентирования доступа пользователей к системе (состоящие из средства создания пользователей и средства назначения им привилегий); \nсредство настройки среды для пользователя информационной системы; \nсредство изменения пользователем своих настроек (в том числе и пароля); \nсредство управления приложениями; \nсреда администратора информационной системы. \nЧасть этих функций должна выполнять операционная система, но если она будет работать в неоднородной среде, то нет гарантии, что пользователям придется по вкусу наличие различных интерфейсов в разных операционных системах. В идеале все приложения-клиенты должны работать в одной операционной системе, однако на практике разработчикам часто приходится сталкиваться с целым «зоопарком» различных рабочих станций у заказчика - итогом нескольких попыток автоматизировать бизнес. Цель разработчика - довести систему до максимально однородного состояния либо сделать похожими хотя бы рабочие места конечных пользователей.\nЗадача создания информационной системы в разнородной среде существенно повышает требования к разработчикам кода и к выбираемому средству разработки. Особенно это касается разработки системных модулей. Следует уделить внимание модулям, реализация кода которых зависит от операционной системы. Подобные модули должны быть выделены отдельно для каждой из операционных систем в группы, например Win98, WinNT и т.д. Модули каждой из групп должны иметь строгие интерфейсы обмена - данные, которые они передают и получают, строго определены, любое отклонение от спецификации наказуемо. Ни один из модулей вне этой группы не может использовать никаких других вызовов, кроме интерфейсов обмена. Таким образом модули, зависящие от операционнй системы, изолируются от других модулей.\nВообще говоря, практика изолирования системных модулей посредством строгой регламентации их интерфейсов обмена существенно минимизирует затраты по исправлению ошибок и поддержке системы. Кроме того, это облегчает и тестирование, а именно детектирование ошибок и их отладку. Другая сторона вопроса - требования к коду интерфейса обмена системных модулей резко повышаются. Это то, что отлаживается в первую очередь и должно работать очень четко.\n\nСредства мониторинга информационной системы \nЕсли информационная система велика, то следует рассмотреть задачу ее администрирования с одной рабочей станции. Необходимо заботиться не только о конечном пользователе информационной системы, но и о персонале, который будет ее обслуживать. Особое внимание следует уделить мониторингу критических участков информационной системы, поскольку сбой зачастую проще предотвратить, чем исправлять его последствия. Мониторинг относится к тем задачам, о необходимости решения которых заказчик, как правило, не задумывается и которые обычно отсутствуют и в аналитическом исследовании, и даже при проектировании. Потребность в средствах мониторинга становится очевидной лишь на этапе ввода системы в эксплуатацию, причем потребность эта тем выше, чем сложнее система и чем больше в ней критических участков.\nРазработчикам и проектироващикам следует проводить оценку сложности системы. Если принимается решение о написании комплексного средства администрирования и мониторинга, не предусмотренного техническим заданием, то в этом случае следует менять техническое задание, а не идти на поводу у заказчика. В сложной системе отслеживать критические процессы все равно придется. Внедрять подобные средства в уже готовую систему очень сложно, поскольку исходные данные мониторы часто получают от системных модулей достаточно низкого уровня. Без изменений схемы базы данных здесь тоже вряд ли можно будет обойтись, и нет никакой гарантии, что подобное изменение не ухудшит производительность системы.\nРазработка мониторов - это довольно специфический класс задач: с одной стороны, они должны обрабатывать достаточный объем информации, с другой - не должны существенно влиять на работу других компонентов информационной системы. Это заставляет разработчиков с особой тщательностью подходить к проектированию мониторов и очень аккуратно писать код их модулей.\n\nИнтерфейсы \nИнтерфейсы конечного пользователя - это то, что заказчик критикует в наибольшей степени, в силу того что именно эти части информационной системы он может более или менее квалифицированно оценить - обычно только их он и видит. Это означает, что интерфейсы являются наиболее часто изменяемым элементом информационной системы именно на этапе реализации.\nЧасто изменяемый компонент (компоненты) информационной системы следует изолировать от редко изменяемых компонентов, чтобы одни изменения не влекли за собой другие. Один из приемов подобной изоляции - изоляция запросов к данным от интерфейса следующим образом:\nкаждый из запросов кодируется идентификатором или «закрывается» определенной системной функцией; \nразработчик интерфейса не знает о запросе к данным ничего, кроме параметров атрибутов выборки - их типа и, возможно, количества строк в выборке; \nобработка ошибок в запросах данных представляет собой отдельный модуль; \nобработка ошибок в интерпретации результата запроса также представляет собой отдельный модуль. \nПри обработке результатов запросов данных следует также особое внимание уделить вопросам соответствия типов включающего языка и СУБД, в том числе вопросам точности числовых типов, так как представление их у разных СУБД существенно различается. Кроме того, обратите внимание на запросы к данным, которые используют функции, зависящие от операционной системы, например функции работы с байтами и словами значения атрибута (например, на Intel и SUN SPARC эти функции будут работать по-разному). Типы данных могут быть приведены или явно в запросе функциями приведения cast и встроенными в СУБД функциями, или в функции прикладной программы. Не для всех СУБД неявное преобразование типов дает один и тот же результат, поэтому если информационая система использует данные из нескольких баз данных под управлением разных СУБД, то неявных преобразований типов лучше избегать.\nСледует также установить достаточно жесткие правила для внешнего вида интерфейсов пользователя. Должно создаваться впечатление единого стиля для всех компонентов информационной системы.\n\nВерсии базы данных \nПервую версию базы данных проекта в большинстве случаев создают достаточно быстро - это реализация полностью нормализованной структуры, которую получают на этапе анализа. Основным назначением этой базы данных является обеспечение макетирования, демонстрационных показов, некоторых экспериментов разработчиков и проектировщиков.\nСкрипты создания базы данных и заполнения ее стартовыми данными - это тоже исходный код информационной системы, и на него распространяются правила контроля версий. Следует отметить, что поддерживать версии базы даных на уровне скриптов все же проще, чем на уровне средств выгрузки и загрузки данных, предоставляемых самой СУБД, так как в подавляющем большинстве случаев подобные средства не могут предоставить несколько простых, но необходимых функций:\nпроконтролировать, какие объекты данных и данные имеют место в объектах загрузки A и B, и загрузить в базу данных только «разницу» A и B (произвести обновление версии); \nпроконтролировать, не конфликтуют ли изменения, имеющие место в объектах выгрузки C и D, по сравнению с объектом выгрузки A (произвести слияние версий). \nCASE-инструменты имеют средства контроля версий схемы базы данных, некоторые имеют настройки, позволяющие также контролировать и стартовые данные. Это дает возможность использовать указанные средства для обеспечения контроля версий базы данных.\nКонтроль версий исходного кода триггеров, хранимых процедур надежнее осуществлять путем использования той же системы контроля версий, что принята для хранения исходных текстов самого проекта.\n\nРазмещение логики обработки \nОдим из важных вопросов проектирования является способ размещения бизнес-логики обработки данных: размещать ее (и какую часть) либо на сервере в виде хранимых процедур, пакетов, триггеров, иных ограничений целостности непосредственно на сервере баз данных, либо в виде функций на клиенте (в составе ПО клиента). Местонахождение правил интерфейса и правил данных задано точно: первые всегда размещены на клиенте, вторые - на сервере. Правила бизнес-логики в современных СУБД могут быть размещены как на клиенте, так и на сервере. Рассмотрим один из примеров простейшего бизнес-правила:\nЗначение в поле экранной формы вводится пользователем, а не выбирается из списка, но набор допустимых значений строго ограничен (например, два или три различных значения). \nС одной стороны, пользователь требует немедленной реакции системы на ошибку ввода данных, с другой - недопустимы значения в поле базы данных, отличные от заданных (двух или трех). На самом деле в этой ситуации должны быть реализованы два правила. Правило данных в этом случае будет организовано в виде ограничения check, а правило интерфейса, запрещающее вводить значения, отличные от заданных, будет в точности повторять правило даных, но будет реализовано на уровне интерфейса пользователя. Казалось бы, реализация формы со списком в этом случае является идеальным решением, но большинство операторов предпочитают именно набор в форме, особенно если длина вводимого значения невелика. Формы с большим количеством списков достаточно трудны для обработки конечными пользователями. В случае набора значений в форме следует также позаботиться о приведении регистров строк символов (там, где регистр не существенен) к верхнему или нижнему регистру, на уровне интерфейса прикладной программы.\n\nШаблоны \nИспользование шаблонов и библиотек для построения «похожих» модулей - достаточно распространенная практика. Что использовать в этом случае - объекты и классы или библиотеки - решает конкретная группа разработчиков. Диктовать способ разработки в большинстве случаев бессмысленно, потому что разработчик пишет код так, как умеет или как привык. Эти моменты обычно контролирует руководитель проекта.\nВ любом проекте запрещается копирование кода, поскольку это ведет к возникновению различных версий одного и того же кода в разных фрагментах прикладной программы и, как следствие, к сложно детектируемым и исправляемым ошибкам. Следует установить жесткое правило: используется вызов функции, а не его копия в коде; любое отклонение от данного правила наказуемо.\n\nТестирование \nКак было сказано выше, группы тестирования могут привлекаться уже на ранних стадиях разработки проекта. Собственно комплексное тестирование действительно следует выделять в отдельный этап разработки. В зависимости от сложности проекта тестирование и исправление ошибок могут занимать треть, половину и больше времени разработки всего проекта.\nЧем сложнее проект, тем больше будет потребность в автоматизации системы хранения ошибок - bug tracking. Подобная система обеспечивает следующие функции:\nхранение сообщения об ошибке (с обязательной информацией о том, к какому компоненту системы относится ошибка, кто ее нашел, как ее воспроизвести, кто отвечает за ее исправление и когда она должна быть исправлена); \nсистема уведомления о появлении новых ошибок, об изменении статуса известных в системе ошибок (как правило, это уведомления по электронной почте); \nотчеты об актуальных ошибках по компонентам системы, по интервалам времени, по группам разработчиков и разработчикам; \nинформация об истории ошибки (в том числе отслеживание похожих ошибок, отслеживание повторного возникновения ошибки); \nправила доступа к ошибкам тех или иных категорий; \nинтерфейс ограниченного доступа к системе bug tracking для конечного пользователя информационной системы, который используется как интерфейс обмена информацией между пользователем и службой технической поддержки системы. \nПодобные системы снимают множество организационных проблем, в частности вопросы автоматического уведомления об ошибках.\nСобственно тесты систем можно разделить на несколько категорий:\nавтономные тесты модулей - используются уже на этапе разработки компонентов системы и позволяют отслеживать ошибки отдельных компонентов; \nтесты связей компонентов системы - используются и на этапе разработки, и на этапе тестирования и позволяют отслеживать правильность взаимодействия и обмена информацией компонентов системы; \nсистемный тест - является основным критерием приемки системы. Как правило, это группа тестов, включающая в себя и автономные тесты, и тесты связей и модели. Данный тест должен воспроизводить работу всех компонентов и функций системы, его основная цель - внутренняя приемка системы и оценка ее качества; \nприемо-сдаточный тест - используется при сдаче системы заказчику. Здесь разработчики часто занижают требования к системе по сравнению с системным тестом, и в общем-то понятно, почему это оправданно; \nтесты производительности и нагрузки - входят в системный тест, но достойны отдельного упоминания, так как именно эта группа тестов является основной для оценки надежности системы. \nВ тесты каждой группы обязательно входят тесты моделирования отказов. Здесь проверяется реакция компонента, группы компонентов, системы в целом на отказы следующего типа:\nотказ отдельного компонента информационной системы; \nотказ группы компонентов информационной системы; \nотказ основных модулей информационной системы; \nотказ операционной системы; \n«жесткий» сбой (отказ питания, жестких дисков). \nЭти тесты позволяют оценить качество подсистемы восстановления корректного состояния информационной системы и служат основным источником информации для разработки стратегий предотвращения негативных последствий сбоев при промышленной эксплуатации. Как правило, это тот класс тестов, которым разработчики пренебрегают, а затем борются с последствиями сбоев на промышленной системе.\nЕще одним важным моментом программы тестирования информационных систем является наличие генераторов тестовых данных. Они используются для проведения как тестов функциональности системы, так и тестов надежности системы, а также тестов производительности системы. Задача оценки характеристик зависимости производительности информационной системы от роста объемов обрабатываемой информации не может быть решена без генераторов данных.\n\nЭксплуатация и сопровождение \nОпытная эксплуатация перекрывает процесс тестирования. Как правило, система вводится в эксплуатацию не полностью, постепенно.\nВвод в эксплуатацию проходит по крайней мере три фазы:\nпервоначальная загрузка информации; \nнакопление информации; \nвыход на проектную мощность. \nПервоначальная загрузка информации инициирует довольно узкий круг ошибок - в основном это проблемы рассогласования данных при загрузке и собственные ошибки загрузчиков, то есть то, что не было отслежено на тестовых данных. Подобные ошибки должны быть исправлены как можно быстрее. Не поленитесь поставить отладочную версию системы (если, конечно, вам позволят развернуть весь комплекс сопровождающего отладку информационной системы ПО на месте). Если отладку «на живых» данных производить невозможно, то придется моделировать ситуацию, причем быстро. Здесь требуются очень квалифицированные тестеры.\nВ период накопления информации проявится наибольшее количество ошибок, допущенных при создании информационной системы. Как правило, это ошибки, связанные с многопользовательским доступом. Часто на этапе тестирования таким ошибкам не уделяется должного внимания - видимо, из-за сложности моделирования и дороговизны средств автоматизации процесса тестирования информационной системы в условиях многопользовательского доступа . Некоторые ошибки исправить будет довольно сложно, так как они являются ошибками проектирования. Ни один самый хороший проект от них не застрахован. Это значит, что на всякий случай надо резервировать время на локализацию и исправление таких ошибок.\nВторая категория исправлений связана с тем, что пользователя не устраивает интерфейс. Здесь не всегда нужно выполнять абсолютно все пожелания пользователя, иначе процесс ввода в эксплуатацию не кончится никогда.\nВ период накопления информации можно столкнуться со знаменитым «упала база». При самом плохом раскладе окажется, что СУБД не выдерживает потока информации. При хорошем - просто параметры конфигурации неверны. Первый случай опасен, так как повлиять на производителя СУБД довольно сложно, а заказчик очень не любит ссылок на службу технической поддержки СУБД. Решать проблему отказа СУБД придется не производителю, а вам - менять схему, снижать поток запросов, менять сами запросы; в общем - вариантов много. Хорошо, если время восстановления базы вписывается в запланированное.\nВыход системы на проектную мощность при удачном стечении обстоятельств - это исправление ряда мелких ошибок, и изредка - ошибок серьезных.\n\nДругие подходы к разработке приложений \nКак правило, конечные пользователи и руководство полагают, что процесс проектирования не дал никаких результатов, поскольку отсутствуют готовые компоненты, которые можно было бы «пощупать». Зачастую заказчик настаивает на досрочном проведении этапа реализации проекта, для того чтобы как можно быстрее получить какой-то результат и продемонстрировать его. В таком случае существует большой соблазн выбрать ускоренную разработку приложений (УРП) или совместную разработку приложений (СРП). Подобные методы предусматривают разработку рабочего прототипа с последующей демонстрацией его пользователям. Пользователи отмечают, что им нравится, а что - нет. Проектировщик дорабатывает прототип с учетом сделанных замечаний, после чего снова демонстрирует то, что получилось. И так далее. Процесс повторяется до тех пор, пока пользователям не понравится то, что они видят, а прототип не станет рабочим приложением. Обычно устанавливается лимит времени и количество итераций, иначе пользователи будут совершенствовать прототип вечно. Теоретически это позволяет получить ту систему, которая требуется пользователям. На практике подобный подход к разработке приложений сопряжен с серьезными проблемами.\nВсе внимание сконцентрировано на экранных формах, а то, что касается правил обработки данных и системных функций, остается за кадром. Есть соблазн начать работу с отчетов, в то время как отчет является не стартовым, а производным продуктом информационной системы. \nПользователи полагают, что если вариант прототипа согласован, то модуль готов. На самом деле это может быть всего лишь картинка с набором «заглушек» для вызовов системных функций и взаимодействия с другими модулями. \nМодули проектируются изолированно друг от друга (наверное, большинство из вас сталкивались с бухгалтерскими программами, где каждый АРМ является автономным и функции часто дублируются). Следствием этого являются противоречия модулей, дублирование функций и данных, что может быть выявлено только при тестировании комплекса модулей. \nФункциональные возможности наращиваются параллельно в нескольких направлениях, значит, структура базы данных должна контролироваться жестко. При УРП схема базы данных превращается в свалку, где таблицы «лепятся» наскоро, в результате чего имеет место набор противоречивых и дублирующихся данных. \nДокументация при использовании метода УРП, как правило, отсутствует, а вернее, о необходимости документировать систему забывают, поскольку создается иллюзия, что пользователь и без того понимает, что происходит. Когда же приложение начинает работать не так, как предполагает пользователь, возникает масса проблем. \nОбработка исключительных ситуаций для каждого модуля производится своя. \nЦелостная система, как правило, не получается, скорее всего, это будет некий набор автоматизированных рабочих мест, наскоро связанных между собой. \nМетоды УРП и СРП можно использовать далеко не всегда, а лишь в том случае, если:\nобъем проекта и требования бизнеса четко определены, не изменяются, а сам проект невелик; \nпроект не зависит от других средств автоматизации бизнеса, количество внешних интерфейсов, с которыми придется иметь дело, ограниченно; \nсистема ориентирована на экранные формы, обработка данных и системные функции составляют незначительную часть, удобство экранных форм входит в пятерку важнейших факторов успеха проекта; \nпользователи имеют высокую квалификацию и априори положительно оценивают идею создания нового ПО. \nТем не менее методом УРП лучше разрабатывать небольшие и, желательно, автономные части проекта.\nВ настоящее время предпринята попытка представить еще один способ быстрого написания проекта - метод экстремального программирования. Ниже будут рассмотрены принципы данного подхода.\nЭтап планирования (planning game). На основании оценок, сделанных программистами, заказчик определяет функциональные возможности и срок реализации версий системы. Программисты реализуют только те функции, которые необходимы для возможностей, выбранных на данной итерации.\nВ результате такого решения «за кадром» остается развитие системы, вследствие чего при разработке возникает необходимость строить «заглушки» и переписывать код. Непонятно, почему срок реализации определяет заказчик, ведь на самом деле это прямая обязанность группы проектировщиков. Заказчик, вообще говоря, может лишь выразить свои пожелания по поводу сроков («хочу, чтобы к такому-то числу»), но определить срок может только проектировщик («выполнимо не меньше чем за такое-то время»).\nЧастая смена версий (small releases). Систему запускают в эксплуатацию уже через несколько месяцев после начала реализации, не дожидаясь окончательного разрешения всех поставленных проблем. Выпуск новых версий может происходить с периодичностью от ежедневного до ежемесячного.\nВсе хорошо, кроме одного: протестировать за такой срок более или менее сложный компонент невозможно. Заказчик фактически выступает в роли бета-тестера. В этом случае он может видеть, что разработчики трудятся и даже ошибки исправляют. Однако возникают резонные вопросы: стоит ли посвящать заказчика в рабочий процесс и нужно ли ставить эксперименты на рабочей системе? В дополнение к сказанному необходимо отметить, что подобный принцип вряд ли может быть реализован для частей проекта, которые требуют работы в режиме 24x7.\nМетафора (metaphor). Общий вид системы определяется при помощи метафоры или набора метафор, над которыми совместно работают заказчик и программисты.\nС одной стороны, этот постулат кажется неплохим, а с другой - имеет ли смысл посвящать заказчика во внутренние дела группы разработчиков? То, что касается общего вида (интерфейсы, отчеты и т.п.), действительно может находиться в компетенции заказчика, но когда речь идет об особенностях реализации тех или иных компонентов, заказчик вряд ли может быть полезен из-за отсутствия у него необходимых знаний.\nПростой проект (simple design). В каждый момент времени разрабатываемая система выполняет все тесты и поддерживает все взаимосвязи, определяемые программистом, не имеет дубликатов кода и содержит минимально возможное количество классов и методов. Это правило кратко можно выразить так: «Каждую мысль формулируй один и только один раз».\nЭта мысль тоже хороша, но она не вполне согласуется с принципом быстрого написания кода. Может быть, стоит все-таки сначала подумать, как делать тот или иной модуль, группу модулей, и лишь потом заняться написанием кода?\nТесты (tests). Программисты постоянно пишут тесты для модулей (unit tests). Собранные вместе, эти тесты должны работать корректно. Для этапов в итерации заказчики пишут функциональные тесты (functional tests), которые также должны работать правильно. Однако на практике это не всегда достижимо. Чтобы принять правильное решение, необходимо понять, во сколько обойдется сдача системы с заранее известным дефектом, и сравнить это с ценой задержки на исправление дефекта.\nПри написании тестов самими программистами (особенно в условиях сверхурочных работ) эти тесты не полнофункциональны, и уж тем более не учитывают особенностей многопользовательской работы. На более продвинутые тесты у разработчиков обычно не хватает времени. Можно, конечно, построить систему разработки так, что всем будут заниматься одни и те же люди, но все-таки не стоит превращать проект в аналог телепередачи «Сам себе режиссер». К сказанному необходимо добавить, что тестирование системы вовсе не исчерпывается тестами компонентов (units); не менее важны тесты взаимодействия между ними, это же относится и к тестам надежности работы. И тем не менее метод экстремального программирования не предусматривает создания тестов данного класса. Это объясняется тем, что сами такие тесты могут представлять достаточно сложный код (особенно это касается тестов-имитаторов реальной работы системы). В данной технологии также никак не учитывается еще один важный класс тестов - тесты поведения системы при росте объемов обрабатываемой информации. При высокой скорости изменения версий выполнить такой тест технологически невозможно, поскольку его проведение требует стабильного и неизменного кода проекта, например, в течение недели. Подобные сроки, вообще говоря, не гарантируются из-за частой смены версий. В таком случае придется или приостанавливать разработку компонентов, или на время проведения теста создавать параллельную версию проекта, которая будет сохраняться неизменной, тогда как вторая при этом будет изменяться. Потом нужно будет выполнять процесс слияния кода. Но в этом случае тест придется создавать снова, так как методы экстремального программирования просто не предусматривают разработку средств, позволяющих прогнозировать поведение системы при тех или иных изменениях.\nПереработка системы (refactoring). Архитектура системы постоянно эволюционирует. Текущий проект трансформируется, при этом гарантируется правильное выполнение всех тестов.\nВот тут-то и начинается самое интересное. Экстремальное программирование исходит из того, что переделать всегда можно, причем без особых затрат. Однако практика свидетельствует об обратном.\nПрограммирование в паре (pair programming). Весь код проекта пишут два человека, которые используют одну настольную систему.\nВозникает вопрос: кто-нибудь видел двух совершенно одинаковых программистов, каждый из которых к тому же в конце рабочего дня успевал бы писать документацию для напарника? Можно ли найти таких программистов-близнецов, согласных во всем?\nА главное, зачем нужна такая пара программистов? Причина, в общем-то, простая: не все выдерживают навязываемый при экстремальном программировании высокий темп работ, неизбежен отток персонала. Подобная пара может дать некую страховку - если уволится один, то, может быть, второй доведет дело до конца. Правда, оставшийся попадет в еще более жесткие временные рамки - ведь объем работ останется прежним же, а дублера уже не будет, по крайней мере какое-то время. Далее следует естественный процесс передачи информации новому дублеру, что опять-таки требует времени. И так без конца.\nНепрерывная интеграция (continuous integration). Новый код интегрируется в существующую систему не позднее, чем через несколько часов. После этого система вновь собирается в единое целое и прогоняются все тесты. Если хотя бы один из них не выполняется корректно, внесенные изменения отменяются.\nЭтот постулат предоставляется по меньшей мере спорным, поскольку непонятно, кто будет исправлять ошибки, причем не только локальные, но и наведенные неправильным кодом. Ведь проведение комплексных тестов не предполагается на данном этапе, кроме того, изменения остаются даже в том случае, когда ошибка детектирована. В то же самое время метод экстремального программирования не предусматривает наличия системы отслеживания ошибок.\nКоллективное владение (collective ownership). Каждый программист имеет возможность в любое время усовершенствовать любую часть кода в системе, если сочтет это необходимым.\nВам это анархию не напоминает? Как в этом случае искать автора изменений? Встречал ли кто-либо при разработке большого проекта такого «на все руки доку» и сколько подобный «умелец» сумел бы продержаться на своем рабочем месте? Правильно, не слишком долго.\nЗаказчик с постоянным участием (on-site customer). Заказчик, который в период работы над системой находится в команде разработчиков.\nЭто, конечно, хорошо, но непонятна цель: то ли посвятить заказчика в суть дела, то ли сделать его соавтором? Вряд ли только у заказчика найдется столь высококвалифицированный специалист.\n40-часовая неделя (40-hour weeks). Объем сверхурочных работ не может превышать по длительности одну рабочую неделю. Даже отдельные случаи сверхурочных работ, повторяющиеся слишком часто, являются сигналом серьезных проблем, которые требуют безотлагательного решения.\nКак показывает практика применения экстремального программирования (несмотря на целый ряд положительных примеров, приводимых сторонниками данного метода), сверхурочные при таком подходе - это правило, а не исключение, и борьба с проблемами в данном случае - явление постоянное. Усиливается она в период замены текущей сырой версии продукта очередной, опять же сырой, версией. Заказчик, посвященный в процесс, испытывает все прелести проявления ошибок работы системы на себе. Как вы думаете, надолго ли хватит у заказчика терпения при таком положении дел? Ему ведь надо, чтобы система работала...\nОткрытое рабочее пространство (open workspace). Команда разработчиков располагается в большом помещении, окруженном комнатами меньшей площади. В центре рабочего пространства устанавливаются компьютеры, на которых работают пары программистов.\nПричем все это, судя по предыдущим принципам, должно располагаться на территории заказчика, раз он весьма активно привлекается к процессу разработки. Возникает вопрос: реально ли столь удачное стечение обстоятельств?\nНе более чем правила (just rules). Члены коллектива, работающего по технологии экстремального программирования, обязуются выполнять изложенные правила. Однако это не более чем правила и команда может в любой момент поменять их, если ее члены достигли принципиального соглашения по поводу внесенных изменений.\nМожет быть, в конце концов и будет выработано одно полезное правило: «сначала подумай, потом сделай». В этом случае мы будем иметь схему, весьма похожую на «водопад». Почему-то сторонники экстремального программирования убеждены, что при использовании «водопада» и его клонов цикл разработки обязательно должен быть длинным. Непонятно, чем обусловлена такая уверенность. Ведь не запрещено дробить проект на этапы. Почему-то считается, что планирование обязательно будет одноразовым и неизменным, хотя на самом деле это не соответствует истине, в том числе и в случае «водопада».\nВ итоге мы получаем метод, потенциально обладающий высокой адаптируемостью к сильно изменяющимся требованиям к проекту, но в то же время не свободный от ряда серьезных недостатков. Последнее обстоятельство не позволяет рекомендовать данный метод к применению для проектов, требующих высокой или как минимум достаточной надежности работы.\n",
|
||
"1",
|
||
"[['этап_разработка', 'проект', 'реализация', 'тестирование', 'эксплуатация', 'сопровождение', 'реализация', 'трудный', 'давать', 'совет', 'реализация', 'код', 'модуль', 'разработчик', 'привычка', 'стиль', 'разработка', 'код'], ['реализация', 'проект', 'важный', 'координировать', 'группа', 'группа', 'разработчик'], ['разработчик', 'подчиняться', 'жёсткий', 'правило', 'контроль', 'исходный', 'тест'], ['группа', 'разработчик', 'получить', 'технический', 'проект', 'начинать', 'писать', 'код', 'модуль', 'случай', 'основный', 'задача', 'состоять', 'уяснить', 'спецификация'], ['проектировщик', 'указать', 'сделать', 'разработчик', 'определять', 'способ', 'выполнение'], ['этап_разработка', 'осуществляться', 'тесный', 'взаимодействие', 'проектировщик', 'разработчик', 'группа', 'тестер'], ['случай', 'интенсивный', 'разработка', 'тестер', 'буквально', 'пристёгиваться', 'разработчик', 'фактически', 'являться', 'член', 'группа', 'разработка'], ['проектировщик', 'этап', 'выполнять', 'функция', 'ходячий', 'справочник', 'постоянно', 'отвечать', 'вопрос', 'разработчик', 'касаться', 'технический', 'спецификация'], ['этап_разработка', 'меняться', 'интерфейс', 'пользователь'], ['обусловить', 'число', 'модуль', 'периодически', 'демонстрироваться', 'заказчик'], ['существенно', 'меняться', 'запрос', 'данным'], ['отметить', 'сборка', 'проект', 'выделить', 'рабочий', 'место'], ['модуль', 'передаваться', 'тестирование'], ['взаимодействие', 'тестер', 'разработчик', 'централизовать', 'передача', 'часть', 'проект', 'допустимый', 'случай', 'срочно', 'проверить', 'какой', 'правка'], ['этап_разработка', 'этап', 'тестирование', 'взаимосвязаны', 'идти', 'параллельно'], ['синхронизировать', 'действие', 'тестер', 'разработчик', 'система', 'bug', 'tracking'], ['разработка', 'организовать', 'постоянно', 'обновлять', 'хранилище', 'готовый', 'модуль', 'проект', 'библиотека', 'использоваться', 'сборка', 'модуль'], ['желательный', 'процесс', 'обновление', 'хранилище', 'контролировать', 'человек'], ['хранилище', 'предназначить', 'модуль', 'пройти', 'функциональный', 'тестирование', 'модуль', 'пройти', 'тестирование', 'связь'], ['первый', 'черновик'], ['второй', 'собирать', 'дистрибутив', 'система', 'демонстрировать', 'заказчик', 'проведение', 'контрольный', 'испытание', 'сдача', 'какой', 'этап', 'работа'], ['документация', 'создаваться', 'течение', 'процесс', 'разработка'], ['модуль', 'пройти', 'тестирование', 'связь', 'описывать', 'документация'], ['случай', 'модуль', 'изменяться', 'описание', 'приступать', 'модуль', 'становиться', 'стабильный'], ['обработка', 'результат', 'проектирование', 'этап_разработка', 'правило', 'раз', 'проверяться', 'атомарность', 'функция', 'отсутствие', 'дублирование'], ['желательный', 'этап', 'проектирование', 'построить', 'матрица', 'функция', 'сущность'], ['фактически', 'формализованный', 'представление', 'фирма', 'пытаться', 'сделать', 'функция', 'какой', 'информация', 'требоваться', 'обработать', 'достижение', 'результат', 'сущность'], ['матрица', 'позволять', 'проверить', 'следующий', 'момент', 'сущность', 'конструктор', 'функция', 'создавать', 'экземпляр', 'сущность', 'create', 'ссылка', 'данную', 'сущность', 'использоваться', 'сущность', 'references', 'иметь', 'место', 'изменение', 'сущность', 'update', 'сущность', 'деструктор', 'функция', 'удалять', 'экземпляр', 'сущность', 'delete'], ['роль', 'деструктор', 'выполнять', 'комплект', 'программа', 'архивирование'], ['информационный_система', 'информация', 'накапливать'], ['допустимый', 'случай', 'течение', 'период', 'накопление', 'информация', 'фактически', 'течение', 'жизнедеятельность', 'информационный_система', 'характеристика', 'производительность', 'удовлетворять', 'требование', 'заказчик'], ['практика', 'чрезвычайно', 'редкий', 'стечение', 'обстоятельство'], ['связать', 'основный', 'рост', 'обрабатывать', 'объём', 'информация'], ['отметить', 'надеяться', 'случай', 'мощность', 'субд', 'аппаратный', 'обеспечение', 'экстенсивный', 'метод', 'повышение', 'производительность', 'давать', 'низкий', 'расчётный', 'прирост', 'скорость'], ['фактически', 'задача', 'реагирование', 'система', 'отдельный', 'часть', 'рост', 'объём', 'обрабатывать', 'являться', 'вероятный', 'задача', 'тестирование'], ['случай', 'группа', 'тестирование', 'создавать', 'модуль', 'генерация', 'абстрактный', 'выбираться', 'набор', 'запрос', 'скоростной', 'характеристика', 'критичный', 'производиться', 'замер', 'строиться', 'зависимость', 'скорость', 'выполнение', 'объём', 'каждый', 'запрос'], ['простой', 'действие', 'позволить', 'избежать', 'серьёзный', 'ошибка', 'проектирование', 'реализация', 'информационный_система'], ['спецификация', 'модуль', 'выполнить', 'этап', 'проектирование', 'реальный', 'проект', 'зачастую', 'придавать', 'значение'], ['напрасно', 'непродуманный', 'реализация', 'модуль', 'любой', 'достоинство', 'схема', 'база', 'утратить'], ['пренебрегать', 'спецификациями', 'модуль', 'рисковать', 'заложить', 'информационный_система', 'неконтролируемый', 'рост', 'объём', 'поток', 'запрос', 'изначально', 'высокий', 'вероятность', 'конфликт', 'поток', 'запрос', 'выполняться', 'вечно', 'попытка', 'выполнить', 'поток', 'обнаружение', 'конфликт', 'откат', 'действие', 'новый', 'попытка', 'т.д.', 'конфликтовать', 'поток', 'смешивание', 'системный', 'интерфейсный', 'модуль', 'дублирование', 'модуль', 'ошибка', 'размещение', 'бизнес', 'логики', 'отсутствие', 'реализация', 'неполный', 'реализация', 'требовать', 'заказчик', 'функция', 'система'], ['полный', 'список', 'проблема', 'обнаружить', 'этап', 'комплексный', 'тестирование', 'ввод', 'система', 'эксплуатация', 'процесс', 'эксплуатация', 'система', 'начать', 'реально', 'использоваться', 'модуль'], ['отсутствие', 'спецификация', 'модуль', 'позволить', 'оценить', 'сложность', 'каждый', 'модуль', 'следствие', 'определить', 'последовательность', 'создание', 'модуль', 'правильно', 'распределить', 'нагрузка', 'персонал'], ['обычный', 'ситуация', 'подобный', 'случай', 'ждать', 'процесс', 'создание', 'информационный_система', 'стоить', 'место'], ['системный', 'модуль', 'приходиться', 'рассматривать', 'большой', 'количество', 'обслуживать', 'вспомогательный', 'процесс', 'непосредственно', 'связать', 'сформулировать', 'бизнес', 'функцией'], ['правило', 'системный', 'функция', 'иметься', 'информационный_система', 'диспетчер', 'очередь', 'планировщик', 'задание', 'диспетчер', 'печать'], ['средство', 'доступ', 'данным', 'создание', 'нерегламентированный', 'запрос', 'генератор', 'отчёт', 'управление', 'каталогами', 'ресурс', 'файловый', 'система', 'автоматический', 'резервный', 'копирование', 'автоматический', 'восстановление', 'сбой', 'система', 'средство', 'регламентирование', 'доступ', 'пользователь', 'система', 'состоять', 'средство', 'создание', 'пользователь', 'средство', 'назначение', 'привилегия', 'средство', 'настройка', 'среда', 'пользователь', 'информационный_система', 'средство', 'изменение', 'пользователь', 'настройка', 'число', 'пароль', 'средство', 'управление', 'приложение', 'среда', 'администратор', 'информационный_система'], ['часть', 'функция', 'выполнять', 'операционный', 'система', 'работать', 'неоднородный', 'среда', 'гарантия', 'пользователь', 'прийтись', 'вкус', 'наличие', 'различный', 'интерфейс', 'разный', 'операционный', 'система'], ['идеал', 'приложение', 'клиент', 'работать', 'операционный', 'система', 'практика', 'разработчик', 'приходиться', 'сталкиваться', 'целый', 'зоопарк', 'различный', 'рабочий', 'станция', 'заказчик', 'итог', 'несколько', 'попытка', 'автоматизировать', 'бизнес'], ['цель', 'разработчик', 'довести', 'система', 'максимально', 'однородный', 'состояние', 'сделать', 'похожий', 'рабочий', 'место', 'конечный_пользователь'], ['задача', 'создание', 'информационный_система', 'разнородный', 'среда', 'существенно', 'повышать', 'требование', 'разработчик', 'код', 'выбираемому', 'средство', 'разработка'], ['касаться', 'разработка', 'системный', 'модуль'], ['уделить', 'внимание', 'модуль', 'реализация', 'код', 'зависеть', 'операционный', 'система'], ['модуль', 'выделить', 'отдельно', 'каждый', 'операционный', 'система', 'группы', 'win98', 'winnt', 'т.д.'], ['модуль', 'каждый', 'группа', 'строгий', 'интерфейс', 'обмен', 'передавать', 'получать', 'строго', 'определить', 'отклонение', 'спецификация', 'наказуемый'], ['ни', 'модуль', 'группа', 'использовать', 'никакой', 'вызов', 'интерфейс', 'обмен'], ['образ', 'модуль', 'зависеть', 'операционнй', 'система', 'изолироваться', 'модуль'], ['говорить', 'практика', 'изолирование', 'системный', 'модуль', 'строгий', 'регламентация', 'интерфейс', 'обмен', 'существенно', 'минимизировать', 'затрата', 'исправление', 'ошибка', 'поддержка', 'система'], ['облегчать', 'тестирование', 'детектирование', 'ошибка', 'отладка'], ['сторона', 'вопрос', 'требование', 'код', 'интерфейс', 'обмен', 'системный', 'модуль', 'резко', 'повышаться'], ['отлаживается', 'первый', 'очередь', 'работать', 'четко'], ['средство', 'мониторинг', 'информационный_система', 'информационный_система', 'большой', 'рассмотреть', 'задача', 'администрирование', 'рабочий', 'станция'], ['заботиться', 'конечный_пользователь', 'информационный_система', 'персонал', 'обслуживать'], ['особый', 'внимание', 'уделить', 'мониторинг', 'критический', 'участок', 'информационный_система', 'сбой', 'зачастую', 'предотвратить', 'исправлять', 'последствие'], ['мониторинг', 'относиться', 'задача', 'решение', 'заказчик', 'правило', 'задумываться', 'отсутствовать', 'аналитический', 'исследование', 'проектирование'], ['потребность', 'средство', 'мониторинг', 'становиться', 'очевидный', 'этап', 'ввод', 'система', 'эксплуатация', 'потребность', 'высоко', 'сложный', 'система', 'критический', 'участок'], ['разработчик', 'проектироващикам', 'проводить', 'оценка', 'сложность', 'система'], ['приниматься', 'решение', 'написание', 'комплексный', 'средство', 'администрирование', 'мониторинг', 'предусмотреть', 'технический', 'задание', 'случай', 'менять', 'технический', 'задание', 'идти', 'повод', 'заказчик'], ['сложный', 'система', 'отслеживать', 'критический', 'процесс', 'равный', 'прийтись'], ['внедрять', 'средство', 'готовый', 'система', 'сложный', 'исходный', 'монитор', 'получать', 'системный', 'модуль', 'достаточно', 'низкий', 'уровень'], ['изменение', 'схема', 'база', 'обойтись', 'гарантия', 'подобный', 'изменение', 'ухудшить', 'производительность', 'система'], ['разработка', 'монитор', 'специфический', 'класс', 'задача', 'сторона', 'обрабатывать', 'достаточный', 'объём', 'информация', 'существенно', 'влиять', 'работа', 'компонент', 'информационный_система'], ['заставлять', 'разработчик', 'особый', 'тщательность', 'подходить', 'проектирование', 'монитор', 'аккуратно', 'писать', 'код', 'модуль'], ['интерфейсы', 'интерфейсы', 'конечный_пользователь', 'заказчик', 'критиковать', 'больший', 'степень', 'сила', 'часть', 'информационный_система', 'квалифицированно', 'оценить', 'видеть'], ['означать', 'интерфейс', 'являться', 'изменять', 'элемент', 'информационный_система', 'этап', 'реализация'], ['изменять', 'компонент', 'компонент', 'информационный_система', 'изолировать', 'редко', 'изменять', 'компонент', 'изменение', 'влечь'], ['приём', 'подобный', 'изоляция', 'изоляция', 'запрос', 'данным', 'интерфейс', 'следующий', 'образ', 'запрос', 'кодироваться', 'идентификатор', 'закрываться', 'определённый', 'системный', 'функция', 'разработчик', 'интерфейс', 'знать', 'запрос', 'данным', 'параметр', 'атрибут', 'выборка', 'тип', 'количество', 'строка', 'выборка', 'обработка', 'ошибка', 'запрос', 'представлять', 'отдельный', 'модуль', 'обработка', 'ошибка', 'интерпретация', 'результат', 'запрос', 'представлять', 'отдельный', 'модуль'], ['обработка', 'результат', 'запрос', 'особый', 'внимание', 'уделить', 'вопрос', 'соответствие', 'тип', 'включать', 'язык', 'субд', 'число', 'вопрос', 'точность', 'числовой', 'тип', 'представление', 'разный', 'субд', 'существенно', 'различаться'], ['обратить', 'внимание', 'запрос', 'данным', 'использовать', 'функция', 'зависеть', 'операционный', 'система', 'функция', 'работа', 'байт', 'слово', 'значение', 'атрибут', 'intel', 'sun', 'sparc', 'функция', 'работать', 'разный'], ['тип', 'привести', 'запрос', 'функция', 'приведение', 'cast', 'встроить', 'субд', 'функция', 'функция', 'прикладной', 'программа'], ['субд', 'неявный', 'преобразование', 'тип', 'давать', 'результат', 'информационая', 'система', 'использовать', 'несколько', 'база', 'управление', 'разный', 'субд', 'неявный', 'преобразование', 'тип', 'лучше', 'избегать'], ['установить', 'достаточно', 'жёсткий', 'правило', 'внешний', 'вид', 'интерфейс', 'пользователь'], ['создаваться', 'впечатление', 'единый', 'стиль', 'компонент', 'информационный_система'], ['версия', 'база', 'первый', 'версия', 'база', 'проект', 'большинство', 'случай', 'создавать', 'достаточно', 'быстро', 'реализация', 'полностью', 'нормализованной', 'структура', 'получать', 'этап', 'анализ'], ['основный', 'назначение', 'база', 'являться', 'обеспечение', 'макетирование', 'демонстрационный', 'показ', 'эксперимент', 'разработчик', 'проектировщик'], ['скрипты', 'создание', 'база', 'заполнение', 'стартовый', 'данными', 'исходный', 'код', 'информационный_система', 'распространяться', 'правило', 'контроль', 'версия'], ['отметить', 'поддерживать', 'версия', 'база', 'даных', 'уровень', 'скрипт', 'уровень', 'средство', 'выгрузка', 'загрузка', 'предоставлять', 'субд', 'подавляющем', 'большинство', 'случай', 'средство', 'предоставить', 'простой', 'необходимый', 'функция', 'проконтролировать', 'объект', 'иметь', 'место', 'объект', 'загрузка', 'a', 'b', 'загрузить', 'база', 'разница', 'a', 'b', 'произвести', 'обновление', 'версия', 'проконтролировать', 'конфликтовать', 'изменение', 'иметь', 'место', 'объект', 'выгрузка', 'c', 'd', 'сравнение', 'объект', 'выгрузка', 'a', 'произвести', 'слияние', 'версия'], ['case', 'инструмент', 'иметь', 'средство', 'контроль', 'версия', 'схема', 'база', 'иметь', 'настройка', 'позволять', 'контролировать', 'стартовый'], ['давать', 'возможность', 'использовать', 'указать', 'средство', 'обеспечение', 'контроль', 'версия', 'база'], ['контроль', 'версия', 'исходный', 'код', 'триггер', 'хранить', 'процедура', 'надёжный', 'осуществлять', 'путем', 'использование', 'система', 'контроль', 'версия', 'принять', 'хранение', 'исходный', 'текст', 'проект'], ['размещение', 'логика', 'обработка', 'одим', 'важный', 'вопрос', 'проектирование', 'являться', 'способ', 'размещение', 'бизнес', 'логики', 'обработка', 'размещать', 'какой', 'часть', 'сервер', 'вид', 'хранить', 'процедура', 'пакет', 'триггер', 'иных', 'ограничение', 'целостность', 'непосредственно', 'сервер', 'база', 'вид', 'функция', 'клиент', 'состав', 'клиент'], ['местонахождение', 'правило', 'интерфейс', 'правило', 'задать', 'первый', 'разместить', 'клиент', 'второй', 'сервер'], ['правило', 'бизнес', 'логики', 'современный', 'субд', 'разместить', 'клиент', 'сервер'], ['рассмотреть', 'пример', 'простой', 'бизнес', 'правила', 'значение', 'поле', 'экранный', 'форма', 'вводиться', 'пользователь', 'выбираться', 'список', 'набор', 'допустимый', 'значение', 'строго', 'ограничить', 'два', 'три', 'различный', 'значение'], ['сторона', 'пользователь', 'требовать', 'немедленный', 'реакция', 'система', 'ошибка', 'ввод', 'недопустимый', 'значение', 'поле', 'база', 'отличный', 'задать', 'два', 'три'], ['дело', 'ситуация', 'реализовать', 'два', 'правило'], ['правило', 'случай', 'организовать', 'вид', 'ограничение', 'check', 'правило', 'интерфейс', 'запрещать', 'вводить', 'значение', 'отличный', 'задать', 'точность', 'повторять', 'правило', 'даных', 'реализовать', 'уровень', 'интерфейс', 'пользователь'], ['реализация', 'форма', 'список', 'случай', 'являться', 'идеальный', 'решение', 'большинство', 'оператор', 'предпочитать', 'набор', 'форма', 'длина', 'вводимого', 'значение', 'небольшой'], ['формы', 'больший', 'количество', 'список', 'достаточно', 'трудный', 'обработка', 'конечный_пользователь'], ['случай', 'набор', 'значение', 'форма', 'позаботиться', 'приведение', 'регистр', 'строка', 'символ', 'регистр', 'существенный', 'верхний', 'нижний', 'регистр', 'уровень', 'интерфейс', 'прикладной', 'программа'], ['шаблон', 'использование', 'шаблон', 'библиотека', 'построение', 'похожий', 'модуль', 'достаточно', 'распространенная', 'практика'], ['использовать', 'случай', 'объект', 'класс', 'библиотека', 'решать', 'конкретный', 'группа', 'разработчик'], ['диктовать', 'способ', 'разработка', 'большинство', 'случай', 'бессмысленный', 'разработчик', 'писать', 'код', 'уметь', 'привыкнуть'], ['момент', 'контролировать', 'руководитель', 'проект'], ['проект', 'запрещаться', 'копирование', 'код', 'вести', 'возникновение', 'различный', 'версия', 'код', 'разный', 'фрагмент', 'прикладной', 'программа', 'следствие', 'сложный', 'детектируемым', 'исправляемым', 'ошибка'], ['установить', 'жёсткий', 'правило', 'использоваться', 'вызов', 'функция', 'копия', 'код', 'отклонение', 'правило', 'наказуемый'], ['тестирование', 'сказать', 'выше', 'группа', 'тестирование', 'привлекаться', 'ранний', 'стадия', 'разработка', 'проект'], ['комплексный', 'тестирование', 'выделять', 'отдельный', 'этап_разработка'], ['зависимость', 'сложность', 'проект', 'тестирование', 'исправление', 'ошибка', 'занимать', 'треть', 'половина', 'время', 'разработка', 'проект'], ['сложный', 'проект', 'потребность', 'автоматизация', 'система', 'хранение', 'ошибка', 'bug', 'tracking'], ['система', 'обеспечивать', 'следующий', 'функция', 'хранение', 'сообщение', 'ошибка', 'обязательный', 'информация', 'компонент', 'система', 'относиться', 'ошибка', 'найти', 'воспроизвести', 'отвечать', 'исправление', 'исправить'], ['система', 'уведомление', 'появление', 'новый', 'ошибка', 'изменение', 'статус', 'известный', 'система', 'ошибка', 'правило', 'уведомление', 'электронный', 'почта', 'отчёт', 'актуальный', 'ошибка', 'компонент', 'система', 'интервал', 'время', 'группа', 'разработчик', 'разработчик', 'информация', 'история', 'ошибка', 'число', 'отслеживание', 'похожий', 'ошибка', 'отслеживание', 'повторный', 'возникновение', 'ошибка', 'правило', 'доступ', 'ошибка', 'иных', 'категория', 'интерфейс', 'ограничить', 'доступ', 'система', 'bug', 'tracking', 'конечный_пользователь', 'информационный_система', 'использоваться', 'интерфейс', 'обмен', 'информация', 'пользователь', 'служба', 'технический', 'поддержка', 'система'], ['система', 'снимать', 'множество', 'организационный', 'проблема', 'частность', 'вопрос', 'автоматический', 'уведомление', 'ошибка'], ['тест', 'система', 'разделить', 'категория', 'автономный', 'тест', 'модуль', 'использоваться', 'этап_разработка', 'компонент', 'система', 'позволять', 'отслеживать', 'ошибка', 'отдельный', 'компонент', 'тест', 'связь', 'компонент', 'система', 'использоваться', 'этап_разработка', 'этап', 'тестирование', 'позволять', 'отслеживать', 'правильность', 'взаимодействие', 'обмен', 'информация', 'компонент', 'система', 'системный', 'тест', 'являться', 'основный', 'критерий', 'приёмка', 'система'], ['правило', 'группа', 'тест', 'включать', 'автономный', 'тест', 'тест', 'связь', 'модель'], ['тест', 'воспроизводить', 'работа', 'компонент', 'функция', 'система', 'основный', 'цель', 'внутренний', 'приёмка', 'система', 'оценка', 'качество', 'приемо', 'сдаточный', 'тест', 'использоваться', 'сдача', 'система', 'заказчик'], ['разработчик', 'занижать', 'требование', 'система', 'сравнение', 'системный', 'тест', 'общий', 'понятный', 'оправданный', 'тест', 'производительность', 'нагрузка', 'входить', 'системный', 'тест', 'достойный', 'отдельный', 'упоминание', 'группа', 'тест', 'являться', 'основный', 'оценка', 'надёжность', 'система'], ['тест', 'каждый', 'группа', 'обязательно', 'входить', 'тест', 'моделирование', 'отказ'], ['проверяться', 'реакция', 'компонент', 'группа', 'компонент', 'система', 'целое', 'отказ', 'следующий', 'тип', 'отказ', 'отдельный', 'компонент', 'информационный_система', 'отказ', 'группа', 'компонент', 'информационный_система', 'отказ', 'основный', 'модуль', 'информационный_система', 'отказ', 'операционный', 'система', 'жёсткий', 'сбой', 'отказ', 'питание', 'жёсткий', 'диск'], ['тест', 'позволять', 'оценить', 'качество', 'подсистема', 'восстановление', 'корректный', 'состояние', 'информационный_система', 'служить', 'основный', 'источник', 'информация', 'разработка', 'стратегия', 'предотвращение', 'негативный', 'последствие', 'сбой', 'промышленный', 'эксплуатация'], ['правило', 'класс', 'тест', 'разработчик', 'пренебрегать', 'бороться', 'последствие', 'сбой', 'промышленный', 'система'], ['важный', 'момент', 'программа', 'тестирование', 'информационный_система', 'являться', 'наличие', 'генератор', 'тестовый'], ['использоваться', 'проведение', 'тест', 'функциональность', 'система', 'тест', 'надёжность', 'система', 'тест', 'производительность', 'система'], ['задача', 'оценка', 'характеристика', 'зависимость', 'производительность', 'информационный_система', 'рост', 'объём', 'обрабатывать', 'информация', 'решить', 'генератор'], ['эксплуатация', 'сопровождение', 'опытный', 'эксплуатация', 'перекрывать', 'процесс', 'тестирование'], ['правило', 'система', 'вводиться', 'эксплуатация', 'полностью', 'постепенно'], ['ввод', 'эксплуатация', 'проходить', 'крайний', 'мера', 'три', 'фаза', 'первоначальный', 'загрузка', 'информация', 'накопление', 'информация', 'выход', 'проектный', 'мощность'], ['первоначальный', 'загрузка', 'информация', 'инициировать', 'узкий', 'круг', 'ошибка', 'основный', 'проблема', 'рассогласование', 'загрузка', 'собственный', 'ошибка', 'загрузчик', 'отследить', 'тестовый'], ['ошибка', 'исправить', 'быстрый'], ['поленитесь', 'поставить', 'отладочный', 'версия', 'система', 'позволить', 'развернуть', 'комплекс', 'сопровождать', 'отладка', 'информационный_система', 'место'], ['отладка', 'живой', 'производить', 'невозможный', 'прийтись', 'моделировать', 'ситуация', 'быстро'], ['требоваться', 'квалифицированный', 'тестер'], ['период', 'накопление', 'информация', 'проявиться', 'больший', 'количество', 'ошибка', 'допустить', 'создание', 'информационный_система'], ['правило', 'ошибка', 'связать', 'многопользовательский', 'доступ'], ['этап', 'тестирование', 'ошибка', 'уделяться', 'должный', 'внимание', 'видимо', 'сложность', 'моделирование', 'дороговизна', 'средство', 'автоматизация', 'процесс', 'тестирование', 'информационный_система', 'условие', 'многопользовательский', 'доступ'], ['ошибка', 'исправить', 'сложный', 'являться', 'ошибка', 'проектирование'], ['ни', 'хороший', 'проект', 'застраховать'], ['случай', 'резервировать', 'время', 'локализация', 'исправление', 'ошибка'], ['второй', 'категория', 'исправление', 'связать', 'пользователь', 'устраивать', 'интерфейс'], ['выполнять', 'абсолютно', 'пожелание', 'пользователь', 'процесс', 'ввод', 'эксплуатация', 'кончиться'], ['период', 'накопление', 'информация', 'столкнуться', 'знаменитый', 'упасть', 'база'], ['плохой', 'расклад', 'оказаться', 'субд', 'выдерживать', 'поток', 'информация'], ['хороший', 'параметр', 'конфигурация', 'неверный'], ['первый', 'случай', 'опасный', 'повлиять', 'производитель', 'субд', 'сложный', 'заказчик', 'любить', 'ссылка', 'служба', 'технический', 'поддержка', 'субд'], ['решать', 'проблема', 'отказ', 'субд', 'прийтись', 'производитель', 'менять', 'схема', 'снижать', 'поток', 'запрос', 'менять', 'запрос', 'общем', 'вариант'], ['время', 'восстановление', 'база', 'вписываться', 'запланировать'], ['выход', 'система', 'проектный', 'мощность', 'удачный', 'стечение', 'обстоятельство', 'исправление', 'ряд', 'мелкий', 'ошибка', 'изредка', 'ошибка', 'серьёзный'], ['подход', 'разработка', 'приложение', 'правило', 'конечный_пользователь', 'руководство', 'полагать', 'процесс', 'проектирование', 'дать', 'никакой', 'результат', 'отсутствовать', 'готовый', 'компонент', 'пощупать'], ['зачастую', 'заказчик', 'настаивать', 'досрочный', 'проведение', 'этап', 'реализация', 'проект', 'быстрый', 'получить', 'результат', 'продемонстрировать'], ['случай', 'существовать', 'большой', 'соблазн', 'выбрать', 'ускоренный', 'разработка', 'приложение', 'урп', 'совместный', 'разработка', 'приложение', 'срп'], ['метод', 'предусматривать', 'разработка', 'рабочий', 'прототип', 'последующий', 'демонстрация', 'пользователь'], ['пользователь', 'отмечать', 'нравиться'], ['проектировщик', 'дорабатывать', 'прототип', 'учёт', 'сделать', 'замечание', 'демонстрировать', 'получиться'], [], ['процесс', 'повторяться', 'пользователь', 'понравиться', 'видеть', 'прототип', 'стать', 'рабочий', 'приложение'], ['устанавливаться', 'лимит', 'время', 'количество', 'итерация', 'пользователь', 'совершенствовать', 'прототип', 'вечно'], ['теоретически', 'позволять', 'получить', 'система', 'требоваться', 'пользователь'], ['практика', 'подход', 'разработка', 'приложение', 'сопрячь', 'серьёзный', 'проблема'], ['внимание', 'сконцентрировать', 'экранный', 'форма', 'касаться', 'правило', 'обработка', 'системный', 'функция', 'оставаться', 'кадр'], ['соблазн', 'начать', 'работа', 'отчёт', 'время', 'отчёт', 'являться', 'стартовый', 'производный', 'продукт', 'информационный_система'], ['пользователь', 'полагать', 'вариант', 'прототип', 'согласовать', 'модуль', 'готовый'], ['дело', 'картинка', 'набор', 'заглушка', 'вызов', 'системный', 'функция', 'взаимодействие', 'модуль'], ['модуль', 'проектироваться', 'изолированно', 'друг', 'друга', 'наверное', 'большинство', 'сталкиваться', 'бухгалтерский', 'программа', 'арм', 'являться', 'автономный', 'функция', 'дублироваться'], ['следствие', 'являться', 'противоречие', 'модуль', 'дублирование', 'функция', 'выявить', 'тестирование', 'комплекс', 'модуль'], ['функциональный', 'возможность', 'наращиваться', 'параллельно', 'несколько', 'направление', 'структура', 'база', 'контролироваться', 'жестко'], ['урп', 'схема', 'база', 'превращаться', 'свалка', 'таблица', 'лепиться', 'наскоро', 'результат', 'место', 'набор', 'противоречивый', 'дублирующихся'], ['документация', 'использование', 'метод', 'урп', 'правило', 'отсутствовать', 'документировать', 'система', 'забывать', 'создаваться', 'иллюзия', 'пользователь', 'понимать', 'происходить'], ['приложение', 'начинать', 'работать', 'предполагать', 'пользователь', 'возникать', 'масса', 'проблема'], ['обработка', 'исключительный', 'ситуация', 'каждый', 'модуль', 'производиться'], ['целостный', 'система', 'правило', 'получаться', 'некий', 'набор', 'автоматизированный', 'рабочий', 'место', 'наскоро', 'связать'], ['метод', 'урп', 'срп', 'использовать', 'случай', 'объём', 'проект', 'требование', 'бизнес', 'четко', 'определить', 'изменяться', 'проект', 'небольшой', 'проект', 'зависеть', 'средство', 'автоматизация', 'бизнес', 'количество', 'внешний', 'интерфейс', 'прийтись', 'дело', 'ограниченно', 'система', 'ориентировать', 'экранный', 'форма', 'обработка', 'системный', 'функция', 'составлять', 'незначительный', 'часть', 'удобство', 'экранный', 'форма', 'входить', 'пятёрка', 'важный', 'фактор', 'успех', 'проект', 'пользователь', 'иметь', 'высокий', 'квалификация', 'априори', 'положительно', 'оценивать', 'идея', 'создание', 'новый'], ['метод', 'урп', 'лучше', 'разрабатывать', 'небольшой', 'желательно', 'автономный', 'часть', 'проект'], ['время', 'предпринять', 'попытка', 'представить', 'способ', 'быстрый', 'написание', 'проект', 'метод', 'экстремальный_программирование'], ['рассмотреть', 'принцип', 'подход'], ['этап', 'планирование', 'planning', 'game'], ['основание', 'оценка', 'сделать', 'программист', 'заказчик', 'определять', 'функциональный', 'возможность', 'срок', 'реализация', 'версия', 'система'], ['программист', 'реализовать', 'функция', 'необходимый', 'возможность', 'выбрать', 'итерация'], ['результат', 'решение', 'кадр', 'оставаться', 'развитие', 'система', 'вследствие', 'разработка', 'возникать', 'необходимость', 'строить', 'заглушка', 'переписывать', 'код'], ['непонятный', 'срок', 'реализация', 'определять', 'заказчик', 'дело', 'прямой', 'обязанность', 'группа', 'проектировщик'], ['заказчик', 'говорить', 'выразить', 'пожелание', 'повод', 'срок', 'число', 'определить', 'срок', 'проектировщик', 'выполнимый', 'время'], ['частый', 'смена', 'версия', 'small', 'releases'], ['система', 'запускать', 'эксплуатация', 'месяц', 'реализация', 'дожидаться', 'окончательный', 'разрешение', 'поставить', 'проблема'], ['выпуск', 'новый', 'версия', 'происходить', 'периодичность', 'ежедневный', 'ежемесячный'], ['протестировать', 'срок', 'сложный', 'компонент', 'невозможный'], ['заказчик', 'фактически', 'выступать', 'роль', 'бета', 'тестер'], ['случай', 'видеть', 'разработчик', 'трудиться', 'ошибка', 'исправлять'], ['возникать', 'резонный', 'вопрос', 'стоить', 'посвящать', 'заказчик', 'рабочий', 'процесс', 'ставить', 'эксперимент', 'рабочий', 'система'], ['дополнение', 'сказанному', 'отметить', 'принцип', 'реализовать', 'часть', 'проект', 'требовать', 'работа', 'режим', '24x7'], ['метафора', 'metaphor'], ['общий', 'вид', 'система', 'определяться', 'помощь', 'метафора', 'набор', 'метафор', 'совместно', 'работать', 'заказчик', 'программист'], ['сторона', 'постулат', 'неплохой', 'смысл', 'посвящать', 'заказчик', 'внутренний', 'дело', 'группа', 'разработчик'], ['касаться', 'общий', 'вид', 'интерфейс', 'отчёт', 'т.п.', 'компетенция', 'заказчик', 'речь', 'идти', 'особенность', 'реализация', 'иных', 'компонент', 'заказчик', 'полезный', 'отсутствие', 'необходимый', 'знание'], ['простой', 'проект', 'simple', 'design'], ['момент', 'время', 'разрабатывать', 'система', 'выполнять', 'тест', 'поддерживать', 'взаимосвязь', 'определять', 'программист', 'дубликат', 'код', 'содержать', 'минимально', 'возможный', 'количество', 'класс', 'метод'], ['правило', 'кратко', 'выразить', 'каждый', 'мысль', 'формулируй', 'раз'], ['мысль', 'хороший', 'согласоваться', 'принцип', 'быстрый', 'написание', 'код'], ['стоить', 'подумать', 'делать', 'иной', 'модуль', 'группа', 'модуль', 'заняться', 'написание', 'код'], ['тест', 'tests'], ['программист', 'постоянно', 'писать', 'тест', 'модуль', 'unit', 'tests'], ['собрать', 'вместе', 'тест', 'работать', 'корректно'], ['этап', 'итерация', 'заказчик', 'писать', 'функциональный', 'тест', 'functional', 'tests', 'работать', 'правильно'], ['практика', 'достижимый'], ['принять', 'правильный', 'решение', 'понять', 'обойтись', 'сдача', 'система', 'заранее', 'известный', 'дефект', 'сравнить', 'цена', 'задержка', 'исправление', 'дефект'], ['написание', 'тест', 'программист', 'условие', 'сверхурочный', 'работа', 'тест', 'полнофункциональны', 'учитывать', 'особенность', 'многопользовательский', 'работа'], ['продвинутые', 'тест', 'разработчик', 'хватать', 'время'], ['построить', 'система', 'разработка', 'заниматься', 'человек', 'стоить', 'превращать', 'проект', 'аналог', 'телепередача', 'режиссёр'], ['сказанному', 'добавить', 'тестирование', 'система', 'исчерпываться', 'тест', 'компонент', 'units', 'важный', 'тест', 'взаимодействие', 'относиться', 'тест', 'надёжность', 'работа'], ['метод', 'экстремальный_программирование', 'предусматривать', 'создание', 'тест', 'класс'], ['объясняться', 'тест', 'представлять', 'достаточно', 'сложный', 'код', 'касаться', 'тест', 'имитатор', 'реальный', 'работа', 'система'], ['технология', 'учитываться', 'важный', 'класс', 'тест', 'тест', 'поведение', 'система', 'рост', 'объём', 'обрабатывать', 'информация'], ['высокий', 'скорость', 'изменение', 'версия', 'выполнить', 'тест', 'технологически', 'невозможный', 'проведение', 'требовать', 'стабильный', 'неизменный', 'код', 'проект', 'течение', 'неделя'], ['срок', 'говорить', 'гарантироваться', 'частый', 'смена', 'версия'], ['случай', 'прийтись', 'приостанавливать', 'разработка', 'компонент', 'время', 'проведение', 'тест', 'создавать', 'параллельный', 'версия', 'проект', 'сохраняться', 'неизменный', 'второй', 'изменяться'], ['выполнять', 'процесс', 'слияние', 'код'], ['случай', 'тест', 'прийтись', 'создавать', 'метод', 'экстремальный_программирование', 'предусматривать', 'разработка', 'средство', 'позволять', 'прогнозировать', 'поведение', 'система', 'иных', 'изменение'], ['переработка', 'система', 'refactoring'], ['архитектура', 'система', 'постоянно', 'эволюционировать'], ['текущий', 'проект', 'трансформируется', 'гарантироваться', 'правильный', 'выполнение', 'тест'], ['начинаться', 'интересный'], ['экстремальный_программирование', 'исходить', 'переделать', 'особый', 'затрата'], ['практика', 'свидетельствовать', 'обратный'], ['программирование', 'пара', 'pair', 'programming'], ['код', 'проект', 'писать', 'два', 'человек', 'использовать', 'настольный', 'система'], ['возникать', 'вопрос', 'видеть', 'два', 'совершенно', 'одинаковый', 'программист', 'конец', 'рабочий', 'день', 'успевать', 'писать', 'документация', 'напарник'], ['найти', 'программист', 'близнец', 'согласный'], ['главный', 'нужный', 'пара', 'программист'], ['причина', 'общий', 'простой', 'выдерживать', 'навязывать', 'экстремальный_программирование', 'высокий', 'темп', 'работа', 'неизбежный', 'отток', 'персонал'], ['пара', 'дать', 'некий', 'страховка', 'уволиться', 'второй', 'довести', 'дело', 'конец'], ['правда', 'остаться', 'попасть', 'жёсткий', 'временной', 'рамка', 'объём', 'работа', 'остаться', 'прежний', 'дублёр', 'крайний', 'мера', 'какой', 'время'], ['естественный', 'процесс', 'передача', 'информация', 'новый', 'дублёр', 'требовать', 'время'], ['конец'], ['непрерывный', 'интеграция', 'continuous', 'integration'], ['новый', 'код', 'интегрироваться', 'существовать', 'система', 'поздний', 'час'], ['система', 'собираться', 'единый', 'целый', 'прогоняются', 'тест'], ['выполняться', 'корректно', 'внести', 'изменение', 'отменяться'], ['постулат', 'предоставляться', 'малый', 'мера', 'спорный', 'непонятный', 'исправлять', 'ошибка', 'локальный', 'навести', 'неправильный', 'код'], ['проведение', 'комплексный', 'тест', 'предполагаться', 'этап', 'изменение', 'оставаться', 'случай', 'ошибка', 'детектирована'], ['время', 'метод', 'экстремальный_программирование', 'предусматривать', 'наличие', 'система', 'отслеживание', 'ошибка'], ['коллективный', 'владение', 'collective', 'ownership'], ['программист', 'возможность', 'время', 'усовершенствовать', 'часть', 'код', 'система', 'счесть'], ['анархия', 'напоминать'], ['случай', 'искать', 'автор', 'изменение'], ['встречать', 'разработка', 'большой', 'проект', 'рука', 'док', 'умелец', 'суметь', 'продержаться', 'рабочий', 'место'], ['правильно'], ['заказчик', 'постоянный', 'участие', 'on', 'site', 'customer'], ['заказчик', 'период', 'работа', 'система', 'находиться', 'команда', 'разработчик'], ['непонятный', 'цель', 'посвятить', 'заказчик', 'дело', 'сделать', 'соавтор'], ['заказчик', 'найтись', 'столь', 'высококвалифицированный', 'специалист'], ['40-часовая', 'неделя', '40-hour', 'weeks'], ['объём', 'сверхурочный', 'работа', 'превышать', 'длительность', 'рабочий', 'неделя'], ['отдельный', 'случай', 'сверхурочный', 'работа', 'повторяться', 'являться', 'сигнал', 'серьёзный', 'проблема', 'требовать', 'безотлагательный', 'решение'], ['показывать', 'практика', 'применение', 'экстремальный_программирование', 'несмотря', 'целый', 'ряд', 'положительный', 'пример', 'приводить', 'сторонник', 'метод', 'сверхурочный', 'подход', 'правило', 'исключение', 'борьба', 'проблема', 'случай', 'явление', 'постоянный'], ['усиливаться', 'период', 'замена', 'текущий', 'сырой', 'версия', 'продукт', 'очередной', 'сырой', 'версия'], ['заказчик', 'посвятить', 'процесс', 'испытывать', 'прелесть', 'проявление', 'ошибка', 'работа', 'система'], ['думать', 'надолго', 'хватить', 'заказчик', 'терпение', 'положение', 'дело'], ['система', 'работать'], ['открытый', 'рабочий', 'пространство', 'open', 'workspace'], ['команда', 'разработчик', 'располагаться', 'большой', 'помещение', 'окружить', 'комната', 'малый', 'площадь'], ['центр', 'рабочий', 'пространство', 'устанавливаться', 'компьютер', 'работать', 'пара', 'программист'], ['судить', 'предыдущий', 'принцип', 'располагаться', 'территория', 'заказчик', 'раз', 'весьма', 'активно', 'привлекаться', 'процесс', 'разработка'], ['возникать', 'вопрос', 'реально', 'столь', 'удачный', 'стечение', 'обстоятельство', 'правило', 'just', 'rules'], ['член', 'коллектив', 'работать', 'технология', 'экстремальный_программирование', 'обязываться', 'выполнять', 'изложить', 'правило'], ['правило', 'команда', 'момент', 'поменять', 'член', 'достигнуть', 'принципиальный', 'соглашение', 'повод', 'внести', 'изменение'], ['конец', 'конец', 'выработать', 'полезный', 'правило', 'подумай', 'сделать'], ['случай', 'схема', 'весьма', 'похожий', 'водопад'], ['сторонник', 'экстремальный_программирование', 'убеждены', 'использование', 'водопад', 'клон', 'цикл', 'разработка', 'обязательно', 'длинный'], ['непонятный', 'обусловить', 'уверенность'], ['запретить', 'дробить', 'проект', 'этап'], ['считаться', 'планирование', 'обязательно', 'одноразовый', 'неизменный', 'дело', 'соответствовать', 'истина', 'число', 'случай', 'водопад'], ['итог', 'получать', 'метод', 'потенциально', 'обладать', 'высокий', 'адаптируемость', 'сильно', 'изменяться', 'требование', 'проект', 'время', 'свободный', 'ряд', 'серьёзный', 'недостаток'], ['последний', 'обстоятельство', 'позволять', 'рекомендовать', 'метод', 'применение', 'проект', 'требовать', 'высокий', 'минимум', 'достаточный', 'надёжность', 'работа']]"
|
||
],
|
||
[
|
||
"39",
|
||
"Этапы разработки проекта5.docx",
|
||
"Этапы разработки проекта: стратегия и анализ\nВведение\nПроектирование информационных систем всегда начинается с определения цели проекта. Основная задача любого успешного проекта заключается в том, чтобы на момент запуска системы и в течение всего времени ее эксплуатации можно было обеспечить:\nтребуемую функциональность системы и степень адаптации к изменяющимся условиям ее функционирования; \nтребуемую пропускную способность системы; \nтребуемое время реакции системы на запрос; \nбезотказную работу системы в требуемом режиме, иными словами - готовность и доступность системы для обработки запросов пользователей; \nпростоту эксплуатации и поддержки системы; \nнеобходимую безопасность. \nПроизводительность является главным фактором, определяющим эффективность системы. Хорошее проектное решение служит основой высокопроизводительной системы.\nПроектирование информационных систем охватывает три основные области:\nпроектирование объектов данных, которые будут реализованы в базе данных; \nпроектирование программ, экранных форм, отчетов, которые будут обеспечивать выполнение запросов к данным; \nучет конкретной среды или технологии, а именно: топологии сети, конфигурации аппаратных средств, используемой архитектуры (файл-сервер или клиент-сервер), параллельной обработки, распределенной обработки данных и т.п. \nВ реальных условиях проектирование - это поиск способа, который удовлетворяет требованиям функциональности системы средствами имеющихся технологий с учетом заданных ограничений.\nК любому проекту предъявляется ряд абсолютных требований, например максимальное время разработки проекта, максимальные денежные вложения в проект и т.д. Одна из сложностей проектирования состоит в том, что оно не является такой структурированной задачей, как анализ требований к проекту или реализация того или иного проектного решения.\nСчитается, что сложную систему невозможно описать в принципе. Это, в частности, касается систем управления предприятием. Одним из основных аргументов является изменение условий функционирования системы, например директивное изменение тех или иных потоков информации новым руководством. Еще один аргумент - объемы технического задания, которые для крупного проекта могут составлять сотни страниц, в то время как технический проект может содержать ошибки. Возникает вопрос: а может, лучше вообще не проводить обследования и не делать никакого технического проекта, а писать систему «с чистого листа» в надежде на то, что произойдет некое чудесное совпадение желания заказчика с тем, что написали программисты, а также на то, что все это будет стабильно работать?\nЕсли разобраться, то так ли уж непредсказуемо развитие системы и действительно ли получить информацию о ней невозможно? Вероятно, представление о системе в целом и о предполагаемых (руководством) путях ее развития можно получить посредством семинаров. После этого разбить сложную систему на более простые компоненты, упростить связи между компонентами, предусмотреть независимость компонентов и описать интерфейсы между ними (чтобы изменение одного компонента автоматически не влекло за собой существенного изменения другого компонента), а также возможности расширения системы и «заглушки» для нереализуемых в той или иной версии системы функций. Исходя из подобных элементарных соображений описание того, что предполагается реализовать в информационной системе, уже не кажется столь нереальным. Можно придерживаться классических подходов к разработке информационных систем, один из которых - схема «водопада» (рис. 1) - описан ниже. Кратко будут рассмотрены и некоторые другие подходы к разработке информационных систем, где использование элементов, описанных в схеме «водопада», также допустимо. Какого подхода из описываемых ниже придерживаться (и есть ли смысл придумывать собственный подход) - в какой-то мере дело вкуса и обстоятельств.\nЖизненный цикл программного обеспечения представляет собой модель его создания и использования. Модель отражает его различные состояния, начиная с момента возникновения необходимости в данном ПО и заканчивая моментом его полного выхода из употребления у всех пользователей. Известны следующие модели жизненного цикла:\nКаскадная модель. Переход на следующий этап означает полное завершение работ на предыдущем этапе. \nПоэтапная модель с промежуточным контролем. Разработка ПО ведется итерациями с циклами обратной связи между этапами. Межэтапные корректировки позволяют уменьшить трудоемкость процесса разработки по сравнению с каскадной моделью; время жизни каждого из этапов растягивается на весь период разработки. \nСпиральная модель. Особое внимание уделяется начальным этапам разработки - выработке стратегии, анализу и проектированию, где реализуемость тех или иных технических решений проверяется и обосновывается посредством создания прототипов (макетирования). Каждый виток спирали предполагает создание некой версии продукта или какого-либо его компонента, при этом уточняются характеристики и цели проекта, определяется его качество и планируются работы следующего витка спирали. \nНиже мы рассмотрим некоторые схемы разработки проекта.\n\n«Водопад» - схема разработки проекта\nОчень часто проектирование описывают как отдельный этап разработки проекта между анализом и разработкой. Однако в действительности четкого деления этапов разработки проекта нет - проектирование, как правило, не имеет явно выраженного начала и окончания и часто продолжается на этапах тестирования и реализации. Говоря об этапе тестирования, также следует отметить, что и этап анализа, и этап проектирования содержат элементы работы тестеров, например для получения экспериментального обоснования выбора того или иного решения, а также для оценки критериев качества получаемой системы. На этапе эксплуатации уместен разговор и о сопровождении системы.\nНиже мы рассмотрим каждый из этапов, подробнее остановившись на этапе проектирования.\n\nСтратегия\nОпределение стратегии предполагает обследование системы. Основная задача обследования - оценка реального объема проекта, его целей и задач, а также получение определений сущностей и функций на высоком уровне.\nНа этом этапе привлекаются высококвалифицированные бизнес-аналитики, которые имеют постоянный доступ к руководству фирмы; этап предполагает тесное взаимодействие с основными пользователями системы и бизнес-экспертами. Основная задача взаимодействия - получить как можно более полную информацию о системе (полное и однозначное понимание требований заказчика) и передать данную информацию в формализованном виде системным аналитикам для последующего проведения этапа анализа. Как правило, информация о системе может быть получена в результате бесед или семинаров с руководством, экспертами и пользователями. Таким образом определяются суть данного бизнеса, перспективы его развития и требования к системе.\nПо завершении основной стадии обследования системы технические специалисты формируют вероятные технические подходы и приблизительно рассчитывают затраты на аппаратное обеспечение, закупаемое программное обеспечение и разработку нового программного обеспечения (что, собственно, и предполагается проектом).\nРезультатом этапа определения стратегии является документ, где четко сформулировано, что получит заказчик, если согласится финансировать проект; когда он получит готовый продукт (график выполнения работ); сколько это будет стоить (для крупных проектов должен быть составлен график финансирования на разных этапах работ). В документе должны быть отражены не только затраты, но и выгода, например время окупаемости проекта, ожидаемый экономический эффект (если его удается оценить).\nВ документе обязательно должны быть описаны:\nограничения, риски, критические факторы, влияющие на успешность проекта, например время реакции системы на запрос является заданным ограничением, а не желательным фактором; \nсовокупность условий, при которых предполагается эксплуатировать будущую систему: архитектура системы, аппаратные и программные ресурсы, предоставляемые системе, внешние условия ее функционирования, состав людей и работ, которые обеспечивают бесперебойное функционирование системы; \nсроки завершения отдельных этапов, форма сдачи работ, ресурсы, привлекаемые в процессе разработки проекта, меры по защите информации; \nописание выполняемых системой функций; \nбудущие требования к системе в случае ее развития, например возможность работы пользователя с системой с помощью Интернета и т.п.; \nсущности, необходимые для выполнения функций системы; \nинтерфейсы и распределение функций между человеком и системой; \nтребования к программным и информационным компонентам ПО, требования к СУБД (если проект предполагается реализовывать для нескольких СУБД, то требования к каждой из них, или общие требования к абстрактной СУБД и список рекомендуемых для данного проекта СУБД, которые удовлетворяют заданным условиям); \nчто не будет реализовано в рамках проекта. \nВыполненная на данном этапе работа позволяет ответить на вопрос, стоит ли продолжать данный проект и какие требования заказчика могут быть удовлетворены при тех или иных условиях. Может оказаться, что проект продолжать не имеет смысла, например из-за того, что те или иные требования не могут быть удовлетворены по каким-то объективным причинам. Если принимается решение о продолжении проекта, то для проведения следующего этапа анализа уже имеются представление об объеме проекта и смета затрат.\nСледует отметить, что и на этапе выбора стратегии, и на этапе анализа, и при проектировании независимо от метода, применяемого при разработке проекта, всегда следует классифицировать планируемые функции системы по степени важности. Один из возможных форматов представления такой классификации - MoSCoW - предложен в Clegg, Dai and Richard Barker, Case Method Fast-track: A RAD Approach, Adison-Wesley, 1994.\nЭта аббревиатура расшифровывается так: Must have - необходимые функции; Should have - желательные функции; Could have - возможные функции; Won’t have - отсутствующие функции.\nФункции первой категории обеспечивают критичные для успешной работы системы возможности.\nРеализация функций второй и третьей категорий ограничивается временными и финансовыми рамками: разрабатываем то, что необходимо, а также максимально возможное в порядке приоритета число функций второй и третьей категорий.\nПоследняя категория функций особенно важна, поскольку необходимо четко представлять границы проекта и набор функций, которые будут отсутствовать в системе.\n\nАнализ\nЭтап анализа предполагает подробное исследование бизнес-процессов (функций, определенных на этапе выбора стратегии) и информации, необходимой для их выполнения (сущностей, их атрибутов и связей (отношений)). На этом этапе создается информационная модель, а на следующем за ним этапе проектирования - модель данных.\nВся информация о системе, собранная на этапе определения стратегии, формализуется и уточняется на этапе анализа. Особое внимание следует уделить полноте переданной информации, анализу информации на предмет отсутствия противоречий, а также поиску неиспользуемой вообще или дублирующейся информации. Как правило, заказчик не сразу формирует требования к системе в целом, а формулирует требования к отдельным ее компонентам. Уделите внимание согласованности этих компонентов.\nАналитики собирают и фиксируют информацию в двух взаимосвязанных формах:\nфункции - информация о событиях и процессах, которые происходят в бизнесе; \nсущности - информация о вещах, имеющих значение для организации и о которых что-то известно. \nДвумя классическими результатами анализа являются:\nиерархия функций, которая разбивает процесс обработки на составные части (что делается и из чего это состоит); \nмодель «сущность-связь» (Entry Relationship model, ER-модель), которая описывает сущности, их атрибуты и связи (отношения) между ними. \nЭти результаты являются необходимыми, но не достаточными. К достаточным результатам следует отнести диаграммы потоков данных и диаграммы жизненных циклов сущностей. Довольно часто ошибки анализа возникают при попытке показать жизненный цикл сущности на диаграмме ER.\nНиже мы рассмотрим три наиболее часто применяемые методологии структурного анализа:\nдиаграммы «сущность-связь» (Entity-Relationship Diagrams, ERD), которые служат для формализации информации о сущностях и их отношениях; \nдиаграммы потоков данных (Data Flow Diagrams, DFD), которые служат для формализации представления функций системы; \nдиаграммы переходов состояний (State Transition Diagrams, STD), которые отражают поведение системы, зависящее от времени; диаграммы жизненных циклов сущностей относятся именно к этому классу диаграмм. \n\nER-диаграммы\nER-диаграммы (рис. 2) используются для разработки данных и представляют собой стандартный способ определения данных и отношений между ними. Таким образом, осуществляется детализация хранилищ данных. ER-диаграмма содержит информацию о сущностях системы и способах их взаимодействия, включает идентификацию объектов, важных для предметной области (сущностей), свойств этих объектов (атрибутов) и их отношений с другими объектами (связей). Во многих случаях информационная модель очень сложна и содержит множество объектов.\nСущность изображается в виде прямоугольника, вверху которого располагается имя сущности (например, TITLES). В прямоугольнике могут быть перечислены атрибуты сущности; атрибуты ER-диаграмм, набранные полужирным шрифтом1, являются ключевыми (так Title Identity - ключевой атрибут сущности TITLES, остальные атрибуты ключевыми не являются).\nОтношение изображается линией между двумя сущностями (синие линии на рисунке).\nОдиночная линия справа (рис. 3) означает «один», «птичья лапка» слева - «многие», а отношение читается вдоль линии, например «один ко многим». Вертикальная черта означает «обязательно», кружок - «не обязательно», например для каждого издания в TITLE обязательно должен быть указан издатель в PUBLISHERS, а один издатель в PUBLISHERS может выпускать несколько наименований изданий в TITLES. Следует отметить, что связи всегда комментируются (надпись на линии, изображающей связь).\n\nРис. 3. Элемент ER-диаграммы\nПриведем также пример (рис. 4) изображения рефлексивного отношения «сотрудник», где один сотрудник может руководить несколькими подчиненными и так далее вниз по иерархии должностей.\nСледует обратить внимание на то, что такое отношение всегда является необязательным, в противном случае это будет бесконечная иерархия.\nАтрибуты сущностей могут быть ключевыми - они выделяются полужирным шрифтом; обязательными - перед ними ставится знак «*», то есть их значение всегда известно, необязательными (optional) - перед ними ставится О, то есть значения этого атрибута в какие-то моменты могут отсутствовать или быть неопределенными.\n\nДуги\nЕсли сущность имеет набор взаимоисключающих отношений с другими сущностями, то говорят, что такие отношения находятся в дуге. Например, банковский счет может быть оформлен или для юридического лица, или для физического лица. Фрагмент ER-диаграммы для такого типа отношений приведен на рис. 5.\nВ этом случае атрибут ВЛАДЕЛЕЦ сущности СЧЕТ имеет особое значение для данной сущности - сущность делится на типы по категориям: «для физического лица» и «для юридического лица». Полученные в результате сущности называют подтипами, а исходная сущность становится супертипом. Чтобы понять, нужен супертип или нет, надо установить, сколько одинаковых свойств имеют различные подтипы. Следует отметить, что злоупотребление подтипами и супертипами является довольно распространенной ошибкой. Изображают их так, как показано на рис. 6.\n\nНормализация\nЧтобы не допустить аномалий при обработке данных, используют нормализацию. Принципы нормализации для объектов информационной модели в точности такие же, как и для моделей данных.\nДопустимые типы связей. При ближайшем рассмотрении связи типа «один к одному» (рис. 7) почти всегда оказывается, что A и B представляют собой в действительности разные подмножества одного и того же предмета или разные точки зрения на него, просто имеющие отличные имена и по-разному описанные связи и атрибуты.\nСвязи «многие к одному» представлены на рис. 8.\nI - достаточно сильная конструкция, предполагающая, что вхождение сущности B не может быть создано без одновременного создания по меньшей мере одного связанного с ним вхождения сущности A.\nII - это наиболее часто встречающаяся форма связи. Она предполагает, что каждое и любое вхождение сущности A может существовать только в контексте одного (и только одного) вхождения сущности B. В свою очередь, вхождения B могут существовать как в связи с вхождениями A, так и без нее.\nIII - применяется редко. Как A, так и B могут существовать без связи между ними.\nСвязи «многие ко многим» представлены на рис. 9.\nI - такая конструкция часто имеет место в начале этапа анализа и означает связь - либо понятую не до конца и требующую дополнительного разрешения, либо отражающую простое коллективное отношение - двунаправленный список.\nII - применяется редко. Такие связи всегда подлежат дальнейшей детализации.\nРассмотрим теперь рекурсивные связи (рис. 10).\nI - редко, но имеет место. Отражает связи альтернативного типа.\nII - достаточно часто применяется для описания иерархий с любым числом уровней.\nIII - имеет место на ранних этапах. Часто отражает структуру «перечня материалов» (взаимная вложенность компонентов). Пример: каждый КОМПОНЕНТ может состоять из одного и более (других) КОМПОНЕНТОВ и каждый КОМПОНЕНТ может использоваться в одном и более (других) КОМПОНЕНТОВ.\nНедопустимые типы связей. К недопустимым типам связей относятся следующие: обязательная связь «многие ко многим» (рис. 11) и ряд рекурсивных связей (рис. 12).\nОбязательная связь «многие ко многим» в принципе невозможна. Такая связь означала бы, что ни одно из вхождений A не может существовать без B, и наоборот. На деле каждая подобная конструкция всегда оказывается ошибочной.\n\nДиаграммы потоков данных \nЛогическая DFD (рис. 13) показывает внешние по отношению к системе источники и стоки (адресаты) данных, идентифицирует логические функции (процессы) и группы элементов данных, связывающие одну функцию с другой (потоки), а также идентифицирует хранилища (накопители) данных, к которым осуществляется доступ. Структуры потоков данных и определения их компонентов хранятся и анализируются в словаре данных. Каждая логическая функция (процесс) может быть детализирована с помощью DFD нижнего уровня; когда дальнейшая детализация перестает быть полезной, переходят к выражению логики функции при помощи спецификации процесса (мини-спецификации). Содержимое каждого хранилища также сохраняют в словаре данных, модель данных хранилища раскрывается с помощью ER-диаграмм.\nВ частности, в DFD не показываются процессы, которые управляют собственно потоком данных и не приводятся различия между допустимыми и недопустимыми путями. DFD содержат множество полезной информации, а кроме того:\nпозволяют представить систему с точки зрения данных; \nиллюстрируют внешние механизмы подачи данных, которые потребуют наличия специальных интерфейсов; \nпозволяют представить как автоматизированные, так и ручные процессы системы; \nвыполняют ориентированное на данные секционирование всей системы. \nПотоки данных используются для моделирования передачи информации (или даже физических компонентов) из одной части системы в другую. Потоки на диаграммах изображаются именованными стрелками, стрелки указывают направление движения информации. Иногда информация может двигаться в одном направлении, обрабатываться и возвращаться в ее источник. Такая ситуация может моделироваться либо двумя различными потоками, либо одним двунаправленным.\nПроцесс преобразует входной поток данных в выходной в соответствии с действием, задаваемым именем процесса. Каждый процесс должен иметь уникальный номер для ссылок на него внутри диаграммы. Этот номер может использоваться совместно с номером диаграммы для получения уникального индекса процесса во всей модели.\nХранилище данных (data storage) позволяет на ряде участков определять данные, которые будут сохраняться в памяти между процессами. Фактически хранилище представляет «срезы» потоков данных во времени. Информацию, которую оно содержит, можно использовать в любое время после ее определения, при этом данные могут выбираться в произвольном порядке. Имя хранилища должно идентифицировать его содержимое. В случае когда поток данных входит (выходит) в (из) хранилище и его структура соответствует структуре хранилища, он должен иметь то же самое имя, которое нет необходимости отражать на диаграмме.\nВнешняя сущность (терминатор) представляет сущность вне контекста системы, являющуюся источником или приемником системных данных. Ее имя должно содержать существительное, например «Клиент». Предполагается, что объекты, представленные такими узлами, не должны участвовать ни в какой обработке.\n\nДиаграммы изменения состояний STD\nЖизненный цикл сущности относится к классу STD-диаграмм (рис. 14). Эта диаграмма отражает изменение состояния объекта с течением времени. Например, рассмотрим состояние товара на складе: товар может быть заказан у поставщика, поступить на склад, храниться на складе, проходить контроль качества, может быть продан, забракован, возвращен поставщику. Стрелки на диаграмме показывают допустимые изменения состояний.\nСуществует несколько различных вариантов изображения подобных диаграмм, на рисунке приведен лишь один из них.\n\nНекоторые принципы проверки качества и полноты информационной модели \n(источник - Richard Barker, Case Method: Entity Relationship Modelling, Addison-Wesley, 1990)\nЕсли вы хотите создать качественную модель, то придется прибегать к помощи аналитиков, хорошо владеющих CASE-технологией. Однако это не означает, что построением и контролем информационной модели должны заниматься только аналитики. Помощь коллег также может оказаться весьма полезной. Привлекайте их к проверке поставленной цели и к детальному изучению построенной модели как с точки зрения логики, так и с точки зрения учета аспектов предметной области. Большинство людей легче находят недостатки в чужой работе.\nРегулярно представляйте вашу информационную модель или ее отдельные фрагменты, относительно которых у вас возникают сомнения, на одобрение пользователей. Особое внимание уделяйте исключениям из правил и ограничениям.\n\nКачество сущностей\nОсновной гарантией качества сущности является ответ на вопрос, действительно ли объект является сущностью, то есть важным объектом или явлением, информация о котором должна храниться в базе данных.\nСписок проверочных вопросов для сущности:\nОтражает ли имя сущности суть данного объекта? \nНет ли пересечения с другими сущностями? \nИмеются ли хотя бы два атрибута? \nВсего атрибутов не более восьми? \nЕсть ли синонимы/омонимы данной сущности? \nСущность определена полностью? \nЕсть ли уникальный идентификатор? \nИмеется ли хотя бы одна связь? \nСуществует ли хотя бы одна функция по созданию, поиску, корректировке, удалению, архивированию и использованию значения сущности? \nВедется ли история изменений? \nИмеет ли место соответствие принципам нормализации данных? \nНет ли такой же сущности в другой прикладной системе, возможно, под другим именем? \nНе имеет ли сущность слишком общий смысл? \nДостаточен ли уровень обобщения, воплощенный в ней? \nСписок проверочных вопросов для подтипа:\nОтсутствуют ли пересечения с другими подтипами? \nИмеет ли подтип какие-нибудь атрибуты и/или связи? \nИмеют ли они все свои собственные уникальные идентификаторы или наследуют один на всех от супертипа? \nИмеется ли исчерпывающий набор подтипов? \nНе является ли подтип примером вхождения сущности? \nЗнаете ли вы какие-нибудь атрибуты, связи и условия, отличающие данный подтип от других? \n\nКачество атрибутов\nСледует выяснить, а действительно ли это атрибуты, то есть описывают ли они тем или иным образом данную сущность.\nСписок проверочных вопросов для атрибута:\nЯвляется ли наименование атрибута существительным единственного числа, отражающим суть обозначаемого атрибутом свойства? \nНе включает ли в себя наименование атрибута имя сущности (этого быть не должно)? \nИмеет ли атрибут только одно значение в каждый момент времени? \nОтсутствуют ли повторяющиеся значения (или группы)? \nОписаны ли формат, длина, допустимые значения, алгоритм получения и т.п.? \nНе может ли этот атрибут быть пропущенной сущностью, которая пригодилась бы для другой прикладной системы (уже существующей или предполагаемой)? \nНе может ли он быть пропущенной связью? \nНет ли где-нибудь ссылки на атрибут как на «особенность проекта», которая при переходе на прикладной уровень должна исчезнуть? \nЕсть ли необходимость в истории изменений? \nЗависит ли его значение только от данной сущности? \nЕсли значение атрибута является обязательным, всегда ли оно известно? \nЕсть ли необходимость в создании домена для этого и ему подобных атрибутов? \nЗависит ли его значение только от какой-то части уникального идентификатора? \nЗависит ли его значение от значений некоторых атрибутов, не включенных в уникальный идентификатор? \n\nКачество связи\nНужно выяснить, отражают ли связи действительно важные отношения, наблюдаемые между сущностями.\nСписок проверочных вопросов для связи:\nИмеется ли ее описание для каждой участвующей стороны, точно ли оно отражает содержание связи и вписывается ли в принятый синтаксис? \nУчаствуют ли в ней только две стороны? \nНе является ли связь переносимой?\nЗаданы ли степень связи и обязательность для каждой стороны? \nДопустима ли конструкция связи? \nНе относится ли конструкция связи к редко используемым?\nНе является ли она избыточной? \nНе изменяется ли она с течением времени? \nЕсли связь обязательная, всегда ли она отражает отношение к сущности, представляющей противоположную сторону? \nДля исключающей связи:\nВсе ли концы связей, покрываемые исключающей дугой, имеют один и тот же тип обязательности? \nВсе ли из них относятся к одной и той же сущности? \nОбычно дуги пересекают разветвляющиеся концы - что вы можете сказать о данном случае? \nСвязь может покрываться только одной дугой. Так ли это? \nВсе ли концы связей, покрываемые дугой, входят в уникальный идентификатор? \n\nФункции системы\nЧасто аналитикам приходится описывать достаточно сложные бизнес-процессы. В этом случае прибегают к функциональной декомпозиции, которая показывает разбиение одного процесса на ряд более мелких функций до тех пор, пока каждую из них уже нельзя будет разбить без ущерба для смысла. Конечный продукт декомпозиции представляет собой иерархию функций, на самом нижнем уровне которой находятся атомарные с точки зрения смысловой нагрузки функции. Приведем простой пример (рис. 15) такой декомпозиции. Рассмотрим простейшую задачу выписки счета клиенту при отпуске товара со склада при условии, что набор товаров, которые хочет приобрести клиент, уже известен (не будем рассматривать в данном примере задачу выбора товаров).\nОчевидно, что операция выбора и расчета скидок может быть также разбита на более мелкие операции, например на расчет скидок за приверженность (клиент покупает товары в течение долгого времени) и на расчет скидок за количество покупаемого товара. Атомарные функции описываются подробно, например с помощью DFD и STD. Очевидно, что такое описание функций не исключает и дополнительное словесное описание (например, комментарии).\nСледует отметить, что на этапе анализа следует уделить внимание функциям анализа и обработки возможных ошибок и отклонений от предполагаемого эталона работы системы. Следует выделить наиболее критичные для работы системы процессы и обеспечить для них особенно строгий анализ ошибок. Обработка ошибок СУБД (коды возврата), как правило, представляет собой обособленный набор функций или одну-единственную функцию.\n\nУточнение стратегии\nНа этапе анализа происходит уточнение выбранных для конечной реализации аппаратных и программных средств. Для этого могут привлекаться группы тестирования, технические специалисты. При проектировании информационной системы важно учесть и дальнейшее развитие системы, например рост объемов обрабатываемых данных, увеличение интенсивности потока запросов, изменение требований надежности информационной системы.\nНа этапе анализа определяются наборы моделей задач для получения сравнительных характеристик тех или иных СУБД, которые рассматривались на этапе определения стратегии для реализации информационной системы. На этапе определения стратегии может быть осуществлен выбор одной СУБД. Данных о системе на этапе анализа уже намного больше, и они более подробны. Полученные данные, а также характеристики, переданные группами тестирования, могут показать, что выбор СУБД на этапе определения стратегии был неверным и что выбранная СУБД не может удовлетворять тем или иным требованиям информационной системы. Такие же данные могут быть получены относительно выбора аппаратной платформы и операционной системы. Получение подобных результатов инициирует изменение данных, полученных на этапе определения стратегии, например пересчитывается смета затрат на проект.\nВыбор средств разработки также уточняется на этапе анализа. В силу того что этап анализа дает более полное представление об информационной системе, чем оно было на этапе определения стратегии, план работ может быть скорректирован. Если выбранное на предыдущем этапе средство разработки не позволяет выполнить ту или иную часть работ в заданный срок, то принимается решение об изменении сроков (как правило, это увеличение срока разработки) или о смене средства разработки. Осуществляя выбор тех или иных средств, следует учитывать наличие высококвалифицированного персонала, который владеет выбранными средствами разработки, а также наличие администраторов выбранной СУБД. Эти рекомендации также будут уточнять данные этапа выбора стратегии (совокупность условий, при которых предполагается эксплуатировать будущую систему).\nУточняются также ограничения, риски, критические факторы. Если какие-либо требования не могут быть удовлетворены в информационной системе, реализованной с использованием СУБД и программных средств, выбранных на этапе определения стратегии, то это также инициирует уточнение и изменение получаемых данных (в конечном итоге сметы затрат и планов работ, а возможно, и изменение требований заказчика к системе, например их ослабление). Более подробно описываются те возможности, которые не будут реализованы в системе.\n",
|
||
"1",
|
||
"[['этап', 'разработка_проект', 'стратегия', 'анализ', 'введение', 'проектирование', 'информационный_система', 'начинаться', 'определение', 'цель', 'проект'], ['основный', 'задача', 'успешный', 'проект', 'заключаться', 'момент', 'запуск', 'система', 'течение', 'время', 'эксплуатация', 'обеспечить', 'требуемую', 'функциональность', 'система', 'степень', 'адаптация', 'изменяться', 'условие', 'функционирование', 'требуемую', 'пропускной', 'способность', 'система', 'требуемое', 'время', 'реакция', 'система', 'запрос', 'безотказный', 'работа', 'система', 'требовать', 'режим', 'слово', 'готовность', 'доступность', 'система', 'обработка', 'запрос', 'пользователь', 'простота', 'эксплуатация', 'поддержка', 'система', 'необходимый', 'безопасность'], ['производительность', 'являться', 'главный', 'фактор', 'определять', 'эффективность', 'система'], ['хороший', 'проектный', 'решение', 'служить', 'основа', 'высокопроизводительный', 'система'], ['проектирование', 'информационный_система', 'охватывать', 'три', 'основный', 'область', 'проектирование', 'объект', 'реализовать', 'база', 'проектирование', 'программа', 'экранный', 'форма', 'отчёт', 'обеспечивать', 'выполнение', 'запрос', 'данным', 'учёт', 'конкретный', 'среда', 'технология', 'топология', 'сеть', 'конфигурация', 'аппаратный', 'средство', 'использовать', 'архитектура', 'файл', 'сервер', 'клиент', 'сервер', 'параллельный', 'обработка', 'распределить', 'обработка', 'т.п.', 'реальный', 'условие', 'проектирование', 'поиск', 'способ', 'удовлетворять', 'требование', 'функциональность', 'система', 'средство', 'иметься', 'технология', 'учёт', 'задать', 'ограничение'], ['любой', 'проект', 'предъявляться', 'ряд', 'абсолютный', 'требование', 'максимальный', 'время', 'разработка_проект', 'максимальный', 'денежный', 'вложение', 'проект', 'т.д.'], ['сложность', 'проектирование', 'состоять', 'являться', 'структурировать', 'задача', 'анализ', 'требование', 'проект', 'реализация', 'иного', 'проектный', 'решение'], ['считаться', 'сложный', 'система', 'невозможный', 'описать', 'принцип'], ['частность', 'касаться', 'система', 'управление', 'предприятие'], ['основный', 'аргумент', 'являться', 'изменение', 'условие', 'функционирование', 'система', 'директивный', 'изменение', 'иных', 'поток', 'информация', 'новый', 'руководство'], ['аргумент', 'объём', 'технический', 'задание', 'крупный', 'проект', 'составлять', 'сотня', 'страница', 'время', 'технический', 'проект', 'содержать', 'ошибка'], ['возникать', 'вопрос', 'хороший', 'проводить', 'обследование', 'делать', 'никакой', 'технический', 'проект', 'писать', 'система', 'чистый', 'лист', 'надежда', 'произойти', 'некий', 'чудесный', 'совпадение', 'желание', 'заказчик', 'написать', 'программист', 'стабильно', 'работать'], ['разобраться', 'непредсказуемый', 'развитие', 'система', 'получить', 'информация', 'невозможный'], ['вероятно', 'представление', 'система', 'целое', 'предполагать', 'руководство', 'путь', 'развитие', 'получить', 'семинар'], ['разбить', 'сложный', 'система', 'простой', 'компонент', 'упростить', 'связь', 'компонент', 'предусмотреть', 'независимость', 'компонент', 'описать', 'интерфейс', 'изменение', 'компонент', 'автоматически', 'влечь', 'существенный', 'изменение', 'другого', 'компонент', 'возможность', 'расширение', 'система', 'заглушка', 'нереализуемых', 'иной', 'версия', 'система', 'функция'], ['исходить', 'элементарный', 'соображение', 'описание', 'предполагаться', 'реализовать', 'информационный_система', 'столь', 'нереальный'], ['придерживаться', 'классический', 'подход', 'разработка', 'информационный_система', 'схема', 'водопад', 'рис'], ['1', 'описать'], ['кратко', 'рассмотреть', 'подход', 'разработка', 'информационный_система', 'использование', 'элемент', 'описать', 'схема', 'водопад', 'допустимый'], ['подход', 'описывать', 'придерживаться', 'смысл', 'придумывать', 'собственный', 'подход', 'мера', 'дело', 'вкус', 'обстоятельство'], ['жизненный_цикл', 'программный', 'обеспечение', 'представлять', 'модель', 'создание', 'использование'], ['модель', 'отражать', 'различный', 'состояние', 'начинать', 'момент', 'возникновение', 'заканчивать', 'момент', 'полный', 'выход', 'употребление', 'пользователь'], ['известный', 'следующий', 'модель', 'жизненный_цикл', 'каскадный', 'модель'], ['переход', 'следующий', 'этап', 'означать', 'полный', 'завершение', 'работа', 'предыдущий', 'этап'], ['поэтапный', 'модель', 'промежуточный', 'контроль'], ['разработка', 'вестись', 'итерация', 'цикл', 'обратный', 'связь', 'этап'], ['межэтапный', 'корректировка', 'позволять', 'уменьшить', 'трудоёмкость', 'процесс', 'разработка', 'сравнение', 'каскадный', 'модель', 'время', 'жизнь', 'каждый', 'этап', 'растягиваться', 'период', 'разработка'], ['спиральный', 'модель'], ['особый', 'внимание', 'уделяться', 'начальный', 'этап', 'разработка', 'выработка', 'стратегия', 'анализ', 'проектирование', 'реализуемость', 'иных', 'технический', 'решение', 'проверяться', 'обосновываться', 'создание', 'прототип', 'макетирование'], ['виток', 'спираль', 'предполагать', 'создание', 'некий', 'версия', 'продукт', 'компонент', 'уточняться', 'характеристика', 'цель', 'проект', 'определяться', 'качество', 'планироваться', 'работа', 'следующий', 'виток', 'спираль'], ['рассмотреть', 'схема', 'разработка_проект'], ['водопад', 'схема', 'разработка_проект', 'проектирование', 'описывать', 'отдельный', 'этап', 'разработка_проект', 'анализ', 'разработка'], ['действительность', 'чёткий', 'деление', 'этап', 'разработка_проект', 'проектирование', 'правило', 'выразить', 'окончание', 'продолжаться', 'этап', 'тестирование', 'реализация'], ['говорить', 'этап', 'тестирование', 'отметить', 'этап_анализ', 'этап', 'проектирование', 'содержать', 'элемент', 'работа', 'тестер', 'получение', 'экспериментальный', 'обоснование', 'выбор', 'иного', 'решение', 'оценка', 'критерий', 'качество', 'получать', 'система'], ['этап', 'эксплуатация', 'уместный', 'разговор', 'сопровождение', 'система'], ['рассмотреть', 'этап', 'подробный', 'остановиться', 'этап', 'проектирование'], ['стратегия', 'определение_стратегия', 'предполагать', 'обследование', 'система'], ['основный', 'задача', 'обследование', 'оценка', 'реальный', 'объём', 'проект', 'цель', 'задача', 'получение', 'определение', 'сущность', 'функция', 'высокий', 'уровень'], ['этап', 'привлекаться', 'высококвалифицированный', 'бизнес', 'аналитики', 'иметь', 'постоянный', 'доступ', 'руководство', 'фирма', 'этап', 'предполагать', 'тесный', 'взаимодействие', 'основный', 'пользователь', 'система', 'бизнес', 'экспертами'], ['основный', 'задача', 'взаимодействие', 'получить', 'полный', 'информация', 'система', 'полный', 'однозначный', 'понимание', 'требование', 'заказчик', 'передать', 'данную', 'информация', 'формализованный', 'вид', 'системный', 'аналитик', 'последующий', 'проведение', 'этап_анализ'], ['правило', 'информация', 'система', 'получить', 'результат', 'беседа', 'семинар', 'руководство', 'эксперт', 'пользователь'], ['образ', 'определяться', 'бизнес', 'перспектива', 'развитие', 'требование', 'система'], ['завершение', 'основный', 'стадия', 'обследование', 'система', 'технический', 'специалист', 'формировать', 'вероятный', 'технический', 'подход', 'приблизительно', 'рассчитывать', 'затрата', 'аппаратный', 'обеспечение', 'закупать', 'программный', 'обеспечение', 'разработка', 'новый', 'программный', 'обеспечение', 'предполагаться', 'проект'], ['результат', 'этап_определение', 'стратегия', 'являться', 'документ', 'четко', 'сформулировать', 'получить', 'заказчик', 'согласиться', 'финансировать', 'проект', 'получить', 'готовый', 'продукт', 'график', 'выполнение', 'работа', 'стоить', 'крупный', 'проект', 'составить', 'график', 'финансирование', 'разный', 'этап', 'работа'], ['документ', 'отразить', 'затрата', 'выгода', 'время', 'окупаемость', 'проект', 'ожидать', 'экономический', 'эффект', 'удаваться', 'оценить'], ['документ', 'обязательно', 'описать', 'ограничение', 'риск', 'критический', 'фактор', 'влиять', 'успешность', 'проект', 'время', 'реакция', 'система', 'запрос', 'являться', 'задать', 'ограничение', 'желательный', 'фактор', 'совокупность', 'условие', 'предполагаться', 'эксплуатировать', 'будущий', 'система', 'архитектура', 'система', 'аппаратный', 'программный', 'ресурс', 'предоставлять', 'система', 'внешний', 'условие', 'функционирование', 'состав', 'человек', 'работа', 'обеспечивать', 'бесперебойный', 'функционирование', 'система', 'срок', 'завершение', 'отдельный', 'этап', 'форма', 'сдача', 'работа', 'ресурс', 'привлекать', 'процесс', 'разработка_проект', 'мера', 'защита', 'информация', 'описание', 'выполнять', 'система', 'функция', 'будущий', 'требование', 'система', 'случай', 'развитие', 'возможность', 'работа', 'пользователь', 'система', 'помощь', 'интернет', 'т.п.', 'сущность', 'выполнение', 'функция', 'система', 'интерфейс', 'распределение', 'функция', 'человек', 'система', 'требование', 'программный', 'информационный', 'компонент', 'требование', 'субд', 'проект', 'предполагаться', 'реализовывать', 'несколько', 'субд', 'требование', 'каждый', 'общий', 'требование', 'абстрактный', 'субд', 'список', 'рекомендовать', 'проект', 'субд', 'удовлетворять', 'задать', 'условие', 'реализовать', 'рамка', 'проект'], ['выполнить', 'этап', 'работа', 'позволять', 'ответить', 'вопрос', 'стоить', 'продолжать', 'проект', 'требование', 'заказчик', 'удовлетворить', 'иных', 'условие'], ['оказаться', 'проект', 'продолжать', 'смысл', 'иные', 'требование', 'удовлетворить', 'объективный', 'причина'], ['приниматься', 'решение', 'продолжение', 'проект', 'проведение', 'следующий', 'этап_анализ', 'иметься', 'представление', 'объём', 'проект', 'смета', 'затрата'], ['отметить', 'этап', 'выбор', 'стратегия', 'этап_анализ', 'проектирование', 'независимо', 'метод', 'применяемого', 'разработка_проект', 'классифицировать', 'планировать', 'функция', 'система', 'степень', 'важность'], ['возможный', 'формат', 'представление', 'классификация', 'moscow', 'предложить', 'clegg', 'dai', 'and', 'richard', 'barker', 'case', 'method', 'fast', 'track', 'a', 'rad', 'approach', 'adison', 'wesley', '1994'], ['аббревиатура', 'расшифровываться', 'must', 'have', 'функция', 'should', 'have', 'желательный', 'функция', 'could', 'have', 'возможный', 'функция', 'won’t', 'have', 'отсутствовать', 'функция'], ['функция', 'первый', 'категория', 'обеспечивать', 'критичный', 'успешный', 'работа', 'система', 'возможность'], ['реализация', 'функция', 'второй', 'третий', 'категория', 'ограничиваться', 'временной', 'финансовый', 'рамка', 'разрабатывать', 'максимально', 'возможный', 'порядок', 'приоритет', 'число', 'функция', 'второй', 'третий', 'категория'], ['последний', 'категория', 'функция', 'важный', 'четко', 'представлять', 'граница', 'проект', 'набор', 'функция', 'отсутствовать', 'система'], ['анализ', 'этап_анализ', 'предполагать', 'подробный', 'исследование', 'бизнес', 'процессов', 'функция', 'определить', 'этап', 'выбор', 'стратегия', 'информация', 'необходимый', 'выполнение', 'сущность', 'атрибут', 'связь', 'отношение'], ['этап', 'создаваться', 'информационный', 'модель', 'следующий', 'этап', 'проектирование', 'модель'], ['информация', 'система', 'собрать', 'этап_определение', 'стратегия', 'формализоваться', 'уточняться', 'этап_анализ'], ['особый', 'внимание', 'уделить', 'полнота', 'передать', 'информация', 'анализ', 'информация', 'предмет', 'отсутствие', 'противоречие', 'поиск', 'неиспользуемой', 'дублирующейся', 'информация'], ['правило', 'заказчик', 'формировать', 'требование', 'система', 'целое', 'формулировать', 'требование', 'отдельный', 'компонент'], ['уделить', 'внимание', 'согласованность', 'компонент'], ['аналитик', 'собирать', 'фиксировать', 'информация', 'два', 'взаимосвязанный', 'форма', 'функция', 'информация', 'событие', 'процесс', 'происходить', 'бизнес', 'сущность', 'информация', 'вещь', 'иметь', 'значение', 'организация', 'известный'], ['два', 'классический', 'результат', 'анализ', 'являться', 'иерархия', 'функция', 'разбивать', 'процесс', 'обработка', 'составной', 'часть', 'делаться', 'состоять', 'модель', 'сущность', 'связь', 'entry', 'relationship', 'model', 'er', 'модель', 'описывать', 'сущность', 'атрибут', 'связь', 'отношение'], ['результат', 'являться', 'необходимый', 'достаточный'], ['достаточный', 'результат', 'отнести', 'диаграмма', 'поток', 'диаграмма', 'жизненный_цикл', 'сущность'], ['ошибка', 'анализ', 'возникать', 'попытка', 'показать', 'жизненный_цикл', 'сущность', 'диаграмма', 'er'], ['рассмотреть', 'три', 'применять', 'методология', 'структурный', 'анализ', 'диаграмма', 'сущность', 'связь', 'entity', 'relationship', 'diagrams', 'erd', 'служить', 'формализация', 'информация', 'сущность', 'отношение', 'диаграмма', 'поток', 'data', 'flow', 'diagrams', 'dfd', 'служить', 'формализация', 'представление', 'функция', 'система', 'диаграмма', 'переход', 'состояние', 'state', 'transition', 'diagrams', 'std', 'отражать', 'поведение', 'система', 'зависеть', 'время', 'диаграмма', 'жизненный_цикл', 'сущность', 'относиться', 'класс', 'диаграмма'], ['er'], [], ['диаграмма', 'er_диаграмма', 'рис'], ['2', 'использоваться', 'разработка', 'представлять', 'стандартный', 'способ', 'определение', 'отношение'], ['образ', 'осуществляться', 'детализация', 'хранилище'], ['er_диаграмма', 'содержать', 'информация', 'сущность', 'система', 'способ', 'взаимодействие', 'включать', 'идентификация', 'объект', 'важный', 'предметный', 'область', 'сущность', 'свойство', 'объект', 'атрибут', 'отношение', 'объект', 'связь'], ['многих', 'случай', 'информационный', 'модель', 'сложный', 'содержать', 'множество', 'объект'], ['сущность', 'изображаться', 'вид', 'прямоугольник', 'вверху', 'располагаться', 'имя', 'сущность', 'titles'], ['прямоугольник', 'перечислить', 'атрибут', 'сущность', 'атрибут', 'er_диаграмма', 'набрать', 'полужирным', 'шрифтом1', 'являться', 'ключевой', 'title', 'identity', 'ключевой', 'атрибут', 'сущность', 'titles', 'остальные', 'атрибут', 'ключевой', 'являться'], ['отношение', 'изображаться', 'линия', 'два', 'сущность', 'синий', 'линия', 'рисунок'], ['одиночный', 'линия', 'справа', 'рис'], ['3', 'означать', 'птичий', 'лапка', 'слева', 'отношение', 'читаться', 'вдоль', 'линия', 'многим'], ['вертикальный', 'черта', 'означать', 'обязательно', 'кружок', 'обязательно', 'каждый', 'издание', 'title', 'обязательно', 'указать', 'издатель', 'publishers', 'издатель', 'publishers', 'выпускать', 'наименование', 'издание', 'titles'], ['отметить', 'связь', 'комментироваться', 'надпись', 'линия', 'изображать', 'связь'], ['рис'], ['3'], ['элемент', 'er_диаграмма', 'привести', 'пример', 'рис'], ['4'], ['изображение', 'рефлексивный', 'отношение', 'сотрудник', 'сотрудник', 'руководить', 'несколько', 'подчиненными', 'иерархия', 'должность'], ['обратить', 'внимание', 'отношение', 'являться', 'необязательный', 'противный', 'случай', 'бесконечный', 'иерархия'], ['атрибут', 'сущность', 'ключевой', 'выделяться', 'полужирным', 'шрифт', 'обязательный', 'ставиться', 'знак', 'значение', 'известный', 'необязательный', 'optional', 'ставиться', 'значение', 'атрибут', 'момент', 'отсутствовать', 'неопределённый'], ['дуги', 'сущность', 'набор', 'взаимоисключающих', 'отношение', 'сущность', 'говорить', 'отношение', 'находиться', 'дуга'], ['банковский', 'счёт', 'оформить', 'юридический', 'лицо', 'физический', 'лицо'], ['фрагмент', 'er_диаграмма', 'тип', 'отношение', 'привести', 'рис'], ['5'], ['случай', 'атрибут', 'владелец', 'сущность', 'счёт', 'особый', 'значение', 'сущность', 'сущность', 'делиться', 'тип', 'категория', 'физический', 'лицо', 'юридический', 'лицо'], ['получить', 'результат', 'сущность', 'называть', 'подтип', 'исходный', 'сущность', 'становиться', 'супертипом'], ['понять', 'нужный', 'супертип', 'установить', 'одинаковый', 'свойство', 'иметь', 'различный', 'подтип'], ['отметить', 'злоупотребление', 'подтип', 'супертипами', 'являться', 'распространенной', 'ошибка'], ['изображать', 'показать', 'рис'], ['6'], ['нормализация', 'допустить', 'аномалия', 'обработка', 'использовать', 'нормализация'], ['принцип', 'нормализация', 'объект', 'информационный', 'модель', 'точность', 'модель'], ['допустимый', 'тип', 'связь'], ['близкий', 'рассмотрение', 'связь', 'тип', 'рис'], ['7', 'оказываться', 'a', 'b', 'представлять', 'действительность', 'разный', 'подмножество', 'предмет', 'разный', 'точка', 'зрение', 'иметь', 'отличный', 'имя', 'разный', 'описать', 'связь', 'атрибут'], ['связь', 'представить', 'рис'], ['8'], ['i', 'достаточно', 'сильный', 'конструкция', 'предполагать', 'вхождение', 'сущность', 'b', 'создать', 'одновременный', 'создание', 'малый', 'мера', 'связать', 'вхождение', 'сущность', 'a.', 'ii', 'встречаться', 'форма', 'связь'], ['предполагать', 'вхождение', 'сущность', 'a', 'существовать', 'контекст', 'вхождение', 'сущность', 'b.', 'очередь', 'вхождение', 'b', 'существовать', 'связь', 'вхождениями', 'a'], ['iii', 'применяться', 'редко'], ['a', 'b', 'существовать', 'связь'], ['связь', 'многим', 'представить', 'рис'], ['9'], ['i', 'конструкция', 'место', 'этап_анализ', 'означать', 'связь', 'понять', 'конец', 'требовать', 'дополнительный', 'разрешение', 'отражать', 'простой', 'коллективный', 'отношение', 'двунаправленный', 'список'], ['ii', 'применяться', 'редко'], ['связь', 'подлежать', 'дальнейший', 'детализация'], ['рассмотреть', 'рекурсивные', 'связь', 'рис', '10'], ['i', 'редко', 'место'], ['отражать', 'связь', 'альтернативный', 'тип'], ['ii', 'достаточно', 'применяться', 'описание', 'иерархия', 'любой', 'число', 'уровень'], ['iii', 'место', 'ранний', 'этап'], ['отражать', 'структура', 'перечень', 'материал', 'взаимный', 'вложенность', 'компонент'], ['пример', 'компонент', 'состоять', 'компонентов', 'компонент', 'использоваться', 'компонентов', 'недопустимые', 'тип', 'связь'], ['недопустимый', 'тип', 'связь', 'относиться', 'следующий', 'обязательный', 'связь', 'многим', 'рис'], ['11'], ['ряд', 'рекурсивный', 'связь', 'рис'], ['12'], ['обязательный', 'связь', 'многим', 'принцип', 'невозможный'], ['связь', 'означать', 'ни', 'вхождение', 'a', 'существовать', 'b'], ['дело', 'конструкция', 'оказываться', 'ошибочный'], ['диаграмма', 'поток', 'логический', 'dfd', 'рис'], ['13', 'показывать', 'внешний', 'отношение', 'система', 'источник', 'сток', 'адресат', 'идентифицировать', 'логический', 'функция', 'процесс', 'группа', 'элемент', 'связывать', 'функция', 'поток', 'идентифицировать', 'хранилище', 'накопитель', 'осуществляться', 'доступ'], ['структура', 'поток', 'определение', 'компонент', 'храниться', 'анализироваться', 'словарь'], ['логический', 'функция', 'процесс', 'детализирована', 'помощь', 'dfd', 'нижний', 'уровень', 'дальнейший', 'детализация', 'переставать', 'полезный', 'переходить', 'выражение', 'логика', 'функция', 'помощь', 'спецификация', 'процесс', 'мини', 'спецификация'], ['содержимое', 'каждый', 'хранилище', 'сохранять', 'словарь', 'модель', 'хранилище', 'раскрываться', 'помощь', 'er_диаграмма'], ['частность', 'dfd', 'показываться', 'процесс', 'управлять', 'поток', 'приводиться', 'различие', 'допустимый', 'недопустимый', 'путь'], ['dfd', 'содержать', 'множество', 'полезный', 'информация', 'позволять', 'представить', 'система', 'точка', 'зрение', 'иллюстрировать', 'внешний', 'механизм', 'подача', 'потребовать', 'наличие', 'специальный', 'интерфейс', 'позволять', 'представить', 'автоматизированный', 'ручной', 'процесс', 'система', 'выполнять', 'ориентировать', 'секционирование', 'система'], ['поток', 'использоваться', 'моделирование', 'передача', 'информация', 'физический', 'компонент', 'часть', 'система', 'другую'], ['поток', 'диаграмма', 'изображаться', 'именованными', 'стрелок', 'стрелка', 'указывать', 'направление', 'движение', 'информация'], ['информация', 'двигаться', 'направление', 'обрабатываться', 'возвращаться', 'источник'], ['ситуация', 'моделироваться', 'два', 'различный', 'поток', 'двунаправленным'], ['процесс', 'преобразует', 'входной', 'поток', 'выходной', 'соответствие', 'действие', 'задавать', 'имя', 'процесс'], ['процесс', 'уникальный', 'номер', 'ссылка', 'внутри', 'диаграмма'], ['номер', 'использоваться', 'совместно', 'номер', 'диаграмма', 'получение', 'уникальный', 'индекс', 'процесс', 'модель'], ['хранилище', 'data', 'storage', 'позволять', 'ряд', 'участок', 'определять', 'сохраняться', 'память', 'процесс'], ['фактически', 'хранилище', 'представлять', 'срез', 'поток', 'время'], ['информация', 'содержать', 'использовать', 'время', 'определение', 'выбираться', 'произвольный', 'порядок'], ['имя', 'хранилище', 'идентифицировать', 'содержимое'], ['случай', 'поток', 'входить', 'выходить', 'хранилище', 'структура', 'соответствовать', 'структура', 'хранилище', 'имя', 'отражать', 'диаграмма'], ['внешний', 'сущность', 'терминатор', 'представлять', 'сущность', 'контекст', 'система', 'являться', 'источник', 'приёмник', 'системный'], ['имя', 'содержать', 'существительное', 'клиент'], ['предполагаться', 'объект', 'представить', 'узел', 'участвовать', 'ни', 'обработка'], ['диаграмма', 'изменение', 'состояние', 'std', 'жизненный_цикл', 'сущность', 'относиться', 'класс', 'std', 'диаграмма', 'рис', '14'], ['диаграмма', 'отражать', 'изменение', 'состояние', 'объект', 'течение', 'время'], ['рассмотреть', 'состояние', 'товар', 'склад', 'товар', 'заказать', 'поставщик', 'поступить', 'склад', 'храниться', 'склад', 'проходить', 'контроль', 'качество', 'продать', 'забраковать', 'возвратить', 'поставщик'], ['стрелка', 'диаграмма', 'показывать', 'допустимый', 'изменение', 'состояние'], ['существовать', 'различный', 'вариант', 'изображение', 'диаграмма', 'рисунок', 'привести'], ['принцип', 'проверка', 'качество', 'полнота', 'информационный', 'модель', 'источник', 'richard', 'barker', 'case', 'method', 'entity', 'relationship', 'modelling', 'addison', 'wesley', '1990', 'хотеть', 'создать', 'качественный', 'модель', 'прийтись', 'прибегать', 'помощь', 'аналитик', 'владеть', 'case', 'технология'], ['означать', 'построение', 'контроль', 'информационный', 'модель', 'заниматься', 'аналитик'], ['помощь', 'коллега', 'оказаться', 'весьма', 'полезный'], ['привлекать', 'проверка', 'поставить', 'цель', 'детальный', 'изучение', 'построить', 'модель', 'точка', 'зрение', 'логика', 'точка', 'зрение', 'учёт', 'аспект', 'предметный', 'область'], ['большинство', 'человек', 'лёгкий', 'находить', 'недостаток', 'чужой', 'работа'], ['регулярно', 'представлять', 'ваш', 'информационный', 'модель', 'отдельный', 'фрагмент', 'относительно', 'возникать', 'сомнение', 'одобрение', 'пользователь'], ['особый', 'внимание', 'уделять', 'исключение', 'правило', 'ограничение'], ['качество', 'сущность', 'основный', 'гарантия', 'качество', 'сущность', 'являться', 'ответ', 'вопрос', 'объект', 'являться', 'сущность', 'важный', 'объект', 'явление', 'информация', 'храниться', 'база'], ['список', 'проверочный', 'вопрос', 'сущность', 'отражать', 'имя', 'сущность', 'объект'], ['пересечение', 'сущностями'], ['имеются', 'два', 'атрибут'], ['атрибут', 'восемь'], ['синоним', 'омоним', 'сущность'], ['сущность', 'определить', 'полностью'], ['уникальный', 'идентификатор'], ['иметься', 'связь'], ['существовать', 'функция', 'создание', 'поиск', 'корректировка', 'удаление', 'архивирование', 'использование', 'значение', 'сущность'], ['вестись', 'история', 'изменение'], ['место', 'соответствие', 'принцип', 'нормализация'], ['сущность', 'прикладной', 'система', 'имя'], ['сущность', 'общий', 'смысл'], ['достаточный', 'уровень', 'обобщение', 'воплотить'], ['список', 'проверочный', 'вопрос', 'подтип', 'отсутствовать', 'пересечение', 'подтип'], ['подтип', 'атрибут', 'связь'], ['иметь', 'собственный', 'уникальный', 'идентификатор', 'наследовать', 'супертипа'], ['иметься', 'исчерпывать', 'набор', 'подтип'], ['являться', 'подтип', 'пример', 'вхождение', 'сущность'], ['знать', 'атрибут', 'связь', 'условие', 'отличать', 'подтип'], ['качество', 'атрибут', 'выяснить', 'атрибут', 'описывать', 'образ', 'данную', 'сущность'], ['список', 'проверочный', 'вопрос', 'атрибут', 'являться', 'наименование', 'атрибут', 'существительным', 'единственный', 'число', 'отражать', 'обозначаемого', 'атрибут', 'свойство'], ['включать', 'наименование', 'атрибут', 'имя', 'сущность'], ['атрибут', 'значение', 'момент', 'время'], ['отсутствовать', 'повторяться', 'значение', 'группа'], ['описать', 'формат', 'длина', 'допустимый', 'значение', 'алгоритм', 'получение', 'т.п.'], ['атрибут', 'пропустить', 'сущность', 'пригодиться', 'прикладной', 'система', 'существовать', 'предполагаемой'], ['пропустить', 'связь'], ['ссылка', 'атрибут', 'особенность', 'проект', 'переход', 'прикладной', 'уровень', 'исчезнуть'], ['необходимость', 'история', 'изменение'], ['зависеть', 'значение', 'сущность'], ['значение', 'атрибут', 'являться', 'обязательный', 'известный'], ['необходимость', 'создание', 'домен', 'атрибут'], ['зависеть', 'значение', 'часть', 'уникальный', 'идентификатор'], ['зависеть', 'значение', 'значение', 'атрибут', 'включить', 'уникальный', 'идентификатор'], ['качество', 'связь', 'выяснить', 'отражать', 'связь', 'важный', 'отношение', 'наблюдать', 'сущностями'], ['список', 'проверочный', 'вопрос', 'связь', 'иметься', 'описание', 'каждый', 'участвовать', 'сторона', 'отражать', 'содержание', 'связь', 'вписываться', 'принять', 'синтаксис'], ['участвовать', 'два', 'сторона'], ['являться', 'связь', 'переносить'], ['задать', 'степень', 'связь', 'обязательность', 'каждый', 'сторона'], ['допустима', 'конструкция', 'связь'], ['относиться', 'конструкция', 'связь', 'редко', 'использовать'], ['являться', 'избыточный'], ['изменяться', 'течение', 'время'], ['связь', 'обязательный', 'отражать', 'отношение', 'сущность', 'представлять', 'противоположный', 'сторона'], ['исключающей', 'связь', 'конец', 'связь', 'покрывать', 'исключать', 'дуга', 'иметь', 'тип', 'обязательность'], ['относиться', 'сущность'], ['дуга', 'пересекать', 'разветвляться', 'конец', 'сказать', 'случай'], ['связь', 'покрываться', 'дуга'], [], ['конец', 'связь', 'покрывать', 'дуга', 'входить', 'уникальный', 'идентификатор'], ['функция', 'система', 'аналитик', 'приходиться', 'описывать', 'достаточно', 'сложный', 'бизнес', 'процессы'], ['случай', 'прибегать', 'функциональный', 'декомпозиция', 'показывать', 'разбиение', 'процесс', 'ряд', 'мелкий', 'функция', 'каждый', 'разбить', 'ущерб', 'смысл'], ['конечный', 'продукт', 'декомпозиция', 'представлять', 'иерархия', 'функция', 'нижний', 'уровень', 'находиться', 'атомарный', 'точка', 'зрение', 'смысловой', 'нагрузка', 'функция'], ['привести', 'простой', 'пример', 'рис', '15', 'декомпозиция'], ['рассмотреть', 'простой', 'задача', 'выписка', 'счёт', 'клиент', 'отпуск', 'товар', 'склад', 'условие', 'набор', 'товар', 'хотеть', 'приобрести', 'клиент', 'известный', 'рассматривать', 'пример', 'задача', 'выбор', 'товар'], ['операция', 'выбор', 'расчёт', 'скидка', 'разбить', 'мелкий', 'операция', 'расчёт', 'скидка', 'приверженность', 'клиент', 'покупать', 'товар', 'течение', 'долгий', 'время', 'расчёт', 'скидка', 'количество', 'покупаемого', 'товар'], ['атомарный', 'функция', 'описываться', 'подробно', 'помощь', 'dfd', 'std'], ['описание', 'функция', 'исключать', 'дополнительный', 'словесный', 'описание', 'комментарий'], ['отметить', 'этап_анализ', 'уделить', 'внимание', 'функция', 'анализ', 'обработка', 'возможный', 'ошибка', 'отклонение', 'предполагать', 'эталон', 'работа', 'система'], ['выделить', 'критичный', 'работа', 'система', 'процесс', 'обеспечить', 'строгий', 'анализ', 'ошибка'], ['обработка', 'ошибка', 'субд', 'код', 'возврат', 'правило', 'представлять', 'обособленный', 'набор', 'функция', 'единственный', 'функция'], ['уточнение', 'стратегия', 'этап_анализ', 'происходить', 'уточнение', 'выбрать', 'конечный', 'реализация', 'аппаратный', 'программный', 'средство'], ['привлекаться', 'группа', 'тестирование', 'технический', 'специалист'], ['проектирование', 'информационный_система', 'важный', 'учесть', 'дальнейший', 'развитие', 'система', 'рост', 'объём', 'обрабатывать', 'увеличение', 'интенсивность', 'поток', 'запрос', 'изменение', 'требование', 'надёжность', 'информационный_система'], ['этап_анализ', 'определяться', 'набор', 'модель', 'задача', 'получение', 'сравнительный', 'характеристика', 'иных', 'субд', 'рассматриваться', 'этап_определение', 'стратегия', 'реализация', 'информационный_система'], ['этап_определение', 'стратегия', 'осуществить', 'выбор', 'субд'], ['система', 'этап_анализ', 'намного', 'подробный'], ['получить', 'характеристика', 'передать', 'группа', 'тестирование', 'показать', 'выбор', 'субд', 'этап_определение', 'стратегия', 'неверный', 'выбрать', 'субд', 'удовлетворять', 'требование', 'информационный_система'], ['получить', 'относительно', 'выбор', 'аппаратный', 'платформа', 'операционный', 'система'], ['получение', 'результат', 'инициировать', 'изменение', 'получить', 'этап_определение', 'стратегия', 'пересчитываться', 'смета', 'затрата', 'проект'], ['выбор', 'средство', 'разработка', 'уточняться', 'этап_анализ'], ['сила', 'этап_анализ', 'давать', 'полный', 'представление', 'информационный_система', 'этап_определение', 'стратегия', 'план', 'работа', 'скорректировать'], ['выбрать', 'предыдущий', 'этап', 'средство', 'разработка', 'позволять', 'выполнить', 'иную', 'часть', 'работа', 'задать', 'срок', 'приниматься', 'решение', 'изменение', 'срок', 'правило', 'увеличение', 'срок', 'разработка', 'смена', 'средство', 'разработка'], ['осуществлять', 'выбор', 'иных', 'средство', 'учитывать', 'наличие', 'высококвалифицированный', 'персонал', 'владеть', 'выбрать', 'средство', 'разработка', 'наличие', 'администратор', 'выбрать', 'субд'], ['рекомендация', 'уточнять', 'этап', 'выбор', 'стратегия', 'совокупность', 'условие', 'предполагаться', 'эксплуатировать', 'будущий', 'система'], ['уточняться', 'ограничение', 'риск', 'критический', 'фактор'], ['требование', 'удовлетворить', 'информационный_система', 'реализовать', 'использование', 'субд', 'программный', 'средство', 'выбрать', 'этап_определение', 'стратегия', 'инициировать', 'уточнение', 'изменение', 'получать', 'конечный', 'итог', 'смета', 'затрата', 'план', 'работа', 'изменение', 'требование', 'заказчик', 'система', 'ослабление'], ['подробно', 'описываться', 'возможность', 'реализовать', 'система']]"
|
||
],
|
||
[
|
||
"40",
|
||
"Язык манипуляции данными.docx",
|
||
"2.1.3. Язык манипуляции данными (ЯМД)\nЯзык манипуляции данными (ЯМД) обеспечивает эффективные команды манипуляции сетевой системой базы данных. ЯМД позволяет пользователям выполнять над базой данных операции в целях получения информации, создания отчетов, а также обновления и изменения содержимого записей. \nОсновные команды ЯМД можно классифицировать следующим образом: команды передвижения, команды извлечения, команды обновления записей, команды обновления наборов. \nТабл.2. Основные типы команд ЯМД. \nЗаключение \nПроцесс преобразования функциональной модели в реляционную включает создание реляционной таблицы для каждого объектного множества модели. Атрибуты объектного множества становятся атрибутами реляционной таблицы. Если в функциональной модели существует ключевой атрибут, то он может использоваться в качестве ключа реляционной таблицы. В противном случае ключевой атрибут таблицы может быть создан аналитиком. Однако, лучше всего, если такой атрибут естественным образом возникает из моделируемого приложения. Отношения один-к-одному и один-ко-многим преобразуются в реляционную модель путем превращения их в атрибуты соответствующей таблицы. Отношения многие-ко-многим соответствуют многозначным атрибутам и преобразуются в четвертую нормальную форму путем создания ключа из двух столбцов, соответствующих ключам двух объектных множеств, участвующих в отношении. Конкретизирующие множества преобразуются путем создания отдельных реляционных таблиц, ключи которых совпадают с ключами обобщающих объектных множеств. Рекурсивные отношения также можно смоделировать, создав новое смысловое имя атрибута, обозначающее отношение. \n\n2.2. Архитектуры реализации корпоративных информационных систем.\nПри построении корпоративных информационных сетей, как правило, используются две базовые архитектуры: Клиент-сервер и Интернет/Интранет. В чем же преимущества и недостатки использования каждой из данных архитектур и когда их применение оправдано? Найти ответы на эти вопросы мы постараемся в данном разделе. \nОдной из самых распространенных на сегодня архитектур построения корпоративных информационных систем является архитектура КЛИЕНТ-СЕРВЕР. \nВ реализованной по данной архитектуре информационной сети клиенту предоставлен широкий спектр приложений и инструментов разработки, которые ориентированы на максимальное использование вычислительных возможностей клиентских рабочих мест, используя ресурсы сервера в основном для хранения и обмена документами, а также для выхода во внешнюю среду. Для тех программных систем, которые имеют разделение на клиентскую и серверную части, применение данной архитектуры позволяет лучше защитить серверную часть приложений, при этом, предоставляя возможность приложениям либо непосредственно адресоваться к другим серверным приложениям, либо маршрутизировать запросы к ним. Средством (инструментарием) для реализации клиентских модулей для ОС Windows в данном случае является, как правило, Delpfi. \nОднако при этом частые обращения клиента к серверу снижают производительность работы сети, кроме этого приходится решать вопросы безопасной работы в сети, так как приложения и данные распределены между различными клиентами. Распределенный характер построения системы обуславливает сложность ее настройки и сопровождения. Чем сложнее структура сети, построенной по архитектуре КЛИЕНТ-СЕРВЕР, тем выше вероятность отказа любого из ее компонентов. \nВ последнее время все большее развитие получает архитектура Интернет/Интранет. В основе реализации корпоративных информационных систем на базе данной архитектуры лежит принцип \"открытой архитектуры\", что во многом определяет независимость реализации корпоративной системы от конкретного производителя. Все программное обеспечение таких систем реализуется в виде аплетов или сервлетов (программ написанных на языке JAVA) или в виде cgi модулей (программ написанных как правило на Perl или С). \nОсновными экономическими преимуществами данной архитектуры являются: \nотносительно низкие затраты на внедрение и эксплуатацию; \nвысокая способность к интеграции существующих гетерогенных информационных ресурсов корпораций; \nповышение уровня эффективности использования оборудования (сохранение инвестиций). \nприкладные программные средства доступны с любого рабочего места, имеющего соответствующие права доступа; \nминимальный состав программно-технических средств на клиентском рабочем месте (теоретически необходима лишь программа просмотра - броузер и общесистемное ПО); \nминимальные затраты на настройку и сопровождение клиентских рабочих мест, что позволяет реализовывать системы с тысячами пользователей (причем многие из которых могут работать за удаленными терминалами). \nВ общем случае АИС, реализованная с использованием данной архитектуры включает Web-узлы с интерактивным информационным наполнением, реализованных при помощи технологий Java, JavaBeans и JavaScript, взаимодействующих с предметной базой данных, с одной стороны, и с клиентским местом с другой. База данных, в свою очередь, является источником информации для интерактивных приложений реального времени. \nПо запросу клиента WEB узел осуществляет следующие операции (рис.7): \nОтправляет ASCII коды HTML страниц (или VRML документов), включающие при необходимости элементы javaScript; \nОтсылает двоичный код запрошенного ресурса (изображения, адио-, видеофайла, архива и т.п.); \nОтсылает байт коды JAVA апплетов. \nПринимает конкретную информацию от пользователя (результат заполнения активной формы, или статистическую информацию запрошенную CGI скриптом); \nОсуществляет заполнение базы данных; \nПринимает сообщения от пользователя и регламентирует доступ к ресурсам Web узла на основе анализа принятой информации (проверка паролей и т.п.); \nПринимает информацию от пользователя и в зависимости от нее динамически формирует HTML страницы, либо VRML документы, обращаясь, при необходимости, к базам данных и существующим на WEB узле HTML страницам и VRML документам.\nПосле того, как клиент получил ответ WEB сервера, он осуществляет следующие операции: \nвизуализирует HTML страницу либо VRML документ в окне броузера; \nинтерпретирует команды JavaScript, модифицирует образ HTML страницы и т.п.; \nинтерпретируя байт коды JAVA апплетов, позволяет загружать и выполнять активные приложения; \nведет диалог с пользователем, заполняющим формы, и создает новые запросы к WEB серверу; \nс помощью утилит воспроизводит коды аудио и видео файлов, поддерживает мультимедийные средства; \nобеспечивает моделирование виртуальной реальности просматривая VRML документы.\nПеречисленные задачи WEB клиента обеспечиваются возможностями броузера и специализированным программным обеспечением (утилитами), размещенными на рабочей станции клиента. Следует отметить и тот факт, что жестких стандартов на построение WEB клиента пока нет и его компонентный состав может различаться. \nНа сегодняшний день известны и широко применяются три основных технологии создания интерактивного взаимодействия с пользователем в Web. Первый путь заключается в использовании Стандартного Интерфейса Шлюза (Commom Gateway Interface) - CGI. Второй - включение JavaScript - сценариев в тело Web-страниц. И наконец самый мощный, предоставляющий практически неограниченные возможности способ - применение технологии Java (ипользование Java-аплетов). \nCGI - это механизм для выбора, обработки и форматирования информации. Возможность взаимодействия, обеспечиваемая CGI, предоставляется во многих формах, но в основном это динамический доступ к информации, содержащейся в базах данных. Например, многие узлы применяют CGI для того, чтобы пользователи могли запрашивать базы данных и получать ответы в виде динамически сформированных Web-страниц (рис.17). \nИмеются в виду узлы, предоставляющие доступ к базам данных, средствам поиска, и даже информационные системы, предающие сообщения в ответ на ввод пользователя. Все эти узлы используют CGI, чтобы принять ввод пользователя и передать его с сервера Web базе данных. База данных обрабатывает запрос и возвращает ответ серверу, который в свою очередь пересылает его опять броузеру для отображения. Без СGI база данных этого не смогла бы. Данный интерфейс можно считать посредником между броузером, сервером и любой информацией которая должна передаваться между ними. \nВ отличии от HTML, CGI не является языком описания документов. Собственно, это и не язык вообще; это стандарт. Он просто определяет, как серверы Web передают информацию, используя приложения, исполняемые на сервере. Это способ расширения возможностей сервера Web без преобразования при этом его самого. Подобно тому как броузер Web обращается к вспомогательным приложениям для обработки информации, которую он не понимает, CGI предоставляет серверу Web возможность преложить работу на другие приложения, такие как базы данных и средства поиска. \nПри написании программы шлюза (которая может конвертировать ввод из одной системы в другую) CGI позволяет использовать почти любой язык программирования. Способность использовать при написании программы шлюза любой язык, даже язык сценариев, чрезвычайно важна. Самыми популярными языками являются shell, Perl, C и С++. Сценарием традиционно называют программу, которая выполняется с помощью интерпретатора, выполняющего каждую строку программы по мере ее считывания. \nПоследовательность действий при взаимодействии клиента с программой запущенной на Web-сервере можно сформулировать как следующая последовательность шагов. \nБроузер принимает введенную пользователем информацию, как правило с помощью форы. \nБроузер помещает введенную пользователем информацию в URL, указывающий имя и местоположение сценария CGI, который требуется ввести в действие. \nБроузер подключается к серверу Web и запрашивает URL. Сервер определяет, что URL должен ввести в действие сценарий CGI, и запускает указанный сценарий. \nСценарий CGI выполняется, обрабатывая все передаваемые ему данные. \nСценарий CGI динамически формирует Web-страницу и возвращает результат серверу. \nСервер возвращает результат клиенту. \nБроузер отображает результат пользователю \nЭто является упрощенной схемой взаимодействия между броузером, сервером и сценарием CGI. Наибольшую популярность CGI - сценарии нашли при использовании в качестве обработчиков форм, средства доступа к базам данных, средства осуществления локального и глобального поиска, шлюзовых протоколов. \nНаибольшей мощью в реализации клиентского программного обеспечения обладают аплеты - программы написанные на языке JAVA. В узком смысле слова Java - это объектно-ориентированный язык, напоминающий C++, но более простой для освоения и использования. В более широком смысле Java - это целая технология программирования, изначально рассчитанная на интеграцию с Web-сервисом, то есть на использование в сетевой среде. Поскольку Web-навигаторы существуют практически для всех аппаратно-программных платформ, Java-среда должна быть как можно более мобильной, в идеале полностью независимой от платформы. \nС целью решения перечисленных проблем были приняты, помимо интеграции с Web-навигатором, два других важнейших постулата. \nБыла специфицирована виртуальная Java-машина (JVM), на которой должны выполняться (интерпретироваться) Java-программы. Определены архитектура, представление элементов данных и система команд Java-машины. Исходные Java-тексты транслируются в коды этой машины. Тем самым, при появлении новой аппаратно-программной платформы в портировании будет нуждаться только Java-машина; все программы, написанные на Java, пойдут без изменений. \nОпределено, что при редактировании внешних связей Java-программы и при работе Web-навигатора прозрачным для пользователя образом может осуществляться поиск необходимых объектов не только на локальной машине, но и на других компьютерах, доступных по сети (в частности, на WWW-сервере). Найденные объекты загружаются, а их методы выполняются затем на машине пользователя. \nНесомненно, между двумя сформулированными положениями существует тесная связь. В компилируемой среде трудно абстрагироваться от аппаратных особенностей компьютера, как трудно (хотя и можно) реализовать прозрачную динамическую загрузку по сети. С другой стороны, прием объектов извне требует повышенной осторожности при работе с ними, а, значит, и со всеми Java-программами. Принимать необходимые меры безопасности проще всего в интерпретируемой, а не компилируемой среде. Вообще, мобильность, динамизм и безопасность - спутники интерпретатора, а не компилятора. \nПринятые решения делают Java-среду идеальным средством разработки интерактивных клиентских компонентов (апплетов) Web-систем. Особо отметим прозрачную для пользователя динамическую загрузку объектов по сети. Из этого вытекает такое важнейшее достоинство, как нулевая стоимость администрирования клиентских систем, написанных на Java. Достаточно обновить версию объекта на сервере, после чего клиент автоматически получит именно ее, а не старый вариант. Без этого реальная работа с развитой сетевой инфраструктурой практически невозможна. \nСтандартный реляционный доступ к данным очень важен для программ на Java, потому что Java-апплеты по природе своей не являются монолитными, самодостаточными программами. Будучи модульными, апплеты должны получать информацию из хранилищ данных, обрабатывать ее и записывать обратно для последующей обработки другими апплетами. Монолитные программы могут себе позволить иметь собственные схемы обработки данных, но Java-апплеты, пересекающие границы операционных систем и компьютерных сетей, нуждаются в опубликовании открытых схем доступа к данным. \nИнтерфейс JDBC (Java Database Connectivity - связанность баз данных Java) является первой попыткой реализации доступа к данным из программ Java, не зависящего от платформы и базы данных. В версии JDK 1.1 JDBC является составной частью основного Java API. \nJDBC - это набор реляционных объектов и методов взаимодействия с источниками данных. Программа на языке Java открывает связь с таблицей, создает объект оператор, передает через него операторы SQL системе управления базой данных получает результаты и служебную информацию о них. В типичном случае файлы .class JDBC и апплет/приложение на языке Java находятся на компьютере клиенте. Хотя они могут быть загружены из сети, для минимизации задержек во время выполнения лучше иметь классы JDBC у клиента. Система управления базой данных (CУБД) и источник данных обычно расположены на удаленном сервере. \nНа рисунке 19 показаны различные варианты реализаций связи JDBC с базой данных. Апплет/приложение взаимодействует с JDBC в системе клиента, драйвер отвечает за обмен информацией с базой данных через сеть. \nКлассы JDBC находятся в пакете java.sql.*. Все программы Java используют объекты и методы из этого пакета для чтения и записи в источник данных. Программе, использующей JDBC, требуется драйвер к источнику данных, с которым она будет взаимодействовать. Этот драйвер может быть написан на другом (не Java) языке программирования, или он может являться программой на языке Java, которая общается с сервером, используя RPC (Remote Procedure Call) - удаленный вызов процедур или HTTP. Обе схемы приведены на рис.19. Драйвер JDBC может быть библиотекой на другом (не Java), как программа сопряжения ODBC - JDBC, или классом Java, который общается через сеть с сервером базы данных, используя RPC или HTTP. \nДопускается, что приложение будет иметь дело с несколькими источниками данных, возможно, с неоднородными. По этой причине у JDBC есть диспетчер драйверов, чьи обязанность заключаются в управлении драйверами и предоставлении программе списка загруженных драйверов. \nХотя словосочетание \"База данных\" входит в расшифровку аббревиатуры JDBC, форма, содержание и расположение данных не интересуют программу Java, использующую JDBC, поскольку существует драйвер к этим данным. \n\nСопряжение JDBC - ODBC \nВ качестве составной части JDBC поставляется драйвер для доступа из JDBC к источникам данных ODBC (Open Database Connectivity), и называется \"программа сопряжения JDBC - ODBC\". Эта программа сопряжения реализована в виде JdbcOdbc.class и является библиотекой для доступа к драйверу ODBC. \nПоскольку JDBC конструктивно близок к ODBC, программа сопряжения является несложной надстройкой над JDBC. На внутреннем уровне этот драйвер отображает методы Java в вызовы ODBC и тем самым взаимодействует с любым ODBC - драйвером. Достоинство такой программы сопряжения состоит в том, что JDBC имеет доступ к любым базам данных, поскольку ODBC - драйверы распространены очень широко. \nВ соответствии с правилами Internet JDBC идентифицирует базу данных при помощи URL, который имеет форму: \njdbc:<субпротокол>:<имя, связанное с СУБД или Протоколом> \nУ баз данных в Internet/intranet \"имя\" может содержать сетевой URL \n//<имя хоста>:<порт>/.. \n<субпротокол> может быть любым именем, которое понимает база данных. Имя субпротокола \"odbc\" зарезервированно для источников данных формата ODBC. Типичный JDBC URL для базы данных ODBC выглядит следующим образом: \njdbc:odbc:<DNS - имя ODBC>;User=<имя пользователя>; PW=<пароль> \n\nВнутреннее устройство JDBC - приложения \nЧтобы обработать информацию из базы данных, информационно-обучающая система на языке Java выполняет ряд шагов. На рис.20 показаны основные объекты JDBC, методы и последовательность выполнения, Во-первых, программа вызывает метод getConnection (), чтобы получить объект Connection.Затем она создает объект Statement и подготавливает оператор SQL. \nОператор SQL может быть выполнен немедленно (объект Statement), а может быть откомпилирован (объект PreparedStatement) или представлен в виде вызова процедуры (объект CallableStatement). Когда выполняется метод executeQuery(), возвращается объект ResultSet. Операторы SQL, такие как updatе или delete не возвращают ResultSet. Для таких операторов используется метод executeUpdate(). Он возвращает целое, указывающее количество рядов, затронутых оператором SQL. \nResultSet содержит ряды данных и анализируетcя методом next(). Если приложение обрабатывает транзакции, можно пользоваться методами rollback() и commit() для отмены или подтверждения изменений, внесенных оператором \nSQL. \n\nПримеры запроса и модификации базы данных с использованием JDBC \nДанный пример иллюстрирует как при помощи SQL - опрератора SELECT составляется список всех студентов из базы данных. Ниже приводятся шаги, которые необходимы для выполнения этого задания при помощи API JDBC. Каждый шаг имеет форму текста на языке Java с комментариями. \n// описать методы и переменные\npublic void ListStudents () throws SQLException\n{\nint i, noOfColumns;\nString stNo, stFName, stLName;\n// инициализировать и загрузить драйвер JDBC-ODBC\nClass.forName (\"jdbc.odbc.JdbcOdbcDriver\");\n// создать объект Connection\nConnection ex1Con = DriverManager.getConnection (\n\"jdbc:odbc:StudentDB;uid=\"admin\";pw=\"sa\"\");\n// создать простой объект Statement\nStatement ex1Stmt = ex1Con.createStatement ();\n// Создать строку SQL, передать ее СУБД и\n// выполнить SQL-оператор\nResultSet ex1rs = ex1Stmt.executeQuery (\n\"SELECT StudentNumber, FirstName, LastName FROM Students\");\n// Обработать каждый ряд и вывести результат на консоль\nSystem.out.println (\"Student Number First Name Last Name\");\nwhile (ex1rs.next())\n{\nstNo = ex1rs.getString (1);\nstFName = ex1rs.getString (2);\nstLName = ex1rs.getString (3);\nSystem.out.println (stNo, stFName, stLName);\n}\n}\nВ следующем примере поле firstName таблицы Students изменяется. Доступ осуществляется через поле StudentNumber. \n// описать методы, переменные и параметры \npublic void UpdateStudentName (String stFName, String stLName, String stNo) \nthrows SQLException\n{\nint retValue;\n//инициализировать и загрузить драйвер JDBC-ODBC\nClass.forName (\"jdbc.odbc.JdbcOdbcDriver\");\n// создать объект Connection\nConnection ex1Con = DriverManager.getConnection (\n\"jdbc:odbc:StudentDB;uid=\"admin\";pw=\"sa\"\");\n// создать простой объект Statement\nStatement ex1Stmt = ex1Con.createStatement ();\n// Создать строку SQL, передать ее СУБД и\n// выполнить SQL-оператор\nString SQLBuffer = \"UPDATE Students SET FirstName =\" +\nstFName + \", lastName =\" + stLName +\n\"WHERE StudentNumber = \" + stNo;\nretValue = ex1Stmt.executeUpdate (SQLBuffer);\nSystem.out.println (\"Модифицированно \" + retValue +\n\" строк в базе данных.\")\n}\nРис.21. Интерфейс для регистрации пользователя в АИС. \nТаким образом, взаимодействие с базами данных из Java также отличается простотой и гибкостью, связанной с эффективной реализацией JDBC API. В сочетании со своей природной платформо-независимостью, Java предоставляет уникальный инструмент для создания интерактивных распределенных информационно-обучающих систем на база Internet/Intranet - технологий. \nОсновными сложностями при реализации корпоративных систем на базе данной архитектуры являются: \nотсутствие многих популярных приложений и средств разработки реализованных в виде JAVA аплетов; \nотносительное высокое время компиляции аплетов на клиентских местах (временно); \nвопросы безопасной работы в сети. \n\n2.2.1. Сравнительные исследования типовых серверных платформ.\nВыбирая платформу для АИС, нужно учитывать множество аспектов. На решение влияют соображения, связанные с надежностью (кластеризация и балансировка нагрузки), среды разработки, работы над содержанием узла и защиты информации. Результаты тестирования различных платформ широко представлены в периодической печати, представим здесь лишь некоторые обобщения материалов тестирования []. \nПри проведении испытаний оценивались Solaris 2.6, Windows NT Server 4 и Red Hat Linux 6.02 (ядро 2.2.11) при эксплуатации четырех web-серверов, занимающих ведущие позиции в мире: Microsoft Internet Information Server 4 (IIS), Netscape Enterprise Server 3.61, Web Server 2.1 корпорации Sun и Stronghold Web Server 2.4.1 (популярный вариант Web-сервера Apache с функциями защиты от несанкционированного доступа) (на тестах использовались триал версии указанного программного обеспечения). Все платформы были испытаны с помощью новой версии эталонного теста WebBench отделения Ziff-Davis Benchmark Operation. \n\n2.2.1.2. Особенности функционирования АИС на платформе Sun.\nSolaris - это современная операционная система UNIX клона. Примечательно, что она, опережая свое время, позволяет работать с 64-разрядными прикладными программами и имеет собственные расширения, которые помогают ей выдерживать высокие пользовательские нагрузки Web-узлов с интенсивным обменом информацией. В Solaris также предусмотрены замечательные возможности применения серверных прикладных программ и средств разработки сторонних производителей. \nКлючевой момент для понимания различий между платформами Linux, Microsoft и Sun - способ, которым серверные программы каждой из них обрабатывают большое число подключений. Обычно это делается в многопотоковом режиме. Многопотоковый режим возникает, когда прикладная программа (также называемая процессом) содержит множество небольших блоков исполняемого кода, работающих независимо друг от друга и, возможно, одновременно на разных процессорах. Эти потоки могут совместно пользоваться ресурсами и представляют собой способ организации программы, позволяющий одновременно выполнять несколько задач. \nМодель потоков Solaris весьма сложна. Она состоит из потоков на уровне ядра (kthreads) - реальных объектов, передаваемых отдельному процессору; потоков на пользовательском уровне и промежуточной структуры, называемой облегченным (lightweight) процессом. Это позволяет тонко управлять структурой прикладной программы и реализации в ней прикладной многозадачности. \n\nStronghhold на платформе Solaris \nСоздатели Web-сервера Stronghold (и Apache, основы Stronghold) считают, что многопотоковые программы обычно менее надежны, чем \"монолитные\". Такое различие стратегий объясняет значительные расхождения показателей производительности, поскольку и Sun Web Server 2.1, и Netscape Enterprise используют второй процессор, установленный в испытательных системах. Поэтому Stronghold, в зависимости от прикладного ПО, не столь эффективно использует оборудование Sun, содержащее до 64 процессоров. \n\nNetscape на платформе Solaris \nNetscape Enterprise Server 3.61 - Web-сервер, избранный для реализации большинства крупных узлов на основе Solaris, в том числе и корпорации Sun. Инструментальные средства фирмы Netscape, а также предлагаемые независимыми производителями, способствуют разработке сложных прикладных программ для Web с помощью сценариев на языках JavaScript, CORBA, Java. \nЕще одна важнейшая система, стоящая за добротными программами для Web на серверах Netscape, - сервер прикладных программ Netscape Application Server (NAS). Сервер NAS - среда программирования для объектов на языках C++ и Java - обеспечивает масштабируемость и устойчивость к сбоям прикладных программ. В NAS имеются инструменты для создания многоуровневых программ, объединяющих HTML и запросы к базам данных на серверах NAS. \n\nSun Web Server \nSun Web Server (SWS) обеспечивает разработку программ, конечно же, на языке Java. На SWS можно использовать сервлеты и разнообразные возможности, такие как CORBA. Сервлеты (servlet) - это Java-программы, запускаемые на сервере и, подобно CGI, передающие сверстанные HTML-страницы браузеру. Для сервлет существует собственный API к функциям рабочей среды сервера. В SWS также предусмотрена возможность использования серверных Java-страниц (Java Server Pages) - способа обращения к серверным функциям Java со страниц Web и из CGI-программ. \nПри соответствующем использовании Web-серверов на платформе Solaris, эта операционная система на многопроцессорных станциях превосходит по производительности Windows NT. Такого результата достигла Sun Microsystems благодаря использованию Solaris Network Cache and Accelerator (SNCA) - мощного механизма кэширования для Web-сервера. SWS победил в испытаниях при обслуживании статических страниц. При выполнении динамических CGI-испытаний Netscape на платформе Solaris превзошел и SWS, и IIS для Windows NT. \n\n2.2.1.3. Особенности функционирования АИС на платформе Microsoft.\nMicrosoft Windows NT Server \nWindows NT 4 Server и Internet Information Server (IIS) являются исключительно коммерческой web-платформой, разработанной компанией Microsoft. Данная ОС имеет удобный интуитивно понятный интерфейс взаимодействия с пользователем, что делает её довольно привлекательной для использования. Windows NT 4 Server оснащена службой балансировки нагрузки (Windows NT Load Balancing Services), которая позволяет создавать группу серверов и распределять нагрузку между ними. Пользователи при этом видят только один IP-адрес и полагают, что существует только один сервер. Однако служба Load Balancing Services - это неполноценная кластерная система, поэтому она не способна обеспечить такое высокое быстродействие, как настоящий кластер. Windows NT не может работать с мощными аппаратными и программными средствами кластеров, в том числе с собственной службой Microsoft Cluster Service, продуктами серии Infinity компании IBM и продуктами NonStop производства Compaq. У Microsoft есть продукты всех этапов разработки для Web, однако обычно их заменяют изделиями других фирм. Пакет Allaire ColdFusion 4.0, как среда разработки для Web, - отличный пример этого. \n\nNetscape Enterprise на платформе Windows NT \nNetscape Enterprise в среде Windows NT представляет собой Web-сервер, ориентированный на большие нагрузки. Для него имеется множество моделей программирования. Например, помимо общепринятых моделей разработки HTML и CGI в продукте Netscape предусмотрены возможности работы с JavaScript на стороне сервера. Почти все функции сервера Netscape для Solaris работают и на платформе Windows NT. \nПри тестировании на производительность IIS показал неплохие результаты. Скорость при работе IIS достигнута за счет хорошо организованной обработкой файлового ввода-вывода. Дополняет обработку сообщений в Windows NT возможность асинхронного ввода-вывода, позволяющая обрабатывать запрос одновременно с выполнением операций ввода-вывода в файл или ЛВС. Подобная функция имеется в Solaris, но до сих пор не полностью реализована в Linux. По результатам теста IIS проигрывает SWW при обработке статических страниц, а Netscape Enterprise на платформе NT оказался менее производительным во всех режимах, чем на платформе Solaris. \n\n2.2.1.4. Особенности функционирования АИС на основе Linux.\nВсе больше растет популярность Linux и её респектабельность как платформы разработки для Web и корпоративных сред. Linux характеризуется рядом преимуществ, таких как широкое сообщество разработчиков открытого кода, поддержка многих моделей комплектующих, и, главная особенность состоит в том, что Linux полностью бесплатная ОС. Linux является разновидностью Unix и изначально создавалась для работы в сетях. В каждой новой версии Linux появляются некоторые усовершенствования, направленные на повышение масштабируемости и производительности серверных прикладных программ. \n\nApache и Stronghold \nДля тестов в среде Linux был использован Stronghold Web Server 2.4.1 компании C2Net. Stronghold - это сервер с возможностями применения технологии SSL, в основе которого лежит Web-сервер Apache. Сервер Stronghold обладает всеми преимуществами Apache, в том числе мощными средствами обеспечения работы с виртуальными базовыми машинами (способность одного web-сервера обслуживать несколько машин одновременно). \nПлатформа Stronghold, подобно Linux, имеет заслуженную репутацию надежной и стабильной системы. Но Stronghold - и, следовательно, Apache - не оптимизированы для многопроцессорных сред. Поэтому Web-узлы, основанные на серверах Apache, лучше масштабировать путем добавления серверов, а не процессоров. \nНапротив, IIS и Netscape Enterprise имеют многопотоковую архитектуру, которая масштабируется на несколько процессоров одного сервера. При испытаниях на многопроцессорных станциях они, как правило, обгоняли Stronghold. \nApache позволяет тонко настраивать ряд параметров (такие как число процессов, доступных клиентам). Для Apache, как и для других серверов, есть механизм работы сервлетам (Apache Jserv). Механизм работы с сервлетами встраивается в Apache в виде модуля и работает с любой совместимой с JDK 1.1 виртуальной Java-машиной. По производительности дуэт Apache-Linux оказался оптимальным для однопроцессорных систем. По обработке статических страниц он немного уступал SWW и IIS, а по стабильности работы превосходил серверы на платформеWindows NT. \nLinux - это функциональность UNIX + пользовательско-ориентированный интерфейс Windows-систем. Большая часть поддерживаемого Linux оборудования - это то, что пользователи реально у себя имеют. Как в результате оказалось - большая часть популярной периферии для 80386/80486 поддерживается (действительно, Linux поддерживает оборудование, которое в ряде случаев не поддерживают некоторые коммерческие UNIX). Хотя некоторые достаточно экзотические устройства пока не поддерживаются. \nВажным вопросом при создании АИС является обеспечение жизнестойкости и надежности работы информационных серверов. В качестве иллюстрации эффективности платформы приведем расчет параметров для сервера с 25000 посетителей в день []. Подсчет загрузки: 24ч*60мин*60 сек=86400 секунд в сутках, если каждый посетитель берет с сервера по 10 документов (*.html + графика) то при равномерном распределении загрузки получается 3 обращения к серверу в секунду. Реальное распределение трафика носит характер кривой Гаусса либо синусоиды (в зависимости от содержания сервера), в максимумах которых загрузка достигает 10-20 обр/с. Для нормальной работы такому серверу необходимо около 400 Mb RAM, при хорошей настройке - не менее 200. \nПри правильной конфигурации сервера не рекомендуется использовать swap. все должно помещаться в оперативной памяти (имеется ввиду, что у сервера swap-область быть должна, но она обязана быть пустой). Для предотвращения перегрузок рекомендуется пользоваться несколькими правилами, снижающими загрузку сервера. Придерживаясь этих правил можно съэкономить около 30% ресурсов сервера. \nДля статической информации всегда ставить last-modified в атрибут выдачу CGI-скриптов - документ без временного штампа не сохраняется в локальном кэше, и постоянно перезаписывается при просмотре. \nCGI программы хранить в любом каталоге кроме /CGI-BIN/, т.к. proxy-серверы не кэшируют файлы, находящиеся в этих каталогах, и каждый раз вынуждены обращаться к вам на сервер. \nУстанавливать поле last-modified у русского apache с автоматическим определением кодировки, чтобы на proxy-серверах не оставались файлы в некорректной кодировке. \nНе применять авторедирект по чарсету в русском apache. \nНе использовать фреймы, т.к. вместо одного файла появляется минимум 3. \nНе использовать анимированные *.gif, т.к. некоторые NN обращаются к серверу перед каждым циклом. \n404 код не делать cgi-скриптом, 404 код не делать \"красивым\" - с графическими изображениями и указаниями на прочие разделы, т.к. сошедший с ума робот собирает невероятное количество 404 ошибок, зацикливаясь в них на веки. \nСоздать на сервере файл robot.txt, т.к. это самый запрашиваемый документ на сервере, и иначе порождает массу 404 (см. п. 7). А также разумные роботы слушаются запретов в этом файле, что уменьшает нагрузку на сервер. \nНе ставить баннеры наверху страницы, т.к. баннер сверху отнимает 1-2 реквеста из 4-х и в итоге грузится вперед тормозя ваши сайтовые картинки. \nПри вызове баннера не обращаться каждый раз к CGI, а подставлять вместо случайного числа любое число, что можно сделать, например, получив дату на JavaScript. \nВызывать баннеры программами на Си, т.к. Perl работает медленнее. \nНа одной машине должен размещаться только информационный сервер, не одновременно с почтой и др. сервисами. \nНа сегодня архитектура Internet/Intranet, в том числе и на платформе LINUX, уже используется при построении корпоративных ИС для решения задач автоматизации управления банками, управления проектированием, управления ТП, АСУ ТП, электронной коммерции, оперативной информации по курсу валют и акций и т.п. ",
|
||
"1",
|
||
"[['2.1.3'], ['язык', 'манипуляция', 'данными', 'ямд', 'язык', 'манипуляция', 'данными', 'ямд', 'обеспечивать', 'эффективный', 'команда', 'манипуляция', 'сетевой', 'система', 'база'], ['ямд', 'позволять', 'пользователь', 'выполнять', 'база', 'операция', 'цель', 'получение', 'информация', 'создание', 'отчёт', 'обновление', 'изменение', 'содержимого', 'запись'], ['основной', 'команда', 'ямд', 'классифицировать', 'следующий', 'образ', 'команда', 'передвижение', 'команда', 'извлечение', 'команда', 'обновление', 'запись', 'команда', 'обновление', 'набор'], ['табл.2'], ['основной', 'тип', 'команда', 'ямд'], ['заключение', 'процесс', 'преобразование', 'функциональный', 'модель', 'реляционный', 'включать', 'создание', 'реляционный', 'таблица', 'каждый', 'объектный', 'множество', 'модель'], ['атрибут', 'объектный', 'множество', 'становиться', 'атрибут', 'реляционный', 'таблица'], ['функциональный', 'модель', 'существовать', 'ключевой', 'атрибут', 'использоваться', 'качество', 'ключ', 'реляционный', 'таблица'], ['противный', 'случай', 'ключевой', 'атрибут', 'таблица', 'создать', 'аналитик'], ['хороший', 'атрибут', 'естественный', 'образ', 'возникать', 'моделируемого', 'приложение'], ['отношение', 'многим', 'преобразуются', 'реляционный', 'модель', 'путем', 'превращение', 'атрибут', 'соответствующий', 'таблица'], ['отношение', 'многим', 'соответствовать', 'многозначный', 'атрибут', 'преобразуются', 'четвёртый', 'нормальный', 'форма', 'путем', 'создание', 'ключ', 'два', 'столбец', 'соответствовать', 'ключ', 'два', 'объектный', 'множество', 'участвовать', 'отношение'], ['конкретизирующие', 'множество', 'преобразуются', 'путем', 'создание', 'отдельный', 'реляционный', 'таблица', 'ключ', 'совпадать', 'ключ', 'обобщающих', 'объектный', 'множество'], ['рекурсивный', 'отношение', 'смоделировать', 'создать', 'новый', 'смысловой', 'имя', 'атрибут', 'обозначать', 'отношение'], ['2.2'], ['архитектура', 'реализация', 'корпоративный', 'информационный', 'система'], ['построение', 'корпоративный', 'информационный', 'сеть', 'правило', 'использоваться', 'два', 'базовый', 'архитектура', 'клиент', 'сервер', 'интернет', 'интранет'], ['преимущество', 'недостаток', 'использование', 'каждый', 'архитектура', 'применение', 'оправдать'], ['найти', 'ответ', 'вопрос', 'постараться', 'раздел'], ['распространенных', 'сегодня', 'архитектура', 'построение', 'корпоративный', 'информационный', 'система', 'являться', 'архитектура', 'клиент', 'сервер'], ['реализовать', 'архитектура', 'информационный', 'сеть', 'клиент', 'предоставить', 'широкий', 'спектр', 'приложение', 'инструмент', 'разработка', 'ориентировать', 'максимальный', 'использование', 'вычислительный', 'возможность', 'клиентский', 'рабочий', 'место', 'использовать', 'ресурс', 'сервер', 'основный', 'хранение', 'обмен', 'документ', 'выход', 'внешний', 'среда'], ['программный', 'система', 'иметь', 'разделение', 'клиентский', 'серверный', 'часть', 'применение', 'архитектура', 'позволять', 'лучше', 'защитить', 'серверный', 'часть', 'приложение', 'предоставлять', 'возможность', 'приложение', 'непосредственно', 'адресоваться', 'серверный', 'приложение', 'маршрутизировать', 'запрос'], ['средство', 'инструментарием', 'реализация', 'клиентский', 'модуль', 'ос', 'windows', 'случай', 'являться', 'правило', 'delpfi'], ['частый', 'обращение', 'клиент', 'сервер', 'снижать', 'производительность', 'работа', 'сеть', 'приходиться', 'решать', 'вопрос', 'безопасный', 'работа', 'сеть', 'приложение', 'распределить', 'различный', 'клиент'], ['распределённый', 'характер', 'построение', 'система', 'обуславливать', 'сложность', 'настройка', 'сопровождение'], ['сложный', 'структура', 'сеть', 'построить', 'архитектура', 'клиент', 'сервер', 'высоко', 'вероятность', 'отказ', 'компонент'], ['последний', 'время', 'больший', 'развитие', 'получать', 'архитектура', 'интернет', 'интранет'], ['основа', 'реализация', 'корпоративный', 'информационный', 'система', 'база', 'архитектура', 'лежать', 'принцип', 'открытый', 'архитектура', 'определять', 'независимость', 'реализация', 'корпоративный', 'система', 'конкретный', 'производитель'], ['программный', 'обеспечение', 'система', 'реализоваться', 'вид', 'аплетов', 'сервлетов', 'программа', 'написать', 'язык_java', 'вид', 'cgi', 'модуль', 'программа', 'написать', 'правило', 'perl'], ['основный', 'экономический', 'преимущество', 'архитектура', 'являться', 'относительно', 'низкий', 'затрата', 'внедрение', 'эксплуатация', 'высокий', 'способность', 'интеграция', 'существовать', 'гетерогенный', 'информационный', 'ресурс', 'корпорация', 'повышение', 'уровень', 'эффективность', 'использование', 'оборудование', 'сохранение', 'инвестиция'], ['прикладной', 'программный', 'средство', 'доступный', 'рабочий', 'место', 'иметь', 'соответствующий', 'право', 'доступ', 'минимальный', 'состав', 'программно', 'технический', 'средство', 'клиентский', 'рабочий', 'место', 'теоретически', 'необходимый', 'программа', 'просмотр', 'броузер', 'общесистемный', 'минимальный', 'затрата', 'настройка', 'сопровождение', 'клиентский', 'рабочий', 'место', 'позволять', 'реализовывать', 'система', 'тысяча', 'пользователь', 'работать', 'удалённый', 'терминал'], ['общий', 'случай', 'аис', 'реализовать', 'использование', 'архитектура', 'включать', 'web', 'узел', 'интерактивный', 'информационный', 'наполнение', 'реализовать', 'помощь', 'технология', 'java', 'javabeans', 'javascript', 'взаимодействовать', 'предметный', 'база', 'сторона', 'клиентский', 'место'], ['база', 'очередь', 'являться', 'источник', 'информация', 'интерактивный', 'приложение', 'реальный', 'время'], ['запрос', 'клиент', 'web', 'узел', 'осуществлять', 'следующий', 'операция', 'рис.7', 'отправлять', 'ascii', 'код', 'html_страница', 'vrml', 'документ', 'включать', 'элемент', 'javascript', 'отсылать', 'двоичный', 'код', 'запрошенного', 'ресурс', 'изображение', 'адио-', 'видеофайл', 'архив', 'т.п.', 'отсылать', 'байт', 'код', 'java', 'апплет'], ['принимать', 'конкретный', 'информация', 'пользователь', 'результат', 'заполнение', 'активный', 'форма', 'статистический', 'информация', 'запросить', 'cgi', 'скрипт', 'осуществлять', 'заполнение', 'база', 'принимать', 'сообщение', 'пользователь', 'регламентировать', 'доступ', 'ресурс', 'web', 'узел', 'основа', 'анализ', 'принять', 'информация', 'проверка', 'пароль', 'т.п.', 'принимать', 'информация', 'пользователь', 'зависимость', 'динамически', 'формировать', 'html_страница', 'vrml', 'документ', 'обращаться', 'база', 'существовать', 'web', 'узел', 'html_страница', 'vrml', 'документ'], ['клиент', 'получить', 'ответ', 'web', 'сервер', 'осуществлять', 'следующий', 'операция', 'визуализирует', 'html_страница', 'vrml', 'документ', 'окно', 'броузер', 'интерпретировать', 'команда', 'javascript', 'модифицировать', 'образ', 'html_страница', 'т.п.', 'интерпретировать', 'байт', 'код', 'java', 'апплет', 'позволять', 'загружать', 'выполнять', 'активный', 'приложение', 'вести', 'диалог', 'пользователь', 'заполнять', 'форма', 'создавать', 'новый', 'запрос', 'web', 'сервер', 'помощь', 'утилита', 'воспроизводить', 'код', 'аудио', 'видео', 'файл', 'поддерживать', 'мультимедийный', 'средство', 'обеспечивать', 'моделирование', 'виртуальный', 'реальность', 'просматривать', 'vrml', 'документ'], ['перечисленный', 'задача', 'web', 'клиент', 'обеспечиваться', 'возможность', 'броузер', 'специализированный', 'программный', 'обеспечение', 'утилит', 'разместить', 'рабочий', 'станция', 'клиент'], ['отметить', 'факт', 'жёсткий', 'стандарт', 'построение', 'web', 'клиент', 'компонентный', 'состав', 'различаться'], ['сегодняшний', 'день', 'известный', 'широко', 'применяться', 'три', 'основный', 'технология', 'создание', 'интерактивный', 'взаимодействие', 'пользователь', 'web'], ['первый', 'путь', 'заключаться', 'использование', 'стандартный', 'интерфейс', 'шлюз', 'commom', 'gateway', 'interface', 'cgi'], ['второй'], [], ['включение', 'javascript', 'сценарий', 'тело', 'web', 'страница'], ['мощный', 'предоставлять', 'практически', 'неограниченный', 'возможность', 'способ', 'применение', 'технология', 'java', 'ипользование', 'java', 'аплетов'], ['cgi', 'механизм', 'выбор', 'обработка', 'форматирование', 'информация'], ['возможность', 'взаимодействие', 'обеспечивать', 'cgi', 'предоставляться', 'многих', 'форма', 'основный', 'динамический', 'доступ', 'информация', 'содержаться', 'база'], ['узел', 'применять', 'cgi', 'пользователь', 'запрашивать', 'база', 'получать', 'ответ', 'вид', 'динамически', 'сформировать', 'web', 'страница', 'рис.17'], ['имеются', 'вид', 'узел', 'предоставлять', 'доступ', 'база', 'средство', 'поиск', 'информационный', 'система', 'предавать', 'сообщение', 'ответ', 'ввод', 'пользователь'], ['узел', 'использовать', 'cgi', 'принять', 'ввод', 'пользователь', 'передать', 'сервер', 'web', 'база'], ['база', 'обрабатывать', 'запрос', 'возвращать', 'ответ', 'сервер', 'очередь', 'пересылать', 'броузер', 'отображение'], ['сgi', 'база', 'смочь'], ['интерфейс', 'считать', 'посредник', 'броузер', 'сервер', 'информация', 'передаваться'], ['отличие', 'html', 'cgi', 'являться', 'язык', 'описание', 'документ'], ['язык', 'стандарт'], ['определять', 'сервер', 'web', 'передавать', 'информация', 'использовать', 'приложение', 'исполнять', 'сервер'], ['способ', 'расширение', 'возможность', 'сервер', 'web', 'преобразование'], ['броузер', 'web', 'обращаться', 'вспомогательный', 'приложение', 'обработка', 'информация', 'понимать', 'cgi', 'предоставлять', 'сервер', 'web', 'возможность', 'преложить', 'работа', 'приложение', 'база', 'средство', 'поиск'], ['написание', 'программа', 'шлюз', 'конвертировать', 'ввод', 'система', 'другую', 'cgi', 'позволять', 'использовать', 'язык', 'программирование'], ['способность', 'использовать', 'написание', 'программа', 'шлюз', 'язык', 'язык', 'сценарий', 'чрезвычайно', 'важный'], ['самыми', 'популярный', 'язык', 'являться', 'shell', 'perl', 'c', 'с++'], ['сценарием', 'традиционно', 'называть', 'программа', 'выполняться', 'помощь', 'интерпретатор', 'выполнять', 'каждый', 'строка', 'программа', 'мера', 'считывание'], ['последовательность', 'действие', 'взаимодействие', 'клиент', 'программа', 'запустить', 'web', 'сервер', 'сформулировать', 'следующий', 'последовательность', 'шаг'], ['броузер', 'принимать', 'ввести', 'пользователь', 'информация', 'правило', 'помощь', 'фора'], ['броузер', 'помещать', 'ввести', 'пользователь', 'информация', 'url', 'указывать', 'имя', 'местоположение', 'сценарий', 'cgi', 'требоваться', 'ввести', 'действие'], ['броузер', 'подключаться', 'сервер', 'web', 'запрашивать', 'url'], ['сервер', 'определять', 'url', 'ввести', 'действие', 'сценарий', 'cgi', 'запускать', 'указать', 'сценарий'], ['сценарий', 'cgi', 'выполняться', 'обрабатывать', 'передавать'], ['сценарий', 'cgi', 'динамически', 'формировать', 'web', 'страница', 'возвращать', 'результат', 'сервер'], ['сервер', 'возвращать', 'результат', 'клиент'], ['броузер', 'отображать', 'результат', 'пользователь', 'являться', 'упростить', 'схема', 'взаимодействие', 'броузер', 'сервер', 'сценарий', 'cgi'], ['больший', 'популярность', 'cgi', 'сценарий', 'найти', 'использование', 'качество', 'обработчик', 'форма', 'средство', 'доступ', 'база', 'средство', 'осуществление', 'локальный', 'глобальный', 'поиск', 'шлюзовый', 'протокол'], ['больший', 'мощь', 'реализация', 'клиентский', 'программный', 'обеспечение', 'обладать', 'аплеты', 'программа', 'написать', 'язык_java'], ['узкий', 'смысл', 'слово', 'java', 'объектный', 'ориентированный', 'язык', 'напоминать', 'c++', 'простой', 'освоение', 'использование'], ['широкий', 'смысл', 'java', 'целый', 'технология', 'программирование', 'изначально', 'рассчитать', 'интеграция', 'web', 'сервис', 'использование', 'сетевой', 'среда'], ['web', 'навигатор', 'существовать', 'практически', 'аппаратно', 'программный', 'платформа', 'java', 'среда', 'мобильный', 'идеал', 'полностью', 'независимый', 'платформа'], ['цель', 'решение', 'перечислить', 'проблема', 'принять', 'интеграция', 'web', 'навигатор', 'два', 'важный', 'постулат'], ['специфицировать', 'виртуальный', 'java', 'машина', 'jvm', 'выполняться', 'интерпретироваться', 'java', 'программа'], ['определить', 'архитектура', 'представление', 'элемент', 'система', 'команда', 'java', 'машина'], ['исходный', 'java', 'текст', 'транслироваться', 'код', 'машина'], ['самым', 'появление', 'новый', 'аппаратно', 'программный', 'платформа', 'портировании', 'нуждаться', 'java', 'машина', 'программа', 'написать', 'java', 'пойти', 'изменение'], ['определить', 'редактирование', 'внешний', 'связь', 'java', 'программа', 'работа', 'web', 'навигатор', 'прозрачный', 'пользователь', 'образ', 'осуществляться', 'поиск', 'необходимый', 'объект', 'локальный', 'машина', 'компьютер', 'доступный', 'сеть', 'частность', 'www', 'сервер'], ['найденные', 'объект', 'загружаться', 'метод', 'выполняться', 'машина', 'пользователь'], ['несомненно', 'два', 'сформулировать', 'положение', 'существовать', 'тесный', 'связь'], ['компилировать', 'среда', 'трудный', 'абстрагироваться', 'аппаратный', 'особенность', 'компьютер', 'трудный', 'реализовать', 'прозрачный', 'динамический', 'загрузка', 'сеть'], ['сторона', 'приём', 'объект', 'извне', 'требовать', 'повышенный', 'осторожность', 'работа', 'java', 'программа'], ['принимать', 'мера', 'безопасность', 'интерпретировать', 'компилировать', 'среда'], ['мобильность', 'динамизм', 'безопасность', 'спутник', 'интерпретатор', 'компилятор'], ['принять', 'решение', 'делать', 'java', 'среда', 'идеальный', 'средство', 'разработка', 'интерактивный', 'клиентский', 'компонент', 'апплет', 'web', 'система'], ['отметить', 'прозрачный', 'пользователь', 'динамический', 'загрузка', 'объект', 'сеть'], ['вытекать', 'важный', 'достоинство', 'нулевой', 'стоимость', 'администрирование', 'клиентский', 'система', 'написать', 'java'], ['достаточный', 'обновить', 'версия', 'объект', 'сервер', 'клиент', 'автоматически', 'получить', 'старый', 'вариант'], ['реальный', 'работа', 'развить', 'сетевой', 'инфраструктура', 'практически', 'невозможный'], ['стандартный', 'реляционный', 'доступ', 'данным', 'важный', 'программа', 'java', 'java', 'апплет', 'природа', 'являться', 'монолитный', 'самодостаточный', 'программа'], ['модульный', 'апплет', 'получать', 'информация', 'хранилище', 'обрабатывать', 'записывать', 'обратно', 'последующий', 'обработка', 'апплет'], ['монолитный', 'программа', 'позволить', 'собственный', 'схема', 'обработка', 'java', 'апплет', 'пересекать', 'граница', 'операционный', 'система', 'компьютерный', 'сеть', 'нуждаться', 'опубликование', 'открытый', 'схема', 'доступ', 'данным'], ['интерфейс', 'jdbc', 'java', 'database', 'connectivity', 'связанность', 'база', 'java', 'являться', 'первый', 'попытка', 'реализация', 'доступ', 'данным', 'программа', 'java', 'зависеть', 'платформа', 'база'], ['версия', 'jdk', '1.1', 'jdbc', 'являться', 'составной', 'часть', 'основный', 'java', 'api'], ['jdbc', 'набор', 'реляционный', 'объект', 'метод', 'взаимодействие', 'источник'], ['программа', 'язык_java', 'открывать', 'связь', 'таблица', 'создавать', 'объект', 'оператор', 'передавать', 'оператор_sql', 'система', 'управление', 'база', 'получать', 'результат', 'служебный', 'информация'], ['типичный', 'случай', 'файл', '.class', 'jdbc', 'апплет', 'приложение', 'язык_java', 'находиться', 'компьютер', 'клиент'], ['загрузить', 'сеть', 'минимизация', 'задержка', 'время', 'выполнение', 'лучше', 'класс', 'jdbc', 'клиент'], ['система', 'управление', 'база', 'cубд', 'источник', 'расположены', 'удалённый', 'сервер'], ['рисунок', '19', 'показать', 'различный', 'вариант', 'реализация', 'связь', 'jdbc', 'база'], ['апплет', 'приложение', 'взаимодействовать', 'jdbc', 'система', 'клиент', 'драйвер', 'отвечать', 'обмен', 'информация', 'база', 'сеть'], ['класс', 'jdbc', 'находиться', 'пакет', 'java.sql'], [], ['программа', 'java', 'использовать', 'объект', 'метод', 'пакет', 'чтение', 'запись', 'источник'], ['программа', 'использовать', 'jdbc', 'требоваться', 'драйвер', 'источник', 'взаимодействовать'], ['драйвер', 'написать', 'другом', 'java', 'язык', 'программирование', 'являться', 'программа', 'язык_java', 'общаться', 'сервер', 'использовать', 'rpc', 'remote', 'procedure', 'call', 'удалённый', 'вызов', 'процедура', 'http'], ['оба', 'схема', 'привести', 'рис.19'], ['драйвер', 'jdbc', 'библиотека', 'другом', 'java', 'программа', 'сопряжение', 'odbc', 'jdbc', 'класс', 'java', 'общаться', 'сеть', 'сервер', 'база', 'использовать', 'rpc', 'http'], ['допускаться', 'приложение', 'дело', 'несколько', 'источник', 'неоднородный'], ['причина', 'jdbc', 'диспетчер', 'драйвер', 'чей', 'обязанность', 'заключаться', 'управление', 'драйвер', 'предоставление', 'программа', 'список', 'загрузить', 'драйвер'], ['словосочетание', 'база', 'входить', 'расшифровка', 'аббревиатура', 'jdbc', 'форма', 'содержание', 'расположение', 'интересовать', 'программа', 'java', 'использовать', 'jdbc', 'существовать', 'драйвер', 'данным'], ['сопряжение', 'jdbc', 'odbc', 'качество', 'составной', 'часть', 'jdbc', 'поставляться', 'драйвер', 'доступ', 'jdbc', 'источник', 'odbc', 'open', 'database', 'connectivity', 'называться', 'программа', 'сопряжение', 'jdbc', 'odbc'], ['программа', 'сопряжение', 'реализовать', 'вид', 'jdbcodbc.class', 'являться', 'библиотека', 'доступ', 'драйвер', 'odbc'], ['jdbc', 'конструктивно', 'близкий', 'odbc', 'программа', 'сопряжение', 'являться', 'несложный', 'надстройка', 'jdbc'], ['внутренний', 'уровень', 'драйвер', 'отображать', 'метод', 'java', 'вызов', 'odbc', 'самым', 'взаимодействовать', 'любой', 'odbc', 'драйвер'], ['достоинство', 'программа', 'сопряжение', 'состоять', 'jdbc', 'доступ', 'любой', 'база', 'odbc', 'драйвер', 'распространены', 'широко'], ['соответствие', 'правило', 'internet', 'jdbc', 'идентифицировать', 'база', 'помощь', 'url', 'форма', 'jdbc:<субпротокол>:<имя', 'связать', 'субд', 'протокол', '>', 'база', 'internet', 'intranet', 'имя', 'содержать', 'сетевой', 'url', '//<имя', 'хоста>:<порт>/', '<', 'субпротокол', '>', 'любой', 'имя', 'понимать', 'база'], ['имя', 'субпротокола', 'odbc', 'зарезервированно', 'источник', 'формат', 'odbc'], ['типичный', 'jdbc', 'url', 'база', 'odbc', 'выглядеть', 'следующий', 'образ', 'jdbc', 'odbc:<dns', 'имя', 'odbc>;user=<имя', 'пользователь', '>', 'pw=<пароль', '>', 'внутренний', 'устройство', 'jdbc', 'приложение', 'обработать', 'информация', 'база', 'информационный', 'обучать', 'система', 'язык_java', 'выполнять', 'ряд', 'шаг'], ['рис.20', 'показать', 'основной', 'объект', 'jdbc', 'метод', 'последовательность', 'выполнение', 'первых', 'программа', 'вызывать', 'метод', 'getconnection', 'получить', 'объект', 'connection'], ['создавать', 'объект', 'statement', 'подготавливать', 'оператор_sql'], ['оператор_sql', 'выполнить', 'немедленно', 'объект', 'statement', 'откомпилировать', 'объект', 'preparedstatement', 'представить', 'вид', 'вызов', 'процедура', 'объект', 'callablestatement'], ['выполняться', 'метод', 'executequery', 'возвращаться', 'объект', 'resultset'], ['оператор_sql', 'updatе', 'delete', 'возвращать', 'resultset'], ['оператор', 'использоваться', 'метод', 'executeupdate'], ['возвращать', 'целый', 'указывать', 'количество', 'ряд', 'затронуть', 'оператор_sql'], ['resultset', 'содержать', 'ряд', 'анализируетcя', 'метод', 'next'], ['приложение', 'обрабатывать', 'транзакция', 'пользоваться', 'метод', 'rollback', 'commit', 'отмена', 'подтверждение', 'изменение', 'внести', 'оператор_sql'], ['пример', 'запрос', 'модификация', 'база', 'использование', 'jdbc', 'пример', 'иллюстрировать', 'помощь', 'sql', 'опрератора', 'select', 'составляться', 'список', 'студент', 'база'], ['приводиться', 'шаг', 'необходимый', 'выполнение', 'задание', 'помощь', 'api', 'jdbc'], ['шаг', 'форма', 'текст', 'язык_java', 'комментариями'], ['описать', 'метод', 'переменный', 'public', 'void', 'liststudents', 'throws', 'sqlexception', 'int', 'i', 'noofcolumns', 'string', 'stno', 'stfname', 'stlname', 'инициализировать', 'загрузить', 'драйвер', 'jdbc', 'odbc', 'class.forname', 'jdbc.odbc', 'jdbcodbcdriver', 'создать', 'объект', 'connection', 'connection', 'ex1con', '=', 'drivermanager.getconnection', 'jdbc', 'odbc', 'studentdb;uid=\"admin\";pw=\"sa', 'создать', 'простой', 'объект', 'statement', 'statement', 'ex1stmt', '=', 'ex1con.createstatement', 'создать', 'строка', 'sql', 'передать', 'субд', 'выполнить', 'sql', 'оператор', 'resultset', 'ex1rs', '=', 'ex1stmt.executequery', 'select', 'studentnumber', 'firstname', 'lastname', 'from', 'students', 'обработать', 'ряд', 'вывести', 'результат', 'консоль', 'system.out.println', 'student', 'number', 'first', 'name', 'last', 'name', 'while', 'ex1rs.next', 'stno', '=', 'ex1rs.getstring', '1', 'stfname', '=', 'ex1rs.getstring', '2', 'stlname', '=', 'ex1rs.getstring', '3', 'system.out.println', 'stno', 'stfname', 'stlname', 'следующий', 'пример', 'поле', 'firstname', 'таблица', 'students', 'изменяться'], ['доступ', 'осуществляться', 'поле', 'studentnumber'], ['описать', 'метод', 'переменный', 'параметр', 'public', 'void', 'updatestudentname', 'string', 'stfname', 'string', 'stlname', 'string', 'stno', 'throws', 'sqlexception', 'int', 'retvalue', '//инициализировать', 'загрузить', 'драйвер', 'jdbc', 'odbc', 'class.forname', 'jdbc.odbc', 'jdbcodbcdriver', 'создать', 'объект', 'connection', 'connection', 'ex1con', '=', 'drivermanager.getconnection', 'jdbc', 'odbc', 'studentdb;uid=\"admin\";pw=\"sa', 'создать', 'простой', 'объект', 'statement', 'statement', 'ex1stmt', '=', 'ex1con.createstatement', 'создать', 'строка', 'sql', 'передать', 'субд', 'выполнить', 'sql', 'оператор', 'string', 'sqlbuffer', '=', 'update', 'students', 'set', 'firstname', '=', '+', 'stfname', '+', 'lastname', '=', '+', 'stlname', '+', 'where', 'studentnumber', '=', '+', 'stno', 'retvalue', '=', 'ex1stmt.executeupdate', 'sqlbuffer', 'system.out.println', 'модифицированно', '+', 'retvalue', '+', 'строка', 'база', 'рис.21'], ['интерфейс', 'регистрация', 'пользователь', 'аис'], ['образ', 'взаимодействие', 'база', 'java', 'отличаться', 'простота', 'гибкость', 'связать', 'эффективный', 'реализация', 'jdbc', 'api'], ['сочетание', 'природный', 'платформо', 'независимость', 'java', 'предоставлять', 'уникальный', 'инструмент', 'создание', 'интерактивный', 'распределить', 'информационный', 'обучающих', 'система', 'база', 'internet', 'intranet', 'технология'], ['основный', 'сложность', 'реализация', 'корпоративный', 'система', 'база', 'архитектура', 'являться', 'отсутствие', 'многих', 'популярный', 'приложение', 'средство', 'разработка', 'реализовать', 'вид', 'java', 'аплетов', 'относительный', 'высокий', 'время', 'компиляция', 'аплетов', 'клиентский', 'место', 'временно', 'вопрос', 'безопасный', 'работа', 'сеть'], ['2.2.1'], ['сравнительные', 'исследование', 'типовой', 'серверный', 'платформа'], ['выбирать', 'платформа', 'аис', 'учитывать', 'множество', 'аспект'], ['решение', 'влиять', 'соображение', 'связать', 'надёжность', 'кластеризация', 'балансировка', 'нагрузка', 'среда', 'разработка', 'работа', 'содержание', 'узел', 'защита', 'информация'], ['результат', 'тестирование', 'различный', 'платформа', 'широко', 'представить', 'периодический', 'печать', 'представить', 'обобщение', 'материал', 'тестирование'], ['проведение', 'испытание', 'оцениваться', 'solaris', '2.6', 'windows_nt', 'server', '4', 'red', 'hat', 'linux', '6.02', 'ядро', '2.2.11', 'эксплуатация', 'четыре', 'web', 'сервер', 'занимать', 'ведущий', 'позиция', 'мир', 'microsoft', 'internet', 'information', 'server', '4', 'iis', 'netscape_enterprise', 'server', '3.61', 'web', 'server', '2.1', 'корпорация', 'sun', 'stronghold', 'web', 'server', '2.4.1', 'популярный', 'вариант', 'web', 'сервер', 'apache', 'функция', 'защита', 'несанкционированный', 'доступ', 'тест', 'использоваться', 'триал', 'версия', 'указать', 'программный', 'обеспечение'], ['платформа', 'испытать', 'помощь', 'новый', 'версия', 'эталонный', 'тест', 'webbench', 'отделение', 'ziff', 'davis', 'benchmark', 'operation'], ['2.2.1.2'], ['особенность', 'функционирование', 'аис', 'платформа', 'sun'], ['solaris', 'современный', 'операционный', 'система', 'unix', 'клон'], ['примечательный', 'опережать', 'время', 'позволять', 'работать', '64-разрядными', 'прикладной_программа', 'собственный', 'расширение', 'помогать', 'выдерживать', 'высокий', 'пользовательский', 'нагрузка', 'web', 'узел', 'интенсивный', 'обмен', 'информация'], ['solaris', 'предусмотреть', 'замечательный', 'возможность', 'применение', 'серверный', 'прикладной_программа', 'средство', 'разработка', 'сторонний', 'производитель'], ['ключевой', 'момент', 'понимание', 'различие', 'платформа', 'linux', 'microsoft', 'sun', 'способ', 'серверный', 'программа', 'каждый', 'обрабатывать', 'большой', 'число', 'подключение'], ['делаться', 'многопотоковом', 'режим'], ['многопотоковый', 'режим', 'возникать', 'прикладной_программа', 'называть', 'процесс', 'содержать', 'множество', 'небольшой', 'блок', 'исполняемого', 'код', 'работать', 'независимо', 'друг', 'друга', 'одновременно', 'разный', 'процессорах'], ['поток', 'совместно', 'пользоваться', 'ресурс', 'представлять', 'способ', 'организация', 'программа', 'позволять', 'одновременно', 'выполнять', 'задача'], ['модель', 'поток', 'solaris', 'весьма', 'сложный'], ['состоять', 'поток', 'уровень', 'ядро', 'kthreads', 'реальный', 'объект', 'передавать', 'отдельный', 'процессор', 'поток', 'пользовательский', 'уровень', 'промежуточный', 'структура', 'называть', 'облегченным', 'lightweight', 'процесс'], ['позволять', 'тонко', 'управлять', 'структура', 'прикладной_программа', 'реализация', 'прикладной', 'многозадачность'], ['stronghhold', 'платформа', 'solaris', 'создатель', 'web', 'сервер', 'stronghold', 'apache', 'основа', 'stronghold', 'считать', 'многопотоковые', 'программа', 'надёжный', 'монолитный'], ['различие', 'стратегия', 'объяснять', 'значительный', 'расхождение', 'показатель', 'производительность', 'sun', 'web', 'server', '2.1', 'netscape_enterprise', 'использовать', 'второй', 'процессор', 'установить', 'испытательный', 'система'], ['stronghold', 'зависимость', 'прикладной', 'столь', 'эффективно', 'использовать', 'оборудование', 'sun', 'содержать', '64', 'процессор'], ['netscape', 'платформа', 'solaris', 'netscape_enterprise', 'server', '3.61', 'web', 'сервер', 'избрать', 'реализация', 'большинство', 'крупный', 'узел', 'основа', 'solaris', 'число', 'корпорация', 'sun'], ['инструментальный', 'средство', 'фирма', 'netscape', 'предлагать', 'независимый', 'производитель', 'способствовать', 'разработка', 'сложный', 'прикладной_программа', 'web', 'помощь', 'сценарий', 'язык', 'javascript', 'corba', 'java'], ['важный', 'система', 'стоить', 'добротный', 'программа', 'web', 'сервер', 'netscape', 'сервер', 'прикладной_программа', 'netscape', 'application', 'server', 'nas'], ['сервер', 'nas', 'среда', 'программирование', 'объект', 'язык', 'c++', 'java', 'обеспечивать', 'масштабируемость', 'устойчивость', 'сбой', 'прикладной_программа'], ['nas', 'иметься', 'инструмент', 'создание', 'многоуровневый', 'программа', 'объединять', 'html', 'запрос', 'база', 'сервер', 'nas'], ['sun', 'web', 'server', 'sun', 'web', 'server', 'sws', 'обеспечивать', 'разработка', 'программа', 'язык_java'], ['sws', 'использовать', 'сервлеты', 'разнообразный', 'возможность', 'corba'], ['сервлеты', 'servlet', 'java', 'программа', 'запускать', 'сервер', 'cgi', 'передавать', 'сверстанные', 'html_страница', 'браузер'], ['сервлет', 'существовать', 'собственный', 'api', 'функция', 'рабочий', 'среда', 'сервер'], ['sws', 'предусмотреть', 'возможность', 'использование', 'серверный', 'java', 'страница', 'java', 'server', 'pages', 'способ', 'обращение', 'серверный', 'функция', 'java', 'страница', 'web', 'cgi', 'программа'], ['соответствующий', 'использование', 'web', 'сервер', 'платформа', 'solaris', 'операционный', 'система', 'многопроцессорный', 'станция', 'превосходить', 'производительность', 'windows_nt'], ['результат', 'достигнуть', 'sun', 'microsystems', 'использование', 'solaris', 'network', 'cache', 'and', 'accelerator', 'snca', 'мощный', 'механизм', 'кэширование', 'web', 'сервер'], ['sws', 'победить', 'испытание', 'обслуживание', 'статический', 'страница'], ['выполнение', 'динамический', 'cgi', 'испытание', 'netscape', 'платформа', 'solaris', 'превзойти', 'sws', 'iis', 'windows_nt'], ['2.2.1.3'], ['особенность', 'функционирование', 'аис', 'платформа', 'microsoft'], ['microsoft', 'windows_nt', 'server', 'windows_nt', '4', 'server', 'internet', 'information', 'server', 'iis', 'являться', 'исключительно', 'коммерческой', 'web', 'платформа', 'разработать', 'компания', 'microsoft'], ['ос', 'удобный', 'интуитивно', 'понятный', 'интерфейс', 'взаимодействие', 'пользователь', 'делать', 'привлекательный', 'использование'], ['windows_nt', '4', 'server', 'оснастить', 'служба', 'балансировка', 'нагрузка', 'windows_nt', 'load', 'balancing', 'services', 'позволять', 'создавать', 'группа', 'сервер', 'распределять', 'нагрузка'], ['пользователь', 'видеть', 'ip', 'адрес', 'полагать', 'существовать', 'сервер'], ['служба', 'load', 'balancing', 'services', 'неполноценный', 'кластерный', 'система', 'способный', 'обеспечить', 'высокий', 'быстродействие', 'кластер'], ['windows_nt', 'работать', 'мощный', 'аппаратный', 'программный', 'средство', 'кластер', 'число', 'собственный', 'служба', 'microsoft', 'cluster', 'service', 'продукт', 'серия', 'infinity', 'компания', 'ibm', 'продукт', 'nonstop', 'производство', 'compaq'], ['microsoft', 'продукт', 'этап', 'разработка', 'web', 'заменять', 'изделие', 'фирма'], ['пакет', 'allaire', 'coldfusion', '4.0', 'среда', 'разработка', 'web', 'отличный', 'пример'], ['netscape_enterprise', 'платформа', 'windows_nt', 'netscape_enterprise', 'среда', 'windows_nt', 'представлять', 'web', 'сервер', 'ориентировать', 'больший', 'нагрузка'], ['иметься', 'множество', 'модель', 'программирование'], ['общепринятый', 'модель', 'разработка', 'html', 'cgi', 'продукт', 'netscape', 'предусмотреть', 'возможность', 'работа', 'javascript', 'сторона', 'сервер'], ['функция', 'сервер', 'netscape', 'solaris', 'работать', 'платформа', 'windows_nt'], ['тестирование', 'производительность', 'iis', 'показать', 'неплохой', 'результат'], ['скорость', 'работа', 'iis', 'достигнуть', 'счёт', 'организовать', 'обработка', 'файловый', 'ввод', 'вывод'], ['дополнять', 'обработка', 'сообщение', 'windows_nt', 'возможность', 'асинхронный', 'ввод', 'вывод', 'позволять', 'обрабатывать', 'запрос', 'одновременно', 'выполнение', 'операция', 'ввод', 'вывод', 'файл', 'лвс'], ['функция', 'иметься', 'solaris', 'полностью', 'реализовать', 'linux'], ['результат', 'тест', 'iis', 'проигрывать', 'sww', 'обработка', 'статический', 'страница', 'netscape_enterprise', 'платформа', 'nt', 'оказаться', 'производительный', 'режим', 'платформа', 'solaris'], ['2.2.1.4'], ['особенность', 'функционирование', 'аис', 'основа', 'linux'], ['расти', 'популярность', 'linux', 'респектабельность', 'платформа', 'разработка', 'web', 'корпоративный', 'среда'], ['linux', 'характеризоваться', 'преимущество', 'широкий', 'сообщество', 'разработчик', 'открытый', 'код', 'поддержка', 'многих', 'модель', 'комплектующих', 'главный', 'особенность', 'состоять', 'linux', 'полностью', 'бесплатный', 'ос'], ['linux', 'являться', 'разновидность', 'unix', 'изначально', 'создаваться', 'работа', 'сеть'], ['каждый', 'новый', 'версия', 'linux', 'появляться', 'усовершенствование', 'направить', 'повышение', 'масштабируемость', 'производительность', 'серверный', 'прикладной_программа'], ['apache', 'stronghold', 'тест', 'среда', 'linux', 'использовать', 'stronghold', 'web', 'server', '2.4.1', 'компания', 'c2net'], ['stronghold', 'сервер', 'возможность', 'применение', 'технология', 'ssl', 'основа', 'лежать', 'web', 'сервер', 'apache'], ['сервер', 'stronghold', 'обладать', 'преимущество', 'apache', 'число', 'мощный', 'средство', 'обеспечение', 'работа', 'виртуальный', 'базовый', 'машина', 'способность', 'web', 'сервер', 'обслуживать', 'машина', 'одновременно'], ['платформа', 'stronghold', 'linux', 'заслужить', 'репутация', 'надёжный', 'стабильный', 'система'], ['stronghold', 'следовательно', 'apache', 'оптимизировать', 'многопроцессорный', 'среда'], ['web', 'узел', 'основать', 'сервер', 'apache', 'хороший', 'масштабировать', 'путем', 'добавление', 'сервер', 'процессор'], ['iis', 'netscape_enterprise', 'иметь', 'многопотоковую', 'архитектура', 'масштабируется', 'процессор', 'сервер'], ['испытание', 'многопроцессорный', 'станция', 'правило', 'обгонять', 'stronghold'], ['apache', 'позволять', 'тонко', 'настраивать', 'ряд', 'параметр', 'число', 'процесс', 'доступный', 'клиент'], ['apache', 'сервер', 'механизм', 'работа', 'сервлетам', 'apache', 'jserv'], ['механизм', 'работа', 'сервлетами', 'встраиваться', 'apache', 'вид', 'модуль', 'работать', 'совместимой', 'jdk', '1.1', 'виртуальный', 'java', 'машина'], ['производительность', 'дуэт', 'apache', 'linux', 'оказаться', 'оптимальный', 'однопроцессорных', 'система'], ['обработка', 'статический', 'страница', 'уступать', 'sww', 'iis', 'стабильность', 'работа', 'превосходить', 'сервер', 'платформеwindows', 'nt'], ['linux', 'функциональность', 'unix', '+', 'пользовательско', 'ориентированный', 'интерфейс', 'windows', 'система'], ['больший', 'часть', 'поддерживаемого', 'linux', 'оборудование', 'пользователь', 'реально', 'иметь'], ['результат', 'оказаться', 'больший', 'часть', 'популярный', 'периферия', '80386/80486', 'поддерживаться', 'linux', 'поддерживать', 'оборудование', 'ряд', 'случай', 'поддерживать', 'коммерческий', 'unix'], ['достаточно', 'экзотический', 'устройство', 'поддерживаться'], ['важный', 'вопрос', 'создание', 'аис', 'являться', 'обеспечение', 'жизнестойкость', 'надёжность', 'работа', 'информационный', 'сервер'], ['качество', 'иллюстрация', 'эффективность', 'платформа', 'привести', 'расчёт', 'параметр', 'сервер', '25000', 'посетитель', 'день'], ['подсчёт', 'загрузка', '24ч*60мин*60', 'сек=86400', 'секунда', 'сутках', 'посетитель', 'брать', 'сервер', '10', 'документ', '.html', '+', 'график', 'равномерный', 'распределение', 'загрузка', 'получаться', '3', 'обращение', 'сервер', 'секунда'], ['реальный', 'распределение', 'трафик', 'носить', 'характер', 'кривой', 'гаусс', 'синусоида', 'зависимость', 'содержание', 'сервер', 'максимум', 'загрузка', 'достигать', '10', '20', 'обр', 'с.', 'нормальный', 'работа', 'сервер', '400', 'mb', 'ram', 'хороший', 'настройка', '200'], ['правильный', 'конфигурация', 'сервер', 'рекомендоваться', 'использовать', 'swap'], ['помещаться', 'оперативный', 'память', 'иметься', 'ввиду', 'сервер', 'swap', 'область', 'обязать', 'пустой'], ['предотвращение', 'перегрузка', 'рекомендоваться', 'пользоваться', 'несколько', 'правило', 'снижать', 'загрузка', 'сервер'], ['придерживаться', 'правило', 'съэкономить', '30', 'ресурс', 'сервер'], ['статический', 'информация', 'ставить', 'last', 'modified', 'атрибут', 'выдача', 'cgi', 'скрипт', 'документ', 'временной', 'штамп', 'сохраняться', 'локальный', 'кэш', 'постоянно', 'перезаписывается', 'просмотр'], ['cgi', 'программа', 'хранить', 'каталог', '/cgi', 'bin/', 'т.к.', 'proxy', 'серверы', 'кэшировать', 'файл', 'находиться', 'каталог', 'раз', 'вынуждены', 'обращаться', 'сервер'], ['устанавливать', 'поле', 'last', 'modified', 'русский', 'apache', 'автоматический', 'определение', 'кодировка', 'proxy', 'сервер', 'оставаться', 'файл', 'некорректный', 'кодировка'], ['применять', 'авторедирект', 'чарсету', 'русский', 'apache'], ['использовать', 'фрейм', 'т.к.', 'файл', 'появляться', 'минимум', '3'], ['использовать', 'анимированные', '.gif', 'т.к.', 'nn', 'обращаться', 'сервер', 'каждый', 'цикл'], ['404', 'код', 'делать', 'cgi', 'скрипт', '404', 'код', 'делать', 'красивый', 'графический', 'изображение', 'указание', 'прочие', 'раздел', 'т.к.', 'сойти', 'ум', 'робот', 'собирать', 'невероятный', 'количество', '404', 'ошибка', 'зацикливаясь', 'веко'], ['создать', 'сервер', 'файл', 'robot.txt', 'т.к.', 'запрашиваемый', 'документ', 'сервер', 'порождать', 'масса', '404', 'см.', 'п.', '7'], ['разумный', 'робот', 'слушаться', 'запрет', 'файл', 'уменьшать', 'нагрузка', 'сервер'], ['ставить', 'баннер', 'страница', 'т.к.', 'баннер', 'сверху', 'отнимать', '1', '2', 'реквеста', '4-х', 'итог', 'грузиться', 'вперёд', 'тормозить', 'сайтовый', 'картинка'], ['вызов', 'баннер', 'обращаться', 'раз', 'cgi', 'подставлять', 'случайный', 'число', 'число', 'сделать', 'получить', 'дата', 'javascript'], ['вызывать', 'баннер', 'программа', 'си', 'т.к.', 'perl', 'работать', 'медленный'], ['машина', 'размещаться', 'информационный', 'сервер', 'одновременно', 'почта', 'и др.'], ['сервис'], ['сегодня', 'архитектура', 'internet', 'intranet', 'число', 'платформа', 'linux', 'использоваться', 'построение', 'корпоративный', 'ис', 'решение', 'задача', 'автоматизация', 'управление', 'банк', 'управление', 'проектирование', 'управление', 'тп', 'асу', 'тп', 'электронный', 'коммерция', 'оперативный', 'информация', 'курс', 'валюта', 'акция', 'т.п.']]"
|
||
]
|
||
],
|
||
"shape": {
|
||
"columns": 4,
|
||
"rows": 5
|
||
}
|
||
},
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>doc</th>\n",
|
||
" <th>text</th>\n",
|
||
" <th>type</th>\n",
|
||
" <th>prep_text</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>36</th>\n",
|
||
" <td>Этапы разработки проекта2.docx</td>\n",
|
||
" <td>Этапы разработки проекта: заключительные стади...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>[[этап, разработка, проект, заключительные, ст...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>37</th>\n",
|
||
" <td>Этапы разработки проекта3.docx</td>\n",
|
||
" <td>Этапы разработки проекта: определение стратеги...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>[[этап, разработка, проект, определение, страт...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>38</th>\n",
|
||
" <td>Этапы разработки проекта4.docx</td>\n",
|
||
" <td>Этапы разработки проекта: реализация, тестиров...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>[[этап_разработка, проект, реализация, тестиро...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>39</th>\n",
|
||
" <td>Этапы разработки проекта5.docx</td>\n",
|
||
" <td>Этапы разработки проекта: стратегия и анализ\\n...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>[[этап, разработка_проект, стратегия, анализ, ...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>40</th>\n",
|
||
" <td>Язык манипуляции данными.docx</td>\n",
|
||
" <td>2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма...</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>[[2.1.3], [язык, манипуляция, данными, ямд, яз...</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" doc \\\n",
|
||
"36 Этапы разработки проекта2.docx \n",
|
||
"37 Этапы разработки проекта3.docx \n",
|
||
"38 Этапы разработки проекта4.docx \n",
|
||
"39 Этапы разработки проекта5.docx \n",
|
||
"40 Язык манипуляции данными.docx \n",
|
||
"\n",
|
||
" text type \\\n",
|
||
"36 Этапы разработки проекта: заключительные стади... 1 \n",
|
||
"37 Этапы разработки проекта: определение стратеги... 1 \n",
|
||
"38 Этапы разработки проекта: реализация, тестиров... 1 \n",
|
||
"39 Этапы разработки проекта: стратегия и анализ\\n... 1 \n",
|
||
"40 2.1.3. Язык манипуляции данными (ЯМД)\\nЯзык ма... 1 \n",
|
||
"\n",
|
||
" prep_text \n",
|
||
"36 [[этап, разработка, проект, заключительные, ст... \n",
|
||
"37 [[этап, разработка, проект, определение, страт... \n",
|
||
"38 [[этап_разработка, проект, реализация, тестиро... \n",
|
||
"39 [[этап, разработка_проект, стратегия, анализ, ... \n",
|
||
"40 [[2.1.3], [язык, манипуляция, данными, ямд, яз... "
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from gensim.models.phrases import Phraser, Phrases\n",
|
||
"\n",
|
||
"def prep_text(text):\n",
|
||
" doc = sp(text)\n",
|
||
" lower_sents = []\n",
|
||
" for sent in doc.sents:\n",
|
||
" lower_sents.append([word.lemma_.lower() for word in sent if not word.is_punct and not word.is_stop and not word.is_space])\n",
|
||
" lower_bigram = Phraser(Phrases(lower_sents))\n",
|
||
" clean_sents = []\n",
|
||
" for sent in lower_sents:\n",
|
||
" clean_sents.append(lower_bigram[sent])\n",
|
||
" return clean_sents\n",
|
||
"\n",
|
||
"df[\"prep_text\"] = df.apply(lambda row: prep_text(row[\"text\"]), axis=1)\n",
|
||
"display(df.head(), df.tail())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "d1fb85f8",
|
||
"metadata": {},
|
||
"source": [
|
||
"Осуществим векторизацию текстовых данных при помощи word2vec:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 73,
|
||
"id": "0eddd3c4",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from gensim.models.word2vec import Word2Vec\n",
|
||
"\n",
|
||
"word2vec = Word2Vec(\n",
|
||
" sentences=df[\"prep_text\"].explode().tolist(),\n",
|
||
" vector_size=64,\n",
|
||
" sg=1,\n",
|
||
" window=10,\n",
|
||
" epochs=5,\n",
|
||
" min_count=10,\n",
|
||
" workers=4,\n",
|
||
" seed=9,\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2a8a0d5c",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Теперь сформируем тренировочную и тестовые выборки.\n",
|
||
"\n",
|
||
"Каждый документ будет представлен списком, содержащим идентификаторы слов в пространстве. При этом идентификатор 0 зарезервирован за словом pad, то есть заполняющим (\"пустым\") словом для дополнения при необходимости документов до длины 1500. То есть все документы будут приведены к одинаковой длине по словам: 1500 слов, если больше, то обрезается, если меньше, то дополняется \"пустыми\" словами.\n",
|
||
"\n",
|
||
"Для начала добавим pad в word2vec.wv.key_to_index с id 0:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 75,
|
||
"id": "88263d40",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"[('pad', 0),\n",
|
||
" ('система', 1),\n",
|
||
" ('работа', 2),\n",
|
||
" ('требование', 3),\n",
|
||
" ('база', 4),\n",
|
||
" ('пользователь', 5),\n",
|
||
" ('разработка', 6),\n",
|
||
" ('модель', 7),\n",
|
||
" ('информация', 8),\n",
|
||
" ('субд', 9),\n",
|
||
" ('этап', 10),\n",
|
||
" ('ошибка', 11),\n",
|
||
" ('являться', 12),\n",
|
||
" ('функция', 13),\n",
|
||
" ('таблица', 14),\n",
|
||
" ('средство', 15),\n",
|
||
" ('проект', 16),\n",
|
||
" ('сервер', 17),\n",
|
||
" ('процесс', 18),\n",
|
||
" ('документ', 19)]"
|
||
]
|
||
},
|
||
"execution_count": 75,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"word_to_id = word2vec.wv.key_to_index\n",
|
||
"word_to_id = {'pad': 0, **{k: v+1 for k, v in word2vec.wv.key_to_index.items()}}\n",
|
||
"list(word_to_id.items())[:20]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "44dbe76d",
|
||
"metadata": {},
|
||
"source": [
|
||
"Преобразуем тексты в списки индексов:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 76,
|
||
"id": "38c1b807",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def text_to_ids(sentences, word_to_id):\n",
|
||
" flat_words = [word for sent in sentences for word in sent]\n",
|
||
" return [word_to_id.get(word, 0) for word in flat_words]\n",
|
||
"\n",
|
||
"df[\"ids\"] = df[\"prep_text\"].apply(lambda doc: text_to_ids(doc, word_to_id))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "dd03f9a8",
|
||
"metadata": {},
|
||
"source": [
|
||
"Применим padding и truncating (приведем документы к длине 1500):"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 77,
|
||
"id": "95501ff5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"from keras.api.preprocessing.sequence import pad_sequences\n",
|
||
"\n",
|
||
"max_length = 1500\n",
|
||
"X = pad_sequences(df[\"ids\"].tolist(), maxlen=max_length, padding=\"pre\", truncating=\"pre\", value=0)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "a1e702a9",
|
||
"metadata": {},
|
||
"source": [
|
||
"Теперь можно получить тренировочную и тестовую выборки:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 78,
|
||
"id": "f367f9e9",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[ 0, 0, 0, ..., 134, 108, 148],\n",
|
||
" [ 29, 0, 0, ..., 0, 0, 294],\n",
|
||
" [ 0, 0, 0, ..., 134, 108, 148],\n",
|
||
" ...,\n",
|
||
" [ 0, 45, 251, ..., 0, 225, 30],\n",
|
||
" [ 0, 0, 0, ..., 219, 0, 0],\n",
|
||
" [ 0, 0, 0, ..., 194, 134, 5]])"
|
||
]
|
||
},
|
||
"execution_count": 78,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"from sklearn.model_selection import train_test_split\n",
|
||
"\n",
|
||
"y = df[\"type\"].values\n",
|
||
"\n",
|
||
"X_train, X_test, y_train, y_test = train_test_split(\n",
|
||
" X, y, test_size=0.2, random_state=42, stratify=y\n",
|
||
")\n",
|
||
"X_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 79,
|
||
"id": "ded60549",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1,\n",
|
||
" 0, 1, 1, 1, 0, 1, 0, 1, 0, 0], dtype=int64)"
|
||
]
|
||
},
|
||
"execution_count": 79,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y_train"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "9343127d",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Сформируем архитектуру глубокой полносвязанной сети:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 80,
|
||
"id": "52b9ae4b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_1\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">66,496</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ flatten_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">96000</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">6,144,064</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1500\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m66,496\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ flatten_1 (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m96000\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m6,144,064\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_2 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m65\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">6,210,625</span> (23.69 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m6,210,625\u001b[0m (23.69 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">6,210,625</span> (23.69 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m6,210,625\u001b[0m (23.69 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from keras.api.layers import Embedding\n",
|
||
"\n",
|
||
"vocab_size = len(word_to_id)\n",
|
||
"\n",
|
||
"model = Sequential()\n",
|
||
"model.add(InputLayer(shape=(max_length,), dtype=\"int32\"))\n",
|
||
"\n",
|
||
"model.add(Embedding(input_dim=vocab_size, output_dim=64))\n",
|
||
"\n",
|
||
"model.add(Flatten())\n",
|
||
"\n",
|
||
"model.add(Dense(64, activation=\"relu\"))\n",
|
||
"model.add(Dropout(0.5))\n",
|
||
"\n",
|
||
"model.add(Dense(1, activation=\"sigmoid\"))\n",
|
||
"\n",
|
||
"model.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "4b3c32a7",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучим полносвязную модель:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 81,
|
||
"id": "35531a89",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 675ms/step - accuracy: 0.4375 - loss: 0.6920 - val_accuracy: 0.4444 - val_loss: 0.8539\n",
|
||
"Epoch 2/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 330ms/step - accuracy: 0.7500 - loss: 0.6695 - val_accuracy: 0.7778 - val_loss: 0.5829\n",
|
||
"Epoch 3/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 31ms/step - accuracy: 0.8750 - loss: 0.3771 - val_accuracy: 0.7778 - val_loss: 0.5975\n",
|
||
"Epoch 4/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 32ms/step - accuracy: 0.8750 - loss: 0.3305 - val_accuracy: 0.7778 - val_loss: 0.5050\n",
|
||
"Epoch 5/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 33ms/step - accuracy: 0.9375 - loss: 0.1816 - val_accuracy: 0.7778 - val_loss: 0.5112\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<keras.src.callbacks.history.History at 0x1ebe867eba0>"
|
||
]
|
||
},
|
||
"execution_count": 81,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"model.compile(\n",
|
||
" loss=\"binary_crossentropy\",\n",
|
||
" optimizer=\"adam\",\n",
|
||
" metrics=[\"accuracy\"],\n",
|
||
")\n",
|
||
"\n",
|
||
"model.fit(\n",
|
||
" X_train,\n",
|
||
" y_train,\n",
|
||
" batch_size=128,\n",
|
||
" epochs=5,\n",
|
||
" validation_data=(X_test, y_test)\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "02ae5ff9",
|
||
"metadata": {},
|
||
"source": [
|
||
"Оценим ее:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 82,
|
||
"id": "8f816eec",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 9ms/step - accuracy: 0.7778 - loss: 0.5112\n",
|
||
"Loss на тестовой выборке: 0.5112\n",
|
||
"Accuracy на тестовой выборке: 0.7778\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"evaluate_model(model, X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "999af581",
|
||
"metadata": {},
|
||
"source": [
|
||
"Accuracy составила 77.78%."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "474cc997",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Теперь спроектируем сверточную сеть и для классификации текстов:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 84,
|
||
"id": "e24aee38",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_2\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">66,496</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ spatial_dropout1d │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">SpatialDropout1D</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv1d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv1D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1498</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">49,408</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ global_max_pooling1d │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">GlobalMaxPooling1D</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">65,792</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dropout</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">257</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding_1 (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1500\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m66,496\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ spatial_dropout1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1500\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ conv1d (\u001b[38;5;33mConv1D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1498\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m49,408\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ global_max_pooling1d │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mGlobalMaxPooling1D\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_5 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m65,792\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dropout_3 (\u001b[38;5;33mDropout\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m257\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">181,953</span> (710.75 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m181,953\u001b[0m (710.75 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">181,953</span> (710.75 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m181,953\u001b[0m (710.75 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from keras.api.layers import SpatialDropout1D, Conv1D, GlobalMaxPooling1D\n",
|
||
"\n",
|
||
"conv_model = Sequential()\n",
|
||
"conv_model.add(InputLayer(shape=(max_length,), dtype=\"int32\"))\n",
|
||
"\n",
|
||
"conv_model.add(Embedding(input_dim=vocab_size, output_dim=64))\n",
|
||
"\n",
|
||
"conv_model.add(SpatialDropout1D(0.2))\n",
|
||
"\n",
|
||
"conv_model.add(Conv1D(filters=256, kernel_size=3, activation=\"relu\"))\n",
|
||
"conv_model.add(GlobalMaxPooling1D())\n",
|
||
"\n",
|
||
"conv_model.add(Dense(256, activation=\"relu\"))\n",
|
||
"conv_model.add(Dropout(0.3)) \n",
|
||
"\n",
|
||
"conv_model.add(Dense(1, activation=\"sigmoid\"))\n",
|
||
"\n",
|
||
"conv_model.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "85d6f434",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучим ее:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 85,
|
||
"id": "d09efc78",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 854ms/step - accuracy: 0.5000 - loss: 0.6952 - val_accuracy: 0.5556 - val_loss: 0.6885\n",
|
||
"Epoch 2/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 520ms/step - accuracy: 0.4062 - loss: 0.6895 - val_accuracy: 0.6667 - val_loss: 0.6847\n",
|
||
"Epoch 3/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 96ms/step - accuracy: 0.6250 - loss: 0.6856 - val_accuracy: 0.6667 - val_loss: 0.6806\n",
|
||
"Epoch 4/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 109ms/step - accuracy: 0.6250 - loss: 0.6825 - val_accuracy: 0.6667 - val_loss: 0.6761\n",
|
||
"Epoch 5/5\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 97ms/step - accuracy: 0.7812 - loss: 0.6719 - val_accuracy: 0.8889 - val_loss: 0.6715\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<keras.src.callbacks.history.History at 0x1eb6c967950>"
|
||
]
|
||
},
|
||
"execution_count": 85,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"conv_model.compile(\n",
|
||
" loss=\"binary_crossentropy\",\n",
|
||
" optimizer=\"adam\",\n",
|
||
" metrics=[\"accuracy\"],\n",
|
||
")\n",
|
||
"\n",
|
||
"conv_model.fit(\n",
|
||
" X_train,\n",
|
||
" y_train,\n",
|
||
" batch_size=128,\n",
|
||
" epochs=5,\n",
|
||
" validation_data=(X_test, y_test)\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c885282e",
|
||
"metadata": {},
|
||
"source": [
|
||
"И оценим качество:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 86,
|
||
"id": "9bb11096",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step - accuracy: 0.8889 - loss: 0.6715\n",
|
||
"Loss на тестовой выборке: 0.6715\n",
|
||
"Accuracy на тестовой выборке: 0.8889\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"evaluate_model(conv_model, X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "22b1ddb4",
|
||
"metadata": {},
|
||
"source": [
|
||
"Здесь accuracy равно 88.89%."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "5ef49bf2",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Спроектируем последнюю модель - рекуррентную сеть."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 92,
|
||
"id": "fd41d9b5",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_4\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential_4\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Embedding</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">66,496</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ spatial_dropout1d_2 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1500</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
|
||
"│ (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">SpatialDropout1D</span>) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ simple_rnn_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">SimpleRNN</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">24,704</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">129</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ embedding_3 (\u001b[38;5;33mEmbedding\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1500\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m66,496\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ spatial_dropout1d_2 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1500\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
|
||
"│ (\u001b[38;5;33mSpatialDropout1D\u001b[0m) │ │ │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ simple_rnn_1 (\u001b[38;5;33mSimpleRNN\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m24,704\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_9 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m129\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">91,329</span> (356.75 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m91,329\u001b[0m (356.75 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">91,329</span> (356.75 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m91,329\u001b[0m (356.75 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"from keras.api.layers import SimpleRNN\n",
|
||
"\n",
|
||
"rnn_model = Sequential()\n",
|
||
"rnn_model.add(InputLayer(shape=(max_length,), dtype=\"int32\"))\n",
|
||
"\n",
|
||
"rnn_model.add(Embedding(input_dim=vocab_size, output_dim=64))\n",
|
||
"\n",
|
||
"rnn_model.add(SpatialDropout1D(0.2))\n",
|
||
"\n",
|
||
"rnn_model.add(SimpleRNN(128, dropout=0.2, recurrent_dropout=0.2))\n",
|
||
"\n",
|
||
"rnn_model.add(Dense(1, activation=\"sigmoid\"))\n",
|
||
"\n",
|
||
"rnn_model.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "4a99fc16",
|
||
"metadata": {},
|
||
"source": [
|
||
"Обучение:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 93,
|
||
"id": "451d1b0f",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 853ms/step - accuracy: 0.6250 - loss: 0.6622 - val_accuracy: 0.4444 - val_loss: 0.7020\n",
|
||
"Epoch 2/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 659ms/step - accuracy: 0.4375 - loss: 0.7309 - val_accuracy: 0.5556 - val_loss: 0.7070\n",
|
||
"Epoch 3/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 194ms/step - accuracy: 0.4688 - loss: 0.7195 - val_accuracy: 0.5556 - val_loss: 0.7143\n",
|
||
"Epoch 4/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 193ms/step - accuracy: 0.5312 - loss: 0.7358 - val_accuracy: 0.4444 - val_loss: 0.7031\n",
|
||
"Epoch 5/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 198ms/step - accuracy: 0.5312 - loss: 0.6782 - val_accuracy: 0.2222 - val_loss: 0.7270\n",
|
||
"Epoch 6/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 193ms/step - accuracy: 0.4688 - loss: 0.6863 - val_accuracy: 0.5556 - val_loss: 0.7063\n",
|
||
"Epoch 7/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 195ms/step - accuracy: 0.5312 - loss: 0.7249 - val_accuracy: 0.5556 - val_loss: 0.6826\n",
|
||
"Epoch 8/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 200ms/step - accuracy: 0.5938 - loss: 0.6700 - val_accuracy: 0.4444 - val_loss: 0.7281\n",
|
||
"Epoch 9/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 194ms/step - accuracy: 0.5938 - loss: 0.6613 - val_accuracy: 0.3333 - val_loss: 0.7167\n",
|
||
"Epoch 10/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 201ms/step - accuracy: 0.4688 - loss: 0.7230 - val_accuracy: 0.2222 - val_loss: 0.7209\n",
|
||
"Epoch 11/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 196ms/step - accuracy: 0.6875 - loss: 0.6186 - val_accuracy: 0.6667 - val_loss: 0.6974\n",
|
||
"Epoch 12/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 194ms/step - accuracy: 0.6250 - loss: 0.6637 - val_accuracy: 0.2222 - val_loss: 0.7300\n",
|
||
"Epoch 13/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 194ms/step - accuracy: 0.5625 - loss: 0.6835 - val_accuracy: 0.6667 - val_loss: 0.6938\n",
|
||
"Epoch 14/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 193ms/step - accuracy: 0.7812 - loss: 0.6174 - val_accuracy: 0.2222 - val_loss: 0.7193\n",
|
||
"Epoch 15/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 197ms/step - accuracy: 0.4688 - loss: 0.7622 - val_accuracy: 0.3333 - val_loss: 0.7256\n",
|
||
"Epoch 16/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 206ms/step - accuracy: 0.4688 - loss: 0.7338 - val_accuracy: 0.6667 - val_loss: 0.6825\n",
|
||
"Epoch 17/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 197ms/step - accuracy: 0.4688 - loss: 0.7371 - val_accuracy: 0.3333 - val_loss: 0.7184\n",
|
||
"Epoch 18/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 194ms/step - accuracy: 0.5312 - loss: 0.7219 - val_accuracy: 0.3333 - val_loss: 0.7221\n",
|
||
"Epoch 19/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 192ms/step - accuracy: 0.6250 - loss: 0.6404 - val_accuracy: 0.4444 - val_loss: 0.7034\n",
|
||
"Epoch 20/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 201ms/step - accuracy: 0.6250 - loss: 0.6813 - val_accuracy: 0.4444 - val_loss: 0.7206\n",
|
||
"Epoch 21/40\n",
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 205ms/step - accuracy: 0.4375 - loss: 0.7198 - val_accuracy: 0.5556 - val_loss: 0.6957\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<keras.src.callbacks.history.History at 0x1eb97036690>"
|
||
]
|
||
},
|
||
"execution_count": 93,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"rnn_model.compile(\n",
|
||
" loss=\"binary_crossentropy\",\n",
|
||
" optimizer=\"adam\",\n",
|
||
" metrics=[\"accuracy\"],\n",
|
||
")\n",
|
||
"\n",
|
||
"early_stop = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=True)\n",
|
||
"rnn_model.fit(\n",
|
||
" X_train,\n",
|
||
" y_train,\n",
|
||
" batch_size=128,\n",
|
||
" epochs=40,\n",
|
||
" validation_data=(X_test, y_test),\n",
|
||
" callbacks=[early_stop]\n",
|
||
")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "5a29ca70",
|
||
"metadata": {},
|
||
"source": [
|
||
"Оценка качества:"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 94,
|
||
"id": "48bb5e0d",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 123ms/step - accuracy: 0.6667 - loss: 0.6974\n",
|
||
"Loss на тестовой выборке: 0.6974\n",
|
||
"Accuracy на тестовой выборке: 0.6667\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"evaluate_model(rnn_model, X_test, y_test)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "57b8e468",
|
||
"metadata": {},
|
||
"source": [
|
||
"У рекуррентной модели accuracy равна 66.67%.\n",
|
||
"\n",
|
||
"В итоге, были получены следующие результаты:\n",
|
||
"* Лучший результат у сверточной сети - 88.89%.\n",
|
||
"* Второе место - полносвязанная модель с accuracy 77.78%.\n",
|
||
"* Третье место - рекуррентная сеть. У нее accuracy 66.67%."
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "aimenv",
|
||
"language": "python",
|
||
"name": "python3"
|
||
},
|
||
"language_info": {
|
||
"codemirror_mode": {
|
||
"name": "ipython",
|
||
"version": 3
|
||
},
|
||
"file_extension": ".py",
|
||
"mimetype": "text/x-python",
|
||
"name": "python",
|
||
"nbconvert_exporter": "python",
|
||
"pygments_lexer": "ipython3",
|
||
"version": "3.12.5"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|