¿Qué temas se espera que los estudiantes de CS dominen cuando se gradúen?

Te estoy dando algunos mínimos. Aquí hay algunas cosas que DEBE saber:
1. Estructuras de datos
No creo que pueda abarcarlos todos aquí, pero deberías saberlo todo, desde matrices simples y listas vinculadas hasta montones de Fibonacci y más. Algunos increíblemente importantes son matrices, listas vinculadas (colas y pilas), árboles binarios, que usan mapas de bits, árboles binarios, árboles B, montones, intentos, tablas hash y gráficos.
2. Algoritmos
De nuevo, no puedo nombrarlos a todos, pero aquí hay algunos. Además, las complejidades asociadas con los algoritmos generales que involucran las estructuras de datos anteriores son muy importantes. Algunos importantes son Dijkstra, Prim, Kruskal, Breadth first search, Depth first search, todos los algoritmos de Clasificación, divide y vencerás, algoritmos codiciosos y programación dinámica. Podría haber dejado de lado algunos, pero eso es un resumen general.
3. Idiomas / tecnologías
Estos son los conceptos básicos. En cuanto a los idiomas, debes conocer un idioma realmente bien al menos. Sin embargo, es bueno saber más y comprender las diferencias entre ellos. Algunos idiomas primarios comunes para saber son
1. Java
2. C / C ++
3. Python
Además de estos idiomas primarios, personalmente creo que, como estudiante de informática, debes estar familiarizado con las siguientes tecnologías:
1. Scripting de shell (regex, grep, awk, sort, uniq y otros)
2. Github / SVN (un sistema de control de versiones)
Además de esto, en lo que respecta a los paradigmas de programación, definitivamente debe tener un lenguaje orientado a objetos al menos (como se indicó anteriormente) además de un lenguaje funcional , que puede significar cualquiera de los siguientes
1. Scala
2. ML estándar
3. Haskell
4. OCaml
5. Lisp
6. Clojure
Esta lista definitivamente no es exhaustiva, pero como experto en CS, se espera que tenga conocimiento de un lenguaje funcional.
4. Especialidad
Ahora, como estudiante de CS, al graduarse, se espera que tenga un enfoque en el interés. Esto puede ser desde gráficos hasta inteligencia artificial, sistemas, lenguajes de programación, bases de datos, ingeniería de software, interacción humano-computadora, redes, ciencias computacionales, teoría, desarrollo web o diseño de juegos. Creo que los he cubierto todos, pero definitivamente debería tener un nicho en al menos una de las áreas anteriores. La investigación académica extracurricular es siempre una buena idea tener en tu haber.

Estos son los conceptos básicos. Sin embargo, cuando se trata de buscar trabajo, el proceso de selección no hace justicia a su educación. Hasta donde yo sé, las cosas que buscan son:
1. GPA
2. Experiencia laboral previa e investigación
3. Ciertos lenguajes de programación según su proyecto
4. Conocimiento de preguntas generales de codificación para entrevistas (estructuras de datos + algoritmos)
Gran parte del proceso es basura. Me gusta pensar que es una tabla de verdad. A veces su entrevista va bien, y usted consigue el trabajo, a veces va bien y no consigue el trabajo, a veces lo hace mal y no consigue el trabajo, y a veces, si tiene suerte, lo hace mal y todavía conseguir el trabajo

La respuesta de Kavish es muy buena.

Me gustaría agregar lo siguiente: asegúrese de probar un ejemplo medio a avanzado de cada estructura de datos y algoritmo que encuentre. Hay más para practicar de lo que uno podría pensar. No se obsesione con la teoría: todo ese conocimiento sobre cuáles son las diversas estructuras de datos es solo parcialmente útil si nunca las ha utilizado de una manera práctica, no textual, no tutorial. Necesitas el cómo .

Dado que su shtick probablemente termine en una de las principales empresas de tecnología, también le sugiero que comience a solicitar pasantías. No hay forma de aprender más que ser arrojado al fuego en uno de los mejores de Silicon Valley. Para prepararse para algunas de las entrevistas más prestigiosas que existen (Google, Amazon, Facebook …), siga los recursos conocidos como:

https: //facebook.interviewstreet
https://sites.google.com/site/st
GeeksforGeeks: un portal informático para geeks
Programación de preguntas de la entrevista | CareerCup
CodeKata
TopCoder, Inc.
Consigue ese trabajo en Google

Esencialmente, no tome nada por sentado. Solo después de que salgas de la universidad te darás cuenta de lo poco que sabes y de lo poco preparado que estás en realidad.

Otra cosa que me gustaría mencionar: trate de pensar lo más que pueda sobre dónde le gustaría estar en 5 años. ¿Harías web? O tal vez la programación de bajo nivel? ¿Le gusta hacer magia en el navegador e impresionar a la gente, o le pondría la piel de gallina al ver que logró optimizar una consulta por un factor de 10? Atención. Un jack de todos los oficios no es maestro de ninguno, así que trata de buscar tu dominio temprano.

¡Buena suerte!

Los estudiantes ideales de CS deben dominar estas cosas
=================================

Estructuras de datos y algoritmos
———————————————–
1. Principalmente todos los algoritmos de búsqueda y clasificación
2. Técnicas de diseño de algoritmos (programación dinámica, codicioso, etc.)
3. Listas vinculadas, árboles, gráfico, tabla de hash, etc.

Sistemas operativos (en manos con sabor a Unix)
————————————————————————
1. Multiprocesamiento / roscado
2. Memoria virtual (cómo funciona malloc, etc.)
3. Disco IO

Redes
——————
1. Comprensión básica de TCP / IP
2. Comprender y tener experiencia en Sockets Unix.
3. Capaz de escribir servidores multiproceso / proceso.

Diseño del compilador
———————–
1. Capaz de analizar archivos sobre cualquier gramática
2. Teoría de la computación (NFA / DFA, RegEx)
3. Tener experiencia en escribir un compilador de juguetes.

Inteligencia artificial
—————————-
1. Comprensión básica sobre estadística y probabilidad
2. Conocimientos básicos sobre redes neuronales / AG / aprendizaje automático, etc.

Gráficos de computadora
—————————–
1. Manos a la obra en OpenGL

Programación
——————–
1. Familiaridad en C ++ o Java
2. Experiencia en C
3. Familiaridad en Python / Ruby / Perl

Si un Fresher tiene todas las habilidades anteriores como líder técnico, me iría a casa temprano y tendría una carrera muy buena. Pero en realidad, la lista anterior es demasiado pedir. incluso para un programador experimentado. 🙂

Probablemente hay mucha autorrealización en esto. Las calificaciones universitarias generalmente no transmiten el mensaje completo si usted es competente en un tema o de otra manera.
Esto depende de si quieres prepararte para los grandes como fb, Google, etc., etc., o si quieres prepararte para un buen postgrado en una mejor universidad con un excelente profesor.
Para el punto de vista laboral:

  1. C es imprescindible y debe ser de la calidad dada en K&R.
  2. C ++ o Java para conceptos orientados a objetos. Para una mejor comprensión, C ++ está ligeramente por encima de JAVA porque puedes jugar con punteros y espacios de nombres para que si te dan trabajo en la plataforma C ++ más adelante en tu trabajo, puedas hacerlo fácilmente. Por otro lado, Java usa los mismos conceptos, excepto una sintaxis diferente, pero no usa punteros como ya sabrá. Por lo tanto, trabajar en C ++ para un proyecto avanzado podría causarle un problema, por lo que cambiar de C ++ a JAVA es fácil, pero no al revés.
  3. Las estructuras de datos son necesarias después de completar su aprendizaje de C y antes de comenzar el aprendizaje de C ++ / JAVA. Para esto, sugeriría una muy buena referencia de Sartaj Sahni en DS.
  4. El libro de algoritmos de Thomas H. Coreman debe seguirse como una biblia.
  5. Aparte de esto, te sugiero el libro de Steven S Skiena sobre Algoritmo.
  6. http: //www.topcoder.com,www.codechef.com,www.stackoverflow.com,www.codeforces.com,www.geeksforgeeks.org,www.leetcode.com .

Perfeccionar las cosas anteriores sería capaz de obtener el mejor trabajo disponible en la industria del software.
A algunos les gusta hacer poco más para agregar sabor a su CV:

  1. Programación de juegos / Programación de gráficos: Python 2.7, Pygame 1.9.1, PyopenGL, Networkx.
  2. Desarrollo web: HTML, script Java, PHP, MySQL o Mysqli o PDO.
  3. Desarrollo de aplicaciones: desarrollo avanzado de Java, Netbeans, Android o Mac Os.
  4. Redes: el mejor lenguaje para seguir con esto es nuevamente Python 2.7 o el siguiente es JAVA.

Particularmente elegí la primera opción debido a mis intereses en la programación de juegos y la programación de gráficos.

Cómo aprender las habilidades que necesita rápidamente y hacer las cosas. El hecho es que cuando te gradúas con un título de CS sabes, básicamente, nada. Tiene una amplia gama de conocimientos que ha demostrado que tiene la capacidad de aprender CS. No eres un maestro de nada y aprenderás más en los primeros 6 meses que estás trabajando de lo que aprendiste en los últimos 4 años de la universidad. Por lo tanto, me enfocaría en aprender una amplia gama de temas y en entrenarme para aprender rápidamente y profundizar en diferentes áreas relacionadas con la informática.

Además, venga al mundo laboral con una actitud de que tiene mucho que aprender pero qué contribuir de cualquier manera que pueda de inmediato. Eso te hará más valioso el primer día que cualquier dominio percibido de una habilidad específica de CS.

Mucha sabiduría en las otras respuestas. Aquí hay algunos otros pensamientos.

Obtenga una pasantía de verano o similar y escriba un código “real”, idealmente bajo la tutela de programadores muy experimentados. Salvo eso, construya algo destinado al uso real por personas reales.

CS te enseña muchas ideas bien estructuradas. Pero la verdad es que el mejor código satisface las necesidades del usuario. Con frecuencia, eso se aleja notablemente del universo perfectamente estructurado de conjuntos de problemas y proyectos de clase.

En los últimos 35 años he trabajado como programador (y otras cosas, como CTO / CIO), C ha sido la herramienta / amigo más constante en mi vida profesional. Actualmente, soy un gran admirador de Python, porque tiene una biblioteca estándar excelente y alienta a escribir un buen código.

Si puede, conviértase en un TA para una clase de lenguaje de programación C. Aprenderás el idioma más profundamente porque tienes que explicárselo a los demás. Enseñar a otros es un gran camino hacia el dominio.

Pero lo que debe dominar antes de abandonar el nido, si puede, es comprender lo que se necesita para hacer un producto real: uno que deleite a los usuarios, maneje las condiciones de error con gracia y resulte fácil de mantener con el tiempo.

Y aprende a escribir bien. Gran parte de su éxito dependerá de su capacidad para comunicarse de manera clara y convincente, no solo con otros ingenieros y técnicos, sino también con los gerentes y usuarios. Si tu escuela ofrece una clase de escritura expositiva, tómala. Y luchar por una A.

Mi biografía está aquí, si desea ver lo que he logrado en base a estas ideas básicas: http://www.mikeduffy.com

Creo que esto depende en gran medida de lo que quieras hacer. Es popular querer ser el próximo empleado de Google, Facebook, , pero eso podría no ser lo que está buscando (no reveló).

Personalmente, creo que sería genial ir a trabajar para Twitter o similares, pero realmente disfruto estar en una empresa más pequeña donde tengo mis manos en cada parte de nuestra pila.

Divulgación: no tengo un título de CS. Tengo casi 30 años y he tomado varias clases de programación ahora (después de obtener mi licenciatura en Política) – Bases de datos, C ++, Java, C.

Escribo VB, VBScript (ASP clásico) y JS todo el día en el trabajo y ocasionalmente creo proyectos para nuestros clientes como ejemplos en C #. Si te estuviera entrevistando o revisando tu currículum, estaría buscando lo siguiente:

  1. Proyectos en los que has trabajado, muéstrame algún código o cómo funciona el sistema. Cuéntame sobre las dificultades que tuviste para construirlo, cómo las superaste (o no).
  2. Fuerte comprensión de OOP. Quiero trabajar con alguien que si dijera “hacer una clase para con al menos diez campos e implementar algunos métodos” sería capaz de comprender fácilmente de lo que estoy hablando. La herencia también sería importante para mí.
  3. Genuinamente interesado en la resolución de problemas y rascarse la picazón (Keynote – Brad Fitzpatrick).
  4. Tiene un aire de comodidad (trabajar con súper inteligente no es suficiente; debes ser agradable ya que te unes a un equipo).
  5. Cuénteme sobre un proyecto en el que le gustaría trabajar y por qué lo encuentra técnicamente interesante.

Realmente no me importan sus habilidades de estructura de datos porque puede aprender lo que necesite en el trabajo (en mi oficina, no es cierto por querer un trabajo en la PNL y buscar, etc.). Me importa que puedas analizar un problema y encontrar una solución que tenga en cuenta el dominio. No usamos Linux aquí (a pesar de mis esfuerzos), por lo que no quiero una solución que dependa de Linux.

Es probable que le pida que piense en un problema, el problema uno que tenemos, y que me diga cómo resolverlo dadas algunas limitaciones. Es más importante para mí que vea cómo ataca un problema que si sabe o no cuándo usar la ordenación rápida frente a la ordenación del montón o una lista vinculada frente a una matriz.

Esas son algunas consideraciones si no solo te enfocas en las empresas de tecnología de primer nivel. Hay muchos problemas para resolver en esta industria y muchos trabajos excelentes que no están en las empresas de “nivel superior”. Considere a qué se dirige y piense en lo que es relevante para esa industria / trabajo cuando se concentre en qué dominar. Bloquear toda la información mencionada en las respuestas anteriores es excelente, solo asegúrese de poder aplicarlo.

Usando Python:
1.) Construye un motor Javascript.
2.) Cree un rastreador web basado en PageRank
3.) Cree una aplicación web basada en Django que clone Hunch
4.) Construye un framework web como Django

Usando Javascript:
1.) Construya su propio marco Javascript como MooTools.
2.) Usando Node.JS crea un Quora Clone.

Usando C:
1.) Implemente su propia versión de Python
2.) Crea algo interesante usando OpenCV
3.) Mire a través de la fuente de Tornado Real Time Server e impleméntelo en C.

Nota:
Intenta completar el 30% en algún proyecto. 70% en otros. Y al menos 100% en uno.

Solo quiero que crees algo “mundo real” y a través de eso podrás aprender y comprender los conceptos mencionados en otras respuestas.

No se concentre en dominar ningún tema en particular, concéntrese en crear una cartera de proyectos de programación en cualquier área de software en la que desee trabajar (móvil, web, seguridad, SO, etc.). Si desea trabajar en una de las compañías tecnológicas más grandes, comience a pasar aproximadamente una hora al día revisando las estructuras de datos y sus algoritmos asociados unos seis meses antes de graduarse. Trabaje en red como el infierno en LinkedIn, tal vez intente encontrar un trabajo independiente mal pagado para aprender la diferencia entre trabajar en proyectos personales frente a algo más profesional. Ponte BUENO con Git: lo usarás en todas partes.

Asegúrese de usar Java o C ++ para sus estructuras de datos, y haga problemas en HackerRank o LeetCode.com. Cuando se encuentra en un punto donde puede resolver una variedad de problemas medianos de LeetCode sin ninguna ayuda, está en un buen lugar para ser contratado en un puesto de nivel de entrada en una gran empresa. ¡Buena suerte!

Curiosamente, solo Tamil Selvan tocó los temas “centrales” de CS: SO, redes, compiladores, etc.

Personalmente, no puedo enfatizar la importancia de aprender primitivas del sistema operativo y los conceptos relacionados, especialmente Multi-Threading y Multi-Programming. Estos dos conceptos son indispensables para cualquier ingeniero, que incluso está ligeramente interesado en trabajar en roles de programación central.

No tener una comprensión sólida de los subprocesos múltiples es la razón principal de las sesiones de depuración a altas horas de la noche en los ciclos de desarrollo de productos, tratando de buscar esos errores sutiles frustrantes.

Entonces, mientras esté en la universidad, asegúrese de escribir y ENTENDER el código para resolver problemas de resolución clásicos como Productor-Consumidor, Lector-Escritor (todas las versiones), Dining-Philosophers, etc.

More Interesting

¿Cuáles son las herramientas necesarias para desarrollar un producto integrado, especialmente software?

¿Dónde están los vacíos en el software de ciencia de datos?

¿Se sobrevalora la educación en India?

¿Por qué el software es siempre más lento que el hardware? ¿Cuál es la línea fina entre software y hardware?

¿Cómo creo un programa que determina la relación de dos temas usando el Árbol de categorías de Wikipedia?

Cuando ejecuto una consulta con muchas columnas, aparece el error "Tamaño de memoria permitido de 33554432 bytes agotados (intenté asignar 512 bytes)". ¿Cuáles son algunas soluciones?

¿Cuál es la diferencia entre la confiabilidad del software y la predicción de la calidad del software en función de los cambios de código?

Además de las aplicaciones de Android, ¿qué proyectos / aplicaciones podrían impresionar a un empleador utilizando Java o Python como lenguaje de programación?

¿Qué patrones de diseño de GoF (Gang of Four) están desactualizados?

¿Cuáles son todos los tipos de datos básicos en Swift?

¿Es posible crear un software completamente inquebrantable?

¿Qué problema difícil de ingeniería de software enfrentaste y resolviste?

¿Cuál es una buena metodología cuando se trabaja en una tarea de programación?

¿Por qué los probadores de software / QA casi siempre son contratistas?

¿Me despreciaría si estuviera dispuesto a hacer algo por mi país, que incluye escribir software y usar tecnología que pueda dañar a otros?