Friday, April 03, 2009

Single Responsibility Principle

Aku terbaca satu artikel Would Your Objects Praise You?
cuma aku kurang setuju dengan apa yang mamat nie cakap. Ada benarnya tapi tak semuanya betul konsep tu. Apa yang cuba disampaikan ialah konsep Single Responsibility Principal.

The single responsibility principle states that every object should have a single responsibility, and that all its services should be narrowly aligned with that responsibility. [Wikipedia].

Ok, cara dan formula yang di gunakan cukup menarik dan bagus dan aku pun rasa sesuatu yang reasonable unutk digunakan apabila buat domain model anlysis. Formula yang cuba diketengahkan ialah

Can a [type] [action in the infinitive] itself?

So dalam artikel tersebut , mamat nie ambil contoh sebuah kereta


Jadi berdasarkan method yang ada pada kereta tersebut kalau dilihat memang menyalahi SRP. Sebab class Car coupling dengan telalu banyak kerja yang perlu dilakukan. Cuba fikirkan sejenak apa tugas sebuah kereta. Jawapan dia abstract dan berlainan bagi setiap orang, sebab itu SRP nie kalau mengikut pencetus principle yang dekenali sebagai Pakcik Bob pattern yang simple tapi susah untuk dapat yang betul betul ngam.

"The SRP is one of the simplest of the principle, and one of the hardest to get right. Conjoining responsibilities is something that we do naturally. Finding and separating those responsibilities from one another is much of what software design is really about".

Berbalik semula kepada persoalan kereta tadi. Mamat Brian nie cadangkan untuk dapatkan cara yang betul penggunaan SRP ialah dengan melakukan pertanyaan seperti berikut:

  • Can a car change gears by itself?
  • Can a car change a radio station by itself?
  • Can a car drive itself?
  • Can a car idle by itself?
  • Can a car park itself?
  • Can a car start itself?
Dan ini jawapan bagi soalan-soalan tersebut

Unless you’re the lucky owner of the Knight Rider, you probably answered ‘NO’ to a few of these questions. For every question or observation you have answered ‘NO’, you should more than likely refactor the class and move some of its responsibilities elsewhere. But where exactly can you move these responsibilities? Well, before we dive to some of these answers, let’s see if we can directly some of the original questions pertaining to our Car class:
  • Can a car change gears by itself? ANSWER: Sure, if it has an automatic transmission. Otherwise, only the driver can shift gears.
  • Can a car change a radio station by itself? ANSWER: Nope, only the driver (or the passenger) can change the radio station.
  • Can a car drive itself? ANSWER: Not unless it’s KITT! Only a driver can drive a car.
  • Can a car idle by itself? ANSWER: Sure it can.
  • Can a car park itself? ANSWER: Nope! Only a driver can know how to park a car.
  • Can a car start itself? ANSWER: Uh, no. Once again, only the driver can start the car.
Nie pula jawapan aku. Ya memang betul kereta tak boleh change gear sendiri tapi kereta simpan maklumat tentang gear, jadi jika kereta tak boleh nak buat tugas change gear tapi kereta ada maklumat tentang gear jadi nak buat macam mana nie?.. Kalau tanya BIJAN dia jawab kita perlukan kereta yang ada ciri GLOKAL .. hahahah (iklan sebentar). So mamat Brian nie kata keluarkan tugas tersebut kepada seorang Driver (role). Aku tak setuju sangat. Nie contoh yang dia beri dan apa yang diberi sebenarnya valid dan boleh digunakan cuma jika diteliti dengan lebih detail pasti jawapan lain sedikit.


Disini kena faham konsep message to object. Persoalan Driver perlu ada atau tidak masih lagi abstract kepada Domain Expert dan juga untuk apa application ini dihasilkan. Kalau application nie dihasilkan untuk stimulate Video Game dimana dari screen hanya nampak kereta yang boleh dipandu maka class Driver tidak diperlukan sebaliknya class Driver itu digantikan dengan Application Service - CarService.

Ini pula pada pendapat aku, yang dikategorikan sebagai programmer kampung. Untuk mengikut konsep SRP kita perlu pecahkan tugas-tugas tersebut kepada yang berhak, jangan tamak nak ambil tugas orang lain, nasib baik BIJAN tak tamak dia ambik sikit je. Dari class Car kita akan pecahkan kepada class Gear, class Radio, class Engine.


