¿Por qué todos me dicen que aprenda la estructura de datos y los algoritmos si quiero obtener un trabajo de desarrollo de software?

¿Podemos aceptar que cuanto más rápido se ejecute un programa, mejor? Bueno.

Ahora, hipotéticamente, supongamos que su empleador tiene un servidor que realiza 10 operaciones por segundo. Supongamos también que el servidor le cuesta a su empresa $ 1 / segundo para ejecutarse. Usted, el ingeniero de software, tiene la tarea de escribir un programa simple para ordenar, digamos, 10’000 enteros.

Digamos que usa el tipo burbuja. La complejidad de tiempo de [math] O (n ^ 2) [/ math] hace que el proceso de clasificación tome 100′000′000 operaciones, lo que se traduce en más de 115 días de tiempo de servidor y $ 10′000′000 para su empleador.

También puedes usar la clasificación rápida. La complejidad del tiempo es [matemática] O (n log n) [/ matemática], que a su vez se traduce en ~ 132877 operaciones y 1 día y 12 horas de tiempo de servidor. Eso es $ 9.8 millones más barato, sin tener en cuenta los ahorros de tener resultados antes.

Ni siquiera hemos comenzado a hablar sobre otras características de los datos de entrada, como si están parcialmente ordenados. Simplemente el conocimiento de algoritmos puede hacer una gran diferencia en tiempo y costo de un programa. Según se informa, la desaceleración de 1 segundo en los tiempos de carga de páginas para Amazon le costaría a la compañía $ 1.6 mil millones en ventas por año [1].

Leí en alguna parte que es mucho más fácil hacer que la computadora sea más rápida utilizando estructuras de datos y algoritmos adecuados, que actualizar el hardware para que sea más rápido .

Ahí va la razón por la que necesita un conocimiento sólido de las estructuras de datos y algoritmos antes de poder obtener un trabajo de desarrollo de software.

Notas al pie

[1] Cómo un segundo podría costarle a Amazon $ 1.6 mil millones en ventas

Porque esas cosas son lo que son los programas, en todos los casos. ¿Desea mostrar una lista de cosas en una página web filtrada a través de algunos criterios? Eso es un ALGORITMO que recorre la ESTRUCTURA DE DATOS extrayendo la información deseada. La razón por la que aprende cómo funcionan estas cosas es porque desea hacer algo similar o poder elegir entre cosas prefabricadas de modo que realmente obtenga algo que funcione decentemente rápido sin requerir recursos excesivos.

Casi nadie implementa su propia “clasificación rápida”, nadie va y crea su propia tabla hash y / o lista enlazada. Todos (sin embargo) usan estas cosas, y la mayoría de nosotros hacemos cosas que usan técnicas similares para correr más rápido y / o usar menos memoria. Estas ideas son miles de veces más importantes para la velocidad y el uso de recursos que si estás compilando o interpretando, o usando un nivel C bajo en lugar de Python de alto nivel (o cualquier conjunto de idiomas que elijas).

Y no, no hay un algoritmo único que funcione bien en todos los casos. Tampoco hay una única estructura de datos como esa. El que es el “mejor” absoluto para la situación A es posiblemente (y a veces incluso generalmente) la elección incorrecta exacta para la situación B (aunque A y B se ve muy similar, solo difieren los detalles menores).

Entonces, si no comprende lo que sucede dentro de algos y ds, ni siquiera podrá seleccionar a qué llamar desde alguna biblioteca. No importa que pueda encontrarse con una situación en la que necesite implementar su propia estructura de datos debido a relaciones extrañas entre elementos de datos, o su propio algoritmo, de modo que busque datos relacionados con varios criterios. Es probable que termine con programas que se ejecutan lentamente hasta el punto de calcular algo que debería tomar segundos, mientras que necesita un centro de datos completo en lugar de ejecutarse directamente en un teléfono inteligente.

Hay una razón por la cual las estructuras de datos y los algoritmos están en el corazón de un plan de estudios de Comp Sci, que es la misma razón por la que Google y otros esperan que un programador o ingeniero de software sepa. ¿La razón? Las estructuras de datos y los algoritmos son la forma de resolver problemas del mundo real con las computadoras. Por problemas del mundo real, me refiero a algo más avanzado que 2 + 2. Incluso este es un ejemplo de algoritmos y estructuras de datos. Algoritmo: “agrega el número dos al número dos”. Estructuras de datos: 2 ubicaciones de almacenamiento de enteros para los sumandos y posiblemente una ubicación de almacenamiento de enteros para el resultado.

Un algoritmo es un conjunto prescrito de pasos necesarios para lograr un objetivo particular. La receta en el reverso de una caja de Mac & Cheese es un algoritmo simple. El estudio de algoritmos permite al desarrollador de software determinar métodos eficientes para resolver un problema dado.

Todo el propósito de una computadora es operar con datos. Una estructura de datos es solo una organización de datos que hace que los datos sean más comprensibles para el desarrollador y, con suerte, más eficientes para que la computadora los use. El estudio de las estructuras de datos permite al desarrollador de software organizar sus datos de manera tal que otros humanos puedan comprenderlos fácilmente y que las computadoras puedan procesarlos de manera eficiente.

Si no le gustan las estructuras de datos y los algoritmos, debería pensar seriamente en ingresar a un campo que no se ocupe de STEM (Ciencia, Tecnología, Ingeniería, Matemáticas).

Debido a la forma en que se configuran las entrevistas modernas, pero para escribir software real no es necesario “aprender estructuras de datos y algoritmos”, per se.

Bueno, debe aprender lo suficiente sobre algoritmos y estructuras de datos para implementar lo que quiera implementar. Si no quieres aprender más que eso, entonces no lo hagas, pero no todo es académico: es útil conocer los conceptos básicos de, por ejemplo, los algoritmos gráficos si resulta que lo que quieres hacer implica gráficos. Además, para saber que “gráficos” es lo que necesita saber, necesitaría haber completado una encuesta general sobre el terreno de la Tierra de las Ciencias de la Computación, el tipo que se obtiene de una educación universitaria, por ejemplo.

Pero sí sé de dónde vienes: no necesitas hacer una programación competitiva o incluso estar interesado en ella para escribir software real. (Personalmente, espero que todo esto resulte ser una moda y desaparezca, pero, en cualquier caso, es fácil de ignorar). Tampoco es necesario que “resuelva problemas de algoritmos” en la medida en que lo sé lo que quieres decir con problemas de algoritmos, de todos modos.

No estoy seguro de dónde viene todo esto para ser honesto, la fascinación con las preguntas de las entrevistas de estilo de concurso en lugares como Google y la idea que veo entre los jóvenes de que los lenguajes de programación son como elementos en las listas de verificación en las que necesitas escribir La ingeniería de software no es un cuestionario de la escuela secundaria y los lenguajes de programación no son casillas de verificación. Si desea centrarse en escribir software real, por supuesto, concéntrese en escribir software real.

Mi conjetura es que este tipo de visión del campo que veo entre los jóvenes ha surgido de la ubicuidad del acceso a Internet, la facilidad de acceso a herramientas / idiomas / compiladores, la facilidad de acceso a la información y el acceso a Internet. -la creencia implícita de la generación del nacimiento de que todo lo significativo hecho en el mundo digital debe hacerse públicamente y debe celebrarse instantáneamente con los pulgares hacia arriba y los gustos y demás. Si cree esto, entonces la programación solo puede ser cuestionarios y completar casillas de verificación porque la implementación de software no trivial real requiere mucho tiempo y mucho esfuerzo solitario no reconocido.

¿No quieres resolver problemas, hacer matemáticas, inventar algoritmos o usar estructuras de datos? ¿Qué tipo de programas planeas escribir? Casi todos los programas a una escala decente necesitan almacenar datos y necesitan un algoritmo para ejecutarse. Si puedes codificarlos, pero no se te ocurren, entonces serás un mono de código. A otras personas se les ocurren ideas y se las dan para que las implementen. El problema es que los monos de código no están en demanda.

  1. A menudo, cuando implementa un algoritmo, encuentra un error (como un caso límite omitido). Los monos de código no entienden lo que están escribiendo y, por lo tanto, no pueden atraparlo ni arreglarlo.
  2. Las personas que se les ocurre la idea suelen ser perfectamente capaces de implementarla por sí mismas y es menos probable que cometan errores al hacerlo.
  3. ¡Hay demasiados monos de código disponibles! Hubo un tiempo en que había una escasez de buenos programadores, por lo que a cada nuevo estudiante universitario se le dijo que aprendiera a codificar para garantizar un trabajo bien remunerado. La mayoría de estas personas no tenían la aptitud para hacerlo y ahora son monos codificados. Eso reduce el salario de los monos de código y perjudica su capacidad de ser contratado como uno solo. Claro, podrías ser el mejor mono de código, pero ¿cómo lo muestras? ¿Su currículum dice “tipos realmente rápidos”?
  4. Las empresas quieren contratar a alguien que traiga ideas originales. La mayoría de las necesidades de la mayoría de las empresas pueden subcontratarse fácilmente a un costo muy bajo.

Esto no significa que tenga que aprender sobre algoritmos y estructuras de datos específicamente para obtener un trabajo. Puede hacer algo más para demostrar que puede aportar nuevas ideas a la empresa. Quizás los algoritmos que usa no son avanzados, pero se le ocurren excelentes productos que puede hacer con algoritmos simples.

Aquí hay algunas razones:

  • Los problemas de algoritmo son para su trabajo diario lo que el levantamiento de pesas es para un atleta. Si quiere nadar por diversión, puede hacerlo sin levantar pesas. Si quiere mejorar, el levantamiento de pesas puede ayudarlo a esforzarse y evitar lesiones. Aprender y estudiar algoritmos es la forma más rápida de cubrir una gran cantidad de material y mantener tus sentidos agudos.
  • Las estructuras de datos y los algoritmos van de la mano. Voy a hacer otra analogía tonta: si escribir software es como conducir un automóvil por una pista (no lo es), el algoritmo es como la mejor línea de carreras y la estructura de datos es su automóvil. Algunas pistas son mejores para algunos autos y diferentes autos pueden tener líneas de carrera ligeramente diferentes dependiendo de su velocidad máxima, agarre, peso, etc. Sin preocuparse por el auto y la línea de carrera, probablemente todavía llegarás a la línea de meta, pero serás mucho más lento
  • Todas las entrevistas de ingeniería de software en algún momento tienen una parte de codificación. Y casi todas las empresas competitivas (Google, Facebook, Airbnb, etc.) confían casi exclusivamente en problemas de algoritmos.

Entonces, hablemos sobre lo que los algoritmos de aprendizaje pueden hacer por usted.

Los algoritmos que aprendió son un banco de conocimiento que puede empujarlo en la dirección correcta (o en una dirección) si está atascado. Lo considero un GPS interno que mejora a medida que aprende y practica más algoritmos.

Los algoritmos de aprendizaje son una forma rápida de mejorar porque puede comparar su código con otros. Cuando se trabaja en un proyecto, es casi imposible saber si su enfoque es el mejor porque nunca se ha hecho antes. Nadie ha resuelto su problema exacto en el código porque si lo hubieran hecho, no lo estaría escribiendo. Aprender y practicar problemas de algoritmos y ver cómo otras personas lo han resuelto le dará una increíble cantidad de información sobre otros posibles espacios de solución (algo que no me resulta fácil). Y a través de la comparación, comience a preguntarse qué soluciones son mejores y por qué.

Cuando compara su código con otros, comienza a sentir sus debilidades y luego sabe en qué mejorar o centrarse. Me siento humilde cada vez que veo una solución que es mucho más simple y eficiente que la mía (lo que sucede todo el tiempo). Estudiar su enfoque y comprenderlo lo convertirá en un mejor ingeniero de software.

En resumen, creo que estos son los beneficios de aprender algoritmos:

  • aprende sobre tus debilidades
  • aprender sobre otras formas de resolver un problema
  • mejorar a juzgar qué enfoque de un problema particular podría ser mejor
  • es menos probable que se quede atascado o caiga en una madriguera de conejo
  • casi con certeza dará lugar a una mayor compensación a largo plazo (desempeño o entrevista en una mejor compañía)

Y te dejo con una forma de pensar sobre algoritmos:

Los algoritmos son una tecnología en sí mismos. El objetivo de esta tecnología es minimizar el tiempo de ejecución y el uso de espacio para un conjunto de datos determinado. La notación Big O es la métrica para comparar qué tan bien funciona un algoritmo. Y esta tecnología es la base de la informática y la ingeniería de software.

¿De qué otra manera se ensuciaría las manos y escribiría programas sin algoritmos y estructura de datos? No es posible ser un desarrollador ni siquiera un ingeniero de software. También apestaba en matemáticas, hasta que decidí volver a aprender.

Hacer realmente código, es escribir un algoritmo para resolver algo.

Si no quieres eso, pega HTML y CSS y no más que eso

O

Cambia algo más que hacer.

Bueno, déjenme comparar el lenguaje de programación con el idioma inglés . Cualquiera puede leer y escribir en inglés si tiene conocimientos básicos de inglés. Pero, ¿alguien puede convertirse en novelista o autor en inglés?

Demonios no . Aquellos que tienen un gran conocimiento del inglés y saben manejar la gramática correctamente, solo pueden convertirse en novelistas o algo así.

Del mismo modo, cualquiera puede escribir código . Si alguien conoce la sintaxis básica de los lenguajes de programación, puede escribir código en ese lenguaje. Pero en el trabajo de desarrollo de software no se trata de escribir el código, sino de pensar.

