Ինչպես Սովորել C++

«Ես վախենում եմ ոչ թե այն մրցակցից, որ 10,000 հնարք է փորձել մի անգամ,
այլ այն մրցակցից, որ 10,000 անգամ փորձել է նույն հնարքը» — Բրյուս Լի

C++ լեզվով ծրագրավորման գործնական գիտելիքներ ձեռք բերելու համար իմ խորհուրդն է ուսուցման կամ ինքնակրթության ծրագիրը կառուցել հետևյալ չորս առանցքային կետերի շուրջ.
  1. Տեսանյութեր. ժամանակակից ուսումն այլևս անհնար է պատկերացնել առանց առցանց տեսանյութերի — ինչու՞ չօգտվել ցանկացած թեմայով աշխարհի լավագույն համալսարաններից, ընկերություններից և անկախ կոնֆերանսների կողմից պարբերաբար հրապարակվող բազմաթիվ նյութերից: C++ի համար ես խորհուրդ եմ տալիս Յութուբյան ալիքների այս ցանկի C++ բաժինը: Որքանով հնարավոր է, նայելուց փորձարկեք ցուցադրված կոդի օրինակները:
  2. Գրքեր. կարդացեք անձամբ ձեզ դուր եկած ցանկացած գիրք (շատ լավ, դասակարգված և թարմ պահվող ցուցակ կա այստեղ և այստեղ) և դրա մեջ եղած կոդի օրինակները փորձեք: Լավ կլինի օրինակները լինեն փոքր (ոչ 2-3 էջ շարունակական կոդով), որոնց նպատակն է առանձնացնել ու ընդգծել կարևոր սկզբունքները: 
  3. Ալգորիթմեր. փորձեք հերթով իրականացնել հիմնարար, ամենից հաճախ հանդիպող ու օգտագործվող ալգորիթմերը: Շատ լավ շարք են կազմում ժամանակակից STL-ի ալգորիթմերը:
  4. Պրոյեկտ. մի քիչ մեծ պրոյեկտ ընտրեք, որի լուծումը մի 1-3 հազար տող պահանջի, իսկ խնդրի դրվածքը մոտ լինի իրական կյանքում հանդիպող տեսքին:
Այս կետերը ըստ էության շատ չեն տարբերվում այլ լեզուներով ծրագրավորում սովորելու պարագայում, պարզապես կարող է փոխվել համամասնությունը: Օրինակ, Web-ի  հետ կապված տեխնոլոգիաները սովորելու համար հավանաբար ճիշտ կլինի ավելի մեծ շեշտ դնել պրոյեկտի վրա, քան գրքերի: Իհարկե, անգամ այդ դեպքում ամեն ինչ կախված  է կոնկրետ նպատակից:

Ծրագրի Իրականացումը


Նկատեք, որ այս չորս կետերի ընդհանուր մասը կոդ գրելն է: Առանց շատ կոդ գրելու նույնիսկ լավագույն գրքերով, լեկցիաներով, մեծագույն ուշադրությամբ ու նվիրվածությամբ ծրագրավորում սովորելը կնմանվի լավագույն գրքերով ու լեկցիաներով դաշնամուր նվագել սովորելուն՝ առանց դաշնամուրի երբևէ մոտենալու:

Այս ծրագիրը իրականացնելու ավելի կոնկրետ, անհատական մոտեցումները կարող են տարբերվել՝ կախված արդեն եղած գիտելիքներից, ազատ ժամանակից, ճաշակից, կամքի ուժից, աշխատասիրությունից, և այլն: Բայց ընդհանուր դեպքում, օրինակ, կարելի է վարվել հետևյալ կերպ:

Տեսանյութեր Ինչքանով հասկացվում է, նայեք արագացված՝ խնայելով ժամանակը: Նայելուց փորձարկեք ցուցադրվող կոդի նույնիսկ ամենապարզ օրինակները. շատ հաճախ ամենահասարակ ու հասկանալի թվացող կտորը կարող է զարմացնել, եթե այն փորձարկեք: Որպեսզի չկտրվի տեսանյութով կառուցվող մտքի թելը, դա կարելի է հեշտությամբ ու արագ անել՝ հարցնելով ChatGPT-ին կամ Gemini-ին «wrap this code into a testable example»: Բնականաբար, դրանցից կարող եք օգտվել նաև մյուս երեք կետերը անելուց:

Գրքեր Միայն տեսանյութերով, սակայն, գիտելիքներում կարևոր տեղ է բաց մնում. դուք երբեք չեք շփվում համակարգված, ամեն նախադասությունը երկար մտածված, հատուկ ու հստակ շարադրված մտքերի հետ, ինչպես որակյալ գրքերում է: Իսկ դա իրեն բացասական կերպով զգացնել է տալիս հետագայում՝ գործնական տեքստեր գրելիս և, առհասարակ, մասնագիտական առօրյայում մարդկանց հետ շփվելիս: Հետևաբար, առաջին կետը որոշ ժամանակ (օրինակ, մի քանի ամիս) անելուց հետո կարող եք զուգահեռ ավելացնել նաև այս կետը: 

