Pemula atau berpengalaman? Cara merekrut pengembang seluler untuk iOS yang benar-benar tahu caranya

Pengembangan mobile adalah dapur khusus, dan memiliki nuansa tersendiri. Itulah sebabnya wawancara dengan kandidat untuk departemen pengembangan untuk iOS harus dilakukan dengan bias tertentu. Hari ini kami akan memberi tahu Anda bagaimana pengembang seluler Acronis dipekerjakan dan keingintahuan apa yang terjadi selama wawancara, ketika pemohon berpikir bahwa cukup mengingat beberapa kata yang cerdas, dan kemudian "mari kita cari tahu."

gambar

Untuk mulai dengan, secara harfiah dua tahun lalu, pengembangan ponsel untuk iOS memperoleh rasa uniknya sendiri, dan ini disebabkan oleh munculnya bahasa seperti Swift. Bahasa baru dan modern dengan paradigma yang baik dan juga dengan tim pengembangan yang sangat kuat segera dihargai oleh pengembang yang paling proaktif. Tetapi keuntungan utamanya adalah bahwa Apple akan bertaruh pada Swift, dan ini dikonfirmasikan oleh pernyataan Tim Cook yang dipublikasikan. Oleh karena itu, wawancara dengan mempertimbangkan secara spesifik pengetahuan Swift tampaknya merupakan langkah logis.

Namun, tidak semua perusahaan pada umumnya mengajukan pertanyaan tentang Swift dalam wawancara. Sebelum bergabung dengan Acronis, saya sendiri melakukan wawancara di berbagai perusahaan, dan hampir tidak ada yang bertanya tentang Swift. Rasanya sangat aneh bagi saya, karena, jelas, pengembangan ponsel bergerak ke arah ini.

Mungkin masalahnya adalah bahwa banyak pengembang generasi terakhir "duduk" di Objective-C dan tidak ingin pindah dari paradigma yang sudah dikenal. Tetapi bahasa ini tertinggal dari metode pengembangan modern, Apple tidak mengembangkannya, dan juga memiliki banyak aturan yang ketinggalan zaman, seperti mengirim pesan ke objek nihil dan sistem tipe dinamis. Mereka sulit dipertimbangkan ketika menulis kode dan selama debugging. Dengan beralih ke Swift, Anda dapat menghindari banyak kesulitan.

Beberapa kata tentang Swift


Apple memperkenalkan bahasa pada 2014 sebagai penyeimbang untuk Objective-C. Pemula segera menunjukkan beberapa keuntungan. Misalnya, Swift tidak memerlukan dua file, keamanan bahasa yang sangat baik, pekerjaan unik dengan obat generik, model tipe data yang dikembangkan dengan baik dan pengiriman metode. Bahasa ini dapat dengan aman disebut lebih mudah dibaca karena sintaks yang disederhanakan dan nyaman.

Selama proses pengembangan Swift, ketersediaan lingkungan percobaan khusus yang disebut Playground sangat membantu, penggunaannya dalam wawancara akan dibahas di bawah ini.

Akhirnya, bahasa baru ini menjanjikan karena kecepatan pengembangannya jauh lebih tinggi daripada pada Objective-C dan C ++. Itu membuatnya lebih mudah untuk memperbaiki bug dan, secara umum, pengembangan Swift lebih murah, lebih efisien dan lebih menjanjikan daripada Objective-C. Karena itu, kami sengaja mencari spesialis yang memiliki pengalaman dalam "komunikasi" dalam bahasa ini.

Pengembang dan Simulator


