Kérdezze meg a fejlesztőt, hogy szerinte mi a legfontosabb tudnivaló a számítástechnikával kapcsolatban, és rengeteg választ kap: algoritmusok, adatstruktúrák, reguláris kifejezések és egyéb megvalósítási szintű fogalmak. Ritkán látni, hogy valaki absztrakciót válaszol.

Absztrakciók nyelvi szinten

A programozási nyelvekre gondolva három csoportba sorolhatók:

  1. mondja meg a gépnek, hogy pontosan mit tegyen
  2. mondd el a gépnek, hogyan kell csinálni
  3. mondd el a gépnek, hogy mit szeretnél

Az assembly nyelv programozása, hogy pontosan megmondja a gépnek, hogy mit kell tennie. Vigyen át biteket innen oda, most adja hozzá őket, majd tárolja vissza ebben a regiszterben.

Az, hogy megmondjuk a gépnek, hogyan kell csinálni, a C/C++ és a Java birodalmába tartozik. Ön nem a biteket forgatja, hanem arra utasítja a gépet, hogy egy gyűjtemény feletti ciklust akarjon egy indexváltozó segítségével, majd végrehajt egy műveletet a gyűjtemény minden egyes adatával.

Megmondani a gépnek, hogy mit szeretne tenni, ami a Haskell, az F# és a Java's Streams birodalmába tartozik (bizonyos mértékben – tudom, hogy ez nem egészen helyes). Itt olyan programokat írsz, amelyek azt mondják: ebben a gyűjteményben azt szeretném, ha az összes elemet szűrnéd, csak egy bizonyos elemre, majd átalakítsd az elemeket egy másik formátumba, majd ezt követően készíts egy hisztogramot arról, hogy hányszor adott értéket. Megjelenik.

Minél magasabb az absztrakció szintje, annál kevésbé vesz részt a programozásban, amely az elektronszinten pörgő biteket, de annál inkább részt vesz a tényleges munka elvégzésében (tm).

Absztrakciók tervezési szinten

A tervezés ebben az esetben mindent lefed: a metódustól az osztályon át a komponensen át a rendszeren át a több rendszerig. Minden ponton meg kell értened azokat az absztrakciókat, amelyeken dolgozol.

A módszer szintjén ez olyan egyszerű, mint kitalálni, hogy valójában mi a probléma megoldása, és kiválasztani a megfelelő adatstruktúrákat és algoritmusokat.

A hierarchiát felfelé követve az osztály / objektum / kapcsolódó függvények és metódusok szintjén találjuk magunkat. Itt olyan műveleteket próbálunk összehangolni, amelyeknek értelme van együtt lenni. Ezen a ponton jobban foglalkozunk a végrehajtott nagyobb műveletekkel, mint például: megőrizzük ezt az adatkészletet egy adattárban, vagy küldjünk munkát egy feladatsorba. Nem az aggaszt bennünket, hogy hogyan fogjuk csinálni, csak az, hogy meg fogjuk tenni. Mindazonáltal számít az algoritmus, amelyet ehhez a munkához használunk, valamint az általunk elküldött és fogadott adatok.

Következik az osztályok / objektumok / kapcsolódó funkciók többszörösének koordinálása: hogyan működnek ezek együtt? Ezen a ponton azt hiszem, látni fogja, hogy döglött lovat verek; minden magas szinten ugyanazt csinálják: kitalálják a valódi problémát, meghatározzák a helyes adatstruktúrákat és algoritmusokat, majd implementálják (vagy elmondják az embereknek, hogyan kell megvalósítani).

Az absztrakciók kezelésének megtanulása

Miután beszélt az absztrakciókról, és arról, hogy nem igazán gondolunk rájuk, valószínűleg felteszi magának a kérdést: „Én, hogyan alkalmazhatom az absztrakciókat, hogy áldatlan fejlesztő / építész / félisten legyek. ?” A válasz: gyakorlat.

Nem számít, milyen szintű fejlesztő vagy, csak le kell ülni és átgondolni a problémát. Példaként gondoljon egy egyszerű rsync esetre. Két különböző gépen lévő könyvtárakat szeretné naprakészen tartani egymással (csak fájlok/könyvtárak másolása és felülírása). Mit is jelent ez? Először is írjunk fel néhány feltételezést:

  1. Amikor a művelet befejeződött, az összes fájl és könyvtár mindkét gépen létezik, és ugyanaz.
  2. Ha a forráson lévő fájl vagy könyvtár nem létezik a célon, akkor a rendszer átmásolja vagy létrehozza (könyvtárak esetén) a célon, és fordítva.
  3. Ha mindkét gépen létezik fájl, akkor a legújabb fájl nyeri az ütközést.

Ez a három feltevés határozza meg, hogyan várjuk el, hogy magas szinten működjön, és hogyan kell viselkednie.

A következő szinten lejjebb azt szeretnénk megvizsgálni, hogyan tudnánk ezt megvalósítani egyetlen gépen. Ismét leírok néhány feltételezést:

  1. A gép rendelkezik egy listával a másik gépen lévő összes könyvtárról és fájlról, valamint metaadatokat, hogy meghatározza a fájlok közötti különbségeket.
  2. Egy gép a forrásgép, egy másik pedig a cél.
  3. Létrejön a fogadandó és küldendő fájlok listája
  4. Létrejön a létrehozandó könyvtárak listája
  5. A fájlok megfelelően másolásra kerülnek
  6. A címtárak megfelelően vannak létrehozva

Most, még egy szinttel lejjebb megyünk, megnézzük az egyes fenti felsoroláspontokat, és kitaláljuk az egyes megoldásokhoz szükséges algoritmusokat. Ezen a ponton félrelépek, és „gyakorlatként hagyva az olvasónak” nevezem, hogy te, kedves olvasó, gyakorolhass egy kicsit. :)