Рефакторингуем проджект риквайменты

Oct 07, 2012 22:38


- Дяденька, зачем Вы стоите здесь и проповедуете добро?
Ведь Вас никто не слушает.
Да и разве Вы в силах что-либо изменить?
- Все это я и сам понимаю.
Но если я не буду каждый день пытаться изменить человечество,
то боюсь, что оно изменит меня.
Эйгель Нансен, внук Фритьофа Нансена

Откуда берется коэффициент эффективности/компактности в тысячу?


В 2000-х Херрайц и Хассан измерили опенсорсные проекты из миллионов строк кода по десяткам различных метрик, и получили показательный результат: все они дают высокую корреляцию с таким нехитрым показателем, как число исходных строк кода программы (кроме пустых и комментариев:). В том числе и цикломатическая сложность Маккейба, и такая интересная вещь, как метрика Хэлстеда, показывающая понимаемость программы (число умозаключений, которое мозг должен проделать, дабы понять смысл исходников). Поэтому и будем опираться именно на этот просто измеряемый критерий -- число строк кода (sloc).

Понятно, что программку в тысячу строк кода не уместить в один оператор, а в пару сотен можно вполне. Наоборот, для extremely large projects, коэффициент может быть и выше. Прологарифмируем опыт Алана Кея:

десятки/сотни тысяч sloc : K = 100+
1-100 млн sloc : K = 1000+
миллиард sloc : K = 10,000
трилион sloc : K = 100500 :)

То есть весь написанный на планете за всю историю вычислительной техники код можно заново переписать, уместив на флешку -- в "объем", примерно эквивалентный хорошему дистрибутиву Linux.

Теперь главное: надо связать практику Метакода по созданию наглядных программ, тысячекратно компактнее своих "классических" аналогов, с повседневными мэйнстримовскими проектами. Предлагается следующая модель этой связки: объем итоговой программы в sloc должен быть примерно эквивалентен текстовому описанию ее функциональности (в тех же sloc).

Эта схожесть в первом приближении неплохо коррелирует с аланокеевским подходом: 20 тысяч строк текста, в каждой пускай 50 букв. Получается миллион знаков, типовая книжка. То есть умещенные им в 20 тыс sloc операционная система и прикладные пакеты вполне естественно описываются хорошим учебником == ТЗ.

Работает эта метрика и для других размеров. Например, задачку на тысячу императивных sloc, обычно описываемую десятком предложений, правильнее закодировать тем же десятком функциональных операторов. Я прикинул разные проекты из практики, ТЗ на проекты в сотни тысяч sloc практически всегда умещаются в объем обычной газеты.

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

С этого и надо начинать: представить ТЗ в достаточно формальном текстовом (это принципиально) декларативном формате, и далее вручную "откомпилировать" эти требования в аналогичный по объему исполнимый код. В таком случае достаточно очевидная схема реализации проекта сколь угодно высокой сложности складывается из в принципе хорошо известных шагов:
- подготовки ТЗ (этим может заниматься человек, с программированием не знакомый);
- рефакторинга ТЗ в декларативный вид, пригодный для околомашинной обработки;
- "компиляции" требований в компактный код (сможет выполнять программист типовой квалификации по предлагаемой Метакодом методике).

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

Отличие данного подхода, шаги которого в принципе и так давно известны, в этапе "компиляции" требований в код. Его можно хорошо формализовать, по аналогии, например, с работой движков логического вывода типа Пролога итп. Функциональное программирование для этого замечательно подходит, так как помогает не "как делать", а "что делать".

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

P.S. Оформил Метакоду платный аккаунт.

эвристики, функциональное программирование, проектные требования, декларативное программирование, метрики кода

Previous post Next post
Up