Я не большой специалист в педагогике ? возможно, в компьютерной науке принято бросать учеников в воду, выбрав место поглубже, а там ? кому суждено, тот выплывет. Но мне всё же кажется, что обучение будет наиболее эффективно, если преподаватель будет представлять обучающемуся различные концепции программирования по одной за раз, по мере возрастания сложности. Отсюда главное требование к «учебному» ЯП ? возможность использовать свои фичи изолированно, начиная с самых базовых.
Опять же на мой дилетантский взгляд, несложно проверить, отвечает ли язык программирования этому требованию. Достаточно открыть раздел “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 ? не самый доступный для новичков язык.
Заключение
Разумеется, помимо «быстрого входа» (простоты понимания элементарных программ), есть ещё ряд факторов, влияющих на выбор ЯП для обучения. Это и наличие удобных сред и инструментов для кодинга, и качество документации, и, наконец, практическая применимость. Но если первые шаги в обучении будут связаны с болью и непониманием, это может перевесить все остальные доводы. В общем, учитесь легко и не задалбывайтесь!
Комментарии (135)
Ironhide
22.11.2019 16:43Сначала начинал изучать C#, а потом — Python. В принципе не важно, какой язык учить первым. Сложнее всё же изучать «обвязки» к языку: многочисленные классы и их методы во многочисленных или немногочисленных, но очень больших фреймворках и библиотеках. Не всегда сразу запоминаешь, где какой инструмент использовать нужно.
iskateli
22.11.2019 20:08+3Думаю это важно, я например начинал с языка со строгой статической типизацией и до сих пор привык мыслить типами.
Ironhide
22.11.2019 22:25Да, согласен в таком случае. По сути я так же и учил первым язык со строгой статической типизацией. Хотя для меня всё равно сейчас самое сложное — это изучение фреймворков и библиотек.
Free_ze
22.11.2019 17:00+2О, опять хэлловордами дружелюбность языков меряют.
Та же Java, минус модификаторы доступа, плюс неймспейсы
Почему про пакеты в Java ни слова? Неявныйjava.lang
и дефолтный пакет — это, конечно, хорошо, но чуть дальше пойдешь — те же импорты начнутся.
saag
22.11.2019 17:03-1А вот Ruby:
puts «Hello World!»
лаконичнее всех вышеприведенных примеровhlebloika
22.11.2019 17:06+4Не очень понятно, чем оно лаконичнее того же второго питона.
saag
22.11.2019 18:42-1На один символ — print (Python) vs puts (Ruby)
Areso
22.11.2019 22:22+1Не соглашусь.
Для носителей английского вариант Питона выглядит дружелюбнее, а буквально
напечатай 'Привет, Мир!'
вполне дружелюбно и естественно, кмк.
Soren
22.11.2019 22:26+1На один символ короче, но теряется очевидность ключевого слова. Всё таки, print — он и в английском языке print.
Moxa
22.11.2019 17:04+3по вашей логике Brainfuck — самый простой язык программирования, там всего 8 команд, порог входа гораздо ниже!
Tanner Автор
22.11.2019 18:52Это вы говорите про простоту реализации языка, а я говорю о количестве и сложности базовых понятий программирования, с которыми приходится столкнуться в анализе даже самой простой программы на данном языке.
Дополнил про Brainfuck тащемта.
FSA
22.11.2019 17:04+1Если я правильно понял статью, то по вашему выходит, что PHP для изучения просто идеален. "Hello, World!" просто прост до безобразия. Для понимания концепции переменных даже в их типы вдаваться не надо. Ну а под конец можно код написать практически в Java-стиле.
sborisov
22.11.2019 17:06+2Мне кажется, в таком случае Си неплохо подходит.
#include <stdio.h> int main() { // printf() displays the string inside quotation printf("Hello, World!"); return 0; }
Yermack
22.11.2019 17:50+2У нас Си уже много лет первый ЯП (у физиков), радиотехники почему-то (из-за графических пакетов) используют С#, а вот экономисты пересаживаются на питон, хотя раньше была джава. На счет программистов согласен, им си в качестве первого ЯП полезен, чтоб понимать низкоуровневые абстракции. Но вот для тех, у кого программирование нужно для подсчета и моделирования, наверно лучше начинать с чего-то высокоуровневого
CoreTeamTech
22.11.2019 17:17Лучший язык, на сегодня, для обучения — JavaScript. Мне немного довелось с нуля обучать, как подростков, так и людей без технического образования в возрастной группе 35+. После того, как получили старт, они дальше развиваются благодаря огромному коммьюнити, без ограничений в возможностях реализации своих идей. Могут разрабатывать веб-сайты, веб-приложения, веб АПИ, игры, десктопные и мобильные приложения, разрабатывать роботов RPA и даже играться с машинным обучением. При этом, никогда не было целью научить их конкретному языку программирования, скорее, мыслить основными концепциями. Поэтому, часто им предлагал портировать небольшую программу с одного языка (Python, Java, C++) на другой (JavaScript), вырабатывая навык узнавания этих общих концепций.
gatoazul
22.11.2019 19:24Я обычно начинаю обучение даже не с чистого JS, а с Processing — небольшой графической библиотеки поверх JS.
Рисовать картинки куда нагляднее для начинающего, чем работа в той же консоли а ля DOS.
Как показывает опыт, практически невозможно объяснить современной молодежи, никогда не видевшей зеленых экранов, что такое консоль и как она выводит построчно.CoreTeamTech
23.11.2019 17:19Интересно, спасибо за наводку. Я как программист старой школы, так и не перестроил мозги с консолей на графику. Действительно, работа с графикой более наглядна и охватывает довольно много алгоритмов.
Akon32
22.11.2019 20:49В JS, исходя из моего небольшого опыта в нём, много WTF вызывает то, что лямбды не захватывают this, и приходится извращаться. Кажется, даже в Lua этот аспект понятнее.
ALexhha
23.11.2019 16:21Лучший язык, на сегодня, для обучения — JavaScript
Серьезно? Сразу вспоминается — https://cs9.pikabu.ru/post_img/2016/09/15/7/147393909915812096.jpgCoreTeamTech
23.11.2019 17:17Это вызывает проблемы только у тех, кто JavaScript не знает. Когда вы приходите с других языков с Си-подобным синтаксисом и вы используете интуицию для работы в новом для вас языке. JS не идеальный язык, но для обучения он лучший, ИМХО.
lostero
26.11.2019 04:02Лучший язык для обучения JavaScript.
1. JS — открыл консоль браузера и ты уже можешь быдлокодить. Нет установки доп. программ, а браузер почти 100% есть у любого.
2. Ещё с 2D, 3D алгоритмами можно играться, что гораздо лучше сухих ответов консоли для новичка.
3. Не нужны медленные IDE для разработки (Notepad++ для большинства задач хватает).
4. C-подобный язык (ИМХО — все базовые конструкции максимально просты для понимания с мин. познаниями английского).
В итоге: порог вхождения ниже плинтуса, телодвижений для начала программирования минимум => больше времени можно провести изучая алгоритмы, язык и почти 0 настраивая окружение. Начинать всегда сложнее всего, а с JS этот момент упрощён максимально.
P.S. Непонятное, для начинающих, автоматическое приведение типов заставляет их избегать его использование в пользу спец. методов и в редких случаях, о ужас! почитать спецификацию.
rboots
22.11.2019 17:20+3Добавлю пример на JavaScript:
console.log('Hello, World!');
Как бонус для обучения, можно запустить в любом браузере на любой системе, и вообще как-то использовать на практике не по работе, чтобы отключить рекламу на конкретном сайте, например.
А вообще, долго смеялся над Java как лучшим языком для начинающих. Представляю, как школьники будут конфигурировать Maven или Gradle, собирать jar или war, запускать это под каким-нибудь Tomcat… Если уж жестить, пусть лучше Kotlin учат, там хотя бы синтаксис компактнее.
UPD: начал писать про JS, но меня опередили))Free_ze
22.11.2019 18:26+3редставляю, как школьники будут конфигурировать Maven или Gradle, собирать jar или war, запускать это под каким-нибудь Tomcat…
Посмейтесь по поводу webpack и gulp до кучи.rboots
22.11.2019 18:47-1Аналог Maven скорее npm, и он довольно прост в конфигурации. Webpack и gulp помогут вам автоматизировать некоторые операции, если вы уже знаете, что это за операции и зачем они нужны, в остальном ничто не мешает просто писать на JS без конкатенации, минификации, чанков, спрайтов и т.п… Если говорить про профессиональную разработку, то для начинающих, не разбирающихся в webpack, большинство фреймворков предлагает готовую встроенную конфигурацию, как react-scripts или vue-scripts.
Free_ze
22.11.2019 19:08он довольно прост в конфигурации.
Да и мавен не сложен (понятные английские слова в XML, очевидная иерархия тегов), тем более, что к нему гуи есть во многих IDE. Это вам не страшный CLI ковырять.
большинство фреймворков предлагает готовую встроенную конфигурацию, как react-scripts или vue-scripts.
Архетипы мавена, spring boot с генератором проектов.rboots
22.11.2019 20:01+1Ну да, можно ещё сказать, очевидные английские буквы везде, во всех языках. Что может быть не понятного? Мне после Node, Python, Ruby и даже С++, пару месяцев понадобилось, чтобы разобраться с экосистемой Java. В Maven вроде простой XML, но много неявных зависимостей между инструкциями (для справедливости, в JS был аналог Grunt, там тоже всё влияло на всё, но к счастью о нём сейчас никто и не вспоминает). Рекомендуют Gradle, но он основан на Groovy, мы с вами может и освоим, а начинающим, выучить Groovy, чтобы начать собирать проекты на Java — как-то слишком жестоко. В npm скрипты пишутся на shell, если человек умеет работать с командной строкой — он автоматически понимает все скрипты в npm. Я не критикую экосистему Java, в Maven больше возможностей и настроек, можно указать несколько репозиториев зависимостей, например, в npm — только один. Но говорить, что Java лучше для начинающих может только человек, который никогда в жизни не общался с начинающими, не знающими пока ни одного языка.
Akon32
22.11.2019 20:55Помнится мне, NetBeans (да и Idea) генерировал какие-то свои ant-скрипты полностью прозрачно для неискушённого пользователя, и java-проекты компилировались и запускались по нажатию кнопки Run, безо всяких мавенов. Для новичка самое то.
mkovalevskyi
22.11.2019 22:47+1Это достаточно спорный вопрос. Бо потом, у этого новичка будет полный ступор, когда что-то пойдет не так.
Akon32
25.11.2019 21:00Бо потом, у этого новичка будет полный ступор, когда что-то пойдет не так.
Что может пойти не так, чтобы случился полный ступор? Скорее он случится, если усложнять начальный этап обучения программированию системами сборки типа cmake или make (или чем-то позабористее). Но при обучении программированию нужно некоторое усердие, а в таком случае новичок со сборкой разберётся.
К слову, в delphi практически всегда
программируют мышкойкомпилируют нажатием кнопки, отдельной системы сборки как бы и нет. И я когда-то так и не смог объяснить дельфистам cmake. Возможно, это и есть тот ступор, но всё-таки я списываю это на индивидуальные особенности.mkovalevskyi
25.11.2019 21:18Системы сборки в дельфи явно может и нет. Но, к примеру, если вам захотелось в нем заделать свой собственный механизм рисования окон (например для отрисовки не квадратного окна, не в курсе как там дела обстоят сейчас, раньше это сделать стандартно было нельзя) вам таки прийдет сначала понять как те окна в принципе рисуются.
Что может пойти не так в идее с джавой? Ну, к примеру, вам понадобилось в ваш пакет запихать что-то сторонее (драйвер селениума, к примеру), как ресурс, и потом им пользоваться. Если не понимать как тот пакет организован, это чуток не совсем тривиальная задача.
rboots
26.11.2019 03:09Работали как то в 2018м с ситемой, которая «программируется мышкой». То ли WebOS от LG, то ли Tizen от Samsung, для программирования телевизоров. Проблемы начались, когда понадобилось сделать continuous integration, прогонять автотесты, деплоить билд на 10+ девайсов. Для справедливости, какая-то cli там всё же есть, но документацию к ней пришлось у вендора добывать клещами. Вести профессиональную разработку только в GUI, без знания cli, это очень спороное решение.
gudvinr
22.11.2019 23:34Но говорить, что Java лучше для начинающих может только человек, который никогда в жизни не общался с начинающими, не знающими пока ни одного языка.
Так-то вы сами, сравнивая его с JS, включили кучу "если", которых у не знающих, очевидно, не будет
Free_ze
23.11.2019 09:53+1можно ещё сказать, очевидные английские буквы везде, во всех языках
Так то не язык, а структура данных.Понять связь dependency внутри dependencies не так уж сложно на самом деле. Далее — документация вполне адекватна.
В npm скрипты пишутся на shell, если человек умеет работать с командной строкой — он автоматически понимает все скрипты в npm.
Абстрактно работать с командной строкой и писать скрипты — это очень разные вещи. Назвать синтаксис баша интуитивным у меня язык никак не повернется. Да и писать на нем едва ли станет начинающий, ведь он читал про кучу сборщиков с готовыми модулями под различные задачи.
говорить, что Java лучше для начинающих может только человек, который никогда в жизни не общался с начинающими, не знающими пока ни одного языка.
Громкое заявление, особенно на фоне утверждения про то, что новичок должен уметь пользоваться командной строкой.
loltrol
22.11.2019 17:35+4Лучший язык для начинающих — asm. Не нужно нам куча молодых специалистов, которые быстренько вошли в ой-ти, и теперь не могут отсюда выйти. Никто не жалует электрика, который только что прочитал правила кирхгофа и закон ома(затронув вскользь правило буравчика). Но почему то все хотят войти-в-ой-ти и оставлять персональные данные сотни тысяч людей в открытом доступе на дефолтных незапароленых портах очередной nosql db. Ну или писать крутые приложения на electron'e, которые скоро без rtx видеокарты не будут заводится. Каждому свое.
Alyoshka1976
22.11.2019 19:31+1Жаль не могу сейчас найти источник — на одной из англоязычных конференций товарищ с юмором рассказывал о своих коллегах-программистах, искренне не понимающих, как сделать цикл с помощью условного оператора и оператора безусловного перехода.
SlimShaggy
23.11.2019 00:24Логично — все же знают, что оператор безусловного перехода использовать нельзя!
PaulZi
22.11.2019 18:10Если уж сравнивать, то не hello worldами, а todo list. Хотя бы понятно будет, как обрабатывается ввод, как рисовать интерфейс, как организовывать хранение. И т. д.
Tanner Автор
22.11.2019 18:31Моя основная мысль ? человеку трудно выучить более одной концепции за раз, поэтому лучше учить программированию на примере языков, фичи которых легко изолировать друг от друга и показать по отдельности.
А вы хотите сразу вывалить студенту на голову все концепции языка, все фичи, да ещё библиотеками-фреймворками всё сдобрить, графика там, UX, RDBMS… Это что, такой особый вид дедовщины? Или просто саботаж учебного процесса? ;)PaulZi
22.11.2019 18:39Я не говорю о том, что надо начинать изучать со сложного приложения. Я лишь хочу донести, что измерять сложность языка с помощью hello world неправильно.
Ну вот изучил студент этот hello world, даже математику, формулки посчитал. А дальше захотел написать простенькую игру, например, крестики-нолики. Вот тут уже начинает сложно выглядеть то, что просто выглядело в hello world.Tanner Автор
22.11.2019 18:47Нет уж, first things first. Я хочу так знакомиться с чудесным миром программирования, чтобы простое приложение было действительно простым
, а не как на Java. А когда дойдём до сложных, то там и решим, что делать: внимание тренировать, best practices внедрять, или вообще ЯП менять.
pewpew
22.11.2019 18:41Мы же не студенты, мы тут сравниваем ЯП. Поэтому да, что-то сложнее «hello, world» ярче покажет различия между языками и будет нагляднее показывать сложность ЯП в сравнении с другими. А студенту мы это покажем, но не сразу.
И если уж мы заговорили о ЯП, то следующим мы обучаемся уже на основе примеров кода. За всех не скажу, но мне значительно проще разобраться, глядя в чужие удачные примеры.
loltrol
23.11.2019 02:01+2Имхо, начинать надо с базовых понятий — булевой алгебры, архитектуры компа и процессора в частности(на пальцах, учить делать свои цп не стоит), алгоритмов. Потом перейти к asm и его связи с набором команд, и уже потом — добро пожаловать на высокий уровень. Не говорю, что это надо знать на все 100%, но хотя бы в ознакомительном курсе преподать. Иначе это больше похоже на дрессировку чем на обучение.
Для аналогии — это как дать теорему виета, не изучив предыдущую программу алгебры — решать квадратные уравнения будут люди хорошо, но до понимания происходящего дойдут только самые любопытные, а другие так и останутся дрессированными, а не обученными.
0xd34df00d
23.11.2019 03:40Имхо, начинать надо с базовых понятий — булевой алгебры, архитектуры компа и процессора в частности(на пальцах, учить делать свои цп не стоит), алгоритмов.
… формальной логики (хотя бы исчисление высказываний и логика первого порядка, вместе с теоремами о полноте), теории вычислимых функций (вместе с теоремой Райса и теоремой о неполноте), топологии (потребуется позже), лямбда-исчислению, теории типов (хотя бы System F, лямбда-цэ и MLTT в идеале) и интерпретации некоторых теорий (тут пригодится топология).
На несколько лет хватит. Потом уже можно теоркат и категориальную логику.
Gryphon88
23.11.2019 23:21Мне больше нравится бросать людей в воду, особенно если они выплывают. То есть если у человека достаточная рефлексия, то до него через какое-то время доходит, что он решает проблемы не так, не оптимально или излишне трудоёмко. Он изобретает пару букв из SOLID, и тогда ему можно показывать остальные, то же и про другие умные вещи, как и из математики и CS, так и из методологии.
Я считаю, что начинать надо с практики, за это и люблю Python с его книгами типа "Automate the Boring Stuff with Python", где рассказывается, как решить каждодневные задачи быстро, но неэффективно.
lair
22.11.2019 18:16К ключевым словам и строкам добавляется понятие функции.
Неа. Просто не надо объяснять ключевые слова (да и строки объяснять не надо), объясните только функции и значения.
И это, кстати, аргумент в пользу того, что не надо начинать с "Hello world", а надо начинать с математических операций.
Tanner Автор
22.11.2019 18:39Неважно, какую именно концепцию из базового набора вы хотите продемонстрировать ? вывод текстового сообщения, или арифметику, или циклы. Важно, что одни языки программирования позволяют это сделать лучше, чем другие. Об этом и статья.
lair
22.11.2019 18:42Вот только для разных концепций разные языки подойдут по-разному. И от выбора ваших примеров будет зависеть эффективность.
Tanner Автор
22.11.2019 21:08Эффективность чего?
lair
22.11.2019 21:37Обучения.
Tanner Автор
22.11.2019 22:25Возможно, в некоторых языках базовая арифметика реализована лучше, понятнее, чем в других. Спорить не буду.
lair
22.11.2019 22:27… так зачем вы сравниваете языки на бесполезной конструкции?
Tanner Автор
22.11.2019 22:31Я сравниваю языки не на «бесполезной конструкции», а, наоборот, на всём, что попадает в поле зрения обучающегося, кроме неё.
Чем больше попадает, тем хуже для обучения.lair
22.11.2019 22:34Вообще-то, за то, что попадает в поле зрение обучающегося, отвечает преподаватель. Вы почему-то решили выбрать hello world, хотя никакого смысла в этом нет.
Tanner Автор
22.11.2019 22:45Вообще-то, за то, что попадает в поле зрение обучающегося, отвечает преподаватель.
Я не очень хорошо понимаю, как это относится к теме обсуждения. То есть я на месте преподавателя действительно позаботился бы, чтобы в поле зрения обучающегося (полного новичка) не попал код на Java. Но если Java всё-таки выбран в качестве первого языка, то, вы полагаете, ответственность преподавателя может как-то смягчить этот удар, или?…lair
22.11.2019 22:50Я не очень хорошо понимаю, как это относится к теме обсуждения.
Полностью. Потому что выбор "лучшего языка" бессмысленен вне контекста программы обучения.
Tanner Автор
22.11.2019 23:15Я считаю, что достаточно полно описал контекст фразой «для начинающих». Между выбором первого и последующих ЯП разница действительно существенная. Дальше можно сколько угодно ранжировать фичи по их значимости, это ничего не изменит. Основа останется той же: ввод/вывод, литералы, переменные, присваивание, сравнение и логика, управление последовательностью выполнения, функции, а там мы уже подбираемся к специфическим для разных языков вещам.
lair
22.11.2019 23:19Я считаю, что достаточно полно описал контекст фразой «для начинающих».
Нет, недостаточно. Есть "начинающие" в общей школе. Есть — в профильной. Есть — в ВУЗе. В техникуме. На курсах.
И это не считая разницы между программами разных преподавателей.
Дальше можно сколько угодно ранжировать фичи по их значимости, это ничего не изменит.
Потому что не надо ранжировать фичи по значимости. Нужно выбирать что и в каком порядке давать учащимся.
а там мы уже подбираемся к специфическим для разных языков вещам.
Вообще-то вы к ним "подобрались" на словах "переменная" и "присваивание". Учитывая, что ввод и вывод совсем не настолько важны, чтобы быть на первом месте, эта специфика внезапно сказывается почти сразу.
Tanner Автор
22.11.2019 23:55+1Нет, недостаточно. Есть «начинающие» в общей школе. Есть — в профильной. Есть — в ВУЗе. В техникуме. На курсах.
То есть для изучения в школе Foo может оказаться проще, чем Bar, но при этом в ВУЗе всё кардинально поменяется, и там Foo станет сложнее, чем Bar? Ну, не верю. Разве что Scratch, может быть, но его и старшекласникам-то поздно.
Вообще-то вы к ним «подобрались» на словах «переменная» и «присваивание».
Вообще-то нет. Я понимаю, что эти вещи в разных языках выполняются по-разному, но для некоторых примеров эта разница несущественна, и именно эти примеры и нужно использовать в начале обучения.
Учитывая, что ввод и вывод совсем не настолько важны, чтобы быть на первом месте, эта специфика внезапно сказывается почти сразу.
В определённых случаях без ввода/вывода невозможно ничего продемонстрировать, увы.lair
22.11.2019 23:58То есть для изучения в школе Foo может оказаться проще, чем Bar, но при этом в ВУЗе всё кардинально поменяется, и там Foo станет сложнее, чем Bar?
Не "сложнее", а "бесполезнее". В том смысле, что можно уже брать более сложные и более выразительные языки.
но для некоторых примеров эта разница несущественна
Вот разница между возможностью и невозможностью присвоения несущественна, да.
именно эти примеры и нужно использовать в начале обучения
Ну вот видите, мы уже подобрались к тому, что программа имеет значение.
В определённых случаях без ввода/вывода невозможно ничего продемонстрировать, увы.
… и эти случаи вполне можно отодвинуть на "позже".
Tanner Автор
23.11.2019 00:21+1Не «сложнее», а «бесполезнее». В том смысле, что можно уже брать более сложные и более выразительные языки.
Тут, видимо, мой косяк. Я дожен был в явном виде обозначить то, что подразумевал с самого начала, и уже упомянул в комментариях: главная польза от «учебного» языка ? это собственно обучение основам программирования, то есть
ввод/вывод, литералы, переменные, присваивание, сравнение и логика, управление последовательностью выполнения, функции…
Выразительность, востребованность на рынке труда и другие параметры я не рассматривал. Ну, потому что (опять же самоцитата, простите)
Лучше быстро и легко научиться программировать на бесполезном языке, а потом выучить востребованный на практике язык и пользоваться им, чем выбрать для обучения программированию слишком сложный язык и биться лбом об стену.
Вот разница между возможностью и невозможностью присвоения несущественна, да.
Конечно, я забыл, что некоторые функциональные языки обходятся без присваивания. :)
… и эти случаи вполне можно отодвинуть на «позже».
Так все языки, для которых нет REPLов, придётся отодвинуть.lair
23.11.2019 00:23-1главная польза от «учебного» языка ? это собственно обучение основам программирования, то есть
Это ваше мнение. Но оно не обязательно верное.
Так все языки, для которых нет REPLов, придётся отодвинуть.
Ну да. И что?
Tanner Автор
23.11.2019 00:36+1Это ваше мнение. Но оно не обязательно верное.
Это не то чтобы мнение, это аналитический приём такой, упрощение. В смысле, я не берусь анализировать сразу все факторы, делающие ЯП хорошим для обучения, я беру только один ? сложность входа. Он для меня интереснее других, возможно, потому что мой собственный интеллектуальный ресурс весьма ограничен.
Ну да. И что?
Да и верно, шут с ними! :)lair
23.11.2019 00:37-1Это не то чтобы мнение, это аналитический приём такой, упрощение. В смысле, я не берусь анализировать сразу все факторы, делающие ЯП хорошим для обучения, я беру только один ? сложность входа. Он для меня интереснее других, возможно, потому что мой собственный интеллектуальный ресурс весьма ограничен.
Ну вот и получается, что вы выбрали лучший язык программирования для начинающего себя.
0xd34df00d
23.11.2019 03:41А что такое функция?
Определять ее как подмножество декартова произведения домена и кодомена — так себе идея, так как они зачастую бесконечны.
pewpew
22.11.2019 18:31По мне так в список можно добавить LUA.
Из плюсов — хорошая документация, лёгкость в освоении, встречается в разных интересных местах (от wow до nginx, redis или какой-нибудь экзотической консоли pico8). Из минусов — несколько странный null, метатаблицы, не очень удобная отладка, отсутствие ООП в полном смысле этого понятия.
Считаю, что для первого ЯП очень даже годится.
justhabrauser
22.11.2019 19:14+1Судя по критериям сравнения статья должна называться «Лучший… для начинающих идиотов».
Что — всё так плохо?
Или так и надо?
MarsianinM
22.11.2019 19:56Ну по мне так язык нужно выбрать не по сложности для новичка, а по потребностям. Начинать нужно с того где ты сможешь добиться возможности работать. Что толку с языка который не востребован в том месте где живёшь. Можно конечно фрилансить, однако мне кажется, что сначала не помешало бы получать по шапке за, скажем так, не правильный код и пояснение почему он не реальный. А так можно только в компашке где уровень мастерства высок.
greg123
22.11.2019 20:03Сложность изучения языка определяется умением учителя (либо автора книги) не вдаваться в подробности, которые не нужны на текущем этапе изучения.
gigabite
22.11.2019 20:12Какой разумный критерий, сравнивать простоту изучения языков по «hello world». Нет ничего сложного, есть плохо преподнесенный материал. Учите надо опираясь не надуманные аргументы типа, я на языке «Х» могу хелоуворд написать в одну строчку, а понять, где вы хотите дальше этот язык применить.
Tanner Автор
22.11.2019 20:42Я не понимаю, откуда вы взяли эту «одну строчку». Я нигде ничего не говорю об объёме примеров. Я сравниваю языки по количеству и сложности тех концепций, с которыми студенту приходится столкнуться в анализе даже самой простой программы на данном языке.
Стиль обучения типа «сейчас напишите так, а в следующем семестре узнаем, зачем» я не считаю допустимым. А объяснить работу программы на Basic, ничего не откладывая «на потом» и не прикрывая ладошкой, намного проще, чем, скажем, работу эквивалентной программы на Java. Поэтому Basic лучше подходит для обучения программированию, чем Java.
Аргументы в духе «дальше применить» я не принимаю, потому что я говорю об обучении программированию, а не о практике. Лучше быстро и легко научиться программировать на бесполезном языке, а потом выучить востребованный на практике язык и пользоваться им, чем выбрать для обучения программированию слишком сложный язык и биться лбом об стену.
tenzink
22.11.2019 20:21Python 2: ключевые слова, операторы и строковый тип данных
Python 3: функции, строковый тип данных
IMO, в 3-м заметно проще объяснить
dyuk108
22.11.2019 20:24Если начинающие — это, например, ученики в школе, то очень неплохо зарекомендовал себя учебный язык Кумир. Некий, ныне покойный, академик Ершов разработал алгоритмический язык, который реализовали ребята из НИИСИ РАН в виде вполне работающей среды программирования. А для старшеклассников и для тех, кто поспособнее — это Python. Кое-кто по старинке даёт Pascal, но язык-то мёртвый, даже на Delphi уже мало кто пишет. Питон трудноват для начинающих своими отступами и тем, что в цикле в range нужно указывать цифру на единицу больше, чем в традиционном заголовке цикла. В этом отношении Паскаль чуть выигрывает, некоторые для сдачи экзамена выбирают именно его. Он «потупее» что-ли. Кстати, в ЕГЭ присутствуют ещё Basic (я думал, что этот динозавр давно вымер) и C++. Читал, что некоторые пытаются давать в школе Ruby и Javascript. Последний — потому что вроде как просто и исполняются браузером. Но их нет в перечне ЕГЭ.
allex
23.11.2019 10:011. Академик Ершов может быть «неким» только для людей, не знакомых с историей развития вычислительной техники. Прочитайте хоть статью в википедии что ли.
2. Для полноты картины замечу, что задолго до реализации НИИСИ РАН на мехмате МГУ были разработаны Е-практикум и КуМир, которые использовались на самом мехмате и продавались в школы. Поэтому упоминание только НИИСИ мне глаз резануло. Ну ок, современная реализация их, а название сохранено для узнаваемости, пусть.
xirustam
22.11.2019 20:43Я думаю, что для хорошего понимания сути, лучше всего изучать языки уровня С/C++, Pascal, т.к. они вынуждают лезть в низкоуровневые вещи, при этом позволяя делать высокоуровневые штуки.
При таком подходе человеку даётся широкий кругозор, возможность понимать работу программ так, как оно есть на самом деле. Если начать со слишком низкого уровня (ассемблер), то это может на корню отбить желание изучать программирование. Если начать с языка, слишком отдалённого от реальности, то человеку будет вообще сложно понять как и почему эта магия работает, и шаг влево, шаг вправо — всё, ступор.Tanner Автор
22.11.2019 20:57Мне кажется, это не совсем так работает. Изучение языков уровня C/С++ и ниже надо основывать на знаниях цифровой схемотехники, хотя бы уровня “What Every Programmer Should Know About Memory” или Digital Design and Computer Architecture. Если предложить неподготовленным людям начинать с С++, то это будет не кругозор, а БДСМ. А вот Python легко усваивается и без этого, поэтому он и школьникам доступен, и всякие гуманитарии-естественники на нём статистику просчитывают.
Gryphon88
22.11.2019 23:15Я читал, но так и не смог понять красоту шаблонов и макросов (когда шаблон в шаблоне в шаблоне, и всё обмазано constexpr). Почему инструмент кодогенерации не вынести наружу языка, например, в лисп, тикль или питон?
Tanner Автор
23.11.2019 00:26Да, препроцессор ужасен, и шаблоны тоже ужасны. Кодогенерация вообще ужасна в любом виде, и если вынести её наружу, то станет наверняка ещё хуже.
Зато есть D, в котором избавились от препроцессора и шаблонов. Я, честно говоря, не понимаю, почему он так непопулярен.Gryphon88
23.11.2019 01:08Кодогенерация вообще ужасна в любом виде, и если вынести её наружу, то станет наверняка ещё хуже.
Сейчас читаю про Cog, может, это облегчит мне жизнь, вынеся все макросы в pre-build step IDE. Вообще, с помощью кодогенерации можно попробовать вынести микрооптимизации и часть оптимизация компилятора, но стоит ли оно усилий, я не знаю.
EDIT В хорошей статье lamerok «Безопасный доступ к полям регистров на С++ без ущерба производительности» описана шаблонная магия, которая здорово упрощает программирование для МК, но так писать я не могу — мозг ломается. Может, получится реализовать кодогенерацию на питоне и с большей понятностью.
Зато есть D, [...] честно говоря, не понимаю, почему он так непопулярен.
Я, честно говоря, не совсем понимаю, для кого он. Он как плюсы без значительной части legacy, но специфических фич не вижу, и в ногу тоже не сильно сложнее выстрелить. В качестве замены С++ мне больше Раст видится.Tanner Автор
23.11.2019 02:43Плюсы без лигаси ? это уже круто! А D ? это даже не плюсы без лигаси, а плюсы, спроектированные проще и чище. Один
foreach
чего стоит! А умные массивы и срезы! А какие простые в D лямбды!Lodin
23.11.2019 03:41+2Проблема в том, что он поставляется с garbage collector'ом, что сразу делает его конкурентом не C++ и Rust, а, скорее, Go, при том, что позиционируется он как конкурент именно плюсам. Плюс его противоречивая история, когда существовало две стандартные библиотеки; плюс чрезвычайно медленное развитие: например, когда я писал на D (а было это лет 5 назад), в него внесли экспериментальные аллокаторы, которые должны были снизить зависимость от сборщика мусора. Как я сейчас посмотрел, они до сих пор экспериментальные, в то время как Rust уже успел условно вторую версию языка выпустить.
В общем, проблем там хватает. И хотя по скорости и удобству написания он напоминает JavaScript — в том смысле, что ты можешь на коленке программу набросать, и она скомпилируется и запустится, — мне больше импонирует Rust. Писать на нём с непривычки, конечно, боль, но зато и предлагает он значительно больше.
0xd34df00d
23.11.2019 03:47Потому что не всегда можно адекватно разделить метачасть программы и обычную ее часть.
Gryphon88
23.11.2019 23:26Ну да. Но я всё равно не понимаю, чем шаблоны предпочтительнее in-place кодогенерации или даже целиком внешней, при условии, что сгенерированный файл мы не редактируем руками. Макросы, подкидыш семьи С, обсуждать будем? :)
xirustam
25.11.2019 11:00Вообще, конечно, ответ зависит от того, какой уровень развития человека, области его интересов, склад ума, и т.д. Если человек, например, изучает микроэлектронику в ВУЗе, то ему врядли стоит начинать с Python, т.к. это будет слишком далеко от программирования микроконтроллеров.
Если человеку программирование нужно просто побаловаться, то конечно нужен такой язык, который на первый взгляд очень похож на человеческий язык, чтобы ничего изучать не нужно было. Тем не менее, как и в игре на музыкальном инструменте, лучше начинать с базовых принципов, если только твоя цель — не играть на гитаре перед костром.
impwx
22.11.2019 21:22Для C# и F# есть прекрасное приложение LINQPad, в котором очень удобно писать короткие скрипты на C#. Можно просто написать
Console.WriteLine("Hello World");
и все — остальную портянку из неймспейсов и точки входа LINQPad сгенерирует и скормит компилятору сам.
Yuuri
22.11.2019 21:36Страшный и непонятный Haskell. Строки, функции, всё:
main = putStrLn "Hello world!"
akryukov
22.11.2019 22:13Очередной "эксперт" без преподавательского опыта рассуждает о преимуществах языка для начинающих на примере хеллоуворлдов.
Прежде чем выбирать язык, нужно понять кого мы собираемся учить и зачем.
KvanTTT
22.11.2019 23:26+1Та же Java, минус модификаторы доступа, плюс неймспейсы. Ничего интересного, проходим мимо.
Неймспейсы для "Hello World" не нужны. Т.е. такой код валидный:
class Program { static void Main(string[] args) { System.Console.WriteLine("Hello world!"); } }
Для PHP закрывающий тег почти всегд опускают, особенно когда он не препятствует разбору (используется при альтернативном синтаксисе). Т.е. код можно сократить до такого:
<?php echo "Hello world!\n";
ekha
23.11.2019 02:32ИМХО, если человека для начала обучить просто думать, как программист, типа квази-языка, чтобы просто мог формулировать ход мысли формальными шагами (та же классика блок-схем: действия, условия, цикл), то когда он это релаьно поймет, потом чисто техническая вещь — как синтаксически выразить то или иное действие. Различные структуры данных — сами подберутся при решении задачи, когда либо наставник подскажет, либо случайно наткнется в интеренете, либо по производительности будет проседать заметно.
Второй этап — различные глобальные подходы: ООП, процедуры и т.п.
Базы данных — отдельная история, требующая отдельного изучения. Взаимодействие с БД — также независимый момент, который плюс-минус в зяыках принципиально не отличается, когда уже понимаешь, что тебе надо.
PHP и другие языки, смешанные с неявным выводом, не стоит, ИМХО, изучать как первый, т.к. они могут заблудить потенциального крутого программиста, ибо он изначально вольется в смесь вывода и логики — просто потеряет время. Хотя бы на втором этапе их можно задействовать.
asm, конечно, топчик, но нафиг, если собирается идти работать «как обычный программист и зарабатывать кучу бабла» )
sabaca
23.11.2019 07:52Рассматривать пригодность языка только на примере хелловорда все же не совсем корректно. На мой взгляд, лучшим для начального обучения, остается Паскаль. Он позволяет последовательно шаг за шагом рассмотреть основные концепции императивного программирования. Речь идет, разумеется, о тех кто совсем не умеет программировать.
saag
23.11.2019 09:28У меня можно сказать такая же проблема, что и в статье, в школе, где я работаю ученикам в плане обучения ставится проект на WordPress, преподаватель подошла ко мне и спрашивает чему их учить, если они в программировании еще ничего не понимают, ну что тут скажешь раз в плане стоит WordPress значит PHP, хотя раньше другой преподаватель факультативно желающим преподавал Java начиная со скратча до создания форм.
akryukov
23.11.2019 11:47На мой взгляд. в проекте на водпрессе не обязательно кодить. Он может быть полезен, чтобы показать ученикам как устанавливать и запускать веб-сервер и СУБД, как разворачивать на нем вордпресс, как модифицировать его плагинами и темами, как наполнять его контентом. По пути можно захватить житейское объяснение IP, портов, DNS, хостинга, HTTP(S), SSL-сертификатов, SEO.
Mikluho
23.11.2019 09:31Tanner, как тут уже написали, вам стоило начать с двух ключевых вопросов треугольника обучения: «кого» и «для чего» учить надо, тогда третий вопрос «как» нашёл бы более ясный ответ. Программирование — это огромная область для изучения, и заходить в неё можно с очень разными потребностями.
Если школьники в рамках информатики, то изучать им надо базовые концепции программирования, и только немного про написание программ. Потому основы алгоритмов и структуру данных и немного про ввод-вывод. Тут уж правда, чем меньше будет «лишних» языковых конструкций, чем проще делать домашку, тем лучше.
В вузе уже очень много зависит от специализации. Так много, что с этого надо начинать, ибо гораздо лучше будут заходить примеры, связанные с понятной предметной областью.
Если же учиться решил уже взрослый человек, надо понять, для чего ему это. Сменить профессию? Тогда востребованность джуниоров на рынке рулит. Расширить компетенции? Тогда зависит от профессии.Tanner Автор
23.11.2019 10:32Как я уже отвечал выше в комментариях, я не претендую на всеобъемлющее решение этого вопроса, да мне это и не очень интересно. Я реагирую на вполне конкретную статью (перевод), в которой предлагается обучать полных новичков в программировании (возраст и мотивация не рассматриваются) на примере Java ? языка со слишком крутой кривой обучаемости. Характер этой кривой, и даже, кажется, само её существование автором исходной статьи просто игнорируется.
Всё, что я хотел показать в своей статье ? это откуда берётся эта кривая, и почему одни языки изучить новичку намного проще, чем другие. И что, соответственно, не все ЯП одинаково хорошо подходят на роль первого, «учебного» языка.Mikluho
23.11.2019 10:42+1Ваш посыл я понял, но тут спорят не с исходной статьёй, а с вашим мнением, и ему не хватает полноты. Если новичок пришёл учиться игрушки для андроида писать — то java не худший выбор.
Tanner Автор
23.11.2019 11:07Если при изучении Java у ученика возник ментальный блок, то лучше взяться за Python или JS с прицелом на Kivy (Cordova, React Native), чем продолжать штурмовать Java.
Иначе вы просто подменяете понятия: «обучение программированию» > «изучение Java».Mikluho
23.11.2019 11:21А вот тут уже много от преподавателя зависит, и от программы обучения. Я слабо себе представляю ментальный блок от java, который можно преодолеть переходом на phyton. Может и правда, если ему хочется игрушку для телефончика написать, то надо дать готовый каркас и учить сначала простые вещи делать, и уж по мере освоения расширять понимание того, как собирается программа, как она исполняется? Попутно и алгоритмы изучать?
Tanner Автор
23.11.2019 12:29+1Типичный ментальный блок отлично описал mSnus:
Для начинающих, первым языком? Которые не знают, что такое функция и переменная? Не говоря уж о классах…
Это сколько же времени пройдёт, прежде чем они сумеют написать
public static void main в своем Hello World и понять, что это и зачем вообще нужно? А почему public? А почему void? Я себе представляю школьников классе так в 5-м, которые путают ООП с ОПГ...
Я именно это и имел в виду, когда насчитал 12 концепций различного уровня сложности в самой простой программе на Java.
Как преодолеть ментальный блок? Очевидно, выбрать язык, который позволяет изучать все эти концепции по отдельности, или хотя бы в меньшей концентрации.
Может и правда, если ему хочется игрушку для телефончика написать, то надо дать готовый каркас и учить сначала простые вещи делать
А «готовый каркас» Android-приложения на Java будет содержать сотни строк кода и конфигурации, обычно автосгенерированных IDE, без учёта платформенных библиотек. То есть изначальная проблема усугубляется.
Я, наоборот, предполагаю, что от первых шагов до «взрослых» фреймворков ? путь неблизкий, и начинать надо с элементарного.CoreTeamTech
23.11.2019 17:41+2Я понимаю, что вы пытаетесь измерить, но это порочный метод. Это примерно то же самое, что измерять производительность программиста, количеством строк кода. Люди не так глупы, как вы пытаетесь представить. И ничто не мешает абстрагироваться от понимания, что есть public static void main() и писать арифметические выражения с выводом на консоль. Главная особенность программирования, как раз в построении и использовании абстракций. Поначалу все эти «заклинания» — просто карго-культ, но потом по мере развития, начинаются озарения, вроде, — вот оно для чего! Анализ — биологически, более прокачанный навык, чем синтез. Поэтому даже на презентациях никто и никогда, в здравом уме, не начинает сразу вдаваться в детали, а сначала показывают картину сверху, и только потом углубляясь в дебри специфики.
Mikluho
24.11.2019 08:03Эх… Не о том вы говорите… Одна из проблем образования вообще, и обучения программированию в частности, это слишком узкий взгляд на задачу. Если ребёнку не заходят в голову алгоритмы и он не понимает, что такое программа, то ментальный блок у него будет от любого языка. И это даже не касаясь языков, переходить на которые сложно даже опытным программистам.
Все эти "public void main" на первых порах не более чем шум, на который можно не отвлекаться. И пофиг, как он выглядит в конкретном языке.
lair
23.11.2019 13:46Я реагирую на вполне конкретную статью (перевод), в которой предлагается обучать полных новичков в программировании (возраст и мотивация не рассматриваются) на примере Java
Кстати, нет. Не предлагается. Там предлагается начинать изучать программирование (что сразу говорит о мотивации) с Java в качестве первого языка.
Что, впрочем, не отменяет того, что статья выглядит как рекламная.
И да, если вы хотите поспорить со статьей, то надо опровергать ее конкретные тезисы. Для людей, которым исходная статья не была интересна (типа меня), ваша статья выглядела самостоятельной — и, в таком качестве, слабой.
Viceroyalty
23.11.2019 09:43Запасся попкорном, даже не прочитав статью, заголовок все равно всех спровоцирует
pdima
23.11.2019 16:26С таким подходом лучше с scratch начинать, там нетривиальные концепции представленные в понятном виде для 7-ми летнего ребенка. Но неужели то что для печати необходимо вызвать функцию становится неопределимым препятствием для студентов?
scratchVlad800
25.11.2019 01:22+1Как я понял, рассматривается ЯП, который не просто будет первый, а на котором вообще будут учиться программированию. И здесь я абсолютно согласен с автором: на каждом новом уроке должна изучаться только одна новая концепция. И не просто изучаться — появляться на глаза ученика! Это ведь просто элементарная педагогика и психология: всё непонятное и необъяснённое только мешает (учиться / работать / жить).
Отсюда требования к такому ЯП:
а) Его транслятор/компилятор должен обладать «ступенчатой» сложностью («версионностью»). Например, сначала мы просто работаем с числами, а потом уже вводим обязательные типы. И только потом говорим, что может быть динамика. Или чтобы можно было «поиграться» с разными вариантами ООП, и т.д.
б) Среда его разработки должна устанавливаться одним щелчком мыши.
И я не уверен, что такой ЯП есть (Кумир еще не смотрел, ноосуждаюжаль, что не на английском, кмк).
Поэтому, к сожалению, приходится сравнивать промышленные ЯП в качестве «первого», что уже плохо, так как здесь у каждого человека есть свои весовые коэффициенты тех или иных фич (даже если он о них пока не знает).
UPD: А вот идти в алгоритмы (вверх) и в железо (вниз) можно будет только потом, когда ученик уже будет понимать, как это всё влияет на «выхлоп».
UPD2: А уже потом, в качестве первого промышленного, в настоящее время оптимален Python.
На HH.ru:
— 6 961 вакансия «C»
— 3 107 вакансий «JavaScript»
— 2 814 вакансий «Python»
— 2 628 вакансий «Java»
— 1 413 вакансий «PHP»
— 1 308 вакансий «C++»
— 1 241 вакансия «C#»
— 543 вакансии «Go»
С, JavaScript и PHP слишком узко-специализорованы и в них надо идти осознанно, а JavaScript еще немного запутанный (как для первого ЯП). У Java, C#, C++ высок порог входа. Go — мало вакансий.akryukov
25.11.2019 11:37+1И не просто изучаться — появляться на глаза ученика!
Нет такого требования. Что вы, что автор, видите проблему там, где ее нет. Это абсолютно нормально сказать: всякие
static void main
это у нас обязательное оформление, мы разберем его подробнее позже. Пока что цель изучить вот этот фрагмент и вот эту команду.
Каверзный вопрос "почему тут так написано" можно задать практически по любому языку.
Вот например для Python 3:
print('Hello world!')
Почему тут кавычки одинарные, а не двойные?
Почему тут скобочки круглые, а не квадратные/фигурные/угловые?
Мы всегда должны ставить восклицательный знак в конце команды?
Почему не работает фрагмент ниже?
print('Первая строка!')print('Вторая строка!')
Зачем команды писать на разных строках?
На все эти вопросы лучше всего ответить "так задумали разработчики языка" или "Так указано в стандарте Python. Если сделать иначе, то нас не сможет понять компьютер и другие разработчики".
Если отвлекаться на обоснование подобных решений синтаксиса, то можно потерять кучу времени, которое можно потратить на изучение действительно важных тем.lair
25.11.2019 11:49На все эти вопросы лучше всего ответить "так задумали разработчики языка" или "Так указано в стандарте Python. Если сделать иначе, то нас не сможет понять компьютер и другие разработчики".
… и, что характерно, подобное "магическое мышление" прекрасно работает при изучении многих других дисциплин, в том числе и в информатике, так что совершенно не понятно, почему программирование должно быть исключением.
Vlad800
25.11.2019 17:02Что вы, что автор, видите проблему там, где ее нет.
Есть разные подходы к преподаванию. Опираясь на свой опыт в этом, я и вывел свой подход.akryukov
25.11.2019 20:01Дело ведь в том, что я разделяю ваш подход "изучать одну концепцию за раз". Однако это не значит, что преподаватель должен всячески избегать оформительского кода. Уж тем более это не значит. что наилучший язык программирования тот, у которого самая тривиальная команда вывода "Hello world!" на экран.
Vlad800
25.11.2019 21:14Тогда какой объем оформительского кода вы считаете оптимальным? Для меня, очевидно, чем меньше — тем лучше.
akryukov
25.11.2019 21:42Я не оптимизирую количество оформительского кода, потому что нет такой цели.
В обучении программированию есть ведь более важные задачи. Например необходимость помнить об единицах измерения, оформлять ответ с нужной точностью, обрабатывать все ошибки.
Поэтому я все это требую, хотя это по сути это приводит к раздуванию оформительского кода. Например вывод результата вычисления площади круга может выглядеть вот так:
System.out.printf("Площадь круга равна %.4f метров", areaInMeters);
А в какой-нибудь задаче вычисления площади прямоугольника будет еще пачка условий вроде
if (widthInMeters >= 0){ System.out.println("Ширина должна быть неотрицательна"); return; } if (heightInMeters >= 0{ System.out.println("Высота должна быть неотрицательна"); return; }
Хотя, конечно же, проще написать что-то вроде
System.out.print(a)
и совсем не требовать проверки вводимых данных.
Когда приходится js преподавать, то для наглядности лучше кучу кода написать: html страницы, поля для ввода и кнопку. Так люди видят что-то похожее на реальную разработку, а не абстрактные упражения с консолью. Оформительского кода значительно больше, но люди с ним успешно справляются.
dategranif
25.11.2019 01:35На мой взгляд, не существует «простого» языка программирования для обучения. У каждого есть свои аспекты и подводные камни.
MikailBag
А где в этом C++ коде используются области видимости?
Tanner Автор
::
MikailBag
Но это же пространство имен вроде как.
Чем тогда является это:
?
Tanner Автор
Я могу плавать в терминах, но раз официальное название этой штуки ? scope resolution operator, то надо думать, что она имеет отношение к scopes (областям видимости).
kalininmr
кстати в сях некоторое время с этим был порядочный бардак.
и от реализации от реализации здорово отличалось.
Akon32
std:: ...