//Car.cs

public class Car

{

public Gear Gear { set; get; }

public Engine Engine { set; get; }

public Radio Radio { set; get; }

public void Drive()

{

}

}


//Engine.cs

public class Engine

{

public void Start()

{

}

}

//Gear.cs

public class Gear

{

public void ChangeGear()

{

}

}

//Radio.cs

public class Radio

{

public void ChangeRadioStation()

{

}

}


//CarService.cs


public class CarService
{
public Car Car { set; get; }

public void ChangeGear()
{
Car.Gear.ChangeGear();
}

public void ChangeRadioStation()
{
Car.Radio.ChangeRadioStation();
}

public void StartEngine()
{
Car.Engine.Start();
}

public void Drive()
{
Car.Drive();
}
}









New PM

Emm macam mana?... ok ke tak ok.. dia reti buat programming tak?hahahah , criteria PM yang bagus tahu selok belok programming so penanda aras logik yang tinggi(ni cakap orang fanatik programming) sepatututnya PM dari mereka yang berjuang dalam OSS sebab mereka kena ikhlas membantu programmer dan rakyat jelata yang lain tanpa memikirkan fulus. Bayangkan PM nie peminat dan pejuang OSS, sure takde kes komisyen yang melampau. Nie PM bukan Project Manager, aku tak berminat pasal PM tu, yang aku tengah fikirkan nun PM pinang sebatang BIJAN. Please someone buat code boleh reverse word BIJAN->_ _ _ _ _.

public class PM

{

public Zombi EvaluateZombi(string zombi)

{

if (zombi.Equals("BIJAN"))

{

throw StackOverflowException("Dah tak ader orang lain ke..");

}

return AnyChildsSiblingsComeFromThisUglyZombyThrowAway();

}

}




Thursday, April 02, 2009

Refactoring menggunakan SRP

"A class should have one, and only one, reason to change."

Permulaan yang baik untuk refactoring ialah menggunakan guideline Single Responsibility Principle.

Aku kena buat tambahan features pada module yang sedia ada. Lama jugak tak buat programming, ialah manja sangat hari tu ada ramai penolong nah sekarang semua orang dah jadi orang besar, aku juga jadi programmer kampung.

Aku buka code module yang perlu aku tambah..perghhhh, boleh tahan:) ... terfikir aku sejenak. Code yang ditulis sudah cukup bagus, tapi kalau aku tak ubah nanti nampak macam tak ada kerja lah pulak. Aku ambil keputusan untuk ubah sedikit atleast tambah comment :)

First thing ialah identify any Value Object dalam code tersebut. Lepas aku dah tahu part maner boleh jadi Value Object kemudian aku kena map guna nhibernate mapping component.

Continue...

Refactoring cukup mencabar

Kalau aku tengok code aku semula, tak perlu lama 3 bulan lepas sure aku pun rasa kenapalah aku buat macam tu, patutnya aku buat macam nie..

Itulah kebiasaannya perasaan seram yang menyelubungi aku setiap kali aku lihat code lama aku dandalam sesi refactoring itu lagi mencabar jika code yang ditinggalkan penunggu sebelum ini tidak ada comment aduhhhh........(aku pun sama jarang nak bagi komen kat kot). Aku nak bagi suggestion setiap development team kena ada cikgu disiplin yang check code kalau tak komen kena ketuk jari dengan pembaris. Tapi cikgu disiplin nie kena faham sejarah development sesuatu project , kalau project itu project yang interim mungkin dende dia hanya dikorek hidung tak perlu diketuk jari dgn pembaris. Tapi serius kalau betul cikgu disiplin datang check..akulah yang paling banyak kena ketuk dengan pembaris adussssssssss.. sakitnya

Wednesday, April 01, 2009

Never ever underestimate person

One thing i learned when involve in management level, doesn't underestimate other person skill and knowledge even though their opinion/suggestion is sometime doesn't make sense.

Reporting services dan Linq to SQL

Untuk reporting services project aku menggunakan ReportViewer control 0.8 dan Linq to Sql. Selain dari itu untuk aku query ke database aku juga mengunakan LinqPad

Yang selebihnya insyAllah kalau dibukakan hati untuk menulis pasal reporting services aku akan tulis :)

Monday, March 30, 2009

Criteria apabila memilih service dan function skop

Aku sekarang terlibat dalam development enterprise application dalam skala yang besar. Seperti biasa cara design architecture banyak terpengaruh dengan Domain Driven Design. Aku masih lagi mentah apabila hendak memilih "Application Service" dari segi naming pattern dan skop yang di "cover" oleh sesuatu service. Secara kebiasaan kelakuan service ialah terlibat dalam coordinate lebih dari satu domain dan "Application Service" tidak sepatutnya terlibat dengan sebarang "state" dalam ertikata yang lain sesiapa sahaja boleh mengambil instance service tersebut tanpa risau akan sejarah life cycle service tersebut sebelum ini (Ini apa yang aku faham dan cuba menterjemakan kedalam bahasa biasa). Ok sebelum pergi jauh apa yang aku nak tekan kan disini ialah criteria Application Service dan bukannya Domain Service. Ada sesiapa biasa membantu?

Update
1. Apabila selesai design domain model dan cuba fikir dari model tersebut dari aspect client, apakah business service yang diperlukan. So dari point tersebut boleh dapat list service yang terlibat.

Thursday, March 26, 2009

Tidak mampu hendak puaskan hati semua orang

Buat berdasarkan apa yang mampu dan semua itu dan ditentukan oleh Allah.

Saturday, March 21, 2009

Learning Management System

Selain dari Campus Management System, aku juga terlibat dalam Learning Management System, walaupun aku tidak involve dalam programming tapi aku mesti familiar, clear setiap function/features yang ada dalam LMS. Seperti biasa bila mencari tu memang ada banyk benar LMS yang ada kat muka bumi nie, sebelum nie aku tahu Dokeos, Docebo dan Moodle rupanya kawan-kwan dia yang lain pun ramai dan beraneka ragam features. Aku jumpa satu website yang bagi list LMS

http://software.forbes.com/learning-management-system-software

Selamat mencuba : )

Friday, March 20, 2009

Mencari Enterprise Architecture Tools

Aku ada hal pagi nie, so aku ambil EL sebab nak settlekan pasal account bank rumah. Malam tadi aku ada masa nak research pasal EA tools yang available dan yang penting free. Sebelum nie untuk architecture design banyak guna sketch + argo uml + excell. Tapi aku rasa tak memadai guna tools dan tak memenuhi kehendak EA process.

Ada beberapa tools yang aku jumpa dan dalam process evaluate
1. ADONIS
2. Essential Project
3. Iteraplan

Update
Design Process Modeler :
- BizAgi ( agak menarik)
- yED Graph Editor

Thursday, March 19, 2009

Test framework tools

Sekarang nie aku guna Gallio untuk execute test fixture aku, yang best tentang Gallio dia boleh execute banyak jenis framework serentak sebagai contoh untuk layer UI aku mungkin nak guna MBUnit dan unutk layer Services aku nak guna NUnit manakala untuk DataAccess aku boleh guna XUnit. Selamat mencuba..

Real Estate - testing project

Aku sekarang tengah dalam process refactoring current Campus Management System dan aku dah beberapa bulan tak terlibat secara direct dalam coding. Kebanyakkan masa aku terlibat dengan team meeting, department meeting.

Untuk mengikuti perkembangan software development, aku rasa aku kena juga buat simple code atau simple project baru skill aku tak ketinggalan. Tapi biasanya bila aku plan nak buat project suka-suka, selalunya pertengahan jalan saja. Bahagian ini yang aku kenkadang aku ada masalah. Awal-awal mungkin aku bersemangat, tapi bila pertengahan bila dah busy dengan tanggungjawab dengan real project, aku rasa macam terbengkalai sahaja. Sudah banyak kali aku nak dokumen cara aku terlibat dalam development process tapi biasanya part 1 atau part 2, selepas tu aku dah tak boleh fokus. Macam mane nak buat tu?

Helper break in MVC 1.0

So far ada beberapa helper yang tak lagi disupport oleh MVC 1.0 kerana sebab-sebab tertentu. Aku malas nak bincang pasal kenapa function/helper tu tak support lagi tapi nak listkan beberapa code yang aku kan tukar dalam project sekarang ini:

1. Html.Form<> dah tak support, kena tukar ke Html.BeginForm
2. HtmlActionLink<> pun dah tukar kepada Html.ActionLink sahaja
3. Html.SubmitButton pun kena tukar kena normal cara
4. Html.CheckBox parameter position dan type pun dah berubah

Upgrade kepada ASP.Net MVC RC 2

Ada beberapa functionality break bila aku upgrade ke ASP.Net MVC RC 2. BTW kebanyakkan cara adalah lebih mudah dan pendek apabila mengguna version baru ini.

Upgrade ke new version nie adalah salah satu list dalam improvement session yang team aku akan focus dalam beberapa minggu mendatang ini, insyAllah.

Update
40% code dah compatible dalam ASP.Net MVC RC 2. Lagi satu hari nie Microsoft buat announcement ASP.Net Release RTW dah boleh download dan guna

ASP.Net MVC 1.0

Wednesday, March 18, 2009

Guna Balsamiq Studio

Aku dah guna Balsamiq Studio selama 2 minggu, application nie aku beli harga USD79. Alhamdulillah aku cukup puas hati. Contoh skecth UI aku ambil dari website
http://devlicio.us/blogs/casey/archive/2009/03/09/ddd-sample-application-first-steps.aspx

Campus - University enviroment

Hampir setahun lebih aku terlibat dalam pembangunan software berkaitan campus, university dan juga e-learning. Agak menarik juga kerana bidang ini terlalu luas dan berkempang dengan begitu cepat. Untuk e-learning sahaja terdapat beberapa puluh software yang berkaitan authoring tools, online video, question bank, object learning etc dan yang menarik kebanyakkan adalah open source.

Peluang di malaysia dalam bidang ini masih terbuka luas dan tak banyak lagi company yang terlibat dengan begitu mendalam total solution untuk university/campus sama ada fizikal dan juga virtual. Pengalaman sepanjang berada dalam industri ini, untuk membuat consultation cukup banyak antara larat dengan tidak sahaja.

Tuesday, March 17, 2009

Agile way - sambungan

Ok sambungan dari tulisan semalam, berkaitan user story, apakah seorang developer apabila memilih user story memang perlu buat coding dari UI hingga ke DataAccess? Jawapan nya adalah ya. Aku pun mempunyai perasaaan kurang pasti adakah betul sebegitu. Aku pernah juga berbincang dengan member dan mereka juga kurang pasti. Tapi apabila melihat sendiri dan merasa pengalaman dalam execute agile dalam team, aku rasa ada kebenaran iaitu seorang developer mesti bertanggungwab sepenuhnya pada user story itu. Cuma ada sedikit kelonggaran pada pendapat aku, ialah di layer UI, sudah semestinya developer tersebut kena terlibat dengan coding di layer UI, cuma tidak perlu sehebat web design/java script developer (jika bukan expert dalam java script). So akan ada satu lagi refactoring process terlibat hanya di UI untuk memasukkan semua element yang dapat menarik minat customer.

Agile way

Dalam agile satu user story akan di handle oleh seorang developer sahaja. Jadi jika dalam project architecture tersebut kita mempunyai 4 layer (UI,Services,Repository,Domain) maka developer tersebut mesti terlibat dalam semua layer.

Sebagai contoh base framework, standard coding dan architecture overview dah selesai dan bila process memilih user story, seorang developer kena faham dia perlu bertanggungjawab untuk coding dalam semua layer jika ada, tanggungjawab disini bukan bermakna dia perlu mahir dalam semua layer, cuma sebagai pemegang amanah untuk user story tersebut dia kena mencari solution sama ada mendapatkan khidmat nasihat senior developer dangan melakukan pair programming (teknik ini selalunya susah nak istiqamah) atau melihat contoh dari developer yang lain. Oleh kerana itu estimation untuk user story sebolehnya dilakukan oleh semua developer dari senior kepada junior dan ambil estimation yang paling memuaskan hati semua developer.

Tuesday, March 03, 2009

Catatan...

Tugas sekarang sebagai Software Architect agak mencabar tetapi bukan disebabkan masalah berkaitan software itu sendiri, cuma senario sekeliling yang membuat tumpuan kerja agak terganggu. Aku pada dasarnya tak berminat nak bincangkan masalah kerja yang tiada kaitan dengan technical/architecture/coding tapi situasi kebelakangan ini amat menghantui keupayaan aku untuk memimpin sesebuah department yang pada mulanya agak besar dan berkurang disebabkan masalah kepimpinan, kepercayaan dan ketidakpuasan hati terhadap sesuatu perkara. Tapi walaupun ada beberapa pihak tidak berapa optimist akan keupayaan organisasi ini untuk terus maju kehadapan, aku masih lagi menaruh harapan agar project ini berkembang, berjaya saing dan menjadi kebanggaan umat Islam.

Aku akui tugas aku sebagai "Head Of Department", tidak berjaya memberi impak yang positif kepada staff aku, mungkin aku masih lagi kurang ilmu, ya ilmu tu luas, semakin kita mencari ia, semakin kita akui banyak yang kita tidak tahu sebenarnya. Aku cuba sedaya munkin untuk drive team aku kepada sesuatu yang boleh dibanggakan, cuma perasaan aku, aku gagal kali ini, biar aku akui ini dari orang lain bagi tahu "you're fail". Tapi kegagalan ini bagus untuk aku, kerana sekarang aku tahu kelemahan utama aku ialah kepercayaan staff kepada aku untuk mereka membina kerjaya yang cemerlang disini kemungkinan hanyalah khayalan. Hari ini aku terima lagi satu surat perletakan jawatan kali yang keberapa ntah aku pun tak tahu. Sekrang baru terasa apabila ada staff yang hantar surat perletakan jawatan.eemm, dahulu aku yang biasanya hantar surat ini keatas. Aku tak berminat hendak salahkan pihak atasan. Aku bukannya tak kisah jika ada staff bawahan aku meletak jawatan, ia menjadi penanda aras KPI aku sebenarnya. Aku boleh terima kritikan secara terbuka, kenapa tidak sebab ianya bagus untuk terus menjadi yang terbaik.

Walau bagaimana pun insyAllah segalanya akan berjalan lancar. Aku masih lagi bersemangat untuk terus memberi kepakaran selagi diperlukan.

Friday, February 27, 2009

NHibernate Series : How to Setting up Configuration - part 1

 

On of the most important thing when you want to start with NHibernate is to know how make NHibernate configuration. I will show you using normal approach and Fluent NHibernate.

1. Configuration properties in App.config / Web.config

You need to create all NHibernate configuration properties in App.config or Web.config. This is an example of how to specify the database connection properties inside a config file.

<?xml version="1.0" encoding="utf-8"?>


<configuration>


  <configSections>


    <section name="hibernate-configuration"         


             type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />


  </configSections>


 


  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">


    <session-factory>


      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>


      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>


      <property name="connection.connection_string">Server=(local);database=dbase;Integrated Security=SSPI; </property>


      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>


      <property name="show_sql">true</property>


    </session-factory>


 


  </hibernate-configuration>


 


  <!-- other app specific config follows... -->


  


</configuration>


 


2. Configuration properties in hibernate.cfg.xml



You can also configure NHibernate configuration properties in hibernate.cfg.xml and this file need to save into bin directory otherwise NHibernate claim it’s not found the resource file.




<?xml version="1.0" encoding="utf-8" ?>


<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">


  <session-factory name="UnitTest">


    <property name="connection.connection_string_name">Server=(local);initial catalog=Test;user id=sa;password=qwe123</property>


    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>


    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>


    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>


    <property name="show_sql">true</property>


    <property name="connection.release_mode">auto</property>


    <property name="adonet.batch_size">500</property>


  </session-factory>


</hibernate-configuration>




Time to test.


I will use nunit to test that nhibernate can read this config file





        Configuration cfg;


 


        [TestFixtureSetUp]


        public void ConfigureUsingNormalApproach()


        {


            cfg = new Configuration().Configure();


            cfg.AddAssembly(Assembly.Load("ScrumDev.Domain"));


        }












You should get the test result in green color.

Software Design and Humanity Architecture Design

Actually I’m not very good in writing document either for technical or business proposal. My last position as Head Of Technical (.Net) doesn’t much involve to that area . The scenario is totally different now where  I have to manage few subordinates and also more then 10 staffs report directly to me. One thing I’m appreciate to work with my current team because they are open to suggestions and comments. I’m no expert and many things I need to learn. After more than one year to be Solution Architect at my current company I’m realize that I’m not only need to plan how the system/software should be look like but more than that is to plan for the people and give them a good * humanity design (environment etc) so that they can work accordingly towards the goal. Failing to do that will also impact the overall software architect design. To make your software design reality is not just related to a machine but also related to whose is the man behind that.

* humanity design refer to services, infrastructure to help rebuild from communities crisis – i believe this still can be used in software development

Thursday, February 26, 2009

I’m using Windows Live Writer

This is my second post using Windows Live Writer. I’m really like this application. You can get it from here

http://windowslivewriter.spaces.live.com/

How I do agile - Part 2

In the previous post i had written a little bit about the import thing need to do in the initial process when we start software development project.  Project Statement from the Product Owner point of view is quite important. You really need to know exactly what project/software you are dealing with. Once your have high level overview of the project you can start jump to the core process in Scrum agile framework. Product backlog is the heart of Scrum.  The product backlog is basically a prioritized list of requirements, or stories, or features, or whatevers. Things that the customer wants, described using the customer’s terminology.

Step 2 ( Define Product Backlog)

The way we define our Product Backlog is to ask our customer/domain expert to write it what they want/need in the system using their own terminology (their understanding of the process). Product backlog actually contains a list of user stories. In my experience you need to guide them how to write a good user story otherwise they will write non process statement like their dream that nothing to do with the system.  Last year I  had an opportunity to help one company to start with agile process in their company. The software is about real estate solution. I had give simple briefing how to write user story , but because I’m didn’t guide them personally, I’m quite shock many of them write user story that are not reflected to the business of real estate but more like the comment /suggestion they want from the top management. For example “As an Agent, I want more money, so that i can buy another house“.  Actually this is not wrong , this can be our guide to ask them until we get good user story. We need to go detail with this user,and ask them how to get more money using this system? and what should they expect from the system that give them more money?. This is the question that I’m dealing with when i need to know from the customer/user.

My prefered user story template is taken from Mike Cohn .

As a [user role], I want to [goal], so I can [reason].

Hopefully this can help you to start a simple agile process within your team. I will continue InsyAllah..

Friday, February 13, 2009

Domain Driven Design : How to start

Recently there is a lot of interest in DDD come from a book, article etc. You may the one who are interested to start the real project with DDD. From my experience involving in a few projects that take DDD as its core architecture guideline, i'm no expert to claim the best way to build using DDD'ish but i can share my little knowledge.

I think very few people could claim to have done full blown on DDD, you can read stuff Jimmy Nilsson, Greg Young, Colin Jack, Udi Dahan and of course Eric Evans.

For a start you can read Domain Driven Design book

Thursday, February 12, 2009

Hire People Smarter Than You

What do you think, if you have right to hire people do you will take this challenge and ignore your ego?

How I do agile in my team - Part 1

Maybe you have read many article about agile approach like xp, scrum, lean etc. You wanted to try in your team but sometime it quite difficult to implement it and after that you realize that does agile is the correct approach to go in software development. Actually you still can deliver you software project to your client without knowing or practice agile.It's only the guideline on how you manage your software development process (team, workflow, communication) from the beginning until the end of the project (release).

Based on my experience implemented agile in my team, i would like to share how i execute agile framework in my team. For your information i had failed a few times when adopting agile in my team. So my advice to you guys who plan to try agile framework in your software development don't give up if the end result is not what have you expected.

Step 1 (Overview Of The Project)
When i asked to develop new software project, the first thing i will do is to call for a discussion session with domain expert an get the overview of the project. In this session all team members must join.

Sunday, February 08, 2009

Consultation Project

Currently I'm handling 3 freelances project on software architecture as a consultant. The biggest project is an Idea Collection Management System. I'm still working at Al-Madinah International University as Software Architect and Alhamdulillah my team able to release a 2 big project since i joined in Dec 2007.