- Palima Aethera tampak seperti kandidat yang bisa menyelamatkan infrastruktur Techaro yang kacau, tetapi membalikkan suasana wawancara dengan sengaja memberikan solusi pengurutan yang ganjil saat live coding
- Pewawancara Jeff, setelah memastikan pelafalan nama dan apakah wajah itu asli, menunjukkan ketertarikan besar pada pengalaman Palima dengan infrastruktur MovieFlix dan alasan memilih FreeBSD
- Dalam tugas mengurutkan array angka, Palima mengimplementasikan sleepsort di Haskell dengan membuat thread untuk setiap nilai, lalu tidur sebanding dengan nilainya sebelum mencetaknya
- Palima bersikeras bahwa solusi ini adalah “pengurutan waktu konstan”, dan menjelaskan bahwa ia mengurangi waktu tunda dari kelipatan
100000menjadi10000mikrodetik untuk optimalisasi 10x, yang membuat Jeff tertawa - Setelah wawancara, Palima memperkirakan akan ditolak, tetapi Techaro malah mengirim niat perekrutan dengan nominal yang cukup besar, dan Palima memutuskan untuk tidur karena pekerjaan itu akan mengurutkan dirinya sendiri
Hari wawancara yang dimulai dari mimpi
- Dalam mimpi, Palima melihat jimat kewaspadaan di pergelangan tangannya hilang dan menyadari bahwa dirinya sedang bermimpi
- Setelah terbangun di pagi hari karena getaran jam tangan, ia teringat ada jadwal penting hari itu
- Perjalanan ke tempat kerja selesai hanya dalam 30 detik, dan Palima duduk di kursi yang dimodifikasi agar bisa menampung ekor dan sirip punggungnya
- Workstation memberi tahu bahwa Firefox sudah usang, lalu skrip membangun dan menjalankan versi baru
Awal wawancara Techaro
- Rapat video dilakukan melalui layanan seri E100, dan Palima menyalakan lampu kamera
- Pewawancara pertama, Jeff, salah mengucapkan nama Palima lalu langsung membetulkannya
- Palima menjelaskan bahwa pelafalannya adalah
Pa-lee-mah, danAetheradibacaAy-theer-ah - Jeff berkata ia akan mencatatnya agar orang lain juga bisa menyebutnya dengan benar
- Palima menjelaskan bahwa pelafalannya adalah
- Ketika Jeff bertanya apakah ia memakai avatar virtual, Palima menjawab, “Ini wajah asliku”
- Hanya dari deskripsi lowongan, Palima sudah menangkap bahwa infrastruktur Techaro sedang kacau dan membutuhkan seorang pahlawan
Perkenalan karier dan pengalaman infrastruktur
- Palima memperkenalkan dirinya sebagai seseorang yang sering membuat perangkat otomatis digital lalu melepasnya ke dunia untuk menjalankan tujuannya
- Di MovieFlix, ia berkontribusi membangun infrastruktur streaming serentak untuk film dan acara TV populer
- Ia menambahkan bahwa ada banyak proyek yang tidak bisa diungkapkan, dan Jeff saat ini menerima manfaat dari setidaknya tiga di antaranya
- Alasannya ingin bergabung dengan perusahaan kecil adalah karena ia ingin mengenal orang-orang secara lebih personal, dan daya tarik bekerja seperti komponen anonim di dalam mesin tidak bertahan lama
- Sebagai proyek infrastruktur favorit, ia menyebut benchmark kernel OS untuk backend MovieFlix
- Palima berharap Linux menang, tetapi setelah
epoll(7), FreeBSD berjalan lebih cepat sehingga ia memilih FreeBSD - Ia menambahkan bahwa kemungkinan ia masih punya hak commit FreeBSD
- Palima berharap Linux menang, tetapi setelah
Live coding: sleepsort
- Jeff menjelaskan bahwa latar belakang Palima terlihat cocok dengan tipe yang dicari Techaro, tetapi untuk menilai semua orang dengan standar yang sama, mereka tetap harus menjalankan tantangan coding
- Tugasnya adalah mengurutkan array angka di situs web, lalu menjelaskan cara pengurutannya
- Bahasanya bebas, dan Palima menulis kode Haskell
- Implementasinya membuat green thread terpisah untuk setiap angka, lalu menulis nilai ke channel untuk dicetak setelah
threadDelay (100000 * time) - Palima mengatakan bahwa pengurutan ini tidak memakai perbandingan, dan bahwa “kadang yang dibutuhkan hanyalah sedikit istirahat”
- Saat Jeff bertanya apakah waktu eksekusinya tidak berubah sesuai nilai masukan, Palima menjawab bahwa kompleksitas waktu tidak memedulikan efek samping seperti waktu
Optimisasi dan hasil yang tak terduga
- Ketika Jeff bertanya soal cara optimisasi, Palima hanya mengubah kelipatan waktu tunda
100000 * timedikurangi menjadi10000 * time- Palima menjelaskan bahwa sekarang itu 10 kali lebih cepat
- Jeff akhirnya tertawa lepas, dan ketika Palima ditanya mengapa ia memakai algoritme pengurutan yang aneh seperti itu, ia balik bertanya, “Kenapa Anda memberi pertanyaan aneh seperti itu?”
- Palima menilai Techaro tidak cukup kompleks untuk menampung dirinya, dan bahwa alih-alih Kubernetes, satu server khusus dari Typhoon Digital saja sudah cukup
- Setelah wawancara selesai, ia memperkirakan email penolakan akan segera datang
- Namun, Techaro malah mengirim email yang menyatakan ingin merekrutnya dengan nominal yang cukup besar, dan Palima bertanya-tanya apakah mereka benar-benar tahu apa yang siap mereka tanggung
- Palima memutuskan untuk tidur lagi, karena pada malam hari pekerjaan itu akan mengurutkan dirinya sendiri
1 komentar
Komentar Hacker News
Itu bukan waktu konstan, dan juga bukan waktu polinomial, melainkan pseudo-polynomial time. Sepertinya akan gagal untuk bilangan negatif, dan agar menjadi linear terhadap jumlah bit yang merepresentasikan input, dibutuhkan bentuk seperti
10000 * log(time + min(time) + 1)Dalam teori kompleksitas komputasi, ketika algoritme numerik berjalan dalam pseudo-polynomial time, itu berarti waktu jalannya merupakan polinomial terhadap nilai numerik input, yaitu bilangan bulat terbesar yang muncul di input, bukan polinomial terhadap panjang input (jumlah bit yang diperlukan untuk merepresentasikan angka tersebut)
https://en.m.wikipedia.org/wiki/Pseudo-polynomial_time
Kompleksitas komputasi membahas jumlah langkah dalam model komputasi, bukan berapa banyak waktu jam dinding yang berlalu. sleep sort memanfaatkan sifat scheduler sistem operasi, dan dalam lingkungan waktu virtual, waktu langsung melompat ke kejadian terjadwal berikutnya. Jika itu diasumsikan sebagai model komputasinya, secara praktis ini berjalan dengan kompleksitas polinomial
Dan kalau mau mengajari orang lain, setidaknya ejaan pseudo-polynomial sebaiknya benar
1sebanyak panjang masing-masing nilai, dipisahkan dengan0Mengubahnya kembali menjadi bilangan bulat itu linear, lalu kita panggil kotak hitam lama dan kembalikan hasilnya, sehingga sekarang itu menjadi waktu polinomial terhadap panjang input saya. Saya menyebut bilangan bulat, tetapi intinya adalah cara encoding, jadi untuk titik desimal bisa memakai satu
0, dan untuk pemisah input00, misalnyaBagaimanapun juga, inti leluconnya bukankah bahwa waktu tidur tidak dihitung? Komputer bisa melakukan hal lain selama itu. Rasanya cukup meyakinkan dalam gaya “bodoh tapi saya suka”
sleep sort berasal dari /prog/ [0]. Mungkin cukup banyak lurker HN yang ikut dalam thread sleep sort saat itu, dan xena mungkin salah satunya :)
[0] https://www.cs.princeton.edu/courses/archive/fall13/cos226/l...
<=>untuk dipakai saat ingin memeriksa “lebih kecil, sama dengan, atau lebih besar dari”. JeniusSeperti yang dikatakan penulis asli, tulisan ini sangat mirip dengan gaya cerita seri Interview milik aphyr, misalnya “Rewriting the Technical Interview”. Semuanya enak dibaca
[0] - https://aphyr.com/posts/353-rewriting-the-technical-intervie...
https://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/
Cuplikan:
Komputer harus membaca input untuk mengurutkan, jadi setidaknya membutuhkan waktu linear. Terlebih lagi jika kita tidak mengetahui informasi lain seperti distribusi seragam pada input
Ada berbagai algoritme pengurutan waktu linear seperti sleep sort, postman sort, counting sort, dan lain-lain. Namun itu berlaku untuk himpunan angka atau key yang dapat diurutkan secara terbatas
Tetapi jika memakai sempoa alih-alih komputer, ada constant-time sort yang nyaris sungguhan: https://en.wikipedia.org/wiki/Bead_sort
Cerita yang lucu, tapi dalam makna apa pun ini bukan waktu konstan
Membuat
Nthread dan menambahkan semuanya ke daftar bangun yang terurut memerlukan waktu antara O(N log N) hingga O(N^2), tergantung pada sistem operasi atau runtime bahasaDi suatu tempat di baliknya ada daftar terurut, heap, atau algoritme N^2. Demikian pula, sleep sort sendiri setidaknya memerlukan waktu linear karena untuk mengeluarkan N item yang terurut, ia harus membangunkan N thread
Lebih buruk lagi, waktu dinding nyata juga bertambah sesuai besar nilainya. Anda memang bisa lebih dulu mencari nilai minimum dan maksimum lalu memampatkan rentangnya, tetapi itu juga waktu linear
Yang dipakai di sini adalah lelucon ambiguitas dari dua sudut pandang yang saling berbenturan terhadap kata “waktu”. Memang benar bahwa dari sudut pandang analisis kompleksitas, mustahil membuat algoritme pengurutan menjadi waktu konstan
Maksud sebenarnya dari lelucon itu adalah waktu dinding. Dalam wawancara, waktu itu lebih relevan, dan secara realistis ketika seseorang melempar hal seperti “coba tulis fungsi pengurutan bilangan bulat”, jarang sekali mereka hanya memakai angka di bawah 100, jadi program ini secara rasa hampir berjalan seketika
Ini adalah lelucon metalinguistik yang halus, yang mengolok-olok dengan membalik pemahaman tentang cara kerja ilmu komputer. Sayang leluconnya tidak berhasil
https://en.wikipedia.org/wiki/Ultimate_fate_of_the_universe#...
sleeppada akhirnya harus bermuara pada bilangan bulat, jadi bisa juga diproses dalam waktu linear dengan sesuatu seperti radix sortAda ruang masalah tempat itu tetap menguntungkan meskipun muncul ketergantungan pada besar nilai terbesar
Tentu saja, dalam praktiknya tidak ada sistem seperti itu. Timeout system call biasanya bukan area di mana cara itu menguntungkan. Dan tentu saja, daripada cara yang berbanding linear dengan nilai maksimum, lebih baik langsung menerapkan radix sort yang hanya berbanding dengan
log(max_value)Nthread dan menambahkannya ke daftar bangun terurut sebesar O(N log N) hingga O(N^2) bukanlah batasan fundamental dari sistem penjadwalanTerlebih lagi jika mempertimbangkan perangkat keras khusus yang memungkinkan penjadwalan waktu konstan terhadap jumlah thread. Misalnya, meskipun sama sekali tidak ekonomis di dunia nyata, kita bisa membuat scheduler yang memantulkan paket informasi dengan laser ke himpunan cermin besar pada berbagai jarak lalu mengembalikannya ke detektor yang terhubung ke komputer
Caranya adalah memanfaatkan kecepatan cahaya untuk menunda selama waktu yang ditentukan. Jadi sleep sort tidak secara hakiki bergantung pada kompleksitas algoritmik tersembunyi dari cara penjadwalan thread tertentu, dan meskipun tidak praktis, secara teoretis bisa dioptimalkan menjadi O(1)
Jika Anda menyukai ini, ada juga semacam karya lanjutan bernama Protos: https://xeiaso.net/blog/protos
Saya masih menulis lebih banyak cerita dalam “semesta” ini, tetapi perlu waktu agar energi satirnya terkumpul. Episode berikutnya mungkin tentang komputasi spasial
Meski begitu, tampaknya alam semesta itu lebih pandai memberi nama
Bagian yang mengubah
threadDelay (100000 * time)menjadithreadDelay (10000 * time)lalu berkata “sekarang sepuluh kali lebih cepat” berkaitan dengan tulisan ini: https://thedailywtf.com/articles/The-Speedup-LoopSaya belum membaca artikelnya, tapi saya benci hal-hal seperti ini. Dulu saya pernah wawancara jarak jauh dengan Meta, dan lawan bicara saya terus makan sambil menghadap mikrofon sepanjang waktu
Sangat mengganggu sampai saya bahkan lupa cara menulis for loop
Kalau sedang bekerja, kita harus mengambil cuti, dan ada stres seperti “apakah saya membuang jatah cuti saya untuk ini?”, “parkirnya bagaimana?”, “apakah saya akan tiba tepat waktu?” Lalu setelah itu menjalani “wawancara awal” 30 menit, menunggu berminggu-minggu, lalu entah mendapat undangan wawancara yang sebenarnya atau justru di-ghosting
Seluruh prosesnya bisa memakan waktu sebulan, dan mungkin butuh setidaknya dua hari cuti serta perjalanan yang cukup jauh
Sekarang, perekrut atau HR menelepon dan menanyakan apakah Anda bisa panggilan video, lalu di hari yang sama melakukan panggilan 15–20 menit, setelah itu CV diteruskan ke pengambil keputusan, dan satu atau lebih wawancara video atau sesi teknis dijadwalkan. Beberapa perusahaan meminta Anda mengerjakan tes kepribadian/teknis dari rumah dengan nyaman
Jika Anda pekerja jarak jauh, semua itu bahkan bisa dibereskan saat jam makan siang. Memang bandwidth komunikasi tatap muka jauh lebih besar, tetapi hanya dengan remote Anda bisa wawancara dengan perusahaan di Tel Aviv pagi hari, perusahaan di Warsaw saat makan siang, dan perusahaan di California pada malam hari di hari yang sama
Bukankah membuat 1000 thread setidaknya waktu linear? Mungkin bisa ditekan sampai logaritmik, tetapi sepertinya kode itu tidak otomatis melakukannya
Agar sleep sort menjadi waktu konstan, input harus punya batas atas, yaitu ada batas pada angka terbesar, dan kita juga harus tidak menghitung pekerjaan sewenang-wenang seperti membaca dan memproses input serta membuat thread
Tetapi jika hal-hal seperti itu diizinkan, maka semua pengurutan lain juga menjadi waktu konstan. Sepertinya salah satu saja sudah cukup
Jika runtime thread mempertahankan konsep waktunya sendiri, algoritmenya bahkan tidak perlu tidur berdasarkan waktu nyata
Setelah semua thread dibuat, runtime bisa menyadari bahwa semua thread sedang idle dan thread berikutnya yang akan dijadwalkan adalah thread pada waktu N, jadi cukup perbarui waktu saat ini ke N lalu jalankan thread tersebut. Ulangi ini, maka Anda akan mendapatkan array yang terurut tanpa
sleepsama sekaliPada akhirnya, pekerjaan pengurutan sebenarnya sudah selesai ketika thread mulai tidur, dan sesudah itu mereka hanya mendaftarkan diri ke pengatur yang akan membangunkannya nanti, misalnya timer wheel. Tidak perlu benar-benar melakukan sleep
Saya tidak tahu soal Haskell, tetapi runtime tokio di Rust memungkinkan ini dengan
start_paused: https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.ht...Jika mengabaikan berbagai lapisan abstraksi dan detail implementasi yang disederhanakan, mengurutkan nilai dengan scheduler seperti ini pada dasarnya hanyalah heap sort :)