Wednesday, May 20, 2009

Belajar dari user interface iPhone

Wow... sudah 4 tahun sejak blog saya yang terakhir.... LUAR BIASA!!! Ternyata 4 tahun bisa berlalu begitu cepat!!! Wow... But so many things have happen in these last four years. Obviously, I cannot recall everything, but maybe I'll just start with what I have in mind now....

Pertama kali, saya ingin mengucapkan terimakasih untuk Anda yang sudah membaca blog saya. Semoga ada hal-hal yang bisa Anda petik dari tulisan saya.

Selanjutnya, saya ingin sedikit sharing mengenai ide yang saya dapatkan dalam satu bulan terakhir ini. Ceritanya begini; awal April 2009 kemarin, Telkomsel menawarkan iPhone. Waktu itu hari Selasa, dan sebenarnya saya gak niat beli. Cuman karena di-undang ke Hilton waktu grand launching, tujuan saya sebenarnya lihat hotel-nya. Kebetulan hotel Hilton itu adalah hotel baru di Bandung, dan saya belum pernah masuk. So anyway, saya datang, dan ternyata yang namanya iPhone itu user interface-nya bagus sekali. Sangat simple. Semua user interface logis dan masuk akal (akhirnya setelah saya beli, anak saya yang 5 tahun juga bisa mengoperasikannya tanpa diajarin). Akhirnya saya beli dan menghadiahkan iPhone itu untuk istri saya (yang kemudian jadi 'autis' dengan Facebook :D )




Okay, itu cerita intermezo aja. Tapi intinya, setelah saya tau interface iPhone (terus terang, ini adalah Apple pertama saya sejak waktu saya kelas 4 SD ortu saya beli Apple II+ dengan sistem operasi CP/M dan PC DOS -- jadi inget game Load Runner, Frogger, dan Karateka...)... ups... sori... back to the story... jadi setelah saya pakai iPhone, ternyata interface-nya sangat membius. Betul-betul merubah paradigma. Setelah sekitar 3 jam-an main-main dengan iPhone, waktu buka laptop, I actually tried to slide the laptop screen to make the window scroll!!! What a fool.... And it took me almost two-to-three seconds to realize that!!! Luar biasa... bagaimana interface iPhone bisa merubah paradigma seseorang mengenai cara interaksi manusia dengan komputer.

Apa yang saya pelajari dari iPhone ini? Beberapa hal:
1. Interface harus simple! Di layar iPhone jarang sekali kita melihat lebih dari 5 buttons. Biasanya ada dua button navigasi di atas, lalu menu di atas atau di bawah. Sangat konsisten.
2. Saya harus bisa membuat interface yang sangat bersahabat dengan user, sehingga user yang sudah menggunakan program saya, tidak akan pergi ke lain hati lagi...
3. Harga mahal tidak jadi masalah. Telkomsel menjual iPhone dengan harga yang lebih mahal daripada pesaingnya (Blackberry Storm kayanya pantas jadi pesaing-nya). Sudah jelas iPhone kalah dalam banyak hal dari BB, tapi siapa yang tidak tergoda dengan interface-nya yang sangat classy.
4. Hampir semua fitur dalam iPhone resmi 'dijaga' oleh Apple. Komunitas Apple bahkan punya istilah yang unik dalam meng-unlock iPhone. Mereka bilangnya: "jailbreak" alias keluar dari penjara. Ternyata kemampuan processor iPhone jauh lebih hebat daripada yang dimunculkan. Banyak sekali setting-setting yang dibatasi oleh Operating System iPhone (sekarang versi 2.2.1). Tapi dengan penjagaan yang sangat ketat itu, Apple bisa menjaga agar iPhone itu bisa stabil dan sesuai dengan 'standard' Apple (biarpun untuk komunitas iPhone geeks, standard itu sangat tidak memuaskan). Tapi ya itu tadi yang hebat. Ibaratnya Apple bilang; "Ya, pokoknya, biarpun kemampuan iPHone ini bisa 10, saya batasi 7 aja deh...)", dan orang-orang awam (yang tujuannya untuk "PAKAI" iPhone, bukan "NGOPREK" iPhone -- seperti istri saya) cukup puas dengan itu. "So what?", katanya. Saya tawarkan istri saya untuk men-jailbreak iPhone-nya dan ditolak mentah-mentah. Saya juga setelah mendengar berbagai resiko jailbreak juga jadi ragu-ragu... Udah aja nunggu update Operating System 3.0 yang bisa di-dl gratis bulan juli nanti deh....


Ok guys... itu aja mengenai pendahuluan saya setelah absen hampir 4 tahun dari blogging di foxyland ini. Semoga bisa menjadi ice breaker dan membuat saya semangat untuk blogging lagi... :)

See you around guys!

Thursday, October 13, 2005

TIps: Mengirim dan menerima parameter dalam jumlah tidak terbatas

Hi all,

Welcome again to Foxyland. Kali ini saya ingin membagikan tips mengenai trik untuk menerima dan mengembalikan parameter dalam jumlah yang bisa dikatakan tidak terbatas. Tips ini boleh dibilang bukan hal baru, tapi saya rasa cukup banyak foxer-foxer yang belum tau metode ini.

Selama ini, Anda mungkin bisa memanggil fungsi lain dan mengirimkan parameter dengan cara seperti ini:

my_function (123)

FUNCTION my_function
LPARAMETERS liPara1
{body_of_function}
RETURN liReturnValue
ENDFUNC

Kalau yang dipanggil adalah form, anda bisa menggunakan event Init dari form untuk 'menangkap' parameter dan menggunakan DO FORM {form_name} WITH {para1, para2, ...} untuk memanggil form dan mengirim parameter.
Anda juga bisa menangkap return value dari form dengan meletakkan RETURN {any_value} di Unload event form dan menangkap-nya dengan parameter ...TO... pada perintah DO FORM anda;
DO FORM {form_name} WITH {para1, para2, ...} TO liReturnValue
Nah, sekarang bagaimana caranya kita bisa mengirim dan menerima parameter dalam jumlah yang tak terbatas?

Caranya, yaitu dengan memanfaatkan object dengan class Empty.

Coba lihat code berikut ini:

[vfp code]
LOCAL loMyObject
loMyObject = CREATEOBJECT("Empty")
ADDPROPERTY(loMyObject, 'iParameter1')
ADDPROPERTY(loMyObject, 'iParameter2')
ADDPROPERTY(loMyObject, 'cParaString1')
ADDPROPERTY(loMyObject, 'tJamTanggal')
DO FORM other_form WITH loMyObject
[end of vfp code]

Nah, dengan cara ini, kita bisa menangkap banyak parameter:
[vfp code lagi]
*!* Di init event dari other_form:
LPARAMETERS loParameter
ADDPROPERTY(THISFORM, 'oParameter')
THISFORM.oParameter = loParameter
[end]

Karena object di VFP di-pass sebagai reference, maka dengan cara di atas, apabila di other_form kita membutuhkan parameter tJamTanggal, kita tinggal menggunakan referensi THISFORM.oParameter.tJamTanggal. Demikian juga dengan parameter lainnya.

Mudah-mudahan bermanfaat!

Happy coding!

Foxy

Monday, May 30, 2005

Almost two months without internet

Hi gang!!!!

Hampir dua bulan saya hidup tanpa internet. Dua bulan yang sangat sibuk. Kami (saya dan keluarga) baru saja pindah ke rumah baru. Repot luar biasa. Tapi juga exciting luar biasa. Ini boleh dibilang adalah 'dream house' saya dan istri saya. Rumahnya memang lebih kecil dari rumah kami sebelumnya, tapi hampir semua detail sesuai dengan dream kami. Mulai dari style, lampu, dll. Dalam dua bulan terakhir ini, fokus kami hanya di rumah saja. Mendadak saya juga jadi seperti kuliah Interior Designer. Saya belajar teknik lighting, bermacam-macam lampu, dan efek apa yang diinginkan, bermacam-macam style furniture, dll-dll-dll. Itu masih belum urusan filter air, pengkabelan (kabel telpon, listrik, terus -- setelah berdebat dengan istri -- saya juga install kabel jaringan di rumah) , listrik, lokasi AC, feng shui, dan dll-dll-dll....

Repot tapi senang. Di malam hari, saya geder-gederan bikin program dan nyelesain project MRP. Siang ngurusin rumah. Sejak bulan lalu kami sudah pindah, tapi biarpun pindah ada aja yang masih harus diurus. Mulai dari dinding yang cat-nya belang, sampai kaca etsa untuk partisi ("gambar apa ya?", "warna atau putih doang?")

Sekarang rumah kami sudah lumayan enak. Sekarang lagi nyobain pasang wireless di rumah. Tapi kayanya ini juga harus dirubah lagi. Kayanya harus ditinggiin pakai tower, karena kok sering drop.

Anyway, I've been very busy, but this last few months has been one of the most exciting time in my life.

So... ini aja untuk kali ini. Next time ketemu lagi.

Foxy

Sunday, March 27, 2005

ExitOnOutsideClick

Tips berikut ini berguna apabila Anda ingin membuat suatu form yang apabila si user melakukan mouse click di luar form, maka otomatis form tersebut akan di release. Mungkin banyak dari Anda yang bertanya, "Untuk apa jenis form seperti ini?" --- he-he-he... sebenarnya banyak fungsinya. Jadi silahkan kreatif aja...

Untuk Demo, silahkan copy-and-paste kode di bawah ini, kemudian jalankan di VFP!

*!* Code Starts Here:
oFrm = CREATEOBJECT("frmExitOnOutsideClick")
oFrm.Show(1)
Return

DEFINE CLASS frmExitOnOutsideClick AS form


DoCreate = .T.
Caption = "ExitOnOutsideClick Demo by Foxy"
Name = "frmExitOnOutsideClick"

ADD OBJECT label1 AS label WITH ;
WordWrap = .T., ;
Caption = "Click yang dilakukan di dalam form " + ;
"akan berfungsi seperti biasa. Tetapi, coba saja click " + ;
"di luar form ini. Otomatis form ini akan tertutup!" + CHR(13) + ;
"Grid di bawah ini hanya berfungsi untuk demo saja...", ;
Height = 72, ;
Left = 12, ;
Top = 6, ;
Width = 348, ;
Name = "Label1"


ADD OBJECT command1 AS commandbutton WITH ;
Top = 216, ;
Left = 276, ;
Height = 27, ;
Width = 84, ;
Caption = "Click Me!", ;
Name = "Command1"


ADD OBJECT grid1 AS grid WITH ;
Height = 132, ;
Left = 12, ;
Top = 78, ;
Width = 348, ;
Name = "Grid1"


PROCEDURE clickme
lcMsg = "Click di terima oleh cmdClickMe.Click()" + CHR(13) + ;
"dan method ClickMe dijalankan..."
MESSAGEBOX(lcMsg, 64, "Click Me!")
ENDPROC


PROCEDURE Destroy
&& Kembalikan status ON KEY LABEL MOUSE ke default
ON KEY LABEL MOUSE
ENDPROC

PROCEDURE Click
&& Kalau click bukan terjadi di form ini, langsung keluar
IF !(MWINDOW() == ThisForm.Name)
ThisForm.Release()
ENDIF
ENDPROC

PROCEDURE Init
&& Rubah nama form supaya form dijamin unik
THISFORM.Name = SYS(2015)
&& Trap setiap mouse click di _Screen
&& ke event Click dari form ini:
ON KEY LABEL MOUSE _SCREEN.ActiveForm.Click()
ENDPROC

PROCEDURE command1.Click
&& Panggil method THISFORM.ClickMe()
THISFORM.ClickMe()
ENDPROC

PROCEDURE grid1.Init
CREATE CURSOR curTest (name C(30), address C(100))
SELECT curTest
APPEND BLANK
WITH THIS
.ColumnCount = 2
.AllowAddNew = .T.
.RecordSource = "curTest"
.Column1.Header1.Caption = "NAME"
.Column1.Width = 100
.Column2.Header1.Caption = "ADDRESS"
.Column2.Width = 200
ENDWITh
ENDPROC
ENDDEFINE

*!* Code Ends here


Happy coding!

Foxy

Thursday, March 24, 2005

Memeriksa tabel apakah ada duplikasi data atau tidak.

Pernahkah Anda perlu memeriksa tabel Anda; apakah di tabel itu (field tertentu) ada duplikasi data atau tidak? Kalau pernah, apa cara yang Anda gunakan? Berikut ini adalah skeleton dari simple query yang menampilkan duplikasi data yang ada di field pada tabel tertentu:


SELECT c_name, c_address, c_city
FROM customer
WHERE c_name IN
(SELECT c_name FROM customer GROUP BY c_name HAVING COUNT(*) > 1)


Catatan: kalau Anda menggunakan native vfp, jangan lupa menyertakan tanda titik koma untuk menyambung expresi antar baris.

Query di atas akan menampilkan nama, alamat, dan kota dari customer yang nama-nya ada lebih dari dua di data customer. Untuk memodifikasi sesuai dengan kebutuhan Anda, Anda bisa perhatikan frame berikut:

SELECT {field1}, {field2}, {field3}, ...
FROM {tabel}
WHERE {field_X} IN
(SELECT {field_X} FROM {tabel} GROUP BY {field_X} HAVING COUNT(*) > 1)


dimana {field_X} adalah nama field yang ingin dicari kemungkinan ada/tidak duplikasi data.

Mudah-mudahan bisa membantu menambah wawasan!

Foxy

Sunday, March 20, 2005

Wanita ingin dimengerti? Get Real!

Baru aja liat iklan Softex (please guys... jangan berpikiran ngeres dulu!)
Tag line terakhirnya: "Karena wanita ingin dimengerti..."
Menurut saya BULL! BIG MISTAKE! Come on guys! Face it! Kita nggak AKAN pernah bisa mengerti wanita. Jalur pemikirannya sangat kompleks. Kalau mau diceritain bisa lebih dari 100 jam (blog ini gak akan beres-beres) - dan itupun belum cukup! Anda nggak percaya? Coba kupingin kalau para wanita sedang 'ngobrol' (read: nge-gosip). I mean, LUAR BIASA. Dari satu topik ke topik yang lain, wuiiiih.... tau-tau di sini tau-tau di sana! Belum lagi kebiasaan mereka yang disebut 'curhat' aduh-aduh.... bercerita tanpa bermaksud untuk menemukan solusi!? Nuts...

So guys... I'm not an expert in woman psychology, neither am I a man having thousand girls surrounding me (though I like that idea very much ;) ) - but here is my suggestion to you guys: nggak usah repot-repot berusaha mengerti wanita, 'cause your gonna fall flat on your face to do that! Tanya pada semua wanita; mana yang mereka pilih: pria yang 'mengerti' mereka, atau pria yang 'mencintai' mereka? Aha, now you see what I mean? Women don't need to be understood, they need to be loved.

OK. Guys (and gals too...). See you around!

Foxy

VB is going down, VFP is moving up!

Dalam satu minggu terakhir ini Microsoft mengambil keputusan yang mengejutkan banyak developer classic VB di dunia. Microsoft memutuskan untuk menghentikan support kepada VB6. Sampai-sampai 100 MVP Visual Basic menandatangani petisi kepada Microsoft. Di sisi lain, VFP9 mendapatkan expose yang positif dari microsoft. Microsoft sampai-sampai 'memperkenalkan' VFP9 secara resmi. Padahal sejak dilepaskannya VFP dari keluarga Visual Studio (back in 2001 with VFP7), microsoft tidak pernah mengeluarkan pernyataan resmi mengenai VFP (kecuali satu halaman tanpa link dari web site resmi microsoft untuk menanggapi kontroversi VFP jalan di Linux). Apalagi, disebutkan juga dukungan untuk VFP9 akan dilakukan sampai tahun 2014. Jadi saya rasa, masih cukup banyak waktu untuk mempelajari VFP dengan serius dan memetik hasilnya. Memang betul, kita para software developer hanya pion di permainan catur software dunia. Tapi jangan salah. Dengan strategi yang benar, kita bisa maju terus sampai ke kotak akhir dan menjadi menteri.

Just my 2c
Foxy

Thursday, February 10, 2005

Gong Xi Fa Cai

Gong Xi, Gong Xi... :)

Selamat Tahun Baru Imlek untuk Anda yang merayakan. Semoga tahun Ayam akan menjadi tahun yang makmur untuk Anda, banyak hoki, dan selalu sehat.

Btw, ayam adalah salah satu makanan rubah (fox). Jadi harusnya, tahun ini developer yang menggunakan Visual FoxPro juga akan kenyang, karena makanan tersedia sepanjang tahun :)

Gong Xi, Gong Xi...
Wang Se Ru Yi...

Foxy

Saturday, February 05, 2005

U T M a g a z i n e G r a t i s

Halo foxer Indonesia!

Salah satu yang ingin saya lakukan dengan aktif di komunitas foxpro indonesia adalah memberi. Terus terang semangat sharing mztolo dan signature taz (2 Share, 2 Act, 2 Learn) banyak memberi inspirasi untuk saya. Jadi, inilah yang bisa saya bagikan kali ini: Anda bisa mendapat majalah Uni-ver-sal T h r e a d secara gratis.
Ketikkan URL berikut di browser Anda:
http://www.utmag.com/[nama_bulan+tahun]

[nama_bulan+tahun] adalah bulan dan tahun majalah yang Anda inginkan. Misalnya April2003, atau January2003 atau October2002.

Ceveat-nya, [nama_bulan+tahun] yang bisa Anda isikan hanya dari June2001 sampai October2003. Masalahnya, sebenarnya memang edisi tersebut (waktu itu) bisa dilihat secara gratis (waktu itu belum punya domain sendiri, masih di bawah www.universalthread.com). Tapi kemudian jadi komersil (CAN$ 50.00 setaun). Setelah komersil, kalau melalui home page-nya, bahkan edisi yang dulunya gratis-nya pun hanya bisa diakses oleh member. 'Gak tau kenapa (apakah disengaja atau tidak), ternyata kalau url-nya diisi langsung, maka majalah itu bisa diakses. Ya udah. Saya asumsi aja ini memang public domain.
Jangan kuatir. Biarpun informasinya sudah terlambat 3 bahkan hampir 4 tahun, tapi informasi-nya masih berharga dan tentu saja bisa dimanfaatkan.

Jadi... selamat membaca!

Best regards,
Foxy

Thursday, February 03, 2005

Sekolah Mahal! Semua mahal! Software kita harus mahal juga dong... ;)

Sekolah Mahal! Saya bulan Januari ini masukin anak ke TK. Bukan TK favorit sih sebenarnya, yah, menengah lah. Anda tau berapa biayanya? Uang pangkal Rp 5,550,000 dan uang sekolahnya Rp 300,000!!! TK lho! Bukan SMP atau SMA (sekarang SMU-ya?). Apa lagi saya masukin dua anak! Abisnya kembar. Mau gimana?! Gila memang! Tapi ya mau ngomong apa lagi? Sekarang harga memang gila-gilaan. Belanja ke supermarket aja, minimal duit Rp 100,000 udah harus keluar. Coba aja liat, Attack 12,500, Susu anak Frisan Flag 1 kilo Rp 42,000, Tissue Nice satu pak Rp 15,000, mie instan 20 biji Rp 15,000 - na lho, udah berapa tuh! Belum diapers (Mamy Poko M-26 Rp 56,000), dan bahan makanan seperti telur, daging, sayur, dll.

