Please enable JavaScript.
Coggle requires JavaScript to display documents.
Совершенный код - Стив Макконел - Coggle Diagram
Совершенный код - Стив Макконел
Содержание
Основное содержание
Переменные
Общие принципы использования переменных
Что вы знаете о данных?
Грамотное объявление переменных
Принципы инициализации переменных
Область видимости
Персистентность
Время связывания
Связь между типами данных и управляющими структурами
Единственность цели каждой переменной
Сила имен переменных
Общие принципы выбора имен переменных
Именование конкретных типов данных
Сила конвенций именования
Неформальные конвенции именования
Стандартизированные префиксы
Грамотное сокращение имен переменных
Имена, которых следует избегать
Основные типы данных
Числа в общем
Целые числа
Числа с плавающей запятой
Символы и строки
Логические переменные
Перечислимые типы
Именованные константы
Массивы
Создание собственных типов данных (псевдонимы)
Нестандартные типы данных
Структуры
Указатели
Глобальные данные
Операторы
Организация последовательного кода
Операторы, следующие в определенном порядке
Операторы, следующие в произвольном порядке
Условные операторы
Операторы if
Операторы case
Циклы
Выбор типа цикла
Управление циклом
Простое создание цикла - изнутри наружу
Соответствие между циклом и массивом
Нестандартные управляющие структуры
Множественные возвраты из метода
Рекурсия
Оператор goto
Перспективы нестандартных управляющих структур
Табличные методы
Основные вопросы применения табличных методов
Таблицы с ... доступом
Индексированным
Ступенчатым
Прямым
Другие примеры табличного поиска
Общие вопросы управления
Логические выражения
Составные операторы (блоки)
Пустые выражения
Укрощение опасно глубокой вложенности
Основа программирования: структурное программирование
Управляющие структуры и сложность
Усовершенствование кода
Качество ПО
Характеристика качества ПО
Методики повышения качества ПО
Относительная эффективность методик контроля качества ПО
Когда выполнять контроль качества ПО?
Главный Закон Контроля Качества ПО
Совместное конструирование
Обзор методик совместной разработки ПО
Парное программирование
Формальные инспекции
Другие методики совместной разработки ПО
Сравнение методик совместного конструирования
Тестирование, выполняемое разработчиками
Тестирование, выполняемое разработчиками, и качество ПО
Рекомендуемый подход к тестированию, выполняемому разработчиками
Приемы тестирования
Типичные ошибки
Инструменты тестирования
Оптимизация процесса тестирования
Протоколы тестирования
Отладка
Общие вопросы отладки
Поиск дефекта
Устранение дефекта
Психологические аспекты отладки
Инструменты отладки - очевидные и не очень
Рефакторинг
Виды эволюции ПО
Введение в рефакторинг
Отдельные виды рефакторинга
Безопасный рефакторинг
Стратегии рефакторинга
Стратегии оптимизации кода
Общее обсуждение производительности ПО
Введение в оптимизацию кода
Где искать жир и патоку?
Оценка производительности
Итерация
Подход к оптимизации кода: резюме
Методики оптимизации кода
Логика
Циклы
Изменения типов данных
Выражения
Методы
Переписывание кода на низкоуровневом языке
Если что-то одно изменяется, что-то другое всегда остаётся постоянным
Системные вопросы
Как размер программы влияет на конструирование
Взаимодействие и размер
Диапазон размеров проектов
Влияние размера проекта на
Возникновение ошибок
Производительность
Процесс разработки
Управление конструированием
Поощрение хорошего кодирования
Управление конфигурацией
Оценка графика конструирования
Измерения
Гуманное отношение к программистам
Управление менеджером
Интеграция
Важность выбора подхода к интеграции
Частота интеграции - поэтапная или инкрементная?
Стратегии инкрементной интеграции
Ежедневная сборка и дымовые тесты
Инструменты программирования
Инструменты
Для
Работы с
Исходным кодом
Исполняемым кодом
Проектирования
И среды
Создание собственного программного инструментария
Волшебная страна инструментальных средств
Мастерство программирования
Форматирование и стиль
Основные принципы форматирования
Способы форматирования
Стили форматирования
Форматирование
Управляющих структур
Отдельных операторов
Классов
Размещение
Комментариев
Методов
Самодокументирующийся код
Внешняя документация
Стиль программирования как вид документации
Комментировать или не комментировать?
Советы по эффективному комментированию
Методики комментирования
Стандарты IEEE
Личность
Причем тут характер?
Интеллект и скромность
Любопытство
Профессиональная честность
Общение и сотрудничество
Творчество и дисциплина
Лень
Свойства, которые менее важны, чем кажется
Привычки
Основы мастерства
Боритесь со сложностью
Анализируйте процесс разработки
Пишите программы в первую очередь для людей и лишь во вторую - для компьютеров
Программируйте с использованием языка, а не на языке
Концентрируйте внимание с помощью соглашений
Программируйте в терминах проблемной области
Опасайтесь падающих камней
Итерируйте, итерируйте и итерируйте
И да отделена будет религия от разработки ПО
Где искать дополнительную информацию
Информация о конструировании ПО
Не связанные с конструированием темы
Периодические издания
Список литературы для разработчика ПО
Профессиональные ассоциации
Высококачественный код
Проектирование при конструировании
Проблемы, связанные с проектированием ПО
Основные концепции проектирования
Компоненты проектирования: эвристические принципы
Методики проектирования
Комментарии по поводу популярных методологий
Классы
Основы классов: абстрактные типы данных
Качественные интерфейсы классов
Вопросы проектирования и реализации
Разумные причины создания классов
Аспекты, специфические для языков
Следующий уровень: пакеты классов
Высококачественные методы
Разумные причины создания методов
Проектирование на уровне методов
Удачные имена методов
Насколько объемным может быть метод?
Советы по использованию параметров методов
Отдельные соображения по использованию функций
Методы-макросы и встраиваемые методы
Защитное программирование
Защита программы от неправильных входных данных
Утверждения
Способы обработки ошибок
Исключения
Изоляция повреждений, вызванных ошибками
Отладочные средства
Доля защитного программирования в промышленной версии
Защита от защитного программирования
Процесс программирование с псевдокодом
Этапы создания классов и методов
Псевдокод для профи
Конструирование методов с помощью ППП
Альтернативы ППП
Основы разработки ПО
Метафоры, позволяющие лучше понять разработку ПО
#
Важность метафор
Приводит к новым открытиям
Сравнить с чем-то похожим
Моделирование
Примеры
Кольцо бензола
Уроборос
Кинетическая теория газов
Бильярдные шары
Волновая теория света
Звук = свет
Колебание камня
Маятник
Открытие
От менее хорошей к лучшей метафоре
Старые метафоры иногда могут быть полезны
Ньютоновская механика
1 more item...
Чем хороши?
Яркие
Можно использовать концепции
Основные идеи
Пример
Статичный метод
Квантовая запутанность
1 more item...
Общий скрипт
Может быть ошибочной
Слишком обобщить
Пример с эфиром
Хорошая метафора
Простая
Понятна другим людям
Согласуется со связанными метафорами
Объясняет эксперименты и наблюдаемые явления
Сокращает объем коммуникации
В разработке ПО
Нет набора стандартных метафор
Второстепенные и противоречивые метафоры
Чем лучше понимаешь метафоры, тем лучше понимаешь разработку ПО
Как использовать метафоры?
Прожектор, а не карта
Говорит как искать ответ, а не где ответ
Эвристика, а не алгоритм
Алгоритм
Предоставляет сами команды
Эвристика
Говорит как найти команды
Почему не алгоритмы?
Каждая программа уникальна
Вряд ли выйдет алгоритмизировать общий подход
Самое сложное - найти концепт проблемы
Как?
Подбирай метафору к
Проблеме
Процессу
Популярные метафоры, характеризующие разработку ПО
Литературная
Написать письмо
Сел и написал за раз весь код
Поток мыслей
Не понравилось? Выкинул
Плохая идея, когда вбухал уже кучу бабок и времени
Метафора говно
Норм если это небольшой петпроект
Письмо пишешь сам, а не командой
Нельзя изменить
Поощряется оригинальность
Может быть не удачной как предыдущие решения
Сельскохозяйственная
Выращивание системы
Добавляешь кусочек за кусочком кода
Метафора говно
Инкрементный метод хорош
#
Можно скатиться в
Удобрение плана системы
Прореживание детального проекта
Повышение урожайности кода путём оптимизации землеустройства
Уборка урожая кода
Нет контроля над развитием ПО
Добавляешь кусок за куском в систему и ждёшь, что получится
Жемчужины
Постепенное наращивание по всем сторонам
Синонимы
Аккреция
1 more item...
Приращение
Сначала скелет программы
Потом мышцы
1 more item...
Тестовые данные и пустые методы
Плюсы
Система эволюционирует вся
Тяжелее впихивается хер пойми что
Работа ведётся по всей системе, а не по одному модулю
Строительная
#
Есть этапы
Планирование
Подготовка
Выполнение
Причины возникновения
Увеличение стоимости ошибки
Масштаб ПО
Процесс
Какой тип здания
#
Разработать с архитектором общий план здания
#
Чертим подробные чертежи и нанимаем строителей
#
#
Готовим стройплощадку, закладываем фундамент, создаём каркас дома, обшиваем его, кроем крышу, проводим коммуникации
#
Ландшафтные дизайнеры, декораторы, маляры
#
Испекция, проверяющая строительство
#
Необязательно делать всё вручную
Можно закупить холодильники и мебель например
Термины разработки ПО
Леса
Scaffolding
Конструирование
Фундаментальные классы
Применение методов разработки ПО
#
Копи опыт
Пользуйся разными фишками
Иначе будешь видеть всё в терминах одной методологии
Не правило, а инструмент анализа
Комбо
Строительство + жемчужина
#
#
Расширяй метафору, но аккуратно
#
Используй то, что стимулирует мышление
Любые комбинации
Дополнительная литература
«The Structure of Scientific Revolutions» (3d ed. Chicago, IL: The University of Chicago Press, 1996) Томаса Куна (Thomas S. Kuhn).
Интересно почитать про взлёты и падения научных метафор
Статья «The Paradigms of Programming». 1978 Turing Award Lecture («Communications of the ACM», August 1979, pp. 455–60) Роберта У. Флойда (Robert W. Floyd)
Модели разработки ПО
Семь раз отмерь - один отрежь: предварительные условия
#
#
#
#
#
#
Важность выполнения предварительных условий
#
Начало
#
#
#
Не получится сделать бентли, проектируя жигуль
Актуальны ли предварительные условия для современных программных проектов?
#
Нет никаких достоверных данных, что подготовка вредит
Снижение рисков
Выработка требований
Планирование проекта
Причины неполной подготовки
Отсутствие опыта
Если делать много говна, то научишься проектировать только говно
Невтерпёж начать кодить
#
Менеджер еблан
Что делать, если тебе орут: "КОДЬ, СУКА"?
4 more items...
Самый веский аргумент в пользу выполнения предварительных условий перед началом конструирования
Обращение к
Логике
3 more items...
Аналогии
#
3 more items...
Данным
2 more items...
Тест готовности руководителя
Какие из этих утверждений являются самоисполняющимися пророчествами?
3 more items...
Ответ
2 more items...
Объяснить профанам
Середина
Конструирование
Конец
Тестирование системы
Создать не то приложение
Создать приложение не так
Определите тип ПО, над которым работаете
Популярные типы
Бизнес системы
Общее
Модели жизненного цикла
2 more items...
Типичные приложения
3 more items...
Жизненный цикл
Выработка требований
1 more item...
Проектирование
1 more item...
Конструирование
2 more items...
Тестирование и гарантия качества
3 more items...
Внедрение приложения
1 more item...
Планирование и управление
2 more items...
Системы целевого назначения
Если ломанут, организации пизда
Общее
Типичные приложения
5 more items...
Модели жизненного цикла
2 more items...
Жизненный цикл
Выработка требований
2 more items...
Планирование и управление
2 more items...
Проектирование
3 more items...
Конструирование
3 more items...
Тестирование и гарантия качества
3 more items...
Внедрение приложения
1 more item...
Встроенные системы от которых зависит жизнь людей
Общее
Типичные приложения
2 more items...
Модели жизненного цикла
2 more items...
Жизненный цикл
Планирование и управление
2 more items...
Выработка требований
1 more item...
Проектирование
2 more items...
Конструирование
2 more items...
Тестирование и гарантия качества
3 more items...
Внедрение приложения
1 more item...
Влияние итеративных подходов на предварительные условия
Есть мнение, что итеративные подходы не нуждаются в предварительных требованиях
Ложь
Затраты на дефекты ниже
2 more items...
Распределяются по всему проекту, а не в конце когда всплывают все баги в последовательном подходе
1 more item...
Делай предварительные условия в любом проекте
Итеративные лучше
Но без условий могут быть ещё дороже последовательных
Обычно любой проект является смесью подходов
Практический совет
#
Определить 80% требований
Потом принимать только самые важные требования
Или наоборот 20% требований
Самые важные требования
Разрабатывать ПО по кусочкам маленьким
1 more item...
Выбор между итеративным и последовательным подходом
#
Подходы
Итеративный
Требования непонятны и нестабильны
Проект приложения не ясен и сложен
Разрабы не знакомы с прикладной областью
Проект сопряжен с высоким риском
Долговременная предсказуемость проекта не играет особой роли
Низкие затраты на изменения
Последовательный
Проект приложения прост и понятен
Группа разработчиков знакома с прикладной областью
Проект не связан с особым риском
Важна долговременная предсказуемость проекта
Затраты на изменения окажутся высокими
Требования стабильны
Лучше итеративный
Определяешь какие требования уместны
#
Предварительные условия, связанные с
Выработкой требований
Описывают что должна делать программная система
Выработка требований - первый шаг к решению проблемы
Синонимы
... Требований
3 more items...
Анализ
Спецификация
1 more item...
Зачем нужны официальные требования?
Не гадать что хочет пользователь
Решать споры с другими программистами
Сэкономить деньги
Не переписывать код
Миф о стабильных требованиях
Клиент как и разработчик во время разработки проекта лучше понимает, чо ему надо
На деле где-то 25% требований могут поменяться
Boehm, 1981;Jones, 1994; Jones, 2000), на что приходится 70–85% объема повторной работы над типичным проектом
Что делать при изменении требований во время конструирования программы?
Чекай контрольный список
#
Убедитесь, что всем известна цена изменения требований
Охладить пыл клиента
2 more items...
Шефу напомнить
#
Задайте процедуру контроля изменений
#
Поставь табличку ХОТЕЛКИ КЛИЕНТА
2 more items...
Используйте подходы к разработке, которые адаптируются к изменениям
#
#
Эволюционное прототипирование
#
1 more item...
Оставьте проект
Помните о бизнес-модели проекта
#
Помни о коммерческим предпосылках проекта
Контрольный список
Требования
Специфические ... требования
2 more items...
... Требований
2 more items...
Насколько прочна земля
Разработкой архитектуры
Определением проблемы
Сформулируй проблему
Это должно звучат именно как проблема
Пиши на понятном языке
Если речь не о проблеме в компе
Синонимы
Формулирование
Точки зрения
Задачи
... Продукции
Видение
Определение
Это отправная точка разработки ПО
Если неправильно определить проблему, можно потратить время на решение другой проблемы
#
Сколько времени следует посвятить выполнению предварительных условий?
Основные решение, которые приходится применять при конструировании
Выбор языка программирования
Конвенции программирования
Волны развития технологий
Выбор основных методик конструирования
Добро пожаловать в мир конструирования ПО!
#
#
#
Что такое конструирование ПО?
Составляющие разработки ПО
Слишком бюрократичен список
Список
Определение проблемы
Выработка требований
1 more item...
Конструирование
Контекст
Общепринятый
Не связано
1 more item...
Нормально связано
4 more items...
Сильно связано
4 more items...
Главное
1 more item...
Книги
#
Интуитивное понятие
Всё что делаешь для разработки
Объединение процессов в термин программирование или конструирование
#
Акцент
Синонимы
Кодирование
Плохой
1 more item...
Программирование
Не является конструированием
Список
Выработка требований
1 more item...
Разработка архитектуры приложения
1 more item...
Проектирование пользовательского интерфейса
Тестирование системы
1 more item...
Сопровождение системы
Управление
Конструирование может содержать в себе часть контекста из списка
Задачи, связанные с конструированием
Полное представление о задачах и процессах конструирования
#
Список
Проверка выполнения условий, необходимых для успешного конструирования
Тестирование
Блочное тестирование, интеграционное тестирование и отладка собственного кода
определение способов последующего тестирования кода;
Основная работа
создание и присвоение имен переменным и именованным константам;
выбор управляющих структур и организация блоков команд;
проектирование и написание классов и методов;
взаимный обзор кода и низкоуровневых программных структур членами
группы;
«шлифовка» кода путем его тщательного форматирования и комментирования;
интеграция программных компонентов, созданных по отдельности;
оптимизация кода, направленная на повышение его быстродействия, и снижение
степени использования ресурсов.
Почему конструирование ПО так важно?
В любом проекте хорошо улучшить качество ПО и повышение производительности труда разработчика
Почему?
Крупная часть процесса разработки ПО
#
30-80% времени разработки
Занимает центральное место в процессе разработки ПО
Повышенное внимание к конструированию может намного повысить производительность труда отдельных программистов
#
Единственный процесс, который выполняется во всех случаях
Нет кода - нет продукта
Результат конструирования — исходный код — часто является единственным верным описанием программы
Источник документации
Могут устареть
Спецификации требований
Проектная документация
Как читать эту книгу?
От корки до корки
#
Отдельные темы
#
Не знаю
#
Конструирование
Собирать что-то
Создание объекта
Ключевые моменты
#
#
#
#
В конечном счете ваша компетентность в конструировании ПО определяет то, насколько хороший вы программист. Совершенствованию ваших навыков и посвящена оставшаяся часть этой книги.
Предисловие
Вступление
Знания профессионалов сильно не соответствуют официальным методикам
Многие тупо не знают о современных трендах программирования
Многие методики попадают в массы лишь через годы
Хорошие практики
Печатаются только в узкоспециализированных изданиях
Книга стремится передать все новинки
Кому следует прочитать эту книгу?
Общее
Шаблоны общих проблем
Контроль крупных проектов
Сопровождение
Изменение требований к проекту
Опытные программисты
Как руководство к разработке
Книга о конструировании
Конструирование
Самая известная часть жизненного цикла разработки
Технические лидеры
Учить малых
Освежить знания
Программисты-самоучки
Информация об эффективных методах разработки
Студенты
Быстро вкатится в практику
Где ещё можно найти эту информацию?
Искать везде
Другие книги по разработке ПО
Книги по языкам программирования
Статьи в журналах
Технические руководства
Описание функций
Общие указания к применению ПО
Обслуживание ПО
Профессиональный опыт
Главные достоинства этой книги
Общее
Лучше программы
Меньше
Головной боли
Времени
Полное руководство по конструированию ПО
Общие моменты
Детали
Необязательно читать от корки до корки
Легко организован материал
Готовые к использованию контрольные списки
Фастом прочекать архитектуру
Спорные
Объективность
Любой автор скажет про свою книгу, что у него только всё самое нужное
Сам термин объективности тут не используется по назначению
Доступ к другим источникам информации
Список литературы и дополнительная литература есть во многих книгах
Есть web-сайт
Да в принципе похер на него
https://cc2e.com
Самая актуальная информация
Перевод был сделан в 2010-м году
Более общий взгляд на разработку ПО
Разработка стратегии для создания ПО
Избежать одних и тех же ошибок
Независимость от языка
Чтоб на любом языке мог писать
Многочисленные примеры кода
Разные языки
Научишься читать любые языки
Поймёшь, что не язык важен, а архитектура
Что побудило автора написать эту книгу?
Донести лучшие эффективные методики разработки
Через одну книгу, а не сотни
Тема конструирования игнорировалась
Цикл разработки ПО
SDLC
Software development life cycle
Фазы
Планирование и анализ требований
Участники
Старшие разрабы
Заказчики
Отдел продаж
Маркетинг
Что делается?
Проводится
1 more item...
Прогнозируется
1 more item...
Определяется
1 more item...
Планируется
1 more item...
Итог
Подходы
2 more items...
Определение требований
SRS
Спецификация требований к программному обеспечению
Это документ, отправляемый заказчикам
Конкретные требования к продукту
Проектирование архитектуры
Тут определяются подходы к разработке
DDS
Документ проектирования
2 more items...
Разработка
Собсна кодирование и конструирование кода
Тестирование продукта
Развертывание и сопровождение
Этап жизни просто не рассматривался из-за того, что появились другие
Автор думает, что раз конструирование вынесли отдельным этапом жизненного цикла, то можно и подзабить на него
А он не обязан быть связанным с остальными процессами жизненного цикла
Конструирование важно
Как будто это только механическая часть
Чаще всего ошибки возникают именно на этом этапе разработки
Автор связывает конструирование с кодированием?
Я думаю, что конструирование связано с архитектурой
Может быть это сама разработка?
Судя по всему я прав
Как раз на остальные этапы можно подзабить
А кодить надо всегда
Отсутствие похожих книг
Было мало книг
Старые
Слишком теоретические
Непроверенные
Не было упора на
Практику
ООП
Контрольные списки
Зачем?
Я не знаю, как делать приложения с нуля
Я хочу повысить качество своего кода
Возможно я хочу быть software engeneer