Wiki C2 memiliki diskusi tentang Bukti Empiris untuk Pemrograman Berorientasi Objek yang pada dasarnya menyimpulkan bahwa tidak ada yang melebihi daya tarik otoritas. Ini terakhir diedit pada tahun 2008. Diskusi di sini tampaknya memberikan ini: pertanyaan tentang apakah OO sudah ketinggalan zaman , ketika pemrograman fungsional adalah pilihan yang buruk dan keuntungan dan kerugian AOP semuanya dijawab dengan pendapat kontributor tanpa bergantung pada bukti.
Tentu saja, pendapat dari praktisi mapan dan terkenal adalah hal yang diterima dan berharga untuk dimiliki, tetapi mereka lebih masuk akal jika konsisten dengan data eksperimental. Apakah bukti ini ada? Saya tahu bahwa rekayasa perangkat lunak berbasis bukti adalah suatu hal, tetapi dapatkah saya mempraktikkannya dalam konteks ini? Secara khusus, jika saya memiliki masalah tertentu P
yang ingin saya selesaikan dengan menulis perangkat lunak, apakah ada badan pengetahuan, studi dan penelitian yang akan membuat saya melihat bagaimana hasil penyelesaian masalah seperti P
telah bergantung pada pilihan paradigma pemrograman?
Saya tahu paradigma mana yang muncul sebagai "jawaban yang tepat" dapat bergantung pada metrik apa yang diperhatikan oleh penelitian tertentu, pada kondisi apa yang dipertahankan atau bervariasi, dan tidak diragukan lagi pada faktor-faktor lain juga. Itu tidak memengaruhi keinginan saya untuk menemukan informasi ini dan secara kritis menaksirnya.
Menjadi jelas bahwa beberapa orang berpikir saya sedang mencari solusi "putar engkol" - beberapa mesin sosis di mana saya memasukkan informasi tentang masalah saya dan keluar dari kata "fungsional" atau "terstruktur". Ini bukan maksud saya. Apa yang saya cari adalah penelitian tentang bagaimana - dengan banyak peringatan dan asumsi bahwa saya tidak akan membahasnya di sini tetapi literatur yang baik mengenai hal itu akan - sifat-sifat tertentu dari perangkat lunak bervariasi tergantung pada masalah dan pilihan paradigma.
Dengan kata lain: beberapa orang mengatakan "OO memberikan fleksibilitas yang lebih baik" atau "program fungsional memiliki lebih sedikit bug" - (bagian dari) apa yang saya minta adalah buktinya. Sisanya meminta bukti yang menentang ini, atau asumsi di mana pernyataan ini benar, atau bukti yang menunjukkan bahwa pertimbangan ini tidak penting. Ada banyak pendapat tentang mengapa satu paradigma lebih baik dari yang lain; Adakah yang objektif di balik semua ini?
sumber
Jawaban:
Untuk pengambilan sebelumnya, lihat Revisi 1 dari jawaban ini . Namun, komentar dan pengeditan untuk pertanyaan lebih lanjut memperjelas apa yang dicari dan memungkinkan saya untuk menjadi lebih jelas.
Ya, rekayasa perangkat lunak berbasis bukti (EBSE) adalah suatu hal. Tampaknya ada beberapa upaya menuju basis data EBSE, seperti yang ini di Durham University dan SEED, yang dimulai oleh seorang profesor di Cal Poly . Semua upaya ini, serta yang dibahas dalam sejumlah makalah yang dapat ditemukan melalui server IEEE Xplore atau ACM Digital Library(berlangganan atau membeli diperlukan untuk banyak makalah di keduanya), didasarkan pada obat berbasis bukti. Mereka memberikan tinjauan literatur dari data empiris (observasi dan eksperimen) yang dipublikasikan. Bahkan, termasuk "tinjauan pustaka" dalam string pencarian pada setiap pencarian publikasi menghasilkan informasi pada sebagian besar topik - lebih dari 14.000 klik pada ACM dan lebih dari 1000 pada database IEEE (ketika terbatas hanya pada topik komputasi).
Melihat jenis umum dari topik yang dibahas dalam database EBSE dan tinjauan literatur ini, saya melihat utas yang sama - mereka cenderung tidak bergantung pada teknologi. Penekanan tampaknya sebagian besar berpusat pada proses dan metodologi daripada alat khusus yang digunakan untuk melakukan rekayasa perangkat lunak.
Jadi, konsep ini ada dalam rekayasa perangkat lunak. Academia mengetahui konsep berbasis bukti dan berhasil menerapkannya pada rekayasa perangkat lunak.
Secara khusus, pertanyaan yang membahas penerapan teknik EBSE untuk pemilihan paradigma tampaknya sulit, karena banyaknya variabel yang terlibat, memaksa asumsi dibuat serta mengurangi kemampuan untuk mengulangi percobaan atau pengamatan. Dikatakan benar dalam pertanyaan - "paradigma mana yang muncul sebagai" jawaban yang tepat "dapat bergantung pada metrik apa yang diperhatikan oleh studi tertentu, pada kondisi apa studi ini konstan atau bervariasi, dan tidak diragukan lagi pada faktor-faktor lain juga" . Meskipun itu tidak berarti bahwa mempelajari paradigma mana yang "terbaik" dalam situasi tertentu, itu membuat segala jenis tinjauan pustaka terhadap dokumen-dokumen ini sangat sulit untuk diselesaikan dan masih mengekstrak informasi di dalamnya.
Jelas tidak ada solusi "putar engkol" untuk memilih paradigma.
Diberikan paradigma pemrograman, Anda dapat menemukan studi di berbagai database akademik dan industri tentang bagaimana paradigma itu memengaruhi berbagai aspek pengembangan perangkat lunak - kualitas, cacat, efisiensi, dan sebagainya - dalam berbagai kondisi spesifik, mulai dari pengetahuan dan pengalaman tim ke domain masalah. Setiap makalah yang ketat harus secara jelas mengidentifikasi kondisi di mana data dikumpulkan dan asumsi. Masalahnya menjadi mencoba untuk mengisolasi faktor-faktor yang membuatnya baik di setiap kondisi tersebut.
Secara akademis, ada beberapa pernyataan yang mudah diteliti. Misalnya, pernyataan bahwa paradigma fungsional sangat cocok untuk aplikasi yang memerlukan konkurensi berasal dari teorema Gereja-Rosser . Karena itu, kemungkinan sistem perangkat lunak yang ditulis dalam bahasa fungsional akan memiliki lebih sedikit cacat terkait dengan concurrency daripada sistem yang sama yang ditulis dalam bahasa prosedural atau berorientasi objek.
Namun, dari sudut pandang praktis, tim perangkat lunak tidak selalu dapat menggunakan alat atau teknik "terbaik" untuk pekerjaan itu hanya karena penelitian menunjukkannya. Meskipun kami berusaha keras untuk menghasilkan sistem perangkat lunak dengan kualitas terbaik, kami beroperasi dalam batasan. Seringkali, saya melihat batasan ini diminimalkan (atau bahkan dihilangkan dari persamaan) ketika membahas efektivitas metodologi apa pun.
Sebagai seorang praktisi, ketika saya terlibat dalam memilih teknologi untuk digunakan, saya mencoba mengidentifikasi alat terbaik. Tetapi kemudian saya membatasi diri pada apa yang diketahui dan dipahami dengan baik oleh tim yang saya miliki. Kembali ke contoh saya sebelumnya, jika saya memiliki tim yang berpengalaman dalam membangun aplikasi bersamaan di C ++ dan tidak ada pengalaman di Haskell, tidak masuk akal untuk mengusulkan membangun sistem di Haskell karena saya kemungkinan tidak akan mampu membuat kendala jadwal dan anggaran, dan kualitas saya kemungkinan akan menurun karena kurangnya pengalaman dalam rantai alat.
Untuk rekap, rekayasa perangkat lunak berbasis bukti umumnya adalah hal yang baik yang ada dan tinjauan literatur memang ada dan tersedia. Namun, ada aspek rekayasa perangkat lunak di mana menerapkan pendekatan berbasis bukti menawarkan nilai yang kecil. Pemilihan paradigma pemrograman untuk upaya pengembangan skala besar adalah salah satunya.
Jika Anda ingin mengetahui tentang bagaimana orientasi objek mengatasi usabilitas atau cacat dalam pemrograman fungsional - Anda akan dengan mudah menemukan publikasi tentang itu. Namun, saya tidak menemukan (saya juga tidak akan menaruh kepercayaan pada) publikasi yang mampu secara efektif menangani pemilihan paradigma di berbagai proyek rekayasa perangkat lunak dunia nyata.
sumber
Saya telah membaca The Art of Unix Programming oleh Eric S. Raymond. Ini memiliki beberapa wawasan sejarah yang sangat menarik tentang hal-hal yang sekarang kita anggap remeh. Dia mengutip beberapa penelitian yang baik dari perangkat lunak IEEE yang menggunakan bukti empiris seperti kepadatan cacat. Itu mungkin sumber yang bagus jika Anda mencari studi bergaya akademik.
Bahkan teknik seperti modularisasi menggunakan fungsi tidak selalu merupakan praktik umum. Salah satu kutipan favorit saya dari buku sejauh ini:
Sebenarnya ada dua masalah dengan menjadi terlalu empiris. Yang pertama adalah bahwa kualitas kode adalah hal yang sangat subyektif. Kode bisa mengerikan dan masih benar. Rakyat persepsi dari paradigma pemrograman adalah metrik yang sangat valid, karena kode ini ditulis untuk orang-orang untuk membaca sebanyak untuk komputer, jika tidak lebih.
Masalah kedua adalah bahwa 50% pengembang memiliki bakat pemrograman di bawah rata-rata. Tidak masalah jika pengembang teratas Anda lebih produktif menggunakan pemrograman fungsional jika "rakyat jelata" berjuang untuk menulis perangkat lunak yang berfungsi menggunakannya, apalagi perangkat lunak yang indah dan dirancang dengan baik. Demikian juga dengan bahasa pemrograman TMTOWTDI , pengembang teratas Anda masih akan menulis kode modular yang bersih, tetapi coders yang kurang berbakat menulis derau baris karena kurangnya struktur yang dipaksakan.
Itu sebabnya saya pikir OOP telah naik ke puncak popularitas meskipun kekurangannya. Ini tidak begitu membatasi bahwa ia pincang yang paling berbakat, tetapi strukturnya menyediakan cara ringkas untuk berkomunikasi dan memaksakan prinsip-prinsip desain yang baik pada yang paling berbakat.
Dalam pekerjaan kami, kami memiliki kecenderungan untuk mengevaluasi solusi berdasarkan terlalu banyak pada kemampuan teknisnya saja. Usaha yang sukses harus memperhitungkan sisi manusia dari persamaan juga.
sumber
Ada kontes pemrograman yang menggunakan sistem penilaian komputer dan memungkinkan Anda untuk menulis dalam berbagai bahasa dan memposting semua jenis hasil dan hal-hal. Saya yakin mereka memiliki data yang bagus untuk Anda. Berikut daftar 8: http://www.makeuseof.com/tag/8-onlineprogramming-contests-challenge-win/
Saya membayangkan Anda dapat membuat perbandingan solusi yang berarti untuk masalah yang sangat sederhana dan jelas, seperti jumlah kuadrat, atau seri Fibonacci, atau menggambar garis lurus menggunakan algoritma garis Bresenham. Sebagian besar tugas pemrograman dunia nyata tidak memiliki pos tujuan yang jelas dan setiap bahasa memiliki titik-titik manisnya. Banyak manfaat dari suatu bahasa adalah subjektif. Anda mungkin menemukan data yang lebih bermakna dengan mensurvei programmer dan kebahagiaan klien daripada menghitung garis kode atau jumlah cacat.
Saya ingat ketika saya menghabiskan setengah hari menulis salah satu program Awk pertama saya, saya pikir itu akan memakan waktu seminggu penuh untuk melakukan hal yang "sama" di Jawa. Tapi itu karena solusi Java saya akan berfokus pada menjadi kuat di mana karena solusi Awk cepat dan kotor dan memerlukan beberapa penyesuaian manual pada input dan output dan benar-benar dibuang ketika saya selesai. Awk dan Java sama-sama hebat, hanya saja tidak untuk hal yang sama.
Saya kira apa yang saya katakan adalah bahwa untuk aplikasi dunia nyata, membandingkan bahasa atau alat dengan cara yang berarti sangat sulit - masalah apel dan jeruk yang lama. Semoga berhasil! Saya ingin melihat apa yang Anda ketahui.
sumber
Saya telah mempelajari berbagai cara untuk mengembangkan perangkat lunak selama 30+ tahun. Ada kelangkaan bukti yang dipublikasikan tentang pemilihan paradigma.
Saya mengumpulkan bibliografi ASCII yang bisa dicari. Ini termasuk banyak makalah dan artikel IEEE dan ACM. Saya memberi tag pada item dengan jenis bukti yang disediakan. Berikut adalah tag yang paling umum:
Sekarang cari PARADIGM dan hitung tagnya
Jika Anda ingin menggali lebih dalam, http://cse.csusb.edu/dick/lab.html dan saya harap ini membantu ...
sumber
Tampaknya dalam banyak kasus tidak ada kumpulan penelitian yang cukup besar atau berkualitas cukup tinggi untuk memungkinkan kesimpulan umum diambil tentang apakah satu praktik dalam rekayasa perangkat lunak lebih baik daripada yang lain. Saya secara khusus mencari penelitian untuk bekerja dalam paradigma yang berbeda, tetapi kurangnya ketersediaan tidak terbatas pada arena itu sehingga saya akan membingkai jawaban saya dalam arti yang lebih luas.
Sebuah makalah dari tahun 2004, Rekayasa Perangkat Lunak Berbasis Bukti oleh Kitchenham et al , mencakup dengan cukup ringkas manfaat yang bisa diperoleh dari pendekatan berbasis bukti dan masalah dengan penerapannya dalam rekayasa perangkat lunak. Saya tidak akan membahas sisi manfaat di sini (jelas dari pertanyaan bahwa saya ingin dapat bekerja dengan cara ini), tetapi masalahnya relevan sebagai jawaban atas pertanyaan yang saya ajukan.
Jadi jawaban yang saya cari adalah "tidak", bukti yang saya cari mungkin tidak ada. Saya harus memilih paradigma saya berdasarkan kriteria populer yang ada tentang apa yang saya tahu, pendapat yang keren dan ahli.
sumber
Saya tidak percaya jenis studi ini ada. Orang akan percaya bahwa bukan paradigma pemrograman yang lebih penting daripada algoritma aktual yang digunakan. Misalnya diberikan setiap sistem non-sepele yang bergantung pada algoritma ruang kecil ayat satu yang bergantung pada algoritma waktu kecil akan menghasilkan metrik yang berbeda. Yang memiliki waktu lebih baik kemungkinan besar akan dianggap lebih valid, kecuali ruang adalah masalah maka kebalikannya benar. Saya menemukan itu mirip dengan membuka jalan. Sementara algoritme atau resep untuk membuat bahan-bahan itu konstan di semua proses, ada kemungkinan satu perusahaan berpikir untuk membuka dua lajur sekaligus (satu di setiap sisi jalan) lebih baik daripada membuka dua lajur di sisi jalan yang sama sekaligus . Pada akhirnya, tidak masalah karena proses pembuatan atasan hitam masih sama, satu-satunya perbedaan adalah pendekatannya. Kembali ke pemrograman, jika Anda memiliki tim pengembang C, tulis kode secara prosedural, jika Anda memiliki tim pengembang Java, tulislah dalam OO. Jangan terpaku pada paradigma sebanyak implementasi algoritma. Karena pada akhirnya Anda dapat menulis Java seperti C dan Anda dapat mencoba menulis C seperti Java.
MEMPERBARUI
Untuk membalas komentar graham, tinggalkan aku:
Saya berasumsi dengan arsitektur yang Anda maksud paradigma pemrograman. Jika Anda akan menggunakan Clojure mungkin Anda harus menyewa tim programmer Clojure. Namun, berdasarkan pencarian cepat Clojure adalah bahasa berbasis Java itu kebetulan fungsional. Mengingat informasi itu saya akan mengambil programmer Java (karena secara teknis mereka hanya bisa menulis Java dan itu akan memberi Anda hasil yang sama) atau mencari programmer fungsional seperti pengembang Haskell. Sekarang dalam hal memilih apa yang terbaik itu sepenuhnya tergantung pada tim Anda. Saya tidak akan pernah memiliki tim ahli basis data relasional yang mengatur solusi cloud untuk saya dan saya juga tidak akan memiliki tim programmer fungsional membangun solusi berorientasi objek untuk saya. Anda harus menggunakan kekuatan tim Anda tidak memiliki visi yang dimuliakan yang Anda miliki di kepala Anda untuk apa yang tim "harus"
sumber
Paradigma yang berbeda mengarah pada solusi yang berbeda. Yang paling cocok adalah yang paling tergantung pada:
Saya tahu tidak ada studi yang pasti, dan bahkan jika ada, saya tidak akan mempercayainya.
Itu adalah pekerjaan arsitek.
Mengganti kebijaksanaan arsitek dengan kesimpulan yang mungkin tidak relevan dari sebuah penelitian adalah resep untuk bencana.
Catatan: komentar menyebutkan "algoritma" dan kemudian memilih bahasa. Algoritma adalah mekanisme struktural sentral untuk bahasa prosedural. Bahasa berorientasi objek fokus pada kelas dan pola kolaborasi / komunikasi. Jika Anda yakin (sebagai arsitek) bahwa solusi algoritma-sentris adalah 'terbaik', maka gunakan bahasa prosedural atau fungsional.
Tambahan: tidak memercayai studi bukanlah 'takhayul', itu masuk akal. Eksperimen ilmiah harus objektif dan berulang. Proyek perangkat lunak sangat subyektif, tetapi lebih buruk lagi, itu adalah eksperimen yang tidak dapat diulang . Anda tidak bisa mengimplementasikan proyek X dengan tim Y, mengukur hasilnya, dan kemudian memutar kembali waktu, menghapus ingatan, dan melakukan kembali proyek yang sama dengan tim yang sama. Informasi yang ditemukan atau tersirat oleh studi mungkin berguna bagi arsitek, tetapi tidak pernah dapat menjadi definitif.
sumber