четверг, 22 января 2009 г.

I'm not standard. Programming on paper

Продолжение "I'm not standard". Тов.Чистяков, утверждает, что я читаю большие проекты с бумаги.

Я не читаю большие проекты с бумаги. Я пишу свои проекты с помощью программирования на бумаге. Проекты, как мне представляется, большие для одного человека. Например, ядро последней версии SObjectizer -- это более 40 тысяч строк C++ кода. Еще один проект, написанный мной в одиночку, ObjESSty, это еще 50 тысяч строк. Написанный на Ruby Mxx_ru -- 10 тысяч строк. И есть еще во много раз больше написанного мной закрытого кода. Во всех моих проектах время от времени возникают ошибки, и я не могу сказать, что пишу очень качественный код. Но лучшей характеристикой качества моей работы я считаю фразу, сказанную начальником нашей службы техподдержки (занимающейся эксплуатацией написанных мной систем): "Только твой код я не боюсь запускать сразу на боевых серверах". Для меня это является доказательством того, что каким бы странным или диким не казался кому-то мой подход к написанию кода, этот подход в моем случае дает хорошие результаты.

Почему я использую бумагу? Так сложилось исторически. В 1989-1990 годах, в последнем классе школы у нас была одна пара в неделю по предмету "Информатика". Дисплейный класс из десятка БК-1001 один на пять школ нашего района. Первая часть пары - теоретическая, и только вторая - непосредственно за компьютером. И хоть тогда я написал всего две или три какие-то программы, их исходный текст был подготовлен заранее в тетрадке, а на уроке просто введен и отлажен. Потом были первые курсы университета. С обычным для того времени дефицитом всего, в том числе и машинного времени. У нас, если мне память не изменяет, было что-то около трех пар в дисплейном зале на две недели. Да и в принципе, на первых трех-четырех курсах машинное время для себя приходилось вырывать, иногда с боем, иногда хитростью. Хотя и потом, уже на работе в КБСП, году эдак в 1996-м, когда в наш отдел пришел новенький Pentium-166MMX с 32Mb памяти, было составлено расписание для того, чтобы выделять каждому сотруднику несколько часов в неделю для работы на этом супербыстром монстре...

Ну да вернемся к 1990-му году. Машинного времени было настолько мало, что придя на него неподготовленным, можно было успеть сделать только заданные лабораторные работы. А ведь хотелось большего! Тогда я последовал совету своего преподавателя, Александра Васильевича Лубочкина, о том, что программу сначала нужно писать на бумаге. И это сработало!

Естественно, времена изменились. Сейчас нет недостатка в машинном времени. Сейчас я не студент, мне приходится программировать гораздо, гораздо больше. Поэтому часто я пишу код прямо за компьютером. По разным причинам: код тривиальный или нужно сделать оперативную правку, или пишется одноразовая программа-тест на выброс. Но наиболее сложные и/или ответственные фрагменты я стараюсь писать сначала на бумаге. И это работает.

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

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

Когда программа начинает создаваться на бумаге, можно начинать с чего угодно. Половина функции может состоять из вопросов, а вторая половина быть набором рисунков, например, иллюстрирующих расщепление узлов B+ дерева. Но затем все это начнет структурироваться, начнут вырисовываться группы основных и вспомогательных функций/методов/классов, начнут формироваться зависимости по данным. И все это будет перед глазами, на 5-10 листах формата A4, которые можно разложить на столе и обозревать результаты собственного творчества с высоты "птичьего полета". В результате все обязательно сложится в законченную картину, станет видно, какой параметр куда нужно будет передать и зачем, какие куски кода повторяются слишком часто и как это дублирование можно устранить. Но и это еще не все.
 
Когда программа написана сначала на бумаге, она может очень неформальные комментарии. Ими могут быть схемы/рисунки на полях, какие-то небрежно сделанные заметки или пояснения. Или же большие фрагменты кода могут не содержать комментариев вовсе. Зато при вводе текста в редакторе появляется возможность писать толковые комментарии, описывающие что, для чего и как. Ведь все это уже известно, остается только сформулировать и записать. Поэтому при вводе кода с бумаги не возникает сложностей с тем, чтобы написать перед новым классом развернутый Doxygen-комментарий с полным описанием назначения класса, особенностей его работы и, даже, примерами его использования. Что самым благоприятным образом сказывается на качестве генерируемой по исходным текстам документации.

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

Комментариев нет: