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

Felicidades. Acabo de tirar su currículum en el montón de “no” y me estoy murmurando a mí mismo acerca de cómo los niños como usted son 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 agregue otro índice allí y todos sus 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 (tenga en cuenta cómo sigo usando esa palabra), encontrará que el proceso de la entrevista es sorprendentemente fácil. Estoy haciendo algunas preguntas sorprendentemente simples como “escribir FizzBuzz” o “¿JavaScript es un lenguaje funcional?” Hay algunas preguntas súper difíciles en la pantalla del teléfono que realmente no espero que recibas. Están allí para atraerlo sobre las cosas que aprenderá trabajando para mí.

Entonces, si no estoy arrojando 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 de escala de petabytes. Ahora que Google tiene a todos convencidos de que pueden buscar en Internet mientras 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 incluso en discos SAN de EMC me dice que no tengo suficiente rendimiento. Puedo pedir un hardware Infiniband más caro, pero no trabajo para Google. Tenemos un presupuesto aquí. Necesito encontrar una manera de tomar un montón de cajas baratas y lograr que funcionen juntas a velocidades interactivas. Una caja súper potente no puede hacerlo, pero tal vez un montón de IO en paralelo puede hacerlo.

Ahora todo lo que necesito hacer es pedirles a mis ingenieros que escriban un código de consulta en contra de esta estructura … Maldición. Uno de ellos solo trató de cargar todo el conjunto en la memoria y voló la pila en toda la infraestructura. Estamos haciendo retroceder su código. Él dice que el código funcionó en sus pruebas y no entiende por qué falló. Sacudo la cabeza, lo llevo a la pizarra y le explico que el concepto detrás de la memoria es como un depósito de datos que solo puede contener tanto. Un conducto directo (es decir, Streaming) está limitado solo por el tiempo (velocidad del movimiento de datos) en lugar de la capacidad.

Él dice que entiende y evitará ese error la próxima vez. Tal vez lo hará, que no lo hará. La capacidad mental para manejar problemas computacionales complejos es rara. Mucha gente exhibe 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 una lástima porque de lo contrario me gusta. Simplemente no puede hacer el trabajo.

Lo que debe comprender es que su actitud lo selecciona a sí mismo para trabajos que coinciden con sus ideas de lo que es la programación. Sin embargo, estos no son trabajos divertidos ni son los que pagan realmente bien. Tampoco es probable que haga algo realmente importante.

Si está de acuerdo con ser un programador mal pagado y eventualmente abandonar su profesión para hacer otra cosa, entonces no aprenda algoritmos y estructuras de datos. Si la ciencia de la computación te excita realmente y realmente, entonces sabes qué hacer.


Seguir

En primer lugar, ¡déjenme agradecer a todos por su abrumador interés en esta publicación! Incluso aquellos de ustedes que criticaron su contenido invirtieron en respuestas razonadas que han mantenido el diálogo. 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 esta publicación. 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 agarrar y comprender. Al igual que una película busca establecer una conexión con su espectador presentando una situación en forma “cruda”, ese 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 ves aquí. Por ejemplo, la última vez que hice que un ingeniero revisara un búfer de ArrayList en medio del código de transmisión, no corría el riesgo de ser despedido. En realidad es un buen ingeniero y no estaba pensando en este momento.

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

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

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

Me detendré 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ódigo escalable pero estaban entusiasmados con las oportunidades que se les presentaron. En algunos casos, estas personas estaban más motivadas a 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 argumentaron que mi experiencia es la excepción que prueba la regla. A lo que me gustaría señalar la sección sobre “actitudes de auto-selección”. La razón por la que a menudo tengo que contratar ingenieros menos calificados es porque compañías más grandes que la mía (Google, Orbitz, NavTec, SalesForce, etc.) están agotando a estos ingenieros tan rápido como pueden conseguirlos. 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 arriesgarme en la contratación y espero que la capacitación que brinde sea suficiente. Todos estamos recogiendo los restos que quedan y esperando poder forjar estas contrataciones en algo impresionante. Eso es bueno para los ingenieros de software, pero solo si está dispuesto a reconocer que la informática y entender cómo funcionan las cosas es importante. De lo contrario, te eliminarán en las pantallas del teléfono y probablemente nunca entiendas 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 en qué se va a meter, trabajo en el espacio de Healthcare Analytics. El código transaccional es fácilmente el 95% de la industria y donde se enfoca la mayoría de las bibliotecas y software disponibles. Analytics es el 5% y, por lo tanto, es mal atendido por un puñado de herramientas de BI. Esas herramientas tienden a fallar en mi industria porque nos preocupamos mucho por el detalle de los datos (es decir, los pacientes individuales) y utilizamos los resúmenes como mecanismo para encontrar esos casos y no como un fin para ellos mismos. Esto crea una serie de desafíos que podría seguir y seguir durante horas. Baste decir que tendrá que comprender la mente de los optimizadores de bases de datos, trabajará en motores de predicados personalizados a gran escala, desarrollará una lógica OLAP personalizada e irá de un lado a otro aterrorizado por la complejidad de problemas y triunfante cuando los resuelves.

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

