¿De qué clase de informática aprendiste más y por qué?

Mi licenciatura fue en Matemáticas (con CS como mi “concentración”). El único curso que tomé como estudiante universitario que solo contaba para la concentración de CS fue Combinatoria. Ninguna de mis clases enseñó nada sobre programación (aunque supongo que se podría argumentar que enseñarnos sobre Turing Machines podría calificar) y solo recuerdo que uno tenía tarea con la programación (la teoría de la función recursiva usaba Prolog para la tarea, pero nunca se discutió en la clase sí mismo.)

Entonces, mi exposición a las clases de CS es mucho más reciente y a nivel de posgrado. Mi elección de clases fue más sobre elegir clases fuera de mi propio campo (sistemas). Por lo tanto, para mí, mi evaluación de estas clases se relaciona con la forma en que mejor ayudó a ampliar mi propia perspectiva. De estos, el que parece haber tenido el mayor impacto es, de hecho, el curso de Interacciones Human Computer que tomé de David Joyner. Es poco probable que alguna vez esté muy involucrado directamente en HCI: tengo poco talento artístico y la gente que dibuja figuras de palo me empuja al límite de mi capacidad, por lo que evito las formas habituales de interfaz.

Sin embargo, tomar esta clase me ayudó a comprender mejor cuán importante puede ser pensar sobre estas interacciones, incluso desde la perspectiva de los sistemas, incluso si no se me permitiera diseñar una interfaz de usuario. Pero me enseñó una forma diferente de ver los problemas en mi propio campo.

De hecho, de una de las conferencias, saqué una lección interesante que inspiró la propuesta de investigación que utilicé en mis aplicaciones de doctorado.

¿Qué aprendí de esta clase? Aprendí una nueva forma de ver los problemas. Vi una clase que proporcionó un modelo increíble para enseñar una clase con material considerable, haciendo que ese material fuera muy accesible, con énfasis en combinar la lectura con un pensamiento e investigación independientes e inspiradores dentro de las limitaciones de un curso de posgrado a gran escala. Ahora tengo un modelo de lo que quiero lograr en mi propia enseñanza: hacer que lo que enseño sea accesible, riguroso, desafiante y capaz de ampliar el pensamiento de los demás. No he tomado ninguna otra clase que haya proporcionado tanto como la que he tomado de esta clase y aspiro a ser tan bueno en mi propia enseñanza en el futuro.

Software Security, bajo el profesor Adam Doupe, me enseñó a pensar sobre el código desde una perspectiva de confrontación.

Si bien ser un profesor carismático ciertamente ayudó, fue su énfasis en aprender haciendo lo que nos permitió aprender el material profundamente. También utilizó el sutil truco de fomentar la competencia amistosa entre nosotros los estudiantes para extraer nuestras motivaciones para aprender y hacerlo bien. 😉

Para los proyectos, los estudiantes crearon sus propios alias de piratas informáticos (creo que el mío era “kevin_not_mitnick”) y se les asignó la tarea de explotar los servicios vulnerables ubicados en servidores remotos. Cada vez que rompías un servicio, veías que tu alias de pirata informático subía de rango en el marcador de la clase, ¡y por supuesto todos querían ser los 1337 más!

Para la final, nos dividimos en grupos y competimos entre sí en una competencia de Capture the Flag (CTF). Cualquier herramienta automatizada de ataque / defensa que hicimos durante el semestre fue un juego justo; El conocimiento que obtuvimos de las cientos de horas (sí, cientos ) que habíamos gastado buscando vulnerabilidades se aprovecharon.

No es sorprendente que semestre tras semestre, escuche a los estudiantes elogiar lo increíble que es su clase.

La clase de la que más aprendí, con mucho, fue la construcción del compilador con el Dr. Frederick C Harris, Jr. Esto no se debe simplemente al contenido del curso, sino por una variedad de razones, en particular: 1. mi propia falta de conocimiento. en la clase; 2. profesor y estructura de clase; 3. mis compañeros de clase / compañeros de grupo.

  1. Ya no veo los requisitos de Teoría de la Computación / Autómatas en el catálogo de cursos, pero recuerdo tener que obtener permiso para tomar Cumplidores porque todavía no había tomado Autómatas. Todos los demás en la clase ya lo habían tomado o lo estaban pidiendo en conjunto, así que yo era el único que estaba aprendiendo el lema de dfa / ndfa / pumping (y, en menor medida, gramáticas; habíamos tenido esto en un clase anterior pero menos profunda). No me sentí como mucho más para aprender, y ciertamente hizo que mi clase de Automata real fuera mucho más fácil (¡y divertida!) Porque podía relacionar todos los ejercicios con la experiencia de mis compiladores.
  2. La estructura de la clase fue que las primeras 2 semanas fueron solo algunos ejercicios simples (ensamblaje, gramáticas, árboles de análisis, bisontes, yacc, etc.) y luego las siguientes 14 semanas se dedicaron a construir un compilador de C en grupos de 3 a 4, del lenguaje fuente al código de ensamblaje MIPS (es decir, escáner, analizador, tabla de símbolos, código fuente a 3 direcciones y código de 3 direcciones al ensamblaje). Este fue uno de los proyectos de codificación más grandes en los que trabajé en la universidad (para ser sincero, pude haber invertido más tiempo en este proyecto que mi año anterior) y requirió * muchas * largas noches de insomnio. Esto me enseñó mucho sobre las prácticas de programación adecuadas y cómo trabajar en grupo en un proyecto grande (pero más sobre eso en el siguiente punto). Aparte de eso, las conferencias en clase eran casi siempre actividades de clase en las que un alumno estaría en la pizarra, el profesor haría una pregunta y el alumno en la pizarra explicaría la respuesta o alguien en la clase respondería y ayudaría. la persona en el pizarrón lo dibuja / escribe (o haga que cada estudiante, en orden o al azar, contribuya con una parte de la solución). Esto fue mucho más atractivo que tener al profesor en la junta, aunque tomó más tiempo (creo). Al final del semestre, casi todos vinieron preparados a clase porque no querían parecer tontos en el acto y tampoco querían dejar a la persona en el tablero colgando.
  3. Uno de mis compañeros de grupo había tenido bastante experiencia trabajando en proyectos grupales antes y nos presentó al resto de nosotros a algunos sistemas realmente buenos. En particular, configuramos un sistema de registro (EasyLogger ++), scripts de bash para pruebas unitarias simuladas (porque nos pareció más fácil simplemente alimentar los archivos fuente en nuestro programa que escribir pruebas unitarias) y leer el resultado de esas pruebas (en retrospectiva, podría haber sido mejor invertir en hacer pruebas unitarias correctamente, pero teníamos la idea correcta), un sistema de integración contiguo (travis) para que cada impulso a git ejecute nuestras pruebas y permita que todos sepan el estado actual de la compilación, un script de Python eso crearía un sitio web que tomara los resultados de nuestras pruebas (que incluían archivos graphviz para visualizar el árbol de análisis, el código 3AC y la salida del ensamblaje) y los mostraba muy bien, y una integración de Slack para que todos vean los resultados del CI y el sitio web. Creo que también decidimos seguir la guía de estilo de codificación de Google. Todo esto era nuevo para mí (tal vez había oído hablar de ellos, pero definitivamente no los había usado antes) y terminé aprendiéndolo todo el tiempo.

En resumen, Compiler Construction me enseñó cómo trabajar en grupo (tanto para el proyecto como durante las actividades en clase), Teoría de la computación / Autómatas, pruebas unitarias, integración continua, secuencias de comandos (bash y python), registro, mucho más sobre C / C ++ que nunca pensé que sabría, y todo esto además del propósito original de la clase (escribir un compilador / lenguaje de programación). Desearía que hicieran de esta clase parte de los requisitos para el título, pero también me preocupa que hacerlo reduzca nuestra tasa de graduación o obligue a la clase a diluirse, pero eso es una discusión para otro momento 🙂

Descargo de responsabilidad: el semestre que tomé Compiladores también fue mi semestre más ocupado (debido a la carga de clases, la temporada de entrevistas de prácticas y el horario personal), por lo que es posible que lo recuerde mucho mejor que mis otras clases. Además, mucho de lo que aprendí no se debió completamente a la clase en sí y probablemente habría aprendido en otra clase. Sin embargo, diría que la estructura de la clase apoyó este aprendizaje adicional.

A2A.

Aquí hay un poco de historia de fondo en mi experiencia en informática.

El primer (y único) curso de informática que tomé fue Aplicaciones de programación CS159 para ingenieros, en mi primer año y fue impartido por William Crum, un profesor del departamento de CS.

Se nos enseñaron los conceptos introductorios desde la arquitectura de la computadora (muy básica) hasta las funciones definidas por el usuario / programador y los punteros para archivar las instrucciones de E / S. Todo esto se hizo en C y algo de MATLAB.

Apenas lo supere y los conceptos eran difíciles de entender en ese momento. Me dejó un mal sabor de boca y lo dejé solo, pensando que no necesitaba volver a usarlo. Sin embargo, me vi obligado a regresar cuando mis asignaturas optativas, más adelante, me obligaron a programar para el control y simulaciones de circuitos motores, microcontroladores y desarrollo de aplicaciones.

Fue un gran problema, pero llegué a apreciar CS159 que me hizo hacer esto:

  1. Escribir un plan (preferiblemente en papel) antes de comenzar
  2. Prueba con repetición para entender cómo funciona

1. aprendí sobre la importancia de visualizar los algoritmos, la programación lógica, etc. Escribir en papel me ayudó a trabajar en pequeños pasos, de modo que pude tener una idea clara de lo que puedo hacer para lograr y evitar ser abrumado.

2. vino de tener que volver a visitar los punteros, confundiendo la sintaxis y la manipulación de datos. Realmente nunca los entendí al principio, así que ejecuté fragmentos de ejemplo, escribí programas simples y leí muchos mensajes de error. La repetición me hizo comprender mejor mis errores, ya que me mostró qué patrones buscar y cómo identificar mis errores si no quería quedarme atrapado durante horas …

Espero que este sea un buen ejemplo para aquellos que desean aprovechar al máximo sus clases de informática.

Ben, esto viene de alguien que no es estrictamente un estudiante de informática. Estudié gestión de sistemas de información en la Singapore Management University.

Para mí no fue una clase. Era el Proyecto del Año Final (tenía los mismos créditos que otras clases, por lo que, por definición, todavía era una clase). La única pauta que se nos dio fue: buscar un cliente que esté dispuesto a aceptar un artefacto de software dentro de 6 meses.

Entonces comenzó la búsqueda para encontrar un cliente. Se esperaba que la comunicación de gestión se utilizara en conjunto con algunos escritos técnicos de nosotros, los profesores solo intervendrían si el cliente fuera extremadamente irracional.

Los clientes generalmente serían del entorno empresarial y quienes solo sabían los problemas que enfrentaban en su empresa, sin conocimientos técnicos que nos indicaran la dirección correcta. La recopilación de requisitos no fue tan fácil ya que sus declaraciones de problemas estaban por todas partes. Dos personas de exactamente el mismo departamento describirían el problema de diferentes maneras. Esto cambió a lo largo del semestre no solo porque el cliente quería que cambiaran, sino que el coordinador del curso a veces sintió que podíamos desafiarnos aún más. Básicamente, obtenga más alcance del cliente o proponga características usted mismo . Aquí es donde las tácticas de ventas entraron en juego. “Hola chicos, ¿qué pasaría si agregáramos estos módulos? ¡Esto resolvería totalmente un problema que podría surgir en el futuro!”. Dado que no nos pagaban por estos proyectos (¡y por qué tendríamos que graduarnos!), No les importarían esas características siempre y cuando se entregaran las características básicas y tuvieran un interruptor de apagado para cerrar el apéndice.

Durante el desarrollo del producto, tuvimos que ocuparnos de nuestra propia estimación de tareas / programación / versiones de código / ágil / pruebas / implementación, etc. No se nos dio orientación técnica, lo que significaba que teníamos que estar en la cima de nuestro juego al investigar sobre el diseño patrones y mejores prácticas. Ejemplo: si está utilizando Hibernate ORM con Spring para sus propósitos, sabrá mejor qué capacidades tiene y qué efectos tendrá en la estructura de su código. Si se desataba todo el infierno (¡lo que siempre hacía con un respiro de 2 días entre sus propios sprints!), Teníamos que descubrir qué iba mal y documentar todo eso como resultados de aprendizaje (¡muy típico de un curso orientado a la gestión!).

Muchos estudiantes no pudieron entregar sistemas distribuidos para una gran base de usuarios, lo que significaba que su despliegue en vivo se arruinó. Algunos de los más inteligentes tomaron eso en cuenta y ejecutaron múltiples pruebas relacionadas con la arquitectura (como pruebas de carga, replicación de bases de datos, failover del servidor, etc.).

Finalmente, tuvimos que presentarle al coordinador del curso en presencia de otros dos profesores (y el cliente) que destrozarían la gestión del proyecto y el producto. He visto personas que no adoptaron medidas de seguridad y perdieron puntos debido a ataques exitosos de inyección SQL durante la presentación (por supuesto, todo esto fue controlado). Todo esto fue documentado y compartido con nosotros como mejoras necesarias para el próximo hito.

Entonces, los niños fuimos lanzados al mar de la ingeniería de software y tuvimos que combinar el conocimiento de los últimos 4 años en la universidad para mantenernos a flote y lograr el objetivo.

Yo, personalmente, aprendí MUCHO al caerme y levantarme. Mi primer hito fue terrible: mi equipo y yo fuimos regañados por hacer una presentación de mierda. No es que no hayamos trabajado duro, simplemente no hemos hecho lo suficiente. ¡Las cosas mejoraron a medida que hicimos un esfuerzo más relevante y ganamos el premio al mejor proyecto de año final al final! =)

Espero que esta respuesta sea relevante para lo que estabas buscando, Ben. ¡Salud!

Solo he tomado cursos de programación en desarrollo de software, bases de datos e inteligencia artificial. Estos han proporcionado la base de programación para un conjunto de habilidades comercializables en trabajos relacionados con el científico de datos. Debido a que mi estudio agrega también matemáticas, mi comprensión de la informática, a través de la programación, lo ha visto de manera abstracta. Esto se muestra en cursos de crédito en la meta del máster, en procesamiento de lenguaje natural, minería de datos, aprendizaje estadístico y lenguajes de programación. Estos avanzan a expensas de la calidad, la inteligencia artificial y el terreno.

La facultad y yo encontramos la clase de informática más valiosa, una sobre sistemas informáticos, sistemas operativos o redes informáticas. La facultad generalmente presenta estos conceptos con cursos de programación importantes, suficiente lectura de libros de texto y un buen esfuerzo para iniciar a los estudiantes en ciencias de la computación como se muestra en los lenguajes de programación. Esto es importante, porque la expresión de la informática a las máquinas se basa en la corrección sintáctica que se encuentra en los lenguajes de programación. Proporciona una lente a otro idioma, más restringido y preciso que el ordinario.

El curso más valioso para mí, y para cualquier persona interesada en aplicar computadoras, sigue siendo la organización y los sistemas informáticos . Esto sigue los fundamentos de la informática de Stanford a nivel de maestría. Los estudiantes de licenciatura también pueden estudiar este curso. El curso proporcionó los fundamentos de programación en C, un breve estudio del procesamiento y la memoria, y la interpretación de los programas como instrucciones en una máquina. Sirve como una base excelente para acumular cursos de informática, en cualquier área o rama que pueda necesitar. Sé que como deseo de estudio, este curso sienta las bases para los sistemas operativos y la progresión lógica a las redes de computadoras. El mayor interés en el concepto, no respaldado por años de estudio, aplica estos fundamentos al estudio de internet .

Probablemente sea Introducción a la programación o ingeniería de software.

Tuve una gran maestra para la Introducción a la programación, y ella cubrió básicamente toda la POO de una manera muy completa.

Había estado haciendo cosas durante bastante tiempo en este punto, pero todavía sentía que esa clase me ayudó a mejorar y me dio muchos conocimientos estándar que aún puedo usar en la configuración de OOP.

Obtuve ese material tan bien e hice tanto con lo que aprendí en esa clase que después de los primeros 2 días, no me presenté a ninguna de mis clases reales de OOP cuando eso llegó un par de años más tarde, y estaba en el Los mejores de la clase.

También tuve un gran maestro para SWE … fue divertido, pero también aprendí sobre la dinámica del equipo (ya que básicamente lidero el equipo), algunas buenas prácticas de DevOps, estándares que usan los codificadores corporativos y, en general, formas de desarrollar grandes proyectos sostenibles en lugar de solo entrar allí y hackearlo.

Diría que aprendí más de Ingeniería de Software y Estructuras de Datos. La clase de Ingeniería de Software me presentó el método ágil de pasar por un ciclo de desarrollo de software, así como aprender a trabajar en equipo y desarrollar las “habilidades blandas” necesarias para el trabajo. Si bien aprendí algo de pitón, las “habilidades blandas” que aprendí allí, como la comunicación efectiva, la presentación de mis ideas y el compromiso con un marco de tiempo, me han ayudado en la transición de la universidad a mi primer trabajo real. La clase de estructuras de datos era importante ya que no solo la necesitaba para tomar la mayoría de mis cursos de división superior, sino que era la base necesaria para comprender muchos de esos cursos. La mayoría, si no todos, los programas requieren almacenar y usar datos. Ese curso me enseñó sobre matrices, pilas, colas, árboles de búsqueda binaria, listas, hashes y claves. También tuve que aprender cuándo sería apropiado usar cada estructura de datos.

Tendría que decir un curso de posgrado sobre Algoritmo de Diseño y Complejidad, con contenido matemático significativo. Motivo: es fundamental conocer bien la teoría fundamental de cómo deben diseñarse los algoritmos para que sean eficientes y escalables en términos de tiempo y espacio. Cada informático termina escribiendo sus propios algoritmos tarde o temprano, y conocer los fundamentos es clave.

Introducción a la programación en C en el primer semestre de ingeniería.

En realidad, este no era un curso exclusivo de CS. Estaba disponible para todos los estudiantes de ingeniería en mi universidad.

Este curso básicamente me enseñó a escribir programas. Recuerdo al maestro que escribió este programa en la pizarra y a nosotros, copiando diligentemente cada personaje en nuestro cuaderno físico sin entender lo que significaba.

#include
#define PI 3.415
vacío principal()
{// <—Atrás, entonces, los paréntesis estaban aquí. 🙂
int r;
flotador a;
printf (“Introducir radio:”);
scanf (“% d”, r);
a = PI * r * r;
printf (“El radio del círculo es% d y su área es% f”, r, a);
}

Tan pronto como el maestro escribió este programa en la pizarra, surgieron muchas preguntas interesantes.

  • ¿Para qué incluye #include ?
  • ¿Qué es stdio.h
  • ¿Qué es el void ?
  • ¿Qué es %d y %f ?

Eran tiempos tan buenos e inocentes. No hace falta decir que esta clase fue mi primera exposición a la programación real. Aunque había estado escribiendo programas y sitios web simples desde el 12, este fue el punto de partida de mi verdadera comprensión de la programación.

¡Hoy, 10 años después, la programación me ha hecho bastante rico!

Mi clase de algoritmos con el Dr. Fernández . Trató de empujar todo el material son dos libros más pruebas. Supongo que su experiencia matemática tuvo algo que ver con eso. Por eso recuerdo la mayoría de esos algoritmos.

Algoritmos de Kevin Wayne y Robert Sedgewick en Coursera

Algoritmos, Parte I | Coursera

Algoritmos, Parte II | Coursera

El curso es realmente útil para cualquier estudiante de informática.

Human Computer Interaction, me enseñó cómo la informática no solo gira en torno al software / hardware, sino que tenemos que tener en cuenta la experiencia del usuario en el software que construimos para asegurarnos de que funcione de la manera que queremos que funcione. Para asegurarse de que no solo el código pueda ejecutarse perfectamente, sino también la importancia de una buena interfaz entre el programa y el usuario.