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