Asignaturas de CS que un estudiante debe saber [cerrado]

34

En la universidad, nunca me interesó la teoría. Nunca lo leo. No importa cuánto lo intenté, no pude leer cosas y no sabía lo que realmente estaba sucediendo en la práctica. Como por ejemplo, en mi curso de teoría de autómatas, mi profesor me contó todo lo que posiblemente esté relacionado con el aspecto matemático de la misma, pero ni una sola vez mencionó dónde se usaría prácticamente. Esto es solo un ejemplo.

Logré pasar mi universidad y también hice una pasantía en una compañía, donde hice un proyecto y, afortunadamente, no se preocuparon por mis calificaciones, ya que estaban por encima del promedio.

Ahora, ¿estoy interesado en saber qué materias debe tener en cuenta absoluta y positivamente un estudiante de CS? Temas que pueden tener relevancia en la industria. Esto se debe a que tengo algo de tiempo libre en mis manos y me ayudaría a comprenderlos mejor.

Cuales son tus sugerencias? Como para uno, los algoritmos son un tema.

Karl
fuente
3
Las expresiones regulares se basan en la teoría de autómatas, y te ayudará si alguna vez tienes que analizar algo. Hice y aprendí cosas en la escuela que resultaron irrelevantes para los trabajos que tuve, pero eso dice al menos tanto sobre lo que he trabajado como sobre lo que he aprendido. Nada de lo que aprendí sería inútil en el campo en todas las circunstancias.
David Thornley
2
Odio trabajar con tu tipo ... jk (más o menos). Si yo fuera tú, primero me tomaría el tiempo para revisar cosas que deberías saber de la escuela, de esa manera no te verías como un idiota en tu próxima entrevista. Después de eso, aprendería una cantidad razonable de estructuras de datos y algoritmos que parecen ser utilizados en un mundo real. Necesitas averiguar dónde quieres estar. Si eres un desarrollador de juegos, entonces probablemente necesites álgebra lineal, gráficos en 3D, geometría computacional. En general, debe revisar los datos str, alg, la base de datos, el sistema operativo y el compilador como mínimo y seguir aprendiendo.
Trabajo
Es difícil nombrar una aplicación particular para la teoría de autómatas de la misma manera que es difícil nombrar una aplicación particular para aritmética. Una exageración, tal vez, pero no tanto. Los diagramas de estado a menudo son útiles, y manipularlos en código es útil para varios propósitos. Los árboles de decisión (minimizados en dígrafos) son un ejemplo relativamente reciente para mí, e incluso he necesitado usar modelos de estado (en forma canónica) como claves en contenedores. Si no puede ver las aplicaciones dentro de las aplicaciones, piense en términos de agregar una capa de indirección: generación de código.
Steve314
1
A continuación, obtienes muchas respuestas excelentes de CS, pero creo que al limitar tu pregunta de esa manera te estás perdiendo un par de las cosas más útiles que he visto en los 15 años desde que obtuve mi BSCS, lo que ha diferenciado a la gente que han tenido un buen desempeño en la industria: comunicación en grupos pequeños y habilidades de trabajo en equipo. Por tonto que parezca, dirígete al departamento de habla / lenguaje / teatro y toma una clase como "comunicaciones de grupo pequeño" o "liderazgo / gestión de equipo / grupo". Incluso si no planea hacer la gestión, las habilidades que adquiere allí lo convertirán en un mejor ingeniero y miembro del equipo.
cabbey

Respuestas:

41

Lo creas o no, una de las cosas que resultaron ser de importancia crítica para mí en mi vida posterior fue la construcción de compiladores. No es la versión moderna de namby-pamby que usa Lex y Yacc, eso es para tontos.

Construcción REAL del compilador donde escribes tu propio escáner de símbolos y analizador desde cero.

Esto es algo que pensé que nunca jamás volvería a usar. Pero en los últimos 20 años, ese curso ha demostrado su peso en oro 4 veces. El procesador de comandos que he tenido que escribir, cada escáner de mensajes entrantes, cada despachador de usuarios, cada intérprete de guiones, ha utilizado los principios de ese curso. Hazlo de esa manera y la vida es dulce, clara y simple. E incluso le di toda la información a un colega que no lo había hecho: tenía que escribir un compilador para una máquina abstracta. Lo que podría agregar ha tenido un gran éxito comercial.

Si tuviera que subir y agradecer a un profesor de un curso universitario en cualquier tema, sería este. Sin eso, habría sobrevivido, pero mis soluciones habrían sido mucho más feas.

(Y antes de que alguien salte y diga "bueno, podrías haber usado lex y yacc ..." la respuesta es, tal vez, depende mucho del sistema. En algunos casos, los lenguajes de programación no eran C (por ejemplo, PL / M y Ada), en algunos casos, Lex o Yacc no estaban disponibles para la plataforma. Conocer los conceptos básicos significa que hay una solución disponible en lugar de retorcerse las manos tratando de descubrir cómo doblar alguna herramienta para adaptarse al problema).

rápidamente_ahora
fuente
66
+1 Compiladores fue uno de mis cursos favoritos en la universidad, y siempre es útil. Raramente he usado lex / yacc / bison, los fundamentos son de un uso mucho más concreto.
Orbling
Estoy totalmente de acuerdo, aunque por una razón diferente. Saber cómo escribir el generador de código, aunque usé Lex y Yacc, fue mi primera y mejor inmersión en la programación orientada a objetos.
Peter Turner el
Puede (y TAMBIÉN debe saber cómo) escribir el generador de código en C simple o en algún otro lenguaje que no sea OO. Entonces es una lección para escribir piezas de código de procedimiento muy grandes y dividir la generación del analizador / escáner / código en fases sensibles e inteligibles.
rapid_now
Los compiladores +1 incorporan tantos patrones y principios que le permitirán ver el diseño y el código en una luz completamente diferente después de haberlo hecho.
Andrew T Finnell
2
"Esto es algo que pensé que nunca jamás volvería a usar". Si tuviera un dólar por cada vez que me lo dijera a mí mismo cuando era más joven ...
Nick Spreitzer
37
  1. Estructuras de datos / Algoritmos, especialmente Gráficos. La cantidad de situaciones del mundo real en las que he logrado usar algoritmos relacionados con gráficos me ha sorprendido. Concéntrese en conocer las características de cuándo una estructura de datos o algoritmo es apropiado. Poder ver un problema y saber usar programación dinámica / algoritmo codicioso, por ejemplo, es importante y puede ahorrarle mucho tiempo.

  2. Conocimiento práctico de la complejidad computacional. No tiene que saber desde el principio cuál es el límite inferior de la clasificación de radix, pero saber cómo determinar el peor tiempo de ejecución de algo que escribe es importante, especialmente para proyectos críticos de rendimiento.

  3. Conceptos del sistema operativo. Gestión de memoria, programadores, etc. Todos los desarrolladores deberían tener una sólida comprensión de los sistemas operativos, dado que el código que escribes está constantemente interactuando con él.

  4. NetSec. Me he encontrado con muy pocos desarrolladores que tienen una comprensión sólida de las preocupaciones básicas de seguridad con el desarrollo (desbordamientos de búfer, xss, SQLI, etc.). Esto es realmente imprescindible si quieres tener éxito en la industria. Es genial si puede escribir la próxima gran cosa, pero no tendrá muchos usuarios por mucho tiempo si no protege sus datos.

  5. Paradigmas de programación. Conocer las características y diferencias entre la programación OO / Funcional / Procesal. Una de las mejores clases de pregrado que tuve fue escribir 20 simples intérpretes de instrucción para fortan, esquema, prólogo, etc. en los propios idiomas. Solo la exposición en sí puede ayudarlo a comprender los conceptos fundamentales del desarrollo de software.

Kurtis
fuente
1
+1 Se requiere una lista completa, (4) en particular es muy importante en la era moderna distribuida.
Orbling
1
+1 en estructuras de datos / gráficos. La cantidad de programadores que conozco que no saben cómo usar correctamente una tabla hash o por qué una lista vinculada en lugar de una simple matriz en algunos casos me sorprende todos los días.
Machado
+1 para paradigmas de programación. Una buena comprensión de los contrastes entre diferentes tipos de idiomas ayuda mucho.
apoorv020
19

