Run Loop mengundang mereka yang membuat produk keren dengan tangan mereka sendiri. Nikita Prokopov (
tonsky ) - seorang pria dan sebuah kapal, berhasil membuat beberapa proyek OpenSource yang dinikmati orang lain.
Pertama-tama, mari kita bicara tentang font FiraCode, Clojure, dan proyek yang sama sekali berbeda, misalnya, pembungkus ClojureScript untuk React. Dan kemudian mari kita beralih ke diskusi yang lebih umum tentang antarmuka yang baik, akal sehat, dan model pelatihan untuk programmer.
Tentang tamu : Nikita Prokopov terkenal karena ia menciptakan FiraCode, memberikan kontribusi signifikan pada pengembangan komunitas Clojure dan menerbitkan proyek-proyek seperti Datascript dan Rum di OpenSource. Selain itu, ia menulis di Objective-C di bawah macOS: program AnyBar akan memberi tahu Anda tentang terjadinya suatu peristiwa di bilah status, oh, menubar komputer Anda.
Penyaji : Roman Busygin (pengembang Yandex.Music untuk iOS) dan Alexey Mileev (App in the Air).
Nikita : Saya seorang programmer dari Novosibirsk, tetapi sekarang saya tinggal di Moskow. Dia terlibat dalam proyek web terutama, saya suka antarmuka. Baru-baru ini saya telah pemrograman di Clojure.
Roman : Saya mengusulkan untuk membangun percakapan hari ini dengan Open Source dan proyek publik Anda. Saya ingin memulai dengan hal pertama dan paling menarik bagi saya - ini adalah font
FiraCode . Ini digunakan oleh banyak rekan saya dan saya sendiri. Saya selalu tertarik pada cara membuat font saya sendiri, bagaimana hal itu terjadi, apakah ada program khusus, pengetahuan apa yang perlu Anda miliki untuk membuat font Anda sendiri. Tolong beri tahu tentang ini.
Firacode
Nikita : Tidak sepenuhnya benar untuk mengatakan bahwa ini adalah font saya. Saya mengambil font monospace yang sudah jadi dan menyelesaikan ligatur, saya tidak menggambar sendiri. Untuk membuat surat sendiri, Anda membutuhkan banyak pengalaman dan ketekunan. Sangat sulit, ada sejuta kehalusan halus. Ada font amatir dan Anda selalu dapat melihat bahwa mereka canggung, tetapi tidak selalu jelas apa yang canggung ini.
Saya mengambil font FiraMono yang bagus dari Mozilla dan menggambar ligatur di sana, ada beberapa program untuk ini. Saya menggunakan program Glyph yang cukup populer. Saya bukan ahli dalam desain font, jadi saya melihat apa yang orang lain gunakan, dan saya menggunakannya juga. Mungkin mengejutkan bahwa itu cukup mahal, tetapi mereka memberi saya lisensi untuk mengembangkan FiraCode. Mesin terbang seperti editor grafis vektor. Anda membuka, ada huruf, Anda menemukan sel dan menggambar. Plus, segala macam seluk-beluk yang terkait dengan font, misalnya, bahwa huruf memiliki ukuran, titik jangkar, transisi dari cetak tebal ke cetak tebal. Semuanya cukup sederhana.
Menariknya, di dalam font OpenType terdapat bahasa pemrograman atas dasar penggantian ligatures ini. Awalnya, ini dibuat sebagai sarana untuk implementasi semua jenis trik dalam font. Misalnya, ligatur, ketika fi, ffi dan sejenisnya dalam font biasa diganti dengan ligatur. Plus, ada variabilitas, gaya akhir huruf: jika huruf di awal dan akhir kata, beberapa ekor ditambahkan ke dalamnya. Ini semua dapat diprogram menggunakan pola yang rumit, dan juga ligatur yang dibuatnya.
Roman : Berapa lama untuk menyelesaikan FiraMono menjadi jenis FiraCode yang digunakan semua orang sekarang?
Nikita : Akan sulit untuk menghitung. Versi pertama tidak terlalu sulit. Seperti biasa, semuanya dimulai dengan sangat cepat, tetapi butuh beberapa waktu untuk mencari tahu apa yang sedang terjadi, bagaimana menerapkannya: tidak ada banyak contoh.
Roman : Yaitu, ada juga beberapa versi. Bagaimana mereka berbeda?
Nikita : Ya, dan versinya sedang diperbarui. Pertama, saya menyelesaikan ligatur baru, kadang-kadang menghapus yang lama jika mereka bertentangan dalam sesuatu. Pada titik tertentu, mekanisme untuk menggambar ligatur berubah di sana. Di dalamnya ada masalah algoritmik yang sangat menarik: ada urutan karakter yang panjang, dari sana Anda perlu mengisolasi kombinasi yang membentuk ligatur, tetapi jika mereka berpotongan, maka harus ada pengganti lain. Saya bahkan memiliki program Clojure yang menghasilkan seperangkat aturan yang kemudian dimasukkan ke dalam font - cukup sulit. Hal ini telah berubah, metode rendering pengikat telah berubah. Sebelumnya, mereka digantikan oleh satu karakter, sekarang mereka digantikan oleh tiga karakter. Bahkan, untuk pengguna semakin baik, lebih sedikit bug, lebih banyak pengikat.
Roman : Menarik. Saya tidak pernah berpikir bahwa mungkin ada bug dalam font. Aturan dimana pelukis memutuskan kapan harus memasukkan ligatur dan kapan tidak, dijelaskan dalam bahasa pemrograman khusus atau hanya secara deklaratif?
Nikita : Secara deklaratif, dan kemudian secara internal menerjemahkan cukup efisien ke dalam tabel penggantian.
Atur untuk versi pertama dari ligatures
Roman : Katakan padaku, kapan kamu membuat satu set ligatur, apakah kamu melihat bahasa pemrograman tertentu atau adakah daftar umum yang dibutuhkan orang dalam kehidupan sehari-hari?
Nikita : Saya sendiri tidak menemukan ide ini. Saya melihat bahwa ada font Hasklig yang dibuat khusus untuk Haskell. Tetapi saya tidak membutuhkan Haskell, jadi saya pikir saya perlu membuat font yang sama, tetapi, pertama, berdasarkan font yang saya suka, dan kedua, untuk bahasa apa pun. Lalu aku mengambil semua
yang terpikir olehku . Hal-hal pertama sudah jelas: <=,> =, ->, <-. Anda menulis seperti dalam C, tetapi diganti dengan panah. Menurut saya, ini semua dimulai.
Clojure
Alexei : pada awalnya, kamu menyebutkan bahwa kamu menulis tentang Clojure sekarang. Ceritakan bagaimana Anda datang ke Clojure, bagaimana semuanya dimulai, bagaimana Anda sampai pada bahasa ini?
Nikita : Saya menonton beberapa ceramah oleh Rich Hickey (saya sarankan, misalnya,
ini dan
ini ). Mereka keren dan serbaguna tentang topik bagaimana kepala programmer bekerja, secara kasar, bagaimana merancang sistem. Ceramah-ceramah itu membuka banyak sekali informasi penting baru yang penting bagi saya, dan saya adalah penggemar Rich Hickey. Kemudian dia menjadi tertarik pada apa yang telah dia lakukan. Ternyata dia membuat bahasa Clojure. Saya pergi untuk membacanya, memikirkan semuanya dan kami pergi.
Roman : Saya juga bisa direkam sebagai penggemar Rich Hickey. Saya melihat penampilannya: keduanya panjang dan, yang paling penting, menarik. Artinya, ia berhasil menjaga perhatian pendengar untuk waktu yang lama.
Alexei : apa yang sebenarnya kamu suka dari Clojure?
Nikita : Pada konferensi terakhir, Rich Hickey membuat pernyataan berikut:
Clojure adalah bahasa untuk programmer yang lebih tua dan lelah.
Mereka tidak datang kepadanya di awal karir, tetapi dia menjadi menarik setelah 10-15 tahun. Pertama-tama, Anda memiliki kebebasan absolut. Semua yang Anda butuhkan, Anda lakukan sendiri atau ambil dari perpustakaan.
Dalam bahasa itu sendiri, hal-hal minimum dijahit . Segala sesuatu yang Anda desain, lakukan persis seperti yang Anda butuhkan. Semuanya buatan sendiri dan bisa diubah. Ini berbahaya ketika Anda seorang pemula, tetapi berguna jika Anda sudah ahli dan tahu apa yang Anda butuhkan.
Dalam bahasa ini, pikiran diungkapkan sejelas dan seringkas mungkin. Yaitu, jarak minimum antara kerumitan apa yang Anda coba ekspresikan dan kerumitan bagaimana itu ditulis. Di Jawa, misalnya, Anda dapat melakukan beberapa hal yang benar-benar sepele, tetapi itu akan membentang selama 10 baris, dan Anda akan lelah. Dalam Clojure, jika sesuatu itu sepele, maka itu ditulis, kemungkinan besar, sepele, dalam satu atau dua baris.
Roman : Saya menyadari bahwa Anda menjawab pertanyaan saya. Ketika saya mendengar bahwa Clojure tidak memaksakan batasan pada Anda, untuk beberapa alasan saya langsung ingat C, yang entah bagaimana juga berdiri di telinganya. Tetapi kemudian saya mendengar jawaban bahwa itu bukan hanya gula sintaksis, tetapi juga bahasa yang praktis dan praktis yang memungkinkan Anda untuk mengekspresikan pikiran Anda dengan kode yang lebih sedikit.
Nikita : Ya, levelnya sangat tinggi, dan C levelnya rendah.
Alexei : Saya bertanya-tanya apakah kebebasan bahasa seperti itu tidak mengganggu pekerjaan dalam proyek-proyek besar dengan sejumlah besar orang. Atau di OpenSource, di mana Anda perlu memonitor setiap perubahan dengan hati-hati? Sejauh yang saya dengar, hal-hal yang diperbolehkan di Clojure hingga
mengubah sintaks bahasa . Apakah itu tidak mengganggu Anda?
Itu mengingatkan saya pada situasi dengan Scala, ketika bahasa tahu banyak hal, dan dalam setiap proyek besar setiap orang dibungkus dengan semacam penggaruk sendiri. Akibatnya, mereka melakukan beberapa praktik umum, yang kami gunakan, dan ini tidak. Akibatnya,
Scala dalam satu proyek dan Scala dalam yang lain adalah dua Scala yang berbeda . Apakah ada masalah seperti itu di Clojure?
Nikita : Saya tidak bekerja di proyek-proyek besar. Di tempat dia bekerja, ada sedikit variasi. Bahkan, untuk beberapa alasan, kebingungan langsung seperti itu tidak terjadi. Sepertinya bagi saya ini karena di Scala, katakanlah, ada penggemar yang membuat teori dan berspekulasi tentang cara melakukan sesuatu yang paling benar. Seperti yang Anda katakan, ada banyak segalanya - Anda dapat memilih bukan itu. Di Clojure, sebaliknya, tidak banyak - Anda tidak dapat memilih hal yang salah. Ini adalah bahasa yang sangat praktis. Clojure tidak suka membuat abstraksi untuk masa depan. Jika Anda perlu mencetak sesuatu, misalnya, maka Anda cukup mencetak sepraktis mungkin dan tidak khawatir dari mana asal printer, antarmuka apa, protokol yang Anda laksanakan. Anda melakukan apa yang Anda butuhkan. Oleh karena itu, kepraktisan ini mungkin merupakan penyebut yang umum.
Proyek di Clojure
Roman : Sejauh yang saya bisa lihat, Anda memiliki beberapa proyek tentang Clojure di GitHub. Ceritakan lebih banyak tentang mereka kepada kami.
Datascript
Nikita : Proyek OpenSource pertama saya yang relatif sukses adalah
Datascript . Ini adalah penyimpanan klien untuk browser. Ini mungkin tidak terlalu berguna untuk situs, dan jika Anda menulis semacam aplikasi interaktif di browser, maka Anda perlu menyimpan status di suatu tempat. Datascript hanyalah repositori untuk status. Keripiknya:
- Dia tidak berubah . Artinya, itu tidak merusak versi sebelumnya, hanya membuat salinan penyimpanan baru dengan cukup efisien.
- Dia disortir . Secara otomatis mendukung indeks pada atribut, pada entitas_id apa pun, dan sebagainya. Ini memungkinkan Anda untuk dengan cepat menemukan semua yang Anda butuhkan. semua yang kamu butuhkan.
- Itu datar . Jika Anda belum benar-benar berpikir tentang cara menerapkan penyimpanan pada klien, maka hal pertama yang akan Anda lakukan adalah struktur JSON bersarang. Di Datascript penyimpanannya rata, kapan saja Anda bisa pergi ke mana saja dan menemukan yang Anda butuhkan.
Secara umum, ini adalah akses yang relatif mudah ke data, dua arah: Anda dapat beralih dari orang tua ke anak, atau Anda juga dapat beralih dari anak ke orang tua.
Untuk komunitas Clojure, ia memiliki satu keuntungan lagi: dibuat dengan API yang sama dengan Datomic. Datomic adalah database Clojure. Karena mereka memiliki antarmuka yang sama, jika Anda tahu Datomic, - Anda tahu Datascript. Ada juga kueri di sana, Anda dapat menulis kueri data dalam bahasa Datalog. Saya tidak menemukan fitur ini sangat berguna untuk antarmuka, tetapi ada orang yang menemukan berguna dalam hal ini. Ini seperti SQL, Anda dapat membuka kondisi dan mendapatkan hasil dari repositori klien.
Roman : Tolong beri tahu kami mengapa Datascript unik. Tugas menyimpan keadaan pada klien dalam aplikasi interaktif cukup umum. Tampaknya sudah seharusnya tertanam di suatu tempat baik dalam bahasa itu sendiri atau dalam semacam kerangka kerja. Namun, Anda memutuskan untuk membuat keputusan. Apa yang mendorongmu?
Nikita : Saya bertanya-tanya apakah saya bisa membuat alat kecil Datomic. Sangat menarik untuk mengulangi sistem yang ada. Kemudian ternyata ini adalah ide yang bagus, dan sangat nyaman untuk mengatur dan mengakses keadaan dengan cara ini. Mungkin ada solusi serupa di dunia JavaScript. Ada yang namanya Relay. Sejauh yang saya ingat, ini memecahkan masalah sinkronisasi dan penyimpanan data. Dia agak mirip, tetapi, menurut saya, kemudian muncul.
Rum
Alexey : Ada satu lagi perpustakaan
Rum Anda. Tolong beritahu saya tentang dia.
Nikita : Rum hanyalah pembungkus React untuk ClojureScript. Bereaksi itu keren, hebat, dan semua orang menyukainya. Saya ingin menggunakannya b di ClojureScript untuk digunakan. Dia adalah skrip Java, tapi saya ingin menggunakannya dalam Clojurescript. Ada beberapa solusi di dunia ClojureScript, tetapi semuanya terlalu konseptual. Mereka menawarkan model mereka, yang secara internal menggunakan React. Artinya, tidak murni, tetapi konsepnya sendiri, yang menggunakan React.
Gagasan Rum muncul dari fakta bahwa Anda tidak dapat menggunakan Datascript dengan pengikat sebelumnya, tetapi saya ingin menggunakannya. Akibatnya, saya sampai pada desain di mana Rum adalah ikatan paling transparan dan sepele untuk Bereaksi. Kami menawarkan semuanya sama seperti di Bereaksi, hanya dibungkus dengan antarmuka yang nyaman untuk menggunakan ClojureScript. Tidak menyembunyikan apa pun, Anda bisa mendapatkan komponen asli React. Ia seorang agnostik, sesuka Anda, dan mengatur aplikasi dan arsitektur.
Roman : Menurut cerita dari huruf yang sudah dikenal, dan secara umum, melihat ke arah React and React Native, saya melihat betapa gilanya proyek Anda mendapatkan popularitas. Anda bilang itu pembungkus React. Tetapi React adalah proyek besar, dan Anda berhasil membuat Rum sangat kecil tanpa mempelajari banyak sumber Bereaksi. Bagaimana kamu melakukannya?
Nikita : Bereaksi sebenarnya bukan proyek besar. Semua hal-hal penting yang ada di Bereaksi berada di perpustakaan Preact, yang hanya membutuhkan 3 KB. React memiliki API yang cukup kecil plus banyak peretasan untuk peramban baru, tidak masuk akal untuk mempelajari peretasan, semuanya ada di dalam React.
Roman : Apakah G6 bagian dari React atau tidak?
Nikita : Secara resmi - tidak, ini adalah komponen yang terpisah.
Roman : Apakah Anda porting atau kesampingkan?
Nikita : Tidak, saya belum porting; Anda tidak menggunakannya di ClojureScript. Di ClojureScript, kode adalah data dan semua itu, Anda bahkan tidak memerlukan sesuatu seperti G6, Anda sudah memiliki sintaks berbasis vektor sendiri, yang diterima di komunitas Clojure. Menggunakan data, kami menyajikan hal yang sama yang dilakukan di G6 oleh makro dan preprocessing sumber.
Roman : Wow! Sekarang saya mengusulkan untuk beralih ke proyek berikutnya. Saya sangat terkejut dan senang ketika saya melihat bahwa Anda, Nikita, menulis proyek
AnyBar - aplikasi menubar yang menunjukkan indikator berbeda di dekat jam. Anehnya, proyek MacOS pertama saya juga merupakan aplikasi menubar yang memperlihatkan notifikasi surat-surat baru dari Yandex.Mail. Saya melihat sumbernya dan langsung kembali ke 8 tahun yang lalu.
Proyek ini sangat sederhana dan populer. Tentunya, mereka menggunakannya untuk beberapa tugas terapan. Tolong beritahu saya bagaimana proyek itu muncul, bagaimana Anda menggunakannya sendiri, atau, mungkin, Anda tahu bagaimana seseorang menggunakannya?
Anybar
Nikita : Proyek ini muncul secara tidak sengaja. Anda tahu, programmer suka menulis sesuatu, dan di sini. Kode Clojure tidak perlu dikompilasi; Kode ClojureScript tidak. Setiap kali Anda mengubah sumber, itu dikompilasi ulang. Ini membutuhkan waktu: mulai dingin membutuhkan 30-40 detik, misalnya, dan membangun bertahap dari satu detik ke sepuluh detik. Anda mengubah sumber, beralih ke browser, dan Anda masih tidak tahu apakah Anda sudah bisa menonton atau masih harus menunggu, karena sumbernya belum dikompilasi. Untuk mengetahui ini, saya datang dengan indikator.
Semua bekerja terutama pada laptop, tidak ada banyak ruang, di mana mendapatkannya. Anda harus beralih ke terminal dan menunggu sampai semuanya dikompilasi di terminal, dan kemudian beralih ke browser. Agar tidak pergi ke terminal lagi, saya menjadikan diri saya indikator dalam menubar, yang menunjukkan status build: mengkompilasi, mengkompilasi, dan dikompilasi dengan kesalahan. Jika terjadi kesalahan, maka Anda tidak perlu me-refresh halaman seratus kali, masih tidak ada yang berlaku.
Saya tidak melakukannya dengan cara tertentu, tetapi saya melakukannya secara universal. Untuk mengubah warna indikator di AnyBar, Anda hanya perlu mengirim paket UDP, ini adalah cara paling sederhana untuk komunikasi silang. Ternyata ini adalah hal yang super fleksibel, yang sepele untuk skrip. Saya digunakan terutama untuk membangun status saja.
Seseorang, misalnya, baru-baru ini mentweet bahwa ia telah membuat indikator status kursi kosong di kedutaan. Sehingga Anda bisa segera membuat janji, ketika ada kursi kosong. Itu juga ditampilkan di AnyBar.
Roman : Nikita, apakah benda ini hanya berfungsi di Localhost, atau bisakah mesin virtual saya di Belanda mem-ping laptop saya dan menampilkan sesuatu dalam menubar?
Nikita : Jika Anda dapat mengirim paket UDP dari mesin virtual Anda untuk laptop, maka ya.
Alexei : Setelah mendengar tentang waktu membangun dingin 30-40 detik dan kemudian panas kembali selama satu atau dua detik, tentu saja, saya hanya bisa iri dari dunia Android. Tapi di sini saya punya pertanyaan ini: apakah semua ini telah ditumbuhi dengan set skrip shell yang sudah jadi, plug-in yang sudah jadi yang bahkan tidak bisa Anda tulis, tetapi cukup dicolokkan sehingga semuanya langsung bekerja?
Nikita : Itu tidak ditumbuhi, karena saya tidak banyak melakukannya. Saya bahkan terkejut bahwa ada orang lain yang tertarik. Ada banyak hal: banyak ide, bahkan banyak klon. Orang ingin menampilkan teks atau beberapa indikator dan sebagainya. Saya akan melakukan semua ini, tetapi tangan saya tidak mencapai.
grumpy.website
Alexei : ayo beralih ke proyek selanjutnya. Katakan padaku apa itu
grumpy.website.Nikita :
grumpy.website adalah blog tentang contoh antarmuka buruk. Kami mengumpulkan setiap jambs di antarmuka komputer dan non-komputer, berdiskusi, mengeluh tentang mereka.
Alexey : Berapa lama situs ini muncul?
Nikita : Sekitar setahun yang lalu.
Alexei : berapa banyak orang yang memposting sesuatu di sana?
Nikita : Ini adalah proyek penulis, kami sekarang memiliki empat penulis. Kami terutama memposting, tetapi lima orang lagi secara berkala mengirimkan saran mereka. Ini adalah mesin yang sepenuhnya khusus ditulis di Clojure langsung di
saluran YouTube saya. Butuh 13-14 masalah udara, deskripsi lengkap yang ada di
Gist . Jika Anda tertarik bagaimana cara membuat aplikasi web di Clojure dari awal, Anda bisa melihatnya.
Roman : Apakah kursus ini sudah selesai, atau apakah proyek masih diselesaikan, dan apakah Anda memposting catatan saat sedang diselesaikan?
Nikita: Ini lebih dari blog video. Itu berakhir pada keadaan di mana
grumpy.website sekarang berada - itu secara real time. Apa yang sekarang ada di situs, lalu di blog.
Desain dan kegunaan
Roman : Anda, sebagai orang yang mengangkat proyek tentang kebodohan desain antarmuka, kemungkinan besar berpengalaman dalam desain dan kegunaan. Bagaimana Anda bisa masuk ke area ini? Bagaimana Anda tertarik dengan ini?
Nikita : Itu terjadi cukup awal, di awal karier. Saya terlibat dalam proyek web, dan bagi saya tampaknya untuk melakukan antarmuka dengan baik, saya perlu memahami apa yang kami lakukan. Ada perasaan bahwa semuanya tidak beres dengan antarmuka komputer.
Saya membaca beberapa buku terkenal dan kedengarannya sangat masuk akal. Di satu sisi, Anda perlu mengawasi antarmuka yang bagus. Akal sehat, di sisi lain. Untuk membaca
grumpy.website , Anda tidak perlu menjadi ahli di antarmuka, akal sehat cukup untuk memahami bahwa ini adalah horor-horor.
Roman : Saya ingat bahwa setelah membaca buku "Desain hal-hal yang akrab" oleh Donald Norman, saya benar-benar mulai melihat lebih banyak. Tetapi sebelum itu, saya menggunakan omong kosong ini, kekurangan ini dan mata saya tidak melekat.
Laporan AppsConf
Alexey : Nikita akan berbicara di AppsConf dengan laporan "
Akuisisi keterampilan ". Nikita, katakan padaku bagaimana laporan seperti itu muncul.
Nikita : Saya menonton laporan tentang model driftfus. Ini adalah model untuk memperoleh keterampilan, yang menurutnya setiap orang, mempelajari bidang baru, melewati tahapan yang berbeda: pemula, kompeten, spesialis, ahli, ahli. Saya pergi membaca, mencari tahu apa level-level ini, bagaimana perbedaannya, menemukan bagaimana hal itu jatuh pada pemrograman dan semua yang saya lihat di sekitar pemrograman: kursus, buku, diskusi di Internet, bahasa pemrograman perangkat. Yaitu, sehubungan dengan berbagai tingkat programmer atau pemrograman. Ternyata ini adalah model yang menarik yang menjelaskan banyak hal. , , .
, : , . β , β . . , , , .
: , , , , , . , . , .
AppsConf β 8 9 . . ( : , ), .
YouTube- , .