Existe el mito de que crear aplicaciones para iOS o Android es más fácil que ser, por ejemplo, un desarrollador de back-end. Por supuesto, esto no es así: existen dificultades para trabajar con cualquier plataforma, en todas partes surgen problemas obvios que requieren habilidades en el área temática y más allá. Roman Abuzyarov, del equipo Yandex.Chats, preparó un informe sobre sus diversas tareas, que muestra cuán amplio debe ser el conocimiento de un especialista en iOS. El informe está destinado a principiantes y desarrolladores junior.
- Hola a todos, mi nombre es Roma, soy desarrollador de iOS en Yandex.Chats. Hoy trataré de hablar sobre el hecho de que el desarrollo móvil es muy interesante y difícil, y hay algo que hacer. Lo haré como un ejemplo de las tareas que resolví durante mi pasantía y cuando era un desarrollador junior.
Me gradué de la Facultad de Ciencias de la Computación en HSE. En el tercer año de FKN, trabajé un poco en el desarrollo de iOS, me interesé, me gustó. Pensé: puedes ir a algún lugar para hacer ejercicio, hacer una pasantía. Logré llegar a Yandex para una pasantía, y cuando terminé, me transfirí al personal y ahora sigo trabajando en el equipo de Yandex.Chats.


Un poco sobre Yandex.Chats. Nos comunicamos en muchos servicios de Yandex. Si te comunicas con alguien en Yandex, lo más probable es que lo hagas a través de Yandex.Chats. Hay, por ejemplo, la aplicación Yandex en dispositivos móviles, los chats están integrados allí. Hay Yandex.Rion, donde puede escribir a cualquier usuario a través de Yandex.Chats. En el mercado, puede chatear con organizaciones, preguntar algo sobre un producto y todo eso. La lista continúa. Hay un Yandex.Browser móvil, donde hay chats, puedes abrirlos en los Mapas. En Yandex.Connect, esto es algo así para las empresas, los chats también se entregan como paquetes para las empresas. También está Aura, esta es una red social en la que puedes deslizar publicaciones y también comunicarte con los usuarios a través de salas de chat.
Contratamos, si desea participar en la comunicación, venga. También tenemos pasantías en Sochi. Vamos allí en viajes de negocios cada pocos meses. Sobre chats por ahora.
¿Qué y por qué quiero decirte? Lo primero que noté mientras estudiaba en el FKN fue que muchas personas en general y los maestros en particular tienen una actitud parcial hacia el desarrollo móvil. Todos piensan: ¿qué hacer allí? Presionó el botón, todo es simple. Y un desafío especial era obtener un diploma en desarrollo móvil, porque te dirían: toma algo más complicado.
Hoy quiero mostrar que, de hecho, todo está mal, esto es un mal estigma. Hay muchas cosas interesantes y complejas en el desarrollo móvil. El segundo: cuando llegué a la pasantía, no tenía idea de qué tareas realizan los desarrolladores móviles en las empresas. Y los equipos, por el contrario, quieren saber lo que quieres hacer y si tienes experiencia en desarrollo industrial.
Hoy intentaré arrojar luz sobre todo esto, mostrarle las tareas específicas que resolví para que tenga una idea aproximada de lo que está sucediendo aquí y de lo que puede hacer.
Hoy te mostraré tres tareas que resolví. Vayamos directamente al primero.
Agujeros en la historia
La tarea principal de los chats y, en general, los mensajeros es enviar mensajes a alguien y recibir mensajes de alguien.

Supongamos que puedo usar el chat para chatear con mi madre. Puntuación del autor, no hay comas aquí específicamente. Y puedo enviarle algunos mensajes, esperar a que los vea y todo estará bien. Pero la madre a veces tiende a estar donde no se conecta la conexión: por ejemplo, en el metro o en el túnel.

Y es posible que algún mensaje no le sea entregado por razones que escapan a nuestro control. La impresión de la conversación no es del todo correcta; ella puede comenzar a entrar en pánico. El mensajero móvil debe manejar esta situación correctamente.
Para seguir adelante, te contaré información importante sobre los mensajes. Primero, cada mensaje tiene un identificador único. En este caso, estos son solo números en orden. De hecho, se ven un poco diferentes, pero el punto principal es que es único y nos permite identificar estos mensajes. Se almacena dentro del mensaje junto con el texto, lo tenemos.
La segunda cosa en el mensaje es el mismo identificador único del mensaje anterior. Se almacena allí y, conociendo los identificadores, podemos sacar conclusiones sobre cuán holística es nuestra historia.
Ahora la situación es esta. Mamá tiene tres mensajes en su teléfono. Ella los leyó a todos y no entiende lo que está sucediendo, se asusta mucho.

Los chats pueden detectar inmediatamente esta situación. Observamos estos identificadores y vemos que antes del cuarto mensaje debería haber un tercero, pero por alguna razón no lo tenemos, y hay un segundo. Encontramos esto fácilmente. Escribimos en letras mayúsculas: los mensajes se están cargando, dibujamos una especie de rueda giratoria, y en este momento vamos a nuestro backend y le decimos: tenemos tal o cual mensaje perdido entre los dos, ¿puede por favor dárnoslo?

