Говорят, что изучение нового языка программирования позволяет вам увидеть проблемы в новом свете (если язык более отличается от Java и C #). Поэтому я воспользуюсь случаем, чтобы написать свою диссертацию на латексном языке и предположить, что изменение всей бинарной категории на документ, а не на приложение, поможет мне понять, что действительно важно в процессе «создания».
Я обнаружил, что вы можете применять к авторизации латексных документов многие концепции и принципы (например, автоматическую сборку), которые вы знаете как Agile и Lean. Сам Latex разделяет некоторые принципы дизайна из программирования …
компиляция
Компиляция — это процесс преобразования абстрактного артефакта в более конкретный, который в случае программ может выполняться напрямую. Даже в случае интерпретируемых языков существует процесс сборки, который вместо компиляции создает новую копию программы с чистой базой данных и соответствующими правами доступа к файлам.
Компиляция переходит от читабельного представления, оптимизированного для редактирования и записи, к машиночитаемому, часто двоичному и оптимизированному для выполнения (или рендеринга). Я думаю, что и файлы PDF, созданные Latex, и машинный код довольно нечитаемы для людей.
Чем больше мы абстрагируем и удаляем дублирование, тем больше мы строим новые представления, отделенные от физического носителя: не имеет значения, является ли целью архитектура набора инструкций или программа для чтения PDF.
Сила простого текста
Оригинальная книга Pragmatic Programmer содержала главу под названием «Сила простого текста» , в которой обсуждалось превосходство простого текстового формата над двоичными документами в форматах .doc и .xls.
Обычные текстовые файлы можно редактировать с помощью минимальных инструментов, таких как Vim или nano; они могут быть проанализированы и отфильтрованы с помощью grep и awk; их можно рассеять, когда они меняются. Как следствие, их можно эффективно контролировать с помощью Git или других SCM.
Форматы простого текста также позволяют более четко контролировать представление и макет, а также все, что должно быть четко указано в директиве. Вы никогда бы не подумали о программировании с помощью диаграмм, однако решение о том, что текст абзаца должен быть разделен на непонятное меню вместо указания его с помощью директивы, привлекает многих. Я думаю, что для набора текста не всегда нужна такая точность на уровне битов, как программирование.
Разные модели
Когда я впервые узнал о латексе, я попытался сравнить его с каскадными таблицами стилей в своей ментальной модели работы макетов и форматирования. Однако модели документов Latex и CSS отличаются:
- Латекс абстрагирует окончательный формат файла, сохраняя детали презентации (по центру, справа, большой текст, поместите таблицу на следующей странице.)
- HTML и CSS абстрагируют всю логику представления (в CSS) и сосредотачивают внимание на логических компонентах веб-страницы: где находится меню, панель навигации, какой текст нуждается в выделении и где находятся ссылки на другие страницы.
Я не знаю, существуют ли латексные таблицы стилей, но они были бы желанным дополнением для продолжения поиска дубликатов. Как HTML-страницы, так и научные документы пересматриваются очень много раз, чтобы извлечь выгоду из всего доступного синтеза.
Процесс сборки
Для программ и документов, написанных с использованием Latex, часто требуется объединить несколько команд в цепочку, чтобы перейти от исходных кодов к скомпилированному выводу. В случае программ очевидно, что делает сборка: компиляция, конфигурация, упаковка и даже развертывание.
Но текстовый документ, в котором удаляются все дубликаты (и каждый бит текста именуется один раз и только один раз), нуждается в автоматизации для восстановления читаемой человеком версии. Как люди, нам нравится находить одну и ту же информацию, повторяемую в разных местах, как для целей связи, так и для удобства.
Рассмотрим библиографию, набор документов и книг, которые цитирует латексный документ. Биглиографии организованы как наборы файлов .bib, которые могут охватывать несколько документов. Каждый файл .bib представляет отдельную цитату и содержит метаданные, такие как автор, название года.
При создании документа я объединяю все мои файлы * .bib в один; Затем pdflatex может (после многократного запуска) включить несколько страниц хорошо отформатированной библиографии в мой документ. Только документы, которые я цитирую с \ citet {author_title_code} , включены в сборку:
#!/bin/bash rm citations.bib texput.log thesis.aux thesis.bbl thesis.blg thesis.lof thesis.log thesis.lot thesis.out thesis.pdf thesis.toc bib2bib -ob citations.bib bib/*.bib pdflatex thesis.tex bibtex thesis.aux pdflatex thesis.tex pdflatex thesis.tex > output.log 2> error.log egrep -ir 'warning|error' output.log cp thesis.pdf 2012_10_Sironi.pdf
Эта сборка (одна команда build.sh) также включает в себя некоторую очистку журналов от предыдущих выполнений и анализ выходных данных, чтобы показать только некоторую полезную информацию, такую как ошибки.
Таким образом, вы можете легко получить от
As \citet{Schleyer_requirementsfor} says...
в
As Schleyer et al. [30] says...
наряду с получением автоматически регенерированной библиографии в конце вашего документа. Ощущение такое же, как когда вы выполняли свой первый рефакторинг Extract Method …
Уроки выучены
Создание латексного документа и программы во многом схожи из абстрактных представлений, компиляций и автоматических сборок. Когда мы абстрагируемся от конкретного языка, операционной системы или артефакта, мы приближаемся к более общему принципу программирования: бесконечному поиску уменьшения дублирования и определения высокоуровневых абстракций над деталями, которыми мы обременены (Laws of Simple Дизайн кого-нибудь?)
Это не означает, что мы должны всегда стремиться к общему принципу, но просто то, что мы можем игнорировать слишком специфические узкие, раздутые практики, предписанные как панацея, когда мы находим примеры областей, где они на самом деле не имеют значения. Например, я не буду думать, что автоматические тесты — это самая важная вещь, которую нужно написать в первую очередь в отношении удаления дубликатов, поскольку мы не можем писать код компьютерной графики или документы в первую очередь для тестирования .