How to design programs на русском pdf
How to design programs на русском pdf
How to Design Programs: An Introduction to Programming and Computing, 2nd Edition
Название: How to Design Programs: An Introduction to Programming and Computing, 2nd Edition
Автор: Matthias Felleisen and Robert Bruce Findler
Издательство: The MIT Press
ISBN: 0262534800
Год: 2018
Страниц: 792
Язык: английский
Формат: epub
Размер: 20.2 MB
A completely revised edition, offering new design recipes for interactive programs and support for images as plain values, testing, event-driven programming, and even distributed programming.
This introduction to programming places computer science at the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process, presenting program design guidelines that show the reader how to analyze a problem statement, how to formulate concise goals, how to make up examples, how to develop an outline of the solution, how to finish the program, and how to test it. Because learning to design programs is about the study of principles and the acquisition of transferable skills, the text does not use an off-the-shelf industrial language but presents a tailor-made teaching language. For the same reason, it offers DrRacket, a programming environment for novices that supports playful, feedback-oriented learning. The environment grows with readers as they master the material in the book until it supports a full-fledged language for the whole spectrum of programming tasks.
This second edition has been completely revised. While the book continues to teach a systematic approach to program design, the second edition introduces different design recipes for interactive programs with graphical interfaces and batch programs. It also enriches its design recipes for functions with numerous new hints. Finally, the teaching languages and their IDE now come with support for images as plain values, testing, event-driven programming, and even distributed programming.
Как проектировать программы (HtDP)
Следующая статья о том, как писать игры на Scheme
Учебник HtDP (How to Design Programs), посвящен программированию на языке Scheme в среде drRacket.
drRacket можно скачать с сайта.
Вводная часть учебника содержит описание функции empty-scene, предназначенной для работы с изображениями. Например, эта программа создает пустую сцену
А эта помещает на сцену зеленый круг.
Для создания анимации используется функция animate. Следующая программа создает анимацию (движение объекта).
1. Функция animate запускает таймер и подсчитывает количество тактов.
2. Таймер срабатывает 28 раз в секунду.
3. Каждый раз, когда таймер «тикает», animane отправляет в picture-of-circle текущий такт; и
4. сцена отображается на канвасе.
Это означает, что круг сначала появляется в кооринате 0, затем 1, затем 2 и т. д. Поэтому круг опускается сверху вниз. Т.е. эта программа за 3,5 секунд создает около 100 изображений, что и позволяет создать эффект движения.
В первой части учебника приводится описание функции big-bang, а все программы, использующие big-bang, называются в дальнейшем world-программами. Эта программа рисует красный квадрат 100х100 (Параграф 2.5).
Если изменить значение параметра, функция нарисует квадрат другого размера.
Механизм передачи параметров, используемый функцией big-bang, можно рассмотреть
на примере алгоритма реализации функций CONS,CAR,CDR из учебника SICP.
Проверим результат работы этих функций.
Создадим функцию f-cr:
Теперь функция f-cr может передавать любые значения.
По аналогии создадим функцию big-bang-1:
и функцию to-draw-1, инкапсулирующую render-1:
Реализуем алгоритм передачи параметров (значений):
Далее в учебнике рассматривается конструкция вида:
которая позволяет обрабатывать нажатие клавиш, таймер, координаты движения объекта. Далее (Figure 13) приведен листинг программы, использующей эту конструкцию.
Запустить программу можно в режиме «Начинающий студент» (Верхнее меню → Язык → Выбрать язык… → Начинающий студент), добавив пакеты (Верхнее меню → Язык → Добавить учебный пакет. ) для работы с изображениями (image.rkt) и анимацией (universe.rkt).
Параграф 3 называется «Как проектировать программы» (How to Design Programs). Здесь говорится о том, что программы представляют информацию в виде данных. Это означает, что числа могут представлять из себя как количество тактов, отсчитываемых таймером, так и координаты объекта, его цвет, размер и т.п. Программа должна производить запись этих чисел в память и осуществлять преобразование этих числел обратно в координаты объекта, его цвет, размер и т.д.
На рис. 14 изображена диаграмма, иллюстрирующая эту идею.
Параграф 3.5 (On Testing) посвящен разработке с помощью тестов.
Параграф 3.6 посвящен проектированию world-программ. На рисунке 17 представлена упрощенная схема библиотеки 2htdp/universe.
Далее описывается 3 основных этапа по созданию big-bang-программ (параграф 3.7):
1. Для всех величин, которые остаются неизменными, надо создать константы.
a. «Физические» константы привязаны к таким атрибутам объекта, как скорость, цвет,
ширина, высота и т.д.
(define WHEEL-RADIUS 5)
b. «Графические» константы.
(define WHEEL
(circle WHEEL-RADIUS «solid» «black»))
2. Те свойства, которые изменяются с течением времени в ответ на нажатие клавиш,
таймер и т.д. надо представить в виде состояний объекта управления.
3. При получении набора состояний всех объектов, надо вызвать big-bang для отображения этих объектов. Далее следуют упражнения, в которых необходимо использовать функцию big-bang.
В параграфе 4.3 обсуждается вопрос обработки событий, генерируемых клавиатурой и мышкой. На рис. 20 представлена условная конструкция, обрабатывающая клавиши «left» и «right».
Добавлю, что если также необходимо обрабатывать клавиши «up» и «down», то координаты объекта следует хранить в списке:
и передавать этот список в big-bang:
функция place-dot-at «разбирает» список на части:
а функция keh «разбирает» список, изменяет одну из координат, и собирает обратно:
Далее предлагается разработать программу-светофор.
Добавлю, что светофор переключается очень быстро (каждый такт). Чтобы этого избежать, надо изменить время срабатывания таймера.
Теперь таймер будет срабатывать каждые rate-expr секунд (on-tick tick-expr rate-expr).
Также в тексте дана ссылка на страницу с world-программами. Запустить программы можно в режиме «Начинающий студент», добавив необходимые пакеты.
Параграф 5 (Adding Structure) содержит определение структур данных (Пример)
В параграфе 5.4 автор дает определение структуры: структура, фактически, определяет другие функции. В частности:
1. Конструктор, который создает экземпляр структуры.
2. Селектор, который имеет доступ к полям экземпляра структуры.
3. Структурный предикат, который, подобно обычным предикатам, проверяет,
является ли аргумент экземпляром структуры.
make-posn — это конструктор
posn-x и posn-y — селекторы
posn? — предикат
Подробнее об этом написано в Документации (Structures)
Параграф 5.5. Программу из упражнения 71 предлагается запустить по-шагам (step-by-step) в отладчике. Запускать надо в режиме «Начинающий студент», добавив учебные пакеты.
В параграфе 5.6 автор делает поэтапное описание программы для покадровой анимации (перемещение объекта вдоль одной из осей). Теперь в программе используются структуры для определения координат объекта.
Вот эта программа
В параграфе 5.11 приводится пример обработки изображения.
В параграфе 6.1 делается поэтапное описание игры Space invanders.
В параграфе 6.2 предлагается дополнить программу из параграфа 4.3 (светофор).
Как проектировать программы
Бумажное издание
Электронное издание
Купить электронную книгу
Аннотация
Цель этой книги – познакомить читателей с системным подходом к проектированию и сформировать у них правильные навыки программирования, которые предполагают пошаговое планирование и понимание рабочих задач на каждом этапе создания программы.
В фокусе книги – общие принципы проектирования программ, поэтому используется не стандартный промышленный язык, а специализированный язык обучения Racket, а также среда программирования DrRacket, которая обеспечивает увлекательное обучение. Возможности среды растут по мере того, как читатель осваивает материал, – вплоть до поддержки полноценного языка, пригодного для решения всего спектра задач программирования.
Издание адресовано широкому кругу читателей, которые хотят научиться мыслить алгоритмически и создавать по-настоящему ценные программы.
Оплата
Наш интернет-магазин работает только по предоплате!
Мы принимаем следующие виды оплаты:
Вы так же можете выбрать оплату по платежной квитанции и оплатить по ней покупку в отделении любого банка.
Юридические лица могут выбрать счёт на оплату.
Возврат денежных средств возможен в случаях:
Возврат не проводится в случаях:
Для оформления возврата обращайтесь по электронной почте dmkpress.help@gmail.com.
Доставка:
Курьерская доставка по Москве в течение 7 дней после оплаты заказа.
Стоимость доставки:
Самовывоз возможен в течение суток после оплаты.
Адрес для самовывоза:
115487, г. Москва, проспект Андропова, 38
Доставка почтой России: от 7 до 28 дней с момента оплаты заказа.
Стоимость доставки:
5 книг по проектированию архитектуры ПО
Собрали несколько крутых англоязычных книг, которые помогут в изучении основ проектирования архитектуры ваших сервисов и приложений.
Architectural Styles and the Design of Network-based Software Architectures
Хорошая архитектура не создается в вакууме. Все проектные решения на архитектурном уровне должны быть выполнены в контексте функциональных, поведенческих и социальных требований разрабатываемой системы. Автор этой диссертации, Рой Томас Филдинг (Roy Thomas Fielding) пытается донести, что это является принципом, который в равной степени относится как к проектированию архитектуры программного обеспечения, так и к традиционной области проектирования архитектуры зданий.
Naked Objects
Большинство людей, которые считают, что они делают объектно-ориентированный дизайн, на самом деле ничего не делают, потому что игнорируют самый важный принцип ООП. Авторы описывают этот принцип как «поведенческую полноту»: объект должен полностью моделировать поведение сущности, которую он представляет. Вместо этого большинство людей продолжают разрабатывать бизнес-системы, которые отделяют процедуры от данных, которые только внешне напоминают ООП подход.
Поскольку поведенческая полнота является ключом к реализации основного преимущества объектной ориентированности: способности справляться с непредвиденными изменениями требований.
Data-Oriented Design
Книга об ориентированном на данные подходе в разработке. Ее автор, Ричард Фабиан (Richard Fabian) многие годы занимался разработкой на C++, чтобы прийти к мыслям об этом подходе и изложить их на страницах этого учебника.
How to Design Programs
Как проектировать программы – это книга Маттиаса Феллесина (Matthias Felleisen), Роберта Брюса Финклера (Robert Bruce), Мэтью Флатта (Matthew Flatt) и Шрирама Кришнамурти (Shriram Krishnamurthi) о систематическом проектировании компьютерных программ, опубликованных в 2001 году издательством MIT Press. Книга представляет собой готовую концепцию проектирования, шестиэтапный процесс создания программ, основанный на описании проблемы. Этот учебник принят в ряде колледжей и университетов для обучения принципам разработки программ.
Unmaintainable Code
Автор «Неподдерживаемого кода» обещает пожизненную работу каждому, кто будет свято следовать советам этой книги. Потому что никто, кроме вас потом не сможет в этом коде разобраться. Более того, если следовать инструкциям в точности, то разобраться в коде не сможет даже его автор.
Хороший материал про то как писать код на примерах того, как это делать не стоит.
Программирование для начинающих: методики и языки
Запись доклада и презентация Пару месяцев назад Виталий Брагилевский рассказывал про выбор первого языка программирования. Разумеется, этот выбор зависит от кучи факторов, но есть проверенные временем и исследованиями конкретные языки и методики, которые можно и нужно рекомендовать в первую очередь.
Какое-то время интересуюсь темой и — о, чудо — мои любимые языки и курсы оказались в итоговой рекомендации автора. К тому же теперь для неверующих у меня в рукаве есть козырь в виде Бравита, который говорит, что я «шарю в теме» 🙂
В конце доклада Виталий предложил такую схему:
Рекомендуемый порядок изучения языков/направлений, чтобы не хармить мозги почём зря
Выделены три уровня:
Когда первокурсник или школьник начинает изучать программирование, то ни он сам, ни, тем более, преподаватель не знают, к чему это приведёт. Задача языков первого уровня — не мешать студентам учиться мыслить алгоритмически и строить абстракции. Язык для начинающего должен быть простым инструментом, формирующим высокоуровневое мышление. Специализация — следующий шаг (второй и третий уровень).
Важно помнить, что методика обучения — это основа, а язык — вспомогательный инструмент методики. Когда методика и язык друг друга дополняют или хотя бы не противоречат, то обучение идёт системно, контролируемо и с интересом.
В этой статье рассматривается только первый уровень. Для каждого языка приводится описание методики и даются ссылки на курсы и книги, которые можно изучать самостоятельно или использовать в учебной программе.
Язык Racket, курс How to Design Programs #
О языке #
Когда мы говорим Racket, мы часто имеем ввиду не сам язык, а подмножества языков, которые на Racket созданы. Racket — это язык для создания языков. Он хоть и ЯП общего назначения, но его основная фишка — language oriented programming.
Racket поставляется со своей средой разработки, которая называется DrRacket:
DrRacket: редактор кода с REPL-ом, окно с запущенной программой и стэппер (позволяет запускать программу пошагово)
По ходу обучения язык дополняется фичами пять раз, развиваясь вместе со студентом. Студент начинает писать программы на простейшем Лиспе с минимальным уровнем абстракций и постепенно его возможности увеличиваются.
Такой подход, во-первых, снижает когнитивную нагрузку: на студента не вываливается всё сразу. Во-вторых, студент контролируемо проходит этап работы с языком на низком уровне: вручную конструирует списки, формирует рекурсивные и итеративные процессы и т.д. Это позволяет лучше понять порядок вычислений (evaluation).
Учебный процесс #
Студенты учатся, создавая небольшие игры. Например, в несколько строк можно запустить ракету:
Или отправлять корову на прогулку:
Или запилить Space Invaders (проект в конце первой части курса от UBC).
Профессиональным программистам этот курс поможет научиться мыслить в функциональном стиле и использовать принципы проектирования на основе данных (Data-Driven Design):
Заниматься по HtDP — полезное, интересное и весёлое занятие. Вот Джон Кармак, например, со своими детьми тоже игры на Racket писал:
Teaching my older son lisp (Racket). Working on a Pokemon battle simulator. pic.twitter.com/yXxw0xefUD
Альтернатива SICP #
The Structure and Interpretation of the
Computer Science Curriculum HtDP был создан как более структурированная и доступная альтернатива курсу «Структура и интерпретация компьютерных программ», он же SICP.
Если SICP был разработан в первую очередь для студентов MIT с хорошей математической базой и навыками в электротехнике, то HtDP сделали так, чтобы он подошёл вообще всем. Создатели курса считают, что навыки проектирования программ пригодятся людям любых профессий.
Хороший код — сразу #
HtDP круто прокачивает факторинг кода (писать код так, чтоб не надо было потом рефакторить). Навыки проектирования прививаются через пошаговые рецепты для работы с данными, функциями и программами в целом. Тесты — неотъемлемая часть процесса проектирования.
К сожалению, мало кто знает, что существуют техники, позволяющие стандартизировать процесс написания кода, сделать его вдумчивым и контролируемым. Мы просто фигачим, пока не заработает.
The typical course on programming teaches a “tinker until it works” approach. When it works, students exclaim “It works!” and move on. Sadly, this phrase is also the shortest lie in computing, and it has cost many people many hours of their lives. In contrast, this book focuses on habits of good programming, addressing both professional and vocational programmers.
Видимо, поэтому слово «факторинг» гораздо менее популярно, чем слово «рефакторинг»:
— I’m factoring code.
— You’re what?
— I’m refactoring my code for the 0th time.
— Ah.
Типизация #
В курсе используется динамический язык, но студенты с самого начала работают с типами, описывая структуры данных, входные и выходные значения в комментариях.
Вот пример определения типа Ball с конструктором, селекторами и примером использования в функции:
Пример функции, которая принимает тип Ball и возвращает тип Ball :
Могу предположить, что в этом месте у кого-то может бомбануть от синтаксиса. Призываю вас не делать поспешных выводов. Прочитайте пару глав из книги, поработайте над заданиями и вы поймёте, что это очень крутой крус и прекрасный, выразительный и мощный язык.
Язык Pyret, курс Programming and Programming Languages #
Ahoy world! Это моё любимое. Язык, книга, методика — всё офигенное, современное и ни разу не скучное.
Язык Pyret базируется на принципах HtDP. Это следующий шаг в адаптации методики для более широкой аудитории:
Pyret is driven by the How to Design Programs (HtDP) philosophy of programming education; one could almost view it as a language designed to make teaching from HtDP comfortable.
Один из идеологов Pyret и PAPL — Шрирам Кришнамурти, который работал и продолжает работать над HtDP и Racket. Мой любимый препод, всегда с удовольствием смотрю его лекции и доклады.
Не могу не упомянуть Bootstrap — набор методик для факультативных занятий по школьным дисциплинам через программирование, где также используется Pyret.
На занятиях школьники прокачивают алгебру и физику, создавая игрушки. Прорабатывают школьные предметы через программирование. Так сделали специально, чтобы ученики охотнее посещали занятия по Computer Science и чтобы учителя школьных предметов были заинтересованы в этом. Изящное решение задачи «как повысить уровень компьютерной грамотности среди школьников». У Шрирама есть доклад, как они внедряли это в школах. Очень интересно.
Кроме физики и алгебры в Bootstrap есть ещё Data Science и реактивное программирование.
Материалы Bootstrap открыты, регулярно проходят онлайн-занятия для инструкторов (см. анонсы в Твиттере).
Язык Python, курс CS61A #
Курсов по введение в Computer Science на Python тыщи, но выделить хочется один — CS61A: Structure and Interpretation of Computer Programs от Калифорнийского университета в Беркли. Версия того самого SICP-а. Раньше в Беркли его читали по классике, используя язык Scheme. Нынче адаптировали для Питона и сделали ещё более доступным.
На сайте курса есть материалы высшего качества: записи всех лекций, учебник и куча заданий с тестами для проверки решений.
Python заточен под императивное программирование и SICP на нём выглядит неуклюже. Тем не менее, этот тот случай, когда методика решает. К тому же, Питон сейчас очень популярен и в хозяйстве пригодится любому программисту.
Курс ведёт John DeNero. Раньше он работал в Гугле, занимался переводами и обработкой естественных языков.
Язык PascalABC.NET #
Язык PascalABC.Net разработан в Южном Федеральном Университете. Это всё, что я про него знаю 🙂
Что выбрать для самостоятельного изучения? #
Самый крутой, всеобъемлющий, влияющий на мышление, приносящий светлое будущее курс — How to Design Programs.
Самый интересный с точки зрения современных тенденций — Programming and Programming Languages. Функциональное программирование, статическая типизация, вывод типов. В Pyret даже refinement types есть, но при это он проще и дружелюбнее, чем Python. Racket, кстати, тоже.
Самый практичный курс с точки зрения работающего программиста — CS61A. Проверенная методика, очень популярный язык.
Курс и книга из последнего раздела будут полезны тем, кто хочет познакомиться с основными императивными алгоритмами и структурами данных.
А вообще все эти курсы и языки — клёвые. Даже если у вас за плечами годы опыта, уверен, в любом из них вы найдёте что-то новое и интересное.