Programación deportiva por donde empezar. Olimpíadas de programación: ¿ayudan en el trabajo real? Todas estas competiciones son individuales.

Esto ya es un holívar muy antiguo: ¿son los programadores deportivos adecuados para un desarrollo aplicado severo, o son pájaros blancos tan hermosos que vuelan en nubes matemático-algorítmicas y perecen en condiciones más mundanas? Existe un mito común que dice que todos los programadores deportivos van a Google o, al menos, a Yandex, donde trabajan inspirándose en algoritmos de búsqueda y similares. La simple subcontratación bielorrusa no es para ellos. Quizás, si no el final, al menos los hechos puedan poner un signo de puntuación en esta batalla de opiniones. Recopilamos información sobre todos los programadores deportivos de nuestro país y, en base a tres criterios:

  • participó en las finales del ACM ICPC;
  • habló en nombre de la universidad bielorrusa;
  • ya ha completado sus estudios en la universidad;

hizo una selección. El resultado fue una lista de veintiún finalistas del ACM ICPC de Bielorrusia. Pudimos contactar a la mayoría de ellos y hacerles tres preguntas simples:

  1. ¿Cuál es su lugar de trabajo actual y cuál es el cargo/esencia del trabajo realizado?
  2. ¿Por qué esta empresa/ocupación?
  3. ¿Cuáles son tus planes para el futuro? ¿Cómo lo ves? ¿Adónde te gustaría ir?

Algunos eligieron la carrera directiva, otros se mantuvieron fieles a la programación deportiva, y quién desarrolla realmente los algoritmos de búsqueda, lo descubrirá en el "discurso directo"Finalistas bielorrusos del ACM ICPC.

Ivan Mikhnevich (ACM ICPC 2000)

  1. Wargaming Public Company Limited, Director.
  2. Este es el resultado del crecimiento en el grupo de empresas desde el inicio de mi carrera laboral.
  3. En realidad, ya estoy cansado de todo esto y es hora de comenzar una nueva carrera, en un nuevo lugar, en un nuevo campo (probablemente no en TI).

Sergey Stepantsov (ACM ICPC 2000)

  1. Actualmente trabajo como Vicepresidente de Desarrollo de Negocios en Intetics Co.
  2. La mayor parte de mi carrera está relacionada con esta empresa, donde logré probarme en una variedad de roles: comencé como especialista en pruebas y también trabajé como programador, gerente de proyectos y jefe del departamento de producción. Y finalmente llegué a especializarme en desarrollo empresarial.
  3. Todavía no me siento lo suficientemente mayor para dejar de desarrollarme :). Creo que el futuro de la parte empresarial de mi vida todavía me deleitará con muchos giros emocionantes.

Vladimir Tankovich (ACM ICPC 2000, 2003)

  1. Actualmente en Microsoft estoy trabajando en algoritmos de Visión por Computador para Kinecta. Antes de eso, estaba en relevancia de búsqueda.
  2. Trabajo en esta empresa desde 2005. Me trajeron de la República de Bielorrusia y todavía no tenía sentido mudarme. Me uní a este equipo porque me permite hacer un trabajo científico, que no entra en una colección de artículos, sino en un producto terminado.
  3. No hay planes específicos para el futuro. En TI el dinero no es un problema, ni en Minsk ni aquí. Hasta ahora, estoy muy interesado en comprender el aprendizaje automático y la inteligencia artificial. Resulta que hago lo que quiero casi todo el tiempo y además me pagan bien por ello. Es decir, durante los próximos 1 o 2 años haré lo mismo y luego ya veremos. Estoy adquiriendo mucha experiencia y si tengo una idea sobre cómo aplicarla de manera confiable, probaré con una startup.

Alexey Kirkovsky (ACM ICPC 2002, 2005)

  1. NT LLC "LuxSoft", ingeniero de software de 2ª categoría.
  2. Tenía muchas ganas de ir al famoso taller de carrocería de Moscú Luxoft, porque desde pequeño soñaba con automatizar las escotillas, pero no noté ni una letra y terminé en el LuxSoft bielorruso. Allí firmé algunos papeles sin mirar y ahora trabajo con un contrato de 20 años por un salario fijo en rublos bielorrusos, que sólo me alcanza para la gasolina.
  3. Planeo cumplir con el estándar de número de líneas por minuto y convertirme en ingeniero de software de primera categoría. Luego consiga un CMS en programación, que me asignarán aquí si no hay un solo retraso para trabajar durante toda la duración del contrato.

Alexey Danchenko (ACM ICPC 2002, 2005)

  1. NT LLC "LuxSoft" Ingeniero de software. Recientemente he estado desarrollando un lenguaje de programación de dominio específico para nuestro producto.
  2. Una oportunidad para trabajar con amigos para implementar una idea interesante.
  3. Continúe disfrutando de la vida.

Evgeniy Gonchar (ACM ICPC 2003)

  1. Google Suiza (Zurich), Ingeniero de Software Senior. Estoy trabajando en uno de los proyectos de infraestructura de búsqueda web.
  2. Desde pequeño me encantó la programación.
  3. Me gustaría progresar en la guitarra eléctrica e ir a Nueva Zelanda nuevamente.

Ivan Metelsky (ACM ICPC 2003, 2004)

  1. TopCoder, Inc., Coordinador de problemas de maratón/algoritmos. Lanzamiento de Concursos de Maratón y Algoritmos en TopCoder.
  2. En cierto modo, simplemente sucedió así. Más en serio, buenos ingresos, trabajo relativamente interesante, es difícil encontrar una alternativa mejor.
  3. Planes para el futuro: realmente no importa dónde, sino en algún lugar en dirección a algo menos de ajetreo y más libertad de acción. Quizás algún tipo de negocio, no necesariamente en TI.

Victoria Lebed (ACM ICPC 2004)

  1. Fui y sigo siendo matemático. Ella era la única persona del equipo que no tocaba la computadora :) Ella hacía todo el trabajo “lateral”. Vivo y trabajo en París. Ahora tengo un puesto temporal en la Universidad de París 7: investigación y docencia. Recientemente recibí mi doctorado.
  2. Esta actividad se debe a que brinda una oportunidad única de mantener la libertad personal y creativa.
  3. Intento no hacer ningún plan para el futuro. Nuevamente, para no limitarse a ningúnluego dentro del marco y no exponerse personalmente al peso de expectativas, esperanzas y otras cosas. Estoy bienMe imagino continuar el camino iniciado en el ámbito universitario y científico, pero no cierro la puerta para otras opciones.

Maxim Osipov (ACM ICPC 2004)

  1. VironIT, director. Gestión empresarial (principalmente no operativa, pero orientada a cambiar los procesos de ventas, desarrollo, calidad del trabajo, etc.)
  2. Empresa VironIT, porque es mi empresa, soy el dueño. Esta es una clase (gestión no operativa) porque descubrir cómo hacer crecer un negocio es lo más interesante para mí.
  3. Desarrollar su empresa, cambiar, entre otras cosas, a un modelo de producto, formar una familia y tener hijos. Veo el futuro interesante, difícil, pero definitivamente positivo.

Pavel Irzhavsky (ACM ICPC 2007, 2008)

  1. Profesor de BSU, matemático-programador de Orientsoft, profesor de ShAD, estudiante de posgrado (formalmente esto es estudio, pero en realidad está más cerca del trabajo).
  2. Cada actividad tiene algo interesante y útil (además de que todas generan ingresos :)), las sencillas que me permiten relajarme un poco y las complejas que me permiten desarrollarme. Creo que, en general, me vuelvo menos eficaz cuando empiezo a hacer lo mismo durante, aproximadamente, 8 horas al día, y cambiar de actividad a diario me permite estar en mi mejor momento.
  3. No hay cambios significativos en los planes para el futuro :)

Vladimir Kerus (ACM ICPC 2007, 2008)

  1. EPAM. Ingeniero de software líder del departamento de desarrollo móvil. Estoy desarrollando aplicaciones para Android.
  2. Me encanta aprender cosas nuevas y en mi empresa actual puedo cambiar fácilmente mi perfil y encontrar a las personas-profesores adecuadas.
  3. Ya planté un árbol, estoy ahorrando para construir una casa, planeo tener hijos (idealmente, mi propio equipo del Barcelona).

Sergey Tikhon (ACM ICPC 2009)

  1. EPAM Systems, Ingeniero Líder de Software. Arquitecto/desarrollador de proyectos especiales.
  2. Equipo amigable y fuerte, tareas interesantes, buenas oportunidades de crecimiento profesional.
  3. Trabajar en TI, pero en la frontera con la ciencia, trabajar en la implementación de Ciencia de Datos en aplicaciones y servicios reales (aprendizaje automático, procesamiento de lenguaje natural, tecnologías de búsqueda, modelado). Propaganda, difusión e implementación de programación funcional (tengo un blog en F#).

Alexey Lobanov (ACM ICPC 2010)

  1. Empresa Yandex, desarrolladora de Yandex.Maps. Paralelamente, estudio en la escuela de posgrado de BSU y trabajo como asistente en el Departamento de DMA FPMI (doy clases prácticas en el curso "Algoritmos y estructuras de datos").
  2. Por qué Yandex: hay tareas interesantes (incluidas las algorítmicas complejas, que requieren mucho conocimiento), condiciones de trabajo cómodas y un excelente equipo. Por qué FPMI BSU: Creo que es importante transmitir mis conocimientos a las próximas generaciones de estudiantes.
  3. Planes para el futuro: completar con éxito mis estudios de posgrado e intentar defender mi tesis doctoral.

Alexey Tolstikov (ACM ICPC 2010)

  1. BSU, asistente del Departamento de Matemática Computacional, graduado de la escuela de posgrado, impartiendo el curso« Computación paralela y distribuida» (práctica). Yandex,curador de programas académicos, director de la sucursal de Minsk de la Escuela de Análisis de Datos (+ profesor allí), desarrollador de búsquedas.
  2. No puedo hacerlo en una frase, sino porque: “¡Me gusta!”
  3. No hay mucho que decir. Me estoy moviendo en todas estas direcciones.

Dicen que cuando nació, el mismísimo Donald Knuth vino a verlo. Dicen que cuando lo invitaron a trabajar en Google, reescribió todo el algoritmo de búsqueda 16 veces en 15 minutos. Dicen que observa los avances de la computación cuántica con una sonrisa, porque cuando los ve, los números se factorizan por miedo. Pero una cosa sí sabemos con certeza: Peter es un verdadero dios de la programación deportiva.

Hechos

  • Ganador de numerosos campeonatos, Peter ganó dos veces TopCoder y dos veces obtuvo el segundo lugar en ACM ICPC.
  • En su tiempo libre, Peter escribe un blog sobre los concursos habituales "Problemas algorítmicos para tontos": petr-mitrichev.blogspot.ru.
  • Mitrichev actualmente trabaja en Google, donde se ocupa de la calidad de las búsquedas. Peter también ayuda a preparar los concursos de Google Code Jam.

Mucha gente piensa que los programadores deportivos son tipos geniales, verdaderos geeks que entienden algoritmos y resuelven problemas complejos. Pero también dicen que les resulta muy difícil aplicarse en algún lugar más adelante. ¿Es eso así?

La programación deportiva y, en general, lo que hacemos en los Juegos Olímpicos, realmente no es algo con lo que puedas ganarte la vida. Por otro lado, la programación, como cualquier otro deporte, es desarrollo para una persona. Gracias a esto, una persona se vuelve más inteligente, mejor programadora y mejor para encontrar errores en los programas. Después de tal preparación, es más fácil trabajar y hacer otras cosas interesantes.

Los algoritmos son definitivamente aplicables en la práctica de un programador, aunque en el trabajo también me he encontrado con algoritmos que son más complejos que los que se encuentran en las Olimpiadas. Pero en las Olimpíadas estamos limitados a algoritmos que, en términos generales, pueden escribirse en media hora o una hora. Por lo tanto, las tareas allí utilizan un conjunto de algoritmos muy específico y limitado. En la vida real, las cosas son simplemente más... expansivas.

¿En qué idioma escribiste las soluciones a los problemas?

En Java. En la escuela escribía en Pascal porque no sabía nada más en ese momento. Y luego, cuando fue necesario elegir a qué cambiar, Java resultó estar más cerca de Pascal.

En un entorno competitivo, es necesario escribir un programa en 20 a 30 minutos y debería funcionar correctamente de inmediato. Por lo tanto, es muy importante que el idioma no permita que se planten errores. C++, que usa la mayoría de la gente, se diferencia en que es bastante fácil escribir el programa equivocado. Puede olvidar algo accidentalmente, asignar el tipo incorrecto a una variable, pero todo esto de alguna manera se compilará y funcionará de alguna manera. Lo más probable es que no sea de la forma esperada.

En Java, si comete un error o un error tipográfico, lo más probable es que el programa simplemente no se compile. Aquí todo es más estricto, como en el caso de Pascal. Esto me pareció más apropiado. La otra cara de la moneda es que los programas Java a menudo se ejecutan una vez y media más lento que los programas C++. A veces estos tiempos y medio no son suficientes para que el programa se ajuste a las condiciones del problema.

Cada uno puede elegir su propio lenguaje de programación, ¿verdad?

Hay restricciones. Por supuesto, hay diferentes competiciones... tomemos Google Code Jam, por ejemplo. Cuando estábamos decidiendo cuál sería la mejor manera de hacerlo, se nos ocurrió la idea de que podíamos trabajar en cualquier idioma. Usted descarga el archivo de entrada con los datos de la tarea a su computadora, ejecuta su programa en la computadora y luego envía el resultado al servidor. Cualquiera que sea el compilador/intérprete que tengas en tu computadora, eso es lo que puedes usar. La desventaja de este sistema es que las personas tienen computadoras diferentes. Algunas personas tienen un ordenador diez veces más potente que otras. Por lo tanto, tenemos que crear problemas en los que la velocidad de una solución incorrecta difiera de la correcta al menos cien veces. De modo que si una persona tiene una computadora diez veces más lenta, la solución correcta le funcionará, o en una computadora diez veces más rápida, la solución incorrecta seguirá sin funcionar. Por tanto, necesitamos problemas con una gran brecha entre la solución correcta e incorrecta en términos de velocidad.

Topcoder, Codeforces y ACM utilizan un sistema estándar en el que usted envía el código fuente y lo ejecutan en su servidor. Aquí estás limitado por lo que tienen en el servidor. La mayoría de los participantes, entre el 70% y el 80%, utilizan C++, otro 20% utiliza Java y muy pocos lenguajes más. Me parece que esto es un ciclo: las personas nuevas que asisten a las competiciones comienzan a comunicarse con otros participantes mayores, quienes enseñan a los recién llegados lo que ellos mismos pueden hacer. Como resultado, nuevas personas también comienzan a utilizar los mismos idiomas. Así que no es que estos dos idiomas sean particularmente adecuados para las competiciones, es simplemente como sucedió históricamente.

Entonces, ¿todo esto se aplica en la vida? Después de todo, probablemente sea difícil encontrar un trabajo en el que estos conocimientos sean útiles. Sí, puedes acudir a Google o Yandex, pero ¿es más difícil acudir a cualquier banco?

Me parece que esta es una parte muy útil de la habilidad, la parte que es responsable de la capacidad de escribir un programa la primera vez, sin errores, o de encontrar un error en el programa de un amigo. Yo nunca he trabajado en un banco, pero me parece que esas habilidades también serían útiles allí. Aunque, por supuesto, los algoritmos en sí no se utilizan en todos los trabajos. Pero personalmente, esta experiencia me ayuda mucho.

¿Probablemente tuviste alguna historia especial sobre cómo llegaste a Google?

Sí, no hay ninguna historia, todo fue igual que los demás. Ahora estoy haciendo la búsqueda (la parte general, que no depende del país ni del idioma), pero lamentablemente no puedo contar nada al respecto, ya que es una parte muy confidencial.

Programación deportiva: pros y contras

Déjame intentar hacerte una pregunta estúpida :). ¿Por qué crees que se debería hacer programación deportiva?

