O desenvolvimento móvel é uma cozinha especial e possui nuances próprias. É por isso que entrevistas com candidatos ao departamento de desenvolvimento para iOS devem ocorrer com um certo viés. Hoje, mostraremos como os desenvolvedores móveis da Acronis são contratados e que tipo de coisa engraçada acontece durante as entrevistas, quando o candidato considera que basta lembrar algumas palavras inteligentes e depois "descobrir".

Para começar, literalmente, dois anos atrás, o desenvolvimento móvel para iOS adquiriu seu próprio gosto, e isso se deve ao surgimento de uma linguagem como Swift. Uma linguagem nova e moderna, com um bom paradigma e também com uma equipe de desenvolvimento muito forte, foi imediatamente apreciada pelos desenvolvedores mais proativos. Mas sua principal vantagem é que a Apple apostará no Swift, e isso é confirmado pelas declarações de Tim Cook feitas publicamente. Portanto, entrevistar levando em consideração as especificidades do conhecimento Swift parece um passo lógico.
No entanto, nem todas as empresas geralmente fazem perguntas sobre Swift em entrevistas. Antes de ingressar na Acronis, eu mesmo tive entrevistas em várias empresas e quase ninguém perguntou sobre Swift. Pareceu-me muito estranho, pois, obviamente, o desenvolvimento móvel está caminhando nessa direção.
Talvez o problema seja que muitos desenvolvedores da última geração "se sentam" no Objective-C e não querem se afastar de paradigmas familiares. Mas essa linguagem está atrasada em relação aos métodos modernos de desenvolvimento, a Apple não a desenvolve e também possui muitas regras desatualizadas, como o envio de mensagens para objetos nulos e um sistema de tipos dinâmicos. Eles são difíceis de considerar ao escrever código e durante a depuração. Com a mudança para Swift, você pode evitar muitas dificuldades.
Algumas palavras sobre Swift
A Apple introduziu o idioma em 2014 como um contrapeso ao Objective-C. O novato imediatamente mostrou várias vantagens. Por exemplo, o Swift não requer dois arquivos, excelente segurança de idiomas, trabalho exclusivo com genéricos, um modelo bem desenvolvido de tipos de dados e envio de métodos. Esse idioma pode ser chamado com segurança de mais legível devido à sintaxe simplificada e conveniente.
Durante o processo de desenvolvimento no Swift, a disponibilidade de um ambiente de experimento especial chamado Playground ajuda muito, cujo uso nas entrevistas será discutido abaixo.
Por fim, a nova linguagem é promissora porque a velocidade de desenvolvimento é muito maior do que no Objective-C e C ++. Isso facilita a correção de bugs e, em geral, o desenvolvimento do Swift é mais barato, mais eficiente e mais promissor do que o Objective-C. Portanto, procuramos deliberadamente especialistas com experiência em “comunicação” nesse idioma.
Desenvolvedores e Simuladores
Claro, você pode contratar um graduado universitário ou até um estagiário, tendo treinado ele no processo de aprovação na prática. Mas se você estiver procurando por um especialista que já tenha experiência, a discrepância entre a experiência declarada e o conhecimento real parece muito estranha. Por exemplo, o candidato afirma estar “desenvolvendo no Swift há três anos” e ainda não conhece o básico do idioma. Talvez isso se deva ao desejo de conseguir um emprego bem remunerado, porque hoje a demanda por desenvolvedores para iOS é bastante alta. Para eliminar esses candidatos, realizamos entrevistas especialmente elaboradas que já se depararam com "especialistas" que:
- escreva o código exatamente de acordo com os exemplos de vídeo do YouTube;
- copie o código do GitHub sem nenhuma alteração;
- escreva para um amigo no Telegram e pergunte como resolver um problema elementar;
- "Vá ao banheiro" ou "ligue urgentemente" depois que as condições da tarefa forem anunciadas.
O fato de competência insuficiente pode ser detectado se o código for usado diretamente durante a entrevista. Em empresas diferentes, é costume fazer perguntas com anotações em um quadro, em um pedaço de papel, em um pedaço de papel ou apenas de ouvido. Mas, no final, o desenvolvedor escreve o código no computador e por que não ver como ele executa suas tarefas imediatas ao vivo?
Por exemplo, nosso especialista pega um laptop e oferece ao solicitante que comece a criar no Playground - naquele ambiente de linguagem Swift muito especial. No Playground, você pode simplesmente executar o código "como está" e ver os resultados de seu trabalho. Isso é conveniente e economiza tempo (afinal, são alocadas no máximo 2 horas para uma entrevista técnica). Enquanto em C ++ você precisa criar um projeto, salvá-lo em algum lugar, configurá-lo, o Playground permite executar código sem problemas adicionais. Por conseguinte, o Playground provou ser uma ferramenta de entrevista, pelo menos na Acronis.
Cinco voltas ... entrevistas de emprego
Para descobrir se o candidato pode começar a trabalhar imediatamente após a entrevista, fazemos as cinco perguntas práticas a seguir:
1. Diferenças entre o tipo de referência e o tipo de valor
Os desenvolvedores de dispositivos móveis para iOS estão cientes de que o idioma possui diferentes tipos de variáveis. Eles são divididos em dois tipos principais. Ou seja, alguns são passados por referência - tipo de referência (tipo de referência), enquanto outros - por valor - tipo de valor (tipo de valor). Em uma entrevista, perguntamos qual é a diferença entre uma estrutura (struct) e uma classe (classe). A estrutura é um tipo de valor e a classe é um tipo de referência. Infelizmente, nem todo mundo responde a essa pergunta, e alguns dos candidatos estão interessados em "por que uma pergunta tão estranha no começo?" Mas se você pensar bem, a questão não é estranha, especialmente se você planeja desenvolver o Swift.
Durante a inicialização e a atribuição, as instâncias do tipo de referência começam a se referir à mesma área da memória e, como resultado, compartilham o mesmo valor entre si. No caso do tipo de valor, os dados são copiados e os objetos começam a se referir a diferentes áreas da memória, e eles não compartilham significados entre si. Estritamente falando, no caso do tipo de valor, o princípio da cópia na gravação funciona. Ou seja, até a tentativa de alterar o valor, as instâncias do tipo de valor se referirão ao mesmo endereço e a primeira alteração será copiada. Obviamente, é necessário um entendimento disso para o desenvolvedor. O código pode se comportar completamente diferente para classes e estruturas. Mas apenas conhecer as diferenças não é suficiente. O segundo nível de conscientização é a diferença na escrita de código. Acontece que escrever no Playground e demonstrar as diferenças no trabalho com o tipo de referência e o tipo de valor não é tão fácil se você não tiver experiência em programação no Swift. Temos apenas 1 em cada 3 candidatos aprovados neste teste.
Para os curiosos, as diferenças foram bem mostradas na
WWDC e também discutidas em detalhes na
documentação e no
blog .
2. O que é programação orientada a protocolo?
Na programação é impossível ficar sem interfaces. A Apple usa o termo protocolo em seus idiomas. Os protocolos podem resolver o problema da herança múltipla. Programação Orientada a Protocolos A Apple apresentou o público há vários anos em uma conferência da
WWDC com a Swift, enfatizando sua importância para o idioma. Por exemplo, um indicador importante para o uso de protocolos é o fato de o idioma não possuir um nível protegido de acesso aos campos.
Entende-se que o polimorfismo deve ser alcançado usando protocolos, não herança. E, embora de fato a Programação Orientada a Protocolo seja mais provável de marketing, em resposta a essa pergunta, esperamos que o programador comece a falar sobre os recursos dos protocolos e seja capaz de criar um protocolo no Playground. Em essência, são necessárias três linhas para descrever um protocolo. Infelizmente, no desenvolvimento móvel, as pessoas geralmente não entendem o objetivo dos protocolos e nem conseguem fazer isso. E estamos esperando por algo simples, por exemplo:
protocol Developer { func readManual() var name: String { get } }
Além disso, existem protocolos regulares e protocolos genéricos que funcionam com tipos associativos. E, de fato, eles estão próximos de modelos em C ++. Protocolos genéricos são coisas abstratas e específicas que raramente são usadas na programação convencional. Eles são necessários para escrever bibliotecas internas (e é isso que a própria Apple usa) ou bibliotecas nas quais você precisa usar um alto grau de abstração. É bom se o candidato souber disso.
Um link e
dois .
3. Trabalhe com memória
O IOS possui seu próprio sistema de memória, que usa contagem de referência. Existem duas abordagens no Swift. São a contagem manual de referência (MRC) e a contagem automática de referência (ARC). A contagem manual de referência é usada para operações diretas de memória, mas o ARC geralmente é usado. Em particular, é importante que o desenvolvedor compreenda a diferença entre links fortes e links fracos. Este é um ponto importante para os idiomas em que não há Garbage Collector. Aqui está um
e -
mail interessante sobre o motivo pelo qual o Swift não usa o Garbage Collector.
De fato, nem tudo é tão complicado aqui - você precisa falar sobre o contador de referência, para que o objeto seja excluído quando o contador atingir 0 (zero) e assim por diante. Mas, novamente, precisamos de uma pessoa para dar um exemplo no Playground. E aqui uma parte dos candidatos tem um estupor. Mesmo que algumas frases sobre elos fortes e fracos tenham sido aprendidas com sucesso, nesse estágio, torna-se óbvio se a pessoa não teve uma prática normal de codificação Swift.
// var slimer: Ghost? = Ghost(name: "Slimer") // , weak var weakSlimer = slimer // , let strongSlimer = slimer // slimer = nil
4. Trabalhe com fechamentos
Em Java, C ++, existem lambdas; no Objective-C, existem blocos; em muitas linguagens, há construções correspondentes ao conceito de fechamento no Swift. Mas os candidatos geralmente não conseguem explicar como lidar com o fechamento, porque para isso é necessário entender como trabalhar com a memória e o sistema de interconexões de variáveis internas e externas. Então - você precisa conhecer bem os formatos de dados padrão, gerenciamento de memória e outros problemas relacionados. Se a criação de um fechamento no código não for particularmente difícil para o solicitante:
let completionHanlder: () -> Void = { print("Success") }
Por exemplo, dizer que tipo - valor ou referência - é fechamento, já é uma tarefa bastante difícil. De fato, o fechamento é um tipo de referência. E é a partir daqui que as construções bem conhecidas do
[eu fraco] aparecem.
let completionHanlder: () -> Void = { [weak self] in self?.close() }
Para testar as habilidades dos candidatos, preparamos um modelo no Playground. Abaixo, você pode ver uma matriz que muda de maneira diferente em dois segmentos. E você precisa responder que efeito isso criará no aplicativo. A compreensão do processo nesse caso reflete a capacidade de trabalhar com variáveis e transferi-las entre objetos diferentes.
//: Playground — noun: a place where people can play import Foundation import PlaygroundSupport let queue = DispatchQueue.global() var employees = ["Bill", "Bob", "Joe"] queue.async { let count = employees.count for index in 0 ..< count { print("\(employees[index])") Thread.sleep(forTimeInterval: 1) } } queue.async { Thread.sleep(forTimeInterval: 0.5) print("remove") employees.remove(at: 0) } PlaygroundPage.current.needsIndefiniteExecution = true
Um exemplo é retirado
daqui .
5. Escreva um aplicativo simples
Qualquer desenvolvedor deve poder iniciar um projeto. Damos uma tarefa simples para isso - desenvolver um aplicativo para iOS que simplesmente exiba o site Acronis. Para um programador que realmente fez algo no Swift, essa tarefa exigirá de 10 a 15 minutos, que basicamente é necessário para definir as configurações e verificar.
Se esse estágio for ultrapassado, a tarefa se torna mais complicada, como costuma acontecer na vida: “chega um gerente de produto que muda as condições e precisa urgentemente ser aprimorado”. De fato, é assim que a prática diária de qualquer programador é construída. É interessante ver como uma pessoa altera o código de acordo com as novas condições. Em nossa tarefa simples de teste, passamos por várias iterações, por exemplo:
- Adicionar navegação no aplicativo
- Escolha entre vários sites
- Adicionar arquitetura
- Escreva mais abstratamente
Observando esse trabalho interativamente, você pode descobrir como uma pessoa usa a documentação, o GitHub e outros recursos.
Obviamente, isso está longe de todas as perguntas feitas durante a entrevista, mas nossos candidatos devem lidar, em primeiro lugar, com a solução dessas tarefas básicas.
Conclusão
Uma entrevista interativa permite ver o comportamento real do desenvolvedor, incluindo suas habilidades pessoais e a capacidade de se comunicar com os gerentes. E nem todos os especialistas que chegam até nós passam mesmo por parte dos testes.
Estamos
abertos à cooperação e aguardamos nossa equipe de desenvolvedores talentosos.
Se pretender trabalhar no desenvolvimento móvel da Acronis, recomendo que pratique a programação Swift.
Enquanto isso, prepararemos uma série de posts sobre nossa experiência de trabalho com essa linguagem de programação.
Assine o nosso blog para não perder nada.
Concorrência
Um aplicativo cujo
código fonte está armazenado no Github trava na inicialização.
Tarefa: é necessário criar uma solicitação pull com a correção da causa da queda.
A primeira pessoa a fazer este pedido com a correção de erros receberá um prêmio - Power Bank e a licença anual do
Acronis True Image 2018 com 1 TB de armazenamento em nuvem.