Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
С другой стороны, мы не используем для иллюстрации своих идей красивые примеры с симпатичными животными. Наша цель — научить вас писать реальные программы, которые будут использоваться реальными людьми. По этой причине каждый пример, не относящийся к технической стороне языка программирования, взят из реальной жизни. Мы стараемся обращаться к читателям как профессионалы к будущим профессионалам.
0.2.1. Порядок изложения
Невозможно одновременно изучить все принципы, методы и свойства языка, необходимые для создания программ. Следовательно, необходимо выбрать подмножество принципов, методов и свойств, с которых следует начинать обучение. В целом любой учебник должен вести студентов через набор таких подмножеств. Мы понимаем свою ответственность за выбор этих тем. Поскольку невозможно охватить все темы, на каждом этапе обучения мы должны выбирать; тем не менее то, что останется за рамками нашего внимания, не менее важно, чем то, что будет включено в курс.
Для контраста, возможно, будет полезно привести список подходов, которые мы отвергли.
• “Сначала следует изучить язык С”. Этот подход к изучению языка С++ приводит к ненужной потере времени и приучает студентов к неправильному стилю программирования, вынуждая их решать задачи, имея в своем распоряжении ограниченный набор средств, конструкций и библиотек. Язык С++ предусматривает более строгую проверку типов, чем язык С, а стандартная библиотека лучше соответствует потребностям новичков и позволяет применять исключения для обработки ошибок.
• “Снизу-вверх”. Этот подход отвлекает от изучения хороших и эффективных стилей программирования. Вынуждая студентов решать проблемы, ограничиваясь совершенно недостаточными языковыми конструкциями и библиотеками, он приучает их к плохим и слишком затратным способам программирования.
• “Если вы что-то описываете, то должны делать это исчерпывающим образом”. Этот подход подразумевает изложение по принципу “снизу-вверх” (заставляя студентов все глубже и глубже погружаться в технические детали). В результате новички тонут в море технических подробностей, на изучение которых им потребуются годы. Если вы умеете программировать, то техническую информацию найдете в справочниках. Документация хороша сама по себе, но совершенно не подходит для первоначального изучения концепций.
• “Сверху-вниз”. Этот подход, предусматривающий переход от формулировки принципа к его техническим подробностям, отвлекает читателей от практических аспектов программирования и заставляет концентрироваться на высокоуровневых концепциях еще до того, как они поймут, зачем они нужны. Например, никто просто не в состоянии правильно оценить принципы разработки программного обеспечения, пока не поймет, как легко делать ошибки и как трудно их исправлять.
• “Сначала следует изучать абстракции”. Фокусируясь лишь на основных принципах и защищая студентов от ужасной реальности, этот подход может вызвать у них пренебрежение реальными ограничениями, связанными с практическими задачами, языками программирования, инструментами и аппаратным обеспечением. Довольно часто этот подход поддерживается искусственными “учебными языками”, которые в дальнейшем нигде не используются и (вольно или невольно) дезинформируют студентов о проблемах, связанных с аппаратным обеспечением и компьютерными системами.
• “Сначала следует изучить принципы разработки программного обеспечения”. Этот подход и подход “сначала следует изучить абстракции” порождают те же проблемы, что и подход “сверху-вниз”: без конкретных примеров и практического опыта, вы просто не сможете оценить важность абстракций и правильного выбора методов разработки программного
• “С первого дня следует изучать объектно-ориентированное программирование”. объектно-ориентированное программирование — один из лучших методов организации программ, но это не единственный эффективный способ программирования. В частности, мы считаем, что сначала необходимо изучить типы данных и алгоритмы и лишь потом переходить к разработке классов и их иерархий. Мы с первого дня используем пользовательские типы (то, что некоторые люди называют объектами), но не углубляемся в устройство класса до главы 6 и не демонстрируем иерархию классов до главы 12.
• “Просто верьте в магию”. Этот подход основан на демонстрации мощных инструментов и методов без углубления в технические подробности. Он заставляет студентов угадывать — как правило, неправильно, — что же происходит в программе, с какими затратами это связано и где это можно применить. В результате студент выбирает лишь знакомые ему шаблоны, что мешает дальнейшему обучению.
Естественно, мы вовсе не имеем в виду, что все эти подходы совершенно бесполезны. Фактически мы даже используем некоторые из них при изложении некоторых тем. Однако в целом мы отвергаем их как общий способ обучения программированию, полезному для реального мира, и предлагаем альтернативу: конкретное и глубокое обучение с упором на концепции и методы.
0.2.2. Программирование и языки программирования
Методы программирования и проектирования следует изучать на основе определенного языка программирования. Проектирование, программирование и отладка не относятся к навыкам, которыми можно овладеть абстрактно. Вы должны писать программы на каком-то языке и приобретать практический опыт. Это значит, что вы должны изучить основы какого-то языка программирования. Мы говорим “основы”, так как времена, когда все основные промышленные языки программирования можно было изучить за несколько недель, ушли в прошлое. Для обучения мы выбрали подмножество языка С++, которое лучше всего подходит для разработки хороших программ. Кроме того, мы описываем свойства языка С++, которые невозможно не упомянуть, поскольку они либо необходимы для логической полноты, либо широко используются в сообществе программистов.
0.2.3. Переносимость