Monday, June 04, 2007

IDC оценила рынок OSS в $1.8 миллиардов

По оценкам IDC в 2006 году рынок open source software достиг $1.8 миллиардов. И будет увеличиваться ежегодно на 26%, достигнув $5.8 миллиардов в 2011 году.

Among the key results presented in IDC's study are the following:

  • Worldwide revenue from standalone open source software reached $1.8 billion in 2006.
  • This revenue will reach $5.8 billion in 2011, representing a compound annual growth rate (CAGR) of 26% from 2006 to 2011.
  • Software vendors are advised to consider several factors when evaluating how best to leverage open source software as a business opportunity, including the most appropriate business model, the appropriate usage of partnerships and alliances, and the characteristics of the community supporting the open source software.

Вообще эти цифры было бы интересно сравнить с оценкой роста всего рынка на этот же период и, соответственно, посмотреть изменение доли OSS в общем рынке.

Sunday, June 03, 2007

Microsoft снова против

На этот раз Microsoft против TestDriven.Net. До суда дело, вроде, еще не дошло, но "личная" переписка по увещеванию разработчика (Jamie Cansdale) отказаться от продукта уже довольно объемна. TestDriven.Net - Add-In для MS VisualStudio (в том числе поддерживает и Express). Понять недовольство MS можно – в Express многое обрезано и она должна "подталкивать" разработчиков к переходу на платную полнофункциональную MSVS. Ясное дело, что TestDriven.Net "тормозит" подобные переходы.

Ситуация немного непонятна. Джеми Кансдейл утверждает, что за пол года переписки MS так и не указали, какой же пункт EULA был нарушен. Опять же не понятно почему, если этот вопрос так важен для MS, увещевание за пол года так и осталось на уровне личной переписки и до сих пор дело не дошло до суда. Может Джеми Кансдейл на самом деле ничего не нарушил и его пытаются "задавить авторитетом"?

Update. Еще обсуждения данной темы:
Microsoft борется с TestDriven.NET
Microsoft против TestDriven.NET

Tuesday, May 29, 2007

SVN for Distributed Development Teams

Сегодня-завтра на CMcrossroads намечается пара интересных вебинаров, посвященных использованию Subversion для работы распределенных команд разработчиков:

  • Globally Distributed Development Using Subversion
    Сегодня, 29 мая в 22:00 по Москве (поздновато).
    Докладчики:
    Blair Zajac, Principle, OrcaWare Technologies
    Jim Campigli, Executive VP, Product Management & CTO, WANdisco
    Patrick Egan, Editor-in-Chief, CM Journal
  • Subversion for Enterprise Distributed Teams: Why, When and How?
    Завтра, 30 мая в 18:00 по Москве.
    Докладчики:
    Carey Schwaber, Senior Analyst, Forrester Research, Inc.
    Auke Jilderda, Senior Collaboration Consultant, CollabNet, Inc.
    Mark Phippard, Director, Subversion Engineering, CollabNet, Inc.

Вопрос Source Control Management для распределенных команд один из наиболее проблемных. Надеюсь будут интересные идеи не только по SVN, но и по SCM в целом.

И вообще, здесь довольно много интересных вебинаров. В частности еще ожидаемые по Distributed Development:

Прошедшие вебинары доступны в течении 6 месяцев on-demand.

Friday, May 04, 2007

Resume vs. CV

Давно у меня было желание написать по поводу того, чем же отличается резюме от CV (т.к. последнее время аббревиатура CV встречается все чаще). Но, как это часто бывает, такие «не острые» проблемы все время откладываются на потом. Сейчас же триггером к написанию поста послужил пост «Как абсолютно правильно составить резюме». В общем-то, написано там все очень верно, только это не резюме, а CV. Так в чем же разница?

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

Резюме

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

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

Далее самый важный блок - информация о навыках, причем только тех, которые непосредственно относятся к должности, на которую претендует соискатель. В зависимости от требований конкретной компании меняются приоритеты, т.е. вверх поднимаются навыки, которые требуются на конкретной должности в конкретной компании. Соответственно резюме одного и того же соискателя могут отличаться как при подаче на разные должности, так и при подаче на одну и ту же должность, но в компании с разной специализацией (пример см. в конце поста). Сколько лет или месяцев проработал соискатель в той или иной области не очень важно (можно указать, а можно и нет), но очень важны количественные и качественные показатели систем, с которыми приходилось работать (проектировал БД со 100 справочниками, 15 оперативными таблицами; участвовал в разработке системы с 20 рабочими местами), параметры лучше выбирать самые «впечатляющие».

