Rambler's Top100 Service калинин.ru / программирование / c и c++ /  << 14.08.00 >>

Коллекции исходных текстов

В последние несколько дней я просматривал странички в РуНете "братственной" направленности, т.е. посвященные программированию на C++. Я обнаружил чрезвычайно забавную вещь --- странички, содержание которых выходит за пределы публикации текста "Язык программирования C++" Страуструпа (1-е издание) и комплекта документации к Turbo C++ 1.0, достаточно редки. Хотя, вроде бы, количество профессиональных программистов на C++ велико. Но самое страшное, что меня раздражает окончательно, так это наборы исходных текстов "чего-либо". Я совершенно не понимаю целей, которые ставят перед собою авторы подобных страничек --- "у нас появился исходник программы, создающей эффект плазмы; прислано Васей". Мне, быть может, кто-то не поверит, но я видел страничку, на которой в разделе "C++ Cool Tips" были даны советы по тому, как не дать Windows 95 отреагировать на нажатие пользователем клавиш Alt-Tab или УПР-ДОП-УДЛ... В смысле, я не против публикации исходных текстов или советов, как лучше написать словосочетание #include <windows.h>, но почему при этом заявляется, что страничка посвящена программированию на C++?

Хочется сразу же дать некоторые определения. Существует программирование для какой-то операционной системы. Программист, который пишет "под Unix", "под Windows", "под DOS", это такой человек, который знает (или догадывается) зачем нужен какой-либо системный вызов, умеет написать драйвер устройства и пытался дизассемблировать код ядра (это не относится к Unix'у --- программист под Unix обычно пытается внести свои изменения в исходный текст ядра и посмотреть что получится).

Существует программирование на каком-то языке программирования. Программист, претендующий на то, что он является программистом "на Бейсике", "на Паскале", "на C" или "на C++" может вообще ничего не знать о существовании конкретных операционных систем и архитектур (я, конечно же, сильно утрирую...), но обязан при этом знать тонкости своего языка программирования, знать о том, какие конструкции языка для чего эффективнее и т.д. и т.п.

Понятно, что "программирование на языке" и "программирование под архитектуру" могут вполне пересекаться. Программист на C под Unix, например. Тем не менее, в особенности среди новичков, часто встречается подмена этих понятий. Стандартное письмо в конференцию: "я только начал изучать C++, подскажите пожалуйста, как создать окно произвольной формы?". В общем, нельзя, наверное, изучать сразу же операционную систему и язык программирования. Вопрос же "про окно" правомерен, наверное, только для Java, где работа с окнами находится в стандартной библиотеке языка. Но у C++ своя специфика, потому что даже задав вопрос "как напечатать на экране строку 'Hello, world!'?" можно напороться на раздраженное "покажи где у C++ экран".

Тем не менее, возвращаюсь к исходным текстам. Начинающие программисты обычно любят устраивать у себя разнообразные коллекции исходных текстов. Т.е., с десяток эмуляторов терминалов, пятнадцать библиотек пользовательского интерфейса, полсотни DirectX и OpenGL программ "на C". Кстати сказать, программирование с использованием OpenGL тоже можно отнести к отдельному классу, который ортогонален классам "операционная система" и "язык программирования". Почему-то люди упорно считают, что набрав большое количество различных программ малой, средней и большой тяжести, они решат себе много проблем, связанных с программированием. Это не так --- я совершенно не могу понять, чем на стадии обучения программированию может помочь исходник Quake.

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

Кроме того, при чтении "исходников", очень часто "программирование на языке" незаметно заменяется "программированием под ОС". Ведь всегда хочется сделать что-то красивое, чем можно удивить родителей или знакомых? А еще хочется сделать так, что бы "как в Explorer" --- не могу забыть тот бум на компоненты flat buttons для Delphi/C++ Builder, когда только появился Internet Explorer 3.0. Это было что-то страшное, таких компонент появилось просто дикое количество, а сколько программ сразу же появилось с их присутствием в интерфейсе...

Изменять текст существующей программы тоже очень сложно. Дополнить ее какой-то новой возможностью, которая не ставилась в расчет первоначально, сложно вдвойне. Читать текст, который подвергался таким "изменениям" уже не просто сложно --- практически невозможно. Именно для этого люди придумали модульное программирование --- для того, что бы сузить, как только это возможно, степень зависимости между собой частей программы, которые пишутся различными программистами, или могут потребоваться в дальнейшем.

Чтение исходных текстов полезно, но уже потом, когда проблем с языком не будет. А до этого момента можно только перенять чужие ошибки.

Резюме

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

PS

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

Сам я, кстати, считаю, что лучше способа изучить C++, чем попытаться одолеть третье издание "Языка программирования C++" от Бьерна Страуструпа, нет. Эта книга, которая читается несколько раз, и при каждом чтении в ней можно найти что-то новое, на что не было обращено внимание раньше. Естественно, что при чтении книги надо обязательно пробовать что-то написать.


Версия для печати


  Ссылки по теме:
Бъерн Страуструп
   Язык программирования C++, 3 издание.
  Рядом в разделе:
Функция gets() (15.08.00)
   Функция gets(), входящая в состав стандартной библиотеки C, имеет следующий прототип: char* gets(char* s); Это определение содержится в . Функция предназначена...   >>>>
Виртуальный конструктор (12.08.00)
   Перелистывая архив сообщений из конференции SU.C_CPP, натолкнулся на любопытное письмо, которое решил поместить к себе на страничку. Автор --- опять Alexander...   >>>>
  Рядом по дате:
Функция gets() (15.08.00)
   Функция gets(), входящая в состав стандартной библиотеки C, имеет следующий прототип: char* gets(char* s); Это определение содержится в . Функция предназначена...   >>>>
Прерванная жизнь / Girl, interrupted, 1999 (13.08.00)
   Мне надоело приводить описания с обложек компакт-дисков... все-таки люди которые их пишут это очень странные люди. Впрочем, речь не о них....   >>>>
  Содержание:
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
   C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Просто так
Студенческое
Туризм
  Байки
Фотографии
Комментарии
   Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Благодарности
Форум
Хронология
 
  В этом разделе:
Простой, но полезный аллокатор памяти (18.02.03)
   Эта заметка --- продолжение "Postfix изнутри" в том смысле, что в качестве примера опять берется postfix. Но если в прошлый раз...   >>>>
C или C++? (09.07.01)
   Существуют два диаметрально противоположенных, но одинаково распространенных мнения, которые можно выразить как "C++ это C с классами" и "C++ и C...   >>>>
Религия и goto (14.04.01)
   Начнем несколько издалека. В программировании существует тенденция к алгоритмизации самого процесса программирования. То есть, выведение некоторых универсальных правил, использование которых в...   >>>>
ploticus (16.10.00)
   Есть такая программа, предназначенная для создания графиков различных видов из командной строки, называется ploticus. Программа сама по себе достаточно удобная ---...   >>>>
Шаманство, или ошибки работы с памятью (25.09.00)
   Когда программа становится внушительной по своему содержанию (то есть, не по количеству строчек, а по непонятности внутренних связей), то ее поведение...   >>>>
Библиотека консорциума W3, libwww (20.09.00)
   Популярный нынче термин "веб-программирование" обычно подразумевает под собой программирование, в лучшем случае, на perl, в худшем --- на PHP, в совсем...   >>>>
Инварианты внутри программы (18.09.00)
   Вы когда-нибудь задумывались, над тем, как вы пишите программы? Если нет, то, я думаю, сегодняшняя заметка будет вам полезна. Итак, как...   >>>>
Содержание раздела полностью...
   Примерно в тоже время
Функция gets() (15.08.00)
   Функция gets(), входящая в состав стандартной библиотеки C, имеет следующий прототип: char* gets(char* s); Это определение содержится в . Функция предназначена...   >>>>
Прерванная жизнь / Girl, interrupted, 1999 (13.08.00)
   Мне надоело приводить описания с обложек компакт-дисков... все-таки люди которые их пишут это очень странные люди. Впрочем, речь не о них....   >>>>
Хронология полностью...
   Содержание
Заглавная страница
Мой блог
Мое резюме
Дайджест
Программирование
  C&C++
Сети
Unix
Алгоритмы
Оптимизация
Соревнования
Отвлеченно
XML
TeX
Туризм
  Байки
Фотографии
Комментарии
  Книги
Web-ресурсы
Фильмы
Интернет
Программное обеспечение
Жизнь
Студенческое
Просто так
Благодарности
Форум
Хронология
© 2000-2008, Andrey L. Kalinin
mailto:andrey@kalinin.ru
Rambler's Top100