¿Necesito entender algoritmos y estructuras de datos para ser llamado programador? [cerrado]


37

Han pasado seis años desde que he estado codificando. Codificación en todo tipo de cosas como ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, etc. He utilizado matrices, mapas, listas vinculadas, conjuntos, etc. y donde trabajé personas como yo. Pero cada vez que me entrevistan es muy probable que la gente me haga preguntas sobre hashes, árboles, pilas y colas. Algunas preguntas son sobre el malabarismo de algunos algoritmos de clasificación. No sé si realmente debería conocerlos o si debería dejar de llamarme programador. Hay algo en mí que también me dice que incluso si las personas que hacen todas estas preguntas me seleccionan, nunca me harán trabajar en estas cosas. ¿De verdad estoy obligado a saber todo esto?


10
Eso depende de dónde trabaje y a quién le gustaría llamarle programador.
Tim

1
Sí, si sin adjetivos negativos.
duros

Respuestas:


79

Si todo lo que sabes hacer es escribir código de pegamento, puedes llamarte un mono de código. Se debe escribir una gran cantidad de código de pegamento y puede ganarse la vida como un mono de código. Para llamarse a sí mismo Real Programmer TM y ser confiable cuando el código debe escribirse desde cero, debe conocer algoritmos, estructuras de datos, administración de memoria, punteros, lenguaje ensamblador, etc. y comprender cómo usar este conocimiento para evaluar las compensaciones.


66
Wow, a mitad de camino esperaba que esto fuera votado en el olvido por personas excesivamente políticamente correctas por usar el término "código mono".
dsimcha

15
"software simian" es siempre la terminología preferida
STW

3
No estoy totalmente de acuerdo. El tipo de software que se está escribiendo "desde cero" afecta en gran medida quién es capaz de escribirlo. Algunos programas requieren una sofisticación inherentemente menor (o mayor) que otros.
Nick Spreitzer

8
+1, 20% porque estoy de acuerdo, 5% por "Real Programmer TM" y 75% porque aprendí el lenguaje ensamblador y quiero fingir que valió la pena
Carson Myers

3
La mayoría de los trabajos existentes solo requieren 'monos de código'. Es normal que las personas en trabajos de 'mono de código' tiendan a olvidar todo su conocimiento previo, convirtiéndose en un poco más de 'mono de código' todos los días, a pesar de su potencial. :(
cag

32

los que no conocen la historia están condenados a reinventarla


75
En realidad, aquellos que no conocen la historia están condenados a reinventarla usando los métodos O (N 2) u O (N 3) en lugar de usar los métodos O (N log N) conocidos que tienen la edad suficiente para comprar alcohol en los 50 estados.
John R. Strohm

@John ROFLMAO: ¡demasiado cierto!
Steven A. Lowe

3
... están condenados a volver a comprometerse

30

Bueno, trabajar en un lenguaje como JavaScript hace que esto sea bastante obsolote, ya que una matriz es una mezcla entre un vector, un hash y un árbol y se puede usar como una pila o cola. Es muy poco probable que alguna vez necesite o pueda implementar una estructura de datos en JavaScript que supere a la clase Array. Este es también el caso en PHP.

Para Java OTOH, hay una diferencia. Supongo que la biblioteca estándar de Java le proporciona cualquier estructura de datos que necesite. Sin embargo:

  1. Debe conocer y distinguir esas estructuras de datos y comprender cómo funcionan en diferentes situaciones para poder elegir la correcta.
  2. En Java, no es absolutamente improbable que eventualmente desee escribir su propia implementación para un hashmap para obtener una mejor velocidad en un caso muy específico (por ejemplo, si las teclas que desea manejar llenan algunas restricciones especiales que permiten la optimización).

Cuando se trata de ordenar algoritmos, no hay mucha necesidad de conocerlos o entenderlos, porque no hay necesidad de implementar uno solo. Sin embargo, si se le proporciona dicho algoritmo, debería poder comprenderlo e implementarlo.

Dos cosas son ciertas:

  1. Usted puede hacer una carrera como programador sin depender de los conocimientos de esta manera.
  2. Es definitivamente no le hará daño a conocerlos.

Las estructuras de datos y los algoritmos son simplemente una cosa, eso es bueno de entender. Y es algo extremadamente claro y formalizado y, por lo tanto, bastante trivial en comparación con las complejidades de la aplicación o la ingeniería de sistemas. Son solo una pequeña pieza en el rompecabezas, pero son fáciles de entender, si está dispuesto a invertir algo de tiempo.

Entonces, no, no los necesita, pero solo sería para su beneficio conocerlos.


13

Esta podría ser una ocasión en la que puede haber una distinción semánticamente significativa entre 'programador' e 'ingeniero de software'. En este contexto, específicamente, vemos que usted tiene conocimiento de varios lenguajes de programación y tecnologías relacionadas y que puede usarlos para producir los resultados deseados. Esta es una buena definición operativa de "programador de computadoras".

Me considero un ingeniero de software. En la mayoría de los aspectos cotidianos de mi trabajo, probablemente hago las mismas cosas que tú. Uso lenguaje de computadora y tecnologías relacionadas para producir el resultado deseado. Sin embargo, sí entiendo las estructuras de datos y los algoritmos, y considero que el conocimiento es una base fundamental de mi capacidad para hacer mucho más.

A menudo, aunque no todos los días, mi trabajo consiste en encontrar una solución a problemas complejos para los que no hay soluciones obvias, nada que se aborde directamente por las características del marco que estoy usando o las capacidades del lenguaje en el que estoy trabajando. con. En esto, necesito analizar el problema e idear una solución y, ocasionalmente, este proceso entra en el ámbito de la arquitectura a gran escala.

Si bien una excelente comprensión de estos problemas más profundos es necesaria para hacer ese tipo de trabajo, no es suficiente . En otras palabras, solo saber cómo funciona una tabla hash o por qué un montón suele tener buenas características de rendimiento no es suficiente para ser un arquitecto de sistemas o un ingeniero sénior. Es el punto de partida lógico, y desde allí puede comenzar a profundizar y viajar más ampliamente y obtener la experiencia que también es necesaria para abordar los problemas más grandes.

Supongo que para responder a su pregunta, debe preguntarse: "¿Qué quiero ser? ¿A dónde iré con mi carrera?" Si está contento de continuar haciendo lo que está haciendo, entonces quizás desee aprender suficientes estructuras de datos y algoritmos para superar las preguntas de entrevista en gran medida arbitrarias que enfrenta.

Si quieres crecer en tu carrera y tienes una pasión esencial, debes abrazar estos temas lo más estrictamente que puedas. Si tiene algo de tiempo para trabajar en ellos, una mente abierta y verdadero entusiasmo, encontrará algunas cosas maravillosas y emocionantes. Nunca olvidaré el día que entendí por primera vez quicksort. La sensación de emoción y descubrimiento marcó el rumbo del resto de mi vida, y no podría estar más agradecido por eso. Ahora, no puedo imaginar hacer nada más que trabajar como ingeniero de software.

Mucha suerte con lo que elijas.


2
Siempre hay soluciones obvias. Simplemente dejan de funcionar cuando cambian los requisitos;) No creo que un conocimiento profundo de algoritmos y estructuras de datos sea un requisito previo real para un buen ingeniero de software. Es solo que rara vez se ve uno sin él, porque lo que tiene un buen ingeniero de software es una sed insatisfactoria de conocimiento.
back2dos

+1 Bien redactado "Supongo que para responder a tu pregunta, debes preguntarte:" ¿Qué quiero ser? ¿A dónde iré con mi carrera? '
Bill

12

Depende de para qué son los trabajos. Este tipo de cosas son preguntas de entrevista bastante estándar, pero también son poco imaginativas y probablemente no se relacionen con el trabajo en absoluto, ciertamente no es un trabajo que utiliza las tecnologías que enumera.

Para mí, a medida que avanzan las preguntas de la entrevista, son un buen juez de si obtuviste un título en Ciencias de la Computación (y puedo recordarlo) en lugar de cualquier medida de habilidad o conocimiento de programación general.

Te sugiero que o aprendas estas cosas para que puedas completar la entrevista, o simplemente aceptes que preguntar en cualquier lugar no es para ti, pero no, no necesitas saberlo para llamarte programador.


1
gracias por tu respuesta. Compartiré con ua entrevista divertida, las personas que me intervinieron requirieron a alguien que sea bueno en el lado de la interfaz de usuario usando json css ajax javascript jquery, etc. Me preguntaron cómo escribirías un servidor web. Y lo que sucede cuando se presiona guardar en un archivo de
Word

2
@sushil - Creo que ese es el tipo de lugar donde no quieres trabajar ...
Jon Hopkins

@sushil: Estoy totalmente de acuerdo con @Jon Hopkins. Mejor trabajar como mesero esperando un buen trabajo que tomar un trabajo como ese. Tener idiotas incompetentes como superiores te hará extremadamente frustrado y te detendrá en tu desarrollo personal.
back2dos

6

Gran pregunta Javascript o Java o VC ++ son lenguajes de programación súper inteligentes donde nunca necesitará crear una lista vinculada o una tabla hash desde cero. Pero aún debe tener la capacidad de decidir cuándo usar uno sobre el otro, las penalizaciones de rendimiento y las bonificaciones que se acumulan, etc.

He entrevistado a muchos programadores de API, también conocidos como monos de código, y en la mayoría de las entrevistas no han logrado diseñar sistemas que sean eficientes y escalables. En pocas palabras: conocer un montón de API le dará el pan, pero para la mantequilla necesita comenzar desde los conceptos básicos de la informática.


Muchas gracias, seguiré sus consejos y comenzaré a aprender sobre esos temas
Mahmoud Hossam

3

Añadiré "sí, por supuesto que todavía puedes llamarte programador". Pero, ¿qué tipo de programador quieres ser? Creo que los mejores programadores tienen al menos cierta base en los fundamentos teóricos. Saben por qué eligieron una estructura de datos / algoritmo particular, así como las compensaciones que vienen con eso. Espero que cualquier desarrollador que entrevisto tenga al menos una comprensión básica, incluso si no usan la misma jerga (aunque no conocer la jerga significa que le resultará más difícil comunicarse con otros desarrolladores).


2

¡El conocimiento de los algoritmos le permite decir con confianza cómo se escalarán sus elecciones ! Personalmente considero que esto es necesario para ser un programador senior



1

Depende del proyecto: soy ingeniero informático de BEng y trabajo como analista programador.

Pasé mucho tiempo para trabajar en diseño (pruebas, doc, diseño de código). Pero, cuando encuentro un error (o un mal rendimiento) o tengo que codificar una nueva estructura de datos (porque el requisito es muy NUEVO para la aplicación), debo entender dónde está el problema en el algoritmo y debo corregirlo ( Hice esto no muy bien, así que :))

Los algoritmos clásicos y las estructuras de datos son una especie de "patrón de diccionario" en el mundo del desarrollador.

Algunos excelentes enlaces:


1

Es posible que sea un buen programador en este momento, pero el conocimiento de la Estructura de datos, los Algoritmos y el conocimiento de otros temas en ciencias de la computación ciertamente ayudarían mucho a mejorarse de muchas maneras:

  • Es posible que pueda ser más efectivo y más rápido para hacer las cosas. Incluso las personas que ya tienen un título en Ciencias de la Computación y conocen muchos de estos temas tienden a mantenerse al día con los últimos avances para mejorar.

  • Este conocimiento también será bueno para, si en menor medida, decir si pasa del programador al seguimiento de la gestión más adelante, porque aún podría comprender mejor los aspectos técnicos de los proyectos con este conocimiento.

  • Por supuesto, la estructura de datos y los algoritmos se solicitan mucho en las entrevistas, por lo que esa es una razón más por la que podría ser útil conocerlos.


0

Menciona hashes, árboles, pilas, colas y algoritmos de clasificación. Bueno, las tecnologías que ha mencionado están relacionadas principalmente con páginas web y secuencias de comandos web. Definitivamente deberías entender los árboles como mínimo, para que puedas trabajar bien con el DOM. Pero si las secuencias de comandos son todo lo que necesita hacer, entonces probablemente esté bien. No necesitará la mayoría de las herramientas del oficio para un programador real. Pero eso se debe a que existe una gran diferencia entre el malabarismo de cadenas que constituye la mayoría de los scripts web y lo que la mayoría de nosotros consideramos "programas de escritura".

Trabajo con hashes y árboles prácticamente a diario, y las pilas y colas con menos frecuencia pero con la suficiente frecuencia. La clasificación es básicamente un problema resuelto; casi cualquier idioma tiene una clasificación rápida incorporada en la biblioteca estándar, un método de clasificación en tipos de colección básicos, etc., pero debe saber en qué circunstancias el rendimiento de clasificación rápida puede degradar severamente y las estrategias correctas para retrasar la clasificación.

Si no conociera estos principios y cómo funcionan, probablemente podría hackear soluciones de codificación que funcionen, pero no serían soluciones de muy buena calidad. Corrían lentamente, eran difíciles de leer y difíciles de modificar, reutilizar o ampliar. Entonces, si desea aprender a ser un buen programador, definitivamente debe leer sobre sus algoritmos y estructuras de datos. Realmente mejorarán la calidad de su código.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.