1 puntos por GN⁺ 2024-04-20 | 1 comentarios | Compartir por WhatsApp
  • La 3.ª edición de 『Programming: Principles and Practice Using C++』 está dirigida principalmente a lectores que aprenden a programar por primera vez, y también puede servir como texto introductorio para quienes ya tienen algo de experiencia y quieren aprender C++ moderno y mejores estilos y técnicas.
  • El enfoque central del libro no es memorizar detalles de la sintaxis de C++, sino los principios básicos de programación y las técnicas prácticas, cubriendo programación procedural, orientada a objetos y genérica.
  • PPP3 se redujo a aproximadamente la mitad del tamaño de PPP2, reforzando los capítulos básicos que suelen cubrirse en un curso semestral e incorporando C++20, C++23 y código de Graphics/GUI basado en Qt.
  • Los capítulos más especializados y el material puramente de referencia se trasladaron a la web para consultarlos cuando se necesiten, siguiendo una tendencia de complementar la información de referencia actualizada con recursos web como cppreference.com.
  • Se ofrecen un PDF de muestra, módulos y headers de PPP, código GUI con Qt, diapositivas de clase y guías de estilo de código, por lo que puede usarse tanto en cursos como para autoaprendizaje.

Objetivo del libro y público lector

  • 『Programming: Principles and Practice Using C++ (3rd Edition)』, abreviado PPP3, es un libro introductorio para personas sin experiencia en programación.
  • Los lectores que ya hayan programado un poco también pueden usarlo para mejorar su estilo y sus técnicas, o para aprender C++ moderno.
  • Aunque fue diseñado para clases, también fue escrito pensando en el autoaprendizaje.
  • Las ediciones anteriores se usaron en el primer curso de programación para estudiantes de ingeniería eléctrica, ingeniería en computación y ciencias de la computación de Texas A&M University, además de otros lugares.

Forma de enseñar programación

  • El libro tiene como objetivo que el lector termine siendo capaz de escribir programas lo suficientemente buenos como para que otras personas puedan usarlos y darles mantenimiento.
  • El foco está en los conceptos y técnicas fundamentales más que en detalles menores y específicos del lenguaje.
  • No está planteado como una simple introducción al lenguaje C++, sino como una introducción a la programación en general.
    • Programación procedural
    • Programación orientada a objetos
    • Programación genérica
  • Junto con técnicas modernas de alto nivel, también cubre técnicas de bajo nivel necesarias para usar el hardware de forma eficiente.
  • Proporciona una base para escribir código útil, correcto, seguro en tipos, mantenible y eficiente.
  • Cubre ampliamente conceptos esenciales, diseño y técnicas de programación, características del lenguaje y bibliotecas.

Qué cambió en la 3.ª edición

  • PPP3 tiene aproximadamente la mitad del tamaño de PPP2.
  • Se redujo el volumen reforzando los capítulos básicos que normalmente se cubren en un curso semestral.
    • Aprovecha partes clave de C++20 y C++23.
    • El código de los capítulos de Graphics/GUI se rehízo sobre Qt, considerando la portabilidad a entornos como navegadores y teléfonos.
  • Los capítulos más especializados, llamados “broadening the view” en PPP2, se colocaron en la web para usarlos cuando haga falta.
  • Se eliminó el material puramente de referencia.
    • En la web se puede encontrar material más abundante y actualizado; se menciona cppreference.com como ejemplo.

Estándar de C++ y alcance de las bibliotecas

  • El libro usa C++20 y C++23.
  • Trata el diseño y uso de tipos integrados y tipos definidos por el usuario.
    • Entrada
    • Salida
    • Cálculo
    • Gráficos/GUI simples
  • También incluye una introducción a los contenedores y algoritmos de la biblioteca estándar de C++.

Material de muestra publicado

  • Preface: trata lo que el libro promete y lo que no promete.
  • Table of Contents: PDF con el índice.
  • Chapter 0: Notes to the Reader: guía sobre el enfoque del libro.
  • Chapter 10: A Display Model: capítulo de muestra.
    • A los principiantes absolutos les conviene no leerlo todavía.
    • Es un capítulo pensado para mostrar a docentes y lectores con experiencia el nivel al que llega el libro hacia la semana 5, asumiendo un ritmo de 2 capítulos por semana.
    • También busca mostrar parte de C++ moderno.

Material de apoyo y código

Capítulos de PPP2 que siguen en la web

Estado de las traducciones

  • PPP3 todavía no tiene traducciones.
  • Las traducciones de la edición anterior pueden consultarse en la book covers page.