Aquí todo es muy sencillo y similar a cualquier otro deporte. Tienes que hacerlo si te gusta, si lo disfrutas. Esto no debería ser un fin en sí mismo. Hay que pensar en la programación deportiva como una forma de pasar un buen rato, conocer gente interesante, etc.

¿Qué pasa si intentas encontrar una razón por la que no deberías perder el tiempo con la programación deportiva?

Creo que debes ser consciente de que esto no es lo principal en la vida. Tenga otros objetivos además de este. Si algo empieza a ocupar absolutamente toda tu vida, probablemente sea un motivo para pensar al menos en tomarte un descanso.

Pero, ¿qué dice la práctica? ¿Es posible, por ejemplo, construir una carrera en torno a la programación deportiva?

En Rusia hay varias personas que se dedican profesionalmente a la formación de nuevos programadores deportivos: entrenadores. Andrey Stankevich, Misha Mirzayanov y otros. Todos enseñan en universidades, pero dedican una parte importante de su tiempo de trabajo a preparar a estudiantes y escolares para concursos de programación. Para ellos, esto es realmente un trabajo y, se podría decir, una carrera.

¿Alguna vez has pensado en esto tú mismo? ¿Alguna vez participa en un jurado o como redactor de problemas?

Intenté enseñar a los escolares en la escuela número 57, donde yo mismo estudié. Intenté preparar equipos para los Juegos Olímpicos. Ahora en Moscú este tema es muy activo: hay equipos en la Universidad Estatal de Moscú, en Física y Tecnología y en la Escuela Superior de Economía. Pero de alguna manera la enseñanza no funcionó para mí.

En cuanto a los concursos, primero que nada ayudo a crear problemas para Google Code Jam, para nuestra competencia. Además ayudo con las semifinales de la ACM, que se celebran en San Petersburgo. Se trata de una selección entre equipos rusos y equipos de la antigua URSS para la final.

¿Es posible ganar dinero con los concursos? Después de todo, dan premios en efectivo por ganar.

La probabilidad es demasiado baja. ¿Un premio para diez mil participantes?... Yo no lo llamaría ganancias. Contando con esto como principal fuente de ingresos… me parece que no hay posibilidades.

Pero, como dije, hay muchas competiciones diferentes. El mismo Topcoder organiza concursos de desarrollo de programas. Digamos que necesita desarrollar un componente para un programa que haga esto. Según los resultados, evalúan quién obtuvo qué y se utiliza lo mejor: el cliente compra esta solución y paga dinero a quien tomó esta decisión. Las personas que hacen esto a tiempo completo, según tengo entendido, ganan un dinero bastante decente.

Concursos hoy

Cuéntanos con más detalle qué tipo de competiciones hay ahora, ¿cómo sucede todo?

Hoy en día existen dos tipos de concursos. Hay competiciones semanales y periódicas. Los llevan a cabo dos sitios principales: TopCoder y Codeforces. Cada concurso dura entre una hora y media y dos. Allí, a los participantes se les dan varios problemas para resolver y enviar el programa al servidor. Los organizadores están comprobando si el programa funciona.

TopCoder es el sitio más antiguo y famoso con concursos semanales. Tienen las siguientes reglas. Se asigna una hora y quince minutos para resolver tres problemas.

Las tareas se suelen dividir en muy sencillas, medias y difíciles. Los organizadores intentan seleccionarlos de modo que, digamos, cinco personas resuelvan todos los problemas, cien personas resuelvan dos y todos los demás resuelvan al menos uno. Además, para cada tarea es importante cuándo la envía: cuanto más tarde, menos puntos recibirá. Así se dividen aquellas personas que resolvieron la misma cantidad de problemas. Luego se resumen los puntos. Una tarea normal vale 250 puntos. Promedio 500. Difícil 1000. En promedio, las personas que ocupan el primer lugar obtienen mil y tantos puntos por competencia.

Luego se toman un descanso de cinco minutos y se dedican otros quince minutos a buscar errores en los demás. Puedes abrir la solución de cualquier persona, para cualquier problema en tu “habitación”. Una "sala" es cuando las personas que participan en una competencia se dividen aleatoriamente en grupos de veinte. Están divididos en “habitaciones”. Puede abrir cualquier solución de cualquier persona desde su "habitación". Si la solución le parece incorrecta, puede ingresar los datos de entrada en los que será incorrecta. Y si realmente da la respuesta incorrecta, obtendrás otros 50 puntos por ello. Por supuesto, esto es menor que el costo de la tarea. Pero esto se hace nuevamente para dividir a la gente. Los puntos principales todavía se otorgan por resolver problemas y no por encontrar errores.

Después de todo esto, las tareas se prueban en pruebas preparadas por el jurado. Si la tarea no funciona, la persona recibe 0 puntos.

También hay un segundo sitio, ruso, Codeforces. Sus reglas son ligeramente diferentes, pero el formato es aproximadamente el mismo: dos horas y varias tareas. Si lo desea, este formato puede considerarse entretenido, a diferencia de los concursos de estudiantes, que duran cinco horas.

¿Pero todavía existen grandes concursos anuales?