A mi modo de ver, no son algoritmos lo 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 los murmullos del propietario del producto y crear una buena especificación técnica con una buena arquitectura e implementarla cuidadosamente, 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 hizo 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 implementa un algoritmo o una estructura de datos en un proyecto, pero aún se beneficia de comprender por qué y cómo funciona algo. 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 genial o un algoritmo usando primitivas C ++ STL, es probable que pueda reproducirlas usando Redis + LUA, o al menos saber qué podría hacer hipotéticamente al usarlas. Descubrí que conocer los límites inferior y superior te ayuda (como arquitecto) a tomar decisiones. Por ejemplo, si sabe que “podría ejecutarse en O (n) pero necesitaríamos 2 meses para construirlo y probarlo” y “podría ejecutarse en O (nlgn) usando un MySQL simple”, entonces ya sabe 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 competiciones a la industria fue el eje a lo largo del cual optimicé. 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, necesita un amplio vocabulario de patrones, y creo que aprendí muchos de ellos durante los estudios.

La ignorancia es ciertamente una dicha, mientras que el conocimiento es poder. Dicho esto, entiendo de dónde vienes. Normalmente, cuando no hemos utilizado algunos de los conceptos en nuestra vida cotidiana, no nos damos cuenta de la importancia de ello. 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 primeros usuarios. Tiene alrededor de 10 fragmentos que almacenan datos de usuario. Siendo inteligente, difunda sus datos a través de los servidores utilizando la filosofía habitual (clave% de conteo de servidores). Ahora su gerente se dirige a usted y le dice que algunos fragmentos se bloquean 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á en Google todo esto o se comunicará rápidamente con su amigo que sabía lo que él no sabía y leyó sobre algoritmos con mucha anticipación. Él te salvará la vida presentándote algo que se llama ‘hashing consistente’.

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

De la misma manera, alguien viene a usted y le habla de construir algo para programar trabajos de manera óptima. Ahora, siendo entusiasta de la estructura de datos y entusiasta / practicante de algoritmos, comprenda que está lidiando con un problema en el que el contenido de los datos (también conocido como trabajo) puede influir en el almacenamiento y la recuperación de los datos en el contenedor, por lo que automáticamente piensa en la prioridad colas

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

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

Muchos programadores jóvenes recorren la web tratando de encontrar respuestas a esta pregunta: ¿Cómo estudiar la estructura de Algoritmo y Datos? Ciertamente, 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 se trata de estructuras de datos y algoritmos.

¿Qué es un algoritmo?

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

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

Tomemos un ejemplo simple.

Cuando estaba en su segundo grado, aprendió el algoritmo para la suma de dos números. Tal vez su maestro 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. Se aprenden algunos algoritmos como la aritmética que acabas de ver. Algunos necesitan instrucciones escritas, digamos una receta para cocinar una hamburguesa. Y algunos otros, puede averiguar como buscar una dirección en un directorio.

Echemos otro vistazo a diferentes algoritmos.

Tiene una hoja de ruta y necesita encontrar el camino más corto desde el origen hasta el destino. Utiliza el algoritmo de “ruta más corta”. ( Puede usar Google para leer más sobre el algoritmo de Dijkstra ) .

¿Qué sucede si necesita ordenar una gran cantidad de datos? Puede usar cualquiera de los diversos algoritmos de clasificación.

Cuando se enfrenta a un gran problema, a menudo lo divide en partes, es decir, lo deconstruye y luego trabaja en él. Ese es un algoritmo codicioso para ti. Aquí, eliges lo que parece ser la opción más prometedora en ese momento. En estos casos, a sabiendas o sin saberlo usaste tu sentido común para encontrar la solución más optimizada mediante un método que aprendiste 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 de la vida real de un algoritmo. (Sé que ya tienes la idea. Pero no puedo evitarlo. Simplemente me parece muy emocionante).

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

Puede usar cualquiera de los siguientes para hacer esto.

  1. Puede usar el método de fuerza bruta donde visita a cada persona en el campus y pregunta si alguno de ellos es Clark Kent.
  2. Miras los datos de la universidad (que alguien ha recopilado usando el algoritmo anterior) y miras cada nombre en el directorio hasta que encuentras el nombre y la dirección correctos.
  3. Encuentra una lista de datos ordenados o un directorio, lo divide en dos partes y busca el nombre en la parte que probablemente contenga el nombre y obtenga la información de contacto.

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

¿Cómo se desarrollan los algoritmos?

Entonces, cuando crea un algoritmo, las siguientes son las preguntas que su algoritmo debe responder:

  • ¿Es útil mi algoritmo y resuelve el propósito?
  • ¿Utilizará los recursos de manera eficiente?

La gente aprende observando, al igual que 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. Las personas se dan 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 resolución de un problema y percibir la mejor solución, o usamos un algoritmo previamente conocido para resolverlo, utilizando así nuestros recursos de manera eficiente.

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

Siempre es importante entender cómo un algoritmo resuelve un problema. De lo contrario, nunca se puede ver 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 ser diferentes de 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 algoritmo, pero las reglas solas son inútiles hasta que tengan datos a los que puedan aplicarse.

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

Para gestionar todos los datos y abordar la complejidad de un problema, los científicos informáticos utilizan la técnica del Tipo de datos abstractos (ADT) para ver la imagen más grande 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 información irrelevante.

ADT es un modelo matemático donde los datos se ordenan en función de su comportamiento por parte del usuario. El modelo ADT no tiene en cuenta la implementación de esta información o la eventual construcción. Al proporcionar la abstracción, encapsulamos los datos que luego se procesan para un mejor uso.

Las estructuras de datos que tienen operaciones definidas para implementarse 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, estará confundido acerca de qué estructura de datos usar, como si usar una matriz o una lista vinculada para un problema dado. La comprensión de estructuras de datos y algoritmos a veces se siente innecesaria cuando usa las funciones de la biblioteca. Pero cuando comienzas a lidiar con nuevos problemas, se vuelve imperativo.

Si lees este increíble artículo, puedes aprender a codificar mediante programación competitiva. Le explica 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 se están apoderando de nuestro mundo y saber lo importante que es comprenderlos y aprenderlos.

Solo para reiterar, no se puede hacer una casa simplemente colocando un ladrillo sobre otro; necesita comprender un problema, su solución proyectada y una percepción de cómo va a resolverlo.

Puede leer otros blogs sobre algoritmos aquí: Algorithms Archives | Blog de HackerEarth

La razón principal, que es aplicable a todo lo que desea aprender, es no convertirse en un “principiante experto” (Cómo los desarrolladores dejan de aprender: el ascenso del principiante experto): alguien que se queda atrapado en malos hábitos que funcionan razonablemente bien al principio pero no puede avanzar a niveles avanzados.

Sin embargo, todos eligen ser expertos principiantes de diferentes maneras. Entonces, si tu trabajo es solo tu trabajo, elegir ser un principiante experto en esa área está bien. Aunque podría ser ridiculizado por “programadores reales”.

Algunos ejemplos de principiante experto “elegido”:

  • Jugar ping pong con forma incorrecta. No está dispuesto a ganar competencias en China, simplemente venza a sus compañeros de trabajo, por lo que no tiene sentido aprender “adecuadamente”.
  • Cocina. Si todo lo que quiere es una comida sabrosa, no hay razón para cuestionar tareas y números aparentemente arbitrarios en una receta. Solo síguelo.
  • Mantenerse dentro de su lenguaje y marco de programación preferido (y la cadena de herramientas específica de la compañía) para que siempre parezca ser el experto.
  • Peck tecleando realmente muy rápido a 50 palabras por minuto, pero no puede superar eso.

Personalmente, no veo el punto en los concursos de programación, creo que respeto a las personas que los hacen. También creo que estar sano es importante, pero tampoco hago triatlones ni concursos de artes marciales.

En algunas áreas de la vida, elijo ser un principiante, usando una bolsa de trucos baratos para parecer un experto, para satisfacer mi ego. En otros, apunto a niveles cada vez más altos de la actividad misma. Para alcanzar un nivel superior, aunque necesita comentarios críticos, el tipo que proviene del fracaso y, por lo tanto, las tareas más difíciles. A medida que adquieres más y más habilidades, es más difícil obtener estos comentarios y te quedas atascado. Tienes que buscar realmente las cosas difíciles.

Se puede pensar que el principiante experto se atasca accidentalmente o crea un entorno donde la retroalimentación negativa no lo alcanza.

Cuando contrato a personas, les pido que escriban una función, en Java, invirtiendo una cadena.

La mitad de la gente rechaza esa pregunta. Algunas personas incluso dicen que ya estudiaron y que no necesitan saber y salir enojados.

Luego les pido que escriban lo mismo de forma recursiva. La mitad de las personas restantes dicen que olvidaron porque en aplicaciones reales la recursividad nunca se usa.

Las bases de datos existen porque BTrees + existe. Alguien tiene que crearlos. Alguien tiene que resolver los errores.

Si inventa una mejor estructura de datos que BTree +, podría tomar por asalto el mercado de bases de datos. No si intenta venderlo a Oracle, pero sí si desarrolla su propio motor de base de datos.

El hecho de que algunos ingenieros acepten trabajar en trabajos que no requieren sus habilidades significa que hay una superpoblación de ingenieros para que reemplacen a los programadores, o que los ingenieros pueden resolver las cosas de la manera de ingeniería, pero prefieren crear programas malos porque no uno realmente se preocupa por la empresa.

El primero sería un problema de mercado y probablemente estés indefenso contra él.

La segunda es cuando los ingenieros no se enorgullecen de lo que hacen para ganarse la vida.

Sin embargo, una advertencia: tenga en cuenta que cada vez que decida aplicar una estructura de datos o algoritmo, podría surgir uno mejor. Debe asegurarse de que los usuarios de sus estructuras de datos o algoritmos solo vean una interfaz delgada que explica lo que se entrega, pero no saben cómo.

Esto es importante porque muchas veces he visto API que muestran los elementos internos de los algoritmos y las estructuras de datos. Cuando necesita cambiarlos, se han utilizado miles de veces, y necesita cambiar todo ese código, lo que lo hace casi imposible, o al menos increíblemente costoso.

Es como practicar artes marciales o hacer simulacros de incendio o tener un botiquín de primeros auxilios disponible, aunque no va a enfrentar accidentes todos los días, quiere estar preparado cuando realmente necesite usar una de esas habilidades ‘avanzadas’ para lidiar con ladrones / incendio / emergencia médica.

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

Mientras más practiques y aprendas una variedad de algoritmos, mejor serás al enfrentar problemas imprevistos, y tendrás la oportunidad de ser también un héroe (al menos en tu 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 / empresa en general.

Después de graduarme de la universidad, nunca había usado ninguno de los algoritmos avanzados (o incluso simples como buscar / ordenar, ya que está integrado principalmente en el lenguaje y todo lo que hago es llamar 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 Mysql no tan bien estructuradas. La gente lo usa por 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 interesantes y todavía recibir quejas al respecto a menudo.

Y sigo adelante y analizo lo que se puede hacer: crear una base de datos en memoria para evitar 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 temporal es simplemente ponerlos en cola, mejora en un nivel.
El problema ahora radica en cómo recupero los datos durante un período 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 las condiciones Mysql WHERE. 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, causaría latencias; seguramente no tiene sentido obtener todos los datos (que podrían ser significativamente altos) cada vez que el usuario quiere 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’, ‘fin’ en un tiempo casi constante.

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

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

Si hubiera estado aprendiendo algoritmos más complejos y estructuras de datos, 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 atascado en los óptimos locales.

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

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

Sí, es muy probable que en su trabajo, no pueda usarlos directamente tan a menudo como lo hizo mientras realizaba tareas y proyectos universitarios (que probablemente habían estado en uno de los algoritmos o clases relacionadas) que su profesor estaría haciendo un mal trabajo si no daba tareas y pruebas en algoritmos avanzados geniales)

Eres el mejor cuando sabes cosas que nadie más sabe.

Trabajo en una empresa de TI, donde la barrera de entrada no es muy estricta. No me entrevistaron sobre estructuras de datos complejas o algoritmos, ni otros empleados cuando se unieron. El 99.9% del trabajo que se realiza aquí puede ser realizado por cualquier graduado universitario con unos pocos meses de capacitación.

Pero de vez en cuando, nos encontramos con un problema que nadie puede resolver. Hace unas semanas fusionábamos dos fuentes de datos. Pero lo que no tomamos en cuenta fue que esas dos fuentes se llenaron manualmente durante muchos años. Ambos tenían muchos errores. A veces los nombres se deletreaban mal, otras veces las direcciones coincidían parcialmente. El único software que teníamos era MS Excel y dos exportaciones de la base de datos.

No me entrevistaron, pero afortunadamente conocía la programación dinámica, escribí una macro en la hoja y codifiqué la coincidencia de subsecuencia común más larga para esas dos hojas. Hice un trabajo que era imposible para el resto de mi equipo. Cuando me preguntaron cómo lo hice, intenté explicárselo, pero conocer los detalles de una sola vez es difícil, y probablemente este código nunca se mantendrá si me voy.

Usted es entrevistado sobre esos temas porque las compañías son sabias. Saben que de vez en cuando estarás en mi situación, y en ese momento saben que los “algoritmos complejos” son lo único que salvará sus proyectos.

En el mundo actual de API no es común que implementes la 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 mapa de hash que te da O (1) para inserción / búsqueda / eliminación. Ah, 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? Por lo tanto, utiliza un árbol binario y puede terminar con una implementación desequilibrada que es aún más lenta que usar solo una matriz de tuplas e iterarla. Tal vez un Red Black Tree es una mejor opción, está equilibrado, por lo que le da O (log N) para la inserción / búsqueda / eliminación y puede iterarlo mediante 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í, es posible que nunca pueda 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 resolver cualquier problema de ruta / distancia / proximidad / redes sin siquiera tener conocimientos básicos de Graph y BFS / DFS.

Sí: puede ganarse la vida desarrollando aplicaciones CRUD sin ningún conocimiento de algoritmos avanzados y estructuras de datos, al igual que podría 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 nada más allá de esas limitaciones sea inútil.

Entonces usted y sus amigos escriben código de muy alto nivel o muy malo. Si alguna vez ha escrito una Clase, ha * creado * una estructura de datos, ya que toda una estructura de datos es una organización de datos y un conjunto bien definido de funciones para actuar sobre esos datos.

Ahora, ¿por qué estudiar las estructuras de datos fundamentales y sus propiedades? Porque los estás usando todo el tiempo.

¿Puede decir que nunca utilizó una Lista <> o HashMap <>. en java? ¿Nunca usó un Diccionario <> en C #? ¿Nunca cambió una cola de argumentos en Javascript?

Estos son TODOS los usos de las estructuras de datos fundamentales. Y para escribir código que funcione bien, debe * comprender * sus características de rendimiento. Cualquiera que tenga que escribir código que de alguna manera tendrá que escalar necesita saber estas cosas.

Las Estructuras de datos pueden ser la clase más importante que puedes tomar en la universidad, y parece que no te contrataría ni a ti ni a tus amigos para ningún puesto para el que haya contratado.

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

Del mismo modo, 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. Pero, Aprender estructuras de datos / algos avanzados mejorará su fortaleza mental y lo preparará para sus trabajos diarios y le resultará muy fácil.

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 lento”, seguido de un código que hizo una búsqueda secuencial en una lista desordenada . Claramente, se trata de alguien que podría haberse beneficiado de una comprensión básica de la complejidad algorítmica y que 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 algoritmos “avanzados” realmente quieren decir por qué tengo que aprender algoritmos. 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 posibles personas (nodos). Tenía que asegurarme de que el gráfico no tuviera ciclos cuando se editó (no tenía ningún bucle para los no entrenados). Este es un problema que puede ser resuelto 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 buscando una respuesta en Google. Digamos que han pasado algunos años desde esa clase de algoritmos de pregrado y uno es 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 DFS. Alguien que no conociera la jerga buscaría “jerarquía sin bucles”, lo que llevaría a resultados muy pobres … Si finalmente logran suerte con un resultado, encontrarán más algoritmos que no conocen, como DFS. ¿Cuál será más productivo y será mejor compensado como resultado?

Los algoritmos y las estructuras de datos son principalmente técnicas y métodos para resolver un tipo específico de problema con ese método. Puede usar 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 su codificación diaria, obviamente necesita estos algoritmos y estructuras de datos probados y bien definidos. Esto es tan cierto como para las empresas tecnológicas también.

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 necesite buscar un usuario específico por su ID de nación, debe buscar en toda la matriz. Ahora conoce otra estructura de datos llamada Mapa, donde puede almacenar el número de identificación nacional de los usuarios como ‘clave’ y el nombre como ‘valor’. Se necesita mucho menos tiempo para buscar. Así que definitivamente Map sería tu mejor opción aquí.

Supongamos que hay una empresa de inicio que quiere crear una aplicación móvil que sugiera a los usuarios la súper tienda más cercana. ¿Cómo podrían implementar eso? Obviamente, necesitan usar algoritmos relacionados con ‘Graph Theory’ 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á apropiado para resolver este problema, cuáles son las ventajas y desventajas de los métodos de solución disponibles para este problema. Entonces sabrá en una situación de resolución de problemas 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 MAPA, un ÁRBOL, etc. y cosas por el estilo.

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

Los lenguajes y marcos de programación modernos le brindan la mayoría de los algoritmos listos para usar. Sin embargo, aprender algoritmos o, al menos, conocerlos personalmente ha 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 encontrar una solución.
2. Cuando me encuentro con un problema, me da la confianza de leer y comprender el código de otro desarrollador (tal vez una biblioteca de terceros de código abierto) y entender qué está pasando mal.
3. Cuando pienso en resolver un problema, tengo varias perspectivas más para evaluar y llegar a la solución más óptima.

Estás equivocado, mi amigo.

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 compañía en el frente de algoritmos avanzados. Y, donde no hay tal ejemplo, te daré un ejemplo de cómo una startup utilizó algoritmos para interrumpirlo.

Solo para comenzar:

  • Transporte local: Taxis- Uber. Mapeo geográfico, puntuación de entidades y coincidencia difusa para comenzar la lista.
  • F&B: Zomato / Foodpanda- geo-fencing y vls-colaboración de filtrado.
  • 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 minorista: Walmart : creación de tiendas inteligentes con optimización de disponibilidad de productos en tiempo real, optimización de carriles de pago por video, etc.

La cuestión 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 tanto, la exposición podría no estar allí. Además, encontrará que las personas que realizan estos trabajos tienden a recibir un salario relativamente alto en comparación con otras áreas de trabajo.

¡Eso debería ser suficiente motivación!

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

Para mí es obvio que una aplicación de este tipo 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, desde C a su arquitectura de máquina favorita, como ARM o x86). Necesitas una cultura algorítmica fuerte para eso. Escribir un pequeño compilador no optimizador es razonablemente fácil (vea tinycc o nwcc para ver ejemplos). Obtener un compilador de C 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 libre, calificados y de tiempo completo).

