Как мы создали новый продукт, удалив 130 тысяч строк кода из старого

в 23:17, , рубрики: Delphi, TexEd, TextEditor, windows, разработка под windows
Как мы создали новый продукт, удалив 130 тысяч строк кода из старого - 1

Начну с того, что примерно 15 лет назад (в начале 2000-х годов) нам потребовалось создать свой редактор текстовых документов. Почему свой? Да потому что не совсем текстовых документов и совсем не WYSIWYG редактор. Вы скажете, что это тогда и не редактор документов вовсе. А что вообще тогда такое редактор документов? Какие функции он должен содержать? И как нам пришло в голову делать такой велосипед? А вот как...

Истоки

Когда-то давно, в годы расцвета редакторов ed, vi, em и прочих древностей была реальная потребность редактировать текстовые файлы. В основном различные конфиги и исходный код, а вовсе не документы в их современном понимании. Тогда еще не было Unicode-кодировок и всё разнообразие текстовых файлов выражалось, вероятно, лишь в отличии cr+lf от простого lf в качестве символа конца строки. И тогда текст был реально текстом, c 32 по 127-й символ ASCII таблицы и верхней половинкой кодов, которые могли обозначать различные интернациональные символы (в каждой стране свои). Про mbcs-кодировки просто промолчим, ведь не о кодировках речь, а о самих документах.

И вдруг появился Apple со своими редакторами LisaWrite для Apple Lisa, выпущенным в 1983 году, и MacWrite для Apple Macintosh, выпущенным в 1984, которые были уже настоящими WYSIWYG-редакторами.

Сказать по правде, WYSIWYG появился еще на 10 лет раньше, в виде редактора Bravo, разработанном в небезызвестном Xerox PARC для компьютеров Alto, однако эти машины так и не были выпущены на массовый рынок. А другим популярным в 1970-х годах домашним компьютерам попросту не хватало графических возможностей, необходимых для отображения документов в режиме WYSIWYG.

Что же дал миру принцип WYSIWYG? Люди начали работать на компьютерах с документами так, как если бы они создавали их на бумаге. Применяли различное форматирование, выравнивание и стили текста, вставляли в текст рисунки, формулы и диаграммы, делали таблицы и вообще оформляли документ так, как им заблагорассудится, благо WYSIWYG-редактор обеспечивал вывод всей этой красоты на печать точно в том виде, как документ выглядит на экране (насколько здесь достижима точность, это отдельный разговор, т.к. у монитора и у принтера совсем разный dpi, но WYSIWYG-редактор старается как может приблизить рисунок документа на экране к тому, что потом напечатается на бумагу).

Пропустим весь долгий путь появления и возмужания таких редакторов, как Windows Write, WordPad, Word (от Word 1.0 к Word 2016).

Сейчас мы уже привыкли, что если речь идет о редактировании документов (не файлов исходного кода и не конфигов, а именно различного рода офисных и других документов), то WYSIWYG редактор просто необходим и жить без него нельзя. Но правда ли это? Например, ваша цель — формирование каких-то однотипных документов на основе форм. Или вы ведете какую-то большую базу данных однотипных документов (например, специфических договоров или тендеров). И здесь WYSIWYG будет только мешать, позволяя творить в документах какие-то самоуправства и добавляя элементы форматирования, которые по заранее принятой договоренности добавлять в документ не положено, т.к. важен только сам текст. Например, можно договориться, что нельзя применять многоколоночный текст, нельзя применять сноски в тексте и колонтитулы, а также нельзя поверх текста картинки и 3D-надписи.

Примерно так было и в нашем случае. Но ситуация усложнялась еще несколькими факторами. В частности, помимо самого текста требовалось поддерживать специфическую разметку документов. И каждый элемент этой разметки должен был иметь какое-то свое поведение. Примерно так, как если бы элемент [spoiler] умел сворачиваться. А элемент [url] умел по клику отправлять нас по ссылке. Только элементов таких было не 2 и не 3, а пара десятков. Каждый со своим поведением. А сами документы при этом были обычные текстовые, но вдобавок с картинками, формулами и таблицами. То есть по сути нам нужен был редактор, который умеет поверх обычного RTF-документа, содержащего текст, рисунки, таблицы, накладывать специальную разметку и как-то хитро работать с ней.

Можно было пойти здесь по пути каких-то специализированных макросов для Ворда, но
а) не всегда имеется под рукой Ворд, на него нужно покупать лицензии
б) с появлением новых версий MS Office могли появляться проблемы миграции из одной версии Ворда в другую
в) хочется иметь возможность абсолютно полного контроля над поведением редактора
г) как уже было написано, WYSIWYG мешает. Редактор требовался нам для создания документов, полностью одинаковых в плане применяемых в них возможностей оформления. Т.е. заранее было обговорено, что все документы должны содержать текст, набранный таким-то шрифтом такого-то размера, с такими-то абзацными отступами и т.д. При таких условиях функционал задания размера и типа шрифта, летающих поверх текста надписей, разнообразных отступов и выравниваний, включая, например, многоколоночный текст, только мешал бы пользователям.

Результат

Сказано-сделано. Редактор создали. За 15 лет на разработку редактора было потрачено около 45 человеко-лет, т.к. в среднем над проектом постоянно работало 3 человека на полной ставке. Архитектура редактора получилась настолько специфичной и заточенной под наши задачи, в связи с чем данный редактор нельзя назвать в общем смысле текстовым редактором. И в таком виде его можно было использовать только внутри нашей компании. Сейчас редактор уже точно прошел через середину своего жизненного цикла, обрел определенную архитектуру, наполнился большим количеством функций и дальше работа над ним подразумевает в основном рефакторинги и поддержку необходимых изменений.

Реинкарнация

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

Хочу заранее предупредить, что все функции редактора, включая отрисовку документа в окне редактирования, реализованы полностью с нуля нашим кодом. Т.е. это не какой-нибудь RichEdit, в который просто загружается текст. Просчет позиций абзацев, деление абзаца на строки, отрисовка каретки, выделения — всё только вручную, только хардкор. Т.е. в принципе мы можем творить с этим редактором всё, что угодно.

Не откладывая дела в долгий ящик и не слишком сомневаясь, я назвал новый редактор TexEd (от словосочетания Text Editor). Был взят код текущего редактора и из него удалено всё, что открывает снаружи (в интерфейсе приложения) «наши внутренние функции». Код реализации данных функций тоже был по возможности удален. До начала урезания функционала код проекта составлял 430 тысяч строк нашего кода (1 миллион 300 тысяч, если считать вместе с кодом используемых сторонних компонент).

После отбрасывания или скрытия специфичного функционала размер кода составил 297 тысяч строк, т.е. отбросилась примерно 1/3 часть проекта. Конечно, можно было отбросить и больше, но чистить исходники от наследия можно и потом, т.к. на внешний вид и работу редактора этот «лишний» неиспользуемый код не влияет.

Огромным плюсом редактора является то, что по сути он представляет собой один exe-файл и несколько текстовых файлов со справочниками и настройками. Не чета монструозным офисным пакетам.

Большой пласт функций содержал различные автоматические обработки (например, формирование оглавления на основе анализа текста, без учета стилей, именно смысла текста, выявления структурных единиц и т.п.), а также проверки соответствия документов определенным правилам оформления. Но т.к. это были наши внутренние правила, не применимые к другим пользователям, этот функционал был в основном выпилен из редактора (если его и возвращать, то уже в каком-то новом, переработанном виде).

Редактор не требователен к ресурсам и может открывать 100-мегабайтные (и более) документы, в т.ч. с таблицами, и довольно шустро работать с ними (чего не скажешь об MS Office и Open Office, которые на подобных документах могут вешаться, по крайней мере в режиме разметки страниц). Ограничением по объему открываемых документов является то, что на текущий момент мы поддерживаем только 32-битную сборку, т.е. приложение технически не может аллоцировать более 4 ГБ памяти.

Какие функции остались в редакторе?

1) Поддержка форматов:
— RTF, WordML 2003 (XML), DOCX, HTML — нативное чтение и запись (самостоятельно читаем и пишем формат в части подмножества поддерживаемых элементов оформления)
— ODT — читаем через Open/Libre Office путем конвертации его средствами к одному из форматов, которые мы поддерживаем нативно
— DOC — читаем через конвертор Ворда также путем конвертации к одному из форматов, которые мы поддерживаем нативно. Для этого достаточно установить бесплатный пакет обеспечения совместимости Office 2007 (FileFormatConverters.exe), сам MS Office при этом устанавливать не обязательно и не нужно
— TXD — свой собственный бинарный формат редактора, поддерживающий все те же элементы, которые мы поддерживаем в других формата. А почему бы и нет? И в качестве формата буфера обмена при копировании кусков документов внутри нашего редактора удобно.
— XLS — кое-как читаем через Excel
2) Поддержка редактирования документов, содержащих:
— Текст
— Таблицы (без вложенности, при чтении некоторых форматов вложенные таблицы просто встраиваются в ячейку более внешней таблицы, в RTF — вообще не поддерживаются)
— Рисунки и формулы (для редактирования формул необходимо установить программу MathType, можно бесплатную trial-версию, работать будет, но набор элементов формул будет ограниченный)
3) Печать документов (с возможностью предварительного просмотра)
4) Сравнение документов (Меню Файл — Сравнить файлы) — крутая штука, т.к. умеет сравнивать документы с таблицами, это вам не Tortoise Diff! ;)
5) Проверка русской и английской орфографии, включая пользовательские словари
6) Поиск и замена
7) Фоновое автосохранение документов
8) подсветка слов и подстрок в словах по произвольному справочнику пользователя и быстрые переходы по таким подсвеченным словам
9) Вставка шаблонов стандартных фраз с панели инструментов (сами фразы настраивает пользователь)
10) Запись и воспроизведение клавишных макросов (последовательности нажатий клавиш на клавиатуре, а не макросов Visual Basic :) )
11) Несколько стандартных обработок, просто как пример того, что может быть и как оно работает

Что еще может быть интересного в редакторе, спросите вы? Да много всего. Например, при удалении огромных (на несколько сот мегабайт) кусков больших документов редактор может предупредить, что свободная оперативная память заканчивается (из-за формирования Undo-списка для Ctrl+Z) и перейдет в режим экономии памяти, в котором ограничит количество действий в Undo-списке. Согласитесь, оригинальная и интересная возможность, а кому-то она спасла немного нервных клеток, когда происходило редактирование таких больших документов на машине с 1-2 ГБ оперативной памяти. И это лишь один из примеров. Под капотом редактора довольно много всего интересного, что можно было бы заново пустить в «продакшен», если бы нашлись заинтересованные пользователи. Например, у нас есть полноценный редактор псевдографических таблиц (набранных моноширинным шрифтом с использованием символов псевдографики), который позволяет работать с такими таблицами как с обычными динамическими таблицами Ворда, т.е. изменять ширины строк и колонок, задавать выравнивание текста внутри ячеек и т.п., при этом таблица остается псевдографической. Во времена DOS так умел делать текстовый редактор «Слово и Дело» (Word&Deed, wd.exe). Данный функционал я отключил, т.к. посчитал, что в 2017 году пользователей, у которых есть документы с псевдографическими таблицами, уже наверно не существует или их процент очень мал. Но если интересно и кем-то востребовано, можно включить обратно.

Остальное можете сами посмотреть в демо-версии.

Ограничения редактора

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

