Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Оценка затрат на разработку программных средств

..pdf
Скачиваний:
10
Добавлен:
12.11.2023
Размер:
11.13 Mб
Скачать

четырех группах распределены 19 факторов, которые, по мнению авторов, наиболее важны при анализе С|Р. Селекция наиболее важ­ ных факторов и их группирование проводились многими специали­ стами. Перечисление выделявшихся факторов в девяти наиболее серьезных работах но анализу затрат представлено в [6, 67]. По­ казано, что для каждой из работ характерен акцент на своеобраз­ ный набор факторов, что в значительной степени определялось спецификой анализируемого набора ПС. Из общего числа 29 фак­ торов, распределенных по 5 группам, при анализе затрат в каждой из работ учитывалось от 50 до 70%. Это обстоятельство, в частно­ сти, явилось причиной значительного разброса опубликованных технико-экономических характеристик ПС.

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

или более основные ТЭП процесса разработки программ. Боль­ шинство факторов изменяет экономические характеристики разра­ ботки программ на десятки процентов и не более чем в 2—3 раза. Различные рекламные публикации о создании и внедрении «уни­ кального» метода, обеспечившего повышение производительности труда специалистов на порядок или более, всегда обусловлены не­ корректным измерением эффективности предлагаемого метода или другими сугубо рекламными причинами [7, 52].

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

ствует возможная достоверность оценки параметра, исчисляемая процентами, средней (С) — десятками процентов, а низкой (Н) —

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

Для большинства факторов произведены оценки диапазона воз-

ложного изменения относительных затрат на разработку одной

команды в КП при варьировании соответствующего параметра в указанном диапазоне. Эти изменения затрат в дальнейшем харак­ теризуются коэффициентами с,,* изменения усредненной трудоемко­ сти разработки строки текста программы за весь цикл создания КП при варьировании /-го фактора из i-й группы. Кроме оценок предельных значений КИТ, приводятся средние величины (заштри­

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

фактора. Для ряда факторов даны гипотетические графики зави­ симости КИТ и простые (линейные, логарифмические) выражения,

71

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

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

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

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

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

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

Наиболее важен учет и анализ факторов на начальных этапах разработки, когда прогнозируются совокупные затраты Ср на соз­

72

дание КП и их составляющая Сip. На этих этапах неопределен­

ность оценки параметров и факторов наибольшая, тем не менее применение приводимых характеристик позволяет избежать оши­ бок в несколько раз при оценке затрат, которые делаются экспер­ тами без детального анализа влияния факторов. Подобный анализ является базой для рационального распределения ресурсов разра­ ботки и для управления их использованием но мере развития проекта. Учет возможного изменения затрат в зависимости от основных параметров способствует упорядочению процесса разра­ ботки КП и концентрации усилий на тех факторах, которые могут дать максимальный эффект в конкретных условиях создания про­ грамм. После проведения структурного проектирования и распре­ деления ресурсов КП (этап 2) возможна ошибка в оценке затрат на разработку приблизительно в полтора-два раза, а перед про­ граммированием (этап 4) она уменьшается до 20—30%. Такие достоверности можно получить, конечно, только при подробном анализе и оценке влияния важнейших факторов.

Факторы КП как объекта проектирования, влияющие на непо­ средственные затраты при разработке сложных программ (табл. 2.2). Эта группа факторов отличается наибольшим влияни­ ем на затраты и производительность труда. При выделении трех классов программ в § 1.3 важное значение имели сущность про­ грамм с позиции процесса их создания, а также относительные и абсолютные затраты на их разработку. Эти обстоятельства опре­ делили концентрацию материала книги на анализе прежде всего

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

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

тию программных

средств производственно-технического

назна­

чения.

к о м п л е к с а п р о г р а м м . Понятие

сложно­

С л о ж н о с т ь

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

73

Ф А К Т О Р Ы К П К А К О Б Ъ Е К Т А П Р О Е К Т И Р О В А Н И Я . В Л И Я Ю Щ И Е Н А Н Е П О С Р Е Д С Т В Е Н Н Ы Е З А Т Р А Т Ы П Р И Р А З Р А Б О Т К Е С Л О Ж Н Ы Х П Р О Г Р А М М

I

 

зобОн а ч е н и е арапм е т р *

тсоДо в е р ­

ьтсон о ц е н к и марап е т р а

пЯ*/ п

 

 

 

П а р а м е т р ы , х а р а к т е р и з у ю щ и е

Д и а п а з о н

 

 

Ф а к т о р ы о б ъ е к т а р а з р а б о т к и

к а ж д ы й ф а к т о р

и з м е н е н и я

 

 

 

п а р а м е т р а

 

 

 

 

 

I

 

 

 

 

Т а б л и ц а 2.2

Д и а п а з о н

С р е д н и е

з н а ч е н и я

кит

кит

1

Сложность

комплекса

про­

Число операторов в тексте про­

 

грамм Си

 

 

грамм на ассемблере

 

2

Размер базы

данных КП — с)2