Sí, además de las dos competiciones descritas que se realizan semanalmente, hay muchas más competiciones anuales. Por lo general, están estructurados de la siguiente manera: una determinada gran empresa (Google, Yandex, TopСoder, IBM) organiza un concurso con varias etapas de selección. Las primeras etapas se llevan a cabo en línea. Y la etapa final ya se lleva a cabo en un lugar específico, donde se llevan a todos los finalistas. Sólo hay entre cinco y diez competiciones de este tipo, pero son largas, por lo que una de ellas se celebra todo el tiempo.

¿Todas estas competiciones son individuales?

La mayoría de las competiciones ahora son individuales. Las competiciones por equipos son principalmente competiciones de estudiantes, siendo la principal ACM ICPC. Y otras competiciones de estudiantes también suelen convertirse en competiciones por equipos porque, en términos generales, ya tienen un equipo. Esto hace que sea más fácil interesar a la gente. Las competiciones de veteranos suelen ser personales.

Las competiciones semanales tienen una clasificación, como el ajedrez, que se actualiza después de cada competición. Los que obtuvieron mejores resultados reciben un plus, los que obtuvieron peores resultados reciben un menos. Si no participó en absoluto, la calificación no cambia. El sistema está construido de tal manera que iguala a las personas que visitan con frecuencia y raramente. No hay presión de “tener que participar todo el tiempo”. Hay muchas personas que son mucho mayores que yo, aparecen muy raramente - una vez cada dos meses - y aun así tienen una buena calificación porque siguen resolviendo bien los problemas.

Sí, en primer lugar está Gena Korotkevich, un estudiante muy inteligente de Gomel, que ahora estudia en ITMO. Mis resultados en Codeforces han sido peores últimamente; ahora estoy sexto o quinto. Aquí también Gena es lo primero.

Probablemente, jugar en línea y fuera de línea es una sensación y experiencia completamente diferente.

Ciertamente. Me parece que un lado positivo muy importante de la programación deportiva es que todas las competiciones finalizan con una ronda presencial, donde se juntan todos los mejores. Gracias a esto, conocí a mucha gente interesante de todo el mundo. En general, me parece que el principal "premio" en este tipo de concursos es precisamente conocer gente. Pasas tiempo con ellos, te comunicas, aprendes algo nuevo. Es muy curioso que personas de otros países, que a menudo hablan mal inglés, sean sin embargo muy fáciles de entender porque tienen intereses muy similares.

En este tipo de competiciones, con selecciones, suele participar más gente que en las habituales. Si una persona nunca ha participado en ningún lugar, las competiciones semanales pueden ser un problema. Existen tales problemas que una persona puede no resolver nada y enojarse. En las competiciones con clasificación todo suele ser más sencillo, al menos en las primeras fases. Su idea principal es que todos se diviertan. Una vez más, al final hay un premio tangible: premios en efectivo para el primer lugar. Además, un viaje a algún lugar, por ejemplo a la oficina de Google, también es un gran premio.

¿Ocurre que las empresas intentan utilizar en la vida los desarrollos de las soluciones presentadas por los competidores?

Bastante raro. El objetivo principal de las empresas que organizan este tipo de concursos es simplemente popularizar la programación. El segundo objetivo es encontrar nuevos empleados. Pero el segundo ni siquiera es tan importante. Lo habitual es que una empresa organice un concurso precisamente para que más personas se interesen por la programación, y ni siquiera hablamos de los que participaron directamente en el concurso. Por este motivo, estos concursos los organizan normalmente las grandes empresas.

¿Las competiciones cambian con el tiempo? ¿Se están volviendo más difíciles o, por el contrario, más fáciles?

Se vuelven más complejos. Cada vez más algoritmos se consideran algo de la categoría "todos deberían poder hacer esto", "todos lo saben". Tienes que pensar tanto como hace diez años. La cantidad de pasos necesarios para construir una solución es la misma, pero los bloques básicos que componen la solución se han vuelto más complejos. La gente ha aprendido más algoritmos. Tomemos, por ejemplo, el árbol de sufijos: cuando apareció, estaba en la escuela y parecía que era un algoritmo genial, todos los que lo conocían eran muy inteligentes y, en general, fue una revolución. Ahora los mismos problemas se resuelven utilizando un autómata de sufijo, y este es un algoritmo muy simple que ocupa diez líneas. Es decir, han aprendido a simplificar mucho las cosas estándar. Por tanto, ahora se están resolviendo problemas más complejos.

Sobre las tareas y su preparación.

¿Cómo se componen las tareas para las competiciones? ¿Hay compiladores, personas que ya saben cómo hacer esto, o se trata de algún tipo de crowdsourcing donde todos pueden ofrecer algo propio?

En los concursos semanales mencionados esto ocurre exactamente: cada uno puede proponer su propia tarea. Pero existe el requisito de que una persona haya participado previamente en un número suficiente de competiciones. Una especie de comprobación para ver si una persona comprende de qué deben tratarse las tareas. Posteriormente podrás presentar tus trabajos y el jurado responderá si se pueden utilizar y si son adecuados. Si los problemas son adecuados, se presentan en concursos y el autor recibe dinero por ello, no mucho, pero aun así.

Resolver estos problemas es una habilidad especial, ¿no?

Oh sí. Puede plantear problemas basándose en soluciones. Digamos que lees algún artículo en una revista científica sobre un algoritmo interesante. O simplemente encontré un determinado algoritmo y recordé que lo había encontrado antes, pero recientemente no lo había visto en mucho tiempo. Puede idear una tarea que requiera su uso.

La segunda forma: cuando surge un determinado problema en el trabajo o en la vida y te das cuenta de que se puede utilizar de una manera genial. Puede que tengas que complicar las cosas o cambiar las restricciones, pero luego resultará ser un problema interesante para la competencia.

Hay competiciones de distintos grados de cercanía a la vida. Por lo general, la tarea en las competiciones no se presenta en términos formales, como "dado: resolver tal o cual ecuación". Por lo general, se dan ciertos antecedentes o historia. Como en los libros de texto escolares de matemáticas: “Por una tubería fluyen diez litros de agua por minuto”. Por lo tanto, primero es necesario formalizar de alguna manera esta historia, encontrar en ella un problema matemático y solo luego resolverlo.

Hay otras competiciones. TopCoder lo llama Marathon Match y otras empresas también organizan concursos similares. Están diseñados un poco diferente. Ya no se trata de una competencia de algoritmos, sino de resolución de problemas aproximados. Cuando no existe una solución exacta y es necesario encontrar la mejor opción posible. Estas competiciones suelen durar dos semanas o un mes. Puedes enviar diferentes soluciones y ver que sí, ahora mi solución es un 20% mejor que las demás.

¿"Mejor" significa más rápido, utiliza menos memoria, etc.?

Sí. Por ejemplo, es necesario idear un esquema para distribuir el tráfico de autobuses en el mapa de Moscú para utilizar la menor cantidad de autobuses posible. Es decir, en el planteamiento del problema hay un determinado parámetro que debe optimizarse, pero no existe una única "solución correcta", sólo algunos algoritmos aproximados.

El mismo Topcoder realizó concursos junto con la NASA y dicen que las soluciones que les ofrecieron fueron adaptadas y utilizadas en la ISS. Allí estaban resolviendo un problema concreto, se trata de cómo rotar una batería solar para que reciba más energía.

Por donde empezar

Desde el punto de vista de preparar un buen programador algorítmico y participar en varios concursos, ¿cómo prepararse para esto? ¿Si te imaginas en el lugar de un estudiante de secundaria o de estudiantes de primer año?

Me parece que la forma más estándar es intentarlo. Todos los concursos tienen disponible un archivo de concursos realizados anteriormente; hay miles de problemas que se pueden solucionar en cualquier momento.

¿Qué pasa si asumo una tarea y ni siquiera sé cómo abordarla?

Entonces, tómalo más simple. Son diferentes. Hay problemas que uno de cada dos graduados de la escuela puede resolver. Hay niveles de dificultad completamente diferentes. Debería ser bastante fácil involucrarse. Me parece que no hay otra manera. Además, de esta forma sabrás inmediatamente si te gusta esta actividad o no.

¿Qué hay que hacer para obtener una base algorítmica? No es necesario apresurarse inmediatamente a leer a Knuth.

Me parece que tenemos que empezar con las tareas. Sólo más tarde, cuando te das cuenta de que no puedes resolver ninguno de ellos en concreto, en estas competiciones cada uno tiene un análisis. Puedes leer la solución si no puedes arreglártelas solo. Por ejemplo, el análisis indica que se utiliza un determinado algoritmo para resolver el problema. Puede leer qué es este algoritmo y dónde más se utiliza. Esto es mejor que leer la lista "sí, tengo un algoritmo que necesito estudiar durante el verano". Es mejor empezar desde un problema específico que no pudiste resolver porque no conoces un algoritmo específico. Esto es más correcto. Recuerdas mejor, tu motivación es más fuerte. Esta forma de aprender algoritmos probablemente lleve más tiempo que la lista, pero conduce a mejores resultados.

Si desea "animarse" utilizando algoritmos, ¿hay alguna literatura o libros de texto?

El libro de texto más estándar es Cormen, Leiserson, Rivest con un burro en la portada. Se llama “Algoritmos: Construcción y Análisis”. No lo sé, hace mucho que no estudio, ahora probablemente haya nuevos libros de texto que tal vez sean mejores. Pero en mi época usaban Cormen. Knut es más bien una especie de libro de referencia. Si necesita encontrar algo y no está en ninguna parte, es probable que esté allí. Pero leer a Knuth seguido... es una experiencia bastante triste.

“No iremos a Facebook ni a Google”: por qué algunos de los mejores programadores del mundo viven y trabajan en Ekaterimburgo

Una interesante entrevista con los ganadores del Campeonato Mundial de Programación de la Universidad Federal de los Urales.

Siempre me ha interesado comprender por qué los concursos de programación son tan populares en Rusia (más precisamente, en el espacio postsoviético en general) (probablemente el término utilizado en este artículo sea más adecuado: "programación deportiva"), a pesar de que que en el Occidente decadente estoy hablando de ellos. Durante mucho tiempo ni siquiera lo supe, y cuando lo supe, por alguna razón no me sentí atraído por eso en absoluto. Es como un mundo completamente separado. Durante muchos años participé activamente en varias comunidades de programación en línea, por ejemplo, estuve en las listas de correo de varios proyectos de código abierto, a veces conocí gente en la vida real, pero nunca se habló de TopCoder, por ejemplo, de TopCoder. existe, lo descubrí en un LiveJournal ruso, en mi opinión (y después de enterarme de esto, no fui allí de inmediato y con urgencia, no creé una cuenta y no participé. De alguna manera es muy divertido e interesante entender por qué).

Parte de esta popularidad se explica, en mi opinión, por algunas observaciones de esta entrevista:

"¿Por qué UrFU mostró el mejor resultado esta vez? ¿Se alinearon las estrellas?"

Mikhail Rubinchik: Tenemos un equipo estelar. Oleg, Lesha y todos los demás son tipos muy fuertes. Oleg está ahora en sexto año, empezó a estudiar en el segundo, pero al tercero ya tenía un nivel decente.[...]

"¿Qué está más cerca de usted? ¿Una startup? ¿O una gran empresa?"

Oleg Merkuryev: No he trabajado en ningún sitio. Y no voy a trabajar en ningún lado en los próximos seis meses. Iré a la escuela de posgrado, necesito estudiar un poco de ciencias; de lo contrario, generalmente dedico todo mi tiempo a la programación deportiva.

Aquellos. Realmente se siente como un deporte ante todo. Incluyendo algunas restricciones salvajes que son típicas de las competiciones deportivas:

"Hablemos un poco del campeonato en sí. Tres personas en el equipo. Una computadora. ¿Por qué una? ¿Por qué no tres?"

Mikhail Rubinchik: El jurado así lo decidió una vez. Esto fue hace treinta años.

Oleg Merkuriev: Entonces quizás surgieron razones adicionales que ahora no existen. Y luego incluso una computadora por equipo era mucho, pero no mucho por persona.

[...] Puedes usar una impresora en la Copa del Mundo. La primera persona se sentó, escribió alguna solución, pero no funcionó. Necesita encontrar el error. Leer desde una computadora es costoso, pero solo tenemos un recurso. Por tanto, lo imprimen en una impresora y lo leen en una hoja de papel.

Bueno, no entiendo cómo puede ser tan atractivo. La programación es una actividad creativa. No había ningún programa y ahora lo hay. No podías hacer algo con una computadora, pero ahora puedes. ¿Importa si tomó 20 minutos o 40? Es sólo un aspecto poco interesante.

No, me imagino las limitaciones que provocan la emoción deportiva, pero a nivel de varios días y tareas realmente difíciles e interesantes. Como en el concurso Ludum Dare: escribe un juego en dos días. O el Concurso de Programación ICFP, dan tres días y las condiciones suelen ser alucinantes. Compárese esto con las tareas del Mundial en la programación deportiva. Si compites durante minutos y segundos (también con una computadora entre tres), entonces las tareas resultan así: el uso astuto de varios algoritmos estándar con algún "giro" complicado.

En general, este es un mundo extraño. No me culpen a mí los que le tienen miedo. Pero no entendí y no entiendo.

Todo es muy complicado y al mismo tiempo sencillo. ¿Por qué existe la programación deportiva? No “por qué molestarse con eso”, sino precisamente “por qué existe como fenómeno”. ¿Por qué es necesario el deporte, ya sea intelectual o físico? ¿Alguien dirá eso por la salud, el desarrollo, todo eso? Sí, hay tantas lesiones en los deportes profesionales que ninguna cantidad de salud es suficiente. ¿Por dinero? Sí, todos allí se vuelven millonarios en un año. La verdadera razón es una: el deseo de ganar, de ser diferente de los demás, de ser mejor, más perfecto, más significativo. Haz algo grandioso por tu gente. Todo lo demás es una consecuencia. Si no fuera por este deseo, que da origen a la competencia como tal, todo lo demás no existiría. Es lo mismo aquí.

Lo que atrae a la gente al principio. Algún tipo de interés, novedad, una especie de “efecto sorpresa”. Pero pasa. Para que surja una motivación sostenible, se requieren mecanismos más profundos. De lo contrario, si queda algo, sólo alcanzará para actividades “por diversión”.

Por lo tanto, lo primero y principal que puede hacer para motivar a un principiante es la oportunidad de convertirse en el mejor en su campo. No sólo un codificador, como miles de miles, sino un campeón. Después de todo, toda persona sueña con algo grande y significativo. Quizás ese niño de pequeño soñaba con marcar goles en la Liga de Campeones, y esta niña soñaba con cantar canciones en Eurovisión. Él fue a una escuela de deportes y ella a una escuela de música, pero no funcionó. Pero las matemáticas siempre fueron exitosas, pero ¿qué tiene de bueno ser un nerd nerd y resolver problemas abstrusos que son interesantes solo para ti? Y a un excelente estudiante que soñaba con ser astronauta, sus padres, a quienes no les importaba su sueño, le inculcaron que un astronauta debería al menos saber con qué leyes físicas vuelan los cohetes, así que comenzó a resolver la física, todas las más aún, fue con fuerza. Y ahora todos han entrado en la universidad y en algún lugar de su interior ya empieza a sonar alarmantemente el pensamiento: “¿Y qué? ¿Realmente no voy a hacer nada extraordinario en esta vida?” Después de todo, en general, cualquier programador graduado puede ser reemplazado en el trabajo. Y esta es tu oportunidad: competir por tu ciudad, por tu universidad, por toda Rusia, ganar, llegar a semifinales, finales, hacer algo que si no lo haces tú, nadie más lo hará. hazlo.

Cuando empezamos a programar, en el grado 11, nos contaban una y otra vez cómo empezó todo. Por primera vez nuestros equipos llegaron a las semifinales. ¿Cómo pasaste la primera tarea? Cómo llegaron a la final por primera vez. Cómo nos fuimos al extranjero. ¡Cómo luchamos en igualdad de condiciones con las mejores mentes del planeta! Y mi corazón se hundió con el deseo de llegar a ser al menos un poco como ellos. Miramos las mesas finales y los nombres aparecieron ante nuestros ojos: ¡MIT, Harvard, Stanford! ¿Todos sueñan con estudiar allí? Pero esto es mucho más interesante: ¡llevar a todos los tan cacareados equipos extranjeros al infierno! Cómo el equipo de Tarasov, en el primer partido de la súper serie, derrotó al equipo de los más grandes profesionales del hockey de Canadá por 7:3. ¡Aquí está, el desafío de nuestras vidas! ¡Y todo esto es posible! ¡Esta es la realidad! Y esto es lo que hace que la vida realmente valga la pena. Y tal vez algún día en nuestra propia universidad se cuenten las mismas historias sobre nosotros a los reclutas. Y todos soñarán con ser como nosotros. Así es exactamente como ven los recién llegados los Juegos Olímpicos.

Ya sabes, todos estamos acostumbrados a estas frases: “semifinalista del Campeonato del Mundo”, “premiado del Campeonato de Europa del Noreste”, etc. Esto no debería sorprendernos. ¡Pero para una persona cualquiera en la calle, tales logros son solo espacio! Y los recién llegados son la gente de la calle. Entonces, ¿por qué no usarlo? Después de todo, llegar a las semifinales del Campeonato Mundial NEERC para muchos concursantes sigue siendo para el resto de sus vidas la cima más alta que han alcanzado, el título más ruidoso que han ganado. Esto ya no era una broma.

Tienes diez mil estudiantes y aquí tienes la oportunidad de convertirte en uno de esos tres estudiantes de élite que representarán a la universidad y a la ciudad en la principal competición estudiantil del mundo. ¡Cada uno de ellos ya es, como suele decirse, “único entre muchos miles”! La división de élite de tu universidad.

Sí, luego habrá horas de duro trabajo, pero ¿quién dijo que convertirse en campeón del mundo es fácil? Trabajar duro sucederá por sí solo cuando una persona sepa que está avanzando hacia una meta digna. Nadie correrá un maratón ni escalará el Everest sin preparación. Todo el mundo entiende esto. Pero si pasas por esto, tendrás algo por lo que podrás respetarte. Es lo mismo aquí. Nada menos.

Pero nadie va a la montaña sólo por las dificultades, ni a una maratón sólo para no levantarse de la cama durante una semana. Nadie entra al ring de boxeo por el gusto de recibir un golpe en la cabeza. Hay pocos masoquistas. Todas estas personas están motivadas por algo más. Como los programadores deportivos. A saber: ¡gol!

Entonces, si eres profesor de guitarra, no debes decirles a tus alumnos que les dolerán los dedos y dejarles intentar tomar la barra inmediatamente (“sí, ¿no puedes? ¡Será difícil!”). Pero puedes ver lo genial que es ser el alma de la fiesta en una fiesta alrededor del fuego y con qué ojos te mirarán las chicas. Si eres piloto instructor de SAF, no deberías hablar inmediatamente sobre cómo evaluar, por ejemplo, el clima. Intenta transmitir la sensación de vuelo y romanticismo.

Es lo mismo aquí. Si explicas los árboles equilibrados y al final de la conferencia dices: “Un estudiante de la Olimpiada puede escribir esto”, nadie te entenderá. Si pasas cinco horas compitiendo y analizando, se aburrirán y se marcharán, buscando su sueño de infancia en otra parte. Algunos se quedarán, pero sin entusiasmo. Entonces, resolver problemas sigue siendo más interesante que resolver algunos crucigramas o navegar por las redes sociales en aplicaciones. Si dudas de tu utilidad, de tu éxito, tus dudas se transmitirán a los reclutas. Si usted mismo está convencido de que el ICPC es más genial, más grande, más importante que todas las conferencias y foros de estudiantes científicos juntos, que es posible ganar, que ya ha funcionado (o no ha funcionado, pero todo el mundo lo está esperando), entonces también te creerá. Lo más importante es creer en todo esto tú mismo.

De hecho, es muy bueno cuando hay competencia. Es aún mejor cuando la universidad ya tiene finalistas, y los hay jóvenes y verdes. ¡Los jóvenes dormirán y verán el primer concurso, donde finalmente, al menos durante cinco minutos, vencerán a los mayores! Para los principiantes, incluso estar un minuto en el monitor encima de ellos ya es felicidad.

Estos son los conceptos básicos de la motivación. Estos son problemas algorítmicos que nadie sabe cómo resolver, cuando a las tres de la mañana saltas de la cama, enciendes la computadora para terminar el código, finalmente pasas esta maldita prueba número 80 y eres aceptado, y entonces te sientes un poco como Mendeleev, que tuvo una intuición en un sueño. Éste es un año de preparación, sólo cinco horas para las que estuvo todo y una tarea decisiva planteada en el último momento. Es un honor representar a tu ciudad y país en lo que mejor sabes hacer. Bueno, entonces lo resolverán ellos mismos. Es poco probable que necesites a alguien que haya presentado su solicitud sólo para obtener un título y conseguir un trabajo normal. Todos los demás, y como escribió Mirzayanov, los matemáticos y los jugadores, vienen si aman el proceso, si encuentran ecos de un sueño de la infancia, si no temen las dificultades, si están listos para jugar, bienvenidos.




Arriba