Mengapa Clojure?

Satu bagian dari kebijaksanaan tanpa atribut yang melekat pada saya adalah “jangan mengambil lebih dari satu taruhan teknologi”. Di Ladder, taruhan besar kami adalah menggunakan Clojure untuk pengembangan aplikasi fullstack. Ladder telah menggunakan Clojure sejak hari pertama tahun 2015, dan kami tidak menginginkannya berbeda! Secara khusus, warisan Lisp Clojure, fokus pada fungsi murni dan struktur data yang tidak dapat diubah, dukungan server-klien terpadu, dan pengalaman pengembang yang unggul telah membantu kami menulis kode kualitas yang lebih tinggi dengan lebih cepat.

Fungsi murni dan keabadian

Salah satu tantangan dengan bahasa pemrograman biasa dan imperatif seperti Javascript atau Python adalah meningkatnya kompleksitas pengelolaan negara. Saat aplikasi Anda berkembang, semakin sulit untuk mengisolasi di mana dalam basis kode perubahan khusus pada status aplikasi Anda terjadi. Ini karena dengan arsitektur aplikasi yang khas dalam bahasa tersebut, fungsi apa pun dapat melakukan efek samping atau mengubah status masuk atau global. Di sisi lain, Clojure sangat menekankan bekerja dengan fungsi murni (baik, jika Anda mengurangi I / O …) dan struktur data yang tidak dapat diubah . Seorang programmer Clojure harus eksplisit saat mendefinisikan dan memodifikasi status yang bisa berubah – ini membantu meminimalkan penggunaannya dan membuatnya lebih mudah untuk bernalar.

Struktur data yang tidak dapat diubah dan fungsi murni juga cocok untuk pemrograman bersamaan. Kami jarang merasa khawatir tentang kunci dan data bersama di lingkungan multi-utas, karena fungsi kami jarang mengubah status bersama. Dan saat kami melakukannya, Clojure menyediakan atom , pembungkus yang aman untuk thread di sekitar struktur data biasa. Di belakang layar, menyetel panggilan nilai atom bandingkan-dan-set! . Itu berarti tidak perlu repot dengan kunci atau mutex dan tidak perlu khawatir data Anda berubah sebelum Anda memodifikasinya. Dengan satu konstruksi sederhana ini, Clojure menghilangkan 99% sakit kepala konkurensi kami.

Clojure adalah Lisp

Mungkin ada cukup banyak argumen Lisp di Internet – saya akan tunduk pada Cupang Kaya (pencipta Clojure) dan Paul Graham alih-alih menambahkan pengulangan lain. Yang mengatakan, Clojure memberikan beberapa keunggulan dibandingkan Lisps lain seperti Common Lisp dan Scheme:

  • CL hanya menyertakan daftar dalam spesifikasi bahasa intinya. Clojure memperkenalkan vektor, set, dan peta yang membuat membaca dan menulis kode menjadi jauh lebih tidak membosankan. Tentu saja Skema memiliki semua ini kecuali set.
  • Struktur data inti Clojure tidak dapat diubah yang, seperti dibahas di atas, membuat penalaran tentang kode, terutama kode konkuren, menjadi lebih mudah. ​​

Clojure berjalan di mana-mana

Clojure menyediakan dukungan kelas satu untuk berbagi kode antar platform dengan persyaratan pembaca . Sebagian besar namespace kami di Ladder memanfaatkan ini dan dibagikan ke seluruh klien kami (Clojurescript) dan server (Clojure). Faktanya, semua kode React klien kami (selain dari panggilan API khusus browser seperti clipboard, penangan input, dll) mendukung untuk dijalankan di JVM. Ini memungkinkan kita menjalankan apa yang kita sebut “tes tumpukan penuh” sepenuhnya dalam proses Java. Misalnya, kami dapat menjalankan aliran pengguna penuh seperti “pengguna dapat menerima polis asuransi jiwa” dan menegaskan status klien dan server di tes yang sama . Analog terdekat tanpa kekuatan super ini akan menjalankan tes Selenium terhadap server web yang sedang berjalan, yang memperkenalkan segala macam potensi kelemahan. Untuk lebih lanjut tentang tes tumpukan penuh, lihat pembicaraan ini yang diberikan oleh dua teknisi kami di Clojure West di tahun 2017.

Clojure juga menyediakan interop host yang mudah untuk setiap platform yang didukung. Ini memungkinkan kami memanfaatkan ekosistem JVM (dan Javascript) penuh. Misalnya, kami menggunakan pustaka Java populer seperti Jetty , kafka-klien , Tink , dan lainnya. Di frontend, kami menggunakan React, dan dapat dengan mudah menyertakan library Javascript lainnya untuk analitik, penanganan error, dan replay sesi.

Pengalaman pengembang

Ketika saya pernah bekerja dengan Typecript dan Python, saya terus-menerus menunggu server pengembangan saya dimuat ulang. Clojure membuat pembaruan kode di server lokal Anda semudah memuat ulang namespace yang diperbarui di REPL Anda. Jika mau, Anda bahkan dapat memperbarui jarak jauh, (semoga) server web non-produksi ! Mampu mengevaluasi kode dalam REPL dan menjalankan pembaruan server web Anda dalam waktu kurang dari satu detik membuat eksplorasi dan iterasi pada backend Anda yang sebenarnya jauh lebih cepat. Umpan balik instan membuat pengembang lebih menyenangkan dan eksperimental. Pada akhirnya, ini membantu mereka menulis kode yang lebih baik dengan lebih cepat.

Ini juga sangat mudah untuk menjalankan potongan kecil kode di REPL. Ladder, seperti toko Clojure lainnya, memiliki kesepakatan mendokumentasikan penggunaan namespace dengan blok komentar di bagian bawah. Pengembang dapat menggunakan kode di dalam untuk mempelajari API namespace, menjalankan prosedur yang umum digunakan, atau menguji perubahan ke namespace lainnya – semuanya tanpa meninggalkan editor mereka!

Mengapa tidak Clojure?

Meskipun kami sangat puas dengan pilihan Clojure kami, kami mengalami sakit kepala yang cukup parah. Pertama, proses Clojure membutuhkan waktu lama untuk dimulai – terutama seiring bertambahnya ukuran aplikasi. Server web kami di Ladder membutuhkan satu menit penuh sebelum dapat menerima permintaan web. Hal ini membuat penskalaan otomatis sebagai respons terhadap pemuatan menjadi lebih menantang – beberapa beban kami dapat melonjak dalam waktu kurang dari satu menit, jadi kami harus menyediakan terlalu banyak secara konsisten untuk menanganinya. Kedua, Clojure menghasilkan artefak yang cukup besar. Ini tidak terlalu penting di backend, di mana JAR server web kami lebih dari 1,5GB, tetapi merugikan kami di frontend. Kami masih memiliki pekerjaan yang harus dilakukan di sini, tetapi bundel awal kami adalah 7,2MB tidak terkompresi (1,0MB gzip)! Jika kinerja mentah atau ukuran paket adalah perhatian utama Anda, Anda mungkin lebih baik memilih bahasa lain.

Kesimpulan

Sebagai perusahaan kecil, kami memiliki lebih banyak ide untuk dicoba daripada bandwidth yang kami miliki untuk diterapkan. Menggunakan Clojure telah membantu tim kami menjadi lebih berulang dan lebih produktif, sehingga kami dapat mengirimkan lebih banyak eksperimen dan proyek daripada yang dapat kami lakukan. Saya merasa sangat beruntung karena Ladder memperkenalkan saya pada Clojure – dan saya senang melihat bagaimana Clojure dan penggunaannya terus berkembang!

Read More

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments