(ориг. фото)
Привет Гоферы,
я хотел бы описать мой опыт применения Go в качестве первого языка программирования для группы юных программистов. Я знаю, что на эту тему уже были посты (тут и тут), но они в основном касались обучения студентов, или, как минимум, взрослых. Также есть презентация на GopherCon от Одри Лим про её первый опыт программирования и Go.
Также недавно Мартин Купманс спрашивал советы на данную тему для своего сына.
И это первый подобный пост, который я нашел, связанный напрямую с обучением детей.
Моя ситуация была похожа на ситуацию Мартина. У меня была группа из двенадцати 11-летних школьников. В течении всего 7-недельного курса, примерно 12-13 часов, я смог их обучить Go в достаточной мере, чтобы они могли написать генератор фракталов Мандельброта. Но, что гораздо более важно, они понимали и разбирались в коде.
Что я понял из этого опыта, так это то, что Go не только хороший язык для обучения, но и что он великолепен для полных новичков в программировании, в том числе детей. Я попытаюсь обрисовать те аспекты Go, которые действительно важны, когда вы имеете дело с юными программистами, и как я пришёл к этим выводам.
Первый аспект, который помогал это синтаксис, читающийся слева направо. Если вам одиннадцать, то это схватывается интуитивно, потому что Go-код читается естественно, как текст. Это становится очень явным, когда вы спрашиваете детей, что они думают про ту или иную строку кода.
Второе, в Go мало ключевых слов. Если вы ребенок, то это становится важным, потому что создает ощущение, что учить не так уж и много. Изначально это позволяет детям трансформировать проблему обучения программированию в «Что эти слова означают и как их использовать?». После этого, проблема выглядит решаемой.
Третье, go fmt оказался незаменимым помощником сразу по многим пунктам. Это сильный прирост уверенности для детей, когда они знают, что они могут просто писать код и не волноваться про правильное форматирование, зная, что редактор, с помощью go fmt, подравняет код за них. Через некоторое время они привыкают к Go стилю и просто начинают сами писать также естественным образом.
Go fmt, по своей природе, приводит любой код к одинаковому стилю, и это имело интересный побочный эффект. Когда (но не если) дети спонтанно начинали помогать друг другу, и сравнивали программу, которая работает, с программой, которая не работает, они не смотрели на форматирование, а фокусировались на логике. Они фактически сравнивали последовательности шагов в каждой программе, чтобы найти отличия и исправить проблему. Go fmt уменьшает умственные усилия, необходимые для этого — без него, этот процесс занимал бы больше времени, так как отнимал бы больше умственных усилий, потраченных на продирание сквозь различия в форматировании. Так что go fmt оказался фактическим помощником в обучении и понимании. Он уменьшал для детей барьеры для понимания кода. Мой вывод из всего этого в том, что 11-летние нуждаются в go fmt по тем же причинам, по которым в нём нуждаемся и мы.
Четвертое, это go tool и рабочее пространство. Go tool сильно упрощает процесс для юных программистов. Как только они узнают, что всё, что им необходимо, это запустить «go run», они больше никогда не спрашивают, как запустить другую программу. Я им показал это буквально 2 или 3 раза. Я просто не могу представить подобное с помощью Makefile-ов или параметров командной строки. Это так просто, что дети просто это схватили моментально.
Рабочее пространство также помогало. Просто узнав, что им достаточно положить код в $GOPATH/src, чтобы всё работало, очень помогало, так как принуждало всех это делать. Детям не пришлось сталкиваться с ситуацией, что их программа не запускается, потому что она (или зависимости) находится в неправильном месте.
Когда я начал этот проект, я считал, что у детей будут хорошие шансы быстро освоить Go. Но всё же было несколько тем, которые по моему мнению могли бы быть проблематичными для объяснения.
Интересный случай тут представляют собой типы данных. Я думал, что для детей это будет по-настоящему сложный концепт для понимания, потому что он достаточно сильно абстрагирован. Именно по этой причине наиболее часто для обучения программированию используются «безтиповые» языки программирования. Но всё было с точностью до наоборот. Дети просто ухватили это на раз. Им достаточно было раз или два совершить ошибку с присвоением строки числовой переменной, чтобы понять, что компилятор им этого не даст сделать. Статическая проверка типов компилятора тут реально помогала, потому что она останавливала детей и говорила — тут есть проблема.
Но, конечно, типы ещё и действительно помогали. Дети должны были обосновывать, какой тип они выбирают, когда они объявляли переменную первый раз. Они разговаривали о том, для чего они хотят ту или иную переменную и затем выбирали нужный тип. Почти незаметно для них, это расширило их логические мыслительные способности.
Вместо IDE, я использовал редактор Atom и командную строку, чтобы учить детей. Я опасался, что отсутствие UI и кнопки «Старт» может быть проблемой для детей. Но они доказали мне обратное. Имея редактор с подсветкой синтаксиса, с интеграцией с go fmt, и зная, как собирать/запускать их программы, это не было проблемой вообще. Использование командной строки также не стало проблемой. Также, им не нужен был дебаггер. Когда их программы делали что-то неправильно, они просто возвращались в редактор, меняли код, пересобирали и пробовали ещё раз. Цикл исправить/собрать/запустить в Go настолько быстр, что им просто не нужен был дебаггер. Использование дебаггера каждый раз сильно бы их тормозило. Хотя, это может быть, отчасти, связано с маленьким размером проектов, которые они писали.
Фигурные скобочки для маркировки блоков тоже не были для детей проблемой. Дети банально про это никогда и не спрашивали. Возможно, это отчасти потому что go fmt всегда поправлял выравнивание скобочек. А возможно, потому что они никогда не программировали раньше, поэтому и не имели предвзятых убеждений по поводу наличия или отсутствия фигурных скобок. На данный момент я сам не до конца понял, что здесь первопричина для детей. Когда они забывали поставить скобочку, очень быстро они запоминали ошибку компилятора, которая об этом сообщала, и искали, где они пропустили скобку.
Какие выводы я могу из этого сделать? Не думаю, что команда авторов Go когда либо позиционировала язык, как хороший язык для обучения с нуля, но, по счастливой случайности, мы, похоже, имеем и хороший системный язык, и хороший язык для обучения программированию. Редкий подвиг, безусловно. Единственное, чем я могу это объяснить, это сам процесс дизайна языка. Выбрасывая больше, чем оставляя, и держа в главном приоритете простоту и ортогональность — как языка, так и тулинга — это оплатилось сполна, причем такой стороной, которую изначально мы даже не представляли.
Как говорили Расс Кокс и Эндрю Герранд на конференции GopherCon в этом году, мы, как сообщество, не должны терять из виду эти изначальные принципы Go, по мере развития языка. Если мы будем забывать о них, мы рискуем испортить жизнь как будущим программистам, так и себе.
И напоследок, если кто-то ещё пробовал Go, как первый язык программирования, особенно для детей, я буду очень рад услышать ваш опыт.
У меня также есть планы обучать большую группу и в течении большего периода, начиная с этого сентября.
С уважением,
Оуен.
Комментарии (61)
Don_Eric
13.08.2015 10:19Ссылка на оригинал битая. Вот правильная
groups.google.com/forum/#!topic/golang-nuts/FIRSDBehb3gdivan0
13.08.2015 16:48Да, это хабровский парсер не пропускает ссылку с Google Groups, поэтому поместил оригинальную ссылку вверх поста.
khim
14.08.2015 22:18Всё он пропускает.
Вы просто не умеете их готовить. Честно говоря я и сам не в курсе как правильно это делать. Для ссылок на сообшение — всё понятно: там в правом верхнем углу есть такая двойная стрелочка «Post reply» и рядом с ней — контекстное меню. Второй пункт. «Link» называется. А ссылки на topic? Понятно, что если заменить «forum/#!» на «d», то всё сработает — но как до этого догадаться?
TheOnlyOne
13.08.2015 10:39-18Что за тенденция обучать алгоритмизации используя высокоуровневые языки? Это приводит только к появлению кодеров, которые понятия не имеют как и что работают, но при этом гордо именующих себя программистами. Изучение высокоуровнего языка в 12 лет приведет к невозможности осознать элементарные языки у половины обучаемых в более старшем возрасте. С тем же успехом можно было использовать Java, C# или python, особенно у питона крайне низкий уровень вхождения и минимальные требования к синтаксису.
Bringoff
13.08.2015 10:42+5Что за тенденция обучать алгоритмизации используя высокоуровневые языки?
Изучая алгоритмы на низкоуровневом языке легко уйти в «железные» дебри. Большинство детей программистами не будет, так что им оно все ни к чему. Тем более, в 12 лет.TheOnlyOne
13.08.2015 10:46-11Большинство детей которые не буду программистами никогда в жизни не будут использовать алгоритмы. Большинство программистов и то умудряются их не использовать.
khim
14.08.2015 22:26Тут есть некоторая проблема. Не решив — кого мы хотим получить на выходе нельзя решить как именно нужно учить. Если нам нужен хороший программист — то начинать нужно вообще со всяких игрушек типа TIS-100, потом — разного рода низкоуровневые, но простые языки (Delphi — всё ещё неплохой выбор, хотя его последние версии всё-таки уже сложноваты), затем C/C++.
Если вам нужен человек, который сможет простенькие программки сам для себя писать — то тут Go и Python вполне уместны. Только нужно человеку сразу объяснить, что его учат, грубо говоря, «водить машину с автоматом» и не нужно думать, что он после такого обучения будет полноценным автогонщиком, способным успешно ездить на болиде Формулы 1 с ручной семиступенчатой коробкой на руле.dmbreaker
15.08.2015 01:23Вы так пишете, как будто Go в глаза не видели :)
khim
15.08.2015 02:07-1Видел и писал. Для своих задач — хороший язык. Но создан он вовсе не для обучения программированию :-)
У математиков есть такая поговорка: «Бог создал натуральные числа, всё остальное – дело рук человеческих». У программистов есть хороший аналог: «Шокли создал транзистор, всё остальное — дело рук программистских». Так вот для того, чтобы быть хорошим программистом вы должны это чувствовать. Не «помнить». Не «знать». Чувствовать.
Как обычно эту банальную тему (как и многие другие банальности) хорошо обыграл Джоэл.
Так вот. В современном мире это вообще сложно прочувствовать если не обращать на «корни дерева» внимание. Люди, работавшие на какой-нибудь ATшке могли точно посчитать сколько времени займёт та или иная операция. С точностью до наносекунды. И алгоритмы, требовавшие 10N операций были легко отличимы от алгоритмов, требующих 20N. Сегодня же это стало проблемой. Её уж никак не обойти, но это не смертельно: если вы используете пресловутый Tubro Pascal 7.0 или C/C++, то вы всё ещё можете «прочувствовать» корни компьютеров, созданные Шокли — в языке там нет ни одной конструкции, которая «непонятно как устроена» (в стандартной библиотеке есть — но вы ведь всегда можете в неё посмотреть и даже реализовать замену!), а аппаратура, в общем, «брыкает» не так и часто.
А вот Go (как и Python, как и JavaScript, как и куча других языков, как собственно почти все «современные», высокоуровневые языки) устроен так, что в нём есть вещи, которые непонятно как транслируются в транзисторы! У вас очень мало шансов увидеть как та или иная «рядовая» конструкция языка транслируется в машинный код! Но если в ответ на вопросы о том как работают некоторые базовые конструкции языка вы можете ответить только одним словом «магия», то вы можете создать себе проблемы «на ровном месте» и даже не заметить этого пока ваше поделие, которому, по хорошему-то, нужно меньше мегабайта памяти не начнёт уходит в swap на машине с гигабайтом…
Ну а «чувствуя» эту связь — вы можете программировать хоть на Go, хоть на Ruby с PHP: вы будете знать какие именно конструкции транжирят ваше время несмотря на то, что, вроде бы, там ничего сложного не происходит.dmbreaker
15.08.2015 12:35+1алгоритмы, требовавшие 10N операций были легко отличимы от алгоритмов, требующих 20N
Извините, вы из какого века? У нас тут давно уже оптимизирующие компиляторы, фрагментация heap, кэши процессора разных уровней. Как вы собираетесь по алгоритму языка определить 10 или 20 тактов он будет выполняться?
Кстати Go в этом смысле куда удобнее других зыков — в нем встроена поддержка бенчмарков, а как мы знаем — любые умозаключения о производительности без бенчмарков ничего не стоят.
Вообще Вы про Go пишете, как о чем-то Python-подобном. Хотя Go является улучшенным Си. Потому и складывается впечатление, что вы языка не знаете. Скажите — какие конструкции в Go вам неясно как устроены? Ну кроме горутин, которые в обучении можно и не использовать.khim
15.08.2015 13:34-2У нас тут давно уже оптимизирующие компиляторы, фрагментация heap, кэши процессора разных уровней.
А я о чём писал? Да, в сегодняшнем мире отличить 10N от 20N уже не так-то просто, хотя ещё совсем недавно это было тривиально. Хотя нет, вру — возьмите Arduino и будет вам «щастя».
Скажите — какие конструкции в Go вам неясно как устроены?
Ну если навскидку, то:
1. Работа «с кучей». Вы не поверите, но в User's Guide'е от пресловутого Турбо Паскаля было подробное описание того, как у него устроена «куча». А ещё там были чудесные процедуры Mark и Release, которые гарантировали, что выделение и освобождение памяти займёт константное время (за счёт весьма нехилых ограничений, налагаемых на программу, разумеется).
2. Интерфейсы. Вот вы берётесь описать, хотя бы в общих чертах, как происходит вызов функции через интерфейс? В какие примерно «финты ушами» это всё превращается «в железе»? А вот ARM подробно объяснял как работают виртуальные функции, наследование и в каких машинные команды всё это примерно выливается.
3. Map'ы. Весьма удобная конструкция — но вы знаете как оно устроено «внутри»? А User's Guide'е от пресловутого Турбо Паскаля Turbo Pascal объяснял как строки создаются, обрабатываются и передаются в функцию и из функции.
4. Ну и горутины, каналы и прочее. Там весьма немало магии — но как вы верно заметили, её можно и не использовать в обучении.
Много вы на Go напишите без использования интерфейсов и выделения памяти?
Вообще Вы про Go пишете, как о чем-то Python-подобном.
Ибо так оно и есть. Недаром на Go люди массово переходят с Python'а и весьма неохотно — с C++.
Хотя Go является улучшенным Си.
А что это меняет? Objective C тоже является «улучшенным C» и вообще с ним совместим (в одну сторону), однако «магии» в нём — почти столько же, сколько в Python'е или Go. И его использование — сопряжено с теми же проблемами.
Языки С, C++, Turbo Pascal (но не современный Embarcadero Delphi) «дотягиваются» до железа, причём оптимизирующие компиляторы этому скорее помогают, чем мешают (если только автовекторизацию выключить), а вот Go, Python, Java — нет, они «парят» где-то в воздухе. Это не делает их плохими, ни в коем разе — но это означает что если вы хотите «спуститься до транзистора», то вы вынуждены будете использовать что-то другое.Pryada
15.08.2015 15:39Недаром на Go люди массово переходят с Python'а
Более того, Гугл неоднократно говорил, что создавал Го на замену Питону.
На мой взгляд, Го хорош в качестве языка обучения из-за C-like синтаксиса (на хабре недавно была статья об этом), простоты изучения, строгой типизации.
После него можно уходить хоть наверх к динамически типизируемым языкам, хоть спускаться до битиков. Отличная стартовая площадка. Заинтересовать школьника Го может, причины неплохо описаны в обсуждаемой статье. А до «железа» ученик пусть спускается в институте. Там и математика посерьёзнее, и вообще, студент больше подготовлен к сложным темам.divan0
15.08.2015 16:17Более того, Гугл неоднократно говорил, что создавал Го на замену Питону.
А не поделитесь ссылкой (-ами)?Pryada
15.08.2015 16:36Это утверждение встречал в видеодокладах. Найти не смогу. Можно вычеркнуть это утверждение из моего коммента, смысл поменяется не сильно.
khim
15.08.2015 19:27Его, собственно, нужно не вычеркнуть, а заменить на строго противоположное. Вот тут: В то время как мы ожидали, что C++-разработчики увидят в Go альтернативу, в реальности большинство программистов на Go пришли из разработчиков на Ruby и Python'е. Очень немногие переходят с C++ (Although we expected C++ programmers to see Go as an alternative, instead most Go programmers come from languages like Python and Ruby. Very few come from C++.)
Такие дела. Go задумывался как низкоуровневый язык — последователь C/C++, но фактически получилась где-то менее удобная, где-то более удобная альтернатива Ruby и Python'у.Pryada
15.08.2015 21:51Я зря написал что Гугл об этом заявлял неоднократно. Такая большая компания никогда вслух не будет делать таких заявлений.
То что слышал — это слухи, конечно. Гугл таки разрабатывает этот язык для себя. По слухам, там где раньше использовался Питона на Ютубе, теперь используется только Голанг. Сейчас мне интересно, связано ли с Го преодоление «301 просмотра», совсем недавно Ютуб стал отсеивать накрутки в реальном времени, поэтому пауза на 301 просмотре теперь не нужна.
Although we expected C++ programmers to see Go as an alternative, instead most Go programmers come from languages like Python and Ruby. Very few come from C++.
Это удивление больше связано с использованием языка вне компании.
Вот то видео, историю Го с парой инсайдов начинает рассказывать с 00:01:40
Коротко: Гугл пытался ускорить Питон, делали проект Unladen Swallow, но его закрыли, видимо не достигли нужных скоростей. А сейчас все новые проекты внутри компании начинают на Го.AterCattus
15.08.2015 21:58+1Вот еще до кучи, как Google переписали свой dl.google.com с C++ на Go и получили профит. Где-то было по этой теме более развернутое описание, но сходу не нашел.
divan0
15.08.2015 23:07+2Go задумывался как низкоуровневый язык — последователь C/C++, но фактически получилась где-то менее удобная, где-то более удобная альтернатива Ruby и Python'у.
Ну нет же :) Go задумывался, как решение проблем С++ для того класса софта, который был необходим Google в больших количествах (клауд, сеть, etc), и он свою цель выполнил. Но это не тождественно утверждению «Go задумывался как низкоуровневый язык». А программисты С++ неактивно переходят на Go, потому что им сложно отказаться от всей той сложности, которую они учили годами, чтобы дойти до уровня «могу написать сетевой сервис, который не будет падать». Многие (по моему опыту) до сих пор считают, что важнее сэкономить 3 такта процессора, чем месяц рабочего времени. Слишком долго это вбивалось в голову, чтобы принять новые реалии. У Python-разработчиков такого нет, они гибче в общем случае и более открыты к новым технологиям.
guai
18.08.2015 18:18ИМХО, очень немногие переходят с C++ на что угодно вообще. И это совсем не обязательно говорит о качестве или о применимости к задаче этого самого чего угодно.
Я б скорее винил в такой вялости убежденность в том, что они уже изучили «самый правильный элитно-хардкорный ЯП», а всё прочее попса.
dmbreaker
16.08.2015 16:20Ибо так оно и есть. Недаром на Go люди массово переходят с Python'а и весьма неохотно — с C++.
Можно ссылку на эти исследования?
Я просто сам с C++ на Go перешел, до этого хотел на Питон перейти, но повезло, что появился Go. И все знакомые C++ разработчики, которые имеют опыт профессиональной разработки на других языках — плюются от C++ и не против сменить язык при возможности. Есть категория «консервативных плюсеров», которые знают только C++, они ярые сторонники этого языка, но оно и понятно :)
«дотягиваются» до железа
Извините я эти псевдо-научные утверждения не понимаю. Кто куда тянется? Что под этим вы подразумеваете?
dmbreaker
16.08.2015 16:34Map'ы. Весьма удобная конструкция — но вы знаете как оно устроено «внутри»? А User's Guide'е от пресловутого Турбо Паскаля Turbo Pascal объяснял как строки создаются, обрабатываются и передаются в функцию и из функции.
map — это хэшмап. У него возможны разные реализации, если очень нужно знать в подробностях — смотрите в исходниках, они свободно доступны. Если нужно посчитать производительность — то оценки работы хэшмапа известны. Если нужно знать точно — напишите бенчмарки (в Go это дело двух минут). Для целых чисел есть оптимизированная версия мапа.
Мапы никакого отношения к строкам не имеют.
Кстати, как там, в этих С++ (ну и Pascal и C) с UTF8? Сделали поддержку, или все еще нет? В Go есть описание как устроены строки.
divan0
15.08.2015 01:32То, о чём тут сейчас идет вялая дискуссия, называется top-down vs bottom-up design. Top-down подход (в контексте обучения) это вот то, что пишут и плюсуют выше — сначала дается общая картинка (big picture), понимание общего дизайна и структуры программы, а уже потом, по мере углубления в ту или иную тему, более детальное изучение «внутренностей». При bottom-up подходе, который вы рекомендуете — сначала даются детали всех составляющих кубиков (пазл про ассемблер, как там биты бегают и тд), из которых уже далее создаются более сложные конструкции.
khim
15.08.2015 02:16Вопрос не в том, описывать всю конструкцию снизу или сверху. Вопрос в том: имеете вы в конце обучения целостную картину мира у себя в голове, которая описывает как из транзисторов образуются картинки на экране или нет.
Если имеете — то вы можете быть «гонщиком» (а можете и не быть, тут, конечно, ещё практика нужна), если не имеете — то рано или поздно вы попадёте в ситуацию, когда вы даже не сможете понять что у вас там в программе происходит, почему она работает не так хорошо, как хочется и как это починить.
Если вы пишите «маленькую программку для себя», то ничего страшного: ну сходите, попьёте чай, пока ваша программа работает. Если вы хотите что-то сделать, с чем вы хотите «в бой» вступать — то этого недостаточно.divan0
15.08.2015 02:25Я понимаю, почему вы в такой приоритет поднимаете low-level знания, но я не согласен. Для того, чтобы ребенок понял, что есть программирование, что есть язык программирования, как можно давать команды компьютеру, заинтересовался в конце концов и начал изучать дальше — не нужно учить ассемблер и устройство кешей процессора. Будет надобность — выучит и освоит (top-down), и будет у него «картина целостная», как и ваша.
Но, как заметили выше, не все дети станут программистами, а вот мышление им поставить и дать азы программирования — это важно.khim
15.08.2015 10:09А кто вам сказал, что я поднимаю low-level в приоритет? Все эти статьи обычно озаглавлены как «XXX как первый язык программирования», но в них редко озвучивается ответ на вопрос «а какой же будет последним». И, как я уже говорил выше, вопрос «а кого мы хотим получить» тоже обычно опускается.
Я вообще против того, чтобы «ставить мышление» и «давать азы программирования» — по крайней мере в том возрасте, когда человек способен освоить Go (то есть лет в 13-14). Это нужно делать (если делать) раньше и там выбор резко сужается, ни о каком Go и речь идти не может, мы попадаем во владения всяких MicroWorldsов (хотя, возможно, Python при должной аккуратности может пойти). В 13-14 лет же нужно учить язык, с которым, если человек не свяжется с программированием, он может «прожить» всю жизнь. И тут преимущество — однозначно у Python'а. Просто потому что он не столь сложен, как C++, но при этом вы сможете на нём примочку для LibreOffice сделать и данные от своих экспериментов по физике-химии обработать.
А для тех, кто хочет либо заниматься программированием в будущем, либо участвовать в олимпидах, можно отдельно сделать факультатив с C/C++.
Проблема с фундаметальными, низкоуровневыми, знаниями в том, что их нельзя выучить когда «будет надобность». Как нельзя научиться ремонтировать автомобиль, когда «будет надобность». Потому что «надобность» возникает, когда у вас абстракции протекают, а в этот момент у вас не будет времени (месяцы!), ни возможности (начальство уже всю плешь проело!) для того, чтобы понять — что именно там и куда вытекло. В лучшем случае вы найдёте «гуру», который сделает «что-то непонятное и необъяснимое», что всё починит, в худшем — ваша программа будет страшно глючить (как показывает практика второе случается сильно чаще).dmbreaker
15.08.2015 12:39+1А для тех, кто хочет либо заниматься программированием в будущем, либо участвовать в олимпидах, можно отдельно сделать факультатив с C/C++.
Насчет C может быть, но никак не C++. Зачем обучать школьников языкам, которые очень плохо спроектированы, провоцируют создание ошибок и при этом очень сложны в изучении. Да они один стандарт только и будут читать на этих факультативах. Здесь куда лучше подойдут Go, Java, C# и т.п. языки, которые учли ошибки С++ и при этом тоже реально используются в разработке.
Я к тому, что пускай C++ учат в университетах. А в школах это отобьет всякий интерес.khim
15.08.2015 13:44Зачем обучать школьников языкам, которые очень плохо спроектированы, провоцируют создание ошибок и при этом очень сложны в изучении.
Потому что это — низкоуровневые языки, где вы можете контролировать всё (ну, по крайней мере, всё, что позволяют контролировать современные CPU).
Здесь куда лучше подойдут Go, Java, C# и т.п. языки, которые учли ошибки С++ и при этом тоже реально используются в разработке.
А смысл какой? Все эти языки — языки высокого уровня, в них куча дырявых абстракций, как железо исполняет вашу программу они вам понять не помогут.
Да они один стандарт только и будут читать на этих факультативах.
А C# вы тоже начнёте с изучения спецификации? В ней, между прочим, полтысячи страниц и при этом она ещё и описание стандартной библиотеки не включает (в отличие от стандарта C++)!
Я к тому, что пускай C++ учат в университетах. А в школах это отобьет всякий интерес.
Зависит от его наличия, в общем-то. По крайней мере при изучении C/C++ у вас есть простая и ясная цель — вы можете заставить комьютер делать всё: можете сделать программу работающую «на голом железе», а можете — взять и изменить Web-браузер. Это — весьма сильная мотивация. А вот какая цель учить несколько языков, где вас «к железу» не пускают — не очень понятно.dmbreaker
16.08.2015 16:46+2Потому что это — низкоуровневые языки, где вы можете контролировать всё
Будьте реалистом — выделение памяти в хипе вы не контролируете. Более того, при активной работе с памятью у вас растет фрагментация и оказывается, что память у вас немного «течет», а выделение новой памяти начинает занимать больше времени. И все, о каком контроле идет речь после такого? При этом CLR для C# может дефрагментировать хип, а вы на C++ этого не можете. Можно, конечно, писать свои аллокаторы, но это не то же самое, как «контролировать все».
И не путайте, пожалуйста, стандартную библиотеку C#/Java/Go с библиотекой C++. Их возможности просто не сопоставимы. До C++11 это вообще было что-то с чем-то. Только сейчас в C++ появился необходимый минимум!
Давайте откажемся от этого глупого выражения «вас «к железу» не пускают» — это какие-то ваши ограничения в голове. Просьба писать конкретно к чему вас какой язык «не пускает».
divan0
15.08.2015 16:27А кто вам сказал, что я поднимаю low-level в приоритет?
Вы, когда написали, что изучать программирование нужно с игрушек для понимания ассемблера. Хотя перечитал ваше сообщение, и вы там Delphi называете низкоуровневым языком, видимо мы о разных low-level.
Проблема с фундаметальными, низкоуровневыми, знаниями в том, что их нельзя выучить когда «будет надобность»
И что же мешает человеку, умеющему писать алгоритм поиска в ширину на Паскале, взять книжку по ассемблеру или курс на курсере по устройству процессоров, и углубиться как угодно подробно в любую тему? Мне кажется, вы сейчас какой-то свой опыт экстраполируете на всех.
Go как раз хорош, как первый язык, по вашим же аргументам, по двум причинам — с одной стороны, он достаточно легкий для освоения, с другой — он достаточно низкоуровневый, чтобы уметь работать с битами, с поинтерами и давать хороший инсайд в то, что происходит под капотом (escape-анализ, ассемблерный вывод и тп).khim
15.08.2015 17:16И что же мешает человеку, умеющему писать алгоритм поиска в ширину на Паскале, взять книжку по ассемблеру или курс на курсере по устройству процессоров, и углубиться как угодно подробно в любую тему?
Вы издеватесь или действительно не понимаете? Это когда у него него совещания по четыре раза на дню и начальник огонь изрыгает он будет брать курс на курсере по устройству процессоров?
Изучить «когда хочется» эти вещи можно, «когда нужно» — нельзя. Слишком большой пласт там упрятан. А требуются эти знания почти исключительно когда у вас очередная абстракция «протекла» и нужно «тушить пожар».
Вы, когда написали, что изучать программирование нужно с игрушек для понимания ассемблера.
Я сказал, что это нужно делать если вы хотите получить хорошего программиста. Если такой цели не ставится — то, разумеется, в эти дебри знать не нужно, нужно уметь пользоваться существующими библиотеками и уметь как-то их «скотчем скрутить» для получения нужного вам результата.
darthandrew
13.08.2015 13:17+1Для начинающего как раз «высокоуровневые языки» лучше. Никто ведь не хочет начинать с ассемблера? С++ тоже еще та жесть, сделайте оконное приложение, например, WinAPI. Но возьмите C# и например что-то типа WinForms — и человек получит «счастье» что у него получилось. Он может не думать, как ему сделать тулбар или кнопку, или диалог открытия файла, а решает задачу, пусть и детскую.
Позже жизнь расставит все по местам. Для применения инструмента не обязательно детально знать, как он сделан, на то оно и высокоуровневое программирование.TheOnlyOne
13.08.2015 14:18-1Если человек для обучения программированию пишет оконные приложения, нужно поднять вопрос о том какие цели ставятся перед преподавателем. Меня (как и всех кто учил существующих программистов) обучали алгоритмизации по блок-схемам и языку низкого уровня. Не примитивного, а именно низкого — классические языки для обучения: паскаль, си (без плюсов), бэйсик, фортран. Использование любых фреймворков, даже встроенных в язык это уже не алгоритмизация, а прикладное программирование. Прикладное программирование без понимания работы используемых средств — банальное быдлокодерство. Большинство молодых программистов на ява/c# сейчас как раз относятся к типичным пользователям фреймворков.
f0rk
13.08.2015 22:07+4Сужу по личному опыту ученика, у которого был замечательный преподаватель информатики в школе. Цель преподавателя — заинтересовать. Главное, что бы что-то начало получаться как можно скорее. Если человек однажды получил кайф от того, что написанный им текст превратился в программу, которая что-то делает, то все, он попался. От профессии программиста после этого не отвертеться. Все остальное — второстепенно.
megalol
13.08.2015 23:22+1>Меня (как и всех кто учил существующих программистов) обучали алгоритмизации по блок-схемам и языку низкого уровня
Синдром утенка.
>паскаль, си (без плюсов), бэйсик, фортран.
>бэйсик
Лол. Классно научили, значит.TheOnlyOne
14.08.2015 08:09Конкретно меня на бэйсике не учили, к счастью :)
Но такую практику я в вузах и школах встречал.
dmbreaker
15.08.2015 01:30+1Большинство молодых программистов на ява/c# сейчас как раз относятся к типичным пользователям фреймворков.
Вы слишком категоричны. А рынку плевать на ваше мнение, ему если нужны «пользователи фреймворков», значит будут.
А Go вполне себе язык низкого уровня, но вы же на нем не писали ничего, верно?
burjui
13.08.2015 18:53Ну не знаю… Я начинал в 16 лет вообще с Quick Basic, потом перешёл на Pascal, потом на C++. Голова от указателей не болит, от ассемблерных листингов не рвёт, всё хорошо. Алгоритмы пишутся и работают, проблемы надуманы.
divan0
13.08.2015 18:58+1Я бы удивился, если бы кто-то написал «голова болит от указателей» )
На самом деле это очень интересная тема, и любой практический опыт ценен. Мне сейчас кажется, что детям важно сначала давать понимание базовой логики и блоков: условия, циклы, функции, вот это всё, и язык тут главное чтобы не был переусложнен. Понимание, как оно там бегает внутри на уровне байт — прийдет позднее, если понадобится, но имхо алгоритмическое мышление нужно ставить до того, как объяснять низкоуровневые абстракции.burjui
14.08.2015 00:14+3У меня настоящий интерес к программированию проснулся, когда я, копаясь в школьном компе, наткнулся на чей-то исходник на QBasic, где был цикл for, который нам ещё не объясняли. Тогда я и проникся алгоритмическими возможностями компьютера. Так что я полностью согласен с тем, что все эти низкоуровневые штуки на начальном этапе будут только мешать. Главное — объяснить новичку, что компьютер умеет, и как его заставить это сделать (чем проще, тем лучше). Когда он войдёт во вкус, окрепнет и у него появятся потребность понять, как реализованы те или иные абстракции в его любимом языке программирования и стандартной библиотеке, он сам придёт к C, ассемблеру и т.п. Это практически неизбежно, если человеком движет любопытство.
gto
13.08.2015 11:28Автор, отдельное спасибо за ссылку на оригинал. Не в каждом переводе такая роскошь.
divan0
13.08.2015 16:51+1Не уверен, что правильно понял. Ссылка на оригинал есть в каждом переводе на хабре (внизу поста), но в данном случае парсер хабра её не принимал, поэтому я указал ещё и в тексте.
gto
13.08.2015 17:32+1Век живи, век учись. Вот она оказывается где. Что ж, тогда спасибо беру обратно. Хотя всё-равно спасибо за перевод.
reality
13.08.2015 21:13+2Хорошо если бы Go так и остался быть языком для школьников, а то ведь некоторые его и в продакшн тащят
divan0
14.08.2015 00:25+3Ага, тащят и рубят деньги, пока языковые хейтеры трудятся над вот такими комментариями )
6opoDuJIo
14.08.2015 00:341. Заходим на вики: ru.wikipedia.org/wiki/Go
2. Читаем:
Синтаксис языка Go схож с синтаксисом языка Си, с отдельными элементами, заимствованными из Оберона и скриптовых языков. В коде на Go очень мало точек с запятой — как точку с запятой Go трактует конец непустой строки (при определённых условиях). В результате этого в ряде случаев нельзя использовать перенос строки, например, в таком:
func g() { // НЕВЕРНО }
3. Закрываем.
Go слишком замечателен и инновационн для того, чтобы не зависеть от переносов строки, поддерживать наследование или полиморфизм. Всё это нужно только хейтерам.divan0
14.08.2015 01:58+4У меня нет проблем принять тот факт, что некоторые люди очень болезненно отказываются от привычек и убеждений. Тоесть, когда человеку дают новый инструмент, а он говорит «он не похож на старый, значит он плох» — с этим можно смириться, люди такие люди. Но давайте и вы будете объективными, и если реальность такова, что этот инструмент, вне зависимости от того, нравится он вам или не нравится, в продакшене показывает свою крутость и тысячи людей, помимо вас, успешно этим пользуются — то хотя бы имейте смелость это не отрицать. Тогда хоть будет о чем говорить.
keksmen
14.08.2015 07:46Если все начнут мыслить объективно, то некому будет писать подобные «хейтерские» комментарии. С кем же говорить тогда?:D
А оценивать язык по синтаксису его операторных скобок — глупо.
dmbreaker
15.08.2015 01:35+4Ой как я нагляделся на эти ваши
void g() { }
В Go, особенно с go fmt, код всегда выглядит красиво и одинаково, вне зависимости от того, какую религию исповедует тот или иной разработчик.
cy-ernado
14.08.2015 10:27+4К сожалению для вас, Go уже перестал быть языком для школьников, и очень широко используется в продакшене, а если вы переведете ваш затуманенный вгляд чуть правее, то увидете
Docker в банке. Видео с лекции Александра Тарасова из Альфа-Банка.
Поспешите сказать Альфа-банку, что они неправы. И вышеперечисленным ребятам заодно. Ваше мнение очень интересно.
Pinkkoff
14.08.2015 12:19+2Мне кажется, выбор языка для обучения важен не для ученика, а для преподавателя. Необходимо, чтобы преподаватель сумел заинтересовать ребенка, дать ему стимул и привить желание учиться. Лучше это делать на знакомом и любимом языке.
Остальное вторично.
dmbreaker
15.08.2015 12:52Раньше никогда не думал насчет Go как о первом языке. Но сейчас понимаю, что его лаконичность, строгость и простота — это действительно то, что нужно при обучении.
father_gorry
А не напишете пошаговую инструкцию по установке Go на детский компьютер? Чтобы он сразу мог Hello world запустить.
ingrysty
1. Качаете с сайта установщик, в зависимости от системы — https://golang.org/dl/
2. Устанавливаете.
3. Создаете системную переменную GOPATH=«путь до папки с проектами».
4. Переходите в эту папку, там создаете 3 новых папки — «bin, pkg, src».
5. Переходите в папку src, создаете новую папку под свой проект/программу.
6. В созданной папке создаете файл main.go и пишите туда — http://play.golang.org/p/duRF5gXJEP
7. Открываете консоль, переходите в вашу папку и пишите «go run main.go».
Обучение по установке закончено.
paullarionov
Наверное, father_gorry хотел еще узнать об установке инструментов разработки для школьников типа go fmt.
divan0
Они ставятся на этапе 2, стандартным инсталлятором (в Linux — apt-get/yum/etc, Windows и Mac — стандартный инсталлер с тремя кнопочками «Next»).
Кстати, папки bin и pkg можно не создавать, они создадутся автоматически во время первого билда. Достаточно только src. Я вообще рекомендую GOPATH устанавливать в ~ и тогда достаточно все проекты ложить в ~/src.
father_gorry
А, вот же хороший пост есть: habrahabr.ru/post/133281/
Там понятно про GOPATH рассказано.
И затем переходим на golang.org/doc/effective_go.html
divan0
Вот ещё статья: habrahabr.ru/post/249545