Sunday, January 17, 2010

Качественный код и проектирование

image В процессе своего развития любое приложение становится все больше и сложнее, зачастую теряя при этом такие свои полезные свойства как управляемость и надежность. Программистам становится сложнее добавлять новый функционал, изменять старый при необходимости, исправлять ошибки и т.д. В таких случаях обычно говорят, что приложение становится менее управляемым и теряет свое внутреннее качество.

Под внутренним качеством подразумевается не качество самого приложения (внешнее качество), то есть отсутствие ошибок, соответствие требованиям, простоту использования и т.д., а качество кода этого самого приложения.

Свойства качественного кода

Какими же свойствами обладает качественный код:

  • расширяемость, гибкость (extensibility, agility)
  • сопровождаемость (maintainability)
  • простота (simplicity)
  • читабельность, понятность (readability, clarity)
  • тестируемость (testability)

Конечно, это не все полезные свойства, которыми может обладать код, но мы пока остановимся на этих. Эти свойства без преувеличения можно назвать ценностями кода, потому что код, ими обладающий, является по-настоящему ценным :)

Примечание. Однако, стоит заметить, что некоторые ценности противоречат друг другу. Например, расширяемый код, как правило, более сложен в написании и, соответственно, понимании. Сложно написать код, который бы обладал всеми вышеперечисленными свойствами в полной мере, поэтому здесь всегда приходится идти на компромисс в зависимости от дополнительных требований конкретного приложения и, следовательно, его приоритетов.

Итак, теперь мы лучше понимаем, что означают абстрактные слова "хороший код", "правильный код" и т.д. Это код, который обладает полезными внутренними качествами (ценностями).

Как же достичь хорошего кода?

Существует довольно много способов, и их можно условно разделить на внешние и внутренние. Внешние способы - это различные программистские практики, например, парное программирование, статический анализ кода, code review и т.д. В какой-то степени сюда можно отнести и модульное тестирование с TDD/BDD, так как они улучшают качество кода: написать модульные тесты на существующий плохой код довольно сложно, поэтому его приходится рефакторить, а при использовании TDD/BDD написать плохой код с самого начала довольно сложно, хотя и вполне реально.

Внутренние способы намного прозаичнее - это правильное проектирование и рефакторинг кода как способ превращения плохого кода в более хороший.

Внешние способы достаточно результативны, однако они всегда являются лишь дополнением внутренних. Если программист не обладает навыками правильного написания кода и проектирования, парное программирование с более сильным товарищем или code review ему поможет. Но что делать, если они оба не обладают этими навыками? Поэтому для каждого программиста, кроме знания инструмента (языка программирования, технологий) важно также и умение ими пользоваться (я уже когда-то об этом писал). Это 2 разных, ортогональных друг другу направления развития.

Итак, рассмотрим один из внутренних навыков, а именно навык проектирования (design).

Зачем каждому программисту иметь навыки проектирования

Многие программисты думают, что проектирование - это какая-то специальная фаза при разработке ПО, считают ее сложной и не всегда нужной. Строят там какие-то заумные дяди какие-то UML-диаграмки и прочую чушь. Все равно ведь когда будем писать код - будем половину менять и переписывать. Но ведь на самом деле, проектирование - это не только формальная фаза процесса создания ПО (практически любого), а очень важный (я бы сказал даже необходимый) шаг в программировании. А если выкинуть название "проектирование", то это необходимый шаг в любой человеческой активности. Сейчас объясню на примере, почему. Представим себе, что перед нами стоит какая-то задача. Что мы должны сделать перед тем, как начать ее выполнять? По идее, сначала мы должны понять что нам нужно сделать. Вторым шагом нужно разобраться, как мы будем это делать. И только потом - уже собственно делать! Так и в создании ПО. Сначала мы пытаемся понять, что нужно сделать (анализируем требования, или иногда даже анализируем желания клиента и создаем требования по ним). Затем мы пытаемся разобраться как мы будем это делать (по сути, проектируем, как будет выглядеть результат, чтобы не переделывать десять раз). И только потом берем клавиатуру в зубы и идем программировать. Однако здесь важно понимать одну очень важную деталь: результат проектирования (проект) не обязательно должен быть вырезан в камне диаграммах UML и документах, а вполне может быть сделан на доске, куске бумажки или даже просто в голове, если этого достаточно. Так что отсутствие конкретной формальной фазы еще не значит, что программисты не занимаются проектированием какого-то куска кода, базы данных, UI прототипов или даже микро-архитектуры. Занимаются. Это и есть проектирование, просто менее формальное.

Таким образом, даже несмотря на то что формальное проектирование и отсутствует на определенных проектах, фактическое проектирование все равно происходит. Потому что все равно без него никуда. Однако зачастую это обозначает, что этим самым проектированием занимаются не только опытные программисты и архитекторы, а практически все программисты, что увеличивает ответственность каждого конкретного члена команды. Ведь из-за моего непрофессионализма могу пострадать не только я (баги, частый рефакторинг, и т.д.), но и вся команда и проект в целом. И вот тут становится понятно, что навыки проектирования так же важны для каждого программиста, как и знание и понимание языков программирования и технологий. Не говоря уже о том, что без этих навыков вы не сможете сами эффективно и качественно создавать большие системы в роли технического лидера проектной команды или архитектора.

Технический долг

С вопросом важности проектирования тесно связана концепция технического долга или задолженности (Technical debt). Технический долг - это очень хорошая метафора, иллюстрирующая то, что быстрая и бездумная разработка кода приводит к появлению т.н. технического долга, похожего на финансовый долг, когда мы берем кредит. Как и финансовый, технический долг (кредит) имеет свои проценты, которые накапливаются с течением времени, и которые мы постоянно вынуждены выплачивать при добавлении новой функциональности, если мы не хотим выплачивать тело этого кредита. Со временем проценты становятся настолько велики, что мы вынуждены остановить добавление функционала и выплатить часть тела нашего кредита - зарефакторить быстрый и кривой дизайн приложения и сделать его более качественным. Несмотря на то, что этот процесс занимает время, таким образом мы уменьшаем будущие проценты.

Также эта метафора объясняет, почему иногда приходится писать код быстро, не тратя времени на правильное проектирование. Как и с точки зрения финансов мы берем деньги в кредит/долг для более быстрого достижения поставленной цели, здесь мы это также делаем для более быстрого получения результата. Однако мораль сей басни такова, что не нужно забывать, что за подобные действия мы будем расплачиваться в дальнейшем.
Более подробно о техническом долге можно почитать у
Фаулера и Jeff Atwood.

Рецепты правильного проектирования

Хорошо, теперь мы знаем, что есть свойства хорошего кода (ценности), и что проектирование может нам помочь достичь их. Но как это сделать? Какие есть рецепты?

Индустрия создания программного обеспечения очень молода. Создание ПО часто сравнивают со строительством, архитектурой, мол, там все четко и понятно - есть требования к зданию, по ним делается дизайн, проект, потом этот проект просчитывается, конструируется, подбираются материалы, все планируется и лишь только затем начинается постройка. Кроме того, на данный момент существует уже куча стандартных подходов для строительства различных типичных зданий, существуют различные инженерные решения, позволяющий построить как гигантский небоскреб, так и тоннель под Ла-Маншем или какой-нибудь супер-мост. Однако, почти все забывают одно существенное различие: архитектуре уже как минимум 10,000 лет и человечество накопило очень много знаний и опыта за это время, а вот индустрии создания ПО - меньше века. И если в сфере языков программирования и технологий наша индустрия проделала очень внушительный путь, то по проектированию накопленных знаний не так и много. Многие подходы еще только нарабатываются и внедряются, поэтому и готовых рецептов-то не так уж и много.

Из того, что связано непосредственно с проектированием, можно назвать паттерны и принципы проектирования.

Паттерны (шаблоны) проектирования - это типовые конструкции кода, представляющие собой решение какой-нибудь типовой задачи проектирования (с) Википедия. Кто-то их  любит использовать, а кто-то считает, что мышление шаблонами заглушает творческий подход в разработке. Но ясно одно - паттерны представляют собой готовые крупные строительные блоки, из которых можно создать ваше приложение, и так или иначе знать о них и об анти-паттернах полезно.

Принципы проектирования - это определенные правила, помогающие более правильно проектировать программный продукт (определение корявое, потому что мое :). Принципы проектирования, в отличие от паттернов, не предлагают конкретного решения проблемы, а скорее говорят, как приблизительно должно выглядеть правильное решение или как его достичь. То есть, в какой-то мере, можно сказать, что принципы описывают пути достижения тех самых ценностей, а паттерны в свою очередь зачастую следуют тем или иным принципам, то есть стоят на ступеньку ниже них. Также, поскольку принципы не конкретизируют результат, они дают нам намного большесвободы по их применению.

