¬ŅC√≥mo ense√Īamos Ingenier√≠a de Software en el HSE de San Petersburgo?

En publicaciones anteriores, hablamos sobre lo que hacen nuestros estudiantes en pasant√≠as: cient√≠ficas (por ejemplo, en JetBrains Research ) e industriales . En esta publicaci√≥n queremos compartir c√≥mo ense√Īamos programaci√≥n industrial.



Brevemente: en cuatro cursos, un ex alumno prueba una docena o dos tecnolog√≠as e idiomas, escribe y elimina constantemente una gran cantidad de c√≥digo, pasa una revisi√≥n de c√≥digo de camaradas m√°s experimentados (no siempre el primer intento), profundiza en alg√ļn tema y finalmente defiende un diploma significativo. Todo esto tiene lugar en la universidad y otorga un diploma estatal. Y en el verano puedes relajarte o hacer pr√°cticas en Rusia en JetBrains, Yandex y JetBrains Research (si quieres m√°s ciencia) o ir al extranjero (Google, Facebook y otros). Ahora con m√°s detalle.


Sobre mi


Mi nombre es Yegor Suvorov, estudio en la Escuela Superior de Econom√≠a, internado en Google (dos veces), Asana, GSA Capital, particip√© con √©xito en la programaci√≥n internacional de Olimpiadas ( estudiantes y escuelas ). El a√Īo pasado me gradu√© de la licenciatura de la Universidad Acad√©mica, as√≠ que revis√© casi todo lo descrito en el post. Tambi√©n participo en el desarrollo de un programa de capacitaci√≥n en ingenier√≠a de software y realizo ejercicios pr√°cticos en varias materias (Paradigmas y lenguajes de programaci√≥n, C ++).


Componentes principales


En esta publicación, solo consideraremos la subdirección "Programación industrial". Aunque todavía tenemos "Aprendizaje automático", "Lenguajes de programación" y algunos otros, los programas en las instrucciones se superponen, especialmente en los primeros dos cursos.


La formación consta de tres partes principales. Primero daré una descripción general, y luego contaré con más detalle acerca de cada parte.


  1. Art√≠culos b√°sicos Desde el primer semestre, los ni√Īos aprenden a trabajar con las manos. Cada seis meses, todos los "programadores industriales" deben aprobar 2-4 asignaturas b√°sicas (y algunas asignaturas son necesarias para otras subdirecciones). Prop√≥sito: impulsar a un estudiante en m√°s o menos todas las √°reas de programaci√≥n, para que pueda caminar a trav√©s de los niveles de abstracciones hacia arriba y hacia abajo. Comenzando por escribir su sistema operativo de juguete con espacio de usuario en C con una pizca de ensamblador (para los m√°s persistentes) y la l√≠nea de comando, luego a trav√©s de la sem√°ntica de movimiento en C ++ y hasta transformadores de m√≥nada. Esto es necesario para formar los horizontes y la experiencia de diferentes programas. Ense√Īamos no solo lenguajes: programaci√≥n paralela, redes, bases de datos, tambi√©n. Y, por supuesto, pocos temas no se refieren al c√≥digo, pero es lo mismo en el caso: por ejemplo, Ingenier√≠a de Software (curso general: por qu√© necesitamos equipos / gerentes / gesti√≥n de proyectos y riesgos) y dise√Īo de interfaz (de lo contrario pensar√°n que "los moldes est√°n remachados - es f√°cil ") Tambi√©n hay matem√°ticas y algoritmos, pero este es un tema para una publicaci√≥n separada.
  2. Pr√°ctica semestral . Deben completarse necesariamente, a partir del segundo semestre. Prop√≥sito: dar al alumno que intente hacer cosas diferentes m√°s grandes que la tarea y comprender c√≥mo es m√°s. Al comienzo del semestre, se lleva a cabo una feria de proyectos donde los posibles l√≠deres de investigaci√≥n hablan sobre lo que puede hacer con ellos. Un t√≠tulo para un l√≠der, por cierto, es opcional; mucho m√°s importante es lo que una persona y pr√°ctica espec√≠ficas pueden darle al estudiante. En un semestre, puede crear una aplicaci√≥n de escritorio + m√≥vil en Qt y comprender c√≥mo trabajar generalmente en un proyecto durante todo el semestre sin requisitos t√©cnicos claros (con dificultad). Lo siguiente es probar Android y sentirse como "hacer un cliente confiable para la red social"; resulta dif√≠cil, incluso si la funcionalidad es muy limitada. En otro, intente crear alg√ļn tipo de herramienta de aprendizaje autom√°tico en Python y tenga en cuenta que no desea tratar este tema en absoluto. En el cuarto, ve a terminar el compilador de Haskell, horror√≠zate y regresa al amoroso C ++ al diploma. O viceversa. Depende del alumno: este es el significado de la pr√°ctica. Como resultado, el alumno forma una direcci√≥n favorita (en la que puede trabajar y hacer un diploma) o experimenta en un mont√≥n de direcciones diferentes. Ganar-ganar de todos modos. Por cierto, si no te gusta ninguno de los proyectos, puedes crear el tuyo. Pero en este caso, primero debe interesar a alg√ļn asesor cient√≠fico o encontrar a alguien del exterior, y luego convencernos de que algo significativo y protegido puede salir del proyecto.
  3. Art√≠culos opcionales Aparecer en el tercer a√Īo. Motivo: no todos quieren profundizar en el kernel de Linux, del mismo modo que no todos quieren profundizar en el dise√Īo de Scala Collections con toneladas impl√≠citas. Y as√≠ puede elegir en qu√© temas profundizar. Por ejemplo, si a un estudiante no le gust√≥ la cantidad de maneras de disparar una rodilla en las ventajas, puede tomar un curso sobre virtualizaci√≥n de contenedores en Linux, escribir en C puro y ser feliz. Y viceversa: si el "volumen 3 del manual del desarrollador de software de arquitecturas Intel 64 e IA-32" todav√≠a tiene pesadillas, puede entrar en el hermoso mundo de Scala con abstracciones de unicornio. En cada m√≥dulo (medio semestre), se ofrecen aproximadamente 4 cursos, de los cuales se deben elegir dos.

Adem√°s, queremos que los estudiantes disfruten aprendiendo. En cualquier momento, puede chatear con los administradores de programas y proponer mejoras en cualquier campo. Recopilamos comentarios cuatro veces al a√Īo y, atenci√≥n, los tomamos en cuenta y mejoramos constantemente el programa. No reclutamos espec√≠ficamente a muchos estudiantes para que tengamos la oportunidad de hablar personalmente con todos. Hay 30 estudiantes en el segundo y tercer a√Īo, y en el cuarto a√Īo - 15.


Tambi√©n estamos constantemente creando o buscando nuevos cursos a pedido de los estudiantes, buscando buenos maestros que entiendan el tema y puedan ense√Īar. Entonces, en este m√≥dulo, en solo unas pocas semanas, apareci√≥ con √©xito un curso experimental de ingenier√≠a inversa de SPbCTF . Y si no puede encontrar un curso adecuado, puede, por acuerdo, pasar por algo significativo con Computer Science Center , ShAD o Coursera.


Artículos básicos


Temas b√°sicos de programaci√≥n: C ++, sistemas similares a Unix, paradigmas y lenguajes de programaci√≥n, arquitectura inform√°tica, Java, sistemas operativos, programaci√≥n funcional, bases de datos, dise√Īo de software, ingenier√≠a de software, programaci√≥n paralela, tecnolog√≠as de red inform√°tica, dise√Īo de interfaz, desarrollo m√≥vil.


Juntos, estos temas cubren casi todas las tareas que pueden ocurrir en el trabajo. Tambi√©n protegen contra varios errores "cl√°sicos", como comparar n√ļmeros de coma flotante con ==, expectativas de adecuaci√≥n de comportamiento indefinido, condiciones de carrera y hablar sobre la existencia de patrones de dise√Īo y tareas no programadas en el desarrollo de productos.


Por supuesto, en el proceso de aprendizaje, los estudiantes constantemente "tienen en sus manos el laboratorio y la tarea". Tomemos algo cl√°sico, por ejemplo, la implementaci√≥n del archivador en el algoritmo Huffman. Hacer que "funcione de alguna manera" no es tan dif√≠cil. Pero para hacer una buena arquitectura del proyecto (al menos para separar la entrada-salida, la compresi√≥n de bits y el algoritmo en s√≠), use correctamente las capacidades de C ++ (la regla de tres o cinco dependiendo del medio a√Īo) y, en general, dise√Īe el c√≥digo de tal manera que sea agradable de leer y no completamente vergonzoso poner en c√≥digo abierto: un arte separado que los maestros ense√Īan en un curso de C ++, comunic√°ndose constantemente con los estudiantes y analizando en detalle todas las l√≠neas de c√≥digo. Sobre los temas restantes es similar. Ning√ļn curso se limita a pruebas te√≥ricas. En todos los temas con escritura de c√≥digo habr√° revisi√≥n de c√≥digo de un programador experimentado.


C ++ . El primer a√Īo de estudio. Comenzando con C, terminando con C ++ 14. Mostramos RAII, Valgrind y autotests, aprendemos a escribir tanto bibliotecas (my_vector con una garant√≠a de excepciones) como aplicaciones (el mismo archivador). Por qu√©: debido a que C ++ todav√≠a se usa activamente en la industria, adem√°s resuena activamente con la programaci√≥n del sistema (falta de recolecci√≥n de basura, puede mostrar el dise√Īo de los datos en la memoria ...).


Sistemas tipo Unix . Primer semestre El curso del joven luchador sobre c√≥mo trabajar con la l√≠nea de comando y el sistema de archivos sin C:\ y D:\ . Ejemplo de trabajo de prueba: en el par, se escucha la imagen de un Ubuntu instalado ligeramente roto, es necesario arreglarlo. Un ejemplo de tarea: revisa los archivos en una carpeta en Bash y llama a alguien √ļtil con expresiones regulares.


Paradigmas y lenguajes de programaci√≥n . Primer semestre Una docena de temas (al menos OOP, programaci√≥n funcional, SQL, subprocesos m√ļltiples), y cada tema que los estudiantes pueden probar en una o dos tareas. Por supuesto, de manera bastante superficial, pero a√ļn da una idea de cu√°n vers√°til es la programaci√≥n y qu√© cosas geniales se pueden ensamblar utilizando diferentes m√©todos. Tanto OOP, FP y SQL se describir√°n en detalle, pero ya en el primer a√Īo el estudiante sabe acerca de su existencia y puede, por ejemplo, organizar afirmaciones en el c√≥digo o escribir un par de pruebas unitarias simples si lo desea.


Arquitectura inform√°tica Primer a√Īo Registros, un ensamblaje de algo parecido a una computadora a partir de puertas l√≥gicas, cach√©s, una tuber√≠a de procesador, representaci√≥n de n√ļmeros y otra teor√≠a. Por qu√©: unir piezas de informaci√≥n sobre todo tipo de cosas de bajo nivel en una sola imagen.


Java Segundo a√Īo de estudio. Termina con transmisiones y un proyecto de curso para Android (por ejemplo, jugar un tic-tac-toe recursivo con un bot y un modo de red). Mostramos Maven, IDEA, JUnit, trabajo asincr√≥nico con la red. Por qu√©: hay muchas cosas girando en la JVM ahora, hay toneladas de bibliotecas, es bueno saberlo.


Sistemas operativos Segundo a√Īo Hardcore No se preocupe con los cargadores de arranque: los estudiantes reciben arranque m√ļltiple en el prefabricado, cambian al modo protegido, y luego pueden escribir un asignador de memoria, hilos, procesos, sistema de archivos, partici√≥n de anillo de protecci√≥n e incluso carga ELF en C. Quiz√°s no sea tan extenso como los "Sistemas operativos modernos" de Tannenbaum, pero puede ver claramente si es interesante profundizar en √©l o si desea permanecer en un espacio de usuario aislado. Si est√° interesado, bienvenido a un curso especial de programaci√≥n del kernel de Linux. Por cierto, una versi√≥n muy ligera est√° disponible en Stepik : no hay ning√ļn sistema operativo escrito all√≠, pero hay las tareas necesarias de teor√≠a y verificaci√≥n. Para no volar debido al bajo rendimiento, simplemente rep√°salo.


Programaci√≥n funcional Dos clases sobre c√°lculo lambda y luego fui a Haskell. Terminamos con transformadores de m√≥nadas. Por supuesto, todo est√° detallado: una m√≥nada no es una caja, sino solo una abstracci√≥n √ļtil de dicha plantilla para escribir c√≥digo. Sin embargo, los proyectos intermedios son m√°s te√≥ricos que pr√°cticos: escriba la inferencia autom√°tica de tipos en el c√°lculo lambda. Pero ahora se est√° preparando la continuaci√≥n del curso (como un tema adicional del programa de maestr√≠a), donde se planean m√ļltiples subprocesos y un servidor web. Lea tambi√©n en el Computer Science Center .


