Лекция 11. Информационное-технологическое обеспечение разработки
У меня со всего нашего предыдущего изложения остался один важный долг, который с одной стороны может быть и самоочевиден, но избежать его было бы в методическом плане неверно.
// О! Я нашёл нормальный, вкусный мел! Ну ладно...
До сей поры, когда мы разговаривали на разные темы, связанные с разработкой программ под Линукс, мы изучали инструменты, которые непосредственно влияют на эту разработку, но не очень глубоко касались информационной составляющей: всяких сайтов и т. п.
Те из вас, кто делал домашнее задание, могли заметить, что я ничего, ровным счётом ничего не придумывал в домашних заданиях, а в основном копировал примеры того, что надо делать, из интернетов. Причём это были не просто примеры, а примеры, которые хорошо работали на практике. А вообще интернет был полон информацией разной степени полезности и достоверности.
Когда я говорю, что процесс разработки требует информационной политики, я имею в виду, что она уже есть. Глупо сидеть перед текстовым редакторов и пенять на весь мир за то, что вы не знаете, как что-то запрогать. Есть один большой универсальный инструмент. Он называется Гугл.
Чего мне не хотелось бы касаться в этой лекции:
Всякие низкоуровневые инструменты.
Средства ОС. Довольно большая часть той информационной составляющей, которой вы будете пользоваться, до сих пор довольно хорошо обеспечивается самой операционной системой: маны, инфо, etc.
Средства DE. Другая крайность, о которой тоже подробно говорить не получится — это информационные особенности конкретных средств разработки. Ну не буду же я сейчас рассказывать, как надо работать в Эклипсе!
Анекдот: Я не поехал читать лекции в Моторолу по Embedded Linux. 3 месяца подряд они не могли понять, что им не подходит график. И все эти 3-4 месяца, пока они искали тренера по Линуксу, у них не было ни одного человека, который понимает, что такое Линукс. И при этом они выпустили несколько телефонов на Линуксе.
Это я привёл пример неправильной организации труда.
В Windows поддержка разработки со стороны ОС всегда была никакая, а понятие комьюнити — оно совсем другое, когда речь идёт о закрытом софте.
Информационное пространство
О чём вам может потребоваться информация, когда вы занимаетесь программированием?
ЯП. Ну разумеется о языке программирования.
Инструментарии. Это громадный набор всяких инструментов и немыслимо программировать на том же Qt без годной справочной системы.
ОС. Даже если вы делаете свой проект совсем в отрыве от ОС, что-нибудь кроссплатформенное, вам как минимум потребуется информация об ОС, чтобы не запрогать что-нибудь _не_кроссплатформенное.
Вот это всё в равной степени применимо и к человеку, который в первый раз в своей жизни сел программировать. Если же речь идёт о команде разработчиков, то нужно не забыть и следующий важный пункт:
Техническая документация проекта. Надо хорошо понимать, что чем теснее интеграция в команде разработчиков, тем большее значение имеет вот эта часть информационной поддержки. Это касается в принципе любого сообщества. Если вы как сообщество хотите привлечь в свои ряды побольше членов, то вашей первичной целью должно являться создание удобного для этих людей информационного простраства.
Где искать?
Документация
- поставляемая с ЯП/инструментарием
- встроенная в IDE
Google
Где-где — в Гугле! Почему я с такой уверенностью тыкаю на Гугл? У него есть 3 ценных свойства:- Будучи по своей сути изначально гиковским проектом, Гугл до сих пор сохраняет за собой способность больше других систем ковыряться в программистских информационных помойках. Есть такой замечательный совет: Если в вашей программе в самом неожиданном месте вылезла непонятная ошибка — скопируйте и загуглите её целиком. Весьма вероятно, что вы найдёте самое подробное описание вашей проблемы и её решения.
- Гугл следит за вами. Большой брат. Внимательно, подробно!.. Это, конечно, плохо, но зато, если вы, скажем, на работе, то он будет выдавать одни результаты на ваш запрос, а когда вы дома — другие результаты. Это иногда зверски помогает, когда вы вводите размытый вопрос. Можно ещё и залогиниться! Тогда он будет лично на вас стучать! Я пока не боюсь... ПОКА %)
- У Гугла у самого есть всякие программные наработки и то, что вы ищите, может вполне оказаться на ресурсах Гугла.
- Наверное, Гугл — это не первое место, куда нужно ходить. Просто самое универсальное. Первое место, куда нужно ходить — это ман. Конечно, всё равно большинство сначало лезет в Гугл. Я сам грешу этим. Единственное моё оправдание, что Гугл лучше именно _ищет_.
Документация дистрибутивов
Есть одна тонкость, которая часто спасала меня. Если вы ищете что-то специфическое, посмотрите не только родную документацию для инструмента, которым вы хотите воспользоваться, но и документацию, специфичную для вашего дистрибутива. Многие дистростроители имеют своё мнение по поводу того, как должен работать и где лежать используемый вами инструмент. И это мнение может не совпадать с мнением апстрима. readme.alt¸ readme.debian — это то, куда я довольно часто приземлялся в поиске ответов на нестандартные вопросы.Списки рассылки
- ЯП / инструментария
- Дистрибутива
Сайт
Не стоит сбрасывать со счетов и всякие базовые сайты по тем инструментам, с которыми вы работаете.- Оф-сайт (факушки всякие)
Сайт сообщества (comunity driven)
Место, где сообщество подготавливает всякие советы по поводу того, как работать с вашим инструментарием.
Что изменилось в новой версии и как с этим бороться? В документации boost’а написано, что появились новые фичи. А где искать информацию, почему моя программа, которая на нём работает, перестала собираться? Вот на таких вот сайтах сообщества.
Вот, например, на сайте gcc написано «Мужики, не задавайте сюда вопросы». У нас есть замечательная рассылка. Там вопросы. А здесь ответы.
Участие в рассылках
Да, вам будет приходить какое-то количество писем. Научитесь их быстро читать или проглядывать. Зато когда возникнет какой-то вопрос, вы будете по крайней мере знать, обсуждалась ли эта тема в рассылке.
И вот только если ничего не помогает, вообще-то говоря, не плохо бы спросить. У кого спросить?
В первый раз за сегодня я ссылаюсь на текст, прекрасно написанный Саймоном Г. Тетхемом. В чём идея? Если вы задаёте свой вопрос, имейте в виду, для чего вы это делаете. Есть две такие подспудные цели, которые есть у человека, который задаёт вопрос:
- Человек хочет излить свои эмоции. Никогда так не делайте. Никому от этого не будет лучше. Ни вам, ни разработчикам.
- Решить проблему здесь и сейчас любыми средствами. Привлечь народ. Так тоже не делайте. Возможно и найдутся люди, которые напишут вам код, но правильная цель состоит в том, чтобы научиться решать такие проблемы самому.
Что должно быть в правильно заданном вопросе?
Необходимая, но не полная информация. Все вещи, участвующие в возникновении ошибки должны быть указаны. Но при этом не надо сообщать всё, что вы видели и чувствовали от своего компьютера сегодня. И довольно чётко должно быть сформулировано, что вы хотите.
Всем советую почитать этот документ. Речь идёт о том, что ваш вопрос могут решить в списках рассылки и других интерактивных ресурсах, если вы его достаточно правильно зададите.
IM/Forum/IRC/Jabber-конференция
C давних пор принято у таких олдовых программистов тусоваться в IRC. Почему это не очень хорошее решение проблемы? Нет, сначала — почему это хорошее решение проблемы? Это онлайновый и быстрый способ.
Почему плохое?- Вы, возможно, не нарвётесь на того человека, который способен решить этот вопрос.
- Ваш вопрос останется только в логах конференции, и другому человеку с той же проблемой гугл уже не поможет.
- Есть классы пользователей (учителя) даже достаточно компьютерно-ориентированных, пользующихся только форумами.
- Смысловое наполнение ниже, а уровень информационного шума выше.
Надо иметь в виду, что для каждого вида деятельности существует своя область, в которой проще получить ответ.
И тем не менее, мы сейчас разговариваем о предмете практически в отрыве от того соображения, что речь идёт об открытом и открыторазрабатываемом софте.
Замечание первое: очень часто поиск по гуглу, поиск по ошибке или по основным ключевым словам, приземляются в места, содержащие исходный код или места, где ведётся разработка. Это может означать то, что либо с вашей проблемой никто не сталкивался, либо то, что этот кусок кода на самом деле не связан с вашей ошибкой. Это не хорошо или плохо. Это просто такой кивок в сторону.
Второе. Как сказал Дима Левин: «На Си уже никто не пишет, только форкают готовое». Но факт остаётся фактом, когда вы начинаете разработку, вы используете уже готовые куски кода и дорабатываете их. Особенно это относится к ситуации, когда вы не только дорабатываете код, но также и обнаружили в вашем инструменте какие-то ошибки или хотите от него новой функциональности — то есть каким-то образом включились в разработку этого инструмента.
При условии отсутствия нехватки времени, это довольно хорошая ситуация, если вы сами можете взять и поправить эту ужасную багу.
Есть два решения:
- выкинуть и заменить на системное
- форкнуть и сопровождать
Опенсорс в стиле 90-х годов прошлого века представляет собой следующую картину. Люди просто складывают все необходимые инструменты в одно место и начинают всё там переправлять, включая gcc. Особенно этим славятся американские разработчики, работающие на военку.
По-моему собственному опыту ситуация, когда вы форкаете и сопровождаете свою разработку, гораздо хуже ситуации, когда вы разрабатываете патч и пропихиваете его в апстрим. В глобальной перспективе это оказывается полезнее.
Здесь совмещаются две ваших роли: роль ваша как разработчика собственного проекта, так и роль ваша как разработчика того софта, который вы используете. Большие и серьёзные люди как правило являются участниками очень большого числа проектов. Такие разработчики являются участниками как минимум нескольких сообществ, участвуют в разработке своего дистрибутива и т. д.
Есть также вещи, которые вы не найдёте в интернете. Это всякие учебники и методички. Их так же нельзя сбрасывать со счетов. Интернет, конечно же, тоже полон всякими методическими пособиями. Только нужно хорошо представлять себе, что они могли быть написаны 10 лет назад и информация в них могла несколько устареть.
Ещё очень полезно брать и читать чужой код. Особенно тем, кого от этого не тошнит в духе «Ну что это такое? Как это можно читать? Этот человек писал ногами».
Отдельным пунктом нашей программы является то, что я бы назвал «велосипедным паком». Я уже говорил о том, что большинству профессиональных программистов приходится изготавливать за свою жизнь кучу велосипедов. В этом есть смысл, потому что программирование таких велосипедов на новом инструментарии позволяет хорошо разобраться с инструментарием и при этом никому от этого не будет больно. Попробуйте разобраться с Qt в процессе реальной активной разработки!
Разработка проекта
Давайте мысленно пробежимся по тем штукам, о которых мы уже говорили на лекциях. И подумаем, какое инструментальное обеспечение нам может понадобиться.
Хранилище кода
- github
- gitorius
- bitbucket
- launchpad
- sourceforge
- Они удобны для индивидуальной разработки.
- Они хороши, когда у вас такая более или менее спонтанно собирающаяся команда. Команда есть, цель есть, но тратить время на то, чтобы как-то оптимизировать процесс разработки, у вас нет никакого желания. Такого рода сервисы предлагают вам готовые решения для совместной разработки.
Вторая опция состоит в том, чтобы развёртывать собственное хранилище кода.
Когда вас становится больше троих, внезапно выясняется, что у каждого должно быть своё хранилище кода и возможность работать с общим репозиторием. У вас должна быть некоторая услуга предоставления хранилища кода. Типичный пример такого инструментария — это gitalite. На нём ведётся разработка ядра. У gitalite'а есть ещё одна удобная особенность — он управляется гитом. Вот тот же гит, только администраторский. Помимо gitalite есть ещё gitlab — это такое поделие, представляющее собой gitalite + морда на RubyOnRails. Это уже модно, это всякие фишечки и плюшечки.
Это всего лишь примеры. На самом деле любой приличный CVS и DCVS имеют серверную составляющую и для них написано некоторое количество обвязок.
Информационный обмен
Я сейчас говорю об информационном обмене в процессе разработки. Понятно, что для этого используются всё те же списки рассылки. Всё те же сайты, на которых откладывается стабильная информация. Активно используются всякие мессенджеры.- Mailman
- EJabberd (он кошерный, на Ерланге написан...)
Помимо этого есть ещё инструментарии, связанные со спецификой разработки. В первую очередь это всевозможные багтрекеры.
Отслеживание ошибок
Это очень важный инструмент, который позволяет упростить и систематизировать информационный поток, связанный с запросами или ошибками. Это одно из тех мест, где происходит основное коструктивное общение разработчиков друг с другом и пользователей с разработчиками- Bugzilla
- RT
- ORTS
- Mantis
- Gnu(s) (давно уже не используется)
Наконец два последних пункта:
Мы ничего не поговорили про управление разработкой проекта. Инструментов, которые управляют разработкой, бесконечно много. Это называется project management. Во-вторых, это дело уже не совсем программиста, а скорее менеджера. В-третьих, в зависимости от особенностей процесса разработки может быть выбран тот или иной инструмент. А в-четвёртых, я теряюсь..
Комбайны. Они существуют разные. trac — это такая штука, в которой есть и вики, и система отслеживания ошибок, и система отслеживания процесса разработки, и ручки к VCS’у. Это такой комбайн, достаточно простой, который позволяет быстро развернуть процесс разработки, как с информационной поддержкой, так и с инструментальной. Ещё один пример: roundap. Другая группа комбайнов, которая вообще совмещает в себе всё и сразу. В них есть составляющая для работы с кодом, составляющая для работы с пользоваталями и т. д. Я знаком только с одним гнездом, свободным в этом плане. Это redmine и его форк, который называется chilyproject. Это здоровенные комбайны, обучение эффективному использованию которых — отдельная серьёзная
задача. Она написана на RubyOnRails. Ещё она каким-то образом привязана к мозгам менеджеров. Ещё менеджеры любят Atlassian, но она несвободная.