Мне кажется, что ценности, принципы и паттерны можно выразить следующей иерархией (с удовольствием жду комментариев по ее улучшению):
image

На вершине пирамидки располаются наши ценности (свойства), которых мы хотим достичь. Чуть ниже располагаются принципы - в какой-то степени они описывают правила, используя которые мы можем достичь наших ценностей. Еще ниже - паттерны, как более низкоуровневые рецепты. И в самом низу - обыкновенный код.

Однако данная пирамидка совсем не обозначает, что нельзя достичь вершины, не зная те же паттерны или принципы. Очень даже можно, вот только не факт, что в полученном результате их не будет :) Да и зачем изобретать велосипед, если можно использовать наработки таких умных и известных инженеров, как Бек, Гамма, Фаулер, Лисков, и множество других. Понимание и разумное использование принципов и паттернов помогает достигнуть вершины быстрее и с меньшими трудозатратами.

Мне кажется, что информации по паттернам проектирования уже очень много, а вот с принципами все не так просто. Поэтому в следующих частях я постараюсь осветить принципы проектирования, и не останавливаться только на SOLID.

Sunday, January 3, 2010

Лучшие фотографии 2009 года

Извините, после Нового года программирование в голову лезет слабо, поэтому будет еще одна заметка с фотографиями :) Надеюсь, они вам понравятся, а чуть позже обещаю исправится - снова начну писать на профессиональную тематику.

Если кому-то хочется иметь ту или иную фотографию у себя на рабочем столе или в распечатанном виде - напишите в комментариях, я вышлю полноформат.

IMG_2966

#1 Святыня Харькова

IMG_3210_kvadrat_bw_ch

#2 Снегопад

IMG_3703

#3 Александро-Невская лавра

IMG_3859

#4 Ночь в Русском музее

IMG_3919

#5 Исакиевский собор

IMG_4951

#6 Карпатский рай

IMG_4736

#7 Шипот Карпат

IMG_4833

#8 Боржава

IMG_5158

#9 Закарпатье

IMG_5278

#10 Проселочная дорога

IMG_5713

#11 В открытое море

IMG_5951

#12 Фиолент

IMG_6327

#13 Костел Св. Марии Снежной

IMG_6413

#14 Речная прогулка

IMG_6447

#15 Чертовка

 IMG_6520

#16 Осень

IMG_6561

#17 Закат

IMG_7152

#18 Этюд в червоных тонах

IMG_7132

#19 Спокойствие

IMG_7012

#20 Цвингер

IMG_7055

#21 Дрезден

IMG_7187

#22 Телч

IMG_7188

#23 Святой

IMG_7195

#24 Игрушечный город

Отпуск в Чехии #3: Южная Чехия

Чешский цикл:

Отпуск в Чехии #1: Чехия и Прага
Отпуск в Чехии #2: Карловы Вары и Дрезден
Отпуск в Чехии #3: Южная Чехия

---------------------

Экскурсия в Южную чехию была последней загородной экскурсией, которую мы посетили. Вообще, начитавшись перед поездкой интернета, мы очень хотели посетить Чешский Крумлов, но не сложилось, а единственным оставшимся нам вариантом был замок Червена Лгота и небольшой городок Телч. Но, побывав в этих прекрасных местах, мы ни капли не пожалели о случившемся.

Южная Чехия прекрасна. Нет, не так. Она просто восхитительна! Сложно подобрать слова для выражения восторга от этих мест! Чего стоит только постоянно петляющая между зелеными холмами и лесками дорога, периодически вплетающаяся в лес и змеящаяся в нем зеленым тоннелем с полукругом света где-то в конце. Добавьте к этому золотое начало осени - и вы получите идеальный с точки зрения живописца пейзаж. Если вы играли в NFS5 и помните карты Шварцвальд и Пиренеи, то вы меня поймете...

А теперь немного о местах, которые мы посетили.

Червена Лгота

Червена Лгота - это небольшой средневековый замок первой половины XVI века, расположенный посередине пруда и окруженный лесом с трех сторон. Замок был жилым до Второй мировой войны, после которой его хозяева (немцы) были лишены права собственности и замок перешел государству. Изначально замок представлял собой готическую постройку, но был перестроен в готике и ренессансе в начале XX века.