Далее идет информация о местах работы, но, опять же, только тех, которые непосредственно относятся к должности. Здесь хорошо подробнее остановиться на месте работы (не обязательно последнем), которое считаете «достижением».

Образование – указывается только то, что относится к описанным навыкам. Т.е. школа вообще никого не интересует. И институт, если он не по специальности тоже. Курсы и сертификаты, опять же, только по тем предметам, которые указаны в навыках.

Контактная информация – Имя (или фамилия, на данном этапе полные данные не нужны), email, телефон и др. способы связи. Возраст и пол указываются только если к ним есть особые требования.

CV (curriculum vitae)

Европейский подход более «человечный» - главное чтоб человек был хороший, а навык появится. CV - это полная автобиография. В ней надо отразить весь жизненный бэкграунд.

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

И далее все очень хорошо описано здесь.

Что соискатель хочет от работы - т.е. не какая конкретная должность (как в резюме), а чем бы ему вообще интересно было заниматься.

Навыки – в порядке заинтересованности соискателем. Этот блок логическое продолжение предыдущего блока. Он должен рассказать работодателю чем соискатель хочет продолжать заниматься исходя из своих возможностей.

Места работы – все места, где проработал соискатель в обратном хронологическом порядке с подробным описанием чем и где занимался, круг должностных обязанностей и т.д. (можно даже указать почему менялись места работы). В CV это основной блок – он раскрывает работодателю бэкграунд соискателя.

Научные публикации, если таковые имеются. Должен идти сразу же после опыта работы, т.к. на текущий момент CV, в основном, используется в научной среде. Если публикации плотно связаны м местами работы, то блок научных публикаций можно объединить с блоком мест работы и делать их подблоками для каждого из мест.

Образование – тоже в обратном хронологическом порядке «официальное» образование, в конце дополнительные курсы.

Личностные характеристики – все что еще хочет сказать о себе соискатель работодателю.

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

--

Пример особенностей резюме для разных должностей

Возьмем соискателя программиста VB.NET + MS SQL Server, имеющего опыт работы как в крупной компании (работа по четко поставленному ТЗ), так и в небольшой (самому приходилось бегать и выяснять требования).

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

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

--

Послушать (eng) чем отличаются резюме и CV можно здесь (прямая ссылка на MP3 файл)

Friday, April 20, 2007

Aspect-oriented programming

Если что-то появляется, значит, оно кому-то нужно.

И снова новая методология программирования и к ней новый подход к разработке ПО. Приглашаем любить и жаловать: Aspect-Oriented programming (AOP) и Aspect-Oriented software development (AOSD).

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

История:

Aspect-Oriented подход разработан в Xerox PARC в 2001 году под руководством Gregor Kiczales. Этой же группой была разработана первая реализация – AspectJ, которая на текущий момент входит в Eclipse Foundation. Кроме AspectJ уже создано несколько десятков реализаций AOP парадигмы, практически для всех языков.

Идея AOP захватила сообщество - существует Aspect-Oriented Software Association (AOSA), проходят ежегодные конференции по AOSD, в которых в качестве спонсоров выступают Microsoft, Google и IBM.

Основная цель, которую себе поставил Gregor Kiczales, и в результате движения к которой появился AOP – уменьшение кол-ва ошибок и улучшение качества кода за счет борьбы с запутанностью кода и разбросанностью функционала.

Дисклэймер:

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

С чем боремся:

В объектно-ориентированном подходе как на уровне системы в целом, так и на уровне отдельных классов присутствует сквозная функциональность (т.е. та, которая реализована понемногу в разных модулях), а так же большое количество кода, который фактически не относится к функционалу системы. На уровне системы это идентификация, защита, логирование, репликации, сериализация/десериализация, сохранение настроек системы и т.д., т.е. или общий или «сервисный» функционал, зачастую реализованный в разных частях системы (примеры: сериализует один модуль - десериализует другой; каждый из модулей системы занимается идентификациеи и защитой), в связи с чем усложняется отладка и поддержка (со временем начинается «расползание»). То же самое на уровне классов – класс инкапсулирует в себя не только функциональную часть, но и внутренние «сервисы», обеспечивающие корректность работы – отлов ошибок, работа с памятью и т.д., которые загромождают код и усложняют чтение логики – в следствии чего, опять же сложности с отладкой и длительной поддержкой.

