Re[2]: Какой язык программирования нужно изучать в школе
От: AlexRK  
Дата: 10.09.13 17:25
Оценка: +1
Здравствуйте, velkin, Вы писали:

V>Basic, Pascal, Delphi (производный от Object Pascal)

V>Не вижу преимуществ изучения в сравнении с Си и С++. Взять хотя бы C++, разве он сложнее, чем Pascal, если использовать его на школьном уровне? Всё тоже самое, только синтаксис другой.

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

V>С или C++

V>Это классика, которая не потеряла актуальность спустя много лет.

Начинать обучение с этой классики точно не стоит.

V>Python, Java

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

Пожалуй, да.
Re[3]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.09.13 05:45
Оценка:
Здравствуйте, DmitrySpb79, Вы писали:

V>>Если бы я учил детей, то в нынешних реалиях поставил бы Qt Creator с MinGW или GCC в зависимости от ОС, и давал бы им простейшие задания в процедурном стиле для проектов консольных приложений.

DS>Не нужны никому сейчас консольные приложения. Hint: 21й век на дворе Ученик должен чувствовать практическую значимость своих уроков, иначе это будет некая абстракция, которая будет тут же забыта.

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

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

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

DS>Среда разработки должна позволять ученику быстро и легко сделать полноценную программу, которую можно выложить в Инете, показать друзьям, использовать для каких-то задач и пр. Сейчас дети в 6-7 классе изучают Ворд и Фотошоп, и думаю, освоить простейшие операции с контролами в IDE труда не составит. А уж дальше, накидали формочку, повесили обработчик, и пишем те же любимые начинающими FOR и GOTO


Ворд и Фотошоп — замечательно, но откуда идея, что это поможет создать программу? Для программы нужна в первую очередь идея и желание реализации, а названные инструменты слишком склоняют наплевать на программу, зато написать фанфик или сделать демотиватор из понравившейся картинки;(
Для написания программы надо очистить хотя бы ближнее поле сознания от подобных раздражителей.
The God is real, unless declared integer.
Re[2]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.09.13 06:10
Оценка:
Здравствуйте, velkin, Вы писали:

V>Basic, Pascal, Delphi (производный от Object Pascal)

V>Не вижу преимуществ изучения в сравнении с Си и С++. Взять хотя бы C++, разве он сложнее, чем Pascal, если использовать его на школьном уровне? Всё тоже самое, только синтаксис другой.

Преимущества колоссальные за счёт именно того, что у средства нет неожиданных побочных эффектов, которые надо постоянно держать в сознании при программировании на C/C++. Берёшь любую реальную программу, и начинается: в Паскале, например, for i:=1 to len(a); в Си — for(i=1; i<=len(a); i++) — что такое i++? Почему оно тут работает? Когда начинаешь объяснять, что тут побочный эффект выражения... что это ещё за побочный эффект, и как можно вообще работать, например, с присвоениями, когда у них масса побочных эффектов, за которыми ещё надо уследить? А необходимость break в switch? А Duff's device? А ужасные средства работы со строками (в Си)? А препроцессор? А почему нельзя записать число как 0020? Чтобы понять Си, надо преодолеть одним махом (от начала обучения до формирования целостной картины) барьер, который значительно выше, чем для Паскаля или аналога, и если кому-то не хватает сил или времени его преодолеть — язык так и не будет освоен. У меня перед глазами много примеров, как люди не могли пройти этот барьер, и не было адекватного учителя, который бы провёл их медленно и аккуратно, как слепых котят. Да ассемблеры и то проще — там у каждого действия свой чётко расписанный документированный набор эффектов, и если кто-то вообще смирился с тем, что надо всё разжёвывать на уровне регистров — он это пройдёт.

V>С или C++

V>Это классика, которая не потеряла актуальность спустя много лет.

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

Я тоже освоил Си влёгкую (хотя мне, наверно, помог присутствовавший уже тогда фортраново-ассемблерный бэкграунд). Но сейчас дочка (12 лет) развлекается задачами с acmp.ru и аналогов, а жена ей помогает. У обеих минимальные проблемы с Питоном, но в случае Си они каждый раз спрашивают меня, как записать простой fscanf для ввода значения из файла, понимают и... забывают до следующего раза. Слишком сложные концепции не держатся долго в памяти, а для обычных задач им и эти указатели и особенности работы с ними, и особенно правила типа "а тут не может быть ничего меньше int! да, я знаю, что в аналоге применён short, но вам нужна ещё конверсия" — то, что вылетает из памяти сразу после сдачи. И это только один ближайший пример перед глазами.

V>Python, Java

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

Именно Python (не Java!!!) — один из лучших языков именно для обучения прикладного программиста. Простая структура (никакой тебе обязанности делать какие-то непонятные классы). Предельно высокоуровневые средства всех видов, от целых чисел (до 2**1016!!) до строк (никаких мучений с буферами!), простые функции и методы получить что надо. Ненавязчивое вхождение в ООП, когда постепенно раскрывается, что стоит "внутри" за каким-нибудь "{0} {1}".format(x, y), даже без необходимости писать своё (просто, стиль, когда создаётся объект, чем бы он ни был, а дальше используется дёрганием методов, становится очевидным). Удобные структуры данных для основных применений, нет необходимости лезть внутрь хитрых алгоритмов. Простой синтаксис без излишеств (в отличие от Perl или Java). Предельно логичная работа >99% средств, соответствующая стандартным ожиданиям (в отличие, например, от PHP, JavaScript, Perl).

V>Если бы я учил детей, то в нынешних реалиях поставил бы Qt Creator с MinGW или GCC в зависимости от ОС, и давал бы им простейшие задания в процедурном стиле для проектов консольных приложений.


Что нужны консольные для такого обучения, по крайней мере большинству — я согласен (см. предыдущее по времени сообщение в эту тему). А вот Си — в дальний лес, к самому старому и плешивому лешему.

V> Первые мои языки это Basic, Pascal, с них начинал я сам ещё в далёкие школьные годы, а было это в прошлом тысячелетии. Но в реальной жизни для тех, кто зарабатывает программированием деньги они не нужны. И не очень приятно натыкаться на ограничения в связи с отсутствием нужных библиотек и т.д.


В качественном учебном комплекте (а не собранном на коленке учителем в свободное время) не будет проблем с библиотеками.
The God is real, unless declared integer.
Re[3]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.09.13 06:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

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

Ну, таки анатомия в нынешнем виде, когда подробно изучают скелет и потом галопом по Европам — всё остальное, таки имеет мало смысла. Её надо изучать комплексно и на живых примерах самих же учеников (с практическим тестом в виде массажа спины одноклассника, скрючившегося от сумки, перегруженной учебниками). Утрирую, конечно, но направление должно быть где-то такое: основное — понимание собственного тела в здоровой обстановке.
Но это же надо толкового учителя (не за 200$/месяц), оборудование (хотя бы где переодеться и искупаться)...
The God is real, unless declared integer.
Re[8]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.09.13 06:25
Оценка:
Здравствуйте, Grizzli, Вы писали:

G>И вот опять же, ты очень правильно написал: сканворды, и кроссворды. Т.е. нет развития и любознательности. есть скука, и желание себя развлечь.


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

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


Потому что есть эмоциональная реакция на силовое привитие. Но относится она только к тому материалу, который в школе. География на уровне расположения огородов в селе или поиска оптимальных автобусных маршрутов между базарами может быть освоена домохозяйкой лучше, чем коллективом профессоров. Аналогично с историей на уровне семейного альбома или "а этот балкон построил в 69-м году дед соседа Васи, который в прошлом году задавил собаку". Чем это не история?
The God is real, unless declared integer.
Re[2]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.09.13 06:29
Оценка:
Здравствуйте, iLikeCookies, Вы писали:

А>>Эпический ср^H^Hдискуссия на хабре: http://habrahabr.ru/blogs/study/136272/

LC>Язык программирования вторичен. В школе не надо изучать ЯП (имеется ввиду досконально, зубрить стандарт С++, например). Нужно научить детей решать практические задачи и научить мыслить как computer scientist.

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

LC>А что касается ЯП, то я думаю, что Python отлично подходит. Код на нем очень похож на псевдокод. Логичен и последователен. На нем можно демонстрировать простые алгоритмы, функции, ООП и даже ФП.


+100
The God is real, unless declared integer.
Re: Какой язык программирования нужно изучать в школе
От: elmal  
Дата: 11.09.13 06:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Эпический ср^H^Hдискуссия на хабре: http://habrahabr.ru/blogs/study/136272/

Мое ИМХО:
1) Первый язык программирования должен быть интерактивным. То есть интерпретатором. Набрал команду, увидел результат. ИМХО к компиляторам нужно переходить позднее;
2) При этом должна обеспечиваться достаточная гибкость и сам язык должен при необходимости поддерживать максимум современных конструкций.

Теперь смотрим.

Всякие бейсики 80-х годов, это отстой еще тот. Гибкости никакой, синтаксис ужасен, смотрится хуже ассемблера. Мне в свое время на ассемблере было легче писать, чем на этом бейсике.
Лисп и Scheme — не очень приятный синтаксис со скобочками. Пролог — слишком сложно для первого языка, сложно понять как это все внутри работает, да и даже при понимании от некоторых задач голову сломаешь. Лого — в принципе весьма неплохой интересный вариант.

Мое ИМХО — лого и питон главные кандидаты. Из компилируемых можно в принципе VB взять позже этих языков, по той причине, что они встроены в офис и возможно кому придется с ними потом работать в жизни.
Re[2]: Какой язык программирования нужно изучать в школе
От: elmal  
Дата: 11.09.13 06:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В рамках общей програмы, древнию асемблероподобоную версию Бейсика, ну там где GOTO 110, GOSUB 2020 и т.д. и т.п.

Это называется издевательство над школьниками. Типа сами жрали кактус в свое время — пусть детишки тоже помучаются, чтоб им жизнь медом не казалась.
Re: Какой язык программирования нужно изучать в школе
От: jeeist  
Дата: 11.09.13 10:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Эпический ср^H^Hдискуссия на хабре: http://habrahabr.ru/blogs/study/136272/


Как-то сразу возникает вопрос — а какой процент способен понять 1) программирование с рекурсией (если не ошибаюсь, кто-то из гуру рассуждал на эту тему, что бОльшая часть программистов не способна) 2) "простое" производственное программирование 3) какой-то скриптинг 4) вообще что-то ?

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

И даже если 50% способны понять, то что делать остальным?

Так что не совсем ясно, нужно ли вообще предподавать, а может лучше финансирование направить на какие-то факультативы, курсы, кружки?
Re[2]: Какой язык программирования нужно изучать в школе
От: jeeist  
Дата: 11.09.13 10:22
Оценка:
Лучше тогда просто какой-то образ мышления — например, то, чего не хватает у пенсионерок, чтобы разобраться в возможностях мобильного телефона.

Или как обращаться с ИТ-шником, как понимать его ход мыслей, как дать задание так, чтобы программист понял и при этом было решено бизнес-задание

Короче, обучать профессии системного и прочего аналитика.
Re[3]: Какой язык программирования нужно изучать в школе
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 11.09.13 22:46
Оценка:
Здравствуйте, netch80, Вы писали:

N>Преимущества колоссальные за счёт именно того, что у средства нет неожиданных побочных эффектов, которые надо постоянно держать в сознании при программировании на C/C++. Берёшь любую реальную программу, и начинается: в Паскале, например, for i:=1 to len(a); в Си — for(i=1; i<=len(a); i++) — что такое i++? Почему оно тут работает? Когда начинаешь объяснять, что тут побочный эффект выражения... что это ещё за побочный эффект, и как можно вообще работать, например, с присвоениями, когда у них масса побочных эффектов, за которыми ещё надо уследить? А необходимость break в switch? А Duff's device? А ужасные средства работы со строками (в Си)? А препроцессор? А почему нельзя записать число как 0020? Чтобы понять Си, надо преодолеть одним махом (от начала обучения до формирования целостной картины) барьер, который значительно выше, чем для Паскаля или аналога, и если кому-то не хватает сил или времени его преодолеть — язык так и не будет освоен. У меня перед глазами много примеров, как люди не могли пройти этот барьер, и не было адекватного учителя, который бы провёл их медленно и аккуратно, как слепых котят. Да ассемблеры и то проще — там у каждого действия свой чётко расписанный документированный набор эффектов, и если кто-то вообще смирился с тем, что надо всё разжёвывать на уровне регистров — он это пройдёт.


Давайте возьмём для примера цикл for. Не заглядывая в книжки я бы объяснил это так:

Существуют основные виды циклов:
1. for — цикл со счётчиком
2. while — цикл с предусловием
3. do while — цикл с постусловием

И кратко про цикл со счётчиком
for — ключевое слово языка C++ для обозначения цикла со счётчиком
дальше задаётся
(инициализация счётчика; условие выхода из цикла по счётчику; изменение счётчика)
и под конец повторяемая инструкция которая естественно заканчивается ";"
или стандартный блок повторяемых инструкций в фигурных скобках {} (прим. который можно использовать и без цикла)
подводных камней мне кажется не так много:
например, выражение условия пересчитывается каждый раз, то есть если это долго, может быть лучше создавать переменную до цикла и сравнивать счётчик с ней
или про изменение счётчика, использовать ++counter, если это надо, вместо counter++
можно, конечно, ещё рассказать про то, что этот вид цикла хорошо сочетается с итераторами, а можно не рассказывать, так как итераторы относятся к паттернам проектирования
ну и break тоже объяснить применительно к блоку инструкций в цикле

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

N>В качественном учебном комплекте (а не собранном на коленке учителем в свободное время) не будет проблем с библиотеками.


Как вам сказать. Предположим я ребёнок, побаловался консольными приложениями. Мозги мне это немного вправило. И вдруг мне это стало интересно. Захотел высокоскоростные графические интерфейсы, а не как в той же Java. Кстати, в Java иногда встречаюсь с очень продуманными программами, видимо общая концепция способствует, но как с ними работать если они тормозят и их не прокачивали на скорость. Потом захотел быструю отрисовку 2D или 3D графики, причём самому мне писать может быть и лень, а вот взять готовый движок другой дело. Может быть я захочу со временем работать со скоростной криптографией, скоростными tcp/ip серверами, скоростными видеопотоками, компьютерным зрением, управлять силовым оборудованием и так далее. Ключевая особенность это скорость раз, огромное количество готовых библиотек два.

Но в принципе я не настроен радикально, что надо начинать именно с С++. В конце концов всё сведётся к целям и задачам под который будет выбран язык так сказать по жизни. А основные принципы и синтаксис можно изучить на любом языке.
Re[4]: Какой язык программирования нужно изучать в школе
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 12.09.13 05:19
Оценка:
Здравствуйте, velkin, Вы писали:

V>Давайте возьмём для примера цикл for. Не заглядывая в книжки я бы объяснил это так:

V>Существуют основные виды циклов:
V>1. for — цикл со счётчиком
V>2. while — цикл с предусловием
V>3. do while — цикл с постусловием

Нет. Тут уже принципиальная методологическая ошибка (не для объяснения уже готовому программисту, а для начального обучения). Вы говорите про типовое использование для 99% случаев, и про переход от задачи (сделать цикл по счётчику) к её реализации (конструкция for). Но for — это не цикл со счётчиком! Это может быть циклом с двумя счётчиками:

for (i = 0, j = strlen(s) - 1; i > j; i++, j--) {
    t = s[i]; s[i] = s[j]; s[j] = t;
}


Это может быть циклом со счётчиком и дополнительным параметром:

for (i = 0, w = 1; i < 32; i++, w <<= 1) {
   if (a & w) { r = i; break; }
}


и ещё массой вариантов. И вообще не циклом, строго говоря (случаи использования do-while как групповых скобок в препроцессоре, while как замены цепочки проверок с goto на выход).

