Programovanie

Sedem najťažších problémov v programovaní

Hovorilo sa, že nezmapované územia starých máp boli často označené zlovestným varovaním: „Tu buď draci.“ Možno apokryfná, myšlienka bola, že nikto, kto sa potuluje v týchto neznámych kútoch sveta, by to nemal robiť bez toho, aby bol pripravený bojovať s hrôzostrašným nepriateľom. V týchto záhadných oblastiach sa mohlo stať čokoľvek a často to nebolo dobré.

Programátori môžu byť trochu civilizovanejší ako stredovekí rytieri, ale to neznamená, že moderný technický svet nemá svoj podiel technických drakov, ktorí nás čakajú na nepredvídaných miestach: Ťažké problémy, ktoré čakajú na termín o pár minút; komplikácie, ktoré si prečítali príručku a vedia, čo nie je dobre špecifikované; zlí draci, ktorí vedia, ako sa vplížiť k zapleteným chybám a predčasným chybám, často hneď po spáchaní kódu.

Nájdu sa ľudia, ktorí v noci potichu odpočívajú a zahrievajú ich naivné sebavedomie, že počítače sú úplne predvídateľné a úprimne chrlia správne odpovede. Ach, ako málo toho vedia. Pri všetkej tvrdej práci návrhárov čipov, vývojárov jazykov a miliónov programátorov na celom svete stále existujú tŕnisté húštiny programovacích problémov, ktoré dokážu aj tých najsilnejších programátorov zraziť na kolená.

Tu je sedem najodvážnejších kútov sveta programovania, do ktorých vložíme veľké značky s nápisom „Tu buď draci“.

Viacvláknové spracovanie

Znel to ako dobrý nápad: Rozdeľte svoj program na samostatné sekcie a nechajte ich operačným systémom OS bežať ako samostatné malé programy. Ak majú procesory štyri, šesť, osem alebo ešte viac jadier, prečo nenapísať svoj kód tak, aby mohol mať štyri, šesť, osem alebo viac vlákien s využitím všetkých jadier nezávisle?

Myšlienka funguje - keď sú časti v skutočnosti úplne oddelené a nemajú navzájom nič spoločné. Ale akonáhle potrebujú prístup k rovnakým premenným alebo zápis bitov do rovnakých súborov, všetky stávky sú vypnuté. Jedno z vlákien sa dostane najskôr k údajom a vy nemôžete odhadnúť, o ktoré vlákno pôjde.

Vytvárame teda monitory, semafory a ďalšie nástroje na organizovanie viacvláknového neporiadku. Keď pracujú, pracujú. Iba pridajú ďalšiu vrstvu zložitosti a premenia akt ukladania dát do premennej na položku, ktorá si vyžaduje trochu viac premýšľania.

Keď nepracujú, je to čistý chaos. Údaje nedávajú zmysel. Stĺpce sa nezhodujú. Peniaze z účtov zmiznú. Je to všetko v pamäti. A veľa šťastia pri pokuse niečo z toho vypichnúť. Vývojári väčšinou skončia uzamknutím veľkých častí dátovej štruktúry, takže sa jej môže dotknúť iba jedno vlákno. To môže nastoliť chaos, ale iba zabitím väčšiny negatívnych stránok toho, že viac vlákien pracuje na rovnakých dátach. Môžete ho tiež prepísať ako program s jedným vláknom.

Uzávery

Niekde po línii sa niekto rozhodol, že by bolo užitočné obchádzať funkcie, akoby išlo o údaje. Toto fungovalo dobre v jednoduchých prípadoch, ale programátori si začali uvedomovať, že problémy nastali, keď funkcie dosiahli mimo seba a dostali sa k ďalším údajom, ktoré sa často nazývajú „voľné premenné“. Ktorá verzia bola správna? Boli to údaje, keď sa začalo volanie funkcie? Alebo to bolo, keď funkcia skutočne beží? To je obzvlášť dôležité pre JavaScript, kde môžu byť medzi nimi dlhé medzery.

Riešenie, „uzavretie“, je jedným z najväčších zdrojov bolesti hlavy pre programátorov JavaScriptu (teraz Java a Swift). Nováčikovia a dokonca ani mnohí veteráni nemôžu prísť na to, čo sa zatvára a kde môžu byť hranice takzvaného uzáveru.

Názov nepomáha - nie je to tak, že prístup je trvale zatvorený ako bar oznamujúci posledný hovor. Ak je to možné, prístup je otvorený, ale iba prostredníctvom červej diery v dátovom časovom kontinuu, čudného mechanizmu posúvania času, ktorý sa časom nakoniec môže stať sci-fi televíznou šou. Ale nazývať ho „Komplexným mechanizmom prístupu k zásobníku“ alebo „Systémom kontroly údajov“ sa zdá byť príliš dlhý, takže sme uviazli na „uzáveroch“. Nenechajte ma začať tým, či niekto musí platiť za neslobodné premenné.

