Pull to refresh
102
0.2
Роман Смирнов@Source

Head of Elixir at Ecom.tech

Send message
Изначально этот список языков был приведен не с мыслью выбрать что-то одно… А продемонстрировать разные концепции на наиболее подходящем языке, т.е. разные языки для разных концепций. С цитатой прекрасно сочетаются Haskell и Racket.
А конкретно эта ветка про то как «сложно» в Haskell без циклов.
Убить полтора часа над схематической записью в тетради без возможности проверки «выхлопа» алгоритма — на мотивацию не похоже.
Так я и не предлагал в тетрадке программировать, хотя мы в школе именно этим занимались первые полгода в 10-м классе, а потом нас к Агатам допустили, вот такая веселуха была в начале 00-х.

По крайней мере, дети будут понимать, как работают чужие велосипеды, признанные «готовыми решениями для автоматизации типовых задач».
Опыт мне подсказывает, что признанные решения редко совпадают с первым, что в голову пришло. Но здравое зерно тут тоже есть, хотя бы иллюзия понимания будет, которая придаёт некоторую уверенность в своих силах.
Вы про эти 5 языков? Серьезно?
Вполне. Разве что насчёт C сомневаюсь, слишком низкоуровнево для непрограммистов.
А в остальном я за те языки, которые учат думать. Нравится или нет, но Java и Python учат разве что искать готовые решения на SO.
Pascal — структурное программирование, классические структуры данных и алгоритмы
Smalltalk — обмен сообщениями, ООП, программирование через отладку, интроспекция
Haskell — алгебраические типы данных, изоляция побочных эффектов, ФП
Racket — гомоиконность, метапрограммирование, DSL

Наколеночный ежедневник я, собственно, писал. Тысячи полторы строчек вышло.
Я не про кол-во строчек, а про то, что в современном мире ежедневник без мобильных клиентов — это чисто учебный проект, делайте хоть с программным интерфейсом, хоть с консольным, хоть с GUI, никому кроме автора он не нужен будет.
Учить чему-то на том же Паскале или Бейсике, как мне кажется, форменное издевательство. Да, у них очень невысокий порог вхождения, что есть, безусловно, плюс. С другой стороны, дальше чем «пописать сортировку в учебных целях» на них не уедешь.
Откуда такое пренебрежение к Паскалю и Бейсику? Есть же Component Pascal, Object Pascal (он же Delphi), Visual Basic .NET. Что такого на них нельзя написать, будучи школьником?
И Вы совершенно верно написали, что есть огромное количество преподавателей, которые их уже знают хоть в какой-то мере.

но не даем никаких возможностей для роста будущим «рок-звездам» в программировании.
Да ладно, для таких достаточно предоставить доступ к компьютеру :-D
С прикладным применением всё равно не угадать… Вспомните, когда Вы в школу поступили, какие из сегодняшних мейнстрим-языков хотя бы существовали?
Согласен, путаница вышла. Хотя для языков, которые не поддерживают ни то ни другое прозрачно, лучше частичное применение реализовать, а то f(a)(b)(c)(d) уже сложно читать, а что-то типа carry(carry(carry(carry(f, a), b), c), d)() и подавно.
В разделе «Пример использования каррирования» у Вас показано не каррирование, а то, что функции являются объектами первого рода, т.е. функция может вернуть функцию.
Каррирование — это когда функция принимает N аргументов, мы ей передаём M параметров и она превращается в функцию, принимающую N-M аргументов, где N >= M && M > 0. Swift скорее всего не поддерживает такое из коробки.
Возможно, Вы сможете определить свою функцию carry(fn, arg), которая будет принимать произвольную функцию и первый параметр для неё, и возвращать её в каррированном виде.
Вторая (концепция опциональности) — заставляет нас думать о возможных крайних случаях и ошибках, которые могут прийти извне, и обрабатывать их корректно.
В Haskell Вы наоборот не думаете о крайних случаях и не определяете функций, которые принимают Maybe (если следуете концепциям языка). Это особенность как концепции опциональности, так и монад в целом… Вы пишете функции, которые принимают чистые значения и возвращают монадические, обо всём остальном заботится >>=, сам по себе или внутри do-блока.

Ещё в определении sum есть лишняя строка:
sum (x:[]) = x -- one element

Спору нет, упростить и в каком-то объёме рассказать можно почти всё, что угодно. Но в данном вопросе я не вижу связи с информатикой… да, нечёткая логика применяется в нейронных сетях и ещё в нескольких областях, но это уже не основы информатики. Давайте по-честному, этими темами от силы 0.1% профессиональных программистов владеет.
Ну не знаю, спорить не буду. Просто лично я не вижу практического смысла в глобальном объединении всех предметов.
А как тогда работать с упорядоченными массивами? Просто кастовать «примени ф-цию чтотонужное() к массиву девайсы»?
В том же комментарии, который Вы процитировали есть ответ: функции высшего порядка (map, filter, reduce), генераторы списков и рекурсия. Да, некоторые низкоуровневые алгоритмы останутся как есть, но это уж точно только профессиональных программистов должно интересовать, а не школьников.

Но компу всё равно придётся элементы перебирать по очереди, даже если высокоуровневый язык позволяет об этом не знать.
И что? Причём тут циклы?
На уровне ассемблера есть только goto (jmp, loop) и goto по условию (jpe, jnz, ...). Ну, реально нет циклов в архитектуре современных компьютеров, что тут поделать…

Нового железа уже не будет и всё можно будет писать на высокоуровневых языках?
Я уже чуть выше писал, что новое железо вообще может принести новую архитектуру и будет вам Quipper вместо C. Только опять же причём тут циклы?

Только вот циклы — как раз одна из таких концепций, о которой не рассказать, выходит, нельзя.
Да можно, так же как на уроках физики про теорию эфира рассказывают… Исторический фактор никто не отменял.
> Уровень развития интеллекта старшеклассников уже достаточен для некоторых видов работы.

Причём тут это? Нечёткая логика — раздел высшей математики, который изучается уже поверх знания теории вероятностей, классической логики и теории множеств. Предлагаете всё это в школьную программу затолкать? o_O

> нечёткая логика очень даже хорошо реализуется через булевую.

Реализуйте для начала через булеву логику такие понятия как «может быть» и «да нет, наверное».

Ну и немножко из классики жанра
В одном банке работал программист, исправно ходил на работу…
Hо вдруг не пришел, день нет, второй, народ заволновался, приходят к нему домой, стучат… нет ответа, ломают дверь, находят его синим в ванной. А в руках флакон шампуня с инструкцией на обороте:
1. Hанести шампунь на голову
2. Помассировать
3. Через 5 минут повторить…

Жена посылает программиста в магазин:
— Купи батон колбасы, а если будут яйца, купи десяток!
Приходит программист в магазин.
— У вас яйца есть?
— Есть!
— Дайте мне 10 батонов колбасы!
просто все люди (включая учителей) — разные

Кто ж спорит… но мы тут вроде обсуждаем, что хорошо было бы включить в школьную программу, а вот она едина для всех. Вопрос её подачи — это уже другой вопрос.


А в школе не время/не место изучать такие формы для демонстрации?

Дело в акцентах. Вы гнёте линию, что надо выбрать какой-то один ЯП и учить ему. А я говорю о том, что информатика не об этом и надо учить концепциям с использованием 5-6 языков, не углубляясь в stdlib и прочее. Практически у каждой дисциплины есть 2 стороны — фундаментальная и прикладная. Фундаментальную учат в школе и в ВУЗах, прикладную — преимущественно в ПТУ или на работе. Так устроено изучения абсолютно всех наук, и я не вижу причин почему информатика должна тут быть не такой как все.


в одном слове: асинхронность

Вот хотя бы этот пример. Зачем нужна асинхронность? Чем она отличается от многопоточности? Чем параллельность отличается от конкурентности? Какие существуют модели конкурентности? В чём недостатки модели конкурентности в Node.JS и для каких задач она не подходит?
Вот на какие вопросы должно отвечать образование, а не выбирать что-то одно подо всё. "No Silver Bullet" ©

Да я в общих чертах представляю что такое STEM. Просто Вы забыли, что в школе есть ещё и куча гуманитарных предметов. Или предлагаете литературу тоже в концептах математики разбирать? А вместо изучения правил русского языка заняться частотным анализом?
Физика с математикой и так всегда связаны были, в том числе и в школьной программе. Химия тоже с ними переплеталась. Ну добавили биологию и информатику к ним ещё. Это всего 5-6 школьных предметов. А всего предметов, емнип, раза в 4 больше.
С остальным я, в принципе, и не спорю… Хотя всё это разнообразие аббревиатур наводит на мысли о горе-маркетологах. Особенно доставляет GEMS с дискриминацией по половому признаку… как они такое название в США зарегистрировать то смогли )))

Ну, STEM — это даже не половина школьных предметов )))

Я бы в школе учил как решать обычные задачи автоматизации и обработки.

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


Perl, к моему большому сожалению, заглох

Так вон же, Perl 6 вышел, только я почему ты сомневаюсь, что Вы забросите Python и вернётесь обратно.


А смысл в концепциях без языка?

Развитие мышления. Это гораздо полезнее, чем любой конкретный язык.


Как вы сами понимаете на продукцию этих фирм завязаны миллиарды и что-то менять просто так они не будут.

Не понимаю, Вы ж сами написали, что они переходят на Python… Значит ничто им не помешает и перейти с Python на что-то другое. Это всё лишь вопрос времени. Пока в индустрии консенсусом на тему языков программирования даже не пахнет. А значит всё ещё не раз поменяется.


Так в том-то и дело, что на Java написано уже столько, что переписать уже точно не получится.

С одной стороны написано много, с другой стороны всё переписывать и не нужно, многое устаревает само собой. К тому же я перечислял языки под JVM в предыдущем комментарии, именно они пока теснят Java как язык. С каждым годом причин выбрать именно Java, а не другой JVM-язык для нового проекта всё меньше, поэтому всё возможно.


В общем-то тут 2 варианта: либо всё стабилизируется как есть, либо текущие мейнстрим-языки уйдут в узкие ниши вместе со всем legacy… В первый вариант мне лично слабо верится. А если какие-нибудь квантовые компьютеры вытеснят обычные, то вообще прощайте все популярные ЯП, привет Quipper )))

Вы путаете тёплое с мягким… Все алгоритмы бытового/общественного плана построены на нечёткой логике. И это весьма сложная тема в формализованном виде, явно не под силу школьникам. Однако люди оперируют нечёткой логикой на интуитивном уровне и им для этого школа вообще не нужна.
Компьютерные же алгоритмы, за редким исключением, построены на булевой логике, которая за пределами компьютеров относительно редко встречается. Попробуйте для прикола осознанно использовать булеву логику при общении, все окружающие мигом заметят, что Вы странно себя ведёте :-)

Потому что они на уровне вкусовщины… Можете представить фразу типа "мне много лет нравилась механика, пока не узнал про термодинамику"?
Учебная программа — серьёзная вещь, в ней нет места личным пристрастиям. И ещё раз подчеркну, что языки программирования — это не объект изучения для школьной информатики. Это лишь форма записи для демонстрации концепций.

Уметь программить — это не опция, а насущная потребность сегодняшнего дня.

Ну ё-моё, зачем всех под себя подстраивать? Я тоже могу сказать, что умение объяснить почему небо голубое — это насущная потребность сегодняшнего дня. Все люди разные, для кого-то элементарная арифметика в уме уже за гранью понимания...

Вы предлагаете Haskell как один из подходящих? Хорошо. Расскажите мне как на нем писать циклы. Или циклы не нужны? ;)

1) Чтобы прояснить, я предлагаю использовать несколько языков, каждый для демонстрации отдельных концепций в чистом виде. Вы знаете язык, который лучше Haskell подходит для демонстрации алгебраических типов данных и отделения побочных эффектов? Это концепции, которые полезны сами по себе и даже если человек станет программистом они пригодятся в любом языке. Сейчас большая проблема в том, что программисты не хотят развивать мышление… Многие пару месяцев поучившись на курсах сайтики делать, с горем пополам трудоустроившись после этого, считают что дело в шляпе, забывая что они находятся на уровне первого семестра ПТУ.


2) Теперь про циклы… Циклы — это абстракция, которая была удобна на определённом этапе развития индустрии. Сейчас её спокойно можно считать устаревшей. Все мейнстрим языки переползли сначала на итераторы, а потом на функции высшего порядка, генераторы списков и рекурсию, которые в Haskell изначально. Я не исключаю рассказ про циклы в рамках рассмотрения С, но в целом — да, они не нужны уже сейчас в 99% случаев.


Слишком уж хорош Python для своей ниши

То же самое про Perl говорили 20 лет назад. Когда дети закончат школу, выйдет какой-нибудь Python 4, на который ещё 10 лет переходить будут… Спасибо, но ну нафиг )))


Java умрет, как ей пророчат с 90-х годов прошлого века

C самого рождения или даже чуть раньше? o_O
Если серьёзно, то Java как виртуальная машина разумеется протянет ещё 10 лет точно, но как язык — разве что для поддержки legacy. Я стараюсь в этот стек вообще по минимуму заглядывать, но очевидно ведь, что попытки сделать лучшую Java в виде Scala, Groovy, Clojure, Ceylon, Kotlin, etc. рано или поздно увенчаются успехом.


А для того, кто только начинает количество вводимых символов все-таки важно.

Это Вы решили аргументов в пользу Haskell накидать? :-)


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

Information

Rating
3,056-th
Location
Россия
Works in
Registered
Activity