Сегодняшнее наше интервью — с Андреем Васильковским (Andrzej Wasylkowski). С 2005 года он работает над получением степени доктора философских наук (PhD) на кафедре Разработки Программного Обеспечения в университете города Саарбрюккен, Германия. Область его исследования — разработка ПО, с фокусом, смещенным в сторону методов анализа кода и их применимости в автоматизированных системах поиска проблем.
Один из проектов, в котором он участвует — checkmycode. Это сервис, позволяющий вам сравнить ваш код с «мудростью коллективного разума», т.е. более чем 200 миллионами строк кода на C из дистрибутива Gentoo.
Читайте дальше, и вы узнаете всё об этом проекте и том, как в нём используется Gentoo!
Привет, Андрей, и спасибо за интервью!
Привет! В свою очередь, я бы тоже хотел поблагодарить за интервью, это настоящее удовольствие быть вашим виртуальным гостем.
1. Когда я захожу на www.checkmycode.org, я вижу форму, в которую могу ввести свой код, а она в ответ выдаёт мне список «аномалий» в нём, и пояснение, почему тот или иной кусок кода «аномален», а поэтому, возможно, содержит ошибки. Расскажите, что происходит в это время «за кулисами»?
Вкратце, мы перерыли весь дистрибутив Gentoo Linux, в поиске типичных способов использования интерфейсов компонентов — ну, то есть как обычно используются компоненты Linux. Если вы используете какой-то интерфейс не в общепринятом ключе, это и будет обозначено как аномалия.
Если брать картину в целом, то процесс можно разделить на три этапа. Во-первых, код, который вы отправили, парсится, и из него генерируются так называемые «последовательные связи». Это двухэлементные последовательности вызовов функций, аннотированные информацией о передаче данных, например, «возвращаемое значение socket() -> первый аргумент listen()». Они представляют собой абстракцию того, как ваш код использует функции, чтобы производить действия над «объектами».
Потом, мы ищем все проекты из дистрибутива Gentoo Linux, которые могут быть релевантными для вашего кода, чтобы увидеть, как эти проекты используют те же функции, что и вы. Не вдаваясь в детали, если вы вызываете «socket()», то код из всех проектов, так же вызывающих «socket()», будет приниматься во внимание для обнаружения последовательных связей, в состав которых входит вызов «socket()».
Наконец, мы проверяем, не нарушает ли ваш код какой-либо из паттернов, найденных во втором этапе (в туториале вы можете найти образцы таких нарушений). О любых найденных нарушениях вам будет сообщено через интерфейс веб-сайта.
В реальности, происходит гораздо больше, но общая картина такова.
2. Когда начался этот проект, и почему?
Сегодня мы имеем несколько сложных методик проверки кода на наличие ошибок. Чего нам не хватает, так это спецификаций для сравнения. Вот мы и захотели взять эти спецификации из реально работающего кода. Проект рос постепенно, и достаточно трудно взять и указать точную дату его начала. Мы начали с легковесного парсера, который был написан моей студенткой Natalie Gruska как часть её диплома бакалавра. Парсер был закончен в июле 2009, но оригинальная задумка не имела ничего общего с идеей анализа больших объёмов кода. Мы просто хотели создать языконезависимый фронтенд для одного из моих инструментов, JADET. Оказалось, что парсер был очень быстрым, и вскоре профессору Andreas Zeller пришла в голову идея анализа больших объёмов кода с его помощью. Оставшиеся несколько месяцев, до самого создания веб-сервиса, по большей части работал я; над тем, чтобы оно действительно заработало именно так, и масштабировалось до размера целого дистрибутива Linux.
3. Кто ещё задействован в проекте?
Как я уже сказал, парсер, использующийся сайтом, написан Natalie Gruska, которая сейчас является студентом Королевского Университета Канады. Оригинальная идея принадлежит моему начальнику, профессору Andreas Zeller. Веб-интерфейс и программирование сайта — работа моего коллеги, Kevin Streit, который, как и я, работает над докторской диссертацией в университете Саарбрюкена.
4. Каково участие Gentoo в проекте?
Весь исходный код, который используется для поиска паттернов, берётся из дистрибутива Gentoo (иными словами, сниппет, который вы вставляете в форму, сравнивается с исходными кодами дистрибутива Gentoo).
5. А почему был выбран именно он?
Он даёт нам доступ ко всем проектам, входящим в поставку дистрибутива. В свою очередь, это даёт нам возможность использовать наш парсер, чтобы определять, как определенные функции используются этими проектами.
6. Какие самые сложные моменты в использовании Gentoo?
Таких нет :) Работать с Gentoo было одним удовольствием, правда. И до сих пор — самой простой частью всего проекта.
7. Что бы вы изменили в Gentoo, чтобы сделать его проще в использовании в рамках вашего проекта?
Вот к чему я бы хотел получить доступ, но не смог (или просто не нашёл, где это можно сделать), так это к веб-интерфейсу к дереву исходных кодов всех проектов. Когда обнаруживается какое-то нарушение паттерна, пользователь также получает три примера того, где можно найти «правильный» исходный код. Теперь мы предоставляем для этого веб-интерфейс, но пока checkmycode не существовал, мне приходилось вручную распаковывать архивы исходных кодов, и искать в них нужны код, и это было скучно.
8. А что вам нравится в Gentoo?
Мне нравится тот факт, что portage достаточно легко применять, и то, что Gentoo использует стратегию «rolling release». Любой, кто когда-либо использовал не-rolling release дистрибутивы Linux, и наталкивался на неразрешимые конфликты версий, пытаясь использовать самую новую версию какого-то пакета, поймёт, о чём я говорю.
К тому же, по очевидным причинам, мне нравится, что у меня есть доступ к исходному коду :) В сущности, машина, на которой расположен наш сайт, работает под управлением Gentoo.
9. Ещё раз спасибо, что уделили время для рассказа о вашем проекте. Хотели бы вы ещё что-то добавить к сказанному?
Спасибо, что задали мне все эти вопросы, это было очень приятно! Я бы просто хотел указать на то, что www.checkmycode.org это небольшой интерфейс к инструменту, способному анализировать довольно большие программы целиком, и находить в них нарушения. Следовательно, мы прикладываем большие усилия к тому, чтобы он умел фильтровать то, что он считает «ложной тревогой», и это значительно снижает количество обнаруженных нарушений. К сожалению, побочный эффект этого состоит в том, что некоторые настоящие ошибки, связанные с некорректным использованием функций, не будут обнаружены. Так что, перефразируя Edsger W. Dijkstra, инструмент может указать только на наличие, а не отсутствие потенциально проблемных мест в вашем коде.
Один из проектов, в котором он участвует — checkmycode. Это сервис, позволяющий вам сравнить ваш код с «мудростью коллективного разума», т.е. более чем 200 миллионами строк кода на C из дистрибутива Gentoo.
Читайте дальше, и вы узнаете всё об этом проекте и том, как в нём используется Gentoo!
Привет, Андрей, и спасибо за интервью!
Привет! В свою очередь, я бы тоже хотел поблагодарить за интервью, это настоящее удовольствие быть вашим виртуальным гостем.
1. Когда я захожу на www.checkmycode.org, я вижу форму, в которую могу ввести свой код, а она в ответ выдаёт мне список «аномалий» в нём, и пояснение, почему тот или иной кусок кода «аномален», а поэтому, возможно, содержит ошибки. Расскажите, что происходит в это время «за кулисами»?
Вкратце, мы перерыли весь дистрибутив Gentoo Linux, в поиске типичных способов использования интерфейсов компонентов — ну, то есть как обычно используются компоненты Linux. Если вы используете какой-то интерфейс не в общепринятом ключе, это и будет обозначено как аномалия.
Если брать картину в целом, то процесс можно разделить на три этапа. Во-первых, код, который вы отправили, парсится, и из него генерируются так называемые «последовательные связи». Это двухэлементные последовательности вызовов функций, аннотированные информацией о передаче данных, например, «возвращаемое значение socket() -> первый аргумент listen()». Они представляют собой абстракцию того, как ваш код использует функции, чтобы производить действия над «объектами».
Потом, мы ищем все проекты из дистрибутива Gentoo Linux, которые могут быть релевантными для вашего кода, чтобы увидеть, как эти проекты используют те же функции, что и вы. Не вдаваясь в детали, если вы вызываете «socket()», то код из всех проектов, так же вызывающих «socket()», будет приниматься во внимание для обнаружения последовательных связей, в состав которых входит вызов «socket()».
Наконец, мы проверяем, не нарушает ли ваш код какой-либо из паттернов, найденных во втором этапе (в туториале вы можете найти образцы таких нарушений). О любых найденных нарушениях вам будет сообщено через интерфейс веб-сайта.
В реальности, происходит гораздо больше, но общая картина такова.
2. Когда начался этот проект, и почему?
Сегодня мы имеем несколько сложных методик проверки кода на наличие ошибок. Чего нам не хватает, так это спецификаций для сравнения. Вот мы и захотели взять эти спецификации из реально работающего кода. Проект рос постепенно, и достаточно трудно взять и указать точную дату его начала. Мы начали с легковесного парсера, который был написан моей студенткой Natalie Gruska как часть её диплома бакалавра. Парсер был закончен в июле 2009, но оригинальная задумка не имела ничего общего с идеей анализа больших объёмов кода. Мы просто хотели создать языконезависимый фронтенд для одного из моих инструментов, JADET. Оказалось, что парсер был очень быстрым, и вскоре профессору Andreas Zeller пришла в голову идея анализа больших объёмов кода с его помощью. Оставшиеся несколько месяцев, до самого создания веб-сервиса, по большей части работал я; над тем, чтобы оно действительно заработало именно так, и масштабировалось до размера целого дистрибутива Linux.
3. Кто ещё задействован в проекте?
Как я уже сказал, парсер, использующийся сайтом, написан Natalie Gruska, которая сейчас является студентом Королевского Университета Канады. Оригинальная идея принадлежит моему начальнику, профессору Andreas Zeller. Веб-интерфейс и программирование сайта — работа моего коллеги, Kevin Streit, который, как и я, работает над докторской диссертацией в университете Саарбрюкена.
4. Каково участие Gentoo в проекте?
Весь исходный код, который используется для поиска паттернов, берётся из дистрибутива Gentoo (иными словами, сниппет, который вы вставляете в форму, сравнивается с исходными кодами дистрибутива Gentoo).
5. А почему был выбран именно он?
Он даёт нам доступ ко всем проектам, входящим в поставку дистрибутива. В свою очередь, это даёт нам возможность использовать наш парсер, чтобы определять, как определенные функции используются этими проектами.
6. Какие самые сложные моменты в использовании Gentoo?
Таких нет :) Работать с Gentoo было одним удовольствием, правда. И до сих пор — самой простой частью всего проекта.
7. Что бы вы изменили в Gentoo, чтобы сделать его проще в использовании в рамках вашего проекта?
Вот к чему я бы хотел получить доступ, но не смог (или просто не нашёл, где это можно сделать), так это к веб-интерфейсу к дереву исходных кодов всех проектов. Когда обнаруживается какое-то нарушение паттерна, пользователь также получает три примера того, где можно найти «правильный» исходный код. Теперь мы предоставляем для этого веб-интерфейс, но пока checkmycode не существовал, мне приходилось вручную распаковывать архивы исходных кодов, и искать в них нужны код, и это было скучно.
8. А что вам нравится в Gentoo?
Мне нравится тот факт, что portage достаточно легко применять, и то, что Gentoo использует стратегию «rolling release». Любой, кто когда-либо использовал не-rolling release дистрибутивы Linux, и наталкивался на неразрешимые конфликты версий, пытаясь использовать самую новую версию какого-то пакета, поймёт, о чём я говорю.
К тому же, по очевидным причинам, мне нравится, что у меня есть доступ к исходному коду :) В сущности, машина, на которой расположен наш сайт, работает под управлением Gentoo.
9. Ещё раз спасибо, что уделили время для рассказа о вашем проекте. Хотели бы вы ещё что-то добавить к сказанному?
Спасибо, что задали мне все эти вопросы, это было очень приятно! Я бы просто хотел указать на то, что www.checkmycode.org это небольшой интерфейс к инструменту, способному анализировать довольно большие программы целиком, и находить в них нарушения. Следовательно, мы прикладываем большие усилия к тому, чтобы он умел фильтровать то, что он считает «ложной тревогой», и это значительно снижает количество обнаруженных нарушений. К сожалению, побочный эффект этого состоит в том, что некоторые настоящие ошибки, связанные с некорректным использованием функций, не будут обнаружены. Так что, перефразируя Edsger W. Dijkstra, инструмент может указать только на наличие, а не отсутствие потенциально проблемных мест в вашем коде.