Príliš veľké dáta

Keď sa RAM začne plniť, všetko sa začne zhoršovať. Nezáleží na tom, či práve vykonávate novú štatistickú analýzu spotrebiteľských údajov alebo pracujete na nudnej starej tabuľke. Keď stroju dôjde RAM, zmení sa na takzvanú virtuálnu pamäť, ktorá sa vyleje na superpevný pevný disk. Je to lepšie ako úplné zrútenie alebo ukončenie práce, ale chlapec všetko spomalí.

Problém je v tom, že pevné disky sú minimálne 20 alebo 30-krát pomalšie ako RAM a diskové jednotky na veľkoobchodnom trhu sú často pomalšie. Ak sa o zápis alebo čítanie z disku pokúša aj nejaký iný proces, všetko sa dramaticky zhorší, pretože disky dokážu súčasne robiť iba jednu vec.

Aktivácia virtuálnej pamäte prehlbuje ďalšie skryté problémy s vaším softvérom. Ak existujú závity závitu, začnú sa lámať oveľa rýchlejšie, pretože vlákna, ktoré sú uviaznuté vo virtuálnej pamäti pevného disku, bežia oveľa pomalšie ako ostatné vlákna. To však trvá iba krátke obdobie, pretože prvé vlákna nite sa vymenia do pamäte a ostatné vlákna sa zavesia. Ak je kód perfektný, výsledok je iba oveľa pomalší. Ak to tak nie je, nedostatky ju rýchlo pošlú do katastrofy. To je jeden malý príklad.

Správa je skutočnou výzvou pre programátorov, ktorí pracujú s veľkými hromadami dát. Ktokoľvek, kto bude trochu nedbalý pri budovaní márnotratných dátových štruktúr, skončí s kódom, ktorý spomalí prechádzanie výroby. Môže to fungovať dobre s niekoľkými testovacími prípadmi, ale skutočné zaťaženie to vedie k zlyhaniu.

NP-úplné

Každý, kto má vysokoškolské vzdelanie v odbore informatiky, vie o záhadných problémoch zabalených v skratke, ktorá je zriedka uvedená: nedeterministický polynóm úplný, alias NP-úplný. Učenie sa podrobnostiam trvá často celý semester a dokonca aj vtedy veľa študentov CS prichádza s hmlistou predstavou, že tieto problémy nikto nedokáže vyriešiť, pretože sú príliš tvrdí.

Problémy spojené s NP sú často dosť ťažké - ak na ne zaútočíte hrubou silou. Napríklad „problém obchodného cestujúceho“ môže trvať exponenciálne dlho, pretože predajná cesta zahŕňa čoraz viac miest. Riešenie „problému s batohom“ nájdením podmnožiny čísel, ktoré sa najviac približujú k nejakej hodnote N, sa rieši vyskúšaním všetkých možných podmnožín, čo je veľmi veľké číslo. Každý má strach z týchto problémov, pretože je dokonalým príkladom jedného z najväčších strašidiel v Silicon Valley: algoritmy, ktoré nebudú mať mierku.

Zložitou časťou je, že niektoré NP-úplné problémy sa dajú ľahko vyriešiť pomocou aproximácie. Algoritmy nesľubujú presné riešenie, ale sú si veľmi blízke. Možno nenájdu ideálnu cestu pre obchodného cestujúceho, ale môžu prísť do pár percentuálnych bodov od správnej odpovede.

Existencia týchto celkom dobrých riešení spôsobí, že draci budú iba tajomnejší. Nikto si nemôže byť istý, či sú problémy skutočne ťažké alebo ľahké, ak ste ochotní uspokojiť sa s odpoveďou, ktorá je dosť dobrá.

Bezpečnosť

"Sú známe známe; existujú veci, o ktorých vieme, že vieme, “uviedol na tlačovej konferencii raz minister obrany za druhej Bushovej vlády Donald Rumsfeld. "Vieme tiež, že existujú známe neznáme; to znamená, že vieme, že sú veci, ktoré nepoznáme. Existujú však aj neznáme neznáme - tie, ktoré nepoznáme, nepoznáme. “

Rumsfeld hovoril o vojne v Iraku, ale to isté platí pre počítačovú bezpečnosť. Najväčším problémom sú diery, o ktorých ani len netušíme, že sú možné. Každý chápe, že by ste mali svoje heslo ťažko uhádnuť - toto je známe známe. Ale komu kedy bolo povedané, že váš sieťový hardvér má vo svojom vnútri zakopanú vlastnú softvérovú vrstvu? Možnosť, že niekto môže preskočiť hacknutie vášho OS a namiesto toho zacieliť na túto tajnú vrstvu, je neznáma neznáma.

Možnosť takého hacknutia vám nemusí byť teraz neznáma, ale čo keď existujú ďalšie? Nemáme potuchy, či dokážeme spevniť diery, o ktorých ani len netušíme. Môžete rozdeliť heslá, ale existujú praskliny, ktoré si ani nedokážete predstaviť. To je zábava pri práci s počítačovou bezpečnosťou. A pokiaľ ide o programovanie, myslenie zamerané na bezpečnosť je čoraz dôležitejšie. Pri upratovaní neporiadku nemôžete nechať na bezpečnostných profesionálov.

Šifrovanie

Šifrovanie znie mocne a nepreniknuteľne, keď sa predstavitelia orgánov činných v trestnom konaní dostanú pred Kongres a požiadajú o oficiálne medzery, ktoré ho zastavia. Problém je v tom, že väčšina šifrovania je postavená na hmlistom oblaku neistoty. Aké matematické dôkazy máme, spočívajú na neistých predpokladoch, napríklad je ťažké vypočítať skutočne veľké čísla alebo vypočítať diskrétny protokol.

Sú tieto problémy skutočne ťažké? Nikto verejne neopísal žiadne algoritmy na ich porušenie, to však neznamená, že riešenia neexistujú. Ak by ste našli spôsob, ako odpočúvať každú konverzáciu a preniknúť do ktorejkoľvek banky, okamžite by ste to povedali svetu a pomohli by ste im zaplátať diery? Alebo by ste zostali ticho?

Skutočnou výzvou je použitie šifrovania v našom vlastnom kóde. Aj keď veríme, že základné algoritmy sú bezpečné, čaká nás ešte veľa práce so žonglovaním s heslami, kľúčmi a spojeniami. Ak urobíte jednu chybu a necháte heslo nechránené, všetko sa otvorí.

Správa identít

Každý má rád túto newyorskú karikatúru s pointom: „Na internete nikto nevie, že si pes.“ Má dokonca svoju vlastnú stránku Wikipedia so štyrmi prepracovanými sekciami. (Na internete nikto nepozná starú pílu o analýze humoru a rozoberaní žiab.)

Dobrá správa je, že anonymita môže byť oslobodzujúca a užitočná. Zlou správou je, že nemáme nijaké potuchy, ako robiť čokoľvek, iba anonymnú komunikáciu. Niektorí programátori hovoria o „dvojfaktorovej autentifikácii“, tí inteligentní však skočia na „autentifikáciu N-faktorom“.

Po hesle a možno aj textovej správe na mobil nemáme veľa vecí, ktoré by boli veľmi stabilné. Čítačky odtlačkov prstov vyzerajú pôsobivo, ale zdá sa, že veľa ľudí je ochotných prezradiť, ako môžu byť napadnutí hackermi (úvodné informácie nájdete tu, tu a tu).

Svetu nečinného chatovania na Snapchate alebo Reddite veľa z toho nezáleží, ale prúd hackovaných stránok na Facebooku je trochu znepokojujúci. Nie je ľahký spôsob riešenia závažných vecí, ako je majetok, peniaze, zdravotná starostlivosť alebo vlastne všetko ostatné v živote, okrem nezmyselných malých rečí. Bitcoinoví fanúšikovia sa radi oháňajú tým, aký blockchain môže byť pevný, ale mince sa nejako vytrhávajú (pozri tu a tu). Nemáme žiadnu skutočnú metódu na narábanie s identitou.

Meranie tvrdosti

Samozrejme, pokiaľ ide o programovanie, existuje vôbec spôsob, ako môžeme zmerať náročnosť problému? Nikto vlastne nevie. Vieme, že niektoré problémy sa dajú ľahko vyriešiť, ale je úplne iné, keď je jeden taký tvrdý. Úplnosť NP je iba jednou časťou zložitého pokusu o kodifikáciu zložitosti algoritmov a analýzy údajov. Teória je užitočná, ale nemôže ponúknuť žiadne záruky. Je lákavé povedať, že je ťažké vôbec vedieť, či je problém ťažký, ale žartujete.

Súvisiace články

  • Stiahnuť ▼: Sprievodca kariérnym rozvojom vývojárov
  • Sila lenivého programovania
  • 7 zlých nápadov na programovanie, ktoré fungujú
  • 9 zlých programovacích návykov, ktoré tajne milujeme
  • 21 horúcich programovacích trendov - a 21 chladných
  • Stiahnuť ▼: Sprievodca prežitím podnikania profesionálneho programátora
  • Stiahnuť ▼: 29 tipov na úspech ako nezávislý vývojár
  • 7 programovacích jazykov, ktoré nenávidíme
  • 5 ďalších nadčasových lekcií programovania „šedých fúzov“
  • 22 urážok, ktoré žiadny vývojár nechce počuť
  • 9 predpovedí pre budúcnosť programovania
  • 13 vývojárskych schopností, ktoré musíte teraz zvládnuť
  • Programujte svet: 12 technológií, ktoré teraz potrebujete vedieť
  • Útok na jednopísmenové programovacie jazyky
$config[zx-auto] not found$config[zx-overlay] not found