Число типов переменных в ба­

 

 

 

 

зе данных

 

3

Надежность

функционирования

Часы наработки на отказ про­

 

К П -с .з

 

 

грамм

 

 

4

Ограничение

ресурсов произво­

Процент использования памяти

 

дительности

и оперативной па­

и производительности

 

 

мяти реализующей ЭВМ — си

 

 

 

5

Длительность предполагаемой

Годы эксплуатации

 

 

эксплуатации КП — с,5

 

 

 

 

6

Предполагаемый тираж

КП —

Число предполагаемых

экземп­

 

c’i6

 

 

ляров кп

 

 

7

Мобильность

использования

Процент

возможного

исполь­

 

компонент КП из других раз­

зования компонент КП

 

 

работок с , 7

 

 

 

 

8

Мобильность

использования

Процент

возможного использо­

 

компонент КП для других раз­

вания компонент из других КП

 

работок — с18

 

 

 

 

Я,<

104—107

В

1—4

2—3

 

 

1о3— 108

с

1— 1.2

U

 

Т„

1— 103

с

1—5

2—2,5

 

р

50—95

с

1—3

1.3—

1,5

h

1—20

с

1 -3

1.3—

1,5

 

 

N

1—1000

в

1-3

1.3—1,5

 

 

0—80

с

1— 1.4

1,1—1,2

 

 

0—80

с

1—0.4

0.5—0,7

 

Наиболее активно в качестве показатели сложности использу­ ется объем программ, выраженный числом операторов на ассемб­

лере или строк на языке программирования высокого уровня. В § 1.3 обсуждался вопрос о способах и единицах измерения объ­ ема разрабатываемых программ и обоснована целесообразность проводить эти оценки в числе операторов (команд) на языке ас­ семблера. Реальное изменение создаваемых в настоящее время сложных КП от КУ* до 107 команд определяет диапазон трудоемко­ сти разработки таких программ от чечовеко-года до десятков тысяч человеко-лет. Объем программ является одной из наиболее достоверно измеряемых характеристик КП и достаточно адекватен ряду ТЭП процесса разработки. Широкий диапазон изменения объема создаваемых программ в наибольшей степени определяет значения суммарной трудоемкости их разработки. Подтверждена высокая статистическая корреляция ( — 0,85) [6] между объемом программ в операторах на ассемблере и трудоемкостью их разра­ ботки по большому числу проектов. С другой стороны, отсутству­ ют какие-либо данные о значительном преимуществе других мер сложности при прогнозировании затрат на разработку сложных и сверхсложных КП. Объем программ в числе операторов на ассемб­ лере характеризуется простотой и экономичностью определения, а также удобством для расчетов и прогнозирования.

Однако опыт подсказывает, что по мере увеличения объема про­ грамм возрастают не только абсолютные, но и относительные за­ траты на разработку каждой команды в программе. Вследствие этого затраты труда при разработке одной команды в программах разного объема могут различаться в несколько раз. В [53] пока­ зано, что трудоемкость разработки программного модуля пропор­ циональна квадрату объема программы. Модульно-иерархическое построение крупных КП позволяет замедлить квадратичный рост сложности и соответствующей ей трудоемкости разработки при увеличении объема программ. Суммарную трудоемкость разра­ ботки сложного КП можно представить двумя сомножителями. Первый сомножитель является доминирующим, прямо пропорци­ онален объему программ Пк в КП и отражает соответствующее

быстрое возрастание трудоемкости создания любых программ при увеличении их объема (2.3).

