O desenvolvimento móvel é fácil e chato? Relatório Yandex


Existe um mito de que criar aplicativos para iOS ou Android é mais fácil do que ser, digamos, um desenvolvedor de back-end. Obviamente, não é assim: existem dificuldades em trabalhar com qualquer plataforma, em todos os lugares surgem problemas não óbvios que exigem habilidades na área de assunto e além. Roman Abuzyarov, da equipe Yandex.Chats, preparou um relatório sobre suas diversas tarefas, mostrando o quão amplo deve ser o conhecimento de um especialista em iOS. O relatório é destinado a iniciantes e desenvolvedores juniores.

- Olá pessoal, meu nome é Roma, sou desenvolvedor iOS no Yandex.Chats. Hoje vou tentar falar sobre o fato de que o desenvolvimento móvel é muito interessante e difícil, e há algo a fazer. Farei isso como um exemplo das tarefas que resolvi durante meu estágio e quando era desenvolvedor júnior.

Eu me formei na Faculdade de Ciência da Computação da HSE. No terceiro ano do FKN, trabalhei um pouco no desenvolvimento do iOS, fiquei interessado, gostei. Eu pensei - você pode ir a algum lugar para se exercitar, fazer um estágio. Consegui chegar ao Yandex para um estágio e, quando terminei, fui transferido para a equipe e agora continuo trabalhando na equipe do Yandex.Chats.





Um pouco sobre o Yandex.Chats. Nós nos comunicamos em muitos serviços Yandex. Se você se comunicar com alguém no Yandex, provavelmente através do Yandex.Chats. Há, digamos, o aplicativo Yandex em dispositivos móveis, os bate-papos são criados lá. Existe o Yandex.Rion, onde você pode escrever para qualquer usuário através do Yandex.Chats. No mercado, você pode conversar com organizações, perguntar algo sobre um produto e tudo mais. A lista continua. Existe um Yandex.Browser móvel, onde há bate-papos, você pode abri-los no Google Maps. No Yandex.Connect, isso é algo para as empresas, os chats também são entregues como pacotes para as empresas. Também existe o Aura, uma rede social em que você pode deslizar as mensagens e também se comunicar com os usuários através de salas de bate-papo.

Contratamos, se você deseja se envolver em comunicação, venha. Também temos estágios em Sochi. Nós vamos lá em viagens de negócios a cada poucos meses. Sobre o Bate-papo por enquanto.

O que e por que eu quero lhe contar? A primeira coisa que notei enquanto estudava na FKN foi que muitas pessoas em geral e professores em particular têm uma atitude tendenciosa em relação ao desenvolvimento móvel. Todos pensam - o que fazer lá? Ele apertou o botão, tudo é simples. E um desafio especial era obter um diploma em desenvolvimento móvel, porque eles diriam a você: pegue algo mais complicado.

Hoje eu quero mostrar que, de fato, está tudo errado, isso é um estigma ruim. Há muitas coisas interessantes e complexas no desenvolvimento móvel. A segunda - quando cheguei ao estágio, não fazia ideia de quais tarefas os desenvolvedores móveis nas empresas fazem. E as equipes, pelo contrário, querem saber o que você deseja fazer e se possui experiência em desenvolvimento industrial.

Hoje vou tentar esclarecer tudo isso, mostrar as tarefas específicas que resolvi para que você tenha uma idéia aproximada do que está acontecendo aqui e do que você pode fazer.

Vou mostrar hoje três tarefas que resolvi. Vamos direto ao primeiro.

Buracos na História


A principal tarefa do bate-papo e, em geral, dos mensageiros é enviar mensagens para alguém e receber mensagens de alguém.



Suponha que eu possa usar o bate-papo para conversar com minha mãe. Pontuação do autor, não há vírgulas aqui especificamente. E posso enviar-lhe algumas mensagens, esperar que ela as veja e tudo ficará bem. Mas a mãe às vezes tende a estar onde a conexão não pega: por exemplo, no metrô ou no túnel.



E alguma mensagem pode não ser entregue a ela por razões fora do nosso controle. A impressão da conversa não está certa: ela pode começar a entrar em pânico. O mensageiro móvel deve lidar com essa situação corretamente.

Para seguir em frente, vou lhe contar algumas informações importantes sobre as mensagens. Primeiro, cada mensagem tem um identificador exclusivo. Nesse caso, esses são apenas números em ordem. De fato, eles parecem um pouco diferentes, mas o ponto principal é que ele é único e nos permite identificar essas mensagens. Ele é armazenado dentro da mensagem junto com o texto, nós o temos.

A segunda coisa na mensagem é o mesmo identificador exclusivo da mensagem anterior. Ele está armazenado lá e, conhecendo os identificadores, podemos tirar conclusões sobre o quão holística é a nossa história.

Agora a situação é essa. Mamãe tem três mensagens no telefone. Ela leu todos eles e não entende o que está acontecendo, ela entra em pânico.