Ալգորիթմեր Հենց որ զգաք, որ C++ի գիտելիքները բավարար ամրացել են և թույլ են տալիս, կամաց-կամաց սկսեք նաև այս կետն անել, որը կսովորեցնի հիմնարար, ամեն օր հանդիպող ալգորիթմերը ճանաչել ու ճիշտ արտահայտել C++ով: Սկզբից կենտրոնացեք պարզ բաները հիմնովի՝ շատ լավ հասկանալու վրա, քան՝ փորձել մեծ քանակի կամ բարդ բաներ անել, որոնք կարող են ձեզ հիասթափեցնել: Դուք թե՛ ավելի արագ, և թե՛ ավելի որակյալ կսովորեք՝ նախ փայլուն յուրացնելով հիմնարար սկզբունքները, այսինքն՝ իրականացնելով std::for_each() տիպի պարզ ֆունկցիաները, քան փորձելով ստանալ գրաֆներում կարճագույն ճանապարհի որոնման ալգորիթմի մի կերպ աշխատող տարբերակը: Իհարկե, ի վերջո երկուսն էլ կարևոր է իմանալ: Պարզապես սկսելը ճիշտ է պարզ, հիմնարար բաները լավ հասկանալուց: Կզարմանաք, թե որքան բան դրանցում հեչ ակնհայտ չէ: Նաև արժի նշել, որ առորյա գործի մեջ անհամեմատ ավելի հաճախ է կարիք լինում աշխատել ոչ թե գրաֆների որոնման ալգորիթմերի հետ, այլ, օրինակ, for-ցիկլերի, որոնց հեղինակը կարծես տեղյակ էլ չի եղել, որ std::for_each() կամ range-for գոյություն ունեն: Սովորեք պարզ մտածել: Այդ հարցում շատ օգտակար կլինի ձեր գրած կոդը վերջում տաք AI-ին, հարցնեք՝ «simplify this» և համեմատեք:

Պրոյեկտ Առաջին երեք կետերն անելով, հենց որ զգաք, որ է՛լ ավելի եք ամրացել լեզվի (C++ի) և հիմնարար ալգորիթմերի մեջ, անցեք այս կետին. ընտրեք ձեզ դուր եկող մի քիչ մեծ պրոյեկտ ու սկսեք իրականացնել: Դրանով կսովորեք, թե առաջին երեք կետերում սովորածը ոնց և որ պահերին է հայտնվում ու կիրառվում մեծ պրոյեկտներում: Խիստ ցանկալի է, որ պրոյեկտի իրականացումը կազմակերպեք GitHub-ի կամ նման հարթակի միջոցով, որտեղ ձեր փոփոխությունները ժամանակի ընթացքում կկուտակվեն commit-ների տեսքով և տեսանելի կլինեն: 

Վերջում երկու ընդհանուր խորհուրդ:

Երբեք մի փորձեք որևէ բան անգիր անել: Դա բացարձակ անարդյունավետ ռեֆլեքս է, որը հավանաբար շատերի մոտ ձևավորվում է դպրոցից, երբ ստիպում են բանաստեղծություններ ու բազմապատկման աղյուսակ անգիր անել, և հետագայում ամրապնդվում տեխնիկական հարցազրույցների ժամանակ, որոնցում հաճախ հարցնում են այբբենական կարգով արտասանել սորտավորման ալգորիթմերն ու Linux-ի հրամանները: Փոխարենը՝ պարզապես տրամադրվեք, որ ցանկացած ոլորտում պրոֆեսիոնալիզմը գալիս է նույն կամ նմանատիպ վարժությունները հազարավոր անգամներ կրկնելով՝ տարբեր իրավիճակներում և տարբեր կողմերից, որպեսզի ժամանակի ընթացքում ձևավորվի «մկանային հիշողություն» և ձեր համար շնչելու նման դառնա՝ անեք առանց կենտրոնանալու և առանց մտավոր ճիգերի: Այդպես է և՛ սպորտում, և՛ երաժշտական գործիք նվագելիս, և՛ կոդի հետ աշխատելիս, և՛  IDE-ի shortcut-երը սովորելիս:  

Եթե կարող եք, գտեք որևէ փորձառու մասնագետ, որը կօգնի ընթացքում ձեր մոտ ծագած հարցերն ու խնդիրները հաղթահարել, ինչպես նաև գլուխ հանել, չընկճվել ու չհիասթափվել կոդի հետ աշխատելուց անխուսափելիորեն հանդիպող հազարավոր error-ներից և warning-ներից: Ես համոզված եմ, որ շատերը պատրաստ են օգնել, եթե հաստատ իմանան, որ դուք իսկապես նպատակադրվել եք նվիրվել գործին: Իհարկե, զուտ տեխնիկական մասով այսօր այս դերը կարող են հանգիստ ստանձնել ChatGPT-ն կամ Gemini-ն: