Mufid Jamaluddin's Blog
Articles from mufiddj.medium.com
Photo by Zdeněk Macháček on UnsplashBahasa pemrograman C++ merupakan salah satu bahasa yang sangat populer dan banyak digunakan dalam pengembangan embedded system, terutama dalam bidang Internet of Things (IoT). Hal ini dikarenakan C++ menawarkan efisiensi tinggi, kontrol rendah-level, serta dukungan terhadap pemrograman berorientasi objek, yang sangat dibutuhkan dalam membangun perangkat dengan sumber daya terbatas seperti mikrokontroler dan sensor pintar. C++ memberikan kemampuan untuk mengoptimalkan performa perangkat keras secara langsung, yang menjadikannya pilihan ideal dalam sistem real-time dan aplikasi dengan kebutuhan pemrosesan cepat serta konsumsi daya rendah. Daftar Library Standar (Standard Library / STL) C++ yang Sering Digunakan Berikut ini adalah daftar beberapa library standar (STD Library / STL) dalam C++ yang umum digunakan, baik dalam pengembangan sistem umum maupun embedded system: <vector>Struktur data array dinamis yang memudahkan pengelolaan koleksi data dengan ukuran yang berubah-ubah. <string>Untuk manipulasi teks dan string C++ yang lebih aman dan fleksibel dibandingkan C-style strings. <array>Array dengan ukuran tetap yang lebih aman dan memiliki fitur dari STL. <map> dan <unordered_map> Struktur data asosiatif untuk menyimpan pasangan key-value, cocok untuk pencarian cepat. <queue>, <stack>, <deque> Struktur data antrian dan tumpukan yang memudahkan manajemen data dalam urutan tertentu. <algorithm> Menyediakan berbagai fungsi algoritma seperti sorting, searching, transform, dll. <chrono> Digunakan untuk manajemen waktu dan pengukuran durasi — penting dalam sistem real-time. <thread> dan <mutex> Untuk pemrograman paralel dan sinkronisasi thread, berguna pada sistem dengan kemampuan multitasking. <functional> Mendukung penggunaan fungsi sebagai objek (function objects / lambda). <iostream> dan <fstream> Untuk operasi input/output baik ke console maupun file. Kesimpulan Pemanfaatan library standar (STL) C++ secara tepat akan membantu programmer mempercepat proses pengembangan sambil tetap menjaga performa sistem (tergantung algoritmanya juga sih). Dalam lingkungan embedded, pemilihan library yang ringan dan efisien menjadi kunci keberhasilan implementasi aplikasi. Bacaan Lebih LanjutC++ Standard Library — cppreference.com
Photo by Zdeněk Macháček on UnsplashRust, Bahasa Pemrograman Terbaik (Bag #1)? Jika dari sisi fundamental seperti kemampuan tim, alur bisnis, waktu penyelesaian, dan efisiensi algoritma telah selesai atau kita abaikan, maka Rust merupakan bahasa terbaik bila dibandingan dengan C dan C++. Rust dirancang untuk keamanan memori dan performa tinggi, tanpa memerlukan garbage collector. Dibandingkan dengan C dan C++, Rust menawarkan beberapa keunggulan utama: 1. Keamanan Memori Tanpa Overhead C dan C++ rentan terhadap kesalahan manajemen memori seperti buffer overflow dan use-after-free (Szekeres et al., 2013). Rust mengatasinya dengan sistem kepemilikan (ownership) dan peminjaman (borrowing), memastikan akses memori yang aman pada waktu kompilasi. 2. Pemrograman Paralel yang Aman Konkurensi dalam C++ memerlukan kehati-hatian ekstra terhadap race condition dan deadlock (Herlihy & Shavit, 2012). Rust menjamin keamanan threading dengan sistem kepemilikan, mencegah akses data bersamaan tanpa mekanisme sinkronisasi yang jelas. 3. Compiler yang Ketat dan Informatif Rust memiliki sistem kompilasi yang ketat, menangkap kesalahan memori lebih awal dibandingkan C/C++ (Matsakis & Klock, 2014). Hal ini mengurangi bug runtime dan meningkatkan stabilitas aplikasi. 4. Ekosistem Modern Rust menyediakan alat pengembangan modern seperti: Cargo: Manajemen paket dan build yang efisien. Crates.io: Repositori pustaka yang mendukung kolaborasi. Error Handling yang Lebih Baik: Menggunakan Result dan Option untuk menghindari null dan try-catch yang rawan kesalahan (Hoare, 2009). 5. Performa Seimbang dengan Keamanan Rust mencapai efisiensi seperti C++ dengan optimasi LLVM dan tanpa garbage collector (Anderson, 2019). Ini menjadikannya pilihan unggul untuk sistem yang membutuhkan kecepatan dan keamanan. Kesimpulan Rust menawarkan keseimbangan optimal antara keamanan, performa, dan pengalaman pengembangan yang modern. Dengan mengatasi kelemahan C dan C++ dalam manajemen memori dan konkurensi, Rust menjadi pilihan menarik untuk pengembangan perangkat lunak yang lebih aman dan efisien. Referensi Anderson, J. (2019). Programming Rust: Fast, Safe Systems Development. O’Reilly Media. Herlihy, M., & Shavit, N. (2012). The Art of Multiprocessor Programming. Morgan Kaufmann. Hoare, C. A. R. (2009). Null References: The Billion Dollar Mistake. QCon London. Matsakis, N., & Klock, F. (2014). The Rust Language and Its Ownership Model. ACM SIGPLAN. Szekeres, L., Payer, M., Wei, T., & Song, D. (2013). Sok: Eternal War in Memory. IEEE Security & Privacy.
Update (Aplikasi) Mulus Tanpa Ganggu Pengguna Photo by Josh Rose on UnsplashPerbaikan aplikasi maupun perubahan dapat sangat mengganggu pengguna, dimana kenyamanan pengguna harus dipertahankan. Ada jalan supaya update aplikasi tanpa downtime dengan Kubernetes. Kubernetes menghadirkan strategi zero-downtime deployment agar pengguna tetap menikmati layanan tanpa hambatan. Strategi Efektif untuk Update Mulus Rolling Update: Ganti Pod lama ke yang baru secara bertahap tanpa menghentikan aplikasi, dapat dilakukan secara otomatis. Blue-Green Deployment: Pindahkan trafik ke versi baru setelah diuji, tanpa mengganggu operasional. Canary Deployment: Uji versi baru dengan sebagian kecil pengguna sebelum diluncurkan penuh. A/B Testing Deployment: Terapkan fitur baru untuk segmen pengguna tertentu tanpa mengganggu layanan utama. Shadow Deployment: Uji performa dan beban versi baru tanpa mempengaruhi produksi. Optimalkan Performa dengan Praktik Terbaik ✅ Readiness & Liveness Probe — Pastikan Pod baru siap & tetap sehat.✅ RollingUpdate Strategy — Kontrol jumlah Pod yang diperbarui.✅ Service Mesh (Istio) — Kelola lalu lintas dengan lebih fleksibel.✅ Kompatibilitas Data — Hindari masalah versi dengan skema database yang aman. 🚀 Dengan Kubernetes, pembaruan aplikasi berjalan lancar tanpa gangguan, meningkatkan pengalaman pengguna dan keandalan sistem Anda!
Photo by Kevin Noble on UnsplashSeringkali kita mendengar bahwa bahasa pemrograman yang dikompilasi memiliki performa yang lebih baik dibandingkan dengan bahasa pemrograman yang diinterpretasi. Secara teknis, pernyataan ini benar jika kita melihatnya dari tingkat rendah, di mana kode yang dikompilasi biasanya dieksekusi lebih cepat karena telah diterjemahkan langsung ke dalam bahasa mesin sebelum dijalankan. Sebaliknya, bahasa yang diinterpretasi menerjemahkan kode secara langsung saat program berjalan, yang dapat menyebabkan eksekusi yang lebih lambat. Namun, melihat performa hanya dari sisi ini saja tidaklah cukup. Dalam pengembangan perangkat lunak, ada faktor yang jauh lebih krusial dibandingkan sekadar perbedaan performa antara bahasa yang dikompilasi dan yang diinterpretasi. Faktor-faktor seperti kemampuan tim, alur bisnis, serta efisiensi algoritma yang digunakan memainkan peran yang jauh lebih besar dalam menentukan kesuksesan suatu proyek. Kemampuan Tim dan Produktivitas Memilih bahasa pemrograman yang tepat bukan hanya soal kecepatan eksekusi kode, tetapi juga tentang bagaimana tim dapat bekerja dengan efektif. Bahasa pemrograman yang lebih mudah dipahami dan digunakan oleh tim akan meningkatkan produktivitas dan mempercepat pengembangan perangkat lunak. Misalnya, Python yang merupakan bahasa yang diinterpretasi sering kali digunakan dalam pengembangan cepat (rapid development) karena sintaksnya yang sederhana dan ekosistemnya yang luas. Sebaliknya, bahasa seperti C++ yang dikompilasi memang memiliki keunggulan dalam hal performa, tetapi juga memiliki kompleksitas yang lebih tinggi dalam pengelolaan memori dan debugging. Jika tim tidak terbiasa dengan bahasa tertentu atau membutuhkan waktu lama untuk mengimplementasikan solusi, maka kecepatan eksekusi kode tidak akan memberikan keuntungan yang signifikan. Flow Bisnis dan Kebutuhan Aplikasi Setiap proyek memiliki kebutuhan unik yang harus dipenuhi oleh teknologi yang digunakan. Misalnya, dalam pengembangan aplikasi web, bahasa seperti JavaScript dan Python sering kali lebih cocok karena fleksibilitas dan ketersediaannya dalam berbagai framework yang mendukung pengembangan cepat. Sebaliknya, untuk aplikasi yang membutuhkan performa tinggi seperti game atau sistem embedded, bahasa yang dikompilasi seperti Go, C++ atau Rust mungkin lebih optimal. Jika suatu bisnis membutuhkan pengembangan yang cepat dengan iterasi yang sering, maka bahasa yang diinterpretasi mungkin menjadi pilihan yang lebih baik. Sebaliknya, jika bisnis memerlukan sistem yang harus berjalan dengan sangat efisien dan memiliki batasan sumber daya, bahasa yang dikompilasi bisa menjadi pilihan utama. Efisiensi Algoritma Lebih Penting dari Pemilihan Bahasa Terlepas dari apakah bahasa yang digunakan dikompilasi atau diinterpretasi, efisiensi algoritma dan struktur data yang digunakan dalam suatu program memiliki dampak yang jauh lebih besar terhadap performa. Algoritma yang buruk tetap akan menghasilkan performa yang buruk, bahkan jika ditulis dalam bahasa yang dikompilasi. Sebaliknya, algoritma yang dioptimalkan dengan baik dapat memberikan peningkatan performa yang signifikan, bahkan dalam bahasa yang diinterpretasi. Sebagai contoh, pencarian dalam daftar berukuran besar menggunakan algoritma linear search (θ(n)) akan tetap lambat, meskipun ditulis dalam bahasa yang dikompilasi. Sebaliknya, menggunakan binary search (θ(log n)) dalam bahasa yang diinterpretasi masih bisa jauh lebih cepat untuk dataset yang besar. Kesimpulan Meskipun bahasa pemrograman yang dikompilasi sering kali lebih cepat dalam hal eksekusi, pemilihan bahasa yang tepat tidak hanya bergantung pada faktor ini. Kemampuan tim, alur bisnis, dan efisiensi algoritma jauh lebih menentukan dalam pengembangan perangkat lunak. Oleh karena itu, sebelum memilih bahasa pemrograman, penting untuk mempertimbangkan kebutuhan proyek secara menyeluruh dan menyesuaikannya dengan kompetensi tim serta tujuan bisnis yang ingin dicapai.

Pada awal tahun 2018, masa liburan kuliah, saya bekerja paruh waktu di salahsatu vendor ternama di Bandung dengan teknologi ASP.NET Core. Selain itu, saya juga mulai kerja praktik (magang) pada pertengahan tahun 2018 di Jakarta dengan teknologi Java Spring, lalu kerja sebagai eksternal ASP.NET MVC Developer pada 2019, serta kerja di salahsatu perusahaan multifinance pada pertengahan tahun 2020 dengan teknologi Java Quarkus. Secara singkat, apakah ada perbedaan diantara keduanya, selain bahasa pemrograman C# vs Java atau ASP.NET vs Spring/Quarkus? Berikut perbedaannya. Asinkronus / Reaktif Teknologi yang satu ini sangat populer daripada multi-thread biasa karena klaim bisa handle banyak request dari pengguna. Bagaimana perbedaan implementasi antara Quarkus dan ASP.NET Core? ASP.NET Core Pada ASP.NET Core, cara set asinkronus sangat mudah, pertama adalah batasi jumlah Thread, jadikan semua method controller itu Async Task, dan gunakan tipe data IAsyncEnumerable. https://medium.com/media/8283f0d331daa7ca7debc1cf40e0be11/hrefJava Quarkus Untuk reactive di Java, menggunakan multiny, dimana setiap return reaktif itu harus pakai Uni<T> dan Multi<T> serta lewat Uni.createForm / Multi.createForm . @ApplicationScopedpublic class WheaterController { public Uni<String> getWheater(String name) { return Uni.createFrom().item(name) .onItem().transform(n -> WheaterService.get(name)); }} Gimana, perbedaannya? menurut saya pribadi, ASP.NET Core terlihat lebih sederhana. Hemat Alokasi Memori pada Collection Jawaban yang pasti adalah pakai kelas IAsycEnumerable pada bahasa pemrograman C# atau pakai kelas Stream pada pemrograman Java. Alih-alih semua hasilnya disimpan di memori RAM, kedua kelas tersebut memungkinkan untuk mengalirkan datanya untuk proses selanjutnya tanpa harus menunggu semua data masuk memori. Berikut contoh pada C#: https://medium.com/media/30f778a91ade871d69f07ca29e8e44f6/hrefSedangkan pada Java: Stream<Book> books = session.createQuery("SELECT b FROM Book b", Book.class).stream(); books.map(b -> b.getTitle() + " was published on " + b.getPublishingDate()).forEach(m -> log.info(m)); Dependency Injection Dependency Injection merupakan hal yang umum di dunia Object Oriented programming. Dengan ASP.NET Core, kita tinggal daftarin di startup service.addScoped[1] sedangkan Quarkus perlu pakai anotasi semisal@ApplicationScoped di atas setiap kelas yang terkait [2]. Single File Deployment Pada ASP.NET Core, kita bisa buat file binary dari satu project besar dengan command line bawaan ASP.NET sehingga dapat dijalankan secara mandiri [3]. Berikut merupakan contoh command untuk membuat satu file binary untuk OS Linux x64. dotnet publish -c Release -r linux-x64 -p:PublishSingleFile=true --self-contained true Jalankan satubinary Web ASP.NET dengan konfigurasinyaJalankan Swagger ASP.NET Core dari single binaryUntuk Quarkus, kita harus instalasi Oracle GraalVM, baik saat awal atau pas eksekusi command dengan docker image GraalVM terpisah [4]. Kesimpulan Terlepas dari perbedaan keduanya, baik ASP.NET Core (C#) maupun Quarkus (Java) sama-sama framework web enterprise dengan mindset Object Oriented yang beda style. Referensi [1] Dependency Injection ASP.NET Core (C#) Sisi Magis ASP.NET Core: Dependency Injection [2] Dependency Injection Quarkus (Java) Contexts and Dependency Injection [3] Single File Application Binary ASP.NET (C#) Single file application - .NET [4] Single File Application Binary Quarkus (Java) Building a Native Executable [5] GraalVM GraalVM