Si los algoritmos avanzados y las estructuras de datos nunca se utilizan en la industria, ¿por qué aprenderlos?

En el mundo repleto de API de hoy en día, no es común que implemente una búsqueda rápida o binaria desde cero, ya que la mayoría de los algoritmos tradicionales se incluyen en cualquier API seria o biblioteca estándar. Pero ese no es el punto.

Primero, necesita saber cómo funcionan los algoritmos y las estructuras de datos al elegir cuál usar de una API. ¿Desea almacenar pares clave / valor en una estructura de datos? Sabes que puedes usar un Hash Map que te da O (1) para la inserción / búsqueda / eliminación. Oh, pero luego te das cuenta de que necesitas iterar los valores en cierto orden. ¿Sabes cómo funciona un Hash Map? ¿Cómo crece? ¿Cómo decide el algoritmo el orden de los elementos? ¿O es completamente al azar? Entonces, utiliza un árbol binario y puede terminar con una implementación desequilibrada que es incluso más lenta que usar solo una matriz de tuplas e iterarla. Tal vez un árbol negro rojo es una mejor opción, está equilibrado, por lo que le da O (registro N) para inserción / búsqueda / eliminación y puede iterarlo según el orden natural de la clave. Pero, ¿cómo va a tomar una decisión informada sin saber cómo funciona cada algoritmo y estructura de datos?

En segundo lugar, si está hablando de algoritmos de clasificación y similares, sí, nunca podrá implementar uno en la vida real, ya que la mayoría de las API vienen con una implementación altamente optimizada de algoritmos básicos. Pero intente implementar la predicción de texto sin saber cómo funciona un Trie, o resolviendo cualquier problema de ruta / distancia / proximidad / red sin siquiera tener conocimientos básicos de Gráficos y BFS / DFS.

Sí: puede ganarse la vida desarrollando aplicaciones CRUD sin ningún conocimiento de algoritmos avanzados y estructuras de datos, como si pudiera tener un módem de 56k en casa y decir que estoy “conectado” a Internet. Pero eso solo habla de las limitaciones con las que elegí vivir; no significa que cualquier cosa más allá de esas limitaciones sea inútil.

Porque hay formas, formas, más usos de algoritmos en los sistemas de los que cree. Alguien hizo un gran servicio al cotejar muchos de ellos, con enlaces de código fuente, incluso: Page en Stackexchange.

Participé en concursos de programación y también trabajo en la industria durante 6 años.

A mi modo de ver, no son los algoritmos que necesito en la vida cotidiana, sino la capacidad de analizar rápidamente el problema y encontrar una solución. Si puede resolver un problema de TopCoder en 2 minutos, o varios problemas difíciles en ACM en menos de 5 h, entonces es probable que pueda comprender el murmullo del propietario del producto y crear una buena especificación técnica con una arquitectura agradable y ponerlo en práctica de forma ordenada, mientras explica Defectos de la especificación funcional original para el propietario del producto de una manera integral y básica. Creo que estos 10 años de competencias de programación fue lo que marcó la diferencia entre ser programador y ser arquitecto.

Además, creo que comprender cómo se implementa un árbol B puede ayudarlo a comprender los problemas de rendimiento con su consulta SQL. Este es solo un ejemplo de situaciones en las que no implementas un algoritmo o una estructura de datos en un proyecto, pero te beneficias al entender por qué y cómo funciona algo. Yo diría que el conocimiento sobre algoritmos de compresión, algoritmos aleatorios, etc. también me ayudó más de una vez en el trabajo.

Además, si sabe cómo implementar una estructura de datos interesante o un algoritmo utilizando primitivas STL de C ++, es probable que pueda reproducirlo utilizando Redis + LUA, o al menos sepa qué podría hacer hipotéticamente al usarlos. Descubrí que conocer los límites inferior y superior, lo ayuda a usted (como arquitecto) a tomar decisiones. Por ejemplo, si sabe, “podría ejecutarse en O (n) pero necesitaríamos 2 meses para compilarlo y probarlo” y “podría ejecutarse en O (nlgn) utilizando un simple MySQL”, entonces sabrá exactamente qué hacer. . En cierto sentido, es como “algoritmos de aproximación”, pero el recurso principal son las personas y la capacidad de mantenimiento, y su adversario es el algoritmo OPT que aprendió en la universidad.

Creo que lo único que cambió cuando me mudé de la universidad y las competencias a la industria fue el eje en el que optimizo. Ya no es el tiempo y la memoria de la CPU, sino el tiempo y la memoria de los humanos: tiempo de implementación y costo de mantenimiento. Sin embargo, para encontrar una solución óptima de acuerdo con estas nuevas dimensiones, se necesita un amplio vocabulario de patrones y creo que aprendí muchos de ellos durante los estudios.

Esto es como un jugador de fútbol que pregunta “¿Por qué levantar pesas cuando un balón pesa menos de una libra?” El punto es entrenarse hasta el punto en que los problemas de algoritmos con los que realmente se encuentra son triviales, y puede dedicar sus recursos mentales a construir buenos sistemas en lugar de tratar de recordar cómo funciona la ordenación rápida.

