Berhubung ini adalah sprint terakhir dari kelompok kami, untuk mempercepat waktu penulisan saya akan memakai bahasa indonesia. Selanjutnya akan saya jabarkan poin-poin dan aktifitas penting selama saya mengerjakan Ngangkot ini sesuai poin yang ada pada lembar learning progress mata kuliah PPL. Silahkan klik post ini untuk melihat keseluruhannya.
Project visibility and idea
Seperti yang sudah diketahui, kami membuat sebuah aplikasi bernama Ngangkot yang memberikan solusi bagi permasalahan operasional yang sering menjadi penyebab terjadinya macet di jalan raya: mengetem
Solusi ini kami tuangkan dalam sebuah aplikasi android yang ditujukan bagi penumpang dan pengemudi. Aplikasi Ngangkot diperuntukkan sebagai perantara bagi penumpang yang ingin menggunakan angkot serta supir angkot, memberikan informasi lokasi tunggu si penumpang serta lokasi keberadaan angkot saat ini dengan harapan transaksi(dalam hal ini naiknya penumpang ke dalam angkot) akan berlangsung lebih efektif jika sang supir tahu calon penumpang nya ada dimana saja dan penumpang akan terbantu dengan mengetahui kondisi angkot yang ia naiki saat ini ada dimana.
Perlu diperhatikan bahwa transaksi yang terjadi saat ini mengharuskan si penumpang menunggu di suatu tempat dalam durasi waktu yang cukup lama sampai angkot yang ia tunggu terlihat dalam pandangan, atau si pengemudi angkot menunggu di suatu tempat dalam durasi waktu yang lama dengan harapan penumpang yang menaiki angkotnya lebih banyak (dengan kata lain, menunggu penumpang naik). Hal kedua dapat menyebabkan terjadinya kemacetan jika tidak diatur lokasi penungguan oleh otoritas setempat. Berangkat dari kedua hal tersebutlah aplikasi Ngangkot ini diciptakan.
Tentunya masih banyak variasi solusi yang dapat diberikan dan diintegrasikan dalam aplikasi Ngangkot ini, namun dengan keterbatasan waktu pengembangan selama 3 bulan beserta melihat kondisi tim developer saat ini, kami memutuskan untuk membatasi fitur (dalam high level) pada hal-hal berikut:
Kebisaan penumpang untuk memilih dan melihat lokasi angkot melalui peta digital
Kebisaan pengemudi angkot untuk melihat penumpang potensial melalui peta digital
Dengan dua acuan tersebut, kami memecah dan mendetilkan lagi fitur tersebut dalam user story yang menjadi backlog kami dalam 3 bulan masa pengembangan.
berikutnya, saya akan membahas metode development yang kami pakai
##Agile framework, Scrum & Test-Driven development
Dalam pengembangan, kami menggunakan varian dari metodologi Agile serta pengembangan Test-Driven. Apa maksud dari dua istilah tersebut?
Agile adalah kerangka kerja pengembangan software yang memberikan perhatian khusus pada ketidakpastian requirement dan teknologi, serta merangkul perubahan dalam mengerjakan suatu proyek pengembangan software. Dalam definisi formalnya, Agile mengharuskan terjadinya development cycle (seperti gambar diatas) yang intinya terdiri dari siklus proses planning-pengembangan-evaluasi sehingga aplikasi yang dibuat dapat terus relevan dengan permasalahan yang mungkin saja bertambah atau berganti sesuai waktu berjalan.
Dalam proyek ini, kami menggunakan salah satu implementasi Agile yaitu metodoologi Scrum.
Scrum merupakan realisasi dari kerangka kerja Agile yang menggunakan instrumen backlog sebagai alat ukur kerja dari para pengembang. Selengkapnya tentang scrum dapat dilihat di sini
Selain itu, Agile juga mempunyai nilai-nilai yang menjadi prinsip bagi implementasinya yang dapat dilihat disini sini.
Dalam implementasinya, kami menerapkan scrum dan Agile dibantu oleh asisten dosen yang bertugas sebagai scrum master. Kami membuat backlog, menjalankan scrum planning,meeting,serta retrospective, dan menjalankan best practice lainnya yang akan menjadi topik bahasan selanjutnya
Continous Integration(CI) & Continous Delivery (CD)
Continous Integration & Continous Delivery adalah praktik kerja yang bersinergi dengan prinsip-prinsip Agile yang kita implementasikan dalam pengembangan Ngangkot. CI dan CD sendiri bukan merupakan hal baru dari dunia pengembangan software, namun merupakan hal yang baru bagi kami.
CI merupakan praktik kerja yang mengedepankan otomatisasi dari proses build,test, & deploy yang menjadi konsekuensi dari implementasi Agile. Hal ini dibisakan dengan menggunakan repository remote terpusat yang menjadi codebase utama bagi Ngangkot, mewajibkan seluruh kode yang dibuat diletakkan ditempat tersebut.
Dalam mengaplikasikan CI, kami baru 99% berhasil mengimplementasikan otomatisasi build & test, untuk deployment kami masih belum benar dalam mengimplementasikannya karena masih mengandalkan alur kerja yang salah.
CD merupakan prakktik kerja yang merupakan lanjutan dari praktik CI. CD mengharuskan adanya otomatisasi pengantaran software hasil pengembangan ke pengguna, yang menyebabkan setiap update dapat langsung di kirimkan ke aplikasi pengguna sebagai konsekuenasi dari CD itu sendiri beserta CI.
Seperti yang telah disebutkan diatas, kami masih belum benar menjalankan hal ini karena masih mengandalkan fitur download artefak dari gitlab CI pipeline, yang kurang intuitif bagi user.
Saya sedang berusaha membuat server yang dapat melayani permintaan download APK dari user dengan menggunakan Node.js + Express + Google drive API di platform Heroku. Sebelumnya kami menggunakan Postgre sebelum berpindah ke Google Drive API, namun ternyata Postgre-nya Heroku tidak melayani penyimpanan Large Object
Maka, pembuatan server ini masih WIP. Ditargetkan selesai dan siap pakai pada akhir sprint.
Kendala yang saya hadapi sehingga pembuatan server ini memakan waktu cukup lama (1 minggu lebih) ialah mempelajari routing Express serta API Google drive.
Pada release nanti, kami akan melayani APK yang sudah siap install melalui server ini.
Selanjutnya, saya akan membahas alur kerja testing tim pengembang kami.
Testing with Jest for Node-based Apps
Kami menggunakan Jest sebagai framework sekaligus engine testing terotomatisasi pada proyek pengembagnan Ngangkot. Jest tergolong engine testing yang cukup unik karena dapat menggunakan Snapshot untuk melakukan testingnya.
Snapshot sendiri bekerja dengan membandingkan hasil generasi kode UI pada versi yang dites kali ini dengan kode UI pada versi yang dijadikan acuan snapshot testing (biasanya versi stable atau hasil commit sebelumnya). Hal ini sangat cocok dipakai untuk mengetes hasil commit yang banyak melakukan refactoring. Selain itu, Jest cukup mirip dengan framework dan engine testing pada umumnya, seperti Mocha + Chai dan Jasmine.
React-Native yang kita pakai sebagai platform development android untuk proyek Ngangkot ini memiliki code-code native yang tidak bisa ditest oleh Jest maupun framework dan engine testing berbasis javascript lainnya. Hal ini disebabkan code native tersebut langsung berhubungan dengan engine internal android, yang ditulis dalam bahasa Java. Hal ini mengharuskan fungsi serta library yang menggunakan native code tersebut harus di-mock. Mocking dalam Jest cukup sulit untuk dipelajari pada awalnya, karena saya belum pernah menggunakan framework testing populer baik pada javascript maupun bahasa lainnya. Namun setelah paham, ternyata mocking nya cukup intuitif asalkan kita paham inner working serta struktur dari library ataupun fungsi yang kita akan mock.
Pada gambar diatas, saya melakukan mocking untuk komponen react-native-maps. Untuk membuat komponen mock nya, saya mengembalikan komponen baru yang bernama mockmapview, yang memiliki fungsi-fungsi yang sama serta subkomponen yang sama pula(dan di-mock juga) agar benar-benar dapat menggantikan semua call ke fungsi react-native-maps.
Selanjutnya untuk melakukan testingnya sendiri, dapat dengan menggunakan fungsi test()
Pada potongan kode diatas ditunjukkan car amenggunakan describe() serta test(). Describe sendiri merupakan wrapper untuk kumpulan fungsi test yang mempunyai kesamaan. Saya memakainya untuk mengumpulkan test yang terkait satu komponen atau class yang sama.
dalam menjalankannya sendiri, dapat memanggil fungsi
Dengan sebelumnya sudah mendefinisikan script test pada package.json di root proyek yang ada.
Setelah itu, untuk mengotomatisasikannya pada gitlab CI, kita perlu memanggil fungsi tersebut pada file yaml CI kita serta pastikan juga sudah menyisipkan Jest pada devDependencies lalu menjalankan npm install agar jest sudah terinstall terlebih dulu.
– u digunakan untuk mengupdate snapshot yang dibuat.
Selanjutnya saya akan membahas salah satu library terpenting yang digunakan pada proyek ini : react-native dan react-native-maps
React-native merupakan framework pengembangan android yang dikembangkan dan digunakan oleh tim pengembang facebook. React-native memiliki beebrapa keunggulan diantaranya:
Hot reloading sehingga bisa melakukan penulisan code dan melihat hasilnya dengan luwes
Selain keunggulan, terdapat juga kekurangannya yang kami rasakan setelah 3 sprint ini, diantaranya:
Masih baru, sehingga banyak fungsionalitas yang ada di native android library via android studio yang belum 100% stabil di react-native
paradigma komponen based yang cukup kompleks dan memerlukan waktu lebih untuk dipelajari bagi yang belum pernah mengenalnya.
Nah, selanjutnya saya akan membahas implementasi react-native-maps yang merupakan library penampil map geografis seperti pada googlemaps di react-native
React-native-maps merupakan library yang dibuat oleh tim pengembang airbnb. Library ini memberikan fungsionalitas yang biasa ada pada map geografis seperti google map.
Berikut adalah tampilannya pada aplikasi kami: