Apakah konsep kompleksitas komputasi penting untuk pengembang perangkat lunak? [Tutup]

11

Saya mendapat kesan bahwa konsep kompleksitas waktu dan memori adalah suatu keharusan bagi lulusan kursus compsci, tetapi setelah mempelajari teknik, saya tidak memiliki pengetahuan jika itu masalahnya. Saya baru-baru ini terkejut mewawancarai beberapa lulusan dari perguruan tinggi lokal yang bahkan tidak tahu konsepnya. Saya kira pertanyaan saya adalah:

Apakah konsep kompleksitas komputasi penting untuk pengembang perangkat lunak? Dan haruskah itu diajarkan dalam program sarjana?

Muhammad Alkarouri
sumber
1
Untuk menjelaskan pertanyaan dengan menggunakan contoh: lulusan yang saya temui tidak tahu apa O(n^2)artinya.
Muhammad Alkarouri
1
Pertanyaan terkait yang menarik: programmers.stackexchange.com/q/20832/6184
Muhammad Alkarouri

Jawaban:

12

Di sebagian besar universitas, saya berasumsi (saya harap!) Bahwa kompleksitas waktu dan memori jelas merupakan bagian dari program mereka.

Sekarang, "kompleksitas" ini adalah topik yang sangat elastis. Apakah orang harus benar-benar mengetahui semua teori seperti "ZPP adalah kelas kompleksitas masalah keputusan yang dapat diselesaikan dengan nol kesalahan pada mesin Turing probabilistik dalam waktu polinomial." dan hal semacam itu dipertanyakan. Saya pribadi menganggap teori-teori canggih ini tidak relevan dengan pengembangan perangkat lunak.

Sebaliknya, saya menganggap bahwa setiap pengembang harus menyadari kompleksitas ruang / waktu dari struktur data dan algoritma yang mereka gunakan.

dagnelies
sumber
8

Banyak pemula menderita obsesi mikro-optimasi. Belajar comp. kompleksitas mengarahkan siswa menuju cara yang jauh lebih praktis untuk memperkirakan kinerja dan skalabilitas, dalam pengalaman saya.

bagian
sumber
6

Dari apa yang saya lihat, tampaknya notasi O besar dan kompleksitas waktu dan memori banyak ditekankan dalam pendidikan ilmu komputer formal ... betapapun otodidak, persepsi ini didasarkan pada mendengar dan membaca apa yang orang-orang dengan pendidikan seperti itu. katakan dan tulis.

Meskipun saya percaya ide dan konsep umum itu penting, saya tidak percaya formalisasi itu (seperti notasi O besar dan berbagai terminologi) hampir sama artinya, kecuali untuk keperluan komunikasi. Hanya karena seseorang tidak terbiasa dengan notasi formal dan terminologi tidak berarti mereka tidak dapat melihat bagaimana dan mengapa satu algoritma akan lebih cepat daripada yang lain dalam kasus tertentu. Orang-orang dapat melihat bahwa waktu yang dibutuhkan untuk mencari pohon biner seimbang berkaitan dengan logaritma basis-2 dari jumlah node tanpa terlebih dahulu belajar tentang teori kompleksitas dalam pengertian formal, jika mereka memahami cara kerja pohon dan memiliki pemahaman yang tinggi tentang tinggi. matematika sekolah. Sangat penting untuk mengetahui kapan harus memperhatikan kompleksitas dan penggunaan memori, dan untuk mempertimbangkan kasus-kasus tipikal dan terburuk, meskipun ... tetapi beberapa orang tidak.

Notasi dan terminologi menjadi penting untuk komunikasi. Mereka memberikan cara yang bagus untuk menyampaikan kuantifikasi kinerja suatu algoritma kepada orang lain. Karena sering muncul dalam makalah dan penjelasan, penting untuk memiliki setidaknya pemahaman yang samar-samar sehingga lebih mudah untuk diikuti.

Jadi ya, konsepnya penting (meskipun kurang begitu ketika sumber daya dan waktu cukup tetapi data tidak). Tetapi meskipun konsep-konsep itu penting, formalisasi konsep-konsep itu seringkali tidak begitu penting - dan orang perlu mengingat bahwa notasi dan terminologi tidak sama dengan konsep-konsep itu sendiri.

Edit:

Saya tidak akan mengklaim memahami konsep sedetil seseorang yang secara formal belajar, tetapi banyak ide umum masuk akal. Saya pikir ada nilai dalam mempelajari secara formal ini, tetapi beberapa dari nilai itu masih bisa ada tanpa.

Adapun untuk memperkenalkan konsep-konsep (di luar studi formal), saya pikir awal yang baik adalah untuk mendorong orang untuk berpikir tentang berapa banyak memori overhead yang dimiliki struktur data, langkah-langkah apa yang melibatkan algoritma, dan bagaimana hal-hal ini berubah dengan data yang berbeda.

Ini juga membantu untuk mempertimbangkan situasi dan perubahan hipotetis, seperti mempertimbangkan apa yang terjadi jika pohon seimbang versus apa yang terjadi jika itu tidak seimbang mungkin, atau berapa banyak tingkat ke dalam pohon sebagian besar node akan, atau berapa banyak lagi node yang bisa tahan jika kedalamannya ditingkatkan satu tingkat. Cara berpikir seperti ini umumnya bermanfaat bagi programmer, tidak hanya ketika melihat kompleksitas; dan jika diterapkan untuk berpikir tentang bagaimana algoritma dan struktur data melakukan dalam keadaan yang berbeda itu secara alami menunjuk ke arah yang sama dengan pemeriksaan kompleksitas yang lebih formal.

Dmitri
sumber
Tampilan alternatif yang menarik. Bisakah Anda menjelaskan bagaimana Anda memperkenalkan konsep? Atau bagaimana Anda bisa memahaminya? Ini mungkin mengarah pada cara alternatif untuk mendapatkan pemahaman yang dibutuhkan.
Muhammad Alkarouri
1
@MuhammadAlkarouri Saya telah mengedit jawaban saya untuk mengatasi ini sedikit.
Dmitri
4

Iya

Memahami dasar-dasar kompleksitas adalah penting dan harus menjadi sesuatu yang Anda pelajari sebagai mahasiswa. Bahkan saya pikir itu biasanya menyentuh di mana kelas mengajarkan Anda tentang struktur data. Saya dapat memahami lulusan tidak memahami atau tidak mengingat, tetapi saya tidak dapat melihat mereka tidak diajarkan dasar-dasar kompleksitas.

Perbarui: Mengapa ini Penting

Saya sedang melakukan migrasi basis data pada pekerjaan tertentu. Kami memiliki tenggat waktu kapan migrasi harus dilakukan. Orang yang menulis skrip tidak memiliki landasan dalam kompleksitas. Sayangnya, tidak ada orang lain yang melihat dengan cermat logika yang digunakannya dalam naskah. Saya tidak ingat secara spesifik selain ia menggunakan loop bersarang ganda bukannya hashtable. Setelah satu minggu skrip berjalan terus-menerus kami melihat logika, menyadari masalahnya. Butuh sekitar 5 jam untuk menyelesaikan setelah perubahan. Kami hampir melewatkan tenggat waktu untuk penyelesaian migrasi karena seseorang tidak memahami kompleksitas.

Intinya adalah mudah untuk secara tidak sengaja membuat sesuatu yang perintahnya lebih lambat, atau akan selalu kehabisan memori sebelum pekerjaan selesai. Sementara mesin yang lebih cepat dengan lebih banyak memori dapat mengurangi kesalahan kecil, mereka seringkali tidak dapat mengurangi masalah kompleksitas.

dietbuddha
sumber
Tapi tetap saja, pertanyaannya adalah "apakah ini penting?". Karena walaupun mereka mengulangi daftar pasangan, apakah itu berarti produk akhir tidak melakukan apa yang seharusnya? Apakah ini berarti lambat? Apakah itu berarti mereka tidak melakukan pekerjaan yang harus dibayar?
Yam Marcovic
Jika program harus selesai dalam 2 hari, tetapi sebagai gantinya akan memakan waktu 2 tahun, saya akan mengatakan mereka gagal melakukan pekerjaan yang harus mereka lakukan.
dietbuddha
Masalah seperti yang Anda jelaskan bukanlah masalah pengembang yang buruk, melainkan masalah dalam proses pengambilan keputusan yang membuat seorang programmer yang tidak memenuhi syarat bertanggung jawab atas program semacam itu.
Yam Marcovic
Atau mungkin suatu proses pengambilan keputusan yang mengarah pada mempekerjakan seseorang yang tidak memenuhi syarat untuk program sebagai "pengembang perangkat lunak" alih-alih "pengembang perangkat lunak" atau "magang".
dietbuddha
3

Saya menemukan bahwa bertanya apakah itu "penting atau tidak" agak kabur.

Anda akan menemukan banyak orang menginjili tentang bagaimana setiap pengetahuan terkecil di dunia ini benar-benar dibutuhkan dalam pendapat mereka. Tapi itu agak sia-sia, karena seseorang tidak akan pernah tahu segalanya, dan orang seharusnya tidak diharapkan kecuali itu membantu seseorang untuk memenuhi persyaratan yang diajukan oleh pekerjaannya. Saya lebih suka mengambil pendekatan yang lebih pragmatis untuk prasyarat pendidikan, secara umum, kecuali itu karena hobi atau preferensi pribadi yang sewenang-wenang.

Apakah penting bagi programmer yang diharapkan untuk menulis kode yang sangat efisien atau algoritma infrastruktur inovatif? Iya.

Apakah penting bagi programmer yang mengembangkan aplikasi web konvensional? Mereka dapat mengelola tanpa itu atau mendapatkan implementasi yang efisien di dunia open source.

Apakah penting bagi programmer yang mengembangkan GUI untuk aplikasi? Mungkin tidak, karena kerangka kerja GUI yang berhasil memisahkan semua detail kecil itu.

Selalu menyenangkan untuk diketahui, sama seperti apa pun, tetapi itu tidak membuat banyak (atau bahkan sebagian besar) programmer hanya melakukan pekerjaan mereka untuk kepuasan majikan mereka.

Di sisi lain, jika seseorang mendaftar untuk studi yang lebih tinggi, dalam mencari pendidikan dasar dan teoritis, seseorang harus diharapkan untuk mempelajari mata pelajaran yang menurut definisi lebih teoretis daripada praktis. Menurut pendapat saya, penting bagi CompSci. siswa belajar tentang kompleksitas, sama pentingnya dengan mereka belajar tentang kalkulus.

Tapi bagaimanapun, sejak kapan melakukan CompSci. program mengajarkan orang bagaimana menjadi programmer yang baik? Untuk itu Anda memiliki program pelatihan khusus dan pengalaman praktis (baik program Anda maupun sesama programer yang dapat membagikannya dengan Anda).

Yam Marcovic
sumber
1
Bagian kedua mungkin kurang jelas: haruskah itu diajarkan kepada siswa dari compsci di tingkat BSc?
Muhammad Alkarouri
1
Saya mengedit posting saya untuk menjawab pertanyaan itu juga.
Yam Marcovic