[Из песочницы] Руководство инструктора к книге «Программирование: Принципы и практика с использованием C++»

habr.png

Привет, Хабр! Представляю вашему вниманию перевод статьи «Instructor«s Guide for Programming» автора Бьярне Страуструпа (дата последнего посещения: 20.12.2017).


От переводчика


Бьярн Страуструп известен как разработчик языка программирования C++. Книги его авторства лежат на столах многих маститых разработчиков.


Особенно стоит отметить учебник по основам программирования «Программирование: Принципы и практика с использованием C++». Бьярн написал его для студентов Техасского университета агрокультуры и машиностроения, в котором он долгое время преподавал курс для студентов. В дополнение к самому учебнику, на сайте www.stroustrup.com можно найти Руководство инструктора. Изложенный в нем опыт преподавания курса основ программирования может быть полезен не только для курса по C++. В руководстве можно найти ответы на типичные вопросы преподавателей: Как подавать материал? Как бороться с расслоением группы по навыкам? Насколько глубоко нужно погружаться в тему?


Мне не удалось найти русской версии Руководства инструктора к книге «Программирование: Принципы и практика с использованием C++», поэтому я решил перевести его и опубликовать.


Резюме


Этот текст — просто сборник наблюдений и выводов. Они могут быть полезны, если вы ведете курс по книге «Программирование: Принципы и практика с использованием C++».


Предположения


Я предполагаю, что вы профессор, лектор, инструктор, ассистент преподавателя. Может быть ваша должность называется иначе. Главное — вы занимаетесь или планируете заниматься преподаванием курса по книге «Программирование: Принципы и практика с использованием C++». Я предполагаю, что вы прочитали (хотя бы) предисловие книги и Главу 0 «Обращение к читателям». Если это не так, прошу вас уделить этому некоторое время перед чтением этого материала.


Я предполагаю, что ваши студенты до сих пор не программировали, имеют отдаленное представление о программировании или использовали язык, который отличается от C++. В основном я решаю проблемы первых двух групп.


После общей информации о главе, вы можете найти комментарии к отдельным разделам. Используйте эти заметки при планировании лекции, основанной на данной главе. Слайды моих презентаций доступны на сайте. Если вы будете использовать мой материал, то, я надеюсь, вы предложите как его можно улучшить.


Мы будем рады обратной связи и описанию вашего преподавательского опыта.


Замечание: Этот текст всего лишь заметки и ничего более. Никто не занимался техническим редактированием этого текста. Не ожидайте завершеннности материала. Напротив, он будет дорабатываться на основании дальнейшего опыта и по мере его выражения в этих записях. Я планирую обновлять эти заметки (они доступны на сайте поддержки).
Прим. перев: Последнее обновление было 10/7/2011.


Введение


В народе ходят стойкие убеждения, которые мешают научиться писать хорошие программы:


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


Главная ваша задача, как преподавателя программирования, в том, чтобы минимизировать влияние этих мифов.


У нас есть одна успешная практика. Каждые три или четыре лекции мы уделяем несколько минут на описание интересных прикладных задач, решаемых с помощью программирования. В Главе 1 вы можете получить представление, что мы считаем интересным. Студенты лучше воспринимают сухую теорию, если им указать на область ее применения. Важно, чтобы эти комментарии были краткими и не превратились в нравоучения. Если вы сами не чувствуете, что какая-то задача увлекательна, не пытайтесь убедить в этом студентов. Они раскусят ваш ложный энтузиазм в первый же миг. Во время рассказа мы опираемся на наш личный опыт, на то что мы видели в командировке, слышали в новостях или читали в журнале. Обязательно приведите примеры: пару фотографий или даже реальные устройства, например iPod, мобильник, часы.


Обратите внимание, что у студентов могут быть различные интересы. Некоторых студентов могут заинтересовать новейшие разработки в видеоиграх. Однако такие факты могут создать негативное представление о программировании у более серьезных студентов, которые еще не решили, нужно ли им вообще изучать программирование, компьютерные науки и информационные технологии. Вторую группу, в разных пропорциях, могут заинтересовать примеры из биологии и биомедицины. (Прим. перев: Учебник был разработан в Техасском университете агрокультуры и машиностроения, скорее всего это местная специфика) Очень важно рассказать обо всем разнообразии задач, иначе студенты отключатся и сохранят обывательский, лишенный воображения взгляд на программирование. При любой возможности, старайтесь связать код с примером из реального мира: «Гугл использует техники как в STL» — хороший пример для частей по STL, графический интерфейс iPod подходит для главы о GUI, а пример с самолетом — к главам про работу с железом и корректность программ.