Tentu saja, Anda dapat menyewa lulusan universitas atau bahkan magang, setelah melatihnya dalam proses lulus praktek. Tetapi jika Anda mencari seorang spesialis yang sudah memiliki pengalaman, perbedaan antara pengalaman yang dinyatakan dan pengetahuan nyata terlihat sangat aneh. Sebagai contoh, pemohon mengklaim telah "berkembang di Swift selama tiga tahun," namun belum mengetahui dasar-dasar bahasa tersebut. Mungkin ini karena keinginan untuk mendapatkan pekerjaan bergaji tinggi, karena hari ini permintaan untuk pengembang untuk iOS cukup tinggi. Untuk menyingkirkan kandidat semacam itu, kami melakukan wawancara pemikiran khusus yang telah menemukan "pakar" yang:

  • tulis kode persis sesuai dengan contoh video YouTube;
  • menyalin kode dari GitHub tanpa perubahan sama sekali;
  • menulis kepada seorang teman di Telegram dan bertanya bagaimana menyelesaikan masalah dasar;
  • "Pergi ke toilet" atau "segera panggil" setelah kondisi tugas diumumkan.

Fakta dari kompetensi yang tidak memadai dapat dideteksi jika kode digunakan secara langsung selama wawancara. Di perusahaan yang berbeda adalah kebiasaan untuk mengajukan pertanyaan dengan catatan di papan tulis, di selembar kertas, di selembar kertas, atau hanya dengan telinga. Tetapi pada akhirnya, pengembang menulis kode di komputer, dan mengapa tidak melihat bagaimana ia melakukan tugas langsungnya langsung?

Sebagai contoh, spesialis kami mengambil laptop dan menawarkan pelamar untuk mulai membuat di Playground - di lingkungan bahasa Swift yang sangat khusus. Di Playground, Anda cukup menjalankan kode "apa adanya" dan melihat hasil pekerjaannya. Ini nyaman dan menghemat waktu (setelah semua, maksimal 2 jam dialokasikan untuk wawancara teknis). Sedangkan di C ++ Anda perlu membuat proyek, menyimpannya di suatu tempat, mengkonfigurasinya, Playground memungkinkan Anda untuk mengeksekusi kode tanpa masalah tambahan. Karenanya, Playground telah membuktikan dirinya sebagai alat wawancara, setidaknya di Acronis.

Lima lap ... wawancara kerja


Untuk mengetahui apakah pelamar dapat mulai bekerja segera setelah wawancara, kami mengajukan lima pertanyaan praktis berikut:

1. Perbedaan antara tipe referensi dan tipe nilai


Pengembang seluler untuk iOS sangat menyadari bahwa bahasa tersebut memiliki berbagai jenis variabel. Mereka dibagi menjadi dua tipe utama. Yaitu, beberapa dilewatkan oleh referensi - tipe referensi (tipe referensi), sementara yang lain - oleh nilai - tipe nilai (tipe nilai). Dalam sebuah wawancara, kami bertanya apa perbedaan antara struktur (struct) dan kelas (kelas). Struktur adalah tipe nilai, dan kelas adalah tipe referensi. Sayangnya, tidak semua orang menjawab pertanyaan seperti itu, dan beberapa kandidat bahkan tertarik, "mengapa pertanyaan aneh di awal?" Tetapi jika Anda memikirkannya, pertanyaannya sama sekali tidak aneh, terutama jika Anda berencana untuk berkembang di Swift.

Selama inisialisasi dan penugasan, instance tipe referensi mulai merujuk ke area yang sama dalam memori dan, sebagai akibatnya, berbagi nilai yang sama di antara mereka sendiri, dan dalam kasus tipe nilai, data disalin, dan objek mulai merujuk ke area memori yang berbeda, dan mereka tidak berbagi makna di antara mereka sendiri. Tegasnya, dalam hal tipe nilai, prinsip copy-on-write bekerja. Yaitu, sampai upaya untuk mengubah nilai, instance dari tipe nilai akan merujuk ke alamat yang sama, dan perubahan pertama akan menyalin. Jelas, pemahaman tentang ini diperlukan untuk pengembang. Kode dapat berperilaku sangat berbeda untuk kelas dan struktur. Tetapi hanya mengetahui perbedaan itu tidak cukup. Tingkat kesadaran kedua adalah perbedaan dalam penulisan kode. Ternyata menulis di Playground dan menunjukkan perbedaan dalam bekerja dengan tipe referensi dan tipe nilai tidak begitu mudah jika Anda tidak memiliki pengalaman pemrograman di Swift. Kami hanya memiliki 1 dari 3 kandidat yang lulus ujian ini.

Bagi yang penasaran, perbedaannya ditunjukkan dengan baik di WWDC , dan juga dibahas secara rinci dalam dokumentasi dan blog .

2. Apa itu Pemrograman Berorientasi Protokol?


Dalam pemrograman tidak mungkin dilakukan tanpa antarmuka. Apple menggunakan protokol istilah dalam bahasa-bahasanya. Protokol dapat memecahkan masalah multiple inheritance. Pemrograman Berorientasi Protokol Apple memperkenalkan publik beberapa tahun lalu pada konferensi WWDC dengan Swift, menekankan pentingnya mereka untuk bahasa tersebut. Sebagai contoh, indikator penting untuk menggunakan protokol adalah kenyataan bahwa bahasa tersebut tidak memiliki tingkat akses yang dilindungi ke bidang.

Dipahami bahwa polimorfisme harus dicapai dengan menggunakan protokol, bukan warisan. Dan meskipun sebenarnya Pemrograman Berorientasi Protokol lebih mungkin pemasaran, dalam menanggapi pertanyaan seperti itu kami berharap programmer untuk mulai berbicara tentang fitur-fitur protokol dan dapat membuat protokol di Playground. Pada dasarnya, tiga baris diperlukan untuk menggambarkan suatu protokol. Sayangnya, dalam pengembangan mobile orang sering tidak memahami tujuan protokol, dan mereka bahkan tidak bisa melakukan ini. Dan kami sedang menunggu sesuatu yang sederhana, misalnya:

protocol Developer { func readManual() var name: String { get } } 

Selain itu, ada protokol reguler, dan ada protokol umum yang bekerja dengan tipe asosiatif. Dan, pada kenyataannya, mereka dekat dengan templat di C ++. Protokol umum adalah hal-hal abstrak dan spesifik yang sangat jarang digunakan dalam pemrograman konvensional. Mereka diperlukan untuk menulis perpustakaan internal (dan inilah yang digunakan Apple sendiri) atau perpustakaan di mana Anda perlu menggunakan abstraksi tingkat tinggi. Baik jika pelamar tahu tentang ini. Satu tautan dan dua .

3. Bekerja dengan memori


IOS memiliki sistem memori sendiri, yang menggunakan penghitungan referensi. Ada dua pendekatan dalam Swift. Ini adalah Penghitungan Referensi Manual (MRC) dan Penghitungan Referensi Otomatis (ARC). Penghitungan Referensi Manual digunakan untuk operasi memori langsung, tetapi ARC biasanya digunakan. Khususnya, penting bagi pengembang untuk memahami perbedaan antara tautan kuat dan tautan lemah. Ini adalah poin penting untuk bahasa-bahasa di mana tidak ada Pengumpul Sampah. Berikut ini email yang menarik tentang mengapa Swift tidak menggunakan Pengumpul Sampah.

Faktanya, semuanya tidak begitu rumit di sini - Anda perlu berbicara tentang penghitung referensi, bahwa objek dihapus ketika penghitung mencapai 0 (nol), dan seterusnya. Tetapi sekali lagi, kita membutuhkan seseorang untuk memberi contoh di Taman Bermain. Dan di sini bagian dari pelamar memiliki kebodohan. Bahkan jika beberapa ungkapan tentang tautan kuat dan lemah telah berhasil dipelajari, pada tahap ini menjadi jelas jika orang tersebut tidak memiliki praktik pengkodean Swift yang normal.

 //  var slimer: Ghost? = Ghost(name: "Slimer") //   ,    weak var weakSlimer = slimer //   ,   let strongSlimer = slimer //    slimer = nil 

4. Bekerja dengan penutupan


Di Jawa, C ++ ada lambdas, di Objective-C ada blok, dalam banyak bahasa ada konstruksi yang sesuai dengan konsep penutupan di Swift. Tetapi pelamar sering tidak dapat menjelaskan bagaimana menangani penutupan, karena untuk ini Anda perlu memahami cara bekerja dengan memori dan sistem interkoneksi variabel internal dan eksternal. Jadi - Anda perlu mengetahui dengan baik format data standar, manajemen memori dan masalah terkait lainnya. Jika membuat penutupan dalam kode tidak terlalu sulit bagi pelamar:

 let completionHanlder: () -> Void = { print("Success") } 

Misalnya, untuk mengatakan tipe apa - nilai atau referensi - yang merupakan penutupan, sudah merupakan tugas yang agak sulit. Bahkan, penutupan adalah tipe referensi. Dan dari sinilah muncul konstruksi [diri lemah] yang terkenal .

 let completionHanlder: () -> Void = { [weak self] in self?.close() } 

Untuk menguji keterampilan pelamar, kami menyiapkan templat di Playground. Di bawah ini Anda dapat melihat array yang berubah secara berbeda dalam dua utas. Dan Anda perlu menjawab efek apa yang akan dihasilkan aplikasi ini. Memahami proses dalam hal ini mencerminkan kemampuan untuk bekerja dengan variabel dan mentransfernya di antara objek yang berbeda.

 //: 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 

Contoh diambil dari sini .

5. Tulis aplikasi sederhana


Setiap pengembang harus dapat meluncurkan proyek. Kami memberikan tugas sederhana untuk ini - untuk mengembangkan aplikasi untuk iOS yang hanya menampilkan situs Acronis. Untuk seorang programmer yang benar-benar melakukan sesuatu pada Swift, tugas seperti itu akan membutuhkan 10-15 menit, yang pada dasarnya masuk ke pengaturan pengaturan dan pemeriksaan.

Jika tahap ini dilewati, tugas menjadi lebih rumit, seperti yang biasanya terjadi dalam hidup: "seorang manajer produk tiba yang mengubah kondisi dan sangat perlu ditingkatkan". Memang, ini adalah bagaimana praktik harian setiap programmer dibangun. Sangat menarik untuk melihat bagaimana seseorang mengubah kode sesuai dengan kondisi baru. Dalam tugas tes sederhana kami, kami melewati beberapa iterasi, misalnya:

  • Tambahkan navigasi dalam aplikasi
  • Tentukan pilihan antara banyak situs
  • Tambahkan arsitektur
  • Tulis lebih abstrak

Dengan mengamati pekerjaan seperti itu secara interaktif, Anda dapat mengetahui bagaimana seseorang menggunakan dokumentasi, GitHub, dan sumber daya lainnya.

Tentu saja, ini jauh dari semua pertanyaan yang diajukan selama wawancara, tetapi para kandidat kami harus mengatasi, pertama-tama, dengan solusi dari tugas-tugas dasar ini.

Kesimpulan


Wawancara interaktif memungkinkan Anda melihat perilaku nyata pengembang, termasuk soft skill dan kemampuan berkomunikasi dengan manajer. Dan tidak semua ahli yang datang kepada kami melewati sebagian dari tes.

Kami terbuka untuk kerja sama dan sedang menunggu tim pengembang berbakat kami.

Jika Anda ingin bekerja dalam pengembangan seluler Acronis, saya sarankan Anda berlatih pemrograman Swift.

Dan sementara itu, kami akan menyiapkan serangkaian posting tentang pengalaman kami bekerja dengan bahasa pemrograman ini.

Berlangganan ke blog kami agar Anda tidak ketinggalan apa pun.

Persaingan


Aplikasi yang kode sumbernya disimpan di Github lumpuh saat startup.

Tugas: perlu membuat permintaan tarik dengan koreksi penyebab kecelakaan.

Orang pertama yang membuat permintaan ini dengan koreksi kesalahan akan menerima hadiah - Power Bank dan lisensi tahunan Acronis True Image 2018 dengan penyimpanan cloud 1 TB.

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


All Articles