Menu

Nakov.com logo

Thoughts on Software Engineering

За математиката в програмирането и дали ни трябва наистина: математика, статистика, data science и machine learning @ СофтУни

Data Science @ SoftUni

С голямо задоволство обявявам, че в СофтУни вече се преподава математика. Включваме сред избирателните курсове изучаване на приложна математика, алгебра, анализ, вероятности, статистика, числени методи и математически софтуерни инструменти, приложения, платформи и библиотеки за прилагане на математически модели, сложни алгоритми и изчислителни подходи в реални практически задачи и проекти от ИТ индустрията.

СофтУни, математика и програмиране

Трябва ли един програмист да знае математика? Математика и програмиране – свързани ли са? Трябва ли да си добър математик, за да станеш програмист? Ако си добър математик, ще станеш ли добър програмист? Постоянно ме питат такива въпроси и постоянно им отговарям, че не е задължително да си добър математик, за да станеш добър програмист и аз самия съм отлично доказателство за това.

В СофтУни винаги сме давали качествено образование, ориентирано към практиката. Винаги сме изграждали директно приложими в практиката умения, а не празни теории. Винаги сме давали реални знания, практически умения и компетенции, които се търсят на пазара на труда и са актуални спрямо съвременния свят.

В началото СофтУни започна като алтернатива на държавното ИТ образование, изградена върху парадигмата “учене чрез правене“, с много практика и изграждане на реални умения, които работодателите търсят. За повечето фирми по-важни се оказаха конкретни езици за програмиране и софтуерни технологии (като PHP и Java EE), а не толкова математически фундамент. Така математиката си остана на заден план, заради липсата на търсене и заради липсата на желание у студентите да се занимават с математика и теория. С времето СофУни се утвърди като безспорен лидер на пазара на ИТ обучения и започна да подготвя повече софтуерни инженери и ИТ специалисти, отколкото всички останали учебни заведения, взети заедно.

СофтУни от самото си създаване е масово учебно заведение с десетки хиляди учащи на година. Някои идват за да научат какво е програмиране, ИТ или да придобият начални дигитални умения. Други идват, за да станат програмисти и да започнат работа. Трети идват, за да станат супер професионалисти в софтуерната индустрия и да се развиват дългосрочно, като надграждат знанията и уменията си в продължение на години. СофтУни дава по нещо за всеки: от начални курсове за запознаване с програмирането и натрупване на базови дигитални умения, до сложни, специализирани мастър курсове за по-напредналите, включващи математика, физика и други фундаментални науки. Всеки може да избира според нивото си и според желанията си какво да учи.

Така се стигна и до електроникаструктури от данни, алгоритми, математика, data scienceмашинно обучение и други по-сложни специализации. Такива курсове изграждат едно по-високо ниво, надминаващо обикновения софтуерен разработчик, който пише уеб или мобилни приложения. Такива обучения отговарят на нуждите на вече завършилите от първите випуски наши студенти, които успешно работят в софтуерната индустрия и вече са с няколко години опит и търсят качествено израстване в професията.

Математиката не е за всеки!

Всъщност математика, сложни алгоритми, machine learning и подобни теми не са за всеки. Десетки хиляди работят в софтуерната индустрия на добри позиции в добри фирми, без да имат сериозни математически умения. Защо тогава всички да задълбават в математика, алгоритми, графика или пък машинно обучение? Нека с machine learning и сложни алгоритми се занимават само по-напредналите програмисти, които имат капацитет и желание да усвоят тази материя. Нека който иска да реди сайтове и формички и е доволен от това, да си го работи. Нека който иска да учи алгоритми, да си ги учи. Който има капацитет за self-driving cars, нека с това да се занимава. СофтУни дава избор! СофтУни не задължава всички да учат математика или сложни алгоритми, а само който ги пожелае, който е стигнал ниво на напредък, което му позволява да намери смисъл в тях и да ги изучава с любов и желание.

Обърнат подход: от практика към фундамента

Навремето в математическия факултет ни обясняваха как за да станеш програмист, трябвало да имаш солидна основа от фундаментална математика, всякакви там диференциални уравнения, неевклидови геометрии и незнам си какви пространства и интеграли. Набиваха ни в главите формули и уравнения и всичко това без докосване на компютър, само на дъската. И твърдяха, че така се изгражда основата на добрия програмист. Дрън-дрън. Резултатът от всичко това го знаем: отказваха студентите от математика, отказваха студентите от програмирането, отказваха студентите от ученето въобще. Завършваха много малко хора, масово се преписваше, хиляди се бореха за тройка и много малко хора намираха смисъл в изучавания материал. Липсваше практика и смисъл да учиш всичко това, липсваше мотивация, липсваха резултати. Само единици се запалваха по математиките, но не винаги ставаха добрите програмисти.

Практиката доказва хиляди пъти, че не е нужно да си добър математик, за да си добър програмист. Математиката може да помогне, може да ти развие мисленето, но не е задължителна в кариерата на програмиста. Тя не е за всеки и не трябва да се налага на всеки.

Аз например, никога не съм бил добър математик, но пък като ученик бях в националния отбор на България по програмиране 5 години поред и печелех медали по международните олимпиади по програмиране (вж. https://stats.ioinformatics.org/people/2220). Имах логическо мислене, но не бях математик. Не знаех какво е интеграл и нямах нужда да знам.

Не бъркайте математиката с логическо мислене! Логическото мислене е необходимо на всеки програмист, но диференциалните уравнения и статистиката не са за всеки. Те са излишни за средно-статистическия кадърен програмист. В някои ситуации могат и да помогнат, но по-добре си инвестирайте времето в нещо по-практическо.

С годините, се оказа, че някои програмисти, с времето се сблъскват с трудни задачи и сами се запалват по някои дялове от приложната математика, статистиката и геометрията, защото им трябва в работата. Така се учи най-добре: сблъскваш се с проблема, виждаш че ти липсват знания, намираш си ги, научаваш си ги, вдигаш си нивото и продължаваш напред, до следващия проблем. Тогава вече си узрял да учиш математика.

Ако искаш да правиш игри със сложна графика, започваш примерно с Unity или готова библиотека и се запалваш. Стигнеш ли по-напред, извън тривиалните стандартни инструменти, рано или късно се сблъскваш с математика, но тогава знаеш за какво ти е, намираш смисъл и започваш да я учиш с хъс. Източници много: има хиляди курсове в Coursera и световните учебни организации. От практиката към теорията. От конкретния проблем към по-общите принципи. Така се учи по-добре и е по-удачно в съвременни бързо-променящ се свят.

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

Именно затова в СофтУни по-сложните курсове (структури от данни, алгоритми, математика, data science, machine learning, computer graphics, operating systems, project management, agile methodologies и др.) се изучават по желание и към края на учебния план, след година-две навлизане в програмирането и практическата разработка на софтуер, след някоя и друга година реален стаж в софтуерна фирма. Тогава по-начетените студенти са готови за тези знания и могат да ги поемат. А останалите – те ще намерят своя път и той може да не минава през математика и физика. От практика към фундамент – това е по-добрият път в съвременния дигитален свят!

Първо програмиране, после (евентуално) математика и по-сложни алгоритми

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

Грешно е да се опитваме да научим всеки на сложни алгоритми и математика, особено в началото, преди да сме му запалили интереса и да сме му дали смисъл да учи програмиране и технологии. Така хиляди читави студенти се отказват, не защото са глупави, а защото им е рано. Вижте какво става в Софийски и в Технически университет. Грешно е да учим теорията зад даден проблем, преди да сме се сблъскали с проблема в практиката. Грешно е да учим управление на проекти, преди да сме участвали поне в един проект и да сме разбрали нуждата от планиране и контрол на задачите. Затова съм привърженик на подхода “от практика към фундамент”.

За направлението по Data Science / Machine Learning в СофтУни

Страхотно е да добавим още едно направление от знания за търсещите нещо повече от кодене: data science / machine learning / intelligent systems / robotics. Има огромно бъдеще в тези науки. Идва ерата на роботите. Вече автомобилите без шофьор се движат по улиците. Предстои роботизация в много сфери на икономиката. Ще изчезват професии, ще се появяват нови интелигентни роботизирани устройства – и за ежедневието и за различни индустрии. Трябва да сме готови! Това е нещо повече от поредния маркетинг шум около cloud, IoT и big data. Затова в СофтУни ще развиваме обучения, работни групи и know-how в сферата на интелигентните системи и машинното обучение. Очаквайте още курсове в тази сфера.

Сега в СофтУни стартираме начален курс по висша математика за програмисти (с практика на Python), след него идва и базов курс по Data Science, с повечко математика, статистика и практически занимания, продължаваме с machine learning курс в СофтУни, следван от Deep Learning курс, а някой ден защо не и за self-driving cars като обучения и специализации в #СофтУни.

Надявам се да ви хареса тази нова перспектива и визия за развитие на СофтУни за изграждане на по-сложни умения, отвъд писането на уеб приложения и мобилни апликации. Това, разбира се, не означава, че спираме обученията за начинаещи. Напротив, ще развиваме и начални курсове и курсове за деца и ученици, и обучения извън програмирането, и извън София, но ще добавяме и по-сложни специализации, за да посрещнем образователните нужди на бъдещето и идващите нови технологии.

Comments (14)

14 Responses to “За математиката в програмирането и дали ни трябва наистина: математика, статистика, data science и machine learning @ СофтУни”

  1. says:

    Успех!

  2. Djambov says:

    Супер ! Ще очкаваме още курсове.

  3. nakov says:

    Май трябва да направя едно уточнение: какво наричам тежки математики. За мен тежките (и излишни за средно-статистическия читав програмист) математики са всичките там диференциални уравнения, диференциални геометрии, равнини, пространства и т.н. Те са само за част от хората, които имат желание и сили да се занимават с research и да решават по-сложни проблеми от обичайните в разработката на приложен софтуер.

    От друга страна, логическо мислене, бройни системи, базови алгоритми като търсене, сортиране и логически задачи, съвсем начална статистика, алгебра и геометрия (имам предвид на училищно ниво) са добра основа на един програмист и помагат за развиване на алгоритмично мислене и problem solving skills.

    Аз лично никога не съм бил силен математик, обаче съм бил #1 десетки пъти по ученическите състезания и олимпиади по програмиране. Ето ви прекрасно доказателство, че не е нужно да си силен математик, за да си топ в програмирането.

    Веднъж спорихме цяла вечер с проф. Krassimir Manev по темата дали трябва програмистите да се учат тежки математики и стигнахме до извода, че аз съм математик, защото логически формулирам твърдения и си ги защитавам аргументирано. Оказа се, че според мен аз не съм математик, а според него съм. В крайна сметка се съгласихме, че аз имам математическо (алгоритмично) мислене и че това проф. Манев го нарича математика, а аз го наричам логическо мислене. Разминаване в терминологията.

    В училище имах 6 по математика, понякога 5. Не съм бил двойкаджия, но не съм бил и много силен, може би средна сила в моя клас. Обаче си влагах времето в програмиране и дистигнах доста прилично световно ниво. И тогава, и сега, не се считам за добър математик.

    И така, за всички спорещи: Обърнете внимание на дефинициите. Какво наричаме математика, защото иначе спорът става безкраен и всички са прави едновременно.

    Да, ако логическото мислене е математика, значи тя е абсолютно задължителна за всеки програмист и в #СофтУни учим всеки ден здраво математика.

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

    И двете са верни едновременно.

  4. Jonathan says:

    Съгласен съм. Ако обучението по програмиране се започне със скучни, сухи теореми, интеграли и прочие, на много хора ще им дотъпее и ще се откажат. Трябва практика и кодене, трябва на студентите да им е интересно да творят код, който работи и да го подобряват. В моя университет, специалност КСТ 2 години ме занимаваха с всевъзможни глупости – теоретични електротехники, висши математики и какво ли още не. Бях на прага да се откажа. Вече съм програмист от 4 години и не ми се е налагало да ползвам тези глупости нито веднъж.

  5. Супер готина статия, евала!
    Мислех, че съм единственият човек, които мисли по този начин. 🙂

  6. Боян Михайлов says:

    Много благодаря за статията! За подхода “от практика към теория” съм абсолюто съгласен и за съжаление в България ще трябва още много път да се измине! Нещо, което на запад е отдавна усвоено.

    По въпросът с математиката – няма как един програмист да мине без никаква математика и без логическо мислене. Също така няма как един съвременен математик да мине без програмиране. Но това не прави програмиста математик, нито математика – програмист. Двете дисциплини се ползват една от друга.

    Въпросът е от каква практическа и теоретична подготовка се нуждае всеки конкретен специалист в дадена област. Очевидно човек не може и не трябва да учи всичко. В този смисъл една учебна програма, която слага всички студенти под общ знаменател е пагубна за професионалното им развитие, защото не отчита различията. Затова за програмистите трябва да има базови математически познания и специализирани математически курсове, за онези, които имат нужда от тях.

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

    Най-големият недъг на висшето образование в България е, че по никакъв начин не е ориентирано към бъдещата професия на студента и не го учи достатъчно на практически умения. Той излиза от съответното ВУЗ с взети изпити, огромен по обем преподаван материал и почти нулеви умения по прилагане на наученото. Ако придобие някакви умения, то те не са от ВУЗ.

    На запад отдавна се прави разлика между практически насочени курсове и по-теоретични курсове, в зависимост от това дали един студент има желание да прави кариера като професионалист или научен работник. И двата типа програми се предлагат в едно и също учебно заведение. Съответните програми в добрите ВУЗ-ове са различни за двете категории и се оставя правото на студента да избере. Но и в двете направления има и теоретични и практически курсове, но в различен процент. В българските ВУЗ-ове има 5% практически курсове и 95% теоретични. Целта не е да се премахнат всички висши математики за програмистите, а да се остави най-ценната част и да се добави още толкова практика по писане на реален софтуер!

  7. Боян Михайлов says:

    Jonathan, “теоретични електротехники, висши математики и какво ли още не” не са “глупости”, ако трябва да програмираш система за изчисление на елекронни схеми или да напишеш програма за прогнозиране на пазара.

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

    Добре е да слагаме каруцата зад коня, но да не я откачаме от коня, защото коня няма да има какво да дърпа. Още по-важно е с какво ще пълним каруцата.

  8. Niko says:

    Много благодаря за хубавата и изчерпателна статия.

  9. Томас says:

    Здравейте на всички не знам кой да попитам, имам въпрос, аз съм двойкаджия в уч-ще, мога ли да изучавам програмиране или нещо от сорта на системен-мрежов администратор?

    • nakov says:

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

  10. VilAn says:

    Здравейте. Имам някои въпроси. От около месец изучавам html и css ,като ги усвоих добре за начинаещ, който преди това се е занимавал само с Pascal и то по не достатъчно добър начин. Сега тепърва започвам с JavaScript, но на по-сложните проверки с условни конструкции се затруднявам и разбирам идеята/логиката на проблема, но не мога да го изпиша правилно като код. Възможно ли е да опитам да уча C++ или C#, без да съм наясно с JS? И значи ли това, че все още ми е трудно с JS(уча го от няколко дни), че няма да мога да го науча?

    • nakov says:

      Научи се да програмираш. Езикът няма значение. От това, което пишеш, си личи, че фокусираш върху езици за програмиране, а не върху концепции (програмна логика, решаване на проблеми, структури данни, алгоритми).

      Най-добрият път да станеш добър софтуерен инженер, е да се запишеш в СофтУни (https://softuni.bg/apply) и да отделиш поне година време, в което да програмираш всеки ден. Под надзора на инструктори с опит, ако отделиш поне по 4 часа на ден, ще имаш силен старт.

      Предупреждавам, че ученето е от теб и изисква сериозно усилие, продължително време. От СофтУни е воденето за ръка, но не можем да наливаме знания и умения без сериозни усилия от твоя страна.

  11. Иван says:

    Здравейте

    По въпроса дали трябва да се учи Математика?

    Отговорът е Да

    Ако не учиш Математика как ще събереш две Променливи А+В/2

    Е нали тая формула се използва при метода Binary search

    И после трябва да напишеш Имплементация като Функция

    Пак има събиране (int a + int b /2)

RSS feed for comments on this post. TrackBack URL

LEAVE A COMMENT