За математиката в програмирането и дали ни трябва наистина: математика, статистика, data science и machine learning @ СофтУни
С голямо задоволство обявявам, че в СофтУни вече се преподава математика. Включваме сред избирателните курсове изучаване на приложна математика, алгебра, анализ, вероятности, статистика, числени методи и математически софтуерни инструменти, приложения, платформи и библиотеки за прилагане на математически модели, сложни алгоритми и изчислителни подходи в реални практически задачи и проекти от ИТ индустрията.
СофтУни, математика и програмиране
Трябва ли един програмист да знае математика? Математика и програмиране – свързани ли са? Трябва ли да си добър математик, за да станеш програмист? Ако си добър математик, ще станеш ли добър програмист? Постоянно ме питат такива въпроси и постоянно им отговарям, че не е задължително да си добър математик, за да станеш добър програмист и аз самия съм отлично доказателство за това.
В СофтУни винаги сме давали качествено образование, ориентирано към практиката. Винаги сме изграждали директно приложими в практиката умения, а не празни теории. Винаги сме давали реални знания, практически умения и компетенции, които се търсят на пазара на труда и са актуални спрямо съвременния свят.
В началото СофтУни започна като алтернатива на държавното ИТ образование, изградена върху парадигмата “учене чрез правене“, с много практика и изграждане на реални умения, които работодателите търсят. За повечето фирми по-важни се оказаха конкретни езици за програмиране и софтуерни технологии (като 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 като обучения и специализации в #СофтУни.
Надявам се да ви хареса тази нова перспектива и визия за развитие на СофтУни за изграждане на по-сложни умения, отвъд писането на уеб приложения и мобилни апликации. Това, разбира се, не означава, че спираме обученията за начинаещи. Напротив, ще развиваме и начални курсове и курсове за деца и ученици, и обучения извън програмирането, и извън София, но ще добавяме и по-сложни специализации, за да посрещнем образователните нужди на бъдещето и идващите нови технологии.
14 Responses to “За математиката в програмирането и дали ни трябва наистина: математика, статистика, data science и machine learning @ СофтУни”
Успех!
Супер ! Ще очкаваме още курсове.
Май трябва да направя едно уточнение: какво наричам тежки математики. За мен тежките (и излишни за средно-статистическия читав програмист) математики са всичките там диференциални уравнения, диференциални геометрии, равнини, пространства и т.н. Те са само за част от хората, които имат желание и сили да се занимават с research и да решават по-сложни проблеми от обичайните в разработката на приложен софтуер.
От друга страна, логическо мислене, бройни системи, базови алгоритми като търсене, сортиране и логически задачи, съвсем начална статистика, алгебра и геометрия (имам предвид на училищно ниво) са добра основа на един програмист и помагат за развиване на алгоритмично мислене и problem solving skills.
Аз лично никога не съм бил силен математик, обаче съм бил #1 десетки пъти по ученическите състезания и олимпиади по програмиране. Ето ви прекрасно доказателство, че не е нужно да си силен математик, за да си топ в програмирането.
Веднъж спорихме цяла вечер с проф. Krassimir Manev по темата дали трябва програмистите да се учат тежки математики и стигнахме до извода, че аз съм математик, защото логически формулирам твърдения и си ги защитавам аргументирано. Оказа се, че според мен аз не съм математик, а според него съм. В крайна сметка се съгласихме, че аз имам математическо (алгоритмично) мислене и че това проф. Манев го нарича математика, а аз го наричам логическо мислене. Разминаване в терминологията.
В училище имах 6 по математика, понякога 5. Не съм бил двойкаджия, но не съм бил и много силен, може би средна сила в моя клас. Обаче си влагах времето в програмиране и дистигнах доста прилично световно ниво. И тогава, и сега, не се считам за добър математик.
И така, за всички спорещи: Обърнете внимание на дефинициите. Какво наричаме математика, защото иначе спорът става безкраен и всички са прави едновременно.
Да, ако логическото мислене е математика, значи тя е абсолютно задължителна за всеки програмист и в #СофтУни учим всеки ден здраво математика.
И не, математиката (диференциални уравнения и нелинейни пространства) са излишни за един добър софтуерен инженер, освен при много специфични проекти.
И двете са верни едновременно.
Съгласен съм. Ако обучението по програмиране се започне със скучни, сухи теореми, интеграли и прочие, на много хора ще им дотъпее и ще се откажат. Трябва практика и кодене, трябва на студентите да им е интересно да творят код, който работи и да го подобряват. В моя университет, специалност КСТ 2 години ме занимаваха с всевъзможни глупости – теоретични електротехники, висши математики и какво ли още не. Бях на прага да се откажа. Вече съм програмист от 4 години и не ми се е налагало да ползвам тези глупости нито веднъж.
[…] Source: Nakov За математиката в програмирането и дали ни трябва наис… […]
Супер готина статия, евала!
Мислех, че съм единственият човек, които мисли по този начин. 🙂
Много благодаря за статията! За подхода “от практика към теория” съм абсолюто съгласен и за съжаление в България ще трябва още много път да се измине! Нещо, което на запад е отдавна усвоено.
По въпросът с математиката – няма как един програмист да мине без никаква математика и без логическо мислене. Също така няма как един съвременен математик да мине без програмиране. Но това не прави програмиста математик, нито математика – програмист. Двете дисциплини се ползват една от друга.
Въпросът е от каква практическа и теоретична подготовка се нуждае всеки конкретен специалист в дадена област. Очевидно човек не може и не трябва да учи всичко. В този смисъл една учебна програма, която слага всички студенти под общ знаменател е пагубна за професионалното им развитие, защото не отчита различията. Затова за програмистите трябва да има базови математически познания и специализирани математически курсове, за онези, които имат нужда от тях.
Когато говорим за университетско образование от бакалавър нагоре, то тук би трябвало да съществува голяма диференциация – както в теорията, така и в практиката. Когато говорим за образование до ниво бакалавър, то един студент трябва да може практически да прилага всичко, което е научил на теория!
Най-големият недъг на висшето образование в България е, че по никакъв начин не е ориентирано към бъдещата професия на студента и не го учи достатъчно на практически умения. Той излиза от съответното ВУЗ с взети изпити, огромен по обем преподаван материал и почти нулеви умения по прилагане на наученото. Ако придобие някакви умения, то те не са от ВУЗ.
На запад отдавна се прави разлика между практически насочени курсове и по-теоретични курсове, в зависимост от това дали един студент има желание да прави кариера като професионалист или научен работник. И двата типа програми се предлагат в едно и също учебно заведение. Съответните програми в добрите ВУЗ-ове са различни за двете категории и се оставя правото на студента да избере. Но и в двете направления има и теоретични и практически курсове, но в различен процент. В българските ВУЗ-ове има 5% практически курсове и 95% теоретични. Целта не е да се премахнат всички висши математики за програмистите, а да се остави най-ценната част и да се добави още толкова практика по писане на реален софтуер!
Jonathan, “теоретични електротехники, висши математики и какво ли още не” не са “глупости”, ако трябва да програмираш система за изчисление на елекронни схеми или да напишеш програма за прогнозиране на пазара.
Проблемът е в това, че се започва с тези предмети, които са далеч от практическото програмиране. Но те биха били ценна придобивка за някой, който две години се е учил да пише качествен програмен код и би искал да специализира след това.
Добре е да слагаме каруцата зад коня, но да не я откачаме от коня, защото коня няма да има какво да дърпа. Още по-важно е с какво ще пълним каруцата.
Много благодаря за хубавата и изчерпателна статия.
Здравейте на всички не знам кой да попитам, имам въпрос, аз съм двойкаджия в уч-ще, мога ли да изучавам програмиране или нещо от сорта на системен-мрежов администратор?
Може, няма проблем, стига двойките в училище да са заради липса на интерес или мотивация, а не заради липса на акъл. При втория случай програмирането не е за теб.
Здравейте. Имам някои въпроси. От около месец изучавам html и css ,като ги усвоих добре за начинаещ, който преди това се е занимавал само с Pascal и то по не достатъчно добър начин. Сега тепърва започвам с JavaScript, но на по-сложните проверки с условни конструкции се затруднявам и разбирам идеята/логиката на проблема, но не мога да го изпиша правилно като код. Възможно ли е да опитам да уча C++ или C#, без да съм наясно с JS? И значи ли това, че все още ми е трудно с JS(уча го от няколко дни), че няма да мога да го науча?
Научи се да програмираш. Езикът няма значение. От това, което пишеш, си личи, че фокусираш върху езици за програмиране, а не върху концепции (програмна логика, решаване на проблеми, структури данни, алгоритми).
Най-добрият път да станеш добър софтуерен инженер, е да се запишеш в СофтУни (https://softuni.bg/apply) и да отделиш поне година време, в което да програмираш всеки ден. Под надзора на инструктори с опит, ако отделиш поне по 4 часа на ден, ще имаш силен старт.
Предупреждавам, че ученето е от теб и изисква сериозно усилие, продължително време. От СофтУни е воденето за ръка, но не можем да наливаме знания и умения без сериозни усилия от твоя страна.
Здравейте
По въпроса дали трябва да се учи Математика?
Отговорът е Да
Ако не учиш Математика как ще събереш две Променливи А+В/2
Е нали тая формула се използва при метода Binary search
И после трябва да напишеш Имплементация като Функция
Пак има събиране (int a + int b /2)