среда, 30 мая 2007 г.

Инструменты программиста

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

Вчера

Давно известный факт – одно изобретение, как правило, придумывается одновременно несколькими людьми. Обычно это любят демонстрировать на примере изобретения телефона. На свой лад я приведу другой пример, что называется, похвалив "свое болото". В университете я занимался разработкой универсальной системы управления: стиральной машинкой, телевизором, освещением и т.п. Закончил тему я на том, что сделал лабораторный стенд и дома, на себе его испытал. Прибор меня будил по утрам. Включал свет, телевизор, пока я собирался в университет. Когда я уходил, то телевизор и освещение автоматически выключались. Вечером, соответственно, с моим приходом домой все автоматически включалось. Побаловался и забросил, про себя отметив, что основным препятствием для такой автоматизации является отсутствие простого и в то же время универсального протокола обмена данными по шине. В те времена я разработал свой протокол. Прошло 2-3 года, и начался ажиотаж вокруг таких устройств. Заговорили, что к Интернету будет подсоединена даже кофеварка, а к нашему приходу домой ванна будет наполняться водой заданной температуры. Помня свой студенческий опыт, я сразу сказал, что это басни и ничего такого еще долго не будет, ибо в основе обмена данными между устройствами упорно предлагался протокол TCP , совершенно не годящийся для таких задач. Прошло еще 10 лет. Только-только стали появляться подобные системы за бешеные деньги. Читаю про них обзоры и ностальгически вздыхаю – работало многое из этого у меня уже тогда, лет 15 назад и стоило не сотни тысяч долларов, даже до 1000 баксов не дотягивало.

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

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

  1. Компилятор. Зачастую и не один. Например, удобно низкоуровневые задачи программировать на C++, а интерфейс пользователя – на Visual Basic и через DLL, COM "склеивать" часть, написанную на C++, с кодом на VB. На сегодняшний день мало кто непосредственно вызывает компилятор, в основном пользуются различными RAD-системами.

  2. RAD-система (например, Visual Studio, Eclipse и т.п.). Сейчас от программиста требуется не просто программировать, а быстро программировать. Без RAD-систем с их удобными конструкторами и мастерами тут уж никак. При том, установить среду надо со всеми необходимыми заплатками, framework’ами.

  3. Библиотеки подпрограмм и наборов классов (VCL, MFC, boost, Fast Report, DevExpress и т.п.) со всеми обновлениями, заплатками.

  4. Обычно у каждого программиста со временем накапливается свой набор библиотек, любимые книги по программированию, список сайтов и форумов, переписка с коллегами. Следовательно, на новом компьютере необходимо настроить папки с путями, установить туда библиотеки, в программе для телеконференций (например, Outlook Express) сделать настройки для подключения к конференциям, настроить электронную почту, ICQ, установить поисковую систему (например, Google Desktop), импортировать закладки в браузер.

  5. Справочная система. Важнейший инструмент программиста. Как программировать без MSDN я уже себе и не представляю.

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

  7. Очень часто требуется знание не только нескольких языков программирования, но и работа с базами данных. Таким образом, вы должны владеть языком запросов к базам данных – SQL. Соответственно, в целях разработки, на компьютере необходимо установить сервер БД (например, MS SQL Server, Oracle) c какой-либо графической консолью для работы с БД. Установить драйвера подключения к БД. После установки СУБД, «залить» на компьютер копию рабочей БД и настроить подключение к ней.

  8. Наверняка может еще понадобиться инсталлятор (Inno Setup, например).

  9. Паковщик exe-файла типа ASPack.

  10. Может быть, потребуется и система защиты от взлома программы (ASProtect, ExeCryptor).

  11. Написание и компиляция help-файлов (HTML Help Workshop).

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

  13. Мелкие программки для рисования иконок, модификации и просмотра различных ресурсов.

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

  15. Профилер, модули тестирования разрабатываемой программы – это все по необходимости. Далеко не все используют это ПО, но, как минимум, знать, что это такое необходимо.

  16. Средства проектирования (типа Visio).

  17. Система баг-трекинга (например, Bugzilla).

  18. Я уж и не говорю о таких программах как архиватор, Far (или Total Commander), принтер, текстовый редактор (писать внутри организационные документы (справки, заявления и пр.), а также всякие readme.txt, install.txt, whatnew.txt), антивирус и пр.

Даже если надо по-быстрому включиться в процесс, то все равно по минимуму надо установить и настроить RAD-систему, систему контроля версий, СУБД, библиотеки. Даже такая минимальная установка все равно потребует минимум полдня, и то, при условии что, все установиться с первого раза, без ошибок. Но скорей всего придется установку "подрихтовать": где-то что-то вручную прописывать, пути менять, задавать переменные окружения и пр.

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

  1. Современные RAD-системы поставляются с уже готовыми настройками для подключения к системе контроля версий (CVS). Более того, интеграция с CVS развивается: в дополнительных окошках показываются версии, легко увидеть разницу между версиями, управлять прямо из среды разработки версиями.
  2. Теперь уже ни у кого не вызывает восхищения поддержка средой разработки нескольких языков программирования, притом компиляторы для них идут в одном пакете за одну цену.
  3. Компоненты для конструирования визуальных форм, для работы с БД, Web.
  4. Раздаются даром довольно таки функциональные среды разработки, СУБД, CVS.
  5. Новые технологии программирования. Например, весьма успешно развивается идея интерфейса для приложений на основе платформо-независимых форматов (HTML, XML), шире используется управляемый код (.NET, Java, даже так называемый MC++ появился). В итоге программы писать легче, меньше надо заботиться о платформо-независимости, распределенные вычисления - и те уже с помощью "визардов" можно запрограммировать. В СУБД можно писать хранимые процедуры не только на Java, но и на C#, VB и т.п. Множество всяких API, предлагаемых Интернет-сервисами, широкое распространение мобильных технологий.
Лично я уже путаюсь в обилии новостей, презентаций новых технологий. Но, тем не менее, направление развития инструментария для программиста просматривается довольно хорошо. Так давайте же займемся предсказаниями и прогнозами!

Завтра

Не придумывая ничего нового, спроецирую идеи той затерявшейся монографии на сегодняшние средства разработки, приплюсовав еще что-то от себя.
  1. RAD-системы поголовно станут клиент-серверными приложениями. Для индивидуальных разработчиков будут выпускаться локальные серверные части RAD-систем. Сервера разработчиков будут обеспечивать всем разработчикам проекта:
    • Совершенно прозрачную поддержку обновлений через Интернет последних версий библиотек, используемого в разработке программного обеспечения, модулей системы.
    • Сервера будут предоставлять весь необходимый набор сервисов для разработки в зависимости от прав доступа разработчика: CVS, bug-tracking, управление генерацией билдов и инсталляционных копий, централизованное хранение документации по проекту, доступ к тестовой БД, доски объявлений, форумы (в том числе с трансляцией Интернет-форумов и т.д.
    • Сохранение профиля разработчика на сервере, так что при смене машины разработчик получит все свои настройки с сервера.
    • Создание и управление набором стандартных профилей для разработчиков. Новому разработчику достаточно будет только установить клиентскую часть системы, а она с сервера автоматически скачает весь необходимый софт со всеми требуемыми настройками, так что разработчик сможет приступить к работе немедленно.
  1. Уже сейчас исходный код сопровождается кучей вспомогательных файлов среды разработки (для Visual Studio это, например, *.sln, *.ncb, *.resx, *.manifest и т.д.). Многие из них представлены во внутреннем формате, который можно разобрать с помощью специальных программ, либо для доступа к ним использовать отдельный API. Следующий шаг - перевести сами файлы с исходными кодами программ во внутренний формат среды разработки. Типа того, что текст храниться ввордовском файле, который без MS Word и не разберешь. Вероятно, что в основе такого формата будет использоваться стандарт XML . Это позволит значительно улучшить форматирование исходного текста программы и позволит предоставить программисту больше информации по коду: по цвету текста, по цвету фона, по шрифту, начертанию.Станет возможным вставка в исходный код сопроводительных рисунков, схем, структур, всплывающих напоминаний, описаний, документации.
  2. Совершенно неважно будет, на каком языке программирования писать программу: можно будет поставить такие операторные скобки: "{}", а можно такие: "begin end". Сервер автоматически приведет синтаксис к единому виду при сохранении в своем внутреннем формате. Возможно, что даже внутри одного файла допустимо будет мешать синтаксис различных языков. Вся прелесть будет не в этом, а в том, что если в клиентской части системы в профиле программиста будет указан C++, то при отдаче сервером из CVS исходного кода программисту, он автоматически будет преобразован к синтаксису C++, а "делфятник", соответственно увидит тот же код, но в синтаксисе Delphi.
  3. Введение внутреннего формата для исходных текстов программы (не волнуйтесь, ручками покопаться в исходниках вам никто не запретит - в ПО включат возможности экспорта/импорта) позволит завязать в единый клубок пока еще разрозненные системы:CVS, bug-tracking, диаграммы, профилер, help-файлы. Информация от этих сервисов будет подсвечиваться, всплывать, мигать в том месте исходного кода, с которым она связана. И, в конце концов, это приведет к введению слоев окна, как в фотошопе - вы будете управлять отображением той или иной информации, включая/отключая соответствующий слой окна.
  4. Весьма вероятно, что управляемый код и не управляемый в некой "золотой середине" сольются. Будущее все же не за фреймворками, но средства управления средой исполнения можно будет подключать к проекту, и они автоматически будут компилироваться в единый exe-файл с программой.
  5. Интерфейс пользователя будет описываться в платформо-независимом формате (на основе XML). Отделение интерфейса от ядра программы позволит запускать программу на различных ОС, при этом ядро программы будет работать как сервер по отношению к интерфейсу. Сервера приложений известны давно, но здесь речь более об интерфейсной части - интерфейсная часть программы прекрасно будет взаимодействовать с ядром программы даже через узкие каналы. Это особенно понравится компаниям с филиалами, которые смогут дешевыми узкими VPN -каналами объединить филиалы единой информационной системой. Притом, скорее всего, будет возможно конвертировать старый код в новый формат! Для частного пользователя ничего не измениться - интерфейс и ядро программы будут по-прежнему поставляться exe-файлом и набором dll. Некоторые читатели сразу проведут параллели с Web 2.0. Сразу скажу, Web 2.0 тут и не пахнет. Основная проблема Web 2.0 не столько в скудной непривлекательности интерфейса, сколько в зависимости от удаленных серверов. Выключите Google- и все: ваша почта, документы, таблицы, календарь вам уже недоступны.Web 3.0 должен научится кэшировать данные локально, синхронизировать локальные хранилища личных данных пользователя с сетевыми хранилищами.
  6. Ну а про СУБД... Да вы и сами видите что твориться - прямо из Visual Studio можно подключаться к серверу БД и редактировать структуру БД, создавать датасеты и в гридах видеть содержимое таблиц.
  7. Для второстепенных утилит (средств защиты программ от нелицензионного использования, паковщиков, обфуркаторов, инсталляторов) серверное ПО для команды разработчиков предложит API, а разработчикам - язык сценариев, планировщик, чтобы можно было автоматизировать процесс сборки билдов, инсталляционных копий и рассылки их тестерам, партнерам, клиентам.
Резюме
У меня нет сомнений в том, что всему придет свое время – идеи той монографии найдут свое отражение в современных инструментах программирования, а наши кофеварки мы все же когда-нибудь сможем запрограммировать через Интернет. "И вот тогда наступят другие времена" (С) В. Познер.