El desarrollo móvil es una cocina especial, y tiene sus propios matices. Es por eso que las entrevistas con los candidatos para el departamento de desarrollo para iOS deben realizarse con cierto sesgo. Hoy le diremos cómo se contrata a los desarrolladores móviles de Acronis y qué curiosidades suceden durante las entrevistas, cuando el solicitante cree que es suficiente recordar algunas palabras inteligentes y luego "resolvamos".

Para comenzar, literalmente hace dos años, el desarrollo móvil para iOS adquirió su propio gusto único, y esto se debe a la aparición de un lenguaje como Swift. Un lenguaje nuevo y moderno con un buen paradigma y también con un equipo de desarrollo muy fuerte fue inmediatamente apreciado por los desarrolladores más proactivos. Pero su principal ventaja es que Apple apostará por Swift, y esto lo confirman las declaraciones de Tim Cook hechas públicamente. Por lo tanto, entrevistar teniendo en cuenta los detalles del conocimiento de Swift parece un paso lógico.
Sin embargo, no todas las empresas generalmente hacen preguntas sobre Swift en las entrevistas. Antes de unirme a Acronis, yo mismo tuve entrevistas en varias compañías, y casi nadie preguntó por Swift. Me pareció muy extraño, ya que, obviamente, el desarrollo móvil se está moviendo en esta dirección.
Quizás el problema es que muchos desarrolladores de la última generación "se sientan" en Objective-C y no quieren alejarse de los paradigmas familiares. Pero este lenguaje va a la zaga de los métodos de desarrollo modernos, Apple no lo desarrolla y también tiene muchas reglas obsoletas, como enviar mensajes a objetos nulos y un sistema de tipo dinámico. Son difíciles de considerar al escribir código y durante la depuración. Con el cambio a Swift, podría evitar muchas dificultades.
Algunas palabras sobre Swift
Apple introdujo el lenguaje en 2014 como contrapeso a Objective-C. El novicio mostró de inmediato varias ventajas. Por ejemplo, Swift no requiere dos archivos, excelente seguridad del lenguaje, trabajo único con genéricos, un modelo bien desarrollado de tipos de datos y envío de métodos. Este lenguaje puede llamarse con seguridad más legible debido a la sintaxis simplificada y conveniente.
Durante el proceso de desarrollo en Swift, la disponibilidad de un entorno de experimento especial llamado Playground ayuda mucho, cuyo uso en entrevistas se discutirá a continuación.
Finalmente, el nuevo lenguaje es prometedor porque la velocidad de desarrollo es mucho mayor que en Objective-C y C ++. Facilita la reparación de errores y, en general, el desarrollo de Swift es más barato, más eficiente y más prometedor que Objective-C. Por lo tanto, estamos buscando deliberadamente especialistas que tengan experiencia en "comunicación" en este idioma.
Desarrolladores y simuladores
Por supuesto, puedes contratar a un graduado universitario o incluso a un interno, habiéndolo entrenado en el proceso de pasar la práctica. Pero si está buscando un especialista que ya tenga experiencia, la discrepancia entre la experiencia declarada y el conocimiento real parece muy extraña. Por ejemplo, el solicitante afirma haber estado "desarrollándose en Swift durante tres años" y, sin embargo, no conoce los conceptos básicos del lenguaje. Quizás esto se deba al deseo de conseguir un trabajo bien remunerado, porque hoy la demanda de desarrolladores para iOS es bastante alta. Para eliminar a esos candidatos, realizamos entrevistas especialmente pensadas que ya se han encontrado con "expertos" que:
- escriba el código exactamente de acuerdo con los ejemplos de video de YouTube;
- copie el código de GitHub sin ningún cambio en absoluto;
- escribe a un amigo en Telegram y pregunta cómo resolver un problema elemental;
- "Vaya al baño" o "llame con urgencia" después de anunciar las condiciones de la tarea.
El hecho de una competencia insuficiente se puede detectar si el código se usa directamente durante la entrevista. En diferentes empresas, es habitual hacer preguntas con notas en un tablero, en un trozo de papel, en un trozo de papel o simplemente de oído. Pero al final, el desarrollador escribe el código en la computadora, y ¿por qué no ver cómo realiza sus tareas inmediatas en vivo?
Por ejemplo, nuestro especialista toma una computadora portátil y le ofrece al solicitante que empiece a crear en el área de juegos, en ese entorno de lenguaje Swift muy especial. En Playground, simplemente puede ejecutar el código "tal cual" y ver los resultados de su trabajo. Esto es conveniente y ahorra tiempo (después de todo, se asigna un máximo de 2 horas para una entrevista técnica). Mientras que en C ++ necesita crear un proyecto, guardarlo en algún lugar, configurarlo, Playground le permite ejecutar código sin problemas adicionales. Por lo tanto, Playground ha demostrado ser una herramienta de entrevista, al menos en Acronis.
Cinco vueltas ... entrevistas de trabajo
Para averiguar si el solicitante puede comenzar a trabajar inmediatamente después de la entrevista, hacemos las siguientes cinco preguntas prácticas:
1. Diferencias entre tipo de referencia y tipo de valor
Los desarrolladores móviles para iOS son conscientes de que el lenguaje tiene diferentes tipos de variables. Se dividen en dos tipos principales. A saber, algunos se pasan por referencia - tipo de referencia (tipo de referencia), mientras que otros - por valor - tipo de valor (tipo de valor). En una entrevista, preguntamos cuál es la diferencia entre una estructura (estructura) y una clase (clase). La estructura es un tipo de valor y la clase es un tipo de referencia. Por desgracia, no todos responden a esa pregunta, y algunos de los candidatos incluso están interesados en "¿por qué una pregunta tan extraña al principio?" Pero si lo piensa, la pregunta no es para nada extraña, especialmente si planea desarrollarse en Swift.
Durante la inicialización y la asignación, las instancias de tipo de referencia comienzan a referirse a la misma área en la memoria y, como resultado, comparten el mismo valor entre ellas, y en el caso del tipo de valor, los datos se copian y los objetos comienzan a referirse a diferentes áreas de memoria, y no comparten significados entre ellos. Estrictamente hablando, en el caso del tipo de valor, el principio de copia en escritura funciona. Es decir, hasta que intente cambiar el valor, las instancias del tipo de valor se referirán a la misma dirección y se copiará el primer cambio. Obviamente, una comprensión de esto es necesaria para el desarrollador. El código puede comportarse completamente diferente para clases y estructuras. Pero solo conocer las diferencias no es suficiente. El segundo nivel de conciencia es la diferencia en escribir código. Resulta que escribir en Playground y demostrar las diferencias en el trabajo con el tipo de referencia y el tipo de valor no es tan fácil si no tenía experiencia en programación en Swift. Tenemos solo 1 de cada 3 candidatos que pasan esta prueba.
Para los curiosos, las diferencias se mostraron bien en la
WWDC , y también se discutieron en detalle en la
documentación y el
blog .
2. ¿Qué es la programación orientada al protocolo?
En la programación es imposible prescindir de las interfaces. Apple usa el término protocolo en sus idiomas. Los protocolos pueden resolver el problema de la herencia múltiple. Programación orientada al protocolo Apple presentó al público hace varios años en una conferencia de la
WWDC con Swift, enfatizando su importancia para el lenguaje. Por ejemplo, un indicador importante para usar protocolos es el hecho de que el idioma no tiene un nivel protegido de acceso a los campos.
Se entiende que el polimorfismo debe lograrse utilizando protocolos, no herencia. Y aunque, de hecho, la programación orientada al protocolo es más probable que sea marketing, en respuesta a esa pregunta esperamos que el programador comience a hablar sobre las características de los protocolos y pueda crear un protocolo en el área de juegos. En esencia, se necesitan tres líneas para describir un protocolo. Por desgracia, en el desarrollo móvil, las personas a menudo no entienden el propósito de los protocolos, y ni siquiera pueden hacerlo. Y estamos esperando algo simple, por ejemplo:
protocol Developer { func readManual() var name: String { get } }
Además, existen protocolos regulares y protocolos genéricos que funcionan con tipos asociativos. Y, de hecho, están cerca de las plantillas en C ++. Los protocolos genéricos son elementos abstractos y específicos que rara vez se usan en la programación convencional. Son necesarios para escribir bibliotecas internas (y esto es lo que Apple usa) o bibliotecas en las que necesita usar un alto grado de abstracción. Es bueno si el solicitante sabe de esto.
Un enlace y
dos .
3. Trabaja con memoria
IOS tiene su propio sistema de memoria, que utiliza el recuento de referencias. Hay dos enfoques en Swift. Estos son el Conteo de referencia manual (MRC) y el Conteo de referencia automático (ARC). El recuento de referencia manual se usa para operaciones de memoria directa, pero generalmente se usa ARC. En particular, es importante que el desarrollador comprenda la diferencia entre enlaces fuertes y enlaces débiles. Este es un punto importante para aquellos idiomas donde no hay recolector de basura. Aquí hay un
correo electrónico interesante sobre por qué Swift no usa Garbage Collector.
De hecho, aquí no todo es tan complicado: debe hablar sobre el contador de referencia, que el objeto se elimina cuando el contador llega a 0 (cero), y así sucesivamente. Pero, de nuevo, necesitamos una persona para dar un ejemplo en el área de juegos. Y aquí una parte de los solicitantes tiene un estupor. Incluso si se han aprendido con éxito un par de frases sobre enlaces fuertes y débiles, en esta etapa se hace evidente si la persona no tenía la práctica normal de codificación Swift.
// var slimer: Ghost? = Ghost(name: "Slimer") // , weak var weakSlimer = slimer // , let strongSlimer = slimer // slimer = nil
4. Trabajar con cierres
En Java, C ++ hay lambdas, en Objective-C hay bloques, en muchos lenguajes hay construcciones correspondientes al concepto de cierre en Swift. Pero los solicitantes a menudo no pueden explicar cómo manejar el cierre, porque para esto necesita comprender cómo trabajar con la memoria y el sistema de interconexiones de variables internas y externas. Por lo tanto, debe conocer bien los formatos de datos estándar, la administración de memoria y otros problemas relacionados. Si crear un cierre en el código no es particularmente difícil para el solicitante:
let completionHanlder: () -> Void = { print("Success") }
Por ejemplo, decir qué tipo - valor o referencia - es el cierre, ya es una tarea bastante difícil. De hecho, el cierre es un tipo de referencia. Y es a partir de aquí que aparecen las construcciones bien conocidas de
[yo débil] .
let completionHanlder: () -> Void = { [weak self] in self?.close() }
Para evaluar las habilidades de los solicitantes, preparamos una plantilla en el área de juegos. A continuación puede ver una matriz que cambia de manera diferente en dos hilos. Y debe responder qué efecto creará esto en la aplicación. Comprender el proceso en este caso refleja la capacidad de trabajar con variables y transferirlas entre diferentes objetos.
//: 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
Un ejemplo es tomado
de aquí .
5. Escribe una aplicación simple
Cualquier desarrollador debería poder lanzar un proyecto. Le damos una tarea simple para esto: desarrollar una aplicación para iOS que simplemente muestre el sitio de Acronis. Para un programador que realmente hizo algo en Swift, dicha tarea requerirá de 10 a 15 minutos, lo que básicamente implica configurar y verificar.
Si se pasa esta etapa, la tarea se vuelve más complicada, como suele suceder en la vida: "llega un gerente de producto que cambia las condiciones y necesita mejorar urgentemente". De hecho, así es como se construye la práctica diaria de cualquier programador. Es interesante ver cómo una persona cambia el código según las nuevas condiciones. En nuestra tarea de prueba simple, pasamos por varias iteraciones, por ejemplo:
- Agregar navegación en la aplicación
- Elija entre múltiples sitios
- Agregar arquitectura
- Escribe de manera más abstracta
Al observar dicho trabajo de forma interactiva, puede descubrir cómo una persona usa la documentación, GitHub y otros recursos.
Por supuesto, esto está lejos de todas las preguntas que se hacen durante la entrevista, pero nuestros candidatos deben hacer frente, en primer lugar, a la solución de estas tareas básicas.
Conclusión
Una entrevista interactiva le permite ver el comportamiento real del desarrollador, incluidas sus habilidades sociales y la capacidad de comunicarse con los gerentes. Y no todos los expertos que acuden a nosotros pasan incluso parte de las pruebas.
Estamos
abiertos a la cooperación y estamos esperando a nuestro equipo de desarrolladores talentosos.
Si desea trabajar en el desarrollo móvil de Acronis, le recomiendo que practique la programación Swift.
Y, mientras tanto, prepararemos una serie de publicaciones sobre nuestra experiencia trabajando con este lenguaje de programación.
Suscríbase a nuestro blog para no perderse nada.
Competencia
Una aplicación cuyo
código fuente se almacena en Github se bloquea al inicio.
Tarea: es necesario crear una solicitud de extracción con la corrección de la causa del bloqueo.
La primera persona en hacer esta solicitud con la corrección de errores recibirá un premio: Power Bank y la licencia anual de
Acronis True Image 2018 con 1 TB de almacenamiento en la nube.