Необходимо донести идею о том, что написание и запуск маленьких программ это часть «чтения главы». Мы обнаружили, что для многих новичков материал в первых главах выглядит слишком простым, чтобы воспринимать его серьезно, а некоторые фрагменты — слишком абстрактными, чтобы тратить на них время. Студенты часто приходят с небольшим опытом в программировании и поэтому считают, что они знают все. По крайней мере все, что им вообще могут рассказать в первый месяц. Из за этого они могут даже пропускать первые лекции. Другие до сих пор не сталкивались с программированием, но считают, что могут изучить его с помощью книг. В школе у них сложилась иллюзия, что они сами могут отличить важное от несущественного. Некоторые из сильных студентов недооценивают время и усилия, которые им нужно потратить. Школьный материал давался им без особых усилий. В реальности это не так. Чем раньше они это поймут, тем лучше.


Чтобы преуспеть в изучении курса, студенту в первую очередь нужно «тратить время» на выполнение заданий. Это важнее, чем предыдущий опыт программирования, оценки в школе или интеллектуальные способности (насколько мы можем судить). Для минимального знакомства с материалом достаточно выполнить задания. Однако для полного освоения курса необходимо присутствовать на лекциях и выполнять упражнения в конце глав. (Прим. перев. В конце каждой главы книги есть и задания, и упражнения) Мы выделяем время в «лаборатории» и ассистентов преподавателя для помощи с упражнениями. Одна из полезных практик — разделение студентов на маленькие группы. При этом желательно составлять группы из людей с разнообразным опытом программирования. В каждой главе приложите все усилия, чтобы каждый студент:


  • Выполнил «Задания». Тут будет полезен инструктор, ассистент или просто опытный студент, который может помочь с возникающими «небольшими практическими проблемами».
  • Прочитал «Послесловие» и ответил хотя бы на некоторые вопросы. Это может потребовать повторения некоторых фрагментов текста. Прилежные студенты сделают это самостоятельно. А тех, кому это на самом деле нужно, придется «попинывать».
  • Выполнил несколько упражнений. Они грубо отсортированы по сложности (простые в начале) и последующие зачастую основаны на предыдущих.


Берегитесь гиков-всезнаек, которые будут убеждать других студентов в своей правоте, аргументируя школьными знаниями или информацией с форумов в интернете. Использование массивов и указателей вместо векторов и строк это «светлая идея», которая наносит наибольший ущерб. Ее жертвами становятся невинные новички, которым приходится продираться через проблемы переполнения буфера, выделения памяти фиксированными блоками, использования strcpy () и т.п. задолго до того, как они будут к этому готовы.


Считается, что мы пишем для «элитных студентов топовых вузов». Это очень лестный отзыв для первокурсников TAMU, но реальность как всегда не такая. У нас не самый строгий отбор, да и студенты не настолько мотивированы осваивать курс, как нам бы хотелось. Если быть честными, то первые несколько сотен студентов были инженерами-электриками и компьютерными инженерами, которые не видели своего будущего в разработке софта (сам курс просто был обязательный). Мы начали учить первокурсников специальности компьютерных наук намного позже, когда наши результаты вышли на уровень этих специалистов.


Если вы преподаете в большой группе, далеко не все будут справляться. В этом случае вам нужно принять тяжелое решение: замедлиться для помощи слабым студентам или держать темп и потерять их. Всеми фибрами души вы бы будете стремиться притормозить и помочь. Помогайте. Всеми доступными способами. Но ни в коем случае не замедляйтесь. Это будет нечестно для умных, подготовленных и упорно работающих студентов — от отсутствия сложных задач они заскучают, и вы их потеряете. Раз вы в любом случае кого-нибудь потеряете, пускай это будут не ваши будущие звезды, а те, кто никогда не станет хорошим разработчиком или ученым. Компьютерные науки и разработка программ и так уступают студентов более интересным областям науки. Пожалуйста, не усугубляйте эту проблему.


