
Egor Bogatov adalah pengembang Microsoft dari tim Mono yang bekerja pada Mono dan mengintegrasikannya dengan .NET Core. Kami berbicara dengannya tentang cara bekerja di dalam Xamarin dan Microsoft, tentang cinta game dev. Kami membahas mengapa SSD adalah teman terbaik pengembang, dan kegunaan presentasi konferensi tidak selalu berkorelasi dengan kompleksitasnya. Seperti biasa, wawancara dilakukan oleh Oleg Chirukhin (
olegchir ) dari Grup JUG.ru.
Memperkenalkan: Tentang Demo Terenkripsi dan Cara Masuk ke Xamarin
- Mari beri tahu Habr siapa Anda, apa yang Anda lakukan.- Saya seorang pengembang, saya telah bekerja di tumpukan .NET selama sekitar sepuluh tahun, saya bekerja sedikit di Jawa dan menulis sedikit di bawah Android.
Dia bekerja di berbagai perusahaan: mulai dengan outsourcing, kemudian beralih ke toko bahan makanan, seperti Viber dan Playtika. Kemudian saya sedikit lepas, termasuk di Jawa, dan mulai bekerja di Xamarin.
- Bagaimana kamu sampai di sana?- Saya telah kecanduan .NET dan Mono untuk waktu yang sangat lama. Saya menyukai C #, tetapi saya tidak menyukai kebijakan Microsoft, yang sangat mengikatnya pada Windows. Oleh karena itu, saya telah mengikuti implementasi lintas platform sejak awal.
Saya secara aktif memantau Mono, Xamarin, segera setelah muncul: Saya menyukai konsep itu sendiri. Berpartisipasi dalam kompetisi mereka dan beberapa kali mengambil tempat kedua. Saya diperhatikan dan ditawari untuk bekerja sebagai kontraktor, dan Miguel de Icas menulis sendiri, yang mengejutkan saya, karena bagi saya ia adalah legenda.
- Di mana Anda mulai?- Miguel mengundang saya untuk menulis demo, yang mencakup obrolan dengan enkripsi ujung ke ujung untuk platform seluler. Saya memiliki pengalaman bekerja dengan aplikasi obrolan dan saya menyukai topik enkripsi, jadi awalnya mereka membawa saya ke backend, tetapi saya mengatakan bahwa saya dapat mengembangkan untuk Android juga. Setelah itu, saya terlibat dalam berbagai proyek Xamarin pihak ketiga - saya juga tidak diizinkan masuk ke komponen runtime.
Miguel memiliki banyak proyek menarik. Kadang-kadang bagi saya sepertinya ini adalah sekelompok orang dengan nama yang sama. Nah, satu orang tidak bisa meraba-raba dalam segala hal, menjawab semua orang, menyadari segalanya.
Beberapa kali saya melakukan demo untuknya untuk konferensi besar seperti Xamarin Evolve dan MS Build - ini adalah konferensi pengembang terbesar di Microsoft.
Dan apa signifikansi komersial mereka dari demo ini, mengapa mereka dibutuhkan?Hanya teknologi iklan di antara pelanggan potensial. Sebagai contoh, salah satu demo menunjukkan contoh bagaimana Anda dapat dengan mudah mengintegrasikan visualisasi 3D ke dalam aplikasi reguler pada platform apa pun, dan beberapa perusahaan yang serius tertarik dengan fitur ini.
Tentang pekerjaan: tugas dan perselisihan abadi "jarak jauh atau kantor"
"Sekarang apa yang kamu lakukan?"- Saya dipindahkan ke tim runtime, yaitu, langsung ke Mono. Tanggung jawab utama saya adalah untuk menggabungkan Mono dan .NET Core, yaitu, berada di antara dua runtime. Ini memungkinkan saya untuk lebih memahami .NET, karena saya semua tipe ini, mulai dengan yang paling dasar dan berakhir dengan penelitian yang kompleks, dan mempertimbangkan secara menyeluruh. Dalam dua tahun kami berhasil membangun basis pengalaman yang baik dan mengenal semua pengembang utama.
"Apakah kamu bekerja dari rumah?"- Kami memiliki kantor Microsoft kecil di Minsk. Saya secara berkala berkunjung ke sana, tetapi kebanyakan dari rumah saya bekerja.
- Dan apa yang lebih baik: bekerja di kantor atau di rumah?- Untuk bekerja di rumah Anda membutuhkan banyak disiplin diri. Secara berkala saya mencoba menggabungkan ini dengan perjalanan, tetapi tidak berhasil dengan sangat efektif. Sebagai contoh, saya memerlukan komputer desktop sehat lengkap dengan tiga monitor. Di laptop, saya tidak bisa bekerja dengan nyaman.
- Apakah Anda memerlukan ini untuk monitor atau daya komputer penting?- Dan untuk monitor, dan untuk daya. Secara berkala saya perlu mengkompilasi runtimes yang berbeda: mono, coreclr, corert, tweak mesin virtual, dll. Untuk melakukan ini, saya memerlukan prosesor top-end lengkap, dan bukan kesalahpahaman oleh TPD, dan, tentu saja, SSD yang cepat.
- Yaitu, jika Anda ingin bekerja pada kode Mono, apakah Anda memerlukan komputer biasa?- Mono menyertakan kode sumber untuk .NET dan .NET Core dalam bentuk submodul, jadi pada akhirnya ada sejumlah besar file yang perlu Anda navigasikan dengan cepat, jadi yang paling penting adalah SSD cepat. Kita perlu mengambil sesuatu dari Samsung 960 Pro ke atas. Bottleneck selalu ada di IO.
- Jelaskan hari kerja Anda- Saya bekerja dari Minsk dari jarak jauh. Sebagian besar tim saya ada di AS, meskipun ada beberapa orang di Eropa, ada orang di Jepang, Australia, bahkan di Afrika. Tim yang terdistribusi. Kami berkomunikasi terutama di Slack, mengadakan aksi unjuk rasa beberapa kali seminggu. Kami bertemu secara berkala di Boston atau Redmond.
Sebagian besar tugasnya cukup abstrak. Misalnya, tipe port dari namespace tertentu. Saya dapat mengambil sesuatu secara paralel, pergi ke GitHub dan memperbaiki beberapa bug. Secara berkala saya melakukan sesuatu untuk .NET Core - Saya mencoba untuk mengoptimalkan atau membersihkan sesuatu.
- Dan dari mana tugas itu berasal, bagaimana ini diorganisasikan? Adakah backlog tanpa akhir?- Tugas dimulai oleh pengguna dan pimpinan tim, sebulan sekali kami memiliki satu minggu perbaikan bug: kami hanya menghabiskan satu minggu memperbaiki kesalahan, Anda membuang hal-hal lain.
Sisa waktu juga disarankan untuk tidak melupakan bug, tetapi Anda harus mematuhi tujuan utama, misalnya, tujuan saya adalah untuk port jenis utama dari mscorlib dan membuat Mono / Xamarin memenuhi standar NET 2.1. Ketik porting biasanya terlihat seperti membuang implementasi lama dan menggantinya dengan tautan ke kode dalam submodule .NET Core dengan adaptasi.
Tentang Microsoft, Sumbu dan Pengkhianatan
- Ya, ijinnya memungkinkan. Dan memang Anda berada di perusahaan yang sama.- Ya, benar. Kami telah melakukan ini sebelumnya. Mono adalah bagian dari beberapa distribusi, saya pikir Ubuntu dan GNOME bahkan punya Mono. Miguel diberi tahu bahwa ia akan membiarkan semua orang turun ke biara.
"Ya, aku ingat, Stallman memanggilnya pengkhianat."βMereka takut pengacara Microsoft akan datang kapan saja dan menuntut semua orang, yang untungnya, Microsoft tidak melakukannya.
- Ya, Microsoft melakukan yang sebaliknya - ia mulai menggunakan Linux di rumah.- Microsoft sekarang benar-benar berbeda dengan CEO baru, fokus pada teknologi cloud telah membawa kami ke dunia open source dan semua yang tidak dapat kami pikirkan sebelumnya. Sekarang dimungkinkan untuk mengunduh Ubuntu WSL dari Marketplace dengan satu klik, gunakan MS SQL Server di Linux dan kembangkan di .NET dari bawah macOS.
- Artinya, Anda dapat dengan aman menulis kode di bawah lisensi terbuka dan tidak ada yang akan mengatakan apa pun?"Ya, tentu saja." Tentu saja, sebelum memasukkan beberapa proyek internal ke sumber terbuka, kita perlu sedikit birokrasi, tetapi secara umum, saya tidak memenuhi larangan menggunakan apa pun.
- Apakah Anda memiliki tugas yang membutuhkan tiga platform sekaligus?- Saya punya satu set lengkap: satu komputer Windows, MacBook dengan macOS dan laptop dengan Fedora. Juga sejumlah mesin virtual, termasuk WSL. Paling sering, bug dibagi menjadi dua jenis - Windows dan non-Windows, yang diputar pada MacOS dan Linux.
Memahami .NET Core dan Mono
- Apa arah yang Anda sukai dan bisakah mereka dikembangkan di .NET Core dan Mono?- Secara pribadi, saya suka banyak penekanan pada kinerja dan lintas-platform. Itu terus meningkatkan kinerja dalam kondisi pertempuran dari Bing ke tolok ukur publik seperti TechEmpower, di mana .NET Core berkinerja sangat baik bersama dengan solusi Go, Java dan C ++. Banyak orang masih memiliki stereotip tentang .NET sebagai teknologi khusus Windows dengan mesin virtual pengereman - kami berhasil melawan stereotipe ini.
Tim kami sangat memperhatikan skenario AOT dan penggunaan LLVM sebagai backend untuk menghasilkan kode mesin. LLVM adalah alat yang sangat kuat dengan sejumlah besar optimasi. Hanya diperlukan untuk secara hati-hati menghasilkan LLVM IR dengan jumlah minimum titik aman, agar tidak mengganggu optimasi ini. Secara pribadi, saya baru-baru ini menulis pass transformasi LLVM sederhana saya.
Ini juga menggembirakan bahwa C # dan. NET adalah mainstream bersama dengan C ++ di game dev, terima kasih kepada Unity dan beberapa mesin lainnya yang memiliki skrip C #.
Ada arah yang berpotensi menarik - kompilasi C # di Majelis Web untuk browser.
- Saya tidak tahu caranya di .NET, tetapi kadang-kadang saya harus menyeret banyak perpustakaan standar untuk dikompilasi. Di Jawa, Anda menjalankan Hello World, dan Anda memiliki 2.000 kelas yang dimuat. Sejumlah besar megabita akan dimuat di browser. Apa yang Anda pikirkan tentang ini?- Ukuran minimum runtime Mono dengan pangkalan perpustakaan adalah sekitar dua megabita. Tetapi bahkan Apple memiliki masalah ini: aplikasi yang ditulis dalam Swift menyeret setiap runtime-nya. Sementara teknologi Mono-wasm adalah baku dan didasarkan pada runtime, yang dikompilasi oleh AOT dalam interpreter WASM + untuk kode pengguna. Ngomong-ngomong, sekarang kita menulis ulang runtime dari C ke C ++, saya harap ini tidak mempengaruhi ukuran pada akhirnya.
- Sudahkah Anda mencoba untuk menulis ulang Mono dalam C # bukannya plus atau C?- Idenya terdengar bagus, tetapi itu membutuhkan sumber daya yang tidak realistis dan kami memiliki beberapa kemajuan dalam hal ini. Tim .NET Core telah mencapai tingkat C # dan .NET sehingga kode positif diganti dengan C # agar tidak disapu dengan cross-platform dan pada saat yang sama tidak kehilangan kinerja. Contoh terbaru adalah terjemahan implementasi parsing dan konversi tipe numerik dan seluruh Desimal telah ditulis ulang dalam C #. Ini membuat saya sangat senang dan sangat menyederhanakan pekerjaan migrasi kode.
Tentang Pengumpul Sampah
- Saya melihat .NET Core GC yang menakuti anak-anak, karena itu satu setengah megabita sumber dalam C ++! Satu setengah megabita, Karl! Ini berapa banyak buku ?!- Ya, ya, sementara 47 kontributor tercatat dalam file ini menurut github. Saya bukan ahli tentang Pengumpul Sampah, tetapi secara umum GC memiliki teori yang cukup umum seperti algoritma Mark-n-Sweep, yang rumit dari generasi ke generasi dan upaya untuk menghindari perhentian total dunia dan melakukan segala sesuatu yang sejajar dengan alur utama eksekusi.
- Apakah Anda memiliki plugin atau kemampuan untuk mengubah Pengumpul Sampah atau hanya itu saja?- Di Mono, ada beberapa implementasi, dan di .NET Core kami baru-baru ini membuat API publik yang memungkinkan Anda untuk mengambil beberapa header, menulis HZ Anda sendiri dan menghubungkannya ke aplikasi apa pun dari satu variabel lingkungan. Sebagai contoh, ada artikel tentang cara menulis ZeroGC untuk .NET Core. Dalam dunia wadah, di mana tidak perlu membuang sampah, itu mungkin relevan. Secara umum, ini memungkinkan seseorang, misalnya, untuk mengambil implementasi saat ini dan mengoptimalkannya sebanyak mungkin untuk, katakanlah, pengembang game, sehingga menghentikan dunia dan menjalankan semua objek tidak menyebabkan demam FPS, misalnya, atau mengoptimalkan konsumsi memori, menurut pendapat saya, orang-orang dari Samsung melakukan ini untuk Tizen beberapa modifikasi pada GC.
- Fakta bahwa Microsoft telah melepaskan kontrol total atas semuanya adalah baik, karena GC dan JIT adalah alat kontrol yang sangat baik.- Ya. Lihatlah .NET Foundation - ini bukan hanya Microsoft. Ada Google, Red Hat, Samsung, Intel, secara umum, semua perusahaan yang sebelumnya, tampaknya, tidak akan berdiri di samping Microsoft. Kecuali jika Apple tidak ada.
Tentang Dukungan IDE
- Tentang IDE: seberapa bagus dalam penyetelan, dalam kompiler dan dalam dukungan IDE? Sekarang ada segala macam hal seperti Swift, di mana kompiler memberikan sangat sedikit peluang untuk memeriksa struktur internal, cache, sesuatu yang lain. Dan ini adalah rasa sakit yang tak ada habisnya, karena ketika Anda melakukan penyetelan sendiri, Anda perlu menemukan kembali seluruh dunia. Seberapa baik ini dengan Mono? Apakah Anda memiliki IDE sendiri?- Kompiler C # Roslyn pada awalnya ditulis tidak hanya sebagai kompiler C # di IL, tetapi juga backend dan analisa IDE, bahkan dapat mencerna kode yang buruk. Anda cukup menunjukkan beberapa tampilan dan melakukan sesuatu berdasarkan outputnya, dan dia akan langsung mengatakan: "Tunjukkan menu di sana", "tawarkan refactoring", "di sini Anda memiliki pratinjau perubahan", dll. "Sorot, menawarkan refactoring kepada pengguna. " Artinya, kompiler ini secara langsung memungkinkan Anda membuat IDE dengan cepat.
Bahkan, Anda hanya mengimplementasikan satu set antarmuka untuk GUI Anda, dan Anda sudah memiliki IDE yang mendukung sejumlah besar refactoring dan sejenisnya.
Secara umum, banyak bahasa modern menyediakan AST, pohon abstrak ekspresi kode. Sebagai contoh, Dentang memungkinkan untuk mendapatkan pohon abstrak dari kode plus, omong-omong, kami menggunakan fitur ini untuk menghasilkan binding C # untuk kode C ++ dan Objective-C.
- Sudahkah Anda mencoba menggunakan Visual Studio Code untuk apa saja?- Nah, saya akan mengatakan bahwa ini adalah alat saya yang paling dasar.
- Katakan saja dude ingin membuka repositori Mono dan menggantungnya. Apa yang dia butuhkan untuk ini?- Pada Windows, cukup buka solusi runtime dan solusi btsl dan bangun keduanya. Berkat paralelisasi yang efisien, msbuild harus melakukannya dalam waktu sekitar 5 menit. Di macOS dan Linux, pendekatan yang biasa digunakan melalui Makefiles digunakan.
Pada persiapan laporan dan beberapa spoiler
- Anda datang ke DotNext dengan laporannya, tetapi tentang apa itu?- Laporan saya akan terdiri dari sekumpulan contoh menarik dari optimasi mikro yang diterapkan di .NET Core oleh pengembang dan kontributor pihak ketiga, yang, saya pikir, dapat bermanfaat bagi programmer yang diterapkan juga. Saya juga akan memperhatikan contoh gagal untuk mengoptimalkan sesuatu, misalnya, ketika kontributor ingin mengoptimalkan kasus tertentu, tetapi ternyata menyamping dalam bentuk regresi pada orang lain. Secara terpisah, akan ada selusin slide pada SIMD API baru.
Orang-orang dari Intel bersama dengan orang-orang Microsoft mengeluarkan C # API tingkat rendah untuk SIMD, yang memungkinkan Anda untuk menulis algoritma ultra-cepat tanpa bergantung pada kompiler, yang, seperti yang dipikirkan banyak orang, akan dapat mengoptimalkan dan membuat vektor semuanya sendiri - itu tidak.
- Dalam kasus umum, ini secara teori tidak mungkin.- Ya, tidak ada tempat untuk menjauh dari penyisipan intrinsik independen. Saya ragu bahwa dalam bahasa apa pun orang dapat menggambarkan multiplikasi atau transposisi matriks pada tipe sederhana dan mengharapkan instruksi SSE / AVX paling efektif dari kompiler ke output. Omong-omong, saya sudah menerapkan intrinsik C # ini di dalam .NET Core untuk mengoptimalkan System.Numerics.Matrix menggunakan SSE dan mengoptimalkan fungsi GetHexDigits menggunakan Lzcnt. Anda dapat menggunakannya sebagai contoh menggunakan API dalam proyek Anda.
- Ketika orang datang yang sedang mengembangkan sesuatu yang inti, orang yang juga tertarik untuk berpartisipasi dalam hal ini datang. Apakah ada cara pemula?Setiap kontributor pertama kali menerima banyak perhatian dan bantuan, banyak tugas atau bug sederhana yang tidak memerlukan pengetahuan luas dan prioritas tinggi dapat ditandai dengan label khusus pada GitHub - "up-for-grabs", atau "masalah pertama yang baik".
- Anda dapat pergi ke repositori, menemukan masalah dengan tag ini dan memilih orang yang dekat semangatnya. Sebagai contoh, beberapa tugas adalah tentang menutupi beberapa bagian kode dengan tes. Meningkatkan cakupan dengan tes adalah tugas pertama yang sempurna. Juga cara yang baik adalah dengan membandingkan sesuatu, membandingkannya dengan runtimes lain dan mencoba mencari tahu mengapa kode ini atau itu bekerja lebih lambat daripada di .NET 4.x, misalnya string.GetHashCode. Pada benchmarking, ada sejumlah besar pidato dan posting blog dari Andrei Akinshin dan Adam Sitnik tentang alat yang sangat nyaman - BenchmarkDotNet, yang dengan gerakan tangan yang sederhana akan menunjukkan kepada Anda kecepatan eksekusi kode dengan satu atribut, bandingkan dengan runtimes lain, ceritakan tentang memori dan tunjukkan kode assembler.
Yaitu set tindakan minimum adalah menelusuri semua permintaan tarik dan tugas, berlangganan orang-orang seperti Matt Waren dan Ben Adams di Twitter, buka saluran corefx dan coreclr di twitter dan baca dokumentasi BenchmarkDotNet.
- Ya. Saya sekarang telah memfilter tag up-for-grabs, ada sekitar 600 masalah di sini, beberapa tanpa komentar sama sekali dan Anda dapat mengambilnya.- Ya itu benar. Baru-baru ini, mereka melakukan hackathon untuk .NET Core-team. Mereka mengalokasikan beberapa lusin masalah, dan dalam sehari mereka harus diperbaiki dan mendapatkan hadiah untuk itu.
- Bagus sekali. Dia mengatakan banyak hal menarik, sekarang saya ingin mencoba menyelesaikan beberapa masalah sendiri. Benar, saya tidak tahu C #, itulah masalahnya.- C #, karena saya ingin percaya, bahasa yang cukup dapat diprediksi meskipun jumlah gula dan pengalaman di Jawa atau C ++, saya pikir Anda bahkan dapat mulai mengoptimalkan sesuatu dengan cepat dalam runtime, pengalaman dalam bahasa lain bahkan akan membantu Anda pada hal-hal dari sisi lain.
- Saya sedang melihat repositori .NET Core dan terlihat sangat layak. Dan orang benar-benar berkomunikasi dalam komentar, diskusi berlangsung langsung.- Ya, cukup aktif. Ada 100 dan 200 komentar. Dan Anda dapat belajar dari perpustakaan dasar kelas, ada cukup banyak tugas menarik yang dapat dilakukan siapa pun.
- Terima kasih banyak atas jawabannya! Temui saya di DotNext.Kali ini, satu menit iklan akan menjadi tidak biasa, karena ketika kami sedang mempersiapkan wawancara, tiket konferensi habis. Ingin melihat laporan dan tidak punya waktu untuk membeli tiket? Streaming langsung masih tersedia di situs .
Jika Anda memiliki pertanyaan atau keinginan luar biasa untuk mengunjungi DotNext 2018 Moscow secara langsung, kirimkan surat kepada kami di tickets@dotnext.ru (mungkin seseorang akan mengembalikan tiketnya dan kami dapat membantu Anda).