Jika Anda seorang programmer, jangan menganggap diri Anda seorang "ilmuwan komputer"; ilmuwan komputer adalah orang-orang yang menciptakan generasi komputer berikutnya, beberapa di antaranya masih berupa fiksi ilmiah sampai campuran material yang benar, miniaturisasi, dan teori komputasi diturunkan. Mereka hanyalah awal dari jalur pipa. Orang yang mengembangkan perangkat lunak di sini dan sekarang adalah "insinyur perangkat lunak"; mereka mengambil teori dan alat, kadang-kadang meletakkan teori praktis dan alat dunia nyata di atas, untuk memanfaatkan kekuatan potentia dari sepotong sihir elektrik yang rumit ini dan membuatnya melakukan apa yang kita inginkan. Hal ini pada gilirannya adalah salah satu spesialisasi bidang "teknik komputer", yang mengambil teori-teori para ilmuwan komputer dan menerapkannya, perangkat keras dan perangkat lunak, ke solusi elektronik pengguna akhir dunia nyata.
Inilah, IMO, tempat bisnis bertemu teori. Dalam kasus-kasus seperti ini, pepatah lama "musuh yang lebih baik sudah cukup baik" dapat dengan mudah dibalik untuk membaca "musuh yang cukup baik itu lebih baik". Mempertimbangkan diri Anda sebagai seorang "insinyur" dan bukan "ilmuwan", dan menempatkan apa yang Anda lakukan secara paralel dengan disiplin ilmu teknik lainnya, membuat perbedaan menjadi lega.
Katakanlah seorang klien mendatangi Anda, seorang insinyur sipil / struktural, dan meminta Anda membangun jembatan. Jembatan perlu merentang 20 kaki, menopang dirinya sendiri dan satu ton muatan pengangkut, itu harus bertahan 10 tahun dengan pemeliharaan rutin, dan mereka menginginkannya dalam sebulan seharga $ 20.000. Itu adalah kendala Anda; memenuhi minimum tanpa maksimum. Melakukan itu "cukup baik", dan memberi Anda gaji. Ini akan menjadi rekayasa yang buruk bagi Anda untuk membangun Jembatan Golden Gate, jauh melebihi spesifikasi desain dan anggaran dengan beberapa urutan besarnya. Anda biasanya berakhir dengan penyimpangan biaya dan membayar penalti untuk kelebihan waktu. Ini juga akan menjadi rekayasa yang buruk bagi Anda untuk membangun jembatan tali dengan nilai 5 pria dewasa walaupun biayanya hanya $ 1000 dalam waktu dan bahan; Anda tidak mendapatkan ulasan dan testimonial klien yang baik,
Kembali ke perangkat lunak, misalkan Anda memiliki klien yang membutuhkan sistem pemrosesan file yang dibangun untuk mencerna file yang masuk dan memasukkan informasi ke dalam sistem. Mereka ingin itu dilakukan dalam seminggu dan harus menangani lima file sehari, sekitar 10MB nilai data, karena itu semua lalu lintas yang mereka dapatkan saat ini. Teori-teori berharga Anda sebagian besar keluar dari jendela; tugas Anda adalah membangun produk yang memenuhi spesifikasi tersebut dalam seminggu, karena dengan melakukan itu Anda juga memenuhi anggaran biaya klien (karena bahan umumnya setetes dalam ember untuk kontrak perangkat lunak sebesar ini). Menghabiskan dua minggu, bahkan untuk mendapatkan sepuluh kali lipat, bukanlah suatu pilihan, tetapi kemungkinan besar, tidak ada program yang dibangun dalam satu hari yang hanya dapat menangani setengah dari throughput, dengan instruksi untuk menjalankan dua salinan.
Jika Anda berpikir ini adalah kasus pinggiran, Anda salah; ini adalah lingkungan sehari-hari sebagian besar in-housers. Alasannya adalah ROI; program awal ini tidak memerlukan biaya banyak dan dengan demikian akan membayar sendiri dengan sangat cepat. KETIKA para pengguna akhir membutuhkannya untuk melakukan lebih banyak atau lebih cepat, kodenya dapat di refactored dan diskalakan.
Itulah alasan utama di balik keadaan pemrograman saat ini; asumsi, yang ditanggung oleh seluruh sejarah komputasi, adalah bahwa suatu program TIDAK PERNAH statis. Itu akan selalu perlu ditingkatkan dan pada akhirnya akan diganti. Secara paralel, peningkatan konstan komputer tempat program dijalankan memungkinkan penurunan perhatian terhadap efisiensi teoretis, dan peningkatan perhatian pada skalabilitas dan paralelisasi (suatu algoritma yang berjalan dalam waktu N-squared tetapi yang dapat diparalelasikan untuk berjalan pada N core akan muncul linier, dan seringkali biaya lebih banyak perangkat keras lebih murah daripada pengembang untuk menemukan solusi yang lebih efisien).
Selain itu, ada prinsip yang sangat sederhana bahwa setiap baris kode pengembang adalah sesuatu yang lain yang bisa salah. Semakin sedikit yang ditulis pengembang, semakin kecil kemungkinan bahwa apa yang ditulisnya memiliki masalah. Ini bukan kritik atas "tingkat bug" siapa pun; itu adalah pernyataan fakta yang sederhana. Anda mungkin tahu cara menulis MergeSort ke belakang dan ke depan dalam 5 bahasa, tetapi jika Anda hanya menggunakan satu pengidentifikasi dalam satu baris kode, seluruh Urutan tidak berfungsi, dan jika kompiler tidak menangkapnya, Anda dapat melakukannya jam untuk debug itu. Bandingkan dengan List.Sort (); itu ada di sana, efisien dalam kasus umum, dan, inilah yang terbaik, itu sudah berfungsi.
Jadi, banyak fitur platform modern, dan prinsip metodologi desain modern, dibangun dengan pemikiran ini:
- OOP - membangun data terkait dan logika menjadi objek, dan di mana pun konsep objek itu valid, maka objek, atau derivasi yang lebih khusus.
- Template yang dibuat sebelumnya - 60% atau lebih kode yang bagus adalah sintaksis dan dasar-dasar untuk membuat program menampilkan sesuatu di layar. Dengan menstandarkan dan membuat kode ini secara otomatis, Anda mengurangi beban kerja pengembang hingga setengahnya, memungkinkan peningkatan produktivitas.
- Perpustakaan algoritma dan struktur data - Seperti di atas, Anda mungkin tahu cara menulis Stack, Queue, QuickSort, dll, tetapi mengapa Anda harus, ketika ada perpustakaan kode yang memiliki semua ini dibangun di dalamnya? Anda tidak akan menulis ulang IIS atau Apache karena Anda memerlukan situs web, jadi mengapa menerapkan algoritma QuickSort atau objek pohon merah-hitam ketika beberapa implementasi hebat tersedia?
- Antarmuka yang lancar - Di sepanjang baris yang sama, Anda mungkin memiliki algoritma yang menyaring dan mengurutkan rekaman. Ini cepat, tetapi mungkin tidak terlalu mudah dibaca; itu akan membutuhkan pengembang junior Anda sehari hanya untuk memahaminya, apalagi membuat perubahan bedah yang diperlukan untuk mengurutkan pada bidang tambahan dalam objek rekaman. Sebaliknya, pustaka seperti Linq mengganti banyak kode yang sangat jelek, sering rapuh dengan satu atau dua baris pemanggilan metode yang dapat dikonfigurasi untuk mengubah daftar objek menjadi objek yang difilter, diurutkan, diproyeksikan.