Salam
Aku baru je bagi light talk sambil makan tentang kepentingan role dalam team aku, tak tahu la dia org faham ke tak..sebab tak de slide presentation..tak de white board .. yang ada hanyalah lauk pauk :)
Aku nampak keberkesanan apabila dah setkan dlm minda apabila modelkan design antara element penting ialah mendefina role yang terlibat dalam sesuatu context. Pengalaman yang cukup beharga ialah di fasa kedua consultation project aku.Easy for me to write unit test dan easy untuk patch bugs. Walau dalam agreement aku hanyalah consultant tetapi ntah macam maner aku juga terpaksa menjadi developer apabila, beberapa developer lain dapat offer yang lagi bagus.Dalam fasa kedua approach aku ialah Role menjadi first class citizen.Tiada context jika kita tak berupaya mencari Role.
Imbasan sejarah. Aku tahu tentang penggunaan/kepentingan role dahulu sebelum Melaka diiktiraf sebagai negeri Maju iaitu sebelum 20/10/2010 jam 2010. Pada zaman tu Melaka belum ada lagi Eye on Melaka (Skrg nie dah bangkrap dan kena saman), aku pun masa tu programmer biasa naik motosikal 110cc je. Bila aku diperkenalkan dengan buku Java Color Modeling oleh Mr Hamdi <- bukan lagenda kung fu tapi rasa boleh berkungfu hujah le kot :)
Baca first time satu hapah pun aku tak faham..macam baca buka language makhluk asing. So bila benda yang macam nie kena cari penterjemahnya, so aku cari balik yang empunya buku tu Mr Hamdi, so tanya lah sikit lebih kurang sebab nak tanya lebih-lebih aku pun tak tahu nak tanya apa, so kebanyakkan peristiwa berlaku (moment-interval) dalam forum je. Aku join dalam forum color modeling, cuba beberapa model dan minta dia orang comment model aku.. nie 5/6 thn yang lepas, selepas beberapa lama mengodek-godel pasal color modeling dan ada kefahaman sedikit datang pula ajaran baru Domain Driven Design, aku tak ingat macam maner aku leh tahu pasal ajaran nie, so masa nie taraf dah naik sikit so ada kelebihan duit boleh le beli buku DDD.
Setiap kali berubah ajaran, aku akan cuba sesuaikan ajaran lama dengan ajaran baru, dimana ada kelemahan yang dapat ditampung oleh ajaran baru dan fokuskan juga dimana kekuatan ajaran tersebut.So selama lebih kurang 4-5 thn nie bnyk teknik aku gabungkan dimana asas untuk modelkan domain dtg dari color modeling dicantikkan bentuknya dengan DDD.
Tapi masa tu aku masih lagi kurang tumpukan Role sebaliknya Moment-Interval menjadi pilihan. Setelah jatuh dan bangun hasilkan beberapa project yang berscala sederhana ke besar aku dapati key dalam membina domain yang flexible ada di role dan ini terjadi apabila bertemu dengan ajaran DCI.
Role dalam DCI berbeza dengan role dalam color modeling, Role name dia kemungkinan adalah sama cuma perbezaan nya role dalam DCI fully behaviour sahaja dan stateless manakala dalam color modeling role kemungkinan persisted dan bukan stateless.
Aku diberi satu context untuk change status dari satu state ke state yang lain. Pada dasarnya aku boleh define lagi context tu.. as generic context atau concrete context. Kalau generic context ianya seperti menukar sesuatu state dari satu status ke status yang lain, dan jika concrete context ialah menukar status application form dari satu status ke status yang lain. Ada different context - context tersebut.
Generic Context
context ChangeStatus
{
void Bind(I
}
//Thing-Role
role IStatusChangeAble : PlayedBy
{
void ChangeStatus(self,fromStatus,toStatus);
}
//Party-Role
role IChangeStatus : PlayedBy
{
void ChangeStatus(self,statusChangeAble);
}
Buat masa nie, nie je lah dulu, ada masa insyAllah aku sambung. Saper nak comment dipersilakan
# contoh code dalam pastie.org
http://www.pastie.org/1358380
Wednesday, December 08, 2010
Finding object role
Posted by ryzam at 2:09 PM 0 comments
Susahnya nak menulis
Salam
Ini adalah nota developer yang tidak boleh digunakan di mana-mana mahkamah di Malaysia.
Kenkadang bila anda menulis anda akan dapat lebih kefahaman, kerana menulis artikel/nota tentang pengalaman anda didalam menyelesaikan sesuatu masalah yang teknikal cukup payah. Pertama bahasa yang digunakan kalau boleh orang lain pun boleh faham, dan kedua penerangan pun begitu juga. Jadi ambil masa nak merealisasikan apa yang ada dlm kepala otak untuk diterjemahkan kepada susunan ayat yang santai. Dan ada ketika pada pertengahan tulisan anda akan dapati apa yang ada faham tu sebenarnya tak tepat. Adakala apa yang anda faham itu betul , tetapi tak tepat bila disampaikan dan adakala awal-awal lagi apa yang anda fahami tu tak betul dan for sure bila sampaikan tak betul juga hujahnya. Aku rasa ini berlaku bukan terhad pada bidang teknikal, pada mana-mana bidang pun mcm tu lebih2 lagi bidang politik hahaha.
Posted by ryzam at 11:40 AM 0 comments
Monday, November 01, 2010
Kenapa perlu elakkan Anemic Domain Model
Salam
Aku sebelum ini percaya Anemic Domain Model tidak bagus jika ada dalam sesuatu domain model design/code dan aku masih lagi percaya cuma kini terdapat sedikit perbezaan dengan apa yang aku buat dalam sotware project terbaru. Ianya berkisar kepada "What System DOES" dan "What system IS". So anemic domain model nie hampir definasi apa yang dikenali "What system IS". Daripada Martin Fowler, symptom Anemic Domain Model ialah
"The basic symptom of an Anemic Domain Model is that at first blush it looks like the real thing. There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is hardly any behavior on these objects, making them little more than bags of getters and setters. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data".
Aku semakin slow dalam coding dan semakin slow juga nak faham code, so kalau code yang terlalu banyak tempat business algorithm dimana aku kena refer pada object A dan kemudian pergi ke object B, menjadikan aku kurang efficient so tak 1Malaysia lah cam nie. 1Malaysia pencapaian diutama so begitu jugalah halnya dalam code, code yang senang dibaca dan efficient sangat2 diperlukan, tapi ini semua abstract. Mungkin senang bagi developer Najib (bukan nama sebenar) tidak mudah untuk developer bernama Anwar (pun bukan nama sebenar). Cuma kita boleh ambil tahap pertengahan dimana indicator yang dirasakan setiap developer tu boleh memahami at least 60%-70% code yang awal apabila diberi code untuk dibaca.
So aku sudah pun bermula dengan pecahkan object2 aku kepada 2 bahagian. Basic object ialah ada attribute dan ada behaviour. So sekarang object2 aku buat dah seakan kembali menjadi anemic domain model percayalah. Cuma perbezaan dengan symptom anemic domain model sebelum ini ialah object attribute dan behavior tidak akan bersatu dan sebaliknya object lain dikenali sebagai "services" yang akan memainkan peranan menGALAS tanggungjawab untuk melakukan perbuatan baik dan buruk (method/behaviour object ada buruk dan baik gak). So yang macam nie memang aku bangkang. Aku tak boleh terima sesorang yang ada maklumat tetapi yang akan buat kerja orang lain berdasarkan maklumat tersebut. Jadi apa yang aku perlukan ialah di masa design code aku dipecahkan tetapi pada masa runtime atau pada masa diperlukan aku boleh dapat behavior2 tersebut. Itulah bezanya "runtime".
So aku boleh reuse behavior tu kepada mana-mana object yang perlu. Ambil contoh mudah
Manusia (Person) ada Nama Rasmi dan Nama panggilan, so aku ada satu satu behaviour yang cantumkan nama rasmi dan nama panggilan untuk return string. Jadi behaviour tu aku boleh pakai re-use kembali pada mana-mana object yang mempunyai structure contract yang sama. Orang yang biasa dgn OOP maybe dah terbayang untuk membuat satu interface dan ada class yang implement tapi bagi aku yang macam nie susah. Aku inginkan cara yang lebih mudah dan fluent.
class Orang
{
string Nama;
string Panggilan;
}
class Kereta
{
string Name
string Code
string Panggilan;
}
Maybe ada suggestion untuk buat interface dan setiap object tu implement interface, tapi bagi aku cara nie panjang macam code kat bawah ni.
interface Cantum
{
string CantumNamaPanggilan(string name,string panggilan);
}
class Orang :Cantum
{
string CantumNamaPanggilan(string name,string panggilan)
{
///
}
}
class Kereta : Cantum
{
string CantumNamaPanggilan(string name,string panggilan)
{
///
}
}
Dan mungkin ada yang suruh letak implementation dalam abstract class, cuma bagi aku limitation class hanya boleh extend pada satu abstract class, kalau ada bnyk behavior takan nak letak semua dalam abstract class tu. Ada cara lain tak yang aku tak nampak sebelum aku bagi cara yang aku cuba nak buat (belum diuji tahan peluru dan api :)?
Labels: Color Modeling, DCI, DDD, Domain Driven Design
Posted by ryzam at 12:05 PM 1 comments
Sunday, October 31, 2010
Domain design, reuse and readable code
Aku plan nak invite rakan-rakan developer/solution/programmer etc yang berminat untuk bincang berkaitan domain design, re-useable dan readable code. Harap dapat sambutan dari pelbagai camp sama ada .Net C#, Java, Groovy, Python, Ruby, PHP.
Ok aku terangkan apa challenge project nie. Bina satu console application berdasarkan problem statement ini.
"Bina aplikasi yang dapat manage sesuatu Project dimana setiap project tersebut boleh mempunyai banyak task dan completion date/time task tersebut bergantung pada task-task yang yang ada dibawahnya. Task boleh mempunyai banyak task yang lain (child) atau juga dikenali sebagai aktivity. Compute the earliest start of every
activity given the start of the project. Setiap task ada estimation time"
Criterianya ialah
1. design yang flexible yang boleh digunakan, kemungkinan untuk any application yang hampir serupa processnya.
2. LOC yang pendek, code mudah dibaca, jika boleh system analyst/tester boleh semak pada first level tanpa perlu tulis test code.
3. Code yang boleh reuse
Ada sesiapa yang ingin mencuba?
Posted by ryzam at 11:49 PM 0 comments
Thursday, September 30, 2010
Idea kelebihan/bakat atau kesungguhan
Kebelakangan ini aku sering terfikir mencari sesuatu "benda" yang aku boleh buat berdasarkan kemahiran ilmu teknologi yang diberikan Allah pada aku. Tapi masih buntu. So disekeliling kita hari ini penuh dengan teknologi sama ada datang dari barat atau datang dari kelompok masyarakat kita. Penghasilan teknologi pun datang dari secebis idea yang dikembangkan dan kemudian menjadi realiti .Aku pernah terdengar yang kebanyakkan manusia hanya mengguna 10% dari kebolehan otak/akal yang Allah bagi pada kita. Lagi 90% masih tersimpan di cell-cell otak yang belum dirangsang.
Kalau kita dapat menggunakan atau meningkatkan penggunaan kelebihan tersebut kepada 20%, banyak idea yang kreatif boleh dibangunkan. Aku juga tak pasti adakah faktor bahasa mempengaruhi tahap idea seseorang? Orang yang kreatif yang banyak idea, otak kanan banyak memainkan peranan.
Posted by ryzam at 8:48 AM 1 comments
Wednesday, September 29, 2010
Versi mudah mendapatkan NHibernate session
Posted by ryzam at 8:43 AM 0 comments
Tuesday, September 21, 2010
UI ke Business Process - 60% project lewat
UI masih lagi menjadi masalah utama kalau tidak pada developer lain tapi pada diri aku sendiri. Walau ada pelbagai framework yang dikategorikan sebagai Rapid Applicaton Development, tapi aku masih lagi mengambil masa yang lama untuk membolehkan UI code work dengan back end code dgn lancar.Nie bukan bermaksud UI design tetapi lebih kepada UI funcionality, bagaimana UI kawal state dan sebagainya. Kalau setakat untuk look and feel memang tidak dinafikan banyak UI framework yang lain hasilkan look and feel yang awesome. Itu dari sudut layout dan color. Dari sudut application developer, anda masih lagi perlu menyentuh UI code setidak-tidaknya untuk sesuatu event itu trigger dari tindakan user, seperti click button untuk hantar maklumat ke database. Cuma jika fully plain html form, rasanya kurang sedikit masalah-masalah ini.
Posted by ryzam at 8:40 AM 1 comments
Monday, September 20, 2010
Update
Kebelakangan nie sifat malas nak update web page nie semakin menjadi-jadi, kenkangan kerja dan sebagainya menjadi halangan kuat dan kekurangan idea, maybe otak kanan aku tak digunakan sepenuhnya untuk lebih kreatif.., sudah lebih 2 bulan aku tak menulis dalam blog.
Posted by ryzam at 9:20 AM 0 comments
Wednesday, July 07, 2010
Monday, May 31, 2010
OCP dan Double Dispatch
Salam ILuvIslam
Salah satu kerja yang aku kena buat ialah mencantikkan code. Aku nak shortcut terus kepada point. Code dibawah ada 2 version satu code yang tidak menggunakan OCP dan Double Dispatch, manakala yang satu lagi menggunakan cara yang aku mention.
Sebelum tu aku malas sikit nak beri penerangan OCP (Open Close Principle) dan Double Dispatch boleh search je.. InsyAllah banyak penerangan yang bagus. Cuma akau nak terangkan ialah jika aku tak guna cara OCP dan double dispatch code aku akan menjadi bloated macam ikan kembung.
Kali nie aku kena record transaction sama ada transaction tersebut ialah transaction cash atau cheque atau balance transfer atau atau atau. So atau atau atau lagi tu bermaksud ada kemungkinan lain penambahan jenis transaction. Setakat sebelum 1Malaysia bankrap ada 3 atau 4 transaction yang perlu di rekodkan.
Oleh kerana ada pelbagai transaction, maka user kata mereka hendak tahu total setiap amount apabila transaction itu berlaku di branch dan juga total amount harian untuk setiap transaction. So dengan yakin dan bergaya aku tulis code macam kat bawah nie.
Masalah disedari apabila user bagi tahu 1Malaysia dah bankrap, so ada penambahan transaction yang perlu direkodkan, seperti transaction LPO etc.
So jika dilihat pada code aku kena tambah AddReloadLPO(decimal amount). Ini bermakna aku kena buka file code yang diatas dan tambah, begitu juga pada code class BranchDailyReload aku kena tambah if else pada line 39 AddBranchDailyReload(...).
So macam maner aku tak nak ada penambahan code apada existing class dan juga penambahan if else lagi. Caranya ialah dengan menggunakan OCP dan double dispatch.
Aku refactor class jadi macam nie
Then aku kena tambah interface IReloadOCP dan class yang akan implement, sebagai contoh ReloadCash
Manakala class BranchDailyReload akan berubah menjadi simple macam nie, tiada lagi penggunaan if else, walaupun contoh BranchDailyReload tak follow OCP tetapi penggunaan function lebih explicit. Tiada masalah untuk refactor BranchDailyReload untuk buat fully OCP
Sesiapa ada lagi idea yang lagi okay, silakan.. nak kena submit kat lecturer :)
Posted by ryzam at 2:50 AM 0 comments
Thursday, May 27, 2010
Data,Context and Interaction
Salam 1Malaysiaaaaaaaaaaaaaaaaaaaaaaaaaa
Minggu lepas semasa membaca mailing list Domain Driven Design, salah seorang ahli group DDD (http://www.jroller.com/rickard/), bercerita serba sedikit tentang DCI . Aku tertarik dengan penerangan beliau dan cuba explore lebih detail, tetapi masih lagi kabur. So aku decide untuk buat code nak compare cara dalam DCI dengan cara yang aku biasa buat.
Posted by ryzam at 11:47 AM 0 comments
Tuesday, March 30, 2010
Pilihan untuk kemahiran
Posted by ryzam at 9:07 AM 2 comments
Thursday, March 25, 2010
Domain challange
Pagi nie aku dapat artikel update dari Jimmy Bogard tentang
Strengthening your domain: Encapsulating operations
Aku dah baca dan beri comment, guna nick amir (hentam ajelah). Memang menarik cara dia describe problem and cara dia solve dengan cara DDD. Aku cuma tak berapa setuju beberapa domain behavior yang dia design..so aku bagi suggestion aku.. Solution yang dia I bagseperti di bawah.
Customer = new Customer
var fee = customer.ChargeFee(100m);
fee.Amount.ShouldEqual(100m);
customer.Fees.ShouldContain(fee);
Solution aku lak dengan ialah method ChargeFee tu naming dia macam tak kena.
Aku suggest buat macam nie:
Customer customer = new Customer();
ShopOwner s = new ShopOwner();
s.ChargeFeeTo(customer).Amount(100m);
So bila customer tu nak buat bayar
customer.MadePayment(50m);
Dia ada komen balik kata ChargeFeeTo(customer) tidak berapa kena sebab tanpa panggil method Amount(), code boleh compile dan tiada error. Aku setuju konsep explicit design, insyAllah aku akan ulas explicit design (keberkesanan).
Aku suggest supaya amount tu diletakkan sebagai paramater seperti
s.ChargeFeeTo(customer,100m);
Selain dari itu untuk domain yang lebih flexible kita boleh bina domain CustomerFeeCharges (moment interval) so code boleh dibina macam ini
s.ChargeForTo(new CustomerFeeCharges(customer,amount));
Posted by ryzam at 11:58 AM 0 comments
Wednesday, March 24, 2010
First screencast bisu
Aku baru je habis buat simple screencast bisu.. hehe..tak de suara tentang basic setup NHibernate & FluentNHibernate. Ini experiment aku , insyAllah kalau ok ada sambungan. Length dia pendek sahaja.. aku cuba buat sesimple, padat dan sendat...
Posted by ryzam at 5:02 PM 1 comments
Thursday, March 18, 2010
Fluent Ubiquitous Domain
Aku tak de apa nak cerita banyak cuma nak bagi satu image untuk difikirkan dan dibincangkan , kalau ada yang nak berbincang silakan, kalau tak de anggap lah image itu contribution untuk 1Malaysia hehehe. Untuk design domain model selain dari skill analytics dan experiance, supporting cara untuk menjadikan domain itu lebih valueable ialah apabila anda boleh buat ayat dari domain model tersebut. Normal buka domain model asas nya ialah identify noun sebagai class, verb sebagai operation dan adjective sebagai attribute/property.
Posted by ryzam at 4:02 PM 0 comments
Wednesday, March 17, 2010
Adakah perlu Query dikongsi??
Ni adalah persoalan yang timbul bila aku buat coding (soft dev). Aku tak jawapan yang concrete tapi buat masa nie aku memilih query tidak perlu di kongsi, setiap client yang ingin data mempunyai query set yang masing-masing. Jika terdapat perubahan pada domain tidaklah terlalu sakit untuk ubah dari kongsi query tetapi bila requirement query untuk process A lari sikit dari requirement untuk process B, aku dapat rasakan lagi susah nak handle. Mungkin sebab aku ambil pendekatan query sepatutnya very lightweight process yang tanpa melibatkan terlalu banyak validation etc.
Posted by ryzam at 1:58 PM 0 comments
Tuesday, March 16, 2010
Google public profile
Ini ialah akunyer link ke public google profile - http://www.google.com/profiles/irwanazam , artikel dalam I Look, I See , juga akan dishare dalam Buzz . So ada n3 yang discussion dibuat disitu.
Posted by ryzam at 11:28 AM 0 comments
Wednesday, March 10, 2010
Macam mana
Aku tak ade idea nak tulis apa, ada masa sikit sebelum nak sambung buat kerja, aku cuba bawa satu normal scenario dalam software development design. Contoh aku diminta develop online POS (Point Of Sale) untuk pasaraya besar , jadi boleh bayangkan per day transaction memang dijangkakan banyak. Dan normal domain model design ialah seperti ini.
Ok untuk create new order tiada masalah, kita hanya point order as agreegateroot dan yang lain semua dihandle ORM untuk persistence. So apabila sudah selesai, requirement lain ialah hendak list order record per day or per hour etc, seperti tertera dibwah nie. Ambil contoh customer nie berdaftar menjadi member (macam Jusco members card,Giant members card)
So macam mana?, Aku perlu query ke table order join ke customer join dengan orderitem join dengan product dan join dengan price dan result aku akan dapat list macam kat atas tu.
Posted by ryzam at 2:13 PM 0 comments
Technical Screencast
Salam,
Posted by ryzam at 12:25 AM 0 comments
Sunday, February 21, 2010
Begini rupa Application Service aku dalam latest project
Posted by ryzam at 2:16 PM 0 comments
Wednesday, February 17, 2010
Update
2 minggu lepas, aku rase jemu dengan senario politik malaysia, sebab tu 2 tulisan aku sebelum ini tak de kena mengena dengan programing dan software development.
Posted by ryzam at 11:48 AM 0 comments
Tuesday, February 09, 2010
Apabila Si Bodoh Memperbodahkan Juak-juak yang memang bodoh
Apabila yang ada kuasa itu otak nyer serupa keldai, jadilah pengikut pengikutnya seperti taik keldai.... dan yang memerhatikan kebodohan mereka juga akan terkena tempias kebodohan kerana pergi perhatikan orang bodoh itu nak buat apa.............adushhh aku pun sama kerana selalu perhatikan mereka, patutlah baunya tak tertahan dan jika selama bertahun2 tempias enzim-enzim kebodohan mereka juga akan merosakkan IQ aku...ini........tapi nak buat macam mana negaraku yang tercinta
Posted by ryzam at 12:16 PM 0 comments
Politik: Menyesakkan nafas
Dunia politik di Malaysia nie memang melelahkan dan betul-betul buat otak jadi mereng. Dengan pelbagai jenis orang dan perwatakan yang tak konsisten, semuanya kerana apa, kerana nak sentiasa mengharap rakyat menyanjung mereka, tetapi perbuatan sesetangah ahli politik, peminat politik dan aktivis politik di Malaysia macam hampas kelapa, sama ada dari kerajaan dan juga pembangkang. Bosan dengan apa yang berlaku bukan sejak kebelakangan ini tapi sejak 10 tahun yang lepas.
Posted by ryzam at 9:09 AM 2 comments
Monday, January 04, 2010
1st Day Pilot Project - Bukit Raja
Ada lagi beberapa jam nak close daily operation kat bukit raja, so far Alhamdulillah belum ada lagi kritikal issue dimana sytem terpaksa dihentikan. Oleh kerana sistem ini melibatkan transaksi duit so semua debit,credit, balance cukup penting. Tak senang duduk jugak le nak melayan persoalan yang timbul dari user.
Posted by ryzam at 4:33 PM 1 comments
Sunday, January 03, 2010
Pilot Project
Selepas 5 bulan terlibat dalam development MaRS project sebagai Solution Architect (consultant), insyAllah esok pilot project untuk satu site akan digunakan. Sebulan bergelumang dengan bug fixing, code review , query tuning cukup-cukup memenatkan dan beberapa project yang lain juga sedang berjalan. Aku agak tertekan dalam situasi sekarang ini, confidence level aku untuk code Mars untuk pergi live adalah ditahap 70%, dalam kenkangan team members yang lain agak fresh dalam pengalaman membangunkan enterprise system, aku terpaksa memikul tanggungjawab sebagai consultant merangkap developer, tester. Bulan lepas 2 org dalam team nie resigned, aku tak sure sebab aku orang luar,tapi momentum project nie agak terganggu kerana salah seorang yang berhenti tersebut ialah senior developer yang juga menjadi system analyst.
Aku pada mula tekankan cara tulis code separation of concern tapi aku rasa dia orang masih tak dapt nak menjiwai kenapa perlukan cara tersebut, dan oleh kerana aku tak sempat nak review semua code orang , maka aku dapat rasakan akan ada code yang ditulis seakan TransactionScript .
Code scenario test aku masih cover hanya 40% dari keseluruhan scenario penting. Aku berdoa, semoga pilot project berjalan lancar dan nationwide deployment pun success.
Just untuk update, dari segi framework, tools dan approach yang aku guna dalam team ini.
.Net Framework 3.5
ASP.Net MVC 1
NHibernate 2.1
FluentNHibernate
NHibernateLinq
Coolite - ExtJS
MSpec, NUnit
IIS 7
SQL Server 2005
Posted by ryzam at 10:56 PM 3 comments