¿Los ingenieros de software de Google, Amazon, etc. utilizan estructuras de datos y algoritmos en el desarrollo de aplicaciones en tiempo real?

Sí, los ingenieros de software de las empresas de software de primer nivel utilizan estructuras de datos y algoritmos en el desarrollo de sus aplicaciones. Es raro que necesite implementar algo estándar y complejo desde cero. Sin embargo, debe conocer el algoritmo y la existencia de la estructura de datos, para poder incluirlo en su diseño.

Por ejemplo, supongamos que estoy escribiendo un servicio web que maneja transacciones de un servicio web front-end. Necesito tener colas locales, posiblemente colas prioritarias, para priorizar las solicitudes de transacciones que recibo. Necesitaré bloqueos y bloqueos para cualquier estructura de datos local. Necesitaré algoritmos de consenso confiables (o bibliotecas que implementen estos) para hacer que los datos persistentes sean confiables ante fallas de almacenamiento. Necesitaré comprender la escalabilidad y la complejidad computacional de mi servicio y algoritmos (en términos de big-O) para saber cuándo necesito comenzar a limitar mi entrada.

Construcciones como conjuntos de hash, mapas, mapas múltiples, matrices, listas se utilizan constantemente. Para los servicios especializados, termina profundizando en otros dominios, como tablas de hash distribuidas para servicios punto a punto, pruebas de seguridad de conocimiento cero, opciones de cifrado para autenticación y autorización. análisis de componentes conectados para seguimiento táctil, aprendizaje automático para reconocimiento de gestos, etc.

Es bueno, limpio, divertido.

Permítame hacerle una pregunta. Todos hemos aprendido acerca de los cálculos básicos en nuestra infancia y luego todos fuimos en diferentes direcciones, diferentes campos, diferentes líneas de carrera. Entonces, ¿usas matemáticas básicas en tu vida cotidiana?
Si es así, ¿cómo? Puede ser actor, médico, ingeniero o cualquier cosa, pero su profesión no lo exige, ¿verdad?

Espero que lo entiendas ahora. Se requerirá lo básico de un campo o secuencia en cualquier lugar y en cualquier lugar, sin importar en qué nivel trabaje. Sí, algunos conceptos básicos son comunes a todos, como las matemáticas básicas (suma, resta …), mientras que algunos son específicos del campo, como en el caso de las estructuras de datos y algoritmos de los ingenieros de software.

Cualquier sistema se basa únicamente en conceptos básicos y lógicos. Es por eso que se llaman conceptos básicos y, obviamente, son los fundamentos sobre los que debe tener un comando y aprender a fondo. Descanso, es solo un arte de codificación (en el caso de ingenieros s / w)

Creo que lo que realmente quiere preguntar es “¿Necesita saber cómo implementar una estructura de datos o un algoritmo desde cero?”

La respuesta a esa pregunta generalmente es no, casi nunca necesitará escribir el código de implementación para una estructura de datos genérica o algoritmo. En su mayoría, terminará usando las bibliotecas estándar del idioma en el que está trabajando. Eso se hace para poder reducir las preocupaciones en la base del código. es decir. Ahora hay un lugar menos donde las cosas pueden salir mal.

Pero sí, debe saber CÓMO se implementa una estructura de datos o algoritmo . Esto es necesario para que pueda hacer un buen juicio sobre qué estructuras de datos y algoritmos usar cuando se enfrenta a un problema en particular. Un caso común es el de los algoritmos de clasificación. Si sabe que la clasificación de combinación y la clasificación de montón son más rápidas que la clasificación de inserción para el caso promedio, siempre terminará utilizando la clasificación de montón o la clasificación de combinación. Pero suponga que sabe que sus datos estarán casi ordenados, entonces Heap o Merge funcionará mucho peor que Insertion Sort. No podría haber aprovechado este hecho si no conociera los detalles de implementación.

En cuanto a Google, ¿Amazon usa estos?

