Programavimas

7 labiausiai varginančios problemos programuojant

Buvo sakoma, kad nepažymėtos senųjų žemėlapių teritorijos dažnai buvo pažymėtos grėsmingu įspėjimu: „Čia būk drakonai“. Galbūt apokrifinė mintis buvo ta, kad niekas, klaidžiojantis po šiuos nežinomus pasaulio kampelius, neturėtų to daryti, nebūdamas pasirengęs kovoti su siaubingu priešu. Šiuose paslaptinguose regionuose gali atsitikti bet kas, ir dažnai viskas nebuvo gerai.

Programuotojai gali būti kiek civilizuotesni nei viduramžių riteriai, tačiau tai nereiškia, kad šiuolaikinis technikos pasaulis neturi savo dalies techninių drakonų, kurie mūsų laukia nenumatytose vietose: sunkios problemos, kurios laukia, kol galutinis terminas praeis minutėmis; komplikacijos, perskaičiusios vadovą ir žinančios, kas nėra tiksliai nurodyta; piktieji drakonai, kurie moka paslėpti „inchoate“ klaidas ir nesavalaikius nesklandumus, dažnai iškart po kodo įvedimo.

Bus tokių, kurie ramiai ilsėsis naktį, sušildyti savo naivaus pasitikėjimo savimi, kad kompiuteriai yra visiškai nuspėjami, nuoširdžiai muša teisingus atsakymus. Oi, kaip mažai jie žino. Atliekant visą sunkaus lustų kūrėjų, kalbos kūrėjų ir milijonų programuotojų darbo vietą, vis dar yra dygliuotų programavimo problemų, kurios gali ant kelių priversti net galingiausius programuotojus.

Pateikiame septynis gražiausius programavimo pasaulio kampelius, į kuriuos įdėjome didelius žymeklius su užrašu „Čia būk drakonai“.

Daugialypis sriegis

Tai nuskambėjo kaip gera idėja: suskaidykite programą į atskirus skyrius ir leiskite OS paleisti jas kaip atskiras mažas programas. Jei procesoriai turi keturis, šešis, aštuonis ar net daugiau branduolių, kodėl gi ne parašyti savo kodo, kad jis galėtų turėti keturias, šešias, aštuonias ar daugiau gijų, naudojant visas šerdis atskirai?

Idėja veikia - kai dalys iš tikrųjų yra visiškai atskiros ir neturi nieko bendro. Bet kai jiems reikia prieiti prie tų pačių kintamųjų arba rašyti bitus į tuos pačius failus, visi statymai yra išjungti. Pirmiausia viena iš gijų pateks į duomenis ir negalėsite nuspėti, kuri gija tai bus.

Taigi, mes sukuriame monitorius, semaforus ir kitus įrankius, kad organizuotume daugialypę netvarką. Kai jie dirba, jie dirba. Jie tik prideda dar vieną sudėtingumo sluoksnį ir paverčia duomenų saugojimą kintamajame elementu, kuriam reikia šiek tiek daugiau apgalvoti.

Kai jie neveikia, tai grynas chaosas. Duomenys neturi prasmės. Stulpeliai nesumuojami. Pinigai dingsta iš sąskaitų su kaklu. Visa tai atmintyje. Ir sėkmės bandant bet kurį iš jų išsiaiškinti. Dažniausiai kūrėjai užrakina didelius duomenų struktūros gabalus, kad tik viena gija galėtų paliesti ją. Tai gali sustabdyti chaosą, tačiau tik užmušant didžiąją dalį to, kad keli siūlai dirba su tais pačiais duomenimis. Taip pat galite jį perrašyti kaip „vienos gijos“ programą.

Uždarymai

Kažkur išilgai kas nors nusprendė, kad būtų naudinga perduoti funkcijas taip, lyg jos būtų duomenys. Tai gerai veikė paprastais atvejais, tačiau programuotojai pradėjo suprasti, kad problemos iškilo tada, kai funkcijos pasiekė save ir pasiekė kitus duomenis, dažnai vadinamus „laisvaisiais kintamaisiais“. Kuri versija buvo teisinga? Ar tai buvo duomenys, kai buvo pradėtas funkcijos iškvietimas? O gal tai buvo tada, kai funkcija iš tikrųjų veikia? Tai ypač svarbu „JavaScript“, kur tarp jų gali būti ilgų spragų.

Sprendimas, „uždarymas“, yra vienas didžiausių „JavaScript“ (o dabar „Java“ ir „Swift“) programuotojų galvos skausmo šaltinių. Naujokai ir net daugelis veteranų negali suprasti, kas uždaryta ir kur gali būti vadinamojo uždarymo ribos.

Pavadinimas nepadeda - nėra taip, kad prieiga būtų uždaryta visam laikui, pavyzdžiui, baras, skelbiantis paskutinį skambutį. Jei kas nors, prieiga yra atvira, bet tik per kirmino skylę duomenų ir laiko kontinuume - keistą laiko perkėlimo mechanizmą, kuris ilgainiui sukels mokslinės fantastikos televizijos laidą. Tačiau tai vadinti „sudėtingu prieigos prie duomenų kaupimo mechanizmu“ arba „duomenų valdymo žongliravimo sistema“ atrodo per ilgai, todėl esame įstrigę „uždarymuose“. Nepradėkite manęs sužinoti, ar kam nors reikia mokėti už nemokamus kintamuosius.

Per dideli duomenys

Kai RAM pradeda pildytis, viskas pradeda blogėti. Nesvarbu, ar atliekate naują statistinę vartotojų duomenų analizę, ar dirbate nuobodžią, seną skaičiuoklę. Kai mašinai baigiasi RAM, ji pereina į vadinamąją virtualiąją atmintį, kuri išsilieja į superlėtąjį standųjį diską. Tai geriau nei visiškai sumušti ar baigti darbą, bet berniukas viską sulėtina.

Problema ta, kad standieji diskai yra mažiausiai 20 ar 30 kartų lėtesni nei RAM, o masinės rinkos diskų įrenginiai dažnai yra lėtesni. Jei kitas procesas taip pat bando rašyti ar skaityti iš disko, viskas smarkiai pablogėja, nes diskai vienu metu gali atlikti tik vieną dalyką.

Suaktyvinus virtualiąją atmintį, padidėja kitos, paslėptos jūsų programinės įrangos problemos. Jei yra gijų trikdžių, jie pradeda lūžti daug greičiau, nes standžiojo disko virtualioje atmintyje įstrigusios gijos veikia daug lėčiau nei kitos gijos. Vis dėlto tai trunka tik trumpai, nes kažkada sienų žiedų siūlai įsimeta į atmintį, o kiti siūlai pakimba. Jei kodas yra tobulas, rezultatas yra tik daug lėtesnis. Jei taip nėra, dėl trūkumų ji greitai nukrenta į katastrofą. Tai vienas mažas pavyzdys.

Tai valdyti yra tikras iššūkis programuotojams, dirbantiems su didelėmis duomenų kaupomis. Kiekvienas, kuriam pasidaro šiek tiek nerangu kuriant švaistomas duomenų struktūras, gauna kodą, kuris sulėtėja iki gamybos patikrinimo. Keli bandomieji atvejai gali gerai veikti, tačiau dėl realių krūvių jis sugenda į gedimą.

NP-baigtas

Kiekvienas, turintis universitetinį kompiuterių mokslų išsilavinimą, žino paslaptingas problemas, apipintas akronimu, kuris yra retai išdėstomas: nedeterministinis daugianaris, dar žinomas kaip „NP“. Detalėms išmokti dažnai reikia viso semestro, ir net tada daugelis CS studentų pateikia miglotą nuomonę, kad niekas negali išspręsti šių problemų, nes jos yra per sunkios.

NP užbaigtos problemos dažnai yra gana sunkios - jei jas puolate tiesiog grubia jėga. Pavyzdžiui, „keliaujančio pardavėjo problema“ gali užtrukti eksponentiškai ilgai, nes pardavimo maršrutas apima vis daugiau miestų. „Kuprinės problemos“ sprendimas, surandant skaičių pogrupį, kuris artimiausias tam tikrai vertei N, išsprendžiamas išbandant visus galimus pogrupius, o tai yra labai didelis skaičius. Visi bijo bijodami šių problemų, nes jie yra puikus pavyzdys vieno didžiausių silikonų slėnio bogenų: algoritmai, kurie nebus keičiami.

Keblu yra tai, kad kai kurias NP užbaigtas problemas lengva išspręsti apytiksliai. Algoritmai nežada tikslaus sprendimo, tačiau jie yra gana artimi. Jie gali nerasti tobulo keliaujančio pardavėjo maršruto, tačiau gali patekti į kelis procentinius taškus nuo teisingo atsakymo.

Šių gana gerų sprendimų egzistavimas paverčia slibinus tik paslaptingesniais. Niekas negali būti tikras, ar problemos tikrai yra pakankamai sunkios ar lengvos, jei norite būti patenkintas atsakymu, kuris yra pakankamai geras.

Saugumas

„Yra žinomų žinomų; yra dalykų, kuriuos žinome, kad žinome “, - kartą per spaudos konferenciją sakė gynybos sekretorius antrosios Busho administracijos metu Donaldas Rumsfeldas. „Mes taip pat žinome, kad yra žinomų nežinomų asmenų; tai yra, mes žinome, kad yra keletas dalykų, kurių mes nežinome. Tačiau yra ir nežinomų nežinomųjų - tų, kurių nepažįstame, nežinome “.

Rumsfeldas kalbėjo apie karą Irake, tačiau tas pats pasakytina ir apie kompiuterių saugumą. Didžiausios problemos yra skylės, kurių net nežinome. Visi supranta, kad turėtumėte sunkiai atspėti slaptažodį - tai žinoma. Bet kam kada nors buvo pasakyta, kad jūsų tinklo aparatinėje įrangoje yra palaidotas savas programinės įrangos sluoksnis? Tikimybė, kad kažkas gali praleisti įsilaužimą į jūsų OS ir užuot nukreipęs šį slaptą sluoksnį, nežinoma.

Tokio įsilaužimo galimybė jums gali būti nežinoma dabar, bet ką daryti, jei yra kitų? Mes neturime supratimo, ar galime sutvirtinti skyles, kurių net nežinome. Galite išplėšti slaptažodžius, tačiau yra įtrūkimų, kurių net neįsivaizduojate. Tai smagu dirbti su kompiuterių sauga. Kalbant apie programavimą, į saugumą orientuotas mąstymas tampa vis svarbesnis. Negalite palikti saugumo profesionalams išvalyti savo netvarkos.

Šifravimas

Šifravimas skamba galingai ir neperžengiamai, kai teisėsaugos pareigūnai stoja priešais Kongresą ir paprašo oficialių spragų, kad tai sustabdytų. Problema ta, kad didžioji dalis šifravimo yra paremta miglotu nežinomybės debesiu. Kokie matematiniai įrodymai remiasi neaiškiomis prielaidomis, pavyzdžiui, sunku apskaičiuoti tikrai didelius skaičius ar apskaičiuoti atskirą žurnalą.

Ar tos problemos išties sunkios? Niekas viešai neaprašė jokių jų sulaužymo algoritmų, tačiau tai nereiškia, kad sprendimų nėra. Jei rastumėte būdą, kaip pasiklausyti kiekvieno pokalbio ir įsilaužti į bet kurį banką, ar nedelsdami pasakytumėte pasauliui ir padėtumėte jiems užkirsti kelią? O gal tylėtumėte?

Tikras iššūkis yra šifravimo naudojimas mūsų pačių kode. Net jei pasitikime, kad pagrindiniai algoritmai yra saugūs, daug reikia nuveikti žongliruojant slaptažodžiais, raktais ir jungtimis. Jei padarysite vieną klaidą ir paliksite neapsaugotą slaptažodį, viskas bus atidaryta.

Tapatybės valdymas

Visiems patinka tas „New Yorker“ animacinis filmas su štampu: „Internete niekas nežino, kad tu esi šuo“. Jis netgi turi savo „Wikipedia“ puslapį su keturiais įmantriais skyriais. (Internete niekas nežino senų pjūklų apie humoro analizę ir varlių skrodimą.)

Gera žinia ta, kad anonimiškumas gali būti išlaisvinantis ir naudingas. Blogos naujienos yra tai, kad mes neturime supratimo, kaip daryti bet ką, išskyrus anoniminius ryšius. Kai kurie programuotojai kalba apie „dviejų veiksnių autentifikavimą“, tačiau išmanieji pereina prie „N faktoriaus autentifikavimo“.

Po slaptažodžio ir galbūt teksto pranešimo į mobilųjį telefoną mes neturime daug, kas yra labai stabilu. Pirštų atspaudų skaitytojai atrodo įspūdingai, tačiau atrodo, kad daugybė žmonių nori atskleisti, kaip juos galima nulaužti (žiūrėkite čia, čia ir pradžiai).

Nedaug to svarbu „Snapchat“ ar „Reddit“ tuščiosios eigos pokalbių pasauliui, tačiau nulaužtų „Facebook“ puslapių srautas šiek tiek kelia nerimą. Nėra lengvo būdo tvarkyti rimtus reikalus, tokius kaip turtas, pinigai, sveikatos priežiūra ar beveik visa kita gyvenime, išskyrus beprasmiškas mažas kalbas. Bitkoinų gerbėjai mėgsta pamaloninti, koks tvirtas gali būti „blockchain“, tačiau kažkaip monetos vis plėšosi (žiūrėkite čia ir čia). Mes neturime realaus metodo, kaip tvarkyti tapatybę.

Kietumo matavimas

Žinoma, kalbant apie programavimą, ar yra koks nors būdas, kuriuo galime išmatuoti problemos sunkumą? Niekas tikrai nežino. Mes žinome, kad kai kurias problemas lengva išspręsti, tačiau visiškai kitaip patvirtinti, kad sunku. NP užbaigtumas yra tik viena sudėtingo bandymo koduoti algoritmų ir duomenų analizės sudėtingumą dalis. Teorija yra naudinga, tačiau ji negali suteikti jokių garantijų. Gundu sakyti, kad net sunku žinoti, ar problema yra sunki, bet gerai, supranti pokštą.

Susiję straipsniai

  • Parsisiųsti: Kūrėjo karjeros tobulinimo vadovas
  • Tinginio programavimo galia
  • 7 blogos programavimo idėjos, kurios veikia
  • 9 blogi programavimo įpročiai, kuriuos slapta mėgstame
  • 21 karšto programavimo tendencija ir 21 šalta
  • Parsisiųsti: Profesionalaus programuotojo verslo išlikimo vadovas
  • Parsisiųsti: 29 patarimai, kaip sėkmingai dirbti kaip nepriklausomam kūrėjui
  • 7 programavimo kalbos, kurių mėgstame nekęsti
  • Dar 5 nesenstančios „pilkųjų barzdų“ programavimo pamokos
  • 22 įžeidimai, kurių nė vienas kūrėjas nenori girdėti
  • 9 programavimo ateities prognozės
  • 13 kūrėjo įgūdžių, kuriuos turite įvaldyti dabar
  • Programuokite pasaulį: 12 technologijų, kurias turite žinoti dabar
  • Vienos raidės programavimo kalbų ataka