7 masalah paling menjengkelkan dalam pengaturcaraan

Dikatakan bahawa wilayah peta lama yang belum dipetakan sering ditandai dengan peringatan yang tidak menyenangkan: "Inilah naga." Mungkin apokrif, idenya adalah bahawa tidak ada orang yang mengembara ke pelosok dunia yang tidak diketahui ini harus melakukannya tanpa bersedia untuk melawan musuh yang menakutkan. Apa sahaja boleh berlaku di kawasan misteri ini, dan selalunya perkara itu tidak baik.

Pengaturcara mungkin sedikit lebih beradab daripada kesatria abad pertengahan, tetapi itu tidak bermakna dunia teknikal moden tidak mempunyai bahagian naga teknikal yang menanti kita di tempat yang tidak dijangka: Masalah sukar yang menunggu sehingga tarikh akhir beberapa minit lagi; komplikasi yang telah membaca manual dan mengetahui perkara yang tidak dinyatakan dengan baik; naga jahat yang tahu bagaimana menyelinap dalam bug inchoate dan gangguan tepat pada waktunya, selalunya tepat setelah kod tersebut dilakukan.

Akan ada beberapa orang yang beristirahat dengan tenang pada waktu malam, dihangatkan oleh keyakinan diri mereka yang naif bahawa komputer benar-benar dapat diramalkan, dengan sungguh-sungguh mengeluarkan jawapan yang tepat. Oh, sedikit yang mereka tahu. Untuk semua kerja keras pereka cip, pemaju bahasa, dan berjuta-juta pengaturcara di mana-mana, masih terdapat masalah masalah pengaturcaraan yang berduri yang dapat membuat pengaturcara terkuat sekalipun.

Berikut adalah tujuh sudut paling awal dari dunia pengaturcaraan di mana kita meletakkan penanda besar membaca, "Inilah naga."

Multithreading

Kedengarannya idea yang bagus: Pisahkan program anda ke bahagian bebas dan biarkan OS menjalankannya seperti program kecil yang berasingan. Sekiranya pemproses mempunyai empat, enam, lapan, atau lebih teras, mengapa tidak menulis kod anda sehingga boleh mempunyai empat, enam, lapan, atau lebih utas menggunakan semua inti secara bebas?

Ideanya berfungsi - apabila bahagian-bahagiannya benar-benar terpisah dan tidak ada kaitan antara satu sama lain. Tetapi apabila mereka perlu mengakses pemboleh ubah yang sama atau menulis bit ke fail yang sama, semua pertaruhan akan dimatikan. Salah satu utas akan sampai ke data terlebih dahulu dan anda tidak dapat meramalkan benang mana yang akan menjadi.

Oleh itu, kami membuat monitor, semaphores, dan alat lain untuk mengatur kekacauan multithreaded. Apabila mereka bekerja, mereka bekerja. Mereka hanya menambahkan lapisan kerumitan yang lain dan mengubah tindakan menyimpan data dalam pemboleh ubah menjadi item yang memerlukan sedikit pemikiran.

Apabila mereka tidak berfungsi, itu adalah kekacauan. Data tidak masuk akal. Lajur tidak bertambah. Wang hilang dari akaun dengan poof. Ini semua memori. Dan semoga berjaya mencuba semua itu. Sebilangan besar masa pembangun akhirnya mengunci sebahagian besar struktur data sehingga hanya satu utas yang dapat menyentuhnya. Itu mungkin membendung kekacauan, tetapi hanya dengan membunuh sebahagian besar kelebihan mempunyai banyak utas yang menggunakan data yang sama. Anda mungkin menulis semula sebagai program "utas tunggal".

Penutupan

