Introduccion
Dio la casualidad de que en los últimos casi dos años he estado enseñando programación en una de las escuelas de TI de Kiev. Hice esto solo por diversión. Una vez que mantuve un blog sobre programación, luego lo abandoné. Pero el deseo de contar cosas útiles a las personas interesadas no ha desaparecido.
Mi idioma principal es Java. Escribí sobre él juegos para móviles, software para comunicaciones de radio y varios servicios web. Y enseño Java específicamente.
Aquí quiero contar la historia del entrenamiento de mi último grupo. Cómo pasaron de aprender a escribir un servicio web funcional. Un servicio web útil para encontrar suplementos nutricionales. Gratis, sin anuncios, registro y SMS.
El servicio en sí está aquí: E-Dobavki.com .

El proyecto es educativo, no contiene publicidad. Según tengo entendido por esta publicación , puede dar enlaces a tales proyectos.
Antes de describir el proyecto en sí, cuéntenos un poco sobre el proceso de enseñar al grupo, sin esto la imagen estará incompleta.
9 meses de estudio
En la escuela donde enseño, el curso de Java se divide en 2 partes. En total, el curso dura aproximadamente 9 meses, con todas las interrupciones (vacaciones de año nuevo, tiempo para escribir proyectos intermedios).
La primera parte presenta a los estudiantes los conceptos básicos de YP. Variables, métodos, conceptos básicos de OOP y todas estas cosas.
La segunda parte del curso establece que el estudiante ya comprende más o menos cómo escribir en Java, y se le puede dar una pila de tecnología "adulta". Todo comienza con SQL, luego JDBC, Hibernate. Luego HTTP, servlets. Más primavera, un poco sobre git y maven. Y los estudiantes escriben proyectos finales.
Toda la capacitación se divide en módulos. Conduje clases dos veces por semana. La duración de una lección es de dos horas.
Mi enfoque de aprendizaje
Lancé 5 grupos. Parece mucho por dos años, pero casi siempre lideré 2 grupos en paralelo.
Intenté diferentes enfoques.
La primera opción es que un par se destaque por una presentación con teoría. El segundo par es pura práctica. Este enfoque de alguna manera funcionó, pero la eficiencia no fue muy buena, en mi opinión.
La segunda opción, a la que he llegado y en la que estoy trabajando ahora, es no dedicar un par completo a la teoría. En cambio, mezclo secciones cortas de la teoría durante 5-10 minutos, y las arreglo inmediatamente con ejemplos prácticos. Este enfoque funciona mejor.
Si hay suficiente tiempo, llamo a los estudiantes a mi casa, me siento en mi computadora portátil y ellos mismos hacen ejemplos prácticos. Funciona bien, pero desafortunadamente toma mucho tiempo.
No todos llegan al final
El descubrimiento para mí fue el hecho de que no todo el grupo llega al final del curso.
Según mis observaciones, solo la mitad de los estudiantes escriben el borrador final. La mayoría son eliminados en la primera parte del curso. Y los que llegaron a la segunda parte, generalmente no se caen.
Deja por varias razones.
El primero es la complejidad. Lo que digan, Java no es el lenguaje más fácil. Para escribir incluso el programa más simple, debe comprender el concepto de una clase, método. Y para comprender por qué necesita escribir public static void main (String [] arg), necesita comprender algunos conceptos más.
Compare esto con el Turbo Pascal, que comenzó con muchos, incluido yo:
begin writeln(" "); end.
Para resolver este problema, hasta donde yo sé, la escuela será la introducción de pruebas adicionales. Ahora, no todos podrán aprender Java. Si bien esto está en la etapa de concepto, pero el paso es claramente el correcto.
Y la segunda razón es como en la imagen a continuación:

La gente a menudo piensa que la programación es cuando imprimen mucho texto y obtienen mucho dinero por ello. Como redactor, solo más dinero.
La realidad es un poco diferente. Una gran cantidad de código de rutina, errores no obvios, un proceso de aprendizaje continuo. Esto es interesante, pero no para todos.
Tales estadísticas Al principio me molestó, pensé que tal vez estaba haciendo algo mal. Ahora entiendo eso sobre las mismas estadísticas en la mayoría de los cursos. Ahora no estoy preocupado por esto, pero estoy enseñando a aquellas personas que están interesadas.
Idea de servicio
Cuando los estudiantes completaron el curso completo, es hora de escribir el proyecto final. Había diferentes ideas. Listas de tareas pendientes, proyectos de gestión de proyectos, algo más.
Quería hacer algo simple, pero útil. Mi criterio era simple: ¿puedo usarlo yo y mis amigos? Debajo de estos requisitos vino un servicio web para encontrar aditivos alimentarios.
La idea es simple. Cuando compra un producto en una tienda, ve algún tipo de suplemento de E-shnuyu. Según el código, no está claro qué tan peligroso o no es esto (y hay aditivos peligrosos que están prohibidos en muchos países).
Abre el sitio, ingresa el nombre del suplemento (número, uno de los nombres alternativos) y obtiene un resumen del suplemento:

Hay proyectos similares. También puede simplemente introducir el aditivo en Google, aunque no siempre muestra la información correctamente.
Pero como el proyecto es educativo, las dificultades anteriores no nos detuvieron :)
Implementación
Todos escribieron en Java, el código fuente del proyecto en Github .
Éramos 7, incluyéndome a mí. Todos hicieron una solicitud de extracción, y yo, u otra persona del grupo, la aceptamos.
La implementación del proyecto tomó aproximadamente un mes, desde expresar la idea hasta el estado que ves ahora.
Analizando Aditivos
Lo primero que hizo uno de los estudiantes, aparte de la creación básica del enlace alrededor de la base de datos (entidades, repositorios, etc.), fue analizar los aditivos del sitio de información existente.
Esto fue necesario para probar los puntos restantes. No se necesita código adicional para llenar la base de datos. Al intercambiar rápidamente varios aditivos, fue posible probar aún más la interfaz de usuario, la clasificación y el filtrado.
Spring Boot le permite crear múltiples perfiles. Un perfil es un archivo de configuración.
Para el entorno de desarrollo, utilizamos un perfil con un DBMS H2 local y un puerto HTTP predeterminado (8080). Por lo tanto, cada vez que se iniciaba la aplicación, se borraba la base de datos. El analizador en este caso fue lo que nos salvó.
Buscar y filtrar
Un punto importante es la búsqueda y el filtrado. La persona en la tienda debe introducir rápidamente el código del suplemento, o algunos de los nombres, y obtener el resultado.
Por lo tanto, la entidad Aditiva tiene varios campos. Este es un código aditivo, nombres alternativos, descripción. La búsqueda continúa en Me gusta para todos los campos a la vez. Y si ingresa [123] o [amaranto], obtendrá el mismo resultado.
Hicimos todo esto basado en la especificación. Esto es parte de Spring, que le permite describir las condiciones básicas de búsqueda (como por ejemplo, en algún campo) y luego combinar estas condiciones (OR o AND).
Al escribir una docena de especificaciones, puede hacer consultas complejas como "todos los aditivos colorantes peligrosos que tienen la palabra [rojo] en la descripción".
En términos de trabajar con la base de datos Spring, me parece muy conveniente. Esto es especialmente cierto cuando se trata de consultas complejas. Entiendo que esto da su sobrecarga, y las consultas SQL optimizadas y escritas manualmente serán más rápidas.
Pero también considero que no es necesario optimizar todo por adelantado. La primera versión debería iniciarse, funcionar y permitir la posibilidad de reemplazar partes individuales. Y si la carga desaparece, estas son las partes separadas que deben reescribirse.
Seguridad
Todo es simple Hay usuarios con el rol de ADMINISTRADOR: pueden editar aditivos, eliminar y agregar nuevos.
Y hay otros usuarios (registrados o no). Solo pueden ver la lista de suplementos y buscar los correctos.
Para separar los derechos, se utilizó Spring Security. Los datos del usuario se almacenan en la base de datos.
Los usuarios pueden registrarse. Ahora no da nada. Si los estudiantes continúan desarrollando el servicio e introduciendo algunas funciones personalizadas, entonces la inscripción será útil.
Adaptabilidad y Bootstrap
El siguiente punto es la adaptabilidad. En el caso de nuestro servicio (al menos como lo vimos), la mayoría de los usuarios usarán teléfonos móviles. Y desde el móvil, necesita ver rápidamente el suplemento.
Para no sufrir CSS, tomamos Bootstrap. Barato, alegre y decente.
No puedo llamar a la interfaz perfecta. La página principal es aún menor, y la página para una descripción detallada del aditivo es estrecha, en teléfonos móviles necesita ampliarla.
Solo puedo decir que intenté interferir con el trabajo al mínimo. Este sigue siendo un proyecto estudiantil. Y, por supuesto, los chicos podrán corregir esos momentos más tarde.
Minuto Optimización SEO
Como durante más de dos años he estado ocupado con sitios web y todo lo relacionado con SEO, no podría lanzar un proyecto sin al menos una optimización básica de SEO.
De hecho, hice el título y la descripción de la generación de plantillas para cada suplemento. La URL es casi CNC, aunque se puede acortar.
También agregué contadores de asistencia. Se agregó un sitio a Yandex Webmaster y Google Search Console para rastrear alertas de los motores de búsqueda.
Esto no es suficiente. También debe agregar robots.txt y sitemap.xml para una indexación completa. Pero de nuevo, este es un proyecto estudiantil. Les diré lo que hay que hacer, y si quieren, lo harán.
Necesita adjuntar un certificado SSL. Free Let's Encrypt también lo hará. Hice esto para Spring Boot. No es difícil, y la confianza del PS está aumentando.
¿Qué sigue con el proyecto?
Además, de hecho, la elección depende de los chicos. La idea inicial del proyecto también incluía una base de datos de productos con aditivos.
Ingrese "snickers" y vea qué tipo de suplemento nutricional contiene.
Incluso al comienzo del proyecto, sabía que no tendríamos productos :) Por lo tanto, comenzamos solo con aditivos.
Ahora puede sujetar los productos, introducir más. bollos Si se trata de una base de datos extensa, se encontrarán usuarios.
Despliegue
El proyecto se implementó en VPS, Aruba Cloud. Este es el VPS más barato que pudimos encontrar. He estado usando este proveedor durante más de un año para mis proyectos, y me agrada gratamente.
Especificaciones de VPS: 1 GB de RAM, 1 CPU (no sé la frecuencia), 20 GB SSD. Para nuestro proyecto, esto es suficiente con la cabeza.
El proyecto va al paquete mvn clean habitual. Resulta que fat jar es un archivo ejecutable con todas las dependencias.
Para automatizar todo esto un poco, escribí un par de scripts de bash.
La primera secuencia de comandos elimina el archivo jar antiguo y recopila uno nuevo.
El segundo script ejecuta el jar ensamblado y le pasa el nombre del perfil que necesita. Este perfil contiene información de conexión de la base de datos.
DB - MySQL en el mismo VPS.
El reinicio total del proyecto incluye:
- inicie sesión en VPS a través de SSH
- descargar las últimas ediciones de git
- ejecuta local-jar.sh
- matar una aplicación en ejecución
- ejecutar launch-production.sh
Este procedimiento lleva tres minutos. Me parece una opción razonable para un proyecto tan pequeño.
Dificultades
Las principales dificultades para crear el proyecto fueron de naturaleza organizativa.
Hay un grupo de personas que parecen ser capaces de programar, pero en realidad no. Saben algo, pero todavía no pueden aplicarlo realmente. Y ahora necesitan hacer el proyecto en un mes.
Destaqué el liderazgo condicional del equipo en este grupo. Lideró un Google Doc con una lista de tareas, entregó tareas, controló su adopción. También aceptó solicitudes de extracción.
También pedí a los estudiantes que escribieran un breve informe todas las tardes sobre el trabajo realizado en el proyecto. No hice nada, está bien, así que escribe "no hizo nada". Esta es una gran práctica que te hace esforzarte un poco. Desafortunadamente, no todos siguieron esta regla.
El objetivo de todo este movimiento era simple. Forme un equipo, aunque sea por poco tiempo, trabajarán juntos.
Quería que los muchachos tuvieran una idea de la importancia de su trabajo. Comprenda que no escriben código esférico en el vacío. ¿Y qué hacen juntos un proyecto que la gente usará?
La primera semana o dos fue una acumulación. Entidades hechas lentamente, pequeños commits. Poco a poco, los agité, y el trabajo fue más divertido. El chat se animó, los estudiantes ofrecieron sus adiciones.
Creo que el objetivo se ha logrado. El proyecto está hecho, los muchachos obtuvieron un poco de experiencia en el equipo. Hay un resultado tangible visible que puede mostrar a sus amigos, puede desarrollar aún más.
Conclusiones
El aprendizaje es interesante.
Después de cada pareja, me sentí emocionalmente agitado. Intento hacer que cada par sea único y transmitir el máximo conocimiento.
Es agradable cuando el grupo que entreno llega a la final. Especialmente genial cuando los chicos escriben "Tengo un trabajo, todas las reglas, gracias". Que sea un junior, incluso si no es el mayor dinero al principio. Pero lo más importante: dieron un paso hacia sus deseos y tuvieron éxito.
Aunque el artículo resultó ser bastante voluminoso, por supuesto, no fue posible revelar todos los puntos. Por lo tanto, escriba sus preguntas en los comentarios.