1 comentarios

 
GN⁺ 2024-04-20
Opiniones de Hacker News
  • Me parece bastante problemático que el “primer programa clásico” de este libro use import std; desde la primera línea. Hasta donde sé, salvo quizá MSVC, ningún compilador lo soporta bien de forma predeterminada.
    En Debian, ni siquiera con g++ --std=c++23 -fmodules-ts funciona, y si uno mira https://en.cppreference.com/w/cpp/23, la propuesta relacionada es P2465R3, pero clang++ 17 también aparece con “soporte parcial”. Incluso instalando clang++17, sale module 'std' not found.
    Entiendo que import std; es una función muy nueva, pero este libro es para principiantes en C++, y me pregunto cómo reaccionaría un novato promedio. También vi el mismo problema cuando leí “Tour of C++” hace uno o dos años.

    • Buen punto; a mí me pasó lo mismo. Mi g++ da exactamente el mismo error y la misma indicación.
      No leí la edición más reciente de Stroustrup de la que se habla ahora, pero sí leí una edición anterior en la época en que usaba C++ todos los días. Incluso 20 años después sigo prefiriendo Accelerated C++, de Koenig y Moo. Puede que desde entonces hayan salido libros mejores, pero no los he leído.
      Según recuerdo, el Hello World de ese libro era algo como #include, int main(), std::cout << "Hello, world!" << std::endl;, y aun hoy en Arch Linux se compila con g++ a.cpp y al ejecutar ./a.out funciona tal cual.
      Todo el libro tenía una estructura excelente para imitar un estilo moderno de C++, simple y limpio, casi como pseudocódigo, sin aritmética de punteros de C. Se parecía también a la sensación prolija del Python temprano, aunque en Python no aparecieron elementos de ese tipo hasta que más tarde pandas empezó a traer bibliotecas contenedoras de C++ como numpy y scipy.
      En el trabajo casi nunca vi código C++ limpio. No trabajé en FAANG, y en prototipos rápidos las revisiones de código también eran raras, así que no sé qué tan extendida está la enseñanza al estilo Koenig y Moo fuera del mundo greenfield que me tocó. Campos como la radioterapia, donde no quieren convertirse en el próximo Therac-25, podrían ser la excepción.
    • La documentación actual de GCC 13.2.1 dice que la biblioteca estándar no se proporciona como unidades de encabezado importables. Para importar esas unidades, primero hay que compilarlas explícitamente y, si no se tiene cuidado, pueden aparecer declaraciones duplicadas que el mecanismo de módulos debe fusionar, con lo cual el uso de recursos del compilador puede verse afectado por la forma en que se dividan los archivos de encabezado.
      Por eso, por ahora hay que escribir primero el archivo de módulo adecuado para que import funcione. Dicho eso, no creo que la actualización de la biblioteca estándar de C++ en GCC vaya a tardar demasiado, así que más adelante probablemente se pueda usar este nuevo libro directamente tal como está.
      Para alguien que ya conoce C++ antiguo y solo quiere actualizar sus conocimientos, escribir ese archivo de módulo por cuenta propia también podría ser una buena experiencia de aprendizaje.
    • Hoy en día ya no es realista mantener un programa interesante en C++ sin un sistema de compilación. Aun así, es muy probable que la invocación a g++ del ejemplo termine funcionando algún día mediante un tratamiento especial del compilador, si alguien envía un parche a GCC.
      En general, salvo ejemplos de investigación, encadenar llamadas directas a g++ ya no es una forma realista de trabajar. Otros lenguajes compilados tampoco se manejan tocando directamente gccgo, rustc o javac, sino usando sistemas como gobuild, cargo o Maven.
      https://www.kitware.com/import-std-in-cmake-3-30/
    • Este documento citado en la página del libro quizá ayude con el problema de los módulos: https://www.stroustrup.com/module_use.html
  • En el capítulo de GUI cambió de FLTK a Qt. Como Qt se usa mucho en la industria, es un cambio bastante grande y probablemente reciba una buena reacción, aunque no sé cómo cambiará la curva de aprendizaje.

    • Me pregunto qué piensa Stroustrup del Meta Object Compiler. En ciertos aspectos, Qt se siente como un dialecto propio de C++.
    • Como Qt tiene Qt Creator, creo que es una mejora.
    • Usa una biblioteca wrapper personalizada, así que no sé cuánto de Qt real queda expuesto.
    • Les pedí a cuatro asistentes de programación con IA que probé (claude3, gemini, gpt4, deepseek) que escribieran boids y Game of Life en C++, y todos usaron SFML para los gráficos.
      Me pregunto si fue porque es multiplataforma o porque en el código con el que se entrenaron estos modelos hay más ejemplos de uso de SFML. SFML parece relativamente más reciente que Qt o FLTK, así que sería raro que hubiera más datos de entrenamiento; también es curioso que los cuatro coincidieran en proponer SFML para gráficos en C++.
  • Lo que me gusta del código de Stroustrup es using namespace std;. La convención de poner std:: delante de todo, como std::every std::last std::bloody std::thing, vuelve loco a cualquiera.

    • Depende del caso. En archivos de encabezado nunca se debe poner using namespace de ningún espacio de nombres. Justamente porque así se crean los choques de nombres que los espacios de nombres existen para evitar.
      Incluso en archivos de implementación, personalmente no me gusta using namespace std;. Creo que reduce la legibilidad del código, y como el contenido de std:: es enorme y sigue creciendo, prefiero evitar directamente la posibilidad de choques de nombres.
      El código se escribe una vez pero se lee muchas veces, así que elegir nombres cortos, incluso incluyendo el espacio de nombres, me parece una mala decisión en términos de eficiencia.
    • Que no haya choques de nombres está bien. Pero de algún modo otros lenguajes resolvieron este problema.
    • Me pregunto si, cuando los módulos de C++ se establezcan bien, esto dejará de ser un tema de debate.
    • Más que std en sí, lo feo es el doble dos puntos ::. Nunca entendí por qué no pudieron usar simplemente un punto, como otros lenguajes.
    • Parece que aprendiste a programar en Windows.
  • Hace más de 10 años que no uso C++, pero recuerdo haber estudiado muy a fondo una edición anterior de este libro. Eso fue incluso después de haber usado C++ para casi el 99% de todo durante 4 años en la universidad
    Es un libro realmente bueno. Si te tomas el tiempo de entender bien el C++ del libro, hasta da un poco de tristeza ver por qué el mundo le tenía tanto miedo a C++
    Claro que después me encontré con montones de personas que escribían código C++ horrible sin haber leído nunca un libro así

  • Extraño la época en que trabajaba con C++. Se siente como si hubiera bajado a capas más profundas del stack de desarrollo que antes. Antes manejábamos UI, parseo de API y casi todo en C++

    • Durante un tiempo extrañé Fortran, pero se me curó en cuanto programé unos 30 minutos. Prueba parsear JSON en C++ y ve si la nostalgia aguanta ese proceso
    • Yo también lo extraño mucho. Ni siquiera fue hace tanto: había una app donde tanto el cliente como el servidor estaban en C++, y la UI, la API, todo estaba en C++. De verdad se sentía como si por fin hubiera llegado un lenguaje de propósito general
      No diría que era perfecto, pero el trabajo era divertido, y era un gusto estar con gente de alto nivel capaz de trabajar en ese stack. No hubo almuerzo más emocionante que cuando pusimos distcc a correr en servidores blade para acelerar muchísimo los builds. También era agradable no ser el único usuario entusiasta de Linux
    • En nuestra empresa, casi todo excepto la UI está en C++. Creo que la única razón por la que la UI no está en C++ es para dejar una parte del código base en la que los recién graduados puedan trabajar de inmediato, incluso antes de recibir capacitación en C++
    • Para saciar mi sed de C++, todavía voy tocando de a poco un motor de juego como proyecto personal. A pesar de todas las críticas, realmente me gusta usar C++
    • Solo espero no trabajar en Python
  • Durante el último año terminé la mayor parte de la 2.ª edición. Es un libro excelente y me ayudó a superar varias barreras mentales con las que me había topado durante años en programación
    La razón principal por la que esta edición es más corta es que se eliminó la Part IV: Broadening the View. Esa parte cubría temas adicionales como procesamiento de texto, cálculo numérico y sistemas embebidos, y ahora está disponible en línea. Esos capítulos siguen siendo relevantes y usan C++11/14, así que no se actualizaron desde la 2.ª edición

  • También comparto C++ Annotations, un libro que se mantiene actualizado con C++ moderno: http://www.icce.rug.nl/documents/cplusplus/

    • Me pregunto si, para un proyecto de emulador, usar básicamente C con clases y agregarle solo smart pointers y auto sería un enfoque bastante razonable
      Una vez escuché que C++ tiene cuatro componentes. El primero es “C”; el segundo, la orientación a objetos; el tercero, productividad y flexibilidad como la STL y los templates; y el último, cosas para situaciones especiales como volatile y asm. Él recomendaba usar el 1 con cuidado y evitar las situaciones en las que hiciera falta usar el 4; me pregunto si eso tiene sentido
    • Da 404
  • Pensé que sería un ladrillo más grueso, pero sorprendentemente se redujo a la mitad
    La 2.ª edición tenía 1312 páginas en paperback y pesaba 4.81 libras; la 3.ª edición tiene 656 páginas en paperback y pesa 2.71 libras

    • Por el prefacio, parece que sacaron del libro una buena parte del material de referencia y lo pasaron a la documentación de C++ en internet
      Dice que la 3.ª edición de “Programming: Principles and Practice Using C++” tiene aproximadamente la mitad del tamaño de la 2.ª edición, y que los estudiantes que tengan que cargar el libro agradecerán el menor peso. También dice que la razón de la reducción es que hay más información sobre C++ y la biblioteca estándar en la web
    • Me gusta ver que el conocimiento de C++ se mida en libras
    • Literalmente es exactamente la mitad. Me pregunto si eligieron una fuente más pequeña
  • Me pregunto por qué Bjarne a veces pone un espacio después de #include y a veces no
    https://www.stroustrup.com/PPPheaders.h

    • Podría pasarse por alto si se mezclaron headers escritos a mano con headers insertados automáticamente por el IDE, y además había una configuración que colapsaba los imports por defecto, o si no se ejecutaba clang-format al guardar
  • Me entusiasma mucho que haya salido una nueva versión. Aunque no te interese C++ o ya seas un programador experimentado, vale la pena leer este libro
    Hasta donde sé, es uno de los mejores ejemplos de escritura técnica y enseñanza de programación informática