Мы убеждены, что студенты оправдают наши ожидания и наш курс, кажется подтверждает это. Опросы показывают, что слушатели курса занимаются на 25% больше часов и отзываются о нем на 25% лучше, чем о типичной дисциплине для первокурсников. Так совпало, что это был наибольшая оценка удовлетворенности в инженерном колледже). Этот курс не сложнее, чем средняя биология, физика или математика для первого курса для типичных выпускников американских школ. Обычно в устоявшихся академических областях знаний, вроде биологии, подготовка в школе лучше, чем к компьютерным наукам.


Некоторые предполагают, что курс был успешен «потому что его вел Бьярн Страуструп». Это тоже очень лестно, но тоже не правда. Первокурсникам не свойственно благоговение перед чьей то репутацией, к тому же многие поначалу (к моему сожалению) намного более заинтересованы в оценках, чем в изучении серьезных технических деталей. Так или иначе, последние 4 семестра курс вели Пит Питерсен, Уолтер Доэрти и Ронни Вард; они очень опытные преподаватели старших курсов; Я занимаюсь только случайными «гостевыми лекциями».


Первоначально курс вели с двумя лекциями в неделю плюс занятия в в лабораториях под руководством ассистентов преподавателей. Этого не хватало и нам пришлось срезать углы. Позже, курс был расширен до трех лекций в неделю плюс лабораторные и стало лучше. Только тогда мы смогли посвятить время разбору примеров и добавить больше примеров из книги. Скорее всего, сильным студентам это было не нужно (эта информация есть в книге), но это помогло большинству студентов. В книге все еще есть много информации, которую хотелось бы представить на лекциях. Мы отводим каждому слайду по 2 минуты. Если у вас такая же скорость, вы обнаружите, что некоторые слайды придется пропустить, чтобы уложиться в лекцию на 50 или 60 минут. Мы тоже так делаем.


Сейчас мы решили поэкспериментировать и растянули курс на два семестра с двумя лекциями в неделю. Я не ожидаю успеха, потому что проходит довольно много времени между началом курса и началом разбора «интересных» задач. Будем надеяться, что я ошибаюсь.


Далее вы найдете обзоры к каждой главе. Они могут быть полезны преподавателям, но я решил не помещать их в книгу. Контрольные вопросы оказались полезнее для студентов, чем обзоры, в которых находятся все ответы (и которые нравятся по неправильной причине).


Мы всегда успеваем пройти от главы 1 до главы 22 за 15-недельный семестр. Это оставляет нам несколько дней на сессию и время для необходимого группового проекта в последние (примерно) три недели (одновременно с заключительными лекциями). Главы 22–27 на самом деле не обязательно должны идти в этом порядке. Вы можете читать их при необходимости. Они могут быть весьма полезны для поддержки более амбициозных проектов.


Обратите внимание, это значит что мы используем 1264-страничную книгу для курса, который описан на 812 страницах. (прим. перев. в переводе 1329 страниц всего и 827 на основные главы). Все остальное это дополнительный метарил: специальные темы для заинтересованных студентов, справочные материалы и т.п.


Практическое замечание: Слайды немного перегружены информацией потому что некоторые студенты (слишком) опираются на информацию в них и могут упустить материал в книге, которого нет на слайдах. Кроме того, это помогает инструктору, у которого было недостаточно времени на подготовку (весьма распространенный феномен). Код написан шрифтом 20пт. Этого достаточно для большинства в аудитории на 200 человек. В редких исключительных случаях, я использую шрифт 18пт. Мне не очень нравятся украшательства на слайдах, поэтому там нет мудреных переходов или занимательной анимации. Если темный фон вас смущает, поменяйте дизайн на черно-белый. Наш коллектив в TAMU так и не пришел к единому мнению на этот счет. Если у вас есть больше фотографий для иллюстраций или они лучшего качества, прошу вас прислать их мне. Студентам нравятся красивые фотографии если они связаны с темой занятия.


Перед каждой главой ознакомьтесь с информациях об ошибках (www.stroustrup.com/Programming/errata.html). Опечатки, особенно во фрагментах кода, могут очень помешать в обучении.


Вы можете добавлять слайды для решения тактических вопросов. Мы делаем так же. Я удалил все слайды, относящиеся к TAMU, чтобы вам не пришлось этого делать. Не стесняйтесь добавлять свое имя на первом слайде, но если вы не делали значительных изменений, пожалуйста, оставьте мое имя и ссылку на сайт поддержки. Я публикую PowerPoint для того, чтобы упростить изменение.


Благодарности


Благодарю Лоуренса «Пита» Питерсена, Уолтера Доэрти и Ронни Варда за конструктивные комментарии слайдов и этого руководства.


