Mengapa bilah kemajuan sangat tidak akurat? [Tutup]

8

Komputer dan bahasa pemrograman cenderung bersifat deterministik dan dapat diprediksi. Namun progress bar tampaknya bertolak belakang, terutama jika operasinya kompleks. Bahkan untuk produk profesional kelas dunia, beberapa bilah kemajuan tidak banyak mencerminkan kemajuan operasi yang sebenarnya. Saya telah melihat mereka berubah dari 10% menjadi 90% dalam satu lompatan setelah tidak melakukan apa pun selama 4 jam. Saya bahkan melihat beberapa langkah mundur, menyarankan pemrosesan ekstra tak terduga telah ditemukan.

Memang mungkin ada operasi basis data, pemrosesan jaringan, dan operasi paralel, tetapi tampaknya ini bisa dikuantifikasi dalam beberapa cara dan persentase yang diestimasi. Lagi pula, harus ada sejumlah instruksi terbatas yang dijalankan untuk menyelesaikan operasi. Apakah ini pengkodean yang buruk, atau adakah alasan mendasar yang menunjukkan kemajuan itu sulit?

Paul Uszak
sumber
1
Ini tidak ada hubungannya dengan ilmu komputer .
Raphael
1
Saya mencoba mendekatkannya ke framing ilmiah dalam jawaban saya. Sayang.
André Souza Lemos
@Raphael Tentunya 5 pembaca yang memposting jawaban berbeda dengan pendapat Anda . Ini bukan tentang penggerak uap bukan?
Paul Uszak
Tidak, ini tentang kegagalan dalam desain UI. Yang offtopic. Ada mungkin menjadi pertanyaan ilmu komputer di sana, tetapi tidak dalam bentuk yang sekarang. (Perhatikan bahwa anggapan Anda cacat secara halus. Sementara komputer nyata dapat diprediksi, sebenarnya, menghitung prediksi secara umum tidak lebih murah daripada perhitungan itu sendiri. Juga, siapa yang memprediksi? Aplikasi tidak mengontrol mesin, jadi prediksi apa pun adalah didasarkan pada asumsi "Saya akan mendapatkan sumber daya sebanyak yang saya dapatkan" - sama sekali bukan asumsi yang kuat!)
Raphael

Jawaban:

2

Untuk menambah jawaban yang lebih umum sejauh ini saya dapat memberikan beberapa contoh dari bidang saya di mana bilah kemajuan tidak bekerja dan mengapa;

Program desain berbantuan komputer - program yang melakukan analisis termal atau mekanika fluida secara umum bisa mengerikan dengan progress bar. Mereka melompat maju, mundur, mengambil langkah-langkah yang tidak konsisten dan hampir tidak ada gunanya mengawasi mereka. Ini disebabkan oleh sifat berulang dari jenis simulasi ini dan kebutuhan untuk menemukan konvergensi. Ini paling baik dilihat bukan oleh bilah kemajuan tetapi oleh plot konvergensi iterasi v.

Simulasi kompleks - Saya menulis sebuah program yang mensimulasikan lingkungan yang kompleks dengan banyak faktor terkait silang. Itu untuk timeline tetap sehingga Anda akan ini progress bar hanya waktu yang tepat? Dalam kasus saya simulasi terlalu lama dengan setiap langkah waktu baru dengan demikian berarti progress bar semakin lambat dan lambat - tidak hebat. Saya menemukan metrik lain untuk berapa lama simulasi rata-rata berdasarkan pada jumlah item dalam simulasi yang lebih dekat ke akurat - tetapi tidak ideal karena kadang-kadang bilah proses tidak pernah diisi (simulasi berhenti sebelumnya) atau mencapai 100% ke awal (simulasi berjalan lebih lama dari yang diharapkan).

Dalam kedua kasus bilah lengkap kemajuan murni tidak akan mungkin untuk menghitung maksimum untuk sebelumnya (kasus 1) atau tidak ada linier dan karenanya tidak banyak digunakan (kasus 2)

pengguna6916458
sumber
1
Terima kasih atas jawaban Anda. Saya ingin mendorong untuk memeriksa apakah pertanyaannya sesuai topik terlebih dahulu.
Evil
@ Evil sayangnya versi seluler SO belum diperbarui bahwa pertanyaannya dipilih sebagai off topic ketika saya menulis jawaban ini.
user6916458
3

Kedua. Terkadang sulit memperkirakan berapa banyak waktu yang diperlukan untuk operasi, karena Anda tidak tahu ke depan berapa banyak pekerjaan yang harus dilakukan. Terkadang perkiraannya sederhana dan tidak akurat.

Contoh: Saya mengunduh empat file secara bersamaan. Seseorang tahu seberapa besar setiap file, berapa banyak yang telah diunduh, dan berapa megabyte per detik yang diunduh untuk setiap file. Tampak mudah untuk memperkirakan berapa lama. Namun, saya tahu bahwa setelah satu file diunduh, yang lain akan mengunduh lebih cepat. Terlebih lagi setelah 3 file diunduh; yang terakhir akan mengunduh empat kali lebih cepat. Belum pernah melihat progress bar yang mempertimbangkan hal ini.