Далее, кто сказал, что for — это цикл со счётчиком, если while — может быть циклом со счётчиком?

i = 1;
while (i <= 1000) {
  a[i] = b[i];
  i++;
}


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

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

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

(А ещё лучше, конечно, в большинстве случаев использовать не for, а foreach, map(), list comprehensions и тому подобные средства. Но это уже как минимум STL, если в линии C++, а у неё свои проблемы — грамотно проецировать свою задачу на набор и сигнатуры применяемых функций это задача, требующая опыта и зубрёжки.)

V>И кратко про цикл со счётчиком

V>for — ключевое слово языка C++ для обозначения цикла со счётчиком
V>дальше задаётся
V>(инициализация счётчика; условие выхода из цикла по счётчику; изменение счётчика)
V>и под конец повторяемая инструкция которая естественно заканчивается ";"

Никакое из этих "естественно" не естественно для того, кто только начал учиться языку. Это загадочные слова, возникшие из ниоткуда и которые надо зубрить.

V>или стандартный блок повторяемых инструкций в фигурных скобках {} (прим. который можно использовать и без цикла)


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

V>подводных камней мне кажется не так много:

V>например, выражение условия пересчитывается каждый раз, то есть если это долго, может быть лучше создавать переменную до цикла и сравнивать счётчик с ней
V>или про изменение счётчика, использовать ++counter, если это надо, вместо counter++

И это тоже! Но до уровня, на котором эти условия начинают играть заметную роль, ещё надо дойти.

V>Что касается Си, то в современном программировании это те же программисты драйверов. Я бы даже сказал, что использовать С++ строки тоже уже не совсем хорошо.


Назовите и опишите замену, пожалуйста.

N>>В качественном учебном комплекте (а не собранном на коленке учителем в свободное время) не будет проблем с библиотеками.

V>Как вам сказать. Предположим я ребёнок, побаловался консольными приложениями. Мозги мне это немного вправило. И вдруг мне это стало интересно. Захотел высокоскоростные графические интерфейсы, а не как в той же Java. Кстати, в Java иногда встречаюсь с очень продуманными программами, видимо общая концепция способствует, но как с ними работать если они тормозят и их не прокачивали на скорость. Потом захотел быструю отрисовку 2D или 3D графики, причём самому мне писать может быть и лень, а вот взять готовый движок другой дело. Может быть я захочу со временем работать со скоростной криптографией, скоростными tcp/ip серверами, скоростными видеопотоками, компьютерным зрением, управлять силовым оборудованием и так далее. Ключевая особенность это скорость раз, огромное количество готовых библиотек два.

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

V>Но в принципе я не настроен радикально, что надо начинать именно с С++. В конце концов всё сведётся к целям и задачам под который будет выбран язык так сказать по жизни. А основные принципы и синтаксис можно изучить на любом языке.


Нет, не на любом. Даже не впадая в маргинальные примеры (выучите-ка "основные принципы и синтаксис" на Форте... что, сложновато?), по описанному выше, я надеюсь, понятно, чего и где можно ожидать и к каким последствиям можно прийти.
The God is real, unless declared integer.
Re[5]: Какой язык программирования нужно изучать в школе
От: velkin Удмуртия http://blogs.rsdn.org/effective/
Дата: 12.09.13 20:40
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, velkin, Вы писали:


V>>Давайте возьмём для примера цикл for. Не заглядывая в книжки я бы объяснил это так:

V>>Существуют основные виды циклов:
V>>1. for — цикл со счётчиком
V>>2. while — цикл с предусловием
V>>3. do while — цикл с постусловием

N>Нет. Тут уже принципиальная методологическая ошибка (не для объяснения уже готовому программисту, а для начального обучения). Вы говорите про типовое использование для 99% случаев, и про переход от задачи (сделать цикл по счётчику) к её реализации (конструкция for). Но for — это не цикл со счётчиком! Это может быть циклом с двумя счётчиками:

N>Это может быть циклом со счётчиком и дополнительным параметром:
N>и ещё массой вариантов. И вообще не циклом, строго говоря (случаи использования do-while как групповых скобок в препроцессоре, while как замены цепочки проверок с goto на выход).

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

N>Далее, кто сказал, что for — это цикл со счётчиком, если while — может быть циклом со счётчиком?


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

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


Так никто не говорит, что нужно рассказывать сразу про всё. Почему если бы я начинал обучать других с Qt, то не стал бы давать им как первый проект GUI, а использовал бы консоль. Всё очень просто, в консоли можно начать с процедурного стиля и двигаться к функциональному, объектно-ориентированному, обобщённому. К примеру, если мы сразу начнём с Qt, то там многие проблемы решаются наследованием. И паттерны проектирования реализованы в объектно-ориентированной парадигме программирования. А к примеру в STL паттерны проектирования реализованы в парадигме обобщённого программирования, то есть в нашем случае шаблонами C++.

Мысль в том, что если начинать обучение в процедурной парадигме программирования, то использование того же Pascal не даёт преимуществ. И точно так же придётся запоминать синтаксис:
{} против begin end
= против :=

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

N>(А ещё лучше, конечно, в большинстве случаев использовать не for, а foreach, map(), list comprehensions и тому подобные средства. Но это уже как минимум STL, если в линии C++, а у неё свои проблемы — грамотно проецировать свою задачу на набор и сигнатуры применяемых функций это задача, требующая опыта и зубрёжки.)


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

V>>И кратко про цикл со счётчиком

V>>for — ключевое слово языка C++ для обозначения цикла со счётчиком
V>>дальше задаётся
V>>(инициализация счётчика; условие выхода из цикла по счётчику; изменение счётчика)
V>>и под конец повторяемая инструкция которая естественно заканчивается ";"

N>Никакое из этих "естественно" не естественно для того, кто только начал учиться языку. Это загадочные слова, возникшие из ниоткуда и которые надо зубрить.


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

V>>или стандартный блок повторяемых инструкций в фигурных скобках {} (прим. который можно использовать и без цикла)


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


V>>Что касается Си, то в современном программировании это те же программисты драйверов. Я бы даже сказал, что использовать С++ строки тоже уже не совсем хорошо.


N>Назовите и опишите замену, пожалуйста.


Зависит от используемой библиотеки, так как любые строки не являются встроенными типами. В моём случае при использовании Qt это была бы QString. Речь сейчас конечно не о Си, да и строки там имеют другой назначение.

N>>>В качественном учебном комплекте (а не собранном на коленке учителем в свободное время) не будет проблем с библиотеками.

V>>Как вам сказать. Предположим я ребёнок, побаловался консольными приложениями. Мозги мне это немного вправило. И вдруг мне это стало интересно. Захотел высокоскоростные графические интерфейсы, а не как в той же Java. Кстати, в Java иногда встречаюсь с очень продуманными программами, видимо общая концепция способствует, но как с ними работать если они тормозят и их не прокачивали на скорость. Потом захотел быструю отрисовку 2D или 3D графики, причём самому мне писать может быть и лень, а вот взять готовый движок другой дело. Может быть я захочу со временем работать со скоростной криптографией, скоростными tcp/ip серверами, скоростными видеопотоками, компьютерным зрением, управлять силовым оборудованием и так далее. Ключевая особенность это скорость раз, огромное количество готовых библиотек два.

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


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

V>>Но в принципе я не настроен радикально, что надо начинать именно с С++. В конце концов всё сведётся к целям и задачам под который будет выбран язык так сказать по жизни. А основные принципы и синтаксис можно изучить на любом языке.


N>Нет, не на любом. Даже не впадая в маргинальные примеры (выучите-ка "основные принципы и синтаксис" на Форте... что, сложновато?), по описанному выше, я надеюсь, понятно, чего и где можно ожидать и к каким последствиям можно прийти.


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

И ещё один вопрос, стоит ли использовать IDE, или обучать детей на первых порах при помощи простейшего текстового редактора и компилятора. Я то, конечно, за IDE, но если так делать, в итоге получится другой программист. Как бы это сказать, может быть с меньшим уровнем самоконтроля.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.