Kesimpulan; software yang kita jual juga harus dapat memberikan hasil yang mencukupi. Kalau nggak? Masa' software developer harus nombok?

Foxy

Beli Original atau versi Pasar Minggu?

Di forum fox-id (http://www.fox-id.com) baru saja ada post dari nyolik yang mengatakan bahwa VFP9 yang sudah tersedia di 'toko-toko kesayangan'. Sebelumnya, mztolo juga sudah secara halus menginformasikan hal ini dengan mengatakan 'saran dari mBah Dukun' untuk 'silahturahmi' ke Mangga Dua. Maksudnya saya yakin sudah jelas; VFP9 bajakan sudah tersedia, rekan-rekan yang berminat silahkan mencari sendiri.

Terus terang saya juga membeli VFP9 versi Mangga Dua. Saya rasa dua minggu yang lalu. Saya gak duga akan secepat ini launching di Indonesia. Waktu versi 8 dulu, rasanya waktunya agak lama (mungkin sekitar 5 atau 6 bulan). Saya memang baru mau beli VFP9 original bulan depan. Maklum, bulan ini pengeluaran sangat banyak karena masukin anak ke TK (blog lain untuk itu). Mungkin Anda bertanya, "Ngapain beli original, kalau udah punya bajakan?". Nah, saya punya argumen begini: saya adalah software developer. 'Gak tau kapan, tapi ada kemungkinan suatu saat sweeping software akan sampai ke saya. Kalau saat itu tiba, saya tidak mau kedapatan dengan software bajakan. Jadi, ya terpaksa saya harus membeli VFP9 original. Yah, punya deh, minimal satu. Operating system udah punya yang original - bawaan dari laptop saya. Office XP, waktu itu juga terpaksa beli. Pokoknya minimal laptop saya software-nya original semua (atau freeware). Jadi kalau kerja tenang.

Anyway, dengan beli bajakan, sebenarnya ada minus-nya juga lho:
1) Semangat untuk belajar tidak maksimum, karena toh harga software-nya murah. Kalaupun gak dipelajari ("yah, someday-lah"), juga gak rugi-rugi amat. Karena itu, perlu untuk menyadari apa yang ada di tangan kita (sulitnya; tidak mudah menyadari kalau harga software-nya cuman 25,000). Kesempatan dengan harga yang murah! Manfaatkanlah kesempatan ini untuk belajar. Meminjam istilah mztolo: NSL - Non Stop Learning.
2) Hati-hati. Dengan membeli bajakan (=beli software murah), jangan sampai mengurangi kepercayaan diri kita untuk menjual software dengan harga tinggi. Jangan sampai menciptakan mental 'menyetujui pembajakan software'. Pokoknya, biarpun software untuk membuat program kita bajakan, tapi software yang kita buat bukan bajakan, dan tidak akan ditemui bajakannya. Jadi untuk para client, silahkan beli software kita dengan harga original. Karena itu, salah satu prinsip saya adalah yang saja jual adalah jasa, bukan software. Kalau software, banyak tuh, bajakannya di mangga dua. Tapi kalau jasa saya, gak ada bajakannya kan? ;)

Terlepas dari itu semua, selamat menikmati VFP9. Jangan lupa pelajari Report Listener dan jangan ragu menggunakan SQL query. Engine SQL query di VFP9 sudah di tulis ulang dan di optimasi lebih baik lagi, jadi kecepatannya juga semakin baik. Nikmati juga dokumentasi yang punya layout lebih manis, juga PEM window yang lebih manis dengan customize font dan multi color-nya. Pendek kata; Enjoy!

Regards,
Foxy

Thursday, January 27, 2005

"Berapa harga program yang Anda buat?"

"Berapa biayanya?", ini adalah pertanyaan yang pasti ditanyakan oleh client (atau calon client) Anda apabila Anda menawarkan program atau aplikasi yang Anda buat. Ini selalu jadi masalah, karena seringkali sulit untuk menentukan suatu angka hingga akhirnya si client sepakat untuk membeli. Kalau akhirnya client batal memesan, banyak orang yang kemudian down dan mengatakan, "Wah, salah ngasih harga nih. Kemahalan!" Kebingungan makin bertambah kalau si client menawar harga software kita dengan berbagai alasan. Mau dikasih, kok harganya jauh dari yang diharapkan. Mau nggak dikasih, takutnya malah mental. Karena itu, biasanya banyak software developer (atau mungkin ada yang senang juga dengan istilah freelance programmer) takut menyebutkan harga aplikasinya. Tapi, itu juga jadi masalah. Bayangkan gimana kalau Anda ketemu dengan seseorang. Setelah ketemu, ngobrol-ngobrol, lalu karena ternyata dia adalah penjual martabak, Anda bertanya berapa harga martabak yang dia jual, dan jawabannya, "Ehm.. eh, uh, ehm, yah tergantung sih..." :D Sounds familiar?

Nah, karena itu menurut saya kita sebagai software developer harus menilai diri kita sendiri lebih tinggi. Jangan ragu untuk memberikan harga yang tinggi (bukan mahal!).Berikut ini adalah ide-ide dan pemikiran saya. Sengaja saya buat dalam bentuk point-point, karena setiap point bisa tidak saling berhubungan (moreover saya report kalau harus menyusun kalimat supaya saling berhubungan :D)

1) Dengan membeli aplikasi kita, client bukan hanya membeli aplikasi itu saja, tapi dia juga membeli jasa dan waktu kita.
Kalau client Anda menelpon Anda dan menanyakan gimana caranya ngirim e-mail dengan file attachment, atau menanyakan gimana caranya nge-crop gambar hasil digital cameranya, apa kira-kira jawaban Anda? Apakah jawaban Anda, "Wah, maaf Pak. Itu bukan bidang saya", atau: "Saya bisa jelasin Pak. Biayanya Rp 100,000 per jam kalau Bapak datang ke sini. Kalau saya yang kesana, biayanya Rp 200,000 per jam. Oh ya, minimum charge Rp 100,000 lho Pak...", atau yang lebih parah lagi: "Wah Pak, saya gak tau."
See? Bukan hanya aplikasi Anda yang Anda jual. Anda juga menjual jasa Anda, waktu Anda, dan pengetahuan Anda mengenai komputer.

2) Siapkan untuk memberi 11 apabila client membeli 10 (karena client pasti minta tambah).
Dengan kata lain; siap-siaplah untuk harus meluangkan extra waktu dan membuat extra program. Kenapa? Karena client pasti akan meminta tambahan 'sedikit' di luar batasan program yang awalnya sudah disepakati. Mereka tidak mengerti bahwa tambahan 'sedikit' itu, bisa jadi kerjaan empat, lima atau bahkan delapan jam untuk kita. Jadi, selalu menyiapkan waktu extra. Hal ini juga berarti selalu tambahkan nilai harga jual software kita untuk mengantisipasi.

3) Pelajari kecepatan Anda membuat aplikasi. Berapa lama waktu yang Anda butuhkan untuk membuat sebuah aplikasi. Satu hari? Dua hari? Satu minggu? Satu bulan? Dua bulan? Tiga bulan? Enam bulan? Jadikan ini sebagai bahan referensi untuk memberi timeline kepada client Anda. Hati-hati! Kalau Anda bisa menyelesaikan program dalam dua bulan, lebih baik mengatakan program baru selesai setelah tiga bulan, tetapi di bulan kedua Anda bisa menyelesaikannya. Ini bukan hanya lebih baik, tetapi jauh-jauh-jauh lebih baik daripada mengatakan selesai dalam dua bulan, tetapi Anda terlambat satu minggu!

4) Masih berhubungan dengan point 3) di atas, dari waktu yang kita perlukan, susun jadwal berapa lama kita bisa bekerja dalam satu minggu. Kemudian setelah memperkirakan waktu, kalikan waktu yang Anda butuhkan dengan nilai Anda per jam. Saya pribadi sekarang menilai harga waktu bagi saya saat membuat program di rumah adalah Rp 100,000 per jam. Anda mungkin bisa menilai waktu Anda dengan nilai lain. Terserah Anda. Tapi yang penting, nilai waktu Anda supaya Anda bisa lebih bertanggungjawab dengan scheduling yang Anda susun sendiri.

5) Jangan lupa membebankan biaya service di harga program. Pertimbangkan berapa kali kira-kira Anda harus ke sana. Berapa jam Anda di sana. Berapa biaya transportasi (dan akomodasi bila ada) dan biaya makan yang Anda perlukan.

