Как се преподава програмиране в България?

Българската реалност накратко

Ти си ученик, 10-11 клас, не учиш „Информатика“, но си чувал и виждал вече достатъчно реклами за това как да започнеш с 3000 лв заплата с няколко курса по програмиране. Или си студент в университета, който по случайност е попаднал в специалността „Софтуерни технологии“, просто защото му се е сторила яка идеята да пише програми. Или си човек около 40 години, който е решил да зареже това, с което се занимава, просто защото е загубил интерес и иска да започне нещо по-доходно или просто се е понесъл по новата течение наречено „програмиране“. Какво правиш сега? Ами записваш курс по програмиране в някой български университет например СофтУни, или в академия като Телерик или пък в някой учебен център като в СофтАкад. А дори и да си ученик в някое МГ, който учи „Информатика“, съм убеден, че статията ще обхване огормна част от това, което ти се случва.

И ето, че е време за първата лекция/презентация/учебен час, където се явяваш след 2 дни прекарани в инсталацията на някаква програма, наречена Visual Studio, която не само, че е огромна ами въобще не знаеш какъв й е смисълът. Но в мейла пишеше: „Инсталирайте си тази програма, за да може да работим с нея, тъй като интернетът няма да стигне за всички в залата ако я сваляте на място.“. Добре, инсталирал си я и вече си обратно в залата. В нея има 20+ човека и един лектор, който обяснява неща на прожектор. Тъкмо в този момент научаваш и за езика за програмиране, C#. Няма как да не си го чувал, разбира се, че всеки говори за него. Но дали знаеш ограниченията му е друг въпрос. Минути по-късно вече си написал първата ти програма, която е конзолно приложение, което изписва на екрана „Hello World“! Извинявай, забравих, че не са ти преподали какво е конзолно приложение. Майната му, важното е, че написа код и той се изпълнява.

3-4 седмици по-късно ти вече можеш да принтиш на екрана елха направено от „*“ чрез for цикъл, но все още не си сигурен как точно се изпълнява този код на компютъра, че ти го и принти. Можеш да смяташ лицето на квадрат като въвеждаш данни от клавиатурата, но все още не ти е много ясно защо като смениш името на кода „main“ на „Gosho“ програмата спира да работи. Разбира се, не сте учили все още за обекти, класове, статични методи, та то може би и за методи не сте учили, но е важно алгоритмичното мислене и това, че Console.ReadLine чете магически входа от конзолата. Вече знаеш, че като цъкнеш New -> Console Project създаваш конзолно приложение, а всичките останали опции там за какво са, може би само да ти пречат.

Това е българската реалност накратко. Сега ще кажете, че не е така. Нима? Нека дискутираме в коментарите 🙂

Проблемите

Проблемите са много, не е просто един и с удоволствие ще ги изброя тук. Със сигурност ще попаднете на поне един от тях, в който и да е курс за програмиране тук. Нека ги обясня накратко:

Обучение директно на дълбокото

Щом сте се записали на курс по програмиране значи знаете как работи компютърът и защо като цъкнете бутона на лентата долу в ляво ви се отваря меню за избор. Нима? Както има шофьори, които не знаят, че колата има бутала и че всяко бутало има сегменти, а просто сядат и карат, същото е и с компютъра. Не е нужно да знаеш как работи, за да го ползваш. Но е съвсем различно, когато седнеш да пишеш код, който трябва да му каже да направи нещо.

Повечето от хората, които записват курс за програмиране, нямат никакви знания или имат леки предположения за това как работи компютърът. А на първата лекция вие вече работите с „Visual Studio“ и пишете код, който прави нещо. Но как го прави? Защо? Какво точно се случва отдолу, как физически се предава тази информация и накрая се визуализира на екрана? Това изцяло липсва в повечето лекции и остава като нещо, което всички в залата знаем, а само тези, които преди това са отделили някакво време да разцъкат нещата знаят бегло за какво става въпрос …

Езикът за програмиране

Популярните езици унас

Нека изясним пазарът за програмисти за кратко. Има огромно търсене на програмисти разбиращи от езика C#. Също така има огромно търсене на програмисти разбиращи от езика Java. Те са най-високо платени в сферата на сървърите т.е. пишат сървърен C# или Java код, а не код за мобилни устройства. C# е изключително ентърпрайз насочен език, затова повечето фирми решават да заложат на него (знаете връзката C# <-> Microsoft, нали?). Java е също ентърпрайз насочен език, като C# като двете са добра конкуренция.

Затова ако ще правите милиони, ще ги правите посредством определен набор от езици и като пишете определен тип код. Не, че и с мобилните няма да изкарвате много добри пари 😉

Парата прави играта

Съответно повечето академии унас учат хората на C# или Java. Дори 5 човека от 50 да излязат след 3-месечен курс, знаейки C#, то това е напълно достатъчно, тъй като много често директно самите академии им предлагат работа в някоя фирма, от което получават солидни суми. Ето защо връзката академия <-> фирма е толкова популярна унас. На завършването ми в университета присъстваха поне 6 представители на фирми, които каниха студентите при тях. Включително и деканът на ФМИ Пловдив имаа собствена фирма за програмиране (а после преподавателите не били в час).

Mindset-ът на преподавателите

Сега отговорихте ли си защо ще учите C#, а не език като Python? Но има и още една доста интересна причина.

Повечето съвременни преподаватели могат да пишат на ограничен брой езици. Те не се чувстват комфортно да преподават на език, който знаят малко или не знаят въобще, нищо че знаят и имат опит с програмирането. Затова и трудно се намират преподаватели, които да учат на нещо различно от Java и C#. Разбира се, това не винаги е така, повечето програмисти с интерес в сферата имат голям опит с много езици, но просто не искат да си напуснат работата, за да преподават. И така се завърта затвореният кръг на ИТ преподавателите в България.

Колко е важен езикът за програмиране?

Езикът за програмиране е едно от най-важните неща, с които всеки начинаещ се сблъсква. Затова той е ИЗКЛЮЧИТЕЛНО ВАЖЕН, когато започнете да навлизате програмирането. Когато започнеш да преподаваш на строго типизирани езици (за незнаещите това са езици, в които имаш неща като String, int, boolean пред името на променливата) или на езици с указатели (това не ви трябва да го знаете) как очакваш въобще някой да те разбере за 2-3 месеца обучение, че ако щеш и за 2 учебни срока. Отдавна е доказано, че в програмирането с език като Python се учи много по-лесно, защото е близък до разговорната реч. Ето пример:

C#

for(int i=0; i < 10; i++)

Python

for letter in 'Python'

Е, за какво говорим въобще? Нека използвам аналогия с курсовете по шофиране. Като ги започнахте, не ви качиха на Ферари и ви казаха: „Карай сега“. Качиха ви на кола, която е направена да я блъскате, подпирате и въобще да не ви пука за това. Дори първата ви кола няма да е скъпа, защото знаете, че предстои един голям тормоз, докато схванете идеята на шофирането. Еми същото е и тук. Защо да започвате с нещо сложно, когато идеята е да се научите да пишете код, а не да пишете професионално приложения за 3 седмици?

Опитвам се да кажа, че не може да скочиш в дълбоките води, да обясняваш типове, класове, обекти, че и ако преподаваш C++ да обясняваш и концепции като указатели. И в същото време да очакваш хора, които още не са се научили да не гледат в клавиатурата (повечето програмисти все още гледат) да не се удавят.

Е, надявам се вече разбрахте защо учите дадени езици, а не други. И не търсете после вината в себе си, че не сте схванали дадена концепция. Много от нещата не зависят само от нас.

Ограниченията на езика за програмиране

Всеки език за програмиране си има ограничения. Просто искам да сте наясно, когато записвате даден курс. Ограничението на C# е, че можете да го ползвате на Windows машини, но не и на Линукс. Може да пишете приложения за Windows Mobile, но не и за Андроид (Xamarin бих казал, че все още е далеч).

Java пък върви на всичко, Windows, Linux, готварски печки и Андроид телефони, но пък е бавна и гладна за РАМ памет. Всеки един език и платформа си имат тяхните ограничения. Задължително е да се запознаете с предимствата и недостатъците на даден език, преди да започнете да го учите.

Проблемът на всеки един курс тук е, че рядко споменават за недостатъците и лошите страни на един език. Как ще кажат за лошото, когато трябва да ви зарибят?

Безсмислени задания

Нека да не се лъжем, когато започваш нещо ново, на теб ти трябва силен стимул, за да продължиш. Много често този стимул се очаква да е личен и всеки човек да го има т.е. ти отиваш да програмираш, защото имаш личен стимул, но не и защото курсът ще ти даде такъв. Той ще ти даде само знания. Този подход го срещам навсякъде. И накрая отиваш на курс по програмиране и след 3 месеца излизаш от там изпринтил елха със * на конзолата, същата тази елха в уеб проект и в едно десктоп приложение, което не би показал дори на родителите си. Да не говорим за безбройните алгоритми за изчисляване на лица на разни фигури и още какво ли не.

Езиците за програмиране са вече на такова ниво, което позволява използването на „Reflection“ и още много други подходи, за да се направи един проект по-интересен и интерактивен. Но проблемът на това е, че изисква време и умения, а повечето преподаватели просто не им се занимава. Могат да се направят смислени и практически насочени проекти, които да дадат смисъл на цялото обучение. Дори един калкулатор да направиш би имало повече смисъл, от колкото да пишеш звезди на конзолата.

Проблемът с времето и усилията е от доста отдавна и е решен по много прост начин. Нека припомня крилатата фраза на Левски: „Ако е за Българско, то времето е в нас а ние сме във времето; то нас обръща и ние него обръщаме.“. А то е за Българско.

Подходът на презентиране

Предполагам всички знаем как се преподава „Информатика“ в училище. Влизаш в час, пускаш компа, влиза преподавателят, пуска прожектора и целият ти час почти минава в гледане на презентацията, която е подготвена. Има писане на код на компютъра, което е изключително малко и определено недостатъчно, да те научи как да пишеш код. Същото е и в големите зали на академиите, където се преподава програмиране. Една огромна зала с 40-50 човека, един прожектор, който на последните редове едва виждат и преписване на случващото се на презентацията. Няма го индивидуалното внимание към всеки, което е задължително, за да могат всички да разберат дадена концепция. В големите зали върви правилото „Всички написахте ли това? Добре, сега продължаваме с … “

Техниката в 21 век

Срам ме е да повдигам такава тема в 21 век, но трябва. За мен не е нормално академия или училище, които са разпространители на знание, да нямат нужната техника, за да преподадат това знание. Абсурд е в 21 век да нямаш зала с настолни компютри или да отдадеш на хората в залата лаптопи, а да печелиш хиляди левове от обучението им и наемането им в разни навързани фирми. Абсурдно е да очакваш в страна с минимална заплата от 460 лв, че всеки ще има лаптоп. Не може да разпространяваш знание за писане на Софтуер без да имаш наличния Хардуер.

Програмиране != ++Алгоритми

Горното се превежда като „Програмиране е различно от Алгоритми + 1“. Отдавна се повтаря едно и също, че ако не разбираш от математика, то програмирането не е за теб. Този мит отказва много хора от това да опитат да пиша код. А той целият е една голяма заблуда.

Програмирането е част от математиката. Създаването на променливи, функции, генерирането на кода и много други концепции са същите тези неща, които знаем от математиката. Но писането на код е изключително бегло свързано с математиката. Освен ако не изчислявате сложни анимации, при които искате кръг да се превърне в триъгълник или да анализирате дали на снимката има човешко лице. Както във всяка сфера, в програмирането също има различни сфери на реализация: Мобилни приложения, сървърни архитектури, анализатори на данни и много други. Никой не е казал, че трябва да знаете теоремата на Лопитал, за да напишете Андроид приложение, което има база данни в себе си, получава нотификации, зарежда съдържание от някой сървър и позволява да си чатиш с милиони други хора.

И за да доизясня някое неща, виждал съм код писан от програмисти по време на състезания за алгоритми. Виждал съм и код на много популярни Андроид приложения. Мога да кажа, че първият код е най-грозният код, който съм чел в живота си, но и най-бързият. А вторият е най-красивият, но не и най-оптимизираният. Разменете двамата програмиста и съм убеден, че никой нищо няма да разбере от работата на другия. 🙂

П.С.
Лек едит от мен. И въпреки всичко изпадането на крайности като това, че математиката е ненужна или пък, че е абсолютно задължителна, за да започнете да програмирате е нещо, което не трябва да се прави. Истината е някъде в средата.

Финални думи

Кофти е, че приключвам темата с леко разочаровение от средата на начално обучение в програмирането, която е в момента в България. Но искрено се надявам, че тя ще се развие с времето. Не искам да оставям чувството в хората, които смятат да запишат дадена академия, за да завършат програмиране, че ще бъдат използвани да научат нещо, което в крайна сметка може би няма да им бъде толкова полезно. Идеята е да отидете, да видите и да опитате. Може пък да ви хареса. Не е толкова страшно и определено е забавно, когато попаднеш на лектор.

А в следващия ми пост ще ви покажа от кои източници сами да добиете правилната представа и насока в програмирането.

Ще се радвам да дискутираме написаното в коментарите! 🙂

Едно мнение за “Как се преподава програмиране в България?

  1. Абсолютно точна и в детайли описана ситуация отностно нивото на предлаганото обучение в българия. Благодаря ти за изключително добре написаната публикация на тема която по принцип ме интересува и донякъде изпитах от първо лице. За жалост стигнах до извода че при нас единственото възможно качествено обучение е самостоятелното с изключително интензивна практика и писане на код.

    Харесвам

Вашият коментар