¿Cuál es la habilidad más importante para desarrollar en algoritmos?

  • Comprender por qué existen los algoritmos y qué los diferencia. Esto parece trivial y simple, pero la mayoría de la gente no acepta los algoritmos de aprendizaje y los ignora por ser demasiado académicos. Lo aprenden de mala gana solo para entrevistas. Argumentan que “nadie con un trabajo de desarrollo de software decente tuvo que escribir o comprender un algoritmo”. Si esta es su mentalidad, debe cambiarla antes de seguir adelante. Tener una mentalidad expedicionaria.
  • Comprender y estar realmente familiarizado con sus estructuras de datos. Debe comprender las operaciones esenciales de estructura de datos, sus complejidades de tiempo y sus compensaciones. Siga la taxonomía de Bloom para aprender (recuerde, comprenda, aplique, analice, sintetice, evalúe). La mayoría de las personas pasan de recordar a evaluar lo que simplemente no sucede.
  • Comprensión de clases de algoritmos. Esto viene después de mucho trabajo práctico y práctica en papel. En la mayoría de los casos, debería poder clasificar un problema en un equivalente algorítmico. ¿Es un problema de búsqueda? ¿Es un problema de clasificación? ¿Es un problema de maximización? ¿Es un problema de almacenamiento? Esto lo ayudará a ‘indexar’ la información en su cabeza. Cuanto más practique, mejor será reconocer patrones y aplicarlos.

El principal desafío del científico informático es no confundirse con las complejidades de su propia creación.

– EW Dijkstra

  • Comprender los requisitos correctamente, incluida la viabilidad y la practicidad de su solución. Puede ser genial hacer algo en O (log (N)) pero puede que no sea necesario, y puede que no sea práctico, etc. Haga preguntas y profundice en la esencia del problema. Mucha gente aprende una nueva estructura de datos brillante e intenta (ab) usarla en cada problema. No hagas eso.
  • Para cada problema, existe una solución de fuerza bruta. Si no puede encontrar la solución de fuerza bruta, no comprende el problema. Encuentre la solución trivial y vea qué necesita optimizarse y trabaje para lograrlo. No saltes a la solución perfecta.

En caso de duda, use la fuerza bruta.

– Ken Thompson

  • Para cada problema, existe una forma de probarlo. Si no puede explicar cómo va a probar la solución (sea lo que sea), no podrá resolverla.

Un programa que produce resultados incorrectos el doble de rápido es infinitamente más lento.

– John Osterhout

  • Comprender y realmente internalizar la navaja de afeitar de Occum.
  • Finalmente, siempre esté abierto a nuevas soluciones y nuevas implementaciones. Si está absolutamente seguro y entusiasmado con su solución, debe haber algo que le falta.

En un aspecto más operativo, recomendaría que se familiarice con una biblioteca de su elección que proporciona construcciones para tipos y estructuras de datos básicos y abstractos. Esta podría ser la biblioteca estándar de Python, STL para C ++, clases básicas .NET, Framework Framework para Cocoa, etc. Recuerde nuevamente la taxanomía de Bloom y siga profundizando en los detalles de implementación de su marco. Al igual que un guitarrista virtuoso, no debe pensar o buscar en Google cuando implementa un algoritmo que utiliza funciones de biblioteca estándar. Si todavía tiene que buscar en Google cómo usar un mapa STL de cadenas a vectores, aún no está practicado y no solo lo ralentizará, su vocabulario es muy limitado. Aumenta tu vocabulario.

“En teoría, la teoría y la práctica son lo mismo. En la práctica, no lo son”.

– Yoggi Berra

PD: Si estás en C ++, te recomendaría la Guía del programador de la Biblioteca de plantillas estándar. Aprender la diferencia entre una secuencia y un contenedor asociativo, etc. aumentaría su vocabulario y lo ayudaría a pensar de una manera más estructurada.