¿Por qué los proyectos de software en CS en la universidad parecen programas de juguete?

P: ¿Por qué los proyectos de CS en la universidad parecen programas de juguetes?

Porque ellos son. Las tareas de CS están destinadas a cumplir un propósito, y es demostrarle a un profesor si usted entendió o no y podría aplicar un concepto muy específico aprendido durante la clase. Un curso de programación o algoritmos no está diseñado en torno a los requisitos del usuario y del negocio, el control de calidad, el diseño o la eficiencia. Es implementar un poco de conocimiento y luego pasar al siguiente. Realmente no hay tiempo en un solo semestre (o trimestre o trimestre o período de clase de cualquier duración que se le asigne) para cubrir las mejores prácticas, conceptos y paradigmas de programación de aprendizaje, y luego aprender lo suficiente como para aplicar a un proyecto de programación considerable que usted podría considerarse más que “del tamaño de un juguete”.

No, a menos que haya una clase dedicada a la creación de aplicaciones del mundo real, o facsímiles de.

Tomé una clase, creo que se llama “Algoritmos Aplicados”, donde trabajamos en pequeños equipos de 3 a 4 estudiantes, y nos dieron requisitos comerciales muy flexibles que nuestros programas tenían que satisfacer. Hubo una tarea en el aula, er, tarea que teníamos usando datos reales del registrador de nuestra universidad, y la abordamos pensando que esto realmente podría ser algo útil, con consecuencias y aplicaciones en el mundo real. Tuvimos reuniones con nuestra “usuaria” (una mujer amable en la Oficina de Registro) y señalamos sus requisitos y casos de uso y todo. Fue muy emocionante y agotador para 4 estudiantes con poca o ninguna experiencia en el “mundo real”.

Pero con solo unas pocas horas a la semana para dedicarnos a trabajar juntos en esto, no había forma de que pudiéramos producir un programa de alta calidad y totalmente funcional que estuviera listo para la producción. Todavía éramos estudiantes con una carga completa de cursos y horarios de trabajo y responsabilidades extracurriculares. Solo tuvimos entre 5 y 6 semanas para obtener un prototipo de programa; este es nuestro último proyecto del semestre, si recuerdo, antes de los exámenes finales. Ni siquiera teníamos nada cerca de una interfaz de usuario, solo la línea de comandos.

Para la escala, los proyectos en los que trabajo ahora (y estoy en desarrollo web, no en ingeniería de software) pueden tomar varios meses antes de que estén listos para la producción. Y ahora hay muchos más jugadores y partes móviles que, por ejemplo, un solo usuario, un solo administrador y otros 2 o 3 programadores. Y es un equipo completo de diseñadores y desarrolladores y especialistas en garantía de calidad que dedican potencialmente hasta 8 horas al día en un solo proyecto (aunque esto es realmente muy raro, más bien unas pocas horas aquí y allá divididas entre varios proyectos). “Del tamaño de un juguete” de hecho.

Sin embargo, lo último que escuché fue que nuestro proyecto de asignación de aula sirvió de base para lo que los futuros grupos de estudiantes terminaron usando para crear prototipos de un producto que funciona para nuestro registrador, aunque escuché esto a través de la vid (uno de los estudiantes con los que trabajé en el proyecto) y podría estar muy, muy equivocado. Tal vez el Registrador todavía está haciendo tareas en el aula a mano.

Porque generalmente lo son. No tiene clientes, ni usuarios, ni equipo, y solo un mínimo de requisitos.

La ingeniería de software industrial del “mundo real” generalmente está impulsada por las necesidades de los clientes o los deseos de los diseñadores de productos. El proyecto debe realizarse de manera oportuna y puede requerir la experiencia diversa de un equipo. Y el software probablemente necesita ser compatible y mantenido.

Todo esto cambia su forma de pensar, priorizar y desarrollar software y, si se hace correctamente, produce una pieza de ingeniería utilizable, útil y robusta. Esto está en marcado contraste con los habituales hechos únicos para la clase.

Como desarrollador web, cuestionaría la competencia de un jefe que me pidió que priorizara algoritmos eficientes y un “buen diseño” sobre las necesidades comerciales inmediatas . Sinceramente, nunca he visto un proyecto web moderadamente complejo que tenga cualquiera de esas cualidades, independientemente de todos los esfuerzos y recursos mal dirigidos para tratar de lograr esos objetivos (pista: tratar activamente de lograr un buen diseño generalmente resulta en un peor diseño en proyectos relacionados con la web). Pueden existir excepciones en google o facebook, pero seamos honestos, las compañías tecnológicas en las que la mayoría de nosotros trabajamos no tienen ni cerca de su nivel de escala (o talento de ingeniería) para exigir y lograr un “buen diseño” además de cumplir con todos los negocios de la compañía necesidades

Esta famosa entrevista de 2005 con Linus Torvalds (creador de Linux), resume mejor la idiotez de los desarrolladores / gerentes más mediocres que intentan poner nuestra propia “excelencia técnica” egoísta antes que las necesidades del negocio:

Linux Times: una revista Linux en línea

Preston : ¿Tiene algún consejo para las personas que comienzan a emprender grandes proyectos de código abierto? ¿Qué has aprendido al administrar el kernel de Linux?

Linus Torvalds : Nadie debería comenzar a emprender un gran proyecto. Comienzas con un pequeño proyecto _trivial_, y nunca debes esperar que se agrande. Si lo hace, simplemente sobrediseñará y, en general, pensará que es más importante de lo que probablemente sea en esa etapa. O peor, puede que te asuste el tamaño del trabajo que imaginas.

Así que comienza con algo pequeño y piensa en los detalles. No pienses en un panorama general y un diseño elegante. Si no resuelve una necesidad bastante inmediata, es casi seguro que está sobre diseñado. Y no esperes que la gente intervenga y te ayude. Así no es como funcionan estas cosas. Primero debe obtener algo a medio camino _util ,_ y luego otros dirán “oye, eso _ casi_ funciona para mí”, y se involucrarán en el proyecto.

Y si hay algo que he aprendido de Linux, es que los proyectos tienen vida propia, y no deberías tratar de imponerles demasiado tu “visión”. De todos modos, a menudo te equivocas, y si no eres flexible y no estás dispuesto a recibir aportes de otros (y estás dispuesto a cambiar de dirección cuando resultó que tu visión era defectuosa), nunca obtendrás nada bueno.

En otras palabras, esté dispuesto a admitir sus errores y no espere llegar a ningún lado en ningún tipo de período de tiempo corto. He estado haciendo Linux durante trece años, y espero hacerlo por bastante tiempo todavía. Si hubiera esperado hacer algo tan grande, nunca habría comenzado. Comenzó pequeño e insignificante, y así fue como lo pensé.

El software se construye componiendo una gran cantidad de conceptos simples de CS. Cada concepto generalmente puede demostrarse mediante un pequeño programa.

El curso debe darle una idea de esos conceptos simples, por lo que el plan de estudios no es inapropiado.

Ahora , la ingeniería de software, por el contrario, debe enseñarle cómo construir y mantener programas grandes. Una cosa completamente diferente.

Descargo de responsabilidad: no tengo un título de CS. Tengo un título en matemáticas y terminé como desarrollador.

Creo que has notado lo correcto, pero eso no significa que el plan de estudios de CS esté equivocado. Supongo que su pregunta es que el trabajo de un profesor de CS es enseñarle los conceptos detrás de la informática, no enseñarle a ser un desarrollador de software profesional. Eso sería formación profesional (y no hay absolutamente nada de malo en eso). Como he dicho muchas veces sobre quora: CS y el desarrollo de software profesional tienen muy poca relación directa entre sí. Es algo así como la física y la ingeniería, creo. El primero informa y enriquece al segundo, siendo el último una aplicación pragmática de la investigación realizada en el contexto del primero.

Me parece un poco sorprendente que sus profesores no soliciten algoritmos eficientes al ver cuán fijos en las minucias big-O parecen ser muchos graduados de CS. Pero no es sorprendente en absoluto que su profesor de CS no lo esté calificando en el diseño en general.

Porque son, o más exactamente, son ejercicios educativos. Por razones que otros ya han sugerido.

Uno no comienza a aprender cómo armar las piezas, la unidad se involucra en un programa de investigación, una pasantía, un trabajo después de la escuela / verano, o un proyecto de servicio, o un equipo competitivo de robótica, etc., etc. ., etc.

También es lo racional detrás de los programas cooperativos que requieren formalmente pasar un tiempo en la industria como requisito de graduación.

Porque los profesores quieren ver lo que has aprendido en tu currículum. No están preocupados por la eficiencia o su enfoque porque ese no es el objetivo de un título de CS.

Si puede resolver un problema, es lo suficientemente bueno como para tener ese grado.

Enseño idiomas de computadora en una universidad local. Les puedo decir que me encantaría poder enseñar algoritmos eficientes y un buen diseño, pero desafortunadamente no hay tiempo.

En cualquier semestre dado hay estudiantes que no tienen aptitud para el pensamiento lógico, no importa la programación. Luego tienes estudiantes que lo entienden y pueden escribir código que funciona y hace lo que se supone que debe hacer. Luego tienes los estudiantes que son muy buenos. Lo obtienen de inmediato y no solo hacen que el código haga lo que se supone que debe hacer, sino que lo hacen con destellos. Veo a uno de esos estudiantes una vez cada dos semestres, más o menos.

Al último grupo se le podría enseñar una buena técnica dado el tiempo si fueran los únicos en la clase. Pero no lo son. Tengo que lograr que incluso el peor alumno comprenda para qué se utiliza el ciclo “Para el próximo” y por qué hace lo que hace. Tratamos de hacer que el curso sea lo suficientemente desafiante para los estudiantes inteligentes, pero no tanto como para que el estudiante pobre no tenga ninguna oportunidad. Recuerda, esto no es un trabajo. No puedo decirle a los malos estudiantes que están despedidos y salir y solo quedarse con los buenos. Tengo la responsabilidad de tratar de hacer que los pobres entiendan la programación.

Inténtalo tú mismo. Hacer esta pregunta en particular me hace pensar que eres bastante bueno programando y me pregunto por qué no te enseñaron buena técnica. Así que sal y reúne a algunas personas y diles que quieres enseñarles a codificar. Asegúrese de que tengan un interés y piensen que sería genial, pero de lo contrario nunca han hecho ninguna codificación. Tal vez solo están interesados ​​en hacer un juego y quieren que les muestres cómo. Tienes doce semanas y solo te encuentras durante cuatro horas dos veces a la semana. Al final de las doce semanas, observe los proyectos que crearon sus alumnos y decida si hizo un buen trabajo o un mal trabajo. ¿Pudiste poner lo que estabas tratando de enseñar en un lenguaje que incluso el peor estudiante podía entender? ¿Fueron desafiados los buenos estudiantes? Si les pide a los estudiantes que lo califiquen como instructor, ¿cuál fue su calificación?

Tu posición como profesor no está en riesgo, así que no tienes que preocuparte por eso. El único problema real que puede tener es que algunos de sus estudiantes pueden no tener computadoras. Ninguno de ellos probablemente tendrá el entorno de codificación para el idioma que desea enseñar, pero muchos de ellos están disponibles para descargar gratuitamente en muchos casos; incluso versiones de Visual Studio. Pero si no tienen una computadora, ¿qué vas a hacer? La escuela no les da a los estudiantes computadoras gratis y ellos no les dan software gratis.

Una vez que haya enseñado una clase, comprenderá por qué ese nivel de codificación no siempre es posible.

Los proyectos generalmente están orientados a desarrollar un conocimiento específico que se enseñó, por lo que el alcance es pequeño debido a esto. Las otras razones son que solo puede hacer tanto como una persona que solo puede dedicar unas pocas horas a la semana a un proyecto debido en un corto período de tiempo.

More Interesting

Cómo ayudar a mi equipo de software a mejorar

¿Cuál es el código más importante jamás escrito en el mundo? ¿Qué código cambió el mundo?

¿Para qué se utiliza Amazon AWS (Amazon Web Services)? ¿Cómo lo usan usted o su empresa?

¿Debería esperar mucho estrés si me cambio a un trabajo de desarrollador de software de EE?

Estoy frustrado de ser un probador de software durante 2.7 años y quiero pasar al desarrollo, ¿cómo debo planificar y proceder?

¿Cuáles son algunos ejemplos de código que se ve mal al principio, pero resulta ser una buena solución?

¿Cómo compilo el código Objective-C en Windows?

¿Adoptar una metodología llamada 'Ágil' como Scrum (y tal vez contratar entrenadores) proporcionará más beneficios que el desarrollo incremental simple, con una cola priorizada dinámicamente, compilaciones frecuentes e interacción completa con el cliente? En otras palabras, ¿se ha sobrevendido todo el 'asunto ágil' cuando las prácticas adaptativas de antaño funcionan bien?

Como aspirante a ingeniero de software, ¿qué idiomas debo aprender?

¿Alguna compañía de software permite cambios de equipo flexibles?

¿Por qué es esencial contar con los servicios de una empresa de pruebas de software?

¿Qué hace que el probador manual sea más fuerte?

¿Cuál es la diferencia exacta entre ingeniería informática, ingeniería informática e ingeniería de software?

Cómo conseguir proyecto para empresa de software

¿Cuándo empezaron a llamar a los programadores "ingenieros"?