May 9th, 2014

not

Sprint #3 review

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

Конечно, инфраструктуру создавать на пустом месте довольно сложно, поэтому мы запрограммировали несколько самых базовых функций, и отлаживаем всё на них. Любители скрама одобрят ещё один шаг, который мы сделали, а именно написание документа под названием Definition of Done («Что означает „сделано“»). Вот содержание этого документа:

Элемент музыкальной нотации считается реализованным в программе, если программа может его
- показать на экране
- напечатать на принтере

- сохранить в файл
- загрузить из файла

- экспортировать в MusicXML
- импортировать из MusicXML

- добавить вручную
- удалить вручную

- отменить, как последнее действие
- восстановить, как последнее действие

- дать отредактировать его свойства


Это довольно большой список, и если следовать этому определению, то в нашей программе ещё не реализован ни один элемент нотации. К слову сказать, кусочки нотоносцев с ключами и акколадами, которые мы показывали на предыдущих ревью, были «захардкожены», т. е. вбиты в исходный код программы, а не добавлялись динамически. Нам важно было это сделать, чтобы наладить первые четыре пункта Definition of Done, то есть вывод на экран, принтер, сохранение и загрузку.

В этом спринте мы открыли одну команду редактирования: таким образом теперь можно добавлять нотоносец над позицией курсора (после добавления курсор сразу переходит на новый нотоносец):



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

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

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

Точно так же и с нотами. Если мы хотим отменить добавление нотоносца, то программе всего лишь нужно его удалить. Кстати, проверим, как это работает:



А вот если вы выделите весь документ и удалите, а затем попросите программу отменить это действие, то ей потребуется откуда-то из волшебного рукава вытряхнуть сохранённую копию предыдущего состояния документа. Но это в будущем. Сейчас ещё нечего выделять.

А пока проверим, как работает восстановление отменённого действия:



Заметим, что звёздочка в заголовке окна честно гаснет, когда состояние файла становится идентичным исходному (или сохранённому), и загорается, как только мы отходим от него.

Теперь, поскольку схема отмены и восстановления действий уже реализована, мы сможем пользоваться ею и для всех последующих добавляемых в программу команд.

Ещё один важный шаг в развитии инфраструктуры, который мы совершили в этом спринте, это импорт MusicXML. Мы решили не засорять меню и не выделять импорт в отдельную команду, и поскольку результатом этого действия всё равно становится открытие документа, то и реализуется оно через стандартную команду File > Open:



Напомним, что мы не против стандарта MusicXML, как такового. Мы против использования его, как основного формата для программы, поскольку он не предназначен для этого и не предоставляет возможностей для хранения специфически выстроенных данных. Его назначение — передача усреднённого унифицированного внешнего представления нотного текста из одной программы в другую. Вот в этом качестве мы его и применяем.

На этом нововведения минувшего спринта заканчиваются. К этому моменту мы потратили на разработку прототипа 153 идеальных инженерных часа и написали 317 автоматических тестов для контроля качества. Да, мы успели много, но всё интересное — ещё впереди. Самая нотация начнётся после того, как мы реализуем все пункты нашего Definition of done для начальных нескольких команд.

Всех, кому интересно развитие проекта, приглашаем на следующее спринт-ревью, которое состоится в этом ЖЖ ровно через две недели, 23 мая, в 9:00 по московскому времени.

Злобное

Нет, ну я же говорил!
Что уж там обломок вязки оставить, когда нынче просто заменить вязку на две отдельных восьмушки кажется редакторам кощунственным!



Как же можно! Ведь иначе никто не увидит, что здесь доля!

Мне представляется эта тенденция сродни нынешним ужасным названиям учреждений, упоминаемым неизменно в именительном падеже и обязательно в кавычках. Как, например:

Злое чучело

Ещё более злобное

Купил себе новую клаву. У старой обломалась ножка, да и задрало выпутывать ея хвост из-под партитур. Захотелось беспроводной.

Я никогда не смотрю на клавиатуру, когда печатаю, пальцы сами знают своё место. На алфавитно-цифровом блоке они ориентируются по зарубкам на клавишах А и О, на функциональных клавишах — по промежуткам между четвёрками клавиш, на цифровом и стрелочном блоке — по промежуткам между блоками. У меня даже никогда нет наклеек с русскими буквами на клавишах, поскольку они не нужны.

На новой клавиатуре решили сэкономить один сантиметр в длину и убрали все «лишние» зазоры между клавишами.



Теперь, чтобы попасть в Page Up или в цифру 7, приходится каждый раз кивать головой вниз. При работе с гигантскими партитурами каждое такое движение увеличивает продолжительность работы в полтора раза.

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

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

О, ещё эти обормоты не сделали лампочек для Caps Lock и Num Lock. Ну как так можно!