Nos lo da de forma rápida y sencilla, ya que solo debe enviar un mensaje. Lo tomamos, lo construimos nuevamente y todo se ve bien. Mamá entiende la situación completa y no está preocupada.

¿En qué tenía que pensar al hacer esto? La primera es que los dispositivos móviles tienden a estar desconectados muy a menudo, y esto siempre debe tenerse en cuenta. Debe comprender que algunas solicitudes pueden fallar, debe volver a intentarlo. Tal vez su dispositivo estuvo desconectado durante una hora y luego necesita recuperarse cuando apareció la red.
El segundo: debe poder interactuar con el backend. En muchas aplicaciones, una habilidad útil es enviar solicitudes y analizar respuestas. En tercer lugar, debe comprender las estructuras de datos básicas. Supongamos que aquí podemos entender que estos mensajes están relacionados, es decir, tienen propiedades de una lista vinculada. Y estas propiedades, es decir, esta conexión entre mensajes se pueden usar para hacer que nuestro cliente funcione más estable. Podemos tratar los agujeros de esta manera.
Pegatinas recientes
Pasemos a la siguiente tarea. Hay muchas pegatinas donde las hay. Esta es una imagen que puede enviar y no necesita precargarla. Solo alguien antes que usted, alguien lo cargó en el backend y solo necesita enviarle su identificador, y todos los demás usuarios podrán encontrarlo con este identificador. Pegatinas recientes es un lugar tan especial para obtener las últimas pegatinas que envió. Puedes usar pegatinas que te gusten, a menudo las usas y es muy conveniente acceder a ellas.

Supongamos que quiero enviar una estrella. Lo envío, se convierte en este primer lugar en mis pegatinas recientes.

Todas las demás pegatinas se desplazan una a la derecha. Y cuando envío todas las etiquetas subsiguientes, todas las anteriores también se desplazan una a la derecha, la nueva se convierte en la primera.
Aquí puede comprender de inmediato que esto es similar a una estructura de datos llamada "cola" o cola o Primero en entrar, primero en salir. Es decir, el primer elemento que llega al principio, es el primero al final y desaparecerá. El pájaro que una vez agregamos se caerá cuando nos quedemos sin espacio para estas pegatinas recientes.

Sin embargo, ¿qué sucederá cuando queramos agregar una pegatina que ya está en nuestra cola? Digamos que este es un gatito con una moneda. Comestibles entendemos lo que queremos conseguir. De modo que el viejo gato desapareció en el lugar donde está, y el nuevo se convirtió en el primero.
Pero como todos somos desarrolladores, entendemos que puede insertar en una cola por un lado, obtenerla por el otro, y algo no le permite cambiar algo en el medio, o será súper ineficiente. ¿Qué puedes intentar hacer con esto?
Introduje otra estructura de datos llamada Hash Map. Por si acaso, lo aclararé. Esta es una tabla de correspondencia de algunas cantidades a otras, en términos generales. En este caso, la clave en nuestra tabla será una pegatina o algún identificador único de la misma. Y el valor será el número de entradas en nuestras pegatinas recientes.
Aquí indiqué de inmediato que todos entraron una vez, excepto el pájaro. ¿Por qué usaremos esto? Supongamos que queremos nuestros datos, extraiga esta secuencia de calcomanías; digamos, guárdela en una base de datos para que el usuario reinicie la aplicación y se recupere de ella en la secuencia correcta. Obtendremos la pegatina por otro lado, a partir de la cola, pero las emitiremos solo si el número de ocurrencias de esta pegatina es igual a uno. Si hubiera más de uno, simplemente lo ignoramos y lo tiramos.

Como funciona Digamos que agregamos un gatito. Ella se pone en nuestro turno. El número cerca del gato se ha convertido en 2. Es decir, ahora hay dos gatos en nuestro turno.
Supongamos que ahora queremos guardar la secuencia completa de pegatinas, comenzamos a obtenerlas. Miramos el calendario, entró solo una vez.

Lo conseguimos sin ningún problema. Luego miramos al gatito. El gato entró dos veces, así que en este momento no la llevamos, simplemente la tiramos, la ignoramos y reducimos el número dos a uno.

Todos los adhesivos posteriores que tuvimos una vez, los obtenemos con calma.

Todo está en orden, lo logramos. El gato en este momento también se encontró solo una vez, por lo que también lo tenemos con calma y todo está en orden.

Veamos estas marcas de verificación verdes. ¿Qué secuencia de pegatinas obtuvimos?

Entenderemos que obtuvimos exactamente lo que necesitamos, y todo funciona como se estableció en la tarea.

¿En qué deberías pensar en esta tarea? Aquí ya necesita conocer un poco más las estructuras de datos: para saber qué son una cola y Hash Map, qué operaciones han definido y qué puede hacer con ellas. También necesita evaluar la complejidad. En general, es útil conocer la complejidad de las operaciones en estructuras de datos básicas, esto permitirá una construcción más eficiente de estructuras compuestas o la implementación de algoritmos. La tercera cosa que es muy importante hacer en el trabajo y en la vida es adaptarse a la tarea, tomar algunos conocimientos que tiene. Suponga que conoce las mismas estructuras de datos. Coloque una sola imagen, que resolverá exactamente el problema que se presenta ante usted en un momento particular.
Imagen en imagen
Ahora pasemos a la tercera y última tarea. Esta es una imagen en imagen. Lo aclararé. Hay llamadas y videollamadas en Yandex.Chats.

Durante una llamada, puede contraer la transmisión de video del interlocutor en una pequeña ventana y moverla por la pantalla, mientras usa el messenger. Tal multitarea resulta que el video se adhiere a las esquinas de la pantalla cuando lo arrastra. Para lograr esta funcionalidad, debe seguir algunos pasos. Lo primero y principal que debe hacer es hacer que esta gran transmisión de video rectangular sea pequeña y estar en el lugar adecuado para usted. Sobre esto debería suceder. Aquí recordamos la geometría básica: multiplicamos los lados del rectángulo por algún factor, movemos su centro y todo está bien, aquí está en el lugar correcto.
La segunda tarea es más difícil. Debe hacerlo de modo que se ubique en las esquinas de la pantalla y se adhiera a ellas. Para esto, decidí usar un marco estándar llamado UIKit Dynamics.

Esto es algo que le permite dar a los objetos visuales una variedad de propiedades físicas: gravedad, inercia, estas cosas. Es a partir de este marco que apliqué una entidad como Spring Field. La primavera se traduce en primavera. Este es un campo que atrae objetos a un punto en la zona de su acción.

En la interfaz de Messenger, se ve así. Los puntos rojos indican la dirección de uso de la fuerza. Y si saco esta vista desde el medio, retrocede.

Para simplificar, he designado un rectángulo como tal rectángulo. Esta es una zona amarilla con un punto de fuerza indicado por un punto negro.
Ahora, volvamos a cómo se establece nuestra tarea. Tenemos la pantalla principal del usuario, cuatro puntos en ella, y queremos que nuestra transmisión de video sea atraída por ellos. ¿Cómo empecé a resolverlo? Simplemente tomamos todo nuestro campo, lo esculpimos en toda la pantalla. Designamos cuatro puntos de atracción para él, y el marco hace todo por nosotros.

Entonces, por supuesto, no logré hacer nada, porque solo se puede establecer un punto de atracción para un campo, no se pueden establecer cuatro puntos.
Pensé: está bien, la segunda etapa. Tomamos cuatro de estos campos, los organizamos para que llenen toda la pantalla y colocamos los puntos donde necesitamos ser atraídos.

Pero esto tampoco funcionó para mí, porque los valores que se pueden cambiar en el campo son el tamaño y su punto central. Y ella se siente atraída solo en el medio. Muy conveniente, gracias, Apple, pero falló.
¿A dónde vine? Tomamos nuestros campos, los organizamos para que llenen toda la pantalla y no se crucen, no entren en conflicto, y que sus puntos medios estén en las esquinas correctas. Los campos salen de la pantalla, pero no nos molesta en absoluto, se ve así:

Hay campos visualizados, y esta vista se ve atraída por el lugar donde el usuario la arrastra con su dedo.


Para resolver este problema, era necesario saber lo siguiente. El primero es la geometría básica. En general, cuando está involucrado en algún tipo de desarrollo visual móvil o front-end, necesita poder calcular estos rectángulos, mover los marcos, por así decirlo. Esta es una habilidad útil, se puede obtener en la escuela.
En segundo lugar, debe poder trabajar con los gestos del usuario para poder leer los gestos que el usuario hace, por ejemplo, deslizamientos, y para que el usuario trabaje con su aplicación es suave e interesante. Esto también se puede hacer por medios estándar, luego mostraré el enlace.
Y tercero, importante: necesita conocer los marcos del sistema. No es necesario saber cómo trabajar con ellos, sino simplemente conocer su existencia y lo que pueden ayudarlo a lograr. Porque cuando esté configurado con alguna tarea, haga esto, puede recordar: sí, existe ese marco, ahora buscaré en Internet cómo usarlo y hacer la tarea. Y si no lo sabe, simplemente pensará que ni siquiera necesita realizar esa tarea, porque no sabe qué hacer con ella.

Le mostré solo tres tareas, pero de hecho ya hay bastantes cosas en las que necesita pensar, cuya experiencia necesita saber, desarrollar. Hay muchas más tareas, y todas son muy diversas e interesantes. Y si desea que su producto se desarrolle, debe resolverlo constantemente. También prometí algunas referencias:
-
Cola en dos pilas-
HashTable en Swift-
Complejidad de algoritmos con ejemplos.-
Reconocimiento de gestos del usuario.-
Introducción a la dinámica UIKitEso es todo por mí, gracias.