1) Только 32-бит версия.
2) Не кроссплатформенный, работает только под Windows.
3) Мало элементов форматов поддерживается.
4) В текущей версии не поддерживается формат OOXML (новый XML-формат Office, начиная с 2010).
5) Нет режима WYSIWYG с отображением разбивки на страницы (такую разбивку видно только в предпросмотре печати).
6) Нет задания шрифтов. Совсем. Но это довольно не сложно добавить, т.к. внутренне редактор поддерживает работу с разными шрифтами и их отображение на экране.
7) Каюсь, иконка редактора была взята из комплекта иконок под Linux от дизайнера Everaldo Coelho. Если что потом перерисуем, просто времени на это не было.
8) Редактор написан на Delphi :-) В текущий момент он собирается под последними версиями Delphi (конкретно в 10.1 Berlin, но можно и в Tokyo — проблем никаких). А на чем же еще было начинать писать такое Rich-GUI Windows Application в начале 2000-х. Это даже немного весело, т.к. действует принцип security through obscurity, т.к. разработчиков на Delphi сейчас мало, т.е. например если даже исходники утекут, использовать их с пользой (например, для создания продукта-конкурента или еще для каких-то недружественных целей) будет не так просто :-)
9) Один только редактор не может заменить OpenOffice и MS Office целиком, т.к. не содержит, например, функций для работы с таблицами (как Excel) или создания презентаций (как PowerPoint).
10) Отсутствует документация (руководство пользователя)

Полнофункциональную (если этот термин вообще применим в текущей ситуации) демо-версию редактора (0.1) вы можете скачать с GitHub в виде архива, который достаточно распаковать в любое место. Редактор при первом запуске с правами администратора устанавливает службу защиты, не беспокойтесь, это не вирус и не троян, честно-честно. Служба нужна для определения параметров оборудования компа, на которых базируется вычисление хеша для регистрационного ключа. Без этой службы при запуске приложения под UAC (с привилегиями обычного пользователя, т.е. не админа) достучаться до нужных параметров оборудования не получается, не хватает прав.

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

Будущее

Планы на будущее:

1) RTF (выбор произвольных шрифтов текста как в Ворде)
2) многоязыковость интерфейса (и проверки орфо?)
3) Нормальная поддержка списков (многоуровневых и т.п.)
4) Какая-то поддержка режима рецензирования
5) Задание отступов абзацев и изменение ширин колонок на линейке
6) WYSIWYG в режиме редактирования (постраничность)
7) Собственный встроенный редактор формул, не завязанный на MathType
8) Из редактора можно сделать библиотеку автоматизации обработки документов из других приложений по механизму Com Automation, по аналогии с Word, только гораздо быстрее, проще и удобнее. Это уже реализовано, но API пока очень скудный, не буду его приводить, чтобы никого не смущать.

Какие еще возможности стоило бы добавить в продукт в первую очередь? Пожалуйста, напишите в комментариях!

Зачем всё это? Я искренне надеюсь, что проект такого редактора может найти очень хорошее применение. Т.е. мы сейчас ищем своих новых пользователей, чтобы реализовать для них то, что им нужно. Нет, мы не планируем заниматься заказной разработкой (пилить что-то под одного конкретного заказчика, если он конечно не уровня Билайна или Сбербанка :-) Т.е. мы хотим сделать новый готовый продукт, который будет полезен большому кругу пользователей благодаря удобным настройкам и специализированным функциям, отсутствующим в обычных текстовых редакторах.

PS Поскольку выпиливание функций производилось на скорую руку (заняло примерно 10 дней по 2-3 часа в день), где-то что-то могло сломаться, что мы могли не заметить. Можете создавать Issues на GitHub.

→ Временный дом проекта: GitHub
→ Скачать демку можно по этой ссылке

Ну и напоследок небольшой опрос:

Автор: alan008

Источник

Поделиться

* - обязательные к заполнению поля