Di suatu tempat, seseorang memutuskan bahawa akan berguna untuk menyebarkan fungsi seolah-olah mereka data. Ini bekerja dengan baik dalam keadaan sederhana, tetapi pengaturcara mulai menyadari bahwa masalah muncul ketika fungsi mencapai di luar diri mereka dan mengakses data lain, yang sering disebut "pemboleh ubah bebas." Versi mana yang sesuai? Adakah data ketika panggilan fungsi dimulai? Atau adakah fungsi itu berjalan? Ini sangat penting untuk JavaScript di mana terdapat jurang panjang di antara mereka.

Penyelesaiannya, "penutupan," adalah salah satu sumber sakit kepala terbesar bagi pengaturcara JavaScript (dan sekarang Java dan Swift). Pemula dan bahkan banyak veteran tidak dapat mengetahui apa yang ditutup dan di mana batas-batas penutupan yang disebut.

Nama itu tidak membantu — bukan seperti akses ditutup secara kekal seperti bar yang mengumumkan panggilan terakhir. Sekiranya ada, akses terbuka tetapi hanya melalui lubang cacing di kontinum waktu data, mekanisme peralihan waktu yang pelik yang akhirnya akan memunculkan rancangan TV sci-fi. Tetapi menyebutnya sebagai "Mekanisme Akses Stack Kompleks" atau "Sistem Juggling Kawalan Data" sepertinya terlalu lama, jadi kami terjebak dengan "penutupan". Jangan mulakan saya sama ada ada yang perlu membayar pemboleh ubah tidak percuma.

Data terlalu besar

Apabila RAM mula diisi, semuanya mula salah. Tidak kira sama ada anda melakukan analisis statistik baru pengguna data atau mengusahakan spreadsheet lama yang membosankan. Apabila mesin kehabisan RAM, ia bertukar menjadi memori maya yang dipanggil keluar ke dalam cakera keras yang terlalu rendah. Ia lebih baik daripada mogok sepenuhnya atau mengakhiri pekerjaan, tetapi anak lelaki melakukan semuanya dengan perlahan.

Masalahnya ialah cakera keras sekurang-kurangnya 20 atau 30 kali lebih perlahan daripada RAM dan pemacu cakera pasaran massa selalunya lebih perlahan. Sekiranya beberapa proses lain juga cuba menulis atau membaca dari cakera, semuanya menjadi lebih teruk kerana pemacu hanya dapat melakukan satu perkara pada satu masa.

Mengaktifkan memori maya akan memburukkan lagi masalah tersembunyi yang lain dengan perisian anda. Sekiranya terdapat gangguan threading, ia mula pecah lebih cepat kerana utas yang tersekat di memori maya cakera keras berjalan jauh lebih perlahan daripada utas lain. Itu hanya berlangsung dalam jangka masa yang singkat, kerana benang bunga dinding sekali bertukar ke ingatan dan benang lain menutup. Sekiranya kodnya sempurna, hasilnya lebih perlahan. Sekiranya tidak, kelemahan dengan cepat menjadikannya musibah. Itulah satu contoh kecil.

Menguruskan ini adalah cabaran sebenar bagi pengaturcara yang bekerja dengan timbunan data yang besar. Sesiapa yang merasa sedikit ceroboh dengan membina struktur data yang sia-sia akan berakhir dengan kod yang melambatkan pengeluaran. Ia mungkin berfungsi dengan baik dengan beberapa kes ujian, tetapi beban sebenar menjadikannya gagal.

NP-lengkap

Sesiapa sahaja yang mempunyai pendidikan universiti dalam sains komputer mengetahui masalah misteri yang dibungkus dalam akronim yang jarang dijelaskan: polinomial nondeterministik lengkap, aka NP-lengkap. Perinciannya sering memakan masa satu semester untuk dipelajari, dan walaupun begitu, banyak pelajar CS keluar dengan pandangan kelam kabut bahawa tidak ada yang dapat menyelesaikan masalah ini kerana terlalu sukar.

