Durante el verano, tuve la suerte de entrar en Google Summer of Code. Aprendí mucho (probablemente más de lo que aprendí en la suma de todos mis cursos universitarios). Sin embargo, realmente me pregunto por qué no enseñan algunas de las cosas que aprendí antes en la escuela. Para nombrar unos pocos:
Me parece que pasan una cantidad significativa de tiempo enseñando otras cosas como estructuras de datos y algoritmos por adelantado. Si bien sigo pensando que es muy importante aprender desde el principio, ¿por qué no enseñan más de estos tres antes que ellos? ¿O es solo mi escuela la que no enseña mucho de esto?
No me malinterpreten, no creo que sea deseable que las universidades siempre enseñen las modas de programación más modernas, pero ¿no deberían mis profesores enseñarme algo más que "dibujar un diagrama antes de comenzar a codificar?"
La respuesta más simple a su pregunta es que los campos de la informática y el desarrollo de software son muy nuevos y no se comprenden muy bien. Aunque todas las disciplinas científicas y de ingeniería están avanzando más rápidamente en los tiempos modernos, otros campos tienen mucha más experiencia para aprovechar y hay una comprensión compartida mucho más amplia de cómo funcionan.
Por ejemplo, a pesar de los recientes avances en la ciencia de los materiales, los ingenieros civiles han sabido durante aproximadamente 2000 años cómo construir un Arco que no se caiga, y esto es algo que se puede enseñar y aprender en la universidad con relativamente poca controversia. Aunque estoy completamente de acuerdo con usted sobre las técnicas que los desarrolladores de software deberían aprender, este acuerdo se basa en la experiencia personal y el razonamiento informal. Para ser una "mejor práctica" socialmente aceptada, necesitamos datos cuantitativos que pueden ser muy caros de recopilar: ¿cuánto ayuda el control de versiones? Como ayuda ¿Examen de la unidad? Podemos razonar sobre la efectividad de varias técnicas, pero en realidad demostrar que la efectividad de manera concluyente sería muy costosa. Necesitaríamos ejecutar un proyecto de software completo y realista de principio a fin, varias veces, con grupos de programadores que tienen experiencia equivalente, utilizando diferentes técnicas. Como mínimo, necesitaríamos muchos datos sobre proyectos existentes que esos proyectos no estarían dispuestos a publicar.
Los ingenieros civiles tienen miles de años de puentes para mirar, con mucha información. Los desarrolladores de software, por otro lado, tienen solo unas pocas décadas de información, la mayoría de las cuales se mantiene en secreto, ya que hay poca motivación para que las organizaciones recopilen y publiquen información sobre la efectividad de sus desarrolladores, incluso si la están recopilando (que la mayoría no 't).
También hay cierta confusión de campos. El desarrollo de software, o "ingeniería" de software, es realmente algo diferente de la informática. Los desarrolladores de software necesitan un conocimiento práctico de la informática, pero trabajar en los límites de la complejidad algorítmica o razonar sobre el paralelismo no es algo que un programador que trabaja hará todos los días; Del mismo modo, un verdadero "científico de la computación" escribirá toneladas de código desechable que simplemente no funciona o no hace nada interesante, y no se beneficiará tanto del tipo de rigor que lo haría un producto de software real.
El surgimiento de Internet y la comunidad de código abierto puede proporcionar datos suficientes para comenzar a responder estas preguntas de manera concluyente, pero incluso si las respuestas estuvieran disponibles mañana, probablemente les tomará 100 años impregnar a la sociedad internacional hasta el punto en que todos estén de acuerdo en qué debe enseñarse en las escuelas.
Finalmente hay algunas consideraciones económicas. Ha pasado un tiempo relativamente corto desde que casi todos los involucrados en el desarrollo de software tenían acceso fácil y barato a máquinas dedicadas para ejecutar las herramientas de desarrollo que quisieran. Hace unas décadas, dedicar por completo una máquina a solo ejecutar sus pruebas, o incluso albergar un historial infinito de código fuente, habría parecido frívolamente caro para mucha gente.
Porque nuestros maestros:
Los estudiantes deben tomar el asunto en sus propias manos. Lo hicimos y todo salió bien, ¿no?
Leonardo da Vinci escribió:
Aquellos que están enamorados de la práctica sin ciencia son como un piloto que se sube a un barco sin timón ni brújula y nunca tiene ninguna certeza a dónde se dirige. La práctica siempre debe basarse en un sólido conocimiento de la teoría.
Las buenas escuelas enseñan tanto teoría (estructuras de datos, algoritmos, etc.) como práctica (pruebas unitarias, control de versiones, etc.). Esto requiere una mezcla adecuada de facultad para que ambas caras de esta moneda puedan enseñarse adecuadamente. Una facultad compuesta completamente de tipos teóricos sin experiencia real no funcionará. Del mismo modo, una facultad compuesta enteramente por practicantes no lo hará. Necesitas una combinación, y las buenas escuelas lo tienen.
La informática siempre ha sido algo contradictoria; La parte que se trata de las computadoras no es una ciencia, y la parte que es una ciencia no se trata de las computadoras.
Las universidades tienden a apoyarse más en el extremo de la 'ciencia' (algoritmos, datos, compiladores, etc.) porque esas cosas son mucho más 'atemporales' que las mejores prácticas actuales de la industria, que tienden a evolucionar y cambiar de año en año. El Control de versiones, por ejemplo, ha experimentado cambios sorprendentes en los últimos 5 o 10 años, pero big-O sigue siendo big-O, y el hashing, btrees y recursión siguen siendo tan útiles como lo fueron hace 40 años. En general, su idea es proporcionarle los cimientos suficientes para que pueda recoger herramientas como git y comprender lo que significa cuando le dicen que la estructura de datos subyacente es un gráfico dirigido acíclico de hashes SHA-1, y que los desarrolladores han trabajado duro para optimizar el número de syscalls para que esté enlazado a io.
Ahora, piense en dónde aprendió todo lo que tenía que saber para comprender esa última oración: si la respuesta es 'universidad', están haciendo un buen trabajo.
Todo es una moda pasajera. Aprenderá más en su primer año fuera de la universidad que en todos sus años en la universidad. La informática no tiene nada que ver con las computadoras.
College te ofrece una caja de herramientas llena de herramientas. Este es un destornillador, es una llave inglesa. PODRÍAS usar cada herramienta una vez en la universidad. Es cuando entras en el mundo real cuando realmente descubres lo que tienes. Separe los útiles del resto, los que desea dejar en casa en el banco de trabajo, por si acaso, y los que guarda en su bolsillo todos los días.
Tqm, Iso, Cmm, Agile, etc. Estas son todas las modas que vendrán y se irán, ninguna de las exitosas es más que sentido común. Todos los ingenieros y compañías exitosas usan un poco de sentido común, eso es lo que los hizo exitosos, pocos necesitaban un nombre para ello. El problema es que no puede vender el sentido común, un gerente no puede demostrar su valor para la empresa mediante la capacitación y la compra de sentido común sin un nombre atractivo. Ponle un nombre que sus superiores hayan leído en algún artículo de noticias o revista y el gerente mantiene su trabajo y tú conservas el tuyo. Muy pocas de las compañías que afirman seguir estas prácticas realmente lo hacen. La mayoría escribe un cheque a un consultor y entrega su certificado anual o de por vida a algún club para que puedan poner un gráfico en su sitio web o una etiqueta en la caja en la que viene su producto. Muchos argumentarán que esto es raro ... estado allí, visto, sucede. Todo esto es parte del negocio, a veces hay que cortar esquinas para mantenerse rentable y mantener las puertas abiertas y las luces encendidas. Los seguidores incondicionales de todas estas prácticas han argumentado que la última fue una moda pasajera y esta no es, la última realmente era demasiado cara para seguirla, esta no lo es. El último fue falso, acabas de contratar a un consultor, este es real. Al igual que los lenguajes de programación, estos también evolucionarán.
La clave es su capacidad para comprender las realidades de los negocios, el sistema universitario y su papel en él. Como todo en la vida, elige tus batallas. No es la universidad o el negocio o el gobierno o el trabajo de otra persona enseñarle lo que necesita o quiere saber. Es su trabajo buscar el número uno. Del mismo modo, no puedes culpar a nadie más por darte el tiempo para hacerlo, tienes que hacerlo. Te caerás del caballo, no eres una víctima, levántate y vuelve a subir, sin excusas, la vida no es un trato justo. Aproveche los folletos, no pretenda ser independiente. Y, sin duda, pague sus deudas, no le robe a una empresa un montón de folletos, sin darles algo (¿su mejor momento?) A cambio.
¿Por qué la gente piensa que cmm o ágil o cualquiera de los otros es una moda? ¿Por qué piensan que no lo son? ¿Por qué el profesor te enseñó a programar de esa manera? ¿Para evitar gotos o para evitar constantes o para evitar esto y aquello? ¿Es porque produce un código más confiable? Mejor desempeño de código? Reduce el error humano? ¿O es porque es más fácil calificar trabajos/programas que les dan más tiempo para investigar? ¿Es porque no saben programar y simplemente están siguiendo el libro de alguien más sobre el tema? ¿Le enseñaron que no puede tener un código de alto rendimiento confiable y fácil de mantener? Ni siquiera puede "elegir cualquiera" dos mantenibles interfiere con un rendimiento confiable y alto? A veces sacrificas la fiabilidad por el rendimiento. A veces no le importa la confiabilidad o el rendimiento, solo desea pasar de la versión 117.34.2 de otro programa de software de contabilidad a la versión 118.0.0. Su modelo de negocio es vender actualizaciones de versiones y soporte técnico y, en lo que respecta a los desarrolladores de software, cualquier robot antiguo que haga eso puede escribir el mismo código de la misma manera. Reemplace el quemado con uno recién salido de la universidad y siga vendiendo actualizaciones.
No hay respuestas universales a estas preguntas, debe averiguar cuál es su opinión, vivir con ella y defenderla. Cambia de opinión, vive con él y defiéndelo.
Pregunta todo ... ¿me quemaré si toco la olla caliente de la estufa? ¿Los efectos psicológicos de tener miedo causarán más daño que simplemente quemarse? ¿Hay alguna forma segura de probar la respuesta sin lastimarse?
Cuando pudiera pagarlo, compraría y eventualmente derretiría transistores, tapas, resistencias, etc. en mi dormitorio, todo lo cual tiene un mal olor distintivo. Es mucho más barato y fácil comprar un amplificador para su estéreo que intentar construir uno el día después de su primera clase de transistores. Linus es la excepción, por supuesto, es más fácil comprar un sistema operativo que escribir uno ... Puede hacer más cosas, aunque lo que aprendió en ese momento es diferente de lo que aprendió Linus.
El mundo dentro y fuera de la universidad adoptará estas fórmulas (cmm, ágil, etc.) para resolver problemas y, cuando salga la próxima, las dejarán caer con la misma rapidez. No tiene que usar el control de versiones para tener éxito, hay tantos éxitos con como sin ellos (bueno, en realidad, debido a la edad de la industria, hay muchos más éxitos sin control de versiones hasta ahora). Del mismo modo, puede tener éxito con pruebas mínimas (mire los nombres realmente grandes en la industria de la informática como ejemplos). Puede tener éxito probando su propio código, así como tener éxito siguiendo la regla de que nunca debe probar su propio código. Puede tener éxito usando emacs y puede tener éxito usando vi. Tienes que decidir qué mezcla funciona para ti y, si tienes suerte, encuentra un lugar para trabajar que esté de acuerdo contigo. Con el tiempo, lo que funciona para usted cambiará, desde herramientas a idiomas, desde estilo de programación hasta miedos, control de versiones, documentación, etc. Se casará y tendrá hijos y decidirá que querrá esconderse en la esquina de esa gran compañía con la gran empresa. paquete de seguro de salud con el trabajo aburrido y disfrute de sus hijos en lugar de ser el programador de moda en la pequeña startup.
Cuando salgas de la universidad y entres en el mundo real, escucha, trabaja y discute con los "viejos". Tienen décadas o siglos de experiencia combinada, trampas en las que han caído y que podrías evitar o probar por tu cuenta (tal vez te des cuenta de que no tienes que tocar la olla caliente para descubrir que te quemará). La mayoría habrá visto al menos una o dos de estas modas ir y venir, y en particular qué tan gravemente se quemaron y qué hicieron para recuperarse de ella. Conocen muchas formas diferentes de probar cosas, y también los nombres de los estilos de prueba que han aparecido y desaparecido. Lo que funciona, lo que no. Donde está el riesgo y cómo evitar perder el tiempo en una tangente. A medida que maduras y te conviertes en el viejo temporizador, pásalo hacia adelante. Pague por lo que aprendió tratando de enseñar a los que lo siguen. Recuerde enseñarles cómo pescar, no solo les dé un pez. Y a veces hay que dejarlos fallar antes de que tengan éxito, evitar que se quemen demasiado.
Lo que realmente quería decir aquí es que ahora estamos en una situación rara en la que podemos presenciar la evolución de un universo paralelo (y tal vez influir en él). Sí, la informática es una ciencia joven en comparación con la física. Pero al mismo tiempo ha evolucionado muchas veces. Dependiendo de dónde trabaje y con quién trabaje, puede observar a los ingenieros de hardware. Los lenguajes de programación en el mundo del hardware ciertamente no son nuevos, pero no han evolucionado tan rápido como el mundo del software. El software tuvo algunas décadas de ventaja. El hardware siempre ha pensado en los ingenieros de software como ciudadanos de segunda clase. Nuestro trabajo es fácil, su trabajo es difícil. (Tenga en cuenta que en realidad soy ingeniero de hardware y software). Lo interesante es que en este momento todavía están lidiando con lo que consideraríamos problemas elementales o infantiles. ¿Por qué necesitaría usar el control de versiones? Soy el único que trabaja en este chip. Su experiencia con gcc u otros compiladores baratos o IDEs gratuitos posiblemente no se pueda comparar con las costosas herramientas que uso, si la compañía pensara que usted es lo suficientemente digno de usarlo o incluso sabe cómo usarlo, le comprarían una copia. Y una larga lista de otras excusas. Tuve el placer de aprender vhdl y verilog y ser productivo en ambos dentro de una semana de lo que era casi un desafío de tal ingeniero de hardware (a pesar de que mi diploma decía ingeniero eléctrico, mi título de trabajo es ingeniero de software). Quería aprender estos idiomas, cuando las herramientas estaban disponibles para mí, me quedaba en la oficina hasta la noche y me enseñaba. A partir de ese momento, ese ingeniero en particular se dio cuenta de que lo que estaba diciendo era cierto, los lenguajes son solo sintaxis, los fundamentos de programación son los mismos, todas las herramientas hacen lo mismo. Sus manzanas y manzanas no son manzanas y naranjas.
En general, aún es difícil enviar el mensaje de que una de estas dos industrias paralelas tiene mucha más experiencia en lenguajes, hábitos de programación, control de fuente, pruebas, herramientas, entornos de programación, etc. que la otra. El problema que estoy tratando de resolver es tomar los diseños de hardware a medida que se desarrollan, crear simuladores funcionales asequibles que podamos vincular con una simulación (máquina virtual) del procesador para que podamos comenzar a probar el hardware y desarrollar la prueba y software entregable mucho antes de ir al silicio. No, no hay nada "nuevo" en esto, pero no tenemos ningún mecanismo para obtener el último código, realizar un seguimiento de los cambios en el código para ver dónde debemos enfocar nuestro tiempo. Ningún mecanismo para rastrear la documentación que define la interfaz de usuario (programación) para el hardware. La única copia de oro está en la bandeja de entrada del correo electrónico de alguien en forma binaria y solo cambia cuando, bueno, no es necesario que lea el verilog para averiguar qué está sucediendo. Espera, ¿qué verilog tiene cuántos años? ¿Ese error que pasé toda la semana en ti descubrí hace tres semanas y lo arreglé? Entonces, ¿solo volamos a algún lugar de vacaciones y fiesta durante seis meses esperando a que la gente de hardware termine su tarea y nos la arroje por la pared, o aprovechamos esta oportunidad para tratar de ser pacientes y optimistas y enseñarles que Hay métodos de sentido común que no son tan intrusivos que les permiten hacer su trabajo, hacer una copia de seguridad de su trabajo y compartir sus cosas para su revisión por pares ...
Recuerde que los ingenieros de hardware dejaron la universidad con una caja de herramientas nuevas y brillantes al igual que usted. Aprendiste 17 lenguajes de programación diferentes, de los cuales solo puedes usar uno, el resto de los idiomas que inventes en tu carrera se inventarán después de que dejes la universidad. Cuando salieron de la universidad, pueden decirte lo que saben sobre el cálculo y la teoría de la relatividad cuántos electrones hay en cada uno de los elementos y calcular la carga alrededor de una superficie gaussiana. Pero la mayor parte de su carrera es uno, cero y o no (oye, tenemos esos en común, todo lo que realmente necesita saber sobre computadoras, uno, cero y/o no ingeniero de hardware o software). De acuerdo con las leyes fundamentales de la física, el cálculo, los electrones no van a cambiar tan rápido como lo hacen los lenguajes de programación. Pero los fundamentos de la programación son los mismos en todos los idiomas y continuarán en el futuro. ¿Saliste de la universidad sabiendo eso o te fuiste pensando Java es diferente y mejor que C++ porque esto y aquello y lo otro?
Como cualquier otro negocio, el trabajo de las universidades es mantenerse rentable. Tienen que contratar a los académicos correctos para atraer tanto a los estudiantes correctos como a los dólares de investigación correctos y los tipos de investigación correctos para que la universidad sea rentable. Tienen que ofrecer las clases correctas para atraer a los estudiantes correctos y producir los graduados correctos para que, a medida que pasen las décadas, los empleadores, tanto cerca de la universidad como de lejos, reconozcan que esta universidad produce empleados productivos y rentables. (sí, y a veces tiene que atraer a los atletas correctos en el deporte correcto para obtener la cantidad correcta de tiempo de televisión y la cantidad correcta de reconocimiento de nombre e ingresos deportivos). Algunas universidades enseñarán C++ y Java, algunas nunca lo harán. Algunos inventarán CMM, y algunos enseñarán Ágil, otros no lo harán. Si la universidad tiene algún valor, hay algo para que aprendas. No te enseñarán todo lo que hay que aprender, pero tendrán algo útil. Aprenda que algo mientras está allí, reúna un número razonable de diversas formas de herramientas en su caja de herramientas. Deja la universidad y consigue un trabajo. Si su caja de herramientas apesta, tal vez encuentre otra universidad y nunca mencione la primera. Si es una caja de herramientas aceptable, use esas herramientas y cree algunas nuevas en su propio tiempo. Si es una caja de herramientas bastante buena, diga cosas buenas sobre esa universidad y los buenos académicos de los que aprendió esto y aquello y devuelva a la escuela lo que le dieron. Aunque no obtuvo todas las herramientas posibles en el catálogo universal de herramientas universitarias, se irá con un cierto subconjunto. Incluso si no te gradúas ...
Enseñé estas cosas cuando era adjunto en el Instituto de Tecnología de Oregón. Se les enseña, solo escasamente.
oh dios no me hagas empezar
una vez tuve el decano de CS en una universidad de buena reputación que me dijo que la programación orientada a objetos era solo una 'moda', por lo que no ofrecían ninguna clase de fantasía pasajera como C++
en cuanto a por qué no enseñan estas cosas, bueno, la universidad está allí para enseñarte los fundamentos de la disciplina, no necesariamente las mejores prácticas de la industria
La respuesta más simple es que estás estudiando informática y las cosas que has enumerado no están realmente relacionadas con el campo académico de la informática. El desarrollo de software puede ser algo que usted hacer con informática, algo que se basa en los bloques de lo que ha aprendido ... pero la informática y el desarrollo de software no son lo mismo.
Clases que le enseñaron el control de versiones, o cómo escribir pruebas unitarias efectivas ... eso le enseñaría un comercio, a saber, (buen) desarrollo de software.
Bueno, lo que pasa con las universidades es que necesitan enseñar cosas que realmente son universales. Algo así como el desarrollo ágil todavía es bastante nuevo y, a pesar de lo mucho que se habla en Internet, no se usa en todas partes, por lo que enseñarlo a toda una clase de estudiantes podría beneficiar solo a unas pocas personas que aterrizaron en tiendas ágiles.
Sin embargo, el control de versiones es algo que en estos días es inexcusable. Es algo que todos deben entender, es una herramienta que es casi tan útil como un compilador y CVS ha existido por más de 20 años. Los conceptos al menos deben ser entendidos por cualquier programador que abandone una universidad. Afortunadamente, si trabajas en grupo en la universidad, puedes tener la suerte de aterrizar con alguien que ya sabe sobre el control de versiones y convence a tu grupo para que lo use. Sé que me alegro de que esa persona estuviera en mi grupo.
Las pruebas unitarias también son prácticamente inexcusables. Lo único que diría es que el libro todavía está en desarrollo basado en pruebas y que el 100% de cobertura de código siempre puede ser más problemático de lo que vale. Pero las pruebas unitarias son extremadamente valiosas y deberían cubrirse en un curso de ingeniería de software. Me imagino que algunas de estas cosas están llegando a algunas universidades, pero todavía no las ha alcanzado todas.
¿Por qué no, de hecho? Mi experiencia al obtener mi título de CS fue más o menos la misma. La razón es que las personas que enseñan programación no programan, por lo que puedo decir. No es necesario enseñar esas cosas para la acreditación, los maestros no están familiarizados con esto y los estudiantes nunca desarrollan proyectos de importancia como parte de sus cursos. No hay ninguna motivación para enseñar programación, a diferencia de enseñar teoría CS o sintaxis Java.
Depende de la universidad. Me gradué en 2003, de una universidad australiana. En ese tiempo aprendimos UML, Pruebas unitarias, XP (y otras metodologías ágiles), junto con todas las cosas formales como Z, algoritmos y estructuras de datos, sistemas operativos, etc.
Sin embargo, no cubrieron las pruebas unitarias con gran detalle, sino que simplemente lo pagaron pasando el servicio por una conferencia. Hubiera sido genial haber aprendido a escribir pruebas unitarias efectivas, en lugar de simplemente "¿Qué es una prueba unitaria?".
En lo que respecta al control de versiones, lo utilizamos (CVS) en nuestros proyectos de programación a partir del segundo año.
Estoy muy de acuerdo con lo que dijo Glyph también. CS es un campo tan inmaduro, realmente solo en los últimos 50 años, que no sabemos qué deberíamos estar aprendiendo y qué es solo una moda pasajera. Déle 150 años, entonces las cosas podrían estar tranquilizándose más. La cantidad de proyectos fallidos del mundo real hace obvio que esta es una industria inmadura. ¡Imagínese si el 80% de los proyectos de construcción fallaron!
Los informáticos piensan que son matemáticos, no ingenieros, por lo que prefieren enseñar las partes de matemáticas que las partes de ingeniería. Las pruebas, el control de versiones y la documentación ya no son modas pasajeras, como tampoco lo están en ninguna otra disciplina de ingeniería.
Todo eso se puede cubrir fácilmente (superficialmente) en una sola clase sobre prácticas de desarrollo de software. No es parte de la mayoría de los currículos de CS, porque de eso no se trata CS, aunque creo que es útil alguna cobertura de esas cosas. Mi escuela tenía tal clase; no cubría el control de versiones, pero cubría UML, la recopilación de requisitos, las metodologías de desarrollo (varias ágiles y en cascada), las pruebas unitarias, las pruebas de integración, etc., y nos obligaba a trabajar en equipos de 4-5 para desarrollar un proyecto (una estafa bastante simple de Clue en Java). Si sintió la necesidad de más clases de Ingeniería de Software, estaban disponibles como cursos electivos.
A pesar de que nunca mencioné el control de versiones una vez en ninguna clase que tomé, la mayoría de mis amigos lo usaban para proyectos personales, tareas de clase, etc., por lo que no es como si no estuviéramos expuestos a él. Las personas que no lo recogieron por su cuenta se vieron obligadas a usarlo por un compañero de clase en el transcurso de una asignación de equipo.
La universidad está destinada a enseñar conceptos y teorías, porque esas son las cosas que son difíciles de aprender por su cuenta. El control de versiones es una herramienta, y bastante fácil de aprender. Úselo un poco, lea algunos tutoriales en la web y estará listo. Si necesita conferencias y tareas para descubrir cómo sacar algo de SVN, tendrá muchos problemas con las cosas que realmente SON difíciles.
Recuerda que hay muchas maneras de aprender cosas en la universidad fuera de las clases; aprovecha eso. Usted está pagando mucho para asistir a las clases y utilizar las instalaciones, así que aproveche todo lo que vale y asista a las reuniones de LUG y ACM, participe en equipos de proyecto (siempre hay algunos ME que construyen un robot que necesitan un programador), o consiguen un trabajo administrando el servidor del departamento de Humanidades. Recoja una computadora del muelle de carga del edificio de Ingeniería de Materiales, descargue un iso de Linux con su conexión rápida a Internet y juegue.
Creo que el problema es que las universidades no sienten que necesitan enseñarte a ser un profesional, sino que se centran en el lado académico de la programación. Pensé que debería haber al menos una referencia a los últimos métodos y técnicas que se utilizan en la industria, ya que estas cosas también son de interés académico.
En nuestro curso, nos enseñaron el Proceso de software personal, que cubría cosas como el tiempo de grabación dedicado a proyectos, buenos comentarios, etc., pero no se mencionan los fundamentos profesionales como el control de versiones.
Has nombrado 3, algunos de los cuales no creo que sean tan importantes para comprender los sistemas informáticos (por ejemplo, el control de versiones). Estas cosas son parte de un trabajo, y puedes convertirte en un buen programador/informático sin necesidad de saberlo.
de manera similar para pruebas unitarias: ¿por qué elegir pruebas unitarias? ¿Seguramente la prueba de usabilidad, la prueba del sistema, la prueba de aceptación del usuario y la prueba de aceptación de fábrica son más importantes? Bueno, lo son a menos que considere que su trabajo está completo una vez que el código se envía al departamento de mantenimiento :)
Piense en los otros conceptos que uso a diario, que serían de poca utilidad para un estudiante que acepte los fundamentos del software y los sistemas informáticos:
Lo anterior son todas "habilidades blandas" que no necesita necesita para escribir un buen código.
Sin embargo, si se están perdiendo las habilidades "difíciles", como las estructuras de datos y los algoritmos, entonces su posibilidad de escribir un buen código es casi imposible.
Aprendí todo eso en primer año, con la excepción del desarrollo ágil.
Se trata de elegir la escuela correcta, en mi humilde opinión. Si vas al top 10, aprenderás todo eso rápidamente.
En cuanto a CS Education en general, básicamente estamos pidiendo a los profesores que enseñen mucho (lenguajes de todos los gustos, estructuras de datos, eficiencias de tiempo de ejecución, cómo funcionan realmente las cosas a nivel de bits). Me gustaría plantear la pregunta: ¿Por qué los niños no se encargan de aprender más sobre Ingeniería de Software?
Es simplemente porque las estructuras de datos y los algoritmos constituyen el núcleo de la informática y, por lo tanto, son mucho más importantes. Las pruebas unitarias, el control de versiones y la metodología ágil no son más que herramientas del oficio (y si es necesario, se espera que uno las recoja en el trabajo).
Aprendí todo eso en la universidad. ¿Quizás depende de los cursos que elijas? Mis cursos fueron muy diversos (diseño de software, diseño de interfaz de usuario, comercio electrónico, inteligencia artificial, programación funcional, etc.). El diseño de software estuvo expuesto a patrones de diseño y pruebas unitarias (un gran proyecto que involucró varias cosas). Diseño de interfaz de usuario ... éramos un grupo de tres personas trabajando en un proyecto. No podríamos hacer nada sin el control de versiones, así que lo obtuvimos. Y el desarrollo ágil era algo de lo que nuestros profesores nos hablaban continuamente, pero lo dejaban en manos de cada grupo usarlo.
Encuentro que muchos estudiantes universitarios tomaron cursos "fáciles" o cursos que les darían un GPA alto. Otros se centran en lo que quieren aprender y están explorando en gran medida para encontrar qué campo les interesaría. Y luego están aquellos que saben exactamente en qué están interesados ... lo cual es bueno, excepto que tienden a no diversificar sus cursos.
Al igual que los estudiantes, cada universidad es diferente. Algunas universidades, o más exactamente, algunos profesores son resistentes al cambio o son flojos. Afortunadamente, la mayoría no lo son. Las teorías, conceptos, historia, etc. son importantes y vitales para cualquier plan de estudios de CS. Pero también lo está preparando al estudiante para su entorno de trabajo. No es sorprendente, los colegios comunitarios en mi área ofrecen cursos de CS muy actuales y aplicables. No tanto con la universidad grande, establecida y prestigiosa.
No enseñan tales temas porque la mayoría de las escuelas son académicas, no comerciales. Es decir, están diseñados para enseñar ideas y teorías, no para capacitarte en una carrera. El concepto completo de QA no tiene nada que ver con la informática más allá de pasar una prueba matemática. Además, las prácticas de control de calidad y los flujos de trabajo de desarrollo difieren enormemente de una casa de desarrollo a otra, por lo que enseñarles en la escuela es una pérdida de tiempo y dinero.
Para responder por qué estas cosas no son las primeras que se enseñan: los programas de pregrado generalmente lo entrenan para convertirse en un estudiante de maestría. Solo una vez que comience a elegir sus propios cursos (lo que generalmente ocurre en los últimos años) puede elegir aprender sobre cosas que se usan fuera de la academia. Es por eso que se centran en algoritmos, estructuras de datos, presentando problemas no resueltos, etc.
Personalmente, creo que está bien que estén haciendo esto. La programación no es tan fácil como muchos de nosotros lo hacemos parecer; mucha gente lucha con eso. Prefiero que estas personas entiendan primero cómo funciona un bucle for antes de descubrir el monstruo que es Perforce.
Las tres cosas que mencionas (pruebas unitarias, control de versiones, desarrollo ágil) se enseñan hasta cierto punto en el programa de Ciencias de la Computación de la Universidad de Groningen. Si eso es bueno o no, lo dejaré como una pregunta abierta; pero no es cierto que ninguna universidad te enseñe las "cosas prácticas".
Estos se basan en mis experiencias limitadas en un programa de CS antes de cambiar de especialización, y mi experiencia como pasante en una gran empresa de software. Las pruebas unitarias no se enseñan porque la mayoría de los programas que tiene que crear no son lo suficientemente grandes como para necesitar pruebas automáticas, se garantiza un conjunto específico de entradas para que pueda probar todo manualmente. Enseñarle cómo automatizar las pruebas también puede interferir con la calificación de su proyecto, ya que la mayoría de los proyectos se califican con scripts que ejecutan pruebas automatizadas, con un vistazo rápido al código para asegurarse de que no tenga int foo1; int foo2; y usas la sangría adecuada.
No sé por qué no se enseñaría el control de versiones, pero parte de él probablemente sea el tamaño de los proyectos. Nunca tuve ningún proyecto que fuera lo suficientemente grande para el control de versiones, y en general me refiero a más de 1000 líneas de código y tardé un semestre completo en escribir. Supongo que creen que te lo enseñarás a ti mismo si lo necesitas. Se suponía que los proyectos grupales que tenía eran proyectos de programación de pares, y ¿por qué usar el control de versiones si ambos están en la misma computadora?
No sé por qué el desarrollo ágil no se enseñaría, pero probablemente vuelva a ser lo mismo con el tamaño del programa. Si bien el desarrollo de Adgile es común con el nuevo software que se ejecuta en computadoras personales y servidores pequeños, generalmente no se usa en sistemas como mainframes IBM o en dominios problemáticos como banca o medicina donde la documentación es el rey. Probablemente también tenga que ver con el hecho de que el desarrollo ágil no existía hace 20 años, cuando se formaron muchos profesores.
No creo que la programación ágil sea una moda pasajera, pero al mismo tiempo me costaría mucho pensar en una forma en que un maestro pueda darte proyectos para que puedas aprenderlo ... A menos que te hayan dado el proyecto A proyecto B ampliar en a. El problema es el tiempo y el alcance. En un curso de 4 meses sería difícil.
El control de versiones y los métodos de prueba de unidad cambian y dependen del idioma o de la persona que los define.
Las estructuras de datos y algo son algo en lo que se puede trabajar en un entorno de clase. Honestamente, también requieren un poco más de esfuerzo para comprender que las pruebas unitarias y el control de versiones. Intenta recordar que parte de la universidad es enseñarte a enseñarte a ti mismo. Collage no tiene el mismo mandato. O al menos no en la misma medida. EN MI HUMILDE OPINIÓN.
Creo que los buenos programas de CS deberían enseñar los fundamentos que servirán de base para toda la educación de programación futura. Las metodologías de desarrollo como Agile y las herramientas de control de versiones son como modas; ellos van y vienen. Además, tienden a usarse en entornos de la industria y no académicos, por lo que creo que es raro que las universidades cubran cosas como las que probablemente aprenderán en el trabajo. No digo que sea correcto, pero esa es probablemente la mentalidad académica.
Estoy de acuerdo con lo que dices. Recientemente comencé a trabajar en el mundo del desarrollo de software y ya comencé a aprender sobre el desarrollo ágil, algo que nunca me enseñaron en la universidad.
El hecho puede ser que los profesores universitarios no se mantienen al día con las nuevas técnicas de desarrollo tanto como deberían. También pueden sentir que hay otras cosas más importantes en su plan de estudios.
Los profesores universitarios no saben cómo escribir software, simplemente lo investigan, lo enseñan y ocasionalmente descifran algún código que solo tiene que funcionar hasta que se publica el documento.
Es solo por personas como Titus que estamos obteniendo académicos que realmente asimilan la programación - Lea sus comentarios sobre ese tema aquí
Cuando era estudiante, leía libros en la biblioteca sobre Programación extrema, y lo discutíamos brevemente en las clases, las mismas clases que exigían que nos conformamos con el "Modelo de cascada" del desarrollo de software, donde la "compilación" es un paso importante. propio.
Todo lo mejor con tu carrera, espero que te gradúes, es bueno tener letras después de tu nombre. :)
Creo que depende del tipo de programa de Ciencias de la Computación en el que se encuentren, los que apuntan hacia el lado de Investigación y Ciencia y hay otros que se orientan hacia el lado de Implementación. Me negué especialmente contra ciertas escuelas que solo tenían profesores que permanecían en el mundo académico. Si no tienes profesores que no hayan estado "usando" lo que enseñan, todo está en su cabeza, literalmente.
Plug: Después de tomar BS en Comp Sci y MS en Soft Eng en la Universidad DePaul, me enseñaron principalmente instructores/profesores que enseñaban a tiempo parcial, lo cual estaba bien para mí porque preferiría que vinieran con una anécdota del día anterior y relacionarlo con la clase. Además, al tratarse principalmente de una escuela de cercanías/a tiempo parcial, la mayoría de los estudiantes tienen trabajos para usar lo que están aprendiendo.
El proceso de aprendizaje aún comienza con toda la teoría, pero generalmente nos preguntan "¿cuántos de ustedes realmente usan esto en su trabajo?" y la respuesta típica es "la usamos pero de forma simplificada o simplificada" y luego nos adentramos en los escenarios prácticos del mundo real.
Durante mi unidad escolar, las pruebas siempre estuvieron presentes. Aunque te inician en Java, nos hicieron usar ANT y JUnit para todos los proyectos. Lo cual fue un buen comienzo en la configuración de compilación y las pruebas unitarias.
Y la programación extrema se incluyó en aproximadamente 3 o 4 de las clases que tomé. Recuerdo que todos comenzaron con los 12 aspectos diferentes, desde la programación de pares hasta las pruebas unitarias (ver arriba). Y ahora parece que el foco está en Agile.
Entonces, la respuesta rápida es sí, hay escuelas que tienen un enfoque más pragmático que otras.
La mayoría de los proyectos de software universitario tienen que encajar dentro de los límites de una sola clase, lo que significa efectivamente un proyecto de 5 a 6 semanas que involucra entre 1 y 4 programadores sin experiencia razonables. Las pruebas unitarias y el control de la fuente solo se vuelven convincentemente efectivos una vez que escalas más allá de eso en proyectos a más largo plazo que involucran a más personas. Como resultado, es difícil incorporar tales técnicas en un proyecto de clase de una manera que no solo parezca requisitos inútiles.
La razón principal es que muchas (¿la mayoría?) Universidades consideran que tienen una meta diferente a la de una escuela profesional. Como tal, quieren enseñar a los estudiantes cómo aprender, y los principios fundamentales de la disciplina. Además, los algoritmos y las estructuras de datos se aplicarán a cualquier lenguaje de programación y no dependen de herramientas específicas (que pueden o no estar en uso por graduación).
En Ciencias de la Computación, eso significa algoritmos, estructuras de datos, teoría de computadoras, teoría de compiladores, etc. Lo que está enumerando se trata menos de entender cómo programar, cómo resolver problemas, etc. Se trata de la práctica de la programación (que, por cierto, es un libro increíble para cualquier persona en la universidad con la intención de trabajar como programador). Ahora, gran parte de esto no se usará en una posición de código de nivel de entrada, lo que lleva a algunas personas a pensar que no es útil. Estoy en desacuerdo. Creo que puede ser extremadamente útil. Sin embargo, no significa que después de obtener su título de CS, sepa todo lo que necesitará para trabajar como programador.
Lo que tampoco quiere decir que las cosas que mencionas no sean útiles. Son. Tendrá problemas para trabajar como programador si no los aprende, y creo que deberían enseñarse en la universidad, al menos en cierta medida. Vería la enseñanza del control de versiones, las pruebas unitarias, etc., de la misma manera que vería una programación de pregrado en arte, y la enseñanza de qué son los pinceles y cuáles deben usarse para varios casos.
Las pruebas unitarias y el control de versiones se enseñaron en cursos de informática de segundo año donde fui a la universidad. Las pruebas unitarias se incluyeron en la parte de las pruebas que también incluían diferencias entre el cuadro blanco y el negro, y una buena parte de las notas en las tareas de programación del tercer año fueron para un buen manejo de errores que puede provenir fácilmente de las pruebas unitarias.
El desarrollo ágil puede ser bastante difícil de enseñar en un entorno académico, creo. Si bien aprendí sobre el método de la cascada en teoría, no pude verlo en el campo hasta que me gradué y me mudé al mundo real que puede ser muy diferente de la academia, p. en 3er año hago todos los casos de errores extraños y casi paso una tarea en la que nunca toqué el corazón de lo que la tarea intentó enseñarme sobre los semáforos.
Además, ¿cuánto tiempo ha estado ágil y a qué tipo de ágil te referías? Hay muchas implementaciones diferentes de lo que he visto.
Idealmente, supongo que no tienen tiempo para enseñar esas cosas, o bien es más importante enseñar algo y los idiomas, cosas que la mayoría de los estudiantes tendrán dificultades para aprender.
La escuela es lo opuesto al autoaprendizaje, y dado que esas cosas (controles de versión, pruebas unitarias) son las más fáciles de aprender, deben asegurarse de que incluso el estudiante menos capaz sea capaz de realizar la programación básica y el algoritmo más importantes, y haz las "cosas alrededor" más tarde.
Esas cosas de las que habla cambian con el tiempo, y es difícil cambiar las herramientas, etc. A las grandes estructuras educativas les gusta mantenerlo simple.