Cumplir con los requisitos de graduación no es necesariamente suficiente para ser el mejor científico informático que pueda ser. Para un plan de estudios universitario típico, estas son las diez cosas principales que debe asegurarse de aprender:

  1. Los fundamentos de la economía : un curso introductorio que cubra temas como complementos y sustitutos es vital para trabajar en una economía mayor, o simplemente para entenderlo. Si bien el concepto de un Giffen Good no necesariamente lo ayudará, conocer las externalidades sí lo hará. También podría ayudarlo a apreciar que hay más situaciones de ganar-ganar de las que podría haberse dado cuenta.

  2. Cómo escribir una prueba : todos los estudiantes de informática deben saber cómo escribir una prueba. Y las matemáticas discretas, aunque forman parte de un desayuno bien equilibrado, no cuentan. [La inducción es solo una técnica de prueba, y puedes sobrevivir sin saber mucho acerca de las pruebas.] Un curso de álgebra o análisis real es necesario para escribir realmente pruebas. Y por álgebra me refiero a teoría de grupo o álgebra abstracta, no al curso que tomaste en la escuela secundaria. Para el beneficio completo, tome álgebra y análisis real en el mismo término.

    ¿Por qué es esencial la prueba de escritura? ¡Porque es programación! Piense en cuándo aprendió a programar: si una tarea requiere unify un bucle, es posible que no haya tenido ninguna intuición sobre dónde ponerlos en relación el uno con el otro. Pero ahora la misma tarea se sentiría completamente natural. Escribir una prueba es muy similar. Hay un conjunto de trucos que aprende, y una vez que los aprende, las cosas se ven bastante diferentes.

  3. Cómo escribir : las habilidades de comunicación escrita son esenciales, ya sea que trabaje en la industria o en la academia. Es mejor si puede encontrar un curso de mecánica, y no un curso de escritura que sea efectivamente sobre un tema diferente. Es decir, muchas escuelas tratarán de hacer que los cursos de escritura sean más relevantes o interesantes al tratar sobre un tema especial. Intenta elegir la versión "aburrida" del curso.

  4. Probabilidad y estadísticas : hay algunas cosas que solo recogerá correctamente al tomar un curso. Junto con los requisitos principales de CS (que deberían proporcionarle matemática discreta, cálculo de variable única y variable múltiple y álgebra lineal) y álgebra y / o análisis real, la recolección de estadísticas probablemente le dará una menor en matemáticas. Las estadísticas de aprendizaje pueden ayudarlo a trabajar con otros científicos en sus proyectos.

  5. El tema candente actual : en décadas anteriores, podría haber sido bases de datos o programación orientada a objetos. Hoy podría ser programación web o arquitectura orientada a servicios. Cualquiera que sea la moda actual, asegúrese de tomar un curso en ella. Aunque solo sea para ver de qué se trata la moda.

  6. El problema de la detención : la mayoría de los problemas no se pueden resolver con máquinas. Esta es una idea bastante profunda que nuestra cultura ha absorbido tan bien que ya no suena impactante. Lo mismo ocurre con la radio, Goedel y la bomba atómica; No fue hasta el arte posmoderno y la guerra fría que pudimos hacer frente nuevamente a estos conceptos. Sin embargo, tomar un curso de teoría de la computabilidad puede volver a sensibilizarlo a esta prueba bastante sorprendente.

  7. Programación puramente funcional: lo más probable es que no ingrese a la programación puramente funcional, a menos que investigue o trabaje para unas pocas compañías selectas, pero saber que lo ayudará a ser un mejor programador. La razón es que aprenderá muchas formas nuevas de abstracción, y conceptos como números de la Iglesia y continuaciones y mónadas y, sí, recursividad, y estas herramientas también se pueden aplicar a su próximo programa Java.

  8. P y NP - OK, este ya está en tu camino crítico, pero presta atención de todos modos. Desea asegurarse de que puede corregir a alguien cuando incorrectamente llama a NP "no polinomial". ¡Como si!

  9. Los temas del curso que seguramente odiará : este podría ser un curso de CS que encuentre demasiado bajo, demasiado teórico o un curso que no sea CS que encuentre demasiado objetable, demasiado difícil o demasiado aburrido . Si un curso como este parece ser un problema para usted, y se encuentra explicando a otros por qué está tan contento de no tener que tomar tal y tal cosa, debería decirle que aprenderá mucho tomando el curso! Quizás no aprenderá los materiales del curso, pero aprenderá sobre sus propios límites y quizás más sobre las justificaciones que se hace a sí mismo. [Sugerencia: generalmente son débiles.]

  10. El curso que no es CS que seguramente te encantará : al final, deberías divertirte un poco. Este es el curso del que probablemente sacarás el menor provecho, pero tómalo de todos modos. Hazlo una vez. Si le encantan muchos cursos, entonces es bueno para usted, pero asegúrese de que no se interponga en el resto de los cursos de esta lista.

Mi enfoque aquí ha sido práctico, basado en cursos que realmente puedes tomar. Y me he centrado en los objetivos de aprendizaje que probablemente se aprendan. Nota: Esta respuesta fue adaptada de una publicación mía en un blog sobre Diez cosas que todo informático debe aprender .

Macneil
fuente
Una explicación para el voto negativo sería útil. Quizás pueda cambiar mi respuesta, y luego tú puedes cambiar de opinión.
Macneil
Profesor, no rechazaría su respuesta, pero hay una cosa con la que tendré problemas. Prueba de escritura: hasta el día de hoy todavía no puedo escribir una prueba discreta a menos que me pidas que pruebe que un número es par o impar. No veo la conexión entre esto y la industria. Tal vez me estoy perdiendo el "Aspecto de resolución de problemas". Nunca podría pensar en la inducción matemática o el lema de bombeo. No creo que me esté frenando.
Bryan Harrington
Escribir una prueba es como escribir un programa. Aprender a demostrar que a * 0 = 0, por ejemplo, es algo así como el FizzBuzz de las matemáticas (bueno, tal vez sea un poco más difícil). Al principio parece intimidante, pero pronto aprendes los pequeños trucos, tal como lo hiciste al aprender a programar. Las pruebas pueden tener diferentes estructuras que pueden ayudarlo a pensar de manera recursiva y estructural. Como dije, un curso discreto de matemáticas no es suficiente para aprender pruebas reales. Necesitas teoría de grupo o análisis real para eso.
Macneil
Si bien el conocimiento de los cumplidos es ciertamente útil, creo que el conocimiento de los complementos es más relevante para la economía.
ijw
1
@ijw: En cuanto a la economía para que los estudiantes CS, Joel tiene una lectura buena discusión pena: joelonsoftware.com/articles/CollegeAdvice.html
Macneil
8

Después de hablar con un par de representantes de la compañía y amigos que tuvieron muchas entrevistas:

  • Bases de datos
  • OOP
  • Algoritmos
  • Estructuras de datos

tienden a ser "imprescindibles" para los nuevos empleados (o como decían, cursos "altamente recomendados").

Otros cursos que pueden ser útiles son la seguridad informática, el ensamblaje y la arquitectura de la máquina. Muchos de mis profesores también me han recomendado un curso de compilación. Además, si tiene tiempo, le recomendaría cursos de matemáticas como teoría de grafos, matemática discreta y combinatoria. Aprendes muchas habilidades de razonamiento en esas clases que la mayoría de los cursos de CS pasan por alto, pero terminan siendo muy útiles al escribir programas muy complejos.

¡Espero que ayude!

K-RAN
fuente
1
Estaría de acuerdo con OOP y las estructuras de datos.
apoorv020
44
Estructuras de datos básicos ... muuuuuuuuuuy importantes. MÁS importante, creo, que OOP. Debe poder pensar en cómo almacenar y organizar la información. Y si en un sistema embebido, el diseño en memoria de sus estructuras de datos es de vida o muerte.
rápidamente_ahora
3
+1 para las clases de matemáticas. También lo ayudan a aprender a realizar un seguimiento de grandes problemas / sistemas.
Michael K
1
La creación de redes es buena también.
Keyo
OOP? Puedes programar en Haskell o C sin OOP ... Te daré que es ampliamente utilizado, pero no creo que sea fundamental. La exposición a varios paradigmas, por otro lado, parece bastante útil.
Matthieu M.
6

Depende en gran medida de lo que planeas hacer con el título. Parece que la mayoría de las especialidades de CS terminan como ingenieros de software de algún tipo. Con eso en mente, realmente no estoy seguro de por qué más personas no solo se especializan en ingeniería de software. Sospecho que no hay suficientes programas de ingeniería de software disponibles, especialmente en las instituciones públicas.

Vengo de un fondo incrustado. Cada persona con la que trabajo tenía un título de EE o un título de CE y eso se debe en parte a que los "viejos" cuando iban a la universidad no tenían tantos programas de CE disponibles. Por lo tanto, es bastante obvio que si desea trabajar en el campo incrustado, es deseable un fondo de hardware.

Sin embargo, independientemente del campo en el que desee trabajar, creo que cada programador debe tomar un curso de programación de ensamblaje. Es posible que nunca lo use, pero le enseñará exactamente lo que está sucediendo en el nivel del procesador durante una llamada de función, cómo se manejan las interrupciones, cómo se estructura la memoria o cómo se usan los diferentes modos de direccionamiento. Creo que todas estas cosas te harán un mejor programador.

Además, aunque puede no ser aparente, algunos de estos son temas importantes al considerar estructuras de datos y algoritmos para una plataforma específica.

Pemdas
fuente
+1 porque un título en informática te brinda experiencia con una amplia gama de asignaturas / tecnologías. Solo asegúrese de prestar atención al curso de diseño de software.
Sr. Ant
+1 Para el ensamblaje, siempre es prudente comprender realmente lo que está sucediendo en la parte inferior de la pila. Sería bueno si todos conocieran el hardware también, pero para muchos sería un paso demasiado lejos.
Orbling
5

Hay 2 formas de responder tu pregunta. Déjame intentar ambos. La primera forma es ver las cosas desde un punto de vista potencial del mercado laboral, habilidades de codificación, etc. Así que aquí está mi lista:

  1. Estructura de datos
  2. Análisis de algoritmo
  3. Programación orientada a objetos
  4. Ya sea un curso específico en C ++ o Java
  5. Sistemas operativos
  6. Diseño de interfaz de usuario
  7. Programacion Paralela

