¿Cuánto conocimiento de implementación de algoritmos usan realmente los programadores experimentados?

Bueno, sin un conocimiento de las estructuras de datos comunes, un programador no sabrá cuándo y cómo usarlas de manera efectiva, terminando creando estructuras más complejas para resolver algún problema inmediato. Desafortunadamente, esto es muy común, ya que muchos programadores no se beneficiaron de una educación formal en Ciencias de la Computación y tomaron más tiempo en su carrera autodidacta para abordar lo que aprende un estudiante junior de CS en su primer año.

Al abordar la segunda parte de su pregunta, muchas bibliotecas estándar implementan solo las estructuras de datos más utilizadas. Por lo tanto, es muy probable que enfrente una situación en la que necesite implementar la suya. Por ejemplo, su biblioteca estándar puede tener listas doblemente vinculadas implementadas, pero necesita una lista más genérica de múltiples enlaces. O su biblioteca estándar implementa conjuntos, pero no conjuntos múltiples.

En general, puede escapar sin tener que escribir su propia estructura de datos simplemente adoptando alguna biblioteca de terceros que lo haga. Pero esto a veces no es ideal, ya que la dependencia de la biblioteca es algo que uno debería tratar de mantener al mínimo.

Si el lenguaje está orientado a objetos, generalmente puede usar las estructuras de datos proporcionadas en la biblioteca estándar y simplemente adaptarlas a sus necesidades utilizando patrones de diseño como el Adaptador o el Decorador, o anulando sus operadores. No siempre es necesario escribir una estructura de datos desde cero.

Pero…

Estructura de datos es un nombre genérico que incluye mucho más que los nombres típicos que se escuchan mencionar, como listas vinculadas, conjuntos, pilas, colas. De hecho, está creando su propia estructura de datos cuando implementa un objeto en un lenguaje de programación orientado a objetos, por ejemplo. O cuando implementa una estructura en un lenguaje de programación procesal. Recuerde que una estructura de datos es cualquier construcción destinada a organizar datos de manera que puedan ser utilizados por otras partes de su programa. Siempre está creando sus propias estructuras de datos.

Del mismo modo, algunas estructuras de datos bien conocidas son extremadamente flexibles y le permiten redefinir sus usos principales. Tome una matriz, por ejemplo. La estructura de datos de la matriz es un lienzo donde puede pintar todo tipo de organización de datos. Puede implementar una matriz 1D, 2D, 3D, nD, o una matriz de tuplas, o una matriz de objetos, o funciones, o una matriz que tenga todos esos elementos juntos en algún tipo de disposición que al final represente una nueva Estructura de datos de abeto para sus necesidades. Ciertamente sigue siendo una matriz, pero su implementación la convirtió en una estructura de datos nueva y más compleja.

Los programadores no aprenden algoritmos estándar para poder volver a implementarlos. En la mayoría de los casos, la ventaja de conocer los algoritmos es que puede usar los que proporciona una biblioteca, que alguien ha pensado y probado ampliamente. Conocer algunos de los detalles de estos algoritmos le permite usarlos de manera más efectiva, ya que conoce sus fortalezas y debilidades.

Un estudiante de CS también aprende algoritmos estándar por la misma razón que un estudiante de matemáticas aprende pruebas, o un estudiante de literatura lee grandes obras de ficción: es educativo ver ejemplos de lo mejor que el campo tiene para ofrecer. Luego pueden aplicar las ideas que aprenden a su propio trabajo.

Necesitará conocer una buena cantidad de algoritmos y cómo implementarlos si está trabajando en software de sistemas: por ejemplo, componentes internos del sistema operativo o de la base de datos, sistemas de conmutación de comunicación, programación integrada para un dispositivo, etc.

Además, si está diseñando un software analítico para negocios o ciencia, o comercio de valores, etc., necesitará conocer algunos algoritmos muy especializados y, en los niveles más altos de este trabajo, probablemente necesitará un doctorado donde se especializó en venir con nuevos algoritmos.

Dicho esto, cualquier programador puede beneficiarse al aprender más sobre algoritmos. Hay abundantes libros y sitios web para ayudar con esto. Se pueden obtener muchas ideas geniales que pueden ayudarlo a avanzar en el desarrollo de software mediante el estudio de estos materiales.

