tag:blogger.com,1999:blog-89291955601706359862024-03-27T20:42:30.432+02:00Just Test It!Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.comBlogger100125tag:blogger.com,1999:blog-8929195560170635986.post-55105222443569880152015-06-30T13:18:00.000+03:002015-06-30T13:18:57.519+03:00"К четырём прибавить два" или Старые новости про проектный треугольник<div dir="ltr" style="text-align: left;" trbidi="on">
С самого начала выражу надежду, что мой учитель геометрии, который ставил мне "отлично" все годы моего обучения в школе, не прочтёт этот пост. Что директор школы, который выдал мне "золотую медаль", тоже никогда его не увидит. Ну и, на всякий случай, что его не прочтёт преподаватель высшей математики моего первого ВУЗа.<br />
<br />
Все остальные - здравствуйте! :)<br />
<br />
Так сложились обстоятельства, что на работе <strike>на меня возложили</strike> <strike>я напросилась</strike> у меня возникли новые обязательства. Как всегда, я за любое увеличение полномочий, особенно если оно ведёт к увеличению зарплаты :) Но на этой волне я решила, что знаний моих в области управления, может, и хватает, но хотелось бы больше. А тут и новая программа пришла от Coursera + University of California под названием <a href="https://www.coursera.org/specializations/career-success" target="_blank">Career Success Specialization</a>. И первый же курс - основы проектного менеджмента. Подумалось мне: "Ну что я могу не знать в ОСНОВАХ проектного менеджмента?" Уговорила <a href="http://kefirkin.blogspot.ru/" target="_blank">kefirkin</a> присоединиться и мы засели за первую лекцию<br />
<br />
И тут - ТАДАМ! Пришло откуда не звали, называется.<br />
<br />
<a name='more'></a><br /><br />
Все знают про существование проектного треугольника. Ну вот все-все. Это давно не новость. И все знают, что выглядит от вот как-то так:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotnXJSREBQrQNZYchYldK10L_2oPZwJLa1maa9dPMrd0O-Boow9R0Eo9MJ9kAHjh7LMin0LFGnyFUHmIe4UdBAw01mWbZ2hxy_7gTj0_KnRD5FM6COdJWfEOvjSKv2W4AyJLfqeKWfAos/s1600/Untitled+Diagram-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiotnXJSREBQrQNZYchYldK10L_2oPZwJLa1maa9dPMrd0O-Boow9R0Eo9MJ9kAHjh7LMin0LFGnyFUHmIe4UdBAw01mWbZ2hxy_7gTj0_KnRD5FM6COdJWfEOvjSKv2W4AyJLfqeKWfAos/s200/Untitled+Diagram-1.png" width="195" /></a></div>
<br />
Т.е. у нас есть Стоимость реализации проекта, есть Время реализации проекта и есть План работ и Уровень Качества при реализации этого проекта. И все эти величины между собой взаимосвязаны - что тоже понятно, стоит только взглянуть на этот треугольник.<br />
<br />
Ещё я встречала название "железный треугольник". И, видимо, из-за этого у меня в голове отложилось, что треугольник этот - величина постоянная. Что в начале проекта мы уравновешиваем эти величины и это вот и является самой сложной работой менеджера - просчитать всё.<br />
<br />
И мне даже в голову не приходило (до вчерашнего дня), что эти величины могут меняться! Но так, как они взаимосвязаны между собой, то при изменении одной величины меняются не обязательно сразу две величины! Т.е. треугольник из равнобедренного может превратиться в чёрт-те что при неграмотном управлении.<br />
<br />
Например, мы, как тестировщики, нашли очень много минорных багов в проекте. Перфекционизм никто не отменял, а "много минорных" у нас традиционно равняется "один критичный".<br />
Так вот я раньше полагала, что все эти тестерские заморочки уже включены в то самое Quality, что внизу треугольника. А оказалось - фигушки нам! И если мы начинаем проворачивать такие "улучшения", то и остальные параметры "едут" следом за нами. Например, вот так:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSq7S0WdB1jTYe3y1zK2xtHxnIYrtvrAbdI2uSQcq_NwGN4Ld_GaHe3Hzac9lMflkjf52enGtyQmfaoqj73tdJDfyHPHBXbQXDGYGGUzWt4FyF_uoQRu1tnryoHEChCVpVIQRdF5bPc8Pl/s1600/Untitled+Diagram-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="106" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSq7S0WdB1jTYe3y1zK2xtHxnIYrtvrAbdI2uSQcq_NwGN4Ld_GaHe3Hzac9lMflkjf52enGtyQmfaoqj73tdJDfyHPHBXbQXDGYGGUzWt4FyF_uoQRu1tnryoHEChCVpVIQRdF5bPc8Pl/s320/Untitled+Diagram-2.png" width="320" /></a></div>
<br />
<br />
Мы решили, что качество должно быть сильно выше ("А давайте не выпускать релиз не только если у нас критичные баги есть, но и если у нас минорных больше 10 штук висит!"), соответственно, время затягивается. И, нет, никто этого не предусматривал заранее! Мы сами это придумали только что.<br />
При этом Стоимость может остаться той же самой, особенно на тех проектах, где имеет значение только скорость разработки, "а всё остальное заказчик не оплачивает". Ну или всю команду на радостях лишили премии за задержку релиза - тоже для проекта ничего не изменится (в отличие от команды, но сейчас не о нас).<br />
<br />
Другая ситуация - сроки нам важны. И в проект срочно вливают ещё несколько специалистов для фикса найденных миноров и последующей проверки, а потом перепроверки и перепроверки (все мы знаем о процентной вероятности появления нового бага при исправлении старого). Тогда Качество и Количество выполненной работы возрастут, Стоимость возрастёт, а Время (в идеальном мире) останется неизменным.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dcBdLfd3DV5XriSEaGVI_LwfaiktXU8O3DPO9Hhd0Zd0jEdBT7GFSPLpa_N_8Nx5LMSm6rARlaCaRmHKsQF9D53H2wwGr3HxtEOiKWchI8Dq26vNkqRyjxCUOLzY8V6lSsYR9bPqOrp5/s1600/Untitled+Diagram-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4dcBdLfd3DV5XriSEaGVI_LwfaiktXU8O3DPO9Hhd0Zd0jEdBT7GFSPLpa_N_8Nx5LMSm6rARlaCaRmHKsQF9D53H2wwGr3HxtEOiKWchI8Dq26vNkqRyjxCUOLzY8V6lSsYR9bPqOrp5/s1600/Untitled+Diagram-3.png" /></a></div>
<br />
В реальном же мире как Стоимость, так и Время постепенно "подтянутся" за измеившимися двумя другими параметрами и треугольник опять станет таким, привычным нам и кажущимся "железным":<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjciJLX7AWJ2JNzYEUHAbvhbXHdRKLZhVpLqc8RUtNDNUr_UPcd6gvs3Pv90odsTaya-wuUTQp6TR4gsRvyeVLb8GNfhxKkDw7aIet2m7rXd721oIV1Ml0EyH_TPZE8euz88UlnwaHMVSPB/s1600/Untitled+Diagram-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="272" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjciJLX7AWJ2JNzYEUHAbvhbXHdRKLZhVpLqc8RUtNDNUr_UPcd6gvs3Pv90odsTaya-wuUTQp6TR4gsRvyeVLb8GNfhxKkDw7aIet2m7rXd721oIV1Ml0EyH_TPZE8euz88UlnwaHMVSPB/s320/Untitled+Diagram-4.png" width="320" /></a></div>
<br />
Только в этот раз он будет уже намного больше - включая в себя раздутое Качество и Количество, и синхронизировавшихся с ним Стоимость и Время.<br />
<br />
<br />
Если какой-то капитан умер от очевидности при прочтении данного поста - мои искренние соболезнования! :) Но мне не стыдно признаваться в том, что я чего-то не знаю, и учиться дальше. Если вы такие же - stay turned! :)<br />
<br />
<br />
</div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com177tag:blogger.com,1999:blog-8929195560170635986.post-54083499245013042312015-06-17T21:44:00.003+03:002015-06-18T01:41:36.537+03:00Radio QA - уже четвёртый подкаст от тестировщиков<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3AeT9lNu5B6Kp2rv74Y08TQ5GI_YRGL619TG4WpJvsY2ogG_3ux26ZtedDGQcnOpA4oG4G5qVocVyRStP0hUecdOcFcl2jlF6cPHwKtycIbryjBBX5u8uWUUxqSliqe147tJ0lOWOqQ4y/s1600/podcast4_484x252.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3AeT9lNu5B6Kp2rv74Y08TQ5GI_YRGL619TG4WpJvsY2ogG_3ux26ZtedDGQcnOpA4oG4G5qVocVyRStP0hUecdOcFcl2jlF6cPHwKtycIbryjBBX5u8uWUUxqSliqe147tJ0lOWOqQ4y/s320/podcast4_484x252.jpg" width="320" /></a></div>
Соскучились? Приходите - пообщаемся!<br />
<b>20 июня (суббота) в 17:00 (МСК).</b><br />
<br />
Специально для всех, кто соскучился по моему голосу, я напросилась в ведущие четвёртого выпуска Подскаста от тестировщиков на Radio QA. Помимо того, что мы обсудим все те вещи, что случились с нами за то время, что мы не слышались, мы ещё обсудим и важную для многих тему: фриланс-таки или офис?<br />
<br />
Я планирую обсудить со своими соведущими то, действительно ли фриланс и офис настолько разные? Фрилансеры одним из плюсов своей занятости называют возможность путешествовать, работать и отдыхать в разных уголках планеты. Может ли офисный работник себе это позволить? И если да - то как? Мы обсудим возможности оформления в новой стране для фрилансеров и для офисных труженников, поговорим про социальные гарантии или негарантии, а также ответим на все вопросы, которые вы подымете в комментариях.<br />
<br />
<b>Подробности</b> можно посмотреть тут: http://radio-qa.com/vypusk-4-frilans-ili-ofis/<br />
<br />
<b>Лайфхак:</b> если зафрендить нас на <a href="http://mixlr.com/radio-qa" target="_blank">http://mixlr.com/radio-qa</a>, то напоминалка о выпуске придёт за полчаса до его начала.<br />
<br />
Не переключайтесь :)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHg0eFWXGandRPdMlXcdvjkF_4RIV-8w39-y0g59jONOsmJjOnUFxuq4EYuO8fH0zm-EkLE2fBZPW3KsyNXu9WjuWTOsYogvnW0IuwsygV4gKsPdmjyOpUzy19Ewv9CWyB2UU_l_KoCdf4/s1600/podcast4_484x252.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
</div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-73748397752110789912015-05-07T17:05:00.002+03:002015-05-07T17:06:52.585+03:00Го в Radio QA! Мы создали! © Т. Писчасова<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiizAiMlcrOOfj_k8aaMjp644QM1NCJDtHCr7tcI31HhLHpDFHtrQNmnsmnqSE74eLGHLIJxnqY_Z4Scg2leTdxa0DW9zTA2jRt0PjYI0WyLwPUkIw0N-Iluondx56aRbJ744sSPIYoEoGW/s1600/1311230284_1311087907_radio-190609.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiizAiMlcrOOfj_k8aaMjp644QM1NCJDtHCr7tcI31HhLHpDFHtrQNmnsmnqSE74eLGHLIJxnqY_Z4Scg2leTdxa0DW9zTA2jRt0PjYI0WyLwPUkIw0N-Iluondx56aRbJ744sSPIYoEoGW/s320/1311230284_1311087907_radio-190609.jpg" width="320" /></a></div>
Собрались мы как-то небольшой тестерской группкой в уютном скайпике и решили, что не хватает в русскоязычном тестерском мире ещё одного подкаста про тестирование.<br />
<br />
Ну, раз порешили, значит, так тому и быть :) Назвали его Radio QA и обязались встречаться дважды в месяц. И вы можете встречаться вместе с нами - на вопросы мы тоже обязались отвечать. Итак! <br />
<br />
<blockquote class="tr_bq">
Дамы и Пацаны!!11одиннадцать<br />
Приходите <b>14 мая в 18:00 мск на наш подкаст "Radio QA"!</b></blockquote>
<br />
<blockquote class="tr_bq">
Это подкаст тестировщиков, который уникален тем, что пройдет в прямом эфире.<br />
Тема выпуска "Разработка без нянек", в нем мы поговорим о том, как
доверить разработчикам тестирование продукта, чтобы потом не было
мучительно больно ни продукту, ни разработчикам, ни тестированию.</blockquote>
<br />
<blockquote class="tr_bq">
У слушателей прямого эфира будет уникальнейшая возможность оставить свои комментарии для участников подкаста и задать вопросы.<br />
Продолжительность выпуска - около 1 часа.<br />
Вас ждут с на <a href="http://l.facebook.com/l.php?u=http%3A%2F%2Fmixlr.com%2Fradio-qa&h=SAQHdirr9&enc=AZMLUT48GLMJUvwrfR3uZdvoE4mRc5wuGtGJXHp3LL-nN3Vhn_Oz0fbl0LAlD24Ckno0p_1fb6xv38Y7fwnekY2_RM8sR7E_cX4vSfCKbRJ3HuwUmgxDSW3uopAVrpr5Zo7xsNs-hIIvb0F0Mzzo-k1hTngt4ikZdqb78GU3ob6b34T3vhNc-oLFMsoGd234PrBazUy3T1pEg-ruYQRRCIDx&s=1" rel="nofollow" target="_blank">http://mixlr.com/radio-qa</a> в четверг!<br />
Зарегьтесь заранее, чтобы участвовать в чате. </blockquote>
<blockquote class="tr_bq">
<i class="_4-k1 img sp_Gs1CrV8_0BP sx_c228ea"><u></u></i><br />
В эфире будут эксперты в области тестирования и разработки М., А., Н. и Т. Хотите узнать кто? Приходите вовремя </blockquote>
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com3tag:blogger.com,1999:blog-8929195560170635986.post-73236514101947567442014-09-27T20:07:00.003+03:002014-09-27T20:07:55.913+03:00День тестировщика 2014 - отвечаем на вопросы по тестированию безопасности<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia9MNxB1_gQ7mVmMnBlvInaqhRZKjWdlVC3i_ocnhbOkisqNBpchUJg9w5SC9hhsmHqivrO3_Q0Ja6y-4TvcbqWZiNdoJJDz2SJQ5ybAZKJ0RTf-W7UbF854sXCro1z9ZEqLS5UIYjtDtj/s1600/Online-Security-Identity-Theft.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia9MNxB1_gQ7mVmMnBlvInaqhRZKjWdlVC3i_ocnhbOkisqNBpchUJg9w5SC9hhsmHqivrO3_Q0Ja6y-4TvcbqWZiNdoJJDz2SJQ5ybAZKJ0RTf-W7UbF854sXCro1z9ZEqLS5UIYjtDtj/s1600/Online-Security-Identity-Theft.jpg" height="185" width="320" /></a></div>
С 9 сентября не прошло ещё и полугода, а я уже собралась с силами и отвечаю на вопросы, заданные во время <a href="http://vestfalka.blogspot.nl/2014/09/blog-post.html" target="_blank">нашего с вами общения</a>.<br />
В отличие от <a href="http://rinauzhevko.blogspot.ru/2014/09/blog-post.html" target="_blank">Рины</a> и <a href="http://kefirkin.blogspot.nl/2014/09/blog-post_12.html" target="_blank">Иры</a>, я решила не отвечать на все-все заданные вопросы, а выбрать из них самые интересные и ответить на них. Итак, тройка лидеров в моем хит-параде выглядит так:<br />
<br />
<b>1) Как расставить приоритеты при тестировании безопасности?</b><br />
<br />
<a name='more'></a><br />
Говоря откровенно, я использую при тестировании безопасности те же методы приоритезации, что и при "обычном" тестировании. Время на тестирование традиционно ограничено, но мне повезло - если у меня есть что-то критичное, то я вполне могу попросить дополнительное время на его проведение. Поэтому во главу угла становятся риски.<br />
Какие риски могут быть и из-за чего они возникают? Сначала определяем откуда придет баг. Традиционно выделяются три источника риска: сам продукт, собственно проект и наши любимые пользователи.<br />
Какие могут быть риски в продукте? Всё как обычно: при реализации какой-то функциональности допустили ошибки. Не предусмотрели, что вот здесь логика должна быть такой, а не другой, и т.д.<br />
Какие могут быть риски в проекте? Здесь тоже всё достаточно старо и знакомо: проект большой и сложный, а на него набрали студентов-практикантов или же опытных разработчиков, но не сталкивавшихся ни разу с подобными технологиями. Обычно неопытные товарищи допускают глупейшие и очевиднейшие (для опытных) ошибки. Или же у нас динамично развивающийся проект, а методологию мы под него подобрали такую, которая не позволяет успевать разработке за требованиями. Последствия всем известны: "костыли" в неожиданных местах, "забывания" про важные требования, отсутствие code review и пр.<br />
Какие риски могут прийти от любимых пользователей? Самая первая и важная - они используют продукт "не так". Вечное "Пользователь никогда так не сделает!" перестаёт работать и пользователи делают-делают-делают.<br />
Итак, определили основные источники риска. Посмотрели на свой проект. Ещё раз посмотрели. Какие из рисков для нас реальны? И дальше на основе этих реальных, конкретных рисков определяем какие методы тестирования безопасности нам пригодятся, к каким частям функционала их стоит применить и в каком объеме. <br />
<br />
<b>2) А к десктопным приложениям насколько применимо тестирование безопасности?</b><br />
<br />
На все 100%! К слову, такая штука как <a href="http://software-testing.ru/books/security-books/1488-fuzzing" target="_blank">Fuzzing</a> обрела популярность именно после успешного применения на десктопных устройствах. И чаще всего фаззинг используется именно для тестирования безопасности десктопных приложений. При помощи него можно сделать такие замечательные штуки как: фаззинг файлов, фаззинг протоколов, драйверов, исходного кода и пр.<br />
<br />
<br />
<b>3) Насколько часто вообще требуется тестирование безопасности? Пытались работать с appscan - но как-то не заинтересовались.</b><br />
<br />
Как и все виды тестирования, тестирование безопасности можно проводить постоянно, периодически и одноразово.<br />
Одноразово - это похоже на то, что сделали вы. Один раз провели, посмотрели. Прослезились или нет :) Сделали выводы или нет :) Обычно, конечно, делаются выводы и в дальнейшем код пишется с учетом замечаний по безопасности.<br />
Периодически - раз в какой-то промежуток времени. Например, раз в квартал, раз в год. Т.е. проверили один раз и дальше контролируем периодически: помогло или не помогло, стали писать лучше или не стали, стали обращать внимание или не стали.<br />
Постоянно, конечно, самый оптимальный вариант, но не всегда доступный - проводить тестирование безопасности постоянно, вместе со всем остальным тестированием. Выкатили новый билд - проверяем в том числе и безопасность.<br />
Если говорить о нашем текущем проекте, то сейчас мы делаем минимальное тестирование безопасности периодически. Наш проект не связан напрямую с финансами, не завязан на некую секретную информацию, нам достаточно периодически проверять серьезно, а постоянно - только мелочи, типа одинарной кавычки - всё ли у нас хорошо всё ещё.<br />
Так и живём :)<br />
<br />
Спасибо за вопросы и спасибо всем, кто был с нами :)<br />
Удачи в нелегком тестерском труде! <br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><br />
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>RU</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
<w:UseFELayout/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Обычная таблица";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;}
</style>
<![endif]--><span style="color: #797979; font-family: "MS Shell Dlg","sans-serif"; font-size: 8.5pt; line-height: 107%; mso-ansi-language: RU; mso-bidi-language: AR-SA; mso-fareast-font-family: "Times New Roman"; mso-fareast-language: RU; mso-fareast-theme-font: minor-fareast;"></span></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-68470464534188995802014-09-20T16:07:00.000+03:002014-09-20T16:07:14.172+03:00Про рытьё ям, книги и развитие тестировщика.<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXDxeAX8Z5IggzIKTrLZrJ8pbfataHGYqiGcGEYUNmtFZoGGvQUWQjgJzu7qADVDXyi6yiaYVdiSAOP3EaQf1uMM_jYCj-DkHpBiFZruIlzbL_FUnM4t-BNP2MAt1w_n5H71agz7Iym6Qs/s1600/1320060081.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXDxeAX8Z5IggzIKTrLZrJ8pbfataHGYqiGcGEYUNmtFZoGGvQUWQjgJzu7qADVDXyi6yiaYVdiSAOP3EaQf1uMM_jYCj-DkHpBiFZruIlzbL_FUnM4t-BNP2MAt1w_n5H71agz7Iym6Qs/s1600/1320060081.jpg" /></a></div>
<div style="text-align: right;">
<blockquote class="tr_bq">
Нельзя выкопать яму в другом месте,копая одну и ту же яму глубже.</blockquote>
<blockquote class="tr_bq">
Э. деБоно "Серьезное творческое мышление"</blockquote>
</div>
<br />
Я очень люблю это высказывание. Оно такое - подходящее под все случаи жизни.<br />
<br />
Например, наша работа. Маруся - прекрасный тестировщик, замечательно проходит тест-кейсы, написанные тестировщиком Игорем. Очень тщательно проходит все шаги, разными цветами отмечает пройденные и те, что еще не успела. Сдает в срок, а иногда даже немного раньше. Она знает уже почти наизусть все кейсы и постоянно старается их улучшить: выделить что-то особо важно жирным, написать названия всех кнопочек в тексте с большой буквы... Только одно расстраивает Марусю - почти все баги в проекте находит Игорь. Марусе же остаются только изредка съехавшие кнопки да редкие опечатки. Хотя Маруся копает, копает очень усердно, глубоко и в одном и том же месте.<br />
<br />
<a name='more'></a><br />
Тестировщик Олег пишет автотесты. Хорошо пишет, качественно, долго. Много тестов уже написал. Красивые тесты, зелёные всегда. А "зелёные тесты" - один из обязательных критериев для релиза, значит, Олег не подводит команду. А если кто-то скажет, что на проекте всё равно полно багов, Олег со знанием дела ответит, что "Автотесты и не должны находить баги. Не для этого они пишутся!". Правда, покрытие тестами кода тоже хромает. Но над этим Олег работает. Он всё тщательнее пишет тесты, добавляет в них новые функции, оптимизирует устаревший код. О тест-дизайне Олег тоже слышал, но считает это игрушкой для мануальных тестировщиков. Им делать нечего - пусть себе дизайнят. А Олегу некогда - он занят серьёзным делом, он код пишет.<br />
<br />
Тестировщик Катя хочет заниматься тестированием безопасности. Очень нравится ей такая магия: вроде проект как проект, а потом - бац! - ты уже знаешь пароль администратора. Что скрывается за "бац!" Кате тоже хочется узнать. Но пока на работе релиз за релизом, дома - голодный муж и кошка. Хотя вот Олю взяли недавно тестировать безопасность. И даже зарплату подняли, чего Кате тоже бы хотелось. И Катя верит, что и её возьмут в безопасность, ведь она такой хороший тестировщик: исправно занимается ручным тестированием, всегда сдаёт свои задачи в срок и пишет отличные отчёты.<br />
<br />
Все совпадения неслучайны :)<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-46013687526979915702014-09-09T02:47:00.000+03:002014-09-09T02:47:00.238+03:00Coursera - давайте учиться вместе!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQladVvDktpKdwIf8WBm7dUOgNi62d9Vgyusdb9V8u7uzJOG29ndJvgsTepXsvZph52s04CA2BsFDoFEGzlAgYb9hUF1mUlqev8OBPF80ypeAiv4K7tHoBhGHKr3C8oxDlYdl-6QEnRBSz/s1600/course_logo.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQladVvDktpKdwIf8WBm7dUOgNi62d9Vgyusdb9V8u7uzJOG29ndJvgsTepXsvZph52s04CA2BsFDoFEGzlAgYb9hUF1mUlqev8OBPF80ypeAiv4K7tHoBhGHKr3C8oxDlYdl-6QEnRBSz/s1600/course_logo.jpg" height="180" width="320" /></a></div>
У меня есть предложение - а давай учиться вместе?<br />
<br />
Кто-то уже учился на Coursera, кто-то только слышал, что она есть. Кто-то сегодня прочтёт о ней впервые. К какой бы группе ТЫ не относился(лась) моё предложение в силе: давай учиться вместе!<br />
<br />
<b>Собственно, предложение для тех, кто уже в теме (более развернутое для тех, кто не в теме, будет ниже)</b>.<br />
<br />
Со 2 октября по 11 декабря 2014 года на Coursera начинается довольно-таки неплохой для тестировщиков курс "<a href="https://www.coursera.org/course/proglang" target="_blank">Языки программирования</a>". Я предлагаю пройти его вместе.<br />
Как это будет проходить? Шаг первый - записаться на курс :) Потом присоединиться к г<a href="skype:?chat&blob=XDT4GZJAZKgc93lH8IoReKGhmYpow8zn8vg7TfBHqfRghRQ60bMhx7sY91w1Nf9c22pcKPOGioBd" target="_blank">руппе в скайпе</a>, где можно будет обсуждать домашние задания, делиться успехами и просить помощи в случае неудачи. Тем, кто не владеет английским в достаточной степени, я обещаю помочь.<br />
<br />
<i><b>Краткий обзор курса:</b></i><br />
10 недель обучения<br />
8-16 часов работы в неделю<br />
Лекции на английском + субтитры<br />
С возможностью получения свидетельства об окончании<br />
Преподаватель - <a href="https://www.coursera.org/instructor/~104" target="_blank">Ден Гроссман,</a><br />
<a href="https://www.coursera.org/uw" target="_blank">Университет Вашингтона</a><br />
Категория: компьютерные науки - разработка программного обеспечения.<br />
<br />
<a name='more'></a><br /><br />
<b>Развернутое описание для тех, кто "не в теме"</b> :)<br />
<br />
<b><i>Что такое Coursera?</i></b><br />
<br />
Coursera - это образовательная платформа, которая предлагает бесплатные онлайн-курсы от различных ведущих (и не очень) университетов мира. Преподавание ведется в основном на английском языке (в лекциях есть субтитры). Сейчас идет движение по переводу лекций на различные языки мира, но пока я видела эти переводы только в группах у самих переводчиков, но не на сайте.<br />
Участником курсов может стать любой человек. При условии успешного окончания курсов выдается сертификат об этом.<br />
<br />
<i><b>О чем будет курс "Языки программирования" (для тех, кому нужна помощь в переводе)?</b></i><br />
<br />
В курсе будут исследованы основные концепции языков программирования, с акцентом на методы и преимущества функционального программирования. Программные языки ML, Racket и Ruby будут использованы так, чтобы показать вам как кусочки разных языков, складываясь воедино, могут создать больше, чем просто сумма их частей. На курсе будут даны такие программные навыки и понятия, которые необходимы для изучения новых языков (любых, какие вам только захочется).<br />
<br />
<b><i>О курсе</i></b><br />
<br />
Изучение множества концепций, лежащих в основе всех языков программирования. Использование функционального программирование в контрасте с объектно-ориентированным программированием. Благодаря опыту написания программ и изучения трех различных языков, изучаются ключевые вопросы проектирования и использования языков программирования, такие как: модульность и взаимодополняющие преимущества статической и динамической типизации. Этот курс не является ни полностью теоретическим, ни только программно-специфическим, - он даст вам основу для понимания того, как использовать языковые конструкции эффективно и как проектировать правильные и элегантные программы. Используя различные языки Вы научитесь мыслить глубже, чем если бы мы рассматривали синтаксис только одного конкретного языка. Акцент на функциональном программировании имеет важное значение для изучения того, как писать надежный, многократно используемый, компонуемый и элегантный код - на любом языке.<br />
<br /><i><b>Учебный план курса</b></i><br />
<i><b> </b></i> <br />
Примечание: примерно половина студентов предыдущих курсов отмечала время, затрачиваемое на изучение, в районе 8-12 часов в неделю, в то время как другая половина указывала большие затраты времени - около 15 часов в неделю или даже больше. Затрачиваемое время действительно отличается для разных людей. Зависит это от имеющейся подготовки. Пожалуйста, посмотрите уровень рекомендуемой подготовки ниже.<br />
<br />
Темы (большинство из которых, возможно, не скажет вам ничего до самого начала курса):<br />
Синтаксис & семантика & идиомы & библиотеки & инструменты<br />
Основы ML (связи, условия, записи, функции)<br />
Рекурсивные функции и рекурсивные типы<br />
Преимущества не мутаций<br />
Алгебраические типы данных, шаблоны соответствий<br />
Хвостовая рекурсия<br />
Функции первого класса и замыкание функций<br />
Лексическая область действия<br />
Карринг<br />
Синтаксическое удобство<br />
Эквивалентность и эффекты<br />
Параметрический полиморфизм и замыкание функций<br />
Выведение типа<br />
Абстрактные типы и модули<br />
Основы Racket<br />
Динамическая & статическая типизация<br />
Ниспровержение лени, потоки и сохранение результатов<br />
Имплементация языков, особенно функций высшего порядка<br />
Макросы<br />
Оценка<br />
Основы Ruby<br />
Объектно-ориентированное программирование - это динамическая диспетчеризация<br />
Чистое объекто-ориентированное<br />
Имплементация динамической диспетчеризации<br />
Множественное наследование, интерфейсы и примеси<br />
ООП & функциональная декомпозиция и расширяемость<br />
Подтипы для записей, функций и объектов<br />
Создание подтипов<br />
Подтипирование, основанное на классах<br />Подтипирование & параметрический полиморфизм; ограниченный полиморфизм.<br />
<br />
<br /><i><b>Рекомендуемая подготовка</b></i><br />
<br />
Курс предполагает, что студенты уже знакомы с программированием на уровне большинства вводных курсов - потому что это не вводный курс по программированию. К слову, это и не достаточно продвинутый курс - но пары предыдущих курсов по программированию вполне достаточно. Студенты должны комфортно себя чувствовать при работе с переменными, условиями, массивами, списками с указателями, стеками и рекурсиями (хотя рекурсии будут рассмотрены на курсе), и знать разницу между интерфейсом и имплементацией. Студенты должны быть готовы писать программы на новых для них языках программирования. Последние части курса анализируют основные объектно-ориентированные концепции в противопоставлении с другими языками, поэтому знакомство с Java или близким языком (например, C#) будет полезно, но не обязательно для выполнения домашнего задания. <br /><br /><i><b>Рекомендуемая литература</b></i><br />
<br />Видео курсов и упражнения по программированию служат основными информационными материалами класса. Инструктор также пишет заметки, которые доступны и могут использоваться в качестве ценного источника информации.<br />
<br />
<i><b>Формат курса</b></i><br /><br />Видео лекции имеют коротки секции вопросов и ответов, но основная работа - это семь домашних заданий, в ходе которых нужно будет написать небольшие программы. Результаты домашней работы будут автоматически распределены между студентами и каждый студент будет давать свою оценку другому. Критика других работ и получение комментариев о своей собственной работе - это бесценный опыт при обучении. На курсе также будет промежуточный и финальный экзамен.<br />
<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com3tag:blogger.com,1999:blog-8929195560170635986.post-35170117500272837972014-09-05T22:15:00.001+03:002014-09-05T22:15:20.052+03:00Баги по-пятницам: всё равно мы с Вами пообщаемся!<div dir="ltr" style="text-align: left;" trbidi="on">
Довелось мне недавно делать заказ в одном из интернет-магазинов (нет, уже в другом). Заказ был в подарок, поэтому мне не хотелось, чтобы одариваемый знал о нём заранее. Проблема была в том, что необходимо было указывать телефон получателя для того, чтобы при доставке с ним связался курьер. Что же делать, - думалось мне.<br />
<br />
При заказе же увидела спасительную радиокнопку "Не звоните мне":<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqwD6EfU6ThzYNDdMwLbHhNwZ2LuWWwbINg0OUvGEWej39sLhNf6PWdkUfIcBflnW6W1yVXMyBRKbtLyd9axa9gemklzevmvSsw1FI1E8ocWzA7mWTNx1soYVnsTRG51Jc8Bo898mzVsuf/s1600/friday_bugs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqwD6EfU6ThzYNDdMwLbHhNwZ2LuWWwbINg0OUvGEWej39sLhNf6PWdkUfIcBflnW6W1yVXMyBRKbtLyd9axa9gemklzevmvSsw1FI1E8ocWzA7mWTNx1soYVnsTRG51Jc8Bo898mzVsuf/s1600/friday_bugs.png" height="230" width="400" /></a></div>
<br />
Ну и что вы думаете?<br />
Конечно, выбор этой радиокнопки не осуществлялся!<br />
<br />
Я не отчаялась и в комментарии отметила, что "кнопка не работает, но говорить по телефону я с Вами всё равно не хочу, пишите мне письма". И, конечно, менеджер повёл себя также, как эта радиокнопка - не сработал.<br />
<br />
Сюрприз был испорчен. В этом магазине я вряд ли закажу что-либо ещё.<br />
Вывод?<br />
А выводы делайте сами :)<br />
<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com3tag:blogger.com,1999:blog-8929195560170635986.post-60433161672335782452014-09-04T19:49:00.000+03:002014-09-04T19:49:30.714+03:00Тестерское. Праздничное. Твоё.<div dir="ltr" style="text-align: left;" trbidi="on">
Приближается значимый для каждого тестировщика день — 9 сентября. В этот день многие будут вспоминать <a href="https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B3#mediaviewer/%D0%A4%D0%B0%D0%B9%D0%BB:H96566k.jpg" target="_blank">первый найденный баг</a>, кто-то — известный стих о том, что происходит, если тестировщик выходит из дома, а кто-то смахнет пыль с <a href="http://lazy-tester.blogspot.nl/2013/04/1.html" target="_blank">Хроник отдела тестирования</a> и в очередной раз скажет: «Да, так всё и происходит на самом деле!»<br /><br />
А мы предлагаем окунуться в атмосферу тестирования не выходя из дома! Давайте встретимся онлайн, мы так давно этого не делали :) Итак, нас ждёт 2 часа драйвового тестерского праздничного междусобойчика: непродолжительные доклады на интересные темы, море поздравлений и, конечно, хорошего настроения!<br />
<a name='more'></a><br />План проведения такой:<br />Встречаемся <a href="https://www1.gotomeeting.com/register/174273320" target="_blank">по этому адресу</a> 9 сентября в 18-00 (МСК).<br /><b>Встречаем Татьяну Зинченко</b> - выступатора на различных конференциях, автора нескольких <a href="http://www.software-testing.ru/about/authors/1338-zinchenko" target="_blank">курсов то тестированию</a>, ведущего блога <a href="http://vestfalka.blogspot.nl/" target="_blank">Just Test It</a> - с докладом об основах тестирования безопасности.<br />Каникулы закончились и многие великие хакеры пошли в школу. Значит ли это, что наше приложение может вздохнуть спокойно? Конечно, нет, ведь на очереди — осенние каникулы :)<br />Есть хорошее выражение: «Любое приложение может быть взломано. Любая атака может быть отражена». О чем это? Мы можем отразить любую атаку. Но если взломщик потратит больше времени и использует больше инструментов — он сможет взломать любое приложение.<br />Да, мы не можем избежать всего. Но мы можем обезопасить себя от «великих хакеров», сделав так, чтобы затрачиваемое ими время и количество используемых приложений возросло настолько, что уже не стоило полученного результата. <br />В ходе доклада мы научимся проводить элементарные проверки безопасности. И изучим способы, которыми от них можно защититься. Согласитесь, когда вас взломают Анонимусы, - это намного приятнее, чем когда каждый третьеклассник :)<br /><br /><b>В 18-50 встречаем Ирину Винокурову</b> - известного тестировщика-фрилансера, постоянно делящегося своим оптытом на различных конференциях, автора блога <a href="http://kefirkin.blogspot.nl/" target="_blank">Bugoводство</a> с докладом о том, как тестировать приложения для смартфонов.<br />Давайте все согласимся, что мобильные гаджеты- уже неотъемлимая часть жизни.<br />И зачастую с приложениями работаешь уже не на компьютере, а с планшета. Или с телефона.<br />Несколько лет назад тестирование под мобилки было довольно редким видом. Сейчас же, практически для любого приложения необходима проверка не только на компьютере.<br />Ира не расскажет, как правильно тестировать мобильные приложения. Она подскажет некоторые программы и способы, чтобы быть уверенным, что приложение будет хорошо вести себя везде, где бы пользователь не решил его использовать.<br /><br />Завершит наш прекрасный междусобойчик известный тестировщик игр, Председатель программного комитета SQA Days, автор блога <a href="http://rinauzhevko.blogspot.ru/" target="_blank">Bugs@Feature</a> - Рина Ужевко с докладом о том, какое же кунг-фу у геймера.<br />Каждый геймер мечтает работать в играх. У Рины мечта сбылась — она оказалась по ту сторону виртуальности и готова приоткрыть нам завесу тайны: как происходит процесс создания игры? как тестируется самая сложная механика - баланс? Она расскажет не только про опыт взаимодействия с пользователями, но и много другого интересного. А ещё будет немного практики. Готовы тестировать игры? :)<br /><br />А в перерывах между докладами нас ждут поздравления от Алексея Баранцева и Натальи Руколь (кстати, они обещали нам ответить на самые животрепещущие вопросы по тестированию — готовьтесь!). К слову, любой желающий сможет поздравить коллег прямиком в эфире — запасайтесь микрофонами и текстом поздравлений!<br /><br />Спешите зарегистрироваться — количество мест традиционно ограничено (кстати, именно поэтому если Вы не собираетесь участвовать — не занимайте «слот»!).<br />До встречи онлайн!<br />
<br />
<b>ЗЫ. Участие, как обычно, бесплатное :)</b><br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com6tag:blogger.com,1999:blog-8929195560170635986.post-6617644321411377582014-08-31T22:57:00.000+03:002014-08-31T22:57:24.299+03:00Я в автоматизаторы б пошёл, пусть меня научат!<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibCHdhwVmdF0LT-u3-kiwR44LDFgh4Tia73bXZEQelwTCxT4qQN124i1Umt73fM5sEUark8-SFpCyR8d7NeU4Sn7NDWeRnDgbn-WcbSZbtPjzepGvQy4XI-HwzUju9fLCyZbVwjgVZC3rU/s1600/way.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibCHdhwVmdF0LT-u3-kiwR44LDFgh4Tia73bXZEQelwTCxT4qQN124i1Umt73fM5sEUark8-SFpCyR8d7NeU4Sn7NDWeRnDgbn-WcbSZbtPjzepGvQy4XI-HwzUju9fLCyZbVwjgVZC3rU/s1600/way.jpg" height="144" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">взято: <a class="irc_hl irc_hol" data-ved="0CAQQjB0" href="http://dmitriylebed.com/lyuboj-put-eto-vsego-lish-put/" style="-webkit-tap-highlight-color: rgba(255, 255, 255, 0.2); -webkit-text-stroke-width: 0px; background-color: #f1f1f1; color: #7d7d7d; cursor: pointer; font-family: arial, sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 16px; orphans: auto; text-align: start; text-decoration: none; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span class="irc_ho" dir="ltr" style="color: #7d7d7d; margin-right: -2px; overflow: hidden; padding-right: 2px; text-overflow: ellipsis; unicode-bidi: -webkit-isolate;">dmitriylebed.com</span></a></td></tr>
</tbody></table>
Гораздо чаще, чем вопрос "Куда двигаться дальше?" у тестировщиков возникает вопрос: "А как, собственно, двигаться? С чего начать? Чем продолжить?" И чаще всего такой вопрос возникает в отношении автоматизации: что делать вообще? Может, джаву подучить? Или C#? А то и вовсе РНР? Или же взять инструмент, а остальное познать в процессе? А какой инструмент взять? Вопросы, вопросы, вопросы...<br />
Недавно я наткнулась на короткую, но достаточно <a href="http://watirmelon.com/2014/02/23/take-control-of-your-own-career/" target="_blank">познавательную статью</a> на эту тему. Коротко и со вкусом :)<br />
Для тех, кому пока сложно читать в оригинале, прилагаю перевод :)<br />
<a name='more'></a><br />
<blockquote class="tr_bq">
За всё время моей карьеры я встречал множество коллег-тестировщиков, у которых нет опыта автоматизации, но которые говорят боссам что-то типа: "Я бы хотел заниматься автоматизацией тестирования". Они надеются, что после этого их "назначат" автоматизаторами, и они смогут изучить этот вид тестирования</blockquote>
<blockquote>
Я не думаю, что это работает именно так. Ваш работодатель не должен быть единственным, кто отвечает за ваши навыки и развитие вашей карьеры.<br />
<br />
А еще дело в том, что <i>никогда</i> не было легко получать новые технические навыки.</blockquote>
<br />
<blockquote>
Если вы хотите изучать программирование, начните свое обучение с чего-то типа Ruby. Если вы хотите узнать об автоматизации web тестирования - учите <a href="http://watirwebdriver.com/" target="_blank">Watir</a>. Если вы хотите узнать о BDD (behavior driven development) - начните изучение с инструмента <a href="http://cukes.info/" target="_blank">Cucumber</a>.<br />
Я выучил Ruby. Я выучил Watir. Я выучил C#, Python, Selenium, Cucumber и Jenkins. Список пополняется.<br />
Еще никогда начать не было так просто. Попробуйте <a href="http://www.codecademy.com/" target="_blank">codeacademy</a>, попробуйте <a href="http://rubykoans.com/" target="_blank">ruby koans</a>, скачайте <a href="https://leanpub.com/watirbook" target="_blank">бесплатную книгу по Watir</a>, купите <a href="https://leanpub.com/cucumber_and_cheese" target="_blank">недорогую электронную версию книги</a> про Watir и Cucumber.<br />
<br />
Всё просто: вместо того, чтобы смотреть телевизор или ходить куда-то, чтобы выпить, проводите ваши ночи и выходные изучая новые вещи, и возьмите контроль над своей карьерой в свои руки, не дожидаясь, пока работодатель принесет вам это на блюдечке с голубой каемочкой.<br />
И тогда вы сможете сказать "Я сейчас изучаю Watir и я бы с радостью применил его на нашем проекте" вместо: "Я бы хотел заниматься автоматизацией".</blockquote>
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com2tag:blogger.com,1999:blog-8929195560170635986.post-16273058200152664072014-08-22T14:43:00.000+03:002014-08-22T14:43:04.858+03:00Баги по-пятницам: люди тоже ошибаются.<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Предусловие.</b> <br />
Те, кто знают меня не только по этому блогу, в курсе, что у меня есть кошки. <br />
<br />
<b>Входные данные.</b><br />
Те, у кого есть кошка, безусловно, в курсе, что кошка иногда ест. Те, у кого есть кошки, безусловно, в курсе, что кошки иногда не едят. Когда спят. А, значит, кошкам надо покупать еду (иногда - если у вас кошка, постоянно - если у вас кошки).<br />
<br />
<b>Основной сценарий.</b><br />
На одном небезызвестном кошатникам сайте я увидела скидку на любимый моими пухнорылыми корм. Скидка звучала так: 9+3 в подарок. (Уточнение для не-кошатников: 1 пачка корма включает в себя 12 пакетиков.) Так как у меня кошкИ, решение было незамедлительным: "Надо брать!" К счастью, скидка распространялась не на весь любимый корм, а только на некоторые части. Поэтому я заказала 3 штуки тех самых "9+3 в подарок". Почему "к счастью" - ниже.<br />
<br />
Вечером пришло письмо: "Ваш заказ сформирован, распределен в 2 пакета. Номер первого пакета такой-то, номер второго - такой-то". В голове зародилось сомнение: зачем на 3 упаковки корма 2 разных пакета (коробки)? Муж-программист пояснил: "Видимо, по весу не проходит уже в доставочный контейнер и пришлось переносить в другой". <br />
На следующий день пришел курьер. И принес это.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbG9_fjFF_uih9TKkp-Tq6eqkJpWTD9X6qq1qnyA89RH_iaSY6LfUSd4W4GhAHRhIDrHWblnqHX9Pcl1M_jGd1MKz-EZd2ziSXOHKmv_8ORAUhN8wjirBnY11qrbuQqzG3t2Exqa4Vbxvt/s1600/e1d5b85b5205c62bceaa4e3ff46567dc8500bcbb5b71838e051fb85026f3b9e1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbG9_fjFF_uih9TKkp-Tq6eqkJpWTD9X6qq1qnyA89RH_iaSY6LfUSd4W4GhAHRhIDrHWblnqHX9Pcl1M_jGd1MKz-EZd2ziSXOHKmv_8ORAUhN8wjirBnY11qrbuQqzG3t2Exqa4Vbxvt/s1600/e1d5b85b5205c62bceaa4e3ff46567dc8500bcbb5b71838e051fb85026f3b9e1.jpg" height="320" width="240" /></a></div>
Конечно, ЭТО было в двух коробках. Огромных.<br />
Как и было написано, 9+3. Только не 9+3 пакетика, а 9+3 упаковки.<br />
<br />
Процесс распаковки, установки, фотографирования и спуска в подвал опущу. А дальше, отдышавшись и отойдя от шока, я написала в поддержку того самого магазина, который мне это прислал. И выяснилось, что при обработке заказа произошла банальная ошибка: оплата прошла как за 3 пачки, а вот при сборке заказа не было уточнения что такое "9+3 в подарок". И на сборке (т.к. цену они не видели, естественно) решили, что это - 9+3 пачки. Так и собрали, так и выслали.<br />
Банальный человеческий фактор.<br />
Но очень интересно, что решился бы он простым задаванием вопросов. :) Каждый тестировщик знает, что нужно задавать вопросы, а знает ли это каждый сборщик товаров? :)<br />
<br />
<b>Постусловия.</b><br />
Конечно, на письмо мне ответили. И, конечно, я предложила заплатить за лишний товар. Конечно, они согласились и дали мне ещё больше скидки на лишнюю часть.<br />
Ближайшие 8-9 месяцев вопрос пропитания перед моими пухнорылыми не стоит. А перед вашими? ;)<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com1tag:blogger.com,1999:blog-8929195560170635986.post-50161436994688078552014-08-15T14:02:00.000+03:002014-08-15T14:02:20.772+03:00Пятничная разминка для мозгов<div dir="ltr" style="text-align: left;" trbidi="on">
Уважаемые тестировщики (хотя проведенный мини-опрос программистов показал, что и они не догадываются зачем это)!<br />
<br />
У одного не безызвестного, а очень даже популярного интернет-магазина есть такая замечательная галочка "Это подарок". Появляется при оформлении заказа в корзине.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrczc1fT_GfomCtZwJPoa1H4UUlCLHfZR-kGN4uO9cNu6JnAN0_7SioLvZCG5-b2O-ICv7WEe-0u8Jz9SLoIY6f8UmxI-AkBVBykxPuAdK5nzdoa8dj3wD9EHiqmcNs5Ygf6EHdlWQWKXt/s1600/2014-08-15_1253.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrczc1fT_GfomCtZwJPoa1H4UUlCLHfZR-kGN4uO9cNu6JnAN0_7SioLvZCG5-b2O-ICv7WEe-0u8Jz9SLoIY6f8UmxI-AkBVBykxPuAdK5nzdoa8dj3wD9EHiqmcNs5Ygf6EHdlWQWKXt/s1600/2014-08-15_1253.png" height="125" width="400" /></a></div>
<br />
Вопрос простой: как вы считаете, для чего предназначена эта галочка?<br />
<br />
ЗЫ. Просьба тем, кто уже столкнулся с этой славной галочкой, сохранять интригу. Хотя бы недолго :)<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com22tag:blogger.com,1999:blog-8929195560170635986.post-24060513180469539982014-08-14T14:02:00.000+03:002014-08-14T14:02:07.736+03:00Пару слов o git. Или больше<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBdjl0M72t8vLih37Jf_X9Z5xB7pM_cdcBHo5tF9qRIvTyv4ULZ72Tlxv32tF0idCqYpnp9oECuomg_Pv-Knx10VUbbngGdx5aQaOz52vlpJdMxJSnQI5ZqZoTlGkUb2vkh2TyAopgH6Ph/s1600/git.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBdjl0M72t8vLih37Jf_X9Z5xB7pM_cdcBHo5tF9qRIvTyv4ULZ72Tlxv32tF0idCqYpnp9oECuomg_Pv-Knx10VUbbngGdx5aQaOz52vlpJdMxJSnQI5ZqZoTlGkUb2vkh2TyAopgH6Ph/s1600/git.jpg" height="200" width="200" /></a></div>
За свою тестерскую жизнь мы с вами можем менять проекты (написанные на разных языках и с использованием разных методологий и подходов) множество раз. Ещё вчера мы тестировали веб-приложения на PHP с использованием MySQL, сегодня перешли на десктоп с Java и MS SQL, завтра - мобильные сервисы, Ruby On Rails, postgresql. И хотя все языки программирования похожи (да простят меня программисты), все СУБД кажутся одинаковыми, а подходы в тестировании давно известны, - наступает такой момент, когда нужно использовать в работе что-то новое. Например, git.<br />
<br />
Что такое git, с чем его едят и как им пользоваться очень хорошо расписано <a href="http://git-scm.com/book/ru" target="_blank">в этой книге</a> (она даже на русском! - если кому-то это принципиально), но если времени почитать нет ("я почитаю, обязательно, конечно, стопудово, даю слово сам себе!"), к тому же там ещё и 282 страницы убористым шрифтом, а работать надо начать уже сегодня - то вот простое руководство с самыми необходимыми командами.<br />
<br />
Итак, что нам понадобится в git "на первое время" :)<br />
<br />
<br />
<a name='more'></a>Первое, что нужно сделать, - зарегистрироваться на github (если у Вас ещё нет там аккаунта) и/или получить доступ к нужным проектам.<br />
<br />
Затем нам нужно установить git. Делается это просто. В линуксовой консоли вводим команду:<br />
<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get install git </span><br />
<br />
<span style="font-size: x-small;">Примечания: если у Вас apt-get и если за Вас это не установил ещё админ.</span><br />
<br />
Дальше начинаем работать.<br />
Для начала посмотрим какие ветки уже есть на машине. Для этого используем команду<br />
<b><span style="font-family: "Courier New",Courier,monospace;">git branch</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1e3ZRHQ5uRhcj5FNpA7YQH-gt2A0nHnBHB0T0hFMNVZMyz1_mAVOWUmIrIhS85YE59mWACXPAeG9N2MyrTYhM6fPCpkEA-9vKs1IMfL4PxAtws9fF9deM7X1R_HiET3egHjpHbMamw2R7/s1600/branch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1e3ZRHQ5uRhcj5FNpA7YQH-gt2A0nHnBHB0T0hFMNVZMyz1_mAVOWUmIrIhS85YE59mWACXPAeG9N2MyrTYhM6fPCpkEA-9vKs1IMfL4PxAtws9fF9deM7X1R_HiET3egHjpHbMamw2R7/s1600/branch.png" height="115" width="400" /></a></div>
<br />
На экране у Вас появится список веток, которые уже лежат на машине (если Вы их туда положили, конечно). Если не положили - такого списка не будет.<br />
Итак, списка нет, всё грустно, что же делать? Выход один: посмотреть какие вообще есть ветки на этом проекте. Для этого воспользуемся командой, которая поможет нам посмотреть список веток на удаленной машине. Выглядит она почти также, за исключением мааааленького дополнения:<br />
<b><span style="font-family: "Courier New",Courier,monospace;">git branch -a</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb5BVTXuganmtq99RqmN2OwSipbWFTrDZkNMOjaEzyTslw5skXBxfvll3tVQdObNlSEQ_8ftfn6od42pNChlEqOZn3cZYSrnZqhW08wjHguqYqeXhTCxQVdBGAhM31leP2IxTU0-0rRI8J/s1600/branch-a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhb5BVTXuganmtq99RqmN2OwSipbWFTrDZkNMOjaEzyTslw5skXBxfvll3tVQdObNlSEQ_8ftfn6od42pNChlEqOZn3cZYSrnZqhW08wjHguqYqeXhTCxQVdBGAhM31leP2IxTU0-0rRI8J/s1600/branch-a.png" height="243" width="400" /></a></div>
<br />
<br />
На экране появятся сначала те ветки, которые лежат на Вашей машине, а потом те, которые лежат на сервере (путь к ним - <span style="font-family: "Courier New",Courier,monospace;">remotes/origin/....</span>).<br />
<br />
Отлично, список веток мы получили. Теперь нужно начать работать в какой-то из них. Для начала проверим не находимся ли мы уже в какой-то. Чтобы сделать это достаточно ввести команду<br />
<b><span style="font-family: "Courier New",Courier,monospace;">git status</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1PEo5830zmMSW71bI3ZvfQAcIPq5Dy6kXx_lDdpbiDmES4Z626w88WW1kZd1gzE9KnhgYnlpH_4Asi_gtgfJLBY_RJJ8a9s7H3IUzb0TBM5F-wYbNXIyfFic5rMQ11_sUeslmJLq90am/s1600/status.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB1PEo5830zmMSW71bI3ZvfQAcIPq5Dy6kXx_lDdpbiDmES4Z626w88WW1kZd1gzE9KnhgYnlpH_4Asi_gtgfJLBY_RJJ8a9s7H3IUzb0TBM5F-wYbNXIyfFic5rMQ11_sUeslmJLq90am/s1600/status.png" height="62" width="400" /></a></div>
<br />
Отлично! Мы получили сообщение о том, что находимся в ветке мастер (<span style="font-family: "Courier New",Courier,monospace;">On branch master</span>), а также о том, что она не нуждается в обновлении, поскольку соответствует той, что на сервере (<span style="font-family: "Courier New",Courier,monospace;">Your branch is up-to-date with 'origin/master'</span>). А дальше ещё одна загадочная фраза: <span style="font-family: "Courier New",Courier,monospace;">nothing to commit, working directory clean</span>, которая означает, что Вы ничего ещё не наделали значимого и никакие изменения на сервер Вам отправлять не нужно.<br />
<br />
Итак, мы находимся в основной ветке. Но разработка нашей фичи (исправление нашей баги) находится в другой ветке. Что же делать? Выхода два: просить слезно программистов залить все изменения в мастер (и вернуться к каменному веку разработки) или ввести простую команду:<br />
<span style="font-family: "Courier New",Courier,monospace;"><b>git checkout имя_ветки</b></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmv9a_2_D194ILnj9FCX30JbfLEdf7QLZ2KT2D5TBPRj2q_6MQIOO0qUUiwysb4WC8aeMglZvfKhhQRCVJfr-Ajq4In2uqSQlE7OsqEynDNfwukdupPpi4wfF8dPkpNbYAQMAaDxFxlexX/s1600/checkout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmv9a_2_D194ILnj9FCX30JbfLEdf7QLZ2KT2D5TBPRj2q_6MQIOO0qUUiwysb4WC8aeMglZvfKhhQRCVJfr-Ajq4In2uqSQlE7OsqEynDNfwukdupPpi4wfF8dPkpNbYAQMAaDxFxlexX/s1600/checkout.png" height="42" width="400" /></a></div>
<br />
Отлично! Мы переключились в нужную нам ветку (<span style="font-family: "Courier New",Courier,monospace;">Switched to branch 'SAM-323-..'</span>) и она даже не нуждается в обновлении (<span style="font-family: "Courier New",Courier,monospace;">Your branch is up-to-date with 'origin/SAM-323....'</span>).<br />
<br />
Можно стартовать сервер и начинать работу :)<br />
Хотя нет, ещё одна команда на случай, если изменения всё же придется подтянуть:<br />
<b><span style="font-family: "Courier New",Courier,monospace;">git pull алиас имя_ветки</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWWJfpQDRdIdpR0J7F2jsVa9o5W9QMCWB9Ah5I-Z21rhlPIUnimmco-iGPCRPH5Ms_Zr_1ObGHxikTc0ZLXTg1MoPr6Kg7UpWkKsPormNid40wkKdKOlUEQ3UBZMrb0Nqh_MFV97XckyaT/s1600/pull.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWWJfpQDRdIdpR0J7F2jsVa9o5W9QMCWB9Ah5I-Z21rhlPIUnimmco-iGPCRPH5Ms_Zr_1ObGHxikTc0ZLXTg1MoPr6Kg7UpWkKsPormNid40wkKdKOlUEQ3UBZMrb0Nqh_MFV97XckyaT/s1600/pull.png" height="245" width="400" /></a></div>
<br />
После введения команды у Вас запросят имя пользователя, а затем - пароль на гитхаб. И начнется магия! :) В конце магии Вас прозаично проинформируют о том, сколько файлов было изменено, сколько удалено, сколько добавлено и прочая неважная при первом знакомстве информация :)<br />
<br />
Вот теперь точно всё!<br />
Запускайте сервер и удачной работы :)<br />
Да прибудет с Вами сила!<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com5tag:blogger.com,1999:blog-8929195560170635986.post-4747214128959794652014-06-14T19:19:00.000+03:002014-06-14T19:19:53.843+03:00Тестовая документация: пациент скорее жив, чем мёртв, или скорее мёртв, чем жив? <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgYEn7KruwMBrCliyaM7YsATkx8YIBLp6OtuIpjxV0iQmawA21epLmG30VXPBPsyLwCxQTAGTOnX9Q4PBfrn_q44PZo8iMSxvXScBLg-lmdAJuFJx4gSK6y0yCs0h2rfjTLAaIyTHcjMel/s1600/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0(2).png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgYEn7KruwMBrCliyaM7YsATkx8YIBLp6OtuIpjxV0iQmawA21epLmG30VXPBPsyLwCxQTAGTOnX9Q4PBfrn_q44PZo8iMSxvXScBLg-lmdAJuFJx4gSK6y0yCs0h2rfjTLAaIyTHcjMel/s1600/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0(2).png" height="141" width="200" /></a></div>
Как давно вы писали тестовую документацию?<br />
Нет, не так. Как давно Вы - лично Вы - писали тестовую документацию?<br />
<br />
Когда-то давно, когда мир был большим, деревья - высокими, а процесс - вотерфолом, документация была жизненно важной штукой. На её создание выделялась тонна времени и не меньшая тонна денег. Сейчас стало модно прикрывать отсутствие документации гибкими нововведениями, а фраза: "У нас нет документации, у нас Agile!" давно стала новым мемом, по популярности не уступающим "Это не баг, это фича!"<br />
<br />
<a name='more'></a>А в действительности - так ли нужна документация сегодня? Во многих вакансиях обязательным требованием к тестировщику является умение писать тестовую документацию (как минимум: тест-кейсы и чек-листы). На <a href="http://software-testing.ru/trainings/schedule?task=3&cid=128&sem_midx=3&sem_jidx=0" target="_blank">своих курсах</a> мы <a href="http://software-testing.ru/trainings/schedule?&task=3&cid=219" target="_blank">в обязательном порядке</a> учим начинающих тестировщиков это делать. А стоит ли?<br />
<br />
Начнем с <b>тест плана</b>. Как часто он Вам пригождается в реальной жизни? Сколько раз Вы его используете после того, как единожды показали руководству? Как часто Вы его обновляете? Видит ли эти обновления кто-то, кроме Вас или Вашей команды?<br />
На одном из проектов я писала тест-план. Как руководитель команды тестирования. Честно писала. Подробно. Много написала. И очень собой гордилась. Пока не пошла презентовать это чудо творения своему руководству. Чудо почитали, меня похвалили. И после этого тест план не нужен был никому. Вообще. На протяжении 2 лет развития проекта.<br />
Потом в моей жизни случилась учеба и <a href="http://software-testing.ru/trainings/schedule?&task=3&cid=45" target="_blank">один умный трене</a><a href="http://software-testing.ru/trainings/schedule?&task=3&cid=45" target="_blank">р </a>сказала о том, что идеальный размер тест плана = 2 страницам. Я - человек обучаемый. На новом проекте решила претворить это в жизнь. Я написала тест план. Честно написала 2 страницы. Времени ушло гораздо меньше. Презентовала это чудо руководству. Чудо почитали, меня похвалили. И после этого.... Радует, что времени ушло уже намного меньше.<br />
Ещё на одном проекте "тест планом" назывался просто список тест-кейсов. Не понадобилось писать даже 2 страниц. Стоит ли говорить о том, что в таком виде "тест план" поддерживается уже несколько лет? Правда, он по-прежнему интересен только команде тестировщиков.<br />
<br />
<b>Тест-кейсы</b>. Как часто Вы их пишете? Насколько они подробные? Действительно ли Вы вносите в них изменения при каждом прохождении или "а вот тут я и так помню, что кнопку убрали"? Интересуется ли кто-либо ещё тем, что Вы там пишете?<br />
Я помню своё первое место работы - тест-кейсов у нас было много. Сначала их писали наши американские коллеги, а нам оставалось только их проходить. И вносить изменения. Через полгода мы вошли в доверие и нам разрешили писать кейсы самостоятельно. А самостоятельно проходить и самостоятельно править нам уже разрешали. На написание/прохождение/правку уходило около 80% нашего времени. Я ушла через 2 года, но знаю ребят, которые работают там до сих пор и 80% их рабочего времени уходит на написание/прохождение/правку тест-кейсов.<br />
На одном из проектов у нас был "мы ж Agile", с соответствующим количеством документации. То есть без документации. Через полтора года работы выяснилось, что совсем без документации никак. Пришлось писать. Долго, нудно и за все полтора предыдущих года.<br />
На ещё одном проекте тест-кейсы писались только для той функциональности, которая будет автоматизирована. Написали кейс, отдали на автоматизацию. Автоматизировали, про кейс забыли. Дальше правим только автотест.<br />
<br />
<b>Чек листы</b>. Неизменный лидер хит-парада. Никто точно не знает как они пишутся, известно только, что они очень краткие и их наличие уже считается "у нас есть тестовая документация на проекте". В действительности же их ваяют как угодно: кто табличками, кто строчками, а кто-то (как и мы) и вовсе заменили их на <a href="http://software-testing.ru/library/testing/general-testing/1809-mind-map---" target="_blank">интеллект карты</a>. И - сюрприз, сюрприз - они нужны только отделу тестирования :)<br />
<br />
Это только самые популярные. А есть же еще тестовые спецификации, тестовые стратегии, отчёты о тестировании и другие страшные слова. Вот Вы - нет, теперь уже вы - вы все действительно это пишете и используете?<br />
<br />
Или всё же пациент скорее мёртв, чем жив?..<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com9tag:blogger.com,1999:blog-8929195560170635986.post-26255535947932439992014-01-03T23:23:00.000+02:002014-01-03T23:23:41.489+02:00И снова здравствуйте, мои хорошие! <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigF6Nkl2zZcrI90Md-BPumrKvlaBXSjHPdiNnRwJLfVLRLWjAEbolxV0QMAi1ryNBHzEn34QTawzjJu63kORMqMfKQYONLuR5_KBtEQ3Na10qK7gwZr0aFa-ftdy_ODv41awH8WiNinDpj/s1600/Funny-happy-new-year-2014-wallpaper.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigF6Nkl2zZcrI90Md-BPumrKvlaBXSjHPdiNnRwJLfVLRLWjAEbolxV0QMAi1ryNBHzEn34QTawzjJu63kORMqMfKQYONLuR5_KBtEQ3Na10qK7gwZr0aFa-ftdy_ODv41awH8WiNinDpj/s1600/Funny-happy-new-year-2014-wallpaper.jpg" height="240" width="320" /></a></div>
Во первых строках своего поста скажу "Спасибо!" всем тем, кто остался с блогом несмотря на моё такое продолжительное отсутствие (я посмотрела статистику прочтений и приятно удивлена - спасибо вам, друзья!). Надеюсь, ваше терпение будет вознаграждено :)<br />
<br />
А теперь - новогодик традиционный. Кто-то подводит итоги уходящего года, кто-то делится планами на будущее. А я хочу поделиться цитатой :)<br />
<br />
Не так давно в книге Талеба "Черный Лебедь" (которую, кстати, я уже когда-то горячо рекомендовала почитать) встретила такие слова:<br />
<br />
<br />
<a name='more'></a><br />
<blockquote class="tr_bq">
"Иногда я просто отказываюсь понимать, почему несвежая еда, холодный кофе, отказ принять в компанию и недостаточно любезный прием могут начисто испортить людям день, обманув их ожидания.</blockquote>
<blockquote class="tr_bq">
[...] Мы легко забываем, что жизнь сама по себе - удивительное везение, редчайшее событие, случайное происшествие гигантского масштаба.</blockquote>
<blockquote class="tr_bq">
Представьте себе пылинку рядом с планетой в миллиард раз крупнее Земли. Пылинка - перевес в пользу вашего рождения; большая планета - против него. Так что бросьте психовать по пустякам..."</blockquote>
<br />
Я желаю вам, мои любимые тестировщики и околотестировочные читатели, внутренней гармонии на протяжении всего наступившего года (и даже еще дольше). Пусть никакие пустячные недопроблемки не смогут отвлечь вас от главного - жизнь прекрасна и удивительна! И да будет так сегодня и весь год :)<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com1tag:blogger.com,1999:blog-8929195560170635986.post-37977635792809002292013-06-27T10:24:00.000+03:002013-06-27T10:24:46.968+03:00ТЕСТ ИТ: прогнозирование появления дефектов<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHrhCOIGIvJt3fXNdZMo5864kqaszVsaMY5dItPUhaeDxw-WqXK4RtDkAzwYwLTgXZCjIYzZ5r2zmlp2SouU2gol8460WQS-qLGYjawesM5hP9y6fRIjgDBMBoKtSAmAwI5SkCmc9kSFJj/s1600/testit.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHrhCOIGIvJt3fXNdZMo5864kqaszVsaMY5dItPUhaeDxw-WqXK4RtDkAzwYwLTgXZCjIYzZ5r2zmlp2SouU2gol8460WQS-qLGYjawesM5hP9y6fRIjgDBMBoKtSAmAwI5SkCmc9kSFJj/s320/testit.png" width="320" /></a></div>
Всем привет!<br />
<br />
С вами снова я - ваш сменный-редактор-по-пятницам - Зинченко Татьяна. Сегодня у нас в рубрике ответ на вопрос Егора. Егор прислал очень развернутое письмо, в котором рассказал и о том, как он работает тестировщиком, и о том, что он пишет дипломную работу по теме "Модернизация процесса создания баг-репорта в процессе тестирования сайта". Собственно, вопрос от Егора звучит так:<br />
<br />
<blockquote class="tr_bq">
Вычислить среднее количество созданных баг-репортов в месяц, после
внедрения в процесс ПО - не представляется возможным, так как кол-во
созданных баг-репортов зависит от кол-ва обнаруженных багов, а последнее
полностью основывается на человеческом факторе (напомню, я тестирую
сайт <b>вручную</b>). Я могу найти баг, а могу и не найти его.<br />
<br />
Даже если я нахожу баг и создаю баг-репорт по нему, то мне:<br />
1) может потребоваться использование внедренного ПО, <br />
2) может и не потребоваться его использование <br />
Это зависит от сложности <span style="text-decoration: underline;">описания</span> бага.<br />
<br />
Из
этого всего следует, что невозможно спрогнозировать появление багов при
тестировании сайта, а следовательно невозможно спрогнозировать кол-во
создаваемых баг-репортов в период окупаемости затрат на внедрение ПО.<br />
<br />
Подскажите,
как мне быть в таком случае? От чего отталкиваться, в вычислениях срока
окупаемости затрат на внедрение ПО? И вообще возможны ли подобные
вычисления, если данный процесс основывается на человеческом факторе?</blockquote>
<br />
<a name='more'></a><br />
<br />
Но Егор еще уточнил:<br />
<br />
<blockquote class="tr_bq">
Я не прошу решать эту задачку за меня! Я прошу направить меня в верном направлении! Я прошу дать моим мозгам волшебного пинка :)</blockquote>
Волшебный пинок так волшебный пинок :)<br />
<br />
Уже не первую Летнюю Школу тестировщиков нас настойчиво учат нарушать правила, переходить границы и вообще мыслить нестандартно. И игнорировать слово "нельзя". Или "не представляется возможным" (как в вопросе Егора). Егор основывается на том, что предсказать количество дефектов в программном продукте невозможно, а поэтому... и тут - тупик. А почему, собственно, невозможно?<br />
<br />
На самом деле (и это очень радует) в тестировании тоже появляются свои теории. Которые мы можем использовать (или не использовать) на практике. В частности, на одной из конференций для тестировщиков SQA Days была представлена теория <a href="http://sqadays.com/talk.sdf/sqadays/sqa_days12/talks/7665" target="_blank">Прогнозирования процесса выявления дефектов при тестировании программного обеспечения</a>. Эта теория основана на концепции потоков дефектов и авторы ее полагают, что она в дальнейшем (после доработки) сможет вполне достойно работать. Сейчас, конечно, она еще сыровата, но ее вполне можно использовать в случае Егора. Плюс к этому автор (Дмитрий Маевский) в ходе доклада активно приглашал заинтересованных лиц связываться с ним и участвовать в доработке этой теории. Думаю, совместная работа над таким проектом тоже окажется весьма полезной.<br />
<br />
Еще очень рекомендую посмотреть выступление на более ранней SQA Days "дедушки российского тестирования" Александра Александрова - <a href="http://software-testing.ru/library/around-testing/management/716-quantitative-quality" target="_blank">Количественное управление процессом тестирования. </a>В докладе идет речь о метриках и том, что с ними делать потом. А уже на основе изучения этих метрик и их корреляции предлагается метод прогнозирования качества программного продукта (то самое возможное количество багов в передаваемой заказчику системе).<br />
<br />
Я думаю, что после просмотра этих двух выступлений, Вы обязательно найдете дорогу дальше. А если нет - мы все также принимаем письма с вопросами по адресу: sprosi.testera@gmail.com.<br />
Пишите, спрашивайте и, возможно, в следующую пятницу мы ответим уже на ваш вопрос :)<br />
<br />
Удачи!<br />
<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com14tag:blogger.com,1999:blog-8929195560170635986.post-24158637942815121852013-06-21T10:01:00.000+03:002013-06-21T10:01:33.623+03:00ТЕСТ ИТ: немного о тестировании мобильных приложений <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgcF7egMnwfuNn3-YzSxZlo9yO3xb5leOloFxhyphenhyphenvfB-KPHii5thWAEx28qI-gng75iM83uWXAWSPE5v2tix3RvexKgG5PnLUXqZJ_YhPQ3UUSo80kjH_Xjha5DS1B_SfFX_fampXF-36O/s1600/testit.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrgcF7egMnwfuNn3-YzSxZlo9yO3xb5leOloFxhyphenhyphenvfB-KPHii5thWAEx28qI-gng75iM83uWXAWSPE5v2tix3RvexKgG5PnLUXqZJ_YhPQ3UUSo80kjH_Xjha5DS1B_SfFX_fampXF-36O/s320/testit.png" width="320" /></a></div>
Всем привет!<br />
<br />
Сегодня снова пятница и с вами снова я - ваш-сменный-редактор-по-пятницам - Зинченко Татьяна. Сегодня мы поговорим о тестировании мобильных приложений. Нам на почту sprosi.testera@gmail.com вопросы о таком тестировании приходят регулярно. Мы решили их объединить. Но объединить не просто, а в виде вопросов "мобильному гуру" - Александру Хозе.<br />
<br />
Саша - автор блога "<a href="http://www.akhozya.com/" target="_blank">Записки мобильного гика"</a>, выступатор на многих конференциях, а еще ведущий <a href="http://software-testing.ru/trainings/schedule?task=3&cid=198&sem_midx=2&sem_jidx=" target="_blank">курса по тестированию мобильных приложений</a> и даже организатор онлайн-конференции по их тестированию (в рамках серии онлайн-конференций <a href="http://confetqa.ru/" target="_blank">ConfeT&QA</a>).<br />
<br />
Итак, мы пошли к Саше и задали ему несколько вопросов, а он нам на них ответил :) Что из этого получилось читайте ниже :)<br />
<br />
<br />
<a name='more'></a><b>TEST IT: Расскажи о себе. Как ты пришел в тестирование?</b><br /><br />Ручки чесались с детства - любил разобрать и поломать :) Да и в кино со мной ходить - еще то удовольствие - все удовольствие стебом над ляпами порчу. В тестирование пришел около трех лет назад после продажи компьютерного “железа” и “эникейства”. В тестирование пригласила хорошая знакомая после шуточного разговора о тестировании и моих кривых ручках. Начитался Тамре, Савина, блогов гуру тестирования - и в бой! :) Благо, начать в мобайле - легче всего по моему мнению. Тяжелее становится дальше, так как “мобильный тестировщик” должен совмещать в себе достаточно много качеств и обязанностей, например:<br /><br /> - функциональное тестирование: необходимо уметь как копать глубоко (тестирование в обычном режиме), так и “Паретить” - за 20% времени находить 80% багов :)<br /> - юзабилити и дизайн - особенно при анализе конкурентов и помощи в формировании прототипа. Благо, можно создавать даже прокликиваемые прототипы и заливать на само устройство;<br /> - базовое security + “расковыривание” приложения.<br /><br /><br /><b>TEST IT: А как ты начал заниматься тестированием мобильных приложений? С чего все началось? :)</b><br /><br />Вот как раз на первой работе и сразу окунулся в мир мобайла. Благо чувствовал себя в нем достаточно уверенно - обожаю смартфоны и часто помогал знакомым с выбором. Первая неделя - так вообще нирвана: куча классных гаджетов и интересных приложений. Приложений было много и разных: от банковских до приложений для качков; от рекламных площадок до путеводителей по Ибице; от гороскопопостроителей до систем напоминания рассеянным бизнесменам. За что люблю мобайл, так это за скорость набора знаний и опыта - год за три, не менее :) Все время работаешь в цейтноте, надо обрабатывать кучу информации и придумывать нестандартные юз-кейсы. Плюс, как известно, в стрессовой ситуации растешь быстрее.<br />
<br /><b>TEST IT: Какую литературу о тестировании мобильных приложений можно почитать новичку?” Что бы ты порекомендовал?</b><br /><br />К сожалению, именно классных книг мало - информацию приходится собирать по крупицам. На ум приходит:<br /><br /> - <a href="http://www.youtube.com/watch?v=FyliSDXX4i0" target="_blank">Tap into Testing Mobile Applications: Keynote at STARWEST 2012</a> - расставляет все по полочкам и вдохновляет :)<br /> - <a href="http://mobile.smashingmagazine.com/2012/10/22/a-guide-to-mobile-app-testing/" target="_blank">A Field Guide To Mobile App Testing</a><br /> -<a href="https://leanpub.com/testmobileapps" target="_blank"> Jonathan Kohl “Tap Into Mobile Application Testing”</a> - отличная книга. К сожалению, пока только бета - конечная версия ожидается летом. Комьюнити помогало вычитывать и дополнять ее, в том числе и Ваш скромный слуга :)<br /> - Статьи Jonathan Kohl <a href="http://www.kohl.ca/articles/ISLICEDUPFUN.pdf" target="_blank">Test Mobile Apps with I SLICED UP</a>, <a href="http://www.kohl.ca/2012/book-excerpt-the-seven-deadly-sins-of-mobile-apps/" target="_blank">The Seven Deadly Sins of Mobile Apps</a><br /> - Материалы <a href="http://www.appqualityalliance.org/resources" target="_blank">App Quality Alliance (AQuA)</a> - отличный гайд по тестированию Android-приложений. Хорошо экстраполируется и на другие платформы.<br /><br />И, конечно же, окунуться в мир Rapid Testing, Exploratory Testing и мнемоник тестирования. Вам они очень понадобятся в условиях постоянной нехватки времени!<br /><br /><br /><b>TEST IT: Тестирование мобильных приложений довольно динамично развивается. Что еще - кроме книжек - можно почитать/посмотреть тестировщику, занятому в нем?</b><br /><br />К моему удивлению на просторах СНГ информации и практических рекомендаций по тестирования мобильных приложений достаточно мало. Я и Андрей Дзыня будем рады донести светоч знаний и опыта <a href="http://software-testing.ru/trainings/schedule?&task=3&cid=198" target="_blank">в нашем тренинге</a> :)<br /><br /><a href="http://www.testinggeek.com/why-software-testing-for-mobile-applications-is-different-top-10-reasons" target="_blank">Почему мобильные приложения тестируются по другому? Топ 10 причин</a>.<br /><br />А вообще, скромность - моя лучшая черта. В <a href="http://www.akhozya.com/" target="_blank">блоге</a> стараюсь искать интересные новости по мобильной тематике: разработке, тестированию и распространению - возможно найдете что-то интересное именно Вам.<br /><br /><br /><b>TEST IT: Какие инструменты можно использовать для нагрузочного или стресс тестирования мобильных приложений?</b><br /><br />Что касается именно стресс и нагрузки самих приложений, то тут Вам в помощь “обезьянки”<br /><br /> - <a href="http://developer.android.com/tools/help/monkey.html" target="_blank">UI Excersiser monkey для Android</a>. Очень мощный инструмент с кучей настроек - особенно мне импонирует автоматическое сохранение снимка памяти для анализа утечек. Иногда бывает чересчур умным - пару раз перезагружал телефон или отключал телефон от debug-режима :)<br /> - <a href="https://www.redant.com/anteater/" target="_blank">AntEater для iOS</a>. Не такой мощный инструмент из-за того, что разработан сторонней компанией и ограничениями, которые накладывать операционная система. Тем не менее, позволяет генерировать красивые отчеты и прикреплять стек-трейсы, краш-логи и скриншоты в отчет. Версия устарела и заточена под xCode 4.2 Поэтому, <a href="https://dl.dropboxusercontent.com/u/10300197/anteater-0.6.0_modified.zip" target="_blank">я ее подправил</a> - убрал хардкод и обновил iphonesim, чтобы можно было работать с iOS6.1 включительно. Постоянно пинаю девелоперов, чтобы выложили в open-source, но пока только кормят обещаниями.<br /><br />Что касается нагрузки всего сервиса в целом - особых отличий от нагрузки веб-приложений нет. Можно даже трафик записывать. Подробнее: <a href="http://qatesting.ru/blog/articles/2013/01-05-load-testing-mobile-applications" target="_blank">здесь</a> и <a href="http://www.youtube.com/watch?v=iff35jPdeX0" target="_blank">здесь</a><br /><br /><br /><b>TEST IT: Есть ли различия в тестировании мобильных приложений на разных платформах?</b><br /><br />В принципе, подходы достаточно стандартны. Я бы не назвал это различиями, скорее - нюансами. Для Android и Blackberry - необходимо принимать во внимание фрагментацию платформ, в то время как на iOS - это не такая острая проблема. Для WinPhone - вообще песня, очень редко встречаются девайсозависимые баги, так что можно значительную часть времени тестировать в эмуляторе.<br /><br />Еще на ум приходит:<br /><br /> - тестирование именно “релизных” сборок iOS приложений, т.к. для “дебажных” сборок компилятор не выполняет таких жестких оптимизаций по скорости/объему бинарного файла<br /> - стратегию тестирования на устройствах необходимо выстраивать по разному, т.к. выбор устройств является краеугольным камнем оной.<br /><br /><br />Для формирования “картинки”:<br /><br /> - <a href="http://www.ministryoftesting.com/2012/09/android-testing-mindmap/" target="_blank"> Mind map по тестированию Android-приложений</a><br /> - <a href="http://www.ministryoftesting.com/2012/09/ios-testing-mindmap-checklist/" target="_blank">Mind map по тестированию iOS-приложени</a>й<br /> - Материалы по тестированию<a href="http://www.utest.com/landing-interior/ios-app-testing" target="_blank"> iOS</a> и <a href="http://www.utest.com/landing-interior/android-app-testing" target="_blank">Android</a> приложений от uTest<br /><br /><br /><b>TEST IT: Насколько эффективны эмуляторы мобильных устройств? Можно ли при их использовании полностью отказаться от тестирования на реальных устройствах.</b><br /><br />Эмуляторы отлично дополняют мобильные устройства:<br /><br /> - Загрузка путей GPS<br /> - Более удобная работа с памятью: симуляция memory-warning, ограничение памяти на устройство/процесс<br /> - Тестирование разметки и анимации<br /> - Шейпинг, перехват и модификация трафика намного проще и быстрее<br /><br />Но полностью заменить не в состоянии, т.к. добиться 100% эмуляции/симуляции реального устройства невозможно.<br /><br /><b>TEST IT: И напоследок - что бы ты посоветовал новичкам в этом виде тестирования?</b><br /><br />1. Не опускать руки, хотя иногда - очень хочется, особенно в конце предрелизного спурта.<br />2. Побольше организаторских способностей для выстраивания правильного процесса! Воспитывать программистов-мобильщиков еще то удовольствие :)<br />3. Делитесь навыками и информацией для популяризации направления. <br />
<br />
<br />
Саша, еще раз тебе огромное тестерское спасибо!<br />
<br />
А мы по прежнему принимаем ваши письма, истории, вопросы по адресу: sprosi.testera@gmail.com. Пишите и, возможно, именно на ваше письмо мы ответим в следующем выпуске рубрики :)<br />
<br />
Спасибо, что вы с нами,<br />
команда TEST IT<br />
<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com2tag:blogger.com,1999:blog-8929195560170635986.post-56128925736719333952013-06-19T20:08:00.000+03:002013-06-19T20:08:32.372+03:00Летняя Школа Тестировщиков - счастье есть!!<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrP1WTyiC8XHus-TB5J9p3usdhBPW3wRnqNUbRTQZ09rHPHuBGg2xymgyTFRZKMzhQm8_QVAaDHGFPcYk3k0TqICB27DFYmNtW1nwnDA5VJqA2uYZOhMkK-8K0WbUuCvKMIZ-4s7N2Km6/s1600/IMG_9332.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrP1WTyiC8XHus-TB5J9p3usdhBPW3wRnqNUbRTQZ09rHPHuBGg2xymgyTFRZKMzhQm8_QVAaDHGFPcYk3k0TqICB27DFYmNtW1nwnDA5VJqA2uYZOhMkK-8K0WbUuCvKMIZ-4s7N2Km6/s320/IMG_9332.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Фото - Екатерина Михеева</td></tr>
</tbody></table>
<div style="text-align: right;">
Прям не верится: еще год назад </div>
<div style="text-align: right;">
я тебя не знала и боялась, </div>
<div style="text-align: right;">
а сегодня чищу картошку </div>
<div style="text-align: right;">
у тебя на кухне! </div>
<div style="text-align: right;">
© И. Винокурова</div>
<br />
Я третий день пытаюсь начать этот пост. В первый день я написала название и сохранила черновик. В третий - подобрала фотографии. И только сейчас решилась на сам текст. Почему? Потому что переполняющие меня эмоции не очень хорошо облекаются в слова и ложатся на бумагу. Но я постараюсь.<br />
<br />
РЕБЯТА, ЭТО БЫЛО КРУТО!!!! (и я сейчас не капсю, я шифтю!)<br />
<br />
<br />Я ехала в новую Летнюю Школу с мыслью: "Прошлогодний фурор уже не повторить. Так здорово уже не будет. Но хоть отдохну...". Ребята, это было здорово! Я снова вернулась в родные пенаты полная оптимизма, желания творить и сделать мир лучше. Спасибо всем, кто в этом участвовал.<br />
<br />
А теперь по порядку. :)<br />
<br />
<br />
<a name='more'></a>Началось все традиционно - со знакомства. Там-то мы и узнали кто лучше всех уговаривает начальство на новые плюшки, кто знает что такое фелинология, а кто скоро женится (хотя сам еще не в курсе). <br />
<br />
Продолжилось тоже традиционно: утренними лекциями от Алексея Баранцева. Тренинг был рассчитан на "более опытных" товарищей, а в группе оказалось довольно много "новичков" с опытом работы до двух лет. Поэтому в один из дней Алексей еще и быстро прошелся по старому тренингу с практиками тест-дизайна, дабы в дальнейшем всё было понятно всем, а не только избранным. Но мы (которые уже в курсе) были не против - ибо первое: "повторение - мать учения", а второе: Алексей всегда рассказывает по-разному, вот и в этот раз мы много чего нового узнали.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8EidV-mNBpWHqxb7tzf5KE8Vk-t-2VaeKwlP68Azhp3YkYxTaaVgIV26vSKUKaW6wyTuPLLg415d2tJkydiiEwyWSF8hyZ2t59yC5j7Xz4L038NbhewH6iW4JBhC6YoZLtYIlHb4Y9oLY/s1600/IMG_9433.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8EidV-mNBpWHqxb7tzf5KE8Vk-t-2VaeKwlP68Azhp3YkYxTaaVgIV26vSKUKaW6wyTuPLLg415d2tJkydiiEwyWSF8hyZ2t59yC5j7Xz4L038NbhewH6iW4JBhC6YoZLtYIlHb4Y9oLY/s320/IMG_9433.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Фото - Екатерина Михеева</td></tr>
</tbody></table>
А вот вечерние занятия были другими.<br />
Во-первых, у нас было больше игр. Прямо-таки каждое занятие играли, каждый раз в новое, интересное и поучительное.<br />
Во-вторых, у нас было аж два круглых стола. Первый по автоматизации, второй - по менеджменту.<br />
В-третьих, у нас был день смены ведущего - одно из вечерних занятий вел участник Школы, а по совместительству Senior QA из Львова - Олег Татарчук. И занятие тоже было с играми и их анализом.<br />
<br />
Традиционно в начале каждой игры мы делились на команды. У команды должно быть название и лидер (если нужен). Наша команда называлась "Отважные осьминоги" и у нее был лидер Пауль. Паулем мог быть любой из команды - в зависимости от собственного желания и пожеланий команды. В целом звание Пауля у нас было переходное. А как мы играли!! Мы выиграли первый конкурс с почти разгромным счетом (25 наших против 15 от ближайших соперников)! За одно из заданий мы получили баллов даже больше максимально возможного количества (преодолели границу, как настоящие тестировщики).<br />
Даже в проигрыше мы остались самыми заметными и оцененными. И (нам так показалось) во время того соревнования, которое мы-таки проиграли, Алексею Баранцеву не хотелось от нас отходить - так завораживающе мы анализировали все, что видели (и пусть кто-то кинет в нас 100$, если это не так!).<br />
<br />
Конечно, не обошлось и без внеурочных развлечений :)<br />
Лично для меня самым запоминающимся внеурочным моментом стали танцы. Да-да-да, айтишники тоже умеют танцевать. Правда, делают они это все равно не как все :) Сначала мы пытались играть в "танцевальные городки". Это когда первый называет город, а второму надо танцевать так, как танцуют в этом городе. Потом второй называет город (на последнюю букву, все по правилам), а третьему надо танцевать так, как танцуют в этом городе. И так далее.<br />
Например, в Питере танцуют в книжкой в руках, а в Ниигата - с бумажными веерами, сделанными из тетрадки.<br />
Потом города закончились и пошли просто самые популярные танцы. Незабываемым стало танго от Иры и Васи, танец маленьких лебедей от Наташи Руколь, Наташи Баранцевой и Оли Киселевой, а гвоздем программы стал рок-н-ролл от самого Алексея Баранцева!<br />
Вообще, танцев было много и они были шикарны, но об этом обещала написать (и показать, ибо видео тоже есть) Наташа Руколь, а я не буду углубляться.<br />
<br />
А еще у нас было солнце, море, экскурсии, много общения и ночное небо с падающей звездой. Под которую я (а можете и вы) загадала желание: приехать сюда еще раз. Я очень надеюсь, что оно сбудется! И вы приезжайте! И, может, в следующий раз картошку на моей кухне будет чистить уже не Ира :)<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrCXPyJP2FEdB_K59D8QHbwGK1Wx29NCi7hXtvUFBw9uWc2q8J3dosDLuX6Ua33hiIeOmxZOXKaezUkmOS-5V3MFflpM5JPoHBTYIXg8AJrBuTBnt4jG-iCXFyH1bHJXd1seyh4yJkMVjK/s1600/IMG_9820.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrCXPyJP2FEdB_K59D8QHbwGK1Wx29NCi7hXtvUFBw9uWc2q8J3dosDLuX6Ua33hiIeOmxZOXKaezUkmOS-5V3MFflpM5JPoHBTYIXg8AJrBuTBnt4jG-iCXFyH1bHJXd1seyh4yJkMVjK/s400/IMG_9820.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Фото - Екатерина Михеева</td></tr>
</tbody></table>
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-62131002287485838972013-06-14T00:46:00.000+03:002013-06-14T00:46:09.971+03:00TEST IT: Про SCRUM, автоматизацию и другие страшные слова.<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4f_cnOnENpXJ-K-uG9XBBVSeODQ2GuD9UgNUSxq1q63YYCGnbT0fv5qGmnYItHDBk8FCAqo0fWqe99uCP698GguS3_p8iXdXgG8e5y8sPgLakbO4HUtc30XMmFJowugZkf9CsffD9pmRd/s1600/testit.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4f_cnOnENpXJ-K-uG9XBBVSeODQ2GuD9UgNUSxq1q63YYCGnbT0fv5qGmnYItHDBk8FCAqo0fWqe99uCP698GguS3_p8iXdXgG8e5y8sPgLakbO4HUtc30XMmFJowugZkf9CsffD9pmRd/s320/testit.png" width="320" /></a></div>
Всем привет!<br />
С вами снова я - ваш-сменный-редактор-по-пятницам - Зинченко Татьяна. А еще с нами море, солнце, песок, новые знания и новые знакомства с товарищами по компьютеру, но про это я уже хвасталась в предыдущем выпуске.<br />
<br />
Сегодня позвольте предложить вам вопрос Михаила. Даже два вопроса от Михаила. Вопроса весьма глобальных, поэтому и предложенные ответы будут соответствующими. Итак:<br />
<br />
<blockquote class="tr_bq">
1) Как начать тестировать в SCRUM-проекте?<br />
2) Как освоить автоматизацию, если я до этого вообще этим не занимался (очень начальные знания в программировании имеются)?</blockquote>
<br />
<a name='more'></a><br />
Сразу встречный вопрос: "а зачем?"<br />
Зачем Вам необходимо начинать тестирование в SCRUM? Что Вас не устраивает в той ситуации, что есть на проекте сейчас? Эта ситуация не устраивает только каких-то отдельных людей или весь коллектив в целом? Действительно ли какая-то методология поможет вам решить существующие проблемы или они гораздо глубже? <br />
Может быть, ответы на эти вопросы помогут понять с чего же необходимо начинать?<br />
<br />
Зачем осваивать автоматизацию?<br />
Будет ли это востребованный навык или просто "для галочки, потому что все так делают, а что я хуже?"? Если этот навык "для галочки", то возникает вопрос: а стоит ли результат затраченных усилий? Знания, которые не применяются, быстро теряются. А учить одно и то же по нескольку раз - непозволительная роскошь.<br />
Если же навык востребован, то следующие вопросы, которые стоит задать: что будет полезно автоматизировать?<br />
Для начала необходимо проанализировать какие части приложения реально поддаются автоматизации. Насколько часто мы их запускаем? Будет ли выгодно нам потратить время на автоматизацию? Какие риски при этом у нас возникнут?<br />
<br />
И так далее.<br />
<br />
Можно попробовать посмотреть лучший доклад последней AutoConfeT&QA - <a href="http://software-testing.ru/library/testing/general-testing/1821-2013-06-05-10-02-26" target="_blank">Можно ли перевернуть пирамиду? Автоматизируем тестирование с меньшим числом посредников.</a> Игоря Хрола.<br />
Можно пойти на курсы по автоматизации к Алексею Баранцеву (<a href="http://software-testing.ru/trainings/schedule?task=3&cid=87&sem_midx=2&sem_jidx=0" target="_blank">ближайший начинается 17 июня</a>).<br />
Можно пойти куда угодно, начать читать какие угодно книги или пытаться решить проблему "в лоб". А можно немного подумать и принять взвешенное и обоснованное решение.<br />
<br />
Если же мой ответ показался Вам неполным (а я подозреваю, что так оно и есть), то мы ждем писем с вопросами на адрес sprosi.testera@gmail.com и в следующую пятницу, возможно, в одном из блогов появится ответ именно на ваш вопрос!<br />
<br />
Удачи!<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-21958068582263288112013-06-11T23:41:00.000+03:002013-06-11T23:41:34.043+03:00Про юристов, тестировщиков и немножко про Кема Канера.<div dir="ltr" style="text-align: left;" trbidi="on">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimepD93YaeckZTYKsGw-OuF80lgiCZM7V2zxF-b_WIqfaIEKmKgR7MjdYEUUZBLalW406WZN-RB5cOtp2QYBgfTP0Y2F-E-foHR8lAkiJEVzPoWeT96qdW4Ub7L5VYIyu3Y01J48KYhG5x/s1600/IMG_8891.JPG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimepD93YaeckZTYKsGw-OuF80lgiCZM7V2zxF-b_WIqfaIEKmKgR7MjdYEUUZBLalW406WZN-RB5cOtp2QYBgfTP0Y2F-E-foHR8lAkiJEVzPoWeT96qdW4Ub7L5VYIyu3Y01J48KYhG5x/s320/IMG_8891.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Автор фото - Екатерина Михеева</td></tr>
</tbody></table>
Для тех, кто еще не в курсе: сейчас, в эти самые жаркие летние дни проходит Летняя Школа тестировщиков в Крыму. Тестировщики + тренинги + море + солнце = гремучая смесь. И много новых знаний.<br />
<br />
Буквально сегодня утром во время перерыва в тренинге Алексея Баранцева мы (несколько энтузиастов, которые даже мороженку едят неподалеку от тренера) почему-то вспомнили про Кема Канера и о том, что по образованию он - юрист. И не просто юрист, а отлицензированный и со своей собственной практикой в одном из Штатов. И более того - с кучей проведенных дел, в которых жалобы были именно на баги в каких-то системах.<br />
<br />
И как-то невзначай вспомнилось мое второе образование, которое юридическое. И, как это часто и происходит в таких случаях, был задан вопрос: а как вообще эти две специальности могут сочетаться?<br />
<br />
<br />
<a name='more'></a>Лично мне кажется, что все логично.<br />
1) В законодательстве любой страны постоянно происходят какие-то изменения. Юрист - это человек, который должен быть в курсе этих изменений, он должен постоянно развиваться и держать руку на пульсе событий. Пара лет без отслеживания текущей ситуации в мире законов и все: ты - секретарь заштатного нотариуса.<br />
В мире айти тоже постоянно происходят изменения: появляются новые инструменты, старые модернизируются или вовсе исчезают, приходят и уходят различные инженерные и прочие практики и так далее. Если пару лет проработать без учета всех этих движений, то можно называться "тестировщиком" только условно. Притом, условно только для тех, кто тоже слабо себе представляет хорошего тестировщика.<br />
Постоянное развитие - вот что объединяет эти две специальности. <br />
<br />
2) Юрист не знает всех законов наизусть. Знать все назубок - утопия, их слишком много и они слишком большие. Но! Юрист знает где искать! А хороший юрист еще и знает в какой книжке это искать.<br />
Тестировщик не знает наизусть всех приемов и методов, но он знает про их существование, либо знает где искать, либо знает кого спросить! А хороший тестировщик еще и сам делится знаниями с окружающими.<br />
Стремление познать новое - вот что объединяет эти профессии.<br />
<br />
3) Поиск обходных путей (будем честны - дыр в существующем законодательстве) - неотъемлемая часть работы любого практикующего юриста (адвоката).<br />
Поиск дыр в любом существующем приложении - основная часть работы почти каждого известного мне тестировщика.<br />
Поиск того, что "все не так хорошо" - вот что объединяет эти профессии.<br />
<br />
Еще можно говорить много, но, наверное, главное, что объединяет эти две профессии - склад ума людей, которые ею овладевают.<br />
<br />
Тема "Чем похожи тестировщик и....." достаточно популярна в последнее время и периодически всплывает в качестве докладов на различных конференциях. Я свое мнение высказала, а как вы думаете - с какой профессией у тестировщика больше всего сходных черт? ;)<br />
<br />
Ну и напоследок еще одна картинка с Летней школы (не тренингами едиными жив тестировщик):<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiiqmEKaJvu8GULX_f8hZI5YsfSZoInSuCdZXJbGEq3t8cy2Q2sJe1N3GKKxZT91yjYIBtIKIQecfEkKn7lFpYQjf7k_NkcEFj2dz2snojn_ORI8Ll1JHHROpVHPgeb2XPeTFVhojbihhU/s1600/IMG_8850.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiiqmEKaJvu8GULX_f8hZI5YsfSZoInSuCdZXJbGEq3t8cy2Q2sJe1N3GKKxZT91yjYIBtIKIQecfEkKn7lFpYQjf7k_NkcEFj2dz2snojn_ORI8Ll1JHHROpVHPgeb2XPeTFVhojbihhU/s320/IMG_8850.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Автор фото - Екатерина Михеева</td></tr>
</tbody></table>
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-59078226111003657822013-06-10T00:35:00.001+03:002013-06-10T00:35:59.684+03:00ТЕСТ ИТ: И снова про майндкарты :)<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnLQanWOxllD5aWZ4TYHBNiih9hrcLVzdONYbHo2xM3d3g6AJWaq7vZdxqWRaCRLmxzpdv53pnA9N3Op3wStQe_yzwkrX0aqcd7N7K2TrVYn84MWDnCA_CX84m28sJUUijZXv_jtlXEeJf/s1600/testit.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnLQanWOxllD5aWZ4TYHBNiih9hrcLVzdONYbHo2xM3d3g6AJWaq7vZdxqWRaCRLmxzpdv53pnA9N3Op3wStQe_yzwkrX0aqcd7N7K2TrVYn84MWDnCA_CX84m28sJUUijZXv_jtlXEeJf/s320/testit.png" width="320" /></a></div>
И снова здравствуйте, и снова с вами я - ваш сменный-редактор-по-пятницам Зинченко Татьяна. Команда ТЕСТ ИТ полным составом расположилась на гостеприимном крымском берегу в компании понаехавших в Летнюю Школу тестировщиков. Что, наверное, слегка извиняет нас за пятничный выпуск в понедельник :)<br />
<br />
А сегодня мне хотелось бы в очередной раз затронуть тему интеллектуальных карт. И поводом к такому затрагиванию послужило письмо Сергея и его вопрос:<br />
<br />
<blockquote class="tr_bq">
Насколько понял Вы практикуете использование mind-map.
<br />Хотелось бы узнать о них побольше.
<br />Способы написания, практика (примеры если можно - хотя бы простейшие).
<br />А то, что-то из того, что нахожу не могу собрать всё в "кучку".
</blockquote>
<br />
<a name='more'></a><br />
Интеллект картами я заинтересовалась достаточно давно. Для меня это стало лучшим выходом в ситуации, когда документации на проекте минимум, времени не очень много, а описать ЧТО и КАК и показать результаты проведенного тестирования - нужно.<br />
<br />
Достаточно подробно (настолько, насколько это возможно сделать за 20 минут) о майнд картах я рассказывала на осенней конференции ConfeT&QA. <a href="http://software-testing.ru/library/testing/general-testing/1809-mind-map-" target="_blank">Видео можно посмотреть тут </a><br />
Там же есть пример написания карты и описание программки, которой пользуюсь лично я для таких целей.<br />
<br />
Если смотреть лень, но узнать "о чем" хочется, привожу краткое описание доклада:<br />
- майнд-карты можно рисовать как от руки, так и при помощи специальных программ.<br />
- карты могут быть нарисованы на что угодно, даже на поход в магазин за продуктами.<br />
- для рисования карт существует небольшой свод правил (как вернее всего их оформить).<br />
- карты - это круто! :)<br />
<br />
В целом я думаю, что на все приведенные Сергеем вопросы я дала ответы в докладе. Но если есть какие-то еще вопросы (может, в ходе просмотра возникли какие-то еще, более узкие и углубленные) - обязательно задавайте!<br />
<br />
И я напоминаю, что связаться с нами и задать нам вопрос по-прежнему можно по адресу: sprosi.testera@gmail.com, а я на сегодня с вами прощаюсь и напоследок - немного ночного крымского неба (автор фотографии - бессменный член-корреспондент Летней Школы Тестировщиков Екатерина Михеева). Дружно ищем Млечный путь!!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUFQUSBBCMl1jVoCVhQGZwW03KhPWfBmJfCPbUcU73TEubBLF2hhiC5cbkIXdDEtc54z2bpGic2ND23vpQcKAeStz610xM0FUxpL_mKStn82STNiZ2cxlTkNyYjTV5p4SnXHp0aBwM0GzV/s1600/RPN6DMy02MY.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUFQUSBBCMl1jVoCVhQGZwW03KhPWfBmJfCPbUcU73TEubBLF2hhiC5cbkIXdDEtc54z2bpGic2ND23vpQcKAeStz610xM0FUxpL_mKStn82STNiZ2cxlTkNyYjTV5p4SnXHp0aBwM0GzV/s400/RPN6DMy02MY.jpg" width="400" /></a></div>
<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-36634401382315851722013-04-25T18:26:00.000+03:002013-04-25T18:26:19.638+03:00ConfeT&QA завершилась, да здравствует ConfeT&QA!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9U6MCDt8c5QAwowzRo5_YVIFCgziQh1ZUmAN62KaafD7MnNuwg3vc_4D__vCjr1Ulzn4tmeyLhmEbKgtiSWIedJtTFejydlGuUgkmIUpi_o_6NKnqRipcLTTcSGR4Wos3Xbw9nHnoCVdr/s1600/7323c_Sweet-Shop-Lollipop-Bouquet.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9U6MCDt8c5QAwowzRo5_YVIFCgziQh1ZUmAN62KaafD7MnNuwg3vc_4D__vCjr1Ulzn4tmeyLhmEbKgtiSWIedJtTFejydlGuUgkmIUpi_o_6NKnqRipcLTTcSGR4Wos3Xbw9nHnoCVdr/s320/7323c_Sweet-Shop-Lollipop-Bouquet.jpg" width="261" /></a></div>
<div style="text-align: left;">
Прошло уже немало времени с момента проведения <a href="http://confetqa.ru/program-fun/" target="_blank">FUN ConfeT&QA</a>, страсти улеглись, призы участникам и докладчикам розданы, а я хочу вспомнить как это было.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
И, по традиции, расскажу про "закулисье" :)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Открывал конференцию <b>Алексей Петров</b> с докладом про "<b>Квартальные цели - инструмент для мотивации личного роста</b>". Кстати, именно Алексей полюбился слушателям больше всего и завоевал почетный первый приз :) А я, как обещала, про "закулисье". :) Репетиции с Алексеем - это всегда повод узнать что-то новое помимо самого доклада. И этот раз не стал исключением. Еще не зная, что он уже в "репетиционном эфире" Алексей рассказывал очень занимательную историю о том, как он написал песню. Мотивировало невероятно, даже с учетом того, что рассказано было не мне.</div>
<div style="text-align: left;">
</div>
<a name='more'></a>Второй выступала <b>Елизавета Батурина</b> с докладом про "<b>Использование кейсов при тестировании</b>". Еще на этапе утверждения доклада я предполагала, что он вызовет много вопросов и обсуждений, и каждая репетиция это только подтверждала. В мире, где тестирование методом свободного поиска стало мейнстримом, говорить о том, что при помощи кейсов "легче проверять систему, легче согласовывать с заказчиком и вообще многие компании переходят на кейсовую модель" - как минимум храбро :)<br />
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Завершила первый конфетко-день <b>Ирина Винокурова</b> с рассказом про "<b>Свободное плаванье тестировщика</b>". Доклад вызвал самые оживленные споры и принес Ирине почетное третье место. А на репетициях мы обсуждали все подряд: какая погода, как морько, а-покажи-еще-фотографий... Конечно, я знаю, что работать айтишнику можно откуда угодно - был бы интернет. И что у нас до моря - 30 минут езды. Но вот сорваться с места и так просто уехать, как уехала Ира, мне все же тяжело.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Второй конфетко-день начался с сюрпризов (а как без них) и обещанный "джентельменский день" не сбылся. Но все равно было весело!</div>
<div style="text-align: left;">
Началось все с доклада <b>Алексея Баранцева</b> "<b>Firefox и его плагины</b>". Сразу признаюсь - с Алексеем не репетировали, поэтому про закулисье рассказать почти ничего не могу. Кроме одного: именно Алексей был "диджеем" весенней конфетки и не только подбирал всю музыку сам, но сам же и транслировал. Вот такая распределенная работа - музыка на стороне Алексея, картинка - на моей стороне.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Продолжил день <b>Александр Булкин </b>с докладом "<b>Системы отслеживания ошибок - почему. зачем и как?</b>" С Сашей мы репетировали часто и подолгу: доклад изначально получился большой и мы все пытались сократить его до приемлемых размеров без потери в качестве. Ну и, конечно, во время репетиций я не удержалась и назадавала Саше вопросов по БТС, которую используем мы. Получила качественную консультацию минуя гугл и несколькочасовой серч :)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Завершила второй день <b>Анна Карпенко</b> с докладом "<b>Ручное тестирование мобильных приложений с нуля</b>". Кстати, Аня заняла почетное второе место среди докладчиков. И это при том, что Аня выступала на большой публике впервые, и мало того - ей пришлось заменять не вовремя сошедшего с дистанции Сергея Атрощенкова. Двойной стресс и какой результат!! Все, кто боялся и стеснялся выступать - берите пример с Ани :) А мне все вспоминается первая репетиция: я слушаю-слушаю, пытаюсь понять о чем говорит Аня, а вокруг все какой-то шум. И я уже выключила все побочные телевизоры и даже мужу сказала не хрустеть, а шум все продолжается и продолжается. Тогда я перебиваю Аню (намереваясь перенести репетицию на попозже, ибо качество звука ниже минимального), а она мне говорит: "Это я просто волнуюсь и ноутбук тереблю"... И этот человек в итоге оказался в тройке победителей!!!</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Открывала третий день конференции <b>Екатерина Несмелова</b> с докладом "<b>Раскрываем секреты систем управления тестами на примере Test Link</b>". Признаюсь честно - этот доклад я ждала очень-очень (и не одна я - мне даже поступали вопросы типа: "а можно оплатить и посетить только этот доклад?"), потому что мы и сами используем Тест Линк. И той информации, что есть в официальной документации, нам явно недостаточно. Но я не сдержалась и задавала интересующие меня вопросы прямо на репетициях. А потом, уже на самой конференции, увидела, что я не одна такая, и что очень многие вопросы Кате повторяют те самые мои вопросы на репетициях.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Вторым в третий день стал <b>Сергей Атрощенков</b> с темой про "<b>Коммуникационные аспекты работы тестировщиков</b>". С Сергеем мы тоже не репетировали, поэтому его доклад стал сюрпризом и для меня тоже. Соционикой я увлекалась когда-то давно, много воды утекло с тх пор, но вспомнить было приятно. А еще посмотреть на то, какому же ТИМу быть тестировщиком :) </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Завершающий доклад читала ваша покорная слуга и назывался он "<b>SQL-профайлеры: что это и с чем его едят</b>". Признаюсь честно: с собой я репетировала только один раз и ничего в этой репетиции интересного не было, кроме того, что происходило это действо на кухне, когда вся семья, все соседи и морские свинки уже спали. Хотя, морские свинки вполне могли в это время есть - они такие. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
А теперь - итоги :)</div>
<div style="text-align: left;">
Эта конференция уже третья и с каждым разом она проходит все интереснее и активнее. В этот раз было намного больше неформального общения во время докладов, в десятки раз больше вопросов докладчикам и обсуждений на форуме - почти каждая тема доклада стала "горячей".</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
А нас ждет <a href="http://confetqa.ru/program-chief/" target="_blank">новая конференция</a>, на этот раз посвященная управлению командой. И я там тоже буду. Приходите, обсудим всё вместе :)</div>
<div style="text-align: left;">
<br /></div>
</div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com0tag:blogger.com,1999:blog-8929195560170635986.post-74910570142381011492013-03-29T12:11:00.000+02:002013-03-29T12:11:15.554+02:00TEST IT: SQL - с чего начинать?<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIvzEPp6NzZzalWCR9U-dR9JnFJadnQJ7NxgO7X0Rom5xPlQzIEhyphenhyphenXGhQDHp0ZU-U8oN2XWwECtw9y4hyzht8hNJkyxfFuYdhja8nvkZpCDLRLaHQPk3ApBywWuxFFI9ShCPcxk1y2TSUw/s1600/testit.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="151" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIvzEPp6NzZzalWCR9U-dR9JnFJadnQJ7NxgO7X0Rom5xPlQzIEhyphenhyphenXGhQDHp0ZU-U8oN2XWwECtw9y4hyzht8hNJkyxfFuYdhja8nvkZpCDLRLaHQPk3ApBywWuxFFI9ShCPcxk1y2TSUw/s320/testit.png" width="320" /></a></div>
Доброй пятницы!<br />
С вами снова TEST IT и ваш любимый сменный-редактор-по-пятницам Татьяна Зинченко.<br />
<br />
Сегодня мы поговорим об SQL. Тем более, есть повод: письмо Алексея. Алексей пишет:<br />
<br />
<blockquote class="tr_bq">
"Я только начинаю учить SQL. С чего бы Вы мне посоветовали начать? Какая литература бы мне помогла?"</blockquote>
Об SQL я могу говорить часами. А если учесть мой курс <a href="http://software-testing.ru/trainings/schedule?&task=3&cid=96" target="_blank">SQL для тестировщиков</a>, то становится понятно, что и вовсе месяцами :) Но раз нужно уложиться в формат одного ответа - я попробую.<br />
<br />
Итак.<br />
<br />
<a name='more'></a><b>С чего начинается SQL?</b><br />
С того, что мы узнаем разницу между Базой Данных (БД) и Системой Управления Базами Данных (СУБД). А еще узнаём, что SQL - это такой язык, который помогает нам взаимодействовать с БД посредством СУБД или какого-нибудь графического интерфейса (например, консоли).<br />
<br />
После этого мы идем в стандарты и там узнаем, что есть такой ANSI (American National Standards Institute), который занимался стандартизацией языка SQL почти с самых первых годов его развития. Там же узнаем, что есть стандарты языка SQL. Из <a href="http://en.wikipedia.org/wiki/SQL" target="_blank">Википедии</a> узнаем, что стандартов было много, самый первый - 1986 года, а последний совсем свежий - 2011 года. Но самым значимым (в плане добавлений новых фич) считается версия 1999 года (SQL-3).<br />
<br />
<b>А потом?</b><br />
А потом мы узнаем, что в мире есть <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85" target="_blank">много разных СУБД</a>, как платных, так и бесплатных. И вот тут начинается самое интересное. Дело в том, что язык, который используется в одной конкретной СУБД может отличаться от другой конкретной СУБД. Например, в СУБД MS SQL Server (от небезызвестной Microsoft) используется язык Transact-SQL (или T-SQL), в СУБД Oracle используется тоже свой тип SQL.<br />
<br />
И вот здесь начинается самое интересное. "С чего начать" зависит от того, какой тип СУБД используется у вас на конкретном проекте. Конечно, если Вы освоите какую-то СУБД хорошо - для вас не будет проблемой перейти на другую. Ну, немножко почитать про разницу в запросах и особенности - и все. Много времени это не займет. Но вот изучать самую первую СУБД в отрыве от реального проекта я бы все же не советовала.<br />
<br />
Обычно первое, что требуется от тестировщика, впервые допущенного к БД, - просто посмотреть записи в ней вручную. Т.е. найти самостоятельно таблицу, а в ней - столбец/строку, в которую должны были добавиться данные. Особых умений для этого не требуется - достаточно ознакомиться с интерфейсом конкретной СУБД и выспросить у программистов какие названия столбцов в базе соответствуют каким названиям полей на пользовательском интерфейсе.<br />
<br />
Потом тестировщику позволяют сделать его первый SELECT. При этом благоразумные админы делают пару бэкапов. Так, на всякий случай.<br />
<br />
И только в том случае, если все прошло хорошо, вам позволят перейти к UPDATE или даже DELETE, а то и вовсе DROP. А, может, и индексы допустят поменять - кто знает?<br />
<br />
<b>Если нет, но очень хочется</b>.<br />
Если СУБД на проекте нет, и проекта нет, а SQL изучить хочется "чтобы было", то рекомендую начать с изучения не просто языка, а в связке с чем-то. Самой простой в освоении и наиболее приближенной к ANSI SQL является MySQL. В сети можно найти <a href="http://www.helloworld.ru/texts/comp/db/mysql/mysql2/mysql.htm" target="_blank">множество книг</a> и курсов по ней, но и сам мануал к ней достаточно понятный и обширный. <b>Единственный недостаток</b> - всё это рассчитано либо на программистов, либо на системных администраторов. Почему-то про тестировщиков в контексте СУБД почти никто не думает.. :) Поэтому всю полученную информацию нужно будет отфильтровывать через призму нашей профессии.<br />
<br />
На этом остановлюсь, хотя душа требует полета и еще 20-30 страниц текста.<br />
Если остались вопросы - обязательно пишите! Наш адрес все еще: sprosi.testera@gmail.com, публикация ответов все еще по пятницам! :)<br />
<br />
Удачи в освоении и приятных выходных! :)<br />
<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com9tag:blogger.com,1999:blog-8929195560170635986.post-80639480412243710452013-03-27T12:46:00.000+02:002013-03-27T12:46:46.980+02:007 вещей, которые нужно знать о SQL Server.<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikwdb2DPkSqQEWG_6aCOwQ8vBqQlPg2K1ErAg4SseSKozHQzxNVgwYd5ElVzggPbPbBl6M6rY2bcRN6PS6vK86SoX4SSFURbSOluj97_9LmD6uQgoaU28Ot7AWSIoALH7wqtZ_f1Nf6W1V/s1600/SQL_c.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikwdb2DPkSqQEWG_6aCOwQ8vBqQlPg2K1ErAg4SseSKozHQzxNVgwYd5ElVzggPbPbBl6M6rY2bcRN6PS6vK86SoX4SSFURbSOluj97_9LmD6uQgoaU28Ot7AWSIoALH7wqtZ_f1Nf6W1V/s1600/SQL_c.png" /></a></div>
Вообще исходная статья называется "<a href="http://www.brentozar.com/archive/2013/02/7-things-developers-should-know-about-sql-server/" target="_blank">7 things Developers Should Know About SQL Server</a>", но я считаю, что изложенные в ней вещи полезно знать и тестировщикам. Поэтому и предлагаю вам ее перевод :) А у кого хорошо с английским - добро пожаловать в исходник, там еще и комментарии интересные.<br />
<br />
Итак...<br />
<br />
Привет. Я - бывший разработчик, который перешел в администраторы баз данных, и здесь я перечислю те вещи, о которых мне самому хотелось бы услышать от кого-то в начале моей карьеры.<br />
<br />
<a name='more'></a><br /><br />
<b>7.</b> <b>SQL функции редко выполняются хорошо</b>.<br />
<br />
Хорошие разработчики любят использовать код несколько раз, помещая его в функции и потом вызывая эти функции из разных мест. Это очень хорошая практика на уровне приложений, но на уровне базы данных у нее огромные недостатки в производительности.<br />
<br />
Посмотрите на прекрасный пост Пола Уайта "Forcing a Parallel Query Plan" - в частности, на примеры инструкций, по которым sql оптимизатор строит последовательный план, вместо параллельного. Большинство функций будут выполняться в однопоточном режиме. Грустное зрелище.<br />
<br />
Если вы действительно хотите не единожды использовать код, присмотритесь к хранимым процедурам и представлениям (view). (Честно говоря, у них есть свои недостатки в работе, но я всего лишь пытаюсь помочь вам ступить на правильный путь так быстро, насколько это возможно, а функции - это неправильный путь.)<br />
<br />
<b>6. "WITH (NOLOCK)" на самом деле не означает, что блокировки нет</b>.<br />
<br />
На каком-то этапе своей карьеры вы начинаете использовать WITH (NOLOCK) где попало, потому что это позволяет получить результаты запроса быстрее. Это не обязательно плохая идея, но это может привести к неожиданным побочным эффектам, описанных Кендрой в ее видео "There's Something About Nolock". Я собираюсь разобрать тут один из них.<br />
<br />
Когда вы запрашиваете таблицу - даже с WITH (NOLOCK) - вы стабильно блокируете схему. Больше никто не может изменить эту таблицу или индексы до тех пор, пока не закончится ваш запрос. Это не большая проблема до тех пор, пока вам не понадобится удалить индекс, а вы этого сделать не можете, т.к. люди постоянно запрашивают таблицу, но при этом думают, что все в порядке, ведь они используют WITH(NOLOCK).<br />
<br />
Здесь нет серебряной пули, но я прочитал об уровнях изоляции SQL сервера и теперь, бьюсь об заклад, READ COMMITED SNAPSHOT ISOLATION - лучший выбор для вашего приложения. Он дает вам достаточное количество информации при минимальных конфликтах блокировки.<br />
<br />
<b>5. Используйте 3 дескриптора соединения в вашем приложении</b>.<br />
<br />
Я знаю, сейчас у вас только один SQL Server, но поверьте мне, это стоит того. Установите три дескриптора соединения так, чтобы все они вели на один и тот же сервер, но в будущем, когда вам понадобится масштабирование, вы сможете настроить несколько серверов для решения различных задач:<br />
<br />
- соединение для записи и чтения в реальном времени - этот дескриптор вы используете сейчас и все "горячие" данные должны приходить отсюда. Вы можете держать весь свой код неизменным, но когда вы пишите новый код или рефакторите имеющийся, подумайте, как изменить запрос с учетом новых соединений.<br />
- Соединение для данных за последние 5-15 минут - для данных, которые слегка неактуальны, но все равно должны быть свежими.<br />
- Соединение для вчерашних данных - для отчетов менеджеров и отслеживания тенденций. Если вы запускаете онлайн магазин, вы можете получать отсюда информацию, например, и отвечать пользователям, что их данные будут обработаны в течение суток.<br />
<br />
Первый дескриптор соединения самый непростой для масштабирования; в SQL Server не очень много методов для горизонтального масштабирования нескольких серверов, которые обрабатывают записи (и все они вызывают головную боль при установке и поддержке). Два следующих дескриптора соединения гораздо, гораздо более простые и легкие в масштабировании. Для того, чтобы узнать больше об этой технике, прочтите мои 3 Favorite Connection String Tips.<br />
<br />
<b>4. Используйте staging/apptempdb базу данных</b>.<br />
<br />
Возможно, ваше приложение использует базу данных для какой-то работы - обработки, сортировки, загрузки, кеширования и пр. Конечно, если эти данные пропадут - это не разобьет ваше сердце, но вы, вероятно, хотите сохранять саму структуру таблиц. Сейчас вы ведете всю разработку в основной базе вашего приложения.<br />
<br />
Создайте отдельную базу данных - назовите ее MyAppTemp - и ведите там свою разработку. Поместите эту базу данных в обычный режим восстановления, и просто ежедневно делайте бекап. И не беспокойтесь о высокой производительности или аварийном восстановлении данных в этой базе.<br />
<br />
Этот метод выполняет действительно много классных масштабируемых вещей. Он минимизирует изменения в главную базу данных, что означает, что вы получаете резервные копии журналов и дифференциальные резервные копии для них быстрее. Если вы загружаете данные в базу для возможного аварийного восстановления сайта, вы получите их быстрее, т.к. не будет тратится время на ненужную работу. Вы даже можете использовать разные хранилища для этих баз данных - например, недорогой локальный SSD для MyAppTemp, оставляя основной сервер для использования только в продуктиве.<br />
<br />
<b>3. Вчерашние статьи и книги зачастую неверны сегодня</b>.<br />
<br />
SQL Server существует уже больше 10 лет и за это время многое изменилось. Но старый материал не обновляется, и не стремится соответствовать тому, что происходит сегодня. Даже сегодняшние статьи из авторитетных источников часто неверны - взять хотя бы критику инструкции Microsoft Performance Tuning SQL Server. Дипломированный специалист Microsoft Джонатан Кухайа дал множество действительно плохих советов, которые были основаны на документации Microsoft.<br />
<br />
Когда вы читаете что-то, что звучит как действительно хороший совет, попробуйте Anti-Doctor-Phil стратегию. Доктор Фил говорит, что вы должны полюбить какую-то идею в течение 15 минут. Вместо этого попробуйте возненавидеть ее - попытайтесь доказать ошибочность того, что вы читаете, до того, как пустить это в продакшен. Даже если совет действительно хороший, он может не подойти конкретно для вашей среды (и, да, воспользуйтесь этой стратегией и по отношению к моему совету).<br />
<br />
<br />
<b>2. Избегайте ORDER BY; вместо этого сортируйте в самом приложении</b>.<br />
<br />
Чтобы отсортировать результат вашего запроса, SQL Server нагружает CPU. Стоимость SQL Server Enterprise Edition приближается к $7000 за ядро; не весь процессор, а именно ядро. Двух процессорный (в каждом по 6 ядер) сервер уже доходит до примерно $84 K - и это только стоимость лицензий, а не железа. Вы можете купить чертову кучу серверов приложений (даже с 256GB памяти или даже больше) по $84К. <br />
<br />
Отдайте результаты запроса как можно быстрее в память и пусть приложение их сортирует. Ваше приложение уже умеет распределять нагрузку на процессор, а вот ваш сервер базы данных - нет...<br />
<br />
(Тут пользователи MySQL и PostgreSQL начинают пищать о том, как можно тратить столько на лицензии, если есть open source базы данных.)<br />
<br />
<b>1. SQL Server имеет встроенный zero-impact инструмент.</b><br />
<br />
Представления динамического управления (DMVs) SQL Server'а могут рассказать вам о таких киллер фичах, как:<br />
- какое SQL выражение вызывает самые большие нагрузки на сервер;<br />
- какие индексы занимают пространство и замедляют вставку/обновление/удаление;<br />
- как быстро хранилище отвечает на запросы на уровне база данных - база данных (и даже более мелком, чем этот);<br />
- где узкие места у вашего сервера (например, процессор, диск, сеть, блокировки и пр.)<br />
<br />
<br />
<i>Прим. переводчика</i>: если Вы заметили в тексте какую-то ошибку или опечатку, пожалуйста, выделите ее и нажмите [Alt]+[F4].<br />
<br /></div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com2tag:blogger.com,1999:blog-8929195560170635986.post-45793750635028000062013-03-25T13:00:00.000+02:002013-03-25T13:00:04.189+02:00Читалка для тестировщика<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK0eg-Av9oWzL48_M4t0kmWskVwd_nige0OQp1E5sA_nIDJlnTHOzTLivshSwZGyRNHxQbixrqwfYYO1_v__lFhzFfv884a41URdPbsZurUowf9HxnYYzSWF8Q9QKB8zfhKX1cupMQMY4z/s1600/izba_logo_1_1.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK0eg-Av9oWzL48_M4t0kmWskVwd_nige0OQp1E5sA_nIDJlnTHOzTLivshSwZGyRNHxQbixrqwfYYO1_v__lFhzFfv884a41URdPbsZurUowf9HxnYYzSWF8Q9QKB8zfhKX1cupMQMY4z/s320/izba_logo_1_1.gif" width="224" /></a></div>
Очередная книга в копилку тестировщика: когда хочется отвлечься от работы, но все же что-то интересное почитать. Еще летом одной из рекомендованных мне книг была "Черный Лебедь" Нассим Талеба, а вот руки дошли почитать только сейчас. И, скажу вам, я не пожалела.<br />
<br />
<blockquote class="tr_bq">
"До открытия Австралии жители Старого Света были убеждены, что все лебеди - белые. Их непоколебимая уверенность вполне подтверждалась опытом... Эта история показывает в каких жестких границах наблюдений или опыта происходит наше обучение и как относительны наши познания"</blockquote>
Конечно, напрямую применить опыт автора к тестированию сложно - все-таки мы обычно действуем (и тестируем) именно в рамках стандартного, обычного, привычного нам и пользователю. Автор же предлагает направить свои усилия в сторону поиска "Черных Лебедей" - нестандартных ситуаций, которые невозможно предсказать.<br />
<br />
<blockquote class="tr_bq">
"Экспериментируйте по максимуму, стараясь поймать как можно больше Черных лебедей"</blockquote>
Но книга очень замечательная. Заставляет думать, шевелить извилинками и мечтать о том, что вот выделят мне времени на тестирование побольше, а я сразу как начну искать Черных лебедей (тем более, что пользователи иногда-таки их находят).<br />
<br />
А еще мне прямо вот очень понравился такой абзац:<br />
<blockquote class="tr_bq">
"Писатель Умберто Эко - один из тех немногих ученых, которых можно назвать широко образованными, проницательными и при этом нескучными. У него огромная личная библиотека (в ней тридцать тысяч книг), и, по его словам, приходящие к нему гости делятся на две категории - на тех, кто восклицает: "Ух ты! Синьор профессоре дотторе Эко, ну и книжищ у вас! И много ли из них вы прочитали?", и на тех (исключительно редких), кто понимает, что личная библиотека - не довесок к имиджу, а рабочий инструмент. Прочитанные книги куда менее важны, чем непрочитанные. Библиотека должна содержать столько <i>неведомого</i>, сколько позволяют вам в нее вместить ваши финансы, ипотечные кредиты и нынешняя ситуация на рынке недвижимости. С годами ваши знания и ваша библиотека будут расти, и уплотняющиеся ряды непрочитанных книг начнут смотреть на вас угрожающе. В действительности, чем шире ваш кругозор, тем больше у вас появляется полок с непрочитанными книгами. Назовем это собрание непрочитанных книг <i>антибиблиотекой</i>". </blockquote>
<br />
Планшет ломится от непрочитанных книг. У меня мегаширокий кругозор!!!! :)<br />
Чего и вам желаю.<br />
<br />
Приятного чтения :)<br />
<br />
</div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com7tag:blogger.com,1999:blog-8929195560170635986.post-39216255728597940302013-03-18T21:20:00.000+02:002013-03-18T21:20:43.321+02:00Выпускной: и снова здравствуйте! <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAt-jVxFn8HEaRM9m9avJiSsA7WNeXVi7cLACiVPFNOrWEa_1eJbteCEzWr6ruSdqgzNBthildLnRFIJawrFgcWqDVY2gO0r9kHT0h9dV-nO4z933eGoVVVmIjbtsW60_hoLM-nCC-PWnN/s1600/120131801-1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAt-jVxFn8HEaRM9m9avJiSsA7WNeXVi7cLACiVPFNOrWEa_1eJbteCEzWr6ruSdqgzNBthildLnRFIJawrFgcWqDVY2gO0r9kHT0h9dV-nO4z933eGoVVVmIjbtsW60_hoLM-nCC-PWnN/s1600/120131801-1.jpg" /></a></div>
Даже не верится, но очередной <a href="http://software-testing.ru/trainings/catalogue/online/224-2011-11-24-12-19-33" target="_blank"> Курс практического тестирования для начинающих</a> подходит к концу. И мы, по уже устоявшейся традиции, <a href="http://okiseleva.blogspot.com/2012/03/blog-post.html" target="_blank">вновь</a> собираем друзей на свой онлайн-выпускной.<br />
<br />
Самое большое количество вопросов, которые поступают от начинающих тестировщиков на форумах, в чатах, в личных сообщениях, о том, как развиваться. Какие пути для развития есть, что лучше изучать, да и вообще - куда податься начинающему тестировщику. На нашем выпускном мы постараемся еще раз ответить ребятам на эти вопросы.<br /><br />Итак, наша программа: <br />
<b>19:00 - 19:30</b>. Ирина Винокурова. <b>Как начинать тестирование?</b> Что такое ТЗ и что с ним делать? Как писать тест-план? Когда пытаться что-то понять самостоятельно, а когда уже можно начинать мучать программистов? Об этом и кое-чем еще Ира расскажет в своем докладе.<br />
<b>19:35 - 20:05</b>. Андрей Кузьмичев. <b>Пути развития тестировщика: плюсы и минусы</b>. Андрей расскажет что нужно делать, чтобы стать хорошим тестировщиком. Или автоматизатором. Или менеджером. Какие подводные камни могут попасться на пути и о чем не стоит забывать.<br />
<b>20:10 - 20:40</b>. Зинченко Татьяна. <b>Успешное собеседование: миф или реальность?</b> Чего ждать на первом собеседовании? Или на втором.. На третьем... Я расскажу о том, что поможет произвести положительное впечатление, а также о том, чего делать не стоит никогда.<br />
<br />
Выпускной состоится <b>5 апреля 2013 г</b>.<br />
<br />
Ссылка для привычно бесплатной регистрации <a href="https://www1.gotomeeting.com/register/695570688" target="_blank">тут</a>. <br />
<br />
Количество мест традиционно ограничено!<br />
<br />
Ждем всех у нас на выпускном :) </div>
Tatiana Zinchenkohttp://www.blogger.com/profile/13911601798234286063noreply@blogger.com3