Bases de datos Nos familiarizamos con el DBMS relacional (en el ejemplo de PostgreSQL), SQL. Dise√Īamos una base de datos para un √°rea tem√°tica determinada, y luego organizamos una revisi√≥n de c√≥digo para cada uno en base a la gu√≠a del maestro. Luego el maestro hace una revisi√≥n de revisi√≥n de c√≥digo. Los concursos del formulario "escriben una solicitud para esta base de datos". Trabajos de consultas de perfiles simples (EXPLICAR). Nuevamente, se hace eco del curso en el Computer Science Center .


Ingenier√≠a de software . Habla sobre c√≥mo se puede organizar el trabajo de un programador, qu√© hacen los dem√°s en la empresa, por qu√© los buenos gerentes siguen siendo √ļtiles y por qu√© la gesti√≥n de proyectos tambi√©n es dif√≠cil. ¬ŅCu√°l es el punto de la planificaci√≥n, por qu√© no siempre funciona, por qu√© no todos los errores deben repararse ... El objetivo es tener una comprensi√≥n de lo que se necesita para proyectos que no sean personas. Por supuesto, no es realista revelar todo en detalle en un semestre, pero, por ejemplo, es √ļtil saber que despu√©s del desarrollo del proyecto todav√≠a no hay un apoyo menos importante.


Dise√Īo de software . Todo tipo de formas de modelar la realidad y (diagramas UML), m√©todos de descomposici√≥n, patrones de dise√Īo. Como ejemplos, al final del curso, entendemos GFS, BigTable, CMake ... En la pr√°ctica, aprendemos no solo a escribir c√≥digo, sino tambi√©n a describir la arquitectura y aplicar plantillas donde son apropiadas.


Programación concurrente Comenzamos con subprocesos y mutexes simples, al final analizamos y escribimos algoritmos sin bloqueo / sin espera, penetramos en MESI, estudiamos tecnologías de nivel superior como el marco de unión de horquilla, OpenMP, OpenCL, Intel TBB.


Tecnología de red informática . Conferencias: una descripción detallada de los principales protocolos de la pila TCP / IP: mensajes en ICMP, una excursión histórica a RIP, todo tipo de registros en DNS, cómo funciona FTP / HTTP / SMTP / DHCP, qué es NAT e incluso un poco sobre IPv6. Prácticas: escribimos en las ventajas de nuestro cliente y servidor TCP multiplataforma, primero para el mensajero de juguete, y luego el cliente UDP para DNS.


Dise√Īo de interfaz El estudiante no escribe una sola l√≠nea de c√≥digo, sino que pasa por todas las etapas de dise√Īo de una buena experiencia de usuario: se le ocurre un proyecto, realiza una investigaci√≥n (incluida una encuesta de personas reales), desarrolla y verifica escenarios de uso, y al final puede dibujar una interfaz en Sketch o Figma . El objetivo es comprender que para un buen producto no solo necesita c√≥digo, sino tambi√©n un mont√≥n de otros trabajos preparatorios. La revisi√≥n del c√≥digo no est√° aqu√≠, pero todos los artefactos intermedios se discuten activamente con el maestro. Me parece poco realista pasar la tarea en el primer intento (sin embargo, no es obligatorio).


Desarrollo m√≥vil . Curso avanzado de desarrollo de Android. Ya estamos escribiendo m√°s en Kotlin que en Java, utilizamos todo tipo de cosas espec√≠ficas de Kotlin para Android. En comparaci√≥n con el proyecto Java del segundo a√Īo, la aplicaci√≥n es m√°s complicada aqu√≠, trabajamos m√°s con dependencias externas y bibliotecas, pensamos m√°s en la interfaz y los usuarios (aqu√≠ el curso tiene algo en com√ļn con el dise√Īo de la interfaz).


Pruebas de software . Básicamente, existe una gran cantidad de teoría que da nombre a todas las prácticas estándar que los estudiantes probablemente han inventado en otras materias: prueba del flujo de control o flujo de datos, prueba de pares (pruebas de todos los pares) ... También hay un poco de práctica específica: elaborar un plan de prueba para tal y tal la técnica, para encontrar casos extremos en tal y tal aplicación, y ejecutar varios escenarios en una aplicación web usando Selenium para que no sea aburrido componer simplemente casos.


Big Data Software Engineering, tambi√©n conocido como Big Data Software Engineering. Lea junto con el Computer Science Center . Conectamos bases de datos, programaci√≥n paralela, sistemas distribuidos y otras palabras de moda, estas est√°n en conferencias. En la pr√°ctica el a√Īo pasado, los estudiantes escribieron su directorio telef√≥nico distribuido desde cero. En los pr√≥ximos lanzamientos, parece correcto cambiar el √©nfasis de un nivel bajo a herramientas realmente utilizadas en la industria como Zookeeper, Cassandra y otros animales que dan miedo. Hasta ahora, la principal dificultad es c√≥mo emular las condiciones de "big data" para los estudiantes y evaluar sus soluciones: no hay necesidad de aumentar Zookeeper si no hay una demostraci√≥n clara de que sin ella todo es muy malo.


Practica


La segunda parte importante de la capacitaci√≥n es la pr√°ctica. Desde el primer a√Īo, el alumno realiza algunas tareas pr√°cticamente √ļtiles bajo la gu√≠a de un colega experimentado. Por ejemplo, otra aplicaci√≥n para administrar un calendario o notas. O nueva funcionalidad en una aplicaci√≥n existente. O estudia la complejidad de computabilidad de una familia de f√≥rmulas si se lleva a la direcci√≥n de la inform√°tica.


En los primeros cursos, no requerimos novedad o practicidad (despu√©s de todo, el objetivo es dar algo de juego), pero los requisitos de diploma para la calidad de los proyectos y la protecci√≥n est√°n aumentando. En los √ļltimos cursos, adem√°s de la pregunta "¬Ņqu√© se ha hecho?" Es importante que los estudiantes digan por qu√© se hace y por qu√©. Al mismo tiempo, "realmente quiero esta compa√Ī√≠a en particular, en la que trabaja mi supervisor de investigaci√≥n", en s√≠ misma no es la respuesta. Pero "all√≠, los discos duros mueren cada segundo, por lo que este c√≥digo abierto no funciona, este art√≠culo es puramente te√≥rico, pero Google tiene una soluci√≥n, pero est√° cerrado", eso es todo. No funcionar√° como un diploma para proteger un ejercicio innecesario del segundo a√Īo: los desarrolladores curiosos con computadoras port√°tiles y Google est√°n listos para defender (y algunas defensas). "Nadie ha hecho esto todav√≠a", pr√°cticamente lo m√°s peligroso que se puede decir. Por cierto, defendemos no solo los diplomas, sino tambi√©n las pr√°cticas, regularmente desde el primer a√Īo.


Aquí hay algunas fotos con protección típica. Fotógrafo: Dima Drozdov.




Las pr√°cticas le permiten aprender a trabajar "a la larga" con grandes proyectos, a veces parcialmente escritos por otros desarrolladores. No siempre es posible adivinar el tema del proyecto: por ejemplo, despu√©s de haber intentado un desarrollo de bajo nivel, un estudiante puede decidir estudiarlo en el futuro. Este es el significado de la pr√°ctica: entender lo que te gusta y lo que no, no en el trabajo, sino en condiciones con tasas m√°s bajas. Aunque esta √ļltima pr√°ctica deber√≠a convertirse en una licenciatura sustancial. "Sustantivo" es cuando, seg√ļn el diploma, al menos puedes escribir un art√≠culo sobre Habr y no entrar en menos. O, si el trabajo es muy bueno, publ√≠quelo en una revista cient√≠fica, hable en una conferencia o, al menos, obtenga las ventajas.


Artículos electivos


La tercera parte, pero tambi√©n importante, son elementos adicionales. Los temas son espec√≠ficos, probablemente no sean necesarios para todos, pero los estudiantes interesados ‚Äč‚Äčpueden probarlos. En los cursos superiores hay la mayor√≠a de estas asignaturas: hay una base, queda por ampliar nuestros horizontes en una direcci√≥n interesante para el estudiante. Desafortunadamente, no hay tiempo suficiente para tomar todos los art√≠culos. A veces el conjunto de cursos cambia, estos son los que me ofrecieron:


Lenguajes alternativos para la JVM . Un curso de dos m√≥dulos: en uno hablan sobre Kotlin, en el otro sobre Scala. Para Kotlin, analizamos tanto la interoperabilidad de Java como la escritura de nuestro propio DSL y corutinas. La √ļltima tarea opcional es agregar un depurador usando corutina al int√©rprete de lenguaje de juguete (escrito en la tarea anterior). En cuanto a Scala ... El lenguaje es grande, pero tenemos tiempo para entender todo tipo de impl√≠citas :)


Programación en el kernel de Linux . Paso a paso, se está desarrollando un módulo kernel que emula un dispositivo de almacenamiento virtual: mmap, buffers, acceso concurrente, E / S sin bloqueo. En el camino, puede recordar interrupciones y desplazar la multitarea del curso de los sistemas operativos y estudiar las estructuras internas de Linux (por ejemplo, la cola de espera).


Compiladores Estamos escribiendo nuestro compilador de micro-idiomas en OCaml. Una m√°quina de pila intermedia, compilaci√≥n en x86 sin ning√ļn LLVM, integraci√≥n con libc. Exclamaciones sorprendidas de los estudiantes "¬Ņpor qu√© solo cae en la expresi√≥n de una longitud de cien?" (probablemente porque el error est√° en la asignaci√≥n de registros). Por cierto, un curso similar tambi√©n est√° disponible en el Computer Science Center .


Gráficos por computadora . Curso de nivel relativamente bajo: estudiamos OpenGL, escribimos nuestros sombreadores para sombras y renderizado diferido, comparamos la mezcla de colores con y sin corrección gamma.


Construyendo un DBMS . Base de datos interna del dispositivo. Todo tipo de algoritmos de conexión, modelos formales, columna DBMS. En la práctica, puede implementar varios algoritmos de procesamiento de bloque por bloque en un DBMS de juguete con ventajas (por ejemplo, unión hash doblemente canalizada).


Virtualización de contenedores . Un estudio detallado de contenedores en Linux. Espacios de nombres y cgroups, por ejemplo, y la API, y cómo funciona. Todo tipo de herramientas auxiliares para la red. En el proceso, escribimos nuestro contenedor como Docker, pero no es tan simple: debe limitar correctamente un montón de todo, configurar la red, reenviar los archivos necesarios al contenedor ... Sin embargo, también se considera la orquestación de alto nivel usando Kubernetes como ejemplo.


Lo que queremos mejorar


Tanto nosotros como nuestros estudiantes estamos m√°s satisfechos con el programa resultante (a juzgar por las encuestas). Sin embargo, puede hacerlo a√ļn mejor, no solo mejorando los elementos existentes, sino tambi√©n agregando nuevos.


Por ejemplo, todav√≠a no est√° claro c√≥mo transferir ciertos aspectos de la "experiencia laboral" a la universidad. El mismo trabajo con c√≥digo heredado, ¬Ņ√ļtil? Y entonces Incluso hay libros y t√©cnicas espec√≠ficas. Pero para hacer un buen curso de esto, se deben combinar varios factores:


  1. No distraiga a los maestros de su trabajo principal durante mucho tiempo, para que constantemente ayuden a los estudiantes a comprender un proyecto grande. Y si hay buena documentación, entonces ya no es así para Legacy.
  2. Los estudiantes deberían estar interesados. "Agregar mil líneas de código a un proyecto que no necesita" no está incluido.
  3. El resultado debe ser predecible. "Parece que esta es una tarea insoluble, lo siento, no pensaron": malas noticias seg√ļn los resultados de revisar la tarea.

Desafortunadamente, a√ļn no hemos descubierto c√≥mo hacer esto. Lo m√°s cercano est√° en la direcci√≥n del aprendizaje autom√°tico, donde se realizan seminarios todas las semanas en los que los estudiantes hacen presentaciones sobre algunos de los √ļltimos art√≠culos. Quiz√°s esta experiencia se pueda transferir a la programaci√≥n industrial.


Quiz√°s las √ļnicas √°reas que no est√°n cubiertas actualmente son el desarrollo web (incluido el front-end), los sistemas de automatizaci√≥n complejos (como 1C o SAP) y la seguridad inform√°tica (un curso experimental comenz√≥ a principios de febrero de 2019). Es posible que hayamos olvidado algo m√°s, o usted sabe c√≥mo puede ense√Īar a programar a√ļn mejor; estaremos encantados de analizarlo en los comentarios.


Sin embargo, creemos que los graduados que est√°n listos para trabajar y que, si es necesario, deben recibir una ense√Īanza especial, entonces quiz√°s los sistemas internos de la empresa, ya est√°n dejando el bachillerato. Por cierto, un tema separado en el que ahora estamos pensando e intentando implementar es lo que, despu√©s de una serie de cursos tan ajustados, estudiar en un programa de maestr√≠a, pero este es un tema para una publicaci√≥n separada.

Source: https://habr.com/ru/post/439362/


All Articles