Hay muchas dimensiones para este problema. Me referiré a algunos que otros no tienen.

Se podría argumentar que lo que hace un programador es implementar algoritmos. En muchos de los trabajos de software más desafiantes, la programación es la parte fácil: la parte difícil es desarrollar el algoritmo e idear una implementación adecuada. Esperar que todos los algoritmos importantes se hayan implementado dentro del lenguaje no es realista para todos, excepto para las aplicaciones relativamente simples, mundanas y, en última instancia, más aburridas. Y no saber cómo implementar esos algoritmos significa incapacidad para evaluar si la solución “enlatada” es la correcta (como han observado otros).

Aquí hay otra perspectiva. Sabemos cómo automatizar la generación de código a partir de diseños debidamente documentados. Por ahora, a menudo no es el mejor código, pero estamos mejorando. Y las empresas saben cómo utilizar los recursos “offshore” (de bajo costo) para extraer el código de los diseños. Entonces, ¿qué dice esto sobre el futuro a largo plazo de los programadores? Dice que la gente del software altamente remunerada del futuro no estará programando; estarán desarrollando algoritmos y diseñando software de manera que otros se conviertan en código. O mejorar los sistemas que generan código automáticamente. La experiencia y el conocimiento sobre algoritmos serán una característica clave del experto en software.

Al igual que con todo en la programación, si toma todo al pie de la letra o asume que el mundo funciona de la manera deseada, perderá el punto.

Lo que se le da en una clase típica son problemas abstractos de juguetes con importancia histórica para ellos. No codificará struct node { int data; struct node *next; } struct node { int data; struct node *next; } struct node { int data; struct node *next; } más de lo que un ingeniero aeroespacial escribe [matemáticas] y = \ frac {9.8m / s ^ {2}} {2} en ^ {2} + v_ {0} t + y_ {0} [/ matemáticas].

Sin embargo, si no puede razonar sobre una lista vinculada, que proviene de la experiencia de la implementación, no podrá escribir mucho código que se ocupe de relaciones complicadas entre registros en una base de datos. Por ejemplo, “tenemos a nuestros usuarios organizados en cadenas de llamadas, en caso de una emergencia. Dependiendo de quién hayamos escuchado, podríamos querer trabajar desde el final de la lista o fusionar dos listas”.

Eso no está en la biblioteca estándar … o, supongo que sí, pero no hay forma de que lo aplique al sistema de administración de la base de datos. Sin embargo, si agrego a las relaciones que necesitan ser administradas, incluso esa función de biblioteca desaparecería rápidamente.

Probablemente solo aprendí el 20% de mi algoritmo y conocimiento de la estructura de datos en la escuela, el resto lo aprendí leyendo con voracidad e intentando implementarlos. He escrito mis propias implementaciones de clasificación (todos los grandes, burbuja, shell, montón, inserción, rápida), he escrito mi propia biblioteca de árbol B (y casi inmediatamente la tiré por una incorporada), yo He escrito mi propio analizador de Plan SQL, he escrito intérpretes para varios idiomas (algunos diseñados específicamente para un sistema integrado). Estos fueron principalmente en varios trabajos a lo largo de los años, pero algunos fueron con proyectos de código abierto o simplemente por diversión.

La programación es estructuras de datos y algoritmos. Realmente no hay nada más. La única forma real de sentirse cómodo pensando en las estructuras de datos y en cómo implementar algoritmos (o diseñar los suyos propios) es hacerlo.

¿Pero por qué querrías hacer eso? Para dar un ejemplo simplificado: si digo que hay una matriz (una estructura de datos) llena de números y necesita agregar cada elemento en la matriz para obtener una suma final y luego darme el promedio, se me ocurrirá un algoritmo para hacer eso, o si sabes que hay una función de biblioteca para hacer eso, quizás lo uses. Ahora, si cambio esa matriz a un Diccionario (una estructura de datos con un algoritmo para acceder rápidamente a los elementos) con los números en el valor, lo haría de manera diferente. Haría esto basándose en su conocimiento de lo que es una estructura de diccionario y probablemente usando una combinación de código escrito a mano y partes preescritas del algoritmo del diccionario codificado en la biblioteca de su idioma favorito.

Cuando hayas terminado con mi experimento anterior y me hayas pasado tu código (tu cliente) y encuentre un error y te lo cuente. Su experiencia y conocimiento de las estructuras de datos y algoritmos involucrados también serán un impulso significativo para encontrar y corregir ese error. Sí, puede encontrarlo incluso si no comprende cómo funcionan los diccionarios, pero probablemente lo encuentre más rápido si lo hace.

Esto es lo que separa al programador intermedio de un experimentado experimentado. Los programadores de nivel intermedio aprenden el lenguaje y producen un código perfectamente bueno, pero por lo general no se dan cuenta de cómo las opciones de diseño afectan el rendimiento del tiempo de ejecución. Conocimiento de implementación == rendimiento.

A veces mucho, a veces nunca. Depende de la complejidad del proyecto. No siempre encontrará algoritmos SP o NF (etc., etc.) en bibliotecas estándar. Entonces, a veces es posible que desee implementar el algoritmo de Dinitz para el flujo de red, pero la biblioteca más utilizada y más estable solo tiene el algoritmo Ford-Fulkerson y el que tiene el que desea parece un poco sombrío, por lo que termina haciéndolo usted mismo. Además, si su programa es parte de un sistema crítico (control de aeronaves, máquinas de atención médica, equipos militares, plantas de energía nuclear), el presupuesto y la naturaleza crítica del proyecto pueden influir en la implementación de ese conocimiento más veces que el tipo de sitio web promedio.

Para ser justos, tengo 15 años de experiencia como desarrollador de software, y no hago mucha programación activa, no implemento nada a mano si puedo ayudarlo, soy un arquitecto técnico, y lo hago una buena cantidad de revisiones de código. Si no está utilizando los patrones de diseño arquitectónico apropiados o los enfoques algorítmicos, comentaré sobre esto. Si está utilizando un HashMap y un TreeMap es más apropiado, comentaré sobre esto. Si no comprende las bibliotecas que está utilizando, o cómo funcionan las diferentes implementaciones de interfaces abstraídas, se muestra.

Los ADT se usan MUCHO con más frecuencia: el uso de un “algoritmo fijo” realmente depende del problema frente a usted para ajustar el “molde” del algoritmo, algo que no sucede con tanta frecuencia. El uso de ADT es mucho más diverso y aplicable en escenarios de problemas.

More Interesting

¿Por qué el algoritmo transversal de Morris tiene una complejidad de tiempo O (n)?

Cómo mejorar si he pasado 10 años aprendiendo programación pero aún no puedo resolver la mayoría de los problemas de algoritmos

¿Cómo calcula YouTube el algoritmo mencionado a continuación?

¿Qué nivel / conocimiento de programación debería tener para obtener el máximo provecho de CLRS? [Más detalles en mi respuesta contraída]

Cómo resolver este problema con un árbol de segmentos o BIT

¿Cuál es el beneficio de sobrecargar una función recursiva?

¿Por qué muchos elementos utilizados en la función objetivo de un algoritmo de aprendizaje asumen todas las características centradas en cero y tienen una varianza en el mismo orden?

¿Cuántas comparaciones se requieren para fusionar 4 archivos ordenados de 35 registros en un solo archivo ordenado?

He estado haciendo programación competitiva durante años, pero ahora me encuentro despistado en mi clase de Algoritmos. ¿Qué tengo que hacer?

¿Qué estructuras de datos y algoritmos deben conocer todos los estudiantes de ciencias de la computación / ingeniería?

¿Cómo podemos resolver el siguiente problema en O (n)?

¿Es una buena manera de aprender a resolver el cubo de rubik con algoritmos ya realizados en línea si no tiene idea de cómo resolverlo?

¿Cómo construiría una estructura de datos compartidos para un alto rendimiento y disponibilidad?

En Kaggle Competition, ¿qué algoritmo de aprendizaje por conjuntos prefiere? ¿Voto mayoritario, promedio ponderado o algunos algoritmos avanzados como el embolsado?

¿Cuáles son los algoritmos propuestos para la detección de revisiones falsas en el análisis de sentimientos?