Компьютерра - Журнал «Компьютерра» № 34 от 18 сентября 2007 года
- Название:Журнал «Компьютерра» № 34 от 18 сентября 2007 года
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Компьютерра - Журнал «Компьютерра» № 34 от 18 сентября 2007 года краткое содержание
Журнал «Компьютерра» № 34 от 18 сентября 2007 года - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Я не случайно взял «язык» в кавычки. Дело в том, что обычное представление о «древнем» коде, как о коде на языке программирования вроде Fortran или Cobol, – крайне упрощенное. Как раз по Фортрану вполне можно найти учебник или справочник. Здесь нет необходимости восстанавливать его правила только по исходному тексту программы. Проблема в том, что любой достаточно объемный кусок кода, помимо «основного» языка программирования, содержит и использует множество «подъязыков» и знаковых систем. Это служебные процедуры и классы, это используемые библиотеки и API операционной системы, это различные паттерны и встроенные алгоритмы. Единственная строчка кода может породить множество вопросов и потребовать многих дней сосредоточенного анализа для выяснения смысла и логики.
Таким образом, понятие «древности» кода (что есть, по сути, характеристика его непрозрачности для чтения и изменения в силу «забытости» правил и логики его написания) определяется не только и не столько языком программирования. Код может использовать устаревшие (а некогда общедоступные) библиотеки, даже документацию по которым сегодня найти весьма затруднительно. Код может быть написан для устаревшей ОС и широко использовать ее сервисы (например, для чтения/записи файлов, работы с сетевыми или графическими примитивами); или для устаревшего «железа» под специфику его процессора, памяти и портов. И, наконец, код может быть "устаревшим условно" – например, в нашей организации решили отказаться от библиотеки Х, так как не осталось людей, в ней разбирающихся, а кое-какой код, ее использующий, все еще актуален и активно применяется. При этом Х может быть вполне современной библиотекой, но в контексте нашей конторы исходники, ее использующие, – "древние".
Впрочем, помимо всех «объективных» компонентов знаковой системы кода, есть и «субъективные» – та часть процедур, библиотек и идиом, которая создана непосредственно автором (авторами) программы. И здесь-то может быть зарыта самая крупная собака "археологии исходников". Программист, работающий над нетривиальной задачей (к тому же работающий, как правило, итеративно – написание-отладка-исправление; и добро еще, если исправления сделаны не "абы запустить"), так вот этот программист, помимо использования существующих знаковых систем, создает множество своих. Они могут быть довольно стройны и логичны – а могут и не быть; объем и связность частей проекта превращает "полное погружение" в него в задачу не для слабых духом [Более того, все это справедливо даже для случая, когда автор кода – ты сам, но с момента написания/отладки прошло значительное время. Искусственность и многочисленность "самодельных знаковых систем" приводит к перегрузкам памяти – логика кода, в который не "закапывался с головой" на этой неделе, быстро забывается. Отсюда – даже если автор некоторого кода "как бы под рукой" – это не значит, что код не потребует "археологических изысканий"].
Совместная работа нескольких авторов (или группы разработчиков) еще больше осложняет задачу – за счет «интерференции» понимания происходящего в проекте (то есть все тех же знаковых систем, на которые разные участники могут смотреть немного по-разному).
Никакие спецификации и комментарии, к сожалению, не могут ни поспеть за кодом, ни исчерпывающе описать все нюансы – разве что в идеальном мире.
Совмещение «самодельных» знаковых систем с проблемой "объективно древних" библиотек, окружений, языков завершает картину того, чем же является "археология исходников". Суммируя вышесказанное, можно сформулировать: практически любые исходники начинают устаревать в тот самый момент, когда их перестают изменять. Устаревать не в смысле соответствия задаче (хотя и это тоже), а в смысле понятности тому, кто вздумает в них разобраться.
Читатель, знакомый с различными методологиями разработки, может заметить, что «недревнеющий» код, код постоянно обновляемый и частично переписываемый, напоминает о гибких agile-методологиях, с их непрерывной интеграцией и постоянным рефакторингом. Кроме того, мы знаем, что "код, не покрытый тестами, не существует".
Противопоставить этому можно многоступенчатые крайне формализованные процессы типа RUP (Rational Unified Process), где все аспекты работы проекта единожды специфицированы, документированы и изменения в «стерильный» код вносятся крайне неохотно. В нашей «археологической» метафоре такие методологии разработки, кажется, самой природой предназначены сразу производить «окаменелости» – монолитно, надежно, монументально, сто лет простоит. Но вот любое исследование или внесение изменений…
В идеальном мире программистам не приходилось бы возиться с "историческими артефактами" (по крайней мере, не приходилось бы слишком часто). Мы бы работали лишь с небольшими объемами "кода текущей задачи", который легко перерабатывать и столь же легко удерживать в голове целиком; а библиотеки и программы использовали бы лишь единожды скомпилировав, в бинарном виде. Реальность, к сожалению, куда печальнее и круче.
Ситуации, в которых программист тратит бо, льшую часть своего времени на анализ чужого, давно и не здесь написанного кода, встречаются сплошь и рядом. Причин может быть масса; помимо тривиальной – доставшаяся "по наследству" система или модуль, может возникнуть необходимость разобраться в работе (или исправить баги) исходников используемой (открытой или купленной) библиотеки, поскольку лучшим «справочником» по сложному формату или протоколу зачастую является библиотека, этот формат-протокол реализующая, и т. п.
Кстати говоря, чтение чужого хорошо написанного кода является неплохим подспорьем для самообучения (в том числе – обучения собственно искусству чтения).
Продолжим. Для анализа чужого кода, особенно кода крупного проекта, "с высоты птичьего полета" (построение ментальной модели, выяснение основных знаковых систем) исходники принято сводить к набору "основных сущностей" [Мы здесь не останавливаемся на том, что "объективные знаковые системы" – использованные языки программирования, API и библиотеки – все же придется изучить. Впрочем, для некоторых частных случаев, наиболее востребованных, существуют автоматизированные средства перевода с одного языка на другой (например, Cobol->Java)]. Для популярных языков программирования, в «обиходе» которых существует множество инструментов анализа и проектирования, это может выглядеть как автоматизированное построение диаграмм классов (иерархий наследования и включения и т. п.) или функций и процедур (иерархий вызовов). Здесь еще может помочь спецификация или другая документация на проект (на более низких уровнях, как правило, любая документация малорелевантна коду).
Читать дальшеИнтервал:
Закладка: