Searching...
Español
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
Think Like a Programmer

Think Like a Programmer

An Introduction to Creative Problem Solving
por V. Anton Spraul 2012 233 páginas
3.86
500+ calificaciones
Escuchar
Listen to Summary

Puntos clave

1. La Resolución de Problemas es Más que Conocer la Sintaxis

En esencia, la mayoría de los libros de programación para principiantes enseñan a leer un programa, no a escribir uno.

Sintaxis vs. Resolución de Problemas. Muchos aspirantes a programadores luchan porque se enfocan únicamente en aprender la sintaxis de un lenguaje de programación, confundiendo esto con la capacidad de escribir programas originales. Comprender la sintaxis es esencial, pero es solo el primer paso. El verdadero desafío radica en la resolución de problemas: la habilidad de traducir una descripción del problema en un programa funcional.

Habilidades Creativas vs. Analíticas. La resolución de problemas requiere un conjunto diferente de habilidades mentales que aprender la sintaxis. La adquisición de sintaxis es principalmente una actividad analítica, "del lado izquierdo del cerebro", que implica memorización y comprensión. Escribir código original, por otro lado, es una actividad creativa, "del lado derecho del cerebro", que demanda ingenio y la capacidad de combinar herramientas aprendidas de maneras novedosas.

Más Allá de los Libros de Cocina. Confiar únicamente en ejemplos de "libros de cocina" o recetas preescritas puede obstaculizar el desarrollo de verdaderas habilidades de resolución de problemas. Si bien estos recursos pueden ser valiosos para ahorrar tiempo, no fomentan la comprensión profunda de los ingredientes, métodos de preparación y técnicas de cocina que permiten a un gran cocinero crear comidas originales. De manera similar, un gran programador comprende la sintaxis del lenguaje, los marcos de aplicación, los algoritmos y los principios de ingeniería de software, lo que les permite crear programas originales a partir de especificaciones.

2. Reformular Formalmente Desbloquea Soluciones Ocultas

Reformular el problema de una manera más formal es una gran técnica para obtener una visión más clara del mismo.

Obteniendo Nuevas Perspectivas. Reformular un problema en diferentes términos o desde un ángulo diferente puede revelar soluciones que antes estaban ocultas. Es como examinar una colina desde todos los lados antes de intentar escalarla, buscando el camino más fácil hacia la cima. Esta técnica puede aclarar el verdadero objetivo, que puede no ser lo que inicialmente parecía.

Restricciones y Operaciones. La reformulación formal implica identificar las restricciones (reglas inquebrantables) y las operaciones (acciones posibles) dentro del problema. Al listar explícitamente estos elementos, puedes descubrir soluciones potenciales que podrían haber sido pasadas por alto. Por ejemplo, en el clásico acertijo del "zorro, ganso y maíz", formular formalmente las restricciones y operaciones revela la posibilidad de llevar un ítem de regreso a través del río, un movimiento que muchos inicialmente no consideran.

Pensar vs. Resolver. Pensar en el problema en sí puede ser tan productivo, o incluso más, que pensar en la solución. Al reformular formalmente el problema, te obligas a analizar sus componentes y relaciones, lo que a menudo conduce a valiosas ideas y un camino más claro hacia una solución.

3. Dividir y Conquistar: Descomponer la Complejidad

Encontrar una manera de dividir un problema en pasos o fases puede facilitar mucho la tarea.

Reduciendo la Dificultad. Dividir un problema en piezas más pequeñas y manejables puede reducir significativamente su dificultad general. El esfuerzo requerido para resolver cada pieza es a menudo mucho menor que el esfuerzo necesario para resolver todo el problema de una vez. Esto se debe a que combinar técnicas de programación es mucho más complicado que usar técnicas de manera aislada.

Analogía de Clasificación. Considera el hecho de clasificar 100 archivos. Clasificar cuatro grupos de 25 archivos individualmente es mucho menos trabajo que clasificar todo el conjunto de 100 de una vez. Esto se debe a que el trabajo involucrado en insertar un solo archivo crece a medida que aumenta el número de archivos ya clasificados.

Técnicas Secuenciales vs. Combinadas. El código que emplea una serie de declaraciones if dentro de un bucle while que a su vez está dentro de un bucle for será más difícil de escribir y leer que una sección de código que emplea todas esas mismas declaraciones de control de manera secuencial. Al dividir el problema, puedes simplificar el código y reducir la carga cognitiva.

4. Las Analogías Conectan los Problemas

Los expertos en resolución de problemas son rápidos para reconocer una analogía, una similitud explotable entre un problema resuelto y uno no resuelto.