Porque el lenguaje de programación es una forma de comunicarse con las computadoras. Básicamente su proceso de pensamiento funcionará como un programa de computadora.

Entonces, si necesita pensar bien en el desarrollo de software, debe comprender las estructuras de datos y los algoritmos . Eso te ayudará a escribir código eficientemente como un novelista en inglés. Espero que responda tu pregunta.

Las estructuras de datos y los algoritmos son fundamentales para cualquier programa que valga la pena. Si solo está programando por diversión, o en algún nivel de encuesta, no necesita implementarlos necesariamente. Sin embargo, es necesario al menos comprender las estructuras de datos básicos y los algoritmos para saber dónde usarlos correctamente.

La mayoría de los trabajos de desarrollo de software y proyectos requieren codificación de una forma u otra, a menos que esté trabajando únicamente en una herramienta basada en la interfaz de usuario (que también puede necesitar algunos antecedentes sobre codificación). Y a menos que comprenda los algoritmos y las estructuras de datos subyacentes, es difícil (si no imposible) encontrar un código que no solo funcione correctamente, sino que también se ejecute de manera más eficiente.

Esto subraya la importancia de estudiar estructuras de datos y algoritmos.

Si desea un trabajo de desarrollo de software, una gran parte de su trabajo será resolver problemas usando diferentes algoritmos. En algunos trabajos, las matemáticas serán una gran parte, pero diría que el 90% de los trabajos no requerirán habilidades matemáticas superiores, pero ayudarán. Si su objetivo es hacer que la interfaz de usuario funcione como desarrollador frontend, hay otras habilidades más importantes que los algoritmos y las matemáticas, pero sin saber cómo se hace el backend, probablemente no tenga tanto éxito.

La estructura de datos es mucho más que matemáticas.

Casi todo lo que hará hoy a nivel profesional como programador tendrá algo que ver con el acceso a la base de datos y la estructura de datos. El análisis de texto y frases es una gran parte de la estructuración y búsqueda de información útil. Yo diría que más allá de los conceptos básicos de aprender cualquier lenguaje de programación, se hizo un esfuerzo considerable para comprender las “expresiones regulares”.

He estado programando con Visual Basic durante casi quince años, y durante la mayor parte de ese tiempo solo he deseado tener una mejor comprensión de la estructura de datos y la interactividad de la base de datos. Aprendí SQL y eso fue enorme. Recientemente comencé a aprender PHP y eso usa un montón de SQL.

Para arquitecturas de datos que no son SQL como JSON y MongoDB, la estructura de datos es diez veces más importante que para las soluciones basadas en SQL. He programado numerosas calculadoras, procesadores de texto muy interesantes, juegos de cartas, simuladores, programas de dibujo, jugadores mP3 y docenas de aplicaciones científicas, pero también lo han hecho un millón de personas más. Las personas sin experiencia en datos realmente no tienen un lugar para agarrar los pies, ocupacionalmente, en un mundo en línea.

La mejor manera de aprender programación es escribiendo programas. Elige una tarea que quieras automatizar, escribe un juego simple, ¡simplemente sumérgete y comienza a programar!

Más tarde, cuando esté totalmente fascinado por la programación, probablemente verá la belleza y la eficiencia de los algoritmos clásicos y las estructuras de datos. Ese es un buen momento para sentarse y profundizar en toda la sabiduría recopilada que personas como Donald Knuth reunieron y documentaron tan juiciosamente.

¡Así que sumérgete! ¡Puede ser muy divertido!

Estas dos cosas son la base de la programación, supongamos que está creando un programa realmente grande, digamos Programa de cuenta bancaria y tiene que hacer todos estos métodos para el banco. Para facilitar su vida como programador y también para otras personas que leen su código, simplemente tiene que escribir un algoritmo para saber cómo comenzar esta clase.
Las estructuras de datos también son una parte fundamental de la programación, ya que tenemos que saber de qué manera vamos a organizar nuestros datos.
Entonces, al final, no es que necesite algoritmos para resolver problemas algorítmicos, sino que será más fácil cuando tenga que hacer un proyecto y no sepa por dónde comenzar. 🙂
Aunque eso es solo el poco conocimiento que tengo al respecto.

Esto es como preguntar por qué necesita aprender a usar llaves y alicates antes de convertirse en mecánico de automóviles. Debes ser competente con las herramientas del oficio antes de poder tener éxito. Las estructuras de datos y los algoritmos son la base de todo el desarrollo de software.

No puedo decirlo mejor que Niklaus Wirth: