computer science - ser - ¿Qué curso de licenciatura en informática prepara mejor a los programadores para el lugar de trabajo?
que materias lleva un programador (17)
¿Mejores programadores recién salidos de la universidad? Hasta que las escuelas comienzan a enseñar conceptos como cohesión, acoplamiento, buenas prácticas de programación, control de versiones, gestión de la configuración, modelos de desarrollo modernos, no lo creo. Lo que comúnmente veo es que los que aprenden por cuenta propia quieren hacer lo correcto aprendiendo por sí solos o si tienen la suerte de ser contratados en una organización que predica y practica cosas buenas.
La idea aquí es lograr que los mejores programadores salgan de la universidad.
Creo que tendría que recurrir a los algoritmos, no es exactamente algo que pueda captar por su cuenta con mucha facilidad y creo que le permite ver la eficiencia y la corrección del software a un nivel más profundo.
También creo que la enseñanza de la programación real puede ser útil, pero aprendí la mayor parte de lo que aprendí sobre la programación en el trabajo, lo que me hace pensar que algunos de esos bloques de cursos de programación (no todos) podrían haberse aprovechado mejor.
Estos resultados serán parte de una carta que quiero escribir al departamento de CS en mi antigua escuela, creo que hay un montón de clases que tomé que no ayudaron en absoluto, y otras que creo que hubieran sido invaluables.
Creo que el curso que he tomado al máximo es de estructuras de datos y algoritmos . El conocimiento es independiente del progreso de la tecnología y proporciona las herramientas básicas utilizadas por los programadores de todo tipo.
Creo que el vacío académico debe ser llenado por organizaciones estudiantiles o proyectos estudiantiles independientes.
En mi universidad tuvimos el capítulo de estudiantes de la Asociación de maquinaria de computación específicamente para estudiantes de CS y también tuvimos una organización de estudiantes dedicada al desarrollo de videojuegos. Estas organizaciones ayudaron a enseñar a los estudiantes sobre el "mundo real" al reunir a oradores de la industria y obligar a los estudiantes a trabajar entre sí.
También recomendaría que los estudiantes que se especializan en Ciencias de la Computación en Negocios, si están interesados en liderar grupos de software o si desean que los estudiantes se vuelvan más expertos técnicamente, son menores en Artes Liberales. Sé que parece extraño, pero hice esto y descubrí que en realidad te enseña a pensar fuera de una perspectiva puramente técnica y matemática y cómo aplicar el pensamiento humano al desarrollo de software.
Diseño de base de datos
Programacion funcional
Programación orientada a objetos
x Diseño impulsado
El curso de Estructuras de datos y algoritmo, durante mi licenciatura, me ayuda mucho en mi lugar de trabajo
Esa es una pregunta difícil de responder, pero una cosa que creo que dificulta a los programadores en muchos programas de CS es la falta de codificación práctica. Es importante conocer la teoría de la informática, pero creo que muchos programas de CS altamente teóricos se caen al no requerir ejercicios de programación en sus clases. Por ejemplo, he visto muchas clases de inteligencia artificial que requieren investigación y documentos, pero no código. En mi opinión, es extremadamente importante comprender la teoría de la informática, pero es igualmente importante poder aplicarla.
Informática! = Programación.
Si está buscando mejores programadores, busque personas con educación de un programa universitario de 2 años que se centre específicamente en eso.
La clase en la que pasas el verano en una empresa real escribiendo software.
En serio, las clases de CS no están destinadas a producir buenos programadores. Están destinados a producir científicos informáticos que, como efecto secundario, también pueden escribir software.
Los dos más relevantes para el lugar de trabajo de mi licenciatura en Ingeniería de Software en la Universidad de Sheffield fueron el módulo de Software Hut en el segundo año, que involucró en el transcurso de un período en equipos que producen un producto de software para un cliente del mundo real. Creo que había tres clientes diferentes y los equipos compitieron entre sí para producir el mejor sistema para ellos.
Luego, en el cuarto año, un tercio de las marcas provino de dirigir una compañía de software, nuevamente para clientes del mundo real. Si bien no nos gustaba totalmente dirigir un negocio real, debido a las restricciones de propiedad intelectual de los productos que producíamos (ya que todavía éramos estudiantes en la Universidad, eran dueños del trabajo), nos involucramos en la mayoría de los aspectos de la administración de la empresa. Redacción contable / contrato.
Los más importantes y relevantes no son los cursos de CS. Necesitarás comunicarte bien. Cualquiera que sea el curso, puede llegar a ser un mejor oyente / lector y un mejor escritor / orador.
Mi opinión (como directora de inglés) es que un día en una oficina vale una semana en la escuela y, como tal, si puedes encontrar una manera de obtener algo de experiencia, valdrá la pena.
Aparte de eso, solo confíe en su habilidad, juegue a sus puntos fuertes y esté preparado para buscar en Google cualquier cosa que no sepa.
Si desea diferenciarse de la multitud de TI habitual, asegúrese de que puede comunicarse correctamente, ya que es increíble el número de graduados que no son "mejores".
Nada supera el conocimiento que se obtiene al construir proyectos, realmente no importa cuál es el curso, si está tomando bases de datos relacionales, cree un proyecto de sistema de bibliotecas, si está usando lenguaje ensamblador cree algo como herramientas de PC con ensamblaje de 32/64 bits .
Solo puedes convertirte en un mejor programador haciendo "Programación" no solo tomando cursos y obteniendo un alto GPA.
Todavía tengo que encontrar un buen curso CompSci que prepare adecuadamente a los ingenieros de software para el lugar de trabajo. Si encuentra uno que tenga lo siguiente [aunque dudo que pueda llamarse CompSci, es más como Real-World Software Design, que es una bestia muy diferente].
La informática es una materia más teórica que tiene implicaciones muy reales en el mundo, pero es más útil desde un punto de vista académico. El diseño de algoritmos, por ejemplo, es fantásticamente útil para los ingenieros de software, pero no es realmente útil para el consumidor. Por ejemplo, saber cómo construir un algoritmo de ordenamiento rápido o entender el recorrido de la lista enlazada no es realmente tan útil en el entorno actual de ingeniería de software; por supuesto, entender la teoría es útil para elegir las herramientas adecuadas para el trabajo, no me malinterpreten . Como desarrolladores, muchos de nosotros dependemos de los resultados del mundo de la informática para mejorar nuestras herramientas de desarrollo, de hecho, sin ellos muchos desarrolladores se quedarán en la dificultad, pero pondrán a un graduado en informática frente a un usuario y le pedirán que diseñe un El software significativo para ellos y el intelecto académico caerá en pedazos porque los dos hablan idiomas completamente diferentes.
Un curso mucho más útil para los ingenieros de software incluiría tantos [y posiblemente más] de los siguientes componentes que se me ocurren de la cabeza:
- Lenguaje de programación: flujo de programa básico, paradigmas, sintaxis, etc. Esto se enseña principalmente muy bien, por lo que no me limitaré demasiado a este. Aunque sería útil si se enseñaran algunas clases de lenguajes de programación completamente diferentes, por ejemplo, aprendí C, Pascal y VB 3 (no recuerdo la versión exacta). Sería mucho más útil si los programadores aprendieran al menos un lenguaje funcional, un lenguaje imperativo, un lenguaje declarativo.
- Depuración : al escribir aplicaciones nTier [que son muchas / la mayoría de las aplicaciones del mundo real], sería útil poder averiguar dónde está yendo algo mal, hasta el nivel de protocolo si es necesario. Las herramientas de análisis como WireShark son útiles para esto.
- Dispositivos de comunicación : XML, XQuery, XPath, XSL, XSD [ya que estos parecen ser utilizados tan extensamente].
- Diseño de base de datos relacional : esto ya se enseña razonablemente bien.
- Ajuste de rendimiento de la base de datos relacional : solo diseñar las tablas no es suficiente, saber cuándo es apropiado indexar ciertos campos y cuándo no lo es, también es importante y no parece estar cubierto en muchos cursos.
- Normalización de datos Esto también parece enseñarse razonablemente bien en muchos casos. Aunque la mayoría de los estudiantes parecen salir al mundo real arrojando las teorías que se les enseñaron: "siempre usarás la Forma normal de Boyce-Codd", etc., sin pensar realmente en las implicaciones de esas teorías. A veces en el mundo real tenemos muy buenas razones para romper las reglas.
- Optimización de consultas : la escritura de consultas básicas a menudo parece estar en los límites externos de las zonas de confort de los graduados, la optimización debe enseñarse. Además, las herramientas como los perfiladores de consultas deben enseñarse para ayudar a los estudiantes a depurar problemas de rendimiento con las aplicaciones.
- Procedimientos almacenados / activadores : aún no he encontrado a un estudiante que pueda escribir un procedimiento almacenado o activar o usar cualquiera de los dos de manera efectiva. Selecciones / Uniones / Selecciones anidadas parece ser el límite de lo que se enseña cuando se trata de diseño de consultas.
- Algoritmos básicos : esto se enseña bastante bien en mi experiencia, pero muchos estudiantes no parecen tener idea de cómo decidir qué algoritmos se aplican a qué situaciones sin que se les diga "usar tal y cual algoritmo, resuelva este problema". Sería útil si pudiera decir, "resuelva este problema", y son como, bueno, tengo una serie de algoritmos que serían útiles en esta situación, esto es lo mejor debido a x, y o z Razón y aquí es cómo se puede aplicar para proporcionar una solución.
- Recursión : aún tengo que encontrar un enfoque que pueda enseñar la recursión, parece que lo logras o no. Uno de estos días encontraré una buena metáfora que hará que esto sea comprendido incluso por el programador más básico.
- Abstracción : esto parece ser algo que muchos cursos pasan por alto a pesar de ser uno de los principios fundamentales de la POO.
- Código de refactorización : saber cuándo refactorizar y, lo más importante, cuándo no hacerlo.
- Reutilización de código : parece que muchos cursos están escupiendo y pegando monos. ¡Esto no es lo que se supone que significa reutilización de código!
- Control de fuente : no aprendí sobre control de fuente hasta mi 3º o 4º trabajo de programación, y no conozco personalmente a un solo ingeniero de software que haya aprendido el control de fuente como parte de su curso ... ¿por qué?
- Copia de seguridad y restauración : no he oído hablar de ningún curso que enseñe esto. ¿Cuántos programadores principiantes han perdido todo su trabajo porque simplemente no pensaron en respaldarlo? Sé que lo he hecho en el pasado, aunque no recientemente. No es que ignorara la copia de seguridad, pero como dice el dicho "nunca me pasará". Le sucederá a usted, ¡y garantizado que será justo antes de que tenga que demostrar todo lo que acaba de perder!
- Mantenimiento del sistema de archivos : está bien, algunos de los cursos pasan por alto esto brevemente, pero muchos no.
- Escribiendo especificaciones de diseño de buena calidad : esto siempre se proporciona como un resumen de los cursos, pero rara vez se le pide al estudiante que diseñe esto por sí mismo. Escribir un alcance de trabajo y comprender las plantillas de documentos parece estar muy lejos del alcance de la mayoría de los cursos de software.
- Documentación del usuario : los usuarios no piensan como usted, al entregarles un software que se "explica por sí mismo" o que "un idiota tan simple puede usarlo" estallará en su cara. Hay un famoso dicho que dice: "Programar hoy es una carrera entre ingenieros de software que se esfuerzan por crear programas más grandes y mejores a prueba de idiotas, y el Universo que intenta producir idiotas más grandes y mejores. Hasta ahora, el universo está ganando". Escriba la documentación del usuario que puede seguir a un niño de 8 años; puede que le resulte doloroso escribirla, pero una vez que está terminada, y para siempre, se lo agradecerá.
- Documentación técnica : es decir, sería útil si los estudiantes pudieran usar Sandcastle, nDoc o cualquier otra herramienta de documentación.
- Planificación de pruebas : diseño de las pruebas y el software que permite realizar pruebas. nUnit o similar sería una gran herramienta para enseñar en cursos de desarrollo de software. De hecho, la enseñanza de cualquier marco de prueba sería mejor que no enseñar ninguna ... como parece ser el caso.
- Pruebas FAT / SAT / UAT : sería útil comprender varios escenarios de prueba en el mundo real, como las comprobaciones de seguridad, las pruebas de aceptación de fábrica y las pruebas de aceptación del usuario. Cerrar sesión para su software es tan crítico como desarrollarlo. Si no entrega lo que el cliente pensaba que estaba recibiendo, no se le pagará, sin importar cuán brillante sea su solución desde un punto de vista técnico.
- Arquitectura de software : comprensión de los diferentes componentes de las aplicaciones de n-tier del mundo real, ventajas e inconvenientes de su uso.
- Interacción con los usuarios : tal vez esto no sea realmente ciencia computacional, pero aprender a hablar con personas que no están a menudo en su longitud de onda y no piensan de la misma manera que lo hace, esto va con la comunicación, pero en realidad es algo que los desarrolladores necesitan ser consciente de
- Sentido común - Ding, ding, ding, ding - ¡hay muchos programadores por ahí sin una onza de esto! Los cursos están diseñados para demostrar que puedes pensar por ti mismo, no entiendo por qué tantos graduados llegan al mundo real pensando que todo lo que necesitan hacer es aplicar las reglas que se les enseñó a ciegas sin pensar en las razones y las implicaciones. Repetiré lo que dije antes: en el mundo real a veces encontramos muy buenas razones para romper las reglas. No los seguimos a ciegas, y tampoco los rompemos a ciegas. El desarrollo de software es un arte, y como todas las artes, debemos saber cuándo podemos y no podemos y, lo más importante, cuándo debemos y no debemos romper las reglas. Como graduado, has aprendido las reglas, lo has demostrado. Ahora necesita hacer lo que el curso realmente estaba tratando de enseñarle: aplique lo que ha aprendido para pensar por sí mismo.
- Escucha : se sorprendería de la cantidad de veces que veo el código escrito porque el desarrollador "pensó que sabía lo que quería el cliente" en lugar de escuchar realmente lo que el usuario está diciendo y comprender sus necesidades reales.
- Comprensión - Va de la mano con la escucha.
- Habilidades de comunicación
- Hablar con el inepto técnico , es decir, una gran parte de su base de usuarios
- Mediación del proyecto : vender sus ideas a quienes escriben los cheques.
- Priorización : cómo decidir qué características son más importantes que otras.
- Presupuesto - estimación del tiempo
- Gestión del tiempo : cómo hacer las cosas a tiempo cuando todos los que te rodean están obstaculizando tu tiempo y no se preocupan por tus plazos. Al igual que cuando todos tus amigos quieren que vayas al pub a tomar una pinta o diez cuando tienes un trabajo de curso que aún no has empezado para el final del día de mañana.
- Creep del alcance : cuándo decir, no, eso no está en la especificación / presupuesto.
E incluso si lograba aprender todo eso en su curso, me atrevería a decir que todavía aprendería más en tres o cuatro meses de prácticas en una consultoría de desarrollo de software de un calibre decente que en todo el curso. Aprendí más en mis primeros 6 meses después de mi licenciatura que en mi curso de 3 años. Es cierto que me hubiera caído de bruces sin muchas de las cosas que aprendí en ese curso, pero hubo muchas cosas que se enseñaron innecesariamente que podrían haber sido reemplazadas por un contenido mucho más útil.
Todo depende de lo que quieras programar y del tipo de problemas en los que estés interesado.
Obviamente el combo general de
Matemáticas discretas (su lógica, teoría de grafos, alguna teoría de números y recurrencia)
Diseño de algoritmos (aprender varios modelos de resolución de problemas, diseñar paradigmas, pensar en recursos de computadora)
Ingeniería de software (gestión de proyectos de software, trabajar con componentes existentes, trabajar con pares o en grupo, controles de versión, patrones, etc.) como este
Cursos intensivos de programación (tomé este curso ) que le enseñan ideas generales sobre cómo abordar un problema, reuniendo sus ideas antes de escribir una sola línea de código, exponerse a diferentes paradigmas de programación
te preparará para la mayoría de los desafíos de programación.
Después de eso, todo depende de en qué dominio quieras trabajar. Pregúntele a su asesor, a los estudiantes de último año de su universidad y a los profesores y hable con ellos sobre sus objetivos e intereses. Te aconsejarán mejor que nadie aquí puede.
Sin embargo, no ignore el pensamiento crítico, escribiendo clases. Toma clases que te permiten presentar tus ideas y prepararte para hablar en público.
Una clase que habíamos requerido para construir algo como un proyecto de servicio comunitario. Esto requería que usáramos y aprendiéramos todo el gambito de Ingeniería de Software.
Sin embargo, a menos que el maestro decida poner algunas bolas de tornillo en la clase cuyo objetivo es tratar de hacer las cosas lo más difíciles posible, faltará mucho en un curso como este ...
Yo diría que es un empate entre los Sistemas de Base de Datos y un curso de Proyecto de Ingeniería de Software. Ninguno de los cursos es requerido para obtener un título universitario en mi escuela, pero puede ser tomado por estudiantes universitarios. Tener algún conocimiento de las bases de datos es probablemente más necesario que los algoritmos para la mayoría de los programadores. Trabajar en un equipo de proyecto, incluso en un proyecto de curso, puede ayudarlo a comprender la dinámica del equipo y cómo trabajar en un entorno de equipo.
Por otro lado, creo firmemente que una buena comprensión de los temas fundamentales de la informática, incluidas las estructuras de datos, los algoritmos, los sistemas operativos, etc. son fundamentales para preparar a uno para crecer como programador.
- Negocios 101
- Politica de oficina 200
- Nada es académico en el mundo real.
En realidad, al entrar en un trabajo de programación, no se espera que seas un desarrollador senior desde el primer día. Aprender algunos aspectos fundamentales de la codificación sin duda te lleva a un largo camino, pero al alza, veo a unos cuantos estudiantes de informática luchando en el mundo real. porque realmente no saben en qué se están metiendo el día 1. Luchan con los dominios de negocios y comprenden por qué hacen lo que hacen. No saben con quién comunicarse con otras personas de negocios.