Explotando Similitudes. Reconocer analogías, o similitudes entre un problema actual y uno previamente resuelto, es una poderosa técnica de resolución de problemas. La similitud puede involucrar solo una parte de los problemas, pero puede proporcionar valiosas ideas y atajos.

Ejemplo de la Cerradura Quarrasi. El problema de la cerradura Quarrasi, disfrazado con detalles superfluos y tecnología ajena, es esencialmente el mismo que el acertijo del "zorro, ganso y maíz". Reconocer esta analogía te permite traducir la solución del primer problema en lugar de crear una nueva.

Construyendo una Biblioteca de Soluciones. Cuantos más problemas resuelvas y comprendas completamente, mayor será tu almacén de analogías potenciales. Por eso es crucial evitar atajos como copiar código que no entiendes completamente. Cada programa exitoso que escribas es más que una solución a un problema actual; es una fuente potencial de analogías para resolver problemas futuros.

5. La Planificación Previene la Frustración y Guía el Progreso

Siempre debes tener un plan, en lugar de participar en actividades sin dirección.

La Sabiduría de Eisenhower. "Siempre he encontrado que los planes son inútiles, pero la planificación es indispensable." Si bien los detalles de un plan pueden cambiar a medida que enfrentas desafíos imprevistos, el acto de planificar en sí es crucial para el éxito.

Estableciendo Metas Intermedias. Sin un plan, solo tienes un objetivo: resolver todo el problema. Esto puede llevar a la frustración, ya que no hay refuerzo positivo de tus esfuerzos hasta el final. Un plan te permite establecer metas intermedias, rastrear tu progreso y construir confianza.

El Descubrimiento de Fleming. El descubrimiento de la penicilina no fue un accidente afortunado; fue el resultado de una experimentación minuciosa y controlada. La planificación te permite reconocer la importancia de los eventos inesperados y convertirlos en valiosas ideas.

6. Arreglos: Herramientas Fundamentales para la Organización de Datos

Los temas tratados en este libro representan áreas en las que he visto con más frecuencia a los nuevos programadores luchar.

Colecciones de Variables. Los arreglos son estructuras de datos fundamentales que organizan variables del mismo tipo bajo un solo nombre, accesibles mediante un índice numérico. Esta organización permite un almacenamiento y recuperación eficientes de datos relacionados.

Operaciones Básicas. Las operaciones clave de los arreglos incluyen almacenar valores, copiar arreglos (o porciones de ellos), recuperar valores por índice, buscar valores específicos, ordenar elementos en un orden deseado y calcular estadísticas basadas en el contenido del arreglo.

Más Allá de Datos Simples. Los arreglos pueden almacenar tipos de datos complejos, como estructuras u objetos, lo que te permite organizar y manipular colecciones de información relacionada. Esta versatilidad convierte a los arreglos en una herramienta poderosa para resolver una amplia gama de problemas de programación.

7. Punteros: Dominando la Gestión Dinámica de Memoria

C++ es lo real: es programación sin ruedas de entrenamiento.

Asignación Dinámica. Los punteros permiten la asignación dinámica de memoria, lo que te permite crear estructuras de datos con tamaños determinados en tiempo de ejecución. Esta flexibilidad es crucial al tratar con conjuntos de datos de tamaño desconocido o variable.

Compartición de Memoria. Los punteros facilitan la compartición de memoria, permitiendo que diferentes partes de un programa accedan a los mismos datos sin la sobrecarga de copiar. Esto puede mejorar significativamente el rendimiento, especialmente al trabajar con grandes estructuras de datos.

Responsabilidad. Dominar los punteros requiere una cuidadosa atención a la gestión de memoria. Debes asignar memoria cuando sea necesario, rastrear punteros a la memoria asignada y desasignar memoria cuando ya no esté en uso para evitar fugas de memoria y otros errores.

8. Clases: Encapsulación para la Reutilización y Claridad

Al estudiar estos enfoques, puedes desbloquear tu creatividad.

Combinando Datos y Código. Las clases encapsulan datos y código que operan sobre esos datos en una única unidad reutilizable. Esto promueve la modularidad, la organización y la reutilización del código.

Ocultación de Información. Las clases imponen la ocultación de información al controlar el acceso a los miembros de datos, evitando la manipulación directa desde fuera de la clase. Esto protege la integridad de los datos y te permite cambiar la implementación sin afectar el código del cliente.

Extendiendo el Lenguaje. Las clases extienden el lenguaje al crear nuevos tipos de datos con comportamientos personalizados. Esto te permite modelar objetos y conceptos del mundo real en tu código, haciéndolo más legible y mantenible.

9. Recursión: Soluciones Elegantes para Estructuras Complejas

Este libro no te dirá exactamente qué hacer; te ayudará a desarrollar tus habilidades latentes de resolución de problemas para que sepas qué deberías hacer.

Funciones Autorreferenciales. La recursión es una técnica donde una función se llama a sí misma, ya sea directa o indirectamente. Esto te permite resolver problemas complejos descomponiéndolos en subproblemas más pequeños y auto-similares.

Casos Base y Pasos Recursivos. Una función recursiva debe tener un caso base, que es una condición que detiene la recursión y devuelve un valor directamente. También debe tener un paso recursivo, que llama a la función a sí misma con una entrada modificada.

Recursión de Cabeza vs. Recursión de Cola. La recursión de cabeza realiza la llamada recursiva antes de otro procesamiento, mientras que la recursión de cola realiza la llamada recursiva después de otro procesamiento. La elección entre las dos puede afectar la eficiencia y la legibilidad del código.

10. Reutilización de Código: Equilibrando Eficiencia y Comprensión

La lección principal aquí es la importancia de reconocer analogías.

Evitando Reinventar la Rueda. La reutilización de código es esencial para un desarrollo de software eficiente. En lugar de escribir todo desde cero, puedes aprovechar componentes existentes, como algoritmos, patrones, tipos de datos abstractos y bibliotecas.

Buena vs. Mala Reutilización. La buena reutilización implica comprender los conceptos subyacentes y adaptarlos a tu problema específico. La mala reutilización implica copiar código sin entenderlo, lo que puede llevar a errores y dificultades de mantenimiento.

Construyendo una Biblioteca de Componentes. Esfuérzate por construir una biblioteca personal de componentes bien entendidos que puedas reutilizar en proyectos futuros. Esto aumentará significativamente tu productividad y mejorará la calidad de tu código.

11. Domina tus Fortalezas, Mitiga tus Debilidades

Mi objetivo es que tú y cada lector de este libro aprendan a abordar sistemáticamente cada tarea de programación y a tener la confianza de que, en última instancia, resolverán un problema dado.

La Autoconciencia es Clave. El enfoque más efectivo para la resolución de problemas es aquel que aprovecha tus fortalezas y compensa tus debilidades. Esto requiere una autoevaluación honesta y una disposición a adaptar tus técnicas en consecuencia.

Debilidades en Codificación y Diseño. Identifica tus errores comunes de codificación y fallos de diseño. Esto te permitirá desarrollar estrategias para evitar estos escollos y mejorar la calidad general de tu código.

Aprovecha tus Talentos. Reconoce tus fortalezas en programación y diseña tu plan maestro para maximizar su impacto. Esto no solo conducirá a mejores resultados, sino que también hará que el proceso de resolución de problemas sea más agradable y gratificante.

Última actualización:

Reseñas

3.86 de 5
Promedio de 500+ calificaciones de Goodreads y Amazon.

Piensa como un Programador recibe críticas mixtas, con una calificación promedio de 3.86 sobre 5. Los lectores valoran su enfoque en la resolución de problemas y los ejercicios, considerándolo útil para desarrollar habilidades de programación. Algunos elogian las explicaciones del autor y lo consideran un recurso valioso para principiantes. Sin embargo, los críticos argumentan que la dependencia del C++ limita su accesibilidad, y algunos encuentran el contenido demasiado básico o académico. El enfoque del libro en el pensamiento lógico y la descomposición de problemas es generalmente bien recibido, aunque las opiniones varían sobre su efectividad para programadores experimentados.

Sobre el autor

V. Anton Spraul es un programador y autor reconocido por su labor en la enseñanza de conceptos de programación. Cuenta con una amplia experiencia en el desarrollo de software y se ha centrado en ayudar a los principiantes a comprender los fundamentos de la programación. El enfoque de Spraul enfatiza las habilidades de resolución de problemas y el pensamiento lógico, por encima de simplemente aprender la sintaxis. Él cree en la importancia de entender cómo descomponer problemas complejos en partes manejables. Spraul ha escrito otros libros y artículos relacionados con la programación, con el objetivo de hacer que los conceptos de programación sean accesibles para un público amplio. Su estilo de escritura se describe como atractivo y a veces humorístico, aunque algunos lectores lo encuentran ocasionalmente condescendiente.

0:00
-0:00
1x
Dan
Andrew
Michelle
Lauren
Select Speed
1.0×
+
200 words per minute
Home
Library
Get App
Create a free account to unlock:
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Recommendations: Get personalized suggestions
Ratings: Rate books & see your ratings
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
All summaries are free to read in 40 languages
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 10
📜 Unlimited History
Free users are limited to 10
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on May 4,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
100,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Try Free & Unlock
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

Settings
General
Widget
Appearance
Loading...
Black Friday Sale 🎉
$20 off Lifetime Access
$79.99 $59.99
Upgrade Now →