Some time ago I’ve created a suite of (FitNesse) acceptance tests for the app we are working on. Some of them were of the form of: Given that a customer exists with customer name "John"
Given that a search results page is displayed for search criteria customer name "John"
Then at least one one customer should be displayed
Our QA (correctly) noted that this test is far from perfect because it doesn’t check that the found customer is the one with name “John”. On the other hand, there could be more than customer with this name. This means that we should not only verify that all found customers have the name “John”, but also that we have found all customers with such name. So we should first look into the database to find out what customers should be in the list and then check that we display only them. Correct? No!
The problem with this approach is that the test starts to mirror the application. It queries the database for customers with the name “John” – but isn’t this what the app does? If we made some mistakes in the app when implementing the query in the app, then who can guarantee that we won’t make the same mistakes when implementing that same query in the test?
So we limited ourselves with this: Given that a customer exists with customer id "mock-customer-1" and name "John" and surname "Smith"
Given that a search results page is displayed for search criteria id "mock-customer-1"
Then at least one one customer should be displayed with name "John" and surname "Smith"
And no customers should be displayed that don't have name "John" and surname "Smith"
Yes, this test does not verify that we found all the customers we searched for, but the only test that verifies application completely would be the application itself. Tests should be a stabilizing harness, not a copy, otherwise there’s no point in writing them.
Let there be my blog and let it be in English. Let the posts be abundant and provocative and let the keywords in them be right so that all-seeing Google casts its eye upon it and makes someone read all this.
I CAN HAS READERZ PWEASE?
P.S.: And LJ cross-post will be disabled. Because LJ sucks.
It’s 21st century, but these delusions born in ages when editors were crude are still out there.
Formatting with spaces is better than formatting with tabs.
Because then the text would look the same for all readers in all editors.
I’ve seen people who use 8 spaces for indentation and I’ve seen people who say that one space is enough. For me, 4 spaces is optimum. Why should anyone adjust to author’s aesthetic prefernces when we have such a wonderful tool as tabulation that could be set to any length in modern editors?
Member variables should be prefixed with “m”.
Because then we could see variable kind by looking at its name.
Most modern languages already have a way for prefixing member variables with “this” – this.someVar. Why reinvent the wheel?
It’s better to comment a part of code than to delete it.
Because it’s easier to roll back the change later.
If it’s hard to roll back the change, use another version control system or better interface to it. Ease of rollback doesn’t justify having to struggle through cowardly code where there are more commented code than working just because “my changes could be wrong and someone could need to easily revert them later”. If you are not sure in your code, think about it more.
Очень не хватает софтинки, которая ловила бы события в системе/инете и выводила очередь нотификаций куда-нибудь в таскбар. Например, появление нужного человека в аське, приход емейла по фильтру, новые посты в блогах/форумах… Т.е., это все можно устроить, но в разных приложениях и форматах (да и то не всегда, кстати).
Решил попробовать программу сайта One Hundred Push-ups. Вроде ненапряжная, но обещают, что через 6 недель смогу сделать 100 отжиманий в одном подходе. Проверим. :) Буду отчитываться. Надеюсь, она совместима с тренажеркой и я не перетренируюсь. :)
Итак, изначально делаю 30-35 отжиманий в одном подходе.
Наткнулся на пост на Хабре про то, что школьники ходят в Интернет и – о ужас! – пишут там как им хочется, а не как НАДО. А потом с трудом сдают диктанты. И по этому поводу их нужно защищать. Например, проверкой орфографии на уровне протокола, как предложили в одном из каментов. В принципе, автора понять можно – мне самому, привыкшему к правильному написанию, непривычно (и, следовательно, неприятно) видеть набигающие корованы. Но, с другой стороны, я отдаю себе отчет, что это неприятие – вопрос исключительно привычки, и ничего более. Так что не вижу никакой трагедии в том, чтобы ослабить правила языка, разрешив альтернативные написания слов.
Совсем другое дело – способность связно излагать мысли. Но здесь дело может быть совсем в другом – ведь “протоколы” общения, равно как и его цели, со временем меняются. Так что неудивительно, что общение людей, лет на 10-15 младших, часто кажется расхлябанным и примитивным, – просто оно передает не ту информацию и не тем способом, который мы ожидаем.
Поэтому связный логический стиль изложения мыслей становится скорее утилитарным, чем общеупотребительным – он используется для официальных документов, информативных статей, итп – но не для повседневного общения.
Последнюю неделю читал разные статьи про суперструнные теории и прочую современную физику. Сегодня захожу на DZone, просматриваю заголовки, натыкаюсь на “Strings in the D programming language”. Долго думал. :)
Перешел с Оперы 9.5 на Firefox 3. Долгие годы яростно ее защищал, но вкрай задолбали проблемы с логином на некоторые сайты (DZone, Google Analytics, Diigo) и тормоза по каждому клику. Тем не менее, интерфейс Оперы в мелочах значительно удобнее, чем интерфейс FF – например, на такую фишку, как сворачивание таба по клику, я до сих пор не нашел адд-она.
Увы, но, по-моему, в этом сезоне уже не будет ничего лучше, чем хип-хоп Челси и Марка (см. видео ниже). Имхо, лучшая пара сезона. Остальные их танцы, кстати, тоже заслуживают внимания. А лучший отдельный танцор – Вилл, и я думаю, что выиграет именно он, несмотря на то, что Твич прикольнее. :)
Вообще, в сезоне царствуют толерантность по расовому признаку и дискриминация по половому. Еще не выгнали ни одного негра, а девушкам неоднократно говорили, что они должны прыгать выше головы, чтобы соответствовать уровню партнера. Плюс замечание Нигеля, что судьи бы предпочли выгнать еще одну девушку вместо Тейна… Но парни на этот раз действительно подобрались выдающиеся, этого не отнять.
Чем дальше, тем больше меня терзают сомненья, что ВКонтакте когда-нибудь будет API для интеграции с другими сервисами. Жлобская позиция. Уйти оттуда, что ли…
В штате Юта госслужащие будут работать 4 дня в неделю по 10 часов со следующего месяца. Очень замечательная инициатива, надеюсь что со временем ее подхватят и частные организации.
Похожие девушки, похожие танцы, но в первом сезоне Нигель сказал “you’re one of my favorites” (Kamillah Barret), а в 4-м – “worst audition I’ve seen” (Cassidy Corder)
В промежутках между сериями четвертого сезона начал смотреть первый. Сразу бросаются в глаза две вещи:
1) Жюри злое. Реально злое. Нигель не стесняется в выражениях и методично опускает непрошедших. В четвертом он хотя бы критикует, пытается что-то обьяснить… Наверное, надоело по судам таскаться. :)
2) Оформление хромает. Напомнило российские “Танцы без правил” – тоже плохо освещенная сцена, какой-то хлам вокруг валяется, судьи сидят на стульчиках, скучившись над коротким столом… В общем, с 4-м сезоном ни в какое сравнение не идет. Там Шоу, а тут – передача. :)
Вообще, меня порой удивляет, что люди мечтают совместить несовместимое. Типа “хочу, чтобы в мире не было зла и насилия”. Не правда ли, замечательная идея – чтобы все люди относились друг к другу как братья, не завидовали, не ревновали, поддерживали и помогали?.. Да только вот люди злы и жестоки не просто так, это эволюционно так сложилось. Не могут люди быть добрыми при таких законах природы, которые мы имеем. Вот при других – да, могут, но при других еще много чего изменится – скажем, будут все люди одного пола, обладать коллективным разумом и употреблять друг друга в пищу… Но мы же этого не хотим, правда?
Кто-нибудь может сказать, типа, а разве обязательно иметь универсальные законы природы? Пусть все останется как есть, а изменится только (а), (б) и (в). И вот мы получаем нелогичный и непоследовательный мир, в котором, по большому счету, вообще ни в чем нельзя быть уверенным.
Аналогично и с сожалениями а-ля “ах, если бы я вышел из дому на полчаса раньше, то не попал бы под машину того укуренного психа”. Почему-то же вышел позже, а у тех причин были свои причины, и так может дойти до того, что ты мог выйти раньше только под зеленым солнцем в красном небе, помахивая щупальцами. Так что толку сожалеть, если все остальные варианты хуже? :)
Из всех видов работы мне больше всего нравится такая, где я знаю как выполнить задание, имею все ресурсы и единственное, что от меня требуется – достичь цели наиболее красивым образом. Именно тогда включается flow mode и процесс приносит удовольствие, а не желание съехать под благовидным предлогом и отправиться спать. И, естественно, должна быть возможность (пусть даже теоретическая), что результат будет кому-то нужен, полезен или хотя бы интересен.
В частности, под этот критерий не попадает работа типа “разобраться” или “найти, почему не работает” – обычно нет четкого понимания как эти вещи делать, а если и есть (например, книжку почитать, туториал пройти), то они не позволяют выполнять работу красиво.
А вот написание курсачей-дипломов вполне подходили бы как пример хорошей работы, если б не требования по минимуму листов и если б их потом хоть кто-нибудь читал.
Не помню где нашел, но фраза заслуживает цитирования:
Чем отличается опытный программист от новичка? И тот, и другой напишут один и тот же кривой код, но если новичок на вопрос “что это за фигня?” будет сидеть, краснеть и хлопать глазами, то опытный быстро, четко и обоснованно расскажет, почему все должно быть именно так, и никак иначе.
Забавно наблюдать, как некогда альтернативные взгляды становятся мейнстримом, а их все равно пытаются использовать для отделения себя “от серой толпы”.
Сегодня звоню в УкрИнБанк:
- УкрИнБанк.
- Это такой-то филиал?
- Да.
- Когда у вас сегодня обеденный перерыв?
- Уже закончился.
- А до скольки работаете?
- Зачем вам это знать, вы кто?
- Ваш килент, хочу сегодня зайти.
- Раз вы клиент, то как это вы не знаете, до скольки? Как вас зовут?
…
Снял последний остаток со счета и порадовался, что недавно открыл новый в ПриватБанке. Если бы только Приват24 не был таким неудобным произведением банковского искусства… :)
На мой взгляд, хороший руководитель отличается от плохого отнюдь не какими-то абстрактными вещами типа харизмы или тонкого понимания психологии. Если дистиллировать качества, которыми он должен обладать, то в итоге я прихожу к двум:
1) он изолирует подчиненных от лишних решений и ответственности…
2) …и избавляет их от забот, не касающихся прямых обязанностей.
По крайней мере, если я оказываюсь в руководящей позиции, то стараюсь эти два пункта соблюдать. :) Так вот, Хауз – тоже. Четко это видно в эпизоде 9 из второго сезона, когда Формана назначили его начальником. Когда принять хоть какое-нибудь решение прямо сейчас важнее, чем принять правильное решение потом, Хауз решает, а Форман – колеблется.
Смотрю Хауса. Ожидание за дверью во время операции над близким человеком – еще одна причина придумать эффективный и безвредный способ убивать время. Скажем, какие-нибудь таблетки, которые принял – и спишь ровно час на штуку. Конечно, есть распространенная идея, что каждая секунда жизни ценна, но раз об этом забывают во время очередей в госучреждения, то, может, можно забыть и в случае, когда альтернатива – сходить с ума от беспокойства?
Решил недавно завести тайный блог, для Очень Личных Мыслей. Завел, написал пару постов, а на третьем как-то задумался: а ведь неинтересно блог вести, если его никто читать не будет. Подумал, кому могу дать право его читать. Просмотрел два предыдущих поста. Повытирал то, что не хотел бы им показывать. Понял противоречивость затеи и все стер. :)
Увидел ссылку на пост, почитал каменты… Неужели так сложно понять, что альфовость и всякие позитивные качества (чтобы не пил, не бил, не кололся, налево не гулял) – никак не связаны? Для размножения такие параметры не настолько важны, чтобы природа включила их в критерий альфовости, а алкоголизм и наркомания вообще на эволюционном поле появились совсем недавно.
Работаю с админкой AquaLogic Service Bus и понимаю, насколько даже самая базовая возможность писать скрипты облегчила бы мне жизнь. Удивительно, что никому в голову еще не пришло сделать админку с возможностью записывать и воспроизводить действия.
Дочитываю “Paladin of Souls” Буджолд – возникают ассоциации с логом ролевки, в которой мастер изо всех сил пытается придумать что-нибудь интересное, при этом придерживаясь изначально запланированных рельс.
Уже около месяца пользуюсь таким замечательным планировщиком задач как Todoist. Перепробовал несколько других, в том числе популярные Remember the Milk и Ta-Da Lists – ни в какое сравнение не идут.
Недавно успешно использовал LoA. Все как по сценарию: альфа-отклик в течении суток, затем, через пару недель – бета-отклик. Теперь главное – не тормозить :) Хотя, впрочем, ЛоА позволяет делать retry…
Сейчас пытаемся с моей компанией-нанимателем сформулировать пункт договора, по которому я, в случае увольнения, не смогу переманивать за собой людей пачками. В принципе, я не против, главная проблема в том, как описать, что форвард предложений на МойКруг.ру, который я раньше делал не глядя, под “переманивать” не подпадает…
В продолжение Living to Interface. Нашел интересный пост про дефицитное мышление, дополнение к нему и понял, что именно оно мешает думать критериями, а не объектами. А проанализировав критерии, часто понимаешь, что они далеко не такие строгие, а значит – объект не настолько уникален, как казалось. Особенно если затем шагнуть в анализе на пару шагов дальше и проанализировать, зачем нужны такие критерии и не легче ли сосредоточиться на более базовых требованиях.
В программировании есть концепция coding to interface. Если коротко, то суть ее в том, что, вместо жесткой привязки программы к какому-нибудь модулю, задается набор критериев – чего программе от этого модуля нужно. После этого ей можно передать любой модуль, этим критериям соответствующий.
Интересно получается, если перенести эту концепцию на реальную жизнь – так сказать, living to interface. Привязываться не к конкретным вещам, а к их свойствам. Например, не к дороге от дома до метро, а к таким ее характеристикам как “не больше пяти минут”, “безопасный район” и “магазин по пути”. Не к конкретной марке сока, а ко вкусовым качествам. И в таком духе.
Еще интереснее выходит, если ее применить к вещам более сакральным и начать формулировать критерии к людям. Заменить “мне нужен вот этот конкретный человек” на “мне нужен человек с чертами (а), (б), (в) для (г), (д), (е)”. Есть у меня подозрение, что так можно сделать с каждым, просто слишком цинично выходит, поэтому об этом и не задумываемся.
I’ve been programming in Java for more than ten years. I have studied a lot of languages, and I keep learning new ones just out of curiosity. I even use some of these exotic languages here and there as the need warrants. Yes, some of these feel really good to program in (Ruby and Groovy for example)…
В начале 2008-го называть Ruby экзотическим языком – по сути, признаваться в отставании от блогосферы года эдак на два. Неудивительно, что Java автору кажется хорошим языком.
Когда-то видел пост в ЖЖ (линк потерял) с такой идеей: если завести сайт, где люди смогут делать ставки на дату смерти политиков, то киллеры смогут неплохо и достаточно безопасно зарабатывать, а политики, соответственно – будут осторожнее в словах и действиях.
Tests shouldn’t mirror the application
Some time ago I’ve created a suite of (FitNesse) acceptance tests for the app we are working on. Some of them were of the form of:
Given that a customer exists with customer name "John"Given that a search results page is displayed for search criteria customer name "John"
Then at least one one customer should be displayed
Our QA (correctly) noted that this test is far from perfect because it doesn’t check that the found customer is the one with name “John”. On the other hand, there could be more than customer with this name. This means that we should not only verify that all found customers have the name “John”, but also that we have found all customers with such name. So we should first look into the database to find out what customers should be in the list and then check that we display only them. Correct? No!
The problem with this approach is that the test starts to mirror the application. It queries the database for customers with the name “John” – but isn’t this what the app does? If we made some mistakes in the app when implementing the query in the app, then who can guarantee that we won’t make the same mistakes when implementing that same query in the test?
So we limited ourselves with this:
Given that a customer exists with customer id "mock-customer-1" and name "John" and surname "Smith"Given that a search results page is displayed for search criteria id "mock-customer-1"
Then at least one one customer should be displayed with name "John" and surname "Smith"
And no customers should be displayed that don't have name "John" and surname "Smith"
Yes, this test does not verify that we found all the customers we searched for, but the only test that verifies application completely would be the application itself. Tests should be a stabilizing harness, not a copy, otherwise there’s no point in writing them.