Есть несколько действительно фантастических инструментов для тех, кто хочет научиться программировать. Я упомянул в прошлый раз, что у меня есть рабочее пространство Cloud9 с SBCL. Я немного использовал экзерцизм. Но я также упомянул проблему, с которой регулярно сталкиваюсь при изучении программирования: применимость.

Почти универсальная методология обучения языку (или обучению программированию в целом) похоже на то, как мы учим математику: «Вот несколько упражнений. Вы никогда не будете использовать их в реальном мире, но они вам все равно нужны, потому что без них [некоторые другие вещи, которые вы должны знать] не работают». Мы строим язык из первых принципов. Теоретически это хорошо, потому что это означает, что к тому времени, когда я, студент, достигну точки, когда я пишу реальные программы, которые используют реальные вещи и взаимодействуют с реальным реальным миром через настоящий Интернет, я уже знаю, как все работает.

Я понимаю. Действительно, знаю. Он поощряет (а во многих случаях и делает возможным) безопасную технику программирования и гарантирует, что если что-то пойдет не так с программным обеспечением, учащийся сможет это исправить, если у него будет достаточно времени.

Но это так скучно!

Если бы я был в классе, если бы у меня был учитель, который мог бы посвятить мне определенное количество своего времени и который мог бы передать ощущение прогресса, одноклассники, которым я мог бы задавать вопросы и с которыми я мог бы обсуждать проблемы, если бы у меня был какое-то личное пространство и время, в которые я мог бы погрузиться в это на регулярной основе; учитывая все эти вещи, метод первых принципов хорошо сработал бы для меня. Ни с одним из этих вещей, это становится тяжелой работой. ANSI Common Lisp, Practical Common Lisp, CL: A Gentle Introduction — это огромное количество великолепного материала о первых принципах Lisp, но в итоге он всегда оказывается довольно устаревшим. Я хочу заниматься реальными делами, которые приносят реальные результаты, и я не терплю упражнений ради них самих. (Это верно для всей моей жизни; мне очень трудно оставаться в форме по той же причине, особенно зимой, когда я не могу ездить на велосипеде на работу, не ухаживая за ледяной смертью.)

Итак, хотя у меня есть и я прочитал большую часть этих трех книг (и других), и я решил почти половину задач Common Lisp по Exercism (что, кстати, потрясающе), у меня просто нет этого необходимого ощущение прогресса. Я не знаю, как построить настоящее приложение, сколько бы битов языка я ни понимал. Так что недавно я отказался от этой философии в пользу еще одной случайной; Я выбрал цель (создать веб-сайт, используя как можно больше Common Lisp и как можно меньше чего-либо еще) и начал искать учебные пособия.

Оказывается, есть несколько, но не так много, и из тех, что я пробовал, только один до сих пор работает. Есть, конечно, побочный вопрос о том, какие библиотеки использовать, и пока я об этом думал (Clack и его подобные кажутся хорошими, как и weblocks и lisp-on -lines, в том смысле, что все они пытаются абстрагироваться от шаблонов) в конце концов я обнаружил, что все, что было в текущей разработке, не имело никакой документации, кроме самой минимальной, а все, что, казалось, имело хорошо продуманную документацию и учебные пособия, как правило, было мертво. на год и более.

В конце концов, я остановился на RESTAS не потому, что он все еще находится в разработке или в его документации есть что-то особенно полезное, а потому, что есть хорошее пошаговое руководство о том, как его использовать, которое все еще работает. . IYI, это должно дать вам пример того, что я ищу. Используя это, я надеюсь углубиться в веб-разработку и выработать базовое понимание html/css, а также работать в обратном направлении, чтобы соединиться с моими текущими знаниями о lisp. Гораздо сложнее, чем работать с первыми принципами, и, насколько мне известно, это далеко не идеальный способ обучения. Но поскольку я езжу самостоятельно, мне приходится находить способы поддерживать интерес, и посвящать несколько минут в день упражнениям в вакууме просто недостаточно. Мы надеемся, что наличие цели в поле зрения сделает свое дело.

Примечание: все книги покидают CLOS (общую объектную систему lisp, ответ Lisp на Object Orientation) почти до конца. Кому-то нужно написать книгу, которая перевернет эту практику, не потому, что я думаю, что объектная ориентация в чем-то особенная, а потому, что большая часть кода, который я вижу в дикой природе, интенсивно использует CLOS (и MOP), и не имеет на самом деле закончил любую из книг, у меня больше проблем, чем мне хотелось бы интерпретировать это. Хорошие привычки заводятся рано, авторы кодовых книг; используйте CLOS с самого начала и отключайте его при необходимости, а не наоборот. Кхм. Вернемся к теме.

Я знаю, что это, скорее всего, оставит у меня больше вопросов, чем я начал (Что такое Twitter Bootstrap и как его использовать? Могу ли я напрямую выставить базовую систему lisp в Интернет? Как мне использовать https? Черт! , как мне сделать так, чтобы люди, кроме меня, могли видеть эту нелепую штуку, которую я пытаюсь построить?) но это, по крайней мере, интересно, и я, по крайней мере, могу видеть, как все шаги связаны с конечной целью. Это очень важно, когда работаешь в одиночку, по крайней мере, для меня; Я склонен легко терять цель из виду, и как только это происходит, все кончено. Поэтому, когда я пишу художественную литературу, я обычно пишу короткие рассказы, хотя у меня есть идеи для больших саг. Когда я пишу игры, я склонен писать небольшие игры, хотя мои лучшие идеи довольно масштабны. Справедливо для всего, как и для моего отношения к занятой работе.

С более широкой точки зрения, это в некотором смысле просто мое наказание за то, что я выбрал и решил придерживаться (вопреки советам большинства людей, с которыми я говорю об этом) широко непопулярный язык. Красота и крутость — это круто, но, похоже, существует реальная нехватка хорошо поддерживаемых библиотек. Имея в виду, конечно, что я знаю не так много, как я думаю, и что, возможно, я просто еще не нашел нужного места для поиска, веб-разработка — это своего рода большое дело, и на самом деле в экосистеме Common Lisp очень мало того, что имеет хоть какую-то надежную поддержку; то, что вы считаете само собой разумеющимся в чем-то вроде Ruby или Python. Это большое дело. Я имею в виду, что язык во многом древний; он существует примерно с шестидесятых годов или около того, а стандарт ANSI утвердился в девяностых, но, несмотря на это, сообщество Лиспа остается относительно небольшим и слабо разбросанным по миру. В результате плотные сети для совместной работы, лежащие в основе экосистем больших языков, просто не подходят для Lisp.

Как новичок в JavaScript, у вас есть практически весь Интернет, доступный в качестве сети поддержки. Существуют сотни веб-сайтов, единственной целью которых является помочь вам учиться, и делать это бесплатно. Как и английский язык, JavaScript — это мешанина, в которую разные люди в разные моменты своей истории втискивали все, что они считали интересным или полезным в современных языках. В результате JavaScript, как и английский язык, логически и концептуально уродлив, полон ловушек и странных пограничных случаев и изобилует бессмысленными идиомами. И это, опять же, как и английский язык, является лингва-франка глобального Интернета; если вы занимаетесь программированием в Интернете, в конечном итоге вы вернетесь к JavaScript. Большинство языков, отличных от JS, справляются с этим с помощью библиотек кросс-компиляции, которые берут ваш код на одном языке и переводят его в код на другом без необходимости знать другой. В Лиспе это обычно Parenscript.

Но дело в том, что если бы я два года назад решил, что хочу изучать JavaScript, я бы уже закончил. Вместо этого я выбрал Lisp (я уже знаю один хаотичный и глупый язык, большое вам спасибо.), и моя траектория обучения действительно страдает из-за малочисленности его сообщества и отсутствия его ресурсов. Я не уверен, что знаю, что с этим делать. Конечно, у меня есть идеи, но я, очевидно, должен усомниться в своей компетентности в этой области. Я все равно продолжу и разъясню некоторые из них, ради потомков.

В краткосрочной перспективе я, вероятно, ничего не могу сделать; сообществу Lisp отчаянно нужна хорошая (т.е. хорошо написанная, всеобъемлющая и постоянно поддерживаемая) система руководств для новичков, но все слишком заняты написанием кода, чтобы остановиться и писать слова, и по определению я особо не могу этому способствовать. Это все равно, что 8-летний ребенок учит других 8-летних читать, в то время как взрослые заняты обсуждением достоинств и недостатков, скажем, конструктивизма в итальянской литературе XIX века.

В долгосрочной перспективе, я думаю, ему нужен центр. Кажется, что все работают в вакууме; такие люди, как Зак Бин и Эди Вейц (известные имена в разработке Лиспа), размещают проекты на своих сайтах и, кажется, работают над ними в одиночку, и это самое близкое, что есть у сообщества, к центральному хранилищу информации, CL Wiki ужасно неполна и устарела на пять лет. Им (нам?) нужно что-то, вокруг чего можно было бы объединиться, чтобы перестать быть рассеянным распределением изолированных узлов и стать связанной и коммуникативной сетью. Но какую форму примет такая вещь? У меня нет ответа.

Я думаю, что наличие центрального репозитория кода может помочь. Там, где у Ruby есть система Gem, у Python есть PyPI, у C# есть NuGet. У каждого языка, кажется, есть один. В Lisp есть Quicklisp, но Quicklisp кажется очень молодым, и хотя он действительно работает и великолепен, ему не хватает некоторых функций, которые есть в более зрелых репозиториях. Документация обычно скудна там, где она вообще есть; обычно существует от трех до пяти функционально схожих библиотек для одной и той же задачи, и единственный способ понять, какую из них следует использовать, — скачать и попробовать каждую из них; и самое главное, Quicklisp не появляется ни в чьей документации, ни когда люди описывают, как они делают Лисп, за исключением случаев, когда говорящий человек является создателем Quicklisp.

Возможно (даже вероятно), что это связано с упомянутым выше отсутствием актуальных нуб-дружественных материалов, но это не делает проблему для нубов меньше. Для любого, кто уже близко знаком с доступной экосистемой lisp, это не проблема, но для кого-то в моем положении единственный способ найти библиотеки с какой-либо оценкой или другими комментариями — это молва, как это еще девяностые. Что еще хуже, кажется, что у всех разные предпочтения, поэтому очень сложно прийти к полуобъективному выводу о том, что начать использовать.

Теперь я никого не виню за то, что у них есть предпочтения, отличные от их соседей. Мы все снежинки и т. д. Но это возвращает нас к проблеме сплоченности сети; без чего-то, что можно было бы склеить, каждый работает в своем собственном маленьком мире. Это делает практически невозможным появление стандартов в результате статистического появления, чего в противном случае можно было бы ожидать и поощрять в сообществе, столь плотно населенном чрезвычайно умными людьми. IYI, у атеизма та же проблема, поэтому заставить атеистов согласиться с чем-то более конкретным, чем религия нехорошо, — это все равно, что пасти кошек. Очевидно, я не первый, кто так думает, иначе не существовало бы Клики и common-lisp.net и всех их родственников. Но пока ни один из них не сработал, так что проблема остается.

Подводя итог: я не так хорошо работаю во время самостоятельного изучения, как при наставничестве или другом внешнем руководстве, и я действительно чувствую этот недостаток в своих усилиях по изучению Лиспа (и программирования в целом). Я скучаю по интеллектуальному сообществу, в котором можно было бы участвовать. Я скучаю по колледжу в целом. Если вы Lisper и живете в Мэдисоне (или Бате, Англия, куда я скоро перееду, подробнее об этом позже) и хотите пообщаться и поговорить о Lisp и, возможно, ответить на мои глупые вопросы, пожалуйста, напишите мне. линия. Я был бы рад увидеться с тобой. До тех пор я буду продолжать вкалывать, пока не начну получать его.

Я достиг наконец-то того, что могу читать чужой код, и он начинает обретать какой-то смысл. Я могу следить за вызовами функций и получить смутное представление о том, что они делают. Я могу подумать о тех частях Лиспа, которые я мог бы изменить, если бы был Фукамати:

Импортируйте макрос потоков Clojure «-›» из-за способов, которыми он позволяет организовать код. Избавьтесь от «first» и «rest» по той же причине, по которой мне не нравится весь синтаксический сахар Ruby («car» и «cdr» делают одно и то же). Создайте гораздо более полную стандартную библиотеку. Что произойдет, если вы замените «defun» и «defmacro» и все остальные «defthings» одним вызовом «def», который принимает целевое ключевое слово «fun», «macro», «var», «constant» , «класс», «вещь», а оттуда разбирает остальное?

Я могу думать и играть с Лиспом таким образом, что это дает мне определенную гордость и уверенность в моем прогрессе, каким бы ограниченным он ни был. Мне нравится идея создания вспомогательных приложений для сети на Лиспи: платформы для ведения блогов, rss-ридеры и фидеры, все то, что люди используют на регулярной основе, но встроенное и расширяемое с помощью Лиспа, предлагающее (потенциально) другую точку зрения на то, как веб-программное обеспечение может работать. Emacs все еще используется сегодня, потому что, несмотря на то, что его интерфейс и кривая обучения ужасны, он остается привлекательной концепцией; настраиваемый до такой степени, о которой почти никто другой не может даже мечтать, в значительной степени потому, что он написан на Лиспе. Что, если бы эту концепцию можно было применить к более широкому Интернету?

Очевидно, я слишком много мечтаю, но мечты создают будущее; мы пытаемся, терпят неудачу, мы учимся, мы адаптируемся, и наши мечты адаптируются вместе с ними. Возможно, однажды у нас будет веб-браузер на Лиспе (помимо emacs), или кто-нибудь воскресит ОС на Лиспе. Я хотел бы иметь возможность сказать, что я был частью этих вещей, или чего-то другого аккуратного и важного, или помогал объединить сообщество Лиспа вокруг чего-то. Так что я буду продолжать пытаться понять, как эта штука работает. Я буду продолжать делать макро-наблюдения за экосистемой. Я продолжаю продолжать. Если у вас есть какие-либо предложения или вы просто хотите пожелать мне удачи, сделайте это. Я буду благодарен за немного воздуха в вакууме.