Метод борьбы:

Выделение сквозной функциональности в отдельные модули, которые называются аспектам (aspects). Поведение аспекта в конкретном месте программы (точке подсоединения, join point) определяет advice (собственно программная реализация модуля). Все точки подсоединения конкретного аспекта описываются в наборе pointcut.

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

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

Ссылки по теме:

Gregor Kiczales о AOP (Google Video)

Aspect-Oriented programming на wiki

Книги:

Aspect-Oriented Analysis and Design: The Theme Approach. Siobhàn Clarke, Elisa Baniassad.

Aspect-Oriented Software Development. Robert E. Filman, Tzilla Elrad, Siobhan Clarke, Mehmet Aksit.

Aspect-Oriented Software Development with Use Cases. Ivar Jacobson, Pan-Wei Ng.

Aspect Oriented Refactoring. Ramnivas Laddad.

AspectJ in Action: Practical Aspect-Oriented Programming. Ramnivas Laddad.

Sunday, April 15, 2007

Очень точно подмечено

Ко всем существующим фобиям у современных людей добавилась еще одна - боязнь потерять флешку!

(автор где-то в ЖЖ)

Tuesday, April 10, 2007

Фильм про Дубну и Синхрофазотрон

Тем, кого заинтересовала Дубна, а так же тем, кто любит физику, историю и, особенно, историю физики:

10 апреля на канале "Культура" в 20.35 (по мск) будет фильм "Властелины кольца", посвященный созданию дубненского синхрофазотрона.

Monday, April 09, 2007

И еще пара наблюдений по поводу защиты в Висте

  • 1. Инсталлятор можно запустить только под админскими правами. Т.е. любой инсталлятор может сделать с машиной что угодно. Ранее не вызывающие особого доверия инсталляторы пускались под пользователем с ограниченными правами, давая некоторую дополнительную защиту. Теперь для таких "сомнительных" инсталляторов, по-видимому, придется использовать виртуальные машины.
  • 2. Появились предупреждающие сообщения (с затемнением экрана) что данное действие может быть очень опасно с точки зрения безопасности и что требуется подтверждение пользователя на продолжение действия. Идея хорошая т.к. довольно давно известно, что большинство пользователей не читают текст обычных сообщений, а сообщение с затемнением экрана действительно привлекает внимание пользователя к сообщению – выглядит, как будто машина сейчас уйдет в перезагрузку и вызывает ощущение, что действительно происходит что-то опасное. Только во всем нужна мера, а MS перебрали с такими сообщениями очень сильно. Сообщения выскакивают по любому поводу. Результат – когда за 2 минуты работы пользователь увидит 6 штук таких сообщений то уже 4-е он читать не будет, а 6-м его можно будет спросить "Вы уверены что хотите установить вирус на ваш компьютер?" и пользователь ответит Да.

Sunday, April 08, 2007

NSIS & Vista

Для того чтобы установить программу в “Program Files” пользователю нужны административные права. Это не новость. А вот новость, появившаяся в Висте – запустить инсталлятор можно только под пользователем уровня доступа администратора машины.

С версии 2.21 в NSIS-е появилась команда RequestExecutionLevel, которая указывает какими правами должен обладать пользователь для запуска NSIS инсталлятора. RequestExecutionLevel может указывать 3 уровня прав: user, admin, highest. Если программа по умолчанию устанавливается в “Program Files”, то должен быть указан уровень admin. Если Команда не используется, то NSIS инсталлятор автоматически определяется Вистой и при запуске требует административных прав, однако после завершения инсталляции выдает сообщение о том что возможно установка программы прошла некорректно.

Итак, если текущий пользователь не имеет административных прав Виста запросит ввести пароль для пользователя, имеющего такие права, и NSIS инсталлятор запустится под администраторским пользователем. В результате чего появляются следующие проблемы:

Все глобальные переменные системы (%UserProfile%, %LocalAppData% и др.) определяются не для фактически залогиненного акаунта, а для администраторского, под которым запущен инсталлятор. Та же ситуация с переменными NSIS скриптов (например $SMPROGRAMS) и доступом к ветке реестра HKEY_CURRENT_USER.

