Category Archives: umum

Pentingnya memahami Ilmu Informatika secara menyeluruh

Hari ini saya menemukan link ke sebuah pertanyaan menarik di Stack Overflow. Sebuah pertanyaan sederhana: mengapa menjumlahkan elemen yang nilainya kurang dari nilai tertentu dalam array yang terurut, lebih cepat dari melakukan operasi yang sama pada array yang tidak terurut. Lebih jelasnya silakan baca pertanyaan dan jawabannya di sini:

Why is processing a sorted array faster than an unsorted array?

Ada beberapa hal menarik dari jawaban pertanyaan tersebut.

Pertama: meskipun Anda memprogram high level sekalipun (menggunakan Java/Ruby/Python, atau bahasa lain yang menggunakan JIT), Anda akan tetap dibatasi oleh hardware. Anda tetap perlu mengerti hardware untuk membuat aplikasi yang performasinya tinggi.

Kedua: perhatikan bahwa dengan mengetahui sebab dari masalah, kita bisa mempercepat program, tanpa menggunakan sorting. Cukup dengan menggunakan manipulasi bit yang menghilangkan branching. Kita ingin menghilangkan sorting, karena sorting sendiri butuh waktu.

Ketiga: dalam kasus tertentu, compiler bisa mengoptimasi jika diberi flag yang tepat. Tapi kita tidak bisa menggantungkan diri pada compiler saja. Compiler yang berbeda menghasilkan kode yang berbeda, dan hasilnya bisa sangat jauh berbeda. Misalnya disebutkan bahwa compiler Visual C++ 2010 tidak bisa mengoptimasi kodenya, sedangkan compiler Intel bisa melakukannya dengan sangat baik.

Keempat: Perhatikan juga bahwa optimasi compiler dibatasi oleh hardware. Hardware tertentu (misalnya Intel sejak Pentium Pro) mendukung instruksi conditional move (di assembly Intel, instruksi ini disebut dengan CMOV) yang tadinya perlu manipulasi bit manual (AND, OR, dsb). Anda tidak bisa menggunakan optimasi ini di semua hardware, apalagi jika Anda menargetkan CPU model lama (banyak digunakan di embedded device).

Mungkin sebagian dari Anda mengira pertanyaan tersebut agak mengada-ada: untuk apa mencari jumlah bilangan yang kurang dari N dan dilakukan berulang-ulang, kalau sekali saja kan hanya butuh beberapa milidetik. Dan berbeda beberapa milidetik saja kan harusnya tidak berpengaruh bagi user.

Saya terpikir beberapa aplikasi dalam dunia nyata yang mungkin membutuhkan penjumlahan secara cepat tapi berulang-ulang. Saya berikan contoh kecil: Misalnya Anda punya aplikasi interactive data viewer, dengan slider yang bisa diubah nilainya dengan mouse (sangat cepat)

  1. Anda punya array yang berisi daftar jumlah gaji semua orang pegawai di sebuah kota (arraynya tidak terurut)
  2. Kita ingin menampilkan secara interaktif: jika saya set slider ke nilai 1 juta, maka saya akan melihat bahwa total gaji semua orang yang dibawah satu juta adalah X
  3. saya bisa mengubah nilai di slider, dan menghitung ulang total semua orang yang gajinya di bawah 2 juta. Saya bisa menaik turunkan slider dengan sangat cepat, ratusan kali per detik nilai slider bisa berubah.

Perhatikan bahwa meskipun contoh ini hanya menyatakan kurang dari X, tapi sebenarnya berlaku juga untuk operasi lebih dari X, atau X dalam range tertentu.

Dalam contoh ini: perbedaan interaksi antara beberapa milidetik dan beberapa puluh milidetik bisa sangat terasa. Jadi mengerti untuk mengurutkan data (atau menggunakan trik manipulasi bit) sebelum menjumlahkan bisa membuat interaksi semakin smooth. Menggunakan database untuk tujuan animasi yang sangat smooth seperti itu tidak akan berhasil (latensinya sangat tinggi), apalagi misalnya devicenya kemampuannya processing/komputasinya rendah (misalnya tablet atau smartphone).

Sebenarnya saya bisa menunjukkan contoh yang lebih kompleks lagi (misalnya dalam hal komputasi piksel grafik), tapi nanti pembahasannya akan ngelantur ke mana-mana. Hal yang ingin saya tekankan adalah: ada banyak persoalan serupa dalam dunia nyata semacam ini. Ini adalah penyederhanaan, supaya inti masalah bisa dilihat lebih jelas.

Seringkali jika ada yang menunjukkan bahwa optimasi seperti ini diperlukan, jawaban programmer yang malas adalah: beli saja hardware yang lebih cepat, masalahnya kan beres. Perlu dicatat juga: bahwa membeli hardware yang lebih cepat tidak selalu menjadi solusi.

Misalnya Anda menjual aplikasi Anda di Apple appstore, Anda harus mendukung hardware terlambat sampai tercepat. Jika Anda bandingkan iPad generasi pertama dan kedua, maka perbedaan hardwarenya sangat jauh: memori menjadi 2x lipat, prosessor menjadi jauh lebih cepat (dari single menjadi dual core). Anda bisa mengabaikan 14.8 juta pengguna iPad 1, tapi penjualan aplikasi Anda bisa menurun jauh.

Mungkin Anda terpikir untuk melakukan komputasi di server saja. Tapi berapa delay karena latensi jaringan? apakah kecepatannya cukup acceptable untuk membuat interaksi yang smooth?

Jika saya rangkum, semua hal tersebut menunjukkan: betapa perlunya kita belajar ilmu informatika atau computer science secara baik dan menyeluruh. Misalnya dalam contoh yang sangat kecil ini:

  1. Dalam arsitektur komputer, kita belajar mengenai batasan hardware, bagaimana arsitektur CPU superscalar bekerja.
  2. Dalam pelajaran algoritma, kita belajar mengenai kompleksitas algoritma. Bagaimana memilih algoritma yang baik.
  3. Dalam pelajaran compiler, kita bisa tahu optimasi apa yang bisa (dan tidak bisa) dilakukan oleh compiler
  4. Dalam pelajaran networking, kita bisa tahu mengenai latensi jaringan (jika ingin memindahkan komputasi ke server)

Jadi menurut saya, orang-orang yang ingin membatasi pelajaran komputer hanya dengan materi yang praktis saja, tidak akan berhasil.

Masih Ingin Banyak Belajar

Dari dulu ada banyak sekali hal-hal yang masih ingin saya pelajari yang berhubungan dengan pemrograman, ada banyak hal yang ingin saya buat. Setiap kali saya melihat sesuatu dilakukan, saya penasaran: bagaimana sih caranya teknologi itu bekerja? rasanya seperti apa sih memprogram benda seperti itu? Sekarang saya ingin menuliskan sebagin hal yang sudah saya pelajari/lakukan, dan hal-hal yang ingin saya lakukan. Sebagian ini bisa dianggap resolusi 2012.

001

Ini beberapa daftar keinginan saya dari mulai waktu jaman SMU dulu yang saya ingat saat ini yang sudah kesampaian:

  • memprogram virus polimorfik
  • membuat antivirus
  • Membuat animasi dengan assembly yang kurang dari 100 byte (waktu itu saya membuat animasi API)
  • membuat program kompresi (cuma pernah huffman, belum yang lain)
  • membuat game mode grafik (dulu pernah membuat beberapa, tidak ada yang benar-benar selesai, tapi sudah cukup puas)
  • memproses gambar (teknik dasar manipulasi piksel)
  • membuat daemon
  • memprogram Wii (porting 2 emulator)
  • membuat server HTTP, proxy server
  • mengimplementasikan beberapa enkripsi, dan setidaknya memahami berbagai jenis enkripsi (tidak pusing lagi dengan istilah stream, block, cbc, dsb)
  • menulis program dengan FORTAN (cuma untuk tugas kuliah, setelah itu pernah menulis bagaimana menghubungkan gfortran dengan DELPHI)
  • membuat aplikasi desktop dengan GUI di Windows, Linux, OS X
  • menulis sendiri shellcode untuk exploit buffer overflow
  • memprogram set top box, yang punya fitur DVD player (dengan Windows CE)
  • memprogram J2ME (pengalaman pertama memprogram mobile device dengan SL45, HP Java pertama)
  • memprogram serial port, modem, STK (Sim toolkit), SMS
  • membuat program yang berhubungan dengan SMS center
  • memprogram Palm OS, Symbian, BlackBerry
  • memprogram mesin EDC (mesin untuk swipe kartu kredit, mencetak tanda terima)
  • membaca source code Linux dan FreeBSD (serta NetBSD). Sudah berhasil memporting kernel Linux dan FreeBSD dan kodenya pernah direview oleh salah satu developer FreeBSD
  • membuat aplikasi web dengan PHP, Java, Perl, Python
  • membuat aplikasi dengan HTML5 dan ActionScript
  • memprogram microcontroller (ATMEGA, PIC, dan MSP430)
  • memprogram jam tangan (MSP430)
  • Mempelajari assembly MIPS
  • Reverse engineering berbagai program
  • Membuat shareware yang dijual
  • Menjual aplikasi BlackBerry di appworld
  • membuat program untuk update ROM handphone (Acer E130)
  • membuat parser dan translator sederhana (salah satunya adalah interpreter BASIC dalam JavaScript)

Masih ada beberapa yang ingin saya lakukan, tapi belum karena alasan ini dan itu:
Continue reading

Review Buku “Coders at Work: Reflections on the Craft of Programming”

Akhir-akhir ini saya sudah cukup jarang membaca buku programming. Saya lebih sering belajar hal baru dari tutorial dan dokumentasi di Internet. Saya lupa awalnya bagaimana, tapi saya menemukan (lagi) buku “Coders at Work: Reflections on the Craft of Programming”. Sebelumnya saya pernah menemukan versi bajakannya di internet, tapi tidak pernah saya selesaikan. Karena sekarang sudah punya Kindle, saya beli versi kindlenya, yang harganya lebih murah dari versi cetaknya.

Bukunya tidak terlalu tebal (632 halaman versi cetak), tapi karena sering terganggu, agak lama juga saya menyelesaikan buku ini.
Continue reading

Belajar Pemrograman (di luar bangku kuliah)

Ada beberapa orang yang membaca blog ini lalu mengirim email atau berkomentar. Kira-kira pertanyaannya begini: “Saya masih muda, tertarik pemrograman, harus mulai dari mana?”, “Saya dulu tidak kuliah informatika/komputer, tapi sekarang tertarik untuk memprogram, harus mulai dari mana?”, “Saya bingung mau mulai memakai bahasa apa”, “Compiler mana yang harus saya pakai?”, “Saya sudah mulai belajar memprogram, tapi saya nggak tau mau bikin software apa, ada ide?”.

Jawaban saya sebenarnya sangat sederhana: programlah yang Anda suka. Ini akan berpengaruh pada bahasa dan tools yang perlu Anda pakai. Misalnya Anda tertarik pemrograman karena ingin memprogram handphone Android Anda, maka belajarlah Java, belajar memakai IDE Android Studio (walau tidak wajib, tapi memakai Android Studio akan lebih bagus untuk pemula). Jika ingin memprogram iPhone, belilah Mac, belajar memakai XCode, dan belajar memprogram dalam Objective-C/Swift. Tapi sebenarnya itu juga tidak 100% benar, karena ada beberapa opsi dalam memprogram platform tertentu (tidak harus Java di Android, tidak harus Objective C/SWIFT di iOS).

Di tahun 80-an, bahasa yang mudah dikuasai dan bisa jalan di berbagai platform adalah BASIC. Sekarang yang mudah bagi pemula dan jalan di berbagai platform adalah HTML dan JavaScript. Jika niat Anda ingin membuat aplikasi yang jalan di berbagai platform, cobalah belajar HTML dan Javascript. Dengan tools/sdk seperti Titanium dan PhoneGap, Anda cukup belajar satu bahasa dan bisa berjalan di multi platform.

Lalu setelah belajar bahasa dan toolsnya, apa yang harus dibuat? itu terserah Anda. Cobalah membuat aplikasi yang Anda sendiri mau memakainya. Dengan membuat aplikasi untuk diri sendiri, Anda akan tau segala macam kekurangan aplikasi Anda. Jangan khawatir berpikir: aplikasi semacam ini sudah banyak, males ah bikinnya. Jika begitu cara berpikirnya, maka cuma akan ada beberapa lukisan bunga (ngapain ah ngelukis bunga, dah banyak yang bikin), dan tidak ada orang yang mau membuat apapun (misalnya tukang kayu akan bilang: ah ngapain bikin kursi sendiri, beli juga banyak).

Belajar memprogram itu enak karena umumnya tidak butuh bahan ekstra. Kalau lukisan Anda gagal, Anda perlu beli kanvas dan cat baru, kalau kursi buatan Anda gagal, Anda harus beli kayu lagi. Anda cuma butuh waktu untuk memperbaiki atau mengulang lagi jika program Anda salah.

Jadi intinya adalah: mulailah dari yang membuat Anda tertarik, maju terus, silakan coba-coba, jangan takut gagal.

Kenapa orang membuka source codenya?

Saya membaca di sebuah majalah Indonesia yang berusaha menjelaskan kenapa orang mau membuat software open source. Di situ sedikit sekali disebutkan motivasi yang ada dan yang paling dibahas adalah developer atheis yang ingin berbuat kebajikan dalam hidup ini. Di posting ini saya hanya ingin menyatakan bahwa ada banyak motivasi lain bagi seseorang untuk membuat software open source, dan tidak perlu satu artikel penuh untuk membahas satu motivasi.

sqlite

Ada alasan Komersial. Banyak orang yang tidak tahu bahwa ada banyak cara menghasilkan uang dari open source. Berikut ini saya tunjukkan beberapa di antaranya:

  • Developer membuat restriksi tertentu, misalnya jika ingin dipakai di aplikasi komersial, silakan bayar ke developer tersebut, atau buka source Anda. Contohnya lisensi GPL.
  • Developer menjual support untuk softwarenya (contoh: MySQL, gcc). Banyak pihak butuh support jika terjadi masalah di server mereka.
  • Developer punya versi yang lebih lengkap dan lebih bagus dari versi open sourcenya (contoh OpenBTS). Ini sedikit seperti model shareware, ada versi yang bisa dicoba, dan ada versi berbayarnya.
  • Developer punya plugin/module/library/theme untuk software open source yang bisa Anda beli (contoh: WordPress). Ini bisa banyak variannya, misalnya menjual tools khusus agar aplikasinya mudah dideploy di enterprise.
  • Developer menjual dokumentasi untuk softwarenya. Contohnya dokumentasi JPos harganya 50 USD. Programmer bisa mempelajari sendiri source codenya, tapi butuh waktu berapa jam? lebih murah membeli panduannya daripada berkutat dengan source code.
  • Website software tersebut ada iklannya, jadi developer mendapat uang dari iklan (banyak sekali proyek open source seperti ini).
  • Di software open source yang dipaketkan standar, ada iklannya (jika ingin versi tanpa iklan, silakan compile sendiri, contoh Free Download Manager)
  • Developer ingin supaya saingan saya yang closed source beralih ke software miliknya (kemudian membayar support atau membeli buku, atau melihat iklan di webnya, banyak contoh ini, misalnya OpenOffice). Sebagian orang juga berpikiran bahwa cara ini yang dipakai oleh Microsoft: biarkan saja sebagian orang membajak, asalkan perusahaan besar membayar lisensi Windows dan Office.
  • Developer ingin mempromosikan softwarenya untuk platform lain. Misalnya dulu Qt gratis di Linux, tapi komersial di Windows (sekarang gratis untuk semua platform).
  • Developer dibayar pihak lain atau bekerja sama dengan pihak lain, dan software tersebut sebenarnya mempromosikan produk mereka. Misalnya program yang hanya bisa melakukan koneksi ke database komersial tertentu. Firefox bekerja sama dengan Google (menjadikan Google sebagai search engine default).
  • Developer/perusahan ingin menguasai pasar dan akan mengambil keuntungan dari produk lain. Contohnya: Java. Oracle akan mengambil keuntungan dari berbagai application server for Java. Teknologi dasar Java sendiri bisa digratiskan dan diopensourcekan agar terkenal di berbagai platform.

Ada alasan personal. Alasan personal ini juga bisa banyak sekali:
Continue reading

Asyiknya Open source

Sebagai orang yang cinta programming, saya sangat suka open source. Kali ini saya ingin menceritakan pengalaman pribadi saya dengan open source baru-baru ini. Sebagai orang yang sudah 3 kali mewakili Indonesia di Asia Open Source Symposium dan menjadi panitia ketika acara diadakan di Indonesia, saya sudah banyak mengemukakan dan mendengar masalah bagusnya open source sebagai ideologi dan untuk bisnis. Nah kali ini saya hanya akan membahas dari sudut pandang seorang pribadi yang cinta programming. Untuk Anda yang ingin mempertanyakan open source dari segi bisnis dan lain-lain, akan saya bahas lain waktu.

Saya baru membeli HP Android Acer BeTouch E130 beberapa minggu yang lalu. Device ini memiliki keyboard (bentuknya seperti Blackberry) dan harganya relatif murah. Sebenarnya banyak device android lain yang murah, tapi tanpa keyboard.

Sebagai penggemar command line dan terminal, hal yang ingin saya lakukan adalah menjalankan Debian di device saya. Android menggunakan kernel Linux yang lisensinya GPL, sehingga saya bisa mendapatkan source kernelnya dan mengcompilenya. Saya bisa mengcompile sendiri modul ext3 sehingga saya bisa menginstall Debian dalam lingkungan chroot.

Ketika mulai bermain dengan debian, saya mulai menyadari bahwa keyboardnya kurang nyaman untuk mengetik karakter yang sering dibutuhkan di command line dan program, misanya karakter tilde (untuk shortcut home directory) karakter kurung siku buka dan tutup (untuk indexing array), karakter kurung kurawal buka dan tutup (untuk blok kode program), dsb.

Untungnya program terminal dan client ssh yang saya gunakan (Android Terminal Emulator dan ConnectBot) sifatnya opensource, jadi saya bisa memodifikasinya. Untungnya lagi, proyek keduanya ada di github, jadi saya hanya perlu mem-fork sourcenya dan mengubahnya. Sayapun bisa berbagi perubahan yang saya lakukan pada dunia dengan sangat mudah.

Setelah debian terinstall, dan dengan keyboard yang sudah lebih nyaman, saya bisa menginstall debian dan aneka program di dalamnya. Saya bisa menginstall hampir semua program yang ada di desktop saya, misalnya server SSH, compiler C, Java, interpreter PHP, Perl, Python.
Continue reading

Cara Belajar Algoritma

Beberapa pembaca blog ini menanyakan “bagaimana sih caranya belajar algoritma?”. Daripada saya harus menjelaskan ulang berkali-kali, akan saya coba tuliskan di sini. Pertama perlu diingat bahwa cara belajar setiap orang berbeda-beda, jadi cara yang saya sebutkan mungkin tidak berlaku 100% bagi Anda. Misalnya jka Anda penyuka matematika, Anda bisa mempelajari aspek matematis algoritma, tapi dalam tulisan ini saya asumsikan bahwa anda bukan matematikawan.

Cara yang paling baik dalam memahami algoritma adalah dengan berlatih. Di tahap ini orang akan mulai bertanya: saya harus latihan apa? Cobalah berlatih membuat struktur data dasar, misalnya tree, atau linked list.

Ada banyak algoritma dasar yang bisa dipelajari dari sebuah struktur data, misalnya cobalah membuat binary tree. Pertama Anda bisa mencoba melihat buku, tapi setelah itu cobalah dengan menggunakan logika sendiri. Beberapa hal dasar dalam membuat binary tree: menyisipkan elemen tree, menghitung jumlah node daun (leaf node/node yang tidak punya anak), menghapus node, melakukan traversal, dsb. Lalu kemudian Anda bisa membuat pohon biner terurut. Setelah itu Anda bisa mencoba mengaplikasikan pohon biner itu pada masalah nyata, misalnya membuat kompresi dengan algoritma hufman.
Continue reading

Struktur Data

Mungkin sebagian dari Anda berpikir: buat apa sih belajar struktur data yang rumit? bukankah saya hanya tinggal memakai library tertentu?. Memang ada beberapa pekerjaan di mana Anda hanya perlu tahu sangat sedikit konsep untuk bisa bekerja, tapi pekerjaan semacam ini tidak banyak, dan di masa depan akan semakin hilang dengan banyaknya code generator.

Saya akan menunjukkan beberapa penggunaan struktur data dalam program-program yang umum ditemui setiap hari. Bahkan jika Anda bukan programmer pun, Anda kadang menemui struktur ini.

Tree structure (struktur pohon) sangat umum ditemui. Mulai dari struktur folder/direktori di komputer Anda, sampai di setiap halaman web yang Anda kunjungi (dokumen HTML memiliki struktur tree, setiap browser ada struktur tree untuk DOM HTML). Beberapa contoh lain di mana Anda akan menemui struktur pohon:

  1. Memproses XML memerlukan pemahaman mengenai tree
  2. Pohon keluarga (family tree)
  3. Pohon organisasi
  4. Membuat pivot table yang kompleks memerlukan pemahaman mengenai tree

Jika Anda menjadi administrator database yang ingin bisa mengoptimasi sampai level penyimpanan, Anda harus tahu struktur dasar seperti B-tree. Di beberapa database, misalnya Oracle, Anda bisa mengatur ukuran blocksize untuk indeks B-tree.

Struktur graph (graf) juga banyak digunakan sehari-hari:

  1. Node-node dalam sebuah jaringan membentuk graf, dan ini perlu dipahami oleh administrator jaringan.
  2. Jalan dan lokasi di sebuah peta bisa dianggap sebagai graf.
  3. Jaringan pertemanan (di Facebook, Friendster, dsb) juga merupakan graf. Jika Anda membuat situs seperti itu, Anda perlu tahu konsep graf.

Ada beberapa gabungan dari tree dan graph. Jika Anda menjadi administrator jaringan, Anda perlu mengenal konsep spanning tree untuk mengkonfigurasi STP (spanning tree protocol). Jika Anda perlu membuat program peta sendiri, Anda perlu struktur data quad-tree untuk mengakses dengan cepat node-node dalam graf yang Anda miliki.

Continue reading

Kurikulum Pemrograman

Tujuan pengajaran universitas adalah mengajarkan secara umum sebuah ilmu. Setelah itu masing-masing bisa mengambil bidang spesifik. Semua dokter yang Anda tahu (baik umum maupun spesialis) telah mendapatkan ilmu dasar mengenai tubuh manusia, pertolongan pertama. Meskipun sebagian besar dokter ini tidak akan pernah membedah dalam hidupnya, mereka pasti diajari juga ilmu dasarnya.
Saat ini banyak kurikulum pemrograman yang dibuat untuk mengikuti tren terbaru. Sayangnya tren ini bisa cepat sekali berlalu, dan kadang baru disadari kemudian betapa jeleknya tren sebelumnya (misalnya Microsoft yang menyadari Visual Basic merupakan bahasa yang tidak scalable, tidak cocok untuk enterprise). Di posting ini saya akan menceritakan kurikulum yang dulu saya alami ketika belajar pemrograman di ITB. Sayangnya saat ini kurikulumnya sudah berubah, tapi saya tetap ingin menunjukkan di sini, kira-kira kurikulum yang baik itu seperti apa.

Ketika saya belajar pemrograman di ITB, kurikulumnya dimulai dengan dasar pemrograman. Dalam dasar pemrograman kami diajari LISP. LISP merupakan bahasa dengan paradigma fungsional. Tidak semua aspek LISP diajarkan (misalnya do-loop yang sifatnya imperatif). Ketika belajar LISP, fokusnya adalah memanipulasi struktur data (list, tree) secara rekursif dan mengenai stateless programming.

Continue reading

Perlukah kuliah untuk bisa memprogram? bagian 2

Saya ingin menambahkan point penting dari tulisan saya mengenai apakah perlu kuliah untuk bisa memprogram. Selain masalah ilmu yang dipelajar dalam kuliah, universitas juga menyediakan akses ke berbagai fasilitas.

Pertama adalah hardware, jika Anda belajar sendiri, mungkin Anda akan mendapatkan kesulitan mengakses berbagai jenis hardware (komputer multiprosessor, robot, router, dsb). Di universitas, berbagai hardware tersedia bagi mahasiswa untuk bisa terjun langsung mencoba.

Kedua adalah software. Mungkin sebagian besar software bisa dicari versi bajakannya di Internet, tapi ada beberapa software yang sulit dicari, atau sangat diproteksi (misalnya software yang terhubung ke Internet). Banyak perusahaan software memberikan lisensi gratis kepada universitas, atau kepada mahasiswa (selama masih menjadi mahasiswa).

Ketiga adalah informasi. Informasi ini bisa berupa akses ke jurnal (umumnya universitas berlangganan jurnal internasional). Beberapa buku tidak tersedia ebooknya, dan umumnya universtas memiliki buku-buku yang bermutu yang bisa dipinjam.

Selain ketiga hal tersebut, universitas juga memberikan akses pada para ahli (dosen dan peneliti) yang bisa diajak diskusi, dan bisa mengajar Anda untuk menghindarkan dari berbagai kesalahan umum, serta bisa mengkoreksi kesalahan Anda.

Dan yang terakhir adalah: universitas mengajari Anda untuk bekerja bersama dan bersosialisasi. Dengan berbagai tugas yang diberikan, Anda akan belajar untuk membagi tugas, merencanakan pekerjaan, dan sebagainya. Hal ini sulit didapat dari belajar sendiri ataupun dari kursus.