Комментарии 274
И вообще, информатика — от слова «информация». Она не про компьютеры и не про технологии, а про алгоритмы.
Здравствуйте! Спасибо за ваше мнение. Да, вы верно отметили, что это для учебных целях служило, но в наши дни программирование развивается намного быстрее, и языки, актуальные лет 40-30, а то и 20 назад, уже полностью устарели. Насчет про понятие информатики - теоретической базой для информационных технологий является информатика. ИТ это как раз составная часть информатики. Также я в статье привела о том, что основы алгоритмизации и программирование плохо усваиваются именно на мертвых языках программирования в ходе обучения, поэтому решение проблемы может послужить к изучению популярных ЯП.
/иронично/ А информатика у нас ограничивается языками программирования?
Если же говорить серьёзно, то нужно понять одну простую вещь: Паскаль был разработан - сюрприз! - как учебный язык, что и объясняет его строгость. Это хороший учебный язык, позволяющий легко решить учебные же задачи. Он заставляет продумать программу и алгоритм заранее, а не лепить как попало.
Далее, про "дополнительные курсы". Вы, простите, либо трусы наденьте, либо крестик снимите. Педагоги раз в пять лет три года проходят обязательное повышение квалификации, с ними работают региональные методисты ИРО (Институт Развития Образования), программы повышения квалификации постоянно меняются и улучшаются.
UPD. Мантра "Программирование - новая/вторая грамотность" существует не первый год. Вот только ситуация как и с "Windows must die!" - собака лает, а караван идет. Лучше спросите своих учеников лет через десять: "Что вам пригодилось в жизни, дети? Python или Word?". Думаю, ответ очевиден.
А информатика имхо — вроде ветки, отросшей от математики.
Ну, давайте уж честно — это ваш опыт, не более. При этом отметим еще раз — вы лучше знаете условно, питон, и выбираете его для преподавания.
А результаты преподавания на других языках, с которыми вы сравниваете — это результаты чьи? Ваши, или других преподавателей? И в зависимости от ответа, следующий вопрос, который следовало бы себе задать: а в чем причина этих результатов? Возможно язык (вы рассмотрели только эту гипотезу), или же тот факт, что вы (или другой преподаватель) просто хуже знает предмет (и/или другой язык)?
Ну так, совсем просто — вы практикующий программист, как я понял, а другой преподаватель — учитель информатики, который никогда профессионально за деньги не работал? Есть такая разница? И если да, то каков вклад языка, и преподавателя?
нет инструмента для быстрого создания интерфейса программы;
зачем это детям, которые не собираются работать в IT?
слабая графическая часть, которая может рисовать только простейшие объекты;
зачем это детям, которые не собираются работать в IT?
ограничения по размеру используемой памяти в переменных и циклах;
они будут big data на переменке анализировать?
нет встроенной поддержки web-сервисов и страниц;
зачем это детям, которые не собираются разрабатывать web-сервисы?
Паскаль не знает, как работать с современными базами данных, протоколами обмена, облачными хранилищами и сервисами.
зачем это детям, которые не собираются работать с базами данных, облачными хранилищами и сервисами?
Python вместо знаков препинания или ключевых слов (в Паскале такими словами являются «begin» и «end») использует отступы для обозначения выполнения блока
а если я не согласен с авторами языка python в том как надо форматировать блоки кода, в любом языке с операторными скобками я беру и форматирую как мне удобно, а не как кто-то решил за меня
Динамическая типизация.
Которая удобна только при создании минискриптов, при написании чего-либо более сложного с разветвленной логикой — только мешает.
Высокоуровневые типы данных.
зачем это детям, которые не собираются работать в IT?
anna_agabekyan
языки, актуальные лет 40-30, а то и 20 назад, уже полностью устарели
Да, да, а процедуры в фортране — это совсем не то что процедуры в каком-нибудь go!
Спасибо за ответ. Отвечу по порядку.
Графическая составляющая важна в ходе визуализации/моделирований, например физических процессов, которые обычно представляются в аналитическом в виде.
Направление идет в профилируемых классах, связанные с естественно-научных направлениях, то есть физико-математических/технологических классах
Описала возможности ЯП, а не применение (это также относится ко всем вопросам, которые упоминаете про web-сервисы)
И ваш главный вопрос - зачем детям, которые не собираются в IT, на самом деле знать основы языка программирования Python, отнюдь не усложняет процесс обучения, а наоборот. Тем более уже при сдаче экзаменов сейчас Python активно применяется для обучающихся. Посмотрите сами на задания по ЕГЭ информатике.
Также добавлю по своему опыту, могу с уверенностью сказать, что использование современных IT- технологий на уроках информатики вызывают у учащихся неподдельный интерес, включают в работу всех, даже слабых, ребят, способствуют формированию компетенций.
А также многие обучающиеся уже ходят на разные IT-курсы и уже с удовольствием слушают лекционные и практические занятия.
Графическая составляющая важна в ходе визуализации/моделирований, например физических процессов, которые обычно представляются в аналитическом в виде.
Именно. Покажите код на Python, который рисует прямоугольник внутри которого круг имитирует движение бильярдного шара на столе? На Pascal я это писал в дремучем 1996 на олимпиаде. Там была задача просто посчитать. Но у меня осталось время и я визуализировал в десяток строчек кода.
А сколько с PyQT или ещё чем-то придётся ковыряться?
Кстати, неудачный пример. На Python это очень легко нарисовать. В стандартной библиотеке есть модуль turtle для черепашьей графики и подобных вещей. Не обязательно на Qt делать.
Такую простую 2д анимацию в питоне лучше сделать через pygame. Если нужно что-то мощнее - DirectX/OpenGL. Второй вариант подойдёт, если ученик интерисуется 3д графикой.
Графическая составляющая важна в ходе визуализации/моделирований, например физических процессов, которые обычно представляются в аналитическом в виде.
Wolfram mathematica?
Направление идет в профилируемых классах, связанные с естественно-научных направлениях, то есть физико-математических/технологических классах
Wolfram mathematica, различные CAD?
Тем более уже при сдаче экзаменов сейчас Python активно применяется для обучающихся. Посмотрите сами на задания по ЕГЭ информатике.
Так почему вы считаете одни тенденции в образовании «архаичными», а другие сугубо полезными, только потому что python более «современный» язык? А что если мне надо на уровне синтаксиса языка поддержку многопоточности (не зря ж я про go заговорил), может сразу на go всех переучить, или на каком-нибудь rust?
Нет, надо сначала освоить основы, потом уже давать что-то более современное и делать это не наобум а связно — чтобы было понятно ПОЧЕМУ, ЧТО и КАК было сделано чтобы достичь современный уровень быстродействия/удобства. Те же алгоритмы рисования дуг/кругов в современной графике, деинтерлейс, алгоритмы сглаживания, особенности рисования ШРИФТОВ, почему там так всё сложно. Да, пожалуй этому есть только одно препятствие — этой информации слишком много чтобы уместить в учебные часы. Разве что времени хватит только на то чтобы сказать что такое существует. Ну или увеличить количество учебных лет… сколько их там уже? И это при том что программирование как таковое 90% людей не упёрлось вообще, а процентов так 30 — так сказать аппаратно не совместимы с программированием. Поэтому… существующая программа в принципе ещё сносна, а тех кому это интересно и темболее нужно — пусть идут на дополнительные занятия, и вот там уже можно давать и начинать с чего-то более практичного и современного. Ну и ассемблер показать.
Я думаю, есть множество других задач, где визуализация намного более важна, чем в расчёте физических процессов. Как вы пришли к вашим выводам?
А зачем математика, если не будешь математиком?
А зачем история, если не будешь историком?
А зачем <любой другой предмет, который дают после 5 класса>?
Понять что нужно человеку в будущем — это не тривиальная задача.
К чему это? Статья хорошая и автор молодец, что в ногу со временем идет и приучает детям новинками. Будут разные мнения, особенно те, кто изучал древние языки программирования, будут не сдержанно отвечать и критиковать.
Это тоже самое зачем нам изучать латынь, если сейчас популярный и международный язык - английский.
«Давайте заменим язык A на язык B», отличное предложение.
«Архаичные программные продукты и операционные системы» — тоже смешно.
Что на самом деле не так, это то что с одной стороны, в обычной средней школе слабая математика, и с другой стороны, те же паскаль с бейсиком заточены в основном под математические расчеты и только один из них ученикам и показывают, в итоге для них остается загадкой, как же делают оконные графические программы и игры, и создается неверное впечатление о том, что это безумно сложно и не надо туда даже пытаться лезть если ты не яйцеголовый гений.
Убирать эти языки никуда не надо, а вот добавить небольшой ознакомительный курс другого языка, который позволяет создать простую программку с графическим интерфейсом, было бы неплохо.
А зачем нужна биология, если ты не будешь работать медиком?
А зачем математика, если не будешь математиком?
А зачем история, если не будешь историком?
Все эти школьные предметы не дают специальных знаний, только общую информацию о предмете, позволяющую как-то ориентироваться в этом мире и не быть невеждой.
А обучение программированию не на специальных учебных, а на актуальных на данный момент языках программирования — это уже получение профессиональных знаний.
(первый раз принимал участие в подобном обсуждении в 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.
Ошибка в другом — разницы между бейсиком, паскалем и питоном на самом деле нет почти никакой. Можно научить программировать и на том, и на другом. Для детей вообще главное наличие стимула, а все остальное — вторично.
Вот то, что преподаватели как правило ничего кроме одного инструмента не знают и выбрать не могут — вот это реально прискорбно.
Спасибо за ответ, интересное мнение. Во время проведения практических занятия по информатике, я даю некую свободу при выборе ЯП. Немного не согласна с вами насчет разницы между мертвым и высоко уровнем языка программирования. Можно научить, это верно, но могут возникнуть с пониманием основ алгоритмизации.
И потом, основы алгоритмизации сформировались много лет назад. Скажем, лисп — это язык 1958 года, хаскель — 1990, то есть этим языкам — одному 60 лет, другому 30. И они оба в значительной мере формировали и формируют эти самые основы алгоритмизации. Если на то пошло, вашему любимому питону тоже 30 лет в обед. То есть, 20-летние языки мертвые, а 30-летний почему-то живой? Проблемы же с пониманием могут возникнуть разве что когда преподаватель их сам слабо понимает, но тут уж язык слабо поможет.
А я вот наоборот, вижу существенную разницу между Паскалем и Пайтоном, и недостатки Пайтона как языка для обучения как раз в том, что вы считаете достоинствами.
Динамическая типизация усложняет объяснение одной из основ программирования - типов данных. Синтаксический сахар вроде быстрого обмена переменных скрывает реальный алгоритм этого обмена, и так далее. Это всё классно для реальной разработки. Но для обучения только вредит.
При том, что я с вами согласен, я не видел данных, что обучение на языке со статической типизацией дает лучшие результаты в дальнейшем. И именно по этой причине я бы выбрал для обучения два языка, если не больше. Разных настолько, насколько обучающий способен сам.
Учитель-садист: сначала показывает понятный Pascal, потом расслабляет ненапряжным Питоном, далее бьёт по рукам С/С++, даёт краем глаза посмотреть на Rust (главное до лайфтаймов добраться), а потом сбивает с ног Haskell и добивает Idris.
Это на кружке. В классе попроще)
А по-моему само то :)
Помню, как я в 2016 году учился в автошколе. Сначала было около 5 занятий на тренажере. Тренажеров было два. За одним я просидел 4 занятия, привык к нему (до этого за рулем никогда не сидел), приноровился, стал считать себя "асом" как минимум этого тренажера. А на последнее занятие меня посадили на второй тренажер, и там я понял, что до этого я ничего не понял. Совершенно иначе отзывается руль, педали, и прочее. И когда потом я впервые сел на руль полноценного учебного автомобиля, я уже был готов к тому, что всё будет по-другому. И впервые сев за руль уже своего автомобиля, я тоже был готов к тому, что всё будет по-другому. Короче, это был единственный плюс от того тренажера, в остальном ересь несусветная.
Думаю, примерно такой же опыт очень выгодно было бы создать у обучающихся программировать, чтобы они почувствовали разницу и стремились понять суть.
Я думаю, учить так было бы хорошо. Но требования к учителю высокие.
Автошкола… я впервые сел за руль в 29, переехав в Техас. Люди здесь за рулём ну не то что с рождения, но сильно до совершеннолетия. Соответственно, программа обучения и требования экзамена довольно забавные. Короче, я в первое же занятие сел за руль настоящей машины, мы сделали кружок вокруг автошколы и попёрлись на вполне себе дорогу. Где-то на третьем занятии (по два часа каждое) уже был хайвей и езда в потоке на сколько-там-в-нормальных-единицах-75-миль-в-час.
Я, конечно, офигел от этого всего, но в итоге вроде всё норм.
Я, как с одной стороны учитель, а с другой - весьма опытный разработчик, могу сказать что данных тоже не видел, не искал, но видел отложенные результаты того, что программирование дети начали изучать с ЯВУ, где все переменные имеют тип Variant и не требуют вообще никакого предварительного описания.
Мне приходилось видеть в промышленном проекте, созданном в ведущей по отрасли компании, запись "proc(a, ,;)", которая по задаче - вызов процедуры с тремя параметрами, где второй - на самом деле, по задаче - символ пробела, а третий - символ точки с запятой. И эта запись была причиной трёхмесячной задержки перехода на поддерживаемую версию ПО.
Такого не было ни разу, пока я работал с ребятами, изучавшими программирование "тогда", начиная с жёстких c++ и pascal, и глубоко изучая практическое ООП по мере его вообще появления в языках.
Уровень понимания деталей можно оценить по фразе одного из них - "Лёха, я понял, что такое объект, только тогда, когда докопался и увидел, как объект трансформируется при компиляции в макросы ассемблера".
Сможет ли программист изучить незнакомый язык, и начать преподавать на нем? Ну в общем-то да, должен, если он сам не совсем еще джун.
Будет ли результат лучше? Вот не факт.
Если человек учит тому, что сам хорошо знает, что ему самому нравится, и т.п. — то результат, на мой взгляд, всегда будет лучше, чем если человек учит тому, чем сам никогда не пользовался, или что не любит. То есть, сочетание предмета и учителя должно быть. Ну и стимула, в том числе — в виде интересной и полезной задачи.
> a = [0] * n
Ну и как объяснить ребенку что это значит не умножить содержимое массива (в данном случае состоящего из одного нулевого числа) на скаляр, а размножить элементы массива. Я сам себе-то это объяснить не могу. И где, кстати, мой оператор .*?
Прелесть бэйсика, паскаля, Си (с некоторыми оговорками) что они просты и позволяют увидеть суть происходящего пусть и за счет излишнего количества примитивных операторов. Современные же языки столь усложнены, что в них без 5 курсов верхнего образования становится не разобраться.
PS Кто сегодня по хабру дежурный? Я как любитель форматировать текст пробелами специально вставил их между символом вопроса и ".*", но при отображении они пропали. И мне кажется, что это фича не из удачных.
Ну и как объяснить ребенку что это значит не умножить содержимое массива (в данном случае состоящего из одного нулевого числа) на скаляр, а размножить элементы массива.
Так и скажите, что это не умножение. Я пробовал, это работает. Дети вовсе не такие глупые.
Дело не в том, могут они понять или нет — выучить таблицу приведений объектов в яваскрипте не труднее стиха «буря мглою небо кроет...».
Дело в том, что у любого действия должен быть наиболее ожидаемый результат. Для питона это особенно справедливо — у него нет «костылей» статической типизации, и 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.
Давайте сверим часы! На ваших 2021-й? Странно: и на моих — тоже 2021-й!
И вы не поверите: оказывается, они, академики, даже пишут «критические» статьи в научных журналах (см. например). В статье, на которую приведена моя ссылка маститый академик «критикует» школьных преподавателей за то, что они, оказывается, совершенно не понимают сути проектной деятельности! Затем (очень не сразу, а лишь после великого множества слов) мы узнаем, что «автором разработан специальный учебно-методический комплекс, включающий учебное пособие для учащихся по проектной деятельности и рекомендации для учителей по организации»…
Не спят, значит наши академики, не дремлют! Нужно только всем нам одеть галоши, пойти в книжный магазин и поискать книжечки-то! А вы тут революцию с выборами каких-то языков пытаетесь поднять!
А вот в Англии дети так прямо с 5-ти лет изучают Scratch! Более того, государство выдает каждому первоклашке (абсолютно безвозмездно — то есть ДАРОМ) достаточно крутой контроллер Micro.bit — программируй хоть на Scratch, хоть на том самом Python сколько хочешь! Или вот посмотрите на картинку со статистикой (2018 года) по численности тех, кто программирует в среде Scratch в разных странах. Вас не впечатляет? Нужно что-то говорить еще? Кстати, вы заметили? Статья-то академическая аж от 2015 года! А в школах все по-прежнему… Расстроились?
Но, вот мнение по этому поводу еще одного академика РАО А.Асмолова: «Можно не сомневаться: принятие стандартов школьного образования — ФГОС, подготовленных Министерством просвещения, влечет за собой серьезнейшие риски как для наших школьников, так и для системы общего образования в целом. Главные из них — нарушение права на качественное образование, а также невозможность социализации подрастающих поколений в современном мире. А в итоге — невыполнение решений президента о вхождении России в первые десять стран мира в сфере школьного образования и ослабление конкурентоспособности и безопасности нашей страны...»
Видите? Все в порядке! Академики критикуют!.. Хотелось бы, конечно, заслушать еще мнение начальника транспортного цеха (того самого, что у Михаила Жванецкого), но он где-то отсутствует…
cовершенно не понимают сути проектной деятельности!Иногда даже дело не в этом, а в осведомленности районных управлений образования. Нам, например, сообщили об этом ну уж очень поздно.
— Михаил, зайди на минутку.
Без задней мысли пошел к нему в кабинет.
— Нам, оказывается, в аттестат 9 классу надо прописать результат выполнения проекта по отдельному предмету «Проектная деятельность».
Я читаю положение и понимаю, что за неделю-две мы никак не сможем ничего сваять такого, что могло бы подходить по всем критериям.
— Давай, — говорю, — напишем им какую нить лапшу в аттестат и все, никто смотреть даже не будет.
— Ага, а работы в архив тебе фея-крестная подошьет?
Вот тогда в сумасшедшем темпе, еле понимая сути работы, сделали для этих несчастных 25 человек проектные работы, написали в аттестат, подшили в архив и забыли.
А через год я ушел работать в институт, тут спокойнее.
Проектная деятельность
Это черчение так переименовали или что это?
Вспомнилось еще вот что.
Я помню как когда-то заставляли всех писать «рефераты» по разным предметам, естественно все переписывали статьи из энциклопедий своими словами, занимаясь по сути рерайтингом.
У всех все всегда принимали, но один раз кто-то из преподавателей вскользь обмолвился, что это все неправильно, это вообще не реферат и его так не пишут.
При этом никогда никто не объяснял как правильно эти рефераты писать.
Сравнение синтаксиса цикла с предусловием в Паскаль и Python
Цикл на Паскале гораздо нагляднее. Во-первых, глагол "выполнять действие" (do) написан явно, а не заменён на знак двоеточия, который вообще можно понимать по-разному. Во-вторых, для операции присвоения используется свой символ := вместо простого знака равенства, который в Паскале обозначает именно равенство - это логично. В-третьих, питоновское слово print выглядит как команда распечатать лист бумаги с данными, а не вывести их на экран - Паскаль опять логичнее.
Сравнение синтаксиса переприсвоения переменных в Паскаль и Python
Глядя на код Паскаля, я, даже не разбираясь в программировании и зная лишь смысл символа присваивания, могу понять, что он делает. Глядя на код Питона, я ничего понять не могу - эта строка может быть истрактована по меньшей мере тремя способами. Плюс уже известная претензия к использованию знака равенства для чего-либо кроме констатации равенства.
Сравнение синтаксиса заполнения массива в Паскаль и Python
"А равно нулю" - это всё, что я могу понять из кода на Питоне. Из чего следует, что А - это массив/список, а не число?
В случае школы одним из решений могло бы стать видоизменение самого предмета "Информатика" в новую дисциплину под названием «Информатика и IT-технологии», где это не уроки по использованию офисного пакета, а изучение принципов алгоритмики
Зачем??? Во-первых, принципы алгоритмики уже сейчас более чем успешно изучаются. Откройте демо-вариант ЕГЭ по информатике и убедитесь, что там на языки программирования лишь малая часть заданий, а основа - именно алгоритмы, основы адресации в сетях, системы счисления и логика. Во-вторых, изучение прикладных программ и устройства компьютера гораздо более полезно для школьников, чем программирование: кто хочет стать программистом, тот явно не в школе будет этому учиться, а вот пользоваться компьютером придётся всем.
Каким бы ни было будущее, становится всё более и более очевидным, что программирование — способность читать и писать код на нескольких распространённых языках — становится новой грамотностью.
Извините, но это утверждение - признак профдеформации. В навыки владения ЭВМ входит не только умение писать код, тем более что оно становится с каждым днём всё менее необходимым даже труъ-айтишнику (слава графическим интерфейсам, конструкторам сайтов, а также системам no-code development, которые пока что лишь начинают свой путь, но уже очевидно, что за ними будущее "новой грамотности").
Соглашусь по поводу учебников с устаревшими ОС и другими программами.
Но бОльшая часть статьи посвящена выбору языков, и, мне кажется, этому неважному вопросу уделяется слишком большое внимание. Тем более по большинству пунктов (1, 2, 4) именно Паскаль для обучения выглядит лучше, чем Python. Особенно пункт 2 про динамическую типизацию.
А в целом:
Алгоритмы и программирование - это хоть и значительная часть предмета "Информатика" (особенно в последнее время, даже на ЕГЭ, насколько я помню, половина задач так или иначе связана с этим), но не вся. Так что статья покрывает лишь часть вопроса.
Язык вообще не важен. Алгоритмы и базовые структуры данных - вот что должно проходиться в школе.
Язык может лишь помочь заинтересовать в предмете, например, если позволяет быстро создать GUI, сделать сайт, или приложение на телефон. Но помню, когда я учился, меня заинтересовало программирование, когда я написал программу, решающие квадратные уравнения, и радовался, что ей можно будет пользоваться для проверки решений ДЗ по математике (интернета у меня тогда не было). Так что заинтересовать можно тоже разными способами.В комментариях вы написали про опыт в основном в профильных классах - вот там, особенно в кружках и курсах, уже можно затрагивать и веб-разработку, работу с БД, и современные технологии, т.к. алгоритмическую часть ученики схватывают довольно быстро.
За лаконичностью и изящностью кода (пример с обменом значений переменных) в питоне лежит куча "магии" там точно так же создался временный объект кортеж который потом был "распакован" и удален. В паскале все произошло явно и это большой плюс при обучении. Да синтаксис паскаля по современным меркам тяжеловат тут спорить тяжело и питон наверное более востребован в современном мире, однако учить программировать можно на чем угодно. Главное чтобы тамада был хороший и конкурсы интересные учитель мог хорошо объяснить материал и умел заинтересовать детей, а это талант который не зависит от языка программирования.
Как обычно, любое сравнение языков аудитория хабра очень остро воспринимает) Мне субъективно не нравится питон как учебный язык, но для клипового ребенка, думаю, питон подходит лучше. Чем больше вероятность того, что у ребенка что-то будет получаться, тем больше шансов у него продолжить, это несомненно важнее.
Кроме устаревших программ, учебных материалов большой проблемой также являются неувлеченные преподаватели. Спасибо автору, что она старается для ребятишек)
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? Она покрасивше будет!
Ии… как вы объясните ученику, где закончилось тело цикла? :)
Так это невалидный код. Если бы вы не убрали отступы, то объяснить никакой проблемы не было бы. Дети вовсе не такие глупые.
Если мы говорим про личный опыт, то я десять лет преподавал в школе информатику когда-то. Как совместитель, раз в неделю, но всё же. Какой-то особой разницы именно в понимании синтаксиса я не видел. Неправильно ставили пробелы и забывали end после begin одни и те же люди. В общем, я не думаю, что выбор языка для основной программы так уж важен. А те, кто хочет узнать больше, могу это узнать в кружке.
А вот то, что учителя порой не могут ответить на вопросы учеников, или то, что в учебниках иногда написана чушь или вовсе неверные сведения, — это проблема. Но с другой стороны где брать специалистов? Если человек умеет программировать и прекрасно знает информатику, он скорее уйдёт в индустрию (но есть примеры и обратного).
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, завтра — 50. Та же фигня с фреймворками. Это всё приходит и уходит, а алгоритмы остаются.
Вопрос: а кого вы называете старшим поколением? Моё (1975) с удовольствием всем этим пользуется, матерясь лишь, когда IDE и фреймворки сделаны через [censored], а контейнеры используются без понимания.
Найти IDE под них можно только на торрентах, и у этих IDE совершенно нет community.
А что за проблема с IDE? Lazarus вон вообще в репозитории есть.
щас вам расскажут, что Паскаль это круто, главное -- научиться программы программировать, а всякие тулзы и современные IDE/бд "это вам не нужно" (с). https://habr.com/ru/company/vdsina/blog/556358/comments/#comment_23013998
Опять чуть ли не главной проблемой преподавания информатики считают выбор языка программирования.
Кстати про Паскаль (особенно если сравнивать его с питоном)
нет инструмента для быстрого создания интерфейса программы;
А в питоне оно разве есть (не в модулях для питона, а именно в самом питоне, поскольку в модулях оно и для паскаля есть в ассортименте)?
А в современном паскале, кстати, оно таки очень даже есть. Причем очень развитое. Берем Lazarus - и вперед на танки.
Да даже TurboPascal древний, пусть и не имел среды для быстрого набрасывания интерфейса без программирования, но имел библиотеку, позволяющую быстро набросать вполне приличный текстовый интерфейс.
слабая графическая часть, которая может рисовать только простейшие объекты;
Вполне продвинутая графическая часть. Помнится, с ее помощью даже интерактив всякий на раз программировали.
С другой стороны, а что еще надо, кроме простейших объектов?
ограничения по размеру используемой памяти в переменных и циклах;
Какие такие ограничения? У вас какой-то не такой паскаль, как у нас был.
нет встроенной поддержки web-сервисов и страниц;
опять берем лазарус. Там есть.
Паскаль не знает, как работать с современными базами данных, протоколами обмена, облачными хранилищами и сервисами.
Питон знает? Опять же, если без сторонних модулей. Хотя для школы это немного избыточно.
Впрочем, лазарус знает.
Вы про учебник К.Ю. Полякова вообще слышали?Согласен, хорошая вещь.
Но есть одно маленькое «но» в нашей системе образования.
Школа должна обеспечить учеников учебниками. Те самые учебники закупаются по региональной программе всем школам региона сразу.
Как это происходит:
В конце учебного года приходит реестр того, что можно заказать. По информатике в тот раз было два
Сделать сложно, но можно. И все же многие идут по пути меньшего сопротивления
1) «Надо научить ребенка программировать, это ему пригодится» (10+ лет назад я работал учителем информатики в школе… так вот, из 100+ человек, которые прошли мимо меня, с IT связал жизнь один-единственный).
2) «Надо учить ребенка тому, что актуально» (то есть ворду, экселю, пэйнту). Подход в принципе, нормальный. Ликбез в информационном мире.
Но почему, почему, черт возьми, НИКТО И НИГДЕ не учит информационной гигиене?
Не объясняет «что такое пароль» и «почему не стоит прикреплять пароль на монитор стикером». Это кажется самоочевидным, да?
Не объясняет методы мошенничества в сетях. Это тоже кажется самоочевидным?
Пароль это удел технологий 80-х, 90-х годов. Требовать от обывателя создавать и помнить пароль в 21 веке это верх идиотизма. Так что не нужно скидывать плачевное состояние ИТ отрасли на простых людей. Что уже говорить о дырявых системах, с архитектурой безопасноти из 70-х, не способных защитить важные данные пользователей?
Это все, очень хорошо и интересно. Только пароль для регистрации укажите.
Уточню: у меня нет смартфона и нет датчика пальца.
Разработка нового опенсорц железа, ЯП и ОС для начала, которым можно будет доверять.
Что касается аутентификации на конкретном устройстве, то здесь можно использовать систему «ассоциаций пользователя» (вопрос-ответ, изображение-ответ, вопрос-изображение и т.д.), либо аппаратный ключ.
систему «ассоциаций пользователя» (вопрос-ответ, изображение-ответ, вопрос-изображение и т.д.), либо аппаратный ключ.
Не вопрос. Кто расскажет детям в школе, что нельзя доверять свои ассоциации кому попало, нельзя их писать на стикере и лепить на монитор, нельзя давать свой аппаратный ключ попользоваться другу, маме, бабушке, однокласснику или забывать в конкретном устройстве?
Вы забываете, что самое слабое место информационной системы —
P.S. От вас приходит по 5-7 копий одного и того же сообщения. Это вы его 7 раз редактировали, эксплойтите систему или это глюк хабра?
>нельзя давать свой аппаратный ключ попользоваться другу, маме, бабушке, однокласснику или забывать в конкретном устройстве?
Эту проблему вы никак не решите. Только замена пользователя на робота. Вы еще начните решать проблему утерю кошелька с документами или выпавших из кармана ключей от квартиры.
Но аппартаный ключ лучше пароля в большинстве случаев. Особенно для обывателя. Для его защиты в случае утери или кражи опять же можно использовать ассоциации.
>эксплойтите систему
Зачем мне эксплоить систему? Это очередной показатель ущербности ИТ систем и их разработчиков, не способных в UX.
>Можно навернуть сколь угодно крутую систему безопасности — и лишиться её из-за человеческого фактора.
Вы хотите абсолютизма, я же хочу просто повысить уровень безопасноти ИТ систем. Пароли для этого негодятся.
Зачем ассоциацию писать на стикере? Ассоциация на то и ассоциация, что пользователь изначально хранит её в голове и у каждого она индивидуальна.
Затем, что легко забыть пароль или ассоциации. И даже не ассоциацию, а то, что вот с этим сервисом связана вот эта ассоциативная цепочка. Сервисов много, знаете ли.
а) одна ассоциация на все сервисы === 1 пароль на все сервисы
б) бумажка с напоминалками на все сервисы
г) стороннее ПО
Повторюсь, вы приписываете паролю проблемы, которыми он не обладает. Хаете технологию, а не особенности её эксплуатации.
Из ружья тоже можно выстрелить в ногу. Ружьё плохое? Предложите, на что его нужно заменить? А может быть лучше научить им пользоваться?
Вы еще начните решать проблему утерю кошелька с документами или выпавших из кармана ключей от квартиры.
Кажется, это пока что вы решаете не те проблемы :)
Я всего-то расстраиваюсь, что не ведут лекции по информационной гигиене, а вы талдычите, что «пароли не нужны». Не в паролях проблема, а в головах.
Вы хотите абсолютизма,
Вы еще по аватарке погадайте ;)
Для его защиты в случае утери или кражи опять же можно использовать ассоциации.
И сколько слоёв защиты вы хотите навернуть?
Аппаратный ключ. Ассоциации. СМС на телефон. Пароль. Отпечаток пальца и сетчатка глаза. Что дальше? Сканирование ДНК?
Ну и зачем это все для входа на домашний компьютер?
Ещё раз - проблема в современных ИТ системах. Не нужно перекладывать эти проблемы на обывателей. Вы не сделаете из обывателя сисадмина даже средней руки.
Система должна заботиться о безопасности и своей гигиене не позволяю сторонним процессам захватывать контроль над всей системой, даже если обыватель допустил ошибку.
Ещё раз — проблема в современных ИТ системах.
Вы можете эту проблему решить за лето? Нет. Значит, придется пользоваться тем, что есть. И детей учить пользоваться тем, что есть, получая максимум пользы и минимум вреда.
Да, принцип неуловимого Джо.
Безопасность Линукса выше только из-за более высокого порога вхождения. Соответственно, им просто не пользуются малограмотные пользователи.
Безопасность Линукса выше только из-за более высокого порога вхождения.Разумеется, не только. Сам подход другой, то же наличие репозитория.
Наличие официальных репозиториев никак не поможет от:
- Добавления левых репозиториев в систему.
- Запуска run-файлов.
- Следования советам типа sudo wget… | sh.
- Запуска Windows-приложений с вируснёй под wine.
- Установки вредоносных расширений в браузер.
Все эти антивирусы, проактивные защиты и так далее — лекарства, а не профилактика.
А профилактикой не занимаются. Ведь алгоритмы важнее!
Разработка нового опенсорц железа, ЯП и ОС для начала, которым можно будет доверять.
И это (как предлагает выше мой оппонент) тоже на защитит от регистрации на файлопомойках, понимаете в чем фишка то?
Знаю людей, которые отлично годами живут на винде без антивируса. И ничего, никаких вирусов у них нет. Несмотря на то, что вполне себе активно пользуются интернетом.
И наоборот, ага — на компе два антивируса, но все равно раз в 2 недели стабильно племянник вычищает зоопарк вирусни.
fixed
> тоже на защитит от регистрации на файлопомойках
Защитит, если ОС огородит процесс от остальной системы. И если эта защита будет из коробки в ОС, а не приделыванием очередных костылей.
>И даже не ассоциацию, а то, что вот с этим сервисом связана вот эта ассоциативная цепочка. Сервисов много, знаете ли.
Ассоциация только для доступа к устройству в оффлайне. Можете использовать сложный пароль вместо ассоциации. Дальше на устройстве хранится файл с закрытым ключом пользователя. ОС предоставляет к нему API всем сервисам требующие аутентификации.
Не нужно запоминать ассоциации к каждому сервису, только к своим устройствам.
Пользовательское взаимодействие с ИС идет по пути упрощения, а вы наворачиваете уровни сложности. Да, я понимаю, ради безопасности.
Но: ТАК это не работает.
1) «Надо научить ребенка программировать… 2) «Надо учить ребенка тому, что актуально»
Работаю в ВУЗе. Основная проблема — первокурсники и программировать не умеют, и отформатировать текст в Word не в состоянии. Боюсь, это как раз следствие описанной вами неопределенности в задачах у педагогов.
Не объясняет «что такое пароль» и «почему не стоит прикреплять пароль на монитор стикером»
Про пароли таки все знают, а вот что такое «бэкап» и зачем он нужен — знает один из десяти (и только один из знающих — его делает, раз в месяц, в лучшем случае).
Уважаемые наши коллеги — школьные учителя!
Мы вас слезно просим — покажите детям клавиши Tab и Delete на клавиатурах.
Так как начинать обучение в ВУЗе с изучения клавиатуры компьютера — это уже чересчур…
(про Home / End /PageUp/PageDown — и речи нет, это уже высший пилотаж)
Прим. На клавиатуре смартфонов указанных клавиш нет, в этом -то и есть причина проблемы :)
я ментор и автор курсов по направлениям «Тестировщик-автоматизатор на Python» (QAP-тестирование)
Позвольте узнать, а какие именно части курса вы написали?
А ваш Питон умеет рисовать окошки?
Умеет, конечно.
Я так понимаю, что минус мне поставили за то, что я ответил без конкретики. Что ж, исправлюсь.
Уже в стандартной библиотеке есть модули turtle для черепашьей графики (если окошко нужно чтобы что-то нарисовать из программы) и Tkinter для рисования простых окошек.
Если брать сторонние библиотеки, то есть широкий выбор средств. Можно упомянуть Qt (интерфейсы, если нужно, рисуются мышкой в Qt Designer), Gtk (рисуем в Glade), wxWidgets (wxFormBuilder) и другие.
Так что ответ на вопрос, можно ли на Python сделать приложение с GUI, — да, можно. И даже мышкой интерфейс нарисовать можно.
Паскаль лишь только помогает преподавать алгоритмику, но писать современные программы на нём крайне сложно, и вот почему:
Я конечно сильно рискую, но «Платон мне друг, а истина дороже». Delphi это по сути Pascal. Все перечисленные минусы у него отсутствуют. При этом сейчас есть бесплатная версия эмбаркадеровской IDE. Да, Delphi не принято упоминать, он уже сто лет как типа мертв. Но по факту живее всех живых, развивается. И по тому же факту — это все тот же Pascal.
Тогда, если следовать вашим пунктам в сравнении (с большей частью которых я не согласен), то больше подойдет руби. Oh, wait, у вас же нет курсов по руби....
А зачем программирование юристам, продавцам, таксистам, бухгалтерам, учителям, автомеханикам, замам. начальника по обеспечению чего-то там? Понимаю, удобно показать детям программирование, чтобы они попробовали и подумали, не сделать ли это своей профессией, но, судя по всему, популяризаторы на ютубе и одноклассники справляются с этим на порядок лучше.
На мой взгляд, практичнее было бы обучать детей, как выше пишут, азам безопасности в сети, это как минимум. Да и в целом, тому, что такое компьютер (многие отрицают, что телефон в кармане по сути является компьютером); как в нём хранится информация; на чём она хранится, что из себя представляет, как она может пропасть; полезно ли делать проверку файловой системы или нужно её пропускать, если система начинает сама её делать; сколько копий важной информации делать и на каких носителях (нужно ли «заряжать» флешки?); что стоит хранить в облачном хранилище, а что лучше держать «под подушкой». Они же сейчас ничего этого не понимают, относятся с позиции или «это слишком сложно, я не смогу понять», или «оно само как-то работает, поверю в это». Рассказываешь человеку, что если ему крайне дороги его фотографии со свадьбы, то хранить их в гугл драйве не стоит, потому что его профиль в гугле однажды могут забанить, или сам этот драйв станет платным, или лимиты порежут, или какой-нибудь сбой уничтожит данные. В ответ обычно: «У меня сохранится ещё хуже, а там умные дяди, у них всё надёжно. Да и с чего бы меня забанили или что-то урезали?». Смысл в этих словах есть, но есть же компромисс: сделать и локальную копию тоже. Почему-то люди склонны безоговорочно доверять каким-то сторонним «профессионалам», которым они даже денег напрямую не платят.
Наболевшее, не про школьников, но эти люди вырастают из школьников.
А зачем программирование юристам, продавцам, таксистам, бухгалтерам, учителям, автомеханикам, замам. начальника по обеспечению чего-то там?
Так в школе школьники учатся, а не " юристы, продавцы, таксисты, бухгалтера, учителя, автомеханики, замы начальника по обеспечению чего-то там". Или человек в 3-м классе уже знает все плюсы и минусы профессий и твёрдо уверен в том, как строить своё будущее? Может именно простая программка написанная на уроке подарит нам будущего Торвальдса?
Наболевшее, не про школьников, но эти люди вырастают из школьников.
Из школьников которые учились лет так 15-20 назад. И их тоже учили водить мышкой по экрану, юзать ворд и прочему шлаку не имеющему к информатике никакого отношения. Про то где, как и что хранить современный восьмиклассник наверное побольше вас знает. И пользоваться техникой умеет чуть ли не с пелёнок. Может всё же дать шанс школьной информатике стать почвой для вовлечения молодёжи в отрасль и подготовки профессионалов, а не очередным совковым ОБЖ в этих ваших интернетах?
Про выбор профессии программиста я же упомянул, достаточно примера товарищей или ютуб-популяризаторов, а дальше школьник найдёт себе учебные материалы. Ну, пару уроков можно посвятить магии превращения букв в картинки на экране, чтобы заинтересовать.
Я знаю, что в школе ещё нет юристов, но если соблюлать баланс, тогда давайте преподавать школьникам юриспруденцию в том же объёме, в каком они изучают паскаль; и бухучёт; и объясним различия между разными типами сварок, и когда чем лучше варить; и устройство двигатля автомобиля покажем, и как его чинить.
Почему-то многие сетуют, что школьников учат языкам, которые не применимы в профессии, как будто их со школы готовят работать программистами. При таком подходе, я считаю, в других областях нужно давать им такой же набор знаний. То есть, если мы считаем, что каждый ребёнок должен уметь написать на питоне телеграм-бота, показывающего курс валют, тогда этот же ребёнок пусть умеет подать документы на получение налогового вычета или собрать скелет коровы из костей. Мне не понятно, почему у программирования такое преимущество. Почему человек со школы должен уметь писать программы, а узнавать об этапах развития вселенной и роли тёмного вещества в формировании галактик приходится из ютуб-лекций Верходанова и Попова?
Но может статься, он ещё не всюду.
Из более простого: не каждый школьник понимает отличие оперативной памяти от объёма диска/SSD, для них это всё память, они её часто путают или даже не знают, что их две. То, что SSD называют диском, это я уже привык.
Однако если мы вернёмся в прежние годы, то я буквально повторю ваш аргумент: «не каждый школьник понимает отличие АЛУ от ППЗУ». :-)
То, что SSD называют диском, это я уже привык.А как его называть? Точнее, как называть совокупность всех ПЗУ — HDD, SSD, NAND, SD, флешки и т.д. чтобы все поняли?
Ну, корректное название — "внешняя память". Но "диск" проще.
Ещё встречается термин накопитель.
Ну, видимо потому что хранимые на HDD и SSD данные нельзя загрузить в регистр простой командой mov.
Как это нельзя? А Intel Optane? Это накопитель, но работа с ним осуществляется через физическое адресное пространство, а не через протокол типа SATA.
Ну или просто отображение файлов в виртуальное адресное пространство процесса.
А зачем программирование юристам, продавцам, таксистам, бухгалтерам, учителям, автомеханикам, замам. начальника по обеспечению чего-то там?
Внезапно, в жизни простому человеку иногда тоже приходится попрограммировать.
Не на каком-то крутомодном языке с навороченным фреймворком в супер-пупер среде, а на самом бытовом уровне, и не компьютер какой-нибудь окучивать, а свою жизнь. Ведь на базовом уровне программирование - это практическое применение навыков планирования. Так что лишним не будет.
Кроме того, есть ненулевой шанс, что попадется какое-то особо умное бытовое устройство, которое не только включать-выключать можно. Если учителю удастся вложить в голову ученика какие-то базовые навыки, то вполне возможно, что пациент без проблем справится.
Я бы не сказал что я знаю программирование, но умение кое-как ориентироваться в С# и проекция этих знаний на другие языки программирования в различных программах помогало мне в кое-каких вопросах облегчения своей жизни и работы. Мы живем в компьютерном мире если вы не заметили. Будь ты хоть уборщик, ты будешь пользоваться компьютером, а значит тебе может пригодится программирование.
Пользоваться компьютером можно без программировпния. Большинство так и делают. Лучше бы этому и учили. А то, когда программист выделяет слово мышкой, таща её от начала слова к концу, это выглядит дико. Может, он так освобождает время на подумать, но скорее всего, не знает про двойной клик или ctrl+shift+вправо.
Я недавно учил программированию с нуля. Бейсик — хорош. Потому что он скуден, а нём почти ничего не сделать и он заставляет сфокусироваться на оставшемся: номера строк (МЕСТО, КОТОРОЕ ИСПОЛНЯЕТСЯ), перменные (МЕСТО, В КОТОРОМ ХРАНИТСЯ), управление control flow в явном виде (GOTO 20).
В целом, после освоения бейсика надо сразу переходить на что-то другое. Это во-первых учит человека менять языки программирования on demand, во-вторых даёт ощущение "что именно хорошо".
Вообще же, очень хочется различать три разные области:
- математическую дисциплину (алгебра)
- навык программирования (уроки труда)
- опыт навигации в мире современного ПО и общие представления о компьютерах (природоведение).
Простота Python кажется только при взгляде снаружи. По факту же под капотом происходит куча всего сложного, и всё это надо понимать, чтобы уметь программировать на Python. А чтобы всё это понять, надо изучать более низкоуровневые языки: C++, C, Assembler, типы данных и т.д.
В целом согласен только с пунктом про слабую графическую часть. Хорошая мотивация для изучения программирования — это задачи, имеющие хоть малейшие перспективы реального применения. В этом плане связка Python + Jupyter Notebook выглядит весьма в выигрышной позиции.
По факту же под капотом происходит куча всего сложного, и всё это надо понимать, чтобы уметь программировать на Python.
Строго говоря, в современном мире один из признаков хорошего, т. е. удобного ЯП - избавление человека от необходимости "заглядывать под капот" и разбираться с тем, что там происходит. Другое дело, что питоновские сокращения типа a,b=b,a совершенно неочевидны. Гипотетическая функция replace(a,b) ровно настолько же "не под капотом", но при этом смысл её в коде программы ясен, у отличие от первой конструкции. И, кстати, она же имеет преимущество за счёт краткости перед паскалевской структурой. Вот на таких принципах ЯП для обучения (где на все часто используемые действия есть стандартная очевидно названная функция) был бы отличен.
Строго говоря, в современном мире один из признаков хорошего, т. е. удобного ЯП — избавление человека от необходимости "заглядывать под капот" и разбираться с тем, что там происходит.
Зато появляются другие приколы, про которые тоже много пишут, например:
https://habr.com/ru/company/mailru/blog/337364/
Кривая обучения Python, на самом деле, более крутая, чем C/Pascal. Объекты, лямбды и прочие удобности быстро взорвут мозг человеку, который вообще не имеет представления о программировании.
Аналогия: сразу начать использовать калькулятор без получения навыков устного счёта и вычислений в столбик на бумажке.
Язык программирования это лишь инструмент, упор нужно делать на фундаментальных вещах компьютерных наук
Синтаксический сахар и динамическая типизация вредны во время изучения основ программирования т.к. многое остается нераскрытым
Понять принцип работы цикла на языке Си будет гораздо проще, чем на Python
Python — можно сказать, что делай вот это для каждого x из list, но понять как это происходит трудно, потому что не видишь, что под капотом
for x in list:
print(x)
C — здесь четко можно пройтись по каждому шагу.
- Объявили счетчик для цикла
- Проверили условие
- Выполнили тело цикла
- Увеличили счетчик
- Проверили условие.
Алгоритм можно расписать на бумаге. Так подробно на Python будет трудно объяснить
for (int i = 0; i < list_size; i++)
{
printf("%i\n", list[i]);
}
Также стало интересно чем измеряется низкий порог входа? В названии первого пункта делается на этом упор, но не объясняется как и почему Python имеет более низкий порог входа чем Pascal или Basic
Теперь про легкость языка и порог входа расскажу со своей колокольни
На своем опыте скажу, что начиная с 7 класса мы учили C++. Но в начале нам не давали знать о таких вещах как указатели, ссылки, классы и тд. Можно сказать, что писали на Си, только для ввода-вывода использовали cin/cout. Нам просто показали как вводить с консоли данные и как выводить их туда. И могу сказать, что сложность въезжания в программирования не была высокой
C — здесь четко можно пройтись по каждому шагу.
Ну, Си все же более практический язык, в нем много «странных» моментов, обусловленных больше историей, чем строгим замыслом. То же неявное приведение типов или форматная строка в printf. Да и с указателями там приходится столкнуться гораздо раньше. В общем, не для школы он.
А вот ассемблер вполне бы подошел. Только не х86, естественно, а какой-нибудь контроллерный.
У способа с XOR есть неприятная особенность — он всё испортит, если нужно обменять значение переменной с самой собой (такое встречается в алгоритмах). Да и оптимизировать надо то, что тормозит. Вряд ли операция обмена будет узким местом в типичной программе
Я не знаю языка, который бы не скрывал внутренние механизмы процессора. Даже язык ассемблера скрывает от нас, например, наличие в процессоре конвейера, кэшей и тому подобного.
В случае со swap оптимизировать не надо в любом случае — это задача компилятора знать особенности всех платформ и скорости выполнения инструкций (и особенности конвейера и кеша они тоже учитывают), а также проследить, что за a и b передаются в функцию, и на основании этого выдать оптимальный код.
Но здесь возникает проблема определённости, так как мы перестаём понимать сложность алгоритма, и однажы оказывается, что размещение в памяти 1 млрд+1 букв занимает на 0.2 сек меньше, чем 1 млрд просто.
Работу swap легко проверить — https://ideone.com/WEyN26. Как видите, для двух переменных работает, а для одной уже нет.
Если строго следовать написанному мной алгоритму, swap работает, а версия 3 даже без каких либо xor-ов.
ideone.com/NeRdWe
А, понял, о чём вы. Я просто не раз встречал любителей обменивать значения именно так, как в моём примере. Ассемблерные вставки они, разумеется, не делают.
На онлайн компиляторе не смог повторить, но локальный gcc однозначно лучше компилирует перестановку через временную переменную (swap4), чем xor варианты:
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);
}
}
Становится вот таким:
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 (всё-таки интересно, откуда берётся столько инструкций)?
Да, конечно:
#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.
sizeof(char)
всегда равен единице даже если у char
размер больше восьми бит. Впрочем, в коде смещение умножается на sizeof(T)
так что всё в порядке.
template <typename T>
и template <class T>
— это одно и то же. Там нет ограничения, что типы обязательно встроенные.
Ограничение в 16384 нужно было, видимо, чтоб можно было адресовать байты изображения 16384 × 16384 с 32 битами на пиксель с помощью 32-битного целого. Правда,там в коде везде int
используется
Выравнивание в 32 бита может быть нужно, например, для векторизации. Например, AVX требует выравнивания в 32 байта.
Достаточно просто, даже сказал бы очевидно, как переписать то же самое, чтобы скомпилированный код был таким же коротким,
И как же? Компилятор применил автовекторизацию и разворот цикла. Если отключить эти оптимизации, то код, понятное дело, станет компактнее.
Обычно берут что-то типа 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
всё же некоторые возможности процессора пропадают безвозвратно, что бывает обидно. Например, 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
Ещё есть шикарная книга Голдстейн. Классическая механика. Про ПНМ там мало, зато все остальное очень интересно описывается, с разбором обалденных задач и постоянными аналогиями между задачами классической механики и других областей физики. Типа а вот есть у нас радиосхема, смешанная с механической системой (диэлектрик между обкладками конденсоторов пружинит, механически колеблется и это влияет на токи в цепи), щас придумаем чисто механическую систему, состояние которой описывается аналогичными уравнениями, решим задачу по механике и тем самым получим решение уравнений токов и зарядов в электрической цепи.
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.
А, ну и касательно марка - ему до моего уровня как программисту расти и расти, так что прошу принять все мои утверждения за непреложную истину
>Но подозреваю, что постоянные взломы и утечки происходят не из-за кода, написанного Дейкстрой или под его руковоством.
Читайте внимательнее изначальное моё сообщение. Я не говорю, что именно из-за бородатого кода Дейкстры мы имеем утечки. Я говорю, что из-за заложенной архитектуры, начиная с языков программирования и заканчивая архитектурой «современных» ОС — мы имеем сегодня то, что имеем. Объяснять это долго и мне лень.
«терять для этого время» — действительно, просто покажите ваш код, где вы выбрали лучший язык, архитектуру и методологию разработки. А книги Дейкстры у меня итак уже есть.
Я говорю, что из-за заложенной архитектуры, начиная с языков программирования и заканчивая архитектурой «современных» ОС — мы имеем сегодня то, что имеем.
Утечки, как и разруха, в головах, а не в чем-то еще, в частности, не в языках программирования, и не в старых концепциях.
Более того, именно сейчас утечек стало больше, несмотря на все современные достижения науки и техники. И все потому, что все делается тяп-ляп в режиме минимальных затрат. Кто-то маршрутизатор недонастроил, оставив админку торчать голой задницей в сеть, кто-то просто решил спереть данные, которые ему доступны, а служба безопасности вообще не озаботилась мерами контроля, что позволяет этому кому-то особенно не мучиться, а просто скинуть данные на флэшку и вынести. Кто-то вовремя софт не обновил, а кто-то поторопился обновлять на "боевую" систему.
В программном обеспечении то же самое. Проверить правильность входных данных? Да зачем? И так сойдет. Зато выложить в открытый доступ инженерный пароль (считай бэкдор) или ключ какой-нибудь секретный - это запросто.
Раньше еще какое-то доверие друг другу было в программистской среде. Особо не наглели. И протоколами не шифрованными обходились как-то без авторизации. А теперь шифрование на шифровании, а толку ноль. И чем дальше, тем меньше можно кому-то доверять свои данные. Они не просто утекут. Их сознательно уведут и продадут, причем не хакеры какие, а сами производители программ и держатели сайтов ("как же тогда финансировать бесплатные сервисы").
"Если вы сделаете систему, которой сможет пользоваться даже дурак, только дурак захочет ею пользоваться."
ЯП, полностью учитывающий человеческий фактор не сможет позволить создавать высокоэффективные программы, учитывающие особенности железа (да, многое упирается в производительность железа, которую никак не получается увеличивать бесконечно за вменяемые средства, и потому приходится порой выгрызать "мелочи", оптимизируя код). Потому даже в расте сделали возможность делать unsafe.
ОС, полностью учитывающей человеческий фактор, будет просто невозможно пользоваться иначе, кроме как для просмотра "котиков" в сети (да и то под вопросом), поскольку она будет блокировать каждое опасное действие, даже если это действие реально нужно владельцу, и он понимает все риски. Если же оставить возможность владельцу проводить опасные действия, то это будет уязвимость, и достаточно быстро простые обыватели получат рецепт "сделать хорошо", который сделает им плохо.
Но все это меркнет перед требованиями коммерции, которые нашем мире никак не получится игнорировать. А требования эти таковы: быстро (пусть даже в ущерб качеству и безопасности), дешево (с теми же побочками) и до конца поддерживать совместимость со старым, потому что мировая экономика не готова сделать сразу скачок на новое. Если первые два момента гарантируют нам ошибки и уязвимости в любом коде, в том числе архитектурные, в том числе и в ОС с ЯП, "учитывающих человеческий фактор", то второй нам гарантирует длительное сохранение принципиальных старых архитектурных ошибок и уязвимостей и консервирование на долгие годы вперед новых, полученных благодаря первым пунктам. И Дейкстра тут точно ни при чем. Там "только бизнес".
Так что нет счастья в жизни, и не будет.
В школе не даётся ничего для профессиональной работы. Ни один школьный предмет не позволяет, имея аттестат, выходить на профессиональную работу. По любому направлению надо дополнительно учиться.
Раньше была такая штука, как УПК, где школьнику за последние два года обучения давали реальную профессию.
И вы сами, со своей позиции, опровергаете мнение Ершова. Вы говорите, что «не нужно всех учить программированию».
Не знаю, правильная ли позиция Ершова, поскольку не представляю себе, на каком уровне он видел эту "всеобщую компьютерную грамотность", но преподавать программирование в школе нужно. Пусть на самом примитивном уровне, но школьника следует ознакомить хотя бы с самыми базовыми принципами построения программ. Не научить его программировать на "подставить любое название языка", а именно вбить в голову самые базовые основы.
А вот профессиональное программирование в обычной школе на уровне стандартной программы как раз не нужно. Это дело профессионального образования, спецшкол с "углубленным изучением" и дополнительных кружков для тех, кому интересно.
Я о такой системе речи не вёл. Я лишь говорил о системе, которая не допускает ошибок пользователя, исправляет их.
>Потому даже в расте сделали возможность делать unsafe
Ваш ржавый это равносильно в современном истребителе с мартышкой примотать изолентой хвостовые рули.
>меркнет перед требованиями коммерции
>Так что нет счастья в жизни, и не будет.
С такими мыслями мы бы до сих пор сидели в пещере питаясь падалью. Но нет, выводим низкоорбительные спутники на многоразовых ракетах. Внедряем электромобили и автопилоты. Хорошо, что есть люди с противоположными вам мыслями. Жаль только, что их очень мало. Буквально один человек на ваших 9 миллиардов или сколько вас щас? Чуть бы побольше и летали бы уже к звёздам.
С такими мыслями мы бы до сих пор сидели в пещере питаясь падалью. Но нет, выводим низкоорбительные спутники на многоразовых ракетах. Внедряем электромобили и автопилоты.
не вижу связи всеобщего счастья с достижениями науки и техники.
Увы, но какое бы изобретение, какая научная идея не появляются, но результат один и тот же: помимо очевидной пользы вылезает огромный ворох проблем. И причем основная проблема не в науке и технике, а в социальной жизни человечества.
Вот выводим низкоорбитальные спутники на многоразовых ракетах (кстати, пока совершенно не многоразовых, многоразовыми являются лишь отдельные части, а не ракеты в целом), а проблемы совместного использования космического пространства как решались со скрипом, так и решаются. Вот немного времени прошло, как конкуренты SpaceX в суде добивались отмены контракта.
А уж у электромобилей с автопилотами проблем, начиная от законодательных, заканчивая дырами в безопасности самих электромобилей с автопилотами.
спасибо за интересную статью, хочется по-возможности посодействовать, но не понимаю главного — где будут работать ваши ученики?
О, Паскаль :) Смотрел на примеры кода, аж олдскулы свело, в середине нулевых в школе изучал, как и фортран. Изучение старого ЯП пригодилось в жизни - на нынешней работе иногда надо писать код на Фортране (в научной деятельности все еще используется, в частности он удобен для автоматизации форматного ввода при подготовке определенных входных файлов программ).
Я не считаю лишним изучение офисных программ в школе, т.к. где и когда их еще представится возможность изучить? Я помню, что основы вроде Ctrl-C/Ctrl-X, Ctrl-V, набор и форматирование текста и таблиц я изучил именно в школьной программе. А многие мои одноклассники уже тогда не осиливали, т к строгого контроля за выполнением заданий не было. Я до сих пор встречаю ровесников (~25+), которые не знают, с какой стороны к компьютеру подойти, и это не деревенские жители.
a = [0] * n
Для незнакомого с Питоном — это самый загадочный код в статье. :)
Целая часть же по-другому пишется, a = ⌊ 0 ⌋ × n
.
Ух как агдой запахло...
Первый:
[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 сразу дает понимание о том, что команды выполняются последовательно. Во-вторых минимум синтаксических условностей сразу дает возможность попытаться что-то написать работающее. А после того как это заработает, собственно базовая цель школьной информатики уже и достигнута.
Но ни Паскаль, ни Бейсик, ни блок-схемы сейчас не нужны в профессиональном программировании — разработческая мысль давно шагнула вперёд.
Извините, затронуло за больное.
- Блок-схемы не нужны? Хорошо, опишите тогда алгоритм процесса инвентаризации для работника склада на Python.
- Бэйсик не нужен? для больших корпораций всё, что вы сможете навоять на Python, скорее всего было уже реализовано в Microsoft Office 2000. Причем, многие моменты программирования автоматизации под MS Office куда более наглядные, т.к. процесс реализации проходит с использованием мощного GUI. Ах, ну да, и кому вообще помог этот Excel в XXI веке когда есть Python/JSON/XSLT ?!
- Ладно там Си сложный, но Паскаль то чем вам не угодил? У меня даже на современном смартфоне программы из TP7 легко запускаются (как консольные так и графические). А так же есть модули к Паскалю с удобным API для автоматизации бытовых задач смартфона (отправка/прием СМС, управление уведомлениями и напоминаниями, мигание фонариком и ИК-портом, чтение показаний датчиков, отслеживание событий, TTS/STT), и всё это с возможностью подключения базового интерфейса из диалоговых окон с несложными формами или меню выбора. Компилирование и Lint синтаксиса с авто-дополнением свойств объектов прямо на смартфоне. Чем это Паскаль не современный? Где он отстал?
1. Простой синтаксис и низкий порог входа.
Python вместо знаков препинания или ключевых слов (в Паскале такими словами являются «begin» и «end») использует отступы для обозначения выполнения блока.
1:0 в пользу Паскаля. Все действия явные и однозначные.
2. Динамическая типизация.
Python обладает динамической типизацией.
2:0 в пользу Паскаля. Всегда понятно что хранится в переменной и что с ней можно делать. Чтобы изменить тип надо приложить явные усилия. Даже real -> integer.
3. Лаконичный и изящный код.3:0 в пользу Паскаля. За одной строкой Питоньего кода содержится тонна неочевидной магии. Как можно программировать, если нельзя угадать что делает каждый оператор?
Одно из очевидных достоинств языка. Python — компактность программного кода.
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, ни Питон не дотягивают.
Конкретно это вообще никак не связано с языком программирования.
И снова мимо. Это не особенность DOS, а legacy-режим работы видеоадаптера в реальном режиме. Вызываете INT 10h с параметром AX = 13h, после чего можете писать напрямую в кусок видеопамяти, отображаемый на адреса 0xA0000-0xAFFFF.
Правильное прилагательное здесь не "удобный", а "низкоуровневый". Во многих графических библиотеках так вообще работа на уровне пикселей убрана из политических соображений (ибо dpi scaling).
Вызываете INT 10h
int это прерывание. Кто его обрабатывает?
Правильное прилагательное здесь не «удобный», а «низкоуровневый».Да, низкоуровневый тоже. Это не отменяет удобства.
Во многих графических библиотеках так вообще работа на уровне пикселей убрана из политических соображений (ибо dpi scaling).А для спрайтовой графики необходима именно пиксельная сетка.
Для понимания принципов растеризации необходим прямой доступ к пикселям. Для большого количества базовых операций с графикой необходим прямой доступ к пикселям.
Конечно, это не «базовый школьный уровень».
int это прерывание. Кто его обрабатывает?
BIOS его обрабатывает
Да, низкоуровневый тоже. Это не отменяет удобства.
Не вижу в чём тут особое удобство заключается.
Для понимания принципов растеризации необходим прямой доступ к пикселям.
Прямой доступ к пикселям можно получить в большинстве графических библиотек, вся разница — в том, что это будет какой-нибудь bitmap или текстура, которую ещё нужно будет на экран отдельно вывести.
BIOS его обрабатываетХорошо. Особенность низкоуровневого программирования.
Не вижу в чём тут особое удобство заключается.Именно в том, что все прозрачно делается, без волшебных функций рисования линий или многоугольников.
Прямой доступ к пикселям можно получить в большинстве графических библиотек, вся разница — в том, что это будет какой-нибудь bitmap или текстура, которую ещё нужно будет на экран отдельно вывести.Ну какой же он прямой, если нужно сначала искусственную поверхность создать, потом на нее что-то вывести, потом вызвать функцию, которая саму поверхность отрисует на экране.
Именно в том, что все прозрачно делается, без волшебных функций рисования линий или многоугольников.
Вы как-то странно понимаете удобство. Так-то "волшебные" функции намного удобнее прямой работы с бинарными данными.
Ну какой же он прямой, если нужно сначала искусственную поверхность создать, потом на нее что-то вывести, потом вызвать функцию, которая саму поверхность отрисует на экране.
Но при этом вы можете сколько угодно практиковаться в манипуляциях пикселями. И если вам сложно написать пару строчек, которые зафиксируют все ваши изменения — я не представляю. как вы вообще хоть какой-то нетривиальный алгоритм напишете.
Вы как-то странно понимаете удобство. Так-то «волшебные» функции намного удобнее прямой работы с бинарными данными.А если говорить не про удобство изучения, а про удобство использования, проще сразу использовать OpenGL или какой-нибудь Unity. Вот только понимания работы от этого не прибавится.
я не представляю. как вы вообще хоть какой-то нетривиальный алгоритм напишете.Руками и напишу. Именно потому что в свое время попрактиковался с ручным управлением пикселями. А вот напишете ли вы?
Что-то я в исходниках по вашей ссылке не вижу прямой работы с пикселями видеопамяти. Вы там рисуете на промежуточном буфере, а потом делаете glSwapBuffers через DMA.
Вы там рисуете на промежуточном буфере, а потом делаете glSwapBuffers через DMA.Сдается мне, вы невнимательно читали. Работа идет с отдельными пикселями одной строки, потому что у контроллера на большее не хватает памяти, а дисплей не позволяет записанное читать обратно. Учитывая, что ни в дисплее, ни в контроллере нет графической библиотеки для рисования примитивов, как бы иначе удалось подобное сделать? Ну и вы напрасно считаете именно эту связку подходящей для начинающих в области графики — там лучше именно DOS с соответствующим режимом. Ну либо писать специальную библиотеку, которая тоже самое эмулирует через обычные массивы.
А вы ожидали пример для DOS и режима 320х200х256?
А разве не об этом шла речь в ветке комментариев?
А разве не об этом шла речь в ветке комментариев?А вы попробуйте ее прочитать. Я даже помогу вам и выделю ключевые слова.
где можно было переключиться в графический режим 320х200, 256 цветов и рисовать просто записью в память. Вот это для обучения полезно!
Но при этом вы можете сколько угодно практиковаться в манипуляциях пикселями. И если вам сложно написать пару строчек, которые зафиксируют все ваши изменения — я не представляю. как вы вообще хоть какой-то нетривиальный алгоритм напишете.
Руками и напишу. Именно потому что в свое время попрактиковался с ручным управлением пикселями. А вот напишете ли вы?
Для обучения прямой доступ крайне полезен. После этого можно вытворять фокусы, с прямым доступом не связанные.
Для обучения прямой доступ крайне полезен
Зависит от этапа обучения, и от организации обучения. Обучение может быть организовано:
— и сверху вниз = начинаем с абстракций, а ассемблер и прочее в конце (если вообще будет)
— и снизу вверх = начинаем с машины Тьюринга, а ООП и прочее в конце.
А вот спуститься на низкий уровень для Питона проблема.
Именно в том, что все прозрачно делается, без волшебных функций рисования линий или многоугольников.
Тут я согласен: самостоятельная реализация рисования графических примитивов — отличная учебная задача.
Ну какой же он прямой, если нужно сначала искусственную поверхность создать, потом на нее что-то вывести, потом вызвать функцию, которая саму поверхность отрисует на экране.
Когда вы запускаете DOSBox и рисуете в нём, происходит ровным счётом то же самое. Вы не рисуете на экране, вы работаете со внутреннем буфером DOSBox, который он, используя функции операционной системы, отрисовывает на экране.
Что не так с современным преподаванием информатики