Введение
Приходилось ли вам когда-нибудь:
- тратить кучу времени на то, чтобы закодировать неверный алгоритм?
- использовать слишком сложную структуру данных?
- при тестировании программы пропустить очевидную проблему?
- тратить день на то, чтобы обнаружить ошибку, которую можно было бы найти за пять минут?
- сталкиваться с тем, что программа должна работать в три раза быстрее и использовать меньше памяти?
- затрачивать титанические усилия на то, чтобы перевести программу с рабочей станции на PC или наоборот?
- пытаться внести изменения в чужую программу?
- переписывать программу целиком, потому что разобраться в ней не удалось?
Ну и как – понравилось?
С программистами такое происходит все время. Однако справиться с подобными проблемами часто гораздо труднее, чем хотелось бы, поскольку такие темы, как тестирование, отладка, переносимость, производительность, альтернативы проектирования и стиль, темы, относящиеся к практике программирования, как правило, оказываются вне сферы внимания информатики и учебных курсов по программированию. Большинство программистов изучают их сами по себе, – в основном, на собственном опыте, а некоторые не изучают вообще.
В мире разнообразных интерфейсов, постоянно меняющихся языков, систем и утилит, под постоянным давлением обстоятельств мы зачастую теряем из вида главные принципы, которые должны быть основанием любой хорошей программы, – простоту, четкость и универсальность.
Не уделяется должного внимания инструментам и нотациям, способам записи, которые механизируют некоторые аспекты создания программ, то есть привлекают к процессу программирования сам компьютер.
Эта книга построена как раз на основных принципах, применимых к информационным технологиям на любом уровне. К таким взаимосвязанным принципам относятся: простота, благодаря которой программы остаются короткими и управляемыми, четкость и ясность, которые облегчают понимание программ и людям, и машинам, обобщенность, означающая, что программа способна корректно работать в широком диапазоне ситуаций и нормально адаптироваться к новым ситуациям, и автоматизация, которая позволяет передавать машине наиболее утомительные и скучные части нашей работы. Рассматривая программирование на различных языках, от алгоритмов и структур данных, через проектирование, отладку, тестирование, до улучшения производительности, мы иллюстрируем универсальные концепции, которые не зависят ни от языка, ни от операционной системы, ни от конкретного задания.
Книга родилась из нашего многолетнего опыта в написании и поддержке разнообразнейших программ, в преподавании программирования и в общении с большим количеством программистов. Мы хотим поделиться знаниями, приобретенными благодаря этому опыту, чтобы помочь программистам всех уровней работать более эффективно и профессионально.
Наша книга предназначена для читателей разных категорий. Если вы школьник или студент, вам только что прочитали курс программирования и вы захотели узнать об этом предмете побольше, эта книга расширит ваше образование моментами, которые недостаточно подробно освещаются в школе. Если разработка программ составляет часть вашей работы, но не исчерпывает ее, а только дополняет другие формы, то наша книга наверняка поможет вам делать это более эффективно. Если вы профессиональный программист и чувствуете, что в свое время недостаточно изучили перечисленные выше вопросы (или же просто хотите освежить их в памяти), или если вы руководите группой программистов и хотите ставить своим подчиненным правильные задачи, материал этой книги вам обязательно пригодится.
Мы надеемся, что наши советы помогут вам писать более качественные программы. Единственное, что вам необходимо, – это иметь некоторый опыт в программировании, желательно на С, C++ или Java. Естественно, чем больше ваш опыт, тем проще вам будет понять и применить наши советы, ничто не сможет сделать эксперта из новичка за 21 день.
Для работающих с системами Linux и Unix многие примеры будут более знакомы, чем для тех, кто использовал только системы Windows и Macintosh, однако все без исключения найдут в этой книге рекомендации, которые облегчат им жизнь.
Каждая из девяти глав, составляющих книгу, посвящена конкретному глобальному аспекту практики программирования.
В главе 1 обсуждается стиль программирования. Хороший стиль настолько необходим для написания хороших программ, что мы решили начать разговор именно с него. Хорошо написанные программы лучше, чем плохо написанные, – в них меньше ошибок, их легче отлаживать и модифицировать, – поэтому задумываться о стиле надо с самого начала. В этой главе затрагивается и такой важный аспект хорошего программирования, как применение идиом, соответствующих используемому языку программирования.
Алгоритмы и структуры данных – предмет обсуждения главы 2 – занимает центральное место в учебных планах всех курсов программирования. Поскольку большинство читателей в той или иной степени уже знакомо с этим материалом, мы даем лишь краткий обзор ряда алгоритмов и структур данных, которые встречаются во многих программах. Более сложные алгоритмы и структуры данных, как правило, являются производными от этих базовых вариантов, так что главное – разобраться с основами.