Как стать автором
Обновить

Комментарии 623

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

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

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


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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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


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

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


if cond1 and cond2 then
   call1
else 
   call2;

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

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

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

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

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


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

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

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

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


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

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

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


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


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

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

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

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

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

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

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

Смотрите:


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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

OWL

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лол, письменность? Вы чё шумеры штоле? На дворе 2017!!! Поди прогуливали телепатию в школе?)))


Я ни разу не в защиту оберона или модулы, но я например вообще не знаю JAVA. При этом у меня есть знакомый, который вообще не знает Python… И это никогда не мешало нам обсуждать алгоритмы и архитектуры.


Ну восхваляет кто-то фортран в 2017-м, зачем на него агриться если только цель не в умышленном троллинге?))

Лол, письменность? Вы чё шумеры штоле? На дворе 2017!!! Поди прогуливали телепатию в школе?)))


Ну вообще решето Эратосфена — это алгоритм для поиска всех простых чисел. Просты числа — если не в курсе, активно применяют в криптографии, кодировании и т.д. А еще с простыми числами есть ряд нерешенных проблем математики (например первая и вторая проблемы Ландау. проблема Гольдбаха и т.д.).

А теорема Пифагора… Вы как расстояние будите считать в прямоугольных координатах? Все, вся прикладная вычислительная графика и геометрия проходят мимо. Или решать Диофантово уравнение? Епс, да все задачи оптимизации, машинного обучения проходят мимо.

Хотите поновее? Ну в геометрии есть пространство Минковского — конец 19-го века. сумма Минковсокго вон используется в motion planing в робототехнике и играх. Но без теоремы Пифагора и прочих, даже с вазелином туда не пролезете.

Ну восхваляет кто-то фортран в 2017-м

А че его восхвалять? Например вот это написано на Фортране. Вот Фортрановски библиотеки при этом эти библиотеку лезут ну просто везде — практически в любой программе для численного моделирования и расчетов (естественно это не говноподелки на Пухтоне) торчит фортрановский код и библиотеки. Для HPC у Фортрана только одна альтернатива — Си, хотя недавно туда пробилась Julia. Так что, что его славить — его повсеместно используют, благодаря чему можно, например долететь на самолете из Москвы во Владивосток и неубиться…
Похоже вы не можете в сарказм…
Не могу :-)
«видимо, проблемы молодежи во многом в ней самой, а не только в образовании или в отсутствии возможностей»

сколько много вакансий в науке смежной с программированием! Доски объявлений прям так и ломятся от предложений: статистика, аналитика, ИИ, компьютерное зрение, квантовая физика, робототехника, компьютерное моделирование, микроэлектроника, станкостроение, логистика, прогнозирование…
где все эти вакансии? Где я могу применить свои знания в математике, физике, знании алгоритмов?
К примеру, можете сделать программу, которая в Го или даже в шахматы играет лучше существующих, можете внести ясность в проблему P=?NP и т.д. Но хорошо если что-то из этого получится у одного человека из всего населения Земли за 10 лет. А для остальных более мелкие дела. Кто сделал хоть что-то при прочих равных имеет больше шансов получить работу, чем те, что ничего не сделали.
вот вам гипотетическая ситуация, молодой учёный разработал термоядерный реактор у себя дома, казалось бы, вот он стоит работает мини реактор и способен из стакана морской воды произвести энергии для целого города, это самое величайшее открытие за все времена.
А что дальше? для строительства полномасштабной электростанции нежны деньги, где их взять молодому учёному? ведь в друзьях у него нету Генри Форда, связей в государстве тоже нет, он было побежал в прессу, что бы рассказать о своём открытии, а там ему сказали извините не формат нашего издания, но вы можете заплатить и мы опубликуем, потом он побежал искать инвесторов, но там ему сказали, я не понимаю этот ваш термоядерный синтез и вкладывать не буду, когда он ещё там окупится… и что теперь? Это открытие никому не нужно? никому не нужна дешёвая и безопасная энергия…

вот так и ваша программа на go, ни кому не нужна, и нет смысла тратить время в пустую на разрешение задачи p=np…
так что нет никаких прочих равных, равенства впринципе нет, хоть делай хоть не делай
нет смысла тратить время в пустую на разрешение задачи p=np…
Молодой ученый Г.Перельман решил близкую по сложности задачу, и ему присудили премию в миллион $$. То что он от нее отказался — его дело.
PS Если дома термоядерный реактор, то можно соседям электричество продавать за пол-цены, выручку использовать на расширение своей электросети и на ее охрану :)
Если реактор уже стоит и работает, и уже способен из стакана морской воды произвести энергии для целого города, то то на этом этапе проблем со сроками окупаемости уже быть не должно…
господа, вы явно не пробовали что-то продать, во-первых сбегутся соседи и нарекут тебя террористом, во-вторых прибегут всякие службы и скажут что это опасно и немедленно нужно всё это убрать, даже если придраться не к чему вам всё равно не дадут это продавать…
вспомните хотя бы историю с геотермальной энергией и парниками для овощей, бизнес закрыли, парники заморозили, ибо не порядок, как это так на халяву энергию качают и налоги не платят
Налоги надо платить и спать спокойно (С)… ну, и со всеми, как говорят, можно договориться… видимо Вы не пробовали что-то продать — раз этого не знаете :) Лично у меня нет реактора, но ради интереса пробовал продавать ПО через одну из специализированных на этом фирм (не называю, чтобы не упрекнули в рекламе). Вполне продавалось — они даже налоги за меня платили — мне только оставалось подтверждать поступление денег на мой счет.
я вам не про пряники на базаре говорю, а про полноценную дорогостоящую технологию, которую что бы создать необходимы вложения, которые ну уж никак не потянет один программист… так сказать, что бы вспахать поле и что-то там вырастить мне нужен комбаин, склады машины и рабочие, а сажать картошку с помощью лопаты и продавать на местном рынке, да ещё и 30к рублей налогов платить государству, так себе занятие…

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

что бы вспахать поле и что-то там вырастить мне нужен комбаин, склады машины и рабочие, а сажать картошку с помощью лопаты и продавать на местном рынке, да ещё и 30к рублей налогов платить государству, так себе занятие…
Многие лопатой работают и живут, но некоторые любят говорить, что им нужны условия и даже картошку для собственного пропитания, а не то, что для продажи, вырастить не могут.

молодёжь хочет ещё как
Не вижу доказательств этому утверждению. А вижу, что лопатой картошку сажать не хотят.
А теперь оказывается, что ничего он не разработал, т.к. «необходимы вложения». Подменяем условия задачи, чтобы опровергнуть любое решение.

гипотетическая — основанный на гипотезе, на предположении; предположительный, предполагаемый;

По вашему молодой учёный, это робот без потребностей, способный силой мысли (читай «без оборудования и адронного коллайдера») создать теорию всего? Вроде бы наука у нас продвигается эмпирическим путём, сначала теория, потом практика, на которую нужны ресурсы.

Не вижу доказательств этому утверждению. А вижу, что лопатой картошку сажать не хотят.


в первом посте я саркастически, попросил указать хотя бы пару вакансий из целого списка важных научный направлений, где я мог бы с удовольствием использовать свои накопленные знания, которые на сей момент считаю бесполезными… так что начните со списка вакансий, а уже потом осуждайте.
Что за история с парниками для овощей, вы про компанию «Зеленая ферма»? Так она работает, весной 2018 начнет строительство.
Тут всё очень противоречиво. Школа, сама по себе, даёт только общие представления и призвана, в основном, научить думать, решать задачи, искать информацию и целенаправленно работать. С другой стороны, ученики делает свои проекты. Нынешним школьникам, которые растут вместе с гаджетами, легко разбираться с языками программирования и средствами разработки. Чего же хотят от образования? Обеспечить всех потенциальных работников общей высокой математической культурой (дискретная математика+теория алгоритмов+схемотехника) и культурой ведения проектов (чтобы все создавали программное обеспечение по единым лекалам, а не на коленке)? Вузы, вообще, живут по своим общеобразовательным стандартам и выполняют определённые учебные планы. И… чему учить? Программированию вообще или проектированию в определённой среде разработки? Всё-равно, программированию нельзя научиться, наблюдая как это делают другие.

Но!

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

В этом смысле, вспоминается «Конкретная математика» Дональда Кнута, «Инофрматика» Бауэра и Гооза.

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

Правда, у любой монеты есть оборотная сторона. Если мы начинаем повышать планку, то как мы сможем её, затем, опустить. Ведь, самое сильное разочарование, которые получает выпускник школы и института, заключается в том, что на практике всё оказывается совершенно другим, чем в теории. Приходишь на работу, а том тебя просят забыть всё, что ты учил раньше, и учиться приходится совершенно новому делу (причем, именно, делу) и учиться совершенно заново.

Если бы можно было бы добиться, хотя бы, совпадения теории с практикой, то… была бы сделана добрая половина дела!
Приходишь на работу

Да. Прежде всего школьнику нужно помочь понять: на какую работу он хочет приходить. Я очень надеюсь, что большинство не захотят приходить на IT-работу, иначе кто нас будет кормить и лечить…

а том тебя просят забыть всё, что ты учил раньше, и учиться приходится совершенно новому делу (причем, именно, делу) и учиться совершенно заново.


Это обычно технологии. А алгоритмы почти не меняются, меняются языки их реализующие.
Кормить? роботизированный сборщик урожая.

ИИ также лечить уже практически полностью умеет...

А зачем каменщику сопромат или зачем архитектору мозоли от мастерка?
Каменщик со знаанием сопромата ничем не лучше другого, а архитектор с мозолями совсем не нужен.
Врядли Гауди или Фиораванти сами лично таскали кирпичи и клали их ровнее и краше своих работяг.
Поэтому отделяйте пожалуйста. В СССР программист получался в техникуме и не нужно было ему никакое высшее образование. Высшее образование нужно только для создания нового. Новизна без фундаментального образования получается только у гениев или случайно.
Как у Ньютона «я стоял на плечах гениев» поэтому и видел дальше.
В технике выделяются: средняя техническая квалификация техник-программист (ранее «программист-лаборант») и высшая техническая квалификация инженер-программист. (Вики)
Я не встречал инженеров-механиков, которые не умели работать на станке. Так же как и инженеров-электронщиков, которые не умели паять. Другое дело, шо по-хорошему за них это должны делать специально обученные люди, но общие навыки и понимание есть у всех.

Каменщик со знанием сопромата => потенциальный инженегр или как минимум мастер над другими каменщиками (шо впрочем инженегрская должность), каменщик без знания сопромата — так и останется каменщиком.
Шутка про Паскаль не очень.
А про школу понимание проблемы верное, а вот вывод не тот, да в школе мы не можем научить всем предметам через силу, поэтому в школе нужно давать только те предметы, необходимость которых несомненна — раз школьное образование обязательное, то и изучать там надо только то что обязательно знать, я вот собрал примерный список такого.
каждый должен уметь подготовить проект вещи для изготовления на домашнем 3d-принтере
У меня нет 3d-принтера :( А 3ds max я пробовал лет 10 назад. Т.о. я не достоин аттестата зрелости?
К сожалению это как раз мелочь, более серьёзная проблема в сложностях с логикой у текущих выпускников.
Хотя формулировку в данном случае нужно поменять, раз не всем понятно, что речь о будущем, да и не обязательно ему быть домашним.
А вот прежде всего ИМХО стоит определиться с масштабом в подобном списке. Умение печатать вслепую 10 пальцами — мелочь или не мелочь? Важнее это 3d-проекта?
Сложный вопрос, с одной стороны интерфейс человек-машина важен, с другой стороны, его скорость не является чем-то прямо критичным, немного видов деятельности где эта скорость важна, точнее она нужна, но мало где разница между обычным набором и слепым что-то меняет.
Т.е. набирать на клавиатуре нужно уметь не одним пальцем, и логично обучать слепому десятипальцевому, но не факт что надо это проверять на экзамене — набирает с разумной скорость и молодец.
В том числе основы выживания — как в природных условиях
А здесь в какой мере изучать основы? Уметь развести костер из сухих дров и из мокрых веток — две большие разницы. И переночевать на 40-градусном морозе — большое искусство. Или и тут как с набором?:

набирает с разумной скорость и молодец
Конкретику на данном этапе сложно озвучить (я один не могу составить подробную школьную программу), тут много факторов, включая то, что время лимитировано, придётся балансировать все предметы.
Но данный предмет важен и думаю будет детям весьма интересен, особенно благодаря наличию практики, поэтому есть шанс и про мокрые ветки и про мороз рассказать, хотя в первую очередь для выживания нужно умение ориентироваться.
для выживания нужно умение ориентироваться
Зависит от ситуации. Нпр., самолет сделал вынужденную посадку в не населенной местности. Тут как раз ориентироваться вредно и не нужно далеко уходить от самолета — его найдут быстрее, чем отдельного человека.
3D-принтер — специфический инструмент для определённого круга задач, скорее всего таким и останется. Домашний 3D-принтер будет востребован где-нибудь на уровне настольного токарного станка.
Да, формулировку поправлю, не домашний и не принтер, хотя суть та же.
Что такое "нпр."?
нпр.=например
Всё-таки, это было бы крайне интересно придумать новый учебник по информатике. Заинтересовать всех! Сделать красиво! Кто, как не хабровчание, смогут это сделать? Можно было бы совместными усилиями сделать. И для собственного удовольствия, и для того, чтобы было кого на работу брать.
Отличная идея!
Предлагаю Викиучебник. Но в любом случае, я — ЗА!

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


Викиучебник наверное стоит просто начать. А там уже видно будет.

Да, единой точки зрения нет. Но некоторые точки соприкосновения все-таки появляются. Много споров, но выводы спорщиками тоже делаются. В общем, пользы больше чем вреда.

И да, меня уже не раз тыкали носом, в то, что я учитель и всему этому тут не место. Однако, есть хаб «Учебный процесс в IT» и нравится вам это или нет, но этот процесс теперь начинается в школах со второго класса. Мне не нравится, то во что этот процесс выливается, и, оказывается, не мне одному. Хабрахабр — это сообщество. Изучите список хабов и вам станет понятно, для кого этот ресурс.

Поэтому дискуссия регулярно уходит в оффтопик про ООП и фичи ЯП.


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

Викиучебник — это не Word-овский документ, но начинается он именно там. И он начат — это документация и туториал по NumPy. Однако, принять участие в совместном написании учебников я бы хотел. Причем, думаю, что и вы тоже.
Все гораздо проще, нежели видит автор. Изучение областей, в которых ученик не заинтересован прокачивает его связи в мозгу. Поэтому обширная программа с кучей неинтересного может вызывать определнное сопротивление у падавана, но он суммет с ним справляться. Зачем учить стихи?… ребенок, много «зубривший» в детстве, во взрослом возрасте будет легче переключаться между задачами именно за счет всесторонней развитости его органов восприятия, нервных центров и связей в мозгу, приобретенных в школе.
Была 10-и летка — сделали 11-и, м.б. до 15 классов довести? Пусть стихи учат.
На самом деле между 14 и 20 годами большая часть связей в мозгу массово самоустраняется — это процесс который происходит у всех. Эдакое упрощение структуры мозга. Естественно, часть воспоминаний и знаний просто выветриваются (прежде всего те связи, которыми не пользуешься), что-то очень сильно фрагментируется, остается только минимальный набор самых востребованных связей, зато происходит резкий скачек в интеллекте, причем это не случайный процесс. Вообще такая оптимизация мозга кагбэ всю жизнь происходит, но именно в трубку 14-20 лет она самая масштабная и там реально часть навыков и знаний просто исчезает. По аналогии в ML введена такая техника как вербализация (прореживание) нейросетей.

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

Проблема только в том, что в этот период отделы и функции мозга мозга только формируются, например, формирование мелкой моторики завершается только к 9-10 годам. Речь окончательно формируется к 6 годам, а общая моторика к 4. Префронтовая кора (рассудительность) заканчивает свое формирование только к 13-14 годам.

Вот только дело в том, что процесс обучения завязан на положительном подкреплении, а там процесс сложный, но в общем виде так: что лучше и приятнее тренируется, то и продолжает тренироваться и тут очень большое влияние оказывает эмоциональное состояние и получение быстрого и ощутимого эффекта. Поэтому стихи Пушкина вспомнят единицы — а матерные частушки будут знать все. В дальнейшем (всю жизнь) мозг и дальше будет выкидывать все что считает малополезным и закреплять то, что он посчитает нужным: не так уж и много у человека нейронов… а вот у кита дофига и он может позволить себе хранить в памяти рельеф мирового океана. И как раз в подростковом возрасте с 14-15 лет, начинается тотальнейшая перестройка — все лишнее просто убирается, то что получалось лучше всего — наоборот усиливается. В общем начинается процесс специализации, который длится до 17-20 лет (вообще точный период у разных людей разный).

И только после того как специализация из-за прореживания завершится — формируется абстрактное мышление, собственно только к 17-18 годам они учатся полноценно планировать и оценивать риски, оперировать сложными вещами в голове.

И к 20-21 году заканчивается формимидирование высших психических функций.

Т.е. реально до 17 лет давать абстрактные вещи бесполезно — мозг их просто плохо воспринимает, а когда начинается большая чистка — все что плохо понималось выкидывается на свалку. Ну а до 21 года бесполезно давать полностью самостоятельные и очень ответственные задания.

А самое главное — что бы какие-то знания закрепить и не потерять во время большой чистки — необходимо что бы отдача от них была моментальная и ощутимая, т.к. до 17 лет человеки еще не умеют строить далеко идущих прогнозов. Именно поэтому, например, навыки письма и арифметики у всех людей одинаково хорошо закрепляются — ну тупо потому что как сразу им начинают учить, ими тут же начинают пользоваться, просто на бытовом уровне человеку приходится постоянно считать и писать + по другим предметам надо делать тоже самое. А вот с геометрией уже ж0па начинается — слишком много абстракций, которые еще юные котелки плохо переваривают, но посчитать площадь квартиры в итоге все равно сможет каждый (опять таки — это практический навык), но большинство теорем никто и не вспомнит и не сможет доказать (хотя в школе могли доказывать). Тоже с навыками труда и даже с частью физики — т.к. с физикой мы на интуитивном уровне взаимодействуем, но только с частью: ядерную физику никто не вспомнит и даже после универа человек будет свято верить что Эйнштейн всех обманул, а мериканцы не высаживались на Луне. А вот со всякими химиями, биологиями и историями — кому как повезет. Если пол детства провел за пестиками и тычинками, коллекционируя гербарии, то что-то может и останется, но таких мало и естественно большинство не вспомнит сразу (вот прям сразу) после школы что такое эукариоты и прокариоты, а для людей в 40 лет может оказаться настоящим открытием, что вирусные заболевания антибиотиками не лечат, а гомеопатия — обман.

Потом-то, начиная с 20-и летнего возраста, конечно, человек сможет осваивать новые и более сложные знания самостоятельно и восполнять пробелы в знаниях. Проблема вот только в том, что специализация мозга уже давно закончилась и в некоторых областях человек оказывается в пролете. В принципе тут ничего плохого, но хренова бывает тогда, когда человек оказывается в пролете с основными навыками и программирование на самом деле — это вторая грамотность. А хваленая советская и нынешняя постсоветская система образования — мягко говоря положительному подкреплению не способствует + нездоровая атмосфера в учительском корпусе. В итоге в универе народ начинает учится заново.
реально до 17 лет давать абстрактные вещи бесполезно — мозг их просто плохо воспринимает
Не соглашусь. Примерно в 15 лет мы с моим школьным товарищем увлеклись Достоевским, а потом философией — естественно наиболее немарксичной и наиболее абстрактной: Платон, Кант, Шопенгауэр, Флоренский. Пытались создать свою философскую систему, часами спорили о солипсизме и детерминизме и т.д. Другие мои товарищи в это время начали писать стихи и прозу (очень нереалистичную). Мы учились в физмат школе, но абстракций физики и математики нам казалось мало. С юношеским максимализмом хотели проникнуть в самую суть мироздания. Не лень было! :)
PS BTW Льюис Кэрролл, в числе прочих, подметил, что маленькие дети очень любят абстракции и возникающие из них парадоксы. В этом секрет успеха его Алисы. Чего стоит один вопрос Безумного чаепития «Как нарисовать множество?»
Скорее всего им нравятся именно пародоксы + вау эффект: круто то, что не понятно. Все новое и неопознанное — увлекает, это изначально во всех человеках заложено. Собственно без этого бы и не было нормального обучения, да и вообще трудно представить себе выживание вида, не пытающегося что-нибудь новое исследовать (например, новый ареал для распространения).
Ok. Именно поэтому я и думаю, что дети и подростки лучше понимают абстракции, чем взрослые.
Ну Платон и Кант — это далеко не самое сложное в философии, Платон так вообще самые начала, вот если бы вы там обсуждали Ильина или Гегель с каким-нибудь Бодийяром (правильно написал?).

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

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

Ну и повторюсь — развитие все же несколько индвидуально.

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

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

Пожалуй мой интерес к философии начался сильно раньше, чем я познакомился с книгами Достоевского. В 4 классе прочел «Таинственный незнакомец» Марка Твена.
«Именно поэтому, например, навыки письма и арифметики у всех людей одинаково хорошо закрепляются » Это в какой такой вселенной — это происходит? Вы не знаете борцов за грамотность, которые не могут 2*2 посчитать? Или людей, которые понимаю сложный матан, ну имеет слабые навыки письма? Я не говорю что так и должно быть, нет конечно — это базовые навыки, ну так происходит.
Или людей, которые понимаю сложный матан, ну имеет слабые навыки письма?

Эти монстры матана в университет поступить смогли? Значит сдавали русский язык, даже те кто идет вне конкурса, должны сдать все экзамены не хуже чем «удовлетворительно». Если сдали, то значит навыки письма достаточные.

Вы не знаете борцов за грамотность, которые не могут 2*2 посчитать?

В магазин они своих помощников отправляют за покупками и верят им на слово?

В общем IRL такие личности могут попасться только в ПНД. К слову сказать любые навыки атрофируются, если ими не пользоваться
«В магазин они своих помощников отправляют за покупками и верят им на слово?»
Видимо да, так как много раз слышал «я гуманитарий — я не знаю математику», после того как я видел пример банального не умение считать, да согласен это много говорит о моём круге общение… но если вы говорите о одинаковом знание и категорично, то должны брать всех, а не только. О, по поводу удовлетворительно — у меня так, но у меня проблемы с начальной школой даже(если брать русский). Удовлетворительно это Каким-то рандомом смог сдать, а не достаточные навыки
Эт Вы наверное просто никогда не видели людей у которых не могут сформироваться или были утеряны навыки речи и письма — есть целый ряд патологий на эту тему: афазия, дисграфия и т.д. Как правило это все серьезные патологии.
Ну кстати один легкий пример можно увидеть по телевизору — Кличко, который иногда трех слов связать не может — это все результат его боксерской карьеры, где часто приходиться получать по голове.
«Эт Вы наверное просто никогда не видели людей у которых не могут сформироваться или были утеряны навыки речи и письма — есть целый ряд патологий на эту тему: афазия, дисграфия и т.д. Как правило это все серьезные патологии.» Ну это я понимаю, да
> 17-18 годам они учатся полноценно планировать и оценивать риски, оперировать сложными вещами в голове. И к 20-21 году заканчивается формимидирование высших психических функций.

откуда цифры? По Пиаже насколько помню окончательное формирование ммышления в период с 11 до 15 лет
откуда цифры?

Из книг и статей по нейрофизиологии. Конкретно такие цифры вроде как приводила нейрофизиолог Карла Ханфорд. Но у других будут аналогичные цифры.

По Пиаже насколько помню окончательное формирование мышления в период с 11 до 15 лет

Пиаже умер лет за 10 до, например, появления функционального МРТ. Миелинизация (процесс формирования миелиновых оболочек вокруг отростков нервных клеток ) ассоциативных путей в головном мозгу начнется со 2-го месяца жизни и заканчивается только к 25 годам. Ретикулярная формация завершает свое формирование в 18 лет — а она не только контролирует рефлекторную деятельность спинного мозга, но и влияет на обучение, например.

И Пиаже утверждал что в период с 11 до 15 лет ребенок только формирует умение оперировать гипотезами — это еще не абстрактное мышление, только зачатки. К слову сказать это его последняя работа, было бы у него больше времени — вывел бы больше периодов развития.
Мне кажется вы что-то путаете, мы ведём речь не о нейрофизиологии, не о строении и развитии мозга как органа.
Мы ведём речь о способностях в решении определённых задач, ни МРТ, ни формирование каких-либо оболочек не имеют в данном вопросе никакого значения, мы рассматриваем человека как чёрный ящик — дали задачу, справился, значит всё сформировалось, нет — нет.
Так вот мне и интересно на каких такого рода исследованиях базируется утверждение, что человек после (в среднем) 14 лет неспособен решать какого-то класса задачи? Пока всё говорит об обратном — Пиаже никто не свергает, сроки наступления уголовной ответственности только снижают, да и элементарный жизненный опыт показывает, что нормальный человек и в юности может думать, а дурак таким и помрёт.
Мы ведём речь о способностях в решении определённых задач, ни МРТ, ни формирование каких-либо оболочек не имеют в данном вопросе никакого значения...

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

Так вот мне и интересно на каких такого рода исследованиях базируется утверждение, что человек после (в среднем) 14 лет неспособен решать какого-то класса задачи?