Глава 0: Обращение к читателям


Очевидно, что «Глава 0» пронумерована странно.»0 is odd» одновременно значит »0 — нечетный» и »0 — странный». Это намеренная нелепость. Ее прочтут только некоторые студенты, а большинство пропустят. Немногие из тех, кто никогда не программировал раньше смогут понять ее. Ее основная цель — дать вам, профессору, лектору, ассистенту преподавателя и т.п, общее представление о моих целях и методах.


Так почему же «Глава 0»? Поскольку нумерация в C++ — как шкала на рулетке — начинается с 0, а не с 1. Чтобы дать людям зацепку: «Тут происходит что-то необычное». Чтобы обозначить, что эта глава отличается от серии других глав с лекциями и домашним заданием. В некоторой степени она передает «мета-информацию».


Мы не рекомендуем студентам читать Главу 0, однако многие будут. Мы не предлагаем проводить лекций по материалу Главы 0. В то же время она содержит идеи, которые нужно по мере необходимости использовать во всех лекциях и обсуждениях. Она отвечает на вопросы «Почему мы делаем так?» и «Действительно ли нам нужно делать так?» задолго до того, как студенты зададут их во время курса. Иногда вам будет достаточно ответить «Теперь ты готов прочитать Главу 0».


Тем не менее я прошу вас прочитать Главу 0 и отнестись к ней со всей серьезностью. На начальном этапе постоянные попытки улучшить курс путем добавления материала могут привести к разрушительным последствиям. До Главы 12 студенты находятся на грани перегрузки. Они двигаются вперед только если их постоянно мотивировать. После каждой главы они способны сделать немного больше, чем раньше, даже если они этого не понимают. Пожалуйста, не пытайтесь расширить курс, принуждая студентов на этом этапе понять абсолютно все. Ваша задача в том, чтобы подготовить у них такую базу навыков, к которой они самостоятельно смогут добавлять новые знания и при этом осмысленно применять их.


Если вы ассистент преподавателя, то прежде чем пытаться что-либо объяснять студентам, пожалуйста, прочитайте книгу целиком. Материал отличается от C++ ваших отцов. Кроме того, откройте лекции или, хотя бы, прочитайте текст слайдов. Трудно помогать студентам, если вы не знаете какими фактами они располагают. Информация на слайдах к главе это наилучшая шпаргалка по самой главе.


По моему мнению, одна из убийственных и разрушительных практик это детальное изучение базовых типов C++, их взаимодействия, а также подробной работы ветвления, циклов и рекурсии. На этом этапе это просто мертвый груз. Вы многие годы можете быть отличным разработчиком, но при этом не сможете объяснить (абсурдные) правила преобразования из unsigned short в int.


Глава 1 и 2


Чтобы приступить к программированию, студенту нужно:


  1. Представление о важных и полезных задачах для разработчиков ПО, стремление добиться успеха при их решении и немного идеализма.
  2. Наглядный пример, который они смогут написать, запустить и модифицировать ради эксперимента.
    И то и другое важно. Мы предлагаем посвятить этому половину лекции 1.


Цель главы 1 в том, чтобы передать чувство волнения, стремления к благородной цели и профессионализма. Она совсем не о том, как создавать кровавые и жестокие видеоигры.


Если вы хотите спасти мир (не как политик, а как технический специалист), то вам придется использовать компьютер. Идеи, инструменты и техники, которые преподаются и изучаются здесь, двигают человечество вперед. Мы в целом не против видеоигр; мы против распространенного заблуждения, что видеоигры это главное применение компьютеров. При каждом удобном случае, невзначай упоминайте, что большинство видеоигр написаны на C++ с помощью техник, которые можно освоить на этом курсе.


Многие студенты с трудом представляют себе компьютер, который выглядит иначе, чем ПК с клавиатурой и экраном. Весьма полезно рассказать им о том, что из себя представляет большая половина компьютеров, для чего они используются и какие люди с ними работают. Совсем не повредит напомнить студентам, что в отрасли (США, Европе и других странах) не хватает хороших строителей информационных систем. А это значит, что у них перспективная карьера и хорошая зарплата. Сами студенты об этом пока могут не задумываться, в отличие от их друзей не-программистов и родителей. Многие люди (популярные журналисты, советники по карьере и родители) помнят кризис доткомов в 2000 году и могут думать, что вся техническая работа была передана на аутсорс за границу. Что это не американские бизнесмены нуждаются в квалифицированных технических кадрах. Я могу возразить им, что большинство выпускников американских колледжей по электротехнической и компьютерной специальности получают наибольшую среднюю зарплату. Больше, чем специалисты в чистой науке, бизнесе и т.п.