No sé acerca de Google o Amazon, pero he trabajado en cuatro bases de código principales, Mozilla Firefox, GNOME Music, Microsoft Visual Studio Code y OpenLiveWriter (una bifurcación OSS de Windows Live Writer) y no encontré una implementación codificada con una sola mano de un algoritmo conocido. Usamos las bibliotecas estándar y nos animaron a hacerlo para minimizar la cantidad de lugares donde las cosas podrían salir mal.

NOTA: Si tiene inquietudes adicionales, no dude en comentar y actualizaré mi respuesta.

Aprender “estructuras de datos y algoritmos” es mucho más que simplemente saber cómo implementar una lista vinculada y construir un árbol rojo-negro (o al menos debería hacerlo en la mente de los programadores).

El tipo de habilidad algorítmica de resolución de problemas requerida en el desarrollo de aplicaciones en tiempo real es poder ver la estructura de datos nueva y única y las tareas computacionales asociadas con su característica.

Tomemos el ejemplo del mundo real del programa de creación musical de Propellerhead, Reason .

Reason le ofrece un estudio virtual en una caja donde puede diseñar su propio diseño de estudio virtual y conectar sus dispositivos como mejor le parezca.

Si está familiarizado con la teoría de gráficos , se preguntará de inmediato, entonces, ¿qué sucede cuando ha creado un bucle de dependencia, mediante el cual el dispositivo A proporciona salida a una cadena de dispositivos que eventualmente retroalimenta al dispositivo A? ¿En qué orden debe procesarlos?

Con solo un ciclo de retroalimentación no es tan difícil. Lo que hace que la pregunta sea más compleja es que puede haber múltiples bucles de retroalimentación que se cruzan entre sí, y el orden en que procese los dispositivos determinará el retraso total del sistema, ya que un bucle de retroalimentación requiere que una de las conexiones se retrase y procese en el siguiente iteración de procesamiento.

Puede ir aún más lejos, ya que Reason ahora tiene una “compensación de retraso del complemento”, que compensa los diferentes retrasos introducidos por los dispositivos para alinear diferentes pistas entre sí. Esto es importante en la producción musical ya que no desea que su pista de batería esté desalineada con su pista de bajo porque tienen diferentes efectos en su cadena de procesamiento.

Otro problema en tiempo real es optimizar la ejecución de aplicaciones en máquinas virtuales.

Durante más de 10 años, JavaScript se ejecutó lentamente en relación con otros lenguajes de programación. Eso fue hasta que Google salió con V8 (que alimenta Node.js).

V8 se parece mucho a la JVM (Java Virtual Machine), y utiliza métodos como el análisis de escape que funciona donde puede evitar el uso del recolector de basura para administrar la vida útil de una variable, y también compila el método para una máquina eficiente código.

No resolverá este tipo de problemas reimplementando la clasificación rápida. Necesitará tener una idea de la teoría de grafos y algoritmos más complejos como el flujo mínimo y poder detectar problemas NP-difíciles. Necesita la capacidad de percibir la estructura y la complejidad de la característica deseada y descubrir los algoritmos usted mismo.

Hablé con un desarrollador de software brillante sin esta base sobre la posibilidad de transformar el código C ++ para que todas las variables estáticas y el estado (incluida la asignación y la desasignación) se accedieran a través de variables de clase o método para cumplir con una especificación estricta, y simplemente no pudieron inicialmente percibimos incluso la mera posibilidad de que pueda resolverse.

Si tiene una base en la teoría de grafos, esto es bastante trivial. El problema no tiene nada que ver con solo saber cómo crear una lista vinculada, crear un árbol rojo-negro o revertir cadenas.

No tendrá que resolver este tipo de problemas con frecuencia, pero cuando lo hace y no hay una biblioteca, vale la pena saber cómo hacerlo.

La respuesta corta es no. Solo, no es suficiente.

Sin embargo, es obligatorio.

Asumiré que está solicitando el rol de Ingeniería de Software, ya que no está especificado y esa parece ser la tendencia que sigue la gente. Definitivamente tiene que conocer varias estructuras de datos y cuándo / cómo / por qué usar cada una en un escenario específico, y necesita saber cómo crear algoritmos para resolver problemas.

El seguimiento obvio de esto es que necesita saber cómo codificar. No sirve de nada descifrar un algoritmo en una entrevista si no puede codificarlo y, por ejemplo, nunca he fallado en encontrar un algoritmo para ningún problema en ninguna entrevista, pero he fallado una o dos entrevistas porque Tuve algunos pequeños errores en mi código, principalmente problemas de mayúsculas y minúsculas.

Entonces, una vez que tenga el algoritmo, primero debe conocer el enfoque general para codificarlo, y esto podría no ser trivial porque algunos algoritmos son realmente difíciles de codificar: deténgase y piense cuál es la mejor manera de codificarlo, porque para la mayoría de los problemas hay más de una forma, y ​​lo que es más, estas formas pueden diferir en el tiempo de ejecución y en realidad podrían no ser el mismo algoritmo. Después de eso, debe haber practicado suficiente codificación previamente para saber cómo codificar en una pizarra sin un compilador, y debe saber cuándo usar funciones integradas y no escribir código que ya se ha escrito y perder tiempo (STL y Java las funciones ayudarán mucho).

También debe saber cómo probar su código y determinar en qué casos de esquina podría no funcionar su código y dar cuenta de eso.

Además de eso, su código debe ser limpio y ordenado, y lo más importante, legible.

Eso cubre lo básico y te da una buena oportunidad. Hay una cosa más, en mi experiencia. Algunas de las compañías anteriores hacen algunas preguntas precisamente para ver qué tan hábil eres en cierto idioma. En Google, me hicieron una pregunta que no se puede resolver a menos que conozca la sobrecarga del operador y los functores (C ++) solo para probar cuánto sabía el idioma. La pregunta en sí no tenía ningún algoritmo detrás, solo era codificación. También me hicieron preguntas similares en otras entrevistas.

Para la parte final, y esto depende de la función y la empresa que solicita, es posible que necesite conocer el diseño del sistema, que es mucho más que solo estructuras de datos y algoritmos, e incluye temas como bases de datos y escalabilidad, replicación / consistencia de datos /una

disponibilidad y más … Esta es otra faceta del proceso de entrevista y requiere un tipo diferente de preparación de las estructuras de datos y algoritmos. Verifique la respuesta de Jimmy Saade a ¿Cómo consigo un trabajo en Facebook o Google en 6 meses? para ver lo que aconsejo para este tipo de preparación (está en “Diseño del sistema”) y también para la preparación general de entrevistas.

Por supuesto, no encontrará una sola empresa de tecnología que no use esto, algoritmos. Primero veamos lo que se nos enseña en DATA STRUCTURE, tenemos clasificación, búsqueda en listas vinculadas y árboles y gráficos. En todos estos simplemente jugamos con números usando algoritmos. Tenemos un algoritmo para encontrar la ruta más corta. Todos estos temas son utilizados por cualquier empresa como Amazon o Google. Cuando buscamos algo en estos sitios, deben seguir algún algoritmo y cuando la lista se prepara, también se organiza mediante un algoritmo. Cuando escribimos una palabra en Google, obtenemos la mayoría de los temas buscados relacionados con esa palabra, que también utiliza un algoritmo de clasificación. Entonces la ESTRUCTURA DE DATOS es básica. Incluso en los documentos de la puerta, Evrey, año 3, al menos se esperaba de DS.

¡LA RESPUESTA DE ESPERANZA SERÁ ÚTIL!

Hashing, sí mucho, y además de eso, si no directamente esto, entonces la aptitud analítica construida a través de estos se utiliza para crear mejores productos que cambian la vida.

Sí, por supuesto, es una estructura básica para el programa