Такая ситуация с переменными выливается в то, что для обычного пользователя через инсталлятор нельзя проставить даже элементарные линки на программу в “Start Programs”, на “Desktop” и в “Launch Menu”. Для того, чтобы пользователь сразу после инсталляции увидел иконку на рабочем столе ставить ее (и все остальные линки) надо для All Users (команда SetShellVarContext all). Это значит, что фактически программу надо ставить не для конкретного пользователя, а для всех существующих пользователей машины сразу.

И, не смотря на то что здесь в FAQNSIS сказано, что для успешного добавления линков в “Start Programs” при инсталляции и для последующего успешного их удаления при анинсталляции надо указать или “RequestExecutionLevel admin” или “SetShellVarContext all”, на самом деле обе операции должны применяться одновременно:

--

OutFile vista.exe
Name Vista

RequestExecutionLevel admin

Section
  SetShellVarContext all
  CreateShortcut "$SMPROGRAMS\Vista Test\hello.lnk" $WINDIR\notepad.exe
  WriteUninstaller $EXEDIR\uninst.exe
SectionEnd

Section uninstall
  SetShellVarContext all
  Delete "$SMPROGRAMS\Vista Test\hello.lnk"
  RMDir "$SMPROGRAMS\Vista Test"
SectionEnd

--

Friday, April 06, 2007

Российский Центр Программирования в Дубне

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

Основные вопросы к технопаркам

Вообще тема этих парков с самого ее появления для меня была очень загадочна. 2 основных вопроса к подобной модели развития IT (когда в одном месте государственными усилиями пытаются собрать IT компании):

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

Если строить парк на основе новых компаний – то надо активно поднимать волну стартапов, «править мозг» разработчикам, что лучше работать на себя, а не на «дядю», и, опять же, налоговые льготы и упрощенная отчетность для начинающих. Подобных действий тоже не видно. Т.ч. первый вопрос висел у меня совсем без ответа.

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

Ответы на вопросы

Теперь, собственно, свежая информация, которая хоть и не официальная, но вполне похожа на правду и дает ответы на вопросы.

В Дубне сейчас параллельно развиваются 3 проекта.

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

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

2. Российский Центр Программирования (РЦП). В народе, как не трудно догадаться – Силиконовая Долина (должна быть Кремниевая, но это не важно :-) ). Здесь немного официальной информации, правда не обновлявшейся с 2004г.

Итак ответы на мои вопросы:

Откуда взять компании. Якорной компанией является Luxoft (и возможно не он один). Т.е. крупная и активно растущая офшорная компания, которая очень активно ищет себе сотрудников по всей стране. Ей нужны офисы и жилье для сотрудников. И с офисами и с жильем сейчас проблемы уже не только в Москве и Питере, но и во всех более-менее крупных городах. Т.ч. шаг Luxoft-а выглядит очень разумным.

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

Т.к. офисы рассчитаны на гораздо большее количество сотрудников чем жилая застройка на территории РЦП, то Luxoft собирается в нескольких км. от Дубны на берегу реки Дубна построить поселок из таунхаусов для своих сотрудников.

По моему – красота! Причем вполне осуществимая и, что очень важно, материально обоснованная.

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

3. Технопарк (как правильно называется проект не знаю). Технопарк должен стать полигоном высокотехнологических разработок, в частности области энергетики (ну и, наверно, ядерной физики). К программному обеспечению он прямого отношения не имеет, но программисты явно потребуются и туда. Будет располагаться рядом с РЦП. Больше про него, к сожалению, ничего не знаю.

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

Итог: Очень порадовало то, что за словами о развитии IT в России стала видна материальная обоснованность для конкретных игроков, что, на мой взгляд, является основным для реализации проекта. Будет ли это в результате Бангалор или Кремниевая Долина на текущем этапе не так уж и важно.

Tuesday, April 03, 2007

Вы слышите меня, Бандерлоги?

"История про Google AdSence" или "Вот так и сотрудничай с Гуглом...»

На одном из сайтов была вовремя неотмодерированная информация. Причем не особо страшная - не порнография (в моем понимании контента для взрослых там не было), не реклама таблеток непонятных, но вот в URL-е содержала "nude-girls". Гуглу информация не понравилась и реклама на сайте была заблокирована.

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

Неделю назад руки все-таки дошли известить Гугл о том, что все исправлено, более безобразие не повториться и с просьбой разблокировать рекламную кампанию на сайте. И вот пришел ответ:

Большое спасибо за Bаше письмо.

Так как Ваш сайт ранее нарушил правила программы, мы не сможем восстановить показ объявлений на данном сайте, даже несмотря на то, что требуемые изменения были внесены.

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

Пожалуйста, учтите, что мы не сможем изменить наше решение или ответить на дополнительные вопросы по данному случаю.

Спасибо за Ваше понимание.

И после этого можно серьезно говорить о базировании бизнеса на сервисах Гугла?

Wednesday, February 28, 2007

Объектно-ориентированному дизайну пора потесниться

Явно пришло время изменений. Предыдущий пост был про идею новой методологи разработки, а сегодня пришло время пересмотреть основы программирования и дизайна – OOP и OOD.

Большинство изменений происходят постепенно. За текучкой мы эти изменения не замечаем.

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

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

Основная проблема – область видимости. Закон инкапсуляции гласит, что все внутреннее устройство объекта никого не интересует и должно быть запрятано внутрь. Однако им приходится часто поступаться - ради возможности протестировать работу приватного метода, его приходится делать публичным. Т.е. теперь все внутренне устройство становится интересно тесту.

Самое неприятное - когда красиво спроектированную архитектуру приходится портить ради тестов. Какой выход из этой ситуации?

Для того, чтобы не ломать архитектуру UnitTest-ы класса можно размещеть в том же юните, что и сам класс. Но такое решение имеет свои недостатки – резкое увеличение объема кода одного юнита, сложность распараллеливания работ над реализацией класса и тестами к нему. Но основная проблема в том, что такое решение подходит только для UnitTest-ов. Для функциональны тестов, использующих объекты, расположенные в разных юнитах нужны дополнительные хитрости – например использование тестовых классов, отнаследованных от тестируемых классов, которые дают публичный доступ ко внутренним процедурам тестируемых классов. Но и тут могут возникнуть проблемы, особенно при сложных структурах наследования. Возможность использовать подобные ухищрения зависит от языка и от утилит тестирования.

Roy Osherove предлагает кардинально другое решение. Он предлагает поменять подход к дизайну и делать его не только объектно-ориентированным, но и тесто-ориентированным. Итак, на замену OOD идет OOTD (Object Oriented Testable Design).

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

Saturday, February 03, 2007

Post-Agile

Это должно было свершиться и это свершилось. В наше время быть "новой методологией" в течении 10 лет невозможно. 10 лет это слишком долго, чтобы называться "новым".

Итак, прощай Agile, здравствуй Post-Agile. Early adopters уже "наигрались" с Agile, перепробовали все предлагаемые практики и методологии в разных комбинациях, и теперь им стало скучно с Agile. На текущий момент определенной новой сформировавшейся методологии нет, но Google уже выдает более 10тыс. результатов по фразе "Post-Agile".

Flow – одна из методологий (или, скорее, идеологий), претендующих на звание Post-Agile.

Сейчас "на коне" web2.0 проекты и цикл их жизни очень сильно отличается от жизненного цикла локальных конечнопользовательских приложений и, еще больше, от жизненного цикла корпоративных систем. Основное отличие в том, что эти проекты не предлагают решения проблем или нужд пользователей, они развлекают, делают жизнь более приятной, красочной, интересной. Многие из них, безусловно, очень полезны, но не необходимы. А так как любая игрушка рано или поздно надоедает - надо пользователям постоянно давать что-то новое, чем-то их привлекать снова и снова, чтобы они не ушли на другой свежий ресурс. Именно на это нацелен Flow:

Картинка из поста "What comes after usability?"

Если честно, меня такая иерархия немного пугает, но, возможно, это именно то, что надо пользователям от игр и ресурсов общительно-развлекательного направления.

Friday, January 26, 2007

ProgressBar и индикаторы выполнения процесса

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

Что должен содержать ProgressBar и индикаторы процесса выполнения (в логическом порядке, а не в порядке важности):

  • 1. Количественный показатель (в штуках, в байтах и т.д.) общего объема данных, которые требуется обработать.
  • 2. Количественный показатель обработанных данных.
  • 3. Количественный показатель данных, которые осталось обработать.
  • 4. Время, потраченное на обработку данных (из п.2).
  • 5. Ориентировочное время обработки оставшихся данных.
  • 6. Визуальное отображение % обработанных данных (собственно сам ProgressBar).
  • 7. Скорость обработки данных.

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

Насколько ProgressBar хорош для пользователя, настолько он является головной болью для разработчика. Хорошо когда есть один процесс в одном потоке, когда заранее известно, сколько данных надо обработать и когда длина шага обработки является постоянной величиной. Но когда ситуация не столь проста могут появиться следующие проблемы:

  • 1. Заранее не известно, сколько данных должно быть обработано. Эта проблема очень часто возникает при запросах к базе данных, когда заранее не известно, сколько данных должно быть возвращено базой. Так же не редка ситуация, когда в вычислительных задачах перебор элементов делается по большому набору критериев, в результате чего заранее точно не известно, сколько данных надо перебрать. В обоих случаях оценить общее количество данных все-таки можно выполнив предварительные вычисления или предварительный запрос к базе. Это, конечно, займет лишнее время, но в большинстве случаев это окупается, т.к. информированный пользователь - удовлетворенный пользователь, а неинформированный будет злиться на "глупую программу" которая повисла и не понятно чего там делает. Минус такого решения - оно не подходит для задач, критичных к общему времени выполнения. Второй минус - появляется дополнительный процесс предварительного подсчета, которому так же может потребоваться свой ProgressBar.
  • 2. В процессе выполнения операции невозможно (или можно, но с серьезной дополнительной нагрузкой на систему) узнать процент выполнения операции. Тут все зависит от архитектуры системы и вопрос возвращения данных для показа прогресса надо закладывать еще в момент проектирования. Встраивание этого функционала в уже готовую систему может быть очень сложным и может потребовать "перекраивания" взаимодействия классов и модулей системы. Более-менее стандартные решения: при запросах к базе данных отдавать информацию постранично; в задачах, работающих в основном потоке поднимать события обрабатывающим классом; в задачах, работающих в отдельном потоке периодически опрашивать поток или посылать сообщения из потока.
  • 3. Процесс состоит из набора подпроцессов. Здесь есть, где разгуляться фантазии.
    1. Можно сделать единый ProgressBar и показывать пользователю только сколько времени осталось до конца обработки всех процессов.
    2. Можно к единому ProgressBar-у добавить индикатор наименования выполняющегося процесса.
    3. Можно сделать отдельный ProgressBar для каждого процесса. Это хорошо когда процессов всего 2, иначе в окне будет слишком много информации, что будет путать пользователя.
    4. Можно показывать один ProgressBar, но перезапускать его для каждого процесса. Дополнительно к нему будет полезен лог с законченными и незаконченными процессами.
    5. Можно объединить первый и предыдущий варианты и показывать один общий ProgressBar, и второй перезапускаемый для каждого процесса.
  • 4. Выполняется параллельно несколько процессов. Раньше эта проблема появлялась не часто и, в основном, при закачке данных. Для вычислительных задач распараллеливание процесса вычисления при одноядерном процессоре большого смысла не имела, т.к. одна задача занимала весь ресурс процессора (ну или столько, сколько ей отводилось системой) и запуск второй, параллельной, задачи пропорционально тормозил выполнение первой. Сейчас при появлении CoreDuo и Core2Duo (а в дальнейшем ядер, похоже, будет все больше и больше) можно и нужно пускать параллельные процессы в разных потоках, соответственно вопрос отображения в одном ProgressBar-е нескольких операций выполняющихся в разных потоках становится очень актуальным. Если единицы измерения количественных данных всех параллельных операций одинаковые и операции имеют единую логическую базу – можно показывать единый ProgressBar с суммарными данными. Что делать с операциями, логически не совместимыми, покажет будущий опыт, а пока у меня красивого решения для такой ситуации нет.

Развлекаемся...

Развлекательные посты - замечательный способ продвижения даже для серьезных сообществ.

Richard Quick, freelance web designer, в своем блоге про дизайн написал забавный пост "How to fake a Web 2.0 logo", который читается именно как развлечение. Пост попал на головную страницу Digg.com, в результате рост посетителей за день с 555 до 47501 захода. Трафик, конечно, обеспечил Digg.com, а вот попадание поста на Digg.com обеспечили, скорее всего, название (тут сразу и Web2.0, и How to, и fake) и хороший развлекательный тон.

Сейчас на головной странице Digg.com 2 первых поста: "Porn-Infected PC Crazy Woman Faces 40 Years - True Story" (с pcworld.com между прочим) и "10 Amazing Things You Didn't Know about Animals".

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

Т.е. пост на серьезную тему прочтут не все, а те, кому тема интересна и в данный момент есть время на осмысление. Пост с развлекательным заголовком прочтут все (или, как минимум, откроют).