Однако при увеличении объема программ в ряде случаев на­ блюдается более быстрый рост их сложности разработки, чем опи­ сываемый простой линейной зависимостью. Это обстоятельство можно учесть поправочным вторым сомножителем Си, отражаю­ щим изменение трудоемкости на разработку каждой команды в программе при увеличении ее размера. Логично предположить, что по мере увеличения объема КП возрастает относительная трудо­ емкость разработки каждой команды в программе Сц>1, Эта за­ висимость не очень резкая, и, по некоторым оценкам, при возра-

75

станин объема программ на 3 порядка (от 104 до 107 команд) тру­ доемкость разработки команды в программе увеличивается в 3—4 раза. Такая зависимость может быть описана логарифмиче­ ской функцией (рис. 2.7)

cii = lg<tf»-10-3).

(2-7)

Выбор подобной функции ассоциируется также с рядом зависи­ мостей в статистической теории сложности программ [53, 23]. Таким образом, в качестве первого приближения суммарные за­ траты на разработку сложного КП в зависимости от объема про­ грамм можно представить выражением

С,р = —ё — 'g (Я„.10-3)./7 Си,

(2.8)

г

ij

 

где коэффициент Псц зависит от ряда факторов, рассматриваемых ниже. «7

Однако в некоторых работах [6] и в гл. 3 выявлена противопо­ ложная тенденция изменения КИТ с ц < 1 при увеличении объемов

КП, особенно когда эти объемы невелики (см. выражения

(3.7),

(3.8)). Подобная («парадоксальная») зависимость может

быть

объяснена спецификой неоднородной статистической выборки и рядом второстепенных неучтенных факторов при создании некото­ рых небольших программ, прежде всего недостаточно высокой ор­ ганизацией работ, наличием специалистов невысокой квалифика­ ции, необходимостью более полного использования ресурсов ЭВМ и т. д. В отличие от таких относительно мелких разработок слож­ ные и сверхсложные КП создаются с привлечением большинства современных методов и средств автоматизации разработки, что способствует повышению производительности труда. Если разра­ ботки любых объемов проводились бы в одних условиях высокой

 

 

 

организации

и обеспечения сред­

 

 

 

ствами автоматизации, то, естест­

 

 

 

венно,

рост объема КП

должен

 

 

 

приводить к увеличению сложно-

 

 

 

сти и относительной трудоемкости

 

 

 

их создания.

Поэтому

 

в

даль­

 

 

 

нейшем

 

используется

наиболее

 

 

 

правдоподобная

гипотеза

о

неко­

 

 

 

тором повышении КИТ

(снижении

 

 

 

производительности труда)

(см.

 

 

 

табл. 2.2) при увеличении объема

 

 

 

J. п« (сложных

КП в

соответствии

с

 

 

 

выражением

(2.7).

 

 

 

 

, ,

,#

изменение

Р а з м е р

б а з ы д а н н ы х

FMC. 2.7.

Коэффициент

р а з р а б а т ы в а е м о г о

КП

в

трудоемкости сп при

разработке

r

 

 

v. m ^

v

 

*

 

программ в зависимости от объе-

некоторой

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

ма комплекса программ Пк

С объемом

 

КП.

Это

привело К

76

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

В статистической теории сложности программ [53] показано, что для программных модулей и относительно небольших групп программ велика (> 0 ,8 ) взаимокорреляция числа имен перемен­ ных и операторов в программе. Однако для сложных и сверхслож­ ных КП эта корреляция меньше, что определяет необходимость разделения КП на два типа: на осуществляющие преимущественно

логическую обработку относительно небольшого потока данных и на информационно-поисковые системы при наличии больших баз данных и относительно простой нх обработке. Для характеристи­ ки этих типов программ может использоваться отношение числа имен переменных к числу строк или операторов текста программ [53, 6]. Для первого типа КП это отношение не превышает десят­ ка процентов, а для второго оно может значительно превышать единицу и достигать десятков и сотен. Затраты при разработке КП второго типа оказываются зависящими от размера базы данных, который влияет на сложность взаимодействия программ с дан­ ными.

Хотя размеры базы данных для сложных КП по числу имен переменных изменяются в очень широких пределах приблизитель­ но от 103 до 108, их непосредственное влияние на трудоемкость разработки строки в программе даже при числе переменных, в де­

сятки раз превышающем объем программы, оценивается на уровне ~10% [6]. При этом степень этого влияния трудно формализо­ вать, так как большую роль играет структура базы данных и ее функциональное значение. Поэтому далее этот фактор отдельно не учитывается и только для очень больших и сложных структур баз данных рекомендуется увеличивать трудоемкость на десяток процентов.

Н а д е ж н о с т ь ф у н к ц и о н и р о в а н и я КП является наи­ более важным фактором, отражающим качество ПС третьего клас­ са. Понятие надежности программ еще не полностью установилось и имеется несколько его интерпретаций [33, 22]. В ряде работ это понятие базируется на традиционных понятиях надежности си­ стем, только уточняются особенности показателей надежности при их применении к комплексам программ [22]. В соответствии с такими подходами далее рассматривается влияние фактора надеж­ ности на трудоемкость создания КП.

В качестве параметров, характеризующих надежность систем, наиболее широко используются наработка на отказ Ти и коэффи­ циент готовности Кг [19, 22]. Оба показателя тесно связаны, что

77

позволяет в данном разделе ограничить внимание на первом из них. Если наработку на отказ измерять в часах, то для реальных КП этот показатель может изменяться приблизительно на три по­ рядка от 1 до 103 ч. В этом диапазоне 7„ трудоемкость разработки команды в КП изменяется в несколько раз. Имеется относительно небольшое число публикаций, в которых измерялась надежность программ и связывалась с затратами на ее обеспечение. Обзор таких работ [89, 99] показывает большой разброс характеристик вследствие ряда методических и технических причин. На основе анализа этих работ и личного опыта авторов рассмотрим влияние требований надежности на затраты при разработке сложных КП реального времени.

При требовании особо высокой надежности функционирования КП суммарные затраты могут увеличиваться почти на порядок. Однако за предельное можно принять трех — пятикратное увели­ чение КИТ ci3 в этом диапазоне 7\, [77, 89] (рис. 2.8). Изучение

математических моделей процесса выявления ошибок в програм­ мах привело к тому, что одной из наиболее достоверных и простых является экспоненциальная зависимость числа оставшихся в про­ грамме ошибок от длительности ее тестирования [99, 101]. Следст­ вием этого является логарифмическая зависимость наработки на отказ от длительности разработки программ и соответственно от сопутствующих затрат. Эти обстоятельства позволяют аппрокси­ мировать средние значения ci3 при повышении требований к надеж­

ности КП логарифмической зависимостью

c13 = lg(TH.10)t

(2.9)

соответствующей центру заштрихованного сектора на рис. 2.8. Од­

 

нако требующееся

увеличе­

 

ние затрат в несколько раз

 

для достижения особо высо­

 

кой

надежности

КП в про­

 

цессе

разработки

трудно

 

обеспечить практически. По­

 

этому для достижения высо­

 

кой

надежности

программ

 

активно применяются мето­

 

ды структурного программи­

 

рования и различные методы

 

программной защиты от сбо­

Рис. 2.8. Коэффициент изменения трудо­

ев и отказов программ

(ме­

емкости Cjj при разработке программ в

тоды

оперативного

рестар­

зависимости от наработки на отказ 7^

та).

Временная,

программ­

(---------- для КП среднего объема.

ная и информационная

из­

- для больших КП)

быточность в КП позволяют

 

замедлить рост

затрат на

78

разработку при повышении требований к их надежности (см. § 4.2). В результате для достижения наработки на отказ в сотню

часов, по

экспертным,

оценкам, затраты возрастают в среднем

в 1,5 раза,

а для Г „~ 1

тыс. ч — в 2 раза [23] (пунктир на рис. 2.8).

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

Следует особо отметить большие трудности измерения и дости­

жения

надежности, характеризующейся наработкой на

отказ про­

грамм

Г,,> 1 0 ч. При такой надежности КП резко

возрастают

трудности обнаружения возникающих отказов и диагностирования их причин. Наработка на отказ в сотни часов в ряде случаев до­ стигалась только при эксплуатации и сопровождении сложных КП в течение нескольких лет. Учет этих дополнительных затрат осо­ бенно сложен и вряд ли их можно относить к процессу непосред­ ственной разработки ПС.

О г р а н и ч е н и е р е с у р с о в п р о и з в о д и т е л ь н о с т и и о п е р а т и в н о й п а м я т и р е а л и з у ю щ е й ЭВМ целесообраз­ но рассматривать совместно с акцентом па ограничение произво­ дительности, как более изученный и сильно влияющий фактор на КИТ при разработке КП [6]. При использовании создаваемым КП производительности и памяти реализующей ЭВМ менее чем на 50% разработчик может практически не учитывать эти ограниче­ ния. Однако при этом ЭВМ используется далеко от своих возмож­ ностей и особенно при массовом тиражировании КП в системах целесообразно применить более дешевую ЭВМ с соответственно более низкими характеристиками. Поэтому закономерным являет­ ся стремление разработчиков программ применять особенно для систем реального времени реализующие ЭВМ с предельным ис­ пользованием характеристик. Однако при использовании произво­ дительности и памяти ЭВМ более чем на 70% начинают возрастать затраты на разработку программ. Опыт создания КП реального времени позволяет утверждать, что практически невозможно ис­ пользовать производительность реализующей ЭВМ более чем на 95% и почти всегда целесообразно ограничиваться на уровне 90%. При попытке использовать возможности ЭВМ на 90—95% (относи­ тельная загрузка р ~ 0 ,9 —0,95) затраты увеличиваются в 3—4 раза (рис. 2.9). Эту закономерность можно аппроксимировать выраже­ нием (пунктир на рис. 2.9):

С,4 - 1/1,4 (I—р)1'-’,

(2-10)

где р реальная загрузка ЭВМ (к относительных неличиннх).

Подобная зависимость обусловлена сложностью оптимального распределения ограниченных ресурсов ЭВМ (особенно производи­ тельности), необходимостью проектирования программ с учетом этих ограничений и неоднократными переделками программ для того, чтобы соблюсти все ресурсные ограничения [36]. Наиболее

 

 

 

сильно эти ограничения про­

 

 

 

являются

при

комплексной

 

 

 

отладке

и испытаниях

КП,

 

 

 

вызывая необходимость зна­

 

 

 

чительной переработки неко­

 

 

 

торых

программных компо­

 

 

 

нент [11, 52]. В среднем жест­

 

 

 

кие ограничения

ресурсов

 

 

 

ЭВМ приводят к увеличению

 

 

 

затрат

при

разработке

про­

 

 

 

грамм на 30—50%.

 

 

Рис. 2.9. Коэффициент

изменения трудо­

Д л и т е л ь н о с т ь п р е д ­

емкости С|4 при разработке

программ в

п о л а г а е м о й

э к с п л у а ­

зависимости от степени

р

использования

т а ц и и

КП

изменяется от

ресурсов реализующей ЭВМ:

нескольких

месяцев до

де­

---------- — данные [6],

 

по формуле

---------- — аппроксимация

 

сятков

лет.

Сложные

КП,

(2.10)

 

 

предназначенные

для

дли­

 

 

 

тельного,

массового исполь­

зования и сопровождения, подлежат достаточно полному докумен­ тальному оформлению. Их необходимо строить при строгом соблю­ дении модульно-иерархических принципов, достаточно полно те­ стировать и испытывать. Вследствие этого относительные затраты при разработке одной команды возрастают в несколько раз (рис. 2.10). По экспертным оценкам, увеличение предстоящей дли­ тельности эксплуатации КП на порядок (от 1 до 10 лет) приводит к увеличению КИТ с15 примерно в 1,5—2 раза. Такую зависимость

можно описать логарифмической функцией

С15 ~ а 15 lg (^я‘ 1 0 ),

(2 .1 1 )

где а 15 изменяется в диапазоне от 1 до 0,5.

 

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

разработке программ. П р е д п о л а г а е ­

мый

т и р а ж

п р о-

г р а м м

влияет

на за­

траты С1Р прежде всего

вследствие расширения

Рис. 2.10. Коэффициент изменения трудоемкости С|5 при разработке программ в зависимости от предполагаемой длительности эксплуатации /я комплекса программ

вии, при которых пред­ стоит функционировать КП. В результате про­ является больше оши­ бок в программах и

но

Соседние файлы в папке книги