Около месяца назад я анонсировал The Rose Project, мой проект с открытым исходным кодом, направленный на улучшение программирования. Если вы еще не читали, предлагаю вам начать с этого. Как и обещал, это мое обновление через месяц.

Приостановка чернослива

На момент написания последней статьи я планировал продолжить работу над графическим пользовательским интерфейсом (GUI) для прямого управления абстрактными синтаксическими деревьями JavaScript (AST). Короче говоря, я планировал продолжить работу, которую Кент Бек и Тьяго Хираиин начали с Prune.

Однако по причинам, которые я объясню ниже, я решил отложить эту линию расследования. Прежде чем продолжить, я хочу отметить два последних вывода, которые я сделал для этого проекта:

  1. Я твердо верю, что наиболее эффективный способ продолжить этот проект - использовать «Текст как букву G в графическом интерфейсе пользователя», как я упоминал в своем последнем посте. Таким образом, вам не придется тратить время на создание дисплея или навигатора AST (потому что вы просто используете текстовый редактор Ace), чтобы вы могли сосредоточить все свои усилия на расширении возможностей синтаксически правильных преобразований, что является нетривиальной проблемой.
  2. У JavaScript много проблем (о чем я говорю ниже), поэтому я бы сосредоточился на ключевом подмножестве JavaScript, чтобы не тратить время на попытки совместимости со всеми странными частями. Обратной стороной этого, конечно же, является то, что вы не сможете импортировать проект в Rose, а только экспортировать его в JavaScript, но я думаю, что это хорошее место для начала.

Лучшие парадигмы программирования

В процессе создания графического интерфейса для JavaScript я начал размышлять о недостатках JavaScript. Чем больше я думал об этом, тем больше понимал, сколько JavaScript я лично считаю вредным, даже такие основы, как изменяемые переменные и императивный поток управления. Так начались мои поиски лучшей основы для языков программирования.

Многие здесь занимаются интересными делами. Как я уже говорил, больше всего меня впечатлило видение Unison Полом Кьюзано. Однако он еще не настолько развит, чтобы я мог играть, но это может скоро измениться.

В этом месяце я глубоко погрузился в CycleJS и Elm и составил более обширный список других для более глубокого исследования позже.

CycleJS

Я слежу за написанием и прогрессом Андре Стальца в течение нескольких лет, поэтому я не удивился, что меня впечатлили эти рамки. Это позволяет вам быть по-настоящему неизменным и функциональным во вселенной JavaScript. В сочетании с TypeScript CycleJS обеспечивает жесткую конкуренцию таким, как ReactJS и VueJS.

Однако, чтобы понять менталитет «все является потоком», нужно научиться круто. Требуется время, чтобы освоить потоковые утилиты и комбинаторику. Кроме того, это довольно новое программное обеспечение, поэтому у них не так много библиотек, как вы надеялись. Чем больше я его использовал, тем больше понимал, насколько он похож на Вяза, сравнение, которое Андре делает сам, но никогда не имело для меня смысла раньше.

Вяз

Как и родительский язык Haskell, Elm может похвастаться отсутствием ошибок времени выполнения. Это достигается с помощью строгой системы типов, которая заставляет вас продумывать все возможные случаи в вашем коде. Невозможно недооценить, насколько это потрясающе. Например, вы не можете обработать только успешный случай HTTP-запроса - вы должны обработать все возможные ответы. Вы также не можете обрабатывать только ненулевые случаи - вам нужно обрабатывать все возможные значения.

С другой стороны, сложно установить Elm (у меня ушло несколько часов), и он имеет быстро меняющийся API, так что на мой вкус он слишком сырой. Несмотря на это, Университет Макмастера считает его отличным инструментом для обучения детей программированию.

Языки для дальнейших исследований

  • Ева - я действительно восхищаюсь людьми, стоящими за Евой, но я не могла осмыслить это. Наверное, мне нужно уделить этому больше времени.
  • Луна - мне на это указал Андре Стальц. Похоже, это может быть именно то, что я ищу, но мне не удалось получить с ним доступ, чтобы поиграть.
  • Ламбду - похоже на Луну и Унисон. Необходимо как можно скорее провести здесь дополнительные исследования.
  • NoFlo, Project Blocks и Kite также возглавляют мой список.
  • Ирвин Хван (который связался со мной после того, как прочитал мой последний пост) поделился этим списком языков визуального программирования, которые я надеюсь изучить в ближайшее время.

Можем ли мы сделать лучше, чем HTML и CSS?

