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.
Respuestas:
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).
fuente
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.
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.
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.
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.
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.
fuente
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:
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.
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 un
if
y 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.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.
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.
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.
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.
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.
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!
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.]
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 .
fuente
Después de hablar con un par de representantes de la compañía y amigos que tuvieron muchas entrevistas:
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!
fuente
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.
fuente
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:
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.
fuente
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.
fuente
Cosas que aprendí en la universidad que uso todos los días:
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.
fuente
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.
fuente
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
fuente
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. :)
fuente
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
Luego, un poco de trabajo extra curricular, lea:
fuente
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 :
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.
fuente
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.
fuente
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:
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.
fuente
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.
fuente
1er año:
Segundo año:
3er año:
4to año:
Esos cursos deberían proporcionar mucha teoría y práctica de codificación.
fuente
Es extraño que nadie haya mencionado Arquitectura de Computadores.
fuente