Imagine que está escribiendo (desde cero) alguna aplicación que, dada la posición geográfica de su usuario (por ejemplo, la coordenada de GPS) le está dando una buena lista de buenos restaurantes.

Es obvio para mí que tal aplicación requiere muchos algoritmos difíciles. Lea Introducción a los algoritmos para tener una idea de ellos.

O tome otro ejemplo: desea escribir un compilador de optimización (por ejemplo, de C a la arquitectura de su máquina favorita, como ARM o x86). Necesitas una cultura algorítmica fuerte para eso. Escribir un pequeño compilador que no optimice es razonablemente fácil (mira tinycc o nwcc para ver ejemplos). Obtener un compilador C de fuerza industrial es realmente difícil (tanto Clang / LLVM como GCC tienen muchos millones de líneas de código fuente y comunidades de desarrolladores activos de cientos de desarrolladores de software gratuitos, calificados y de tiempo completo).

O desea codificar algunos DBMS (por ejemplo, como mysql o mongodb). Una vez más, se requiere una gran cantidad de algoritmos.

Muchos programadores jóvenes recorren la web tratando de encontrar respuestas a esta pregunta: ¿Cómo estudiar el algoritmo y la estructura de datos? Ciertamente, es un buen lugar para comenzar … Pero creo que una pregunta más relevante sería esta: ¿Qué son los algoritmos y las estructuras de datos, y por qué debería estudiarlos?

Algoritmo + Estructura de datos = Programa

La programación tiene que ver con estructuras de datos y algoritmos.

¿Qué es un algoritmo?

Wikipedia dice que “un algoritmo es un conjunto de operaciones paso a paso autónomo que deben realizarse. Los algoritmos realizan las tareas de cálculo, procesamiento de datos y / o razonamiento automatizado “.

No hay necesidad de entrar en pánico mirando estas palabras rígidas unidas. Tengo algunos ejemplos para ayudarte a entender. Y fácilmente también.

Tomemos un ejemplo simple.

Cuando estaba en segundo grado, aprendió el algoritmo para la suma de dos números. Tal vez su profesor no lo hubiera llamado algoritmo, pero aprendió reglas definidas para transformar la entrada, es decir, dos números, en la salida, que es la suma. Algunos algoritmos como la aritmética que acabas de ver son aprendidos. Algunos necesitan ser instrucciones escritas, diga una receta para cocinar una hamburguesa. Y algunos otros, puedes imaginarte como buscar una dirección en un directorio.

Echemos otro vistazo a los diferentes algoritmos.

Tiene una hoja de ruta y necesita encontrar la ruta más corta desde el origen hasta el destino. Se utiliza el algoritmo de “ruta más corta”. ( Puedes usar Google para leer más sobre el algoritmo de Dijkstra ) .

¿Qué pasa si necesita ordenar una gran cantidad de datos? Usted podría utilizar cualquiera de varios algoritmos de clasificación.

Cuando se enfrenta a un gran problema, a menudo se divide el problema en partes, es decir, se deconstruye y luego se trabaja en él. Eso es codicioso algoritmo para ti. Aquí, usted elige la opción más prometedora en ese http://moment.En estos casos, a sabiendas o sin saberlo, utilizó su sentido común para encontrar la solución más optimizada mediante un método que aprendió durante un período de tiempo. A diferencia de un programa que es un método específico, un algoritmo es un método general.

Aquí hay otro uso en la vida real de un algoritmo. (Sé que ya tienes la idea. Pero no puedo evitarlo. Simplemente lo encuentro muy emocionante).

Supongamos que sabes que Clark Kent es de hecho Superman. También sabes que estudia en tu universidad. Necesitas encontrarlo.

Puede hacer lo siguiente para hacer esto.

  1. Puede usar el método de fuerza bruta para ir a cada persona en el campus y preguntar si alguno de ellos es Clark Kent.
  2. Revisa los datos de la universidad (que alguien ha recopilado utilizando el algoritmo anterior) y mira cada nombre en el directorio hasta que encuentres el nombre y la dirección correctos.
  3. Encontrará una lista de datos ordenados o un directorio, la dividirá en dos partes y buscará el nombre en la parte que probablemente contenga el nombre y obtenga la información de contacto.

Mientras que el primer método le tomó un período de tiempo indefinido, el segundo estaba mejor organizado y tomó menos tiempo. El tercer método casi no lleva tiempo. Fue bastante fácil encontrar a Clark Kent y decirle que sabes que es Superman.

¿Cómo se desarrollan los algoritmos?

Entonces, cuando creas un algoritmo, a continuación están las preguntas que tu algoritmo debería responder:

  • ¿Es mi algoritmo útil y resuelve el propósito?
  • ¿Usará los recursos eficientemente?