Contoh: Anda menyalin folder besar. Bilah progres mengasumsikan bahwa Anda menyalin X megabita per detik, tahu berapa megabita yang ada, dan kecepatan rata-rata Anda sejauh ini. Masalahnya adalah, "megabyte per detik" sangat tidak akurat - dalam praktiknya, dibutuhkan x milidetik per file, ditambah y milidetik per megabyte. Jadi, banyak file kecil membutuhkan waktu lebih lama daripada perkiraan progress bar.

Masalahnya adalah bahwa pengembang perangkat lunak mungkin peduli, tetapi manajer mereka tidak selama komputer Anda tidak macet.

gnasher729
sumber
3

Saya pikir jawaban menyeluruhnya adalah bahwa seringkali terlalu rumit (atau tidak mungkin) untuk menghitung jumlah waktu yang diperlukan.

Kadang-kadang itu hanya akan menambah waktu komputasi untuk memperkirakan lebih baik jumlah pekerjaan yang diperlukan (misalnya, mengambil analisis yang lebih baik dari file yang akan disalin, atau menerapkan perhitungan yang lebih kompleks untuk lebih baik memperkirakan jumlah langkah yang diperlukan untuk lengkapi simulasi).

Di lain waktu itu agak tidak pasti. Ketika sistem Anda menginstal program baru, seringkali ada banyak dependensi untuk memeriksa apakah diinstal. Dan pada umumnya ia tidak memiliki gagasan tentang berapa lama masing-masing akan memakan waktu, dan dependensi apa yang mungkin dibutuhkan pada gilirannya. Anda mungkin sudah menginstal semua dependensi dan itu bisa memakan waktu 30 detik, atau Anda mungkin kekurangan puluhan dan butuh berjam-jam. Sulit untuk memberikan gambaran kasar tentang itu, terutama ketika setiap situasi akan unik.

Selain itu, saluran air lain pada sistem dapat berubah seiring waktu (karena apa yang dilakukan pengguna ... atau latar belakang / proses terjadwal).

Terkadang estimasi dapat ditingkatkan jika programmer akan menempatkan sedikit lebih banyak pekerjaan ke dalamnya. Tapi kemudian itu kenyataan lain bahwa ini mungkin bukan perhatian utama sebagian besar pengembang, dibandingkan dengan memajukan tugas-tugas produktif sebenarnya yang dapat dilakukan aplikasi.

Pada akhirnya, saat ini, saya percaya ini cukup sering hanya perkiraan linier - lihat berapa banyak tugas dasar yang diperlukan telah diselesaikan oleh program. Jadi itu memang cenderung menjadi perkiraan yang sangat kasar, dan Anda umumnya harus menganggapnya sebagai masuk.


Analogi yang bagus mungkin ketika Anda membaca buku.
Dan Anda memutuskan ingin mengetahui berapa lama waktu yang dibutuhkan untuk menyelesaikan buku ...
Anda dapat memeriksa jumlah halaman dan mendapatkan perkiraan cepat berdasarkan langkah sejauh ini.
Ini mungkin perkiraan yang buruk jika Anda baru saja mulai membaca, karena kecepatan Anda mungkin belum khas. Tapi seringkali itu hanya tebakan kasar.
Atau Anda juga bisa membaca buku, mendapatkan gambaran kasar tentang berapa banyak gambar yang ada dan jarak teks. Dan kemudian memiliki gagasan yang lebih baik tentang apa yang Anda hadapi.
Tapi itu masih bisa menjadi perkiraan yang buruk jika, misalnya, keterbacaan teks menurun, mungkin transisi dari prosa sederhana ke kompleks. Atau perkiraan tersebut mungkin salah jalan karena Anda gagal mengantisipasi tugas lain yang akan mengalihkan perhatian Anda.
Anda bisa mendapatkan perkiraan yang bagus dengan menerapkan sejumlah besar waktu untuk menganalisis dengan hati-hati apa yang tersisa di halaman buku demi halaman, dan juga bisa memperbaikinya dengan memeriksa kalender Anda dan menyimpan daftar langkah membaca jangka panjang untuk berbagai buku di masa lalu.
Tetapi pada akhirnya, apakah waktu yang diperlukan untuk melakukan itu sepadan dengan penundaan untuk hanya membaca buku?


Kita semua menyukai indikator yang lebih baik. Tetapi sebagaimana adanya, kita mungkin harus membuat karena perkiraan kasar, setidaknya sampai komputer secara keseluruhan mulai mendapatkan peningkatan algoritma standar, dan mahir dalam "cerdas" menimbang dan mengantisipasi faktor-faktor dinamis (seperti cara Anda)!

Dan progress bar yang mungkin macet 5% sekarang. Kita hanya harus melihat bagaimana hasilnya 8-)

JeopardyTempest
sumber
1
Terima kasih atas jawaban Anda. Saya ingin mendorong memeriksa apakah pertanyaannya sesuai dengan topik sebelum dijawab.
Evil
Terima kasih telah repot-repot menjawab pertanyaan saya secara komprehensif - abaikan saja komentar Dr. Evil di atas.
Paul Uszak
1
Analogi buku Anda baik dan buruk. Ya itu seperti membaca buku, tapi jangan lupa buku itu sudah dibaca (oleh pengembang). Seharusnya dimungkinkan untuk menghasilkan semacam peta eksekusi, pernyataan tonggak sejarah atau prosedur kritis yang diselesaikan dan kemudian mengumpannya kembali ke pengguna. Saya fokus pada perangkat lunak komersial yang sudah ditandai untuk hal-hal seperti kinerja. Jika Anda dapat menandai kinerja operasional / alokasi sumber daya, maka Anda harus dapat menandai kinerja instalasi jika algoritme telah dijalankan sebelumnya.
Paul Uszak
1

Saya akan menambahkan ke jawaban @ gnasher729 bahwa ini adalah konsekuensi tersembunyi lain dari ketidakpastian masalah penghentian.

Mengesampingkan ketidakpastian yang tak terpisahkan dari perhitungan interaktif, bahkan yang dapat diisolasi dapat memiliki waktu eksekusi (dan "ritme"), yang prediktabilitasnya tidak dapat didekati dengan metode umum.

Sedihnya, progress bar seringkali merupakan metafora yang tidak berguna. Apa alternatifnya, Anda mungkin bertanya. Jika pengguna mengetahui apa yang terjadi "di bawah tenda", menambahkan beberapa informasi semantik ke antarmuka dapat menjadi pilihan, beralih ke eksekusi seperti mode jejak. Jika tidak, menciptakan suasana tenang yang mengurangi harapan.

Mendidik pengguna untuk memahami keterbatasan kami adalah opsi jangka panjang - ketiga.

André Souza Lemos
sumber
1
Saya harus mengambil pengecualian untuk karakterisasi pengguna Anda . Seorang pengguna mungkin meningkatkan suite Oracle Enterprise Business untuk bank perdagangan yang tidak seperti menginstal Space Invaders. Menampilkan bilah kemajuan tidak ada untuk mengurangi harapan. tetapi untuk umpan balik kepada tim proyek berapa lama sistem perdagangan akan turun. Dan saya tidak yakin apakah ini adalah contoh masalah penghentian, karena bank mungkin tidak ingin memulai upgrade yang tidak dijamin selesai ...
Paul Uszak
1
Saya tidak melihat alasan mengapa fenomena ini, secara umum, seharusnya dikaitkan dengan kelengkapan Turing. Banyak proses yang membutuhkan progress bar adalah urutan terbatas dari subproses yang pasti berakhir.
Rhymoid
1
Berapa kali subprogram harus dijalankan adalah properti non-sepele dari pelaksanaan suatu program, yang memengaruhi estimasi waktu penyelesaiannya. Teorema Rice menunjukkan bahwa ini adalah masalah yang tidak dapat diputuskan, dengan mengurangi masalah penghentian. Secara konkret, untuk memodelkan perilaku suatu program secara terperinci seperti membuat garis kemajuan yang sesuai dengan apa yang sebenarnya terjadi biasanya tidak layak, karena alasan praktis.
André Souza Lemos
@ PaulUszak Berapa kali kita tanpa harapan menunggu program (pemutakhiran, apa pun) selesai? Orang, bank, pilot pesawat terbang, pemerintah ...?
André Souza Lemos
@ AndréSouzaLemos Itu sepenuhnya tidak penting. Ini adalah pertanyaan tentang pengamatan tentang latihan. Dalam praktiknya, berapa kali subprogram harus dijalankan diketahui dalam batas yang sempit, sedangkan waktu untuk dihabiskan biasanya tidak diketahui sebelumnya karena tergantung pada I / O. Logika di balik progress bar selalu dibuat untuk aplikasi tertentu, dan tidak dihasilkan melalui analisis program atau sesuatu yang lain di mana teori komputabilitas akan mendukungnya.
Rhymoid
1

Bilah progres digambar berdasarkan jumlah subtugas yang diselesaikan dan bukan pada waktu yang berlalu / yang dibutuhkan untuk penyelesaian.

Sebagai contoh, misalkan operasi X memiliki empat sub langkah yang berbeda, pada akhir setiap langkah Anda meningkatkan progress bar sebesar 25%. Jika satu langkah membutuhkan waktu lebih lama untuk dieksekusi, Anda mungkin akan melihat perilaku yang Anda uraikan - 1 hingga 90% dalam sekali jalan dan beberapa jam untuk sisanya.

Logika di balik penggunaan jumlah subtugas sebagai sebuah unit daripada waktu adalah bahwa yang terakhir tidak dapat diprediksi. Bahkan dalam kasus mengunduh file, koneksi dapat turun, sehingga waktu tidak dapat digunakan sebagai satu unit. Anda lebih suka menggunakan jumlah byte yang diunduh dan bukan waktu yang dibutuhkan sebagai unit kemajuan.

Coders Ekstrim
sumber
1
Terima kasih atas jawaban Anda. Saya ingin mendorong untuk memeriksa apakah pertanyaannya sesuai topik terlebih dahulu.
Evil