Самое интересное в замке - его красный цвет. Красных замков вообще очень мало, но здесь он вдобавок отражается в голубых (ну, или почти голубых) глубинах пруда, и контрастирует с зеленым хвойным лесом вокруг. Да, конечно же, как и в любом замке, здесь есть своя легенда о том, как замок стал красным, но я из нее мало что уже помню, поэтому в этот раз без легенд :) Если я правильно помню экскурсию, то какое-то время замком владел даже кто-то из Лихтенштейнов. Лихтенштейны в средние века были довольно могущественной династией, имеющей различную "недвижимость" в разных уголках Европы. А теперь вот стали одной из немногих монархических династий в мире, которая имеет свое собственное государство.

IMG_7152 IMG_7163
Замок со стороны

Если начать обходить пруд с левой стороны, то вы попадете на красивую лужайку, откуда открывается прекрасный вид на замок. По пруду можно поплавать на лодке, но у нас было мало времени, поэтому не удалось. Но нескольких ребят видели.

IMG_7132IMG_7159
Замок со стороны

Замок однозначно стоит того, чтобы его посетить.

Телч

Телч - это город в Чехии, центр которого занесен в список всемирного наследия Юнеско. Основан предположительно в XI веке, а впервые упоминается в письменных источниках в 1333 году, когда Телчский замок был куплен Карлом IV (да-да, тем самым). Меня вообще постоянно в Чехии радовало, как все эти графы, бароны и короли покупали друг у дружки замки и целые города. Кстати, им тоже какое-то время владели Лихтенштейны. Со временем вокруг замка выросло поселение, которое теперь стало небольшим городом.

IMG_7187 IMG_7191
Центральная Захариева площадь

Архитектура центра города сформировалась в XVI веке и с тех пор вроде бы как не перестраивалась. В центре располагается площадь с вездесущим чумным столбом и пряничными домиками по бокам.

IMG_7189 IMG_7188 IMG_7172 
Чумной столб, фонтанный комплекс, собор

Замок тоже достаточно интересный. Его можно назвать полноценным средневековым замком (все-таки Червена Лгота по размерам намного меньше), хотя он построен в стиле ренессанс, а не в готике. В 2007 году замок победил в чешском конкурсе "Самый сказочный замок" и победил заслуженно. Здесь снимались многие детские фильмы.

IMG_7242IMG_7178
Замок снаружи и внутри

Центр городка окружен прудами. Если будете в Телче - не ограничивайте себя центральной площадью, выйдите по мостам за пруды и посмотрите на центральную композицию города со стороны.

IMG_7195IMG_7205 IMG_7201
Центр города из-за прудов

На Пикасе лежат еще несколько фотографий с описаниями: Червена Лгота и Телч.

Надо сказать, что эта экскурсия была на мой взгляд самой лучшей и запоминающейся за всю поездку. Прага красива и монументальна, но в ней чувствуется современность и столичность, Карловы Вары слишком "туристичны" и "курортны". Дрезден, к сожалению, утратил свою историчность во Вторую мировую, хотя он нам очень понравился и такой какой он есть сейчас. А вот в Лготе и, особенно, Телче время остановилось. Здесь каждый камушек до сих пор дышит историей, помнит, как по нему ездили повозки рыночников и рыцари на лошадях. Здесь осталась именно та атмосфера, за которой я ехал в Чехию.

Saturday, January 2, 2010

Отпуск в Чехии #2: Карловы Вары и Дрезден

Чешский цикл:

Отпуск в Чехии #1: Чехия и Прага
Отпуск в Чехии #2: Карловы Вары и Дрезден
Отпуск в Чехии #3: Южная Чехия

---------------------

Следующими местами, которые мы посетили в нашем чешском путешествии, были Карловы Вары и Дрезден. Дрезден - это, конечно, не Чехия, а вовсе даже немецкая провинция Саксония, но в этом и была задумка: посмотреть не только чешскую жизнь, но также и другие страны.

Карловы Вары

Карловы Вары - это еще один населенный пункт, основанный Карлом IV (тем самым "Петром I" чешского народа, о котором я упоминал в первой части). Рассказывать легенду об основании города долго, ее можно почитать в Википедии. Также этот город известен под названием Карлсбад (немецкое название). Карловы Вары - один из любимейших курортов советского человека, поэтому он, во-первых, известен всем русским туристам, и, во-вторых, процент русского населения здесь скорее всего наивысший в Чехии, что дает возможность комфортно себя чувствовать всем русским. Карловы Вары известны своими горячими минеральными источниками, а также легендарной Бехеровкой - 13-м "источником".

IMG_6628
Набережная

Карловы Вары нужно посещать одним из первых пунктов в Чехии, потому что это не самый интересный город на мой вкус, и смотреться после Южной Чехии он не будет. Да, в Варах красиво, но здесь слишком много лоска и слишком мало истории. Главная улица - сплошной поток гостиниц вперемешку с минеральными источниками, парками и туристическими лавками. Гостиницы построены или по крайней мере стилизованы под XVIII-XIX век. Источники располагаются прямо на улице в разных местах.

IMG_6629IMG_6625
Стилизация источников

В самом центре находится самый главный источник - первый. Он является гейзером и его убрали под крышу, оградив со всех сторон стеклянными стенами и сделав что-то вроде большого банного помещения, которое обогревается самим источником. Температура гейзера достигает 72 градусов, струя бъет вверх на 10-12 метров.

IMG_6640
Гейзер первого источника - Вржидло

Однако, если уж вас занесло в Карловы Вары на небольшую экскурсию, очень рекомендую быстро пробежаться по главной улице, попить водички из нейтрального 6-го источника, поесть горячих оплаток на улице, сфотографироваться на мостике через реку и рвануть наверх по улице из желтого кирпича, пересекающей главную в районе первого источника и чумного столба - там все намного интереснее.

 IMG_6637 IMG_6636
Центр города

Наверху вас ждет несколько улиц с очень красивыми зданиями, парк с прудом, православный храм, а также тишина и спокойствие, которых не хватает главной улице. Здесь начинаешь чувствовать город намного лучше.

IMG_6677 IMG_6680 IMG_6683
Сказка

Немного больше фотографий Карловых Вар можно найти здесь.

Дрезден

Дрезден - это совсем другая история, совсем другой город, город с тяжелой судьбой. Дрезден был сметен с лица земли за одну ночь в 1945 году авиацией Британии и Соединенных Штатов. На город, в котором не было военной промышленности, а в основном мирные жители-беженцы, было сброшено столько бомб, что не осталось ни одного целого здания. Город, который поэты называли Флоренцией на Эльбе, был полностью разрушен... Основная часть города была полностью перестроена во времена ГДР, а исторический центр восстановливали больше 60 лет и, думаю, это еще не все.

IMG_7055 IMG_7046
Набережная Эльбы

Дрезден не блещет историей, но даже крохотный по меркам Праги исторический центр весьма и весьма красив. Здесь находится всемирно известная галерея искусств Цвингер, замок-резиденция саксонских курфюстов, где располагается Грюнес Гевёльбе (Зеленые Своды) - коллекция драгоценностей Веттинов, опера Земпера, и многое другое.

IMG_7019  IMG_7011  IMG_7074
Замок-резиденция, внутренний двор Цвингера, опера Земпера

Отдельно стоит упомянуть Фрауэнкирхе (нем. Frauenkirche) - величественную церковь Богородицы, один из наиболее значимых протестантских соборов Дрездена. Саксония - это центр лютеранства. Фрауэнкирхе была полностью разрушена во время бомбардировок и власти ГДР решили не восстанавливать ее "в назидание потомкам". Однако все-таки в Германии есть здравомыслящие люди, поэтому после объединения Германии и выдворения советской власти из страны собор все-таки реконструировали. Сейчас он выглядит очень интересно, в черную крапинку, а одна из стен почти полностью черная. Это старые камни, которые были использованы строителями при постройке нового здания, что, на мой взгляд, является отличным памятником одновременно войне и миру. А также человеческой глупости, которая может привести к войне, смерти и разрушениям...

IMG_7022 IMG_6959
Фрауэнкирхе

Дрезден - очень современный город: широкие проспекты, красивые здания, современный транспорт, и куча велодорожек и велосипедистов! Здесь действительно хочется остаться жить. Вообще, Германия по сравнению с Чехией выглядит еще чище и цивилизованнее. Здесь нигде нет даже мусоринки, а газон пострижен даже по бокам автобана, где это вообще никому не нужно. Цивилизованный и аккуратный народ эти немцы.

IMG_7050IMG_7012
Мы и Цвингер

Другие фотографии из Дрездена с небольшим описанием можно найти на Пикасе.

Далее будет продолжение о городах Южной Чехии.