Sprint 3 : Week 4 — Summarization

Penerapan Agile Principles

Sebagaimana pembahasan sebelumnya, Agile Development memiliki 12 principles yang hendaknya dijalankan pada salah satu metode seperti Scrum.

12 principle tersebut ialah :

  1. Satisfying ‘customers’ through early and continuous delivery of valuable work.
  2. Breaking big work down into smaller components that can be completed quickly.
  3. Recognizing that the best work emerges from self-organizing teams.
  4. Providing motivated individuals with the environment and support they need and trust them to get the job done.
  5. Creating processes that promote sustainable efforts.
  6. Maintaining a constant pace for completed work.
  7. Welcoming changing requirements, even late in a project.
  8. Assembling the project team and business owners on a daily basis throughout the project.
  9. At regular intervals, having the team reflect upon how to become more effective, then tuning and adjusting behavior accordingly.
  10. Measuring progress by the amount of completed work.
  11. Continually seeking excellence.
  12. Harnessing change for competitive advantage.

Pada kali ini saya akan memaparkan penerapan beberapa principle dari 12 principle tersebut :

2. Breaking big work down into smaller components that can be completed quickly.

Dalam project ini, kami telah membagi beberapa pekerjaan yang besar menjadi lebih sederhana. Misalnya pada user story berikut.

Sebagai admin fakultas, saya dapat memantau perkembangan aplikasi CYD

User story tersebut kemudian dibagi menjadi task sederhana diantaranya :

  • Implementasi halaman pemantauan untuk pengajuan diproses
  • Implementasi halaman pemantauan untuk pengajuan diterima
  • Implementasi halaman pemantauan untuk pengajuan dikembalikan
  • Implementasi halaman pemantauan untuk pengajuan dibatalkan
  • Testing

3. Recognizing that the best work emerges from self-organizing teams.

Pada tim kami, setiap anggota memiliki bagiannya sendiri dan senantian memberikan ide nya masing — masing terhadap pekerjaannya. Setiap kali ingin memulai suatu pekerjaan, tim kami membuat semua menurut nya sendiri, kemudian jika ada keraguan dari user story maka dilanjutkan diskusi pada LINE atau berbicara saat di kuliah. Pada akhirnya kami melakukan evaluasi setelah seluruhnya selesai, mengevaluasi apakah satu sama lain ada yang tidak sesuai atau perlu tambahan lebih lanjut untuk menghubungkannya.

Microservices dan Testing

Implementasi Microservices sebenarnya sudah dilakukan tepat 1 minggu setelah Individual Review terakhir. Kami mempelajari dari Martin Fowler mengatakan bahwa terdapat Componentization terhadap project. Mengacu pada hal tersebut, Django memiliki struktur project yang terdiri dari beberapa aplikasi. Sehingga dilakukan restrukturisasi project menjadi berikut ini.

lipsy/
manage.py
lipsy/
__init__.py
settings.py
urls.py
wsgi.py
app/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
    fakultas/
__init__.py
controllers/
__init__.py
templates/ fakultas/
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
    sdm/
__init__.py
controllers/
__init__.py
templates/ sdm/
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
dgb/
__init__.py
controllers/
__init__.py
templates/ dgb/
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
api/
__init__.py
controllers/
__init__.py
templates/ api/
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
login/
__init__.py
controllers/
__init__.py
templates/ login/
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py

Pada saat melakukan restrukturisasi tersebut, saya sangat terbantu adanya testing. Awalnya testing akan menjadi merah mengindikasinya adanya perubahan yang perlu dilakukan, misalnya mengganti path untuk import controllers.

Path relative karena hanya ada satu aplikasi
path memerlukan routing ke aplikasi fakultas supaya lebih jelas dan models dari aplikasi app

Dengan adanya testing ini, semua menjadi lebih mudah sehingga dapat restrukturisasi sekitar 1–2 hari dengan fungsionalitas yang sama persis. Dan pada pengembangan selanjut kami tetap meneruskan TDD seperti skema dibawah ini.

Skema TDD

Code Standardization

Dalam proses pengembangan kami telah memiliki beberapa standar dalam layouting :

  1. Nama variabel dan fungsi menggunakan snake case

2. Untuk setiap file dan fungsi pada controller ditulis dengan format <role>_<verb>, sedangkan nama fungsi yang berlaku general berupa verb yang dibutuhkan.

setiap file mengacu pada format <role>_<verb> diikuti snake case jika verb panjang
Begitu pula dengan nama fungsi mengikuti format <role>_<verb>

3. Indentasi dengan tab 4 space, sebagaimana aturan dasar dari pemrograman python

4. Import tepat satu module per baris, namun boleh lebih dari satu untuk sub module

import tepat satu module, ex. _thread, dan boleh banyak submodule, ex. from app.models import …

5. Khusus untuk penamaan class, kami menggunakan aturan CamelCase.

Staging Server and User Acceptance Testing

Staging server merupakan server yang digunakan untuk melakukan test terhadap website. Pada kesempatan kali ini, kami menggunakan VPS sebagai Staging Server pada IP http://139.59.231.183 . Staging server di setup menggunakan app containerization Docker. Hal ini bertujuan untuk memudahkan setup dan aplikasi menjadi lebih adaptif karena memiliki environment yang sama antara server dan localhost.

Pada pengembangan kami turut pula menerapkan Continous Integration dan Continous Delivery. Sehingga setiap terdapat pembaharuan pada salah satu branch yang dituju, dapat langsung dilakukan test dan meneruskanya kepada Staging Server.

User Acceptance Test merupakan verifikasi kebenaran aplikasi sesuai dengan customer. UAT telah dilakukan pada akhir Sprint Review 2, dimana client mendapati demo secara langsung dan kemudian mengoreksi beberapa user story dan menerima sebagian yang lain. User Story yang didapati kurang memuaskan adalah sebagai berikut.

Sebagai DGB, saya dapat mengatur isian form sesuai aturan DIKTI

Pada sekarang ini, user story tersebut sudah diperbaiki implementasi nya untuk selanjutnya akan diverifikasi ulang apakah telah memenuhi requirement client.

Control Version System Flow

Pengembangan aplikasi Scrum dapat menggunakan Control Version System, salah satunya adalah Git. Menurut Martin Fowler, terdapat beberapa panduan agar Git dapat dimanfaatkan secara efektif dalam Scrum. Diantaranya adalah sebagai berikut,

Simple (isolated) Feature Branch

Idenya adalah membuat suatu branch baru setiap kali mulai untuk mengerjakan suatu feature atau User Story dari branch utama, misalnya kita namakan develop. Implementasi dari task — task terkait dikerjakan pada branch tersebut. Setelah selesai branch tersebut di resolve merge conflict terhadap branch develop, barulah melakukan merge request pada Git untuk selanjutnya dikoreksi oleh Tim dan digabungkan seluruh fitur yang ada. Berikut ini feature branch yang kami buat

setiap feature memiliki branchnya masing — masing

Continous Integration

Continous Integration merupakan praktisi bagi developer untuk mengintegrasi kan kode pada repository beberapa kali. Setiap ada kode baru yang dipush, maka secara otomatis dilakukan validasi oleh sistem, sehingga dapat terhindar dari beberapa masalah contohnya merge conflict. Pada pengembangan UI-LIPSY berikut dapat dilihat bahwa developer senantiasa mensinkronisasi seluruh kode nya terhadap branch yang mau dimerge, kemudian baru dilakukan merge request.

terdapat 4 feature branch di merge ke branch develop

Authentication & Role Management

Bila suatu situs memiliki akun didalamnya kita perlu adakan autentikasi sekaligus dengan role management. Pada UI LIPSY, autentikasi dilakukan menggunakan framework Django. Hal ini bertujuan untuk memudahkan Account Management yang sudah dibuat sedemikian baik oleh Django.

Authentication pada Django diimplementasikan dengan framework django-oauth-toolkit. Framework tersebut sangat cocok di implementasikan pada aplikasi dengan Webservice API. Selain itu, dengan django-oauth-toolkit implementasi akan berbasis pada Open Authentication, yaitu dapat membuka API bagi aplikasi lain dengan authentikasi.

Cara instalasi nya pun cukup mudah. Berikut hal yang perlu dilakukan. django-cors-middleware perlu dimasukkan karena django-oauth merupakan middleware yang memerlukan handle untuk CORS ORIGIN Exception.

pip install django-oauth-toolkit django-cors-middleware

Tambahkan oauth2_provider and corsheaders pada installed apps di settings.py

INSTALLED_APPS = [
'fakultas',
'dgb',
'sdm',
'app',
'api',
'account',
'rest_framework',
'rest_framework_swagger',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'oauth2_provider',
'corsheaders',

]

Tambahkan Cors midleware

MIDDLEWARE = (
# ...
'corsheaders.middleware.CorsMiddleware',
# ...
)

Kemudian kita hanya perlu melakukan penyesuaian pada urls.py, sehingga aplikasi dapat mengalihkan url ke middleware. Voila! login feature sudah dapat digunakan.

Pada implementasi oauth, kami menggunakan relasi OneToOne pada Model sehingga model Admin yang sudah ada akan memiliki relasi terhadap model Users pada middleware oauth, berikut adalah sumber kode nya.

class Admin(models.Model):
user_id = models.OneToOneField(User, on_delete=models.CASCADE)
nip = models.CharField(max_length=18)
role = models.ForeignKey(Role, on_delete=models.CASCADE)
faculty = models.ForeignKey(Faculty, on_delete=models.CASCADE)

Decorators Pattern

Pada Django terdapat decorator untuk memudahkan pembacaan kode. Misalnya pada authentication secara default, terdapat decorator @login_required. untuk memastikan bahwa user login sebeum fungsi yang dijalankan.

@login_required 
def home() :
return HTTPResponse(200)

Pada implementasi authentication kami membuat sebuah decorator custom sehingga dapat mengeksekusi fungsi hanya jika user sudah login dan memiliki role yang benar. Beberapa decorator yang kami definisikan adalah sebagai berikut.

def sdm_login_required(view_func):
role_login_required = user_passes_test(lambda u: True if is_sdm(u) else False,
login_url=settings.LOGOUT_REDIRECT_URL)
decorated_view_func = login_required(role_login_required(view_func), login_url=settings.LOGOUT_REDIRECT_URL)
return decorated_view_func


def dgb_login_required(view_func):
role_login_required = user_passes_test(lambda u: True if is_dgb(u) else False,
login_url=settings.LOGOUT_REDIRECT_URL)
decorated_view_func = login_required(role_login_required(view_func), login_url=settings.LOGOUT_REDIRECT_URL)
return decorated_view_func


def fakultas_login_required(view_func):
role_login_required = user_passes_test(lambda u: True if is_fakultas(u) else False,
login_url=settings.LOGOUT_REDIRECT_URL)
decorated_view_func = login_required(role_login_required(view_func), login_url=settings.LOGOUT_REDIRECT_URL)
return decorated_view_func

Pemakaiannya adalah sebagai berikut

@sdm_login_required
def retrieve_cyd(req):
processed_applications = sdm_controller.get_processed_applications()
canceled_applications = sdm_controller.get_canceled_applications()
processed_applications_pagination = p.pagination(req, "processed_page", processed_applications)
canceled_applications_pagination = p.pagination(req, "canceled_page", canceled_applications)

Pada kode tersebut decorator @sdm_login_required, digunakan sehingga user yang ingin meretrieve cyd harus login dan memiliki role sebagai SDM. Jika tidak login maka user akan diteruskan login page. Jika sudah login namun bukan role SDM, maka diteruskan ke login page dan kemudian diteruskan ke home page SDM.

Error Codes

Beberapa error code kami definisikan untuk memudahkan mengidentifikasi error. Error diambil pada kode 512–599 karena error code kepala 5 identik dengan internal server error. Berikut beberapa error code yang kami definisikan pada file app/errors.py

Product Packaging & Installer

Program UI-LIPSY sejak sudah menggunakan App Containerization Docker. Untuk instalasi lebih lanjut yang diperlukan adalah sebagai berikut ini.

  1. Install Python 3.x
  2. Install Docker and Docker Machine
  3. Open your docker command line and type docker pull pplc3/ui-lipsy:latest
  4. Create your container by typing docker run -t — name=lipsy pplc3/ui-lipsy:latest
  5. Attach your docker named lipsy , docker attach lipsy
  6. Install all required packages pip3 install -r req.txt
  7. start Apache and Postgre SQL in docker , sudo service apache2 start && service postgresql start
  8. Voila! open http://localhost:8080 your favorite browser

The Importance of Testing and Code Coverage

Unit testing merupakan metode testing yang dilakukan dengan prinsip white-box. Unit testing ditujukan untuk menguji fungsionalitas dari suatu program dan bukan menguji end to end atau integration testing. Unit testing menjadi sangat penting dalam pengembangan aplikasi karena kita perlu memastikan bahwa behaviour program sesuai dengan definisi yang sudah kita sepakati sebelumnya, sehingga dapat konsisten menghasilkan program berkualitas.

Salah satu keuntungan lain dari menggunakan unit testing ialah kita melakukan testing secara terisolasi artinya tidak bergantung terhadap testing lainnya. Hal itu bisa terlihat terutama pada database testing yang berbeda dengan database yang asli. Dan untuk setiap testing, dapat diasumsikan bahwa data sama sekali belum dimasukkan atau masih kosong. Ketika fungsi belum diimplementasikan, kita dapat menggunakan mock yaitu membuat suatu fungsi seolah — olah memiliki behaviour yang sama dengan fungsi yang akan diimplementasikan.

contoh tag untuk test dan implementasi

Code Coverage adalah eksplorasi lebih lanjut dari unit testing. Seringkali walaupun sudah menggunakan unit testing, kita tidak mengetahui apakah test sudah mengcover seluruh kode. Agar supaya tidak ada satupun baris kode yang miss, kita perlu mengukur nilai code coverage. Code coverage biasanya sudah disertakan dalam development framework atau testing framework yang digunakan. Misalnya dalam Django, sudah terdapat program code coverage yang dapat langsung dipanggil melalui command di terminal dengan memanfaatkan modul manage.py.

Untuk menjalankan code coverage pada Django dapat digunakan perintah berikut.

coverage run manage.py test

Berikut adalah hasilnya.

coverage report
88% coverage pada total

References

Like what you read? Give Ryorda Triaptahadi a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.