A cikk legfontosabb pontjai:
A cikk rámutat arra, hogy az ipari alkalmazás refaktorálása akkor indokolt, ha a kisebb módosítások költsége és bizonytalansága gyorsabban nő, mint azok üzleti értéke. Lényeges különbséget tenni a struktúra rendezése és az olyan műszaki változtatás között, amely hatással van a folyamatra vagy a biztonságra.
- A régi alkalmazás refaktorálása a termelés folytonosságát, a költségeket és a felelősséget is érinti, nem csupán a kód minőségét.
- A kockázat nő, ha a módosítás hatással van a jelekre, az állapotokra, a műveletek sorrendjére vagy a folyamat átmeneti feltételeire.
- A látszólag műszaki jellegű változtatások megváltoztathatják az indítást, a leállítást, a hibák nyugtázását, az áramellátás megszűnésére és a kommunikáció elvesztésére adott reakciót.
- Ha a védelmi áramkörök sorrendjeit vagy reakcióit ismételten igazolni kell, az már nem egyszerű kódkarbantartás.
- A biztonságos áttervezéshez meg kell határozni a módosítás határait, az elfogadási kritériumokat és a folyamat kockázatértékelését.
Miért fontos ma ez a téma
Egy régi ipari alkalmazás refaktorálása ma már nem a kód esztétikájáról vagy a karbantartás kényelméről szól. Ma ez a termelés folytonosságát, a költségek kiszámíthatóságát és a felelősség terjedelmét érintő döntés a rendszer tulajdonosának oldalán. Sok üzemben a vezérlőalkalmazások, az operátori eszközök és a kommunikációs rétegek évek alatt, egységes architektúra nélkül fejlődtek, gyakran olyan berendezésekre, könyvtárakra és integrációs mechanizmusokra építve, amelyek támogatása korlátozott vagy már megszűnt. Ez az állapot egy ideig még elfogadható lehet, de csak addig, amíg minden további módosítás többe nem kerül, mint maga a funkció, amelyet biztosítania kellene. Ekkor a kérdés már nem az, hogy érdemes-e hozzányúlni a régi alkalmazáshoz, hanem az, hogy a szervezet továbbra is kézben tartja-e annak működését termelési körülmények között.
A téma jelentőségét az adja, hogy ipari rendszerekben a technológiai adósság nagyon gyorsan működési adóssággá válik. Ha egy alkalmazást nehéz újra előállítani, egyes kulcsemberektől függ, nincsenek megbízható reprodukciós tesztjei, vagy a logikája összekeveri a termelési funkciókat a biztonsági és diagnosztikai funkciókkal, akkor minden incidens drágább lesz, mint egy hasonló probléma egy irodai rendszerben. Ennek következménye nem csupán az állásidő. Megjelenik a karbantartás költsége, az időnyomás alatt alkalmazott hibás kerülőmegoldások kockázata, a változtatás utáni kellő gondosság igazolásának nehézsége, valamint annak problémája is, hogy mi volt korábban is fennálló hiba, és mi a projektcsapat beavatkozásának következménye. A vezető és a terméktulajdonos számára a gyakorlati mérce egyszerű: ha a további kisebb módosítások bevezetésének ideje és bizonytalansága gyorsabban nő, mint azok üzleti értéke, akkor az alkalmazás olyan állapotba került, ahol a refaktorálásról tudatos döntést kell hozni, nem pedig az első kritikus meghibásodásig halogatni.
A legtöbb hiba akkor jelenik meg, amikor a refaktorálást úgy kezelik, mint a „folyamatra hatás nélküli” korszerűsítést, miközben valójában megváltoztatja a rendszer döntéshozatali módját. A gyakorlatban ehhez elég egy látszólag kisebb beavatkozás: kommunikációs komponens cseréje, a feladatütemezés átalakítása, az érzékelőadatok pufferelési logikájának módosítása vagy az újraindítás utáni indítási sorrend rendezése. Papíron ezek technikai rendrakásnak tűnnek. Az üzemben azonban megváltoztathatják a jel kiadásának időpontját, a reteszelések feloldásának sorrendjét, a kapcsolatvesztés utáni reakciót vagy az alkalmazás viselkedését áramkimaradás után. Itt fordul át a refaktorálás kérdése a változtatások gyakorlati kockázatértékelésébe: nem az a lényeg, hogy a kód „jobb”-e, hanem az, hogy a módosítás után a gép, a sor vagy az állomás továbbra is kiszámíthatóan viselkedik-e normál, zavart és újraindítás utáni állapotokban.
A döntés érettségének jó próbája annak ellenőrzése, hogy a csapat képes-e meghúzni a határt az alkalmazás belső szerkezetének módosítása és a folyamat vagy a biztonság szempontjából lényeges funkció megváltoztatása között. Ha ez a határ nem írható le a jelek, állapotok és átmeneti feltételek szintjén, akkor a projekt a kivitelező minőségétől függetlenül kockázattal terhelt. Ipari környezetben különösen érzékenyek azok a helyzetek, amikor az alkalmazás részt vesz az indítás, leállítás, hibatörlés, riasztás-visszaigazolás folyamatában, vagy együttműködik az energialeválasztó rendszerekkel és a reteszelésekkel. Ilyenkor már nemcsak a szoftverarchitektúráról van szó, hanem a váratlan beindulás elleni védelemről is, valamint arról, hogy az elemzés kiterjed-e az elektromos berendezésre, a vezérlési logikára és a berendezések közötti függőségekre is. Pontosan itt szűnik meg a látszólag helyi refaktorálás informatikai feladat lenni, és válik teljes döntési fegyelmet igénylő műszaki változtatássá.
A normatív követelményekre való hivatkozásnak csak ezen a ponton van jelentősége, mert a szabványok nem helyettesítik a tervezési döntést, viszont rendezik annak kereteit. Ha a változtatás hatással lehet az indítás, leállítás, a zavar utáni működés helyreállításának feltételeire vagy a védőintézkedésekre, akkor azt kockázatváltozásként kell értékelni, nem pedig egyszerű kódkarbantartásként. Ha a beavatkozás az energialeválasztással, a reteszelésekkel vagy a biztonságos hozzáférési sorrenddel együttműködő logikát érinti, akkor természetes módon megnyílik a váratlan beindulás elleni védelem követelményeinek területe is. Felelősségi szempontból ezért nem önmagában az a legfontosabb kérdés, hogy „érdemes-e refaktorálni”, hanem az, hogy a szervezet képes-e igazolni: ismeri a változtatás határait, rendelkezik a folyamat viselkedésén alapuló elfogadási kritériumokkal, és meg tudja különböztetni a rendszer rendbetételét attól a módosítástól, amely teljes kockázatértékelést az ISO 12100 szerint, valamint az installáció tervezésével és a helyszíni tesztekkel való összehangolást igényel.
Hol nő leggyakrabban a költség vagy a kockázat
Egy régi ipari alkalmazás refaktorálásánál a költségek legnagyobb növekedését ritkán maga a kód okozza. A probléma forrása többnyire a módosítás hibás minősítése: a csapat a program szerkezetének rendbetételeként kezeli, miközben valójában a rendszer időbeli viselkedése, a műveletek sorrendje vagy az állapotok közötti átmenet feltételei változnak meg. Gyártási környezetben egy ilyen tévedésnek közvetlen projektkövetkezménye van. Az ütemterv elszakad a tényleges terjedelemtől, a teszteket informatikai funkcionalitásra tervezik, nem pedig a folyamat lefutására, és az eredményért viselt felelősség szétterül a karbantartás, az automatizálás és a szoftverszállító között. A gyakorlati kritérium itt egyszerű: ha a módosítás után újra meg kell erősíteni az indítási, leállítási, zavar utáni újraindítási sorrendet vagy a védelmi áramkörök jeleire adott reakciót, akkor ez szervezeti értelemben már nem „biztonságos refaktorálás”, hanem olyan változtatás, amely kockázatot jelenthet a termelésre nézve, és más jóváhagyási rendet igényelhet.
A költségnövekedés másik tipikus területe az a tervezési döntés, amely a függőségek teljes képe nélkül születik meg. A régi ipari alkalmazások gyakran összefonódnak a vezérlő konfigurációjával, a végrehajtó elemekkel, a vizualizációval, az adatarchiválással és a kezelői eljárásokkal. A dokumentációban ez egyetlen rendszernek látszik, a gyakorlatban azonban olyan rétegekről van szó, amelyeket különböző csapatok évek alatt fejlesztettek. Egy refaktorálás, amelynek célja a kód olvashatóságának javítása vagy a későbbi fenntartás megkönnyítése, észrevétlenül megváltoztathatja a késleltetések jelentését, a reteszelési feltételeket, az újraindítás utáni alapértelmezett értékeket vagy a kommunikációs hiba kezelésének módját. Ennek következménye nemcsak egy műszaki javítás, hanem az állásidő költsége, a helyszíni többletpróbák és az arról szóló viták is, hogy a hiba korábban is fennállt-e, vagy a módosítás vezette be. Ezért a döntés előtt nem magának a módosításnak a méretét érdemes felmérni, hanem a kapcsolódási pontok számát és kritikusságát: hány jel, receptúra, üzemmód és üzemeltetési kerülőmegoldás függ az átépítésre kijelölt kódrésztől. Minél több ilyen pont van, annál kevésbé indokolt a „mellékesen” elvégzett refaktorálás egy másik feladat részeként.
A gyakorlatban különösen költségesek azok a projektek, amelyeknél a csapat csak az üzembe helyezés során tárja fel a valós követelményeket. Tipikus példa egy szekvenciamodul átépítése, amely a leírás szerint „ugyanazt csinálja, csak tisztábban”. A bevezetés után azonban kiderül, hogy az előző verzió dokumentálatlan viselkedéseket tartalmazott, amelyek a berendezés tökéletlenségeit kompenzálták: rövid jeltartást, késve érkező érzékelő tolerálását, a riasztás nyugtázásának sajátos sorrendjét vagy egy olyan feltételt, amelytől a szervizhozzáférés lehetősége függött. A kódban ez hibának vagy technikai adósságnak tűnt, a folyamat szempontjából viszont a stabilizálás része volt. Ha a refaktorálás ezeket a mechanizmusokat a funkciójuk feltárása nélkül távolítja el, a költség azonnal jelentkezik: nő az üzembe helyezés utáni beavatkozások száma, meghosszabbodik az átvétel ideje, és a logikát az üzem működése közben, nyomás alatt kell visszaépíteni. Ezért a refaktorálás értelmét abból a szempontból is meg kell ítélni, hogy mennyire lehetséges a jelenlegi rendszer viselkedésének rekonstruálása. Ha a szervezet nem rendelkezik eseménynaplóval, megbízható üzemmódleírásokkal és a valós folyamatra épülő tesztforgatókönyvekkel, akkor először az értékelés alapját kell megteremteni, és csak utána szabad dönteni az átépítésről.
Ez a kérdéskör közvetlenül átvezet a módosítások gyakorlati kockázatértékeléséhez akkor, amikor a változtatás védelmi funkciókat, a biztonságos hozzáférés szekvenciáit, a végrehajtó elemek mozgásának vezérlését vagy a berendezés viselkedését érinti tápfeszültség-kimaradás és visszatérés után. Ilyen terjedelemnél a hiba költsége nem korlátozódik a programozási javításokra, mert felmerül a változtatás üzembe engedéséért viselt felelősség kérdése is. Ha az alkalmazás hidraulikus, pneumatikus rendszerekkel vagy olyan megoldásokkal működik együtt, mint a kétkezes vezérlés, akkor a refaktorálás és a műszaki módosítás közötti határ még szűkebbé válik, és ellenőrizni kell, hogy a védelmi intézkedések tervezési alapfeltevései nem sérültek-e. Csak ezen a ponton indokolt a rendezett kockázatértékelési módszerekre hivatkozni, beleértve az ISO/TR 14121-2 alapján a gyakorlatban alkalmazott megközelítést, hidraulikus rendszereknél pedig a MSZ EN ISO 4413 által rendszerezett tervezési követelményeket is. Nem öncélú formalizmusról van szó, hanem egy egyszerű döntési szabályról: ha a módosítás hatással lehet a folyamat vagy a kezelés biztonságára, akkor a költségét a validálással, a helyszíni tesztekkel és a felelősségi renddel együtt kell számolni, nem kizárólag a programozó munkaidejével.
Hogyan közelítsük meg a témát a gyakorlatban
A gyakorlatban egy régi ipari alkalmazás refaktorálásának értelmét nem a technológiai változás vonzereje alapján ítélik meg, hanem aszerint, hogy egyszerre csökkenthető-e az üzemeltetési kockázat, és kézben tartható-e a bevezetés. A menedzser és a terméktulajdonos számára ez egyszerű nézőpontváltást jelent: nem az a kérdés, hogy „érdemes-e rendbe tenni” a kódot, hanem az, hogy az alkalmazás jelenlegi állapota ténylegesen nehezíti-e a karbantartást, a tesztelést, a hibák elhárítását vagy a további módosítások követelményeknek megfelelő bevezetését. Ha a válasz igen, akkor a refaktorálás indokolt, de csak olyan mértékben, amely leválasztható a termelés működéséről, és mérhető hatások alapján elszámolható. Jó döntési szempont ilyenkor két költség összevetése: az alkalmazás jelenlegi állapotban hagyásának költsége — beleértve az állásidőt, a diagnosztikai időt, az egyes kulcsemberektől való függést és a hibás módosítás kockázatát —, valamint az ellenőrzött átalakítás költsége a tesztekkel, validálással és üzembe helyezéssel együtt. Ilyen összehasonlítás nélkül a projekt rendszerint kicsúszik az irányítás alól, mert a csapat a kód rendbetételét a funkcionalitásra szánt költségkeretből finanszírozza, miközben a helyszíni következményekért viselt felelősség tisztázatlan marad.
Ezért az első döntésnek nem annak kell lennie, hogy „újraírjuk” vagy „meghagyjuk”, hanem annak, hogy hol húzzuk meg a változtatás határát. Érett megközelítésben különválasztják azt a részt, amely kizárólag a szoftver szerkezetét érinti, attól a résztől, amely hatással van a folyamatlogikára, az indítási és leállítási szekvenciákra, az üzemmódokra, a hajtásokkal való kommunikációra és a rendszer viselkedésére tápellátási zavar után. Ennek a megkülönböztetésnek közvetlen költség- és szervezési következménye van. A kizárólag a kód rendezésére korlátozódó változtatás rövidebb ciklusban és a karbantartási szervezet kisebb bevonásával is végrehajtható. Az a változtatás viszont, amely a gép vagy a sor viselkedését érinti, már helyszíni teszttervet, szervizablakot, visszaállítási eljárást és annak egyértelmű meghatározását igényli, hogy ki hagyja jóvá az üzembe adást. Érdemes nemcsak a fejlesztési munkák idejét mérni, hanem a rendszer sikertelen próbálkozás utáni helyreállításának idejét, a regressziós tesztekkel lefedett területek számát és az indítás utáni eltérés diagnosztizálásához szükséges időt is. Ezek azok a mutatók, amelyek megmutatják, hogy a refaktorálás valóban csökkenti-e a projekt kockázatát, és nem csupán a fejlesztőcsapat munkakomfortját javítja.
Gyakorlati példa erre a régebbi vezérlőalkalmazásoknál tipikus helyzet: a kód többszörösen ismétlődő részeket tartalmaz, amelyek a mozgásletiltásokért, a riasztáskezelésért és a kézi, illetve automata üzemmód közötti váltásokért felelnek. A csapat egységesíteni szeretné ezeket, mert a jelenlegi felépítés nehezíti a továbbfejlesztést, és eltéréseket okoz az egyes állomások között. Egy ilyen döntés csak akkor indokolt, ha előzetesen ellenőrzik, hogy az egységesítés nem változtatja-e meg azokat a feltételeket, amelyek mellett a végrehajtó elem mozgási engedélyt kap, továbbá hogy a vezérlő újraindítása után nem jelenik-e meg más állapot-visszaállítási szekvencia. Ha az alkalmazás szelepeket, hajtásokat vagy tárolt energiával működő rendszereket is vezérel, akkor még a látszólag „belső” refaktorálás is átkerülhet a változások kockázatértékelésének ISO 12100 szerinti körébe, és szükségessé teheti a váratlan beindulás elleni védelem elemzését. Ilyen esetben ésszerű gyakorlat a refaktorálás szakaszos végrehajtása: először a viselkedés reprodukálása tesztkörnyezetben, majd a modulok leválasztása a logika módosítása nélkül, ezt követően pedig a helyszíni ellenőrzés előkészített visszaállítási forgatókönyvvel. Ez korlátozza az üzemeltetési felelősséget, és lehetővé teszi a bevezetés megszakítását, mielőtt a probléma a termelésre is kihatna.
Csak ezen a ponton van szükség normatív hivatkozásra, mert a szabványok nem helyettesítik a műszaki döntést, viszont rendszerezik azt a pillanatot, amikor a változtatás már nem pusztán programozási munka. Ha a refaktorálás hatással van a védőintézkedésekre, a biztonságos hozzáférés feltételeire, az energia leválasztására vagy a rendszerek leállítás és újraindítás utáni viselkedésére, akkor természetes módon a változások gyakorlati kockázatértékelésének körébe kerül, rendezett módon, akár az ISO/TR 14121-2-ből ismert megközelítés alkalmazásával is. Amikor felmerül a váratlan beindulás kockázata, már nemcsak magát a kódot kell ellenőrizni, hanem az energia leválasztásának és visszaállításának logikáját is, ami közvetlenül az ISO 14118-hoz kapcsolódó kérdésekhez vezet. Ha pedig az alkalmazás hidraulikához vagy pneumatikához kapcsolódik, az értékelés nem hagyhatja figyelmen kívül e rendszerek tervezési alapfeltevéseit, mert egy hibás vezérlési szekvencia a program önmagában vett helyességétől függetlenül is sértheti azok biztonságos működését; ilyenkor indokolt lehet a hidraulikus rendszerek tervezését rendező követelményekhez is nyúlni. A gyakorlatban ez egyet jelent: a refaktorálás terjedelmét nem a megoldás eleganciája határozza meg, hanem a változtatás utáni biztonságos berendezésviselkedésért viselt felelősség határa.
Mire kell figyelni a bevezetés során
Egy régi ipari alkalmazás refaktorálásának bevezetése az a pont, ahol még a helyes architekturális döntés is üzemeltetési problémává válhat. Az egész vállalkozás értelme ott ér véget, ahol a változtatás javítja ugyan a kódot, de rontja a berendezés működésének kiszámíthatóságát, vagy a csapat felelősségét azon túl terjeszti ki, amit előzetesen feltártak és jóváhagytak. A leggyakoribb hiba az, hogy a bevezetést egyszerű új verzió kiadásaként kezelik. Termelési környezetben nemcsak az számít, hogy az alkalmazás működik-e, hanem az is, hogy a változtatás után minden átmeneti állapot azonos módon viselkedik-e: indítás áramszünet után, kommunikáció újraindulása, receptek visszatöltése, riasztások, reteszelések és kézi üzemmódok kezelése. A gyakorlati kritérium egyszerű: ha a csapat nem tudja egyértelműen leírni, mely viselkedéseknek kell változatlanul megmaradniuk a bevezetés után, az azt jelenti, hogy még nem adottak a biztonságos indítás feltételei.
A bevezetésről szóló döntés szakaszában külön kell választani a műszakilag visszafordítható módosítást attól a változtatástól, amely az élesítés után új alapállapotot hoz létre, és megnehezíti a visszaállást. Ennek közvetlen hatása van a költségekre és az ütemezésre. Az a refaktorálás, amely a vezérlők, a vizualizáció, az adatszerver és a felsőbb szintű rendszerekhez kapcsolódó interfészek egyidejű frissítését igényli, már nem tekinthető egyetlen fejlesztési feladatnak; összehangolt termelési változtatássá válik, több lehetséges hibaponttal. Ezért a bevezetés előtt érdemes olyan elfogadási kritériumot alkalmazni, amely nem a „a tesztek sikeresen lefutottak” kijelentésen alapul, hanem azon, hogy a változtatás ellenőrzött módon, a folyamat számára elfogadható időn belül visszavonható-e. Ha nincs megbízható visszaállítási eljárás, akkor arra sincs alap, hogy a kockázatot kézben tartottnak tekintsük. A gyakorlatban célszerű nem az absztrakt „bevezetési minőséget” mérni, hanem olyan mutatókat, mint az előző verzió visszaállításának ideje, a változtatástól függő interfészek száma, valamint azoknak a funkcióknak a száma, amelyek helyes működése a telepített rendszeren a termelésbe való beavatkozás nélkül igazolható.
Jó példa erre az a helyzet, amikor a refaktorálás rendezettebbé teszi a kivételkezelést és a hibaüzenetek kezelését, ugyanakkor megváltoztatja az inicializálás sorrendjét a rendszer újraindítása után. A tesztállomáson minden megfelelőnek tűnik, mert az eszközök azonnal elérhetők, és a folyamat nem terhelés alatt működik. Az üzemben azonban ugyanaz a kód a szekvenciát a korábbitól eltérő pillanatban indíthatja el, ami a hajtásokkal való szinkron elvesztéséhez, a készültségi jelek hibás értelmezéséhez vagy egy anyagtétel köztes állapotban történő megakadásához vezethet. Egy ilyen esemény műszaki értelemben nem feltétlenül jelent meghibásodást, de állásidő-, selejt-, újraindítási költséget és többletfelelősséget eredményez a munka folytatásáról szóló döntés miatt. Éppen itt fordul át a refaktorálás kérdése a változtatások gyakorlati kockázatértékelésébe: nem akkor, amikor a változtatás nagy, hanem akkor, amikor a következményei már nem korlátozhatók a szoftverrétegre.
A felelősségi határ még egyértelműbbé válik ott, ahol az alkalmazás a védelmi funkciókat, a mozgásengedélyezési logikát, a tehermentesítési szekvenciákat, valamint a leállítást és a zavar utáni újraindítást befolyásolja. Ilyen esetben már nem elegendő a kódverziók összehasonlítása vagy az integrátor által elvégzett funkcionális teszt. Rendszerezett értékelésre van szükség annak megállapítására, hogy a változtatás módosítja-e a kockázati szintet, és nem sérti-e a gép vagy berendezés biztonságos működésére vonatkozó alapfeltevéseket. Ez természetes belépési pont a ISO 12100 szerinti kockázatértékelés és a változtatások kockázatának értékelésében alkalmazott gyakorlatok területére, összetettebb esetekben pedig hasznos lehet az ISO/TR 14121-2-ből ismert módszeres megközelítés. Ha az alkalmazás hidraulikus vagy pneumatikus rendszereket vezérel, külön azt is ellenőrizni kell, hogy az új logika nem változtatja-e meg az energia biztonságos vezérlésének feltételeit és a mozgások sorrendjét; ilyenkor nemcsak maga a program helyessége számít, hanem az adott rendszerekre vonatkozó tervezési követelmények is. A projektcsapat számára ez egy dolgot jelent: a bevezetés csak akkor tekinthető előkészítettnek, ha a műszaki, üzemeltetési és megfelelőségi felelősségi köröket még az indítás előtt egyértelműen meghatározták, nem pedig csak az első incidens után.
Egy régi ipari alkalmazás refaktorálása – mikor érdemes belevágni, és hogyan végezhető el a termelés kockáztatása nélkül?
Akkor van értelme, amikor a kisebb módosítások bevezetésének költsége és bizonytalansága gyorsabban nő, mint azok üzleti értéke. Ez annak a jele, hogy a technológiai adósság már hatással van a termelés folyamatosságára és a működési költségekre.
Ha a módosítás hatással van a jelekre, állapotokra, átmeneti feltételekre, illetve az indítási, leállítási és újraindítási sorrendre. Ilyenkor ez már nem pusztán architektúrai kérdés, hanem kockázatértékelést igénylő műszaki módosítás.
Leggyakrabban ott, ahol a rendszer viselkedése időben változik: a feladatok ütemezése, a műveletek sorrendje, a pufferelési logika, valamint a kapcsolat megszakadása vagy az áramellátás kiesése utáni reakciók esetén. Ilyenkor már egy kisebb beavatkozás is megváltoztathatja a gép vagy a gyártósor működésének kiszámíthatóságát.
Egyértelműen meg kell húzni a határt az alkalmazás szerkezetének módosítása és a folyamat vagy a biztonság szempontjából lényeges funkció megváltoztatása között. Az elfogadási kritériumoknak a folyamat viselkedésén kell alapulniuk, a teszteknek pedig ki kell terjedniük a normál, a rendellenes és az újraindítási állapotokra is.
Ha a beavatkozás az indítással, leállítással, hiba-visszaállítással, reteszelésekkel, energiaellátás megszakításával vagy a biztonságos hozzáféréssel kapcsolatos logikát érinti. Ilyen esetekben a módosítást kockázatváltozásként kell kezelni, nem pedig a kód szokásos karbantartásaként.