O desea codificar algunos DBMS (por ejemplo, como mysql o mongodb). Nuevamente, se requieren muchos algoritmos.

Si bien lo que califica como “avanzado” podría ser discutible, tuve la oportunidad de usar lo que muchos calificarían como estructuras de datos avanzados y / o algoritmos al menos media docena de veces en los últimos dos tres años. Y mi software no es ciencia espacial. Fuera de mi cabeza:

– un lexer para analizar encabezados HTML (escáner de texto recursivo)
– un algoritmo de acumulación bidimensional para imprimir una gran matriz con encabezados y garantizar que no se rompa ninguna fila / columna en dos páginas
– un algoritmo para colocar en mosaico cualquier imagen grande en una estructura piramidal de profundidad arbitraria (nivel de zoom), porque la imagen completa en sí misma no cabría en la RAM física disponible del dispositivo
– un analizador de transmisión de tres niveles de archivos DXF (Autocad) que funciona en espacio constante, sea cual sea el tamaño del archivo de entrada
– un emparejador de patrones eficiente para el envío de API REST del lado del servidor que acomoda partes variables, incluso cuando una cierta cantidad de fragmentos de URL variables deben coincidir solo cuando son idénticos
– un algoritmo de pinza giratoria para encontrar el área rectangular más pequeña del piso que contiene un conjunto de puntos fijos.

Y probablemente olvidé varios otros casos. El conocimiento de las estructuras de datos y los algoritmos (y quizás las estructuras de datos incluso más que los algoritmos), así como el análisis de su comportamiento asintótico es crucial para abordar problemas como ese de manera eficiente.

La mayoría de las veces, la pregunta “¿Cuándo voy a usar esto en el mundo real?” es la pregunta incorrecta que hacer. La mayoría de las cosas que aprendemos terminan siendo solo pequeñas partes de todo nuestro cuerpo de experiencia. 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 que te amarres los zapatos? Si no, ¿cuál fue el punto de todas esas cosas que aprendiste en el jardín de infantes?

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

Finalmente, si eres un programador que nunca usa algoritmos interesantes, quizás quieras pensar en encontrar trabajo en otro lugar que te permita hacer cosas interesantes.

Se utilizan algoritmos avanzados y estructuras de datos en la industria, ¿de dónde sacaste la idea de que no lo son?

Lo importante para recordar es que su trabajo en el mundo real no siempre es diseñar el algoritmo perfecto para el trabajo. Hay otras consideraciones, que incluyen su tiempo, el tiempo de otras personas y la sobrecarga de mantenimiento de 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 es a menudo lo único que tienen que hacer sobre el alcance y la complejidad del problema que estás resolviendo. Si escribes algo extremadamente complejo, harán una doble toma e intentarán entender por qué la situación justificó tal experiencia. Si, por otro lado, el problema podría haberse resuelto adecuadamente con un mapa listo para usar, acabas de perder el tiempo (en el futuro) y pensarán que eres un pinchazo 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á creando 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, verificando la existencia, optimizando sobre un conjunto de opciones para mostrar usando algoritmos bastante complejos. A menudo, estas optimizaciones nos brindan capacidades que de otro modo no existirían por completo, tanto desde el punto de vista tecnológico como comercial. Estas optimizaciones no le llegarán en la especificación que sigue y continuará pensando que ” los algoritmos avanzados y las estructuras de datos nunca se usan en la industria “. Simplemente continuará agregando grandes costos en términos de más y más servidores y continuará perdiendo oportunidades significativas.

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

Los algoritmos avanzados no se pueden usar de forma regular en muchos trabajos de desarrollo de software, pero hay muchos otros, incluido el mío, donde lo hacen.

More Interesting

¿Cuál es la mejor manera de encontrar la media de una secuencia en cualquier momento?

¿Cómo podemos verificar de forma recursiva si una lista vinculada individualmente es un palíndromo?

¿Es posible encontrar la identidad de una persona basada solo en el estilo de escritura?

¿Es mejor aprender estructuras de datos y algoritmos en C ++ o Java?

¿Cuál es el mejor algoritmo para implementar la función next_permutation sin STL?

En la visión por computadora, ¿el aprendizaje automático va a hacer obsoletos los algoritmos de aprendizaje no automático?

¿Un árbol de búsqueda binario permite un vértice duplicado?

¿Cómo podemos hacer un programa para encontrar la suma y el promedio de los valores de la matriz? ¿Por favor ayuda?

¿Qué libro de algoritmos introductorios debería leer una mente matemáticamente inclinada?

Tengo un muy buen conocimiento de C ¿Debo continuar con estructuras de datos o comenzar con C ++?

¿Debería un desarrollador autodidacta centrarse en algoritmos o proyectos paralelos para conseguir un trabajo?

¿Qué algoritmos de aprendizaje automático se usan hoy en medicina?

¿En cuánto tiempo puedo ser un profesional en la resolución de problemas en algoritmos y estructuras de datos si empiezo hoy sin ningún conocimiento previo?

¿Cómo demostramos que el algoritmo de codificación de Huffman es óptimo?

¿Cómo se escribe un programa que verifica todas las permutaciones de una cadena determinada y determina si es un palíndromo?