<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9125298294002867549</id><updated>2012-01-26T13:24:39.372-08:00</updated><title type='text'>нет времени думать - нужно писать код!</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://no-time-to-think.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://no-time-to-think.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>nirro</name><uri>http://www.blogger.com/profile/07565048943953703171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9125298294002867549.post-4507982438599064173</id><published>2011-04-11T11:27:00.000-07:00</published><updated>2011-04-11T12:30:20.780-07:00</updated><title type='text'>Что общего между футболистом и разработчиком ПО?</title><content type='html'>Есть те, кто все время играет за одну команду.&lt;br /&gt;Есть те, кто все время ищет более амбициозный клуб.&lt;br /&gt;Есть те, кто не знает вкуса победы.&lt;br /&gt;Есть те, кто привык бороться за выживание.&lt;br /&gt;Есть те, кого выгоняют.&lt;br /&gt;Есть те, кого переманивают.&lt;br /&gt;Таланта одного недостаточно для победы всей команды.&lt;br /&gt;Есть те, кто играет в футбол.&lt;br /&gt;Есть те, кто пишет код :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://stateyki.net/uploads/posts/2011-03/1299255688_soccer-ball.jpg"&gt;&lt;img style="display:block; margin:0px 0зч 10px; text-align:center;cursor:pointer; cursor:hand;width: 80px; height: 80px;" src="http://stateyki.net/uploads/posts/2011-03/1299255688_soccer-ball.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125298294002867549-4507982438599064173?l=no-time-to-think.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://no-time-to-think.blogspot.com/feeds/4507982438599064173/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://no-time-to-think.blogspot.com/2011/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/4507982438599064173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/4507982438599064173'/><link rel='alternate' type='text/html' href='http://no-time-to-think.blogspot.com/2011/04/blog-post.html' title='Что общего между футболистом и разработчиком ПО?'/><author><name>nirro</name><uri>http://www.blogger.com/profile/07565048943953703171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125298294002867549.post-4937597163623808263</id><published>2010-11-22T12:32:00.000-08:00</published><updated>2010-11-22T12:40:52.703-08:00</updated><title type='text'>Коротко и ясно =)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__5EiJTRGZOg/TOrTsTTNICI/AAAAAAAAABE/PO6Sx72qP2M/s1600/Row2_2a.jpg"&gt;&lt;img style=" margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 269px; height: 320px;" src="http://3.bp.blogspot.com/__5EiJTRGZOg/TOrTsTTNICI/AAAAAAAAABE/PO6Sx72qP2M/s320/Row2_2a.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5542475049481347106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youbrokethebuild.com/"&gt;You broke the build!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125298294002867549-4937597163623808263?l=no-time-to-think.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://no-time-to-think.blogspot.com/feeds/4937597163623808263/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://no-time-to-think.blogspot.com/2010/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/4937597163623808263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/4937597163623808263'/><link rel='alternate' type='text/html' href='http://no-time-to-think.blogspot.com/2010/11/blog-post.html' title='Коротко и ясно =)'/><author><name>nirro</name><uri>http://www.blogger.com/profile/07565048943953703171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__5EiJTRGZOg/TOrTsTTNICI/AAAAAAAAABE/PO6Sx72qP2M/s72-c/Row2_2a.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125298294002867549.post-905638952322976676</id><published>2010-08-15T05:29:00.000-07:00</published><updated>2010-08-15T06:15:24.457-07:00</updated><title type='text'>Стоимость тестирования</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;О том, что автоматизированное тестирование является важной составляющей процесса разработки программного обеспечения, написано во многих книгах. Вот некоторые свойства тестов, которые помогают нам:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspСкорость выполнения.&lt;/span&gt; Автоматизированные тесты выполняются значительно быстрее, чем ручные.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspБыстрое повторное выполнение.&lt;/span&gt; Ничто не мешает нам выполнять тесты несколько раз к ряду, если это необходимо.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspЛокализация дефектов.&lt;/span&gt; Тесты показывают не только наличие дефекта, но и его расположение в коде. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspТест как документация.&lt;/span&gt; Тесты помогают лучше понять  код, предоставляя примеры его использования. Новые разработчики могут быстрее втянуться в разработку. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspТест как страховочная сеть.&lt;/span&gt; Мы можем выполнять модификацию кода, без страха сломать работу существующего функционала (быстрое регрессионное тестирование). &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspОтсутствие забытых проверок.&lt;/span&gt; Однажды добавленный тест не будет забыт, как это часто бывает при ручном тестировании.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•&amp;nbspНавязывание дизайна.&lt;/span&gt; Внедрение тестов в процесс разработки навязывает нам design for testability, т.е. методы написания кода, который легок не только для тестирования, но и переиспользования, отладки и понимания. Такой код обладает низким связыванием и высоким сцеплением. &lt;br /&gt;&lt;br /&gt;Выглядит многообещающе. Но не станет ли мой проект от этого дороже? Не буду ли я тратить больше времени на разработку, а результат останется тем же? Так или иначе, конечному пользователю все равно, был ли написан код с тестами или без. Но если время, которое уходит на создание продукта будет увеличено, то это сделает его дороже  с экономической точки зрения - не лучшее решение, особенно в условиях жесткой конкуренции. Так как же тесты могут сделать мой продукт экономически выгоднее? То, что они способны избавить разработчиков от лишней головной боли более очевидно, чем то, что они сократят затраты на создание продукта.&lt;br /&gt;&lt;br /&gt;На самом деле, у меня нет доказательств того, что тесты могут сделать разработку продуктов дешевле. У меня есть лишь гипотеза. Не доказанная, не опровергнутая, но мой личный опыт подсказывает её истинность. Для того чтобы понять, почему тесты делают проект дешевле, а если быть точнее, почему они сокращают время разработки, следует рассмотреть стадии, через которые проходит практически каждый проект:&lt;br /&gt;&lt;br /&gt;1.&amp;nbspКодирование функционала.&lt;br /&gt;2.&amp;nbspПоиск и устранение дефектов.&lt;br /&gt;3.&amp;nbspДобавление нового функционала в существующий код (модернизация, в соответствии с новыми требованиями).&lt;br /&gt;&lt;br /&gt;В проекте без автоматизированного тестирование большая часть времени уходит на пункты 2 и 3. &lt;br /&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0; width: 600px; height: 83px;" src="http://1.bp.blogspot.com/__5EiJTRGZOg/TGfUXsqRNEI/AAAAAAAAAA0/cXW8_xKCwU0/s1600/Clipboard-2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5505602573074248770" /&gt;&lt;br /&gt;&lt;br /&gt;Но если в проект добавить тесты, то на основании их вышеперечисленных особенностей, можно предполагать следующее перераспределение времени:&lt;br /&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0; width: 600px; height: 83px;" src="http://2.bp.blogspot.com/__5EiJTRGZOg/TGfTXn7G_BI/AAAAAAAAAAc/qYAFiOnNH4s/s1600/Clipboard-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5505601472291077138" /&gt;&lt;br /&gt;&lt;br /&gt;Стадия кодирования будет увеличена, за счет необходимости написания автоматизированных тестов. Время поиска и устранения ошибок серьезно сократится, так же как и время модернизации, хотя последнее требует изменения кода вместе с тестами. Причина тому -  более управляемый и легкий в понимании код, навязанный через design for testability.&lt;br /&gt;&lt;br /&gt;К сожалению, картина может стать и иной. Все фазы будут увеличены, если команда пишет тесты низкого качества. Тесты ради тестов, ради покрытия, а не для отражения требований. Тесты, которые тяжело поддерживать, которые являются дополнительной проблемой, а не решением. Поэтому стоит уделить больше времени изучению правильных подходов к автоматизированному тестированию, чтобы раз и навсегда не разочароваться в них.&lt;br /&gt;&lt;br /&gt;Ну, я вам желаю легкого тестирования и качественного кода!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125298294002867549-905638952322976676?l=no-time-to-think.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://no-time-to-think.blogspot.com/feeds/905638952322976676/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://no-time-to-think.blogspot.com/2010/08/blog-post_15.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/905638952322976676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/905638952322976676'/><link rel='alternate' type='text/html' href='http://no-time-to-think.blogspot.com/2010/08/blog-post_15.html' title='Стоимость тестирования'/><author><name>nirro</name><uri>http://www.blogger.com/profile/07565048943953703171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__5EiJTRGZOg/TGfUXsqRNEI/AAAAAAAAAA0/cXW8_xKCwU0/s72-c/Clipboard-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9125298294002867549.post-5327684135254670360</id><published>2010-06-06T08:35:00.000-07:00</published><updated>2010-06-19T06:08:55.518-07:00</updated><title type='text'>Что такое хорошо, а что такое плохо</title><content type='html'>&lt;span style="font: 22px bold;"&gt;Кроха сын к отцу пришел и спросила кроха: чем же мой код так хорош, ну а что в нем плохо?&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Ваше приложение работает? Заказчик счастлив? Что ж прекрасно, но это не является показателем качества. Ведь жизнь программного обеспечения не заканчивается после его сдачи. Последующие  стадии, такие как поддержка и расширения функционала нельзя считать неважными. Зачастую, при дизайне системы не учитываются некоторые особенности, и это приводит к тому, что программу легче переписать заново, чем модифицировать для удовлетворения новых требований.   &lt;br /&gt;Какими характеристиками должна обладать система, что бы её можно было назвать хорошо спроектированной, а какими нет, мы рассмотрим далее в этой статье.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font: 22px bold;"&gt;Что такое плохо.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Характеристики системы, которыми она обладать не должна, принято называть «symptoms of poor design». При разработке системы важно обращать на них внимание и следить за тем, что бы они проявляли себя как можно реже. И так, вот они:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Жесткость (Rigidity)&lt;/span&gt; – сложно вносить изменения с систему; небольшие изменения требуют серьезных модификаций. «Мне нужно всего лишь добавить новое сообщение на страницу, а я должен переписать пол приложения» - так негодуют разработчики, кому приходится модифицировать «жесткую» систему. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Хрупкость (Fragility)&lt;/span&gt; – даже незначительные изменения, внесенные в систему, могут повлечь за собой непредсказуемые последствия. Обычно такое случается, если код программы не покрыт юнит тестами. В этом случае регрессионное тестирование становится настоящим кошмаром, как для тестеров, так и для разработчиков.   &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Неподвижность (Immobility)&lt;/span&gt; – тяжело выделить отдельные компоненты для их дальнейшего  переиспользования в других системах (компоненты слишком сильно зависят друг от друга). Низкое зацепление и высокое связывание являются тому причиной.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Вязкость (Viscosity)&lt;/span&gt; – делать что-либо правильно сложнее, чем делать неправильно. Типичным примером может быть необходимость «копипастить» вместо наследования или модификация тех же скопированных кусков кода в нескольких местах, вместо внесения одного изменения в общую часть.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Избыточная сложность (Needless Complexity)&lt;/span&gt; – система содержит инфраструктуру без явных преимуществ. Примером может быть создание дополнительных слоев, различных оберток объектов для передачи между этими слоями, хотя можно передавать их напрямую и т.д. Про некоторые решения, которые влекут за собой избыточную сложность, часто говорят: «Стрелять из пушки по воробьям».&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Избыточное повторение (Needless Repetition)&lt;/span&gt; – повторяющиеся структуры, которые лучше вынести в общие абстракции. То, что техника «скопировал-вставил» является дурным тоном, известно многим, но, не смотря на это, она применяет достаточно. Как результат система становится хрупкой и вязкой.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;•  Непрозрачность (Opacity)&lt;/span&gt; – тяжело понять что делает код. Чрезмерное использование различных трюков, плюс избыточная сложность, несомненно, приведет к тому, что код станет тяжелым для понимания. Возможно, в трюках и бывает необходимость, но такие участки кода должны быть хорошо документированы. Кроме того, отсутствие корпоративного стандарта по форматированию кода, так же ведет к его непрозрачности.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font: 22px bold;"&gt;Что такое хорошо.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Обратно характеристикам «бедного дизайна», можно привести те, которые обычно сопровождают дизайн высокого качества:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Минимальная сложность (Minimal complexity)&lt;/span&gt; – отсутствие слишком «умного» дизайна. Его всегда сложнее понимать и поддерживать. «Keep it simple» - один из известных принципов Agile разработки. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Легкость поддержки (Ease of maintenance)&lt;/span&gt; – систему легко поддерживать, т.е. легко понять, как она работает и легко модифицировать её логику.  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Низкое связывание (Loose coupling)&lt;/span&gt; – система обладает минимальной зависимостью между её компонентами.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Склонность к расширению (Extensibility)&lt;/span&gt;  –  вы можете легко расширить функционал системы без внесения изменений в существующий код. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Склонность к повторному использованию (Reusability)&lt;/span&gt; – отсутствие повторяющихся кусков кода, высокое зацепление и низкое связывание её компонентов располагает к их легкому повторному использованию в других программах. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Высокий уровень входящих связей (High fan-in)&lt;/span&gt; – один класс часто используется другими классами – следствие системы обладающей высоким повторным использованием своих компонентов. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Низкий уровень исходящих связей (Low-to-medium fan-out)&lt;/span&gt; – классы должны зависеть от наименьшего количества других классов.  Высокий «fan-out» (более 7) означает, что класс слишком зависим от других классов, что зачастую является следствием его чрезмерной сложности. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Переносимость (Portability)&lt;/span&gt; – программа не испытывает проблем с запуском на других машинах, и при этом, не требует сложной предварительной настройки.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Худоба (Leanness)&lt;/span&gt; – отсутствие неиспользуемых классов и модулей сделает систему более легкой в понимании и поддержке. YAGNI – «you ain’t gonna need it», еще один из принципов Agile разработки. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Расслоение (Stratification)&lt;/span&gt; – система, спроектированная по принципу расслоения, легко оценить на каждом уровне без затрат на понимание остальных. Такая фокусировка положительно сказывается как на поиске проблем, так и на способности системы повторному использованию. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;• Стандартные подход (Standard techniques)&lt;/span&gt; – система полностью написана с использованием единого подхода, таким образом, любой разработчик не испытывает трудностей в понимании частей системы, которые были написаны его коллегами. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Умение отличать хороший код от плохого - это важная способность. Введь не зная маршрута - неизвестно куда приедешь. Ну а я желаю вам не терять ориентир в вопросах качества программного обеспечения. Надеюсь, данная статья была для вас полезна. Удачи!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9125298294002867549-5327684135254670360?l=no-time-to-think.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://no-time-to-think.blogspot.com/feeds/5327684135254670360/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://no-time-to-think.blogspot.com/2010/06/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/5327684135254670360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9125298294002867549/posts/default/5327684135254670360'/><link rel='alternate' type='text/html' href='http://no-time-to-think.blogspot.com/2010/06/blog-post.html' title='Что такое хорошо, а что такое плохо'/><author><name>nirro</name><uri>http://www.blogger.com/profile/07565048943953703171</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