La gente aprende observando, también los programadores. Aprendemos mirando la solución de otro o resolviendo el problema nosotros mismos. A través de la experiencia, encontramos un patrón definido para resolver cualquier problema en particular. La gente se da cuenta de que el proceso para resolver tareas similares es siempre el mismo. Y se acepta el que sea más eficiente y óptimo. Un conjunto de operaciones definidas por un procedimiento paso a paso para llegar a la mejor solución se denomina algoritmo.

Al estar expuestos a diversas técnicas y algoritmos de resolución de problemas, tendemos a identificar el patrón algorítmico de resolver un problema y percibir la mejor solución, o usamos un algoritmo conocido previamente para resolverlo, y de ese modo utilizar nuestros recursos de manera eficiente.

Finalmente, un algoritmo le indica cómo operar y resolver un problema.

Siempre es importante entender cómo un algoritmo resuelve un problema. De lo contrario, nunca puedes verlo desde una perspectiva más amplia. Todos los algoritmos no están destinados a todos los datos. Es decir, los datos para un “algoritmo de árbol” pueden verse diferentes a los de un “algoritmo gráfico”.

Para asegurarse de que un programador encuentre los datos correctos, debe comprender qué es la estructura de datos.

¿Qué es la estructura de datos y por qué estudiarla?

Una computadora es un conjunto de reglas lógicas. Estas reglas pueden denominarse un algoritmo, pero las reglas solas son inútiles hasta que tienen datos a los que se pueden aplicar.

La estructura de datos es una forma de almacenar y organizar los datos en la memoria para que puedan recuperarse y utilizarse de manera eficiente cuando sea necesario. Varias estructuras de datos se usan en diferentes aplicaciones y algunas están diseñadas para ser utilizadas solo para una tarea específica.

Para administrar todos los datos y lidiar con la complejidad de un problema, los científicos de computación utilizan la técnica del Tipo de datos abstractos (ADT) para ver el panorama general en lugar de solo la salida. Al crear modelos abstractos de datos, los científicos pueden usar formas mejores y más eficientes para resolver un problema en particular, en lugar de preocuparse por la información irrelevante.

ADT es un modelo matemático donde los datos se ordenan según el comportamiento del usuario. El modelo ADT no toma en consideración la implementación de esta información o la construcción final. Al proporcionar la abstracción, resumimos los datos que luego se procesan para un mejor uso.

Las estructuras de datos que tienen operaciones definidas para ser implementadas son ADT.

Elegir el conjunto correcto de estructuras de datos de cualquier base de datos para implementar un algoritmo es un componente clave para resolver un problema, sin el cual la información será incompleta o irracional.

Sin el conocimiento de la estructura de datos, no podrá organizar sus datos en un formato adecuado y eficiente. Sin el conocimiento de la estructura de datos, se sentirá confundido acerca de qué estructura de datos usar, como si usar una matriz o una lista vinculada para un problema dado. Comprender las estructuras de datos y los algoritmos a veces se siente innecesario cuando usa las funciones de la biblioteca. Pero cuando empiezas a lidiar con nuevos problemas, se vuelve imperativo.

Si revisas este increíble artículo, puedes aprender a codificar mediante programación competitiva. Le indica por qué necesita aprender conceptos de estructura de datos y algoritmo para obtener mejores resultados y comprender el problema rápidamente.

También puede leer cómo los algoritmos están dominando nuestro mundo y saber qué tan importante es entenderlos y aprenderlos.

Solo para reiterar, no puede hacer una casa simplemente colocando un ladrillo sobre otro: necesita tener un entendimiento de un problema, su solución proyectada y una percepción de cómo lo va a resolver.

Puedes leer otros blogs sobre algoritmos aquí: Archivos de algoritmos | HackerEarth Blog

Creé esta pequeña visualización animada de diferentes algoritmos de clasificación, principalmente para motivar a los estudiantes a aprender Algoritmos. Vea este [Visualización de algoritmos de clasificación], y puede agregar sus comentarios aquí.

Mirándolo de esta manera, es posible que no desee quedarse solo con algoritmos lentos / ineficientes en su conjunto de herramientas, con suerte.

La ignorancia es ciertamente una dicha mientras que el conocimiento es poder. Habiendo dicho esto entiendo de donde vienes. Normalmente, cuando no hemos usado algunos de los conceptos en nuestra vida cotidiana, no nos damos cuenta de la importancia de esto. Y un día, encontramos un problema, donde nuestros métodos tradicionales fallan, pero como no sabemos lo que no sabemos, nos enfrentamos a un momento difícil.

Considera esto, acabas de iniciar Facebook y tienes 100000 usuarios tempranos. Tienes alrededor de 10 fragmentos que almacenan datos de usuario. Siendo inteligente, distribuya sus datos a través de servidores utilizando la filosofía habitual (porcentaje de servidores clave). Ahora su gerente se acerca a usted y le dice que algunos fragmentos se están estrellando y / o la carga ha aumentado, por lo que es necesario agregar algunos fragmentos. En esta situación del mundo real, te darás cuenta de que, de hecho, la ignorancia no es felicidad. Buscará información en torno a esto o se comunicará rápidamente con su amigo que sabía lo que no sabía y leyó sobre los algoritmos con mucha antelación. Él salvará su vida al presentarle algo llamado ‘hash consistente’.