Обратите внимание на разнообразие платформ на фотографиях. Многие студенты имеют весьма смутное представление о том, что такое компьютер. Профессиональный разработчик ПО за свою карьеру может встретить самые различные платформы: от компьютеров на кончике ногтя до монстров, заполняющих целые залы или распределенных на нескольких континентах.


Глава 2 посвящена знакомству с инструментарием. В ней студенты узнают, что нужно сделать чтобы запустить простейшую программу «Hello, world!». Она весьма незамысловата. Если вы сами не объясните ее излишне запутанно (не надо!), то типичная реакция студентов «А в чем проблема то?». Пока что никаких проблем нет, да и не будет, если студенты освоят свои инструменты и выработают привычку читать текст заданий и выполнять упражнения.


Всегда смотрите в раздел «Послесловия». В нем обычно говорится нечто важное либо о самой главе, либо о том, к чему она ведет.


Лекция №1 раскрывает содержание обеих этих глав и дает студентам обзор курса, чтобы они имели представление к чему они в итоге придут (в дополнение к вводному разговору о важности ПО). Особое внимание направлено на структуру кода и фундаментальное стремление к корректности и профессионализму.


Разъяснения к фотографиям на слайдах как правило повторяются и в самой книге.
Изображенные самолеты это Боинг 787 (на C++ в них написаны системы, которые не отвечают за полет) и F35 (единый ударный истребитель) во время полета (над Форт-Уорт в Техасе). Ветряные установки конечно же запрограммированы на C++. А тот грузовик используется в сейсмической разведке нефтяных залежей. Множество ПК управляют обсерваторией Кек, которая расположена на пике горы Мауна-Кеа, на острове Гавайи.


Раз мы имеем дело с новичками, то простой запуск «Hello, world!» связан с множеством практических проблем: У многих студентов нет учетных записей на сервере колледжа, у некоторых нет компиляторов C++ и они не знают где его взять, некоторые ассистенты преподавателя только что вернулись из отпуска или из летней интернатуры. Пожалуйста сделайте все, чтобы решить административные и логистические проблемы перед первой лекцией. Если это возможно, проведите встречу с ассистентами преподавателя за неделю до начала, чтобы определиться, как минимизировать проблемы и как решать их, если они все же возникнут (если у вас 150 студентов, у вас будут непредвиденные проблемы). Будьте доступны или (еще лучше) обеспечьте доступность ассистентов между первой и второй лекцией, чтобы у всех успешно запускалась программа «Hello, world!» до начала лекции №2. Если этого не сделать, некоторые студенты неделями будут отставать от основной группы или даже бросят занятия.


Добейтесь, чтобы все ассистенты на самом деле прочитали каждую главу прежде чем они начнут помогать студентам. Привлекать ассистентов со знанием C++ по традиционному курсу или даже со знанием java — плохая идея.


В этой лекции мы также разбираем что является обманом, а что — нет. Многие первокурсники слегка смущены этим. Совместная учеба считается обманом? Запрещается ли давать кому-то списывать решенные задания? Допускается ли использование (программной) библиотеки? Наши ответы: «нет», «да», «только если вы забудете как это делали раньше». Если нужно объяснить этику, это может быть подходящим временем для рассказа.


При перечислении прикладных областей программирования я, как и многие, упускаю из внимания образовательную деятельность. Если цель студента — стать учителем (вплоть до университета), особенно учителем научных дисциплин (опять же, вплоть до университета), или кого-то волнует распространение технических навыков (тренеры, техписы и т.п.), база в разработке ПО может быть не просто полезна, а необходима. Очевидно, что программирование в первую очередь вдохновляет молодых людей воспринимать науку и технологии серьезно: просто подумайте о соревнованиях роботов или визуализации биологических систем.


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


Где то между первыми тремя лекциями, обратите внимание, что каждый из примеров можно запустить на любой платформе; упомяните ПК на Windows, Apple, Linux и Unix. Весь код из книги можно найти на сайте поддержки. Мы считаем, что переносимость очень важна; большинство студентов либо не согласны с нами, либо не понимают о чем речь. Однако многие из них привязаны к своему нынешнему компьютеру, и курс с поддержкой «переносимости» будет полезен для них всех. Мы позволяем студентам использовать «любую систему с современным компилятором C++», при этом непосредственную поддержку мы обеспечиваем только системе, используемой в университете. Большинство студентов использует Windows, но у нас всегда находилось несколько пользователей Mac и Linux.


Мы используем «самодельный» заголовочный файл std_lib_facilities.h. Это может быть не идеальный подход, однако:


  1. Мы ушли от необходимости рано рассказывать студентам о нескольких заголовочных файлах (\, \ и \) и сопутствующих фактах:
    • о пространствах имен,
    • о разнице между пользовательскими типами и встроенными типами,
    • о соответствии между заголовочным файлом и инструментами, которые в нем подключаются
    • о различных способах применения директивы using и о возможности явного указания пространства имени
  2. Файл написан в соответствии стандарту C++ и будет разобран позднее
    В качестве компромисса, мы решили упростить код первых глав за счет использования std_lib_facilities.h. Глава 8 содержит подробное описание заголовочных файлов и пространств имен. Детальное разъяснение string, vector, iostream и algorithm будет еще позже.


Мы очень заинтересованы в том, чтобы не давать студентам просто «магию». Тем не менее фраза »#include «std_lib_facilities.h» позволяет использовать инструменты (facilities) стандартной библиотеки (и чуть позже мы объясним как)» намного меньше похожа на заклинание, чем «компилятор производит исполняемый код».


Помимо книги у вас должен быть доступ к сайту поддержки, где можно скачать заголовочный файл std_lib_facilities.h. На случай отсутствия интернета, я прикрепил содержимое этого файла в конце этого документа.


Различные системы, IDE, сообщества используют различные соглашения насчет расположения заголовочных файлов и файлов с кодом (.cpp). Структура проекта может запутать новичков (я и сам порой путаюсь). Книга описана в предположении, что .h и .cpp файлы находятся в одной папке. Таким образом мы подключаем заголовочный файл директивой


#include "std_lib_facilities.h"


В зависимости от соглашений, вы можете также посоветовать студентам использовать


#include "../std_lib_facilities.h" // на уровень выше


или


#include "../../std_lib_facilities.h" // на два уровня выше


Либо другой вариант, который соответствует местным соглашениям. Вам виднее как оформить это правильно в вашем окружении. Я могу лишь предполагать.


В зависимости от того, где вы получили std_lib_facilities.h, как вы сохранили его, а также от вашего компилятора, вы можете получить предупреждение «newline missing at the end of file». По моему мнению это глупое предупреждение. Добавьте пустую строку в конце файла, чтобы компилятор заткнулся.


Я использую расширение .cpp для файлов с кодом и .h для заголовочных файлов. По этому поводу также существуют различающиеся соглашения. Довольно часто можно встретить расширение .cc для кода; в некоторых местах используют .cxx и .C. А некоторые месье (и их инструменты) предпочитают .hh или .H вместо .h. Расширение файлов это тоже соглашение, а не часть языка.


Из наших студентов 60% уже программировали, а 40% еще не видели ни строчки кода. В первые недели мы двигаемся быстро, чтобы выровнять студентов и побыстрее приступить к материалу, который будет новым для всех. Неизменно находятся студенты, которые раньше программировали и поначалу выпендриваются; это может быть испугать настоящих новичков в программировании. Вам нужно убедить обе группы:


  1. Что материал можно освоить без опыта программирования
  2. Рано или поздно, даже с опытом программирования, они столкнутся с тем, чего не было в школе. Как говорится, «добро пожаловать в университет».


