Защо Java (като език за обучение) суче?

~ 15 Dec 2009, 04:35

Днес във ФМИ, освен много интересния семинар по рейтрейсинг, организиран от 3-ма български докторанта на университета в Саарбрюкен, и техния мастит професор Филип Слусалек, имаше и една среща с професора - в заседателната зала (онази, голямата, с готините маси). Преди семинара, проф. Слусалек ни разказваше най-различни неща, свързани с образованието. Две от тях наистина ми направиха впечатление. Смятах отдавна да пиша по въпроса тук, но днешната среща с професора ми даде стартова тяга.

Разказвайки за техния подход към образованието на Computer Science студентите си, той започна с това, че първия семестър, лекциите по програмиране се водят на Scheme.

Scheme? Wtf?!? Окей, това не е нова идея, и в MIT е така - но все пак в MIT отива половината гняс от международните състезания по информатика и математика, така че там новаци тъй или иначе няма. И на Brainfuck да ги учеха, нямаше да е голям проблем.

Но все пак. Scheme? Saarland? Самият професор призна, че част от първокурсниците идват с малко (или никакви) умения в програмирането, но изтъкна че...

"но, разбирате ли, част от идващите са доста добри програмисти, хакери, така да ги наречем. Те са много над нивото на останалите. И подронват авторитета на преподаващите, знаейки толкова много. Scheme им помага да охладят страстите си и ги поставя на едно ниво с новаците. Хакерите, ако и да са страшни в C++ или Perl или Bash, често не са и чували за Scheme..."

Тази част ми хареса. Наистина действа отрезвяващо на човек, научил един език до съвършенство, мислещ, че знае всичко, да му се докаже нагледно колко не е прав!
По-нататък професора спомена, че следващия семестър се водят курсове по практическо програмиране, което преди се е водело на C++, но сега минали на Java, и изрази съжалението си от този факт. Java-та не бил толкова добър език за обучение, не бил достатъчно close-to-the-metal и прочее.

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

За да не се задълбавам в детайлен анализ по този въпрос, ви препоръчвам да прочетете прекрасната статия на Joel Spolski, където той е описал нещата много по-добре, отколкото аз мога. Тук ще илюстрирам само основните му точки и ще допълня малко мои възгледи.

Относно първия недостатък - простотата: идеята на един университет е да оцени и отсее добрите студенти от ... кхм.. не толкова добрите. На една програма по информатика, целта е да отсее истинските програмисти от посредствените. В тази насока, един гаден, гнусен, труден, и въобще - ужасен език, като C++, играе ролята на много добър филтър: човек, който се забатачи с указателите и не може да изкове една прилична имплементация на едносвързан списък (без memory leaks при това!) явно не го бива много-много, така или иначе. Такъв човек не трябва да завършва университета.

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

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

Окей де, но кой наистина на практика, в бизнеса, си играе да пише индексни дървета и хеш таблици? И защо изобщо е да се учат някакви излишни неща, при положение, че не са нужни в работата? Така стигаме и до третия въпрос, които искам да засегна: има една немалка група студенти във ФМИ, които непрекъснато мрънкат, че езиците и технологиите, които се изучават, са безнадеждно остарели, и че преподавателите като цяло са много назад с материала. Не може ли, вместо всичките тези излишни курсове по диференциални уравнения (примерно), да се пусне нещо наистина полезно, като C# .NET или Flash или JavaScript или ... и т.н. Тази група не се пресича непременно с другата (с посредствените програмисти), но истината е, че ако човек просто иска да иде някъде, където да научи най-новите технологии, с които после да бачка и да кърти големите пари, то мястото му не е в университета. Един практически курс по .NET отнема 6 месеца на един сериозен човек и струва по-малко (от финансова и времева гледна точка) от 4-те години Компютърни Науки във ФМИ примерно. Хората, които искат да са в индустрията, просто трябва да си отидат в академията на Наков и да приключат с въпроса.

Университетът не е развъдник на програмисти, които индустрията да консумира. Университетът не e подчинен на индустрията въобще. Последната винаги ще се оплаква, че няма достатъчно кадри, и, че "абе не можете ли тея деца да ги учите на нещо по-смислено, ами трябва като идват при нас да ги почваме от нулата". Но наистина, университетът не е роб на желанията на индустрията. Той е институция, която цели да изгради определен начин на мислене във възпитаниците си (с което ФМИ се справя, в голямата си част, добре), и да се занимава с ресърч (където, трябва да признаем, нещата не са толкова добре, но се правят опити). Нормално е да няма много допирни точки с индустрията.

Но, наистина, постоянните оплаквания и сополи от това колко труден е C++* най-накрая са постигнали съмнителната цел да се мине на Java, защото, хей, за доста хора C/C++ наистина се оказа филтърът, който ги спря във втори курс. И после избягаха да работят на Java или C# някъде, където просто плащат добре, ползват най-новите технологии, вадят си сертификатчета и са куул. А истината е, че един добър програмист може да научи даден нов език за съвсем кратко време, след като има основата и модела в главата си. И няма значение дали е C++ guru, който отива в Java средата или обратно - ако е добър, няма значение. Ако е посредствен, то ще е истинско мъчение.

Резултатът от Javaризацията на ФМИ вече си личи дори при моите студенти. Не една или две работи вече проверявам, при които, в най-вътрешния цикъл на алгоритъма, студентът смело създава 3D вектора, който трябва да се върне като резултат, като го заделя на heap-а! Дори на човек с базова школовка по ръчен memory management веднага ще му светне червената лампа в главата, че липсва съответния delete. Но това, че генерират брутален memory leak, явно въобще не ги притеснява, защото при тях се оказва, че паметта стига. Щеше ми се да не стигаше.

--
* тук наистина не се хващайте за езика: със същия успех може да дадете за пример C или Pascal - и в двата си имате ръчен memory management и може да си оплетете каквато каша си поискате с указателите.



Коментари:

#1 от Коцето, изпратено на 14 Jan 2010, 15:43


Напълно подкрепям!


#2 от vedara, изпратено на 12 Apr 2010, 00:44


Много добре казано Адаш :) Колкото по-трудно е нещо толкова по-голяма опитност носи.


#3 от Paco, изпратено на 8 May 2014, 17:12


Виждам на къде биеш, но C++ е възможно най-лошия избор за университета - по лош и от Java. Ако ще "пипаш метала" и ще си играеш с указатели имаш ANSI C - чиста концепция, езика не претендира за повече от това за което е замислен и в създаването му е вложен достатъчно здрав разум. C++ от гледна точка на дизайн на езика е едно огромно недоразумение. Кофа пълна с несъвместими и недомислени "features". Интересното е, че се вкарват в стандарта нови такива, които patch-ват бъговете сътворени от предишен "feature". C++ е блато, в което може да затъне всеки - езикът е изключително сложен (повече от 80 служебни думи), грешки се виждат доста трудно. Никакъв филтър не е и не е особено умно да набиеш 10 000+ часа в това да преодоляваш недостатъците на езика. По добре да хвърлиш това време в нещо смислено, като например алгоритми, математика, или фундамент от който има смисъл.


#4 от Paco, изпратено на 8 May 2014, 17:18


P.S.

Съжалявам, изглежда се хванах за езика :D
Но просто "C++ is wrong". И наистина има хора, които си мислят, че програмирането е борба с прасета в кална локва, точно заради интеракция със C++ в университета.


#5 от anrieff, изпратено на 9 May 2014, 19:41


Дали?

C++ са успели да научат ужасно много хора. И да го ползват ужасно добре (справка - произволно състезание по програмиране).
Дали е добър като филтър - според мен е идеален. Има много системи, проекти и библиотеки в света, които са страхотна каша, често по-лоша от C++ като език. На какво са писани тези каши е без значение. Та ако научаването на C++ (поне до ниво за вземане изпитите) е способно да откаже един студент, то той не е подготвен за реалния живот като програмист. Пък дори и Java такъв.

В продължение на горното, ако някой си мисли, че в живота ще си намери работа, където ползват само езици с добър дизайн, библиотеки с добър дизайн и кодът, по който ще работят, ще е с добър дизайн - чистосърдечно му пожелавам успех. Казвам го като човек, който е работил в Google (па макар и за малко).


#6 от anrieff, изпратено на 9 May 2014, 19:46


В допълнение, програмирането наистина *е* борба с прасета в кална локва (по принцип). Личното ми мнение е, че който си мисли обратното, е идеалист без достатъчно опит.




Име:
За връзка: (Линк към вашия блог/сайт/e-mail; незадължително)
Вашият коментар:

Сметнете израза: шeстдеc и двe минус cедeмдecет и две = (въведи с цифри)


<<

Valid XHTML 1.0 Strict