should_authorize_via_email
email.input_code tel.input_code
 
email.code_actual_for tel.code_actual_for
apply_exit_text
session_ended
to_homepage
Vít Štěpánek: Proč je C++ stále klíčové v moderním softwarovém vývoji?

Vít Štěpánek: Proč je C++ stále klíčové v moderním softwarovém vývoji?

Rozhovor se seniorním C++ vývojářem a architektem s více než 20 lety zkušeností v oboru.

C++ je programovací jazyk, který i po desetiletích zůstává nepostradatelný v mnoha oblastech vývoje, ať už jde o systémy pro obchodování s vysokou frekvencí (high-frequency trading), IoT nebo komplexní backendové aplikace. V tomto rozhovoru se zaměříme na to, proč je C++ pro mnoho vývojářů volbou číslo jedna a jak se vyvíjí v kontextu moderních technologií.

Vít Štěpánek, seniorní C++ vývojář a lektor našeho kurzu Vývoj aplikací v C++ nám přiblíží nejen své zkušenosti z práce pro mezinárodní banky, ale taky se podělí o postřehy z vývoje IoT systémů a navrhování softwarových architektur. Víc o jeho pohledu na C++ a o výzvách, kterým programátoři dnes čelí, se dozvíš v následujícím rozhovoru.

Co tě přivedlo k programování a proč sis vybral právě C++?

Praxe. Potřeboval jsem – tehdy při práci s měřicími CNC stroji – automatizovat části procesů, vyhodnocovat nebo filtrovat výsledky atd. C++ si vlastně vybralo mě, protože firma, pro kterou jsem pracoval, to ode mě vyžadovala. Tak jsem se ho naučil. 

Jak držíš krok s aktuálními trendy a novinkami v C++ a softwarovém inženýrství?

Většinou skrz praktické využití – kdykoliv hledám řešení pro nějaký problém, jeden z nejhodnotnějších faktorů výběru je pro mě trvalost. Nástroje, které byly přidány do standardu, jsou vždy lepší volbou než nestandardní řešení. 

Většina nových vlastností C++ (včetně nových součástí std knihovny) byla přidána právě proto, že úspěšně řeší existující problém, a většinou takový, se kterým se potkává většina. 

Které klíčové koncepty C++ jsou pro začátečníky v programování nejdůležitější?

Deterministický lifetime dat. Že programátor definuje nejen, kdy data vznikají, ale i kdy končí (a jak). Zapadá to do celkového konceptu C++, tedy nedělat nikdy nic víc, než je nezbytně nutné. Neusilovat o pohodlí, ale efektivitu – a ta občas stojí nějaké úsilí navíc. Odměnou je program, který je rychlý, jak chceme, robustní, jak chceme, nebo minimalistický – pokud ho tak chceme. 

Dalším klíčovým konceptem, který má značný podíl na tom, čím C++ je, je compile-time programming, který představuje naprosto nedílnou část a stavební kámen moderního C++ a vychází z ideje, že čím víc práce delegujeme na čas kompilace, tím míň instrukcí potřebujeme v runtime čase. A hlavně – funguje to.

Proč je důležitá manuální správa paměti v C++ a jak to vysvětluješ?

Pro deterministické chování programu je to naprostá nezbytnost. Nekončí to ale pamětí, která je jen jeden ze systémových zdrojů, kterých je vždy omezené množství. Neplýtvat zdroji na jednom místě většinou znamená, že nebudou chybět jinde. Vyhneme se tak zásadním problémům v samém začátku. 

U systémů, kde je pak množství zdrojů (především paměti) velice omezené, je to pak právě toto, díky čemuž může program běžet korektně, a naopak u těch bohatých na zdroje je můžeme využít naplno. 

Jaké jsou podle tebe největší výhody C++ oproti jiným programovacím jazykům, se kterými jsi pracoval?

Za jednu z největších výhod považuju to, že díky rozsáhlé škále vlastností a nástrojů jazyka jde vytvořit velice konkrétní a čistý interface. A výhoda používání takového interfacu je, že zřídka musí být doprovázen rozsáhlým popisem, jak ho použít. 

To ovšem vyžaduje ze strany programátorů kázeň a „seniorní“ přístup k práci. Ne každý je toho schopný (spíš morálně než intelektuálně) a pak spíš přejde do řad některého z „managed“ jazyků, které na ně nekladou takové nároky.

A taky se můžeš posmívat ostatním programátorům, kteří „programujou“, zatímco ty programuješ (haha, vtip).

Co považuješ za největší mýty nebo nedorozumění o C++, se kterými se setkáváš u začínajících programátorů?

Největší mýtus – aspoň hojně rozšířený – je, že „managed“ jazyky jednou předeženou efektivitou „staré“ jazyky, jako je C++, že je to jen otázka času a vývoje. 

Už z principu to nejde – počtem instrukcí bude kompilovaný jazyk vždy skromnější. 

Další mýtus je (z opačné strany), že cokoliv psané v C++ musí být „rychlejší“. Ale pokud pohnojíš komplexitu, žádná optimalizace tě nezachrání. 

V každém jazyce platí, že musíš chápat, co výsledek tvojí práce dělá. V C++ to obnáší velký rozdíl. 

Jaké jsou podle tebe klíčové dovednosti nebo vlastnosti, které by měl mít úspěšný C++ vývojář v dnešním technologickém prostředí?

Musí chápat a hlavně chtít chápat, „co se děje, když…“. Chce to mít určitý přístup k práci, takový, že mi nestačí, že projde pár testů, ale že chci, abych vytvářel čistý design, aby algoritmy neměly zbytečně velkou komplexitu, aby byl kód čitelný, neduplikoval se… 

Aby sis pak mohl sám odpovědět „a proto to dělám v C++“. 

Můžeš popsat, jaké typy aplikací se dnes nejčastěji vyvíjejí v C++ a proč je C++ pro ně vhodným jazykem?

C++ má pevné místo tam, kde je třeba efektivně pracovat se zdroji, časem nebo množstvím dat. 

Back-endové systémy na zpracovávání velkých množství dat (v krátkém čase) půjde vytvořit v dostatečně efektivní formě poměrně rychle a bez zdlouhavých optimalizací. Nástroje k paralelizaci processingu jsou přímo v základním jazyce (a stále přibývají nové). 

Low latency systémy prakticky nelze psát v jazyce, který nemá manuální správu zdrojů – C++ se pro ně tedy hojně používá (a nadále bude). 

Kde jsme blízko hardwaru (IoT, embedded systémy), tam se uplatní low-level vlastnosti C++, ale díky rozsáhlé high-level paletě C++ můžeme udělat i potřebný zbytek funkcionality, jako persistence, messaging nebo networking v jednom jazyce. 

Jaké jsou nejčastější chyby nebo úskalí, na které narazí programátoři přecházející na C++, a jak se jim dá podle tebe předejít?

Hlavní úskalí je tzv. „blok“, kdy programátor nedokáže sám vyřešit problém, se kterým se potýká (kvůli nedokonalé znalosti jazyka). Kvůli poměrně vysoké složitosti C++ se to může stát snadno a rychle. 

Pokud se programátor „neodblokuje“, ztratí motivaci se nadále jazyk učit a frustrovaně zvolí jinou alternativu. 

Řešení je učit se ve spojení se zkušenějším C++ vývojářem, který mu pomůže většinou banální problém vysvětlit a vyřešit. V dnešním světě stackoverflow je život snazší, ale přesto je individualistický přístup nedocenitelný.

Jaký význam má podle tebe porozumění nízkoúrovňovým aspektům programování, jako je správa paměti, pro programátory v dnešní době?

Ten význam byl a je stále stejný. Dává nám nahlédnout do způsobu, jakým s našimi instrukcemi systém nakládá, co musí udělat když. To pod pokličkou je na programovacím jazyku nezávislé, a proto platné pro úplně všechny programátory. Znalost toho, co se děje na systémové úrovni, umožňuje dělat správná rozhodnutí na programátorské úrovni. 