Глава 2 Послесловие


  1. C++ это язык программирования для широкого спектра задач разработки ПО; Примеры можно посмотреть на странице.
  2. Текст, обрамленный двойными кавычками ", в C++ считается строковым литералом.
  3. Выражение \n это «специальный символ», обозначающий перенос на следующую строку.
  4. Имя cout обозначает стандартный поток вывода. Любой текст «отправленный в cout» будет отображен на экране.
  5. В исходном коде весь текст, написанный после символа //, считается комментарием. Комментарии игнорируются компилятором и пишутся для тех, кто будет читать и поддерживать код
  6. В начале программы обычно пишут комментарий, в котором разъясняют назначение программы. Этот тип комментариев напоминает нам (разработчикам) о том, какую идею мы должны формально, точно и полно передать компьютеру.
  7. «Директива #include» нужна компьютеру чтобы включить (сделать доступными) интсрументы (facilities) из файла.
  8. Файл std_lib_facilities.h важен потому что позволяет использовать инструменты стандартной библиотеки C++.
  9. В каждой программе на C++ должна быть точка входа — функция, названная main. С нее начинается выполнение программы.
  10. Часть программы на C++, которая описывает действие и не является директивой препроцессора, называется командой (statement).
  11. Компилятор C++ транслирует исходный код (который вы пишете) из понятной для человека формы в «машинный код», который исполняется компьютером.
  12. Компилятор просматривает ваш исходный код на предмет грамматической корректности. Каждое слово должно быть определено. В программе не должно быть других явных ошибок, которые можно выявить до запуска программмы. Компилятор будет компилировать программу только когда все «ошибки компиляции» будут устранены.
  13. Компилятор, наверное, ваш лучший друг во время программирования.
  14. Компоновщик (linker) это программа, которая связывает вместе в форме исполнимой программы скомпилированные части программы, зачастую разрабатываемые разными людьми.
  15. Объектные и исполняемые файлы не переносимы с системы на систему. Например, когда вы компилируете на машине с ОС Windows, у вас получается объектный файл для Windows, который не запустится на машине с ОС Linux.
  16. Если ошибку обнаруживает компилятор, она называется ошибкой компиляции (compile-time). Если компоновщик — ошибкой компоновщика (link-time). Ошибки, найденные после запуска, могут быть либо ошибками времени выполнения (run-time), либо логическими ошибками.
  17. Как правило, ошибки компиляции найти и исправить проще, чем ошибки компоновщика. А ошибки компоновщика проще найти и исправить, чем ошибки времени выполнения и логические ошибки.
  18. Инструменты «Интегрированной среды разработки» или IDE помогают вам писать, отлаживать, компилировать, компоновать и запускать ваш код.
  19. IDE обычно включает редактор с подсветкой синтаксиса. Эта функция помогает вам различать комментарии, ключевые слова и другие части кода.
  20. У вас может сложиться впечатление, что вы поняли все что прочитали и все что услышали от инструктора в классе, но повторение и практика необходимы чтобы развить навыки программирования.


Глава 3 Объекты, типы и значения


На этом этапе важно разъяснить, что в получении и сохранении значения нет ничего фундаментально сложного. Однако эта идея новая и неожиданная для непрограммистов, особенно, для непрограммистов с хорошими знаниями математики. Отлично работает аналогия: переменная это ящик, в которую можно положить значение. Кроме того, мы используем аналогию: тип переменной это форма ящика, которая определяет что мы можем положить в него.


Критически важно, чтобы студенты выполнили задания и несколько упражнений. Студенты, которые раньше программировали, склонны быть слишком заносчивыми и пропускать некоторые новые факты (по сравнению со школой). Мы намеренно используем конструкцию if до официального знакомства с ней в Главе 4: обратите внимание, что это просто новая запись того, что они знают с детского сада. Примерно так же укажите на то, что арифметические операции знакомы всем со средней школы. Инструменты языка программирования это просто непривычная запись идей, которые студенты уже знают. Регулярно указывать на это — важно. Стоит повторять это студентам каждый раз, когда вы разбираете очередной образцовый пример.


Действительно новое тут это присвоение, инициализация и типы.


Заметьте, что многим (особенно тем кто хорошо знает математику) идея последовательного выполнения команд (компьютером) будет неожиданной. Отведите один или два слайда и проговорите программу линию за линией «как компьютер», чтобы все получили общее представление. Это не займет много времени и позволит избежать проблем в будущем. Можете взять слайды 20–21 («присвоение и инкремент»), а также 27 («еще одно простое вычисление»), особенно если у вас риск закончить раньше времени. В Главе 4 будет повторение.


Зачем грузить студентов проблемами типобезопасности на этом этапе? Цель в том, чтобы начать формировать склад ума, учитывающий как технические ограничения, так и ограничения реального мира: наш язык и наши практики это просто способы выражения решения задачи на аппаратных средствах. Железо реально и может навязывать такие ограничения, от которых мы не сможем полностью абстрагироваться. Это курс программирования (разработки программного обеспечения), а не математики и не философии.


Глава 3 Послесловие


  1. Реальные программы как правило дают результат на основе некоторых исходных дан

    © Habrahabr.ru