28 янв. 2009 г.

Задачка для собеседования

Была у меня в своё время любимая задачка для собеседования. Есть веб-страничка принимающая данные от посетителей сайта:
import cgi

form = cgi.FieldStorage()
message = form.getfirst('message', '')
attr = form.getfirst('attr', '')

result = '''<?xml version='1.0'?>
<message attr='%s'>%s</message>''' % (attr, message)
Далее данные отправляются, например, стороннему сервису. Так вот периодически этот сервис нам возвращает ошибку "not well-formed". И предлагаю найти и исправить ошибки. При этом я сразу оговариваю, что задача не столько на знание XML, сколько на умение решать проблемы, возникающие в ходе разработки. Кроме того, я делаю акцент на том, что пользователь может ввести произвольные данные.
Большинство соискателей сходу называют одну ошибку (представление спец-символов) и относительно быстро находят вторую (связанная с кодировкой). А вот третья проблема всегда остаётся незамеченной и "обходит" все предложенные тесты. Кроме того, большинство современных средств построения XML (например, ElementTree) молча пропускают такие ошибки. Как вариант, я предлагаю выбрать первый пришедший в голову blog-движок (как правило, это byteflow на django) с трансляцией RSS или Atom и написать тест, показывающий, что любой комментатор может "сломать" (весьма условно, учитывая что большиство современных читалок умеют переваривать и битый XML) feed комментариев. В короткий срок и без большого количества наводящих подсказок с этой задачей смог справиться только Олег Бройтман. Типичное время решения с подсказками — более суток.