¿Debo seguir invirtiendo en estructuras de datos y algoritmos? [cerrado]

28

En estos días, estoy invirtiendo mucho en estructuras de datos y algoritmos e intento resolver algunos acertijos de programación.
Estoy tratando de codificar y resolver con Java y Clojure.

¿Estoy perdiendo el tiempo? ¿Debería invertir más en tecnologías y marcos que ya conozco para obtener un conocimiento más profundo (los detalles) y poder codificar con ellos más rápidamente?

Al estudiar estructuras de datos y algoritmos, ¿voy a ser un mejor programador o esas materias solo son importantes durante los años universitarios?

Quirón
fuente
55
¿Con qué estructuras de datos y algoritmos está trabajando? ¿En qué acertijos de programación los estás usando?
oosterwal
Estoy trabajando / todavía estoy trabajando en tablas de hash, mapas, montones, gráficos, árboles y los algoritmos que lo acompañan (atravesar, trocear, buscar, insertar, eliminar y algunos algoritmos de clasificación). Los rompecabezas son de las competencias TopCoder y Google Code Jam.
Quirón

Respuestas:

24

Es completamente posible pasar la mayor parte de su carrera haciendo un trabajo significativo y útil, con un conocimiento mínimo de algoritmos y estructuras de datos.

El nivel mínimo de conocimiento para algoritmos y estructuras de datos, para tener éxito, requerirá que:

  • tenga en cuenta la mayoría de ellos (incluida la lectura de los nuevos ocasionalmente a medida que salen)
  • saber dónde encontrar implementaciones buenas, probadas y que funcionen
  • poder comparar algoritmos y su utilidad
  • poder copiar correctamente uno de un ejemplo de código abierto a su entorno específico, con un pequeño ajuste

No hay * máximo * . Si lo desea, puede llevar su estudio al nivel de doctorado y más allá. Su utilidad está directamente relacionada con el tipo de trabajo que le interesa tener y con el tipo de trabajo que le parezca más interesante y gratificante.

Dicho esto, como una guía aproximada (pero no absoluta), cuanto más bajo, más intensivo en recursos y menos automatizado sea el lenguaje, el marco y la aplicación en la que esté trabajando, mayor será el nivel de habilidad requerido cuando se trata a algoritmos y estructuras de datos. Por ejemplo, la implementación del algoritmo de Ukkonen en el ensamblaje probablemente, pero no necesariamente, significa que querrá una comprensión a nivel de maestría del algoritmo y las estructuras de datos involucradas.

En su situación específica, al pasar de un entorno de desarrollo de Java a trabajar en los iOs, en igualdad de condiciones, espere una demanda ligeramente mayor en su comprensión general de algoritmos y estructuras de datos. Querrá poder ejecutar de manera eficiente en un dispositivo con menos recursos disponibles. Además, espere agregar un par de categorías nuevas a su arsenal; sobre todo, querrá saber más sobre la administración de memoria.

blueberryfields
fuente
2
Totalmente de acuerdo. Casi nunca tengo que lidiar con algoritmos directamente ya que la gran mayoría de los necesarios ya están incluidos en las bibliotecas básicas. Pero estaría en problemas si no entendiera las características de rendimiento lo suficiente como para elegir el algoritmo o la estructura adecuados para un caso de uso particular. OP, a menos que desee trabajar en algoritmos, puede obtener un retorno de la inversión mucho , mucho mejor por el tiempo dedicado a aprender otras bibliotecas, herramientas y técnicas.
quentin-starin
1
Ugh, escribir el algoritmo de Ukkonen en Python es bastante difícil, incluso puedo comenzar a imaginar hacerlo en conjunto.
rjzii
2
Esto cae dentro del punto de "comparar algoritmos", pero solo quería aclarar que debes conocer la compensación entre la complejidad del espacio y el tiempo. Muchos algoritmos que se usan comúnmente en los escritorios debido a su velocidad pueden no ser factibles en iOS porque requieren grandes estructuras de datos.
Karl Bielefeldt
3
Estoy en desacuerdo. La razón simple es cuando alguien pasa tiempo aprendiendo Algoritmos o Diseño o Arquitectura, no se trata solo de cuándo / dónde lo va a usar. Simplemente hace que la persona sea más inteligente y podría usar el aprendizaje mientras resuelve otros problemas. También fomenta la sensación de hacer las cosas de manera óptima. Por ej. Puede que no haya un Algoritmo hecho a mano para todo, pero como sabes muchas cosas, puedes tener algo excepcional por tu cuenta.
Geek
14

Nah Si recién está comenzando, intente entrar en cosas generales como la programación de la interfaz de usuario y eso simplemente lo detiene. Eventualmente, necesita ir allí y aprender marcos más grandes ... cómo usar las estructuras de datos y los algoritmos que otras personas han escrito. Cuando recién está comenzando, es bueno atenerse a problemas de alcance limitado.

Los algoritmos y las estructuras de datos son básicamente la base de todo, aunque probablemente nunca escriba uno propio una vez que haya pasado la etapa de principiante. Conocerlos, o al menos haberlos conocido, lo convertirá en un mejor desarrollador al final. Sabrá cuándo y por qué usar cada uno porque sabrá CÓMO funcionan. Además, hacer que sus algoritmos y estructuras de datos sean genéricos para que puedan funcionar con cualquier tipo o tipo con la interfaz X realmente ES algo que usará para el resto de su carrera.

Veo a muchas personas saltar a cosas como Qt que terminan haciendo preguntas que muestran cero conocimiento de C ++ (por ejemplo). Están tratando de omitir demasiados pasos y al final les lleva más tiempo aprender. Yo diría que estás en el camino correcto.

Edward extraño
fuente
He estado haciendo programación Java profesionalmente (estoy empleado, quiero decir) desde 2007. Ahora voy (al menos eso espero) a hacer un desarrollo de iOS.
Quirón
9

No estás perdiendo el tiempo.

Si, en el curso de su trabajo, necesita usar una herramienta o marco que no haya usado previamente, lo aprenderá y lo usará.

Sin embargo, si necesita utilizar una estructura de datos o un algoritmo que no haya utilizado anteriormente, es probable que ni siquiera sepa que existe, y resolverá su problema utilizando una técnica horriblemente subóptima que requiere mucho más. esfuerzo y escalas terriblemente.

Lo que estoy tratando de decir es que este es el tipo de cosas que no solo aprenderás haciendo, debes aprenderlo aprendiendo , ya sea en una situación académica o mediante una inversión personal de esfuerzo, ya que estás haciendo ahora

Carson63000
fuente
6

En la práctica, tenga en cuenta cuáles son las estructuras de datos disponibles, cuáles son sus características de complejidad, dónde obtener buenas implementaciones de ellas y dónde guarda su copia de Introducción a los algoritmos para buscar los detalles más adelante.

smithco
fuente
1

Si eso es lo que te hace feliz, entonces definitivamente debes seguir con eso. Si le preocupa no aplicar suficiente teoría, considere un proyecto con mucha teoría. Cree un lenguaje de programación pequeño, como Poción , desde cero. Una implementación completa utilizará tablas Hash, gráficos, árboles y una gran variedad de algoritmos. Si parece interesante, puede profundizar en la optimización, la generación de código nativo o la extensibilidad del usuario.

Te convertirás en un mejor programador cuando te mantengas interesado y enfocado, no cuando trabajes en proyectos que parecen prácticos pero un poco aburridos.

¡Abajo la madriguera del conejo, Dorothy!

Roger escaso
fuente
1

Pasé mucho tiempo hackeando C / C ++ con OpenGL. Conozco los idiomas y la API bastante bien ... y me he convertido en un desarrollador y programador razonable debido a esa experiencia. Dicho esto, el conocimiento algorítmico real requerido para resolver varios problemas encontrados solo realmente he sido capaz de comprenderlo.

Hablando desde la experiencia personal, centrarse en la creación de aplicaciones será una pérdida de tiempo si no conoce la teoría detrás de los dominios de problemas relacionados con lo que está tratando de construir.

Para muchos tipos diferentes de software, estos dominios se derivarán de los fundamentos que aprende al estudiar algoritmos, además de su propia teoría específica basada en nichos (por ejemplo, álgebra lineal en gráficos de computadora, teoría de números / información en criptografía, etc.).

No necesariamente tiene que convertirse en un mago computacional detrás de todo, pero hacer lo que estaba haciendo en el momento de esta publicación es un camino muy, muy necesario para seguir al menos una vez en el viaje de programación, independientemente de si No son autodidactas.

sobre blanco
fuente
0

Supongo que si no los conoces bien, no encontrarás razones para usarlos. Parece que encuentro usos para ellos todo el tiempo. Pero tengo que admitir que con las mejoras en genéricos en la última media docena de años más o menos, la necesidad de rodar el suyo ocurre cada vez con menos frecuencia. Eso aún no elimina los beneficios de saber cómo y cuándo usarlos y pueden simplificar enormemente el código que de otra manera sería complicado.

Remojar
fuente