четвер, 19 вересня 2013 р.

Книги по C++ -- деякі конкретні рекомендації

Класика.
В попередній частині ми говорили про те, як вибирати книги по С++. Тут пропоную конкретний список рекомендацій. Він ні в якому випадку не є повним чи вичерпним. Його призначення --- дати (самі знаєте, кому ;) рекомендації, які книги використовувати для навчання, із чого вибирати.

Книги для початківців


Джесс Либерти: Освой самостоятельно C++ за 21 день

"Teach Yourself C++ in 21 days" by Jesse Liberty


Дуже хороша книга для початківців. Розповідає про С++ детально, ґрунтовно, без вагомих ляпів. Крім викладу власне С++, розповідає про важливі загальні питання --- алгоритми, об'єктно-орієнтоване проектування, тощо.

Розглянуто всі основні питання, хоча, як на мене -- стандартну бібліотеку занадто "по діагоналі". В кінці кожної частини -- запитання та задачі.

Назва, звичайно, не відповідає дійсності --- вивчити С++ за 21 день неможливо, але будемо поблажливі до комерційної сторони питання. Я б ту назву розшифрував як "С++ за 21 повну добу протягом року". :-) Крім дуже поверхневого розгляду стандартної бібліотеки, особливо STL, варто згадати її певну роздутість -- багато тексту. Хоча, можливо це мені тільки здається.

Важливе зауваження. Книжку можна скачати. Однак, на жаль, в Інтернеті є лише її третє видання, яке вийшло зразу після прийняття стандарту. Автор чесно зізнається, що правильно тепер робити так і так, однак, так як на моменти її виходу, компілятори ще не підтримували стандарт, автор багато що робить за достандартними правилами. Базово читати можна, однак, якщо куплятимете --- беріть мінімум п'яте (останнє, перекладене на російську, на момент написання), видання!

Скачати можна, наприклад, тут. Купити тут (Львів, сам в тому магазині не був, однак пара студентів вже ходила --- відгукувалися дуже позитивно), або тут (Інтернет-магазин, один час багато у них купляв).


Стивен Прата: Язык программирования C++. Лекции и упражнения

Steven Prata: C++ Primer Plus

Теж абсолютно шикарна книга. Все позитивне, сказане вище, стосується і її. Як на мене, дещо лаконічніший розгляд, трішки кращі завдання, ніж у Ліберті. Більше уваги приділено STL та іншим компонентам стандартної бібліотеки.

Що особливо приємно, останнє доступне російською мовою, шосте, видання вже описує C++11!


Як не дивно, його вже можна скачати, наприклад тут та купити ось тут або тут.


Інші

Існує ще декілька достойних підручників по С++. Детально перераховувати їх не буду, згадаю лише ті, про які однозначно позитивно відгукуються спеціалісти (сам я з ними стикався мало):
  • Брюс Екель, "Философия С++", том 1 і Брюс Екель, Чак Эллисон, "Философия С++, практическое программирование", том 2. ( Bruce Eckel, "Thinking in C++: Introduction to Standard C++, Volume One (2nd Edition) " і Bruce Eckel and Chuck Allison, "Thinking in C++, Volume 2: Practical Programming" ). Не зважаючи на те, що перша книга вийшла в 2000, зразу після прийняття, вона вже цілком сучасна. Легко знаходиться в Інтернеті, хоча купити, здається, важко.
  • Бьерн Страуструп "Программирование. Принципы и практика использования C++". Підручник від творця. Зі всіма відповідними плюсами та мінусами. Що тут ще можна сказати? :-) Скачати можна тут, купити, традиційно, тут і тут.
  • Декілька книг за авторством Ліппмана, типу "Стенли Липпман, Жози Лажойе: Язык программирования C++. Вводный курс" ("C++ Primer (5th Edition)" by Stanley B. Lippman, Josée Lajoie and Barbara E. Moo). Скачати можна тут, купити, окрім згаданого вище Амазона, тут.
  • Эндрю Кениг, Барбара Му, "Эффективное программирование на С++" (Andrew Koenig,  Barbara E. Moo "Accelerated C++: Practical Programming by Example"). Скачати можна тут.
  • Дейтел Х., Дейтел П: "Как программировать на C++" (H. M. Deitel & P. J. Deitel, "C++ How to Program", 3rd ed. 2001). Кажуть, книга має трохи недоліків, хоча, на загал --- користуватися можна. Скачати можна тут, купити тут і тут.
Очевидно, існують й інші хороші підручники. Однак, будьте уважні! --- див. попередній пост, на жаль, поганих підручників по С++ на багато більше, ніж хороших...

Зокрема, вартує згадати такого автора, як Шилдт. Він явно має письменницький талант. Книжки його легко і приємно читаються, зрозумілі і все таке. Лише помилок і дурниць у них написано багато. Не беріть їх!

"Schildt's books have a reputation for being written in a clear style, at least at first glance.[9] Their technical accuracy has been challenged by reviewers, including ISO C committee members Peter Seebach[10] and Clive Feather,[11] C FAQ author Steve Summit,[12] and numerous C Vu reviewers from the ACCU.[13]"

Декілька додаткових порад такого плану можна прочитати тут: C Books and C++ Books You Don't Want! Ще один подібний список тут: "List of best C++ Books".

Рекомендації для подальшого вивчення

Перш ніж перейти до конкретних книг, згадаю, що для поглибленого вивчення С++ існує дуже хороша серія, "C++ In-Depth Series". Варто ознайомитися практично із кожною книгою цієї серії. Частину із них розглянуто нижче.

Надалі, за незначним винятком, посилань для скачування чи покупки не наводжу --- вони легко знаходяться, хоча б в джерелах, згаданих вище.

За певної специфіки, книжки зручніше перераховувати по авторах --- у кожного із них свій стиль, своя "спеціалізація", однак професіоналу в C++ слід ознайомитися із всіма цими книгами!

Б'ярн Страуструп 

Bjarne Stroustrup

Творець С++. Без нього нічого б не було. ;-)

Сайт автора: http://www.stroustrup.com/. Зокрема, кілька цікавих інтерв'ю, статей, посилань, списків помилок в книгах. Варто окремо відзначити FAQ: "Bjarne Stroustrup's FAQ", "Bjarne Stroustrup's C++ Style and Technique FAQ", і, особливо, "C++11 - the new ISO C++ standard". Авторську вимову прізвища можна послухати тут.

"Язык программирования C++. Специальное издание"

The C++ Programming Language: Special Edition  (2000)


Основна книга по C++98/2003. З певним застереженням можна сказати --- C++ це саме те, що описано в цій книзі. Стандарт лише кодифікує та конкретизує.

Must have!

Вартує уваги і наступна його робота:

"The Design and Evolution of C++", 1994, 

"Дизайн и эволюция C++"

 Розповідь про те, чому C++ є таким, яким він є.


"The C++ Programming Language", 4th Edition


Нещодавно вийшло чергове видання фундаментальної "The C++ Programming Language", 4th Edition. Поки що на російську чи українську не перекладено (точніше, не видано в перекладі, скоро очікується). Купити можна на Амазоні, скачати теж вже можна! Чим став C++ після виходу нового стандарту, С++11. Кажуть, в книзі відносно багато опечаток. Зате нагода трішки заробити, якщо автор ще не припинив свою практику виплати за знайдені помилки. :-)


Андрій Александреску

Andrei Alexandrescu

Наступна книга, яку згадаю, першим автором має Саттера, про якого --- пізніше, Александреску лише другий. Але вона наступна в порядку занурення. Автор -- програміст із Румунії, крутий спеціаліст по проектуванню програмного забезпечення, шаблонах і тими збоченнями, які за допомогою шаблонів можна робити. Його сайт тут, зокрема цікавим є список публікацій.

Саттер Г., Александреску А., "Стандарты программирования на С++"

Herb Sutter, Andrei Alexandrescu, "C++ Coding Standards: 101 Rules, Guidelines, and Best Practices", 2004


Як і обіцяно, більше сотні рекомендацій по розробці програм на С++, із детальним поясненням, чому треба робити саме так і коли можна робити по іншому:
  • Основні принципи, наприклад, поради 8 та 9: "Не оптимізуйте/песимізуйте передчасно",
  • Стиль кодування, порада 14, "Краще помилка компіляції ніж помилка виконання",
  • Проектування класів, успадкування і т.д., наприклад порада 44 "Надавайте перевагу функціям, які є не членами і не друзями",
  • Робота із шаблонами, наприклад порада 64 "Розумно комбінуйте статичний та динамічний поліморфізм"
  • Використання STL, зокрема, про те, що краще надавати перевагу vector чи string, якщо серйозні причини не змушують до іншого (поради 76 і 77).
Книга, яка повинна бути  на столі у кожного програміста на C++.

Є в нього ще одна важлива книга:

Александреску А. "Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования"

Andrei Alexandrescu "Modern C++ Design: Generic Programming and Design Patterns Applied", 2008


Однак, вона для гуру. Для справжніх, в сенсі. :-) Хтось жартував, що якщо ви зрозуміли цю книгу ---  пора в психушку здаватися...

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

За мотивами бібліотеки також було написано бібліотеку Loki (ех, влучна назва!).

Скот Мейерс (іноді -- Майерс)

Scott Meyers

Ще одна видатна людина в світі С++. Написав багато книг. На жаль, із ними трішки плутанини, особливо з їх перекладами. Але спробуємо розібратися. 

Сайт автора: http://www.aristeia.com/.

Список основних публікацій англійською наступний:
  • 1992. Effective C++: 50 Specific Ways to Improve Your Programs and Designs.
  • 1996. More Effective C++: 35 New Ways to Improve Your Programs and Designs.
  • 1998. Effective C++, Second Edition: 50 Specific Ways to Improve Your Programs and Designs.
  • 2001. Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library.
  • 2005. Effective C++, Third Edition: 55 Specific Ways to Improve Your Programs and Designs.
  • 2010. Overview of The New C++ (C++11). Annotated training materials published by Artima Press. 
  • 2010. Effective C++ in an Embedded Environment. Annotated training materials published by Artima Press.

Майерс С. "Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов", 2006  (СПб: Питер)

"Effective C++, Second Edition: 50 Specific Ways to Improve Your Programs and Designs", 1998


Судячи по всьому,  російськомовне видання 2006 року є перекладом другого англомовного видання, від 1998. Однак, книга абсолютно не є застарілою!

В цій книзі не зачіпається ні тема шаблонів, ні стандартна бібліотека. Але керування пам'яттю "C++-way", робота із не-шаблонними об'єктами --- проектування, очікування, перевантаження операторів, ООП, і т.д. і т.п. розглянуто дуже детально.


Майерс С. "Эффективное использование С++. 35 новых способов улучшить стиль программирования", 2006 (СПб: Питер)

More "Effective C++: 35 New Ways to Improve Your Programs and Designs", 1996

Ще старіша, але все ще актуальна! Новою вона називалася в порівнянні із першим виданням "50-ти порад". Додатково поглиблює теми, розглянуті в попередній книзі. Нюанси перевантаження операторів, виключення, міркування ефективності, і т.д.

Останнім доступним виданням, яке продовжує традицію згаданих двох книг є:

Скотт Мэйерс "Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ", 2006 (Москва: ДМК-Пресс)

Effective C++, Third Edition: 55 Specific Ways to Improve Your Programs and Designs, 2005


Здається, краще купляти зразу її, а не дві попередні.

Вищезгадані книги стосуються "основ" С++ --- того, що в С++ давно, майже з самого початку. Класи, віртуальні функції, перевантаження операторів, тощо. Наступна його книга стосується STL --- одного із основних елементів стандартної бібліотеки, напевне найбільшого поповнення до C++ з часів його появи:

Майерс С. "Эффективное использование STL", 2003

"Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library", 2001


В припущенні, що ви вже маєте уявлення, що таке STL, вмієте засипати жменю цілих чисел у вектор, а потім їх посортувати, ця книга допоможе вам навчитися використовувати STL повноцінно, в повну силу. 

Контейнери, ітератори, алгоритми, типові ідіоми, типові формулювання. Незамінна книга для освоєння STL.

Presentation Materials: Overview of the New C++ (C++11/14)

Презентації із його лекцій про новий стандарт. Доступна для покупки електронна версія. З певним зусиллям знаходяться в Інтернеті. Майже необхідна річ для повноцінного освоєння нового стандарту.

auto, decltype, Range-Based loops, nullptr, нові enum, підтримка Unicode, користувацькі літерали, списки ініціалізації, лямбда-функції, шаблони із змінною кількістю параметрів, шаблонні typedef, move-конструктори, нові контейнери та алгоритми, підтримка багатопоточності і т.д. і т.п.


Presentation Materials: Effective C++ in an Embedded Environment


Матеріали лекцій про те, як ефективно програмувати мікроконтролери, використовуючи С++, маючи всі її переваги, але не отримуючи її мінусів. Купити електронну версію можна тут, за певних зусиль знаходиться в Інтернеті.
Принципи реалізації C++ (адже на мікроконтролерах багато яку Runtime-підтримку доведеться писати самому), правила того, що може бути в ROM, що ні, керування пам'яттю, зворотні виклики (callbacks), обробка переривань, тощо. Все викладено загально, без прив'язки до конкретних контролерів. Надзвичайно цінний матеріал.

Герб Саттер

Herb Sutter

Автор багатьох важливих статей та книг,  "Повелитель" C++ в Microsoft. Його книги дещо складніші, ніж більшість згаданих вище, розглядають більш високорівневі та серйозні проблеми. Автор серії задач по C++, Guru of the Week (GotW), на якій і базуються його книги

Сайт: http://www.gotw.ca/.
Задачі серії GotW, із розв'язками: http://www.gotw.ca/gotw/.

Зараз в своєму блозі викладає чергову серію GotW-задачок, із поправкою на С++11/14: http://herbsutter.com/category/c/gotw/. Основна частина вже викладеного присвячена використанню auto та новому підходу до ініціалізації, але розглянуто й інші теми.

Саттер Г. "Решение сложных задач на С++"

"Exceptional C++"

Збірник парадоксальних, складних, але при тому, для більшості програмістів --- дуже знайомих задач. Деталі функціонування елементів C++ (включаючи стандартну бібліотеку), основні ідіоми, способи виконувати типові задачі, способи обійти типові граблі, або принаймні підготуватися до наступання на них.

Саттер Г. "Новые сложные задачи на С++"

"More Exceptional C++"



Продовження попередньої книги. Складно, чесно кажучи, дати якесь резюме, принаймні, більш конкретне, ніж те ж саме, що написано й про "Решение сложных задач на С++". Найкраще --- просто беріть книгу та читайте!


Стівен Дьюхерст

Stephen C. Dewhurst

Ще один важливий автор. Крім книжок писав спочатку перші компілятори С++, потім --- статті про цю мову, брав участь у розробці стандарту.

Сайт: http://www.semantics.org/

Стефан К. Дьюхерст, "C++. Священные знания"

 "C++ Common Knowledge: Essential Intermediate Programming"

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

Симпатична книга, хоча, як на мене, дещо слабша від розглянутих вище. Може то я так суб'єктивно --- кілька років тому у нас вона коштувала більше за книгу Страуструпа. При тому -- нещасних 200 сторінок в м'якій обкладинці.


Николай Джосаттис (іноді --- Джосьютис )

Nicolai Josuttis

Один із помітних спеціалістів у С++. Колишній учасник "бібліотечного" підрозділу комітету стандартизації C++.

Сайт: http://www.josuttis.com/. На сайті, крім інформації про нього --- корисні статті, посилання, інформація про книги, приклади до них, виправлення помилок, тощо.

Николай Джосьютис, "C++. Стандартная библиотека"

"The C++ Standart Library. A Tutorial and Reference"

Здоровенна така собі книга, повний та детальний довідник по стандартній бібліотеці. Потоки вводу-виводу, стрічки, STL --- контейнери, ітератори, алгоритми, допоміжні засоби. Перерахунок, із поясненням та прикладами, наявних засобів --- методів, функцій помічників. 

Незамінна книга. Ідеально доповнює "Язык программирования C++" Страуструпа в "півсфері" стандартної бібліотеки (про яку сам Страуструп пише доволі скупо).

Існує її варіант, поки не перекладений на російську чи українську, стосовно стандартної бібліотеки C++11! (Вихід російською очікується цієї осені).

Nicolai M. Josuttis, "The C++ Standard Library. A Tutorial and Reference", 2nd Edition, 2012



Дэвид Вандевурд, Николай М. Джосаттис, "Шаблоны C++: справочник разработчика"

"C++ Templates: The Complete Guide" by David Vandevoorde and Nicolai M. Josuttis




Книга, де він є другим автором. Чудове введення у використання шаблонів! Від основ, "прямолінійного" використання, до шаблонного метапрограмування. Книга, безперечно, для професіоналів, хоча і простіша та зрозуміліша, ніж "Современное проектирование на С++" Александреску. (Звичайно, і менш глибока, але подолати Александреску дано не всім, а ця -- цілком доступна!). 

Містить відомості, необхідні кожному програмісту, що використовує шаблони.


Тексти стандартів

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


Лаптев В.В., Морозов А.В., Бокова А.В.  "C++. Объектно-ориентированное программирование. Задачи и упражнения", 2007

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

Це --- задачник. Містить короткий опис основних тем, пов'язаних із ООП та, хай не супер, але цілком нормальні задачі. При чому, їх багато (що, очевидно, і приводить до їх певної "вразливості до критики").

Думаю, варта уваги книга.

Вибрані посилання

Посилань можна навести безліч. Тому тут лише зовсім-зовсім, і менш-більш --- на мій розсуд, обрані:

Заключне слово

Списки вище --- даааалеко неповні. Звичайно, хороших книг по С++ значно більше. Хоча, більшість  основних робіт по чистому С++ там все ж згадано. Однак більш спеціалізовані книги -- ні. Насправді, і так пост вийшов об'ємним і ресурсоємким в написанні. Тому в спеціалізовані тематики, пов'язані із С++, заглиблюватися не буду, за одним винятком: пакетом boost.org. Слідкуйте за новинами. ;-) А на разі ---

Дякую за увагу!

3 коментарі:

  1. Зайшов на Богуна 8 (дуже симпатичний магазинчик) і придбав "Освой самостоятельно С++ за 21 день" Сиддхартха Рао. Ніби задовільняє більшість запропонованих Автором блогу критеріїв :)

    ВідповістиВидалити
    Відповіді
    1. Ну ти даєш, пристав собі хірурга, який навчався цьому ремеслу по книзі "Хірургія за 24 дня" і тепер він буде тебе оперувати. Крім того вивчити C++ за 21 день НЕМОЖЛИВО, лише з досвітом приходить "програмерська інтуїція" та знання усі фішок C++, тому вам краще було б почитати "C++ для чайников". Книга розкаже про базові речі в C++ та речі з професійного програмування, лише після цієї книги можна переходити до читання складніших книг адже вони натякають, що ви уже все базове знаєте.

      Видалити
  2. Так, магазинчик хороший! "Гіада" -- www.hyade.com :-)

    На жаль, навіть не проглядав згаданої Вами книги, нічого поки не можу сказати.

    Взагалі, книга Прата в мене вже теж жорстокі сумніви останнім часом викликає, все не зберуся із духом акуратно "ревізію" провести.

    ВідповістиВидалити