Masalah lengkap NP seringkali agak sukar — jika anda menyerangnya dengan kekerasan. "Masalah jurujual perjalanan", misalnya, dapat memakan waktu yang lama kerana laluan penjualan merangkumi semakin banyak bandar. Menyelesaikan "masalah ransel" dengan mencari subset nombor yang paling dekat dengan beberapa nilai N diselesaikan dengan mencuba semua kemungkinan subset, yang merupakan nombor yang sangat besar. Semua orang merasa takut dengan masalah ini kerana mereka adalah contoh sempurna salah satu bogeymen terbesar di Silicon Valley: algoritma yang tidak akan berskala.

Bahagian yang sukar adalah bahawa beberapa masalah lengkap NP mudah diselesaikan dengan pendekatan. Algoritma tidak menjanjikan penyelesaian yang tepat, tetapi algoritma hampir hampir. Mereka mungkin tidak menemui jalan yang tepat untuk jurujual yang bepergian, tetapi mereka dapat memperoleh beberapa poin peratusan dari jawapan yang tepat.

Kewujudan penyelesaian yang cukup baik ini hanya menjadikan naga lebih misteri. Tidak ada yang dapat memastikan apakah masalahnya benar-benar sukar atau cukup mudah jika anda bersedia berpuas hati dengan jawapan yang cukup baik.

Keselamatan

"Ada yang dikenali; ada perkara yang kita tahu yang kita tahu, ”Donald Rumsfeld, Setiausaha Pertahanan semasa pemerintahan Bush kedua, pernah berkata pada sidang media. "Kami juga tahu ada yang tidak diketahui; iaitu kita tahu ada beberapa perkara yang kita tidak tahu. Tetapi ada juga yang tidak diketahui yang tidak diketahui — yang tidak kita ketahui tidak kita ketahui. ”

Rumsfeld bercakap mengenai perang di Iraq, tetapi hal yang sama berlaku untuk keselamatan komputer. Masalah terbesar adalah lubang yang kita tidak tahu mungkin. Semua orang memahami bahawa anda harus membuat kata laluan anda sukar ditebak — itulah yang diketahui umum. Tetapi siapa yang pernah diberitahu bahawa perkakasan rangkaian anda mempunyai lapisan perisian tersendiri di dalamnya? Kemungkinan seseorang boleh melewatkan penggodaman OS anda dan sebaliknya menyasarkan lapisan rahsia ini adalah yang tidak diketahui tidak diketahui.

Kemungkinan peretasan semacam itu mungkin tidak anda ketahui sekarang, tetapi bagaimana jika ada yang lain? Kami tidak tahu jika kami dapat mengeraskan lubang yang bahkan kami tidak tahu ada. Anda boleh menggunakan kata laluan, tetapi ada keretakan yang tidak dapat anda bayangkan. Itulah keseronokan bekerja dengan keselamatan komputer. Dan ketika berkaitan dengan pengaturcaraan, pemikiran yang mengutamakan keselamatan menjadi semakin penting. Anda tidak boleh menyerahkannya kepada profesional keselamatan untuk membersihkan kekacauan anda.

Penyulitan

Enkripsi terdengar kuat dan tidak dapat ditembus ketika pegawai penguatkuasa undang-undang masuk ke depan Kongres dan meminta celah rasmi untuk menghentikannya. Masalahnya adalah bahawa kebanyakan penyulitan dibina di atas awan ketidaktentuan yang kabur. Apa bukti matematik yang kita miliki berdasarkan andaian yang tidak pasti, seperti sukar untuk memperhitungkan bilangan yang sangat besar atau mengira log diskrit.

Adakah masalah itu benar-benar sukar? Tidak ada yang secara terbuka menggambarkan algoritma untuk memecahkannya, tetapi itu tidak bermaksud penyelesaiannya tidak ada. Sekiranya anda menjumpai cara untuk mengupas setiap perbualan dan masuk ke bank mana pun, adakah anda akan segera memberitahu dunia dan menolong mereka memasang lubang? Atau adakah anda akan berdiam diri?

Cabaran sebenarnya adalah menggunakan penyulitan dalam kod kita sendiri. Walaupun kita yakin bahawa algoritma asasnya selamat, masih ada banyak kerja yang perlu dilakukan untuk menyusun kata laluan, kunci, dan sambungan. Sekiranya anda melakukan satu kesalahan dan membiarkan kata laluan tidak dilindungi, semuanya akan terbuka.

Pengurusan identiti

Semua orang menyukai kartun New Yorker dengan garis panduan, "Di internet, tidak ada yang tahu bahawa anda adalah anjing." Ia bahkan mempunyai halaman Wikipedia sendiri dengan empat bahagian yang terperinci. (Di internet, tidak ada yang tahu gergaji lama mengenai menganalisis humor dan membedah katak.)

Berita baiknya adalah bahawa tanpa nama dapat membebaskan dan berguna. Berita buruknya adalah bahawa kita tidak tahu bagaimana melakukan apa-apa selain komunikasi tanpa nama. Beberapa pengaturcara bercakap mengenai "pengesahan dua faktor," tetapi yang pintar beralih ke "Pengesahan faktor-N".

Selepas kata laluan dan mungkin pesanan teks ke telefon bimbit, kami tidak mempunyai banyak yang sangat stabil. Pembaca cap jari kelihatan mengagumkan, tetapi banyak orang nampaknya ingin menyatakan bagaimana mereka boleh digodam (lihat di sini, di sini, dan di sini sebagai permulaan).

Tidak banyak perkara yang penting bagi dunia obrolan terbiar di Snapchat atau Reddit, tetapi aliran halaman Facebook yang digodam agak membimbangkan. Tidak ada cara mudah untuk menangani perkara-perkara serius seperti harta benda, wang, rawatan kesihatan, atau hampir semua perkara lain dalam hidup kecuali perbincangan kecil yang tidak bermakna. Penggemar bitcoin suka melihat-lihat bagaimana kekuatan blockchain, tetapi entah bagaimana duit syiling terus hilang (lihat di sini dan di sini). Kami tidak mempunyai kaedah sebenar untuk menangani identiti.

Mengukur kekerasan

Sudah tentu, ketika datang ke pengaturcaraan, apakah ada cara untuk kita mengukur kesulitan masalah? Tidak ada yang benar-benar tahu. Kami tahu bahawa beberapa masalah mudah diselesaikan, tetapi sama sekali berbeza untuk mengesahkannya sebagai sesuatu yang sukar. NP-kelengkapan hanyalah satu bahagian dari usaha yang rumit untuk mengkodifikasikan kerumitan algoritma dan analisis data. Teorinya berguna, tetapi tidak dapat memberikan jaminan. Sangat menggoda untuk mengatakan bahawa sukar untuk mengetahui sama ada masalah itu sukar, tetapi anda mendapat jenaka itu.

Artikel berkaitan

  • Muat turun: Panduan pengembangan kerjaya pemaju
  • Kekuatan pengaturcaraan malas
  • 7 idea pengaturcaraan buruk yang berfungsi
  • 9 tabiat pengaturcaraan buruk yang kita gemari secara diam-diam
  • 21 trend pengaturcaraan yang panas - dan 21 akan menjadi sejuk
  • Muat turun: Panduan survival perniagaan pengaturcara profesional
  • Muat turun: 29 petua untuk berjaya sebagai pembangun bebas
  • 7 bahasa pengaturcaraan yang sangat kita benci
  • 5 lagi pelajaran abadi pengaturcaraan 'graybeards'
  • 22 penghinaan yang tidak mahu didengar oleh pemaju
  • 9 ramalan untuk masa depan pengaturcaraan
  • 13 kemahiran pembangun yang perlu anda kuasai sekarang
  • Program dunia: 12 teknologi yang perlu anda ketahui sekarang
  • Serangan bahasa pengaturcaraan satu huruf