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

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

Бейсик ведь и создавался, как УЧЕБНЫЙ язык.
И вообще, информатика — от слова «информация». Она не про компьютеры и не про технологии, а про алгоритмы.

Здравствуйте! Спасибо за ваше мнение. Да, вы верно отметили, что это для учебных целях служило, но в наши дни программирование развивается намного быстрее, и языки, актуальные лет 40-30, а то и 20 назад, уже полностью устарели. Насчет про понятие информатики - теоретической базой для информационных технологий является информатика. ИТ это как раз составная часть информатики. Также я в статье привела о том, что основы алгоритмизации и программирование плохо усваиваются именно на мертвых языках программирования в ходе обучения, поэтому решение проблемы может послужить к изучению популярных ЯП.

/иронично/ А информатика у нас ограничивается языками программирования?

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

Далее, про "дополнительные курсы". Вы, простите, либо трусы наденьте, либо крестик снимите. Педагоги раз в пять лет три года проходят обязательное повышение квалификации, с ними работают региональные методисты ИРО (Институт Развития Образования), программы повышения квалификации постоянно меняются и улучшаются.

UPD. Мантра "Программирование - новая/вторая грамотность" существует не первый год. Вот только ситуация как и с "Windows must die!" - собака лает, а караван идет. Лучше спросите своих учеников лет через десять: "Что вам пригодилось в жизни, дети? Python или Word?". Думаю, ответ очевиден.

И то, и другое. И ещё куча других вещей.

И да, тем, кто использует Питон профессионально, тот и Word должен знать профессионально

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

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

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

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

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

они будут big data на переменке анализировать?
нет встроенной поддержки web-сервисов и страниц;

зачем это детям, которые не собираются разрабатывать web-сервисы?
Паскаль не знает, как работать с современными базами данных, протоколами обмена, облачными хранилищами и сервисами.

зачем это детям, которые не собираются работать с базами данных, облачными хранилищами и сервисами?

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

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

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

зачем это детям, которые не собираются работать в IT?

anna_agabekyan
языки, актуальные лет 40-30, а то и 20 назад, уже полностью устарели

Да, да, а процедуры в фортране — это совсем не то что процедуры в каком-нибудь go!

Спасибо за ответ. Отвечу по порядку.

  1. Графическая составляющая важна в ходе визуализации/моделирований, например физических процессов, которые обычно представляются в аналитическом в виде.

  2. Направление идет в профилируемых классах, связанные с естественно-научных направлениях, то есть физико-математических/технологических классах

  3. Описала возможности ЯП, а не применение (это также относится ко всем вопросам, которые упоминаете про web-сервисы)

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

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

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

Именно. Покажите код на Python, который рисует прямоугольник внутри которого круг имитирует движение бильярдного шара на столе? На Pascal я это писал в дремучем 1996 на олимпиаде. Там была задача просто посчитать. Но у меня осталось время и я визуализировал в десяток строчек кода.
А сколько с PyQT или ещё чем-то придётся ковыряться?

Кстати, неудачный пример. На Python это очень легко нарисовать. В стандартной библиотеке есть модуль turtle для черепашьей графики и подобных вещей. Не обязательно на Qt делать.

Ну почему, пример как пример. Факт в том, что такая графика была в паскале много-много лет назад, и никакого преимущества именно тут питон в общем-то не имеет. Все плюс-минус одно и тоже.

Так с этим я и не спорю. :)

там что-то типа egavga.bgi из трубопаскаля или повеселее?

Такую простую 2д анимацию в питоне лучше сделать через pygame. Если нужно что-то мощнее - DirectX/OpenGL. Второй вариант подойдёт, если ученик интерисуется 3д графикой.

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

Wolfram mathematica?
Направление идет в профилируемых классах, связанные с естественно-научных направлениях, то есть физико-математических/технологических классах

Wolfram mathematica, различные CAD?
Тем более уже при сдаче экзаменов сейчас Python активно применяется для обучающихся. Посмотрите сами на задания по ЕГЭ информатике.

Так почему вы считаете одни тенденции в образовании «архаичными», а другие сугубо полезными, только потому что python более «современный» язык? А что если мне надо на уровне синтаксиса языка поддержку многопоточности (не зря ж я про go заговорил), может сразу на go всех переучить, или на каком-нибудь rust?
Вы смотрите на языки с практичной точки зрения. Но при обучении это не работает. Чтобы чему-то научиться, нужно пройти некоторые этапы понимания, если перепрыгивать ступеньки получится фигня… вы же хотите чтобы программировали сразу всё на новых технологиях, новых платформах, которые создавались годами и понять которые со старта практически невозможно. Напиши для того же паскаля соответствующие библиотеки, и он так же сможет подключаться к современным базам данных(про делфи не слышали, да), иметь хорошую графику и т.д. но суть в чём? Не в языке… а в том что его поддержку забросили. И надо понимать, что сам язык без библиотек вообще ничего не может. По сути — только разные формы вызова подпрограмм и ветвления алгоритма, не более. Через 10 лет может про питон забудут… меня он бесит, именно тем что всё определяется отступами. В более-менее большой программе, поди найди где лишний/отсутствующий пробел потерялся. ИМХО, будущее за визуальными структурированными языками, где текстовый исходник лишь набросок, а структура программы — это объект хранящийся в двоичном виде и представляющий более удобную форму для машины и хранящий больше информации об алгоритме чем это возможно обычным текстом. Ведь сейчас мало кто программирует в обычном «блокноте» — чаще всего это IDE, чуть реже — специализированные текстовые редакторы. И да, динамическая типизация это удобно только для тех кто ничерта в типах не понимает, но она имеет свою цену для скорости работы программы и потребления памяти(с ужасом оглядываюсь на встроенный бейсик в офисных пакетах).
Нет, надо сначала освоить основы, потом уже давать что-то более современное и делать это не наобум а связно — чтобы было понятно ПОЧЕМУ, ЧТО и КАК было сделано чтобы достичь современный уровень быстродействия/удобства. Те же алгоритмы рисования дуг/кругов в современной графике, деинтерлейс, алгоритмы сглаживания, особенности рисования ШРИФТОВ, почему там так всё сложно. Да, пожалуй этому есть только одно препятствие — этой информации слишком много чтобы уместить в учебные часы. Разве что времени хватит только на то чтобы сказать что такое существует. Ну или увеличить количество учебных лет… сколько их там уже? И это при том что программирование как таковое 90% людей не упёрлось вообще, а процентов так 30 — так сказать аппаратно не совместимы с программированием. Поэтому… существующая программа в принципе ещё сносна, а тех кому это интересно и темболее нужно — пусть идут на дополнительные занятия, и вот там уже можно давать и начинать с чего-то более практичного и современного. Ну и ассемблер показать.
По п.1) Недавно проводил исследование необычной формулы, описывающей изгиб металлических платин, и тоже зачем-то сначала рисовал графики. Они оказались совершенно бесполезны и не информативны. После этого переделал программу, чтобы она умела возвращать только одно-единственное числовое значение, и дописал вторую программу, в которой изложил проверяемую гипотезу. Проверив пять гипотез посредством 10 млн запусков первой программы она заключила, что формула фейковая и коэффициенты в ней подгоняли, что ошибку легче всего искать на 30% длины стержня с очень маленькой толщиной, а графики же, поскольку я не знал, что точно ищу, то все оказались мейнстримными частными случаями. Графики тоже нужны — но в конце, когда расчёты уже проведены, и вы точно знаете, что на вашем графике есть то, что вы искали.

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

Понять что нужно человеку в будущем — это не тривиальная задача.

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

Это тоже самое зачем нам изучать латынь, если сейчас популярный и международный язык - английский.

Статья не хорошая, и автор не молодец.
«Давайте заменим язык A на язык B», отличное предложение.
«Архаичные программные продукты и операционные системы» — тоже смешно.
Что на самом деле не так, это то что с одной стороны, в обычной средней школе слабая математика, и с другой стороны, те же паскаль с бейсиком заточены в основном под математические расчеты и только один из них ученикам и показывают, в итоге для них остается загадкой, как же делают оконные графические программы и игры, и создается неверное впечатление о том, что это безумно сложно и не надо туда даже пытаться лезть если ты не яйцеголовый гений.
Убирать эти языки никуда не надо, а вот добавить небольшой ознакомительный курс другого языка, который позволяет создать простую программку с графическим интерфейсом, было бы неплохо.
А зачем нужна биология, если ты не будешь работать медиком?
А зачем математика, если не будешь математиком?
А зачем история, если не будешь историком?


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

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

(первый раз принимал участие в подобном обсуждении в 1985 году. Все идет по кругу?)
Мммм, как хорошо, что вы помните полемику 1985 года.

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

Спасибо.
Скажите пожалуйста, почему всё-таки рухнула идея академика Ершова


В 1985 году, как снег на голову, на школы свалилось преподавание информатики.
При том, что в школах не было ни компьютеров, ни учителей по профилю, ни даже нормальных учебных программ.
Нужно было найти добровольцев среди учителей и отправить их на курсы подготовки (переподготовки) по новому предмету.
Желающих было крайне мало, так как почти никто не знал — зачем, и что, собственно, надо преподавать. До этого в школе уже были некоторые азы (мы, например, учили Алгол еще в середине 70х), достаточные для того, что бы понимать специфику предмета (в смысле ее запутанности и сложности).
Вот тогда и были подняты вопросы — «а надо ли учить школьников непосредственно программированию, или таки давать им обще-информационные знания (виды информации, методы ее хранения и обработки и т.п.), что можно было бы делать без собственно компьютеров — посредством учебников и учебных фильмов (включая и передачи по ТВ).
(Мой отец тогда работал в школе, а я его консультировал, так как работал на производстве, где был довольно мощный ВЦ)
Неужели как снег на голову? Я помню, как раз тогда вышел учебник, в котором и был ответ на вопросы «что» и «зачем». Вы хотели сказать, что учебник не доходил до самих школ? Тиража не хватало?

Вы очень верно формулируете: «а надо ли учить школьников непосредственно программированию». Вот это и есть мой вопрос. Академик Ершов с разумными аргументами указывал, что школьник должен управлять компьютером, и для этого должен отдавать ему команды, и для этого знать командный язык и язык программирования. То есть первая грамотность позволяет управлять людьми, а вторая грамотность позволяет управлять компьютерами.

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

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

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

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

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

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

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

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

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

Даже всяческие Scratch - это слишком много магии. Дети же не понимают, КАК оно едет/скачет. Не знают, почему можно присвоить одно в другое. Удивляются, когда на каждом занятии узнают всё новые и новые свойства и методы. Им на их начальном этапе невозможно рассказать об устройстве объектов так, как ты видишь их сам.
Да, им это всё интересно, и на этом этапе легко увидеть, КТО заинтересуется и пойдёт программировать полёт на Юпитер, а кому из информатики будет достаточно изучения офиса и способов не раздавать всем свои ПД.

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

Но потом они появились в достаточном количестве. А программирование так и не стало второй грамотностью.

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

Вот вы пишете, что информацию «можно и нужно структурировать и типизировать». Разве это не программирование?

Разве Excel это не программирование? Функции, записанные в ячейках, передают друг другу свои результаты.

Можно ли «избавить от ощущения магии», если не объяснять ученикам, как устроены и работают программы? Поясню на примере. Вот передо мной стояла довольно-таки простая задача: Windows 7 занимает 20 гигабайт, а нужно, чтобы она занимала 5---6 гигабайт. То есть нужно понять, что в ней лишнего, и как это лишнее убрать. Если не понимать про устройство и связи программ, тогда этого сделать не получится.

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


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

как раз тогда вышел учебник


Интересно было бы на него взглянуть — особенно с учетом опыта прошедших десятилетий. И вы правы — мне его увидеть так и не удалось.
А вот «Энциклопедию профессора Фортрана» с нарисованным компьютером, на котором предлагалось виртуально поработать — помню очень хорошо :)
Скажите пожалуйста, почему всё-таки рухнула идея академика Ершова

Потому что нужны не миллионы говнокодеров, у которых и медицинское оборудование убивает, и самолёты падают (реальные случаи про которые писали на Хабре). А нужны профессионалы.
Андрей Петрович говорил не о профессиональном программировании, а про «вторую грамотность», то есть умение забить написать письмо, склеить и укрепить стул, повесить полку, написать маленькую программу для своей конкретной задачи.

Но если человек уже таки понял, то зачем ему это нужно?

А «понял» что именно? Вопрос-то можно рассматривать с разных плоскостей.

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

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

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

Понял, что нужно в будущем.


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


Заработок денег — это какая-то более узкая цель.


Примеры того, что в это «жить» входит

Только почти всего этого в школе не преподают. Да и некоторые вещи — рано, ИМХО. Нет эмоционального словаря и опыта, чтобы понять.


Но при столкновении, неплохо бы иметь в подкорке какие-то фундаментальные знания.

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

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

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

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

Ну и да, может действительно существуют люди, которые понимают, что им нужно в будущем. Я это к сожалению верифицировать никак не могу. Могу судить только по себе, мне 30 и я совершенно не понимаю что мне ещё будет нужно =)
А зачем <любой другой предмет, который дают после 5 класса>
Все очень просто — не прошел предмет, значит не имеешь права получить документ об образовании (аттестат/диплом/etc)
А все потому что ФГОС загнал в жесткие рамки все учебные программы, расписал кому, по какому предмету, сколько часов и какие темы изучать
нет встроенной поддержки web-сервисов и страниц;

зачем это детям, которые не собираются разрабатывать web-сервисы?

вопрос — зачем это нужно на уровне языка программирования? Именно на уровне языка, а не библиотек, и как на уровне языка можно встроить то, что регулярно меняется?

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


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

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

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

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

Тоже ранее думала что это так..) Теперь урок «Технология» в российских школах преподают по-новому. Данную дисциплину введу. Здесь как раз обучаю базовыми программами MS Office. Ну и в целом занятие проходит по типу - комбинированного урока.

Теперь урок «Технология» в российских школах преподают по-новому.
Мой директор выгнал бы вас в мороз на улицу, снег с ребятами чистить.
Да и до сих пор существует Всероссийская олимпиада школьников, предмет Технология разбит на три направления (ссылки на задания прикладываю): И ни в одном из них не описана ни одна программа MS Office.
На мой взгляд, автор ошибается в одном. Не в том, что преподает питон вместо бейсика. Это как раз совершенно нормально. Что ты знаешь лучше всего — то и надо преподавать. И я бы тоже не стал бы сегодня преподавать ни на паскале, ни на бейсике, потому что у меня на сегодня есть более хорошие инструменты. Но я и на питоне бы не стал, у меня другой опыт.

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

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

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

Во-первых, бейсик не мертвый. С чего вы взяли эту мысль? VBA вполне живой, например, я видел на нем промышленно используемые проекты, года три примерно назад. Да и VB.Net никуда не собирается деваться. И это практически полезные проекты, и в таком виде его применяют всякие бухгалтеры и т.п. непрограммисты. Для себя то есть пишут, макросы ваяют. Оно более чем живое.

И потом, основы алгоритмизации сформировались много лет назад. Скажем, лисп — это язык 1958 года, хаскель — 1990, то есть этим языкам — одному 60 лет, другому 30. И они оба в значительной мере формировали и формируют эти самые основы алгоритмизации. Если на то пошло, вашему любимому питону тоже 30 лет в обед. То есть, 20-летние языки мертвые, а 30-летний почему-то живой? Проблемы же с пониманием могут возникнуть разве что когда преподаватель их сам слабо понимает, но тут уж язык слабо поможет.

А я вот наоборот, вижу существенную разницу между Паскалем и Пайтоном, и недостатки Пайтона как языка для обучения как раз в том, что вы считаете достоинствами.

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

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

Учитель-садист: сначала показывает понятный Pascal, потом расслабляет ненапряжным Питоном, далее бьёт по рукам С/С++, даёт краем глаза посмотреть на Rust (главное до лайфтаймов добраться), а потом сбивает с ног Haskell и добивает Idris.

Это на кружке. В классе попроще)

А по-моему само то :)

Помню, как я в 2016 году учился в автошколе. Сначала было около 5 занятий на тренажере. Тренажеров было два. За одним я просидел 4 занятия, привык к нему (до этого за рулем никогда не сидел), приноровился, стал считать себя "асом" как минимум этого тренажера. А на последнее занятие меня посадили на второй тренажер, и там я понял, что до этого я ничего не понял. Совершенно иначе отзывается руль, педали, и прочее. И когда потом я впервые сел на руль полноценного учебного автомобиля, я уже был готов к тому, что всё будет по-другому. И впервые сев за руль уже своего автомобиля, я тоже был готов к тому, что всё будет по-другому. Короче, это был единственный плюс от того тренажера, в остальном ересь несусветная.

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

Я думаю, учить так было бы хорошо. Но требования к учителю высокие.

Автошкола… я впервые сел за руль в 29, переехав в Техас. Люди здесь за рулём ну не то что с рождения, но сильно до совершеннолетия. Соответственно, программа обучения и требования экзамена довольно забавные. Короче, я в первое же занятие сел за руль настоящей машины, мы сделали кружок вокруг автошколы и попёрлись на вполне себе дорогу. Где-то на третьем занятии (по два часа каждое) уже был хайвей и езда в потоке на сколько-там-в-нормальных-единицах-75-миль-в-час.


Я, конечно, офигел от этого всего, но в итоге вроде всё норм.

Я, как с одной стороны учитель, а с другой - весьма опытный разработчик, могу сказать что данных тоже не видел, не искал, но видел отложенные результаты того, что программирование дети начали изучать с ЯВУ, где все переменные имеют тип Variant и не требуют вообще никакого предварительного описания.
Мне приходилось видеть в промышленном проекте, созданном в ведущей по отрасли компании, запись "proc(a, ,;)", которая по задаче - вызов процедуры с тремя параметрами, где второй - на самом деле, по задаче - символ пробела, а третий - символ точки с запятой. И эта запись была причиной трёхмесячной задержки перехода на поддерживаемую версию ПО.

Такого не было ни разу, пока я работал с ребятами, изучавшими программирование "тогда", начиная с жёстких c++ и pascal, и глубоко изучая практическое ООП по мере его вообще появления в языках.
Уровень понимания деталей можно оценить по фразе одного из них - "Лёха, я понял, что такое объект, только тогда, когда докопался и увидел, как объект трансформируется при компиляции в макросы ассемблера".

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

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

Будет ли результат лучше? Вот не факт.

Если человек учит тому, что сам хорошо знает, что ему самому нравится, и т.п. — то результат, на мой взгляд, всегда будет лучше, чем если человек учит тому, чем сам никогда не пользовался, или что не любит. То есть, сочетание предмета и учителя должно быть. Ну и стимула, в том числе — в виде интересной и полезной задачи.
> n = 100
> a = [0] * n

Ну и как объяснить ребенку что это значит не умножить содержимое массива (в данном случае состоящего из одного нулевого числа) на скаляр, а размножить элементы массива. Я сам себе-то это объяснить не могу. И где, кстати, мой оператор .*?

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

PS Кто сегодня по хабру дежурный? Я как любитель форматировать текст пробелами специально вставил их между символом вопроса и ".*", но при отображении они пропали. И мне кажется, что это фича не из удачных.

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

Так и скажите, что это не умножение. Я пробовал, это работает. Дети вовсе не такие глупые.

А потом дети пишут код, про который говорят WAT?

Дело не в том, могут они понять или нет — выучить таблицу приведений объектов в яваскрипте не труднее стиха «буря мглою небо кроет...».
Дело в том, что у любого действия должен быть наиболее ожидаемый результат. Для питона это особенно справедливо — у него нет «костылей» статической типизации, и a * b может внезапно оказаться скаляром, массивом или объектом.

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

Мне кажется, именно такую физическую силу ясность чувства надо воспитывать в детях, а не «я чёт написал, оно чёт сделало — и ладно».

Дети и на других языках пишут не самый чистый код.

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

Только до тех пор, пока вместо списка не окажется numpy array, который в случае a = np.asarray([1,2,3]) * 3 выдаст [3, 6, 9].

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

Только не с C++, это я как программист на нём говорю :-)

Во-первых, мы же о школе говорим? Там никакого Numpy в программе нет. А те ученики, которые до него дойдут (самостоятельно или в кружке), достаточно умны, чтобы понять что к чему.

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

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

Насчёт C++ и Java категорически не согласен. ООП школьники всё равно особо не изучают, а в Java уже на этапе «Hello world» будет класс и надо объяснять, что это. Либо попросить учеников смотреть на это как на магию, что очень плохо с педагогической точки зрения.

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

Если хочется явных типов, то есть Pascal.

Информатика — это, всего лишь, частный (мелкий) случай. И учебники, и так называемый ФГОС — это не более, чем результат мощного лоббирования и дележа бюджетных средств. Поинтересуйтесь, чем занимается (целое!) Минпросвещения, оцените (не поленитесь) ОГРОМНЫЙ(!!!) список «допущенных» к использованию школьных учебников. Это как-то «не на слуху», но в России есть (даже) Академия Образования! Спросим себя: «А чем же заняты уважаемые академики в то время, как в более, чем в 30-ти развитых странах (где с 2012, где с 2014 года) дети изучают программирование с первых классов начальной школы?»

Давайте сверим часы! На ваших 2021-й? Странно: и на моих — тоже 2021-й!

И вы не поверите: оказывается, они, академики, даже пишут «критические» статьи в научных журналах (см. например). В статье, на которую приведена моя ссылка маститый академик «критикует» школьных преподавателей за то, что они, оказывается, совершенно не понимают сути проектной деятельности! Затем (очень не сразу, а лишь после великого множества слов) мы узнаем, что «автором разработан специальный учебно-методический комплекс, включающий учебное пособие для учащихся по проектной деятельности и рекомендации для учителей по организации»…

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

А вот в Англии дети так прямо с 5-ти лет изучают Scratch! Более того, государство выдает каждому первоклашке (абсолютно безвозмездно — то есть ДАРОМ) достаточно крутой контроллер Micro.bit — программируй хоть на Scratch, хоть на том самом Python сколько хочешь! Или вот посмотрите на картинку со статистикой (2018 года) по численности тех, кто программирует в среде Scratch в разных странах. Вас не впечатляет? Нужно что-то говорить еще? Кстати, вы заметили? Статья-то академическая аж от 2015 года! А в школах все по-прежнему… Расстроились?

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

Видите? Все в порядке! Академики критикуют!.. Хотелось бы, конечно, заслушать еще мнение начальника транспортного цеха (того самого, что у Михаила Жванецкого), но он где-то отсутствует…
cовершенно не понимают сути проектной деятельности!
Иногда даже дело не в этом, а в осведомленности районных управлений образования. Нам, например, сообщили об этом ну уж очень поздно.
Поделюсь своей историей работы в школе.
2019 год, ничего не предвещало беды, середина мая. Звонит завуч:
— Михаил, зайди на минутку.
Без задней мысли пошел к нему в кабинет.
— Нам, оказывается, в аттестат 9 классу надо прописать результат выполнения проекта по отдельному предмету «Проектная деятельность».
Я читаю положение и понимаю, что за неделю-две мы никак не сможем ничего сваять такого, что могло бы подходить по всем критериям.
— Давай, — говорю, — напишем им какую нить лапшу в аттестат и все, никто смотреть даже не будет.
— Ага, а работы в архив тебе фея-крестная подошьет?
Вот тогда в сумасшедшем темпе, еле понимая сути работы, сделали для этих несчастных 25 человек проектные работы, написали в аттестат, подшили в архив и забыли.
А через год я ушел работать в институт, тут спокойнее.
Проектная деятельность

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

Сравнение синтаксиса цикла с предусловием в Паскаль и Python

Цикл на Паскале гораздо нагляднее. Во-первых, глагол "выполнять действие" (do) написан явно, а не заменён на знак двоеточия, который вообще можно понимать по-разному. Во-вторых, для операции присвоения используется свой символ := вместо простого знака равенства, который в Паскале обозначает именно равенство - это логично. В-третьих, питоновское слово print выглядит как команда распечатать лист бумаги с данными, а не вывести их на экран - Паскаль опять логичнее.

Сравнение синтаксиса переприсвоения переменных в Паскаль и Python

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

Сравнение синтаксиса заполнения массива в Паскаль и Python

"А равно нулю" - это всё, что я могу понять из кода на Питоне. Из чего следует, что А - это массив/список, а не число?

В случае школы одним из решений могло бы стать видоизменение самого предмета "Информатика" в новую дисциплину под названием «Информатика и IT-технологии», где это не уроки по использованию офисного пакета, а изучение принципов алгоритмики

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

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

Извините, но это утверждение - признак профдеформации. В навыки владения ЭВМ входит не только умение писать код, тем более что оно становится с каждым днём всё менее необходимым даже труъ-айтишнику (слава графическим интерфейсам, конструкторам сайтов, а также системам no-code development, которые пока что лишь начинают свой путь, но уже очевидно, что за ними будущее "новой грамотности").

Соглашусь по поводу учебников с устаревшими ОС и другими программами.

Но бОльшая часть статьи посвящена выбору языков, и, мне кажется, этому неважному вопросу уделяется слишком большое внимание. Тем более по большинству пунктов (1, 2, 4) именно Паскаль для обучения выглядит лучше, чем Python. Особенно пункт 2 про динамическую типизацию.

А в целом:

  1. Алгоритмы и программирование - это хоть и значительная часть предмета "Информатика" (особенно в последнее время, даже на ЕГЭ, насколько я помню, половина задач так или иначе связана с этим), но не вся. Так что статья покрывает лишь часть вопроса.

  2. Язык вообще не важен. Алгоритмы и базовые структуры данных - вот что должно проходиться в школе.
    Язык может лишь помочь заинтересовать в предмете, например, если позволяет быстро создать GUI, сделать сайт, или приложение на телефон. Но помню, когда я учился, меня заинтересовало программирование, когда я написал программу, решающие квадратные уравнения, и радовался, что ей можно будет пользоваться для проверки решений ДЗ по математике (интернета у меня тогда не было). Так что заинтересовать можно тоже разными способами.

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

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

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

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

while s + n < 150:
s = s + 15
n = n - 5
print(n)


Ии… как вы объясните ученику, где закончилось тело цикла? :)

А между тем, Pascal с этой задачей справляется на ура:

while s + n < 150 do

begin

s := s + 15;

n := n — 5

end;


В явном виде показывая, где начало — а где конец.

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

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

(отбивка пробелами сломалась, даже в блоке code не работает...)

Кстати, а почему Python, а не Scala? Она покрасивше будет!

Ии… как вы объясните ученику, где закончилось тело цикла? :)

Так это невалидный код. Если бы вы не убрали отступы, то объяснить никакой проблемы не было бы. Дети вовсе не такие глупые.

Сижу в одном паблике для начинающих и регулярно вижу детей, пытающихся учить питон. Проблемы с пониманием отступов бывают просто феноменальные. Они знают, что после if нужно поставить отступ, но не понимают, что else должен быть вне этого отступа. Или они пишут какой-нибудь print на уровень выше и не понимают, почему ошибка на else. Есть дети не глупые, а есть глупые. Тут-то речь о том, чтобы научить всех, значит ориентируемся на самых глупых.

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

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

Я был бы рад сделать его валидным и не убирать отступы, но в редакторе комментариев отбивка пробелами внутри блока [code] не работает.

Anyway, я не врубаюсь, почему в 2021 году (!) отбивка кода пробелами должна иметь значение — как в каком-нибудь, прости Тьюринг, Fortran-77?

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

Что до детей — раз на раз не приходится. Это вы понимаете строгость правил. А детям, en masse, пофигу. Ты им рассказываешь, что «программирование это просто» и вдруг отбивка пробелами, про которую нужно помнить и учитывать! И много других подобных мелких неочевидных правил.

Знаете, если я снова начну учить детей программировать — я возьму… FORTH.

А что такого сложного в отбивке пробелами? Я не про удобство программирования, а именно про понимание. Чем это принципиально отличается от begin-end или скобочек?

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

Если знать, что она обязательна, и без неё ну вот совсем никак не заработает — то, конечно, ничего… кроме необходимости её строго соблюдать.

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

Да, тут соглашусь. И, по моему скромному опыту, учащиеся делились на 3 категории:

1) нам это неинтересно, мы даже вникать не будем (и не будут, хоть ты спляши перед ними)
2) СЛОЖНАААААА (есть шансы заинтересовать, но при первой ошибке не идут с вопросом к учителю, а переходят в первую категорию с аргументом «Я все равно ничего не пойму»)
3) Не мешайте, мы сами все изучим (иногда подходят с вопросами «А почему не работает?», любимая категория).

Используйте markdown


while s + n < 150:
    s = s + 15
    n = n - 5
print(n)
НЛО прилетело и опубликовало эту надпись здесь
Даже если это и так (паскаль в универе?), то зачем устанавливать IDE рады пары программ? Сейчас есть дофига онлайн компилеров и интерпретаторов. Я бы там всё делал, если требуют.

И не надо зацикливаться на IDE. Сегодня один язык, завтра другой. Сегодня двадцать IDE, завтра — 50. Та же фигня с фреймворками. Это всё приходит и уходит, а алгоритмы остаются.
НЛО прилетело и опубликовало эту надпись здесь
А можете показать какой-такой GUI вам нужно было сделать, что кроме как через Borland не получилось бы?
НЛО прилетело и опубликовало эту надпись здесь
Более новые IDE, например Delphi Community Edition, я не смог загрузить с официального сайта, у них там ничего не работало.

Смиялсо. Потому что именно Delphi Community именно отсюда я загрузил абсолютно спокойно.
НЛО прилетело и опубликовало эту надпись здесь

Вопрос: а кого вы называете старшим поколением? Моё (1975) с удовольствием всем этим пользуется, матерясь лишь, когда IDE и фреймворки сделаны через [censored], а контейнеры используются без понимания.

НЛО прилетело и опубликовало эту надпись здесь
Андерс Хейслберг, что ли? :-D
(создатель Turbo Pascal, Delphi, C# и TypeScript, 60 лет)
Найти IDE под них можно только на торрентах, и у этих IDE совершенно нет community.

А что за проблема с IDE? Lazarus вон вообще в репозитории есть.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Питон как первый язык — очень соблазнительная, но все же опасная идея. Почему так — если питон учить после C, то с одной стороны понятно зачем прикручена машинерия с массивами как ссылками (и что такое ссылка), с другой — легче понять, почему были сделаны те или иные ограничения среды. Если человек начинает обучение с высокоуровневого языка — часто получаются люди с магическим мышлением — «вот такой паттерн работает, и ладно», не способные понять, что происходит «под капотом». И O-нотацию и проблемы масштабируемости без хотя бы одного низкоуровневого языка в анамнезе понять сложно.

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

Ну у меня дочка готовится сдавать ЕГЭ по информатике и в школе использовала для обучения питон, и как я мог упустить, что в школе дают только устаревшие языки, а значит используемый, в том числе и мною, питон устарел если не 40 лет назад, так как минимум 20. А по факту материал в статье устарел, кроме как купите наших слонов актуальности в нем около нуля, надеюсь ссылки в конце, ради которых была написана статья, не успели устареть? :)

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

Кстати про Паскаль (особенно если сравнивать его с питоном)

нет инструмента для быстрого создания интерфейса программы;

А в питоне оно разве есть (не в модулях для питона, а именно в самом питоне, поскольку в модулях оно и для паскаля есть в ассортименте)?

А в современном паскале, кстати, оно таки очень даже есть. Причем очень развитое. Берем Lazarus - и вперед на танки.

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

слабая графическая часть, которая может рисовать только простейшие объекты;

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

С другой стороны, а что еще надо, кроме простейших объектов?

ограничения по размеру используемой памяти в переменных и циклах;

Какие такие ограничения? У вас какой-то не такой паскаль, как у нас был.

нет встроенной поддержки web-сервисов и страниц;

опять берем лазарус. Там есть.

Паскаль не знает, как работать с современными базами данных, протоколами обмена, облачными хранилищами и сервисами.

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

Впрочем, лазарус знает.

Lazarus, кстати, не очень. Слишком много всего, что для учёбы не нужно. Есть же прекрасный PascalABC.

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

1) «Надо научить ребенка программировать, это ему пригодится» (10+ лет назад я работал учителем информатики в школе… так вот, из 100+ человек, которые прошли мимо меня, с IT связал жизнь один-единственный).

2) «Надо учить ребенка тому, что актуально» (то есть ворду, экселю, пэйнту). Подход в принципе, нормальный. Ликбез в информационном мире.

Но почему, почему, черт возьми, НИКТО И НИГДЕ не учит информационной гигиене?

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

Не объясняет методы мошенничества в сетях. Это тоже кажется самоочевидным?
>Не объясняет «что такое пароль»
Пароль это удел технологий 80-х, 90-х годов. Требовать от обывателя создавать и помнить пароль в 21 веке это верх идиотизма. Так что не нужно скидывать плачевное состояние ИТ отрасли на простых людей. Что уже говорить о дырявых системах, с архитектурой безопасноти из 70-х, не способных защитить важные данные пользователей?

Это юмор за 60 или что это было?

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

Уточню: у меня нет смартфона и нет датчика пальца.

>А как надо поступать сейчас?

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

Какие ваши предложения?

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

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

Что касается аутентификации на конкретном устройстве, то здесь можно использовать систему «ассоциаций пользователя» (вопрос-ответ, изображение-ответ, вопрос-изображение и т.д.), либо аппаратный ключ.
систему «ассоциаций пользователя» (вопрос-ответ, изображение-ответ, вопрос-изображение и т.д.), либо аппаратный ключ.


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

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

P.S. От вас приходит по 5-7 копий одного и того же сообщения. Это вы его 7 раз редактировали, эксплойтите систему или это глюк хабра?
Зачем ассоциацию писать на стикере? Ассоциация на то и ассоциация, что пользователь изначально хранит её в голове и у каждого она индивидуальна. И она в любом случае лучше пароля по типу 123456 при доступе к устройству оффлайн. Или записи на стикере прикрепленному к монитору.

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

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

>эксплойтите систему
Зачем мне эксплоить систему? Это очередной показатель ущербности ИТ систем и их разработчиков, не способных в UX.

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


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

а) одна ассоциация на все сервисы === 1 пароль на все сервисы
б) бумажка с напоминалками на все сервисы
г) стороннее ПО

Повторюсь, вы приписываете паролю проблемы, которыми он не обладает. Хаете технологию, а не особенности её эксплуатации.

Из ружья тоже можно выстрелить в ногу. Ружьё плохое? Предложите, на что его нужно заменить? А может быть лучше научить им пользоваться?

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


Кажется, это пока что вы решаете не те проблемы :)

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

Вы хотите абсолютизма,

Вы еще по аватарке погадайте ;)

Для его защиты в случае утери или кражи опять же можно использовать ассоциации.

И сколько слоёв защиты вы хотите навернуть?

Аппаратный ключ. Ассоциации. СМС на телефон. Пароль. Отпечаток пальца и сетчатка глаза. Что дальше? Сканирование ДНК?

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

Ещё раз - проблема в современных ИТ системах. Не нужно перекладывать эти проблемы на обывателей. Вы не сделаете из обывателя сисадмина даже средней руки.

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

Ещё раз — проблема в современных ИТ системах.

