Bermain bersama di Factorio adalah wawancara teknologi terbaik yang pernah kami lakukan

Akhir-akhir ini banyak salinan yang dipecahkan seputar wawancara teknis. Jelas, membalik pohon biner di papan tidak ada hubungannya dengan keterampilan praktis programmer sejati. Fizzbuzz primitif masih merupakan tes yang paling efektif. Akibatnya, perhatian pada proyek open source meningkat, tetapi ternyata ini juga bukan indikator yang baik , karena kebanyakan profesional tidak punya waktu untuk itu.



Kami memiliki wawancara pengkodean yang paling efektif di perusahaan kami saat ini - biasanya ini semacam pekerjaan rumah selama beberapa hari di mana kandidat diminta untuk memperbaiki bug atau menerapkan fitur kecil. Ini tidak baik karena butuh waktu lama dan orang tersebut bisa mendapatkan bantuan dari luar (atau google jika fiturnya cukup umum). Di sisi lain, beberapa perusahaan besar malah menggandakan jumlah wawancara papan tulis (dan algoritme), membuat insinyur masa depan harus mengikuti berjam-jam sesi pemrograman online dengan berbagai tingkat pengawasan invasif.



Semua teknik wawancara ini tidak cocok dengan metrik yang sangat sederhana: bermain Factorio bersama-sama... Melalui seluruh siklus Factorio adalah indikator yang hampir sempurna tentang seberapa baik seseorang dalam memecahkan masalah teknis umum. Anda bahkan dapat menyesuaikan permainan berdasarkan posisi masa depan untuk lebih memahami bagaimana kandidat akan menangani peran mereka.



Factorio?



Factorio adalah game otomatisasi. Trailer ini mungkin akan menjadi pengantar terbaik , tetapi pada dasarnya tugas Anda adalah membangun pabrik otomatis yang mampu meluncurkan roket ke luar angkasa.



Mulai dari awal. Anda menambang bijih besi dan batu dengan tangan, membangun peleburan untuk melebur bijih menjadi pelat besi, dari situ Anda dapat membuat bor bahan bakar padat otomatis. Anda dapat mengambil bijih besi secara mandiri dari bor dan memasukkannya ke dalam peleburan, tetapi akan lebih efisien jika menggunakan konveyor otomatis. Kemudian Anda dapat menggunakan besi yang dihasilkan untuk membuat bor lain yang mengotomatiskan penambangan batu bara. Kemudian konveyor dibangun untuk mengumpulkan batubara dan konveyor untuk mentransfernya ke bor. Pabrik kecil ini memproduksi pelat besi yang dapat digunakan untuk membuat bor ketiga - dan mulai menambang bijih tembaga, yang memungkinkan Anda membuat pelat tembaga, dan dari situ Anda dapat membuat kawat tembaga, yang diperlukan untuk pompa submersible. Dikombinasikan dengan ketel uap dan mesin uap, ini memberi kita listrik pertama kita.Ini dapat digunakan untuk pusat penelitian dan penemuan teknologi baru seperti mesin perakitan. Setelah Anda membuka kunci mesin perakitan, Anda dapat menggunakan kabel buatan tangan untuk membuat mesin perakitan yang secara otomatis akan membuat kabel tersebut.



Pada akhirnya, Anda akan membuka kunci kereta, robot, dan sistem logistik yang akan membantu Anda menangani kompleksitas logistik yang terus meningkat dari gim ini. Nah, pada akhirnya Anda akan bisa meluncurkan roket ke luar angkasa.



Pilihan arah



Permainan dimulai tanpa gol dan hampir tanpa arah. Pemrogram utama harus dapat mempelajari UI dan menentukan tujuan, dan kemudian mengembangkan rencana untuk mencapainya. Junior diharapkan menyelesaikan tugas yang ditetapkan oleh pengembang utama dengan benar. Peserta pelatihan seharusnya bekerja dengan seorang mentor, tetapi junior harus dapat memperbaiki masalah mendasar dengan kode mereka sendiri sebelum meminta bantuan dari senior. Middle harus bisa bekerja secara mandiri begitu diberi tugas, tapi dia tidak diharapkan untuk mengerjakan desain arsitektural.



Harapan khusus dapat dirumuskan sebagai berikut:



  • Peserta pelatihan biasanya harus dapat menempatkan cetak biru dan menghubungkannya dengan sesuatu yang lain, seperti deposit bijih.

  • , . , .

  • , ( ) .

  • , , .




Aspek terpenting dari pengembangan perangkat lunak adalah kerja tim. Ini berarti berkoordinasi dengan orang lain, memenuhi kebutuhan proyek orang lain, dan berkolaborasi dengan tim, daripada bekerja sendiri ketika Anda menolak untuk mengubah desain Anda untuk membantu mengintegrasikan dengan pekerjaan orang lain. Secara alami, situasi seperti itu muncul sepanjang waktu di Factorio, karena cetak biru standar terbatas pada ruang fisik. Akibatnya, Anda perlu mempelajari tindakan orang lain dengan cermat, dan terkadang menyesuaikan desain Anda agar sesuai dengan batas ukuran atau menyesuaikan dengan gambar beberapa orang lain yang memakan lebih banyak ruang daripada yang diharapkan.



Jika pemain menarik diri, mulai melakukan semuanya sendiri atau diam-diam memperbaiki masalah, ini akan segera menimbulkan kemarahan tim karena alasan yang sama seperti rekan kerja marah dengan programmer koboi. Untungnya, Factorio memiliki padanan bawaan git blame



: ini menunjukkan pemain terakhir yang mengubah entitas apa pun. Jadi, jika seseorang memakai kruk dan tidak memberi tahu tim tentang masalahnya, maka ketika kruk ini akhirnya putus, semua orang akan tahu siapa yang harus disalahkan. Jika Anda ingin menang, Anda harus bekerja sama dengan rekan satu tim Anda.



Debugging



Debugging adalah salah satu keterampilan utama seorang programmer. Ini mungkin paralel paling jelas antara Factorio dan pengembangan perangkat lunak yang sebenarnya. Sesuatu dapat merusak sangat jauh dari sumber masalah yang sebenarnya. Kemampuan untuk dengan cepat menemukan masalah nyata adalah keterampilan penting, dan proses berpikir hampir identik dengan melacak penyebab kegagalan program yang sebenarnya. Jika alat pilih berhenti bekerja, Anda harus terlebih dahulu memeriksa aliran keluar. Kemudian periksa bahan mana yang hilang di pintu masuk. Kemudian, telusuri bahan melalui pabrik untuk mengetahui di mana bahan itu diproduksi. Dan ulangi proses tersebut berulang-ulang, hingga mual.



Debugging di Factorio menjadi rumit dengan cepat. Segera setelah Anda membangun kilang minyak, Anda akan terlibat dalam pemecahan, di mana ada tiga pipa berbeda di pintu keluar (bahan bakar minyak, bahan bakar diesel, dan gas minyak terkait), dan jika ada di antara mereka karena alasan tertentu terhenti, maka seluruh kilang tersebut berhenti bekerja.



Ada kalanya seluruh tanaman berhenti karena Anda mulai meneliti sesuatu yang tidak memerlukan ilmu kuning. Akibatnya, Anda berhenti menggunakan rangka drone, yang tidak lagi disuplai dengan motor listrik, di mana pelumas digunakan, untuk produksi bahan bakar minyaknya diambil. Akibatnya, pipa saluran keluar di kilang macet, yang menyebabkan Anda kehabisan bahan bakar gas terkait (petrolium), yang menghentikan produksi plastik. Akibatnya, produksi sinyal kabel merah dihentikan - dan seluruh pabrik rusak. Pemain berpengalaman mengantisipasi skenario seperti itu dan mengimplementasikan oil cracking self-balancing untuk memastikan bahwa sistem selalu seimbang. Pembangkit listrik seperti itu hanya akan berhenti jika pipa saluran keluar dengan gas terkait diblokir.Jika programmer yang baik diberi kilang yang rusak, mereka biasanya dapat melacak masalah kembali ke sumbernya, memahami apa yang terjadi, dan dengan cepat mencoba menemukan solusi. Di sisi lain, jika seseorang hanya menjatuhkan beberapa tangki baru ke tanah tanpa alasan yang baik (dia benar-benar yakin bahwa pelumas akan selalu dibutuhkan), maka ini adalah tanda bahaya besar pada metode pemecahan masalah di programnya.



Situasi seperti ini memungkinkan Factorio meniru secara akurat saling ketergantungan kompleks yang biasanya dihadapi oleh pemrogram. Kesulitan meningkat saat konsep baru ditambahkan ke gameplay. Ini sangat mirip dengan peningkatan kompleksitas dari lapisan abstraksi tambahan dalam men-debug kerusakan yang mungkin terjadi jauh di dalam salah satu kerangka kerja yang Anda gunakan.



Review Kode



Seringkali desain asli perlu disesuaikan untuk meningkatkan kinerja atau hasil. Pemrogram yang baik tidak hanya akan menerima kritik terhadap desain mereka, tetapi mereka juga akan memperhitungkannya dalam pekerjaan di masa mendatang. Jika mereka tidak setuju dengan perubahan tersebut, mereka akan memberikan penjelasan spesifik sehingga tim dapat lebih akurat merefleksikan pro dan kontra dari perubahan yang diusulkan.



Menolak umpan balik tanpa alasan yang bagus adalah tanda bahaya yang terkenal. Selain itu, programmer yang enggan menerima perubahan yang diusulkan dan menolak untuk menyesuaikan proyek di masa depan, menyebabkan kehati-hatian. Akibatnya, dia harus terus menerus diingatkan tentang perlunya mematuhi beberapa cara standar untuk memecahkan masalah. Pada saat yang sama, orang tersebut tidak menjelaskan mengapa dia tidak menyukai metode yang diusulkan. Ini berpotensi menjadi bom waktu bagi sebuah organisasi karena, tanpa pengawasan, dia dapat dengan cepat mengakumulasi hutang teknis untuk rekan-rekannya. Jenis masalah ini hampir tidak mungkin untuk dipahami dalam wawancara tradisional, hanya selama magang.



Gaya dan kerangka pengkodean



Kegagalan untuk mengikuti saran hanya sebagian dari masalah yang jauh lebih besar ketika programmer tidak dapat mengintegrasikan dengan baik ke dalam struktur yang ada. Ada banyak cara untuk membangun pabrik di Factorio, dan masing-masing cara memerlukan metode pembuatan standar. Kegagalan untuk mematuhi standar akan segera menghentikan seluruh pabrik, seringkali dengan cara halus yang tidak terlihat oleh pengembang yang tidak waspada.



Desain konveyor sabuk utama mencakup 4-8 konveyor, dibagi menjadi dua bagian (untuk konveyor bawah tanah). Itu ditempatkan di tengah pabrik dan semua produksi berlangsung tegak lurus dengan sabuk. Desain ini bergantung pada beberapa aturan, yang pelanggarannya dapat menyebabkan kekacauan total. Pertama, Anda harus selalu menggunakan pemisah di pintu keluar konveyor. Anda tidak boleh mengarahkan seluruh rekaman: ruang kosong untuk rekaman lain berarti Anda kehilangan seluruh sumber daya, bahkan setelah peningkatan. Kedua, semua pabrik harus berskala tegak lurus dengan konveyor utama. Kegagalan menskalakan dengan cepat akan menghasilkan pemborosan ruang yang besar atau ketidakmampuan untuk menskalakan lini produksi karena dikelilingi oleh lini produksi lain.





Jaringan logistik



Ada berbagai cara untuk membangun jaringan logistik. Yang termudah adalah dengan peti suplai pasif. Tetapi ada metode lain - peti penyimpanan filter, yang memecahkan masalah sampah. Kedua metode tersebut membutuhkan penempatan pengekang yang benar di tempat yang tepat. Peti suplai pasif biasanya dibatasi oleh ruang dada. Anda perlu meletakkan manipulator ke peti penyimpanan untuk menghubungkan peti ke jaringan logistik. Dan sediakan setidaknya N item sebelum memasang manipulator. Jika Anda lupa tentang langkah-langkah ini, sumber daya yang besar akan terbuang percuma. Jika seorang programmer terus-menerus lupa tentang pembatas keluaran, itu adalah bendera merah bahwa seseorang ceroboh tentang kinerja dalam aplikasi nyata.



Dalam kasus lain, tim dapat menggunakan cetak biru yang telah dirancang sebelumnya, seperti desain reaktor nuklir atau pabrik drone robotik (pabrik bot). Mereka bisa sangat sulit, tetapi jika Anda berusaha dan mengetahuinya, mereka sangat menghemat waktu. Waspadalah terhadap kandidat yang tidak ingin menyesuaikan elemen baru di pabrik hanya karena mereka tidak dapat melacak logika kontrol yang rumit. Atau siapa yang menyerah mencoba mencari tahu algoritme untuk fungsi pabrik seperti itu, terlepas dari keunggulan drone dibandingkan konveyor. Desain pabrik drone yang kurang optimal, sumber









Multithreading



Kereta di Factorio adalah analog langsung dari multithreading: satu kereta adalah satu rangkaian eksekusi, dan setiap persimpangan atau perhentian kereta adalah tempat dalam memori di mana dua rangkaian pesan berpotensi menulis pada waktu yang sama. Lampu lalu lintas adalah kunci (atau mutex). Semua bug di jaringan kereta api memanifestasikan dirinya dengan cara yang sama seperti kondisi balapan di perangkat lunak, karena secara harfiah merupakan kondisi balapan fisik. Semua pengorbanan juga berlaku di sini - memblokir terlalu lama akan mengurangi throughput. Desain lampu lalu lintas yang tidak tepat biasanya menyebabkan kebuntuan, seperti halnya perangkat lunak, karena hasil akhirnya adalah ketergantungan interlocking siklik. Jalan buntu yang paling umum adalah ketika kereta terlalu panjang dan secara tidak terduga memblokir persimpangan kedua sambil menunggu untuk masuk ke persimpangan pertama.Persimpangan kedua ini kemudian mencegah kereta lain berangkat, sehingga perempatan pertama tidak diblokir.



Jumlah trek di jaringan rel sesuai dengan jumlah inti CPU. Sulit untuk menskalakan satu lintasan menjadi lebih dari beberapa lajur karena kapasitas seluruh sistem sangat cepat terbatas, bahkan dengan ruang tunggu. Desain yang paling umum adalah desain dua lajur, dengan satu lajur di setiap sisinya. Di sinilah masalah kapasitas akan muncul ketika kereta harus terus dibongkar. Oleh karena itu, jaringan rel besar memiliki minimal empat jalur, dengan dua jalur terluar berfungsi sebagai jalur pintas untuk menghindari penyeberangan jika memungkinkan.



Masalah lampu lalu lintas dalam sistem ini dapat terwujud dalam waktu yang sangat lama. Satu lampu lalu lintas yang terlewat di jaringan rel yang sama pernah menyebabkan kebuntuan setelah bekerja dengan benar selama dua minggu . Demikian pula, dalam program, kondisi balapan hanya dapat muncul sebulan sekali, ketika konkurensi utas yang tinggi muncul saat beban berat.



Penskalaan



Seperti halnya perangkat lunak, skala produksi Factorio memperkenalkan tantangan baru pada desain cetak biru asli dan sering kali memerlukan perombakan total untuk memaksimalkan produktivitas, dengan pemasangan modul produktivitas dan modul kecepatan dengan suar. Konveyor menjadi penghambat kinerja bahkan pada kecepatan belt maksimum, memaksa cara untuk memisahkan struktur sehingga lebih banyak belt dapat dimasukkan nanti, atau untuk membagi pabrik menjadi modul.



Mengelola jaringan logistik sendiri menjadi tantangan logistik di penghujung permainan karena banyaknya masalah yang ditimbulkan oleh jaringan drone yang ekspansif. Biasanya, Anda perlu mulai membagi rantai pasokan dan menggunakan kereta api untuk mengangkut barang antar segmen, atau membuat peti permintaan dan pasokan yang akan mentransfer barang melintasi perbatasan.



