Интервю с Георги Георгиев: "Със С++ ще си изградите солидна представа за функционирането и на други езици и технологии"
Предимствата от ученето на C++
Огромният принос на C++ към развитието на ИТ индустрията, и особено на определени нейни ниши, го е направил един от най-известните езици за програмиране. Многоплатформен, бърз, един от езиците утвърдил обектно-ориентираното програмиране, с мощен набор от инструменти за работа както на ниско, така и на високо ниво – от управление на индивидуалните единици памет, през ползване на вградени структури данни, алгоритми и обекти, до възможности за функционално програмиране и template metaprogramming – C++ е водещ език в среди, където ефикасността, предвидимостта и стабилността на софтуера са ключови. Игри, 3D графика и физични симулации, операционни системи, driver-и, софтуер за редакция на мултимедия, програмиране за embedded устройства, дори и messaging apps като Telegram ползват C++, заради възможностите и философията му за предоставяне на максимален контрол на програмиста над езика. Но причините за изучаването на този език, станал почти синоним на програмиране в някои среди, не приключват с приложимостта му.
Кога научи C++, как си го ползвал, и какво ценно имаш в опита си за споделяне?
Началото на моето запознаване със C++ е доста клиширано – като бях малък исках да пиша игри, и когато в гимназията ми се отвори възможност да уча програмиране, се възползвах. В училищата в България масово се учи C++, съответно така започнах и аз. Имах интерес и много мотивация – а мотивация трябва в значими количества като учиш C++ – и почнах да си пиша неща вкъщи. Започнах с елементарни игри – едно от първите ми творения беше морски шах в конзолата. Ходих на състезания по алгоритми, но по-сериозните ми постижения започнаха, когато с един приятел решихме да пишем проекти свързани с 3D графика и да ги презентираме по състезания… бяхме 10-11 клас. Определено се хвърлихме в дълбокото, но това ми даде възможност да се сблъскам както със силните, така и с трудните страни на C++ и ми помогна да осмисля и открия сам много от нещата, които ги пише по „дебелите книги“ за програмирането като цяло и за ефикасното ползване C++. Допусках много грешки, но в последствие се учих от тях. За пример – първият ни голям проект, с който почнахме да печелим състезания, беше софтуер за 3D моделиране (от типа на 3D Studio Max, Blender, Google SketchUp и т.н.), който имаше 16 хиляди реда код… в ЕДИН файл! Неоспоримо голяма глупост, но ме научи как да управлявам големи бази код, как да кръщавам променливи и функции така че да ги намирам лесно (средата за разработка, която ползвах, беше една идея по-напреднала от notepad), и разбира се ме научи, че кодът трябва да бъде разделян. Тук се изразиха и първите ми сериозни сблъсъци с езика – проблеми като как да заделям и освобождавам паметта, четенето на информация байт по байт и т.н., но предимствата бяха доста повече. BuilderZ – така се казваше проекта – работеше доста бързо, въпреки липсата на оптимизации от моя страна. Общо взето бързината на езика компенсира за липсата ми на умения за писане на ефикасен код. Няколко години по-късно видях подобен софтуер от съученици, писан на C#, който работеше значително по-бавно от нашия софтуер, въпреки че беше 2D, а нашият беше 3D.
Следващия ни голям проект беше DriveFreeZ, симулатор за шофиране, който комбинираше 3D графика, физична симулация, както и тривиална механична симулация. Там възможностите на C++ наистина си проличаха – ефикасен трансфер на данни и команди към видеокартата, синхронизирани с изчисления на позиции и сили през физичната библиотека Bullet, всичко това опаковано в рамка от класове и удобно ползвано през обекти, на които беше лесно с по 1-2 реда код да им бъде казано да се движат, спират, променят посоки, сблъскват и прочие.
След тези (и други по-малки) проекти и няколко награди по състезания, започнах да водя лекции – както за C++ и 3D графика, така и за други езици и технологии, което още повече ми изгради опита и ми позволи да оценя силните и слабите страни на C++, но факта че започнах от този език много ми помогна да разбера не само как да ползвам други езици, а как тези езици функционират „под капака“.
В момента работя за VirtualRacingSchool.com, където анализираме телеметрия от racing sims (например iRacing), и там софтуерът, който ползваме за извличане на данните от RAM паметта и пращане към сървърите ни, е изцяло написан на C++.
Защо да учим C++?
Освен очевидните неща, които езика дава – бързодействие, ООП и точен контрол над изпълнението на програмата – смятам, че изучаването на C++ дава предимства, дори и в последствие да не пишете на C++. Както споменахме по-горе, езикът е многоплатформен (можете да програмирате за всякакви операционни системи и устройства) и ви дава възможност да работите както на „ниско“ ниво (достъп до индивидуални байтове памет, указатели, точно подреждане в структурата на паметта, контрол над заделянето и освобождаването на памет), така и на „високо“ ниво (класове, обекти, функционални обекти, шаблони и метапрограмиране), и също така създателите му са избрали философията да оставят програмиста да прави това, което иска, вместо да го предпазват от грешки.
Има две значителни последствия от това. Първото, сравнително очевидно, е че не сте ограничени в определен стил на програмиране, и че можете ефикасно да разработите практически всякакъв софтуер – от игра, през социална мрежа, до софтуер в self-driving автомобил. Второто последствие е, както се казва в клишето, „С голямата мощ идва голяма отговорност“ – за да работите добре с всичките инструменти, които C++ предоставя, трябва да го учите съвестно. C++ не е език, който предпазва програмиста от грешки, и рядко прощава ако го ползвате без да разбирате добре точно как работи. Това означава, че докато учите C++ няма просто да учите как да го ползвате, а как работи езикът, и донякъде как работи хардуерът под него. Така ще си улесните изучаването на други езици и технологии, защото ще си изградите солидна представа за функционирането им и дисциплина да ги изучавате в тяхната цялост, а не само как да ги ползвате в ограничени ситуации.
Подходящ ли е C++ за начинаещи?
Краткият отговор е: зависи от това дали искате да станете добри програмисти. Дългият отговор е, ами, по-дълъг.
Заради гореспоменатите неща C++ е мощен и малко по-труден за изучаване език. В него има повече детайли за запомняне, но и повече инструменти от по-новите езици от неговото семейство (например Java, C#). Има повече възможности да сгрешите и грешките са по-опасни от други езици, но това ви обучава да сте дисциплинирани и внимателни, както и да мислите за основата на технологията, с която работите. Напълно възможно е да сте начинаещ и да започнете със C++, като това като цяло ще ви даде повече познания, отколкото с други езици, но ще бъде малко по-трудно и малко по-натоварващо.
Не казвам, че не можете да станете добри програмисти започвайки с друг език. Казвам, че ако се научите да програмирате добре със C++, тогава почти със сигурност ще станете добри програмисти и изучаването на други езици ще ви е сравнително лесно.
Съвременен език за програмиране ли е C++?
Категорично да. Силно застъпен е в ИТ индустрията, и то на много важни места – има не малко позиции за C++ разработчици. Самият език бива развиван и разширяван, като последните няколко итерации бяха C++11, C++14 и C++17 – съответно финализирани през 2011, 2014 и 2017 – и осъвремениха езика до степен, в която изразителността му доближава езици като C# и Java. Синтаксисът му все още е малко по-тежък от техните, но не значително и всички стандартни неща в програмирането са лесни за описване на C++ - ако го разбирате и познавате добре.
На какво ниво ще изучаваме C++ в курса C++ Fundamentals в SoftUni?
Програмата на курса е на „средно“ ниво – ще учим как да ползваме C++ като съвременен език за програмиране, като ще опознаем как да изпълняваме стандартни задачи в програмирането и как да използваме широко-разпространени структури данни и алгоритми. Заедно с това ще обърнем доста внимание на потенциални грешки в ползването на C++ и как да ги избягваме, ще видим някои от нещата достъпни през „ниското ниво“ на работа със C++ - как се пазят поредици от данни в паметта и как да ги ползваме ефикасно – и също така ще се докоснем до „високото ниво“ – работа с класове и STL. Но основното ни внимание ще е върху това как да пишем работещ, разбираем, и лесен за модификация код ползвайки функции, линейни структури данни, асоциативни контейнери и други стандартни инструменти в репертоара на C++.
Омръзна ми да чета, нещо за финал?
C++ е език, който е не само мощен във възможностите си, но и в начинът на мислене и разбиране, който ученето му налага в програмистите работещи с него. Ако обичате аналогиите, C++ в ИТ индустрията е като състезателните автомобили – бърз, проектиран за да може да бъде извлечена всяка капка функционалност и скорост от него, ако сте добър състезател, и използваем както в интензивни ситуации, така и за по-стандартни цели. Факт е, че е по-труден за овладяване от други, по-„стандартни“ езици, и че грешките с него могат да бъдат по-опасни, но за сметка на това тези, които могат да го ползват добре са ценени професионалисти, както като C++ разработчици, така и на други позиции. Очаквам ви в курса "C++ Fundamentals - май 2018".