Мне всегда были интересны разные идеи об обучении программированию. Возможно, это потому, что я остаюсь вечным студентом в этой области. Но сегодня я ознакомился с одной неожиданной для меня идеей − начинать обучение с Java. И я не смог промолчать.
Я не большой специалист в педагогике − возможно, в компьютерной науке принято бросать учеников в воду, выбрав место поглубже, а там − кому суждено, тот выплывет. Но мне всё же кажется, что обучение будет наиболее эффективно, если преподаватель будет представлять обучающемуся различные концепции программирования по одной за раз, по мере возрастания сложности. Отсюда главное требование к «учебному» ЯП − возможность использовать свои фичи изолированно, начиная с самых базовых.
Опять же на мой дилетантский взгляд, несложно проверить, отвечает ли язык программирования этому требованию. Достаточно открыть раздел “Hello World” на Rosetta Code.
Давайте попробуем перечислить концепции, необходимые для понимания этих элементарных программ.
Дополнено по заявкам радиослушателей. Brainfuck, PHP, C, Julia.
При разборе этого кода преподаватель должен хотя бы в двух словах объяснить своим студентам, что такое ключевые слова, операторы и строковый тип данных. Конечно, и без такого объяснения у части студентов (но не у всех!) может довольно быстро сложиться интуитивное понимание этих фич. Однако лучше сразу добиться определённости.
К ключевым словам и строкам добавляется понятие функции. Да, функция
Те же базовые понятия, что и в случае Python 3. Зато Julia − это высокопроизводительный динамический ЯП, компилируемый в нативный код. Браво!
Ключевые слова, строковый ТД, операторы, нумерация строк кода. Нумерация строк в Basic − довольно сложная низкоуровневая концепция, имитирующая физическое устройство памяти компьютера. Она может стать камнем преткновения для студента, если преподаватель не уделит ей внимания.
В поздних диалектах, вроде VisualBasic, строки кода становятся простыми, невычисляемыми метками. В первой программе метки не нужны. Язык, таким образом, становится проще для начального обучения.
Ключевые слова, строковый ТД, операторы, функции, а что ещё? Поскольку программа занимает несколько строк, то к первым понятиям добавляются блоки, разделители (или терминаторы? Всегда их путаю) и отступы. Да и оператор
Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также директивы препроцессора и макросы. Без макросов в этом примере можно было обойтись, но
Помимо понимания ключевых слов, строковых ТД, операторов и разделителей (или терминаторов?), данный пример невозможно усвоить без базового понимания таких специфических веб-технологий, как языки разметки (HTML) и шаблонизаторы. Собственно, PHP и есть язык шаблонизатора, разновидность DSL. Как следствие, PHP − отличный учебный язык для фронтендера, желающего углубиться в бэкенд-технологии. Но учить PHP «с нуля» довольно сложно.
Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также препроцессор с его директивами, области видимости, потоковый ввод/вывод… Уф, неужели всё?
Ключевые слова, строковый ТД (даже два строковых ТД, но об этом можно тактично промолчать), пустой ТД, массивы, блоки, разделители и отступы, а также классы, объекты (неявно, но иначе не объяснишь
Та же Java, минус модификаторы доступа, плюс неймспейсы. Ничего интересного, проходим мимо.
Я не хочу приводить здесь листинг − он слишком объёмный и однообразный. Я только перечислю те базовые понятия, которые нужно усвоить для понимания этого примера: ключевые слова, операторы, переменные, указатели, условия, циклы, числовое представление символов (таблица ASCII). Да, Brainfuck − не самый доступный для новичков язык.
Разумеется, помимо «быстрого входа» (простоты понимания элементарных программ), есть ещё ряд факторов, влияющих на выбор ЯП для обучения. Это и наличие удобных сред и инструментов для кодинга, и качество документации, и, наконец, практическая применимость. Но если первые шаги в обучении будут связаны с болью и непониманием, это может перевесить все остальные доводы. В общем, учитесь легко и не задалбывайтесь!
Я не большой специалист в педагогике − возможно, в компьютерной науке принято бросать учеников в воду, выбрав место поглубже, а там − кому суждено, тот выплывет. Но мне всё же кажется, что обучение будет наиболее эффективно, если преподаватель будет представлять обучающемуся различные концепции программирования по одной за раз, по мере возрастания сложности. Отсюда главное требование к «учебному» ЯП − возможность использовать свои фичи изолированно, начиная с самых базовых.
Опять же на мой дилетантский взгляд, несложно проверить, отвечает ли язык программирования этому требованию. Достаточно открыть раздел “Hello World” на Rosetta Code.
Давайте попробуем перечислить концепции, необходимые для понимания этих элементарных программ.
Дополнено по заявкам радиослушателей. Brainfuck, PHP, C, Julia.
Python 2
print 'Hello world!'
При разборе этого кода преподаватель должен хотя бы в двух словах объяснить своим студентам, что такое ключевые слова, операторы и строковый тип данных. Конечно, и без такого объяснения у части студентов (но не у всех!) может довольно быстро сложиться интуитивное понимание этих фич. Однако лучше сразу добиться определённости.
Руthon 3
print('Hello world!')
К ключевым словам и строкам добавляется понятие функции. Да, функция
print
− это плюс Python 3 как промышленного ЯП. Но в то же время функция − это более высокоуровневая фича, нежели оператор, и это усложняет изучение Python 3 как первого ЯП. Да, вы как преподаватель можете отложить объяснение необходимости использования скобок на одно из следующих занятий, но это останется занозой в мозгах ваших учеников.Julia
println("Hello world!")
Те же базовые понятия, что и в случае Python 3. Зато Julia − это высокопроизводительный динамический ЯП, компилируемый в нативный код. Браво!
Basic
10 PRINT "Hello world!"
Ключевые слова, строковый ТД, операторы, нумерация строк кода. Нумерация строк в Basic − довольно сложная низкоуровневая концепция, имитирующая физическое устройство памяти компьютера. Она может стать камнем преткновения для студента, если преподаватель не уделит ей внимания.
В поздних диалектах, вроде VisualBasic, строки кода становятся простыми, невычисляемыми метками. В первой программе метки не нужны. Язык, таким образом, становится проще для начального обучения.
Pascal
program HelloWorld(output);
begin
writeln('Hello, World!');
end.
Ключевые слова, строковый ТД, операторы, функции, а что ещё? Поскольку программа занимает несколько строк, то к первым понятиям добавляются блоки, разделители (или терминаторы? Всегда их путаю) и отступы. Да и оператор
program
не так уж прост… Похоже, дружелюбность Pascal несколько преувеличена.C
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
return EXIT_SUCCESS;
}
Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также директивы препроцессора и макросы. Без макросов в этом примере можно было обойтись, но
return EXIT_SUCCESS
в данном случае очень показателен: C − это традиционный язык системного программирования, поэтому изучать его желательно на фундаменте хорошего понимания работы операционных систем и с прицелом на переносимость. А иначе этот ЯП кажется ненамного сложнее Pascal.PHP
<?php
echo "Hello world!\n";
?>
Помимо понимания ключевых слов, строковых ТД, операторов и разделителей (или терминаторов?), данный пример невозможно усвоить без базового понимания таких специфических веб-технологий, как языки разметки (HTML) и шаблонизаторы. Собственно, PHP и есть язык шаблонизатора, разновидность DSL. Как следствие, PHP − отличный учебный язык для фронтендера, желающего углубиться в бэкенд-технологии. Но учить PHP «с нуля» довольно сложно.
C++
#include <iostream>
int main () {
std::cout << "Hello world!" << std::endl;
}
Ключевые слова, строковый ТД, операторы, функции, блоки, разделители и отступы, а также препроцессор с его директивами, области видимости, потоковый ввод/вывод… Уф, неужели всё?
Java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
Ключевые слова, строковый ТД (даже два строковых ТД, но об этом можно тактично промолчать), пустой ТД, массивы, блоки, разделители и отступы, а также классы, объекты (неявно, но иначе не объяснишь
static
), атрибуты, методы, модификаторы доступа… Божечки, я уже хочу развидеть всё это! Ведь я хотел только писать моды для Minecraft!C#
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello world!");
}
}
}
Та же Java, минус модификаторы доступа, плюс неймспейсы. Ничего интересного, проходим мимо.
Brainfuck
Я не хочу приводить здесь листинг − он слишком объёмный и однообразный. Я только перечислю те базовые понятия, которые нужно усвоить для понимания этого примера: ключевые слова, операторы, переменные, указатели, условия, циклы, числовое представление символов (таблица ASCII). Да, Brainfuck − не самый доступный для новичков язык.
Заключение
Разумеется, помимо «быстрого входа» (простоты понимания элементарных программ), есть ещё ряд факторов, влияющих на выбор ЯП для обучения. Это и наличие удобных сред и инструментов для кодинга, и качество документации, и, наконец, практическая применимость. Но если первые шаги в обучении будут связаны с болью и непониманием, это может перевесить все остальные доводы. В общем, учитесь легко и не задалбывайтесь!