La segunda forma es mirar las cosas desde una perspectiva un poco abstracta, y quién sabe, también puede ser un poco filosófico. La lista que sigue puede no tener las mejores habilidades que exige el mercado laboral, pero estoy bastante seguro de que para cuando salga de estos cursos tendrá una apreciación más profunda del arte de desarrollar software.

  1. Lenguaje Finito y Teoría de Autómatas
  2. Construcción del compilador
  3. Teoría de grafos
  4. Inteligencia artificial
Fanático23
fuente
No solo enumere un conjunto de cursos que en su opinión cree que son esenciales, proporcione razones y experiencias que tuvo que dictaron su lista.
2

También agregaría Ingeniería de Software o Prácticas de Diseño a la lista, aunque su contenido generalmente es recogido por estudiantes de la industria.

Además, en mi opinión (aunque no está respaldado por mucha experiencia), las compañías no quieren realmente la mayoría de las cosas teóricas que se enseñan en cursos como bases de datos, etc., quieren que las personas entiendan y puedan usar estas cosas.

EDITAR: Debido al voto negativo, tengo ganas de explicar mi respuesta. Soy un estudiante de último año de ciencias de la computación, y mi experiencia se basa en mi pasantía y entrevistas de trabajo con empresas líderes en el campo. En mi experiencia, rara vez se requiere que las personas usen algoritmos complicados o codifiquen estructuras de datos muy complicadas en entrevistas o en trabajos.

Más útil si puede crear y usar bases de datos, usar el control de fuente, saber cómo depurar correctamente, saber cómo usar patrones de diseño, etc. Sin embargo, como dije, estas habilidades generalmente se recogen en la industria y no se cubren en los cursos. Las prácticas de ingeniería / diseño de software generalmente implican la construcción de un proyecto de tamaño medio, muy útil para aprender todas estas habilidades.

revs apoorv020
fuente
Proporcione más detalles sobre sus experiencias y por qué alguien debería tomar esos cursos.
@ Mark: ¿Puedes explicar la razón detrás del voto negativo?
apoorv020
@ apoorv020 sin explicar por qué está recomendando Ingeniería de Software o Prácticas de Diseño, su respuesta no es útil. Tu edición aún no explica por qué los estás recomendando.
@ apoorv020 ¿el único valor redentor para tomar Ingeniería de Software o Prácticas de Diseño es que generalmente construye un proyecto de tamaño medio (lo que sea que eso signifique)? ¿Qué aprendiste personalmente al tomar esos cursos?
Es bueno saberlo, pero estos no son temas de CS.
Thomas Owens
2

Cosas que aprendí en la universidad que uso todos los días:

  • Metodología de diseño orientado a objetos.
  • Patrones de diseño
  • Expresiones regulares
  • Algoritmos básicos y análisis
  • Estructuras de datos

Desearía haber tomado un curso de base de datos. (He recogido lo suficiente para sobrevivir desde que me gradué, pero desearía saber más). También deseo que se enseñe el control de versiones: es omnipresente, extremadamente útil y fue completamente ignorado en el plan de estudios de mi escuela.

Tuve que tomar varios cursos de matemáticas. No he usado cálculo desde que me gradué. Desearía haber tomado un curso de estadística. (Nuevamente, he recogido lo suficiente para sobrevivir desde que me gradué, pero desearía saber más).

Más allá del departamento de CS, tome un curso de escritura. Las buenas habilidades de comunicación escrita son esenciales para el éxito.

pwc
fuente
+1 Sorprendió que las bases de datos no fueran obligatorias en su curso, generalmente considerado un componente esencial.
Orbling
Era. Salí de él por un tecnicismo y lo lamento.
pwc
@Orbling: A menudo, los departamentos pequeños (a diferencia de los de las grandes escuelas estatales) simplemente no tienen suficientes profesores para exigir cada tema principal. En mi escuela, por ejemplo, las bases de datos eran optativas.
Macneil
@Macneil: en mi curso, el curso de bases de datos primarias era un requisito previo (cubriendo todos los conceptos básicos: modelado ER, formas normales, SQL (no solo SQL básico, compuesto / anidado, etc.), colocación de índice, etc.), este último, más complejo , los cursos de la base de datos eran optativos (creo que había tres en total). Nunca elegí tomarlos, ya que pensé que eran cosas que podría absorber independientemente más fácilmente que otros cursos que me perdería. Creo que tomé OR avanzado en su lugar.
Orbling
@pwc: Apuesto, ¿recuerdas por qué saliste de eso, en lugar de cómo?
Orbling
2

Hay muchos cursos importantes, dependiendo de la dirección que esté planeando tomar. Sin embargo, suponiendo que pueda programar, el curso más importante debe ser:

  • Estructuras de datos y algoritmos.

    Prácticamente todo en informática vuelve a manejar datos utilizando algoritmos. Preste especial atención a las matrices y tablas hash, ya que son, con mucho, las estructuras de datos más útiles de uso común, pero las listas, los árboles y los gráficos (bueno, las listas son tipos de árboles restringidos y los árboles son tipos de gráficos restringidos) ser importante también Además, comprender los algoritmos es vital para producir código que no sea terrible. (De lo contrario, hará cosas que son terribles, como usar un algoritmo O ( n 3 ) donde un O ( n log n ) lo hará). Si su título de CS no tiene un curso obligatorio de DS + A, No es CS. O ingeniería de software. O incluso solo programación.

Aparte de eso, el curso que he encontrado más útil a lo largo de los años en múltiples campos ha sido:

  • Concurrencia

    La concurrencia tiene muchos aspectos, pero esperaría una comprensión de la diferencia entre la memoria compartida y el paso de mensajes. También me gustaría que hubiera una cobertura sólida de estrategias de bloqueo (mutexes, semáforos, etc.) y transacciones.

    Esto es vital para comprender la paralelización, por supuesto, pero también es fundamental para cualquier cosa distribuida (por ejemplo, escribir un servicio que esté expuesto a Internet, incluso si es de un solo subproceso ya que los clientes serán asincrónicos de todos modos). Entiendo que también es útil para escribir juegos (que generalmente son multiproceso) y trabajar con dispositivos integrados.

Aparte de eso, creo que lo mejor para la mayoría de los estudiantes universitarios es que estén expuestos a tantas ideas diferentes como sea posible. Muchos lenguajes y paradigmas de programación. Muchas áreas de aplicación diferentes. Una cantidad razonable de matemática (de nuevo, porque es útil tan a menudo) y también cierta exposición a factores humanos y psicología (porque cualquier software que interactúa con los usuarios está tratando con personas). Después de todo, nunca sabes exactamente lo que vas a hacer en el futuro, por lo que planificar la flexibilidad es una gran estrategia de vida.

Compañeros de Donal
fuente
1

Cuando estaba en la universidad, había bastantes temas para los que no podía ver un uso en mi vida real y, a veces, esa intuición se ha demostrado correcta (los métodos formales realmente solo son prácticos para problemas triviales en la mayoría de los casos) y otras veces ha estado completamente equivocado (la notación Big-O es muy útil), así que supongo que, en general, mi yo más joven estaba en parte correcto.

Si desea prepararse para el mundo real, además de las cosas que @ K-Ran recomienda anteriormente, le sugiero leer Code Complete y usarlo como base para una investigación más profunda sobre cualquier tema que le resulte difícil o no sienta que tiene. suficientemente cubierto

glenatron
fuente
A veces he encontrado útiles los métodos formales, aunque obviamente solo en componentes pequeños. Pensé en Dijkstra et al. como decir algo como "Si eres un matemático perfecto, puedes ser un buen programador".
David Thornley
Sospecho que si estás trabajando en un código que dependerá de ti, básicamente debes tener un conocimiento sólido de estas cosas. Pero para el trabajo que he hecho nunca ha sido necesario. Si lo necesitara ahora, tendría que volver y volver a aprenderlo desde cero ...
glenatron
Cosas como Z solo se usan realmente para software de misión crítica en organizaciones donde, como usted dice, las vidas están en riesgo. Sin embargo, creo que aprenderlos infunde una conciencia mucho mayor de la corrección del código y le da profundidad a la especificación de todo tipo. A veces, lo que aprende no es por sí mismo, sino que ayuda a asegurar lo que está arriba.
Orbling
Piense en ello como creando bloques de construcción más grandes que sean sólidos. Si ha demostrado que sus componentes son correctos (y los probó para encontrar los estúpidos errores que cometió en el diseño y la prueba), tendrá menos cosas de las que preocuparse al escribir y depurar.
David Thornley
1

Creo que deberías estudiar lo siguiente:

Sistema operativo: aunque puede que no necesite que funcione como programador, vale la pena saber cómo funciona un sistema operativo y se espera de un graduado de CS. Cualquier buen libro puede ayudar.

OOP: - Esto es pan y mantequilla. Una visita obligada. Libros si desea preguntar: su primer libro debe ser: - OOAD primero, luego puede ir al libro de Grady Booch e Ivar Jacobson

Estructuras de datos y algoritmos: - Muy importante para desarrollar el pensamiento lógico y la mentalidad.

Para mí esto es suficiente. Nunca es demasiado tarde. :)

Abhi
fuente
1