Прочитав Пост Пола Чизуано о CSS, я задался вопросом, можем ли мы создать лучшие абстракции, чем HTML и CSS.

Например, атрибуты HTML имеют неочевидные имена и значения, например target="_blank", чтобы получить ссылку для открытия в новой вкладке.

В CSS широко распространено мнение, что центрирование вещей - это настоящая боль. Однако разве макетирование не должно быть простым при правильной математической абстракции? Кажется, что хороший функциональный, математический, декларативный язык может решить эту проблему.

Здесь есть два пути:

  1. Создайте абстракцию поверх HTML и CSS, языка, который компилируется в HTML и CSS. Это дает то преимущество, что вам не нужно вручную перестраивать общие виджеты HTML и CSS. Например, сложно настроить поле ввода правильно.
  2. Создайте абстракцию с нуля поверх холста HTML5. Это путь, по которому идет библиотека morphic.js Йенса Монина. Преимущество здесь - отсутствие необходимости иметь дело с привередливостью HTML и CSS, но обратная сторона - перестройка всего набора инструментов пользовательского интерфейса веб-интерфейса с нуля.

Я удивлен, что не видел, чтобы многие другие люди говорили о решении этой конкретной проблемы. Похоже, что большая часть нашего внимания сосредоточена на улучшении JavaScript (с помощью таких языков, как Elm), оставляя HTML и CSS как есть.

Переосмысление точности

Один из первых уроков, которые я преподаю своим студентам, изучающим информатику, заключается в том, что «компьютеры глупы». Компьютер будет делать только то, что вы ему прикажете, ни больше ни меньше. Чтобы сформулировать это, мы играем в игру «код своего учителя», в которой они дают мне инструкции, которые я изо всех сил стараюсь понять неправильно. Благодаря этой игре учащиеся узнают, что они должны быть невероятно точными, чтобы получить от компьютеров то, что они хотят.

Однако должно ли кодирование быть таким? Как это будет выглядеть переосмыслить точность как фундаментальную концепцию информатики.

Могут ли компьютеры быть «менее глупыми»? Могут ли компьютеры допускать большую двусмысленность?

Например, когда компьютеру дается неоднозначная команда, он может предпринять два разных действия:

  1. Он мог бы лучше всего догадаться о том, что вы пытаетесь сказать и убежать с ним. Если компьютер выбирает неправильно, вы можете заметить это и сообщить компьютеру, что это не то, что вы имели в виду.
  2. Он может сказать вам, что он запутался, и дать вам возможность уточнить, что вы имеете в виду, возможно, предоставив вам список вариантов на выбор.

Интересно, какая работа уже проделана в этом пространстве. Если вы что-нибудь знаете, буду благодарен за заметку в комментариях :)

Не только для новичков

Когда я рассказываю людям об этом проекте, меня часто спрашивают: Как ваш язык подготовит студентов к работе с« настоящими языками программирования?» У меня были проблемы с ответом на этот вопрос, пока я недавно не перечитал Изучаемое программирование Брета Виктора, знаменательную статью, которая подтолкнула меня на этот путь много лет назад.

В последнем разделе, озаглавленном «Это не тренировочные колеса», он говорит (эллипсы мои):

Эти принципы проектирования были представлены в контексте систем для обучения, но они применяются повсеместно ... Часто задаваемый вопрос о методах, представленных здесь, звучит так: «Как это соотносится с программированием в реальном мире?» Это - разумный вопрос, но это что-то вроде вопроса о том, как двигатель внутреннего сгорания принесет пользу лошадям. Вопрос предполагает неправильное изменение.

Вот более полезный подход: Программирование должно работать так. Программисты должны уметь читать словарный запас, следить за потоком и видеть состояние. Программисты должны творить, реагируя, и творить, абстрагируя. Предположим, что это требования. Учитывая эти требования, как мы переделать программирование?

Сделать перерыв

Когда год назад я начал работать над этими идеями, я искренне верил, что прорыв уже не за горами. Только после того, как я проработал над этим проектом более 6 месяцев полный рабочий день, я начал осознавать масштабы этого начинания. Честно говоря, только недавно я понял, сколько других пытались решить ту же проблему - я думал, что наметил новую территорию, когда на самом деле отслеживал шаги.

По этой и другим причинам, связанным с моей другой работой в качестве соучредителя в The Coding Space, я решила взять перерыв в этом проекте, чтобы сосредоточиться на других проектах, в частности программе для женщин, чтобы научиться программировать. Что мы пытаемся оторваться от земли.

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