Мета-взгляд на проблемы (не)образованной молодежи

    Все мы учились в школе, а многие после школы в ВУЗе или университете, кто-то продолжил в аспирантуре. Очень многие продолжают учиться после этого: кто-то на курсах, а многие занимаются самообразованием. Многие сталкиваются с проблемами образования своих детей, а кто-то и внуков. И в принципе проблемы образования и специального обучения небезразличны всем, поскольку все хотят, чтобы врач, если пришлось к нему обратиться, был квалифицированным, а встречный водитель на дороге знал бы правила дорожного движения.


    (Г. и А. Огородниковы)

    Ну а некоторые причастны к образованию с другой стороны: кто-то преподает в школе, кто-то преподает в ВУЗе, кто-то просто учит своего ребенка читать и считать, кто-то делится своим опытом с молодым недавно пришедшим сотрудником и т.д. У меня очень скромный опыт преподавания, но он был удачным. Сейчас не преподаю и могу не знать современных тенденций. Но проблемами обучения интересуюсь еще и с точки зрения ИИ, разделяя мнение, что в обучении интеллекта искусственного во многом приходится копировать методы обучения интеллекта естественного, подобно тому, как копируют в ИИ свойства естественных нейронов. В соц.группу молодежи уже не вхожу. Однако, несмотря на это, волна Хабра-публикаций на тему «необразованной молодежи» меня, как и многих, заинтересовала настолько, что принял участие в обсуждениях. И наговорил столько, что решил сделать своеобразный дайджест из собственных автоповторов, добавив дополнительные пояснения и учитывая услышанные в обсуждениях возражения. Ниже предлагается этот взгляд стороннего наблюдателя. Думаю, что критики прозвучало уже предостаточно, поэтому сфокусируюсь на конструктивных идеях.

    Прежде всего повторюсь, указывая на общеизвестные факты, что обучение детей со времен пещерных людей является обязательным всеобщим, даже героя Киплинга Маугли учат читать книгу джунглей. Многие мастера и хорошие специалисты в разных областях учатся всю жизнь, но все же для большого количества взрослых обучение не считается обязательным настолько, насколько оно считается обязательным для ребенка. В этом плане, не преуменьшая роль самообучения, все же приходится признать, что традиционно у всех народов основной упор делается на обучение, причем на жесткое модальное обучение типа «делай так». Так в основном учат и воспитывают родители, воспитатели и школьные учителя: «мой руки перед едой», «не грызи ногти», «не держи ложку в кулаке», «паяльник надо держать как карандаш», «не откладывай на завтра то, что можешь сделать сегодня», «на токарном станке нельзя работать в галстуке – может намотать и удушить», «ты не должен поступать с другими так, как не хотел бы, чтобы они поступали с тобой» и т.д. При этом обоснование необязательно. Действительно, можно попытаться разъяснить ребенку, почему нужно мыть руки перед едой, но значительно труднее объяснить, почему нельзя держать ложку в кулаке – ведь ему так удобнее ее держать. Каждый школьник поймет, что движущиеся части станка могут намотать галстук, но найдутся спорщики, которые будут говорить, что галстук может быть коротким, что длинный можно заколоть булавкой и т.д. Стандартная линия поведения учителей и инструкторов – уходить от таких споров: «таковы требования техники безопасности и они не обсуждаются».

    Самообучению в детском воспитании обычно отводится второстепенная роль. Конечно, бывают талантливые дети, и известно много случаев, когда заинтересовавшийся школьник самостоятельно по книгам осваивает что-то не входящее в школьную программу. Однако такие случаи обычно рассматриваются как исключения, пусть и довольно многочисленные, из общего правила. При этом обычно отмечается, что знания, полученные школьником в результате подобного самообучения, обычно поверхностны и не систематичны, а иногда и ошибочны, если не сумел разобраться или не так понял. Очевидно, что для взрослого достаточно образованного человека самообучение обычно проходит гораздо плодотворнее.

    Отметим, что:

    В развитых странах среднее образование, начиная с XX века, является обязательным и всеобщим.(Википедия)

    В настоящее время в некоторых странах (например, в России) общее образование является не только правом, но и обязанностью граждан. (Википедия)

    Действительно, сложно привлечь к ответственности гражданина, если он неграмотный. Таким образом, школа обязана дать каждому школьнику установленный запас базовых знаний, а каждый школьник обязан его получить. Иначе будет прятаться от пролетающего над головой самолета, принимая его за дракона – даже грузчиком не сможет работать. Выбор работы, вернее, обеспечение возможности осознанной проф.ориентации – важнейшая задача общеобразовательной школы. Без базовых знаний осознанный выбор не возможен. Конечно, перед школой еще ставятся воспитательные задачи, но эти задачи за рамками нашего обсуждения.

    Дети взрослеют с разной скоростью, но некоторые уже в младших классах начинают проявлять интерес к одним школьным предметам при частичном или полном отсутствии интереса к другим. Однако если школьник не хочет учить неинтересные предметы, то школа обязана его заставить, что и происходит с разной степенью успешности и не успешности. Эта проблема известна с древнейших времен и, видимо, полностью неразрешима, раз приемлемого общего решения так и не нашли. Однако известны частные решения. Одно из них это специальные учебные заведения, где углубленно проходят отдельные предметы, нпр., языковые школы, физмат школы и т.д. А вот в случае неуглубленного изучения нужна очень сильная минимизация. Но каждый учитель заинтересован в своем предмете, поэтому всегда есть стремление к увеличению объемов изучаемого материала и к повышению требований.

    Допустим, ученик хорошо рисует и мечтает стать художником, всякая информатика-математика ему до лампочки. Тройки по этим предметам для такого ученика вполне естественны. Но зачастую и в школе и дома такой ученик испытывает сильное постоянное давление за эти тройки (а двойки – вообще трагедия). Конечно, трудно не согласиться с доводами взрослых и опытных людей, окружающих этого школьника: интересы могут поменяться. Очень часто так и бывает, и вчерашний художник вдруг начинает все свободное время тратить на чтение книг про великие географические открытия. Против прилежного изучения языков – родного и иностранного еще труднее возражать: ведь это нужно и физику и лирику. А как возразить против математики? – Ведь это язык естествознания. Лирику, правда, математика нужна в пределах получения сдачи в магазине. Нравится это или нет, но во многих случаях, пока школьник не поймет нужность для него какого-то школьного предмета, все уговоры учителей и родителей являются пустой тратой нервов своих и ребенка. Бывают, конечно, и прирожденные лентяи. В этом случае, тем более, уговоры и наказания далеко не всегда дают положительный результат.

    Конечно, каждый случай особый и общего рецепта быть не может, однако учителю стоит сильно опасаться девальвации наказаний. Если ученик раз за разом получает двойки и только двойки – он может привыкнуть, притерпеться и для него это перестанет быть наказанием. В ВУЗе ситуация иная: есть система пересдач и, в крайнем случае, отчисления. Поэтому в ВУЗе высокие требования являются более достижимыми. В школе же ИМХО минимальной оценкой, кроме исключительных случаев откровенного саботажа, должна быть тройка. То есть нужно ставить такие основные задачи, с которыми удовлетворительно (т.е. на 3) справятся все. Но кроме основных задач для всех, обязательно нужны дополнительные для успевающих, иначе некоторым из них станет скучно и они перестанут успевать. Понятно, что за успешное (и даже частично-успешное) решение более трудных задач и оценка должна быть выше. Для увлеченных предметом нужны факультативы, за длительное активное участие в которых выставляется только отличная оценка. На практике никого из учителей не приходится убеждать не ставить слишком много двоек – никому не позволят сделать постоянными двоечниками почти половину класса. Просто некоторым учителям стоит осознать двойку, как исключительную и не слишком частую меру и соответственно пользоваться ею осознанно, а не эмоционально. Для этого нужно понять, что при всем желании школа, даже специальная с углубленным изучением, например, информатики, не может дать полных систематических знаний по информатике, т.к. слишком много других предметов, которые не дадут заинтересованным школьникам сфокусироваться только на информатике. В том числе, этим школа принципиально отличается от ВУЗа, хотя и в вузах обычно бывают второстепенные предметы, но студентам гораздо легче, чем школьникам, правильно распределять свое время. Как было сказано, школа обязана заставить каждого учить все предметы, для чего практикуется практически ежедневный почти тотальный контроль. Студентов так не контролируют – они должны сдавать курсовые, зачеты, экзамены, но не ежедневные домашние задания и т.д.

    Смешно выглядит стандартный довод, к которому любят прибегать многие школьные учителя: как же можно допустить, чтобы ученик не знал столь элементарной вещи! – Ну неужели они не понимают, что многим из их учеников за всю жизнь не понадобится теорема Пифагора или знание формулы медного купороса? Если, отучившись в школе, ученик так и не заинтересовался химией и математикой – значит, он выберет себе специальность, где ему это будет не нужно. И в таком случае школа выполнила свою обязанность, обеспечив ему осознанный выбор, несмотря на незнание ряда элементарных вещей этим учеником. Может, конечно, случится, что неожиданно для него в выбранной специальности понадобится химия или математика. Ничего не поделаешь – придется либо менять специальность, либо восполнять пробелы в своем образовании. Школа не виновата в таких пробелах.

    Однако, переходя к информатике, нужно отметить важный пробел, в котором виновата школа: в частности, в обсуждениях на Хабре часто высказывается мнение, что многим программистам не надо знать математику. Зачем математика для «клепания» веб-сайтиков или простейших мобильных приложений? – А как человеку без знания математики понять смысл и необходимость современных принципов безопасности для веб-сайтиков… Пойдет по пути наименьшего сопротивления «шифрованием через xor» в полной уверенности, что обеспечил высокую степень защиты. Многие знания применяются неосознанно, поэтому специалисту, получившему добротное вузовское образование, может казаться, что математикой в повседневной работе он не пользуется. Например, при выборе алгоритма по вычислительной сложности. Но если другой «спец» не увидит никакой принципиальной разницы между экспонентой и полиномом, то в результате даже простое приложение может оказаться слишком медленным. Может, конечно, такой «HTML-кодер» и найдет себе экологическую нишу, где проработает многие годы.

    Однако увольнение с работы может превратиться для него в личную трагедию. Грубая недооценка роли математики в программировании происходит из-за увлечения в школьной информатике технологиями, например, изучением современного, но не самого простого ЯП. Делают на этом языке красивый GUI, и все довольны. И никто из них не хочет понять, что технологии очень быстро устаревают, им на смену приходят новые и они — не главное. А главное — алгоритмы. Изучение информатики нужно начинать с изучения классических алгоритмов, а язык реализации должен прежде всего отвечать принципу «чем проще – тем лучше», чтобы не отвлекать слишком большое внимание на форму от алгоритмической сути. В принципе изучать алгоритмы можно и без ЯП. В конце концов, Евклид и Эратосфен сформулировали свои великие алгоритмы на естественном языке, не зная искусственных – не было тогда ЯП. Много позже определенную роль сыграл, нпр., и предельно упрощенный Русский алгоритмический язык. Однако сейчас у школ другие возможности, и вряд ли стоит возвращаться к этому ЯП. Но мне кажется, что при возможности лучший выбор будет в пользу языка, который минимально отвлекает школьников от основной цели. Код должен быть максимально нагляден для школьника. К сожалению, на любом языке можно написать путаный код. Полагаю, что и ЯП, и учитель первым делом должны этому препятствовать. В частности, не играть в уменьшение строчек кода. Например, программку для нахождения чисел Фибоначчи на Питоне можно записать следующим образом:

    fib = lambda n: fib(n - 1) + fib(n - 2) if n > 2 else 1

    Для школьника это ненаглядно, хотя и коротко. Другой недостаток для школы у современных языков типа Питона – недостаток учебников на русском по алгоритмам на этих ЯП. Этих недостатков лишен Паскаль. Как бы его ни критиковали, но этот «устаревший» язык зарекомендовал себя в качестве учебного языка и языка публикаций (в последнем случае сейчас чаще используется Pascal-like псевдокод). Выучить Паскаль для школьного применения гораздо проще и быстрее, чем многие другие языки. А строгости языка дисциплинируют учащихся в стилевом плане. Поняв основы, т.е. основные идеи алгоритмики и реализации, тем, кто захочет дальше учится программированию (в вузах, на курсах, самостоятельно), будет гораздо проще осваивать новые технологии и современные языки. Без этих основ учащийся может не увидеть за деревьями леса. В частности, для углубленного изучения алгоритмов в школе кроме классических книг Н.Вирта, можно посоветовать книгу С.М.Окулов, Программирование в алгоритмах, М.: БИНОМ, 2004. В предисловии автор отмечает, что книга в первую очередь предназначена для учителей и учащихся школ с углубленным изучением информатики. Упор делается на алгоритмику, причем на широко известные классические задачи, а не на выдуманные только для учебных целей.

    Показательно, что сегодня слово «алгоритм» все чаще и чаще применяется в обиходном языке. При этом даже далекие от информатики лирики применяют его вполне уместно. И почти никто уже не путает алгоритм с логарифмом – значит, слово действительно прижилось в обиходе. Изучение алгоритмов вырабатывает умение последовательно и четко излагать свои мысли, описывать по шагам какое-либо действие. Такое умение не лишнее в любой специальности. А вот как записывается оператор цикла на каком-то ЯП, многие выпускники забудут сразу после окончания школы.

    Выше отметил общеизвестный факт, что дети взрослеют с разной скоростью и что разное время могут затратить на выбор специальности. Отсюда следует важный вопрос, когда заканчивать общеобразовательную школу? Если, например, человек решил пойти работать почтальоном, то ему, может, и шести лет общеобразовательной школы достаточно. А достаточно ли шести лет общеобразовательной школы, если решил стать программистом? Думаю, что если есть возможность продолжить обучение в учебном заведении с углубленным изучением информатики, то такой возможностью следует воспользоваться. А вот вариант дальнейшего самообразования вызывает большие сомнения. Даже взрослый человек с большими знаниями и опытом обычно занимается не общим самообразованием, а под конкретную задачу. Просто чтение научно-технической литературы по смежным областям, чтобы быть в курсе, самообразованием в полной мере не является. Тут обсуждается принципиальная сторона вопроса, а не формальный вопрос получения каких-либо свидетельств об образовании. В конце концов, есть заочные формы обучения, можно сдать экстерном и т.д. Однако самое важное то, что было показано выше: школа не должна и не может дать достаточных систематичных знаний ни по одному из изучаемых там предметов, в том числе и по информатике. Хорошим специалистом можно стать только в хорошем ВУЗе.

    Я сам, уже работая (с университетским дипломом в кармане), периодически, как и мои коллеги, занимался (и сейчас занимаюсь) самообразованием. Однако, как правило, всегда была конкретная цель, было понятно, на что обратить особое внимание, а на что не следует тратить особо много времени. Например, недавно для конкретной задачи понадобилась технология CUDA, про которую раньше просто читал, чтобы быть в курсе. Разобрался, освоил, решил свою задачу. Наверно, самое трудное при самообразовании – понять, на что обратить внимание в первую очередь. А если все детали покажутся одинаково важными, то их изучать можно очень долго. При хорошем преподавателе такой проблемы возникать не должно, так как он обращает внимание учеников на действительно важные детали. Немаловажен и соревновательный процесс, которого нет при самообразовании. И как оценить свои успехи? Дать беспристрастную самооценку школьнику или студенту почти невозможно: в зависимости от типа характера либо сильно завысит, либо неоправданно занизит.

    Думаю, что программисту, чем бы он ни занимался, могут быть полезны знания физики и химии. Постоянно появляются устройства, основанные на новых технологиях. Полезно иметь собственное мнение об их возможностях. Чтение рекламных проспектов и даже чтение популярных публикаций в таких случаях при отсутствии базовых знаний мало помогает. Таким образом, школа, а особенно ВУЗ представляются очень не бесполезными. Если это хорошая школа и хороший ВУЗ. Однако даже хороший ВУЗ не без урода и там, к сожалению, бывают плохие преподаватели. В таких случаях по этим предметам можно и нужно заниматься самообразованием в рамках вузовской программы по этому предмету. В том числе заниматься самообразованием на семинаре или лекции данного плохого преподавателя. Сравнение учебника с тем, что несет с кафедры такой горе-лектор, нередко дает дополнительный стимул к лучшему пониманию и усвоению предмета.

    Также существует мнение, что последние классы школы и ВУЗ можно заменить, устроившись работать программистом. Прежде всего, очень большая вероятность, что не повезет – работа окажется если не рутинной, то и не требующей большого искусства. А не имея опыта и знаний, сразу оценить ситуацию вряд ли возможно. Полученный опыт, скорее всего, окажется мизерным. Сослуживцы, если и будут помогать и подсказывать, то по узкому кругу вопросов, связанных с работой. Таким образом, систематичных знаний не получить. Здесь еще одна чисто молодежная проблема – хочется получить все сразу: и знания, и опыт, и деньги. Но сразу обычно ничего не получается – с небольшим дополнительным возрастом обычно получается постепенно. Сначала нужно получить знания, потом приобрести опыт, а потом и деньги могут появиться. Учитывая все вышесказанное, я бы посоветовал основные систематические знания получать в учебном заведении, и при этом дополнительные знания и опыт разработки начать получать, участвуя в каком-нибудь добровольном проекте с открытым кодом. Никаких денег это не принесет, и хорошо – нет опасений, что к новичку будут претензии: какие претензии могут быть к бесплатному добровольцу? В сетке много таких проектов. Некоторое время назад и я предложил подобный проект. Получил много писем, в которых выражалось желание участвовать. Всем был рад. Но никто так и не стал участвовать – все сразу же замолкали. А ведь для новичка опыт участия хоть в каком проекте очень важен. Возрастает вероятность и за деньги куда-то устроиться. Более того, проект амбициозный на очень востребованную тему ИИ. Сейчас вместе с другими проектами у меня накопилось достаточно интересных выводов по путям развития ИИ и даже по его определению. Думаю обобщить их в статье для arXiv. Далее можно подумать и о публикации в солидном международном журнале. Школьнику и даже студенту было бы престижно стать соавтором такой публикации. Но не хотят – видимо, проблемы молодежи во многом в ней самой, а не только в образовании или в отсутствии возможностей.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 618
    • –3
      Согласился бы, будь в качестве языка предложены Oberon-07 (третье издание учебника Вирта) или хотя бы Modula-2 (второе издание). К сожалению, под Pascal в современном мире подразумевают не маленький и логичный язык Вирта (несмотря на несколько грубых ошибок дизайна, действительно прекрасно подходящий для обучения), а бесформенные кучи нелепостей, именуемые Delphi и PascalABC.Net. Но эти диалекты совершенно не годятся ни для заявленных автором целей, ни, тем более, для цели, автором полностью упущенной: обучение самодисциплине написания кода. Именно последнее может дать Oberon (или классический Pascal), но не могут дать модные языки с C-подобным синтаксисом.
      • 0
        Я и предлагаю Виртовский классический Pascal, но т.к. м.б. сейчас трудно найти компилятор, то можно Турбо, но без использования ООП. Были хорошие IDE для учебных целей, нпр., Dr Pascal, но сейчас их нет :(
        • 0
          Виртовский классический Паскаль не поддерживает даже динамических массивов и указателей, не было раздельной компиляции, не возможно подключить сторонние библиотеки…

          Это уж потом он стал настоящим индустриальный ЯП. Сейчас это ObjectPascal/Delphi, PacalABC и FreePascal/Lazarus

          Вот PascalABC.NET ИМХО самое то для обучение. Еще Smalltalk хорошая альтернатива. Хотя в силу современных тенденций — я бы все же обучал на C#
          • 0
            Виртовский классический Паскаль не поддерживает даже динамических массивов и указателей


            Указатели поддерживает. Динамических массивов нет. А зачем они в школе?
            • +1
              А зачем обучение программированию без динамических массивов вообще? Это одна из основных структур данных, наряду с обычным массивом, списком, деревом и хэш-таблицей.

              В противном случае школьникам придется еще и научится предсказывать объемы используемых данных, а работа с полностью статичной памятью несколько более сложное искусство — вон, даже разработчики С и С++ не смогли осилить. уж от школьников тем более ждать этого не стоит.
              • 0
                Базовые алгоритмы (Евклида, Эратосфена, сортировку и поиск) можно изучить без динамических массивов. Вирт в своих книгах это показал. В школе главное не технологии, а алгоритмы.
                • 0
                  Евклида, Эратосфена. сортировка и поиск — это 4 урока, дальше то чем заниматься? Тем более школьников надо сразу учить правильному подходу — т.е. разрабатывать модульные и реюзабельные программки.

                  Эт я как сейчас помню, как меня бесило отсутствие массивов переменной длинны в Turbo Pascal'е
                  • +1
                    + в начале уроков 10 на изучение ЯП. А дальше привел хорошую книгу:
                    С.М.Окулов, Программирование в алгоритмах.

                    Модульные программы для одной процедуры? ;)
                    • –1
                      Модульные программы для одной процедуры?

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

                      • –1
                        Присоединюсь к Zenitchik и добавлю, что после оформления модуля готового для повторного использования => следом идет написание других модулей и объединение их в одной программе, например, сравнение алгоритмов Сундарама и Аткина, или разных методов сортировки (а тут уже можно будет рассказать про вычислительную сложность алгоритмов).

                        Учитывая что в школе программирования идет не один год — на выходе школьники должны в итоге выдать комплексную программу, состоящей из более чем одной процедуры. Тогда от программирования в школе будет хоть какой-то толк.
                        • 0
                          Если развить эту идею, то и тексты сочинений по литературе нужно использовать повторно, чтобы по окончании школы у каждого выпускника получился если не роман, то повесть. Какой будет ужас, если свои ученические программы все школьники будут публиковать на Хабре. Я не понимаю зачем в школе изучать технологии типа модульного программирования, ООП, GUI, многопоточного программирования и т.д. Толк только один — составить представление, чтобы сделать осознанный выбор будущей специальности.
                          • 0

                            Программа — это не сочинение. Она имеет практический смысл, даже если писалась в учебных целях.


                            Я не понимаю зачем в школе изучать технологии типа модульного программирования, ООП, GUI, многопоточного программирования и т.д.

                            Хорошая фраза. Как-то этот демагогический приём называется. Ну да ладно, опустим.


                            А по сути, если введение в модульное программирование займёт, прости госпади, 15 минут одного урока, и больше к нему возвращаться не придётся, то почему его не дать? Хуже точно не будет.

                            • 0
                              А по сути, если введение в модульное программирование займёт, прости госпади, 15 минут одного урока, и больше к нему возвращаться не придётся, то почему его не дать? Хуже точно не будет.

                              А если не 15 минут, а минимум два урока? Один — чтобы рассказать, потом домашнее задание чтобы попробовать и еще один — чтобы ответить на вопросы по домашнему заданию.

                              • 0
                                Ну 3 урока, обычно 1 урок в неделю — 3 недели, впереди еще почти 2/3 четверти. Всего уроков в году — 35 минимум.

                                Информатика сейчас начинается 5 или 7 класса и длится до 11 класса. Минимальное общее число часов — вроде не менее 105 (я хз сколько точно), но даже когда я учился, у нас информатика с программированием за 350+ часов перевалила за 7-11 классы.

                                Времени вагон реально. За это время мы с одноклассникам успели накатать скролл-шутер (на Паскале, бладж) и нафигачить целую кучку маленьких программ на Delphi для всяких мелких расчетов (ну я вон нашлепал себе всякие говнопрограммки, для расчета цепей, чтоб ручками не считать) и покататься по школьным олимпиадам по программированию. Хочу сказать, что у многих компы дома появились вообще только после школы, максимум в старших классах (мне повезло, у меня Синклер на котором я игрался в Elite, Commando, Nether Earth, Arkanoid, Laser Squade).

                                Так что реально пройтись по всем вехам развития технологии программирования.
                                • 0
                                  А если не 15 минут, а минимум два урока? Один — чтобы рассказать, потом домашнее задание чтобы попробовать и еще один — чтобы ответить на вопросы по домашнему заданию.

                                  И Вы туда же?
                                  Закончили работу над алгоритмом: "А теперь мы полученную программу оформим вот так… В таком виде она может быть подключена к другой программе. Такой подход называется модульным".
                                  Далее, на каждом уроке все программы оформляются аналогично, уже без объяснения зачем и почему.

                                  • +1

                                    Куда "туда же"?


                                    А теперь мы полученную программу оформим вот так… В таком виде она может быть подключена к другой программе. Такой подход называется модульным

                                    Стоит добавить еще несколько пунктов:


                                    1. Вот так нужно оформлять подключение в другой программе и вызов этого модуля.
                                    2. Вот так нужно передавать информацию в модуль.
                                    3. Вот так нужно обрабатывать ошибки, возникающие в модуле.
                                    4. Вот так нужно получать результаты работы модуля.
                                    5. Такой подход может быть полезен вот в этом, в этом и в этом случае.

                                    А если мы хотим, чтобы информация не только дошла до сознания слушателей, но и закрепилась в нем?
                                    Тогда на каждый пункт еще желательно по одному примеру, который нужно как минимум записать, а как максимум — выполнить задачку, похожую на него, в классе и еще несколько дома.

                                    • 0
                                      А если мы хотим, чтобы информация не только дошла до сознания слушателей, но и закрепилась в нем?

                                      То мы не в школе.
                                      Эта информация реально пригодится двоим из класса. Остальным достаточно запомнить, что модули бывают и примерно представлять, на что они похожи.

                                    • 0
                                      Такой подход называется модульным
                                      Только еще область видимости имен объяснить… и как модули подключать.

                                      Тогда на каждый пункт еще желательно по одному примеру, который нужно как минимум записать, а как максимум — выполнить задачку, похожую на него, в классе и еще несколько дома.
                                      Именно так!
                                  • 0
                                    А по сути, если введение в модульное программирование займёт, прости госпади, 15 минут одного урока, и больше к нему возвращаться не придётся, то почему его не дать? Хуже точно не будет.
                                    Да. Хуже не будет. Кто и запомнит — тот не поймет. ИМХО это тема многих уроков.

                                    Программа — это не сочинение. Она имеет практический смысл, даже если писалась в учебных целях.
                                    А разве сочинения не имеют практического смысла? Нпр., обсуждаемая статья? ;)
                                    • 0
                                      А разве сочинения не имеют практического смысла? Нпр., обсуждаемая статья? ;)

                                      Вот кстати с сочинениями не надо. Большинство и после школы пишут абсолютный трешак (впрочем, научные и деловые статьи писать все же проще).
                                      А самое главное — вечная школьная драма: сочинения написанные по шаблону получают хорошие оценки, выражение собственного мнения — может жестоко караться, даже если у школьника реальный художественный талант.

                                      Ы общем сочинениями и их критикой в школе туговато. Вот более официальные вещи — типа докладов и рефератов все же проще написать и оценить.
                                      • 0
                                        выражение собственного мнения — может жестоко караться, даже если у школьника реальный художественный талант.
                                        Думаю, что это с учителем не повезло, т.к. знал многих учителей, которые боролись с шаблонным списыванием с учебника и поощряли собственные мнения и в сочинениях, и в устных ответах.
                          • 0
                            Очень сомнительно, что Вы сможете удерживать интерес школьников к программированию алгоритмами.
                            Вероятнее всего, просто отобъете желание у них заниматься/изучать программирование в принципе.

                            Как по мне, главное в обучении — завладеть вниманием обучающихся. Без этого обучить человека чему-либо практически не возможно.
                            • +1
                              главное в обучении — завладеть вниманием обучающихся

                              И тогда их можно научить чему угодно. В том числе и алгоритмам.

                              Не материал выбирают, чтобы завладеть вниманием, а вниманием завладевают, чтобы дать материал.
                              Материал же выбирается исходя из задач обучения.
                            • 0
                              Как можем видеть, здесь эта идея вниманием завладела. И, судя по комментариям, здесь и школьники присутствуют. Но хороший лектор может и на дутой идее завладеть вниманием — на то он и хороший лектор.

                              А если серьезно — то нужно быть честным, особенно в школе! Нужно не завлекать, а честно показывать, каких жертв потребуют данные специальности.

                              К примеру, в начале 1960-х гг. в СССР партия решила, что геологов не хватает. Стали в молодежной среде романтику разводить — красивые песенки по радио давать, типа «геолог — ты ветру и солнцу брат». На геологический, в «керосинку» (нефть) и т.д. народ повалил рекой, а после практики первого курса, когда выяснялось, что геология — это гороховый суп с тушенкой и вермишелью, не комфортные условия в ненаселенке с дикими волками и прочими медведями, мокрыми рюкзаками, комарами и мошкой, народ разбегался.
                              • 0

                                Популяризацией программирования сейчас не занимается только ленивый. И зарплаты тебе, и гамак, и два монитора.


                                Раз уж речь зашла про честность, то тогда уж точно не алгоритмы показывать надо, а более приземленное "подключись к базе данных, обработай результат запроса, нарисуй на формочке".
                                Недавних студентов-программистов к алгоритмам и не пустят. Тех же студентов-геологов привлекали ведь не для анализа грунта, а для копания земли, приготовления пищи и других хозяйственных активностей.

                                • +1
                                  Недавних студентов-программистов к алгоритмам и не пустят.

                                  Но если они не будут знать алгоритмику, их не пустят к алгоритмам никогда.
                                  • 0
                                    Меня на 3 курсе нанимали лаборантом в геологическую партию исследовать собранные образцы на очень древнем приборе:
                                    Первой моделью отечественного спектрофотометра, выпущенного в 1952 году, явился однолучевой нерегистрирующий спектрофотометр СФ-4.

                                    А для приготовления пищи поварих из местных нанимали. Еда — самое важное. Такое студенту никак нельзя доверять!
                    • +1

                      Что мешает писать на Delphi или PascalABC.Net по старым книгам? Насколько я помню, в том же Delphi 7 надо только расширение файла с .pas на .dpr сменить и {$APPTYPE CONSOLE} добавить.

                      • +1
                        Ok. {$APPTYPE CONSOLE} само добавляется при выборе из меню New. Недостаток, что меню большое и всяких кнопок много, ученикам так и хочется что-то не то нажать. Но и Delphi, и PascalABC.Net подойдут для классики.
                        • 0

                          А что будет если что-то не то нажать? Компьютер поломается что ли?

                          • 0
                            Не. Учителю лишние проблемы…
                            • 0
                              Какие лишние проблемы-то? «Это мы изучать не будем, кто хочет — может изучать самостоятельно. Вот список книг где можно об этом почитать.»
                              • 0
                                Ага. Именно так. Только: Это мы изучать не будем изучать не обязательно, кто хочет — приходит на факультатив. Там будет OOP & GUI.
                        • 0
                          Отсутствие той самой самодисциплины мешает. Если что-то есть, этим обязательно будут пользоваться.

                          Но дело ещё и в том, что Oberon — современный компонентный язык, который проще, чем классический Pascal. И который удобнее использовать и для объяснения алгоритмов, и для обучения кодингу.
                          • 0

                            Вообще-то если рассуждать о школьном образовании — то есть учитель который может пресекать методически нежелательные инициативы. Хотя лично я не помню каких-то ужасных возможностей которые бы подавляли базовые знания.

                            • 0
                              Они не подавляют базовые знания. Они создают информационный шум, из которого эти базовые знания намного труднее вытащить.

                              В Pascal в заголовке подпрограммы явно указывается — передаётся параметр по ссылке, или по значению. В Delphi мы должны постоянно помнить, что некоторые параметры, передаваемые по значению, в действительности передаются по ссылке.

                              В Pascal мы точно знаем, что делает оператор присваивания. В Delphi мы не можем сказать, что произойдёт при присваивании, пока не изучим код класса — потому как там может быть сеттер, делающий вообще что угодно.

                              И т.д.
                              • –1
                                В Delphi мы должны постоянно помнить, что некоторые параметры, передаваемые по значению, в действительности передаются по ссылке.

                                Есть var, const или out — параметр передается по ссылке, иначе — по значению. Если кажется что-то иное — значит, не разобрались с указателями. Это в языках где нет указателей можно для упрощения придумывать новые термины вроде "pass by share", в Delphi такой необходимости нет.


                                В Pascal мы точно знаем, что делает оператор присваивания. В Delphi мы не можем сказать, что произойдёт при присваивании, пока не изучим код класса — потому как там может быть сеттер, делающий вообще что угодно.

                                Сеттер, делающий что угодно, будет грубой архитектурной ошибкой. Сеттер обязан работать подобно присваиванию.


                                PS и да, "базовые знания" — это переменные, ветвления и циклы, а также их применение (структурное программирование). Зная их, можно разобраться в большинстве языков. Все остальное — это тонкости конкретного языка, которые учить в школе совершенно не обязательно.

                                • –1
                                  Есть var, const или out — параметр передается по ссылке, иначе — по значению.
                                  Классы, динамические массивы по факту передаются по ссылке — без var. Потому, что это не записи (массивы), а указатели. Но в Pascal c указателями всегда работаем явно, а в Delphi некоторые указатели выглядят как указатели, а некоторые маскируются под «структурные» переменные.

                                  Сеттер обязан работать подобно присваиванию.
                                  Нет, не обязан. Мы можем договориться, что в данном коде будем использовать сеттеры только для присваивания (сделаем вид, что логирования не было, нет и не будет). Но в языке не существует механизмов контроля за тем, что они реально делают.

                                  «базовые знания» — это переменные, ветвления и циклы, а также их применение
                                  Не согласен. Базовые знания — это основы алгоритмики. А ветвления и циклы (как и язык в целом) — всего лишь инструменты для записи алгоритмов. Умение держать в руках молоток — это ещё не базовые знания.
                                  Структурное программирование — это вовсе не о ветвлениях и циклах, а об умении их правильно готовить. Можно писать спагетти на Pascal и структурно на Fortran-IV.
                                  • 0
                                    Мне кажется, что мы обо всем договорились: на любом языке можно написать очень плохой код, но в школе главное не язык, а алгоритмика. Когда-то на Fortran-IV писали — на перфокартах (ужас!), но получалось алгоритмику изучать. И сейчас на фортране-4 можно, если учитель захочет лишних никому не нужных сложностей себе и своим ученикам. Но и на фортране можно.
                                    • 0
                                      Так с этими тезисами я никогда и не спорил. А говорю лишь о том, что mayorovp путает цель и инструменты для достижения цели.
                                      • +1
                                        Ok: в школе: цель — алгоритмы, язык -инструмент.
                                      • –1
                                        На Фортране можно. Полная совместимость всех версий. По крайней мере программы, написанные на Фортране-77 отлично компилятся Фортраном-95 и Фортраном-2008. Других версий увы не проверял.

                                        Кстати да. Насчет обучения. Возможно даже тот же Фортран как язык для обучения вполне себе подойдет: прямая связь с математикой + гигантская кодовая база самая большая среди всех существующих ЯП, как следствие влияние Фортрана (банально, например, индексаторы, передаче аргументов по ссылке и т.д.), да и относительно несложный.
                                        • +1
                                          О да, никаких ГУИ, только Паскаль и алгоритмика.
                                          Отличный, великолепный способ заставить 99% детей глубоко возненавидеть информатику.
                                          • 0

                                            С ГУИ — ещё вернее. Самая ненавистная часть разработки ПО.

                                            • 0
                                              Кому как. Я вот тоже гуи терпеть не могу, однако коллега, от разработки и проектирования гуев просто тащиться, раза в 4-5 быстрее меня такие штуки клепает… вот так мы и порешили: он гуи, я — алгоритмы.

                                              Это уже ИМХО от специализации зависит
                                              • 0
                                                Мы о детях говорим а не о состоявшихся разработчиках.
                                                Пичкать их алгоритмикой это 100% способ привить им глубокую ненависть к предмету.
                                                Предвещая замечания типа «а вот мне наоборот понравилось» сразу говорю что таких как вы «гиканутых» в классе обычно 1-2 человека.
                                                • 0
                                                  Ага, а на математике пичкать детей теоремами это 100% способ привить им глубокую ненависть к предмету? Мы ведь о школе говорим, а не о кружке «Умелые руки».
                                                  • +1
                                                    А разве с задачей привить ненависть к математике школа не справляется?
                                                    На мой взгляд, постановка вопроса должна быть иной. Вот есть люди, которые по профессии математики. Они утром встают и занимаются весь день математикой. Многие так увлекаются, что забывают пообедать и задерживаются допоздна. Так вот, что их заставляет так себя вести? Видимо, они в этой работе видят какой-то драйв, получают удовольствие.

                                                    Ну так надо детям показать, в чём удовольствие от математики, почему люди выбирают её в качестве профессии. Я бы мог согласиться, что надо потерпеть и заниматься порою занудными вещами и т.п., но ведь по факту этот метод всё равно не работает: люди заканчивают школу и забывают всё это напрочь, если работают не по математической специальности. Каждый может легко проверить это утверждение на своих знакомых.
                                                    • 0
                                                      Ну так надо детям показать, в чём удовольствие от математики, почему люди выбирают её в качестве профессии.
                                                      Чтобы испытать удовольствие, надо хоть немного знать ту самую математику. Кроме того математика нужна не только профессиональным математикам. Школьник без математики не сможет учить физику. И я считаю информатику. К примеру:

                                                      if cond1 then
                                                        if cond2 then
                                                           call1
                                                        else
                                                          call2
                                                      else 
                                                         call2;
                                                      


                                                      Я думаю, что для школьника важнее знать как стоит преобразовать этот код, чем знать основы ООП или разработку GUI.
                                                      • 0
                                                        Вероятно, хотя для начала не стоило бы писать такой код, верно? Опять же, я не готов на эту тему глубоко рассуждать, т.к. в данном случае задача не тянет на великую математику. Я бы попросту расписал таблицу истинности (cond1, cond2 -> result) и подумал, как можно записать то же условие проще. Конечно, формально это математика, но на практике это очень простая задача, которая объясняется без особенных затруднений.
                                                        • 0
                                                          Именно это я имел ввиду. Школьник сдает учителю такой код, далее учитель должен сказать, что сказали Вы. Пример можно усложнить, но дело в принципе: Булеву алгебру необходимо знать.
                                                        • 0

                                                          Навык преобразования таких выражений во что-нибудь вроде


                                                          if cond1 and cond2 then
                                                             call1
                                                          else 
                                                             call2;

                                                          не требует привлечения сложного математического аппарата. Люди сами начинают так писать, если им вообще рассказать про логические операторы. Если очень хочется обратить внимание, то можно специальный набор заданий сделать.

                                                          • 0
                                                            Да. Ничего сложного. Всего лишь Булева алгебра. Не самый тупой пятиклассник запросто поймет.
                                                            • 0

                                                              Вот только подавать ее отдельно неполезно. Не всякий студент, который недавно сдал "дискретную математику", может сформулировать отличие "И" от "ИЛИ".
                                                              При этом в булевой алгебре нет никакой привязки к конструкциям ветвления.

                                                              • 0
                                                                Не всякий студент, который недавно сдал «дискретную математику», может сформулировать отличие «И» от «ИЛИ»
                                                                Ужасно. Гнать такого студента! Он и таблицу умножения до шестью семь — сорок три наверное не знает. Пусть на его место придет более сообразительный.
                                                                При этом в булевой алгебре нет никакой привязки к конструкциям ветвления.
                                                                Привязку даст информатика, пятиклассник, знающий отличие И от ИЛИ, поймет.
                                                                • –1
                                                                  Ужасно. Гнать такого студента! Он и таблицу умножения до шестью семь — сорок три наверное не знает. Пусть на его место придет более сообразительный.

                                                                  Не будьте так категоричны. Такой вопрос я задаю только сильным студентам. Со сворачиванием и разворачиванием условных выражений, а также с другими задачами по программированию эти же студенты отлично справляются. Слабым сразу идет разбор решения задачи.
                                                                  Дело в мотивации. Для сухой математики она звучит как "сдал и забыл" как раз потому что нет привязки к реальным задачам.


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

                                                                  Зачем в таком случае нужно булеву алгебру как отдельную тему подавать? Тут уже приводили пример про Мольера и разговоры прозой.

                                                                  • 0
                                                                    Если только с привязкой, то можно и теорию множеств давать не на математике, а на информатике. А не слабо весь матан на информатику перетащить? Линейку и прочие терверы? В начале 20 века химия и физика были в одном учебнике:

                                                                    — В общем, скажите, из какого класса гимназии вас вытурили за неуспешность? Из шестого?
                                                                    — Из пятого, — ответил Лоханкин.
                                                                    — Золотой класс. Значит, до физики Краевича вы не дошли? (Золотой телёнок)


                                                                    Правда химии в учебнике Краевича была посвящена всего одна глава-прибавление. Все же математика, информатика, физика, химия — разные предметы со своей спецификой, хоть и пересекаются.

                                                                    Я не категоричен. Просто школьника никто не может выгнать, и он обязан учиться, а студент не обязан, но его можно выгнать. Большинство студентов это понимают (при этом далеко не все из них зубрилы), но бывают отсталые в развитии на уровне школьника. Надеюсь, что большинство студентов сообразит, что сказать про отличие И от ИЛИ. Хотя бывают «рекордсмены», так Арнольд описывает американского студента, который написал 1/2+1/3=(1+1)/(2+3)=2/5.
                                                                    • 0

                                                                      По линейке СЛАУ и задачи по системному анализу отлично решаются в Excel. Это считается информатикой?
                                                                      Вот только прикладное применение такой математики заключается в решении каких-то задач бизнеса. Найти оптимальный путь, распределить нагрузку и т.п.
                                                                      Если проводить аналогию с "передать привязку булевой алгебры на информатику", то получается что надо "передать привязку линейной алгебры к решению бизнес-задач на работодателя"?


                                                                      В нынешней ситуации если какой-то предмет вызывает вопрос "а зачем он?" и объяснение предполагается в рамках другого предмета, то у студентов получается закономерная реакция "сдать и забыть". А если это не желательный исход, было бы логично объяснять в рамках самого предмета.


                                                                      Выгнать студента тоже не легко. Уже писали об этом.

                                                                      • 0
                                                                        Прежде чем решать СЛАУ, нужно ввести понятие ранга матрицы и дать правила, когда решение есть, когда единственное и т.д. Далее изучают разные методы: можно решать Гауссом, а можно определителем. Обычно это описано в учебниках под заголовком Линейная алгебра. Где это изучать до численных упражнений в Excel? На математике или на информатике?

                                                                        Выгнать студента — крайняя мера. Всегда и везде на нее не охотно идут, чаще студент сам осознает, что учится не там, где ему нужно.
                                                      • 0
                                                        Ага, а на математике пичкать детей теоремами это 100% способ привить им глубокую ненависть к предмету?

                                                        Да, 100%.
                                                        95% процентов школьников никогда в жизни не вспомнят ни одну из этих теорем.
                                                        Ваши алгоритмы закончат там-же, рядышком со списком обязательной к прочтению литературы.
                                                        • 0
                                                          Не 100%: факт, что некоторые дети в мат.школы идут. И Ваши 95% явно субъективны, но какому-то проценту в жизни теоремы действительно будут не нужны. Вопрос только в том: какой процент от этого процента заранее уже в 1 классе знает, что ему теоремы будут не нужны?
                                                      • 0
                                                        1-2 человека.

                                                        Ага! 3% как с куста. А то и 6%.

                                                        • 0
                                                          Технарями (и прочими экономистами) из каждого выпуска обычно становятся сильно больше выпускников, чем гуманитариями. Технарям алгоритмика нужна. И гуманитариям стоит иметь понятие алгоритма, т.к. это слово вошло в обиходную речь. В статье отметил:

                                                          Показательно, что сегодня слово «алгоритм» все чаще и чаще применяется в обиходном языке. При этом даже далекие от информатики лирики применяют его вполне уместно. И почти никто уже не путает алгоритм с логарифмом – значит, слово действительно прижилось в обиходе.
                                                • 0

                                                  Смотрите:


                                                  type
                                                      TFoo = record
                                                          x,y : integer;
                                                      end;
                                                      PFoo = ^TFoo;
                                                      CFoo = class
                                                      public
                                                          x,y : integer;
                                                      end;

                                                  Почему вы считаете, что написав foo: PFoo вы "работаете с указателем явно", а написав foo: CFoo — "маскируете указатель под обычную структурную переменную"? Напомню, рассматриваем только заголовок подпрограммы.

                                                • 0
                                                  Сеттер, делающий что угодно, будет грубой архитектурной ошибкой. Сеттер обязан работать подобно присваиванию.

                                                  В дельфях — совершенно необязательно.
                                                • +1
                                                  В Delphi-7 программы Виртовского Паскаля работают верно. Всякие заголовки вроде {$APPTYPE CONSOLE} — просто ритуал, которому не трудно следовать.
                                                  • 0
                                                    В Delphi мы должны постоянно помнить, что некоторые параметры, передаваемые по значению, в действительности передаются по ссылке.

                                                    Потому что они в действительности и являются ссылками, ваш кэп.

                                                    В Delphi мы не можем сказать, что произойдёт при присваивании, пока не изучим код класса — потому как там может быть сеттер, делающий вообще что угодно.

                                                    Используйте только процедурный подход, кто мешает-то.
                                                • +1
                                                  современный компонентный язык, который проще, чем классический Pascal
                                                  Это удивительно. Этому есть доказательство? — Приведите, pls.
                                                  • +1
                                                    Возьмите официальное описание языка Oberon-07 и сравните его с официальным же описанием Pascal.

                                                    Вирт в каждом следующем языке не только добавляет новые возможности, но и выкидывает всё лишнее. Потому Modula меньше, чем Pascal, а Oberon меньше, чем Modula.
                                                    • –1
                                                      Размер описания ничего не доказывает. ИМХО ООП, как и другие технологии, большинству школьников не нужны. И сколько книг по алгоритмам на Обероне на русском?
                                                      • +1
                                                        Вполне себе доказывает — если полное описание языка (с примерами, РБНФ и описанием модуля System) укладывается в 17 страниц.

                                                        И Oberon — это совсем не то ООП, что переехало из Simula-67 в С++, а позже превратилось в пандемию. Компоненты (модули) Oberon намного проще и логичнее, чем классы: никаких неявных this и мешанины из кода и данных.

                                                        Какие именно «другие технологии»? В том-то и дело, что увеличение мощности языка достигается абсолютно минимальными средствами — без всех этих новомодных рюшечек.

                                                        Есть отличный учебник самого Вирта. Ещё попадались книги отечественных авторов, использующие Component Pascal (диалект Oberon для создания больших систем — вот он по сложности примерно равен классическому Pascal). Но специально вопросом кол-ва книг не занимался.
                                                        • 0
                                                          Здесь обсуждали ООП в школе.
                                                          • 0
                                                            Вы всё же взгляните — ради любопытства — как это реализовано в Oberon (или хотя бы в позаимствовавшем его идеи Go). Данные отдельно, код отдельно. Классическое процедурное программирование. Разница только в синтаксисе вызовов: вместо add(q, 17) пишем q.add(17). И add — это не часть q.

                                                            В том-то и дело, что в Oberon проблем, вызываемых в обучении C++-подобным ООП, не существует.
                                                            • +1
                                                              Я знаю Oberon с момента его рождения. Но в любом случае ООП — это три кита: инкапсуляция, наследование и полиморфизм. В качестве приложения к ним куча проблем, нпр., проблемы множественного наследования. Это неоднозначно и для профи, а школьнику, который лирик это совсем не нужно — не мучайте детей…
                                                              • +1
                                                                Придумавший ООП Алан Кей с этими «тремя китами» не согласится.

                                                                А в каких ещё языках, кроме С++, существует множественное наследование? Большинство модных языков используют интерфейсы — механизм намного более простой и логичный.
                                                                • +1
                                                                  В список языков, поддерживающих множественное наследование, входят: Io, Eiffel, C++, Dylan, Python, некоторые реализации классов Javascript (например, dojo.declare), Perl, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl)[1], а также Object REXX (за счёт использования классов-примесей). (Вики)


                                                                  Придумавший ООП Алан Кей с этими «тремя китами» не согласится.
                                                                  Это не важно — важно, что получилось.
                                                                  • +1
                                                                    В Javascript множественного наследования не существует. И если его можно имитировать, так и классы в JS — всего лишь имитация через прототипы.

                                                                    То, что получилось в Python, полноценным множественным наследованием никак не назовёшь.

                                                                    Про C++ говорил, с остальными языками не сталкивался, потому мнения не имею.

                                                                    Это не важно — важно, что получилось.
                                                                    Получилось множество разных схем организации ООП. Тот же JavaScript в схему классов никак не укладывается. И то, что одна из схем популярнее всех прочих, не делает её истиной в последней инстанции.
                                                                    • 0
                                                                      Получилось то, что получилось, но зачем каждому школьнику над этим думать?
                                                                    • 0
                                                                      Основные индустриальные ООП языки — C# и Жаба множественное наследование не поддерживают, только множественное наследование интерфейсов, которые чисто декларативные элементы языка. Собственно весь полиморфизм в них — либо перегрузка, либо множественное наследование интерфейсов (встречается не так уж и часто), которые один фиг нужно в каждом классе имплементировать ручками.

                                                                      В любом случае никаких проблем с множественным наследованием (кроме проблемы ромба, которая решаема) — нет.
                                                                      • 0
                                                                        В любом случае непонятно зачем каждому школьнику в это вникать? Школа не индустрия и «индустриальные языки» в ней не обязательны.
                                                                        • –1
                                                                          В че там вникать? ООП абсолютно интуитивно-понятная технология программирования. Все объект, который имеет определенный набор свойств, параметров и методов и из всех этих объектов и собираем готовую программу, да так, что бы потом не утонуть в спагетти-коде.

                                                                          C#и Java умудряются поддерживать баланс между строгостью и вседозволенностью. за это их и любят. Собственно тот же C# — это и есть Object Pascal испорченный сишным синтаксисом. Java тоже нехилое такое влияние Вирта испытала.
                                                                          • +1
                                                                            ООП абсолютно интуитивно-понятная технология программирования
                                                                            Прежде надо понять, что такое программирование.
                                                                            из всех этих объектов и собираем готовую программу
                                                                            Сколько объектов нужно для изучения решета Эратосфена? Один? И метод один? И как в этом случае объяснить школьнику необходимость лишних букАв? И как объяснить, что такое спагетти-код на основе программы в несколько строчек? А больше не нужно для общего образования.
                                                                            • –1
                                                                              Алгоритм Эратосфена на 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 и Битва Экстрасенсов
                                                                              • +1
                                                                                О чем Вы говорите? Здесь учителя жалуются, что идею цикла трудно объяснить и транспозиция матрицы — непосильная задача, а Вы про декомпозиции… И не нужно это большинству школьников. И зря думаете, что если загрузить их больше, то не будут Дом-2 смотреть. Будут. А уроки из инета скачают.
                                                                                • 0

                                                                                  Для решета Эратосфена ООП выглядит весьма надуманно. Одного метода тут будет более чем достаточно.


                                                                                  Однако я согласен с вами в другом — нужны навыки анализа и декомпозиции задачи, построения логики программы. "Как из кубиков построить дом?", "Какой дом нам вообще нужен?".
                                                                                  Автор статьи не прав в том, что нужно пичкать школьников алгоритмами. Не усвоятся они.
                                                                                  На самом деле к любому алгоритму можно прийти самостоятельно, если будет необходимость применить его. "Знание алгоритмов" тут всего лишь экономит время на поиск.
                                                                                  Нужны не столько готовые решения, сколько интересные проблемы, подаваемые в посильном порядке. Хотя бы на примере игры.

                                                                                  • 0
                                                                                    Пока человек не поймет что такое алгоритм всякие декомпозиции для него просто сотрясение воздуха.
                                                                                    • 0

                                                                                      А как вы определите, что человек понял что такое алгоритм?
                                                                                      Если ориентироваться на следующее определение "Алгоритм это набор инструкций, описывающих порядок действий исполнителя для достижения некоторого результата."
                                                                                      то "понимание" можно оценить например по способности человека написать программу для условного башенного крана для частного случая перестановки ящиков с палубы корабля на площадку в порту.


                                                                                      Если под "пониманием алгоритма" вы имеете в виду "знание классических алгоритмов", то я с вами не согласен. Знание некоторого множества готовых решений проблем значительно менее полезно, чем умение определить проблему и самостоятельно прийти к ее решению. Даже если это решение уже известно.

                                                                                      • 0
                                                                                        Как определить, что человек понял, что такое мат.задача? — С первых классов школьники решают задачки типа «из пункта А в пункт Б», «из одной трубы втекает..., из другой вытекает ...» и т.д. Постепенно приходит понимание, что задача состоит из «дано» и «найти». Так и с алгоритмом — есть типовые задачи, есть типовые алгоритмы. Знакомство с ними дает ученику понимание.
                                                                                      • 0
                                                                                        Хз, дедушки-конструкторы спокойно проводили декомпозиции своих задач, когда еще чертили на кульманах, а программирование и алгоритмы был уделом горстки ученых.

                                                                                        Это общий инженерный навык. А вот умение работать за токарным станком — это уже частный и сугубо специфический навык. Ну дядя Вася-конструктор и дядя Петя-токарь умеют точить, но разработкой занимается только дядя Вася, и более того — станок с ЧПУ сделает обоих (вот только этот станок не обладает волшебным знанием — ему все равно потребуется оператор).

                                                                                        Знание разных алгоритмов и ЯП — это как знание молотка и киянка — оно полезно, но только вместе с умением их применять
                                                                                        • +1

                                                                                          Кстати, да. Неспособность к декомпозиции задачи (выраженной обычным человеческим языком) — главная проблема начинающих программистов.
                                                                                          Бывает такое на каком-нибудь форуме "А как написать ..."
                                                                                          А по ходу обсуждения выясняется, что всё, что нужно для решения задачи топик-стартер знает, каждую часть задачи по отдельности — решил бы, только расчленить задачу — не сумел, поэтому тупил и писал на форум.
                                                                                          И чем ему помочь непонятно.

                                                                                          • 0

                                                                                            Я размышлял над обратной проблемой. Когда спрашивающий знает из каких элементов нужно составить решение и (допустим) понимает к чему нужно прийти. А собрать целое из частей не может.


                                                                                            Если человек действительно хочет, то развитию навыка может помочь решение классических геометрических головоломок. Танграм, пентамино, кубик Рубика и т.п. Может быть даже конструкторы наподобие лего. Но я плохо представляю себе как включить их в программу какого-либо образовательного учреждения.

                                                                                            • 0
                                                                                              Неспособность к декомпозиции задачи (выраженной обычным человеческим языком) — главная проблема начинающих программистов.
                                                                                              Когда-то детей учили решать задачи по арифметике через последовательные вопросы: сколько яблок у Пети? сколько яблок у Саши? Потом сразу стали учить записывать уравнение, обозначая через Х искомое. М.б. первый метод лучше развивал способность к декомпозиции.
                                                                                            • 0
                                                                                              Знание разных алгоритмов и ЯП — это как знание молотка и киянка — оно полезно, но только вместе с умением их применять

                                                                                              В статье написал:
                                                                                              Изучение алгоритмов вырабатывает умение последовательно и четко излагать свои мысли, описывать по шагам какое-либо действие. Такое умение не лишнее в любой специальности.
                                                                                              • 0
                                                                                                Изучение алгоритмов вырабатывает умение последовательно и четко излагать свои мысли, описывать по шагам какое-либо действие.

                                                                                                Изучение алгоритмики как таковой — да.
                                                                                                Но изучение готовых разработанных кем-то алгоритмов — нет.

                                                                                                • 0
                                                                                                  В арифметике, когда учат складывать числа столбиком на бумажке, показывают пример, где цифра за цифрой получают результат, а только потом предлагают ученику сложить два другие числа.
                                                                                                  • 0
                                                                                                    Ну кстати не совсем.

                                                                                                    Начинается все со счетных палочек и фигурок -то что дети могут пощупать ручками, пересчитать и убедиться.
                                                                                                    Затем идут циферки и как ими офигенно отражать число палочек на бумаге, а уж затем правила столбиком (и все равно возвращаются к палочкам) и так далее.

                                                                                                    Я собственно недавно смотрел учебники по математике для младших школьников: там все по прежнему идут яблоки и арбузы.

                                                                                                    В общем связь с тем что можно пощупать — прямая. В более старших классах начинаются тоже приближенные к IRL задачки: типа поезд выехал из точки А в точку Б или 3.5 землекопа копали яму… и т.д.

                                                                                                    Хотя с формальной точки зрения надо начинать с теории множеств, формальной логики, теории групп, топологии пространства, теории чисел и прочий дельта-эпсилон формализм с производными и интегралами. Но даже в универах так не делают (страшно, епты!)… хотя есть люди, которые считают, что это надо в школе проходить, шоб чувак пришел и начал с первого курса изучать всякие гомологии и дифференциальные геометрии, а уж потом можно и арифметикой позаниматься %-)
                                                                                                    • 0

                                                                                                      Сложение столбиком на бумажке — это технология. Она запоминается один раз и используется.
                                                                                                      А потом мы встречаемся с людьми, которые не понимают, почему при умножении нужно произведения на разные разряды смещать на клетку относительно друг друга — делают это механически, потому что так научили.
                                                                                                      То же самое будет и с "пузырьком", например. Как он устроен — запомнят все, но почему он так устроен — большинство даже не задумается.

                                                                                                      • 0
                                                                                                        На «почему он так устроен» учитель и должен обратить особое внимание. Показать классу пошаговое выполнение под отладчиком.
                                                                                            • 0
                                                                                              Это уже вопрос архитектуры и методологии.
                                                                                              По идее все эти «решетки» можно вывести как методы одного статичного класса, но это будет иметь смысл, если есть другие более осмысленные классы (такой вот каламбур).

                                                                                              Т.е. если написать программу решетки Эратосфена, то это как мой самый первый пример: 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, то на выходе получим шаманов и ремесленников, а не инженеров, которые будут каждый раз изобретать велосипед. Это кстати нынче очень актуальная проблема.
                                                                                              • +1
                                                                                                на выходе получим шаманов и ремесленников, а не инженеров
                                                                                                Школа не делает инженеров. Всё, что сказано выше — очень разумно, но это для подготовки настоящих инженеров, которым, как бедным школьникам, не надо еще писать сочинение про образ Татьяны Лариной :)
                                                                                                • 0
                                                                                                  Хз, дети отлично умудряются самостоятельно собирать радиоприемники и передатчики, пользуясь таблицами, номограммами и упрощенными формулами, затем уже идут с первичными навыками обучаться на какую-нибудь радиотехнику, где уже углубляют свои знания и осваивают весь необходимый набор знаний для того что бы разрабатывать их самостоятельно и лучше.

                                                                                                  Навыки то надо постоянно тренировать и чем раньше начать — тем лучше будет.

                                                                                                  В противном случае, тогда встает вопрос, а нафига оно нужно программирование в школах, если нет задачи дать человеку навыки разработки программ? А алгоритмы он один фиг постигнет на дискретной математике той же, например, где их ему будут их подавать правильно и корректно уже… Ну если, конечно, пойдет учиться на погромиста.
                                                                                                  • 0
                                                                                                    дети отлично умудряются самостоятельно собирать радиоприемники
                                                                                                    Да. И я в 5 классе сделал детекторный приемник не очень понимая принцип работы колебательного контура. А потом в старших классах на физике увидел, что принцип очень простой, когда формулы понятны.

                                                                                                    нафига оно нужно программирование в школах
                                                                                                    Только чтобы определиться. А то пойдет в ВУЗ на физику или на химию, а и там программирование. И на экономическом. На литфаке, наверное, нет.
                                                                                                • 0
                                                                                                  Но как известно решеток несколько. Поэтому следующим этапом рассказываем как представить решетку в виде класса: сразу и инкапсуляция и наследование (например от IEnumerable).

                                                                                                  Классы хорошо заходят на геометрических задачках. Прямоугольники, квадраты, круги. Объяснение на всяких алгоритмах с решетами еще не пробовал, но предполагаю, что будет черезчур сложно.
                                                                                                  IEnumerable можно на графиках (линейных, квадратичных) функций показывать. Но сначала желательно объяснять отличие списка и множества от массива.


                                                                                                  Смотря к какому. Сортировку — да, а какой-нибудь non-dominated sorting genetic algorithm или TimberWolf 3.2 — это уже будет уровень научной работы, которую уже проделали лет 10-20 тому назад.

                                                                                                  Даже к таким можно самому дойти. Просто времени уйдет непозволительно много. И действительно сложные алгоритмы совершенно точно не нужно знать всем. Чтобы их применять, нужно научиться понимать решаемую проблему. То есть тренировать навыки анализа и поиска, которые вы упоминали.

                                                                                                  • 0
                                                                                                    Классы хорошо заходят на геометрических задачках. Прямоугольники, квадраты, круги. Объяснение на всяких алгоритмах с решетами еще не пробовал, но предполагаю, что будет черезчур сложно.

                                                                                                    Ну обычно да. Еще столы, стулья, доски. Но круги квадраты все же хотелось бы тоже давать не в абстрактном виде, а как-то сразу с точки зрения компьютерной геометрии.
                                                                                                    На самом деле ИМХО ООП лучше всего заходит с задачами где надо оперировать реальными сущностями — например, полет снаряда, брошенного под углом к горизонту, робот в лабиринте и т.д…
                                                                                                    Другая проблема — не всякое ООП и не в каждой задаче одинаково полезно — это вот очень тонкий момент кстати. Ну там смоделировать работу PID регулятора с какой-то штуковиной — легко, а вот например, моделировать динамику каких то частиц и под каждый атом частицы отводить свой класс — ну ИМХО это никакой компьютер не переварит.

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

                                                                                                    Ну да. В общем тут много вариантов. Но вот на тему структур данных, бытует такое мнение, что единственная полезная структура данных — это массив, все остальное производные :-)
                                                                                                    • 0
                                                                                                      Но вот на тему структур данных, бытует такое мнение, что единственная полезная структура данных — это массив, все остальное производные
                                                                                                      Бинарное дерево по Вирту — не массив, однако оказалось очень полезным, в частности, в Виртовских компиляторах.
                                                                                                    • 0
                                                                                                      И действительно сложные алгоритмы совершенно точно не нужно знать всем.
                                                                                                      Думаю, что никакие алгоритмы всем (кроме профи) знать не нужно. Нужно понять природу/суть алгоритмов.
                                                                                                      • 0
                                                                                                        Классы хорошо заходят на геометрических задачках. Прямоугольники, квадраты, круги.

                                                                                                        Ха-ха-ха. Кажется, правильное наследование квадрата от прямоугольника до сих пор многими считается великой нерешенной проблемой ООП...

                                                                                                        • 0

                                                                                                          Никто не предлагает наследовать прямоугольник от квадрата. И то и другое наследуется от "фигуры". Для иллюстрации этого достаточно.


                                                                                                          Если вы пробовали объяснять на чем-то другом и у вас получилось, поделитесь пожалуйста.

                                                                                              • +1
                                                                                                ООП абсолютно интуитивно-понятная технология программирования.

                                                                                                Хрен там плавал. Мне в своё время стоило изрядного труда врубиться, что за зверь такой.

                                                                                                • 0
                                                                                                  Смотря откуда приплыли, если до этого были многие года процедурного программирования 60-ых годов или вообще из области системного программирования, то врубиться будет трудно. Еще бывает трудно переключаться с C++ на C#, т.к. ООП в них все таки разные.

                                                                                                  А вот если с нуля или обратно — никаких проблем. Я вот например после беглого знакомства с Turbo Pascal почти сразу спрыгнул в Object Pascal/Delphi по причине отсутствия в TP динамических массивов — и объекты зашли очень быстрой (собственно и в TP я самого начала рекорды начал использовать). А оттуда без особых проблем спрыгивал на C++, C#, Java (Delphi=>C# вообще безболезненная процедура, вот Жаба уже менее дуракоустойчивая)
                                                                                                  • 0
                                                                                                    А вот недавно мне надо было сделать симуляшку с анализом характеристик PID-регулятора… и могу сказать, что ООП вариант я накатал куда быстрее, чем чисто процедурный с векторами и бла-бла-бла.
                                                                                                    • 0
                                                                                                      И я недавно это на ООП накатал быстрее, чем без него. Но я давно не школьник, как, думаю, и Вы.
                                                                                          • +1
                                                                                            А в каких ещё языках, кроме С++, существует множественное наследование?

                                                                                            OWL
                                                                                    • 0

                                                                                      Как же это "никаких неявных this" когда в одном модуле все идентификаторы видимы по простому имени? Это скорее "всегда неявный this" получается.


                                                                                      И да, модуль не имеет ничего общего с ООП. Эдак можно модуль в любом языке программирования "компонентом" обозвать.

                                                                                      • 0
                                                                                        Запись, с типом которой связана подпрограмма, всегда объявляется явно — как параметр подпрограммы, имеющий удобное для автора кода имя. Тогда как в С++-подобных языках параметр передаётся неявно: по факту он есть, но в заголовке подпрограммы мы его не видим.

                                                                                        «Не имеет ничего общего» с С++-подобным ООП. Но то, что предлагают C++ и его последователи — всего лишь самая модная из множества моделей ООП. И та мешанина из кода и данных, которую они навязывают, очень плохо совместима с концепцией легко читаемого кода.

                                                                                        Это в Modula был только модуль. А в Oberon — уже полноценное компонентное программирование.
                                                                                        • +1
                                                                                          Речь не про С++. Если сравнивать, то с ОО Pascal. Но зачем ООП всем школьникам?
                                                                                          • 0
                                                                                            ОО в Pascal не существует, а в Delphi-7 — редкостное убожество.

                                                                                            Я никогда и не говорил, что ООП необходимо (учился во времена процедурного структурного программирования). Но в большинстве актуальных языков ООП есть. И в том или ином виде, но сталкиваться с ним придётся. Если не в виде классов, то в виде модулей: хотя бы потому, что классический Pascal предлагает только монолитный код программы (одна из тех ошибок дизайна языка, которые я упомянул в первом комментарии).

                                                                                            И если столкновение неизбежно, то лучше выбрать не тот вариант ООП, который моден, а тот, который будет максимально понятен школьникам.
                                                                                            • –1
                                                                                              ОО в Pascal не существует

                                                                                              Существует с момента турбо-5, а микрософт тогда сделал свой, но он оказался не успешен. А был еще Think Pascal на Маке и т.д.

                                                                                              Delphi-7 — редкостное убожество

                                                                                              Извините, но я на этом «убожестве» много лет успешно работаю.

                                                                                              И в том или ином виде, но сталкиваться с ним придётся.
                                                                                              Лирикам не придётся.

                                                                                              классический Pascal предлагает только монолитный код программы

                                                                                              Для изучения сортировки пузырьком иного не надо.
                                                                                              • +1
                                                                                                Это всё диалекты. Я же под Pascal везде подразумеваю классический язык Вирта.

                                                                                                Это исключительно моё личное мнение, сформировавшееся после того, как пришлось написал на Delphi-7 программу управления механизмами. Да, создание интерфейса упрощает очень сильно. Но на этом все достоинства и заканчиваются.

                                                                                                Пузырёк — да, большего не надо. А, например, списки — монолит уже мешает.
                                                                                                • 0
                                                                                                  А, например, списки — монолит уже мешает.


                                                                                                  type
                                                                                                   list = ^memeber;
                                                                                                   member = record
                                                                                                                     dat : integer;
                                                                                                                     next: list;
                                                                                                                  end; 

                                                                                                  И где мешает монолит?
                                                                                                  • –1
                                                                                                    Это исключительно моё личное мнение, сформировавшееся после того, как пришлось написал на Delphi-7 программу управления механизмами. Да, создание интерфейса упрощает очень сильно. Но на этом все достоинства и заканчиваются.

                                                                                                    И в чем же это убожество выражается?
                                                                                              • 0
                                                                                                За что любят ООП — то что он банально проще.

                                                                                                Да, само по себе ООП тупо доступнее для понимания, чем прочие приемы, большинству среднестатистических людей без специального образования. В принципе этому среднестатистическому большинству проще написать более менее вменяемую и читаемую программу, используя объектно-ориентированный подход, чем используя, например ФП, или «старый» процедурный язык, или испльзую ориентированный на данные дизайн и т.д.

                                                                                                Так что ООП школьникам то как раз вкатит, тем более как бы не кочывряжились адепты ООП, но по факту это просто небольшая надстройка над структурным программированием (также как структурное — надстройка над процедурным)

                                                                                                • 0
                                                                                                  по факту это просто небольшая надстройка над структурным программированием
                                                                                                  Если можно без надстройки, то зачем надстройка?

                                                                                                  Да, само по себе ООП тупо доступнее для понимания, чем прочие приемы, большинству среднестатистических людей без специального образования.
                                                                                                  Это не очевидно. Тем более при изучении базовых алгоритмов (по принципу один алгоритм — одна программа) нет возможности увидеть достоинства ООП.
                                                                                                  • 0
                                                                                                    Тем более при изучении базовых алгоритмов (по принципу один алгоритм — одна программа)

                                                                                                    Это бесполезное занятие — показать 3.5 алгоритма в 4-х отдельных программах. Тупо натаскивание эрудиции, не более.
                                                                                                    В итоге у одних знания улетучатся, у других (у кого память получше) будет просто набор несвязанных и бесполезных знаний.
                                                                                                    Нужно в первую очередь уделять вниманию следующим навыкам:
                                                                                                    1. Декомпозиции задачи
                                                                                                    2. Поиска
                                                                                                    3. Анализа
                                                                                                    4. Построение архитектуры приложения
                                                                                                    5. Экспериментирования и сравнения
                                                                                                    Это навыки общего вида

                                                                                                    Это не очевидно.

                                                                                                    Хз. Берем любую практическую задачу и там становится очевидным. Например, школьников можно напрячь написать программу бросания камня под углом с простой анимацией (которую можно реализовать на любой формочке): сразу появляется объект типа Stone, который имеет параметры, как mass, velocity, acceleration, impulse, position а также методы для вычисления их, а также появляется класс World с параметрами spaceBound и gravity, объект Launcher с параметрами angle и force. Ну и стандартно, Main где будет реализован основной цикл и UI для отображения.
                                                                                                    • 0
                                                                                                      Будем изобретать велосипед «простой» анимации или м.б. сразу возьмем OpenGL/DirectX? Вот уж действительно бесполезное занятие.
                                                                                                      • 0
                                                                                                        Обычные WinForms на GDI с этим с успехом справятся — всего 1000 строчек говнокода внутри формочки (естественно, если бы автор в школе учил ООП, а не сортировку пузырьком на Бейские, то кода было бы меньше, он был бы разборчивее и красивее). В современных энтерпрайз языках все уже из под коробки есть, того же WinChart выше крыше хватает

                                                                                                        А если уж совсем загнаться, то есть замечательные и бесплатные надстройки как XNA, Unity3D или Xenko, по которым даже есть целые курсы адаптированные как раз на студентов/старшеклассников

                                                                                                        А так. умные люди из MIT придумали Scratch для обучения. Подтверждаю — младшие школьники на нем очень быстро въезжают и начинают даже что-то пытаться программировать. В это точно лучшая стартовая точка для самых маленьких.

                                                                                                        А вообще школьники спокойно и такое делают

                                                                                                        Вот уж действительно бесполезное занятие.

                                                                                                        Бесполезное занятие рассказывать про сортировку пузырьком, не показав как её можно использовать. Это даже на студентах тяжко прокатывает, а у школьников отличный иммунитет к обучению, упирающему на эрудицию, а не на прикладное применение.

                                                                                                        Результат программирования — это программа, которая принимает от пользователя какие-то осмысленные входные данные и выдает такой же осмысленный результат. А алгоритмы, языки программирования и т.д. — это всего лишь инструмент и средство, а не цель. Если ими не уметь правильно пользоваться — то это мусорные знания.
                                                                                                        • 0
                                                                                                          Бесполезное занятие рассказывать про сортировку пузырьком, не показав как её можно использовать.
                                                                                                          Не понял: что непонятного в том как использовать сортировку? Что тут особо объяснять? Возьмите любую последовательность слов или чисел и отсортируйте по алфавиту или по возрастанию. Что тут непонятного?
                                                                                                          • 0

                                                                                                            Ну, допустим, назначение сортировки в быту еще более менее понятно. Но вы ведь не только ее собираетесь доносить студентам? А что еще?

                                                                                                            • 0
                                                                                                              доносить студентам
                                                                                                              Не студентам, а школьникам! Студент хочет, чтобы его научили программировать, а большинство школьников считает, что им это не нужно. И большинству действительно не нужно.
                                                                                                              А что еще?
                                                                                                              Что-то такое же понятное на бытовом уровне. Нпр., кратчайшие пути в графе достаточно наглядны. В комбинаторике много занимательных задач.
                                                                                                              • 0
                                                                                                                В комбинаторике много занимательных задач.

                                                                                                                Для школьника? Вы серьёзно?

                                                                                                                • 0
                                                                                                                  См. С.М.Окулов, Программирование в алгоритмах: перестановки, размещения, сочетания, разбиение числа на слагаемые, последовательность из нулей и единиц без 2х единиц подряд и т.д. Я когда-то в школе основы комбинаторики на уроках математики проходил. Не знаю есть ли комбинаторика в современной школе.
                                                                              • +1
                                                                                Оберон, модула… 2017 год на дворе, что с вами не так??