Программирование - методы
В программировании используются разные методы — подходы, которые позволяют структурировать код, упростить его поддержку и взаимодействие с другими частями системы. Некоторые из них: процедурный, объектно-ориентированный (ООП), функциональный и реактивный.
Основан на последовательном выполнении шагов, каждый из которых решает отдельную задачу. Некоторые принципы:
Разбиение задач на подзадачи — каждая из них реализуется в виде отдельной процедуры или функции.
Использование переменных для хранения данных — они могут быть локальными (доступны только внутри конкретной процедуры) или глобальными (доступны везде в программе).
Последовательное выполнение — код выполняется построчно, сверху вниз, в порядке его написания.
Управляющие конструкции: последовательность (инструкции выполняются друг за другом), ветвление (if-else, switch и другие условные операторы), повторение (многократное выполнение блоков с помощью циклов for, while и др.).
-
О программном обеспечении
Несмотря на тот факт, что еще год или два назад я рыдал о том, что классические Windows программы сделали ручкой будущему, однако время от времени студенты шлют мне email с просьбой дать совет о том, как строить карьеру. A ведь сейчас сезон приема на работу, поэтому я подробно изложу свои стандартные рекомендации, которые они смогут прочесть, посмеяться и выбросить.
К счастью, большинство студентов достаточно смелы, чтобы никогда не стесняться спрашивать советов у старших, что в области вычислительной техники (Computer Science) весьма уместно, потому что старшие склонны говорить устаревшие глупости, подобные этим: “спрос на операторов превысит 100 000 000 к 2010 году” или “lisp программисты сейчас очень востребованы”.
Я тоже понятия не имею о чем говорю, когда даю советы студентам. Я так безнадежно отстал, что не могу постичь AIM (AOL Instant Messenger) и продолжаю использовать (о ужас!) старомодную вещь, называемую “email”, которая была популярна в те дни, когда музыка выходила на плоских круглых пластинках, называемых “CD”.
Назад, к основам
Двоекультурие
Биг Маки против "обнаженного шеф-повара"
Бионический офис
Верблюды и песочница
"Я начальник - ты дурак" и команда клоунов
Мастерство
Огонь и движение
Пять миров
Достигая тех высот
Как Microsoft проиграла битву за API
О вреде многозадачности применительно к людям
О вреде премирования
Искусство проведения интервью
Не просто удобство использования
Закон Дырявых Абстракций
Лорд Палмерстон в программировании
У Microsoft поехала крыша
А вот ещё про отпуск
Работа над ошибками малой кровью
Безболезненные функциональные спецификации
Планирование программного обеспечения малой кровью
Выбор даты выпуска
Пожалуйста, сэр, могу ли я получить компоновщик?
Как сделать так, чтобы ваше резюме прочитали
Весна в Кэмбридже
I письмо о стратегии: Ben and Jerry's против Amazon
Стратегические заметки II: Вопрос о курице и яйце
Cтратегические заметки III. Позвольте мне отказаться!
Письмо о стратегии IV: Раздутое ПО и миф 80/20
По главной улице без оркестра
Дорога на FogBugz 4.0: Часть I
Пять (неуважительных) причин не иметь тестеров
Две истории
Ну откуда все эти (неоригинальные) мысли?
Все под контролем, или баллада о счастливых пользователях
Как узнать, чего они ждут
Бремя выбора
Mагическая сила метафор. Приглашения к действию.
Постоянство дизайна и другие феи программирования
Как создать дизайн для людей, которым есть чем заняться в этой жизни
Создание продукта
-
Комбинаторные алгоритмы для программистов
Целые являются основными объектами в вычислительной комбинаторике. В различных вычислительных теоретико-числовых исследованиях изучаются сами целые числа, но мы будем использовать их главным образом при подсчете и индексировании. В последнее время установлено, что полезны различные представления
Проблема представления: коды, сохраняющие разности
Классы алгоритмов
Анализ алгоритмов
Комбинаторные алгоритмы для программистов
Введение
Целые
Целые - 2
Последовательности
Различные способы представлений
Комбинаторные алгоритмы для программистов
Связанное распределение
Разновидности связанных списков
Стеки и очередь
Задачи
Программы
Комбинаторные алгоритмы для программистов
Деревья
Представления
Прохождения
Длина путей
Задача
Программa
Комбинаторные алгоритмы для программистов
Введение
Задачи
Разные статистики
Деревья и перестановки из n элементов
Число сочетаний
Задачи на разбиение чисел
Комбинаторные задачи теории информации
Комбинаторные алгоритмы для программистов
Множества и мультимножества
Формула включений и исключений
Решето Эратосфена
Примеры программы
Комбинаторные алгоритмы для программистов
Размещения без повторений
Перестановки
Сочетания
Рекуррентные соотношения
Другой метод доказательства
Процесс последовательных разбиений
Задача: "Затруднение мажордома"
Комбинаторные алгоритмы для программистов
Решение рекуррентных соотношений
Линейные рекуррентные соотношения с постоянными коэффициентами
Случай равных корней характеристического уравнения
Производящие функции
Комбинаторные алгоритмы для программистов
Введение
Деление многочленов
Алгебраические дроби и степенные ряды
Действия над степенными рядами
Комбинаторные алгоритмы для программистов
Применение степенных рядов для доказательства тождеств
Бином Ньютона
Ряд Ньютона
Производящие функции и рекуррентные соотношения
Об едином нелинейном рекуррентном соотношении
Комбинаторные алгоритмы для программистов
Введение
Стеки
Очереди
Связанные списки
Двоичные деревья
Комбинаторные алгоритмы для программистов
Введение
Представления
Связность и расстояние
Остовные деревья
Клики
Изоморфизм
Планарность
Комбинаторные алгоритмы для программистов
Введение
Поиск и другие операции над таблицами
Последовательный поиск
Логарифмический поиск в статических таблицах
Бинарный поиск
Оптимальные деревья бинарного поиска
Логарифмический поиск в динамических таблицах
Сбалансированные сильно ветвящиеся деревья
Комбинаторные алгоритмы для программистов
Введение
Внутренняя сортировка
Вставка
Обменная сортировка
Комбинаторные алгоритмы для программистов
Выбор
Распределяющая сортировка
Цифровая распределяющая сортировка
Внешняя сортировка
Частичная сортировка
Частичная сортировка (выбор)
Частичная сортировка (слияние)
Комбинаторные алгоритмы для программистов
Поиск в глубину
Алгоритм Дейкстры нахождения кратчайшего пути
Алгоритм Флойда нахождения кратчайших путей между парами вершин
Программы
Комбинаторные алгоритмы для программистов
Автоматическое построение лабиринтов
Бинарное дерево
Задача о восьми ферзях
Сортировки
Задача о назначениях (задачи выбора)
Ханойская башня
Программа
-
Компиляция программ для современных архитектур
В ИСП РАН было выполнено несколько работ по улучшению производительности компилятора GCC для платформы Intel Itanium, в ходе которых разрабатывалась и реализовывалась поддержка в GCC рассмотренных выше свойств этой архитектуры. Первыми были закончены работы по добавлению поддержки спекулятивного выполнения в планировщик команд компилятора GCC
Компиляция для архитектур с явно выраженным параллелизмом команд
Особенности архитектур с явно выраженным параллелизмом
Алгоритм планирования команд и конвейеризации циклов для Intel Itanium
Базовый алгоритм селективного планирования
Усовершенствования базового алгоритма
Оптимизации энергопотребления встраиваемых систем, управляемые компилятором
Динамическое изменение напряжения
Реализованный алгоритм ДИН
Оптимизация переключения битов (bit-switching)
Оптимизация работы с памятью
Динамические оптимизации для языков общего назначения
Заключение
Компиляция программ для современных архитектур
Литература
-
Методы и средства инженерии программного обеспечения
Цель данного учебника – представить методы и средства программной инженерии (Software engineering) в систематизированном виде для их применения на процессах проектирования, тестирования и оценки качества программных систем.
Современные университетские курсы по информатике предусматривают обучение основам программирования, объектно-ориентированному подходу, UML–моделированию, параллельному программирования и др. Больше уделяется внимание современным языкам программирования (С++, JAVA) для современных компьютеров. В результате студенты получают подготовку по этим методам и средствам и недостаточные знания по инженерии проектирования и управления проектами, качеству, конфигурации и соответствующим стандартам.
В некоторых университетах проводятся лекционные курсы по теория алгоритмов, автоматов, математической логике, дискретной математике и другим формальным дисциплинам. Эти курсы основываются на математических дисциплинах (логика, алгебра, комбинаторика) и способствуют развитию математического мышления при проведении анализе предметной области, осмыслении постановок задач и разработке программ для получения на компьютере математического результата.
ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ
ВСТУПЛЕНИЕ
ВВЕДЕНИЕ В ПРОГРАММНУЮ ИНЖЕНЕРИЮ И ЖИЗНЕННЫЙ ЦИКЛ ПО
Анализ и характеристика областей знаний SWEBOK
Основы программных требований (Software Requirements)
Проектирование ПО (Software design)
Анализ и оценка качества проектирования ПО
Конструирование ПО (Software Construction)
Тестирование ПО (Software Testing)
Сопровождение ПО (Software maintenance)
Управление конфигурацией ПО (Software Configuration Management–SCM)
Управление инженерией ПО (Software Engineering Management)
Процесс инженерии ПО (Software Engineering Process)
Методы и средства инженерии ПО (Software Engineering Tools and Methods)
Качество ПО (Software Quality)
Введение в жизненный цикл ПО стандарта
ISO\IEC 12207
Обучение специальности – программная инженерия
Анализ системы знаний у ИТ–специалистов
Подходы к обучению программной инженерии
Анализ результатов дистанционного обучения
Контрольные вопросы и задания
Литература к теме
МОДЕЛИ ЖИЗНЕННОГО ЦИКЛА ДЛЯ РАЗРАБОТКИ ПРОГРАММНЫХ СИСТЕМ
Каскадная модель ЖЦ
Инкрементная модель ЖЦ
Спиральная модель
Эволюционная модель ЖЦ
Стандартизованная модель системы
Сопоставление модели ЖЦ стандарта ISO/IEC и областей –процессов SWEBOK
Характеристика процессов стандарта
Характеристика модели процессов в ядре SWEBOK
Задачи областей
МЕТОДЫ ОПРЕДЕЛЕНИЯ ТРЕБОВАНИЙ В ПРОГРАММНОЙ ИНЖЕНЕРИИ
Определение понятий и видов требований
Виды требований
Анализ и сбор требований
Инженерия требований ПО
Верификация и формализация требований
Объектно-ориентированная инженерия требований
Метод инженерии требований А Джекобсона
Модель анализа требований Определение объектов
Классификация требований
Трассирование требований
МЕТОДЫ АНАЛИЗА И ПОСТРОЕНИЯ МОДЕЛЕЙ ПрО
Объектно–ориентированные методы анализа и построения моделей ПрО
Основные понятия анализа ПрО
Метод анализа и построения моделей СШлаер и СМеллора
Информационная модель
Модель состояний
Модель процессов
Методы проектирования архитектуры ПО
Стандартный подход к проектированию системы
Общесистемный подход к проектированию архитектуры системы
Техническое проектирование
МЕТОДЫ ПРОЕКТИРОВАНИЯ ПРОГРАММНЫХ СИСТЕМ
Методы систематического программирования
Структурный подход
Метод функционального моделирования SADT
Объектно–ориентированный метод проектирования
Метод моделирования UML
Компонентный подход к проектированию
Типы компонентных структур
Методология компонентной разработки систем
Аспектно–ориентированное программирование
Генерирующее (порождающее) программирование
Методы и средства инженерии программного обеспечения
Агентное программирование
Методы теоретического программирования
Алгебраическое программирование (АП)
Экспликативное программирование (ЭП)
Алгоритмика программ
Формальные методы
Введение
Инженерия ПИК
Спецификация ПИК
Репозитарий компонентов
Описание интерфейса объектов-компонентов в распределенной среде
Инженерия приложений и предметной области
Инженерия оценивания стоимости реализации ПрО из компонентов
МЕТОДЫ ВЕРИФИКАЦИИ И ТЕСТИРОВАНИЯ ПРОГРАММ И СИСТЕМ
Методы доказательства программ
Методы доказательства правильности программ
Общая характеристика формальных методов доказательства
Модель формального доказательства конкретности программы
Техника символьного выполнения
Методы просмотра структуры программы
Верификация и аттестация программ
Методы верификации объектно–ориентированных программ
Методы тестирования программ
Статические методы тестирования
Динамические методы тестирования
Функциональное тестирование
Организационные аспекты процесса тестирования
Организация подготовки тестов
Команда тестировщиков
Организация процесса тестирования
КОМПОНЕНТОВ И ДАННЫХ
Методы интеграции (композиции) компонентов
Методы преобразования программ и данных
Парадигма преобразования данных
Формальное описание данных в ЯП и их преобразование
Средства стандарта ISO/IEC для преобразования данных
Преобразование данных БД и замена БД
Основные этапы преобразования данных в БД
Унифицированные файлы для передачи данных между разными БД
Методы внесения изменений в компоненты и в ПС
Реинженерия программных систем
Рефакторинг компонентов
Реверсная инжеиерия
МОДЕЛИ КАЧЕСТВА И НАДЕЖНОСТИ В ПРОГРАММНОЙ ИНЖЕНЕРИИ
Модель качества ПО
Метрики качества программного обеспечения
Стандартный метод оценки значений показателей качества
Управление качеством ПС
Модели оценки надежности
Основные понятия в проблематике надежности ПС
Классификация моделей надежности
Модели надежности Марковского и Пуассоновского типов
МЕТОДЫ УПРАВЛЕНИЯ ПРОЕКТОМ, РИСКОМ И КОНФИГУРАЦИЕЙ
Методы управления проектами
Методы управления программным проектом
Метод критического пути СРМ
Метод анализа и оценки PERT
Методы и средства инженерии программного обеспечения
Планирование
Организационные аспекты управления в проекте
Оценивание проекта
Методы управление рисками
Планирование управления рисками
Количественная оценка рисков
Планирование реагирования на риски
Мониторинг и контроль
Управление конфигурацией программной системы
Управление конфигурацией
Планирование УК
Определение стратегии идентификации
Управление версиями
Изменения в утвержденном КБ
Суть этого учета
Конфигурационный аудит
Языковые средства описания компонентов
Языковые средства описания компонентов и методов интеграции
Компоненты сеансов
ПИК сохраняется в архиве JAVA
Типы компонентов и средства их интеграции в JAVA
Шаблон развертывания
Базовые операция проекта
Формы
Система CORBA и средства описания объектов и компонентов
Сервлет – это небольшая программа
Язык описания интерфейсов в системе CORBA
Язык описания интерфейсов объектов
Интегратор объектов – брокер объектных запросов
Средства унифицированного процесса RUP
Энциклопедия инструментов создания ПС из объектов и компонентов
Средства и методы разработки архитектуры MSF
Перспективы производственной архитектуры
Словарь терминов программной инженерии
Формирование требований к автоматизированной системе
Стандарт разработки документации на АС – ГОСТ
Жизненный цикл компонентной разработки ПС
Разработка требований – это формирование
Этап анализа поведения ПС
Этап спецификации интерфейсов и взаимодействия компонентов
Этап интеграции
Этап развертывания компонентов системы
Этап сопровождения
Кодекс этики программной инженерии
Литература
Стандарты программной инженерии
-
Об одном методе маскировки программ
В настоящее время вопросы защиты информации приобрели первостепенную важность. Компьютерные программы могут также рассматриваться как информация, которая нуждается в защите. Защита программного обеспечения включает в себя, с одной стороны, защиту от копирования и (или) нелицензионного использования и, с другой стороны, защиту от обратной инженерии и несанкционированной модификации
Общее описание метода маскировки
Увеличение размера графа потока управления
Разрушение структурности графа потока управления
Генерация несущественного кода
"Перемешивание" программ
Реализация метода маскировки
Теоретическое обоснование устойчивости метода
Практическое обоснование устойчивости метода
Пример применения метода
Заключение
Список литературы
-
Основы конструирования компиляторов
Алфавит, или словарь - это конечное множество символов. Для обозначения символов мы будем пользоваться цифрами, латинскими буквами и специальными литерами типа #, $
Структура компилятора
Алфавиты, цепочки и языки
Представление языков
Формальное определение грамматики
Типы грамматик и их свойства
Лексический анализ
Регулярные множества и выражения
Конечные автоматы
Построение недетерминированного конечного автомата по регулярному выражению
Построение детерминированного конечного автомата по недетерминированному
Регулярные множества и их представления
Программирование лексического анализа
Конструктор лексических анализаторов LEX
КС-грамматики и МП-автоматы
Преобразования КС-грамматик
Алгоритм разбора сверху-вниз
Функции FIRST и FOLLOW
Конструирование таблицы предсказывающего анализатора
LL(1)-грамматики
Удаление левой рекурсии
Левая факторизация
Рекурсивный спуск
Восстановление после синтаксических ошибок
Основа
LR(1)-анализаторы
Конструирование LR(1)-таблицы
LR(1)-грамматики
Восстановление после синтаксических ошибок
Варианты LR-анализаторов
Элементы теории перевода
Преобразователи с магазинной памятью
Синтаксически управляемый перевод
Обобщенные схемы синтаксически управляемого перевода
Атрибутные грамматики
Определение атрибутных грамматик
Классы атрибутных грамматик и их реализация
Описание областей видимости и блочной структуры
Занесение в среду и поиск объектов
Организация таблиц символов
Таблицы идентификаторов
Таблицы расстановки
Таблицы расстановки со списками
Функции расстановки
Таблицы на деревьях
Реализация блочной структуры
Сравнение методов реализации таблиц
Промежуточное представление программы
Представление в виде ориентированного графа
Трехадресный код
Линеаризованные представления
Виртуальная машина Java
Организация памяти
Набор команд виртуальной машины
Помещение локальных переменных на стек
Вызов метода
Обработка исключительных ситуаций
Организация информации в генераторе кода
Уровень промежуточного представления
Генерация кода
Модель машины
Динамическая организация памяти
Организация магазина со статической цепочкой
Организация магазина с дисплеем
Назначение адресов
Трансляция переменных
Трансляция целых выражений
Трансляция арифметических выражений
Трансляция логических выражений
Выделение общих подвыражений
Сопоставление образцов
Синтаксический анализ для T-грамматик
Выбор дерева вывода наименьшей стоимости
Атрибутная схема для алгоритма сопоставления образцов
Системы автоматизации построения трансляторов
Система СУПЕР
Система Yacc
Литература
-
Перспективы интеграции методов верификации программного обеспечения
Прогресс технологий разработки программного обеспечения (ПО) в последние десятилетия значительно увеличил производительность программистов в терминах количества кода, создаваемого ими в единицу времени. Это проявляется, в частности, в увеличении размеров наиболее сложных программных систем, разрабатываемых сейчас, до десятков миллионов строк кода
Введение
Синтетические методы верификации ПО
Подход к построению расширяемой среды верификации ПО
Анализ требований
Поддержка различных языков и нотаций
Архитектурная основа среды верификации
Организация разработки среды верификации
Заключение
Литература
-
Современные технологии создания программного обеспечения
Накопленный к настоящему времени опыт создания систем ПО показывает, что это сложная и трудоемкая работа, требующая высокой квалификации участвующих в ней специалистов. Однако до настоящего времени создание таких систем нередко выполняется на интуитивном уровне с применением неформализованных методов, основанных на искусстве, практическом опыте, экспертных оценках и дорогостоящих экспериментальных проверках качества функционирования ПО. По данным Института программной инженерии (Software Engineering Institute, SEI) в последние годы до 80% всего эксплуатируемого ПО разрабатывалось вообще без использования какой-либо дисциплины проектирования, методом "code and fix" (кодирования и исправления ошибок).
Проблемы создания ПО следуют из его свойств. Еще в 1975 г. Фредерик Брукс, проанализировав свой уникальный по тем временам опыт руководства крупнейшим проектом разработки операционной системы OS/360, определил перечень неотъемлемых свойств ПО: сложность, согласованность, изменяемость и незримость.
Диаграмма размещения
Диаграммы деятельности
Диаграммы компонентов
Диаграммы потоков данных
Диаграммы состояний
Диаграммы вариантов использования
Диаграммы взаимодействия
Именованное значение
Инструментальное средство
Литература
являющийся частью семейства стандартов IDEF,
Метод SADT
Методы анализа и проектирования ПО
Методы моделирования бизнес-процессов и спецификации требований
Методы объектно-ориентированного анализа и проектирования ПО. Язык UML
Методы структурного анализа и проектирования ПО
Оценка и выбор ТС ПО
Ограничение
Основные особенности и проблемы современных программных проектов
Полнота поддержки процессов ЖЦ ПО
Практическое внедрение ТС ПО
Рабочий продукт
Роль
Руководство
Соответствие стандартам
Сопоставление и взаимосвязь структурного и объектно-ориентированного подходов
Современные тенденции в программной инженерии
Стереотип
Критерии, применяемые для оценки ТС ПО
Технология Borland
Технология Computer Associates
Технология Oracle
Технология Rational Unified Process (IBM Rational Software)
Требования, предъявляемые к ТС ПО
Визуальное моделирование
Внедрение ТС ПО в организации
Выполнение пилотного проекта
рынок ТС ПО, испытавший определенный