Entonces te darás cuenta de que hubiera sido genial si hubieras conocido este concepto desde el principio.

De la misma manera, alguien se acerca a usted y habla sobre cómo construir algo para programar trabajos de manera óptima. Ahora, como usted es un entusiasta de la estructura de datos y del algoritmo / practicante, tenga en cuenta que está enfrentando un problema en el que el contenido de los datos (también conocido como trabajo) podría influir en el almacenamiento y la recuperación de los mismos datos en el contenedor, por lo que automáticamente piensa en la prioridad. colas

Puedo dar toneladas de ejemplos como este en los que la cantidad de trabajo que hizo, porque ignoraba los conceptos, podría haberse reducido significativamente si conociera esos conceptos de primera mano.

En resumen, no es ‘SI’ puedes hacer el trabajo, lo que es importante, sino que se trata de ‘CÓMO’ lo haces … Y ese ‘CÓMO’ proviene de la curiosidad por ‘POR QUÉ’ …

La mayoría de las veces, la pregunta “¿Cuándo voy a usar esto en el mundo real?” es la pregunta incorrecta a hacer La mayoría de las cosas que aprendemos terminan como pequeñas partes de todo nuestro cuerpo de expertos. Por lo general, es mejor preguntar “¿Resuelve esto un problema que vale la pena resolver?”.

Comience desde el principio: ¿alguna vez le han pedido que use un crayón para colorear dentro de las líneas de una imagen en su trabajo? ¿Alguna vez te han pedido atarte los zapatos? Si no, ¿cuál fue el punto de todo lo que aprendiste en el jardín de infantes?

El punto es que te ayudaron a dominar otras tareas, y las que te ayudaron con otras cosas, y muy pronto eres un ser humano útil.

Finalmente, si eres un programador que nunca usa algoritmos interesantes, deberías pensar en encontrar trabajo en otro lugar que te permita hacer cosas interesantes.

Los algoritmos y las estructuras de datos son en su mayoría técnicas y métodos para resolver un tipo específico de problema con ese método. Puede utilizar un método muy costoso (en términos de memoria y espacio utilizado por el programa) para resolver un problema o puede usar un algoritmo conocido para resolverlo de manera eficiente y menos costosa. Para la codificación del día a día, obviamente necesita estos algoritmos y estructuras de datos probados y bien definidos. Esto también es cierto para las empresas de tecnología.

Como ejemplo, suponga que necesita almacenar el número de identificación nacional de las personas junto con el nombre de su organización. En un enfoque muy simple, puede almacenarlo en dos matrices paralelas o en una matriz 2D. Pero cada vez que necesita buscar un usuario específico por su ID de nación, debe buscar en toda la matriz. Ahora ya conoce otra estructura de datos llamada Mapa, donde puede almacenar el número de identificación nacional de los usuarios como la “clave” y el nombre como el “valor”. Se necesita mucho menos tiempo para la búsqueda. Así que definitivamente Mapa sería tu mejor opción aquí.

Supongamos que hay una nueva empresa que quiere crear una aplicación móvil que quiera sugerir a los usuarios la tienda más cercana. ¿Cómo podrían implementar eso? Obviamente, necesitan usar algoritmos relacionados con la ‘Teoría de grafos’ y otros algoritmos de optimización para la búsqueda instantánea y una mejor experiencia de usuario.

Los algoritmos y las estructuras de datos no son cosas para memorizar como una hoja de trucos. Los algoritmos de aprendizaje y la estructura de datos le enseñarán cómo clasificar un problema, qué método será el adecuado para resolverlo, cuáles son los pros y los contras de los métodos de solución disponibles para este problema. Entonces, en una situación de resolución de problemas, sabrá cuáles son las mejores opciones para usted. A partir de ese conocimiento, puede decidir fácilmente cuál será su mejor opción, como: almacenar sus datos locales entre un ARRAY muy simple, un MAP, un ÁRBOL, etc., y cosas por el estilo.

Puede encontrar las compensaciones entre los enfoques cuando realmente los conoce.

Porque podría ser útil algún día, y si no lo sabe, no puede aplicarlo.

Los lenguajes y marcos de programación modernos le ofrecen la mayoría de los algoritmos listos para usar. Sin embargo, los algoritmos de aprendizaje o, al menos, conocerlos han ayudado mucho de varias maneras:

1. Cuando un usuario dice – esto se siente lento. Este conocimiento me ayuda a comprender los cuellos de botella en el código y a encontrar una solución.
2. Cuando tengo un problema, me da la confianza de leer y entender el código de otro desarrollador (tal vez una biblioteca de terceros de código abierto) y entender qué está mal.
3. Al pensar en resolver un problema, tengo varias perspectivas más para evaluar y llegar a la solución más óptima.

Estás equivocado, amigo mío.

Hagamos un ejercicio. Elige una industria. Cualquiera, de hecho. Mire a los grandes jugadores tradicionales y le daré un ejemplo de lo que está haciendo esa empresa en el frente del algoritmo avanzado. Y, donde no hay tal ejemplo, te daré un ejemplo de cómo un inicio usó algoritmos para interrumpirlo.

Sólo para empezar:

  • Transporte local: Taxis- Uber. El mapeo geográfico, la puntuación de la entidad y la coincidencia aproximada para iniciar la lista.
  • F&B: Zomato / Foodpanda- geo-fencing y vls-filter de colaboración.
  • Comercio electrónico: Amazon / Flipkart (India), etc. motores de recomendación a gran escala, optimización de la cadena de suministro (LP), etc.
  • Telecom: AT&T Labs: uno de los mayores lagos de datos del mundo: múltiples bases de datos SQL / noSQL con estructuras de datos optimizadas para consultas
  • Venta al por menor: Walmart : construcción de tiendas inteligentes con productos en tiempo real, optimización de la disponibilidad en el estante, optimización de la línea de salida de video, etc.

El problema es que la cantidad de personas que están trabajando para resolver este tipo de problemas es muy pequeña en comparación con el resto de la fuerza laboral, por lo que la exposición podría no estar presente. Además, encontrará que las personas que realizan estos trabajos tienden a ser relativamente remuneradas en comparación con otras áreas de trabajo.

¡Eso debería ser suficiente motivación!

Por la misma razón, por qué uno va al gimnasio.
En la vida real, nunca podrás levantar los objetos con forma de mancuerna, ni tendrás la oportunidad de hacer flexiones en una barra horizontal. En la vida real obtendrás bolsas pesadas, cilindros de cocina para levantar (o incluso chicas lindas para levantar;)). El objetivo del gimnasio es prepararse para el mundo real desarrollando su fuerza física.

De manera similar, en el mundo de la programación, es posible que no siempre tenga la oportunidad de implementar un árbol AVL para indexar sus columnas de base de datos. Sin embargo, el aprendizaje de las estructuras de datos avanzadas / algos mejorará su fortaleza mental y lo preparará para sus trabajos diarios y le llegará muy fácilmente.

Creo que esta pregunta puede responderse simplemente de la siguiente manera: claro, puede llevarse bien como programador promedio.

¿Pero no quieres al mejor programador en tu campo?

Si es así, la revisión de algos, estructuras de datos y mejores prácticas de ingeniería de software lo ayudarán mucho a lograrlo.

Aquí hay una pregunta que vi ayer en un tablero de mensajes de programación de Chrome: “Estoy tratando de comparar una docena de URL con una lista de 10,000 URL, pero es muy lenta”, seguida de un código que realizó una búsqueda secuencial en una lista desordenada. . Claramente, esta es una persona que podría haberse beneficiado de una comprensión básica de la complejidad algorítmica, y necesitaba una búsqueda binaria y mapas hash en su caja de herramientas. Estos no son avanzados de ninguna manera, pero a menudo, las personas que se burlan de los algoritmos “avanzados” realmente significan por qué tengo que aprender algoritmos en absoluto. No seas esa persona …

Actualizar
Incluso en las aplicaciones corporativas más mundanas, el conocimiento de los algoritmos es útil. Por ejemplo, tuve que implementar un sistema para definir una jerarquía de aprobación para un proceso. Fue un proceso de aprobación de siete pasos o más, con cientos de personas posibles (nodos). Tuve que asegurarme de que la gráfica no tuviera ciclos cuando se editó (no tenía ningún bucle para los no entrenados). Este es un problema que se resuelve fácilmente por alguien que ha completado un curso de algoritmo de pregrado, no tan fácil para alguien que no lo ha hecho.

Incluso tendrá un problema en Google para una respuesta. Digamos que han pasado algunos años desde esa clase de algoritmo de pregrado y uno está un poco confuso sobre cómo hacerlo. Al menos saben buscar términos como “gráfico dirigido sin ciclos” o “verificar si un gráfico es un DAG”, y rápidamente encuentran múltiples soluciones que involucran algoritmos más básicos, como el DFS. Alguien que no conocía la jerga buscaría “jerarquía sin bucles”, lo que llevaría a resultados muy pobres … Si al final tuvieron suerte con un resultado, encontrarán más algoritmos que no conocen, como el DFS. ¿Cuál será más productivo y, como resultado, se compensará mejor?

Felicidades. Acabo de tirar su currículum vitae en la pila de “no” y me estoy murmurando a mí mismo acerca de cómo son ustedes como ustedes lo que está mal en esta industria y por qué tengo que volver a capacitar a cada ingeniero que contrate. Probablemente pienses que las bases de datos también son mágicas. Simplemente lanza otro índice allí y todos tus problemas están resueltos, ¿verdad?

¿Por qué estoy haciendo esto? ¿Soy solo un viejo gruñón al que le gusta poner obstáculos arbitrarios frente a posibles contrataciones?

La respuesta es todo lo contrario, de hecho. Si ha estudiado y es un ingeniero capacitado (observe cómo sigo usando esa palabra), encontrará el proceso de la entrevista sorprendentemente fácil. Estoy haciendo algunas preguntas increíblemente simples como “escribir FizzBuzz” o “¿JavaScript es un lenguaje funcional?” Hay algunas preguntas súper difíciles en la pantalla del teléfono que en realidad no espero que entiendas. Están ahí para seducirte sobre las cosas que aprenderás trabajando para mí.

Entonces, si no estoy lanzando barreras arbitrarias en el camino, ¿qué estoy haciendo?

La respuesta es que estoy diseñando sistemas para proporcionar respuestas analíticas a partir de datos a escala de petabyte. Ahora que Google tiene a todos convencidos de que pueden buscar en todo el Internet a medida que escriben, tengo que proporcionar un rendimiento similar en mi aplicación web.

Lograr esto es increíblemente difícil. Una simple búsqueda de las especificaciones en incluso los discos SAN de EMC me dice que no tengo suficiente rendimiento. Puedo solicitar un hardware Infiniband más caro, pero no trabajo para Google. Estamos en un presupuesto aquí Necesito encontrar una manera de tomar un montón de cajas baratas y hacer que funcionen juntos a velocidades interactivas. Una caja súper poderosa no puede hacerlo, pero tal vez un montón de IO en paralelo puede hacerlo.

Ahora todo lo que debo hacer es pedir a mis ingenieros que escriban un código de consulta en contra de estas estructuras … Maldición. Uno de ellos acaba de intentar cargar todo el conjunto en la memoria e hizo estallar la pila en toda la infraestructura. Estamos retrocediendo su código. Está diciendo que el código funcionó en sus pruebas y no entiende por qué falló. Sacudo la cabeza, lo llevo a la pizarra y explico que el concepto detrás de la memoria es como un depósito de datos que solo puede contener mucho. Un canal directo (es decir, transmisión) está limitado solo por el tiempo (tasa de movimiento de datos) en lugar de la capacidad.

Él dice que entiende y evitará ese error la próxima vez. Tal vez lo hará, puede que no lo haga. La capacidad mental para manejar problemas computacionales complejos es rara. Muchas personas exhiben el potencial, pocos se dan cuenta. Especialmente en este mundo de ideas tontas como “¿por qué necesito aprender estructuras de datos y algoritmos?”

Puede que finalmente tenga que despedirlo. Lo cual es muy malo porque de lo contrario me gusta. Él simplemente no puede hacer el trabajo.

Lo que necesita comprender es que su actitud es auto seleccionarlo para trabajos que coincidan con sus ideas de lo que es la programación. Sin embargo, estos no son los trabajos divertidos ni son los que pagan realmente bien. Tampoco es probable que hagas algo verdaderamente importante.

Si está de acuerdo con ser solo un programador de baja remuneración y finalmente salir de su profesión para hacer otra cosa, entonces no aprenda algoritmos y estructuras de datos. Si la ciencia de la computación realmente te excita, entonces sabes qué hacer.


Seguir

En primer lugar, permítanme darles las gracias a todos por su gran interés en esta publicación. Incluso aquellos de ustedes que fueron críticos de su contenido invirtieron en respuestas razonadas que han mantenido el diálogo en marcha. Me siento honrado de estar en el centro de un tema tan importante.

En segundo lugar, me gustaría dirigirme a aquellos de ustedes que expresaron su preocupación por la dureza de este post. Cuando decidí responder, quería algo más impactante que las respuestas anteriores. Algunas de las respuestas fueron muy buenas, pero ninguna de ellas tenía una conexión visceral que una persona joven pudiera comprender y comprender. Al igual que una película trata de establecer una conexión con su espectador al presentar una situación en forma “en bruto”, así fue mi objetivo con esta publicación.

Otra forma de preocupación que recibí fue que esta era una historia literal. Por favor, comprenda que esto es solo una destilación de las situaciones con las que trato. Todas las circunstancias específicas han sucedido, pero no en el orden que se ve aquí. Por ejemplo, la última vez que hice que un ingeniero revisara un búfer ArrayList en medio de un código de transmisión, no corría el riesgo de ser despedido. En realidad, es un ingeniero bastante bueno y no estaba pensando en este momento.

Su código fue capturado en la revisión de código y no llegó a producción. Le di capacitación a él y a sus colegas sobre la reserva de datos para ayudarlos a internalizar mejor el concepto con la esperanza de evitar el mismo error nuevamente.

Despidiendo a las personas es una cosa difícil. Tienes que empezar con “¿qué estoy haciendo mal?” y “¿cómo puedo solucionar la situación?”. Por lo general, implica un largo proceso de tratar de encontrar a la persona en la que se encuentra y encontrar estilos de aprendizaje que funcionen para ellos. Mucha gente responde al buen liderazgo y la capacitación. Algunos parecen estar más allá de mi propia capacidad de alcanzar.

Dado que el enfoque está en tratar de no contratar malos ajustes en primer lugar, la mayoría de los que he tenido que descartar son malos ajustes para mi equipo (es decir, problemas sociales que no mejoran) o no retienen las cosas que aprenden durante más tiempo. el largo plazo La última situación es difícil para mí como un líder empático porque parece que mejorarán antes de volver a sus niveles anteriores de rendimiento. Afortunadamente es una circunstancia rara, pero sin embargo conmovedora.

Pararé aquí para decir que algunos de los mejores ingenieros que he tenido fueron aquellos que tenían poca experiencia en la creación de códigos escalables pero que estaban entusiasmados con las oportunidades que se les presentaron. En algunos casos, estos individuos estaban más motivados para aprender y mejorar que alguien que se cree confiado en sus propias habilidades. Está lejos de ser una regla dura y rápida; Solo una observación interesante.

Tercero, noté que algunos que argumentaron que mi experiencia es la excepción que confirma la regla. A lo que me referiría a la sección sobre “actitudes de autoselección”. La razón por la que a menudo tengo que contratar ingenieros menos capacitados es porque las empresas más grandes que la mía (Google, Orbitz, NavTec, SalesForce, etc.) están minando a estos ingenieros tan rápido como pueden obtenerlos. Big Data ha creado una demanda MASIVA de ingenieros calificados que ha resultado en un déficit general en el mercado. Es por eso que tengo que tomar riesgos en la contratación y esperar que la capacitación que ofrezco sea suficiente. Todos estamos recogiendo los restos que quedan y esperamos poder forjar estas contrataciones en algo impresionante. Eso es bueno para los ingenieros de software, pero solo si está dispuesto a reconocer que Ciencias de la Computación y entender cómo funcionan las cosas bajo la cubierta es importante. De lo contrario, será eliminado en las pantallas del teléfono y probablemente nunca entenderá por qué.

Finalmente, algunos de ustedes han expresado interés en trabajar en el entorno que describí. Estoy contratando en este momento, así que no dude en ponerse en contacto conmigo si se encuentra en el área de Chicago y cree que es una buena opción.

Para darle una idea de lo que va a hacer, trabajo en el espacio de Healthcare Analytics. El código transaccional es fácilmente el 95% de la industria y se concentra en la mayoría de las bibliotecas y software disponibles. Analytics es el 5% y, por lo tanto, está mal atendido por un puñado de herramientas de BI. Esas herramientas tienden a caer en mi industria porque nos preocupamos mucho por los detalles de los datos (es decir, los pacientes individuales) y utilizamos resúmenes como un mecanismo para encontrar esos casos en lugar de como un fin para ellos mismos. Esto crea una serie de desafíos que podría seguir y seguir durante horas. Basta con decir que tendrá que entender la mente de los optimizadores de bases de datos, estará trabajando en motores de predicados personalizados a gran escala, desarrollará lógica OLAP personalizada y pasará de un lado a otro entre sentirse aterrorizado por la complejidad de Problemas y triunfantes cuando los resuelves.

Es como practicar artes marciales o hacer simulacros de incendio o tener disponible un botiquín de primeros auxilios; aunque no va a enfrentar accidentes todos los días, debe estar preparado cuando realmente necesite usar una de esas habilidades “avanzadas” para tratar con ladrones / bomberos / emergencias médicas.

La mayoría de las razones por las que debería aprender algoritmos avanzados, incluso si no las usa “aparentemente” en la vida cotidiana en la industria, ya se responden aquí. Las cosas clave son: la capacidad de hacer un buen balance y una elección informada (según el rendimiento, la complejidad de la implementación, el modelo de uso del producto y el tiempo de entrega).

Cuanto más practique y aprenda la variedad de algoritmos, mejor será para enfrentar problemas imprevistos, y también tendrá la oportunidad de ser un héroe (al menos en su mundo profesional)

Me gustaría agregar un ejemplo personal de cómo los algoritmos de conocimiento pueden ser útiles, para usted como individuo y para el equipo / compañía en general.

Después de graduarme de la universidad, nunca había usado ninguno de los algoritmos avanzados (o incluso los simples como buscar / ordenar, ya que está casi integrado en el lenguaje y todo lo que hago es llamar a la función incorporada) durante casi 4 años.

Y de repente estoy viendo una característica (que muestra datos de series de tiempo) basada en consultas de MySQL no tan bien estructuradas. La gente lo está utilizando durante mucho tiempo, pero todos se quejan de vez en cuando de que es lento. Pero no les importa mucho ya que no detiene su trabajo.
Ahora, mi equipo y yo pensamos: deberíamos hacer algo al respecto. Después de todo, a nadie le gusta desarrollar cosas geniales y aún recibir quejas al respecto con frecuencia.

Y continúo y analizo lo que se puede hacer (se me ocurrió usar una base de datos en memoria) para evitar las latencias de disco, que se pueden distribuir en varias máquinas.