6) Setelah Anda menjumlahkan semuanya, besar kemungkinan Anda akan mendapatkan harga yang jauh lebih besar daripada yang selama ini Anda berikan kepada client Anda sebelumnya. Sekali lagi, jangan takut untuk memberikan harga tinggi. Profesi kita patut dihargai lebih. Anda tau, gaji programmer-programmer dan system developer di corporate-corporate multi national? Besar lho! Kalau ada di antara Anda yang bilang, "Ah.. kecil kok, cuman ....", nah, mungkin Anda lupa memperhitungkan tunjangan-tunjuangan dan fasilitas-fasilitas yang diberikan perusahaan! Saya melihat banyak software developer yang 'kekurangan' karena penghasilannya tidak mencukupi. Salah siapa nih? Coba deh, kalau Anda sudah membuat aplikasi Anda, buat juga Cost Benefit. Cara membuat Cost Benefit gak susah kok. Contoh:
Untuk dapat menghasilkan laporan sesuai dengan aplikasi MRP yang Anda buat, maka perusahaan X harus:
- Menggaji satu tenaga pembukuan dengan gaji Rp 1,000,000 per bulan
- Menggaji tiga tenaga pencatat dengan gaji Rp 600,000 per bulan
- Tidak dapat memperoleh laporan penjualan secara real time, berarti kehilangan kesempatan penjualan repeat order lebih kurang 0.5% dari omzet bulanan. Dengan omzet Rp 1,000,000,000 per bulan, kerugian ini mencapai Rp 5,000,000 per bulan.
- Tidak dapat memperoleh laporan outstanding order secara real time, berarti kehilangan kesempatan follow up yang lebih baik, dan berarti juga kemungkinan berkurangnya kepercayaan customer. Kerugian ini dapat mencapai 0.5% dari omzet bulanan. Dengan omzet Rp 1,000,000,000 per bulan, kerugian ini mencapai Rp 5,000,000 per bulan.
- Tidak dapat memperoleh laporan work-in-process secara real time. Berarti potensial buruh tidak bekerja produktif dan keterlambatan hasil produksi. Kerugian yang bisa ditimbulkan:
Inefisiensi karyawan 0.5% = 0.5% x Rp 30,000 = Rp 150.00 per karyawan per hari
Ada 500 karyawan: 500 x Rp 150.00 = 75,000 per hari
Asumsi 25 hari kerja: 75,000 x 25 = 1,875,000 per bulan.

Total per bulan = Rp 13,475,000
Total per tahun = Rp 144,750,000

Harga program dan jasa Anda: Rp 80,000,000

Berarti program Anda akan pay out dalam:
Biaya program = Rp 80,000,000 / Biaya yang keluar tanpa program = Rp 144,750,000 per tahun
= 0.55268 tahun =
= 6 bulan ++
= 7 bulan.

Jadi investasi Rp 80,000,000 akan pay out dalam 7 bulan.

Tentu saja dalam membuat analisa Cost Benefit, perlu data yang lebih lengkap dan lebih akurat. Tapi, pada intinya, jangan takut untuk memberi harga yang tinggi.


Nah, kesimpulan yang saya harap Anda dapat dari tulisan saya ini. Hidup jadi software developer (programmer freelance) bisa menyenangkan juga kok!

Okay guys, segini aja artikel dari saya. Untuk Komentar dan uneg-uneg, silahkan post di fox-id. Kalau bisa saya jawab, pasti akan saya jawab.

Thanks for reading!

Foxy

Thursday, December 23, 2004

Welcome again!

Heya gank!

Thanks guys, for visiting Foxyland again.
Berita pertama: seperti yang sudah Anda lihat; Foxyland sudah pindah. Mudah-mudahan di sini lebih nyaman, karena gak ada passport .NET yang harus Anda isi untuk memberi comment.

Udah lama saya gak nulis blog. Alasannya; yah, klise deh... sibuk... Ada dua proyek baru yang menyita banyak waktu. Gimana gak nyita waktu, due date kedua proyek itu tanggal 3 Januari 2005! Kemaren malam rencananya, saya mau nulis, tapi kemaren malam saya keasyikan bikin replication di SQL Server. Tau-tau udah jam 02:30!

Enough mengenai project. Sekarang mengenai my life dulu. Liburan udah di depan mata. Besok hari libur sudah dimulai. Maka, dimulailah era kacau. Soalnya, kalau anak dua itu sekolah, mereka pulangnya udah siang (sekitar jam 12-an) dan pasti kecape'an. Mereka langsung bersih-bersih, makan, terus tidur siang sampai jam 14:30, atau kadang bisa sampai jam 16:00. Jadi kalau saya kerja di rumah, saya bisa kerja dengan tenang. Kalau saya pergi ke client, yang di rumah juga bisa santai. Tapi, saat liburan.... Aaaaaarrrgggghhhh... anak dua itu punya energi, gak tau berapa, gak tau berapa ratus juta joule. Unlimited kali'! Jadi mereka bisa maiiiiinnn terus, gak mau tidur siang, dan bikin kacau jadwal semua orang. Enaknya memang di ajak keluar kota. Rencana beberapa bulan yang lalu memang mau ke Bali, tapi ternyata Bali harus lain kali. Tahun ini si kembar itu harus masuk ke TK (mereka sekarang di playgroup). Anda tau berapa biaya masuk TK? Salah satu TK terbaik di kota Bandung ini uang masuknya Rp 7,000,000 (yup, that's seven million. It's not a typo!). TK alternatif lain yang sedang kami pertimbangkan juga, uang masuknya 'lebih murah'; Rp 4,000,000. Dan itu per anak! And believe it or not, pendaftaran untuk tahun ajaran 2005-2006 dimulai bulan Januari ini. Jadi, kalau ke Bali, bisa totos deh. Yah, paling juga bisa ke Jakarta atau ke Puncak. Kebetulan ada saudara di Jakarta yang udah lama gak ketemu.