Jak vnímáš budoucnost C++ v kontextu rychlého vývoje technologií a rostoucí popularity jiných programovacích jazyků?

Budoucnost C++ je psaná seříznutým perem – každé 3 roky vychází nový standard, který dále modernizuje toolset, který máme k dispozici. 

Popularita jazyků roste a klesá, ale přiznejme si – C++ byl předpovídán zánik již dávno, kdy se ho pokoušely nahradit nové projekty typu Java a C#. Dnes se mluví o Rustu jako možné náhradě. 

C++ už nikdy nebude mainstreamovým jazykem, což je asi dobře (nikdo nechce webovku psanou v C++). Ze specializovaných oblastí ho ale vytlačit půjde jen těžko. 

Jaké jsou tvoje zkušenosti s optimalizací kódu na rychlost nebo velikost, a proč je to důležité pro určité typy projektů?

Většina kódu nevyžaduje žádnou optimalizaci. Postačuje správně volená komplexita algoritmů, což je nejčastější bod plýtvání CPU časem. 

Teprve analýza „critical path“ (části kódu, na kterou jsou kladeny největší nároky na performance) může vyústit v další optimalizaci na úrovni kódu. Bez profilování, benchmarkingu a praktické znalosti používání aplikace je to ale střílení naslepo. 

Pohled na „performance“ požadavky se radikálně liší projekt od projektu (při zpracovávání milionů zpráv může být požadavek i v minutách na celou dávku, jinde je milisekunda na zpracování zprávy moc dlouhá). Jde o ten okamžik, kdy jediný způsob, jak pokročit v efektivitě, je použít jiný jazyk. U C++ tento okamžik nastane nejmíň pravděpodobně. 

Jaké jsou podle tebe nejdůležitější změny v nových standardech C++ a jak ovlivňují vývoj aplikací?

Moderní C++ zaznamenalo hodně změn, které adresovaly nejvíc nenáviděné vlastnosti jazyka. Usnadnění psaní kódu je jedna z věcí, kterou ocenil snad každý. 

Zároveň C++ adoptovalo velké množství funkcionality z knihovny Boost, která po dlouhé roky fungovala jako alternativní standard (či spíš rozšíření standardu). 

A každé 3 roky přibývají další nástroje, díky kterým není nutné psát si je sám.

Můžeš sdílet příklad projektu, na kterém jsi pracoval v C++, který byl obzvláště náročný nebo zajímavý?

Nedávno jsme potřebovali vytvořit propojení mezi dvěma novými IoT protokoly a nad-protokolovým layerem, který využíval starší C knihovnu, s komunikací přes mqtt. Knihovna často blokovala vlákno na dlouhé vteřiny. Přitom zapojených zařízení, která komunikují v naprosto náhodném pořadí a intervalech, byly i tisíce. 

Bylo důležité, aby každé zařízení dokázalo komunikovat po své ose bez toho, aby jeho komunikace musela čekat na timeout jiného (timeout na komunikaci mají některá zařízení v desítkách milisekund). 

Design aplikace jsem tedy postavil na mnohovláknové architektuře s jedním a víc vlákny pro každou aktivitu a jednoduchým messagingem mezi vlákny. Výsledkem byl naprosto hladký průběh komunikace bez deadlocků. Na to všechno (kromě mqtt) stačily bohaté nástroje std knihovny C++. 

Jakou roli hraje C++ v oblastech jako je umělá inteligence, strojové učení nebo Internet věcí (IoT)?

Ve všech oblastech má C++ své specifické místo. Například v IoT lze použít spoustu jiných jazyků, které zabezpečí komunikaci se zařízeními a bude to „nějak“ fungovat. 

C++ má zde ale velkou výhodu, a to, že dokáže komunikovat přímo s nativními knihovnami, které jsou u hardwaru stále standardem, a to bez jakéhokoliv zpoždění způsobené bindingy. Také dokáže vygenerovat samostatnou binárku o limitované velikosti, kterou – pokud zařízení dodávám – je snadné instalovat na dodávaná zařízení bez nutnosti přebytečného balastu dependencí.

Více článků