Pada akhir permainan, manajemen kereta memerlukan perpindahan dari arsitektur push ke arsitektur tarik karena arsitektur push tidak dapat menangani bandwidth tinggi. Ini pasti mengarah pada penggunaan fungsi Batas Kereta dan mempelajari cara menggunakan jaringan logis untuk menyandikan logika dasar sehingga stasiun hanya meminta kereta jika sudah benar-benar siap untuk mengisinya dengan sumber daya, bukan taktik permainan biasa di awal permainan, ketika sekelompok kereta api hanya diberi perintah untuk pergi. untuk besi. Skema baru meminimalkan jumlah kereta sambil memastikan bahwa semua stasiun di jaringan terlayani.



Seringkali terjadi bahwa batasan pada jalur input ke mesin perakitan dan batas kecepatan manipulator memerlukan desain ulang pabrik di sekitarnya, sama seperti komputasi kecepatan tinggi membutuhkan pengetahuan tentang kemacetan dalam CPU. Kemacetan ini hampir tidak pernah menjadi masalah sampai Anda mencapai skala tertentu, tetapi setelah itu mereka mulai membatasi kinerja.



Layanan mikro dan modul



Akhirnya, pabrik menjadi begitu besar sehingga mereka harus meninggalkan desain sederhana dengan sabuk konveyor utama atau desain spageti dan pindah ke struktur yang lebih berskala. Untuk mencapai level mega, pabrik biasanya menggunakan sistem kereta api atau sistem modular yang secara kasar sesuai dengan arsitektur layanan mikro atau plug-in.



Mega-base berbasis kereta kadang-kadang disebut sebagai desain "blok kota", di mana kereta api di sekitar blok pabrik mengontrol semua pintu masuk dan keluar. Dengan cara ini, setiap blok diisolasi dari yang lainnya, karena semua input "bersih" dalam artian berasal dari jaringan rel. Ini hampir identik dengan arsitektur layanan mikro (melalui HTTP) atau komunikasi antar-proses (IPC), dengan potensi masalah yang serupa karena penundaan I / O, karena hasil tidak dapat diterima sepanjang waktu, hasil harus dikirim dalam "paket" atau kereta api melalui jaringan rel.



Arsitektur modular mencoba mempertahankan beberapa kemiripan dengan konveyor utama, tetapi memisahkan sabuk di pabrik dan menggunakan blok modular yang menerima masukan standar dan keluaran standar. Terkadang hal ini dapat dicapai sepenuhnya dengan drone, tetapi biasanya material harus diangkut dalam jarak jauh dengan ban berjalan. Ini sangat mirip dengan sistem modul untuk aplikasi monolitik, dengan pengorbanan yang sama.



Megabase ini mewakili tingkat teratas dari server Factorio default. Tentu saja, ada banyak mod yang membuat permainan menjadi lebih sulit.



Sistem terdistribusi



Eksplorasi Luar Angkasa  adalah versi Factorio yang dikerjakan ulang sepenuhnya untuk kolonisasi luar angkasa. Di sini planet menjadi terbatas sumber daya, mengharuskan pemain untuk menjajah dunia lain dan menggunakan roket untuk mentransfer sumber daya antar planet. Karena keterlambatan besar dalam pengiriman bahan antar planet, koordinasi pangkalan ini menyebabkan masalah yang mirip dengan sistem database yang terdistribusi secara global. Bahkan di jaringan logis, Anda harus berjuang dengan latensi, karena sistem otomatis kehilangan elemen yang diluncurkan tetapi belum mencapai planet target. Jika ini tidak diperhitungkan, ada kueri duplikat untuk semua elemen yang diperlukan. Sistem terdistribusi menghadapi masalah yang persis sama saat mencoba memastikan konsistensi antar node.



Keluaran



Secara umum, industri perangkat lunak tidak tahu cara mencari dan mempekerjakan pengembang terbaik. Mungkin bermain bersama Factorio adalah wawancara teknis terbaik yang pernah kami lakukan. Dan ini sangat membingungkan kami . Wawancara ini sangat tidak praktis, membutuhkan lebih dari 20 jam dalam multipemain untuk pertama kalinya, atau 8 jam untuk tim yang terdiri dari pemain berpengalaman. Apa yang bisa dipelajari dari ini? Saya tidak tahu. Kami tentu saja tidak dapat beralih ke Factorio sebagai metode wawancara - cukup berikan pekerjaan rumah kepada kandidat.



Tapi itu lebih baik dari wawancara papan tulis.



All Articles