Como alguien que entrevista a los candidatos regularmente para trabajos de programación, y alguien que después de estar en la industria por más de 12 años se siente razonablemente realizado, sugeriría lo siguiente

  • Diseño de bases de datos y SQL: es sorprendente cuántos programadores no conocen SQL simple, y aquellos con buenas habilidades de SQL son invaluables. Para poder diseñar una buena base de datos puede no ser útil en una empresa que tiene una estructura de base de datos establecida, para empresas nuevas y empresas que están pasando por un cambio, ¡es IMPRESCINDIBLE!
  • Patrones de diseño. Simplemente te ayudarán a tomar mejores decisiones sobre un buen diseño
  • OOP: Esto suele ser un requisito previo para la mayoría de los cursos, pero ayudará.
  • Algoritmos: debido a que muy pocas personas saben qué es la recursividad, mucho menos entender cuándo podría ahorrarles una gran cantidad de codificación compleja
  • Estructuras de datos: la mayoría de los lenguajes modernos se ocupan de estas cosas por usted, pero comprenderlas es la clave para un buen diseño.

Luego, un poco de trabajo extra curricular, lea:

  • Certificación tipo libros. A menudo le enseñan el tipo de sintaxis y operadores debajo de las cubiertas. Es mucho más importante SABER por qué está haciendo algo, en lugar de "porque funciona", que es tan común.
Codemwnci
fuente
1

DEPENDE , no hay una buena respuesta para esta pregunta.

Programador es un mundo general para identificar a alguien que escribe software de computadora.

Ahora, allá afuera hay software de todo tipo. Por ejemplo, usando wikipedia como fuente de generalización podemos encontrar 3 grandes generalizaciones :

  • programación del sistema
  • software de programación
  • Software de la aplicacion

En el primer campo , la programación del sistema desarrolla controladores de dispositivo, sistema operativo, servidores, por ejemplo, puede seguir un curso de sistema operativo.

pero ¿qué pasa con el software de programación ? aquí, como escribió Wikipedia, puede codificar compiladores, depuradores, intérpretes, enlazadores, editores de texto, por lo que un curso de teoría automatizada, teoría del lenguaje, lenguaje y compiladores puede ser útil.

No podemos hablar de software de aplicación de ningún tipo:
- videojuegos: álgebra, física, cursos orientados a objetos?
- software matemático: cursos matemáticos?
- edición de imágenes: matemática, física, cursos de algoritmos?
- automatización industrial: matemática, física, algoritmo, cursos de robótica?
- software médico: biología, medicina, ¿qué más curso?
- muchas cosas aquí: muchos cursos aquí.

Como puede ver, hay mucho curso que puede seguir y será útil para su trabajo.

En mi experiencia, soy un ingeniero de software de sistemas y software de aplicaciones en el campo de la seguridad (¿quieres seguir un curso de seguridad?), Comenzando con un poco de experiencia en programación, me estoy volviendo más interesante en algoritmos y sistemas distribuidos y nuevamente siento incómodo en la simplicidad de la aplicación de propósito general que escribí (sniffer, sistema de detección de intrusos en la red, disector y detector de protocolos, etc.).

¡Como has aprendido con acidez en la informática teórica! has seguido estos cursos? :PAGS

Ha aprendido, por ejemplo, que todo el lenguaje informático puede ajustarse en un conjunto de funciones matemáticas computables y, por ejemplo, si su experiencia tiene mi mismo camino, pronto se sentirá incómodo en este pequeño conjunto de cálculo y, como yo, puede comenzar a ver cómo se desarrolla el software no es tan atractivo y sorprendente porque el mismo PATRÓN DE DISEÑO vuelve una y otra vez (¿ha seguido cursos de patrones de diseño?) y, por ejemplo, puede comenzar a interesarse más por QUÉ y CÓMO el lenguaje puede traducirse en función matemática y comenzar a ¡Aprenda que el lenguaje de computadora no es tan complejo! ¡pronto, por ejemplo, puede estar más sorprendido por la persona y la psicología, y puede obtener más interés al respecto y convertirse en un buen gerente de proyecto! ¿Has seguido los cursos sobre el ciclo de vida del software?

Entonces, ¿cuál es el curso IMPRESCINDIBLE en tu carrera de CS?

Sugiero aprender todo lo que pueda aprender en todos los campos, especialmente en el campo de la teoría, porque en el campo de trabajo común pronto puede sentirse aburrido por la poca complejidad que lo rodea, y convertirse en un trabajador a tiempo completo realmente tiene menos tiempo para aprender cómo funcionan realmente las cosas y mucho más tiempo para ver cómo las personas con sólidos conocimientos teóricos han proyectado las cosas para que funcionen y le brinden la posibilidad de codificar para obtener comida en casa.

Hay un sentido equivocado de la realidad en la informática. El informático, por ejemplo, a veces está muy lejos del desarrollador de software.

Echa un vistazo a la explicación de Wikipedia.

diviértete con la vida :)

mis 2 centavos

lo siento por mi muy mal inglés.

abucheos
fuente
1

Sin lugar a dudas, lo que los estudiantes de CS deben dominar es el inglés.

Sin una comprensión del inglés hablado y escrito, siempre estará en desventaja.

Solo mire la gran cantidad de preguntas que aparecen en los sitios de Stack. Demasiados de ellos son difíciles de descifrar. Algunas personas usan una mezcla de l33t, mensajes de texto (no estoy seguro del término correcto). Otros hacen una declaración y simplemente agregan un signo de interrogación mientras se pierden pequeños pensamientos importantes como verbos o adjetivos.

Si no puedes comunicarte, no podrás hacerte entender mucho menos entender lo que otros dicen.

Todo lo demas son solo detalles. Si puede comunicarse, tiene al menos una inteligencia promedio y puede entender lo que lee, entonces usted también puede tener una programación profesional exitosa.

Yo no
fuente
1

Llegué a esto desde una perspectiva ligeramente diferente en que no me gradué en CS, me gradué en Ingeniería Electrónica (con especialización en negocios).

Basado en eso, creo que una lista de cosas que debes entender es relativamente corta ya que yo (y muchos otros graduados de CS) sobrevivo felizmente sin saber nada sobre el diseño del compilador o cosas similares.

Lo que diría que he recogido que encuentro útil:

  • Diseño de RDBMS: los RDBMS se encuentran detrás de la mayoría de los sistemas y sitios, y usted debe comprender al menos los conceptos básicos de lo que está sucediendo (aprendí esto en el trabajo).
  • Diseño de interfaz de usuario básico: todos los mejores programadores con los que he trabajado podrían producir una aplicación utilizable que no fuera tan fea como el infierno. Excepto uno, pero él es la excepción que prueba la regla.
  • Alguna programación básica, y quiero decir básica. Aprendí algo de C (para procesamiento de imágenes y sistemas embebidos), algo de lenguaje ensamblador (que había olvidado a las pocas semanas de completar el curso) y algo de Pascal (un curso básico de computación era estándar para todos los ingenieros). Al entrevistar, me sorprende que pocos graduados de CS realmente puedan programar de alguna manera que las organizaciones comerciales consideren útiles, por lo que no espero mucho, pero sí espero que sepan lo básico.
  • Lógica: lo aprendí a través de la electrónica digital, los matemáticos a través de la teoría, los graduados de CS a través de la programación, pero como sea que lo aprendas, deberías tener una buena comprensión de ello, ya que todo se reduce a eso.
  • Habilidades de comunicación: hice un par de cursos en la universidad fuera de mi título actual, habilidades de presentación y asertividad. Mucho sentido común, pero nunca está de más que le digan cosas sensatas algunas veces.
  • Los fundamentos de los negocios y la contabilidad. Algunos programadores actúan como si no importara, pero en mi opinión es importante para cualquiera que trabaje en una empresa: así es como funciona el juego y va a controlar tu vida, así que ¿por qué no quieres saber al menos los rudimentos de ¿Cómo y por qué suceden las cosas?

Y si tienes la oportunidad de aprender sobre la gestión de proyectos, entonces eso realmente no estaría de más, pero eso se enseña bastante mal en la universidad en muchos casos y es algo de lo que aprenderás un poco en el trabajo simplemente trabajando en proyectos.

Jon Hopkins
fuente
0

También agregaría algunos cursos básicos de Recursos Humanos / Psicología a la lista.

Esto puede parecer una adición extraña, pero parte del trabajo profesional es aprender a venderse y negociar. Entrar en su primera entrevista 'real' sin un conocimiento sólido de las motivaciones del drone de recursos humanos es una receta para el desastre y es probable que termine con el estudiante que obtiene un salario bajo.

Conozca a su enemigo para que pueda protegerse.

Peter Bernier
fuente
-1

1er año:

  1. POO básico en un lenguaje de alto nivel
  2. Estructuras de datos

Segundo año:

  1. Compilador, construyes un rasguño simple de una forma
  2. Concurrencia

3er año:

  1. Algoritmo
  2. Sistema operativo, agrega funcionalidades y mejoras a una simple
  3. Lenguaje formal

4to año:

  1. Redes
  2. Sistema distribuido
  3. Interfaz de usuario
  4. Compilador avanzado
  5. Sistema operativo avanzado
  6. Inteligencia artificial
  7. Gráficos de computadora

Esos cursos deberían proporcionar mucha teoría y práctica de codificación.

Thierry Lam
fuente
-2

Es extraño que nadie haya mencionado Arquitectura de Computadores.

Sorantis
fuente
Creo que la arquitectura de computadores es importante saber si se quiere entender el impacto de las cachés de memoria, fallos de página, etc
apoorv020