O bate-papo pode detectar imediatamente essa situação. Observamos esses identificadores e vemos que antes da quarta mensagem deve haver uma terceira, mas, por alguma razão, não a temos, e há uma segunda. Achamos essa coisa facilmente. Escrevemos em letras maiúsculas - as mensagens estão carregando, desenhamos algum tipo de botão giratório e, neste momento, vamos ao nosso back-end e dizemos a ele: temos essa e essa mensagem perdida entre as duas, você pode nos dar?



Ele nos entrega de forma rápida e fácil, porque você precisa enviar apenas uma mensagem. Pegamos, construímos de volta e tudo parece bem. Mamãe entende toda a situação e não está preocupada.



O que você teve que pensar ao fazer isso? A primeira é que os dispositivos móveis tendem a ficar offline com muita frequência, e isso sempre deve ser lembrado. Você precisa entender que algumas solicitações podem falhar, é necessário tentar novamente. Talvez o seu dispositivo esteja offline por uma hora e você precise se recuperar quando a rede aparecer.

O segundo - você precisa poder interagir com o back-end. Em muitas aplicações, uma habilidade útil é enviar solicitações e analisar respostas. Terceiro, você precisa entender as estruturas básicas de dados. Suponha que aqui possamos entender que essas mensagens estão relacionadas, ou seja, elas têm propriedades de uma lista vinculada. E essas propriedades, ou seja, essa conexão entre mensagens pode ser usada para tornar nosso cliente mais estável. Podemos tratar buracos dessa maneira.

Adesivos recentes


Vamos para a próxima tarefa. Existem muitos adesivos onde existem. Esta é uma imagem que você pode enviar e não precisa pré-carregá-la. Apenas alguém antes de você, alguém fez o upload para o back-end e você só precisa enviar seu identificador, e todos os outros usuários poderão encontrá-lo por esse identificador. Adesivos recentes é um local tão especial para obter os últimos adesivos que você enviou. Você pode usar adesivos que desejar, geralmente usá-los e é muito conveniente acessá-los.



Suponha que eu queira enviar uma estrela. Eu envio, torna-se este primeiro lugar nos meus adesivos recentes.



Todos os outros adesivos são deslocados para a direita. E quando eu envio todos os adesivos subsequentes, todos os anteriores também são deslocados para a direita, o novo se torna o primeiro.

Aqui você pode entender imediatamente que isso é semelhante a uma estrutura de dados chamada “fila” ou fila ou Primeiro a entrar, primeiro a sair. Ou seja, o primeiro elemento que chega lá no início, é o primeiro no final e desaparece. O pássaro que uma vez adicionamos cairá quando ficarmos sem espaço para esses adesivos recentes.



No entanto, o que acontecerá quando quisermos adicionar um adesivo que já esteja em nossa fila? Digamos que este é um gatinho com uma moeda. Mercearia entendemos o que queremos obter. De modo que o gato velho desapareceu no lugar onde está, e o novo gato se tornou o primeiro.

Mas como somos todos desenvolvedores, entendemos que você pode inserir uma fila, por um lado, obtê-la por outro, e algo não permite que você mude algo no meio, ou será supereficiente. O que você pode tentar fazer com isso?

Eu introduzi outra estrutura de dados chamada Hash Map. Só por precaução, vou esclarecer. Essa é uma tabela de correspondência de algumas quantidades para outras, grosso modo. Nesse caso, a chave em nossa tabela será um adesivo ou algum identificador exclusivo dele. E o valor será o número de entradas em nossos adesivos recentes.

Aqui eu imediatamente indiquei que todos eles entraram uma vez, exceto o pássaro. Por que vamos usar isso? Suponha que desejemos nossos dados, retire essa sequência de adesivos - por exemplo, salve-os em um banco de dados para que o usuário reinicie o aplicativo e recupere-os na sequência correta. Por outro lado, obteremos o adesivo, a partir da fila, mas os emitiremos apenas se o número de ocorrências desse adesivo for igual a um. Se havia mais de um, simplesmente o ignoramos e jogamos fora.



Como isso funciona? Digamos que adicionamos um gatinho. Ela entra na nossa vez. O número próximo ao gato se tornou 2. Ou seja, agora existem dois gatos por nossa vez.

Suponha que agora que queremos salvar toda a sequência de adesivos, começemos a obtê-los. Nós olhamos para o calendário, ele entrou apenas uma vez.



Nós conseguimos isso sem problemas. Em seguida, olhamos para o gatinho. A gata entrou duas vezes, então, neste momento, não a levamos, apenas jogamos fora, a ignoramos e reduzimos o número dois à unidade.



Todos os adesivos subsequentes que tínhamos uma vez, nós os obtemos com calma.



Está tudo em ordem, conseguimos. O gato no momento também se encontrou apenas uma vez, então também o recebemos com calma e tudo está em ordem.



Vamos olhar para essas marcas de seleção verdes. Que sequência de adesivos conseguimos?



Vamos entender que conseguimos exatamente o que precisamos e tudo funciona como foi definido na tarefa.