Вы можете эту проблему решить за лето? Нет. Значит, придется пользоваться тем, что есть. И детей учить пользоваться тем, что есть, получая максимум пользы и минимум вреда.
>Вы можете эту проблему решить за лето?
Я просто поднимаю проблему, а не пытаюсь замести в очередной раз мусор под ковёр.
Линукс, не?
От регистрации на всяких помойках он не защитит, от некоторых вирусов через wine или из левых репозиториев тоже. В настоящее время малая распространенность немного спасает. Но не панацея

Да, принцип неуловимого Джо.


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

Безопасность Линукса выше только из-за более высокого порога вхождения.
Разумеется, не только. Сам подход другой, то же наличие репозитория.

Наличие официальных репозиториев никак не поможет от:


  1. Добавления левых репозиториев в систему.
  2. Запуска run-файлов.
  3. Следования советам типа sudo wget… | sh.
  4. Запуска Windows-приложений с вируснёй под wine.
  5. Установки вредоносных расширений в браузер.
Конечно. Но если этот способ даже выглядит противоестественным, шанс, что им воспользуются, меньше. Меня вот, например, настораживает, когда предлагают делать вещи вроде скачивания непонятных файлов или configure+make+make install. Для пользования системой это никогда не требуется.

Куча проприетарного и специализированного софта отсутствует в репозиториях и распространяется именно подобным "противоестественным" образом. В лучшем случае будет версия в snap/flatpak (что все равно не гарантирует её безопасности).

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

Все эти антивирусы, проактивные защиты и так далее — лекарства, а не профилактика.

А профилактикой не занимаются. Ведь алгоритмы важнее!

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

И это (как предлагает выше мой оппонент) тоже на защитит от регистрации на файлопомойках, понимаете в чем фишка то?

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

И наоборот, ага — на компе два антивируса, но все равно раз в 2 недели стабильно племянник вычищает зоопарк вирусни.
>Все эти антивирусы, проактивные защиты и так далее — костыли к ущербной безопасности популярных ОС
fixed

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

Но как быть с закладками и сессиями вкладок?

>И даже не ассоциацию, а то, что вот с этим сервисом связана вот эта ассоциативная цепочка. Сервисов много, знаете ли.

Ассоциация только для доступа к устройству в оффлайне. Можете использовать сложный пароль вместо ассоциации. Дальше на устройстве хранится файл с закрытым ключом пользователя. ОС предоставляет к нему API всем сервисам требующие аутентификации.

Не нужно запоминать ассоциации к каждому сервису, только к своим устройствам.

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

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

Но: ТАК это не работает.
Где я делаю из пользователя сисадмина? Сегодняшние системы аутентификации гораздо сложнее предложенного мной решения. Обыватель даже не будет знать, что там происходит под капотом. Он просто будет заходить на сайт или скачивать нужное ПО и всё будет работать. И ему не нужно будет вспоминать пароль для каждого сайта или использовать один и тот же везде.
У вас есть более надёжное решение для защиты аккаунта? Так поведайте же его!
1) «Надо научить ребенка программировать… 2) «Надо учить ребенка тому, что актуально»


Работаю в ВУЗе. Основная проблема — первокурсники и программировать не умеют, и отформатировать текст в Word не в состоянии. Боюсь, это как раз следствие описанной вами неопределенности в задачах у педагогов.

Не объясняет «что такое пароль» и «почему не стоит прикреплять пароль на монитор стикером»


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

Уважаемые наши коллеги — школьные учителя!
Мы вас слезно просим — покажите детям клавиши Tab и Delete на клавиатурах.
Так как начинать обучение в ВУЗе с изучения клавиатуры компьютера — это уже чересчур…
(про Home / End /PageUp/PageDown — и речи нет, это уже высший пилотаж)

Прим. На клавиатуре смартфонов указанных клавиш нет, в этом -то и есть причина проблемы :)
я ментор и автор курсов по направлениям «Тестировщик-автоматизатор на Python» (QAP-тестирование)

Позвольте узнать, а какие именно части курса вы написали?
С паскалем всё впорядке. Начните отсюда www.freepascal.org для понимания вашего не понимания. Что касается всего остального, то есть простая народная мудрость: Кто умеет, делает; кто не умеет, учит других; а кто не умеет и этого, учит учителей.

А ваш Питон умеет рисовать окошки?

Умеет, конечно.

Я так понимаю, что минус мне поставили за то, что я ответил без конкретики. Что ж, исправлюсь.

Уже в стандартной библиотеке есть модули turtle для черепашьей графики (если окошко нужно чтобы что-то нарисовать из программы) и Tkinter для рисования простых окошек.

Если брать сторонние библиотеки, то есть широкий выбор средств. Можно упомянуть Qt (интерфейсы, если нужно, рисуются мышкой в Qt Designer), Gtk (рисуем в Glade), wxWidgets (wxFormBuilder) и другие.

Так что ответ на вопрос, можно ли на Python сделать приложение с GUI, — да, можно. И даже мышкой интерфейс нарисовать можно.

Паскаль лишь только помогает преподавать алгоритмику, но писать современные программы на нём крайне сложно, и вот почему:

Я конечно сильно рискую, но «Платон мне друг, а истина дороже». Delphi это по сути Pascal. Все перечисленные минусы у него отсутствуют. При этом сейчас есть бесплатная версия эмбаркадеровской IDE. Да, Delphi не принято упоминать, он уже сто лет как типа мертв. Но по факту живее всех живых, развивается. И по тому же факту — это все тот же Pascal.

Тогда, если следовать вашим пунктам в сравнении (с большей частью которых я не согласен), то больше подойдет руби. Oh, wait, у вас же нет курсов по руби....

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

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

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


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

Наболевшее, не про школьников, но эти люди вырастают из школьников.


Из школьников которые учились лет так 15-20 назад. И их тоже учили водить мышкой по экрану, юзать ворд и прочему шлаку не имеющему к информатике никакого отношения. Про то где, как и что хранить современный восьмиклассник наверное побольше вас знает. И пользоваться техникой умеет чуть ли не с пелёнок. Может всё же дать шанс школьной информатике стать почвой для вовлечения молодёжи в отрасль и подготовки профессионалов, а не очередным совковым ОБЖ в этих ваших интернетах?

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

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

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

Кажется, потому что компьютер теперь всюду!

Но может статься, он ещё не всюду.
Это да, но не любая работа с компьютером требует навыка написания программ. Как раз с компьютером школьников работать не сильно-то учат. Многие не знают даже поверхностных отличий FAT32 от NTFS, и когда стоит, а когда не стоит использовать NTFS на флешках, например. Правда, флешек у большинства уже тоже нет.
Из более простого: не каждый школьник понимает отличие оперативной памяти от объёма диска/SSD, для них это всё память, они её часто путают или даже не знают, что их две. То, что SSD называют диском, это я уже привык.
Похоже, это возникает из-за смартфонов и планшетов, где программы словно и не надо запускать, словно и не надо выключать, где нет явной файловой системы.

Однако если мы вернёмся в прежние годы, то я буквально повторю ваш аргумент: «не каждый школьник понимает отличие АЛУ от ППЗУ». :-)
То, что SSD называют диском, это я уже привык.
А как его называть? Точнее, как называть совокупность всех ПЗУ — HDD, SSD, NAND, SD, флешки и т.д. чтобы все поняли?
Судя по сложившейся системе наименования для SSD «параллелепипед умеренной жёсткости» будет в самый раз)
Хранилище :)
Не пойдет: туда попадает в том числе облако. Чуть лучше — «носитель», но тоже плохо. Если уж выбирать из более-менее подходящих слов, то лучше «ПЗУ» вряд ли что найдется. А если наплевать на физическую корректность — тот самый «диск».
Облако — это уже сетевое хранилище. Винчестер ведь тоже «в облаке используется»
Облако это не ПЗУ.
Я к тому, что хоть и хранилище, но ещё одно слово добавляется.
Для использования в бытовой терминологии мне это не нравится. Уточнение «сетевое» будут опускать, подразумевая в обе стороны.
Ну и «хранилище» иногда синоним репозитория.

Ну, корректное название — "внешняя память". Но "диск" проще.

Ещё встречается термин накопитель.

почему «внешняя» если речь в том числе про HDD, SSD?

Ну, видимо потому что хранимые на HDD и SSD данные нельзя загрузить в регистр простой командой mov.

Как это нельзя? А Intel Optane? Это накопитель, но работа с ним осуществляется через физическое адресное пространство, а не через протокол типа SATA.


Ну или просто отображение файлов в виртуальное адресное пространство процесса.

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

А зачем программирование юристам, продавцам, таксистам, бухгалтерам, учителям, автомеханикам, замам. начальника по обеспечению чего-то там?

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

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

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

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

Пользоваться компьютером можно без программировпния. Большинство так и делают. Лучше бы этому и учили. А то, когда программист выделяет слово мышкой, таща её от начала слова к концу, это выглядит дико. Может, он так освобождает время на подумать, но скорее всего, не знает про двойной клик или ctrl+shift+вправо.

чтобы ctrl shift вправо, надо обе руки держать на клавиатуре, а если рука занята мышкой, то быстрее выделить. а вот пользоваться компьютером без мыши и без какого-то знания программирования — это вряд ли.
У меня жена программированием не владеет, но компьютером пользуется. И в своём специализированном софте ориентируется всяко лучше меня, например.

Я недавно учил программированию с нуля. Бейсик — хорош. Потому что он скуден, а нём почти ничего не сделать и он заставляет сфокусироваться на оставшемся: номера строк (МЕСТО, КОТОРОЕ ИСПОЛНЯЕТСЯ), перменные (МЕСТО, В КОТОРОМ ХРАНИТСЯ), управление control flow в явном виде (GOTO 20).


В целом, после освоения бейсика надо сразу переходить на что-то другое. Это во-первых учит человека менять языки программирования on demand, во-вторых даёт ощущение "что именно хорошо".


Вообще же, очень хочется различать три разные области:


  • математическую дисциплину (алгебра)
  • навык программирования (уроки труда)
  • опыт навигации в мире современного ПО и общие представления о компьютерах (природоведение).

Простота Python кажется только при взгляде снаружи. По факту же под капотом происходит куча всего сложного, и всё это надо понимать, чтобы уметь программировать на Python. А чтобы всё это понять, надо изучать более низкоуровневые языки: C++, C, Assembler, типы данных и т.д.


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

По факту же под капотом происходит куча всего сложного, и всё это надо понимать, чтобы уметь программировать на Python.

Строго говоря, в современном мире один из признаков хорошего, т. е. удобного ЯП - избавление человека от необходимости "заглядывать под капот" и разбираться с тем, что там происходит. Другое дело, что питоновские сокращения типа a,b=b,a совершенно неочевидны. Гипотетическая функция replace(a,b) ровно настолько же "не под капотом", но при этом смысл её в коде программы ясен, у отличие от первой конструкции. И, кстати, она же имеет преимущество за счёт краткости перед паскалевской структурой. Вот на таких принципах ЯП для обучения (где на все часто используемые действия есть стандартная очевидно названная функция) был бы отличен.

Гипотетическая функция replace(a,b)
Обмен — это swap, процедура обмена значений переменных (там, где она есть) традиционно именуется этим глаголом.
Строго говоря, в современном мире один из признаков хорошего, т. е. удобного ЯП — избавление человека от необходимости "заглядывать под капот" и разбираться с тем, что там происходит.

Зато появляются другие приколы, про которые тоже много пишут, например:
https://habr.com/ru/company/mailru/blog/337364/


Кривая обучения Python, на самом деле, более крутая, чем C/Pascal. Объекты, лямбды и прочие удобности быстро взорвут мозг человеку, который вообще не имеет представления о программировании.


Аналогия: сразу начать использовать калькулятор без получения навыков устного счёта и вычислений в столбик на бумажке.

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


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


Понять принцип работы цикла на языке Си будет гораздо проще, чем на Python


Python — можно сказать, что делай вот это для каждого x из list, но понять как это происходит трудно, потому что не видишь, что под капотом


for x in list:
  print(x)

C — здесь четко можно пройтись по каждому шагу.


  1. Объявили счетчик для цикла
  2. Проверили условие
  3. Выполнили тело цикла
  4. Увеличили счетчик
  5. Проверили условие.

Алгоритм можно расписать на бумаге. Так подробно на Python будет трудно объяснить


for (int i = 0; i < list_size; i++)
{
   printf("%i\n", list[i]);
}

Также стало интересно чем измеряется низкий порог входа? В названии первого пункта делается на этом упор, но не объясняется как и почему Python имеет более низкий порог входа чем Pascal или Basic


Теперь про легкость языка и порог входа расскажу со своей колокольни
На своем опыте скажу, что начиная с 7 класса мы учили C++. Но в начале нам не давали знать о таких вещах как указатели, ссылки, классы и тд. Можно сказать, что писали на Си, только для ввода-вывода использовали cin/cout. Нам просто показали как вводить с консоли данные и как выводить их туда. И могу сказать, что сложность въезжания в программирования не была высокой

C — здесь четко можно пройтись по каждому шагу.

Ну, Си все же более практический язык, в нем много «странных» моментов, обусловленных больше историей, чем строгим замыслом. То же неявное приведение типов или форматная строка в printf. Да и с указателями там приходится столкнуться гораздо раньше. В общем, не для школы он.
А вот ассемблер вполне бы подошел. Только не х86, естественно, а какой-нибудь контроллерный.
вот кстати, из-за того что в питоне можно a,b=b,a и прочие списки — именно поэтому его нельзя для изучения основ программирования. простите, но реальная программа под капотом не работает a,b=b,a, а работает либо как код на паскале, либо каким-нить хитрым методом типа булевых или сдвиговых операций. и суть изучения основ — понять именно это, а не особенности питона. а списки, хеш-таблицы, деревья и прочее — много где есть, например в c# :)
Ну вообще-то под капотом там может оказаться xchg a,b.
Где-то читал, что xchg a,b работает дольше, чем xor a,b; xor b, a; xor a,b; но в реальной программе может и такого не произойти. С высокой вероятностью оптимизатор решит не перемещать значения в памяти, а заменить все последующие ссылки a на b и наоборот (если сможет).

У способа с XOR есть неприятная особенность — он всё испортит, если нужно обменять значение переменной с самой собой (такое встречается в алгоритмах). Да и оптимизировать надо то, что тормозит. Вряд ли операция обмена будет узким местом в типичной программе

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

Если говорим о базовой интерпретации, то переменная — это адрес в памяти, которая будет дважды загружена в разные регистры, после чего произойдёт обмен и выгрузка обратно в память. Таким образом swap(a,a) корректно отработает через xor.

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

Но здесь возникает проблема определённости, так как мы перестаём понимать сложность алгоритма, и однажы оказывается, что размещение в памяти 1 млрд+1 букв занимает на 0.2 сек меньше, чем 1 млрд просто.

Работу swap легко проверить — https://ideone.com/WEyN26. Как видите, для двух переменных работает, а для одной уже нет.

А всё потому, что ваша версия загружает в память промежуточные результаты.
Если строго следовать написанному мной алгоритму, swap работает, а версия 3 даже без каких либо xor-ов.
ideone.com/NeRdWe

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

Только им не показывайте, а то ведь всерьёз начнут применять)

На онлайн компиляторе не смог повторить, но локальный gcc однозначно лучше компилирует перестановку через временную переменную (swap4), чем xor варианты:
objdump
0000000000000000 <_Z5swap1PiS_>:
   0:   8b 07                   mov    eax,DWORD PTR [rdi]
   2:   33 06                   xor    eax,DWORD PTR [rsi]
   4:   89 07                   mov    DWORD PTR [rdi],eax
   6:   33 06                   xor    eax,DWORD PTR [rsi]
   8:   89 06                   mov    DWORD PTR [rsi],eax
   a:   31 07                   xor    DWORD PTR [rdi],eax
   c:   c3                      ret

0000000000000010 <_Z5swap2PiS_>:
  10:   8b 07                   mov    eax,DWORD PTR [rdi]
  12:   8b 0e                   mov    ecx,DWORD PTR [rsi]
  14:   48 31 c8                xor    rax,rcx
  17:   48 31 c1                xor    rcx,rax
  1a:   48 31 c8                xor    rax,rcx
  1d:   89 07                   mov    DWORD PTR [rdi],eax
  1f:   89 0e                   mov    DWORD PTR [rsi],ecx
  21:   c3                      ret

0000000000000030 <_Z5swap3PiS_>:
  30:   8b 0f                   mov    ecx,DWORD PTR [rdi]
  32:   8b 06                   mov    eax,DWORD PTR [rsi]
  34:   89 07                   mov    DWORD PTR [rdi],eax
  36:   89 0e                   mov    DWORD PTR [rsi],ecx
  38:   c3                      ret

0000000000000040 <_Z5swap4PiS_>:
  40:   8b 07                   mov    eax,DWORD PTR [rdi]
  42:   8b 16                   mov    edx,DWORD PTR [rsi]
  44:   89 17                   mov    DWORD PTR [rdi],edx
  46:   89 06                   mov    DWORD PTR [rsi],eax
  48:   c3                      ret




Впрочем, если компилировать с
жёстко заданными значениями
int main()
{
    int a=6,b=7,c=8;
    swap(&a,&c);
    return a-c;
}

то результаты получаются следующие:
0000000000000050 <_Z5main1v>:
  50:   b8 02 00 00 00          mov    eax,0x2
  55:   c3                      ret

0000000000000060 <_Z5main2v>:
  60:   b8 06 00 00 00          mov    eax,0x6
  65:   b9 08 00 00 00          mov    ecx,0x8
  6a:   48 31 c8                xor    rax,rcx
  6d:   48 31 c1                xor    rcx,rax
  70:   48 31 c8                xor    rax,rcx
  73:   29 c8                   sub    eax,ecx
  75:   c3                      ret

0000000000000080 <_Z5main3v>:
  80:   b9 06 00 00 00          mov    ecx,0x6
  85:   b8 08 00 00 00          mov    eax,0x8
  8a:   29 c8                   sub    eax,ecx
  8c:   c3                      ret

0000000000000090 <_Z5main4v>:
  90:   b8 02 00 00 00          mov    eax,0x2
  95:   c3                      ret



лучшим окажется тот код, который без вставок!

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


Вообще, я раньше увлекался тем, что какие-то несложные операции дизассемблировал после компиляции с максимальной оптимизацией, а потом удивлялся: «А так можно было?!» :)


Кстати, дизассемблировать удобнее в Godbolt: https://godbolt.org/z/oExTv7ofM

Godbolt хорош, но в реальном коде с оптимизациями всё становится ещё хардкорнее.


Так, вот такой простой код:


void Rotate180(const Image<float> &src, Image<float> &dst)
{
    int w = src.Width() - 1;
    int h = src.Height() - 1;

    for (int j = 0; j <= h; j++)
    for (int i = 0; i <= w; i++)
    {
        dst(w - i, h - j) = src(i, j);
    }
}

Становится вот таким:


Assembler
0000000000001d90 <_Z9Rotate180RK5ImageIfERS0_>:
    1d90:   55                      push   rbp
    1d91:   41 57                   push   r15
    1d93:   41 56                   push   r14
    1d95:   41 55                   push   r13
    1d97:   41 54                   push   r12
    1d99:   53                      push   rbx
    1d9a:   44 8b 6f 0c             mov    r13d,DWORD PTR [rdi+0xc]
    1d9e:   45 85 ed                test   r13d,r13d
    1da1:   0f 8e 00 02 00 00       jle    1fa7 <_Z9Rotate180RK5ImageIfERS0_+0x217>
    1da7:   8b 4f 08                mov    ecx,DWORD PTR [rdi+0x8]
    1daa:   85 c9                   test   ecx,ecx
    1dac:   0f 8e f5 01 00 00       jle    1fa7 <_Z9Rotate180RK5ImageIfERS0_+0x217>
    1db2:   4c 8b 1f                mov    r11,QWORD PTR [rdi]
    1db5:   48 8b 06                mov    rax,QWORD PTR [rsi]
    1db8:   8b 56 10                mov    edx,DWORD PTR [rsi+0x10]
    1dbb:   89 54 24 cc             mov    DWORD PTR [rsp-0x34],edx
    1dbf:   4c 63 47 10             movsxd r8,DWORD PTR [rdi+0x10]
    1dc3:   48 8d 79 ff             lea    rdi,[rcx-0x1]
    1dc7:   8d 51 ff                lea    edx,[rcx-0x1]
    1dca:   48 8d 34 8d 00 00 00 00     lea    rsi,[rcx*4+0x0]
    1dd2:   89 54 24 c8             mov    DWORD PTR [rsp-0x38],edx
    1dd6:   48 63 d2                movsxd rdx,edx
    1dd9:   48 8d 2c 95 04 00 00 00     lea    rbp,[rdx*4+0x4]
    1de1:   48 89 74 24 e0          mov    QWORD PTR [rsp-0x20],rsi
    1de6:   48 29 f5                sub    rbp,rsi
    1de9:   48 01 c5                add    rbp,rax
    1dec:   48 89 6c 24 d8          mov    QWORD PTR [rsp-0x28],rbp
    1df1:   48 89 44 24 f8          mov    QWORD PTR [rsp-0x8],rax
    1df6:   48 8d 04 90             lea    rax,[rax+rdx*4]
    1dfa:   48 83 c0 04             add    rax,0x4
    1dfe:   48 89 44 24 e8          mov    QWORD PTR [rsp-0x18],rax
    1e03:   89 d6                   mov    esi,edx
    1e05:   29 fe                   sub    esi,edi
    1e07:   39 d6                   cmp    esi,edx
    1e09:   0f 9f c2                setg   dl
    1e0c:   48 89 7c 24 d0          mov    QWORD PTR [rsp-0x30],rdi
    1e11:   48 89 fe                mov    rsi,rdi
    1e14:   48 c1 ee 20             shr    rsi,0x20
    1e18:   0f 95 c0                setne  al
    1e1b:   08 d0                   or     al,dl
    1e1d:   88 44 24 c7             mov    BYTE PTR [rsp-0x39],al
    1e21:   41 89 cf                mov    r15d,ecx
    1e24:   41 83 e7 e0             and    r15d,0xffffffe0
    1e28:   48 89 c8                mov    rax,rcx
    1e2b:   48 f7 d8                neg    rax
    1e2e:   48 89 44 24 f0          mov    QWORD PTR [rsp-0x10],rax
    1e33:   49 8d 6b 60             lea    rbp,[r11+0x60]
    1e37:   45 31 c9                xor    r9d,r9d
    1e3a:   4c 89 da                mov    rdx,r11
    1e3d:   eb 14                   jmp    1e53 <_Z9Rotate180RK5ImageIfERS0_+0xc3>
    1e3f:   90                      nop
    1e40:   49 83 c1 01             add    r9,0x1
    1e44:   4c 01 c5                add    rbp,r8
    1e47:   4c 01 c2                add    rdx,r8
    1e4a:   4d 39 e9                cmp    r9,r13
    1e4d:   0f 84 54 01 00 00       je     1fa7 <_Z9Rotate180RK5ImageIfERS0_+0x217>
    1e53:   83 f9 20                cmp    ecx,0x20
    1e56:   0f 92 c0                setb   al
    1e59:   4c 89 ce                mov    rsi,r9
    1e5c:   49 0f af f0             imul   rsi,r8
    1e60:   4d 8d 34 33             lea    r14,[r11+rsi*1]
    1e64:   44 89 cb                mov    ebx,r9d
    1e67:   f7 d3                   not    ebx
    1e69:   44 01 eb                add    ebx,r13d
    1e6c:   0f af 5c 24 cc          imul   ebx,DWORD PTR [rsp-0x34]
    1e71:   48 63 db                movsxd rbx,ebx
    1e74:   48 8b 7c 24 f8          mov    rdi,QWORD PTR [rsp-0x8]
    1e79:   4c 8d 14 1f             lea    r10,[rdi+rbx*1]
    1e7d:   0a 44 24 c7             or     al,BYTE PTR [rsp-0x39]
    1e81:   75 23                   jne    1ea6 <_Z9Rotate180RK5ImageIfERS0_+0x116>
    1e83:   48 8b 44 24 e8          mov    rax,QWORD PTR [rsp-0x18]
    1e88:   48 01 d8                add    rax,rbx
    1e8b:   49 39 c6                cmp    r14,rax
    1e8e:   0f 83 8c 00 00 00       jae    1f20 <_Z9Rotate180RK5ImageIfERS0_+0x190>
    1e94:   48 03 74 24 e0          add    rsi,QWORD PTR [rsp-0x20]
    1e99:   4c 01 de                add    rsi,r11
    1e9c:   48 03 5c 24 d8          add    rbx,QWORD PTR [rsp-0x28]
    1ea1:   48 39 f3                cmp    rbx,rsi
    1ea4:   73 7a                   jae    1f20 <_Z9Rotate180RK5ImageIfERS0_+0x190>
    1ea6:   31 f6                   xor    esi,esi
    1ea8:   45 31 e4                xor    r12d,r12d
    1eab:   48 89 f3                mov    rbx,rsi
    1eae:   48 f7 d3                not    rbx
    1eb1:   f6 c1 01                test   cl,0x1
    1eb4:   74 1a                   je     1ed0 <_Z9Rotate180RK5ImageIfERS0_+0x140>
    1eb6:   41 8b 04 b6             mov    eax,DWORD PTR [r14+rsi*4]
    1eba:   44 89 e7                mov    edi,r12d
    1ebd:   f7 d7                   not    edi
    1ebf:   01 cf                   add    edi,ecx
    1ec1:   48 63 ff                movsxd rdi,edi
    1ec4:   41 89 04 ba             mov    DWORD PTR [r10+rdi*4],eax
    1ec8:   48 83 ce 01             or     rsi,0x1
    1ecc:   41 83 c4 01             add    r12d,0x1
    1ed0:   48 3b 5c 24 f0          cmp    rbx,QWORD PTR [rsp-0x10]
    1ed5:   0f 84 65 ff ff ff       je     1e40 <_Z9Rotate180RK5ImageIfERS0_+0xb0>
    1edb:   8b 44 24 c8             mov    eax,DWORD PTR [rsp-0x38]
    1edf:   89 c3                   mov    ebx,eax
    1ee1:   44 29 e3                sub    ebx,r12d
    1ee4:   66 2e 0f 1f 84 00 00 00 00 00   cs nop WORD PTR [rax+rax*1+0x0]
    1eee:   66 90                   xchg   ax,ax
    1ef0:   8b 04 b2                mov    eax,DWORD PTR [rdx+rsi*4]
    1ef3:   48 63 db                movsxd rbx,ebx
    1ef6:   41 89 04 9a             mov    DWORD PTR [r10+rbx*4],eax
    1efa:   8b 44 b2 04             mov    eax,DWORD PTR [rdx+rsi*4+0x4]
    1efe:   8d 7b ff                lea    edi,[rbx-0x1]
    1f01:   48 63 ff                movsxd rdi,edi
    1f04:   41 89 04 ba             mov    DWORD PTR [r10+rdi*4],eax
    1f08:   48 83 c6 02             add    rsi,0x2
    1f0c:   83 c3 fe                add    ebx,0xfffffffe
    1f0f:   48 39 f1                cmp    rcx,rsi
    1f12:   0f 85 d8 ff ff ff       jne    1ef0 <_Z9Rotate180RK5ImageIfERS0_+0x160>
    1f18:   e9 23 ff ff ff          jmp    1e40 <_Z9Rotate180RK5ImageIfERS0_+0xb0>
    1f1d:   0f 1f 00                nop    DWORD PTR [rax]
    1f20:   48 8b 74 24 d0          mov    rsi,QWORD PTR [rsp-0x30]
    1f25:   31 db                   xor    ebx,ebx
    1f27:   66 0f 1f 84 00 00 00 00 00  nop    WORD PTR [rax+rax*1+0x0]
    1f30:   48 63 f6                movsxd rsi,esi
    1f33:   c4 e3 7d 04 44 9d a0 1b     vpermilps ymm0,YMMWORD PTR [rbp+rbx*4-0x60],0x1b
    1f3b:   c4 e3 7d 06 c0 01       vperm2f128 ymm0,ymm0,ymm0,0x1
    1f41:   c4 e3 7d 04 4c 9d c0 1b     vpermilps ymm1,YMMWORD PTR [rbp+rbx*4-0x40],0x1b
    1f49:   c4 e3 7d 04 54 9d e0 1b     vpermilps ymm2,YMMWORD PTR [rbp+rbx*4-0x20],0x1b
    1f51:   c4 e3 75 06 c9 01       vperm2f128 ymm1,ymm1,ymm1,0x1
    1f57:   c4 e3 6d 06 d2 01       vperm2f128 ymm2,ymm2,ymm2,0x1
    1f5d:   c4 e3 7d 04 5c 9d 00 1b     vpermilps ymm3,YMMWORD PTR [rbp+rbx*4+0x0],0x1b
    1f65:   c4 e3 65 06 db 01       vperm2f128 ymm3,ymm3,ymm3,0x1
    1f6b:   c4 c1 7c 11 44 b2 e4    vmovups YMMWORD PTR [r10+rsi*4-0x1c],ymm0
    1f72:   c4 c1 7c 11 4c b2 c4    vmovups YMMWORD PTR [r10+rsi*4-0x3c],ymm1
    1f79:   c4 c1 7c 11 54 b2 a4    vmovups YMMWORD PTR [r10+rsi*4-0x5c],ymm2
    1f80:   c4 c1 7c 11 5c b2 84    vmovups YMMWORD PTR [r10+rsi*4-0x7c],ymm3
    1f87:   48 83 c3 20             add    rbx,0x20
    1f8b:   83 c6 e0                add    esi,0xffffffe0
    1f8e:   49 39 df                cmp    r15,rbx
    1f91:   75 9d                   jne    1f30 <_Z9Rotate180RK5ImageIfERS0_+0x1a0>
    1f93:   4c 89 fe                mov    rsi,r15
    1f96:   45 89 fc                mov    r12d,r15d
    1f99:   49 39 cf                cmp    r15,rcx
    1f9c:   0f 84 9e fe ff ff       je     1e40 <_Z9Rotate180RK5ImageIfERS0_+0xb0>
    1fa2:   e9 04 ff ff ff          jmp    1eab <_Z9Rotate180RK5ImageIfERS0_+0x11b>
    1fa7:   5b                      pop    rbx
    1fa8:   41 5c                   pop    r12
    1faa:   41 5d                   pop    r13
    1fac:   41 5e                   pop    r14
    1fae:   41 5f                   pop    r15
    1fb0:   5d                      pop    rbp
    1fb1:   c5 f8 77                vzeroupper 
    1fb4:   c3                      ret    
    1fb5:   66 2e 0f 1f 84 00 00 00 00 00   cs nop WORD PTR [rax+rax*1+0x0]
    1fbf:   90                      nop
Сомневаюсь, что это относится к делу, но в вашем коде нигде не используется утверждение , то есть данное ограничение общности излишне:
template void Rotate180(const Image &src, Image &dst)

Можно ли взглянуть на определение Image (всё-таки интересно, откуда берётся столько инструкций)?

Да, конечно:


Image
#pragma once

#include <cstdlib>
#include <stdexcept>
#include <utility>

template <typename T>
class Image
{
public:
    Image(int w, int h);
    Image(Image&& other);
    int Width() const;
    int Height() const;
    T& operator() (int x, int y);
    const T& operator() (int x, int y) const;    
    ~Image();

    static constexpr int MaxDimensions = 16384;

private:
    void *ptr;
    int width, height, stride;
};

template <typename T>
Image<T>::Image(int w, int h)
{
    if (w < 0 || w >= MaxDimensions || h < 0 || h >= MaxDimensions)
        throw std::out_of_range("Image dimensions are outside allowed range");

    width = w;
    height = h;
    stride = (width * sizeof(T) + 31) / 32 * 32;
    ptr = aligned_alloc(32, stride * height);
}

template <typename T>
Image<T>::Image(Image<T>&& other)
{
    std::swap(ptr, other.ptr);
    std::swap(width, other.width);
    std::swap(height, other.height);
    std::swap(stride, other.stride);    
}

template <typename T>
int Image<T>::Width() const { return width; }

template <typename T>
int Image<T>::Height() const { return height; }

template <typename T>
T& Image<T>::operator() (int x, int y) { return *(T*)((char*)ptr + y * stride + x * sizeof(T)); }

template <typename T>
const T& Image<T>::operator() (int x, int y) const { return *(T*)((char*)ptr + y * stride + x * sizeof(T)); }

template <typename T>
Image<T>::~Image()
{
    free(ptr);
}
Достаточно просто, даже сказал бы очевидно, как переписать то же самое, чтобы скомпилированный код был таким же коротким, как и исходный, но подозревая подвох всё-таки спрошу:
!!!) sizeof возвращает размер в байтах, тогда как (char*)ptr + N, складывает в единицах sizeof(char). Это не UB, но всё же… это ошибка?
???) template typename T — как понял из определения, может принимать значения только встроенных типов. Не очень понятно, в чём смысл этих типов, что означает int или float в описании изображения. Обычно берут что-то типа unsigned char[3] или на крайний случай template class T, чтоб на все случаи жизни.
?) aligned_alloc(32, — а зачем выравнивание? могу пояснить, зачем нужно его отсутствие: чтобы однопискельные обработки могли происходить одномерным циклом for(int i=0;i<width*height;i++)
?) MaxDimensions = 16384, а почему больше нельзя, память вроде как позволяет?
!) throw… — надеюсь, вы тщательно обставили его try-ями, иначе вместо сообщения «попробуйте открыть другой файл» будет «приложение будет неожиданно закрыто без сохранения данных».
*) и что побудило к созданию этого класса? это учебный проект или требуется совместимость с чем-то или просто синтактических сахар или в него планируется позже что-то добавить?
sizeof возвращает размер в байтах, тогда как (char*)ptr + N, складывает в единицах sizeof(char). Это не UB, но всё же… это ошибка?

Нет, не ошибка. Обратите внимание, что там при сложении x тоже на sizeof(T) умножается.


aligned_alloc(32, — а зачем выравнивание? могу пояснить, зачем нужно его отсутствие: чтобы однопискельные обработки могли происходить одномерным циклом for(int i=0;i<width*height;i++)

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


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

Хотя конкретно в приведённом коде любые возможности ручной векторизации разбиваются о слишком ограниченный API

Можно и руками
void Rotate180UsingAvx(const Image<float> &src, Image<float> &dst)
{
    int w8 = src.Width() / 8 * 8;

    for (int j = 0; j < src.Height(); j++)
    {
        auto s = &src(0, j);
        auto d = &dst(src.Width(), j);

        for (int i = 0; i < w8; i += 8)
        {
            auto v = _mm256_permute_ps(_mm256_load_ps(s), 0x1b);
            s += 8;
            d -= 8;
            _mm256_store_ps(d, _mm256_permute2f128_ps(v, v, 1));
        }

        for (int i = w8; i < src.Width(); i++)
            *--d = *s++;
    }
}

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

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


Так что, видимо, выравнивание было добавлено в этот код просто по инерции.

Так и есть.

А, так у вас там оператор скобочки ссылку возвращает же...


Хотя я бы всё-таки сделал явный метод для получения указателя на строку вместе с w8.

Хотя я бы всё-таки сделал явный метод для получения указателя на строку вместе с w8.

В нормальном проекте так и сделано.
А для proof-of-concept сгодится.

sizeof(char) всегда равен единице даже если у char размер больше восьми бит. Впрочем, в коде смещение умножается на sizeof(T) так что всё в порядке.

template <typename T> и template <class T> — это одно и то же. Там нет ограничения, что типы обязательно встроенные.

Ограничение в 16384 нужно было, видимо, чтоб можно было адресовать байты изображения 16384 × 16384 с 32 битами на пиксель с помощью 32-битного целого. Правда,там в коде везде int используется

Выравнивание в 32 бита может быть нужно, например, для векторизации. Например, AVX требует выравнивания в 32 байта.

Например, AVX требует выравнивания в 32 байта.

Сейчас, насколько я знаю, уже не требует. Но при пересечении cache line возможно падение производительности.

Достаточно просто, даже сказал бы очевидно, как переписать то же самое, чтобы скомпилированный код был таким же коротким,

И как же? Компилятор применил автовекторизацию и разворот цикла. Если отключить эти оптимизации, то код, понятное дело, станет компактнее.


Обычно берут что-то типа unsigned char[3]

Это двумерный массив, где элемент — не тройка байт, а один float. В чём проблема?


?) aligned_alloc(32, — а зачем выравнивание? могу пояснить, зачем нужно его отсутствие: чтобы однопискельные обработки могли происходить одномерным циклом for(int i=0;i<width*height;i++)

Чтобы векторным операциям лучше жилось.


*) и что побудило к созданию этого класса? это учебный проект или требуется совместимость с чем-то или просто синтактических сахар или в него планируется позже что-то добавить?

Это кусок проекта для сравнения производительности C++ и C#:
https://github.com/e673/cs_vs_cpp_improc

мистика! пробовал через тот же сайт, только компилятор стоял gcc11 — код получался неоптимизирвоанным, а сейчас всё в порядке.

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

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

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

Не совсем так. Есть вариант инструкции (IMUL), в котором отбрасываются старшие 64 бита результата, а есть — в котором сохраняются. Первая инструкция более гибкая, тогда как вторая жёстко прибита к определённым регистрам. Компиляторы пользуются именно первым вариантом. Ну а второй: у вас в языке из коробки нет 128-битного типа, так что юзайте интринсики.


Тем не менее, инструкцию умножения для 32 bit × 32 bit → 64 bit можно заставить сгенерировать в 32-битном режиме:


uint32_t a;
uint32_t b;
uint64_t c = (uint64_t)a * b;

Один вопрос только остаётся: а нахрена вообще xor в этом алгоритме?

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

Вы написали, что преподаете в лицее не только информатику, но и физику.
Справедливости ради, сейчас ту физику, которую преподают в школе тоже никто «в реальном мире» уже не использует.
Законы Ньютона? Да вы что, все давным давно перешли на аналитическую механику! Никто сегодня не станет расчитывать физические процессы с помощью формулы F = ma.
Однако же очевидно, что давать детям в школе Лагранжеву и Гамильтонову механику вместо законов Ньютона будет не самой лучшей идеей.
То же и с языком Pascal. От того, что он не используется в продекшн, он не перестал быть лучшим языком для обучения.
Нам в школе рассказали о лагранжевой механике. Мельком на факультативном занятии, больше к теме не возвращались. Сейчас очень жалею об этом, поскольку в учебниках объясняют даже меньше, чем в нашей школе, а вопросы больше задавать некому. И ведь предложи нам порешать задачки — через пол года или даже быстрее скорее всего я бы задал те же вопросы.

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

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

Ланцош. Вариационные принципы механики.
Автор почти 100 страниц уделил принципу наименьшего действия. Наверное лучше него никто про ПНД и не написал. Какой в нём физ смысл, из каких соображений он выводился, как вообще люди допёрли до него. Как из него получается Лагранжева механика, или как с его помощью решить задачу на прогиб балки, вообще не зная сопромата, и тому подобная годнота. Попутно он рассказывает, почему Гаусс считал, что закон Ньютона правильно записывать не как F = ma, а как (F — ma)^2 -> min

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

2) Блок-схема очень просто и наглядно объясняет, что такое алгоритм и как он строится.

3) Динамическая типизация вносит путаницу в лёгкое мышление неопытных школьников. Вы сами пишете, что она «разрешает путаницу в различных длинах» типов.

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

5) Информатика это не программирование. Информатика это не только алгоритмы. Информатика это работа с информацией, а не с командными словами ЯВУ.

6) Если преподаватель работает с Turbo Pascal, то у него есть инструменты для очень быстрого создания интерфейсов через Turbo Vision. Внезапно.

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

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

Я знаю одного человека (я щас не про себя), который так и сделал, когда ему надо было на работе автоматизировать для себя процесс выгрузки sql запросов из бд и сохранения их в csv. Лазарус он выбрал потому, что в школе Паскаль учил, и с теплотой его вспоминал.

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

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

Курсы программирования - имхо, профанация идеи. Вроде уроков рисования или лепки в средней школе.

Пишу на C++, поддерживаю проекты на Delphi (Pascal). Создаю прототипы программ на Python. В школе ЯП и информатики не было (ибо очень давно школа та была), в ВУЗе основы (Fortran) дали на первых двух или трёх лекциях, далее пошли рубать прикладные задачи. Когда понадобилось - перешли на PL/1 или Pascal, C. Кому было интересно - те изучали красно-черные деревья и ходили с томиками Д.Кнута.

Не вижу никаких преимуществ у студентов, которые в школе что-то "программировали". Глубокого изучения алгоритмов у них, естественно, не было, основы в ВУЗах, повторюсь, постигаются на двух-трех лекциях. Если не постигаются - значит, заниматься нужно иным. А особенности реализации интересны лишь тем, кто готов погрузиться в тему.

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

Многое было сказано про мёртвые ЯП и высокоуровневые, поэтому прокомментирую для всех в общем.
Если опираться условной классификации языка программирования,т.е к ним относятся высокоуровненвые и низкоуровневые, то акцент делаю именно на высокоуровневым ЯП. А именно в среднем звене класса по изучению основ программирования я включаю строго-типизированный ЯП, например,  С++. А уже в старшем звене - Python. Поэтому согласна со многим, что Python не совсем может подойти именно для основ алгоритмизации, но очень хорош именно в  простоте синтаксиса и широтой его применения. C/C++ образуют основу программирования. По сути, даже Python построен на базе C. Поэтому не может быть такого, что Python заменит один из этих языков.

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

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

Марк Цукерберг считает, что «Программирование – это основной навык как чтение. В каждой школе должны учить писать код». 

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

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

Считаю, что программирование – один из главных навыков будущего.

>Марк Цукерберг считает, что «Программирование – это основной навык как чтение. В каждой школе должны учить писать код».

Это глупость. Профессиональное программирование это удел узкой группы людей. Для остального есть паскаль/бейсик, на уроках информатики, а также хайп low-code и прочих нейросетей пишущие код. А вот изучение CAD систем я бы ввёл в школьное образование как минимум заместо уроков труда.

Да, давай тут будешь говорить, что Марк Цукерберг говорит всякие глупости facepalm -_- ты сначала добейся до этого уровня, а потом поговорим...

Есть и другие мнения/цитаты, например нидерландский ученый в области IT Эдсгер Вибе Дейкстра:

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

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

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

А, ну и касательно марка - ему до моего уровня как программисту расти и расти, так что прошу принять все мои утверждения за непреложную истину

Твой Дейкстра тот еще говнокодер (если мерить по современному накопленному опыту в разработке). Но тогда времена были такие, пионеры — почет им и уважение тем не менее. Но сейчас мы их говнокод и заложенные архитектуры расхлебываем в постоянных взломах и утечках. Я уже не говорю о боли обычных пользователей.
Если у вас есть конструктивная критика работ Дейкстры, то было бы интересно узнать детали и ваши предложения, как сделать лучше. Понятие «современному накопленному опыту» — слишком широкое и включает в себя не менее широкое «накопленного современного говнокода». Но подозреваю, что постоянные взломы и утечки происходят не из-за кода, написанного Дейкстрой или под его руковоством.
Зачем мне перечислять банальные вещи? Вот это поделие en.wikipedia.org/wiki/ALGOL_60 мне для вас сравнить с современными ЯП и современными подходами в написании кода на них? Зачем мне терять для этого время (это довольно объёмный труд). А если вы не в курсе современной профессиональной разработки и вам требуется это сравнение, то тем более это бессмысленно.

>Но подозреваю, что постоянные взломы и утечки происходят не из-за кода, написанного Дейкстрой или под его руковоством.
Читайте внимательнее изначальное моё сообщение. Я не говорю, что именно из-за бородатого кода Дейкстры мы имеем утечки. Я говорю, что из-за заложенной архитектуры, начиная с языков программирования и заканчивая архитектурой «современных» ОС — мы имеем сегодня то, что имеем. Объяснять это долго и мне лень.
К сожалению, я в курсе состояния современной профессиональной разработки.
«терять для этого время» — действительно, просто покажите ваш код, где вы выбрали лучший язык, архитектуру и методологию разработки. А книги Дейкстры у меня итак уже есть.

Я говорю, что из-за заложенной архитектуры, начиная с языков программирования и заканчивая архитектурой «современных» ОС — мы имеем сегодня то, что имеем.

Утечки, как и разруха, в головах, а не в чем-то еще, в частности, не в языках программирования, и не в старых концепциях.

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

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

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

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

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

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

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

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

Так что нет счастья в жизни, и не будет.

@PereslavlFoto

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

Раньше была такая штука, как УПК, где школьнику за последние два года обучения давали реальную профессию.

И вы сами, со своей позиции, опровергаете мнение Ершова. Вы говорите, что «не нужно всех учить программированию».

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

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

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

>Потому даже в расте сделали возможность делать unsafe
Ваш ржавый это равносильно в современном истребителе с мартышкой примотать изолентой хвостовые рули.

>меркнет перед требованиями коммерции
>Так что нет счастья в жизни, и не будет.
С такими мыслями мы бы до сих пор сидели в пещере питаясь падалью. Но нет, выводим низкоорбительные спутники на многоразовых ракетах. Внедряем электромобили и автопилоты. Хорошо, что есть люди с противоположными вам мыслями. Жаль только, что их очень мало. Буквально один человек на ваших 9 миллиардов или сколько вас щас? Чуть бы побольше и летали бы уже к звёздам.
«автопилоты» — если бы вы знали, как эти автопилоты работают, скорее всего побоялись бы выходить на улицу, зная что по ней поедет такое. но спутники летают… только там технологии и принципы разработки немного кардинально другие.

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

не вижу связи всеобщего счастья с достижениями науки и техники.

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

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

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

>Считаю, что программирование – один из главных навыков будущего.

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

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

Я не считаю лишним изучение офисных программ в школе, т.к. где и когда их еще представится возможность изучить? Я помню, что основы вроде Ctrl-C/Ctrl-X, Ctrl-V, набор и форматирование текста и таблиц я изучил именно в школьной программе. А многие мои одноклассники уже тогда не осиливали, т к строгого контроля за выполнением заданий не было. Я до сих пор встречаю ровесников (~25+), которые не знают, с какой стороны к компьютеру подойти, и это не деревенские жители.

a = [0] * n

Для незнакомого с Питоном — это самый загадочный код в статье. :)
Целая часть от нуля, умноженная на n?

Целая часть же по-другому пишется, a = ⌊ 0 ⌋ × n.


Ух как агдой запахло...

Нет, ⌊x⌋ — это округление вниз (floor), ⌈x⌉ — округление вверх (ceil), [x] — целая часть числа. Есть два варианта трактовки этой функции.
Первый:
[x] ≡ ⌊x⌋
Второй:
[x] = ⌊x⌋, для x ≥ 0
[x] = ⌈x⌉, для x ≤ 0

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


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

Это оно в математической записи так выглядит. А в бытовой второе определение проще — «целая часть это то, что до точки, дробная — после точки».
В первом варианте для отрицательных чисел получается неинтуитивно. Если взять, например, -2.8, то целая часть -3, а дробная 0.2. И не сразу понятно, откуда берётся 0.2, и почему дробная часть отрицательного числа стала положительной. Вроде логичнее кажется -2 и -0.8.
Во поэтому Айверсон и предложил строгие floor и ceil, чтобы не задумываться об этой неопределённости.

Да ладно, как это не сталкивались?


В том же Хаскеле есть qout/rem, а есть div/mod.

В математике звёздочкой обозначается, например, свёртка, а умножение — это точка или крестик. :) Так что всё ещё загадочнее!

Почему то [0,0,0 ... 0] хотя по смыслу операции умножения должно быть [0],[0],[0]...[0]

Питон хорош инфраструктурой, я уверен что процесс обучения в jupyter notebook выигрывает в наглядности у всех учебников по паскалю

Но нужно понимать, что школьная программа рассчитана на среднего ребенка а не на детей программистов или будущих программистов.
Главная цель обучения в части программирования — чтобы ребенок ухватил сам принцип. Т.е. представление об алгоритмах и о том как их можно создавать. Поэтому здесь есть только единственный главный создания программы обучения: минимальная сложность в начале.
Мне не пришлось объяснять принцип программирования своим детям. Оказалось, что они умеют это «из коробки». Об информатике в школе они отзывались как о «программировании для даунов». Но в школе у половины класса ситуация будет совсем другая.
Я могу вспомнить 3 случая, когда мне посчастливилось объяснять программирование случайным людям. Было это в 90-ые годы, когда вокруг почти не было компьютеров. Первый — это был потомственный выпускник ПТУ, худший ученик в классе, который фактически читал по слогам, второй — студент двоечник инженерной специальности, третий — экономист. Первый ухватил принцип практически сразу, как ни странно (в меру своего максимума, конечно, который был ниже плинтуса). Со вторым и третьим была одна и та же проблема — они не могли понять, что программа исполняется по шагам и при этом на заднем плане с памятью происходит нечто определенное текущей исполняемой командой. Вместо этого они напрягали мозг и пытались понять программу как будто это задача по математике, вспоминая все что им объясняли на лекциях. Инженер-двоечник понял довольно быстро и сумел решить простые задачи. Экономист сразу сдался, но через месяц сказал что после объяснений постепенно начал все понимать.

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


Извините, затронуло за больное.

  1. Блок-схемы не нужны? Хорошо, опишите тогда алгоритм процесса инвентаризации для работника склада на Python.
  2. Бэйсик не нужен? для больших корпораций всё, что вы сможете навоять на Python, скорее всего было уже реализовано в Microsoft Office 2000. Причем, многие моменты программирования автоматизации под MS Office куда более наглядные, т.к. процесс реализации проходит с использованием мощного GUI. Ах, ну да, и кому вообще помог этот Excel в XXI веке когда есть Python/JSON/XSLT ?!
  3. Ладно там Си сложный, но Паскаль то чем вам не угодил? У меня даже на современном смартфоне программы из TP7 легко запускаются (как консольные так и графические). А так же есть модули к Паскалю с удобным API для автоматизации бытовых задач смартфона (отправка/прием СМС, управление уведомлениями и напоминаниями, мигание фонариком и ИК-портом, чтение показаний датчиков, отслеживание событий, TTS/STT), и всё это с возможностью подключения базового интерфейса из диалоговых окон с несложными формами или меню выбора. Компилирование и Lint синтаксиса с авто-дополнением свойств объектов прямо на смартфоне. Чем это Паскаль не современный? Где он отстал?
Когда я учился в школе, наша «информатика» заключалась в книжечках с примитивными логическими блок-схемами (И задачками типа «рассортируйте животных по свойствам»), а на самих уроках наша практика заключалась в том что мы учились переводить из двоичной системы счисления в шестнадцатеричную (И чуть ли не о том как надо пользоваться перфокартами). А компьютер был только у учителя и его строго-настрого запрещалось использовать, «чтобы не сломался». Если современные школьники реально обучаются программированию и работе на компьютерах сделанных после 80х, о таком уровне информатики я мог только мечтать. Всё нормально с современным преподаванием информатики (Хотя все же подхвачу высказанные ранее утверждения о важности обучения сетевой гигиене и объяснений почему не стоит выбирать qwertyuiop в качестве пароля).
НЛО прилетело и опубликовало эту надпись здесь
1. Простой синтаксис и низкий порог входа.
Python вместо знаков препинания или ключевых слов (в Паскале такими словами являются «begin» и «end») использует отступы для обозначения выполнения блока.

1:0 в пользу Паскаля. Все действия явные и однозначные.
2. Динамическая типизация.
Python обладает динамической типизацией.

2:0 в пользу Паскаля. Всегда понятно что хранится в переменной и что с ней можно делать. Чтобы изменить тип надо приложить явные усилия. Даже real -> integer.
3. Лаконичный и изящный код.
Одно из очевидных достоинств языка. Python — компактность программного кода.
3:0 в пользу Паскаля. За одной строкой Питоньего кода содержится тонна неочевидной магии. Как можно программировать, если нельзя угадать что делает каждый оператор?
4. Высокоуровневые типы данных.

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

3:0 в пользу Паскаля. На этапе обучения это абсолютно безразлично. Если навык программирования есть, он легко переносится на другие языки. А уж с каким именно языком придется иметь дело никто заранее не предугадает.
нет инструмента для быстрого создания интерфейса программы;

Lazarus/Delphi. Интерфейс рисуется гораздо быстрее, чем в Питоне. Правда, для обучения GUI не нужен, да и алгоритм в callback'ах — зло. Так что все еще 3:0
слабая графическая часть, которая может рисовать только простейшие объекты;

В этом смысле меня впечатлил TurboPascal, где можно было переключиться в графический режим 320х200, 256 цветов и рисовать просто записью в память. Вот это для обучения полезно! До этого уровня вроде ни Lazarus, ни Питон не дотягивают.
ограничения по размеру используемой памяти в переменных и циклах;
нет встроенной поддержки web-сервисов и страниц;
Паскаль не знает, как работать с современными базами данных, протоколами обмена, облачными хранилищами и сервисами.
Вообще безразлично. Учить надо алгоритмическому мышлению и умению применять знания на практике, а не каким-то конкретным библиотекам.
— Пока что по вашим критериям получается 3:0 в пользу Паскаля.
— Еще хочется отметить, что информатика это не только программирование, а компьютерная грамотность вообще. Соответственно, рассказывать надо еще про:
— Верстку (Writer, но и Word сойдет). Показать стили, способы форматирования, автонумерацию всего подряд, сноски, оглавления и т.п.
— Работу в табличных процессорах (Calc, но и Excel сойдет). Тут косячат реже, но показать как в этой штуке можно считать и строить графики все же стоит
— Работу в командной строке. Конвейеры, скрипты, стандартные команды, подсказки и т.д. Грустно смотреть как удобнейший инструмент считают каким-то ругательством.
— Естественно, компьютерную безопасность. Что не надо регистрироваться где попало, оставлять персональные данные.
В этом смысле меня впечатлил TurboPascal, где можно было переключиться в графический режим 320х200, 256 цветов и рисовать просто записью в память. Вот это для обучения полезно! До этого уровня вроде ни Lazarus, ни Питон не дотягивают.

Конкретно это вообще никак не связано с языком программирования.

Конечно. Потом я это же воспроизводил в TurboC. Это особенность DOS. Кстати, в DOSBox скорее всего заработает. Вопрос-то в том какие современные языки и библиотеки позволяют настолько удобный способ рисования.

И снова мимо. Это не особенность DOS, а legacy-режим работы видеоадаптера в реальном режиме. Вызываете INT 10h с параметром AX = 13h, после чего можете писать напрямую в кусок видеопамяти, отображаемый на адреса 0xA0000-0xAFFFF.


Правильное прилагательное здесь не "удобный", а "низкоуровневый". Во многих графических библиотеках так вообще работа на уровне пикселей убрана из политических соображений (ибо dpi scaling).

Вызываете INT 10h

int это прерывание. Кто его обрабатывает?
Правильное прилагательное здесь не «удобный», а «низкоуровневый».
Да, низкоуровневый тоже. Это не отменяет удобства.
Во многих графических библиотеках так вообще работа на уровне пикселей убрана из политических соображений (ибо dpi scaling).
А для спрайтовой графики необходима именно пиксельная сетка.
Для понимания принципов растеризации необходим прямой доступ к пикселям. Для большого количества базовых операций с графикой необходим прямой доступ к пикселям.
Конечно, это не «базовый школьный уровень».
int это прерывание. Кто его обрабатывает?

BIOS его обрабатывает


Да, низкоуровневый тоже. Это не отменяет удобства.

Не вижу в чём тут особое удобство заключается.


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

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

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

Вы как-то странно понимаете удобство. Так-то "волшебные" функции намного удобнее прямой работы с бинарными данными.


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

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

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

Что-то я в исходниках по вашей ссылке не вижу прямой работы с пикселями видеопамяти. Вы там рисуете на промежуточном буфере, а потом делаете glSwapBuffers через DMA.

А вы ожидали пример для DOS и режима 320х200х256? Увы, этим я развлекался в школе, и код не сохранился.
Вы там рисуете на промежуточном буфере, а потом делаете glSwapBuffers через DMA.
Сдается мне, вы невнимательно читали. Работа идет с отдельными пикселями одной строки, потому что у контроллера на большее не хватает памяти, а дисплей не позволяет записанное читать обратно. Учитывая, что ни в дисплее, ни в контроллере нет графической библиотеки для рисования примитивов, как бы иначе удалось подобное сделать? Ну и вы напрасно считаете именно эту связку подходящей для начинающих в области графики — там лучше именно DOS с соответствующим режимом. Ну либо писать специальную библиотеку, которая тоже самое эмулирует через обычные массивы.
А вы ожидали пример для DOS и режима 320х200х256?

А разве не об этом шла речь в ветке комментариев?

А разве не об этом шла речь в ветке комментариев?
А вы попробуйте ее прочитать. Я даже помогу вам и выделю ключевые слова.
где можно было переключиться в графический режим 320х200, 256 цветов и рисовать просто записью в память. Вот это для обучения полезно!

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

Руками и напишу. Именно потому что в свое время попрактиковался с ручным управлением пикселями. А вот напишете ли вы?

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

Зависит от этапа обучения, и от организации обучения. Обучение может быть организовано:
— и сверху вниз = начинаем с абстракций, а ассемблер и прочее в конце (если вообще будет)
— и снизу вверх = начинаем с машины Тьюринга, а ООП и прочее в конце.
Той части, которая «сверху» много не надо. Это ведь по определению библиотечный код и неважно написано ли он разработчиками OpenGL или преподавателем лично. Соответственно и язык можно использовать любой: хоть pascal/delphi/lazarus, хоть python. Высокоуровневые библиотеки можно подключить везде.
А вот спуститься на низкий уровень для Питона проблема.
Именно в том, что все прозрачно делается, без волшебных функций рисования линий или многоугольников.

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


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

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

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

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


Но это хорошо именно для понимания. С тем, что это удобно, я никак согласиться не могу. Всё же пиксель — это слишком простой примитив для того, чтоб делать что-то сложное.

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

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


А со сторонними библиотеками легко сделать. Numpy даёт нам массивы, а с помощью OpenCV отображаем и обновляем окошко при изменениях.


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


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

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

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

Дело даже не в зарплате. Я довольно долго работал в вузе и школе, но довела меня не зарплата (у меня нет каких-то больших финансовых запросов), а скорее стагнация и бюрократизация. В итоге ушёл в индустрию полностью.

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