#8 EPISODE KHUSUS: format baru! diskusi tentang kode baik

Posted: June 8th, 2009 | 33 Comments »
Ariya Hidayat, Hendry Luk, Ronald Widha
Ariya Hidayat, Hendry Luk, Ronald Widha

Recorded 6 June 2009 (47 menit 34 detik)

Di episode spesial TemanMacet kali ini, saya berbicara dengan host Teman Macet baru Ariya Hidayat dan Hendry Luk membahas tentang masa depan Teman Macet dan berdiskusi tentang definisi kode baik. Ada sisipan profile pendengar kita juga: Ganius Tanuel

dengarkan langsung di sini:
 

Download

mp3 hi quality (33mb)
mp3 lo quality (9mb)
transkrip

Show Notes

Asp.net MVC
Asp.net Webform
Convention over configuration
Domain Specific Language (internal/external DSL)
Google I/O keynote video
Google Web Toolkit
Oslo DSL
QT API Design
QT API
Script#
Ganius Tanuel


  • http://www.ronaldwidha.net/askbobo ronaldwidha

    apa definisi kode baik menurut kamu?

  • hansen

    kode baik = (1).bug seminimal mungkin (2).kalo bisa ngak ada bug (mungkin ngak ya?) (3).kalo ngak mungkin, lihat no.(1)

  • http://twitter.com/ronaldwidha Ronald Widha

    wah intriguing nih.
    menurut kamu gimana caranya supaya kode ga ada bug-nya? atau gimana caranya meminimalisasi bug?

  • http://www.facebook.com/profile.php?id=610064982 Sonny Ariady

    Kode yang baik bagi saya tentunya mudah dibaca tidak hanya developer yg membuat kode itu saja, tetapi juga para maintainer dr software tersebut dan ingin menggunakan kode itu untuk diambil sebagian fungsionalitasnya. Perangkat lunak tentu harus terdefinisi dengan baik apa fungsinya,disain juga harus baik. Kode yang baik harus efektif juga, dalam penggunaan resource memori. Pada OO tentu perlu membaca buku mengenai Refactoring dari Martin Fowler,baru lah akan mendapatkan kode OO yang baik.

  • http://twitter.com/ronaldwidha Ronald Widha

    penjelasan yang sangat mendalam. pengen aku bahas bbrp point di situ

    > Perangkat lunak tentu harus terdefinisi dengan baik apa fungsinya
    dengan dokumentasi? atau mungkin penamaan?

    > Kode yang baik harus efektif juga, dalam penggunaan resource memori
    masih relevan ga dengan jaman managed memory framework modern? cukupkah kita percaya sama garbage collectornya framework?

  • irwansyah

    Usul, lebih dibahas dong prinsip-prinsip membuat framework hebat seperti Qt!!!! Software engineeringinya seperti apa? Code reviewnya bagaimana? bagaimana untuk mengimbangi antara kesempurnaan dengan schedule?

  • http://twitter.com/ronaldwidha Ronald Widha

    Irwansyah, sudah diliat belum show notes-nya di atas?
    Ariya masukin link ke api design principlesnya yang dipakai di QT http://qt.gitorious.org/qt/pages/ApiDesignPrinc…

    Akan dibahas lebih lanjut. ayo tambahin usul2nya lagi!

  • http://dedikecil.web.id/ dedi

    Kode yang baik bagi saya simpel aja: Simpel dan jalan sesuai kebutuhan. Hihi. Pis…

  • http://www.bataviasoft.com/ Fajar Ramadhany

    kalo buat saya yg paling penting adalah continuity dan cost (development & maintenance).

    kode yg baik / aplikasi yg baik… adalah aplikasi yg transparan dan bisa di maintain oleh semua level developers dan dokumentasi yg juga di jaga. Dengan menggunakan cara2 yg sudah umum dan reusable code / framework bisa membantu maintainability aplikasi dan supaya nggak buang2 waktu dan uang untuk membuat hal2 yg sebenarnya tidak perlu di buat sendiri.

    Hal2 ini adalah yg buat saya paling penting untuk menilai aplikasi / kode.

  • http://ariya.blogspot.com/ Ariya

    Sebenarnya kriteria untuk menentukan apakah suatu kode itu baik atau tidak juga harus bisa dianalis secara kuantitatif, alias ada metrics-nya.

    Misalnya untuk kategori “readable”, bagaimana menentukan apakah sebuah potongan kode itu readable atau tidak? Kalau hanya mengandalkan penilaian developer yang lain, kan ini jadinya subyektif. Contoh metrics untuk readable: nama variable bukan singkatan aneh (iLpCnt vs loopCount), mengikuti coding style (indentasinya konsisten), ada dokumentasi tiap fungsi (untuk javadoc/doxygen), dan sebagainya.

    Sama dengan “maintainable”. Ini kan terminologi yang abstrak. Contoh metrics untuk maintainable: tidak ada nested if/else lebih dari 2 level (harus direfactor), thread safe (menghindarkan “kejutan” saat terjadi locking), tiap fungsi ada unit testnya, dan seterusnya.

    IMHO penting di tiap team atau project untuk mendefinisikan hal-hal seperti ini sekuantitatif mungkin (faktor subyektif pasti selalu ada). Contohnya link yang sudah diberikan (kasus desain API di Qt): http://qt.gitorious.org/qt/pages/ApiDesignPrinc…

  • http://hendryluk.wordpress.com/ Hendry Luk

    Citation du jour: Any fool can write code that a computer can understand. Good programmers write code that humans can understand
    Yup… Martin Fowler..

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    setuju. occam razor : Of several acceptable explanations for a phenomenon, the simplest is preferable – sumber: wikipedia

    http://en.wikipedia.org/wiki/Occam's_razor

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    salah satu topik yang belum sempet kejar tayang (interestingly enough, dibahas sama Hendry Luk jg) adalah metrics. Kita ngobrolin dari sisi tooling (NDepend untuk dot net) untuk melihat metrics2 seperti dependency matrices dan cyclomatic complexities. kita bisa selipin kapan2 kali ya?

  • http://navinot.com/ Toni @ NavinoT

    Aku blm denger podcastnya, tapi menurutku kode yang baik adalah yang serve its purpose. Maksudku, jangan code demi memenuhi jargon semata. Eg: hello world bisa ditulis dgn berbagai macam cara.

    #programmer gadungan yang kadang mimpi c++

  • http://twitter.com/gtanuel gtanuel

    > masih relevan ga dengan jaman managed memory framework modern? cukupkah kita percaya sama garbage collectornya framework?

    Masih. Problem yang ingin dipecahkan oleh GC itu, secara kasar, hanya mengenai de/alokasi memory. Efektifitas penggunaan memory itu problem jenis lain yang tergantung tujuannya.

    Contoh simplenya membaca/memroses banyak file teks dalam satu operasi. Buffer/memory yang disiapkan bisa mulai dari 1 line, sekian kilobytes, 1 file, sampai semua file sekaligus. Dalam hal ini, “kode yang baik” jadi subyektif lagi, misalnya untuk kepentingan ad-hoc/jarang dijalankan, saya biasanya hajar saja scripting WSH untuk strvar = stream.ReadAll(), mengurangi plumbing while !eof. Bahkan kalaupun scriptnya akan sering dijalankan, selama input yang diharapkan relatif kecil (misalnya < 10MB), masih bisa dianggap “baik”. Pendekatan yang sama akan jadi “jelek” kalau misalnya dipakai dalam embedded programming. Di sini jumlah memory yang tersedia lebih relevan daripada masalah memory-nya managed atau tidak.

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    valid point. ini menekankan kerelatifitas-an definisi kode baik tersebut.

    sekedar entertaining that argument ;) … sifat yang gete jelasin kan limitasi GC modern jaman skrg. My point was, dengan kemajuan jaman bukankah seharusnya ini menjadi tanggung jawab framework untuk bisa mengatur memori dengan lebih baik. Mungkin melalui reference counter atau semacemnya, GC bisa lebih agresif membersihkan memori yang sudah tidak dibutuhkan.

    bukankah ini merupakan salah satu jenis persistence ignorance jg?

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    gimana komennya setelah mendengarkan podcastnya?

  • http://hendryluk.wordpress.com/ Hendry Luk

    Sedikit promosi couldn't hurt.. post gw tentang NDepend ada di http://hendryluk.wordpress.com/2009/04/28/ndepe…
    NDepend adalah topik yg challanging buat diconvey lewat audio podcast karna naturenya yang visual banget. Mungkin bisa liat2 dulu di sana buat dapet big picture apa yg dingomongin di podcast episode NDepend… dan hubungannya dengan code-quality.
    Toolling bisa ngebantu buat code quality. Gak perlu lagi ngeraba2 dengan teori2. Tool kayak NDepend dan teknik kayak TDD bisa ngasih hard evidence buat ngedukung argument kita tentang code smell yang otherwise cuma bergantung instinct.

  • http://ariya.blogspot.com/ Ariya Hidayat

    Menarik juga nih.

    Static code analyzer adalah tool yang sangat berguna, sayangnya untuk dunia C++ belum ada yang cukup powerful dan open-source, walaupun ada yang seperti Dehydra yang makin lama makin canggih.

    Ronald: ini bisa jadi topik menarik nih: static code analyzer apa saja yang ada di pasaran? Bagaimana cara kerjanya? Perlu cari nara sumber… :-)

  • http://hendryluk.wordpress.com/ Hendry Luk

    On that note, IMO TDD itu shortcut buat good design. Gak perlu lagi baca buku tebel2 ato baca teori2 software engineering. Code yang gampang ditest automatically adalah code yang bagus.
    Code yang jelek penuh dependencies, dan buat execute dan memahami specific part of the application mesti ngejalanin dulu serangkaian screen ato belasan line of setup code. Ini code yang punya tight coupling dan susah banget dimaintain.

    Gak peduli teori2 software engineering, ultimate goal dari good code adalah kalo setiap komponen dari application itu bisa langsung di instantiate gitu ajah, tanpa perlu setup object laen yang gak berhubungan, dan langsung bisa dicolek2 sesuka hati dan langsung muntahin result yang bisa dievaluate. Tanpa sadar kita lagi ngomongin loose-coupling.

    Real world case:
    Gw pernah (actually saat ini masih) deal dengan class yang namanya CustomerActivationService… yang punya direct coupling ke data-access, TML (EAI), IIM (inventory), IAM (network), QAS (address-validation), decision-intelect (credit-check), 5-6 configuration files, HttpSession, beberapa static objects dan Globals. Freakin god of the universe.
    Tight coupling!… Semua component ini cuma bisa dibaca dan dimengerti together. Kalo developer pengen tau.. apa sih yang terjadi dengan customer-activation kalo inventory kehabisan stock? Easy: run freakin belasan screens di browser dan pasang debugger.
    Tiap kali code ini adalah the heart of the system (CRM), dan code ini berubah terus tiap saat, dan tiap kali, user mesti “ngetes” dengan ngejalanin belasan screen dalam trial n error fashion.

    Apa hubungannya dengan TDD?
    Code ini gak testable. Definisi gak testable adalah, lo mo verify apa yang terjadi kalo inventory kehabisan stock, tapi sebelom gw bisa get anywhere near there, gw mesti setup ratusan objects, flags, nulis fake backend, setup database state, dan memenuhi berbagai validation criteria… yang sama sekali gak berhubungan dengan apa yang gw pengen verify. As soon as lo ngelibatin object2 yang gak berhubungan dengan apa yang pengen lo verify, ini adalah sign of pain.

    Gw mau gw bisa immediately instantiate class gw on the spot, dan evaluate apa yang terjadi kalo kita stub inventory.acquireProduct() dengan out-of-stock. Ini maksa kita buat berpikir dalam layer. Class kita mesti dikompress sekecil mungkin. Data-access disembunyiin di balik “collection” semantic (i.e. repository). Segala macem configuration gak boleh leaking ke domain layer.
    Domain layer adalah layer dimana lo pengen bisa maen2 dengan berbagai business scenario.. dan mo mau completely ZERO infrastructure disana.

    Dan before you know it, code yg mo lo execute tiba2 tinggal: orderService.AddProduct(shoppingDetail, product, quantity, inventoryManager). Terisolasi dalam komponen kecil yang bisa dicolek2 sesuka hati dengan berbagai business scenario, dan lo tinggal observe apa hasilnya instantly. Gak ada database, gak ada configuration file, gak ada backend services, gak ada Globals dan HttpSession yang lo mesti setup.

    Dan I bet code ini gampang dibaca oleh manusia biasa. TDD maksa kita think small. Tiap component berada pada ukuran yang bisa dicerna dengan sekali pandang.

    TDD adalah shortcut buat good code. Kita gak perlu ngerti teori kenapa class ini mesti dipisah jadi multiple layers, napa mesti abstract dependency jadi interface, napa dependency-injection. Goal kita cuma 1: setiap component mesti bisa diinstantiate dan dicolek2 dalam isolation…

    “Colek2 dalam isolation” bukanlah reference ke aksi senonoh. Sebagian menamai aksi ini sebagai:… yes, “unit-test”!

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    apakah tdd di dynamic languages akan memiliki efek yang serupa berhubung fleksibilitasnya dalam menginjeksi dependensi saat runtime?

    guwe bisa ngeliat bhw coding dengan spesifik goal in mind akan membantu, tapi akan tetap butuh disiplin yang lebih untuk mendapatkan benefit yang sama ketika diaplikasikan di staticly type language.

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    si Hendry bisa ngebahas soal NDepend lagi nih. ada ide para teman macet? mungkin ada yang merelakan diri untuk diajak diskusi? (-:

  • http://hadiariawan.web.id/ ariawan

    episod ini kereenn… manteblah temanmacet.com..
    btw, facebook connectnya kok blom bisa yas mas ronald?

  • http://twitter.com/gtanuel gtanuel

    Sebenarnya yang mau aku tekankan itu: GC hanya mengatasi satu jenis masalah dengan memory: alokasi/dealokasi. Sedangkan efektifitas (efisiensi mustinya kali yak) penggunaan memory itu masalah di daerah lain (atau mungkin superset-nya). Dalam contoh baca file(s), kalau memang code-nya secara barbar menampung isi semua file di memory sekaligus, GC secanggih apapun nggak bisa apa-apa karena memory-nya memang masih ditandai aktif terpakai. Nanti ada komponen lain yang ikut campur misalnya caching/paging, yang sebenarnya mungkin nggak perlu (tanda2 code jelek).

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    ariawan, wah teman macet butuh nih teman2 kayak kamu. hehe.
    sudah dibenerin. coba lagi donk.

  • http://twitter.com/gtanuel gtanuel

    (OOT) Protes: yang “teman macet” itu situ, kita “temannya teman macet” :)

    Selain untuk quality, di ranah gue kerja, code analyzer juga berguna buat 'mengukur' keamanan codenya. Cuma, selain spesifik ke webapp, buanyak false positive-nya. Tapi kalau mau cover, bisa lihat2 code analysis tools di CWE http://cwe.mitre.org/compatible/organizations.html

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    teman itu duplex loh..saya teman kamu, kamu teman saya
    apa teman temin?
    saya teman macet..kamu temin macet?
    ;)

  • http://hadiariawan.web.id/ ariawan

    Sip.. FB connect-nya udah bisa.. yeeey!
    Episod paling dahsyat..
    Posting panen komentar paling banyak.. hehehe..

    Cheers,
    Temannya temanmacet :p

  • http://blog.neofreko.com neofreko

    Obviously, the show is GREAT. tapi mulai getting out of my league. Masalah klasik programmer gadungan.

    BTW, I'm quite new loh dgn unit testing. Dengernya sih udah dari jaman jadul tapi best practise-nya belum gitu ngerti. Apa ada syarat tertentu untuk memnafaatkan Unit test ini? Mungkin skala aplikasi atau justru arsitektur? I tried a bit few years back. But it's getting on my way. Maybe I did it wrong.

    Share the light please? :)

  • http://www.ronaldwidha.net/askbobo ronaldwidha

    di staticly type language, untuk ngelakuin unit testing *dengan mudah* (ini kata kuncinya) sebuah class harus focused dan loosely coupled. biasanya ini dilakukan dengan menginjek dependensi-nya dari luar.

    di staticly type language ini mendorong konsep2 seperti inversion of control, separation of concern, dsb.

    akhirnya seperti post panjang hendry di atas. contribute to better design = test driven design.

    ini adalah salah satu contoh unit testing:
    http://www.ronaldwidha.net/2009/03/22/aspnet-mv…

    di obrolan bersama hendry Luk yang belum keluar kayaknya kita sempet ngebahas behavior driven design yang menyempurnakan teknik ini dengan menghilangkan kata 'test'-supaya ga ambigu, dengan kata behavior. unit test berubah dari 'ngetes sesuatu' menjadi 'spesifikasi dari sesuatu'

    misanya method di unit test:
    [TestFixture]
    class studentTest
    {
    [Test]
    public void enrolStudentBodohHarusDitolak() {}
    }

    sedangan di behavior driven menjadi:
    [TestFixture]
    class WhenEnrollingStudentBodoh
    {
    [Test]
    public void ShouldDitolak() {}

    [Test]
    public void ShouldKirimSuratKeOrangTua() {}

    [Test]
    public void ShouldNotBalikinDuitRegistrasi() {}
    }

  • http://twitter.com/heryakidon Hery

    >> Perangkat lunak tentu harus terdefinisi dengan baik apa fungsinya
    > dengan dokumentasi? atau mungkin penamaan?

    kalo aku bilang ya. mungkin dengan penamaan yg baik. yg self-describe.
    kalo dokumentasi sekarang ga perlu terlalu extreme deh.. apalagi dengan agile aproach.
    but faktor laen mungkin tergantung dari projectnya juga..

    @ronald: the podcast is awesome man…. begitu baca judulnya lgs gw lompat dari 1 ke 8..

  • http://hendryluk.wordpress.com/ Hendry Luk

    Btw, 2 minggu lalu NDepend baru ajah release versi C++ nya. CppDepend.
    http://www.cppdepend.com/

  • http://hendryluk.wordpress.com/ Hendry Luk

    Btw, 2 minggu lalu NDepend baru ajah release versi C++ nya. CppDepend.
    http://www.cppdepend.com/