O que você deve pensar nesta tarefa? Aqui você já precisa conhecer um pouco mais as estruturas de dados - para saber o que são uma fila e o Mapa Hash, quais operações eles definiram e o que você pode fazer com eles. Você também precisa avaliar a complexidade. Em geral, é útil conhecer a complexidade das operações em estruturas básicas de dados, isto permitirá a construção mais eficiente de estruturas compostas ou a implementação de algoritmos. A terceira coisa que é muito importante fazer no trabalho e na vida é se adaptar à tarefa, pegue algum conhecimento que você tem. Suponha o conhecimento das mesmas estruturas de dados. Coloque uma única imagem, que resolverá exatamente o problema que está diante de você em um momento específico.

Imagem em Imagem


Agora vamos para a terceira e última tarefa. Esta é uma imagem na imagem. Eu vou esclarecer. Existem chamadas e videochamadas no Yandex.Chats.



Durante uma chamada, você pode recolher o fluxo de vídeo do interlocutor em uma pequena janela e movê-lo pela tela enquanto usa o messenger. Como essa multitarefa acontece, o vídeo fica nos cantos da tela quando você o arrasta. Para alcançar essa funcionalidade, você precisa executar algumas etapas. A primeira e principal coisa que você precisa fazer é tornar pequeno esse grande fluxo de vídeo retangular e estar no lugar certo para você. Sobre isso deve acontecer. Aqui lembramos a geometria básica - multiplicamos os lados do retângulo por algum fator, movemos seu meio e tudo está bem, aqui está no lugar certo.

A segunda tarefa é mais difícil. Você precisa fazê-lo para que fique localizado nos cantos da tela e cumpri-los. Para isso, decidi usar uma estrutura padrão chamada UIKit Dynamics.



Isso é algo que permite que você dê aos objetos visuais uma variedade de propriedades físicas - gravidade, inércia, essas coisas. É a partir dessa estrutura que apliquei uma entidade como o Spring Field. Primavera se traduz em primavera. Este é um campo que atrai objetos para um ponto na zona de sua ação.



Na interface do messenger, é assim. Pontos vermelhos indicam a direção do uso da força. E se eu puxo essa visão do meio, ela recua.



Para simplificar, designei um retângulo como esse. Esta é uma zona amarela com um ponto de força indicado por um ponto preto.

Agora, voltemos ao modo como nossa tarefa está definida. Temos a tela principal do usuário, com quatro pontos, e queremos que nosso fluxo de vídeo seja atraído por eles. Como eu comecei a resolvê-lo? Nós apenas pegamos todo o nosso campo, esculpimos em toda a tela. Designamos quatro pontos de atração para ele, e a estrutura faz tudo por nós.



Portanto, é claro, não consegui fazer nada, porque apenas um ponto de atração pode ser definido para um campo, quatro pontos não podem ser definidos.

Eu pensei: ok, o segundo estágio. Tomamos quatro desses campos, organizamos-os para que eles preencham a tela inteira e colocamos os pontos onde precisamos ser atraídos.



Mas isso também não funcionou para mim, porque os valores que podem ser alterados no campo são o tamanho e o ponto central. E ela é atraída apenas no meio. Muito conveniente, obrigado, Apple, mas falhou.

Para onde eu vim? Pegamos nossos campos, organizamos-os para que eles preencham a tela inteira e não se cruzem, não entrem em conflito e que seus pontos médios estejam no canto direito. Os campos saem da tela, mas isso absolutamente não nos incomoda, é assim:



Existem campos visualizados, e essa visualização é atraída para o local em que o usuário a arrasta com o dedo.





Para resolver este problema, era necessário saber o seguinte. A primeira é a geometria básica. Em geral, quando você está envolvido em algum tipo de desenvolvimento visual móvel ou de front-end, precisa calcular esses retângulos, mover os quadros, por assim dizer. Esta é uma habilidade útil, que pode ser obtida na escola.

Em segundo lugar, você precisa trabalhar com gestos do usuário para poder ler os gestos que o usuário faz, por exemplo, deslizar e para que o usuário trabalhe com seu aplicativo seja suave e interessante. Isso também pode ser feito por meios padrão, então mostrarei o link.

E terceiro, importante: você precisa conhecer as estruturas do sistema. Não é necessário saber como trabalhar com eles, mas simplesmente saber sobre sua existência e o que eles podem ajudá-lo a alcançar. Como quando você está configurado com alguma tarefa - faça isso, você pode se lembrar: sim, existe uma estrutura, agora vou olhar na Internet como usá-la e executar a tarefa. E se você não souber, simplesmente pensará que não precisa executar essa tarefa, porque não sabe o que fazer com ela.



Eu mostrei a você apenas três tarefas, mas, de fato, já existem algumas coisas em que você precisa pensar, cuja experiência você precisa conhecer e desenvolver. Existem muito mais tarefas, e todas são muito diversas e interessantes. E se você deseja que seu produto se desenvolva, é necessário resolvê-lo constantemente. Também prometi algumas referências:

- Fila em duas pilhas
- HashTable em Swift
- Complexidade de algoritmos com exemplos
- Reconhecimento de gestos do usuário
- Introdução ao UIKit Dynamics

Isso é tudo para mim, obrigado.

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


All Articles