¿Qué experiencias debería aprovechar cada estudiante de informática?

Creo que gran parte del beneficio de ser un estudiante de ciencias de la computación es explorar varias áreas y partes diferentes de CS o ingeniería de software. Si estás pensando en ser un ingeniero de software después de terminar la escuela, hay una variedad de divisiones que vale la pena explorar:

  1. Construye algo tú mismo y construye algo con un grupo. Poder construir algo (una aplicación, un sitio web, un pequeño conjunto de scripts tontos que lo ayuda a equilibrar sus libros mensualmente) sin la ayuda de un programador adicional es satisfactorio y útil, y le dará la confianza para asumir proyectos usted mismo. el futuro. Vaya más allá de las tareas asignadas a algo que sea por diversión y para usted. Por otro lado, trabajar con otros en un programa más amplio es un arte sutil pero de importancia crítica. Ya sea que esté programando en pareja o dividiendo el trabajo en diferentes partes de código con interfaces establecidas, es importante poder comunicar la estructura, los objetivos y los problemas sobre un proyecto de programación grupal a otros. Estas son las habilidades que convierten la parte de ‘hablar mientras codificas’ en una entrevista de programación de lo más antinatural a lo más sencillo: son una parte necesaria de un trabajo. También puede aprender mucho de su grupo sobre mejores prácticas o nuevas estrategias que pueden ayudarlo en el trabajo futuro.
  2. Cree algo no trivial para el front-end y el back-end de un sistema. Este es un error que cometí como estudiante: me preocupaban mucho los algoritmos y el almacenamiento y la eficiencia, pero continuamente me quejaba de hacer que las interfaces fueran aburridas y molestas sin reconocer lo difícil e importante que es un arte para hacer un frente bueno, seguro y utilizable. -fin. Por otro lado, conozco muchos ingenieros de front-end que se resisten a la primera señal de un problema de computación o almacenamiento a gran escala. Si va a trabajar en cualquier área, necesitará poder comunicarse con las personas que se encargan de las otras partes, y es importante apreciar sus desafíos, saber cómo expresar sus necesidades en su idioma, y discernir cuán desafiantes (o imposibles) son sus solicitudes para ellos.
  3. Construye algo que sabes exactamente cómo construir y algo que no sabes cómo construir. El primero es un currículum / portafolio: debe tener un proyecto o dos sentados en un idioma en el que escriba bien con buena organización y documentación para demostrar que sí, puede escribir código que los humanos pueden leer y usar de manera eficiente. Por otro lado, en algún momento de tu vida de ingeniería de software, si estás en una trayectoria exitosa, alguien te va a pedir que hagas algo donde no conozcas el idioma o entiendas la estrategia de cómo construirlo bien. . Es importante que no tenga ansiedad por el rendimiento cuando eso sucede, y una excelente manera de prevenir esa ansiedad es mostrarse antes de ese momento que sí, puede aprender y descubrir las cosas que no sabe sobre la marcha y Construir algo imperfecto pero viable. Para mí, eso sería Javascript sentado sobre una base de datos SQL; para otros, eso sería implementar algo de aprendizaje automático en algunos datos que recopilaron. Esto no quiere decir que no tengas debilidades; solo significa que deberías poder decir “sí, no sé cómo hacerlo, pero por la gracia de StackOverflow voy a averiguarlo”.
  4. Tome una clase ridículamente aplicada y ridículamente teórica. Digo ridículo, por supuesto, que significa “fuertemente en ese extremo del espectro”: estas clases no son en absoluto inútiles. Una de las partes clave de ser un gran programador es poder equilibrar el conocimiento de la teoría detrás de cuál es la “forma correcta de hacerlo”: complejidad, estructuras de datos locas, etc., y comprender las realidades de la implementación y la memoria de la vida real. modelos. Personalmente, soy bastante culpable de tener mucha de la primera y bastante poca experiencia de este último tipo, lo que lleva a algunos confusos “por qué la solución ingenua es más rápida que la eficiente paralela”. Gran parte de la resolución de problemas en ingeniería de software funciona como un experimento científico, y los buenos experimentos científicos generalmente comienzan con un modelo más simple que la realidad (su clásico ‘pollo esférico’ en física, por ejemplo). Debe conocer ese modelo teórico de cómo funcionan las cosas para que pueda comenzar con una suposición decente sobre lo que funcionará bien. También debe saber que su computadora no funcionará como un modelo ideal y estar dispuesto a adaptarse en función de información nueva y más específica sobre el rendimiento de su sistema. Y la forma más eficiente de hacer esto, en mi opinión, es tomar un curso de algoritmos de nivel superior, así como un curso de sistemas operativos de nivel superior.
  5. Tómese el tiempo para configurar su entorno de programación. Mi única entrada no dicotómica es engañosamente más difícil de lo que parece. No digo que necesite saber emacs o vim (ambos son útiles si solo puede acceder de forma remota a una máquina y no puede transferir o montar archivos en su sistema local). Digo que debería dedicar un tiempo dedicado exclusivamente a configurar un buen entorno de desarrollo donde sepa qué atajos hacen qué, puede encontrar cosas relevantes en una base de código grande rápidamente, y su editor lo ayuda a detectar errores y escribir el código correcto como tanto como quieras. Si no se toma el tiempo para hacer esto temprano, lo cual no hice, puede quedar atrapado en malas prácticas y escribir código mucho más lento de lo necesario, simplemente porque nunca llegó a integrar su depurador, su administrador de paquetes configuró , y su complemento de corrector de sintaxis agregado. Parece una pérdida de tiempo, pero es una inversión de tiempo que vale la pena para cualquier proyecto no trivial, especialmente porque también le ahorrará tiempo el próximo proyecto.

Obviamente, hay más cosas que puede hacer para facilitar su vida como futuro programador. Todo esto también supone que su objetivo no es trabajar para siempre en ciencias de la computación puramente teóricas en una pizarra, aunque podría argumentar que las habilidades prácticas son útiles incluso para construir buenas intuiciones sobre qué problemas trabajar y qué estrategias utilizar. Personalmente lamento lo centrado en un par de detalles en los que estaba en la universidad; Espero haber transmitido correctamente lo importante que es explorar una variedad de cosas, incluso si no eres un experto en ellas al final de la escuela. Porque, seamos sinceros, no vas a ser un experto al final de la licenciatura; Va a tomar mucho más tiempo. Pero ahora es su oportunidad de construir una base para muchos tipos diferentes de conocimiento de CS. No tengas miedo de diversificarte, y no tengas miedo de probar cosas en las que eres malo. Todo ayuda en el camino.

Al igual que los estudiantes en cualquier disciplina, los estudiantes de CS deben aprovechar cada oportunidad para aprender algo nuevo y diferente, cuanto más lejos de lo que ya sabe, mejor. Aquí hay una lista de cosas útiles, más o menos en el orden en que recomendaría abordarlas. Pero sigue avanzando por la lista, no te quedes con cada elemento hasta que lo hayas dominado por completo. Los últimos 7 de estos artículos son áreas enormes en las que podrías pasar toda una carrera.

  • Un lenguaje de tipo dinámico como Javascript, Lisp, Scheme, Racket, Clojure, Python, Ruby o Perl
  • C y un poco de lenguaje ensamblador (necesita saber qué sucede en el nivel bajo)
  • Un lenguaje OO fuertemente tipado como C ++, Java, C #, Eiffel, etc.
  • “Creación de códigos”, es decir, cómo estructurar y documentar su código para una máxima legibilidad y facilidad de mantenimiento; leer el código de otras personas es una excelente manera de mejorar en esto
  • Habilidades de ingeniería de software, como gestión de proyectos, estimación de proyectos, obtención de requisitos, patrones de diseño arquitectónico, pruebas de software (¡no, eso no significa probar rápidamente su programa en un par de pruebas simples y declarar que funciona!)
  • La línea de comandos de unix / linux y el script de shell
  • SQL y diseño de bases de datos relacionales
  • Un lenguaje funcional fuertemente tipado como Haskell u OCaml; idealmente, también aprenda un lenguaje de programación lógica, probablemente Prolog (es lo suficientemente diferente de un lenguaje funcional como para que valga la pena)
  • Algoritmos (incluidos algoritmos gráficos), diseño de algoritmos y cómo analizar la complejidad computacional
  • Matemáticas discretas, incluyendo lógica, teoría básica de conjuntos y teoría de la computación.
  • Concurrencia, redes y computación distribuida
  • Implementación del sistema operativo
  • Implementación del compilador e intérprete
  • Y lo suficiente sobre algún campo en particular para tener algo para aplicar sus habilidades de desarrollo de software

Trabajando como un equipo de programación con otros estudiantes; como mínimo un equipo de 2 personas, pero 3 o 4 serían mejores. Una cosa es aprender un lenguaje de programación y aprender a crear programas, es algo muy diferente aprender a trabajar junto con otras personas como equipo, debes aprender a dividir las responsabilidades y las tareas, y aprender que no todos van a ir para hacer las cosas de la misma manera, y no siempre hay UNA sola forma correcta, y algunas personas serán más productivas o contribuirán más al equipo, pero aún necesita que todos tengan éxito.

Otra cosa que la mayoría de los tipos de software odian, pero que definitivamente debes aprovechar si tienes la oportunidad es mantener el código de otra persona … La gente lo odia, y no les gusta o se molestan en aprender el código de otra persona, y prefieren simplemente volver a escribir algo desde cero, pero en el mundo real no siempre tienes el tiempo para hacerlo, y solo porque te niegas a hacerlo. Tómese el tiempo para entender algo de código, no significa que lo que encuentre sea mejor o incluso tan bueno. Pero en realidad, la mayor ventaja de mantener el código de alguien más es que te hará un programador mucho mejor, puedes aprender algunos trucos o técnicas, y aprenderás qué hace que el código sea fácil o difícil de entender.

Por último, aprenda emacs.

Si vas a una universidad donde tienes profesores de investigación, aprovecha la ventaja de ser un asistente de investigación de estudiantes. Algunos incluso son puestos remunerados.
Si bien pocos estudiantes son lo suficientemente conscientes como para solicitar esto a sus profesores, estos puestos pueden no ser muy abundantes, así que sea agresivo si es necesario.
Estos profesores realizan muchas investigaciones interesantes y usted puede ayudarlos con sus ayudas de investigación en tareas de programación de baja categoría y aprender muchas habilidades y conocimientos útiles.
Tuve la afortunada oportunidad de ayudar en la investigación a un profesor que estudiaba comunicaciones ad-hoc. Obtuve una valiosa experiencia práctica en la creación de redes en la nube (aunque esto fue antes de que surgiera el término nube ) usando sockets UDP y escribiendo aplicaciones cliente simples en Palm OS (eran las principales aplicaciones móviles de la época).
Esta experiencia ha demostrado ser invaluable durante el resto de mi carrera, como lo sería cualquier experiencia práctica.

Esta será una respuesta personal.

  • Tengo algunas experiencias realmente que aún recuerdo.
  • La primera vez que hice una página web y la hice correr en un navegador.
  • El momento en que escribí un código php para un formulario e ingresé los valores.
  • La vez que resolví un problema de programación dinámica.
  • La vez que hice una conexión entre dos PC usando Telnet y envié una información de una a otra.
  • El tiempo que hice multihilo.
  • Cuando hice applets en Java.
  • Mi primer envío de CodeChef.
  • Mi primer CyberHawk (caza críptica en línea de nuestra universidad)

Podría pensar en más, pero actualmente también estoy haciendo nuevas experiencias en el trabajo.

Intenta involucrarte en un proyecto tecnológico local. Los festivales como Maker Faire se están volviendo cada vez más populares, y muchos de estos proyectos necesitan programadores. No solo es una experiencia divertida y gratificante, sino que también le brinda referencias adicionales para su CV y ​​le da una idea de cómo encajan sus programas en sistemas reales. Por lo general, puede unirse a un equipo asistiendo a una mesa de mezclas varios meses antes del evento o comunicándose con la oficina del organizador principal. Solo asegúrese de tener tiempo para ver el proyecto antes de comprometerse.

Por lo general, los estudiantes tienen una razón, una especie de sueño sobre dónde quieren llegar, por qué se están especializando en el tema en el que se están especializando. El único consejo que puedo ofrecer es que no esperen hasta que se gradúen para comenzar a cumplir ese sueño. en una realidad ¿Te estás especializando en CS para la investigación? Póngase en contacto con un profesor y familiarícese con la investigación. ¿Estás en esto para entrar en la industria? Obtenga una pasantía y una idea de trabajar para la industria. El mundo se comporta un poco diferente de lo que imaginamos. Es más sabio descubrir temprano cuán diferente y evolucionar los sueños en consecuencia.