вторник, 17 марта 2009 г.

Что почитать UNIX C/C++ программисту

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

Хочу отметить, что книги - это не единственный источник информации. Если вы регулярно читаете различные статьи в Интернете, то у вас зачастую есть шанс найти в них что-то такое, о чем не напишут ни в одной книге и наоборот. Поэтому я бы советовал вам подписаться на RSS каких-нибудь новостных ресурсов, на которых время от времени пробегают интересные статьи. Например:
Также я бы посоветовал не лениться и читать все комментарии к заинтересовавшим вас статьям - нередки случаи, когда комментарии оказывались ценнее самой статьи. :)

Помимо книг я попытался вспомнить хотя бы несколько статей, которые мне в свое время показались наиболее интересными, и привел ссылки на них.

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


Книги

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

Х.М. Дейтел, П.Дж. Дейтел - Как программировать на C++.
Так получилось, что "Язык программирования Си" - это, если не ошибаюсь, единственная книга по С (не C++), которую я прочитал. После нее я продолжил свое обучение с "Как программировать на C++", в которой узнал много нового о C, о чем не говорилось в "Языке программирования Си" и основные возможности C++. На мой взгляд, очень неплохая книга для начинающих. Авторы постепенно вводят читателя в мир C/C++, не забывая при этом останавливаться на вопросах совместимости, быстродействия и хорошего стиля программирования, что является несомненным плюсом данной книги.

Андрей Робачевский - Операционная система UNIX.
Читал довольно давно, так что уже и не помню насколько это стоящая книга, но в целом впечатления от нее остались хорошие.

Эрик С. Реймонд - Искусство программирования для UNIX.
Если не ошибаюсь, данная книга не содержит ни одной строчки кода, но это не делает ее менее интересной. Автор анализирует философию UNIX и основные принципы написания программ. Читается на одном дыхании. Очень советую.

С. Макконнелл - Совершенный код.
Совершенный код мне не понравился. Обычно, если я покупаю книгу, то читаю ее от корки до корки. Эта же книга, пожалуй, единственная, которую я не прочитал и до середины. Такое впечатление, что автор стремился сделать ее как можно толще и поэтому мусолит любую, даже самую очевидную проблему, которая может встретиться программисту - просто скучно читать. На мой взгляд, если вы прочитаете пару хороших книг по C/C++ и "Искусство программирования для UNIX", то не найдете в ней ничего нового.

Ричард Стивенс, Стивен Раго - UNIX. Профессиональное программирование.
Ричард Стивенс - UNIX. Разработка сетевых приложений.
Отличные книги. Читать обязательно. После их прочтения действительно начинаешь понимать, как "оно" работает.

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

Крис Касперски - Техника оптимизации программ. Эффективное использование памяти.
К моему удивлению, я ни разу не слышал упоминания данной книги на форумах (может быть, не туда ходил) и считаю, что ее незаслуженно обошли стороной. Ее нам порекомендовал преподаватель в институте, за что ему огромное спасибо. Прочитав данную книгу, вы поймете, что, оказывается, для написания хороших программ одного только знания языка порой оказывается недостаточно - так же важно иметь хотя бы базовое представление о том, как устроен компьютер. Пусть вы, скорее всего, и не будете применять большинство методов, описанных в данной книге в силу их слишком агрессивной оптимизации под конкретную архитектуру, но, прочитав ее, вы впоследствии при разработке программ будете учитывать хотя бы базовые принципы, которые могут значительно повысить скорость работы программы, при этом не отняв у вас времени на оптимизацию (принцип использования "как можно более локальных" данных и т. п.). Да, и пусть слова "Эффективное использование памяти" вас не смущают - речь в данной книге пойдет отнюдь не о ее экономии, а именно о эффективном ее использовании. В качестве затравки могу порекомендовать статью "Разработка на PC и производительность — Memory Latency" (см. ссылку в разделе статьи).

Конечно, это далеко не весь список книг, которые я прочитал. :) Но когда я начал вспоминать, какие из них посоветовать для изучения программирования на C/C++ по UNIX, то мне почему-то вспомнились именно они.


Статьи

Программирование в Linux с нуля
Программирование для Unix/Linux
Using GNU C __attribute__
Reading C type declarations
Ключевое слово volatile
Функциональное программирование для всех
Основы написания переносимого кода (обязательно почитайте комментарии к статье)
20 ловушек переноса Си++ - кода на 64-битную платформу
Data alignment: Straighten up and fly right
Разработка на PC и производительность — Memory Latency


Что дальше?

Если говорить о C++, то, судя по отзывам, дальше надо браться за Скотта Майерса, Герба Саттера и Андрея Александреску. Вообщем, думаю, скучать не придется. :)


Пожелания

Если вам есть что добавить в данный список (книг, статей, сайтов), или у вас есть какие-то советы с высоты вашего опыта - буду вам очень рад в комментариях.

7 комментариев:

pluton комментирует...

ещё есть хорошая книга: Теренс Чан - Системное программирование на C++ для Unix

amadev комментирует...

Спасибо за отличную подборку. Интересно ваше мнение в каком "режиме" лучше читать книги и осваивать язык?

Dmitry Konishchev комментирует...

> ещё есть хорошая книга: Теренс Чан - Системное программирование на C++ для Unix
pluton, спасибо, почитаю.

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

Если говорить совсем про начало изучения... До того, как я начал изучать C, я пару лет увлекался JavaScript/PHP/MySQL/AJAX, etc (LAMP вообщем :) ). Помню, что при чтении "Языка программирования Си" мне больше всего не давал покоя вопрос: "Вот авторы написали целую книгу, пусть и небольшую, но в итоге все, чему она научила - это выводить строки на экран и писать в файлы. А как мне на нем нормальную программу то написать?". Как-то необычно было после php, у которого все в одном флаконе, и где в книжках, которые я по нему читал, обсуждался несравнимо больший круг задач (работа с файлами и каталогами, датой и временем, регулярные выражения, библиотека для работы с FTP, формирование изображений (GD), XML и т. д. и т. п.) видеть такую аскетичность языка. Поначалу было просто непонятно, как на C можно написать что-то серьезное. Поэтому если у вас будет такая же проблема, то не переживайте: после прочтения "UNIX. Профессиональное программирование" вы сможете писать полноценные консольные приложения. Если же вам нужно создавать GUI приложения, то помимо этого также придется почитать что-нибудь по библиотекам GTK, Qt или другим.

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

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

Поэтому в итоге я бы, наверное, порекомендовал следующую стратегию: читаете книгу, пока не почувствуете, что получили достаточное количество информации для того, чтобы написать что-то новое, и только тогда уже пишете это "что-то". Хотя, опять-таки не следует придерживаться этого правила буквально. Постоянно писать какие-то простенькие программы, на мой взгляд, тоже не лучший выход - быстро надоедает. Лучше подождать и потом написать что-то более стоящее. К примеру, "UNIX. Разработка сетевых приложений" я начал читать тогда, когда мне на работе понадобилось написать сетевое приложение. В процессе чтения книги я не написал ни одной программы - только использовал полученные знания (малую их часть) на работе и испытывал удовольствие от получения новых знаний при чтении книги дома. В конце концов, подо все проблемы, обсуждающиеся в книге, программы не напишешь и здесь, как и в институте, перед вами стоит задача не запомнить все от начала до конца и носить всю жизнь эти знания в голове, а понять смысл, подводные камни и знать, где искать решение, когда перед вами встанет задача из четко определенной области (сетевое программирование, базы данных, алгоритмы и т. п.).

Анонимный комментирует...

я бы удалил developerWorks, стОящих статей там очень мало

Анонимный комментирует...

Товарищи программисты, никто не подскажет в чём разница между книгами Страуструпа - "Язык программирования C++. Специальное издание" и "Язык программирования C++"?
Спасибо.

Dmitry Konishchev комментирует...

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

Unknown комментирует...

хм... ответ к комментарию к вопросу о режиме ИМХО был полезней чем даже перечень книг :) Спасибо