Ծրագրավորողի ընդունակությունների և գիտելիքների աղյուսակ

Յուրաքանչյուր մակարդակում պահանջվող գիտելիքներն իրենց մեջ ներառում են նախորդ մակարդակի համար անհրաժեշտ գիտելիքները:
n մակարդակում գտնվելը նշանակում է, որ դուք գիտեք այն ամենը, ինչ պահանջվում է n-ից ցածր մակարդակների համար:

« Ցանկը

Ծրագրավորում

# 2n (մակարդակ 0) n2 (մակարդակ 1) n (մակարդակ 2) log(n) (մակարդակ 3)
խնդրի կազմալուծում / տրոհում (problem decomposition) Կարող է կիրառել միայն գծային կոդ վերաօգտագործման համար պատճենումներով Կարող է խնդիրը տրոհել բազմաթիվ ֆունկցիաների Կարող է ստեղծել վերաօգտագործման համար պիտանի ֆունկցիաներ/ օբյեկտներ, որոնք լուծում են ընդհանուր խնդիրը Կարող է կիրառել պատշաճ տվյալների կառուցվածքներ և ալգորիթմներ և ստեղծել աբստրակտ օբյեկտ-կողմնորոշված կոդ, որն ընդգրկում է լուծման ենթակա խնդրի բոլոր բաղադրիչները
համակարգերի կազմալուծում / տրոհում (problem decomposition) Չի կարող մտածել մեկ կարգից բարդ խնդիրների մասին Կարող է խնդրի ծավալային և կառուցվածքային լուծումները տրոհել բաղադրիչների, քանի դեռ դրանք միևնույն հարթակի/տեխնոլոգիայի շրջանակներում են Կարող է կառուցել համակարգեր, որոնք ընդգրկում են տարբեր տեխնոլոգիաներ/ հարթակներ Կարող է պատկերացնել և կառուցել բարդ համակարգեր, որոնք ունեն բազմակի բաղադրիչներ և ինտեգրվում են արտաքին այլ համակարգերի հետ: Նաև պետք է կարողանա կառուցել գործառության աջակցության համակարգեր, ինչպես օրինակ մոնիթորինգ, հաշվետվություններ, խափանման դեպքում պահեստային տարբերակների գործարկում, և այլն:
Հաղորդակցություն Չի կարողանում պատշաճ կերպով արտահայտել իր մտքերը/գաղափարները, անում է ուղղագրական և քերականական սխալներ Գործընկերները հասկանում են արտահայտած մտքերը/գաղափարները: Լավ տիրապետում է ուղղագրության և քերականության կանոններին: Արդյունավետ կերպով հաղորդակցվում է գործընկերների հետ Հասկանում և կարողանում է հստակորեն հաղորդակցվել տարբեր մտքերի, դիզայնի, գաղափարների, ծրագրային առանձնահատկությունների մասին, և կարողանում է փոփոխել հաղորդակցության մակարդակը ըստ անհրաժեշտ համատեքստի [*]
կոդի կազմակերպումը մեկ ֆայլի մեջ Կոդը ֆայլի մեջ կազմակերպված չէ Մեթոդները խմբավորված են տրամաբանորեն կամ ըստ հասանելիության Կոդը պատշաճ կերպով խմբավորված է, տրված են ծանոթություններ և հղումներ Ֆայլն ունի վկայական, վերնագիր, ամփոփում, պատշաճ ծանոթություններ և դատարկ տարածքների հետևողական օգտագործում: Ֆայլը գեղեցիկ է։
կոդի կազմակերպումը ֆայլերի միջև Ֆայլերի միջև կոդի կազմակերպման մասին մտածված չէ Փոխկապակցված ֆայլերը խմբավորված են մեկ պանակի (ֆոլդերի) մեջ Յուրաքանչյուր ֆայլ ունի իր նպատակը, օրինակ մեկ դասի սահմանում, մեկ առաձնահատկության իրականացում, և այլն Կոդի կազմակերպումը համընկնում է կառուցվածքի հետ, և նայելով ֆայլերի անուններին և պանակների/ֆոլդերների բաշխվածությանը հնարավոր է հասկանալ կառուցվածքը
Source tree կազմակերպումը Ամեն ինչ գտնվում է մեկ պանակի/ֆելդերի մեջ Կոդի տարրական բաժանում տրամաբանական պանակների/ֆոլդերների մեջ Չկան շրջանաձև կախվածություններ, բոլոր ֆայլերը և կոդի տարրերը բաշխված են համապատասխան պանակների/ֆոլդերների մեջ Source tree -ի ֆիզիկական տեսքը համապատասխանում է տրամաբանական հիերարխիային և կառուցվածքին: Դիրեկտորիաների անունները և կառուցվածքը համապատասխանում են համակարգի կառուցվածքին: [*]
Կոդի ընթեռնելիությունը Միավանկ անվանումներ Ֆայլերի, փոփոխական դասերի, մեթոդների և այլնի համար լավ անուններ Չկան երկար ֆունկցիաներ, անսովոր կոդը բացատրող երկար ծանոթագրություններ, սխալների ուղղումներ, ենթադրություններ։ Կոդի ենթադրությունները ստուգված են, կոդը գրված է սահուն կերպով, չկան խորը ներդրված պայմաններ և մեթոդներ։
պաշտպանական ծրագրավորում Չի հասկանում այս գաղափարը Ստուգում է բոլոր փաստարկները և հաստատում է կոդի մեջ օգտագործվող կարևոր ենթադրությունները Միշտ ստուգում է վերադարձվող արժեքները և ստուգում է հնարավոր բացառությունները, որոնք կարող են չաշխատել Ունի սեփական շտեմարանը (library, module, etc...) պաշտպանական ծրագրավորման համար, գրում է թեսթեր հնարավոր խնդիրների ստուգման համար
սխալների կարգավորում (error handling) Կոդավորում է միայն լավագույն սցենարներով Ստուգում է կոդի հետ կապված տարրական սխալները, որոնք կարող են հանգեցնել բացառությունների/ ստեղծել սխալներ Համոզվում է, որ սխալները/բացառությունները ծրագիրը չեն վնասում, ռեսուրսները, միացումները և հիշողությունը պատշաճ կերպով մաքրվում է Ծրագրավորում է բացահայտելով հնարավոր բացառությունները մինչև դրանց ի հայտ գալը, կոդի բոլոր շերտերում կիրառում է բացառությունների կարգավորման հետևողական ռազմավարություն, մշակում է ամբողջ համակարգի համար բացառությունների կարգավորման ուղեցույցներ
IDE Հիմնականում կիրառում է IDE տեքստերի խմբագրման համար Կարողանում է օգտագործել IDE միջավայրը, կարողանում է արդյունավետորեն կիրառել այն օգտագործելով մենյուներ Գիտի ամենահաճախ օգտագործվող գործողությունների համար կիրառվող ստեղնաշարի ստեղների համադրությունները Գրել է մակրոներ
API Հաճախ փաստաթղթեր փնտրելու կարիք ունի Հիշում է ամենահաճախ օգտագործվող API-ները Ունի API-ների ծավալուն և խորը գիտելիքներ Կազմել է API-ների վրա հիմնված շտեմարաններ (library,module, etc...), որպեսզի պարզեցնի հաճախ օգտագործվող առաջադրանքները և լրացնի API-ի մեջ եղած բացերը [*]
frameworks Հիմնական հարթակից դուրս որևէ այլ framework չի օգտագործել Լսել է, սակայն չի կիրառել հարթակի համար հասանելի հաճախ կիրառվող framework-ները Պրոֆեսիոնալ կերպով կիրառել է մեկից ավել framework֊ներ, և կարողանում է լավ օգտագործել framework մեջ կիրառվող գործիքները Հեղինակել է սեփական framework֊ը
պահանջներ Վերցնում է տրված պահանջները և ծրագրավորում ըստ այդ պահանջների Առաջ է քաշում հարցեր պահանջներում բացակայող դեպքերի մասին Հասկանում է ամբողջական պատկերը և հայտնաբերում է ամբողջական ոլորտներ, որոնք կարիք ունեն ներառվելու պահանջների մեջ Իր փորձի հիման վրա կարող է առաջարկել ավելի լավ այլընտրանքներ պահանջներում ներկայացված խնդիրների լուծման համար
սքրիփթներ Չունի սքրիփթների ստեղծման գործիքների վերաբերյալ գիտելիքներ Փաթեթային ֆայլեր / shell սքրիփթներ Perl/Python/Ruby/VBScript/Powershell Գրել և հրապարակել է վերաօգտագործման ենթակա կոդ
տվյալների բազաներ Կարծում է, որ Excel-ը տվյալների բազա է Տեղյակ է տվյալների բազաների վերաբերյալ հիմնական հասկացությունների, նորմալիզացման, ACID և տրանզակցիաների մասին, և կարող է գրել պարզ հարցումներ։ Կարող է ստեղծել լավ և կարգավորված տվյալների բազաներ հաշվի առնելով այն հարցումները, որոնք կարող են արվել տվյալների բազային: Հմտորեն կարող է օգտագործել views, stored procedures, triggers և օգտատիրոջ կողմից ստեղծված տիպեր: Հասկանում է խմբավորված և ոչ խմբավորված ցուցիչների (clustered and non-clustered indexes) միջև տարբերությունը: Հմտորեն օգտագործում է ORM գործիքներ: Կարող է իրականացնել տվյալների բազաների կառավարում, կատարողականության օպտիմալացում, ինդեքսացիայի օպտիմալացում, կարող է գրել բարդ ընտրողական հարցումներ, կարող է փոխարինել cursor usage with relational sql, հասկանում է, թե ինչպես են տվյալները պահվում բազայի ներսում, հասկանում է, թե ինչպես են ցուցիչները պահվում բազայի ներսում, հասկանում է, թե ինչպես տվյալների բազաները կարող են կրկնօրինակվել, պատճենվել և այլն: Հասկանում է, թե ինչպես է աշխատում հրահանգի կատարման/մերժման երկփուլանի գործընթացը (two phase commit)

Համակարգչային գիտություն

# 2n (մակարդակ 0) n2 (մակարդակ 1) n (մակարդակ 2) log(n) (մակարդակ 3)
Տվյալների կառուցվածներ Չգիտի տարբերությունը զանգվածի և կապակցված ցանկի միջև Կարող է բացատրել և գործնական ծրագրավորման առաջադրանքների մեջ կիրառել բազմություններ, կապակցված ցանկեր և բառարաններ Գիտի տվյալների հիմնական կառուցվածքների միջև ծավալային և ժամանակային տարբերությունները, կարող է բացատրել, թե ինչպես կարելի է իրականացնել hashtable կառուցվածքներ և կարգավորել բախումները, գիտի Priority queue -երի իրականացման մասին, և այլն Տիրապետում է տվյալների բարդ կառուցվածքներին, ինչպիսիք են B-tree, երկանդամ և Ֆիբոնաչի զանգվածներ, AVL/Red Black tree, Splay Trees, Skip Lists, tries և այլն․․․ [*]
Ալգորիթմներ Չի կարող գտնել բազմության մեջ թվերի միջինը (դժվար է հավատալ, բայց ես հարցազրույցներ եմ ունեցել նաև այսպիսի թեկնածուների հետ) Տիրապետում է սկսնակ մակարդակի տեսակավորման, որոնողական և տվյալների կառուցվածքների շրջանցիկ և արտահանման ալգորիթմների Տիրապետում է ծառային, գրաֆային, պարզ greedy և «բաժանիր և տիրիր» ալգորիթմների, կարող է հասկանալ սույն աղյուսակի մակարդակների նշանակությունը Ճանաչում է և կարող է կիրառել դինամիկ ծրագրավորման լուծումներ, ունի գրաֆային ալգորիթմների լավ գիտելիքներ, ունի թվային հաշվարկի ալգորիթմների լավ գիտելիքներ, կարող է հասկանալ NP խնդիրներ, և այլն
Համակարգերի ծրագրավորում Չգիտի, թե ինչ է կոմպիլյատորը, միավորիչը(linker) կամ ինտերպրետատորը Ունի կոմպիլյատորների, linker և interpreter ծրագրերի մասին սկսնակ գիտելիքներ: Հասկանում է, թե ինչ է assembly code-ը, և ինչպես են աշխատում ծրագրերը hardware մակարդակում: Ունի վիրտուալ հիշողության և paging-ի վերաբերյալ որոշ գիտելիքներ: Հասկանում է միջուկային ռեժիմի և օգտագործողի ռեժիմի միջև տարբերությունները, հասկանում է ծրագրի բազմաբաղադրիչ գործարկման (multi-threading) և սինխրոնիզացիայի սկզբունքները և ինչպես են դրանք իրականացվում, կարող է կարդալ assembly code: Հասկանում է, թե ինչպես են աշխատում ցանցերը, հասկանում է ցանցային հաղորդակարգերը և socket մակարդակի ծրագրավորումը: Հասկանում է ծրագրավորման ամբողջ կառուցվածքը, hardware (CPU + Memory + Cache + Interrupts + microcode), բինար կոդ, assembly, ստատիկ և դինամիկ փոխկապակցում, կոմպիլյացիա, JIT կոմպիլյացիա, garbage collection, զանգվածներ, հիշողության հասցեավորում

Ծրագրային ապահովման ճարտարագիտություն

# 2n (մակարդակ 0) n2 (մակարդակ 1) n (մակարդակ 2) log(n) (մակարդակ 3)
Կոդի տարբերակների վերահսկում Պանակների (ֆոլդեր) կրկնօրինակում ըստ ամսաթվերի VSS և սկսնակ CVS/SVN օգտագործող CVS և SVN գործիքների հմուտ օգտագործող: Գիտի, թե ինչպես պետք է բաժանել և միաձուլել տվյալները, օգտագործել patch, ստեղծել շտեմարաններ, և այլն: Բաշխված VCS համակարգերի գիտելիքներ: Փորձել է օգտագործել Bzr/Mercurial/Darcs/Git:
Ավտոմատացում Կարող է ծրագրավորել միայն IDE միջավայրում Գիտի, թե ինչպես կառուցել համակարգ հրամանի տողից Կարող է ստեղծել սքրիփթ պարզ համակարգ կառուցելու համար Կարող է ստեղծել սքրիփթ համակարգ կառուցելու, ինչպես նաև փաստաթղթավորման, տեղադրման, թողարկման և տարբերակների վերահսկման համար
Տեստավորման ավտոմատացում Կարծում է, որ թեսթավորման աշխատանքները պետք է իրականացնեն բացառապես թեսթավորողները Գրել է ավտոմատացված թեսթեր և կարող է ստեղծել որակյալ թեսթեր գրվող կոդի համար Գրել է կոդ TDD եղանակով Հասկանում է և կարող է ստեղծել ավտոմատացված ֆունկցիոնալ, ծանրաբեռնվածության/ կատարողականության և օգտագործողի փորձառության վերաբերյալ թեսթեր

Փորձ

# 2n (մակարդակ 0) n2 (մակարդակ 1) n (մակարդակ 2) log(n) (մակարդակ 3)
լեզուների իմացությունը և կիրառման փորձը Իմպերատիվ կամ օբյեկտ-կողմնորոշված Իմպերատիվ, օբյեկտ-կողմնորոշված կամ դեկլարատիվ (SQL), լրացուցիչ առավելություն է, եթե հասկանում է ստատիկ և դինամիկ տիպաբանության տարբերությունները, թույլ և ուժեղ տիպերը և այլն ․․․ Ֆունկցիոնալ, լրացուցիչ առավելություն է, եթե հասկանում է lazy evaluation, currying, continuations Concurrent (Erlang, Oz) and Logic (Prolog)
հարթակների օգտագործման մասնագիտական փորձ 1 2-3 4-5 6+
մասնագիտական փորձի տարիներ 1 2-5 6-9 10+
Առարկայական դաշտի իմացություն (domain knowledge) Առարկայական դաշտի զրոյական իմացություն Աշխատել է տվյալ առարկայական դաշտում առնվազն մեկ պրոդուկտի վրա Աշխատել է տվյալ առարկայական դաշտում մի քանի պրոդուկտների վրա Դաշտի գիտակ է: Ստեղծել և իրականացրել է տվյալ տիրույթում մի քանի պրոդուկտներ / լուծումներ, լավ տիրապետում է տիրույթում կիրառվող ստանդարտ պայմաններին և հաղորդակարգերին

Գիտելիքներ

# 2n (մակարդակ 0) n2 (մակարդակ 1) n (մակարդակ 2) log(n) (մակարդակ 3)
գործիքների իմացություն Սահմանափակվում է առաջնային IDE-ով (VS.net, Eclipse և այլն) Գիտի այլընտրանքներ հաճախ օգտագործվող և ստանդարտ գործիքների համար Խմբագրիչների, վրիպազերծման գործիքների (debuggers), IDEs, open source այլընտրանքների լավ իմացություն: Օրինակ - մեկը, ով գիտի Սքոթթ Հանսելմանի գործիքների ցանկից գործիքների մեծամասնությունը, օգտագործել է ORM գործիքներ Ինքն է գրել գործիքներ և սքրիփթներ, լրացուցիչ առավելություն է, եթե դրանք հրապարակվել են
լեզուների իմացությունը և կիրառման փորձը Իմպերատիվ կամ օբյեկտ-կողմնորոշված Իմպերատիվ, օբյեկտ-կողմնորոշված կամ դեկլարատիվ (SQL), լրացուցիչ առավելություն է, եթե հասկանում է ստատիկ և դինամիկ տիպաբանության տարբերությունները, թույլ և ուժեղ տիպերը և այլն ․․․ Ֆունկցիոնալ, լրացուցիչ առավելություն է, եթե հասկանում է lazy evaluation, currying, continuations Concurrent (Erlang, Oz) and Logic (Prolog)
կոդի աղբյուրների իմացություն (codebase knowledge) Երբեք չի նայել կոդի աղբյուրները, Երբեք չի աշխատել կոդի աղբյուրների հետ Կոդի դասավորության տարրական գիտելիքներ, համակարգի կառուցման տարրական գիտելիքներ Կոդի աղբյուրների աշխատանքային լավ իմացություն, իրականացրել է խնդիրների/սխալների վերացում, գուցե նաև որոշ փոքր հնարավորություններ(features) է ստեղծել Կոդի աղբյուրի մեջ իրականացրել է բազմաթիվ մեծ feature-ներ և հեշտությամբ կարող է պատկերացնել feature-ների իրականացման կամ սխալների վերացման համար պահանջվող անհրաժեշտ փոփոխությունները
նոր զարգացող տեխնոլոգիաների իմացություն Չի լսել նոր զարգացող տեխնոլոգիաների մասին Տեղյակ է ոլորտում նոր զարգացող տեխնոլոգիաների մասին Ներբեռնել է նախնական/ CTP/ փորձնական տարբերակները, կարդացել որոշ հոդվածներ և նյութեր Ուսումնասիրել է նախնական տարբերակները և օգտագործել դրանք, լրացուցիչ առավելություն է, եթե իր արդյունքները կիսել է այլոց հետ
հարթակների ներքին տարրերի իմացություն Հարթակների ներքին տարրերի զրոյական իմացություն Ունի տարրական գիտելիքներ, թե ինչպես են աշխատում հարթակները Ունի հարթակների ներքին տարրերի խորը գիտելիքներ և կարող է պատկերացնել, թե ինչպես է հարթակը ծրագիրը վերափոխում գործունակ կոդի Գրել է գործիքներ հարթակների ներքին տարրերը բարելավելու համար, օրինակ` disassembler, decompiler, debugger և այլն
գրականություն Ծանոթ է միայն սկսնակ մակարդակի գրականությանը (Unleashed series, 21 days series, 24 hour series, dummies series…) Ծանոթ է հետևյալ գրքերին.
  • Code Complete
  • Don’t Make me Think
  • Mastering Regular Expressions
  • ....
Ծանոթ է հետևյալ գրքերին.
  • Design Patterns
  • Peopleware
  • Programming Pearls
  • Algorithm Design Manual
  • Pragmatic Programmer
  • Mythical Man month
Ծանոթ է հետևյալ գրքերին.
  • Structure and Interpretation of Computer Programs
  • Concepts Techniques
  • Models of Computer Programming
  • Art of Computer Programming
  • Database systems, by C. J Date
  • Thinking Forth
  • Little Schemer
բլոգեր Լսել է բլոգերի մասին, բայց երբեք ժամանակ չի հատկացրել դրանց Կանոնավոր կերպով կարդում է տեխնիկական/ ծրագրավորման/ ծրագրային ճարտարագիտության թեմաներով բլոգեր և լսում է այդ թեմաներով հաղորդումներ Ունի օգտակար հոդվածների և գործիքների հղումներ պարունակող բլոգ, որը հավաքել է ինքնուրույն Ունի սեփական բլոգը, որում կիսվում է ծրագրավորման մասին սեփական մտքերով և գաղափարներով