Ну Платон и Кант — это далеко не самое сложное в философии, Платон так вообще самые начала, вот если бы вы там обсуждали Ильина или Гегель с каким-нибудь Бодийяром (правильно написал?).
И интерес к филосфии вполне себе вписывается в этот возраст, т.к. в мозгу уже активно формируются это самое абстрактное мышление и естественно интересначинает проявляться, он обнаруживает что иногда у него получается прослеживать крутые штуки, которые неочевидны и начинает кагбэ прощупывать, но глубина понимания и успешность небольшие. Полноценно оперировать абстракциям мозг реально учится только к 17 годам — особенно такие эпохи развития мозга хорошо заметны когда ведешь дневники и по всякому документируешь свою деятельность.
Я вот например простенькие диффуры умел считать еще в 11 классе, но только в универе смог въехать в то какая офигенная штука производная и интеграл, и какая у них связь с физикой и природными процессами. Еще и в процессе обучения осознал шо представление о физических законах, да и о программировании тоже — были зачастую неправильными.
Ну и повторюсь — развитие все же несколько индвидуально.
А теперь представьте детей, которые по Коломогоровскому учебнику геометрии изучают в 7-ом классе понятие конгруэнтности. Самое главное, с точки зрения правильной подачи материала этот учебник был составлен очень хорошо, но оказался полным фейлом в качестве школьного. Та же участь постигла учебники по физике старый Кондартьева и новый Громова — физика там была представлена достаточно корректно (и я бы не сказал, что сложно, учебники как учебники), но в итоге и дети, и учителя его не любили, зато старый Мякишев и Буховцев или Перышкина все любят, хотя тот же Перышкин вообще ниачем.
В общем к абстракциям надо приучать постепенно, но как основной тем в обучения — только для вузов.
Ну к слову сказать современный Паскаль, т.е. Дельфи/Лазарус — все необходимое имеет, и работу с простой графикой, и с базами данных, и со строками там все нормально, я даже более того скажу — с паскалевскими строками все куда лучше, чем сишными. В общем все там у Паскаля с этим нормально.
Если же говорить об обучении (откровенно говоря и об разработке тоже) — то Паскаль в этом плане на голову выше всех этих Пухтонов и прочих мусорных JS — строгий синтаксис дисциплинирует и уменьшает вероятность ашипки (а это очень важно в начале обучения! Так шо Си тоже не особо прокатывает, разгребать дампы памяти даже за деньги не очень хочется). Говнокод конечно можно и на Паскале писать, но на Пухтоне говнокод пишется автоматически, если за него садится программист с плохой самодисциплиной (т.е. 99% всех программистов и и 99.9% школьников), собственно хваленные пухтоновские библиотеки состоят из говнокода более чем полностью. Я таки языки называю мусорными — вроде как на них писать легко, приятно и быстро, но все что сложнее пятистрочного скрипта превращает в спагетти. И да, меня всегда умиляло, что на ОО языке — Пухтоне, 99% программ написано в чисто процедурном стиле.
Если же Паскаль не нравится, то есть альтернатива — мейнстримовые энтерпрайз языки: Java и C# — в них в принципе также можно писать как душе угодно, но они все же имеют достаточно строгий и формализованный синтаксис и целую рекомендаций и соглашений. А самое главное эти языки дуракоустойчивые (C# все же более дуракоустойчивый чем Java. все же в последней куда проще несознательно вступить в тот же boxing/unboxing, например). А еще по ним очень много копипасты на всяких стековерфлоу — в общим учится им намного проще и эффективнее.
Так вот, это была катастрофическая тоска — решим уравнение методом Ньютона, а теперь давайте попробуем деление пополам, а теперь бонус: метод Гаусса системы решения линейных уравнений! Давайте всё-таки идти в ногу со временем.
Хз, по мне так это самое главное. Я когда в школе узнал, что есть такой метод Гаусса и компьютер можно начить решать системы уравнений — был счастлив и тут же запил (ну на самом деле не тут же — это было долго и мучительно). Знайте как круто решать домашку, когда компьютер уже посчитал все и выдал ответ. Вообще к 11 классу физику, математику и частично радиолюбительство получилось автоматизировать написанием собственных программок. Вот геометрия оказалась в пролете — она кончилась раньше чем стали появляться вумные мысли в голове, да и вообще компьютерная геометрия адок еще тот. С тех пор у меня и развилась мания всю симулячить на компе, а сейчас уже проще решать обратные задачи и строить всякие регрессии, чем выучивать формулы и законы.
Тем более все эти Ньютоны и наискорейшие спуски — то собственно для чего компы создавались и то что приносит реальную пользу. Задачи оптимизации — это именно то, что позволяет нам летать, разговаривать по телефону и смотреть картинки с котиками. Опять таки тут вопрос правильной демонстрации и она решаема. Другое дело, что всему свое время, ну вот для первого курса: метод Ньютона, касательных и Гаусса ИМХО должен реализовываться каждым студентом, параллельно с высшей математикой.
Это вот такая избирательность памяти.
Вообще, как мне объясняли на пальцах — изначально когда человек рождается, у него связей в мозгу ну просто дофига. В дальнейшем дети все впитывают все как губка, вообще максимальная обучаемость у людей до подросткового периода.
Проблема только в том, что в этот период отделы и функции мозга мозга только формируются, например, формирование мелкой моторики завершается только к 9-10 годам. Речь окончательно формируется к 6 годам, а общая моторика к 4. Префронтовая кора (рассудительность) заканчивает свое формирование только к 13-14 годам.
Вот только дело в том, что процесс обучения завязан на положительном подкреплении, а там процесс сложный, но в общем виде так: что лучше и приятнее тренируется, то и продолжает тренироваться и тут очень большое влияние оказывает эмоциональное состояние и получение быстрого и ощутимого эффекта. Поэтому стихи Пушкина вспомнят единицы — а матерные частушки будут знать все. В дальнейшем (всю жизнь) мозг и дальше будет выкидывать все что считает малополезным и закреплять то, что он посчитает нужным: не так уж и много у человека нейронов… а вот у кита дофига и он может позволить себе хранить в памяти рельеф мирового океана. И как раз в подростковом возрасте с 14-15 лет, начинается тотальнейшая перестройка — все лишнее просто убирается, то что получалось лучше всего — наоборот усиливается. В общем начинается процесс специализации, который длится до 17-20 лет (вообще точный период у разных людей разный).
И только после того как специализация из-за прореживания завершится — формируется абстрактное мышление, собственно только к 17-18 годам они учатся полноценно планировать и оценивать риски, оперировать сложными вещами в голове.
И к 20-21 году заканчивается формимидирование высших психических функций.
Т.е. реально до 17 лет давать абстрактные вещи бесполезно — мозг их просто плохо воспринимает, а когда начинается большая чистка — все что плохо понималось выкидывается на свалку. Ну а до 21 года бесполезно давать полностью самостоятельные и очень ответственные задания.
А самое главное — что бы какие-то знания закрепить и не потерять во время большой чистки — необходимо что бы отдача от них была моментальная и ощутимая, т.к. до 17 лет человеки еще не умеют строить далеко идущих прогнозов. Именно поэтому, например, навыки письма и арифметики у всех людей одинаково хорошо закрепляются — ну тупо потому что как сразу им начинают учить, ими тут же начинают пользоваться, просто на бытовом уровне человеку приходится постоянно считать и писать + по другим предметам надо делать тоже самое. А вот с геометрией уже ж0па начинается — слишком много абстракций, которые еще юные котелки плохо переваривают, но посчитать площадь квартиры в итоге все равно сможет каждый (опять таки — это практический навык), но большинство теорем никто и не вспомнит и не сможет доказать (хотя в школе могли доказывать). Тоже с навыками труда и даже с частью физики — т.к. с физикой мы на интуитивном уровне взаимодействуем, но только с частью: ядерную физику никто не вспомнит и даже после универа человек будет свято верить что Эйнштейн всех обманул, а мериканцы не высаживались на Луне. А вот со всякими химиями, биологиями и историями — кому как повезет. Если пол детства провел за пестиками и тычинками, коллекционируя гербарии, то что-то может и останется, но таких мало и естественно большинство не вспомнит сразу (вот прям сразу) после школы что такое эукариоты и прокариоты, а для людей в 40 лет может оказаться настоящим открытием, что вирусные заболевания антибиотиками не лечат, а гомеопатия — обман.
Потом-то, начиная с 20-и летнего возраста, конечно, человек сможет осваивать новые и более сложные знания самостоятельно и восполнять пробелы в знаниях. Проблема вот только в том, что специализация мозга уже давно закончилась и в некоторых областях человек оказывается в пролете. В принципе тут ничего плохого, но хренова бывает тогда, когда человек оказывается в пролете с основными навыками и программирование на самом деле — это вторая грамотность. А хваленая советская и нынешняя постсоветская система образования — мягко говоря положительному подкреплению не способствует + нездоровая атмосфера в учительском корпусе. В итоге в универе народ начинает учится заново.
Начинается все со счетных палочек и фигурок -то что дети могут пощупать ручками, пересчитать и убедиться.
Затем идут циферки и как ими офигенно отражать число палочек на бумаге, а уж затем правила столбиком (и все равно возвращаются к палочкам) и так далее.
Я собственно недавно смотрел учебники по математике для младших школьников: там все по прежнему идут яблоки и арбузы.
В общем связь с тем что можно пощупать — прямая. В более старших классах начинаются тоже приближенные к IRL задачки: типа поезд выехал из точки А в точку Б или 3.5 землекопа копали яму… и т.д.
Хотя с формальной точки зрения надо начинать с теории множеств, формальной логики, теории групп, топологии пространства, теории чисел и прочий дельта-эпсилон формализм с производными и интегралами. Но даже в универах так не делают (страшно, епты!)… хотя есть люди, которые считают, что это надо в школе проходить, шоб чувак пришел и начал с первого курса изучать всякие гомологии и дифференциальные геометрии, а уж потом можно и арифметикой позаниматься %-)
А разве сочинения не имеют практического смысла? Нпр., обсуждаемая статья? ;)
Вот кстати с сочинениями не надо. Большинство и после школы пишут абсолютный трешак (впрочем, научные и деловые статьи писать все же проще).
А самое главное — вечная школьная драма: сочинения написанные по шаблону получают хорошие оценки, выражение собственного мнения — может жестоко караться, даже если у школьника реальный художественный талант.
Ы общем сочинениями и их критикой в школе туговато. Вот более официальные вещи — типа докладов и рефератов все же проще написать и оценить.
Классы хорошо заходят на геометрических задачках. Прямоугольники, квадраты, круги. Объяснение на всяких алгоритмах с решетами еще не пробовал, но предполагаю, что будет черезчур сложно.
Ну обычно да. Еще столы, стулья, доски. Но круги квадраты все же хотелось бы тоже давать не в абстрактном виде, а как-то сразу с точки зрения компьютерной геометрии.
На самом деле ИМХО ООП лучше всего заходит с задачами где надо оперировать реальными сущностями — например, полет снаряда, брошенного под углом к горизонту, робот в лабиринте и т.д…
Другая проблема — не всякое ООП и не в каждой задаче одинаково полезно — это вот очень тонкий момент кстати. Ну там смоделировать работу PID регулятора с какой-то штуковиной — легко, а вот например, моделировать динамику каких то частиц и под каждый атом частицы отводить свой класс — ну ИМХО это никакой компьютер не переварит.
IEnumerable можно на графиках (линейных, квадратичных) функций показывать. Но сначала желательно объяснять отличие списка и множества от массива.
Ну да. В общем тут много вариантов. Но вот на тему структур данных, бытует такое мнение, что единственная полезная структура данных — это массив, все остальное производные :-)
Лол, письменность? Вы чё шумеры штоле? На дворе 2017!!! Поди прогуливали телепатию в школе?)))
Ну вообще решето Эратосфена — это алгоритм для поиска всех простых чисел. Просты числа — если не в курсе, активно применяют в криптографии, кодировании и т.д. А еще с простыми числами есть ряд нерешенных проблем математики (например первая и вторая проблемы Ландау. проблема Гольдбаха и т.д.).
А теорема Пифагора… Вы как расстояние будите считать в прямоугольных координатах? Все, вся прикладная вычислительная графика и геометрия проходят мимо. Или решать Диофантово уравнение? Епс, да все задачи оптимизации, машинного обучения проходят мимо.
Хотите поновее? Ну в геометрии есть пространство Минковского — конец 19-го века. сумма Минковсокго вон используется в motion planing в робототехнике и играх. Но без теоремы Пифагора и прочих, даже с вазелином туда не пролезете.
Ну восхваляет кто-то фортран в 2017-м
А че его восхвалять? Например вот это написано на Фортране. Вот Фортрановски библиотеки при этом эти библиотеку лезут ну просто везде — практически в любой программе для численного моделирования и расчетов (естественно это не говноподелки на Пухтоне) торчит фортрановский код и библиотеки. Для HPC у Фортрана только одна альтернатива — Си, хотя недавно туда пробилась Julia. Так что, что его славить — его повсеместно используют, благодаря чему можно, например долететь на самолете из Москвы во Владивосток и неубиться…
Ну 3 урока, обычно 1 урок в неделю — 3 недели, впереди еще почти 2/3 четверти. Всего уроков в году — 35 минимум.
Информатика сейчас начинается 5 или 7 класса и длится до 11 класса. Минимальное общее число часов — вроде не менее 105 (я хз сколько точно), но даже когда я учился, у нас информатика с программированием за 350+ часов перевалила за 7-11 классы.
Времени вагон реально. За это время мы с одноклассникам успели накатать скролл-шутер (на Паскале, бладж) и нафигачить целую кучку маленьких программ на Delphi для всяких мелких расчетов (ну я вон нашлепал себе всякие говнопрограммки, для расчета цепей, чтоб ручками не считать) и покататься по школьным олимпиадам по программированию. Хочу сказать, что у многих компы дома появились вообще только после школы, максимум в старших классах (мне повезло, у меня Синклер на котором я игрался в Elite, Commando, Nether Earth, Arkanoid, Laser Squade).
Так что реально пройтись по всем вехам развития технологии программирования.
На самом деле между 14 и 20 годами большая часть связей в мозгу массово самоустраняется — это процесс который происходит у всех. Эдакое упрощение структуры мозга. Естественно, часть воспоминаний и знаний просто выветриваются (прежде всего те связи, которыми не пользуешься), что-то очень сильно фрагментируется, остается только минимальный набор самых востребованных связей, зато происходит резкий скачек в интеллекте, причем это не случайный процесс. Вообще такая оптимизация мозга кагбэ всю жизнь происходит, но именно в трубку 14-20 лет она самая масштабная и там реально часть навыков и знаний просто исчезает. По аналогии в ML введена такая техника как вербализация (прореживание) нейросетей.
Ну т.е. все эти заученные стишки просто растворятся и никогда ни на что не повиляют. Единственный плюс в этом, что задатки все же у всех разные: когда мы бьем по площадям больше вероятность того, что найдем что-то полезное, но переусердствовать здесь не стоит.
Хз, дети отлично умудряются самостоятельно собирать радиоприемники и передатчики, пользуясь таблицами, номограммами и упрощенными формулами, затем уже идут с первичными навыками обучаться на какую-нибудь радиотехнику, где уже углубляют свои знания и осваивают весь необходимый набор знаний для того что бы разрабатывать их самостоятельно и лучше.
Навыки то надо постоянно тренировать и чем раньше начать — тем лучше будет.
В противном случае, тогда встает вопрос, а нафига оно нужно программирование в школах, если нет задачи дать человеку навыки разработки программ? А алгоритмы он один фиг постигнет на дискретной математике той же, например, где их ему будут их подавать правильно и корректно уже… Ну если, конечно, пойдет учиться на погромиста.
Хз, дедушки-конструкторы спокойно проводили декомпозиции своих задач, когда еще чертили на кульманах, а программирование и алгоритмы был уделом горстки ученых.
Это общий инженерный навык. А вот умение работать за токарным станком — это уже частный и сугубо специфический навык. Ну дядя Вася-конструктор и дядя Петя-токарь умеют точить, но разработкой занимается только дядя Вася, и более того — станок с ЧПУ сделает обоих (вот только этот станок не обладает волшебным знанием — ему все равно потребуется оператор).
Знание разных алгоритмов и ЯП — это как знание молотка и киянка — оно полезно, но только вместе с умением их применять
Это уже вопрос архитектуры и методологии.
По идее все эти «решетки» можно вывести как методы одного статичного класса, но это будет иметь смысл, если есть другие более осмысленные классы (такой вот каламбур).
Т.е. если написать программу решетки Эратосфена, то это как мой самый первый пример: class Program с двумя методами, собственном main, где крутится логика программы и метод самого алгоритма Эратосфена.
Но как известно решеток несколько. Поэтому следующим этапом рассказываем как представить решетку в виде класса: сразу и инкапсуляция и наследование (например от IEnumerable). После этого по аналогии реализуем еще пару классов с другими алгоритмами и делаем программу, которая не просто что-то там считает, а сравнивает несколько алгоритмов. Дополнительно можно отнаследоваться от Эратосфена и изменить реализацию алгоритма (их несколько) — показать более эффективные: т.е. рассказываем о таких вещах как оптимизация, рассказываем что такое вычислительная сложность и наглядно демонстрируем, заодно знакомимся как организовывать иерархию похожих классов с помощью наследования.
Следом мы изучаем другие алгоритмы и расширяем прежнею программу: дабы не плодить сущностей — сводим эти решетки как методы в один статичный класс (а их старые классы ликвидируем), про который забываем и принимаемся за демонстрацию тех же пузырьков… и далее по нарастающей.
В итоге получаем:
1. Изучаем алгоритм Эратосфена
2. Показываем как можно по-другому структурировать программу и модернизируем её
3. Расширяем программу, добавляя аналогичные алгоритмы
4. Изучаем как это все работает, сравниваем, анализируем
5. Рассказываем об оптимизациях и вычислительных сложностях
6. Снов модифицируем программу и добавляем туда новые сущности
…
PROFIT!
Самое главное — наглядно демонстрирует итеративный процесс разработки, с постоянным улучшением и расширением программы. смотрим какие есть техники и попутно демонстрируем другие алгоритмы.
А просто написать программу «алгоритм Эратосфена»… ну я хз, это тупо. Более того, польза от этого алгоритма будет разве что тем кто занимается криптографией. Я вот занимаюсь математическим программирование уже дофигущу лет (смотря как считать, но 10+ уже наберется) и мне эти решетки понадобились всего пару раз — когда привлекали к задачам связанных с кодированием. Часто ли потребуется эта решетка людям, занимающимися более приземленными вещами?
А вот например всевозможные задачи на графах (например, обход графа) — встречаются ну просто постоянно, трудно наверное найти задачи где их нет. Еще конечные автоматы, задачи оптимизации и т.д. и т.д.
Т.е. я бы строил бы курс (вообще я уже такой строил) с целью, например, разработки программы где роботы ходят по клеточкам, потом ищут выход из лабиринта, потом взаимодействует друг с другом и т.д. Это наглядно, это интересно, а самое главное покрывает необходимым минимум алгоритмов, используемых на практике: там будут и деревья, и сортировки, и конечные автоматы, и задачи поиска пути, и оптимизации (например, задача коммирвояджера). Студентам заходит лучше, чем «а сегодня я вам расскажу про ещё одну олимпиадную задачку про паровозики», школьникам думаю тоже.
Есть еще один очень скользкий момент: изучение алгоритмов требует определнной математической подготовки, которая появляется не раньше университета. Поэтомы дети и младшекуры их тупо заучивают и обезъянничают. Если остановится именно на этом — то это будет бестолковое занятие. т.к. между извилинами ничего не отложиться. Поэтому в таких условиях лучше давать материал исходя из практического применения — так хотя бы начнет откладываться понимание куда и как это все добро можно вставить, а следом уже может появится интерес к тому, что бы подтянуть фундаментальные знания.
Автор статьи не прав в том, что нужно пичкать школьников алгоритмами. Не усвоятся они.
Да. Так и есть.
На самом деле к любому алгоритму можно прийти самостоятельно, если будет необходимость применить его.
Смотря к какому. Сортировку — да, а какой-нибудь non-dominated sorting genetic algorithm или TimberWolf 3.2 — это уже будет уровень научной работы, которую уже проделали лет 10-20 тому назад.
«Знание алгоритмов» тут всего лишь экономит время на поиск.
Не только. Это еще и влияет на эффективность полученного решения. Мой самый любимый пример — это то сколькими способами можно крутить матрицы — алгоритмов несколько (разложение Холецкого, LU-разложение, QR, SVD и т.д.), каждый со своим достоинствами и недостатками и лучше их использовать прицельно, т.к. заюзать SVD — это будет тотальный оверхеад в ряде практических задач: уж задач где основная матрица системы квадратная и невырожденная не меньше, чем задач где они прямоугольные и плохообусловленные.
Вон я недавно давал программисту (без опыта математического программирования) задание прикрутить метод иммитации отжига (Simulated Annealing), объяснив откуда и что копипастить (т.е. даже поиск минимизировал). Ну выполнение затянулось на 2 недели (хотя там работы было от силы максимум пара дней) — несколько дней ушло только на поиск ошибки где больше с меньше перепутал. Ну со временем — чаще выполняя такие задачи и почитывая на ходу соответствующую теорию — досадных ошибок станет меньше, такие задачи будут выполняться быстрее и эффективнее.
В общем всегда должна соблюдаться связка практики с теорией:
1. Если напихать максимум теории, то потерпим фейл — единицы смогут сообразить куда и как это можно вставить самостоятельно, у большинства же знания выветрятся — человек имеет особенность забывать то, чем не пользуется.
2. Если заниматься только практикой и учится исключительно на копипасте со StackOverflow, то на выходе получим шаманов и ремесленников, а не инженеров, которые будут каждый раз изобретать велосипед. Это кстати нынче очень актуальная проблема.
Обычные WinForms на GDI с этим с успехом справятся — всего 1000 строчек говнокода внутри формочки (естественно, если бы автор в школе учил ООП, а не сортировку пузырьком на Бейские, то кода было бы меньше, он был бы разборчивее и красивее). В современных энтерпрайз языках все уже из под коробки есть, того же WinChart выше крыше хватает
А так. умные люди из MIT придумали Scratch для обучения. Подтверждаю — младшие школьники на нем очень быстро въезжают и начинают даже что-то пытаться программировать. В это точно лучшая стартовая точка для самых маленьких.
Бесполезное занятие рассказывать про сортировку пузырьком, не показав как её можно использовать. Это даже на студентах тяжко прокатывает, а у школьников отличный иммунитет к обучению, упирающему на эрудицию, а не на прикладное применение.
Результат программирования — это программа, которая принимает от пользователя какие-то осмысленные входные данные и выдает такой же осмысленный результат. А алгоритмы, языки программирования и т.д. — это всего лишь инструмент и средство, а не цель. Если ими не уметь правильно пользоваться — то это мусорные знания.
А вот недавно мне надо было сделать симуляшку с анализом характеристик PID-регулятора… и могу сказать, что ООП вариант я накатал куда быстрее, чем чисто процедурный с векторами и бла-бла-бла.
Смотря откуда приплыли, если до этого были многие года процедурного программирования 60-ых годов или вообще из области системного программирования, то врубиться будет трудно. Еще бывает трудно переключаться с C++ на C#, т.к. ООП в них все таки разные.
А вот если с нуля или обратно — никаких проблем. Я вот например после беглого знакомства с Turbo Pascal почти сразу спрыгнул в Object Pascal/Delphi по причине отсутствия в TP динамических массивов — и объекты зашли очень быстрой (собственно и в TP я самого начала рекорды начал использовать). А оттуда без особых проблем спрыгивал на C++, C#, Java (Delphi=>C# вообще безболезненная процедура, вот Жаба уже менее дуракоустойчивая)
Тем более при изучении базовых алгоритмов (по принципу один алгоритм — одна программа)
Это бесполезное занятие — показать 3.5 алгоритма в 4-х отдельных программах. Тупо натаскивание эрудиции, не более.
В итоге у одних знания улетучатся, у других (у кого память получше) будет просто набор несвязанных и бесполезных знаний.
Нужно в первую очередь уделять вниманию следующим навыкам:
1. Декомпозиции задачи
2. Поиска
3. Анализа
4. Построение архитектуры приложения
5. Экспериментирования и сравнения
Это навыки общего вида
Это не очевидно.
Хз. Берем любую практическую задачу и там становится очевидным. Например, школьников можно напрячь написать программу бросания камня под углом с простой анимацией (которую можно реализовать на любой формочке): сразу появляется объект типа Stone, который имеет параметры, как mass, velocity, acceleration, impulse, position а также методы для вычисления их, а также появляется класс World с параметрами spaceBound и gravity, объект Launcher с параметрами angle и force. Ну и стандартно, Main где будет реализован основной цикл и UI для отображения.
Присоединюсь к Zenitchik и добавлю, что после оформления модуля готового для повторного использования => следом идет написание других модулей и объединение их в одной программе, например, сравнение алгоритмов Сундарама и Аткина, или разных методов сортировки (а тут уже можно будет рассказать про вычислительную сложность алгоритмов).
Учитывая что в школе программирования идет не один год — на выходе школьники должны в итоге выдать комплексную программу, состоящей из более чем одной процедуры. Тогда от программирования в школе будет хоть какой-то толк.
Алгоритм Эратосфена на C# в самом прямолинейном исполнении будет выглядить вот так:
class Program
{
static void Main(string[] args)
{
int maxprime = int.Parse(args[0]);
List<int> primelist = GetAllPrimesLessThan(maxprime);
foreach (int prime in primelist)
{
Console.WriteLine(prime);
}
Console.WriteLine("Count = " + primelist.Count);
Console.ReadLine();
}
private static List<int> GetAllPrimesLessThan(int maxPrime)
{
List<int> primes = new List<int>();
int maxSquareRoot = (int)Math.Sqrt(maxPrime);
bool[] eliminated = new bool[maxPrime + 1];
for (int i = 2; i <= maxPrime; ++i)
{
if (!eliminated[i])
{
primes.Add(i);
if (i <= maxSquareRoot)
{
for (int j = i * i; j <= maxPrime; j += i)
{
eliminated[j] = true;
}
}
}
}
return primes;
}
}
А на Паскале вот так:
program primes(output)
const
PrimeLimit = 1000;
var
primes: set of 1 .. PrimeLimit;
n, k: integer;
needcomma: boolean;
begin
{ calculate the primes }
primes := [2 .. PrimeLimit];
for n := 1 to trunc(sqrt(PrimeLimit)) do
begin
if n in primes
then
begin
k := n*n;
while k < PrimeLimit do
begin
primes := primes - [k];
k := k + n
end
end
end;
{ output the primes }
needcomma := false;
for n := 1 to PrimeLimit do
if n in primes
then
begin
if needcomma
then
write(', ');
write(n);
needcomma := true
end
end.
Причем в первом случае (C#) программа уже проявляет структурированность — отдельно алгоритм, отдельно работа с вводом-выводом. На следующем уроке можно будет показать как вывести этот алгоритм в отдельный класс EratosthenesEnumerator:
public class EratosthenesEnumerator : IEnumerator
{
private BitArray _bits = null;
// Enumerators are positioned before the first element until the first MoveNext() call.
private int _primePosition = -1;
private int _bitPosition = -1;
public EratosthenesEnumerator(BitArray bits)
{
_bits = bits;
}
public bool MoveNext()
{
_primePosition++;
if (_primePosition > 0)
{
var found = -1;
for (var i = _bitPosition + 1; i < _bits.Length; i++)
{
if (_bits[i])
{
found = i;
break;
}
}
_bitPosition = (found >= 0) ? found : _bits.Length;
}
return (_primePosition >= 0) && (_bitPosition < _bits.Length);
}
public void Reset()
{
_primePosition = -1;
_bitPosition = -1;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public int Current
{
get
{
try
{
if (_primePosition == 0)
{
return 2;
}
return SieveOfEratosthenes.ToNumber(_bitPosition);
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
}
Показать как ркуто можно взаимодействовать с объектами:
EratosthenesEnumerator sieve = EratosthenesEnumerator(limit);
foreach (var prime in sieve)
{
/* do something */
}
Console.WriteLine("Count of primes {0}", sieve.Count);
Потом по аналогии пишем классы для решета Сундарама и решета Аткина, и показываем как три разных класса уживаются в одной программе и сравнить их (например, время выполнения).
Да и вообще, само по себе знание конкретных реализаций алгоритмов. если не умеешь ими пользоваться бесполезно. Тем более если надо, то нужный алгоритм можно в книжке прочитать или на Rosseta Code посмотреть. Вот навыки декомпозиции задачи, построения логики программы, навыки поиска и анализа, с последующим выбором алгоритмов — куда важнее.
Ну и самое главное — должен быть понятен сразу прикладной смысл, для школьников это вообще критично, так что школьное программирование должно быть направленно именно на написание практичных программ, например, написание программ для решения задач по физике, написание калькулятора или вообще игры, или журнала с базой данных. Я вот, например, вообще не вижу ничего интересного в алгоритме Эратосфена или поиска пузырьком для школьника, если он не будет знать как это можно использовать. А у нас все крутится вокруг одного — давайте понапихаем в школьника наор всяких примитивов, типа теоремы Пифагора, но не покажем им зачем это нужно. Ясень пень. что такие знания тут же выветриваются, а потом удивляются, отчего в стране победившей безграмотность самые популярные шоу это Дом 2 и Битва Экстрасенсов
Евклида, Эратосфена. сортировка и поиск — это 4 урока, дальше то чем заниматься? Тем более школьников надо сразу учить правильному подходу — т.е. разрабатывать модульные и реюзабельные программки.
Эт я как сейчас помню, как меня бесило отсутствие массивов переменной длинны в Turbo Pascal'е
В че там вникать? ООП абсолютно интуитивно-понятная технология программирования. Все объект, который имеет определенный набор свойств, параметров и методов и из всех этих объектов и собираем готовую программу, да так, что бы потом не утонуть в спагетти-коде.
C#и Java умудряются поддерживать баланс между строгостью и вседозволенностью. за это их и любят. Собственно тот же C# — это и есть Object Pascal испорченный сишным синтаксисом. Java тоже нехилое такое влияние Вирта испытала.
И интерес к филосфии вполне себе вписывается в этот возраст, т.к. в мозгу уже активно формируются это самое абстрактное мышление и естественно интересначинает проявляться, он обнаруживает что иногда у него получается прослеживать крутые штуки, которые неочевидны и начинает кагбэ прощупывать, но глубина понимания и успешность небольшие. Полноценно оперировать абстракциям мозг реально учится только к 17 годам — особенно такие эпохи развития мозга хорошо заметны когда ведешь дневники и по всякому документируешь свою деятельность.
Я вот например простенькие диффуры умел считать еще в 11 классе, но только в универе смог въехать в то какая офигенная штука производная и интеграл, и какая у них связь с физикой и природными процессами. Еще и в процессе обучения осознал шо представление о физических законах, да и о программировании тоже — были зачастую неправильными.
Ну и повторюсь — развитие все же несколько индвидуально.
А теперь представьте детей, которые по Коломогоровскому учебнику геометрии изучают в 7-ом классе понятие конгруэнтности. Самое главное, с точки зрения правильной подачи материала этот учебник был составлен очень хорошо, но оказался полным фейлом в качестве школьного. Та же участь постигла учебники по физике старый Кондартьева и новый Громова — физика там была представлена достаточно корректно (и я бы не сказал, что сложно, учебники как учебники), но в итоге и дети, и учителя его не любили, зато старый Мякишев и Буховцев или Перышкина все любят, хотя тот же Перышкин вообще ниачем.
В общем к абстракциям надо приучать постепенно, но как основной тем в обучения — только для вузов.
Если же говорить об обучении (откровенно говоря и об разработке тоже) — то Паскаль в этом плане на голову выше всех этих Пухтонов и прочих мусорных JS — строгий синтаксис дисциплинирует и уменьшает вероятность ашипки (а это очень важно в начале обучения! Так шо Си тоже не особо прокатывает, разгребать дампы памяти даже за деньги не очень хочется). Говнокод конечно можно и на Паскале писать, но на Пухтоне говнокод пишется автоматически, если за него садится программист с плохой самодисциплиной (т.е. 99% всех программистов и и 99.9% школьников), собственно хваленные пухтоновские библиотеки состоят из говнокода более чем полностью. Я таки языки называю мусорными — вроде как на них писать легко, приятно и быстро, но все что сложнее пятистрочного скрипта превращает в спагетти. И да, меня всегда умиляло, что на ОО языке — Пухтоне, 99% программ написано в чисто процедурном стиле.
Если же Паскаль не нравится, то есть альтернатива — мейнстримовые энтерпрайз языки: Java и C# — в них в принципе также можно писать как душе угодно, но они все же имеют достаточно строгий и формализованный синтаксис и целую рекомендаций и соглашений. А самое главное эти языки дуракоустойчивые (C# все же более дуракоустойчивый чем Java. все же в последней куда проще несознательно вступить в тот же boxing/unboxing, например). А еще по ним очень много копипасты на всяких стековерфлоу — в общим учится им намного проще и эффективнее.
Хз, по мне так это самое главное. Я когда в школе узнал, что есть такой метод Гаусса и компьютер можно начить решать системы уравнений — был счастлив и тут же запил (ну на самом деле не тут же — это было долго и мучительно). Знайте как круто решать домашку, когда компьютер уже посчитал все и выдал ответ. Вообще к 11 классу физику, математику и частично радиолюбительство получилось автоматизировать написанием собственных программок. Вот геометрия оказалась в пролете — она кончилась раньше чем стали появляться вумные мысли в голове, да и вообще компьютерная геометрия адок еще тот. С тех пор у меня и развилась мания всю симулячить на компе, а сейчас уже проще решать обратные задачи и строить всякие регрессии, чем выучивать формулы и законы.
Тем более все эти Ньютоны и наискорейшие спуски — то собственно для чего компы создавались и то что приносит реальную пользу. Задачи оптимизации — это именно то, что позволяет нам летать, разговаривать по телефону и смотреть картинки с котиками. Опять таки тут вопрос правильной демонстрации и она решаема. Другое дело, что всему свое время, ну вот для первого курса: метод Ньютона, касательных и Гаусса ИМХО должен реализовываться каждым студентом, параллельно с высшей математикой.
Вообще, как мне объясняли на пальцах — изначально когда человек рождается, у него связей в мозгу ну просто дофига. В дальнейшем дети все впитывают все как губка, вообще максимальная обучаемость у людей до подросткового периода.
Проблема только в том, что в этот период отделы и функции мозга мозга только формируются, например, формирование мелкой моторики завершается только к 9-10 годам. Речь окончательно формируется к 6 годам, а общая моторика к 4. Префронтовая кора (рассудительность) заканчивает свое формирование только к 13-14 годам.
Вот только дело в том, что процесс обучения завязан на положительном подкреплении, а там процесс сложный, но в общем виде так: что лучше и приятнее тренируется, то и продолжает тренироваться и тут очень большое влияние оказывает эмоциональное состояние и получение быстрого и ощутимого эффекта. Поэтому стихи Пушкина вспомнят единицы — а матерные частушки будут знать все. В дальнейшем (всю жизнь) мозг и дальше будет выкидывать все что считает малополезным и закреплять то, что он посчитает нужным: не так уж и много у человека нейронов… а вот у кита дофига и он может позволить себе хранить в памяти рельеф мирового океана. И как раз в подростковом возрасте с 14-15 лет, начинается тотальнейшая перестройка — все лишнее просто убирается, то что получалось лучше всего — наоборот усиливается. В общем начинается процесс специализации, который длится до 17-20 лет (вообще точный период у разных людей разный).
И только после того как специализация из-за прореживания завершится — формируется абстрактное мышление, собственно только к 17-18 годам они учатся полноценно планировать и оценивать риски, оперировать сложными вещами в голове.
И к 20-21 году заканчивается формимидирование высших психических функций.
Т.е. реально до 17 лет давать абстрактные вещи бесполезно — мозг их просто плохо воспринимает, а когда начинается большая чистка — все что плохо понималось выкидывается на свалку. Ну а до 21 года бесполезно давать полностью самостоятельные и очень ответственные задания.
А самое главное — что бы какие-то знания закрепить и не потерять во время большой чистки — необходимо что бы отдача от них была моментальная и ощутимая, т.к. до 17 лет человеки еще не умеют строить далеко идущих прогнозов. Именно поэтому, например, навыки письма и арифметики у всех людей одинаково хорошо закрепляются — ну тупо потому что как сразу им начинают учить, ими тут же начинают пользоваться, просто на бытовом уровне человеку приходится постоянно считать и писать + по другим предметам надо делать тоже самое. А вот с геометрией уже ж0па начинается — слишком много абстракций, которые еще юные котелки плохо переваривают, но посчитать площадь квартиры в итоге все равно сможет каждый (опять таки — это практический навык), но большинство теорем никто и не вспомнит и не сможет доказать (хотя в школе могли доказывать). Тоже с навыками труда и даже с частью физики — т.к. с физикой мы на интуитивном уровне взаимодействуем, но только с частью: ядерную физику никто не вспомнит и даже после универа человек будет свято верить что Эйнштейн всех обманул, а мериканцы не высаживались на Луне. А вот со всякими химиями, биологиями и историями — кому как повезет. Если пол детства провел за пестиками и тычинками, коллекционируя гербарии, то что-то может и останется, но таких мало и естественно большинство не вспомнит сразу (вот прям сразу) после школы что такое эукариоты и прокариоты, а для людей в 40 лет может оказаться настоящим открытием, что вирусные заболевания антибиотиками не лечат, а гомеопатия — обман.
Потом-то, начиная с 20-и летнего возраста, конечно, человек сможет осваивать новые и более сложные знания самостоятельно и восполнять пробелы в знаниях. Проблема вот только в том, что специализация мозга уже давно закончилась и в некоторых областях человек оказывается в пролете. В принципе тут ничего плохого, но хренова бывает тогда, когда человек оказывается в пролете с основными навыками и программирование на самом деле — это вторая грамотность. А хваленая советская и нынешняя постсоветская система образования — мягко говоря положительному подкреплению не способствует + нездоровая атмосфера в учительском корпусе. В итоге в универе народ начинает учится заново.
Начинается все со счетных палочек и фигурок -то что дети могут пощупать ручками, пересчитать и убедиться.
Затем идут циферки и как ими офигенно отражать число палочек на бумаге, а уж затем правила столбиком (и все равно возвращаются к палочкам) и так далее.
Я собственно недавно смотрел учебники по математике для младших школьников: там все по прежнему идут яблоки и арбузы.
В общем связь с тем что можно пощупать — прямая. В более старших классах начинаются тоже приближенные к IRL задачки: типа поезд выехал из точки А в точку Б или 3.5 землекопа копали яму… и т.д.
Хотя с формальной точки зрения надо начинать с теории множеств, формальной логики, теории групп, топологии пространства, теории чисел и прочий дельта-эпсилон формализм с производными и интегралами. Но даже в универах так не делают (страшно, епты!)… хотя есть люди, которые считают, что это надо в школе проходить, шоб чувак пришел и начал с первого курса изучать всякие гомологии и дифференциальные геометрии, а уж потом можно и арифметикой позаниматься %-)
Вот кстати с сочинениями не надо. Большинство и после школы пишут абсолютный трешак (впрочем, научные и деловые статьи писать все же проще).
А самое главное — вечная школьная драма: сочинения написанные по шаблону получают хорошие оценки, выражение собственного мнения — может жестоко караться, даже если у школьника реальный художественный талант.
Ы общем сочинениями и их критикой в школе туговато. Вот более официальные вещи — типа докладов и рефератов все же проще написать и оценить.
Ну обычно да. Еще столы, стулья, доски. Но круги квадраты все же хотелось бы тоже давать не в абстрактном виде, а как-то сразу с точки зрения компьютерной геометрии.
На самом деле ИМХО ООП лучше всего заходит с задачами где надо оперировать реальными сущностями — например, полет снаряда, брошенного под углом к горизонту, робот в лабиринте и т.д…
Другая проблема — не всякое ООП и не в каждой задаче одинаково полезно — это вот очень тонкий момент кстати. Ну там смоделировать работу PID регулятора с какой-то штуковиной — легко, а вот например, моделировать динамику каких то частиц и под каждый атом частицы отводить свой класс — ну ИМХО это никакой компьютер не переварит.
Ну да. В общем тут много вариантов. Но вот на тему структур данных, бытует такое мнение, что единственная полезная структура данных — это массив, все остальное производные :-)
Ну вообще решето Эратосфена — это алгоритм для поиска всех простых чисел. Просты числа — если не в курсе, активно применяют в криптографии, кодировании и т.д. А еще с простыми числами есть ряд нерешенных проблем математики (например первая и вторая проблемы Ландау. проблема Гольдбаха и т.д.).
А теорема Пифагора… Вы как расстояние будите считать в прямоугольных координатах? Все, вся прикладная вычислительная графика и геометрия проходят мимо. Или решать Диофантово уравнение? Епс, да все задачи оптимизации, машинного обучения проходят мимо.
Хотите поновее? Ну в геометрии есть пространство Минковского — конец 19-го века. сумма Минковсокго вон используется в motion planing в робототехнике и играх. Но без теоремы Пифагора и прочих, даже с вазелином туда не пролезете.
А че его восхвалять? Например вот это написано на Фортране. Вот Фортрановски библиотеки при этом эти библиотеку лезут ну просто везде — практически в любой программе для численного моделирования и расчетов (естественно это не говноподелки на Пухтоне) торчит фортрановский код и библиотеки. Для HPC у Фортрана только одна альтернатива — Си, хотя недавно туда пробилась Julia. Так что, что его славить — его повсеместно используют, благодаря чему можно, например долететь на самолете из Москвы во Владивосток и неубиться…
Информатика сейчас начинается 5 или 7 класса и длится до 11 класса. Минимальное общее число часов — вроде не менее 105 (я хз сколько точно), но даже когда я учился, у нас информатика с программированием за 350+ часов перевалила за 7-11 классы.
Времени вагон реально. За это время мы с одноклассникам успели накатать скролл-шутер (на Паскале, бладж) и нафигачить целую кучку маленьких программ на Delphi для всяких мелких расчетов (ну я вон нашлепал себе всякие говнопрограммки, для расчета цепей, чтоб ручками не считать) и покататься по школьным олимпиадам по программированию. Хочу сказать, что у многих компы дома появились вообще только после школы, максимум в старших классах (мне повезло, у меня Синклер на котором я игрался в Elite, Commando, Nether Earth, Arkanoid, Laser Squade).
Так что реально пройтись по всем вехам развития технологии программирования.
Ну т.е. все эти заученные стишки просто растворятся и никогда ни на что не повиляют. Единственный плюс в этом, что задатки все же у всех разные: когда мы бьем по площадям больше вероятность того, что найдем что-то полезное, но переусердствовать здесь не стоит.
Навыки то надо постоянно тренировать и чем раньше начать — тем лучше будет.
В противном случае, тогда встает вопрос, а нафига оно нужно программирование в школах, если нет задачи дать человеку навыки разработки программ? А алгоритмы он один фиг постигнет на дискретной математике той же, например, где их ему будут их подавать правильно и корректно уже… Ну если, конечно, пойдет учиться на погромиста.
Это общий инженерный навык. А вот умение работать за токарным станком — это уже частный и сугубо специфический навык. Ну дядя Вася-конструктор и дядя Петя-токарь умеют точить, но разработкой занимается только дядя Вася, и более того — станок с ЧПУ сделает обоих (вот только этот станок не обладает волшебным знанием — ему все равно потребуется оператор).
Знание разных алгоритмов и ЯП — это как знание молотка и киянка — оно полезно, но только вместе с умением их применять
По идее все эти «решетки» можно вывести как методы одного статичного класса, но это будет иметь смысл, если есть другие более осмысленные классы (такой вот каламбур).
Т.е. если написать программу решетки Эратосфена, то это как мой самый первый пример: class Program с двумя методами, собственном main, где крутится логика программы и метод самого алгоритма Эратосфена.
Но как известно решеток несколько. Поэтому следующим этапом рассказываем как представить решетку в виде класса: сразу и инкапсуляция и наследование (например от IEnumerable). После этого по аналогии реализуем еще пару классов с другими алгоритмами и делаем программу, которая не просто что-то там считает, а сравнивает несколько алгоритмов. Дополнительно можно отнаследоваться от Эратосфена и изменить реализацию алгоритма (их несколько) — показать более эффективные: т.е. рассказываем о таких вещах как оптимизация, рассказываем что такое вычислительная сложность и наглядно демонстрируем, заодно знакомимся как организовывать иерархию похожих классов с помощью наследования.
Следом мы изучаем другие алгоритмы и расширяем прежнею программу: дабы не плодить сущностей — сводим эти решетки как методы в один статичный класс (а их старые классы ликвидируем), про который забываем и принимаемся за демонстрацию тех же пузырьков… и далее по нарастающей.
В итоге получаем:
1. Изучаем алгоритм Эратосфена
2. Показываем как можно по-другому структурировать программу и модернизируем её
3. Расширяем программу, добавляя аналогичные алгоритмы
4. Изучаем как это все работает, сравниваем, анализируем
5. Рассказываем об оптимизациях и вычислительных сложностях
6. Снов модифицируем программу и добавляем туда новые сущности
…
PROFIT!
Самое главное — наглядно демонстрирует итеративный процесс разработки, с постоянным улучшением и расширением программы. смотрим какие есть техники и попутно демонстрируем другие алгоритмы.
А просто написать программу «алгоритм Эратосфена»… ну я хз, это тупо. Более того, польза от этого алгоритма будет разве что тем кто занимается криптографией. Я вот занимаюсь математическим программирование уже дофигущу лет (смотря как считать, но 10+ уже наберется) и мне эти решетки понадобились всего пару раз — когда привлекали к задачам связанных с кодированием. Часто ли потребуется эта решетка людям, занимающимися более приземленными вещами?
А вот например всевозможные задачи на графах (например, обход графа) — встречаются ну просто постоянно, трудно наверное найти задачи где их нет. Еще конечные автоматы, задачи оптимизации и т.д. и т.д.
Т.е. я бы строил бы курс (вообще я уже такой строил) с целью, например, разработки программы где роботы ходят по клеточкам, потом ищут выход из лабиринта, потом взаимодействует друг с другом и т.д. Это наглядно, это интересно, а самое главное покрывает необходимым минимум алгоритмов, используемых на практике: там будут и деревья, и сортировки, и конечные автоматы, и задачи поиска пути, и оптимизации (например, задача коммирвояджера). Студентам заходит лучше, чем «а сегодня я вам расскажу про ещё одну олимпиадную задачку про паровозики», школьникам думаю тоже.
Есть еще один очень скользкий момент: изучение алгоритмов требует определнной математической подготовки, которая появляется не раньше университета. Поэтомы дети и младшекуры их тупо заучивают и обезъянничают. Если остановится именно на этом — то это будет бестолковое занятие. т.к. между извилинами ничего не отложиться. Поэтому в таких условиях лучше давать материал исходя из практического применения — так хотя бы начнет откладываться понимание куда и как это все добро можно вставить, а следом уже может появится интерес к тому, что бы подтянуть фундаментальные знания.
Да. Так и есть.
Смотря к какому. Сортировку — да, а какой-нибудь non-dominated sorting genetic algorithm или TimberWolf 3.2 — это уже будет уровень научной работы, которую уже проделали лет 10-20 тому назад.
Не только. Это еще и влияет на эффективность полученного решения. Мой самый любимый пример — это то сколькими способами можно крутить матрицы — алгоритмов несколько (разложение Холецкого, LU-разложение, QR, SVD и т.д.), каждый со своим достоинствами и недостатками и лучше их использовать прицельно, т.к. заюзать SVD — это будет тотальный оверхеад в ряде практических задач: уж задач где основная матрица системы квадратная и невырожденная не меньше, чем задач где они прямоугольные и плохообусловленные.
Вон я недавно давал программисту (без опыта математического программирования) задание прикрутить метод иммитации отжига (Simulated Annealing), объяснив откуда и что копипастить (т.е. даже поиск минимизировал). Ну выполнение затянулось на 2 недели (хотя там работы было от силы максимум пара дней) — несколько дней ушло только на поиск ошибки где больше с меньше перепутал. Ну со временем — чаще выполняя такие задачи и почитывая на ходу соответствующую теорию — досадных ошибок станет меньше, такие задачи будут выполняться быстрее и эффективнее.
В общем всегда должна соблюдаться связка практики с теорией:
1. Если напихать максимум теории, то потерпим фейл — единицы смогут сообразить куда и как это можно вставить самостоятельно, у большинства же знания выветрятся — человек имеет особенность забывать то, чем не пользуется.
2. Если заниматься только практикой и учится исключительно на копипасте со StackOverflow, то на выходе получим шаманов и ремесленников, а не инженеров, которые будут каждый раз изобретать велосипед. Это кстати нынче очень актуальная проблема.
А если уж совсем загнаться, то есть замечательные и бесплатные надстройки как XNA, Unity3D или Xenko, по которым даже есть целые курсы адаптированные как раз на студентов/старшеклассников
А так. умные люди из MIT придумали Scratch для обучения. Подтверждаю — младшие школьники на нем очень быстро въезжают и начинают даже что-то пытаться программировать. В это точно лучшая стартовая точка для самых маленьких.
А вообще школьники спокойно и такое делают
Бесполезное занятие рассказывать про сортировку пузырьком, не показав как её можно использовать. Это даже на студентах тяжко прокатывает, а у школьников отличный иммунитет к обучению, упирающему на эрудицию, а не на прикладное применение.
Результат программирования — это программа, которая принимает от пользователя какие-то осмысленные входные данные и выдает такой же осмысленный результат. А алгоритмы, языки программирования и т.д. — это всего лишь инструмент и средство, а не цель. Если ими не уметь правильно пользоваться — то это мусорные знания.
А вот если с нуля или обратно — никаких проблем. Я вот например после беглого знакомства с Turbo Pascal почти сразу спрыгнул в Object Pascal/Delphi по причине отсутствия в TP динамических массивов — и объекты зашли очень быстрой (собственно и в TP я самого начала рекорды начал использовать). А оттуда без особых проблем спрыгивал на C++, C#, Java (Delphi=>C# вообще безболезненная процедура, вот Жаба уже менее дуракоустойчивая)
Это бесполезное занятие — показать 3.5 алгоритма в 4-х отдельных программах. Тупо натаскивание эрудиции, не более.
В итоге у одних знания улетучатся, у других (у кого память получше) будет просто набор несвязанных и бесполезных знаний.
Нужно в первую очередь уделять вниманию следующим навыкам:
1. Декомпозиции задачи
2. Поиска
3. Анализа
4. Построение архитектуры приложения
5. Экспериментирования и сравнения
Это навыки общего вида
Хз. Берем любую практическую задачу и там становится очевидным. Например, школьников можно напрячь написать программу бросания камня под углом с простой анимацией (которую можно реализовать на любой формочке): сразу появляется объект типа Stone, который имеет параметры, как mass, velocity, acceleration, impulse, position а также методы для вычисления их, а также появляется класс World с параметрами spaceBound и gravity, объект Launcher с параметрами angle и force. Ну и стандартно, Main где будет реализован основной цикл и UI для отображения.
Учитывая что в школе программирования идет не один год — на выходе школьники должны в итоге выдать комплексную программу, состоящей из более чем одной процедуры. Тогда от программирования в школе будет хоть какой-то толк.
А на Паскале вот так:
Причем в первом случае (C#) программа уже проявляет структурированность — отдельно алгоритм, отдельно работа с вводом-выводом. На следующем уроке можно будет показать как вывести этот алгоритм в отдельный класс EratosthenesEnumerator:
Показать как ркуто можно взаимодействовать с объектами:
Потом по аналогии пишем классы для решета Сундарама и решета Аткина, и показываем как три разных класса уживаются в одной программе и сравнить их (например, время выполнения).
Да и вообще, само по себе знание конкретных реализаций алгоритмов. если не умеешь ими пользоваться бесполезно. Тем более если надо, то нужный алгоритм можно в книжке прочитать или на Rosseta Code посмотреть. Вот навыки декомпозиции задачи, построения логики программы, навыки поиска и анализа, с последующим выбором алгоритмов — куда важнее.
Ну и самое главное — должен быть понятен сразу прикладной смысл, для школьников это вообще критично, так что школьное программирование должно быть направленно именно на написание практичных программ, например, написание программ для решения задач по физике, написание калькулятора или вообще игры, или журнала с базой данных. Я вот, например, вообще не вижу ничего интересного в алгоритме Эратосфена или поиска пузырьком для школьника, если он не будет знать как это можно использовать. А у нас все крутится вокруг одного — давайте понапихаем в школьника наор всяких примитивов, типа теоремы Пифагора, но не покажем им зачем это нужно. Ясень пень. что такие знания тут же выветриваются, а потом удивляются, отчего в стране победившей безграмотность самые популярные шоу это Дом 2 и Битва Экстрасенсов
Эт я как сейчас помню, как меня бесило отсутствие массивов переменной длинны в Turbo Pascal'е
C#и Java умудряются поддерживать баланс между строгостью и вседозволенностью. за это их и любят. Собственно тот же C# — это и есть Object Pascal испорченный сишным синтаксисом. Java тоже нехилое такое влияние Вирта испытала.