На исследованиях нейрофизиологов, нейробиологов, психологов, неврологов, психиатров, педагогов — тут целый сомн исследователй, т.к. эта научная область междисциплинарная, но за последние 20 лет значительно выросли наши знания о мозге и возможности его исследования, правда все равно еще недостаточно. Та самая Карла Ханфорд, таблицу которой я приводил выше — чойт около 30 лет занимается проповедованием в школе, так шо помимо нейрофизиологии она еще и педагог.

дали задачу, справился, значит всё сформировалось, нет — нет

Вы можете давать общий тест на IQ в течении всей жизни и обнаружить, что с возрастом «сырые баллы» растут, особенно сильный качественный скачок между 17 и 25 годами.
Собственно есть, например Сиэтлское лонгитюдное исследование (которое проводилось на протяжении 40 лет), там например, пик по вербальному тесту вообще приходиться на 55 лет, а минимум на 25 лет, по пространственному тесту — 30 лет и снижается только после 60, по умозаключениям — достигает пика в 40 лет и начинается снижаться только после 60, успешность по числовому тесту растут от 25 лет и до 50, после чего начинает снижаться.
Все эти тесты не требуют специальных навыков (но образование, естественно, как и любая другая форма тренировки мозга улучшает показатели).

мы рассматриваем человека как чёрный ящик

Рассматривайте сколько угодно, но способности человека напрямую ограничены его уровнем физиологического развития — оно последовательно и долгое — занимать может до 20-25 лет. Нравиться Вам это или нет, но это объективная реальность.

сроки наступления уголовной ответственности только снижают

Вообще-то их скорее поднимают. В начале 20-го века никого не удивлял смертный приговор для 12-и летнего, а сейчас про такое наверное разве что из Ирана или Нигерии услышишь. К слову сказать в СССР в 30-ых годах за отдельные преступления могли судить уже с 12 лет, сейчас только с 14 и то только за особо опасные. Основной возраст уголовной ответственности — обычно 16 лет, но до 18 лет в обычную тюрьму не отправят. Во многих странах существует градация по составу преступления в зависимости от возраста. Хе, в США алкоголь не продают лицам младше 21 года, а в армию можно с 18 лет или с согласия родителей 17 лет ;-) Вот такие вот они странные американцы — водить машину можно с 14, в армию служить с 18, а бухать только с 21, как думайте почему? :-)

Но вообще Вы соскочили с темы — «что такое хорошо, и что такое плохо» — уровень мыслительной деятельности ниже, чем оперирование абстракциями или эмоциональная зрелость.

Пиаже никто не свергает

Естественно, просто его последними исследованиями — были исследования по тому как 11-15 летние дети усваивают формальную логику, а потом он умер.
Ну логично, сам себя процитирую:
префронтальная кора заканчивает свое развитие к 13-14 годам

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

Ну так это и есть:
И мой вопрос был в том какую задачу (класс задач) не может решать человек после 14 лет?

IQ и все схожие тесты — это есть задачи, нескольких классов: на пространственное мышление, вербальное, работа с цифрами и т.д. и т.п. Причем они не требуют специальных навыков. Чем лучше котелок работает, тем быстрее и больше заданий решается. Вот там с 14 до 25 прям взрывной рост идет каждый год.
IQ разве что эмоциональный интеллект не проверяет, но с ним сложнее чем треугольниками и слово-сочетаниями.

Ну если хотите наглядный пример: Самолетик, FlappyBird и Stardew Valley. Первую игру создал подросток в 14 лет, вторую игру самостоятельно реализовал 16-и летний подросток, ну а тертью игру 4 года разрабатывал чувак после колледжа, работавший библиотекарем. Вот и сравните сложность работ Самолетик vs Flappy Birds vs Stardew Valley — вот Вам и разница между 14, 16 и 20+ годами, на примере синглового проекта. Другой пример: Magicka — её разработчики ей начали заниматься еще в университете, выиграли грант, организовали фирму и выпустили спустя несколько лет игру — им тоже было 20+.
Все такие умные:
Особенно забавно это читать после того как начал кодить в 12.

имеют столько инструментов и свободного времени, каждый новый учебный год генерирует толпы школьников которые собираются создать убийцу WOW/Diablo/Crysis (нужное подчеркнуть), но у них нифига не получается, потому что это требует:
1. Знание и умение применять сложные алгоритмы, несколько сложнее, чем сортировка пузырьком
2. Умение самостоятельно строить реалистичные планы и организовывать работу… длительную работу
3. Разработку грамотной архитектуры
4. Собственно долго и упорно работать
Т.е. Самолетик они создать могут, сделать свою SCAD или Космических Рейнджеров — нет.
Я вот только про одного школьника (уже не школьника, уже студента) знаю, который к успеху пришел. И опять таки чуваку не 14 лет, а 17 (уже больше) и там не рядовой школьник — олимпиадник, углубленное изучение математики, все дела. И то это скорее всего казузистика (хотя с учетом того, что инструменты разработки упрощают жизнь все больше и больше, планка падать потихоньку буде), все это примеры достаточно выдающихся людей, несколько круче среднестатистических.

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

Нет необходимых навыков — нет возможности решить задачу, как Вы назвали нет принципиальной возможности. Навыки человеком приобретаются самостоятельно, уровень овладения навыками и обучаемость напрямую зависят от его развития. Вот начиная с 20 лет, человек может освоить и применить любые навыки, которые соответствуют его специализации мозга (которая формируется в 13-17 лет примерно), до 20 лет — нет, только часть более простых.

Так что в 14 лет человек может с легкостью паять также хорошо как и опытные паяльщицы, потому что вся моторика уже развилась, а вот возглавить УФТИ Ландау смог только в 24 года, а первую работу по теоретической физике он опубликовал в 20 лет — не смотря на то, что это была архинезаурядная личность, который с детства опережал сверстников в развитии.

Вот вам и принципиальная возможность — в 20 лет можно выполнить работу по теоретической физике и в 24 озаглавить институт, а в 14 лет — нет, принципиально нет, но работать радиомонтажником можно и в 10 лет.

Самым кстати молодым доктором наук за всю историю России — был Маргелян, защитил диссертацию в 20 лет, самый молодой профессор за всю историю человечества — была Алия Сабур, с 18 по 19 лет была профессором, но потом ей контракт так и не продлили — к слову сказать настоящие профессора в США работают по пожизненным контрактам, и вообще ее квалификация под большим вопросом (суды там какие-то были даже). Вот Вам и
принципиальную возможность

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

Она и была раньше с 12 лет. Потом повысили. Но тут опять ограниченный состав преступлений. При этом для того что бы понимать «что такое хорошо, а что такое плохо» университетов кончать не надо.

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

Особенно забавно это читать после того как начал кодить в 12.

т.к. до 17 лет человеки еще не умеют строить далеко идущих прогнозов

в 14 продумывал как раскручивать свой сайт, в том числе видео-уроки, статьи, карты для игры, модели/звуки и так далее. В голове прикидывал что наиболее эффективно. Прекрасно понимал что удобная навигация и нужные ссылки под рукой делают контент более эффективным в плане возвращения пользователей на сайт. Хотя слова «контент» тогда не знал/не юзал, но общее понимание видимо имел.

геометрия — слишком много абстракций, которые еще юные котелки плохо переваривают

Очень смешно. Просто покажите урок в применении к движку компьютерной игры. Сразу вовлеченность возрастет.
Особенно забавно это читать после того как начал кодить в 12.

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

Вы и предлагайте переход от абстрактной подачи материала, к практической.

Особенно забавно это читать после того как начал кодить в 12.

Вы уже в 12 лет умели оперировать паттернами и разрабатывать архитектуру, применяли замыкания, могли написать компилятор и разрабаться с языком только по его спецификации (без примеров)?

в 14 продумывал как раскручивать свой сайт, в том числе видео-уроки, статьи, карты для игры, модели/звуки и так далее. В голове прикидывал что наиболее эффективно. Прекрасно понимал что удобная навигация и нужные ссылки под рукой делают контент более эффективным в плане возвращения пользователей на сайт. Хотя слова «контент» тогда не знал/не юзал, но общее понимание видимо имел.

Хотя слова «контент» тогда не знал/не юзал, но общее понимание видимо имел — это наверное ключевое выражение в этом увлекательном рассказе.

Вы уже в 12 лет умели оперировать паттернами и разрабатывать архитектуру, применяли замыкания, могли написать компилятор и разрабаться с языком только по его спецификации (без примеров)?

Я вполне себе понимал классы/графический интерфейс как абстракцию.

Вы и предлагайте переход от абстрактной подачи материала, к практической.

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

Хотя слова «контент» тогда не знал/не юзал, но общее понимание видимо имел — это наверное ключевое выражение в этом увлекательном рассказе.

Если вы не поняли, то без знания как называется это «по научному» мозг сам выделил эту абстракцию и использовал для себя. Да и слово контент тогда было не так популярно.
Из практического примера мозг сам может выдернуть абстракцию.

А может и не выдернуть. Или выдернуть неправильно. С простыми примерами, типа арифметики на яблоках — это нам не грозит. Но в чём-то менее бытовом...

В любом возрасте можно неправильно выдернуть и/или применить абстракцию или их комбинацию.

Так и я о том же. Не в возрасте дело, а в сложности абстракции.

Точно также как в арифметике с яблоками.

Это называется «примитивная чувственная абстракция». Ключевое слово тут «примитивная».

Из практического примера мозг сам может выдернуть абстракцию.

А если нет исходного практического примера? Если надо выделить абстракцию из абстракции, на основе чисто теоретических знаний, а потом их применить на практике? :-) А почему у одних абстракции выдергивает у других нет или по разному?

Если вы не поняли, то без знания как называется это «по научному» мозг сам выделил эту абстракцию и использовал для себя. Да и слово контент тогда было не так популярно.

Ну это уровень: отделить содержимое рюкзака от самого рюкзака. Ну да, дети с этим справляются.
Смогли в 14 лет применить для сайта теорию массового обслуживания? Провести нагрузочное тестирования, все дела?
С теорией массового обслуживания не знаком, а про проблему 10k соединений читал как раз приблизительно в 14. Где то в 15 написал простого бота на twisted, и вообще въехал в асинхронщину. Было понимание почему асинхронщина выигрывает в большинстве случаев в производительности в отличии от многопоточности.

И да, провести нагрузочное тестирование в 14 лет вполне реально. Зависит от уровня этого тестирования конечно, потестировать гугл далеко не каждый взрослый сможет к примеру.

Это называется «примитивная чувственная абстракция». Ключевое слово тут «примитивная».

А покажите мне пример сложной абстракции, которую мозг не сможет выделить на конкретном примере (в контексте программирования)?
Хорошая статья. С вами мы уже немного копий поломали и… о-да! Я по прежнему, с многим согласен и несогласен! Мне кажется, взгляд не такой уж и «мета». Но это отличное начало, потому, что очень много статей о проблемах образования со взглядом «изнутри», а описать всю картину целиком — действительно непросто. Я честно говоря, даже понятия не имею, как это сделать, ничего не упустить, да еще и не ошибиться.

Может исследование операций?.. Образование — чертовски сложная система, которая в свою очередь, является частью государства — другой, еще более сложной системы. Или теория самоорганизации (синергетика)?.. все-таки, у системы есть параметры, значит могут быть уравнения, моделирование.

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

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


О- да! Рад нашей новой встрече! Спасибо! Рад, что статья Вам понравилась. Конечно же полного согласия быть не может, иначе не о чем было бы писать и нечего было бы обсуждать.

Мне кажется, взгляд не такой уж и «мета».

Если чисто формально, то я давно не преподаю.

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


Именно. Но ИМХО какие цели поставить — таким образование и будет.
Небольшой мысленный эксперимент. Дано: университет, например, МГУ. Там ряд факультетов: химический, физический, биологический, исторический, филологический. На каждом проходят специальные предметы. Попробуем представить себе, что все факультеты объединили и все студенты проходят все предметы всех факультетов. Зубрилы сойдут с ума от перегрузки, а лодыри не пострадают. Школа — это такой объединенный университет. Чтобы зубрилы выжили, их нужно разгрузить, т.е. каждого предмета давать на порядки меньше, чем дают на любом факультете МГУ.

Но я сюда еще обязательно вернусь!

Обязательно возвращайтесь. Вы — практик, за Вами последнее слово.

Вроде первое сентября уже давно прошло, а разговоры не утихают.

Очень не согласен с общим взглядом автора на происходящее и на возможные решения проблемы.

Для начала, вроде бы все согласны, что цель информатики в школе — это заинтересовать ученика предметом и дать хоть какие-то самые базовые понятия о профессии программиста и об информатике как науке.

Но если это так, то дальнейшие средства выглядят решительно странно. Во-первых, откуда здесь вообще математика и математическая подготовка? Да, математика нужна в решении задач вычислительной геометрии или решения уравнений, но точно так же биология нужна для решения задач computational biology. Мне при всём желании сложно вспомнить универсальные алгоритмы из классического списка, для понимания которых требуется хоть какая-то математика (не берём вопрос анализа сложности, это отдельная тема).

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

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

Например, почему бы не предложить нарисовать на экране шарик, который летает по прямой и отражается от стенок? Это была задача на 10 строк в QuickBasic. Или показать круговое движение: Земля вращается вокруг Солнца. Задание со звёздочкой: Луна ещё и вращается вокруг Земли. Или вот: мы не просто программируем алгоритм Дейкстры, а рисуем на карте как проходит маршрут.

Проблема в том, что на старых языках все эти трюки не работают, т.к. авторы этих языков жили совсем в другой реальности. Нарисовать что-то — проблема, осуществить анимацию — проблема, проиграть звук — проблема. Я вот не понимаю, как я буду объяснять ученику, что в 2017 году открыть jpeg картинку и перевернуть её вверх ногами алгоритмически это «сложно» (а чем плохая задача — преобразование матрицы, только не в её занудном математическом изложении). Когда у вас есть простые средства доступа к звуку, графике, интернету, открываются совершенно новые возможности, выходящие за рамки суконных традиционных задач (опять же, не будем критиковать авторов, они исходили из того, что возможно было спрашивать).

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

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

Я сам родом из той эпохи, но давайте здраво смотреть на вещи. Я сам в своё время взял труд почитать задачники по программированию 1970-х, когда авторы были вынуждены ограничивать себя ещё сильнее (например, нельзя было рассчитывать, что в языке есть строки). Так вот, это была катастрофическая тоска — решим уравнение методом Ньютона, а теперь давайте попробуем деление пополам, а теперь бонус: метод Гаусса системы решения линейных уравнений! Давайте всё-таки идти в ногу со временем.
дать хоть какие-то самые базовые понятия о профессии программиста
Не только программиста. И в физическом и в химическом ВУЗах будут учить программировать.

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

Мне при всём желании сложно вспомнить универсальные алгоритмы из классического списка, для понимания которых требуется хоть какая-то математика
Нпр., теория графов — математика. Алгоритмы на графах, начиная с балансировки деревьев, разве не требуют некоторых знаний из теории графов? А как быть с приближенными вычислениями? А Булева алгебра это не математика? Про криптографию поминать не буду. Что касается computational biology, насколько знаю, там очень активно применяют кластерный анализ.

вы по сути говорите, что за прошедшие 30 лет ничего лучше не изобрели
Нет. Я так не говорю. Я говорю, что ничего лучше для школы и для научных публикаций алгоритмов не изобрели. И не нужно. Pascal-like псевдокод для публикаций всех вполне устраивает — от добра добра не ищут.

Решение задач Прима-Краскала или поиск корней уравнения на уроке информатики — это ещё одна математика под другим соусом. Такая деятельность, во-первых, скучна абсолютному большинству, а во-вторых, очень слабо отражает реальные задачи повседневного программирования. Если уж рассказывать о программировании, то брать хотя бы занятные задачи, в которых, тем не менее, есть алгоритмы.
И поиск корней уравнения на уроке математики не менее скучен. М.б. и там брать более занятные задачи?

выделять буфер постоянного размера — спасибо, давайте ещё научим детей пить и курить
Не знал, что буфер постоянного размера в несколько десятков байтов выглядит столь безнравственно!

Давайте всё-таки идти в ногу со временем.

Давайте только посмотрим сначала: куда мы придем. Всякие шарики от стенок — это уж тогда не доморощенным путем делать, а через DirectX или, еще лучше, Unity3d. А почему Вы уверены, что все школьники хотят делать игрушки или даже играть в них? Тем более в примитивные игрушки, потому как ничего впечатляющего на уроке в школе не сделать. М.б. лет 30 назад Земля вокруг Солнца впечатляла, но сейчас этим никого не удивить. Только предмет дискредитировать.
А почему не берем? Как раз очень важный момент для оценки алгоритма.

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

Алгоритмы на графах, начиная с балансировки деревьев, разве не требуют некоторых знаний из теории графов?

Каких, например?

А как быть с приближенными вычислениями? А Булева алгебра это не математика?


Это именно что математические задачи. Вы по сути говорите: «разве в математических задачах не применяется математика?» Ещё бы, применяется, но и задач вне области математики просто вагон и маленькая тележка, не будем о них забывать.

Что касается computational biology, насколько знаю, там очень активно применяют кластерный анализ.

Безусловно. Давайте обсудим, например, KNN и C-means. Математика здесь на уровне, не знаю, пятого класса? Я же не говорю, что всё на свете надо выбросить, математика никуда не денется, но для ученика десятого класса понимание KNN не потребует особенных интеллектуальных усилий, пусть это и проходит по ведомству математики.

Я говорю, что ничего лучше для школы и для научных публикаций алгоритмов не изобрели. И не нужно

Разумеется, изобрели: Python, да и не только. Вы лукавите, когда говорите, что в научных публикациях используется Паскаль. Там обычно используют некий псевдокод, который у нас традиционно называют «паскалеобразным», но в действительности его с тем же успехом можно назвать «бейсикообразным» или «питонообразным».

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

Вот это и печально, что не знали. Вы предлагаете учить детей либо обрезать имена по «техническим ограничениям» (которых нет), либо оставлять buffer overflow-уязвимости, хотя это исключительно и только проблема языков типа Паскаль и C.

почему Вы уверены, что все школьники хотят делать игрушки или даже играть в них?

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

Идея идти в сторону Unity и DirectX не лишена логики, но в целом это тупиковая ветвь дискуссии, т.к. вот есть некий непрерывный ряд языков и технологий от машинного кода и ассемблера до Unity и далее, и вы просто берёте в этом ряду произвольную точку и говорите: вот я хочу брать этот уровень абстракции, а влево-вправо не хочу, потому что гладиолус.

Можно сколько угодно дискутировать о том, насколько низкоуровневым должно быть школьное программирование, но считать, что в языке должны быть строки, но не должно быть ассоциативных массивов, например, по-моему, крайне странно, не вижу логики.
Не берём потому, что для классических алгоритмов это уже сделано (ну т.е. рассказать немного можно, конечно)
Не немного, а чем принципиально экспонента в наихудшем случае хуже полинома. Уже хорошо.

для собственных, как правило, уже потребуется математика за пределами школьного курса


К примеру, задача как-то классифицировать графы. И мы по-простому будем вычислять сумму степеней вершин (или удвоенную сумму). Берем матрицу смежности и суммируем все единицы. Разве оценка трудности данного алгоритма будет за пределами школьного курса? ;)

Каких, например?

Высота дерева.

Математика здесь на уровне, не знаю, пятого класса?
Кластерный анализ теперь в 5 классе проходят?

оставлять buffer overflow-уязвимости, хотя это исключительно и только проблема языков типа Паскаль и C.
Прежде всего я предлагаю не загружать детей понятием «уязвимость», хотя бы до тех пор пока взрослые не договорятся, что это такое. Особенно забавно звучит «уязвимость учебной программы»! Далее это проблема и Васика, разве нет?

Во-первых, это модель физического явления [...] это чистая физика, угол падения равен углу отражения, критерий столкновения и т.п. Тут масса тонкостей за простейшей обложкой.
Ага. Будем на уроках информатики изучать чистую физику.

К примеру, задача как-то классифицировать графы.

Зачем простому смертному, а тем более, школьнику классифицировать графы?

Высота дерева.

Ну это, конечно, жутко сложное понятие. Балансировка дерева, кстати, тоже на любителя задача.

Кластерный анализ теперь в 5 классе проходят?

Передёргиваете. Я предложил просто изучить KNN и C-Means, это задача на один день, и ничего тут изучать вообще не надо, достаточно знать, что такое евклидово расстояние.

Прежде всего я предлагаю не загружать детей понятием «уязвимость»… Далее это проблема и Васика, разве нет?

Абсолютно не надо загружать детей понятием «уязвимость». Вы просто покажете им, как выделить массив на 100 символов, а потом считать строку. А они просто потом будут это везде повторять. Спасибо за это от нас всех.
У Бейсика (а я про Питон, вообще-то...) такой уязвимости нет: «INPUT S$» считывает строку динамической длины.

Ага. Будем на уроках информатики изучать чистую физику.

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

Да и опять же, вы выбираете удобные цели для спора. Вот приводил же простой пример. Есть куча задач с преобразованием матриц. Транспонирование, поворот, интерполяция и т.п. Всё это можно сделать в виде скучнейших задач на ввод десятков чисел и вывод десятков других чисел, которые ещё надо осмыслить. А можно сказать, что матрица — это просто фотография, и вам надо эту фотографию повернуть/отобразить/увеличить/превратить в чёрно-белую. Это на порядок интереснее (котики же), при этом математическая строгость не страдает совершенно никак. Проблема только в том, что в некоторых языках почему-то считать с диска jpeg в массив и вывести обратно массив на диск трудно, а в других языках это делается в одну строку.
Проблема только в том, что в некоторых языках почему-то считать с диска jpeg в массив и вывести обратно массив на диск трудно, а в других языках это делается в одну строку.
В Дельфи jpg загрузить легко. Но проблема ИМХО в другом: не всякий школьник воспринимает фото котика как матрицу. М.б. лучше пусть поскучает, но поймет, что такое матрица, когда его программа транспонирует матрицу 3х4? Тем более, что котики не всем нравятся.
Зачем простому смертному, а тем более, школьнику классифицировать графы?

Аналогично: Зачем простому смертному, а тем более, школьнику на математике упрощать тригонометрические выражения?
затем решать с её помощью задачи, которые решительно никогда никому на практике не понадобятся.
Большинству школьников и модель идеального газа не понадобится и тригонометрические выражения. А многим (страшно сказать!) и теорема Пифагора никогда-никогда не будет нужна. Но общая естественнонаучная картина сложится: в математике доказываются теоремы, в информатике работают алгоритмы. Только ради этого, школьникам приходится трудится несколько лет, но ничего лучше человечество не смогло придумать за всю свою долгую историю. А почему не модель газа? — Потому, что в большинстве случаев это будет очень развесистый код, сделанный м.б. не самым хорошим учителем. А сортировку пузырьком столь испортить гораздо труднее. Она будет сильно короче. А в слишком длинной программе новичкам за деревьями не увидеть леса. Т.о. лучше 10 коротких программ на 10 алгоритмов, чем одна длинная по этим алгоритмам.
не всякий школьник воспринимает фото котика как матрицу. М.б. лучше пусть поскучает, но поймет, что такое матрица,

Да бросьте: вы собираетесь рассказывать о балансировке дерева школьнику, который не сможет понять, что такое bitmap? Не могу согласиться, что нарисовать рисунок по клеточкам из нулей и единиц — это rocket science.

Зачем простому смертному, а тем более, школьнику на математике упрощать тригонометрические выражения?

Тут вот какая штука. Тригонометрия — это сам по себе предмет. Мы можем обсуждать, нужен он в принципе или не нужен. Если считать, что нужен, то придётся и эту его часть изучать. Информатика же дисциплина более общая, и если стоит цель научиться программировать, то можно это делать на самых разных примерах, не упрощая задачи. Задача балансировки дерева ничуть не сложнее массы других, только смысл её совершенно непонятен нормальному человеку. Соответственно, я просто предлагаю обучаться программированию на понятных повседневных задачах, а не сначала тратить кучу времени на обучение некоторой теме, которая нужна лишь для того, чтобы потом на ней тренировать свои алгоритмические навыки.

тому, что в большинстве случаев это будет очень развесистый код, сделанный м.б. не самым хорошим учителем.

Попробуйте на досуге, уверяю, это 20 строк максимум.

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

Абсолютно согласен. Информатика — это не про Пифагора, не про идеальный газ, и не про решение уравнений. Это именно что про алгоритмы. Но чтобы проиллюстрировать эту мысль, нужны задачи. Так почему бы не брать те задачи, которые любой ребёнок поймёт с пол-пинка? Ведь простота формулировки и доступность задачи на понятийном уровне не означает простоты алгоритма. Она означает лишь то, что мы не будем тратить время на изучение левых тем с единственной целью сформулировать и решить задачу в рамках этой темы.

В этом смысле классические книги вроде того же Вирта гораздо больше к своему времени, чем вы к нашему. Смотрите, просто считать из текстового файла вещественное число и преобразовать его в настоящее число или, скажем, посчитать косинус — это вполне себе сложные задачи (косинус так вообще требует разложения в ряд). Однако Вирт и его современники обычно не грузят читателя этими вещами, справедливо считая, что всё это уже реализовано в стандартных библиотеках любого языка. Так почему же мы не поступаем так же, как они? Если некая функциональность уже доступна везде «из коробки», значит, это и есть наш атомарный кирпичик, из которого мы строим программу. Да, неплохо бы разобраться в устройстве кирпича, но в этом отношении подсчёт косинуса или устройство «кучи» памяти ничуть не менее важны, чем внутренняя организация ассоциативного массива, и тем не менее, первые темы мы игнорируем, а вторые всячески продвигаем.
Ведь простота формулировки и доступность задачи на понятийном уровне не означает простоты алгоритма.


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

Жарков В.А, Самоучитель Жаркова по анимации и мультипликации в Visual C# .NET 2003, М.: Жарков Пресс, 2003, 432 С.

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

Вам привести список скучнейших книг по матану или физике?
Даже для самых интересных тем, конечно, нужен интересный материал.
Речь не о матане — там своя специфика.
Речь о том, что вы приводите в пример скучную книгу и делаете вывод, что она посвящена скучной теме. Некорректно.
Возможно, я нечетко выразился. У меня сложилось впечатление, что тема (точнее подтема) скучная. Это основное, скучный текст к нескучным задачкам я бы простил. А так очевидные (бытовые) задачки решаются очевидным занудным образом.
Да, я понимаю вашу мысль, но не могу согласиться.
Впрочем, тема «скучности» и «занимательности» крайне субъективная, тут у всех свои предпочтения.
Мы же не о худ.литературе говорим (там занимательность другая). Если на многих страницах разбирается объемный рутинный код, каждый фрагмент которого не дает читателю ничего нового, то зачем читать эти многие страницы.
Безусловно. Вы о теме или о конкретной книге? Если о книге, то да, книга плохая, согласен. По теме же можно написать и интереснее. Без объёмного рутинного кода. В каком-нибудь Седжвике, «Алгоритмы на С++» тоже кода хватает. Ну подход у автора такой, что ж сделаешь.
В «Алгоритмах на С++» другая тема — тема классических алгоритмов и некоторых их вариаций. Поэтому и супер-интересно. И там объем кода помогает понять нетривиальную суть, а не вгоняет в тоску.
Ну вот видите, везде вопрос вкуса. Меня как раз Седжвик вгоняет в тоску.
Зачем простому смертному, а тем более, школьнику классифицировать графы?

Я не про классификацию графа, а о задачах на графах в общем: помоги роботу выбраться из лабиринта — поиск пути, самая такая настоящая задача на графах.

Я предлагаю смоделировать, например, идеальный газ — это то, что дети изучают, не знаю, в девятом классе или в восьмом? Известную концепцию, простую как мячики на бильярдном столе, да ещё и не сталкивающиеся

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

можно сказать, что матрица — это просто фотография, и вам надо эту фотографию повернуть/отобразить/увеличить/превратить в чёрно-белую.

Ну вот я такой фигней дочку на паузу ставлю — ей нравиться как квадратики колеблются-колеблются, и бац! Картинка. Наглядная демонстрация любого алгоритма оптимизации ИМХО (но учебный пример ГА сюда кладутся просто идеально)
Я не про классификацию графа, а о задачах на графах в общем: помоги роботу выбраться из лабиринта — поиск пути, самая такая настоящая задача на графах.

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

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

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

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

Не надо подходить к вопросу формально. Помните, у Мольера господин Журден очень удивился, когда узнал, что разговаривает прозой? Вот и здесь: волновой алгоритм прекрасно объясняется и без того, чтобы ошарашивать учеников тем, что это, оказывается, теория графов.
Не надо подходить к вопросу формально. Помните, у Мольера господин Журден очень удивился, когда узнал, что разговаривает прозой? Вот и здесь: волновой алгоритм прекрасно объясняется и без того, чтобы ошарашивать учеников тем, что это, оказывается, теория графов.

Я хз, они должны знать откуда это и где потом искать больше. Тем более тут просто предлагают просто рассказать все алгоритмы, а дальше как хотите.
А это не оттуда. Алгоритмы обхода лабиринтов описывались много где, хоть в «Занимательных задачах» Перельмана, да и до этого, конечно. Ну то есть, конечно, это задача теории графов, но нельзя сказать, что теория графов её приватизировала.
Ну к слову сказать современный Паскаль, т.е. Дельфи/Лазарус — все необходимое имеет, и работу с простой графикой, и с базами данных, и со строками там все нормально, я даже более того скажу — с паскалевскими строками все куда лучше, чем сишными. В общем все там у Паскаля с этим нормально.

Если же говорить об обучении (откровенно говоря и об разработке тоже) — то Паскаль в этом плане на голову выше всех этих Пухтонов и прочих мусорных JS — строгий синтаксис дисциплинирует и уменьшает вероятность ашипки (а это очень важно в начале обучения! Так шо Си тоже не особо прокатывает, разгребать дампы памяти даже за деньги не очень хочется). Говнокод конечно можно и на Паскале писать, но на Пухтоне говнокод пишется автоматически, если за него садится программист с плохой самодисциплиной (т.е. 99% всех программистов и и 99.9% школьников), собственно хваленные пухтоновские библиотеки состоят из говнокода более чем полностью. Я таки языки называю мусорными — вроде как на них писать легко, приятно и быстро, но все что сложнее пятистрочного скрипта превращает в спагетти. И да, меня всегда умиляло, что на ОО языке — Пухтоне, 99% программ написано в чисто процедурном стиле.

Если же Паскаль не нравится, то есть альтернатива — мейнстримовые энтерпрайз языки: Java и C# — в них в принципе также можно писать как душе угодно, но они все же имеют достаточно строгий и формализованный синтаксис и целую рекомендаций и соглашений. А самое главное эти языки дуракоустойчивые (C# все же более дуракоустойчивый чем Java. все же в последней куда проще несознательно вступить в тот же boxing/unboxing, например). А еще по ним очень много копипасты на всяких стековерфлоу — в общим учится им намного проще и эффективнее.

Так вот, это была катастрофическая тоска — решим уравнение методом Ньютона, а теперь давайте попробуем деление пополам, а теперь бонус: метод Гаусса системы решения линейных уравнений! Давайте всё-таки идти в ногу со временем.

Хз, по мне так это самое главное. Я когда в школе узнал, что есть такой метод Гаусса и компьютер можно начить решать системы уравнений — был счастлив и тут же запил (ну на самом деле не тут же — это было долго и мучительно). Знайте как круто решать домашку, когда компьютер уже посчитал все и выдал ответ. Вообще к 11 классу физику, математику и частично радиолюбительство получилось автоматизировать написанием собственных программок. Вот геометрия оказалась в пролете — она кончилась раньше чем стали появляться вумные мысли в голове, да и вообще компьютерная геометрия адок еще тот. С тех пор у меня и развилась мания всю симулячить на компе, а сейчас уже проще решать обратные задачи и строить всякие регрессии, чем выучивать формулы и законы.

Тем более все эти Ньютоны и наискорейшие спуски — то собственно для чего компы создавались и то что приносит реальную пользу. Задачи оптимизации — это именно то, что позволяет нам летать, разговаривать по телефону и смотреть картинки с котиками. Опять таки тут вопрос правильной демонстрации и она решаема. Другое дело, что всему свое время, ну вот для первого курса: метод Ньютона, касательных и Гаусса ИМХО должен реализовываться каждым студентом, параллельно с высшей математикой.
Паскаль в этом плане на голову выше всех этих Пухтонов и прочих мусорных JS

Вот даже лично Вирт бы с вами не согласился, ибо уже во втором издании своей книги (это примерно 1990-й год, если не ошибаюсь) убрал Паскаль в пользу Modula-2. Это чистая вкусовщина, спорить бессмысленно.

Хз, по мне так это самое главное. Я когда в школе узнал, что есть такой метод Гаусса и компьютер можно начить решать системы уравнений — был счастлив

Я рад за вас, не могу подтвердить личным опытом.

Знайте как круто решать домашку, когда компьютер уже посчитал все и выдал ответ.

А, ну это всё объясняет. Смысл и радость компьютера — это помогать решать другие домашки. Домашки ради домашек.

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


С этим никто не спорит. И тем не менее, это не значит, что данные задачи являются наилучшими с дидактической точки зрения.
Вот даже лично Вирт бы с вами не согласился, ибо уже во втором издании своей книги (это примерно 1990-й год, если не ошибаюсь) убрал Паскаль в пользу Modula-2. Это чистая вкусовщина, спорить бессмысленно.


Но не в пользу Пухтона :-) Он еще кстати жив и можно поинтересоваться у него, что он думает о Пухтоне с JS, например, и больше чем уверен, что ничего хорошего. А Модула-2 просто дальнейшее развитие паскаля: модульность, функции первого порядка, низкоуровневые свистелки и перделки и кучка еще вещей, которых не хватало в Паскале. Но главным и последним языком Вирта, является Все же Оберон. В общем это чисто одна ветка: Паскаль => Модула => Модула-2=>Оберон

А, ну это всё объясняет. Смысл и радость компьютера — это помогать решать другие домашки. Домашки ради домашек.

Смысл и радость, что у тебя есть правильный ответ, знание которого всегда упрщает жизнь и под который уже всегда можно подогнать, что положительно влияет на оценку. Ведь именно для этого программирование и компьютеры нужны: упрощение работы и повышение эффективности, а не программирование ради программирования :-)

С этим никто не спорит. И тем не менее, это не значит, что данные задачи являются наилучшими с дидактической точки зрения.

Уравнения и системы уравнений приходится решать в любой технической области, и решать ручками даже систему из двух уравнений — крайне унылое занятие, а из штук 10-12 наверное только от безысходности люди решали (я вообще хз как они это делали), а в современных задачках их количество переваливает за сотни. Так что тут вопрос вопрос не хочешь-не хочешь, а придется в любом случае.
И с учебной стороны, что Ньютона, что метода бисекций, что Гаусса — единственный верный выбор, т.к. это самые простейшие и классические методы, еще и представляют 3 разных класса методов сразу и хорошо применимы (в отличии от метода Крамера, например), еще и выполнимы ручками если что пойдет не так. А вот давать студентам сразу какой-нибудь BFGS или GMRES, или там какие-нибудь проекционные методы — то это будет адок, там уже только от вида формул в пояснениях страшно становится, хотя и их в итоге придется учить, т.к. какой-нибудь нолик закрадется — и все, хана Гауссу, но можно и попозже и не всем.

Вот он метод Ньютона (метод касательных), куда уж проще:
double TangentsMethod(function f, function df, double xn, double eps)
{
   double x1  = xn - f(xn)/df(xn);
   double x0 = xn;
   while(abs(x0-x1) > eps) 
   {
      x0 = x1;
      x1 = x1 - f(x1)/df(x1);
   }
   return x1;
}

Для школы такое наверное не пойдет, врядли им нужно искать корни какой-нибудь функции x^3+3x-1->min, хотя хз, на Хабре такими вещами и в более сложном виде тоже не брезгают
Он еще кстати жив и можно поинтересоваться у него, что он думает о Пухтоне

Это неважно. Просто если так любить идеи Вирта, давайте и вправду переходить на Оберон.

Уравнения и системы уравнений приходится решать в любой технической области, и решать ручками даже систему из двух уравнений — крайне унылое занятие,

Верно. Вот умножить вручную два пятизначных числа тоже унылое занятие. Вы это тоже обычно с помощью ручки и бумаги делаете?

А вот давать студентам сразу какой-нибудь BFGS или GMRES,

Не в этом дело. Я же не против методов Ньютона или Гаусса. Я просто говорю, что всё это задачи из области математики и смежных областей. Можно найти огромное число полезнейших для начинающего программиста задач, которые бы не были бы связаны настолько жёстко с математикой. Мне хотелось бы, чтобы цвели все цветы.
Это неважно. Просто если так любить идеи Вирта, давайте и вправду переходить на Оберон.

Ну мне Оберон и Компонентный Паскаль скажем так нравятся больше чем мейнстримовые Жабы и C# или JS с Пухтоном. Но приходиться все равно идти за большинством и выбирать из 2-х зол меньшее.

Верно. Вот умножить вручную два пятизначных числа тоже унылое занятие. Вы это тоже обычно с помощью ручки и бумаги делаете?

Нет конечно, я вообще в умножение плохо умею еще со школы :-)

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

Тут главное верно подводить к этому. Ну например, когда я учился на физфаке у нас всегда была триада: лекции, семинары и лабораторные работы по физике, так что в вопросов «где нужна теорема Штейнера и как это выглядит?» не было. Более того — чем старше курс, тем больше практических примеров. При этом математика катастрофически не поспевала за физикой. На старших курсах в эту триаду плавно вплелось программирование — и тут я могу сказать вот что: то программирование которое нам читали погромисты с погромисткого факультета: набор алгоритмов и зубодробильная дискретка — прошло по факту мимо всех, пока к физике на старших курсах не прибавилась вычислительная практика и численные методы. Но даже в универах с грамотной демонстрацией — туго, а в школах с этим вообще ж0па.
Ну мне Оберон и Компонентный Паскаль скажем так нравятся больше чем мейнстримовые Жабы и C# или JS с Пухтоном.

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

Нет конечно, я вообще в умножение плохо умею еще со школы :-)

Именно! Вы не забиваете себе голову алгоритмами умножения и не пишете соответствующий код, а просто берёте калькулятор. Аналогично, в наше время решение системы линейных уравнений осуществляется таким же точно «калькулятором», а не собственной программой.

так что в вопросов «где нужна теорема Штейнера и как это выглядит?» не было

Да, всё так. Почувствуйте разницу: вас целенаправленно обучали на физфаке профессии (физика, вероятно). И все предметы были подчинены этой общей задаче, в том числе и программирование. В школе такой цели нет. Программирование изучают не для физики, не для математики и не для биологии. Программирование изучают для программирования, поэтому я так и ратую за то, чтобы задачи были как можно менее специальными. Чем ближе к быту, тем лучше. В конце концов, в задачниках по математике тоже обычно решают что-то «из жизни»: узнать цену, расстояние, скорость, количество, а не что-нибудь такое из медицины или технарства.
Мне кажется, есть ещё одна проблема школьного образования. Не помню, то ли в 3-м, то ли в 5-м классе проходили, как происходил переход от геоцентрической к гелиоцентрической системе мира. Всё, что тогда запомнилось, кроме названия, что гелиоцентрическую систему придумал Николай Коперник, и за это почему-то сожгли Джордано Бруно и судили Галлилея. Что вынесет школьник из этой истории? Что наши таки победили, а если против тебя ополчился весь мир — значит ты просто сделал открытие, к которому все ещё не готовы. Про то, как гелиоцентрическая модель была открыта, что у неё на первых порах были сложности не только с церковью и властями, но и с обоснованием некоторых природных явлений, и главное — что когда была построена достаточно точная гелиоцентрическая модель Солнечной системы, на основе неё были Ньютоном были открыты законы механики я узнал значительно позже. Школа должна объяснять, что научные открытия не происходят вдруг из-за того, что на тебя упало яблоко, и любой самый гениальный гений не смог бы открыть закон всемирного тяготения, пока общепринято существование небесных сфер и эпициклов.

Категорически поддерживаю!
А ещё Джордано Бруно из списка нужно исключить за плагиат.
Вместо него вписать Николая Кузанского, который абсолютно в духе античной мысли предположил единство минерального царства всей вселенной (писал он, конечно, в других терминах). А из оного предположения закономерно следует множественность миров.

Ну неужели они не понимают, что многим из их учеников за всю жизнь не понадобится теорема Пифагора или знание формулы медного купороса?

А потом мы удивляемся откуда столько людей которые сдачу в магазине правильно посчитать не могут и не различают дизель и бензин.
На то школа и является Общеобразовательной чтобы дать общие понятия во всех необходимых областях знаний, а для профильного образования есть университет.
К школе, как по мне, сейчас можно предъявить другие претензии: не эффективные методы обучения, устаревшие знания в некоторых областях.
Орерон-07 это конечно хорошо, но желательно чтобы ЯП был ещё и функциональным. Вот скажите многие ли из вас стали серьезно кодить на Делфи? Поэтому, думаю для изучения отлично подошёл бы Питон. Прост, несложный синтаксис и главное применим в реальной жизни.
Вот скажите многие ли из вас стали серьезно кодить на Делфи?

Я и сейчас пишу на Дельфи-7: вот, вот и вот :))
Ожидал увидеть ссылки на гитхаб, но увидел ссылку на статью со ссылкой на форум где просто прикреплены исходники. Считаю что ваш подход к программированию устарел.
Использование Дельфи-7 обусловлено повторным использованием кода, технология гитхаб в данных случаях мне не нужна.

Не нашли к чему придраться, поставили в вину, что не на гите. lol
Ваш слив засчитан! cool face


PS Срач про гит там => https://habrahabr.ru/post/341676/

Слово «вуз» по правилам русского языка пишется с маленькими буквами.

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

Спорим на 100 баксов?
0. gramota.ru/spravka/buro/29_413672

1. ru.wikipedia.org/wiki/Вуз

2. Сайт: «Институт русского языка им. В. В. Виноградова РАН»
www.ruslang.ru/agens.php?id=aspirant (поиск по странице слова «вуз»)

3. Сайт GRAMOTA.RU www.gramota.ru/spravka/rules/?rub=sokr

4. В основе данного словаря лежит «Русский орфографический словарь», изданный под редакцией О.Е. Ивановой и В.В. Лопатина в 2004 году, – самый полный орфографический словарь русского языка на сегодняшний день.
orf.textologia.ru/definit/vuz/?q=532&n=18948

5. Лента ру lenta.ru/search?query=вуз

6. Кремль? www.kremlin.ru/assignments/9399

7. www.orfo.ru/tutorial/html/Spel_Capital.htm

8. Словарь Розенталя www.evartist.narod.ru/text1/24.htm#_top
(Розенталь Д.Э., Джанджакова Е.В., Кабанова Н.П.
СПРАВОЧНИК ПО ПРАВОПИСАНИЮ, ПРОИЗНОШЕНИЮ, ЛИТЕРАТУРНОМУ РЕДАКТИРОВАНИЮ М.: ЧеРо, 1999)

9. Ведомости
www.vedomosti.ru/search/?s=%E2%F3%E7

10. Российская Газета? search.rg.ru/wwwsearch/?text=вуз

11. therules.ru/#q=вуз

habrahabr.ru/company/edison/blog/315360/#comment_9915070
У Пола Локхарда в «Плаче математика» уже всё сказано было. Опять предлагают инструменты изучать, ничего не говоря об их предназначении.

Задача преподавателя не в том, чтобы научить умных, а в том, чтобы научить всех. Не всегда получается, но стремиться надо к этому.

В частности, не играть в уменьшение строчек кода. Например, программку для нахождения чисел Фибоначи на Питоне можно записать следующим образом:

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


Вот здесь хотелось бы вместе с вами прийти к общему знаменателю.

Давайте посмотрим на код, вычисляющий числа Фибоначи на Паскале и на Питоне.
Паскаль:
var
    a,b,c,i,n: integer;
begin
    write('n = ');
    readln(n);
 
    a := 0;
    write(a,' ');
    b := 1;
    write(b,' ');
    for i:=3 to n do begin
        write(a+b,' ');
        c := b;
        b := a + b;
        a := c
    end;
 
readln
end.


Питон:
n = int(input('n = '))

a = 0
print(a, end = ' ')
b = 1
print(b, end = ' ')
for i in range(3, n):
    print(a + b, end = ' ')
    c = b
    b = a + b
    a = c

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

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

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

Я очень не хотел переходить на Питон, потому что Паскаль казался какой-то зоной комфорта или может безопасной зоной. Действительно, очень много книг, все на нем преподают (как казалось до Хабра), да и вообще, было такое ощущение, что Паскаль это что-то вроде гражданства. Ну не могу же я взять и переехать в другую «страну».

Чем я руководствовался, когда принял решение перейти на обучение Питону и программированию на нем? Можно взглянуть на два листинга выше и догадаться. Во первых оба листинга наглядны. Т. е. здесь я действительно ничего не теряю. Во вторых, мне не нужно после каждой команды ставить "; " — которая кажется чем-то бессмысленным и нет-нет, да забывается. В Питоне тоже можно ставить ";" после каждой команды, но как правило, это совсем не пригождается. Да, "; " вместе с " := " — это дурацкая придирка к Паскалю. Но опять же, если взглянуть на листинги, то видно, что на Питоне приходится меньше печатать (иногда, гораздо меньше), нет необходимости в «begin»-ах и «end»-ах, которые в отсутствии отступов, легко могут запутать. Напоминаю, мы говорим о тех, для кого язык является первым, и, они путаются во всем. Причем, чем больше этого самого «всего», тем больше для них путаницы. На Питоне, вероятность сделать ошибку меньше чем на Паскале.

Если говорить о работе с файлами, а они нужны как минимум на олимпиадах и чемпионатах по программированию, то на Питоне все опять немногим, но проще. Кстати, на чемпионатах по программированию имеет самое главное решить задачу быстрее всех. Поэтому жалкие секунды, которые на Паскале приходится тратить на объявление переменных и печать «лишних» знаков, с большой долей вероятности могут дать преимущество тому, кому тратить на это время ненужно. Т. е. при равных знаниях, у Питониста есть небольшое преимущество, а если тестирующая система пропускает такие команды, как min, max, sum и прочие, которые Питонист, кстати, в любой момент может подсмотреть во встроенной в сам язык документации о нем же… да сам Питон относительно медленный, но в создании кода, пожалуй самый быстрый. Хоть, подготовка к олимпиадам и чемпионатам не является моим «коньком», но на тот момент я это тоже учитывал.

Питон хорош для быстрого прототипирования. И для профориентации именно в IT отрасли — это идеально. Почему? Допустим подходит ко мне 10-11классник и говорит, что хочет сделать web-приложение, или управлять роботом с компьютера, или поиграться с нейронными сетями (машинным обучением) или что-нибудь еще в этом роде. Помочь ему в этом с питоном мне намного проще чем с паскалем. Достаточно pip-ом установить нужные библиотеки, импортировать их, вместе полистать документацию к ним и выполнить примеры из нее же. И все. Дальше он сам. Дальше самообразование. И если он способен к самообразованию, то ему не нужен учитель, ему нужен помощник или консультант, что бы КПД от такого самообразования был максимальнее. А как показывает моя практика КПД для школьника-старшеклассника очень даже неплохой.

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

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

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

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

Всё это значит, во-первых, что главный навык программиста — это поиск изобразительных, адекватных задаче. А, во-вторых, это значит, что хорошо образованные программисты никогда не будут разводить «холиваров» ни по какому поводу, потому как, нет никаких «плохих» языков программирования, а есть только весьма различные изобразительные средства и умение грамотно ими пользоваться.

Единственное, что мне не очень понятно, почему, если язык программирования (например, Питон) предлагает довольно сильные изобразительные средства для краткого описания требуемых вычислительных концепций, именно этот язык не используется повсеместно? Почему нельзя сделать многоязычность неотъемлемой чертой разработки программного обеспечения? Почему нельзя, например, для скорости, безошибочности и максимальной управляемости создавать прототипы приложений на одних языках программирования (и с применением одних выразительных средств), а конечный код создавать в полуавтоматическом режиме из прототипа на других языках программирования (и с другими изобразительными средствами)?
Единственное, что мне не очень понятно, почему, если язык программирования (например, Питон) предлагает довольно сильные изобразительные средства для краткого описания требуемых вычислительных концепций, именно этот язык не используется повсеместно? Почему нельзя сделать многоязычность неотъемлемой чертой разработки программного обеспечения? Почему нельзя, например, для скорости, безошибочности и максимальной управляемости создавать прототипы приложений на одних языках программирования (и с применением одних выразительных средств), а конечный код создавать в полуавтоматическом режиме из прототипа на других языках программирования (и с другими изобразительными средствами)?


Наверное, хорошо знакомый ЯП — это действительно зона комфорта. Например, года 4 назад я сам преподавал на Паскале и как-то заехал в свой университет, навестить знакомых (физиков) и один из них только-только начал преподавать программирование почему-то. Я ему сразу посоветовал сайт Полякова К. Ю. Через какое-то время мы снова встретились и он сказал, что вообще не напрягается с преподаванием, все берет с этого сайта и дает студентам.

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

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

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

Вот мне сейчас надо хоть немного изучить Фортран — это конечно интересно, но если бы не было такой нужды, то я бы никогда этого делать не стал и продолжал бы все делать на горячо полюбившемся мне Питоне. Питон — это моя новая зона комфорта. Но находясь в ней мне пришлось бы писать на нем все то, что уже давным давно сделано на Фортране. Т. е. находиться в этой зоне мне уже не выгодно.

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

Промахнулся с ответом. Посмотрите этот комментарий, пожалуйста.

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


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

на Питоне приходится меньше печатать (иногда, гораздо меньше), нет необходимости в «begin»-ах и «end»-ах, которые в отсутствии отступов, легко могут запутать.


Не первый пример, когда достоинство на один взгляд, представляется недостатком на другой взгляд. Что происходит если код с отступами переносится на другую бумажную страницу? Если это принтерная распечатка — то можно сообразить, а если это черновик, написанный от руки, то отступ легко потерять. Практика бумажных листингов Си показала мне, что и фигурная скобка не всегда пропечатывается… Поэтому ИМХО «begin-end» надежнее.

Во вторых, мне не нужно после каждой команды ставить "; " — которая кажется чем-то бессмысленным и нет-нет, да забывается.
Точка с запятой в Паскале — не часть оператора, а разделитель, позволяющий автору кода выбрать наиболее выразительный формат. М.б. в электронном виде (исходный код на экране) лучший принцип — каждому оператору отдельная строка:

{обнуляем исходные координаты:}
x0 := 0;
y0 := 0;
z0 := 0;

{обнуляем конечные координаты:}
x1 := 0;
y1 := 0;
z1 := 0;


Но для учебника или методички компактная запись м.б. лучше:
x0 := 0; y0 := 0; z0 :=0; {обнуляем исходные координаты}
x1 := 0; y1 := 0; z1 :=0; {обнуляем конечные координаты}

Дело не столько в экономии бумаги, но прежде всего в обозримости листинга: при одинаковом числе операторов листинг на одной странице легче воспринять, чем листинг на трех страницах.

Что касается присваивания, то его как-то надо отличать от операции равенства. Всякие "+=" и "=+" (как в некоторых ЯП) — источник многих ошибок не только у школьников. Еще хуже групповое присваивание:

a = b = 0

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

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


x0 := 0;    y0 := 0;    z0 :=0;    {обнуляем исходные координаты}
x1 := 0;    y1 := 0;    z1 :=0;    {обнуляем конечные координаты}

Проблема схожести присваивания и оператора сравнения актуальна только поначалу.


Например в java и в C# вот такой код будет подсвечен как синтаксическая ошибка.


int a = 3, b = 5;
if (a = b){ //Отсутствует неявное преобразование int в bool

}

Вот js точно не заметит скрытой ошибки. C++ и C кажется тоже.


var x = 3, y = 5;
if (x = y){
    console.log(x);
}

Дело не столько в экономии бумаги, но прежде всего в обозримости листинга: при одинаковом числе операторов листинг на одной странице легче воспринять, чем листинг на трех страницах.

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


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


В черновиках (и на доске) всякие знаки препинания выделяю жирным шрифтом. Код всегда подлежит написанию в IDE и запуску.


Всякие "+=" и "=+" (как в некоторых ЯП) — источник многих ошибок не только у школьников.

В материалах для обучения лучше вместо x += y; использовать x = x + y;. Это минимальный работоспособный вариант. А сокращенный вариант пускай самостоятельно узнают и пользуются.


можно использовать не весь язык, но только его подмножество. В современных условиях это выглядит несерьезной отговоркой.

Даже в популярных промышленных языках есть такое наследие, которое при работе лучше в настоящее время не использовать. Например те же goto в шарпе. Про них постепенно забывают, но они же есть. Все равно получается "подмножество".
"Можно но не нужно".

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

Например те же goto
Goto и в Виртовском Паскале есть, но не мешает, т.к. особый случай. Другие возможности в других языках не столь особые, и их используют часто.
Обучаемый должен посмотреть под отладчиком по шагам как работает данный алгоритм, чтобы понять принцип.

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


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

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


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

Ну например есть чтение из консоли в Java.
До версии 8 нужно было вызвать дьявола для считывания целого числа из консоли.
Вот так:


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
    int a = Integer.parseInt(br.readLine());
} catch (IOException e) {
    e.printStackTrace();
}

А в версии 8 для тех же целей ввели удобный класс. И тот же самый код оформляется вот так:


Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();

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

А как убедиться, что такое задание выполнено?
Как контролируют выполнение домашних заданий в школе. Устные и письменные опросы, контрольные работы и т.д.
А вот исключение дубликатов тянет на полноценный, но другой алгоритм.
При сортировке деревом, нпр., решение очевидно:

procedure add (val : integer; var tree : link);
{добавить число val  в дерево tree}
 begin
     if tree=nil then
         begin
           {сделать новую вершину}
           ...
         end
     else
       if  val < tree^.dat then
         add (val, tree^.left) {добавить в левое поддерево}
       else
         if val > tree^.dat then
           add (val, tree^.right) {добавить в правое поддерево}
         else  {  val = tree^.dat  дубликат }
         .... 
 end;


Ну например есть чтение из консоли в Java.


Я про lambda в Питоне. Школьник найдет на Хабре решение для чисел Фибоначчи в одну строчку и перепишет. Учитель будет трудно отклонить такое решение — «мы lambda не используем» прозвучит неубедительно. А вот goto отклонить очень просто. В сетке можно все что угодно найти, но решения с goto найти будет не очень просто. Скорее всего это будет халтурный перевод с Фортрана-4.

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

По той же математике задача вполне понятная: реши уравнение и напиши ход решения на бумаге; или упрости выражение и получи эквивалентное.
Не понятно как будет выглядеть письменный или устный опрос по переписанному алгоритму. Можно поставить задачу на вычисление сложности, но это уже не школьная задача.
Главный вопрос при этом: зачем алгоритм нужно переписывать с бумаги? Если нужен именно процесс переписывания, то можно оформить PDF без возможности выделения.


При сортировке деревом, нпр., решение очевидно:

Оно очевидно вам, потому что вы в контексте и держали эту задачу у себя в голове. А человеку без контекста решение будет совсем не очевидно.


Школьник найдет на Хабре решение для чисел Фибоначчи в одну строчку и перепишет. Учитель будет трудно отклонить такое решение — «мы lambda не используем» прозвучит неубедительно.

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

то можно оформить PDF без возможности выделения.

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

Я не сказал переписывать на бумагу алгоритм. Школьник должен объяснить его устройство (устно или письменно). Нпр., по приведенной процедуре добавления в дерево: она рекурсивная, что соответствует определению дерева. Начинаем с корня. Идем либо в правое, либо в левое поддерево в зависимости от величины val. И т.д. Так у Вирта. Но можно просто дать последовательность чисел, нпр.:
3,5,7,11,2
и пусть школьник нарисует какое получится дерево.
Оно очевидно вам, потому что вы в контексте и держали эту задачу у себя в голове.
Внимательно прослушав урок и задав вопросы, если что-то не понял, школьник должен быть в контексте. И учебник ему в помощь.
Молодец, что нашел такой способ решения. В реальной разработке полезно пользоваться готовыми решениями.
Это если он признается, что списал с Хабра.
Лично мне кажется, что паскаль реально круто использовать там где появляется фраза «Информационная система». Если бы в паре километров от моего дома стояла атомная электростанция, то я бы чувствовал себя гораздо спокойнее, если бы вся ее инфраструктура управлялась ПО на Паскале или еще лучше на Аде. Но никак не на Питоне.

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

Есть области, которые по силам аспирантам, но не по силам студентам, то же самое что посильно студентам, непосильно школьникам.

Фактически, я стараюсь, что бы школьник не просто поступил в ВУЗ, т. е был не просто профориентирован, но еще сориентирован в плане IT-специализации, что бы недостатки самообразования в этой специализации устранялись самой вузовской средой. И я думаю, что любой преподаватель был бы рад студенту, которому не нужно разжевывать, что такое http, линейная алгебра, serial-порт. Коректировать знания и устранять в них пробелы, гораздо легче, чем устранять их полное отсутствие. А преподаватели той специализации, в которой студент еще в еще будучи старшеклассником многое попробовал, могут привлекать их к своей работе, проектам, исследованиям.

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

У Питона много недостатков. Но посмотрите, чего добились в ИИ ребята из OpenAI и теперь скажите мне почему это сделано на Питоне?
Но посмотрите, чего добились в ИИ ребята из OpenAI и теперь скажите мне почему это сделано на Питоне?
На С++ сделано много больше, но это не значит, что С++ лучший язык.

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

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

Ну мы конечно не пишем как требуется в PEP-8, но «import this» — большими буквами висит на стене моего кабинета. Неряшливый код не игнорируется и не поощряется. И думаю, что убедил вас в том, что код на Питоне тоже может быть наглядным.

В образовании, так же как и в медицине главный принцип — «не навреди». Поэтому всяческих крайностей стараюсь избегать. Ради ускорения я не снижаю качество кода. Но приемлемый код на Питоне печатается быстрее чем аналогичный код на паскале. На питоне я так же могу использовать "; " и не использовать множественное присваивание. Качественное использование языка в преподавании — это вопрос методики. Т. е. в обучении программированию всегда показывается, как надо кодить и как не надо.

Я готов серьезно поспорить, что 100 алгоритмов, допустим, из теории графов на Питоне (даже без функций и ООП) будут реализованы гораздо быстрее, чем на Паскале.
Я не спорю, что м.б. реализованы быстрее. И не спорю, что код на Питоне тоже может быть наглядным. И добавлю, что и на С++ код может быть наглядным. И книг много написано на тему, как надо и как не надо. Хороший профи напишет приемлемый код на любом из распространенных ЯП (про явно неудачные языки, как и про эзотерические ЯП говорить не будем). А новичок и на хорошем ЯП может написать плохо. И в этом случае чем больше возможностей языка — тем больше возможностей плохо написать. А бывает еще объективно хороший, правильно работающий, но сложный для понимания код. В некоторых случаях у некоторых профи особый шик писать такой код. В отдельных случаях для автора кода это может быть и оправданно: у него, нпр., однотипные задачи и ему проще использовать набор привычных трюков. Однако новичок, случайно скачавший такой код, легко в нем запутается.
чем больше возможностей языка — тем больше возможностей плохо написать.

Это заблуждение, недостойное тиражирования. С точки зрения языка с массой возможностей попросту любой код на языке с меньшим количеством возможностей — «плохой», потому что его синтаксис хуже определяет семантику.
Например, есть алгоритм, в котором требуется выполнить некоторое действие для каждого элемента массива. В Паскале/Бейсике и пр. это однозначно будет описываться неточной конструкцией типа «for i = 1 TO N», то есть «пройти элементы от 1 до N», а не «все элементы», и на голову программиста ложится задача отслеживания, что массив действительно состоит только из этих объектов.

Это плохой код. Да, в этих языках иначе не напишешь, но он всё равно плох, и оттого, что язык не даёт альтернатив, хорошим он не становится.
В дельфи есть функции Low, High. Т.е. пройти все элементы вектора A будет:
for i:=Low(A) to High(A) do ...

Но чисто теоретически ассемблер дает еще больше возможностей, нпр., чтобы убыстрить код.
В дельфи есть функции Low, High. Т.е. пройти все элементы вектора A будет:

Ну вот смотрите, получается, что Делфи даёт больше возможностей, чем Паскаль, но вы ведь только что писали, что больше возможностей — это «хуже», потому что больше способов ошибиться!

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

Не совсем. Ассемблер даёт больше низкоуровневого контроля над выполнением, а мы тут обсуждаем абстракции построенные на других абстракциях. В Python возможностей больше, чем в Паскале, потому что Python идёт по абстракции вверх, а не вниз.
получается, что Делфи даёт больше возможностей, чем Паскаль, но вы ведь только что писали, что больше возможностей — это «хуже», потому что больше способов ошибиться!
Да. Поэтому я сделал выше оговорки про Delphi. ИМХО для школ больше подходит Dr Pascal, но его выпуск давно прекращен. И давайте не будем забывать, что тут мы обсуждаем ПО для школы, а не для производителей программного продукта.

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

Это понятно, но контекст у вас другой:
дает еще больше возможностей, нпр., чтобы убыстрить код.
Макро не способно убыстрить код?
Не думаю, по крайней мере, не в наше время.
Макросы стоит рассматривать как инструмент абстракции. Ускорить код можно с помощью CPU-specific инструкций. А макросы могут, наоборот, раздуть код, что приведёт к выходу за пределы процессорного кэша и затормозит работу. Если же вас беспокоят накладные расходы на вызов функций или начало/конец цикл, то любой современный оптимизирующий компилятор умеет разворачивать эти инструкции без проблем.
В макро нельзя применять каких-то инструкций? Впервые слышу. Что касается современных компиляторов, то они очень хорошо оптимизируют, поэтому я и сказал «теоретически».
ОК, тогда выражусь проще: да, с помощью макро вам НЕ удастся убыстрить код. Конечно, вы можете использовать специнструкции где угодно, но это не про макросы, а про специнструкции.
На С++ сделано много больше, но это не значит, что С++ лучший язык.


Вроде слежу за этой отраслью… я что-то пропустил?..
Многие годы С++ популярнейший язык. В Вики, в частности, указано что на нем написан Microsoft Office, видимо, и другие продукты Microsoft (не на Бейзике же). Вроде бы и линуксы на С++ ориентированы.
Это да. Я имел ввиду область ИИ. OpenAI в этом плане — реально открытая организация и имеет много достижений в области генеративных моделей. Питон в области машинного обучения и ИИ стал стандартом. Пожалуй — это единственная отрасль, где кроме Питона больше никаких ЯП вообще не надо. Звучит странно, но там инструментарий начинается с средств построения графиков и заканчивается управлением работой GPU.
Когда-то Planner, Prolog и т.д. объявлялись языками ИИ — см. List of programming languages for artificial intelligence.
По конкретным инструментам:
OpenCV [...] Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков (Вики)

CUDA SDK позволяет программистам реализовывать на специальном упрощённом диалекте языка программирования Си алгоритмы, выполнимые на графических процессорах Nvidia, и включать специальные функции в текст программы на Си. (Вики)

Тут стоит сделать поправку из англовики:
The CUDA platform is designed to work with programming languages such as C, C++, and Fortran.

Я и Delphi интерфейс для CUDA нашел, но уж больно путанный.
Prolog и иже с ним — это мертворожденная концепция, которая казалась интересной исключительно в соответствующий исторический период. Можно порассуждать, почему было так, и почему сейчас это не так.

Python же (я не фанат Питона, но надо признавать очевидное) решает гораздо более приземлённую задачу: обеспечить лёгким инструментарием тех, кому не интересно становиться системными программистами. Да, формально OpenCV вообще сделана для C++, но вы на практике попробуйте сравнить объём знаний и труда, потребные для реального соединения этих технологий. В этом смысле ниша Python может заполниться другим языком, более современным, но сама по себе она никуда не денется.
Ниша никуда не денется. А языки заполнения меняются довольно часто.
В целом согласен, но в данном конкретном случае думаю, что Python задержится. Вон посмотрите на нишу C++: уже года с 1990го примерно сидит крепко, и никто не выбивает.
Есть у меня один знакомый, который был ярым фанатом R (сектант R). Как то мне удалось убедить его попробовать дистрибутив Питона от Интел. Мне нравится криптография — за неделю придумываю 5-7 дурацких гипотез, а на выходных, быстро делаю скрипты на Питоне и убеждаюсь, что они правда дурацкие. Вам, как я понял, нравится ИИ. Я вам просто предлагаю установить себе дистрибутив Anaconda, посмотреть, что у него под капотом, сделать парочку скриптиков.

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

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

К тому же молодежь уже привыкла к github-у и к тому, что описание более-менее серьезного проекта описано там же в wiki.

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

Это может показаться странным, но вам даже не придется учить Питон. Абсолютно не зная Питона, на нем у вас получится добиться успеха быстрее, чем на хорошо изученном Делфи.
Предлагаете перевести интерпретатор P5 на Питон? Серьезно? Видели объем кода? А скрипты на Паскале писать? Извините, но удивили.

Гит пока совершенно не нужен.

Абсолютно не зная Питона, на нем у вас получится добиться успеха быстрее
Во-первых. Знаете что такое повторное использование кода? У меня его столько, что даже перепечатка (не перевод) 1 в 1 займет очень много времени, хоть и печатаю я быстро, не как Ваши школьники :)

Во-вторых. Я и так добился успеха. Проекты, которые публикую здесь, для меня хобби. Для рабочих проектов, кроме повторного использования кода, бывает нужна еще и высокая производительность. Питон будет слишком медленным для многих из них.

В-третьих. В ПБ-боте дело не в языке. Забуксовали на алгоритмах. И в целом м.б. неверный подход — слишком высокая автономность, роджерийский бот получился удачным потому, что там автономность сильно меньше (я про это писал).
PS Вы сказали:
Если бы в паре километров от моего дома стояла атомная электростанция, то я бы чувствовал себя гораздо спокойнее, если бы вся ее инфраструктура управлялась ПО на Паскале или еще лучше на Аде. Но никак не на Питоне.
Я не пишу ПО для АС, но и моё ПО должно быть достаточно надежным.
По поводу повторного использования кода согласен. Но что касается исследований в ИИ — вообще нет. По поводу производительности тоже.

NumPy использует Фортрановский LAPACK, поэтому сомневаюсь, что скорость вычислений окажется меньше чем у аналогичных вычислений на Паскале. Но и это для Питона еще не Предел. Если использовать дистрибутив Питона от Интел (он абсолютно бесплатный), то за счет как раз таки околокомпиляторной магии скорость вычислений может возрасти от нескольких раз до нескольких порядков раз. Т. е. это быстрее чем с обычным компилятором для Фортрана, для Паскаля, который, так же как и фортран, компилируется в машинный, ситуация окажется такой же. Причем для получения такой скорости мне не нужно знать ни Паскаль ни Фортран. Мне даже не нужны глубокие познания в Питоне для этого. Причем весь этот оптимизированный код можно прикрутить и к GPU, опять же даже не вникая в CUDA и OpenCL.

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

Если это игровой бот, и использование компьютерного зрения не является принципиальным моментом, то слепить симуляцию в PyGame не составит никакого особого труда. А это 10-100 (может даже больше) экспериментов в секунду — гораздо больше чем в реальной среде. Т. е. можно чисто эмпирически, быстро нащупать верный или неверный путь.

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

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

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


Если использовать дистрибутив Питона от Интел (он абсолютно бесплатный), то за счет как раз таки околокомпиляторной магии скорость вычислений может возрасти от нескольких раз до нескольких порядков раз.
«Магия» — очень интересное слово в данном контексте, как и «может возрасти» — а может и не возрасти. Чем то сказочным повеяло. BTW не все пакеты Интела способствую скорости — нпр., TBB.

Причем для получения такой скорости мне не нужно знать ни Паскаль ни Фортран. Мне даже не нужны глубокие познания в Питоне для этого. Причем весь этот оптимизированный код можно прикрутить и к GPU, опять же даже не вникая в CUDA и OpenCL.
А это как?: прикрутить к GPU не вникая в CUDA?

тем более, если есть планы публикации в серьезном издании
Для публикации нет ничего лучше Pascal и Pascal-like псевдокода. Ни разу не слышал от читателей «я не знаю этот язык».

Если это игровой бот, и использование компьютерного зрения не является принципиальным моментом, то слепить симуляцию в PyGame не составит никакого особого труда.
А если использование компьютерного зрения является принципиальным моментом? Странное ограничение для языка ИИ.

Фактически, используя Питон, вы не используете его для вычислений. Вы повторно используете чужой (не Питоновский) код

Это вроде как пишу файл мояПрога.bat:
calc
notepad

и потом мне остается только пощелкать по этому файлу? Меня больше волнуют объемные части для вычислений, а не скрипты использующие эти части. Для скриптов есть много инструментов. Нпр., для установки программ я использую Inno Setup.

Если вам действительно жалко времени, то Питон — лучший выход. Конечно не для рабочего кода, который логичнее и проще использовать повторно, а для вашего хобби и открытого проекта.
Для хобби (для проекта) я повторно использую код.

Очень странный разговор. Есть работающий код (я про проект), но мне говорят, а давай перепиши его на другой язык. Зачем? Меня устраивает язык, на котором написан этот код.

в комментариях говорите, что вам не нужна система контроля версий. Тогда ей не понятно как писать код вместе.
Пока всем было понятно, кроме Вас. И пока нечего контролировать. Как писать код вместе было известно и до гита. Автоматические системы контроля версий очень далеки от идеала, особенно асинхронные системы. Нпр., Википедия. Другое дело, что Википедия слишком объемный проект и там без такой системы не обойтись. У меня проекты сильно меньше. Но Вы все время переводите разговор на какие-то второстепенные технологии. Неужели Вам действительно кажется, что язык или технология может мистическим образом продвинуть сложный проект? У Вас есть опыт сложных проектов?

PS Кажется до меня дошло: под повторным использованием кода Вы понимаете использование без внесения изменений. А я свой код часто модифицирую под конкретную задачу. Это не универсальная библиотека на все случаи жизни.
О да, ссылка на одну из многочисленных статей из серии «Давайте изобретать велосипед» и «Прем против фактов: чем смелее — тем больше просмотров». А факты таковы, что практически ни одна программа не делается с нуля… Больше про данную «теорию» ИМХО говорить не стоит.
О как разозлился! Хочу еще минус!
да сам Питон относительно медленный, но в создании кода, пожалуй самый быстрый.

Питон — язык прототипирования. Поэтому в этом деле главный девиз «Импортируй все что импортируется». Если у скульптора, есть глыба мрамора и он отсекает от нее все лишнее, то на Питоне ты сначала сам делаешь эту глыбу. Сам по себе он медлительный, но Питон = клей. Если в каком-то месте нужна большая производительность, то это место можно переписать на другом языке. Или использовать проверенные библиотеки, например стек SciPy.

«Магия» — очень интересное слово в данном контексте

Речь идет о магии, точнее о светлой магии MKL над BLAS и LAPACK.
А это как?: прикрутить к GPU не вникая в CUDA?

Очень просто:
import numba

И все. Лишь в некоторых случаях (в которых лучше порекомендовать AMD), когда вычисления выходят за рамки привычной нам математики, действительно, можно выиграть очень много, зная OpenCL. А так… numba — хорошая штука. OpenCV прикручивается так же. И документация хорошая.
Для публикации нет ничего лучше Pascal и Pascal-like псевдокода. Ни разу не слышал от читателей «я не знаю этот язык».

Я в плане того, что ИИ — это все же математическая модель, а что-то новое в этой области — это гора символьных вычислений и десятки графиковю В этом плане MatPlotLib и SymPy незаменимы.

Это вроде как пишу файл мояПрога.bat:
calc
notepad
и потом мне остается только пощелкать по этому файлу?

Да, только добавляете перед ними import и потом еще пару строк кода. И все.
Меня больше волнуют объемные части для вычислений

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

Как бы сказать…
Я из той олдскульной школы математиков, которая не признает компьютеры вообще. Т. е. если ты не можешь решить задачу с помощью ручки и бумаги — ты не в авангарде. Некоторые примитивы очень трудно реализовать в программном коде, однако у меня получилось, причем с помощью тех самых второстепенных технологий, PyPi и github-а. Фактически, у меня появился математический программный инструментарий в области диофантовых уравнений и приближений. Планируется запилить это в SymPy.

Я действительно уверен, что Питон и «второстепенные технологии» продвигают серьезные проекты.

Прошу прощения если мои ответы кажутся надменными. Для меня держать культурный тон — тоже непростая задача. У меня нет возможности быстро отвечать на комментарии. А их написание занимает довольно много времени, если по другому — то это холивар с моей стороны.

Вы человек старой закалки с серьезным опытом — такого обычной пулей не возьмешь :)

Паскаль — это «Война и МирЪ» Толстого. Для обычного обывателя слишком много «букав». Прочитать… осмыслить такой труд капец как не просто. Школьник его прочитает, но всей глубины не поймет. Это реально для зрелого человека.

Питон — это «Фиеста» Хемингуэя. Прикольно — на каждой странице бухают (на 80 из 82 — сам считал). Но смысл очень простой — если тебе на войне отстрелили член, это не значит, что ты не можешь хорошо работать и достойно жить. Будучи ущербным в чем-то — ты можешь эту ущербность обратить в пользу.
Если в каком-то месте нужна большая производительность, то это место можно переписать на другом языке.


Т.е. во многих сложных задачах (имею в виду теор. оценку для наихудшего случая) 99.9% кода я пишу и отлаживаю на другом языке, а для Питона остается I/O? Но ввод-вывод не проблема для любого современного языка. Зачем мне привлекать другой язык только для этого 0.1% примитивного кода?

Речь идет о магии, точнее о светлой магии MKL


MKL прекрасно работает со многими языками (не знаю случая, где не работает). Я не ставлю в особую заслугу Delphi, что работает с MKL. Вот если бы не работало — было бы возмутительно!

А так… numba — хорошая штука. OpenCV прикручивается так же.
Тут я не понял. Хочу матрицы на GPU обрабатывать и СЛАУ решать, а еще перестановки генерировать. Как обойтись без CUDA?

Я в плане того, что ИИ — это все же математическая модель, а что-то новое в этой области — это гора символьных вычислений и десятки графиковю В этом плане MatPlotLib и SymPy незаменимы.
Десятки графиков и Excel построит. Из программы на Delphi в Excel по СОМ данные передаются без проблем.

Да, только добавляете перед ними import и потом еще пару строк кода. И все.


Хоть пару строк, хоть 20, но скрипт, который запускает сначала одну программу, потом другую, представляется мне наименее важным во всем проекте. Если Питон только для этого использовать — то попробую, если не забуду. Однако с этим и batch-файлы справляются. Зачем ставить дополнительный софт?

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


А разве стандартный калькулятор виндов, передает что-то в чужой стек? И зачем моей задаче, которая может сама себя обслужить, нпр., записать результаты в файл, предавать что-то в стек Питона?

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


Т.е. если уравнение Шредингера не можешь решить с помощью ручки и бумаги — ты не в авангарде ?! Курчатов, Ландау и др. отдыхают! :)

Некоторые примитивы очень трудно реализовать в программном коде, однако у меня получилось, причем с помощью тех самых второстепенных технологий, PyPi и github-а.
И гугла?

Я действительно уверен, что Питон и «второстепенные технологии» продвигают серьезные проекты.
А я совершенно уверен, что P=NP, земляне произошли от марсиан, и вечный двигатель возможен. У меня доказательств этому нет, а у Вас есть математически строгие доказательства Вашему утверждению?

Прошу прощения если мои ответы кажутся надменными. Для меня держать культурный тон — тоже непростая задача. У меня нет возможности быстро отвечать на комментарии. А их написание занимает довольно много времени, если по другому — то это холивар с моей стороны.

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

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

Паскаль — это «Война и МирЪ» Толстого. Для обычного обывателя слишком много «букав». Прочитать… осмыслить такой труд капец как не просто. Школьник его прочитает, но всей глубины не поймет. Это реально для зрелого человека.


Если про begin-end, то вопрос: не больше ли пробелов и табуляций в Питоне?

Питон — это «Фиеста» Хемингуэя.
Тут сожалею, что не смогу понять Вашу аналогию, т.к. с детства не люблю Хемингуэя.

Будучи ущербным в чем-то — ты можешь эту ущербность обратить в пользу.
Мой вклад в холивар. Считаю ущербным динамические типы, отступы, групповое присваивание, принципиальные проблемы с эффективностью (в частности, упоминают вызов функций), а также проблемы с многопоточностью. Не вижу путей обратить всё это во благо, особенно в случае школьного обучения.
А Вы не поражайтесь, а объясните подробнее, где по-Вашему изврат?
Т.е. во многих сложных задачах (имею в виду теор. оценку для наихудшего случая) 99.9% кода я пишу и отлаживаю на другом языке,
Практически в любой сложной задаче 99.9% кода вы НЕ пишете, за вас его уже написали (если вы в одиночку пишете систему целиком, «сложной» назвать её язык не поворачивается), соответственно

Зачем мне привлекать другой язык только для этого 0.1% примитивного кода?
оставшиеся 0.1% кода нельзя назвать примитивными, иначе бы смысла в создаваемой системе не было бы.

Штука в том, что как раз задача получения данных из одного места, преобразования в другой вид данных и передачи на вход следующему алгоритму на практике оказывается достаточно муторной. Собственно, можно посмотреть любую кроссплатформенную/кроссязыковую библиотеку (Qt, MPI или любой вид CORBA), чтобы увидеть, что языки вроде C++ требуют написания большого количества boilerplate кода в качестве клея между модулями. Это реальная проблема.

но скрипт, который запускает сначала одну программу, потом другую, представляется мне наименее важным во всем проекте


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

Я сам пишу почти всё на C++ (так жизнь сложилась), но не могу отрицать очевидное: эквивалентные GUI-программы C++ и Python на Qt по объёму отличаются раза в два, концептуально C++ код тоже гораздо сложнее, а по факту это тот самый «клей», который требуется для замазывания щелей между идеологиями C++ и Qt. Меня самого это не очень напрягает, но объективно кривая обучения получается куда круче, а выучиваются не полезные вещи, а та самая малополезная «замазка».
Практически в любой сложной задаче 99.9% кода вы НЕ пишете
Я не про библиотеки. Принимаю за 100% код, который мне нужно написать для решения поставленной задачи.
Штука в том, что как раз задача получения данных из одного места, преобразования в другой вид данных и передачи на вход следующему алгоритму на практике оказывается достаточно муторной.
В моей практике обычно не оказывается.

Смотрите на проблему шире. Не скрипт, который оперирует текстовым вводом-выводом, а именно объектно-ориентированный «клей»


Вот список моих проектов:
1) ПБ-бот
2) Роджерийский бот
3) Игра «из мухи в слона»
4) Тест различных представлений графа

Возьмите любой из них и укажите, где конкретно я бы мог воспользоваться ОО «клеем» и что это даст?
В моей практике обычно не оказывается.
Это означает, что ваши проекты пишутся очень небольшой командой и состоят из достаточно однородных (по языку и идеологии) проектов. В больших системах это попросту невозможно.
Возьмите любой из них и укажите, где конкретно я бы мог воспользоваться ОО «клеем» и что это даст?
Смотрите, я не говорю, что это нужно в любом конкретном проекте. Вполне вероятно, что вам это не нужно по причине их хорошей внутренней связности (т.к. пишутся одной небольшой командой или одним человеком на одном языке).

Собственно, Россум прямо пишет вот что: «My original motivation for creating Python was the perceived need for a higher level language in the Amoeba project. I realized that the development of system administration utilities in C was taking too long. Moreover, doing these in the Bourne shell wouldn’t work for a variety of reasons. The most important one was that as a distributed micro-kernel system with a radically new design, Amoeba’s primitive operations were very different (and finer-grain) than the traditional primitive operations available in the Bourne shell. So there was a need for a language that would “bridge the gap between C and the shell.” For a long time, this was Python’s main catchphrase.»


То есть видите, речь идёт именно о создании более высокоуровневого «клея», занимающего промежуточное положение между C и сценариями оболочки. Текущая популярность языка объясняется тем, что по факту огромное количество задач нуждается именно в таком подходе. Все ли 100% нуждаются? Конечно, нет. Но нельзя распространять частный опыт на весь мир. Вы можете использовать Python просто как высокоуровневый язык с развитыми средствами… да чего бы то ни было. Но можете и не использовать, конечно, это уже вопрос вкуса.
Текущая популярность языка объясняется тем, что по факту огромное количество задач нуждается именно в таком подходе.
По факту доля всех создаваемых в мире ОС (вроде Amoeba project) очень небольшая от объема всего создаваемого в мире софта. Поэтому думаю, что причина популярности другая.
Это означает, что ваши проекты пишутся очень небольшой командой и состоят из достаточно однородных (по языку и идеологии) проектов. В больших системах это попросту невозможно.
Т.е. если объем моего проекта меньше 10М SLOC, и команда меньше 1000 человек, то мне ОО клей не нужен. Это самое я и говорил выше.

По факту доля всех создаваемых в мире ОС (вроде Amoeba project) очень небольшая от объема всего создаваемого в мире софта. Поэтому думаю, что причина популярности другая.

Причём тут ОС? Я же вам приводил примеры: абсолютно что угодно, связанное с Qt, CORBA, MPI. Любая ситуация, при которой требуется «подружить» друг с другом NLP (языковые) модули, визуализацию/графики, математику, классификаторы/machine learning и т.п.

Т.е. если объем моего проекта меньше 10М SLOC, и команда меньше 1000 человек, то мне ОО клей не нужен. Это самое я и говорил выше.
Я не знаю, откуда вы берёте эти цифры. Если в эти люди записывать всех авторов описанных библиотек, то да, примерно так и получается. У меня все проекты попадают в разряд, где нужно.
Не очень понимаю, что значит подружить. Нпр., мой бот с OpenCV, с черным ящиком игры под DirectX и с Windows API дружит без всякого Питона.

Если не секрет, скажите, пожалуйста, какой средний объем кода Вашего проекта и сколько человек в команде?
Я потерял нить разговора. Разве кто-то спорил с тем, что можно обойтись без Питона? Конечно, можно. Вопрос исключительно в кривой обучения.

Мы сейчас используем Питон именно в качестве скриптового языка для проекта, в котором участвует около 10 разработчиков, но главное — это не количество разработчиков, а количество библиотек, их очень много, так что объёмы кода не подсчитывал.
Спасибо за разъяснение. Да, если в разных библиотеках разные форматы, разные представления и т.д., то возникает непростая задача совместить трудносовместимое. Видел такие проекты. Сочувствую. Но если вернуться к теме нашего обсуждения, то ИМХО эта проблема и пути ее решения не для изучения в общеобразовательной школе.
Применительно к школе — Python самый обычный современный мейнстримный язык без каких-либо закидонов, архаизмов и художеств автора («я так вижу»). В некотором смысле эта серость и делает его пригодным для школы: другие языки не должны будут вызвать какого-то огромного культурного шока.

Я сам учился на Бейсике ZX Spectrum, потом на QuickBasic. Так вот по ощущениям от программирования Python это шаг в ту же самую сторону. Достаточно ненапряжно с ним работать (хотя проблемы растут с общим размером кодовой базы, вот масштабные проекты я бы на нём делать как раз поостерёгся, если речь не о «склеивании», а именно о написании большого количества кода).
без каких-либо закидонов, архаизмов и художеств автора («я так вижу»)
А отступы разве не закидон? Переход с Питона на С/С++ вызовет огромный шок своими "{}".

Я сам учился на Бейсике ZX Spectrum, потом на QuickBasic. Так вот по ощущениям от программирования Python это шаг в ту же самую сторону.
Я еще помню Бейсик на PDP-11 и Фортран-4 ЕС ЭВМ :) Но и с VBA пришлось познакомится, как и с Фортран-90. Т.о. мне Ваша характеристика Питона много сказала.

вот масштабные проекты я бы на нём делать как раз поостерёгся

Интересно почему? Можно подробнее?
А отступы разве не закидон?

Вот специально не стал об этом говорить :) Закидон, но его проблемность слишком преувеличена. В том же Бейсике ведь тоже нет {} или begin/end, есть только «конец блока», а начало блока определяется по умолчанию. Т.е. если в Бейсике мы пишем For… Next, то в Питоне то же самое, но просто без Next. И ничего, с Бейсика переходили.

Интересно почему? Можно подробнее?

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

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

Я сам пишу довольно много на Питоне, но в целом это именно что скрипты склейки, скрипты тестирования и другие не очень объёмные вещи.

Есть масса одноразового кода, для которого нет смысла тратить время на обдумывание архитектуры. Питон даёт большую свободу и разгружает голову. Один только duck typing чего стоит — когда я могу написать функцию, которая принимает на вход некий объект, и при этом можно ей по факту передать любые объекты, классы которых не связаны в общую иерархию. В Java/C++ и т.п. такие штуки приходится продумывать тщательнее и заранее.
Т.е. если в Бейсике мы пишем For… Next, то в Питоне то же самое, но просто без Next.
М.б. дело привычки, но на мой взгляд большая принципиальная разница.

Проблема Питона и других динамических языков в том

Спасибо. Интересно.
Можно очень легко словить в рантайме банальную синтаксическую ошибку вида «несбалансированные скобки», не говоря уже о более серьёзных вещах.

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

Всё-таки, при всём уважении к Питону, это не тот язык, на котором надо пробовать «что такое программирование». Переходить на него надо, когда уже есть какой-то минимальный опыт.
Проблема в том, что любой язык страдает какой-нибудь аналогичной идиосинкразией. В Паскале почему-то есть массивы, но нет ассоциативных массивов. Длина строк ограничена 255 символами. Переменные можно описывать только в начале функций. Аналогично могу вспомнить про Бейсик, да и не только. Так что идеала не найти.
Длина строк ограничена 255 символами.

Что в Delphi, что во Free Pascal (в режиме {$H+}) длина строк не ограничена.

Ну, точнее ограничена 2^31 для 32 бит.
нет ассоциативных массивов

В Delphi можно использовать класс TStringList, но ИМХО школьникам это не обязательно.

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

Вот видите, у всех свой взгляд. С моей колокольни оно портит дисциплину, ухудшает стиль у читаемость кода. Почему? Ну да потому, что мы разносим инициализацию переменной и контекст её использования. Собственно, в большинстве современных языков это правило убрано именно из стилистических (но и не только) соображений.

ИМХО школьникам это не обязательно
классические алгоритмы. Их удобно изучать на Паскале.

Я не знаю, что такое «классические алгоритмы». На Паскале удобно изучать алгоритмы, предназначенные для изучения Паскаля. Есть миллион задач, в которых требуется сопоставить произвольному ключу произвольное значение, например, слову — количество вхождений данного слова в документ. Не понимаю, почему школьнику это знать менее полезно, чем частный случай, где ключ представляет собой целочисленный индекс. В Паскале такой структуры данных нет… ну вот просто потому что нет, потому что автор её не любит.

Я понимаю вашу точку зрения, но не вижу ни одной причины, по которой любой современный язык хуже Паскаля именно для стандартных учебниковских алгоритмов. Если заглянуть на Rosetta code, то все они выглядят примерно одинаково и на Паскале, и на Питоне, и на современном Бейсике.
Вот видите, у всех свой взгляд. С моей колокольни оно портит дисциплину, ухудшает стиль у читаемость кода. Почему? Ну да потому, что мы разносим инициализацию переменной и контекст её использования.

Так же правилом хорошего тона считается малый размер функций, так что расположение переменных в начале почти ничего не меняет, все равно они на виду.
Это везде так, и тем не менее, в C и потомках произошла эволюция от «переменных в начале» до «переменных где угодно». Я не готов сейчас обсуждать, почему так, но ещё одна важная причина, например, может состоять в том, что до некоторой строки кода у переменной может не быть разумного значения, поэтому автор вынужден объявлять переменную и присваивать ей бессмысленное «пустое» значение (или неявное значение) что плохо, а иногда и просто невозможно. Это может быть даже ударом по системе типов и по безопасности кода.
Я не знаю, что такое «классические алгоритмы»
Думаю, тут не требуется строгого определения. Интуитивно понятно, что пузырьковая сортировка вполне школьный алгоритм, а вот поиск прямых и овалов преобразованием Хафа в OpenCV для школы не обязателен, и параллельные алгоритмы в школе тоже не обязательны.

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

Пусть школьнику поставлена задача прочитать координаты двух точек и вычислить расстояние между ними. Решая столь сложную задачу, школьник прочтет координаты первой точки в x1, y1 и координаты второй — в x2, y2. Потом найдет в мат. справочнике формулу, где расстояние дано для точек, координаты которых обозначены (x0, y0) и (x1, y1). Так и перепишет в программу и получит детскую ошибку. Во избежание подобных ошибок во многих учебниках рекомендуется сначала писать:

var
   x1, y1 : real; {координаты 1-ой точки}
   x2, y2 : real; {координаты 2-ой точки}


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

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


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


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

При таком подходе появляется проблема в случае, когда нужны промежуточные переменные. Но в процессе обучения, проблема "где лучше объявлять переменные" несущественна. Программки там маленькие и даже однобуквенные переменные a,b,c,d не вносят ощутимого бардака в решение. Можно сколько угодно требовать нормальное оформление кода и рассказывать про Mars Climate Orbiter, но пока это не приведет к шишкам от граблей, никто не поймет зачем надо его оформлять.

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

Вообще мне странны такие аналогии. Честно говоря, мне казалось, что уже повсеместно давно определено, что переменные должны объявляться как можно ближе к контексту. Даже не знаю, где мне найти пример развёрнутой аргументации, потому что это абсолютно устоявшееся представление, common knowledge: раз, два, три, четыре.
Разумеется, можно сказать, что все эти люди слабо разбираются в программировании (в отличие от), но просто надо понимать, что ваша точка зрения крайне непопулярна.
переменные должны объявляться как можно ближе к контексту
Да. Не будем забывать о параметрах процедуры или функции. Это важнейшие переменные и значения. К ним (т.е. к заголовку) и должны быть ближе остальные локальные переменные. В функции (процедуре) м.б. определены константы и типы, эти определения используются в определении переменных. Чем ближе все определения друг к другу — тем удобнее работать
Параметры — это интерфейс между функцией и вызывающим её кодом.
Константы — на то и константы, что могут использоваться где угодно, но обязаны иметь всегда одно значение, тем более что «инициализируются» они сразу при объявлении.
Почему к ним должны быть «должны быть ближе остальные локальные переменные»? Почему «Чем ближе все определения друг к другу — тем удобнее работать»?
Пусть:

procedure myProc (nameP : stringN1; var xP,yP,zP :real);
const
 minNum = 3; 
 maxNum = 23;
type
 TPoint = record 
                x,y,z : real;
                name : stringN1;
             end;
 TVector = array [minNum .. maxNum] of TPoint;
var
 vector : TVector;
 buf  : TPoint;
begin // тело процедуры


В ходе работы пришлось переделать:

procedure myProc (nameP : stringN2; // было stringN1
 var xP,yP,zP : extended //  было real
  );
const
 minNum = 2; //  было 3
 midNum = 12;  // добавлено
 midNumAdd1 = midNum +1; // добавлено
 maxNum = 23;
type
 TPoint = record 
                x,y,z : extended; // было real
                id : integer; // добавлено
                name : stringN2; // было stringN1
             end;
 TVector = array [minNum .. maxNum] of TPoint;
 TVectorLo = array [minNum .. midNum ] of TPoint; // добавлено
 TVectorHi = array [midNumAdd1 .. maxNum] of TPoint; // добавлено
var
 vector : TVector; 
 bufLo : TVectorLo; // добавлено
 bufHi  : TVectorHi; // добавлено
// убрано buf  : TPoint; 
begin // тело процедуры


Если определения были бы размазаны по всему телу процедуры в 100+ строк, то такая переделка была труднее. А тело было бы на два десятка строк больше.
Как эти примеры оправдывают необходимость объявления переменных в начале функции?
Перемешайте определения, добавьте 100 строк кода и почувствуйте разницу!
Перемешал, добавил, разницы не почувствовал.
В таком случае остается стандартный сетевой вопрос: «Докажите, что Вы не робот».
Аргументы в стиле «а представьте, что ваш ребёнок объявляет переменные в теле процедуры!» — это круто, но всё же, вы так и не привели примера, который бы действительно показывал, что объявлять переменные удобнее в начале программы, а не при инициализации. А вот пример, показывающий обратное: пишешь ты такой код, и нужно сделать
for point in vector do

Придётся перейти в секцию var и вписать туда
point:TPoint

и снова вернуться к секции for. Или, к примеру, обрабатываешь ты XML-ку, нужно получить какие-то атрибуты из ноды. Если бы в паскале можно было объявлять переменные в месте их использования, получилось бы так:
HeaderNode : IXmlNode = Document.DocumentElement['HEADER'];
Model := HeaderNode.Attributes['MODEL'];
Mark := HeaderNode.Attributes['MARK'];
EngineNode : IXmlNode = Document.DocumentElement['ENGINE'];
EngineVolume := EngineNode.Attributes['VOLUME'];
EngineType := EngineNode.Attributes['TYPE'];

Когда переменные нужно объявлять вначале, пишут так:
var
  …
  Node:IXmlNode;
  …
begin
  Node := Document.DocumentElement['HEADER'];
  Model := Node.Attributes['MODEL'];
  Mark := Node.Attributes['MARK'];
  Node : IXmlNode = Document.DocumentElement['ENGINE'];
  EngineVolume := Node.Attributes['VOLUME'];
  EngineType := Node.Attributes['TYPE'];

Или так:

with Document.DocumentElement['HEADER'] do
begin
  Model := Attributes['MODEL'];
  Mark := Attributes['MARK'];
end;
with Document.DocumentElement['ENGINE'] do
begin
  EngineVolume := Attributes['VOLUME'];
  EngineType := Attributes['TYPE'];
end;


А то и вовсе

Model := Document.DocumentElement['HEADER'].Attributes['MODEL'];
Mark := Document.DocumentElement['HEADER'].Attributes['MARK'];
EngineVolume := Document.DocumentElement['HEADER'].Attributes['VOLUME'];
EngineType := Document.DocumentElement['HEADER'].Attributes['TYPE'];
Выше я уже привел пример:

школьник прочтет координаты первой точки в x1, y1 и координаты второй — в x2, y2. Потом найдет в мат. справочнике формулу, где расстояние дано для точек, координаты которых обозначены (x0, y0) и (x1, y1). Так и перепишет в программу


Остальное — вариации. В первых бейсиках подобные ошибки были очень частыми.
Я так и не понял, как объявление переменной в начале функции поможет избежать такой ошибки?
Я же написал:
var
   x1, y1 : real; {координаты 1-ой точки}
   x2, y2 : real; {координаты 2-ой точки}


Если в таком случае школьник обратится к x0 или к y0, то компилятор выдаст ошибку необъявленной переменной.
А в случае, когда переменные объявляют при первом использовании, компилятор ошибки не выдаст?
Я понял, вы путаете с языками, где переменные можно использовать, не объявляя.
вы путаете с языками, где переменные можно использовать, не объявляя.

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

myProc (x0,y0)
что это и на каком языке?
Вызов процедуры на идеальном языке.
А где здесь объявление?
Здесь первое упоминание, если я правильно понял, то по-Вашему это объявление. А если не правильно, объясните, pls.
Неправильно. Вы знакомы хотя бы с одним языком со статической типизацией, кроме Паскаля?
Знаком. А чем Паскаль здесь плох?
С какими и в каком объёме? Почему тогда с вами приходится говорить о таких базовых вещах, как различие между инициализацией переменной и просто присвоением значений?
Вот и я не понимаю почему Вы игнорируете хорошо известные факты? Что касается «базовых вещей» — иногда вещь только кажется базовой, особенно в такой конвенционной сфере как ЯП. Предвкушаю услышать откровение про «различие между инициализацией переменной и просто присвоением значений». Только потрудитесь дать ссылки на авторитетные источники, а то некоторые Ваши утверждения выше не убеждают.
Различие между инициализацией переменной и просто присвоением значений, если вы не знаете, в том, что до инициализации переменной не присвоено никакого осмысленного значения. В Паскале все объявленные переменные сразу инициализируются нулями (пустыми строками, нулевыми указателями). В C автоматической инициализации нет, попытка чтения неициализированной переменной приводит к UB. В C# обратиться к неинициализированной переменной компилятор не даст вообще.
В Паскале все объявленные переменные инициализируются нулями (пустыми строками, нулевыми указателями)
Ошибаетесь. В разных продуктах по-разному.
По крайней мере так в Delphi. Если есть диалекты Паскаля, где по-другому — сути это не меняет, разница между инициализацией и просто присвоением значения от этого никуда не денется.
Ну вот я повторюсь, не сочтите за труд бегло посмотреть мои ссылки: ваша точка зрения крайне непопулярна и рассматривается как плохая практика почти единогласно. Даже дискуссии особенной нет.

Одну из важных технических причин я уже упоминал: переменной не всегда можно присвоить нормальное разумное значение в начале функции. Вы вот ссылались на театр: ну вот там сразу пишут, что такой-то играет роль такого-то. А тут получается «var a: Integer;», а чему оно равно — написать ещё нельзя. Семантический пробел.
А тут получается «var a: Integer;», а чему оно равно — написать ещё нельзя. Семантический пробел.


А, вот, допустим, если я её объявлю где-нибудь ниже — по факту она всё равно объявится в начале функции (область видимости — функция). Семантический пробел.
Где такое есть? В C#, к примеру, если я попытаюсь получить значение переменной до её объявления, программа не скомпилируется. Напомните мне, в каком языке это не так?
В JS. В VB до дотнет и VBA.
JS компилируется?
А Вы видите в нашей беседе утверждение про компилируемые языки?
Сужение контекста детектед.
При том, что началась беседа про утверждение, что якобы для школьника удобнее будет, если все переменные объявлять в одном месте, и доказательств этого утверждения вы так и не привели.
Совершенно не помню, с кого и когда началась эта беседа, но попробую покосплеить школьника:
При первом вникании в любую разлапистую структуру чистый, неинициализированный, мозг первым делом старается зацепиться за что-то, провести обобщения.
Как всегда, дурацкие аналогии спешат на помощь: представьте, что вы пришли в гости в первый раз, вы видите дом, и вы должны освоиться и найти путь к нужному объекту человеку. Вы совершенно точно знаете, что вход — дверь находится внизу и обычно рядом со списком квартир или домофоном (если квартир слишком много), а не рядом с конкретным окном на этой ужасной серой панельной стене (пусть даже вы уже видите, что вам машут из этого окна). :) Так и можно обосновать пользу — это как бы концепция «мозг=ИДЕ», когда вы после однократного запоминания совершенно точно знаете, где находится нечто нужное, даже если до этого ни разу не видели конкретную программу и открыли ее в каком-нибудь блокноте.
А если в языке предусмотрен целый блок для этого, то вообще красота — можно нажать некий аналог Контрол+Таб (просто для примера) в ИДЕ и перескакивать в нужное место и обратно. Хотя, наверное, находясь в ИДЕ уже пофиг, где что, ведь в идеале там все находится самой системой в любых местах… :)
Подытожу — свобода написания это канеш здорово, но стандартная компоновка важна для обучения, все же наш контекст от обучения неотделим.
Дурацкая аналогия подобна котёнку с дверцей: ничего не объясняет, а только ещё больше запутывает. А что, если друг живёт в таунхаусе? В доме галерейного типа? А если у него вход с улицы?
совершенно точно знаете, где находится нечто нужное

А зачем ученику может понадобиться список всех используемых переменных? Тем более что IDE может их
показать и так.
но стандартная компоновка важна для обучения

А почему именно так? Почему бы не заставлять учеников писать все переменные регистром ЧеРеЗбУкВу? Или заставлять печатать ногами?
Даже котенок знает, где у него дверца… %)

Как я уже сказал, если мы берем в расчет ИДЕ, то это уже другой коленкор, но начинается все не с ИДЕ. :)

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

Вы действительно в это верите?
Лично меня жизнь научила, что не бывает ничего «интуитивно понятного». Бывает ПРИВЫЧНОЕ.
Это ведь одно и то же. :) Ну ладно, раз так понятнее, будем называть это привычное. :) Потому что люди к такому уже привыкли, да.
К чему привык? У нас же
чистый, неинициализированный, мозг
К написанию, очевидно же. :)
Скорее так: к этому привык учитель, который тоже учился на Паскале. Ребёнок ещё ни к чему не успел привыкнуть, потому для него без разницы. Поэтому лучше объявлять переменные в теле процедуры, а не в начале.
Я про человеческое написание. Я надеюсь, мы не говорим о варианте, когда человека учат писать программы раньше, чем общаться с другими человеками. СР! УВЧ! :)
Да ну, человеку удобнее думать заранее, какие переменные он будет использовать? Или может быть удобно постоянно прыгать по коду туда-сюда, если забыл объявить переменную сразу? Или разбирать потом, понадобится ли значение переменной s1 сотней строк ниже, или там эта переменная используется, потому что было лень объявлять лишний раз новую?
Узнать местонахождение заранее — да.
Прыгать — по одному экрану? :)
Со всем остальным компилятор разберется. К слову, компиляцию проще делать тоже при предварительном объявлении, точнее — не надо поаторного прохода, но это уже мелочи. :) А человек все равно найдет, что абьюзить, никакие облегченные правила объявления переменных его не спасут. :)
Даже по одному экрану не очень удобно прыгать.
Со всем остальным компилятор разберется.

С чем?
Ну если кому-то по одному экрану неудобно прыгать, то это уже к навыку базового чтения вопросы… :)

С «понадобится ли значение» и т.п., это же просто особенности человека, а мертвый код компилятор выкинет, как и комментарии. :)
При чём тут компилятор, если речь шла про ситуацию, когда не знаешь, можно ли выкинуть этот кусок кода, или программа после этого заглючит? Приходится человеку, а не компилятору вчитываться в код. А если наработана привычка инициализировать новую переменную для нового блока кода, такие проблемы случаются заметно реже.
Ну вот и прекрасно, сами себе обосновали необходимость инициализации раньше. :) Как я и сказал — привычка решает.
Вы бы хоть читали внимательно. Как раз ранняя инициализация здесь мешает, так как не даёт ограничить область видимости, да ещё и требует больше движений — перейти к блоку с переменными, написать новую переменную, перейти обратно в тело программы, после нескольких таких метаний думаешь «пусть будет s1, потом отрефакторю».
«А если наработана привычка инициализировать новую переменную для нового блока кода» — что написано, то и комментирую. :) Хотя я уже упарился вас всех целую неделю читать. :) Тут уже почти все обсуждение свелось к спору ради спора, поэтому не особо внимательно читаю, но я уже выше изложил, и к этому пока не было вопросов. :)
Вы позеленеете.
Потому что люди к такому уже привыкли, да.

Проблема в том, что люди привыкли к разному.
Почему школьники должны начинать обучаться без IDE?

это интуитивно понятно

«Это же очевидно»
Потому что ИДЕ, как и Дельфи, как кто-то там выше заметил, — проприетарные штуки, которые не очень хорошо впутывать в обучение.
Потому что ИДЕ, как и Дельфи, как кто-то там выше заметил, — проприетарные штуки, которые не очень хорошо впутывать в обучение.

У меня IDE Паскаля с открытым кодом — приспосабливайте и пользуйтесь :)
Покорно прошу прощения, что я не министр образования… ._.
:D
Кстати, в школах же и на Дельфи преподавали, если я не ошибаюсь? Во всяком случае я знаком с учениками, которые домашку делали на ней.
А ещё, многие производители раздают бесплатные лицензии для образовательных учреждений.
Какие молодцы и альтруисты. :3

Не вижу в этом связи с компилируемыми языками.
А с т.з. удобства — школьнику еле знакомому с программированием плевать, где объявлять переменные.


Я считаю, что удобнее всего объявлять переменные в начале области их видимости.
Если реальная область видимости начинается с места объявления переменной — проблема отпадает. А вот мне неповезло работать с языками, в которых это не так.

Не плевать, и выше я написал, почему.
Это ВАМ не плевать. А школьнику — плевать. Где скажут — там он и объявит.
А при характерных длинах школьных программ (всю или почти всю программу видно на одном экране) — это никак не скажется на удобстве поиска ошибки.
И на форматирование кода ему тоже плевать — ровно по той же причине. Короткую программу как ни напиши, она всё равно легко разбирается, потому что короткая.
Не плевать в том смысле, что не нужно стимулировать дурные привычки, которые будут мешать, когда (если) школьник всё же собирается стать программистом.
Какая привычка дурная, а какая нет — зависит от особенностей языка программирования.
Вам случилось писать на языках, в которых вредно объявлять переменные в начале. Мне — на языках, в которых всё ровно наоборот.

когда (если) школьник всё же собирается стать программистом.

Ему ничто не помешает.
Короткую программу как ни напиши, она всё равно легко разбирается, потому что короткая.
Даже короткую программу, записанную в одну строку мне будет понять не очень просто. Думаю и Вам.

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

Вы забыли добавить «очевидно».
Вы забыли добавить «очевидно».
Очевидно Вы заняты флудом.
Если среди операторов будут объявления переменных, то покажется еще сложнее.

А может проще?
А может проще?

Если три строки — сложно, то шесть строк — сложнее.

Как и в литературных текстах. Когда текст разбит на главы, параграфы, пункты и т.д. ориентация и навигация в нем проще. Глава: заголовок функции; параграф: константы; параграф: типы; параграф: переменные; параграф: тело функции (операторы).
Когда текст разбит на главы, параграфы, пункты

Где удобнее читать сноску, внизу страницы или в отдельном списке сносок?

Глава: заголовок функции; параграф: константы; параграф: типы; параграф: переменные; параграф: тело функции (операторы).

Искусственное деление. Более органично было бы разбить тело функции на блоки, в каждом из которых свой набор переменных, а не валить все переменные функции в общий список.
Где удобнее читать сноску, внизу страницы или в отдельном списке сносок?
Когда сносок много, то обычно делают отдельный список, иначе большая часть страницы идет под сноски. Помню, как в школе читал исторические романы Вальтера Скотта, там было очень много сносок и ни одна меня не интересовала (какое мне было дело до исторических подробностей).

Более органично было бы разбить тело функции на блоки, в каждом из которых свой набор переменных
Это как? Если функция разбивается на такие блоки, то из этой функции надо сделать несколько функций. По функции на каждый блок. BTW в Паскале допустимы вложенные функции.
Например, счётчик цикла недоступен за пределами цикла. Какая-нибудь служебная переменная, объявленная в одной из веток исполнения недоступна в другой, либо может быть в ней объявлена независимо. Вложенные функции в Паскале не всегда удобны, например при отладке.
А в Паскале разве не блочная видимость переменных?
Нет, конечно же. переменные объявляются в особом разделе объявления переменных, который существует в модуле и в подпрограммах. У блока нет своего раздела объявления переменных.
Я не знаю, что такое «по факту», по факту вы не можете обратиться к переменной до того, как она объявлена, так что она нигде заранее не «объявится». (Если мы не обсуждаем представление в машинном коде, где переменная в принципе может уйти вообще, т.к. её оптимизатор прибьёт за ненадобностью).

Я говорю о конкретной проблеме: вам приходится при объявлении переменных врать об их наполнении. А иногда это вообще невозможно (напр., если у вас нет конструктора без аргументов, то и присвоить переменной ничего разумного нельзя).
Я не знаю, что такое «по факту», по факту вы не можете обратиться к переменной до того, как она объявлена, так что она нигде заранее не «объявится».


А разве в Питоне переменная не создается автоматически при первом упоминании? Насколько я понял могу написать:
b = 1

И вот объявится целочисленная переменная. А вот что будет, если была уже строка?:
b = 3.14

Да, создаётся. Ну, будет присвоено новое значение. Но это же не относится к вопросу «где объявлять», тут вы говорите о том, что у переменной нет строго сопоставленного типа. Это так.

Хотя в данном контексте разговора лучше сравнивать со статическими языками типа C++, в динамических вообще многое по-другому устроено. Но в данном случае не вижу проблем.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
«The Zen of Python»


В случае:

b = 1
...
b = 3.14


Явно жду:
1) сообщения, что целому типу нельзя присвоить вещественное значение;
2) что b = 3, т.е. автоматическое преобразование действительного в целый.

Но если каждый раз тип меняется, то при работе над программой такое запутанное получится!
Вы так рассуждаете исключительно потому, что у вас голова «заточена» под языки со статической типизацией. Можно рассуждать об отличиях Паскаля от C или Java, но если вы хотите перепрыгнуть в динамический мир, там совсем иная логика.

Откуда вообще берётся понятие о типе переменной? Это достаточно технарская штука, которая мало соотносится с реальными алгоритмическими нуждами, да и просто с обыденным опытом. В динамическом языке переменная — это просто ящик. У ящика не может быть типа. Тип может быть только у содержимого. В Python вы можете класть что угодно в любой ящик, а если вам интересно, каков тип у хранимого значения — да, это можно сделать.

Таким образом, ничего запутанного тут нет: как раз динамические языки ведут себя абсолютно логично и соответственно нашему повседневному опыту. Как раз к логике статических языков надо привыкать. Заметьте, что ваши ожидания (нельзя присвоить, преобразование) — это чисто технарские ожидания, которыми вас явным образом обучили.
Откуда вообще берётся понятие о типе переменной?
Понятие о типе переменной берется из элементарной математики: одно дело найти решение СЛАУ в действительных числах, а другое дело найти решение той же системы в целых числах.
Мне кажется, вы путаете тип переменной и тип значения, которое в переменную помещается. Переменная — это просто ящик, в который вы можете помещать любые значения. Меня может интересовать тип объекта в ящике, а сам ящик меня не интересует, лишь бы в нём можно было бы хранить вещи.
Прежде всего ящики бывают разных размеров. В однобайтовый ящик текст этого сообщения не влезет. А в математике делается разница между типом переменной и типом значения? Еще интересный вопрос: результат функции — это значение или переменная? И еще: экземпляр класса (объект) — это ящик?
Вот в Python считайте, что вам дают ящик достаточного размера для любого значения. Размер ящика как бы не ваша проблема, пусть интерпретатор об этом заботится.

В математике «тип переменной» вообще тонкая тема. В математике нет присваиваний, есть только ссылки: возьмём выражение и для краткости обозначим его как «a». В этом смысле, наверно, типов у переменных нет, но я не готов глубоко погружаться.

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

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

Не для математики, а для конкретных задач. Или вы простые числа тоже объявите отдельным «типом»?
Не для математики, а для конкретных задач
Именно для математики! В частности, для иррациональных чисел указывается ряд важных свойств и доказывается ряд теорем. Это не просто конкретные задачи.
Или вы простые числа тоже объявите отдельным «типом»?
И простые числа в математике специально изучают. И их подтипы — см. вики «Простые числа специального вида».
Именно для конкретного класса задач в конкретных областях математики.
На это уже ответил:
Чего только не узнаешь! Можно подумать, что у целых чисел в матане и тервере разные свойства!
Результаты будут разными как по времени, так и по памяти.
Давайте оставим в покое оптимизацию по памяти и по времени (если речь идёт не об алгоритмической сложности, а о затратах на копирование объектов). В Питоне все типы являются ссылочными, т.е. попытка засунуть один и тот же объект в два ящика приведёт к тому, что они оба будут указывать на один и тот же объект. Если же нужна копия, следует сделать копию явно.

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

где корни-переменные рациональные числа, и где иррациональные. Для математики эти различия носят принципиальный характер.

Опять же, давайте не путать ящики и их содержимое. В ящиках будут храниться любые значения. При этом у любого значения можно спросить: ты рациональное или иррациональное? Я не вижу здесь проблем, типы не убиваются языком, они всегда существуют.

Интерпретатор может не знать моих целей

Окей, технически это работает так: интерпретатор всегда выделяет память для переменных на «куче», а любая переменная — это просто указатель. Поэтому размер переменной всегда равен размеру указателя, и тут с памятью проблем не возникает.
Вы не поняли. Речь не о пустых ящиках письменного стола, в которые можно положить любой карандаш и любой листок бумаги с любой записью. А речь скорее о черных ящиках с разным алгоритмическим наполнением в смысле исполняемого кода. На входе граф может быть представлен списком смежности, нпр.:

1-2,2-3,3-1

если речь идёт не об алгоритмической сложности

Именно что разные представления зачастую имеют разную теоретическую (алгоритмическую) сложность. Таким образом, для одного графа имеем ящики разных типов!
В ящиках будут храниться любые значения. При этом у любого значения можно спросить: ты рациональное или иррациональное?

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

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


Нет, не ok! Для представления графа треугольной матрицей мне в явном виде приходится выделять память, и никакой интерпретатор об этом догадаться не может:

  setLength (adjMatrix,vertNum-1);
  for i:=0 to vertNum-2 do
    setLength (adjMatrix [i], i+1);


Не так все просто. В простом ящике размером N байт можно хранить целое число или несколько целых чисел или строку символов.

Я всё равно не совсем понимаю, в чём проблема. Смотрите, есть базовые типы: целые числа, вещественные, строки. Под них динамически выделяется столько места, сколько нужно. Если вы пишете «1.25», выделится под вещественное, а если «abc» — то три символа под строку.
Есть составные типы — классы. Создайте класс Rational и храните там два числа, вот и будет вам числитель-знаменатель. Если вы создадите экземпляр этого класса, то сможете положить его в любой ящик, т.к. в ящике реально будет храниться просто указатель на ваш класс Rational в куче. Поэтому ящики и безразмерные.

Для представления графа треугольной матрицей мне в явном виде приходится выделять память,


Вам приходится, а мне не приходится :) В Python есть тип данных «список». Это просто динамический массив из произвольного количества произвольных элементов. Чтобы создать треугольную матрицу, я сделаю список, первым элементом которого будет список из одного числа, вторым — список из двух чисел и так далее.
Память будет выделяться тогда, когда я захочу в эти списки что-то реально записывать. По сути это тот же механизм, что и с динамическими строками произвольной длины.
Как-то так:
v = [[1], 
     [2, 3], 
     [4, 5, 6]]
Есть составные типы — классы. Создайте класс Rational и храните там два числа, вот и будет вам числитель-знаменатель. Если вы создадите экземпляр этого класса, то сможете положить его в любой ящик, т.к. в ящике реально будет храниться просто указатель на ваш класс Rational в куче. Поэтому ящики и безразмерные.


Два числа я храню не в классе (типе), а в экземпляре класса (в переменной-объекте). А два других числа храню в другом экземпляре этого же класса. Экземпляры хранятся в куче, а в ящиках только указатели. Поэтому все ящики могут быть одного размера, равного размеру указателя. Но смысл имеет говорить о самих экземплярах, а не об указателях на них. (Можно и указатели на указатели сделать, но и о них говорить также неинтересно).

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


Какое нам дело, когда реально выделяется память? Важно, что мы должны явно указать, сколько элементов в списке или в строке матрицы должно быть, т.е. сколько памяти и подо что нужно выделить.

Все, что я говорил про ящики, я говорил не про указатели.
о смысл имеет говорить о самих экземплярах,

А что с ними не так? Вы знаете, из каких элементов состоит экземпляр, а общий его размер не имеет значения.

Важно, что мы должны явно указать, сколько элементов в списке или в строке матрицы должно быть, т.е. сколько памяти и подо что нужно выделить.

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

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

То что они разного типа. Что не согласуется с Вашим утверждением:
В динамическом языке переменная — это просто ящик. У ящика не может быть типа. Тип может быть только у содержимого.

Ящики разного типа, а указатели на них одного типа, но как уже сказал:
Все, что я говорил про ящики, я говорил не про указатели.


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


Разве создание пустого списка не распределение памяти? Пусть и фьючерсное. Но Вы подменили задачу: у Вас нижняя треугольная матрица, а у меня верхняя. Поэтому мне заранее нужно знать размер. Однако ИМХО это второстепенные технологические моменты, которые уводят нас в сторону. Принципиальный момент: закреплять ли за каждой переменной определенный тип? Я считаю, что для школьника проще закреплять. При этом не спорю, что с динамической типизацией можно писать корректные программы, но это требует определенного опыта от программиста.
Ящики разного типа, а указатели на них одного типа

Вы забываете про вариантный тип. Это не указатель, это скорее union способный контейнить в себе любой элементарный тип или указатель на объект, массив или строку (в некоторых языках это разные сущности).


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

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

Вы забываете про вариантный тип.
В Python везде вариантный тип?
Мне кажется, что наоборот — с динамической типизацией и без нужды вручную распределять память — и дурак напишет.
А мне кажется, что с динамической типизацией очень сложно понять само понятие «тип», да и зачем понимать, если и без этого понимания всё само происходит?
да и зачем понимать, если и без этого понимания всё само происходит?

Так может, это на начальном этапе и не нужно?


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

Так может, это на начальном этапе и не нужно?
Разницы между строчкой цифр и числом понимать не нужно? Сложные типы — массивы и записи понимать не нужно? Главное Булев тип не понимать и писать:

if x<0=true then ...

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

Как раз зная имя легче запомнить!

Вот только надо сначала "увязать" это имя с пониманием — и на ранних стадиях это может быть довольно трудно.


Помню, прочитав свою первую книжку по программированию от корки до корки три раза, я задал папе вопрос: "Пап, а чем отличаются переменные от типов данных?"


Отличия числа от строки я понимал интуитивно, но вот отличие "типа данных строка" от "строковой переменной" от меня ускользало...


PS кстати, попробуйте хотя бы мысленно объяснить ребенку отличие константы от типа данных в TypeScript, где "string" может быть в зависимости от контекста как неименованной строковой константой так и типом данных.

кстати, попробуйте хотя бы мысленно объяснить ребенку отличие константы от типа данных в TypeScript, где «string» может быть в зависимости от контекста как неименованной строковой константой так и типом данных.
Поэтому не нужно учить ребенка TypeScript.

прочитав свою первую книжку по программированию от корки до корки три раза, я задал папе вопрос: «Пап, а чем отличаются переменные от типов данных?»
Видимо была плохая книжка. Это проблема многих популярных книжек — автор пытается объяснить проще, а получается неимоверно сложно.

сначала «увязать» это имя с пониманием — и на ранних стадиях это может быть довольно трудно.
Т.е. понимание уже есть. Т.к. вопрос «Пап, а чем отличаются переменные от типов данных?» говорит об отсутствии понимания. А если есть понимание — его нужно как-то назвать. Это одно из основных свойств детской психологии: давать имена игрушкам и даже любимой чайной чашке. Вы подарили ребенку плюшевого медведя — первым делом ребенок будет выбирать ему имя. Потом можете раз двадцать сказать: «убери медведя с пола» — ребенок не поймет и только почувствовав сердитую интонацию спросит: «Ты про Мишу? Так бы сразу и сказал...»

Поэтому не нужно учить ребенка TypeScript.

Согласен, но этот язык я приводил как пример языка с более развитой системой типов нежели Паскаль.


Видимо была плохая книжка. Это проблема многих популярных книжек — автор пытается объяснить проще, а получается неимоверно сложно.

Или же это фундаментальная проблема подхода "сначала вывалим всю теорию а потом займемся практикой".


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

пример языка с более развитой системой типов
Более развитая в смысле «более сложная», но это не значит, что такая система лучше.

В том же Питоне можно показать операции с числами, потом показать операции со строками — а затем на примере разницы между числами и строками уже ввести понятие типа данных. Будет намного более понятно чем то что обычно делается.
ИМХО будет совершенно непонятно зачем нужны какие-то типы.
PS
Отличия числа от строки я понимал интуитивно, но вот отличие «типа данных строка» от «строковой переменной» от меня ускользало...
В первом приближении такое отличие, как у слова «фрукты» от конкретного яблока и конкретной груши. На прилавке в гастрономе написано «фрукты» и там много яблок и груш. А на другом прилавке написано «рыба»…

… и это будет неверная аналогия! Потому что "яблоко" и "груша" — это такие же типы данных как "фрукты" :-)


Тип данных от значения отличается так же как слово "яблоко" отличается от яблока.

Я же сказал «В первом приближении».

Тип данных от значения
или
отличие «типа данных строка» от «строковой переменной»
?

А отличие типа данных от переменной — такое же как у слова "яблоко" от коробки для яблока.


Я же сказал «В первом приближении».

Аналогия с прилавком одинаково неверная что в первом приближении что во втором.

Аналогия с прилавком одинаково неверная что в первом приближении что во втором.

Интересно. Если не затруднит — поясните подробнее, пожалуйста.
Поэтому мне заранее нужно знать размер.
Гм… да ничего вам не нужно знать. Давайте просто код покажу. Вот эта функция попросту считывает подряд данные и формирует матрицу. Да, я тут использую размер, но только для того, чтобы понять, что пора переходить на следующую строку, но как видите, заранее ничего не выделяется:
matrix = []
N = 4
for row in range(1, N):
	matrix.append([])
	for col in range(1, N - row + 1):
		v = input()
		matrix[-1].extend(v)
	
print(matrix)

Если ввести числа 1-6, получается на выходе [['1', '2', '3'], ['4', '5'], ['6']]

Принципиальный момент: закреплять ли за каждой переменной определенный тип? Я считаю, что для школьника проще закреплять.

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

Это как? Когда бейсик успел стать нестрого типизированным? Вы про VBScript что ли?

Кстати да, на Спектруме все было достаточно строго (и это круто) — нельзя было даже на этапе ввода смешать числовые переменные и строки (ну, то есть строки-то могли состоять целиком из чисел, конечно).

Пользуясь случаем, хочу сказать спасибо за точку зрения, которая где-то там вверху озвучена — что сначала надо обучать паскаль сотоварищи, а потом питоны всякие. Я тоже считаю, что это оптимальный подход. Сначала показываем «как надо», а потом «как можно». Выбор за человеком оставляем. :)
Я имел в виду другое.
Паскаль (любой другой язык низкого уровня) это то, на чём удобно показывать как работает ветвление, циклы и тому подобные базовые вещи.
А Питон — это то, на чём удобно писать одноразовые расчётные программки и мелкую автоматизацию (что вероятно пригодится непрограммисту).

Выбор будет зависеть от того, будет этот человек программистом или нет. Если будет — то всему недостающему научится сам. А если не будет — то ему может и Питон (не говоря уж о Паскале) не пригодится.
Мы об одном говорим разными словами, поэтому я полностью соглашусь и с этим утверждением. :)
А Питон — это то, на чём удобно писать одноразовые расчётные программки и мелкую автоматизацию (что вероятно пригодится непрограммисту).
Экономисту м.б. VBA будет более полезен, чтобы в Excel работать. ИМХО что кому полезно в вузе решат.
Экономисту м.б. VBA будет более полезен, чтобы в Excel работать.

А без привязки к Ёкселю — Питон. По соображениям «импорта всего, что импортируется».

ИМХО что кому полезно в вузе решат.

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

Вы в полагаете, что тот, кто нацелился стать программистом, не займётся этим сам?
Чтобы выявить заинтересованных даже переменные с циклами не нужны — порисуйте в Бейсике квадратики с кружочками, и сразу будет ясно, кто пойдёт в этом направлении, а кому не по приколу.

Во многих вузах будет программирование в разных количествах.

Ох… Студент не-программист бывает двух видов: один и так программирует, другого — не заставишь. И это очень косвенно связано с успеваемостью по другим дисциплинам.
Вы в полагаете, что тот, кто нацелился стать программистом, не займётся этим сам?

Вполне возможно. Если бы мне в школе не дали "потрогать" Паскаль в седьмом классе — я бы сейчас наверняка был не программистом, а математиком.


Даже Delphi дома с пятого класса не давала ощущения того что программирование — это мое. Не было задач, которые нужно решать — а сам себе задачи придумывать я не умею.

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

А учился я на инженера. Но так случилось, что работаю программистом.
Чтобы рассчитать орбиту спутника — нужны исходные данные, а где их достать… если даже не догадываешься об их существовании?
У меня дома валялась книжка «Путешествие к далёким мирам». Там в конце есть раздел с формулами, поддающийся осмыслению где-то классе в 7-8.
Ещё была книжка «Советские космические корабли и орбитальные станции» — скучноватая для ребёнка, но картинки посмотреть было интересно — из неё срисовывались схемы кораблей чтобы рисовать их в Бейсике.
Ну и конечно, книжка с картами звёздного неба.
Короче, каких только книг не валялось: оба родителя инженеры.
Да, и калькулятор был. В нём можно было нажать log даже не зная, что это такое.
У меня тоже оба родителя инженеры (бывшие). Но книги дома в основном фантастические. Так что в пятом классе я читал Правила волшебника и Колесо Времени :-)
Правила волшебника

Они мне в полном составе так и не попались. Когда сестра их от кого-то таскала, я этой темой ещё не интересовался. А потом — она их вернула.
Вот, я тоже думаю, что это одна из главных проблем — как заинтересовать людей в погроминге, если они сами не могут придумать, зачем это им надо. И ведь реально сложно ответить на этот вопрос. :)
как заинтересовать людей в погроминге, если они сами не могут придумать, зачем это им надо. И ведь реально сложно ответить на этот вопрос. :)


ИМХО понимание, что программирование это инструмент
приходит очень быстро. Если изучаешь алгоритмы совместно с математикой, физикой, химией, то и на школьном уровне можно увидеть перспективы и готовые задачи, ждущие решения.
Если изучаешь алгоритмы совместно с математикой, физикой, химией, то и на школьном уровне можно увидеть перспективы и готовые задачи, ждущие решения.

Вот и ответ. А на каком языке давать алгоритмы — вопрос десятый.
Единственное требование: бесплатная и доступная (в смысле не музейная редкость) среда разработки.
Есть ещё более сложный вопрос: нужно ли заинтересовывать в программировании людей, которые не знают, зачем им это надо? Имеем ли мы право отвечать за них, зачем им это надо?

А есть и другая сторона. Один мой институтский друг знал, что он хочет написать, но процесс разработки его не увлекал, поэтому он быстро опускал руки. Когда я последний раз общался с ним лично, он программировать так и не научился. Хотя сейчас, кажется PL/SQL-шик.
Есть ещё более сложный вопрос: нужно ли заинтересовывать в программировании людей, которые не знают, зачем им это надо? Имеем ли мы право отвечать за них, зачем им это надо?


А если вместо «программирование» подставить математика, физика, химия, то имеем ли мы право? М.б. если человек сам не заинтересуется, то его никто заинтересовать не сможет?
М.б. если человек сам не заинтересуется, то его никто заинтересовать не сможет?

Я склонен думать, что так и есть.

Если человек чего-то не изучил, и из-за этого ему оказались закрыты дороги… Кто ж ему злобный буратино?
Я бы сказал, что надо иметь возможность ответить на этот вопрос, если он задан. А решать-то все равно придется человеку.
Вы в полагаете, что тот, кто нацелился стать программистом, не займётся этим сам?
Бывают разные ситуации. Кто-то колеблется, а кто-то позже найдет себя в программировании микроконтроллеров и т.д.
Студент не-программист бывает двух видов: один и так программирует, другого — не заставишь.
М.б. видов 2, но подвидов больше. И наверняка есть подвиды, которые не пойдут на в общем интересную им специальность только потому, что там есть программирование. Я, нпр., знаю людей, которые хотели стать геологами, но не стали из-за математики.

Вот если бы в Excel было что-нибудь помимо VBA, с его отвратительным отладчиком, то программирование в школе можно было бы давать на нем.
Этот офисный пакет действительно востребован практически везде совсем как js.

Я писал для Excel на VBA. Очень не просто. Не для школы. А просто в Excel посчитать лабораторку по физике или задачку по химии — очень полезно для школы.
Ну да, так сложилось и это грустно. А что в опенофисе там вместо ВБА? Питон небось?

Скачал, поставил. У свежей установки есть выбор между OOB, BeanShell, js, Python. Для последних трех нужна установленная JRE(!).
Для новичков надо чтобы "просто работало". Поэтому остается только Open Office Basic.

Хм, жаба для питона, это что-то новенькое. :) Возможно, она там не совсем прибита гвоздями к нему, но все может быть…

Копаю дальше. Версия jre на windows нужна именно 32-разрядная. "Нужна" она только потому что об этом сообщает модальное окно.
После некоторого гугления обнаружил, что в этом офисе просто нет редактирования скриптов питона из коробки. Поэтому надо эти самые скрипты либо класть в директорию пользователя, либо распаковывать .odt как архив, вставлять туда файл, оформлять конфиг и запаковывать все это обратно.
Для запуска скрипта на питоне JRE на самом деле оказалась не нужна.
Все эти пляски с бубном для подключения это явный минус. Если складывать скрипты в общую папку на общественном компьютере, то будет немножко больше бардака. Но вот редактировать эти скрипты надо чем-то другим, т.е. нормальной IDE и храниться они будут как текст, т.е. в git. Так что это плюс.

Попробовал порешать задачки на python в контексте OpenOffice. Редактирование внешней IDE уже не выглядит плюсом, т.к. макрос даже не отображается при синтаксических ошибках. Никакого списка ошибок на видном месте нет.
Отлаживать макросы, использующие документную модель OpenOffice, в отдельной IDE при этом не представляется возможным.


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


OOB на первый взгляд выглядит получше. Он хотя бы работает из коробки.

Да, рыхловато все, в общем…
Большое спасибо за исследование, теперь хоть будет что сказать аргументированно по этому вопросу. :)

Почему новенькое? Jython довольно старый проект. Его даже забросить успели.

VBA, с его отвратительным отладчиком


Можете раскрыть тему? Чем так ужасен отладчик VBA?
Я как-то не заметил значительных недостатков по сравнению с отладчиком в Visual Studio, например, или IntelliJ IDEA.

Лет 7 назад там были весьма назойливые модальные окна и очень невыразительные сообщения об ошибках.


Если учесть, что в ходу может быть даже офис 2003 года, то новые версии офиса не сильно уменьшают дискомфорт.

Лет 7 назад там были весьма назойливые модальные окна и очень невыразительные сообщения об ошибках.

Это не IDE проблема, а языка. В тогдашних версиях Basic была беда с обработкой ошибок. Впрочем, не знаю, как сейчас, я давно за Basic не садился — современные версии не знаю.
Он успел стать строго типизированным :)
В Spectrum Basic моего детства было только два типа: числа и строки, причём понятия «тип» не было, просто имена строковых переменных кончались знаком доллара.
В Spectrum Basic моего детства было только два типа: числа и строки
А целые числа от действительных отличались при индексации массива, в операторах ON и цикла?
Нет, не отличались. Если не ошибаюсь, при индексации дробная часть просто отбрасывалась. А в цикле вообще можно было написать
FOR I = 1.1 to 5.0 STEP 0.2
Интересное решение. Спасибо.
Добавлю, что числа хранились в пятибайтных ячейках, если мне не изменяет память. Ну и все команды были уже токенизированы при вводе, но это другой разговор. :)
Да, я тут использую размер, но только для того, чтобы понять, что пора переходить на следующую строку
Именно «пора переходить на следующую строку» я и назвал размером!

А как там память выделяется — проблема компилятора.
И в Паскале есть стандартная процедура new.

Нет, вы говорили именно про выделение памяти:


Какое нам дело, когда реально выделяется память? Важно, что мы должны явно указать, сколько элементов в списке или в строке матрицы должно быть, т.е. сколько памяти и подо что нужно выделить.

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

в отличии от размера матрицы сколько памяти выделить знать заранее не нужно.
Я и говорил про размер в элементах, а не в байтах:
setLength (adjMatrix,vertNum-1);
Где тут байты?
Примечание
В попугаях это м.б. гораздо длиннее :))
Они притом, что вся наша дискуссия протекала в ключе «типы переменных нужны, чтобы понять, сколько памяти нужно выделить под объект». В данном случае вам нужно количество элементов (произвольного типа), поэтому мы просто возвращаемся к мысли, что можно прекрасно выделять нужную память и без типов.
Думаю, что после всех разъяснений точки зрения участников обсуждения достаточно прояснились. Повторюсь, что типы на мой взгляд нужны прежде всего для того, чтобы не складывать гвозди с огурцами, а километры с минутами, что очень любят делать некоторые школьники начиная с уроков арифметики в первом классе.

Вот только в Паскале система типов не позволяет защищаться от сложения километров с минутами :-)

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

Увы, для решения этой задачи в языке либо должен существовать тип данных «числовой с размерностью», либо должна быть возможность перегружать арифметические операции.
Паскаль этому никак не способствует.
Смысл существования двух числовых типов — целого и с плавающей точкой — в том, что к первому можно применять побитовые операции и получать понятный школьнику результат, а ко второму — нет.
БОльшее количество числовых типов данных имеет смысл только для экономии памяти, что для школьника неактуально.
А нечисловые типы данных — и так есть почти во всех языках, даже если объявляются неявно.

Я, кстати, в школе жалел, что в QBASIC типом по умолчанию является Single == float32, а не Double == float64. Конечно, можно декларировать префиксы типов данных, но в школе я этого ещё не знал.

И, кстати да, в QBASIC FOR замечательно работает с SINGLE
даже
FOR i=0.1 TO 10 STEP 0.1
работало так, как ожидается. Без приведения к целому типу.
Увы, для решения этой задачи в языке либо должен существовать тип данных «числовой с размерностью», либо должна быть возможность перегружать арифметические операции.
Паскаль этому никак не способствует.
В Дельфи возможна перезагрузка операций, но, увы, не понял при чем она тут. Все просто и описано в документации:

program Project2;
 // Как не складывать гвозди с огурцами
{$APPTYPE CONSOLE}

uses
  SysUtils;

type TCucumber = type integer;
type TNail  = type integer;

var
  Cucumber : TCucumber;
  Nail : TNail;

function addNail (var a1,a2 : TNail) : TNail;
begin
  addNail := a1+a2;
end;

begin
  Cucumber := 3;
  Nail := 5;
  Nail := addNail (Nail, Cucumber); // [Error] Project2.dpr(23):
      // Types of actual and formal var parameters must be identical
  writeln (Nail);
  readln;
end.
увы, не понял при чем она тут

Ну, вот, например, Вы в своём коде чешете правой пяткой за левым ухом.

Просто ради любопытства реализовал ограничение на сложение огурцов с гвоздями на шарпе.


struct Nail
{
    private int value;
    public static Nail operator +(
        Nail left, Nail right)
    {
        return left.value + right.value;
    }
    public static implicit operator Nail(int v)
    {
        return new Nail() { value = v };
    }
}

struct Cucumber
{
    private int value;
    public static Cucumber operator +(
        Cucumber left, Cucumber right)
    {
        return left.value - right.value;
    }
    public static implicit operator Cucumber(int t)
    {
        return new Cucumber() { value = t };
    }
}

class Program
{
    static void Main(string[] args)
    {
        Nail left = 7, right = 11;
        Nail total = left + right;
        Cucumber c1 = 13, c2 = 13;
        Cucumber c3 = c1 + c2;
        var something = left + c1;
//Оператор "+" невозможно применить
//к операнду типа "Nail" и "Cucumber".
    }
}

Возможно речь как раз об этом.

Возможно речь как раз об этом.

Да, я именно это и имел в виду.

А если заморочиться сильнее — можно реализовать тип данных с единицей измерения, позволяющий складывать, если размерность одинаковая, запрещающий — если разная, и корректно вычисляющий единицу при умножении.
Это именно что взгляд от реализации, а не от задачи. Математика (по крайней мере, та область о которой мы рассуждаем) не знает ничего ни о байтах, ни о типах переменных. Переменная — всего лишь соглашение, что некая буква будет что-то означать. А вообще, говорить о свойствах чего-то в математике нельзя, не обозначив область математики.
А вообще, говорить о свойствах чего-то в математике нельзя, не обозначив область математики.
Чего только не узнаешь! Можно подумать, что у целых чисел в матане и тервере разные свойства! :)
Ага, какой смысл имеет отрицательная вероятность, или мнимая? А вероятность больше 1?
Не надо путать свойства целых со свойством вероятности. Тервер может изучать вероятность нахождения любого целого числа в какой-то выборке, нпр. Если мы здесь и говорим про школу, то это не значит, что можно использовать примитивные шутки школьного уровня.
А ещё вероятность появления синего и красного шарика. Это тоже такие же понятия математики, как целые числа?
переменной не всегда можно присвоить нормальное разумное значение в начале функции
И не нужно. М.б. я из файла буду в эту переменную читать. Аналогично: результату функции не всегда можно присвоить нормальное разумное значение в начале функции. Почему это Вас не беспокоит?
Почему это Вас не беспокоит?
Кто сказал? Меня оба этих варианта очень даже беспокоят! Во-первых, как уже упомянуто, иногда переменную без инциализации создать нельзя вообще (нет конструктора по умолчанию). Во-вторых, эта конструкция не позволяет мне выразить ровно то, что я хочу. Я хочу сказать: «пусть А равно xyz», а меня язык заставляет сказать «пусть А равно нулю… а теперь A равно xyz».

Ровно поэтому хороший в моём понимании язык не заставляет объявлять переменную до того, как в неё будут записаны данные из файла, и результат работы функции в переменной тоже не хранит.
Ровно поэтому хороший в моём понимании язык не заставляет объявлять переменную до того, как в неё будут записаны данные из файла
А есть языки, которые только при удачном чтении из файла объявляют переменную? А если файл кончился, то не объявляют? (Я не знаю всех языков и в таких деталях).
Ну да, представьте такой вариант:
int a = readInt(f);

А если файл кончился, то просто выбрасывается исключение.
1) А если не написать int?:
a = readInt(f);


2) Обработка исключений — не самая простая для школьника тема.
Если не написать — оно не скомпилируется.
А зачем такая избыточность — ведь понятно какой тип читает readInt?
Если вам совсем уж лень писать лишний раз тип, в C# есть ключевое слово var. В других языках есть аналогичное, напр. в С++11 — auto.
Мне не лень, просто интересны причины такого решения.
Нет. Я про
int a = readInt(f);
А что здесь не так? Объявляется новая переменная a с типом int, и ей присваивается значение, полученное из readInt(f).
Я же уже спросил:
А зачем такая избыточность — ведь понятно какой тип читает readInt?
Я вам ответил: если вы считаете, что объявлять переменную как int избыточно, можете написать
var a = readInt (f)

Получится то же самое.
Вы не ответили почему нельзя написать:
a = readInt (f)
Зачем нужны var или int? В чем логика такого решения? Или же здесь разработчики языка недодумали?
Потому что нельзя использовать переменную, не объявив её и не указав тип. Просто в Паскале это нужно сделать в начале функции, в специальном блоке, а в современных языках — где угодно в коде. Кроме того, в Паскале из-за этого нельзя ограничить область видимости переменной блоком внутри функции, например циклом.
Непонятно ответили: readInt возвращает целое, т.о. «a» становится целым. Не нужно var, int.

Хотите знать зачем я задаю эти вопросы? Чтобы Вы поняли, что школьники замучают учителя подобными вопросами. И т.о. подобные ЯП не для школы.
Скорее, такие вопросы будут задавать школьники, испорченные скриптовыми языками. Точно так же, как школьники, начавшие изучение языков с Бейсика, будут удивляться, как можно жить без оператора GOTO и номеров строк, и зачем нужны отступы?
Попробуйте изучить синтаксис любого современного языка, например C#, попробуйте потренироваться в песочнице, а потом вернётесь, и мы продолжим разговор.
Спасибо, пробовал. И даже продукцию делал. Разговор с Вами продолжать не имеет смысла, пока Вы не дадите внятных ответов на поставленные вопросы. Складывается впечатление, что Вы механически зазубрили синтаксические правила нескольких языков, которые считаете современными, совершенно не задумываясь о причине таких правил. Объяснить не можете — значит не понимаете.

А «вернетесь» Вы хорошо сказали: разрешаете мне вернуться к обсуждению моей статьи?! Очень мило! :))
Странно, именно это можно сказать про Вас. Если вы не заметили, я привёл два примера, когда объявление переменных в начале процедуры идут во вред, вы же пороли какую-то чушь про детскую ошибку с x0, которую языки, разрешающие объявление в любом месте так же не пропустят.
пороли какую-то чушь
И лексика у Вас на уровне.
Нечего возразить — придерись к лексике. От вас же ничего внятного на тему, почему объявлять переменные нужно в одном месте, я не услышал, в то время как привёл не один довод против.
В Python не надо писать int (и вообще никакого типа не надо), в C++ можно написать auto.

Честно говоря, вы прыгаете с языка на язык, поэтому мне трудно комментировать детально. Если мы обсуждаем динамические языки, там одна логика, если статические — другая. Мы вообще обсуждали, где лучше объявлять переменные. Если бы я знал, что речь зайдёт о типе, не написал бы «int a;» Вот считайте, что написал «auto a». А почему нужно ключевое слово «auto» в C++ и не нужно в Python — это тоже очень легко объяснить, в том числе и школьнику.

Обработка исключений — не самая простая для школьника тема.
Обоснуйте, сошлитесь на опыт. Исключения гораздо сложнее в языках типа C++, т.к. там ещё возникает задача управления ресурсами. В Python всё проще (как и в Visual Basic, например).
Ну да, представьте такой вариант:
int a = readInt(f);
А если файл кончился, то просто выбрасывается исключение.

Исключение при чтении файла, который закончился, нагляднее предупреждать if(!reader.EndOfStream){/*read*/}, чем ловить. Думаю, что это верно для всех языков.
К тому же буквально вчера наткнулся на то, что StreamReader в C# исключение не бросает, а вычитывает null в случае с существующим, но пустым файлом.


StreamReader sr = new StreamReader("TextFile1.txt");
String val = sr.ReadLine();
val = sr.ReadLine();

Так что поведение при чтении пустого файла очень зависит от реализации этого чтения в конкретном инструменте.


Обработка исключений — не самая простая для школьника тема.
Обоснуйте, сошлитесь на опыт.

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


throw в Main никакой пользы не несет, поэтому и объяснение исключений откладываю до момента объяснения функций-методов. Кстати исключения — не единственный способ реакции на ошибки. Не забывайте еще статус-коды (WinAPI, HTTP) и Either в ФП.

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

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

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

Ну а то, что C# или WinAPI так не поступает — это как раз следствие «классического» подхода, но мы же тут рассуждаем о логичности и наглядности, а не о том, что по факту чаще используется в реальных библиотеках.

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


Не знаю насчет школьников, но начинающим взрослым на уровне задачек про квадратный корень нагляднее делать либо так:


int x = double.Parse(Console.ReadLine());
if (x<0){
  Console.WriteLine("Подкоренное выражение должно быть неотрицательно");
  return;
}
double result = Math.Sqrt(x);
Console.WriteLine(result);

либо так


int x = double.Parse(Console.ReadLine());
if (x<0){
  Console.WriteLine("Подкоренное выражение должно быть неотрицательно");
} else {
  double result = Math.Sqrt(x);
  Console.WriteLine(result);
}

Никаких исключений и кодов ошибок тут не надо. Лишние они, когда вся программа на одном экране помещается.

Никаких исключений и кодов ошибок тут не надо. Лишние они, когда вся программа на одном экране помещается.

Это, конечно, верно. Я просто думаю об обобщённых задачах вида «написать функцию, которая вычисляет квадратный корень» или «написать функцию, которая возвращает значение a / b». Вот их с кодами возврата написать красиво трудно, и, скорее всего, это будет довольно дурной стиль, которому бы я детей учить не хотел.

Согласен. Возвращение кодов возврата в простых задачах неуместно. Оно полезно при работе с DirectX, SDL, WinAPI на С++, где иного выхода нет, либо вместе с HTTP клиентом, либо когда в программе много различных ошибочных исходов. Поэтому тривиальную задачу на такую тему придумать трудно.
Нужно ли вообще об этом подходе рассказывать в учебном заведении? Или отдать на самостоятельное освоение?

Да, это тонкая тема. Я не думал об этом серьёзно, но вот, пожалуй, идеологически правильно отделить результаты работы функций от обработки ошибок. В этом смысле исключения правильнее, даже если их сложнее объяснить (не факт, что сложнее...) Конечно, не всегда исключения лучше, но если выбирать что-то одно для первого знакомства, я бы всё же остановился на них.
В MacOS 7.0 -8.0 чтение из файла насколько помню проходило следующим образом:

err := readFile (aFile, buf);
if err <>0 then // обработка ошибки
Нужно ли вообще об этом подходе рассказывать в учебном заведении? Или отдать на самостоятельное освоение?
Все, что рассказывает учитель на уроке, ученик должен знать. Если не знает может получить 2. А за самостоятельное освоение двоек не ставят. Кому интересно — пусть осваивают. Учитель должен помочь.
Я просто думаю об обобщённых задачах вида «написать функцию, которая вычисляет квадратный корень» или «написать функцию, которая возвращает значение a / b».
ИМХО не надо ставить перед школьниками таких задач.
Почему? это же самые основы. Всё равно, что сказать «не надо школьникам изучать деление, ведь они могут поделить на ноль, за ними не углядишь»
В Python не надо писать int


Я правильно понял, что в Python можно написать:
a = readInt (f)

и переменная «а» будет иметь целочисленное значение?

Обоснуйте, сошлитесь на опыт.
См. секцию «Обработка редких и исключительных ситуаций» в моей статье. Изложенная там философия явно не для школьника.
и переменная «а» будет иметь целочисленное значение?
Да, именно так. Точнее, переменная a будет СОДЕРЖАТЬ целочисленное значение. Сама переменная типа не имеет, это только ящик.

Изложенная там философия явно не для школьника

Это ВАШ взгляд на исключения. В рамках Python, например, исключения используют гораздо чаще, чем в статических языках. В мире C++, например, исключения используют редко, т.к. они могут сильно ударить по производительности. Python не ставит целью высокую производительность, поэтому там это неактуально.
Это ВАШ взгляд на исключения.
Не только мой — я там вики цитирую.
Ну, что ж я могу сделать, если в Вики такое плохое определение? Ср. с английской, там всё гораздо менее жёстко: anomalous or exceptional conditions requiring special processing – often changing the normal flow of program execution.
Заметьте, ни слова про «бессмысленность» или «невозможность» дальнейшей работы алгоритма. Далее в английской вики: Alternative approaches to exception handling in software are error checking, which maintains normal program flow with later explicit checks for contingencies — т.е. исключения явным образом описаны как альтернативный механизм, а не инструмент для каких-то особенных случаев.
ИМХО очевидно, что если «requiring special processing», значит нормальный процессинг невозможен. Т.е. тоже самое сказано немного другими словами. Многие авторы обработку исключений по-простому называют обработкой ошибок. Нпр., Э. Троелсен, C# и платформа .NET, ПИТЕР, 2004, С.177.
Да вот если бы всё было очевидно, мы бы тут который день не обсуждали бы такие вопросы :)

Троелсен исходит из парадигмы C#, в котором «нормальным» считается именно такое поведение, берущее начало из C++ и Java. Но это именно что культура конкретного языка.

В Python даже обычный нормальный выход из цикла for по достижении конца списка «под капотом» производится с помощью исключения. Я не защищаю этот стиль, но то, что на эту проблему смотрят весьма по-разному — факт.
Да вот если бы всё было очевидно, мы бы тут который день не обсуждали бы такие вопросы :)
Согласен.

Я не защищаю этот стиль, но то, что на эту проблему смотрят весьма по-разному — факт.
Ok. Действительно, всё не очевидно — с чего Вы и начали. Наверное, не стоит столь неочевидное в школе изучать.
Наверное, не стоит столь неочевидное в школе изучать.

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


Если просто без обобщений:
readln (x);
if x<0 then
 writeln ('Ошибка ввода: х не может быть отрицательным')
else
 writeln (sqrt(x));

то ok — поймет самый тупой ученик.
Да, конечно, в этом случае исключения не нужны. Дилемма возникает, как только потребуется корректно обработать ошибку, а не просто сообщить и завершить работу. Но может, в школе это и не понадобится вовсе.
Но может, в школе это и не понадобится вовсе.
И я так думаю.
В языках, где переменные объявляют в месте использования, результат функции обычно передаётся в момент выхода из неё.
Выходов м.б. несколько, а еще исключения. В последнем случае при отладке полезно бывает знать, какой результат чуть не настал.
Да, поэтому дебаггер обычно позволяет это сделать даже без наличия явных переменных.
К сожалению не всегда.
Воспользуйтесь дебаггером получше :)
Visual Studio точно умеет.
Единственный, довольно сомнительный, плюс от объявления переменных в начале функции — такое ограничение заставляет писать более короткие функции. Однако, любители писать функции на 1000 строк выходят из положения, просто объявляя «про запас» переменные типа «s1,s2…», либо повторно используя одну и ту же переменную.
В тех языках, в которых областью видимости переменной является функция, перечислить переменные вначале — удобнее. Сразу можно видеть, какие переменные доступны.

В языках, где область видимости локальной переменой начинается «со следующего оператора после объявления» — как в Lua — такой подход, очевидно, неприменим.
А зачем? Кроме того, есть соблазн пользоваться неинициализированными переменными.
А нет там неинициализированных по большому счету.
Тем хуже: войдёт в привычку, что неинициализированная переменная принимает 0, '' или nil, а потом понадобится переучиться на другой язык.
Пфф ну так тогда и передача, скажем, объектов как ссылок — тоже зло. А то потом надо будет тебе переучиться на С++, а там передача по значению — это копия.
Или привык ты к тому что GC за тобой чистит, а тут ннна и самому освобождать память надо.
И все, как жить-то дальше.
У каждого языка — свои особенности.
Просто не использовать параметры как переменные.
Просто не использовать параметры как переменные.
Сомнительный совет для школьной информатики.
Поясните, чем он сомнителен.
Во многих учебниках есть параметры-переменные.
просто объявляя «про запас» переменные типа «s1,s2…»

Многие компиляторы (нпр., Дельфи) выдают предупреждения про неиспользованные переменные.
Многие программисты, пишущие на Delphi методы длиной более 1000 строк, объявляющие переменные про запас, использующие переменные по нескольку раз и дающие им имена типа «s1», «sss» и «str1», игнорируют предупреждения компилятора.
Могут игнорировать, главное чтобы к компилятору прислушивался их начальник.
>но нет ассоциативных массивов

Они в не-объектных языках вообще нечасто встречаются.

> Если заглянуть на Rosetta code, то все они выглядят примерно одинаково и на Паскале, и на Питоне, и на современном Бейсике.

Я всё-таки за то, чтобы начало и конец блока обозначались явно. Как в Паскале, как в Си, — на худой конец, как в Бейсике.
Я всё-таки за то, чтобы начало и конец блока обозначались явно. Как в Паскале, как в Си, — на худой конец, как в Бейсике.
Я тоже. Но ей-богу, этой проблеме Питона уделено неоправданно много времени. Это ещё один спор вида «tabs vs spaces» или «фигурную скобку открываем на строке с именем функции или на следующей».
этой проблеме Питона уделено неоправданно много времени

Всё дело в контексте. Для состоявшегося программиста (не важно какие языки он изучал до Питона) — этой проблемы не существует.
Но ознакомление с программированием лучше осуществлять с языка без такой особенности.

Не знаю. Ну вот честно. Может, вы и правы. Мне скорее кажется, что это довольно мелкая деталь. Для меня, например, такая штука, как нумерация строк в Бейсике, казалась абсолютно неотъемлемой частью программы. Однако практика показала, что мозг достаточно гибок :)
Однако практика показала, что мозг достаточно гибок

У того, кто уже программировал.

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

Кстати, мысль интересная. Я правильно понял, что для наколенных поделок и одноразовых программ Питон наиболее удобен?
У того, кто уже программировал.
Повторюсь, я не возьмусь спорить. Есть люди, которые утверждают, что начинать учиться программировать вообще надо с функциональных языков, т.к. они правильно развивают мозг (!) А там синтаксис ещё покруче. Опять же, мой опыт начала с нуля показал, что можно уйти от номеров строк, хотя это ну настолько краеугольный камень всех Бейсиков восьмидесятых, что вообще было странно. как без них. Как же без GO TO, как же без READ...DATA.

Я правильно понял, что для наколенных поделок и одноразовых программ Питон наиболее удобен?
Не только для них, но думаю, что для них точно.
можно уйти

Я Вам про Фому, а Вы мне про Ерёму.

Как вы себе представляете человека, который ещё ни к чему не пришёл, но уже «можно уйти»?
От чего угодно можно уйти, но к этому времени понимание сущности программирования уже сложилось.

Что касается функциональных языков — надо не забывать, что мы готовим не программиста, а человека, который что-то слышал о программировании. Функциональные языки такому человеку скорее всего не пригодятся. А вот императивные — запросто.

Короче, я бы строил программу обучения так: сперва на каком-то простом как пробка языке (бейсик, паскаль, т.п.) показал основные понятия — два три урока, не больше; а потом перешёл на Питон — как наиболее полезный для непрограммиста язык.
В Паскале почему-то есть массивы, но нет ассоциативных массивов.

Если брать именно чистый Паскаль, то в его времена мало кто имел это вообще.
то в его времена мало кто имел это вообще.

Так в том и дело! Мы же живём не в «его времена», правда? Во всей дискуссии этой ветке меня больше всего удивляет произвольность критериев «простоты» и «сложности», которые поразительным образом совпадают со взглядами восьмидесятых годов.

В моём ментальном мире ассоциативный массив — это просто и понятно ребёнку. Набор пар вида «ключ-значение». Это кукла Маши, а это кукла Даши. Это куда понятнее и проще, чем «первая кукла», «вторая кукла» с нумерованными ящичками.

При этом когда «старый» Паскаль проваливается в сложности, никого это здесь не беспокоит. Например, ратуют за реализацию балансировки деревьев. Окей, но это означает динамическое выделение памяти, верно? Первое, чему учат школьника про память — это тому, что память представляет собой линейный блок. А тут говорят, что есть «куча», из которой можно брать что угодно и возвращать как угодно. Это же в голове не укладывается (по крайней мере, у меня в старшей школе был настоящий вывих мозга, когда мы это изучали). Ну а что, не объяснять же все сложные детали. Взяли память, отдали память, всего-то.
Т.е. во многих сложных задачах (имею в виду теор. оценку для наихудшего случая) 99.9% кода я пишу и отлаживаю на другом языке, а для Питона остается I/O?

Для наихудшего, абсолютно все переписывается на другом языке. Но если срочно нужен прототип или заклеить дыру, то как правило все сначала пишется на Питоне. Если заказчику срочно нужен какой-то софт, то он согласится на прототип и не будет ждать пока ему сделают все без сучка и задоринки. Пока он пользуется прототипом, ищутся узкие места и переписываются на другом языке, хотя, как правило, это тот же CРython. Если говорить о научном софте, то 99,9% кода уже готово, ничего переписывать не надо. Чем будут оставшиеся 0.01% кода зависит от ваших идей и возможностей.
MKL прекрасно работает со многими языками (не знаю случая, где не работает). Я не ставлю в особую заслугу Delphi, что работает с MKL. Вот если бы не работало — было бы возмутительно!

В дистрибутиве Питона от Интел он доступен из коробки. Т. е. пользуясь этим дистрибутивом, ты можешь даже не подозревать, что на самом деле, постоянно пользуешься MKL. Ни скачиваний, ни настроек, просто берешь и пользуешься.
Тут я не понял. Хочу матрицы на GPU обрабатывать и СЛАУ решать, а еще перестановки генерировать. Как обойтись без CUDA?

Математически чистый код на Питоне может быть легко скомпилирован в оптимизированный под GPU код.
Десятки графиков и Excel построит. Из программы на Delphi в Excel по СОМ данные передаются без проблем.

А в MatPlotLib и SymPy графики и Latex из коробки.
Хоть пару строк, хоть 20, но скрипт, который запускает сначала одну программу, потом другую, представляется мне наименее важным во всем проекте.

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

:)
а у Вас есть математически строгие доказательства Вашему утверждению?

Гугл :) в смысле сам Гугл, как огромный-огромный проект. Для исследований в ИИ (не только в ИИ и не только исследований) помимо C++ и CUDA они используют Питон не просто так.
Т.е. если уравнение Шредингера не можешь решить с помощью ручки и бумаги — ты не в авангарде ?! Курчатов, Ландау и др. отдыхают! :)

Взаимно о некоторых ваших ответах:
Честно говоря, хотя и по возможности мягко выражаясь, они мне кажутся не совсем обдуманными.

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

Эта полемика для меня полезна тем, что появилась цель написать статью о плюсах и минусах использования Питона в образовании и не только школьном. Это хорошая разминка.

Я не имею полного представления о всех возможностях Паскаля, но я на нем все-таки немного программировал. Вы же сами писали, что:
на Питоне ничего не делал.

Я предлагаю поступить следующим образом. Что бы наша полемика перешла на следующий уровень я постараюсь написать по максимуму объективную статью. А вы попробуйте, что-нибудь сделать на Питоне, допустим, игрового бота.

Я считаю, что так мы добьемся большей пользы.
Если говорить о научном софте, то 99,9% кода уже готово, ничего переписывать не надо.
Далеко не всегда. Многие мое научные программы 100% написаны мной.
В дистрибутиве Питона от Интел он доступен из коробки.
А какая разница поставляется вместе или отдельно?

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

Про гугл я спросил не случайно. В Вашем примере github выступил в роли поисковика. Если мой код лежит не на github, то через гугл найдется моя публикация на Хабре, в которой указана ссылка на код. Т.о. github в моем случае роли не играет.

они используют Питон не просто так.
Доказательство не убедительно — м.б. и просто так. Большие и богатые компании могут себе позволить некоторое количество рискованных проектов с очень малой вероятностью успеха. Иногда личные чудачества хозяина компании играют решающую роль. Распространено мнение, что так, нпр., возник VBA. Получится ли у гугла беспилотный автомобиль никто не знает, но реклама гуглу хорошая. М.б. только для рекламы и затеян этот проект.

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

А для чего вам доказывать? У вас есть уютная экосистема технологий в которой вы профессионал. Может быть даже незаменимый. Доказательства вам "не убедительны" только потому что не интересно. Изучение какой-либо технологии это как восхождение на гору. Пока не заберешься, не увидишь открывающихся перспектив. Объективно, github и python — очень полезные технологии. Они помогают решать производственные и образовательные задачи. Если вам эти технологии не интересны — не пользуйтесь. Зачем демагогию устраивать?

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


А я говорил иное: 1) в школе Питон не нужен; 2) важен не язык, а алгоритмы.
Т.о. никакой демагогии с моей стороны.
А я говорил иное: 1) в школе Питон не нужен; 2) важен не язык, а алгоритмы.

Вообще мы тут свободно общаемся, а если бы существовала реальная дискуссия о языке в школе, то там бы аргументы были бы совсем другими. Все бы согласились, что важны алгоритмы, но тут же неизбежно бы возник вопрос о языке. И здесь бы любой живой (поддерживаемый, развивающийся) язык с пологой кривой обучения заранее был бы обречён на победу, так же как английский выигрывает у древнегреческого, пусть даже на последнем писали Гомер и Аристофан.
И здесь бы любой живой (поддерживаемый, развивающийся) язык с пологой кривой обучения заранее был бы обречён на победу
Всех языков слишком много. Поэтому часто используют рейтинг TIOBE. Если исходить из него, то самый «живой» это Ява, дальше С и С++. Но и Дельфи/Паскаль, как и Питон устойчиво входят в топ. И кто «обречен на победу»?
В рейтинге сказано именно «Delphi» (а не Lazarus и не Pascal), а Delphi это проприетарная и очень дорогая среда программирования. Мне кажется неплохим языком и C#, но всё же для школы я бы выбрал что-то более нейтральное и уж точно не платное.
В рейтинге сказано именно «Delphi/Object Pascal». Согласно Вики Object Pascal — это Delphi, Oxygene, Free Pascal, Virtual Pascal, TMT Pascal, Turbo51. Только ли Delphi в рейтинге не понятно.

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


ИМХО можно Free Pascal.
Ну если мы ссылаемся на рейтинг TIOBE, то его там нет :)
Там всё-таки «Delphi/Object Pascal», поэтому я и говорил, что Pascal язык мёртвый. Жива только конкретная и довольно специфическая его разновидность.
то его там нет

Для школы различие Free Pascal и Delphi не существенны. Еще есть PascalABC.NET.
Там всё-таки «Delphi/Object Pascal»

И Free Pascal попадает в эту категорию.
Если бы на TIOBE хотели написать Free Pascal, так бы и написали.
На TIOBE написали «объектный Паскаль», это категория, в которую входит много чего.
Соглашусь, но тогда давайте и обучать именно ему, с объектами и современным стилем. Тут в основном пишут, что это всё «излишества», вредные школьникам, а нужен язык, в котором нет ничего лишнего.
а Delphi это проприетарная и очень дорогая среда программирования.

Есть бесплатная версия для некоммерческого использования.
Сегодня есть, завтра нет. Эту фирму бросало за последние десять лет во все стороны, и я бы не стал глубоко внедрять в систему образования технологию, которая завтра по щелчку пальцев меняет статус.
Вообще-то есть куча интерпретаторов Паскаля с открытым исходным кодом. К примеру, я взял P5 для поддержки спец. скриптов и добавил простую IDE на Delphi. Можно было бы для школ что-то подобное сделать и выложить как freeware.
Ну, если завтра нет, то будете по-прежнему использовать сегодняшнюю версию, и переходить, уж если так надо, на иное постепенно.
Это слишком большой риск. Система образования должна выстраиваться на многие годы вперёд, и «завязывать» её на конкретную версию конкретного софта нельзя. Даже для обычной фирмы это плохая практика, а тут речь идёт о куда более широкой проблеме. Да и непонятно, ради чего всё это, если есть очевидные альтернативы.

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

Шутка или пасквиль?
(Страшно подумать: м.б. и Питон -это шутка, а я тут спорю :)
На что-то намекаете? :)

А вы попробуйте достойно продержаться на моей полянке :)

Поняли о чем я?..
Не понимаю, причём тут вообще Ваша полянка. Я на неё не претендовал и не намерен.
Не понимаю

В этом и есть проблема намеков — они не всем и не всегда понятны. Будьте конкретнее.

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

Поэтому я обязательно подумаю, что Вы мнительный, если Вы не объясните, в чём дело.
:) фактически, на тот момент все выглядело так будто мне нечего сказать в ответ на комментарий автора статьи и я начал просто минусовать. Коллега на работе так и подумал :) без конкретики, так мог подумать любой.

Ну а полянка… полянка в смысле экосистема в которой обитают, так сказать, любители определенных языков. До определенного момента, я тут был единственным, кто выступал в пользу Питона в образовании.
Вот только писал я об вот этой статье. Отвечая на пост, который отвечал на пост, в котором была дана указанная ссылка.

Поэтому до сих пор не понимаю, причём тут Вы.
Зато для меня прояснилось, потеряло всякую важность и сильно улыбнуло. До вас, в этой дискуссии, все таким серьезным казалось. Но благодаря вам, я посмотрел на все под другим углом и оказывается, тут действительно есть над чем посмеяться. Спасибо.
Две поправки. Во-первых, на олимпиадах скорость работы кода тоже очень важна. На финале ACM организаторы не гарантируют что все задачи могут быть решены на Java, именно из-за тормозов последней. Что уж тут говорить о Питоне?

Во-вторых, переменная c не нужна:

a, b = b, a+b

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


Условие задачи
Пoльзoватeль ввoдит два маccива данных. cравнить coдeржимoe двух маccивoв и вывecти рeзультат в видe таблицы в файл. Значeния пeрвoгo маccива — загoлoвки кoлoнoк. Значeния втoрoгo маccива — загoлoвки cтрoк. ecли загoлoвoк кoлoнки coвпадаeт c загoлoвкoм cтрoки, тo в ячeйкe нужнo пocтавить плюc. oткрыть файл cтандартным рeдактoрoм при завeршeнии рабoты прoграммы.
Исходные данные:
q a z w s x
q w e

Примерный результат
# q a z w s x
q +          |
w       +    |
e            |
#------------

Реализация C#
String topRaw = Console.ReadLine();
String leftRaw = Console.ReadLine();
if (String.IsNullOrWhiteSpace(leftRaw))
{
    Console.WriteLine("Данные слева отсутствуют");
    return;
}
if (String.IsNullOrWhiteSpace(topRaw))
{
    Console.WriteLine("Данные сверху отсутствуют");
    return;
}
String filename = "dest.txt";
using (System.IO.StreamWriter dest = new System.IO.StreamWriter(filename)){
    String[] leftArr = leftRaw.Split(' ');
    String[] topArr = topRaw.Split(' ');
    dest.Write("# ");
    dest.WriteLine(topRaw);
    for (int i = 0; i < leftArr.Length; i++)
    {
        dest.Write(leftArr[i]);
        for (int j = 0; j < topArr.Length; j++)
        {
            if (leftArr[i].Equals(topArr[j]))
            {
                dest.Write(" +");
            }
            else
            {
                dest.Write("  ");
            }
        }
        dest.WriteLine("|");
    }
    dest.Write(" ");
    for (int i = 0; i < topArr.Length; i++)
    {
        dest.Write("--");
    }
    System.Diagnostics.Process.Start(filename);
}
Мало свободного времени. Поэтому ваш код на С# перевел в Питон код (почти строчка в строчку) и все. Хотя, тут больше ничего на питоне особо не вымудришь больше
Реализация на Питоне
topRaw = input()
leftRaw = input()

if len(leftRaw)==0 or set(leftRaw)=={' '}:
    print('Данные слева отсутствуют')
    
if len(topRaw)==0 or set(topRaw)=={' '}:
    print('Данные сверху отсутствуют')

file = open('dest.txt', 'w')
file.write('# ' + topRaw + '\n')

topRaw = topRaw.split(' ')
leftRaw = leftRaw.split(' ')

for i in leftRaw:
    file.write(i)
    for j in topRaw:
        if i == j:
            file.write(' +')
        else:
            file.write('  ')
    file.write('|\n')

file.write('# ')

for i in range(len(topRaw)):
    file.write('--')

file.close()

import os
os.system('xdg-open ' + os.getcwd() + '/dest.txt')


Все таки для новичка порог C# наверное выше чем у Питона. Если брать 7 класс (там мы уже знакомимся с Питоном) то, для них даже печать на клавиатуре — долгое занятие. Причем навыка печати практически нет — много опечаток. В фигурных скобках (как-то они у меня пробовали просто перепечатать код С++ с книги для заливки в Ардуино) сильно путаются.

Для конкретных новичков, самые первые шаги в C# точно никакого удовольствия не принесут. А вот у старшеклассников и студентов думаю никаких особых трудностей возникать не должно. У Питона есть огромный минус — нет широких возможностей для мобильной разработки. У одного ученика был интерес к мобильной разработке и ему я ничем помочь не смог. Просто не хотелось учить C# (в постоянной, катастрофической нехватке времени), но постараться его хоть немного освоить надо.

И все равно, если дело касается обучения программированию, то Питон в этом плане удобнее. Думаю, любой алгоритм на Питоне будет короче, чем на C# и не менее наглядным. Но именно обучения, в реальных «боевых» условиях одним Питоном не обойтись.
Если брать 7 класс (там мы уже знакомимся с Питоном) то, для них даже печать на клавиатуре — долгое занятие. Причем навыка печати практически нет — много опечаток.
Это очень странно. А сочинения по литературе они ручкой на бумажке пишут? Или набирают на ПК, чтобы чекером воспользоваться, а потом с экрана переписывают?

До всяких ПК документы и рукописи печатали на пишущих машинках. Сначала были механические, а потом появились электрические. Машинисток учили на курсах. Были и книги-самоучители слепого метода 10 пальцами. Важно сразу правильно поставить руки — переучиться гораздо труднее. Со слепого метода с правильной постановкой рук и нужно начинать знакомство с ПК в школе.
Для них это тяжело. Даже в ВК они начинают обмениваться (сам в шоке) не текстовыми, а голосовыми сообщениями. На первом занятии 50% постоянно делает опечатки и этот процент падает довольно медленно.

Это довольно трудно, представлять, что ты медленно печатаешь и не кажется весомым аргументом.

В одной школе, ребята вытащили клавиши из клавиатуры и все их поменяли местами. Ради интереса попробовал на ней печатать. Если думаете, что вам поможет слепой набор, то попробуйте. И вы поймете, что чисто статистически чем меньше вы печатаете на такой клавиатуре, тем меньше ошибаетесь.

Со слепого метода с правильной постановкой рук и нужно начинать знакомство с ПК в школе.

Сейчас знакомятся во втором классе и тут вообще не до клавиатуры. В понимании такой мелюзги, компьютер создан исключительно для игр. Вообще, 2-4 классы — это отдельная тема, но и здесь считаю, что лучше чем Scratch еще ничего не придумали.
Сейчас знакомятся во втором классе и тут вообще не до клавиатуры. В понимании такой мелюзги, компьютер создан исключительно для игр

Есть же бесплатные клавиатурные тренажеры. В том числе и в игровой форме.
Пробовали внедрять их в учебный процесс?

Можно соревнования на клавиатурных тренажерах устраивать!
В третьем классе мы делаем этот тренажер сами в Scratch. Если говорить о внедрении, то 5-10 минут 1 раз в неделю на уроке ничего ощутимого не даст. Хотя 5-10 минут урока — это очень много.
Тренажер ничего не даст, если печатать одним пальцем. В вики есть статья «Слепой метод печати» (в англо вики, как часто бывает — более полная статья): начинать надо с начального расположения рук. А затем выполнять упражнения, нпр., напечатать 10 строчек «не не не ...». Главное: каждую клавишу нажимать своим пальцем! Я помню такой самоучитель для пишущих машинок — там было примерно 30 уроков, т.е. на 30 дней. Как учили на курсах не знаю, но гугл дает много ссылок. ИМХО нужно найти упражнения и потом хоть раз в неделю весь год ими и заниматься.

Если много печатать одним пальцем — через какое-то время другие пальцы сами подключатся.
Да. Но если руки стоят неверно, то пальцы будут путаться, и скорость будет ниже, чем при правильной постановке рук. Так было написано в самоучителе.
Но у меня же не путаются…

Хрен там. У меня жена до сих пор печатает двумя пальцами. Объёмы — дай боже. Скорость набора в принципе обыкновенная.

Скорость набора в принципе обыкновенная.


Т.е. обыкновенно низкая. Значит, Вы не видели хороших машинисток, которые набирали со скоростью не очень медленного разговора и почти не опечатывались (править на бумаге — не то что на экране). Но они набирали не свой текст — перепечатывали, или под диктовку. Когда набираешь из головы — скорость бывает ниже. А устают 2 пальца в 5 раз больше, чем 10 пальцев. Почитайте статью в вики — методу ок. 120 лет и он был испытан на многих соревнованиях.
Но они набирали не свой текст — перепечатывали, или под диктовку. Когда набираешь из головы — скорость бывает ниже.

В том то и оно! Поэтому опыт машинисток для нас не актуален.

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


Я до колледжа печатал двумя пальцами. А потом как то решился и сел за тренажер Шахиджаняна. Осилил только 50 заданий из 100, но сейчас оцениваю это как очень ценное вложение времени.

Для них это тяжело. Даже в ВК они начинают обмениваться (сам в шоке) не текстовыми, а голосовыми сообщениями. На первом занятии 50% постоянно делает опечатки и этот процент падает довольно медленно.


Это ужасно! Программирование будет нужно не всем, а вот умение быстро без напряжения печатать нужно всем. Даже журналистам :) Читал какой-то роман о школе в США начала 50-х гг. прошлого века. Там у школьников принимали сочинения только в машинописном виде. У многих дома были свои дешевые машинки, для тех, у кого не было, в школе было специальное помещение с пишущими машинками.

В одной школе, ребята вытащили клавиши из клавиатуры и все их поменяли местами.
Это знакомо. Когда-то я работал на ЭВМ коллективного пользования, где клавиатуры были стерты от долгого употребления и плохого изначального качества.

Вообще, 2-4 классы — это отдельная тема
Ужасно! Во 2 классе еще читать и писать толком не умеют. Лучше потратить их время на внеклассное чтение и разговорный английский, а не на информатику. Начальные знания по географии в масштабе глобуса не помешают, и по астрономии. А то прочитают внеклассно про Америку и про Марс, а где это находится не поймут.
Мне кажется, что это наоборот большой плюс. В 5-6 классе с ними уже можно пробовать, что-нибудь «серьезное». У них во 2-4 классах еще и шахматы есть. Родители сначала против были, они, как и многие, думали, что там их будут пичкать всякой жестью. Но там никакой жести нет. Есть такое хорошее слово — пропедевтика. Вот этой пропедевтикой мы и занимаемся.
Бедные дети! Школьные предметы — это обязательно и принудительно. Читать, писать, считать — всем очевидно, что нужно. Но всеобщую необходимость шахмат, даже в сокращенном систематическом изложении, лично мне понять не дано. Думаю, что и некоторым родителям не дано. Насколько мне известно, особенно среди женщин к шахматам в основном отношение прохладное, отдельные знаменитые шахматистки не в счет. И если дочка спросит маму «зачем мне шахматы?» — мама не сможет ей ничего ответить, и не всякий папа сможет. В результате ребенок сделает вывод, что не все предметы в школе необходимы. А далее появляется сомнение, что и все предметы могут быть ненужными. Возникает привлекательная идея делать вид, что учишься, а на самом деле это надоедливая игра. Впрочем про плюсы и минусы игрового подхода я уже писал.
Вот я вообще такой принудиловке не рад и даже против нее. С шахматистом мы стараемся следить, что бы котелки у детей не кипели и естественно, мы объясняем что и зачем нужно. Фактически — мы играем. Это пропедевтика, а не обучение, поэтому мы реально, просто играем. На информатике тоже. Но так же как и для котят, для киндеров — игра это лучше чем дрессировка.
Значит Вашим детям повезло. А в другой школе может не повезти и с шахматистом, и с информатиком…
С точки зрения образовательной системы все совсем не так. Да и на самом деле, все не так уж и хорошо, как может показаться из моих комментариев.

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


Как объяснить нужность предмета ребенку? Это точно не стоит делать с точки зрения "нужно ходить, иначе ...". Просто игра, в которую иногда и по вечерам интересно поиграть.


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

По этому поводу есть замечательная карикатура.


Карикатура

Мое хобби: экстраполировать

если дело касается обучения программированию, то Питон в этом плане удобнее
Нужно всегда помнить — кому удобнее?.. :) Вопрос о длине записи — туда же, выше уже ответили про «недостаток» begin-end.
Из комментариев этой дискуссии уже можно наскрести все необходимые крошки для понимания плюсов и минусов. :)
Из комментариев этой дискуссии уже можно наскрести

В комментариях этой дискуссии я уже подчеркнул кому удобнее — КОНКРЕТНЫМ НОВИЧКАМ И ТЕМ, КТО ИХ СОБИРАЕТСЯ УЧИТЬ

выше уже ответили про «недостаток» begin-end

Я просто не успеваю писать комментарии. Поэтому не успел ответить на ответ.

А оставлять крошки в дискуссии на такую тему… тогда зачем вообще дискутировать?
Вот тем, кому учить — в это верю. ;) А новичкам внешне питон по идее ничем не лучше, чем человеческие языковые формы. Ну и неизвестно, как они потом будут переходить на формат кода без значимых отступов, хотя интересно было бы узнать… Но я рад каменту выше, что паскаль хотелось бы видеть вместо питона на электростанции или типа того, значит в общем смысле спорить не о чем, ибо я к тому же веду. :)
Осталось подождать, пока соберется достаточно статистики, чему лучше учить молодежь (но не в плане — как клепать тоннами ремесленников)…
… еще статью написать, что-ли…
То что Питон приучает к сладкой жизни — это большой минус. Поэтому мы обязательно кодим на C++ для Ардуино и иногда Процессинге, который очень похож на Яву. В этой дискуссии понял, что мне самому не мешало бы подтянуть C# и JS — интерес у школьников к этим языкам иногда бывает.

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

Это чисто математически более логично S = V*t — чем быстрее мы создаем код, тем больше мы изучим за 1 час занятий. Я как водитель автобуса — который перевозит нелегалов — чем дальше от границы тем лучше. И в этом плане нелегалу и беженцу совершенно не важно, на каком автобусе он едет — лишь бы быстрее. Поначалу они будут мести тротуары мегаполисов, мыть посуду — делать самую грязную работу. Но там хотя бы есть шансы подняться. Потому что там, откуда я их везу, шансов практически нет вообще.

Поддерживаю идею о том, что для каждой задачи нужен свой инструмент (язык) и что нужно попробовать хотя бы 2 разных.


На скорость написания кода, помимо самого языка и навыка быстрой печати, еще влияет IDE. Если освоить автодополнение, то скорость написания кода заметно возрастет. Почти для всех IDE есть вариант распространения Community.


Аналогия про перевозчика нелегалов просто супер. Многие люди были бы рады устроиться хотя бы ремесленником. А высокие материи придут с опытом и последующим образованием.

Хорошая IDE — это конкретный форсаж.
То что Питон приучает к сладкой жизни — это большой минус. Поэтому мы обязательно кодим на C++
Это именно то, что я хотел услышать. :)
Шоб параллельно накапливался опыт разных подходов и все такое.

Публикации

Истории