And now, untuk tips and trick. Untuk tips and trick kali ini, saya akan membagikan suatu konsep yang mungkin baru bagi sebagian dari Anda. Konsep ini dikenal dengan istilah Data Driven Application. Pada dasarnya, inti dari konsep ini adalah, alur aplikasi ditentukan oleh data. ("Hah, maksudnya apa?"). Implementasi sederhana dari konsep ini adalah, Anda punya program seperti ini:
LOCAL lo
USE data1
LOCATE
liField1 = data1.field1
IF liField1 = 1
Messagebox ("Nomor 1")
ELSE
Messagebox ("Nomor 2")
ENDIF

Sederhana kan? Jadi, dengan merubah isi dari field1 di file data1.dbf, si program akan melakukan hal yang berbeda. Kalau isinya 1, maka yang dilakukan adalah mencetak 'Nomor 1', dan kalau isi bukan =1, yang dicetak adalah 'Nomor 2'.

Implementasi yang lebih jauh adalah data itu bukan sekedar nilai yang digunakan dalam kondisi. Tetapi, isi dari data itu adalah program. Bingung? Silahkan coba jalankan program di bawah ini, kemudian silahkan dipelajari. Cara menjalankan bisa kan? Simply, copy-and-paste coding di bawah ini ke command editor di VFP Anda. Bingung cara membuka command editor? Gunakan perintah MODI COMM demo.prg dari command window Anda!


*********************************************************************
* Program : Demo.prg *
* Author : foxy *
* Notes : Mendemonstrasikan konsep awal dan ide Data Driven *
* application. *
* Tools : VFP8SP1, VFP9b *
* *
* Feel free to modify and implement the idea for your needs. *
* *
*********************************************************************
&& Baris berikut memanggil procedure yang menyiapkan tabel
&& Baris ini mungkin tidak diperlukan pada real apps, karena
&& tabel itu sudah harus disiapkan saat design time
DO PrepareTable

&& Berikutnya program menanyakan primary key dari tabel
&& Pada aplikasi yang sesungguhnya, primary key ini bisa merupakan
&& hasil dari kondisi tertentu; misal:
&& IF llProgBelumDiregistrasi
&& liPK = 1
&& ELSE
&& liPK = 2
&& ENDIF
liInput = INT(VAL(INPUTBOX("Key_PK:", "Please enter primary key")))
IF liInput > 0 AND liInput <= 2
SELECT test
LOCATE FOR key_pk = liInput
&& Pada kasus seperti ini, saya sering melewatkan pengecekan
&& hasil LOCATE. Soalnya, karena tabel test sudah disiapkan
&& pada saat design, key_pk = liInput dijamin ada.
&& Jadi, pemeriksaan dengan FOUND() bisa diabaikan.
&& Lalu, simpan isi memo field coding ke variabel
STORE coding TO lcString
&& Jalankan variabel itu!
lvReturnValue = EXECSCRIPT(lcString)
ELSE
lcMsg = "PK should've either 1 or 2"
MESSAGEBOX(lcMsg, 64, "Ups..")
ENDIF

&& Procedure ini hanya untuk mempersiapkan file test saja.
&& Tidak ada yang spesial di procedure ini.
&& Cuman Insertion simple saja.
&& Setelah selesai, control dikembalikan ke main.
PROCEDURE PrepareTable
CLOSE TABLES ALL
IF FILE("test.dbf")
DELETE FILE test.dbf
ENDIF
CREATE TABLE test FREE (key_pk i, coding M)
TEXT TO lcCode1 TEXTMERGE NOSHOW PRETEXT 2
MESSAGEBOX("I Sail Over Number one Sea")
ENDTEXT
TEXT TO lcCode2 TEXTMERGE NOSHOW PRETEXT 2
LOCAL lcInput
lcInput = INPUTBOX("Password:", "Sailing is for authorized person only!")
IF lcInput = "foxy"
lcMsg = "Cool Password." + CHR(13) + "How d'ya get it?"
ELSE
lcMsg = "Teeet... Wrong password." + CHR(13) + ;
"FYI: the password should be foxy"
ENDIF
MESSAGEBOX(lcMsg, 0, "Now you're running two")
ENDTEXT
INSERT INTO test ;
VALUES (1, lcCode1)
INSERT INTO test ;
VALUES (2, lcCode2)
ENDPROC

***************************************************************************
* End

Ok. Semoga bisa menambah wawasan...

Foxy