PS: Кстати в тему пост "Buzz titles" о том как составить привлекательное название для статьи или книги по IT, ну и для постов тоже.



Monday, January 22, 2007

Блого-зависимость

10 дней практически без интернета явно продемонстрировали отрицательные стороны постоянной "включенности".

  1. Желание что-нибудь почитать (блоги или новости) близко к наркотической зависимости. Рука тянется к иконке броузера, хотя мозг знает, что интернета нет.
  2. В связи с тем, что броузер ничего не показывает, резко возросла производительность труда. Через дней 5 трудотерапия начала оказывать благотворное влияние и рука почти перестала тянуться к иконке броузера.
  3. Появилось много идей по поводу решения тактических вопросов. Похоже, излишнее увлечение блогосферой стимулирует мысли стратегического направления (наверное из-за того, что обсуждается много тем не затрагивающих текущих задач, но рождающих новые идеи "на будущее"), и за этими думами "о высоком" решение текущих проблем становится "текучкой", что отражается на качестве принимаемых решений.
  4. Одинаковые мысли приходят в голову разным людям практически одновременно. Может количество идей (а не ума) величина постоянная при постоянно растущем количестве людей? Окончательно убедилась в том, что если появилась мысль, о которой хочется написать – писать надо сразу же, иначе об этом напишет кто-то другой. При ежедневном прочтении лент это не так заметно, т.к. можно поучаствовать в обсуждении. Но если прошло уже несколько дней, то обсуждение уже закончилось, а поднимать заново тему смысла не имеет т.к. все желающие уже высказались.
  5. Новые блоги, которые хочется почитать, появляются слишком часто. Старые при этом так же читаются. В результате за 10 дней более 200 непрочитанных постов! А ведь если бы интернет был, я бы их прочла. Причем действительно полезной информации в этом потоке очень мало.

Когда то "телевизор нам природу заменил", теперь, похоже, "интернет нам телевизор заменил".

Чуть больше года назад у нашего телевизора сломался пульт. Сразу же были выявлены симптомы нашей зависимости от телевизора – рука хватала пульт автоматически и начинала переключать каналы. Телевизор при этом не включался. Мозг останавливал руку только на 2-3-м нажатии. При этом до поломки пульта мы были уверены, что телевизор практически не смотрим. Оказалось это не так. После этого новый телевизор решили не покупать т.к. нервное щелканье пультом в поисках интересных программ – пустая трата времени. В результате мы уже год не смотрим телевизор.

С интернетом все сложнее. Во первых он нужен для работы, во вторых, в отличии от телевизора, дает доступ к массе полезной и просто интересной информации. Т.ч. побороть блого-зависимость отключением интернета не удастся. Надо как-то искать золотую середину между "постоянной включенностью" и "абсолютной выключенностью".

Sunday, January 07, 2007

Чем бы заняться стартапу

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

На текущий момент основная идея успешного стартапа гласит: Делайте нужное, новое, уникальное и будет вам счастье (если повезет).

Пройдемся по пунктам.

1. Нужное

С первым постулатом про нужное все более-менее ясно. Хорошо бы только определиться кому нужное, но это уже детали, а сам по себе постулат вопросов не вызывает.

2. Новое

Второй постулат про новое сильно связан с третьим про уникальное, и тут начинаются вопросы.

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

  • Пользователям не надо объяснять, что ваш продукт делает и зачем он им вообще нужен.
  • Пользователи сами ищут продукт данной категории и нужно только найти места, где они его ищут.
  • Хорошо работает контекстная реклама т.к. пользователи ищут и чем более "горячая" тема тем больше ищут.
  • Продукт можно позиционировать внутри категории и относительно других известных продуктов данной категории.
  • Пресс-релизы можно делать короткие, но содержательные, концентрируясь на особенностях продукта, а не на объяснении, зачем он в принципе нужен.
  • И если продукт все-таки стал известен, журналистам проще о нем писать.

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

2.1. Повторение - не уникальное и не новое

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

2.2. Новое, но не уникальное

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

3. Уникальное

А теперь самый экстремальный вариант – новый уникальный продукт. Создатели должны очень сильно верить в то, что то, что они делают хоть кому-то нужно. Но даже если это действительно очень нужный продукт, надо о нем сначала как-то известить потенциальных пользователей. Тут ситуации очень сильно отличаются в зависимости от рынка.

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

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