Давным-давно, в одной далекой-предалекой Галактике…
Все началось довольно прозаично... было желание доработать программный продукт, но не было ни малейшего представления, как оно там все устроено... и это было давно, очень давно...
Году наверное в 2003-м... к тому времени я уже довольно таки долгое время являлся пользователем дистрибутива Slackware, так что о том как собирать ПО я знал уже неплохо, но вот знания "си" мне сильно не хватало (забегая вперед признаюсь, я и сейчас его не очень то знаю :) . Тем не менее сильно хотелось добавить одну полезную для меня фичу в Midnight Commander. А именно опцию сортировки файлов, когда первыми идут "исполняемые файлы", как это сделано например в far. С помощью аськи, глупых вопросов к приятелям-сишникам и упорства достойного лучшего применения, худо бедно удалось сделать то что хотел... хотя и криво... Но главное оно работало! (какой же кайф угробить 2 дня но сделать то что хотел)
Больше к mc я не притрагивался остановившись на достигнутом... Шли годы... :)
ASUS wl-500gP
В какой то момент времени, года 2-3 назад, я стал счастливым владельцем забавной белой коробочки, с гордым названием - Asus WL500g Premium. Т.к. с родным mc из репозитария oleo все было совсем "не очень", то пришлось садиться и пилить чтобы можно было худо бедно иметь возможность работать с именами в UTF-8... Попилить пришлось изрядно ибо с UTF-8 патчами от Дебиана и FC собираться mc на коробочке наотрез отказался, было не просто, но я таки асилил... (сам был в шоке:) ). Учитывая практически нулевое знание си, процесс несколько затянулся. Но когда все было закончено результат в виде готового пакета я выложил на соответствующем форуме, для таких же страждущих UTF в mc на "коробочке".
В результате ковыряний я конечно не изучил си, просто понял что в принципе достаточно немного упорства и терпения чтобы делать небольшие патчи. Главное не ломать слишком сильно систему и пользоваться приемами XP (Extreme Programming) такие как Непрерывная работоспособность кода и т.п. Так я и решился взяться за первый проект под "коробочку" это легкий DC++ клиент который мог бы работать на совсем дохлом железе, имел хорошую поддержку национальных языков и мог раздавать и принимать файлы частями и из разных источников. В качестве концепции была выбран подход утилиты wget, т.е. отдаем ссылку утилите, а она дальше занимается всем сама и завершает работу, когда дело будет сделано. Так родилась идея консольного DC++ клиента dcget. Отсмотрев множество легковесных открытых проектов, был найден ShakesPeer, который является клиент-серверной реализацией DC++ клиента, в основе которого лежит общение через сокеты UI и собственно движком который занимается закачкой и раздачей контента.
Вот его то я и решил форкнуть, добавив недостающего мне функционала. Задача была не такая сложная, но навигация по чужому коду доставляла множество неудобств, требовался подходящий редактор. Мне очень не хватало редактора похожего на редактор far со сходными сочетаниями клавиш, и его возможностями работы с исходным кодом, вроде перехода к определению функций и прочих приятных мелочей присущим удобным редакторам. Чтобы совсем уж не бедствовать я настроил в vim необходимые средства превращающие его в IDE и потихоньку им пользовался. Но тяжело переучивать старую собаку новым трюкам. Помнить на автомате 3 набора горячих клавиш для меня оказалось просто непосильной задачей, причем бывало что поработав в far я на автомате портил текст в vim и наоборот... бывало что без мата не обходилось (где то я это уже говорил...:).
Midnight Commander
Тем временем я наткнулся на новость на opennet о том, что появилась новая версия mc с дополнительными патчами, вроде раскраски файлов и прочих полезных мелочей, (многие из которых, кстати говоря, уже были в моей сборке под "коробочку") и решил связаться с командой в плане "поделиться опытом" и отдать пару своих мелких патчей из сборки под WL500gP. Как оказалось ребята были "дружным молодым, перспективным коллективом" (™) :) с которым просто найти общий язык и взаимопонимание. Все что нужно было сделать чтобы вступить в команду это сделать приватный и публичный ключ и отправить полученный публичный ключ Патрику Винертзу, чтобы меня зарегистрировали на сайте Миднайт коммандера и я получил доступ на запись в git репозтарий. Так вот все и началось...
Итак, что было в сухом остатке: неумение пользоваться git, незнание языка си, опыт программирования на многих языках и большое желание сделать mcedit более удобным в использовании редактором, имеющим тот же набор фич что и far. Первый принятый мой патч был как раз патч реализующий отображение исполняемых файлов в начале списка. На этот раз патч был реализован идеологически верно и не являлся грязным хаком. К счастью в команде были те, кто отсматривал мои патчи и проводил большую работу по ревизии моего кода без них я бы наверное не осилил бы и десятой части написанного. В результате у меня появился редактор полностью удовлетворяющий мои потребности в плане использования его в качестве IDE. И что самое интересное - практически всё что мне было нужно там и так было, только зарыто так глубоко что и не добраться, либо в немного "недопиленном" состоянии. В общем, чем больше капался с текстом редактора, тем больше находил недореализованных фич, иногда бывало забавно, что доделав очередной патч находил подобную же реализацию, в самом неожиданном месте, после чего удалял свое и дорабатывал то что есть до нужной кондиции... Подход в основном был такой - по максимуму сделать свой код простым и понятным для дальнейшего сопровождения и по максимуму вписывающимся в общую концепцию и стиль проекта.
Так вот я и стал типичным красноглазым опенсорсником :), вечером кодинг для души, днем написание отчетов и форм в компании где я работаю.
Выводы
Кстати говоря, писать открытый код, это просто халява с точки зрения программиста :), все что нужно как правило было написано до тебя, и надо всего лишь найти нужный тебе код и удачно скопипастить :) Я понимаю конечно что все рано или поздно надоедает и заканчивается... даже самые интересные вещи. А есть еще и совсем неинтересные, типа поиска и исправления не очевидных и сложно-повторяемых багов, но что поделаешь попав в секту так просто из нее не выбраться :)) Но надеюсь произойдет это, не раньше исправления последней критической проблемы, как то пока не хочется подводить ребят...
Работа в команде это конечно отдельная тема... интереснейший опыт с точки зрения программиста - ревизии кода, парное программирование, обсуждения задач и способов возможной реализации и прочия-прочия-прочия...
fin
PS: вот так вот, получив нужный и удобный инструмент для работы над своей поделкой - dcget, потерял, практически полный, к ней интерес... се ля ви :)