Saber que la forma más rápida de almacenar datos ordenados de una serie de tiempo es simplemente ponerlos en cola, mejora en un nivel.
El problema ahora radica en cómo recuperar datos para un segmento específico de tiempo solicitado por el usuario. El sentido común dicta, solo la búsqueda binaria ‘inicio’ y ‘final’ del segmento de tiempo en la base de datos y devuelve todos los valores intermedios. Pero este db en memoria no proporciona suficiente funcionalidad como Mysql DÓNDE condiciones. Necesito implementarlo por mi cuenta.

Y sabiendo que tengo que obtener esos datos de una máquina que no es la misma que la del servidor web, uno podría causar latencias; seguramente no tiene sentido obtener todos los datos (que podrían ser significativamente altos) cada vez que el usuario quiera una porción de Datos y luego ejecutar la búsqueda binaria.

Así que se me ocurrió un algoritmo genial (que es esencialmente un híbrido de búsqueda binaria + búsqueda de interpolación), que busca ‘inicio’, ‘final’ en un tiempo casi constante.

En realidad, se encuentra entre O (1) y O (registro N) (búsqueda binaria en el peor de los casos), pero la mayoría de las veces da un resultado en O (registro de registro N), límites de interpolación, pero parece constante, ya que el registro de registro N es una función de crecimiento extremadamente lento. por ejemplo, log log (1 trillón) es un poco más de 5, mientras que log log (100,000) es un poco más de 4, se ve casi constante.

El hecho de que pudiera pensar en esta solución fue porque conozco los algoritmos y cómo puedo aprovechar las buenas cosas para crear soluciones más interesantes.

Si hubiera estado aprendiendo algoritmos y estructuras de datos más complejos, podría haberlo hecho aún mejor, pero no sé si podría haberlo hecho, porque no sé más cosas. ¿Ves cómo esto se vuelve cruel? Como dijo Sanjoy Das, te quedas atrapado en óptimos locales.

No saber una cosa es mucho más paralizante que saber algo y luego no usarla, porque no necesita usarla.

EDITAR:
Usted está totalmente equivocado acerca de que algo avanzado no se usa en la industria. De hecho, hay algo mucho más avanzado en la industria que el que se encuentra en los libros de texto. La mayoría de ellos, por supuesto, no están bien documentados o se guardan como secreto guardado.

Sí, es muy probable que en tu trabajo, no puedas usarlos tan a menudo como lo hiciste mientras realizabas tareas y proyectos universitarios (que probablemente habían estado en uno de los algoritmos o clases relacionadas) que tu profesor haría. un mal trabajo si él no dio asignaciones y pruebas en algoritmos avanzados geniales)

Los algoritmos y las estructuras de datos avanzados SE UTILIZAN en la industria, ¿de dónde surgió la idea de que no lo son?

Lo importante a recordar es que su trabajo en el mundo real no siempre es diseñar el algoritmo perfecto para el trabajo. Existen otras consideraciones, incluido su tiempo, el tiempo de otras personas y la sobrecarga de mantenimiento de un código innecesariamente sofisticado. El software no es solo un lenguaje para comunicarse con el hardware, también es un lenguaje para comunicarse con otros desarrolladores en el futuro. Lo que escribes a menudo es lo único que tienen para continuar sobre el alcance y la complejidad del problema que estás resolviendo. Si escribe algo extremadamente complejo, harán una doble toma y tratarán de entender por qué la situación justifica tal experiencia. Si, por otro lado, el problema podría haberse resuelto adecuadamente con un mapa listo para usar, simplemente has perdido su tiempo (en el futuro) y pensarán que eres un imbécil arrogante.

Cuantas más estructuras de datos y algoritmos conozca, más herramientas tendrá para elegir al elegir la herramienta adecuada para el trabajo. Eso no significa que cada problema necesitará una herramienta compleja para resolverlo.

Su declaración está lejos de la verdad. Más aún si está construyendo sistemas utilizados por un gran número de personas y el código debe ejecutarse en sus servidores. Por ejemplo, aceleramos tareas aparentemente simples como la coincidencia de cadenas, la comprobación de la existencia, la optimización de un conjunto de opciones para mostrar mediante algoritmos bastante complejos. A menudo, estas optimizaciones nos brindan capacidades que, de otro modo, no existen por completo, tanto desde el punto de vista tecnológico como empresarial. Estas optimizaciones no aparecerán en la especificación que sigue y continuará pensando que ” los algoritmos avanzados y las estructuras de datos nunca se utilizan en la industria “. Solo continuará agregando grandes costos en términos de más y más servidores y continuará perdiendo oportunidades significativas.

Además, ayuda en gran manera a comprender las optimizaciones y algoritmos utilizados por las herramientas que utiliza cuando su sistema se ejecuta a gran escala. A menudo, esa comprensión es la diferencia entre elegir la herramienta perfecta y elegir algo que te fallará rápidamente.

Es posible que los algoritmos avanzados no se utilicen de manera regular en muchos trabajos de desarrollo de software, pero hay muchos otros, incluido el mío, en los que sí.