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


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 
Показаны сообщения с ярлыком рост. Показать все сообщения
Показаны сообщения с ярлыком рост. Показать все сообщения

вторник, 10 февраля 2015 г.

Во сне мы учимся

Что бы ты не делал, не учил. Сегодня - тот день, когда надо выложиться по полной. Игнорируя тот факт, что нифига не получается. Пробовать, даже нет - делать до последнего. Даже если чувствуется потолок и развитие не идет. Еще чуть-чуть. До полного отключения мозга :) И еще чуть-чуть после этого. Ща объясню зачем...

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


А вот и пруф. 

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

Вот как я играл вчера вечером (всего где-то часа два играл), первые 15 минут было видно как получается, а потом сплошное задротство без видимого результата. На аудио первые 20 минут, все остальное в таком же ритме :) 


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

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


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

Я уверен, что так со всем, потому что так работает наш главный CPU - моцк. Где-то даже читал, что ночью мозг работает еще интенсивнее, чем днем. Он разбирает полученный за день опыт. А опыт - это большое количество фейлов. Но если его не нагрузить этим самым достаточным количеством фейлов, то он не сможет сформировать картину мира и не будет знать как действовать. Вот почему надо продолжать фейлиться (собирать знания о мире) не смотря ни на что. Завтра утром все станет на свои места. Не даром говорят "утро вечера мудренее"...

Про опыт, повторюсь, но картинка настолько клевая...


А вот что разучивал...

суббота, 11 января 2014 г.

Возвращаясь назад


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

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

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

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

И тут спустя пару дней я гуляю с Другом и хочу перейти через дорогу. Но прям на пешеходном переходе стоит маршрутка. У них так принято стоять - тут как бы конечная. И если их собирается больше двух – один из них вынужденно преграждает пешеходный переход. Понаблюдал – все пешеходы просто обходят его. Привыкли? Может. Я не привык – потому постучал в маршрутку, извинился, что перебил его и сказал, что его машина стоит прямо на пешеходном переходе. Он закрыл двери, завелся и проехал 3 метра вперед (там уже место освободилось). Я ему кивнул, спасибо. И тут я получил инсайт. Инсайт о том, каким должен быть фидбек. 

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

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

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

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

В будущем, уверен, будет много автоматических фидбетчиков. Один из хороших фидбеков – стоимость того, что кто-то уберет за тобой. Или, более привычно, штраф. Кинул мусор, а на телефон тут же пришла смска – «С вашего счета снято 0.01% ваших сбережений. Вы можете намусорить еще 9 999 раз. Спасибо, что поддержали наш город. И линк на интерактивный тренинг, объясняющий, почему брошенный мусор – это не ок». И не важно, как это случилось – факт заметила камера, а там какая-то программа распознала лицо Автора, связала его с личным счетом в банке, сняла стоимость операции, отправила смс на телефон, выложила на личной страничке соцсети – «Смотрите как я только что кинул бумажку на пол».

Ну, или может сделать чуть иначе. Сначала выслать смс «Вы только что кинули бумажку на пол. Поймите, Вы живете в этом городе не потому, что Вы тут можете купить/снять квартиру, найти работу, а потому, что другим комфортно рядом с Вами. Мусор – это не комфортно. Получите -1 в карму. Чтобы исправить ситуацию, уберите за собой. У вас есть осталось 0:59… 0:58… 0:57… »……. Не убрал? «Вы не убрали мусор. Получите -1000 в карму. Ваш кредит доверия в этом городе составляет 99000. Вы можете исправить ситуацию, если пройдете наш тренинг по чистоте на этой неделе - станете Волонтером и поможете в уборке соседнего поселка от мусора» Что будет, если кредит доверия опустится к 0 – значит не время еще быть в этом городе. 

Пока фрирайтил этот текст - вспомнился фильм про людей, у которых время оставшейся жизни и деньги – это одно и то же. Часы тикают на руке. Временем можно расплачиваться за услуги. Люди собираются в округи по количеству часов/денег, которые у них есть. Более богатые в крутополисах. Самые бедные в Гетто, без возможности выбраться. Бедные беднеют, а богатые становятся богаче.  Пример не очень хорошей реализации. Как всегда хорошую идею для масс можно опошлить реализацией, которая удобна единицам людей.

Если чуть отвлечься и вернуться к началу – там я сказал «2 недели. Больше я не могу в Черновцах». Я очень люблю этот город – с ним связана большая часть воспоминаний моей жизни. Тут остались все мои Друзья, которых люблю, ценю, за которыми скучаю. Но кроме них, выражающих мысль без мата, следящих за чистотой, часто думающих о комфорте окружающих, тут появились новые люди. Они приехали в город из соседних поселков, руководствуясь теми же принципами, что и я  переезжая из провинциального города в столицу-Киев. Они, как и я не тут выросли, они еще не готовы тут жить, но уже живут – у них кредит доверия, который никто не проверит по истечению триального периода. На улицах слышен мат, ругань, видно как люди мусорят, хамят, не слушают друг друга, много пьют. В разговоре преобладают темы из самого низа пирамидки Маслоу – где поесть/посрать, как получить денег на шару, где замутить подругу на вечер, переночевать и при этом не получить в табло. И это не проблема. Это даже не противно слышать. Это нормальные все вопросы. Когда эти вопросы будут закрыты (есть что поесть и ничего за это не будет), человек начинает задумываться о том, что ему необходимо чтобы его любили, потом ему хочется признания/уважения, дальше ему хочется развития, после он видит красоту/гармонию в своих действиях, и только потом ему открывается вопрос о смысле жизни – кто я, зачем тут, какая моя миссия?

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

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

Но можно вернуться в свой родной город и принести в него частичку того, что понял в большом городе. Во так стараюсь каждый свой приезд зажечь Друзей тем, что увидел и попробовал там, в столице. Это и «тренинг» в моей прошлой компании и каждый день с кем-то из Друзей с обсуждением их задач/целей/ценностей но методами, о которых тут не слышали. Каждый вечер. Пока это то, что могу сделать. Внести частичку сомнения в обычный мыслительный процесс родного города. Показать, что можно еще как-то. Показать увиденную мной причину и следствие. Попросить попробовать что-то новое. И надеяться, что это хоть как-то помогло. Но этого недостаточно. Завтра я поеду назад, а Черновцы останутся в Черновцах.

Надо делать что-то еще. Что? Вот пишу блог. Делюсь переживаниями. Говорят, он помогает. Мне так точно. А читателю? Стараюсь делать свою работу лучше всех, а если нет желания делать ее лучше всех – ищу ту, что сильно захочу. Каждый день задаю себе вопрос – что я могу сделать лучше всех сегодня. И делаю.

Вот сегодня Мама рассказала, что открутила крышку сифона умывальника и поставила под умывальник ведро. В умывальнике часто моется посуда, вода жирная. За пол года жир забивает трубы и в ванной не возможно купаться – вода не уходит. Канализация ванной и умывальника связаны. До стояка больше 5 метров почти горизонтальной трубы. Конечно, забьется. И то, что придумала Мама – это решение проблемы. Не поспоришь. А весной – говорит – вызовем сантехника. Но, блин, блин! БЛИН! Нельзя так. Все должно сливаться автоматически. Это я как ленивый программист говорю. Кинул комп и сделал так, как должно быть. 2 часа ушло. Разобрал все трубы (благо пластиковые), по колено в грязи, но все же трубы прочистил. И получил свое удовольствие. В чем мораль. А в том, что люди привыкают жить так, как умеют и нет никого, кто бы сказал, что можно жить как-то еще. Кого-то извне.      

Стоит чаще возвращаться в родной город. Назад. Не отдыхать, а менять. Не на 2 недели, а на месяц, два, три. Что еще?

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

Тех, кто готов, перетягивать в Киев. Волшебнного пенделя дать. Они уедут, пропадут на год-два из жизни Черновцов, но потом будут активно возвращаться в родной город, как вот делаем мы. Но возвращаться будут уже совсем другими. Есть кандидаты. Дать им пенделя. Что еще?...

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

А интересно, кто вообще происходят процессы просвещения в нашей стране? Кто занимается тем, что делится информацией? Уверен, что для разных слоев населения есть свои инфоканалы. В какой области шарить знания мне? Пойти в вуз большого города? Пойти в вуз маленького города? В школу? А может быть в детдом/интернат? А объехать села и поговорить с тамтешними учителями (допустим информатики)? Сколько времени надо, чтобы объехать все учебные заведения, повлиять на их программу? Не проще ли создать свою школу. Онлайн школу. Школу в которой можно стать айтишником не зависимо от того, что где ты родился, с кем ты вырос, кем хочешь стать, в будущем…

Онлайн школу ликвидации информационной безграмотности. Именно информационной, а не компьютерной. Айтишники сейчас – это те Украинцы, которые понимают, что в сети есть все что хочешь – любая информация как сделать и люди, которые помогут этого добиться. Первая задача, с которой стоит определиться - никто сейчас не говорит куда мы плывем. Был СССР – там было все четко. Все работали на одно общее дело. Все знали что делать. Или не знали? Я помню только то, что работа была у всех в моей семье и не было разговоров на тему «я ХЗ что делать?» Сейчас – каждый делает то, что хочет, что считает нужным. Кто-то, кто более пробивной – находит связи, информацию, пробует, ошибается, пробует, получается, преуспевает. Но это единицы. Другие просто плывут по течению.

Вот вчера общались с Друзьями. Два айтишника и два не айтишника. Не айишники были удивлены тому, что мы им сообщили по поводу их работы – оказывается в сети есть масса интересных программных продуктов, которые позволяют делать работу неайтишников качественно иначе. Я заметил тот интерес в глазах, это было не поддельное чувство «ммммм, а что если попробовать». А почему я знаю, что есть такая возможность, а другой человек не знает? Кто такой айтишник? Не программист, нет!  Это человек, который умеет работать с информацией. Он не скажет никогда «это не возможно» - он скажет «дай мне время, я поищу». Он интересуется новинками, он скрещивает различные идеи лишь для того, чтобы посмотреть, а будет ли это кому-то интересно? Но айтишник ничего не может решить сам – его сила в единстве с человеком из домена. Кто это? Сантехник, Доктор, Бибиотекарь, Учитель, Продавец, Хореограф, Родитель, Психолог, Инженер, Бизнесмен, Милиционер, Уборщица – кто угодно. Все они опытны в своем деле, но понятия не имеют о возможностях, которые появились последние 5-10 лет, которые появятся еще лет через 10.

Надо им помочь.

На этом пока остановлюсь… Пока фрирайтил слушал Madonna. Спасибо ей за это!

вторник, 22 января 2013 г.

Сегодня суперкод - завтра говнокод

Сегодня знакомились с новой группой Java тренинга в КПИ. На этот раз был приглашен в качестве гостя, чем бесконечно рад. Но не об этом сейчас. А о том, что случилось на этой встрече. Цель собрания была познакомиться, сделать коллективно code review, после чего ребята самостоятельно могли бы общаться и решать поставленные задачи. В ходе code review мы зацепили тему Don't Repeat Yourself, а так же магических констант. Не сдержался - показал свой код 10 летней давности. Код все того же фрактального проводника, который писал во времена студенческие. Писал я его на Delphi7. В общем, я его просто тут оставлю и все станет понятно...
type
  TPal = array [0..511] of TColor;
  TSavePalRec = array [1..50] of record
    Color:TColor;
    X:Integer;
  end;
//---------------------------------------------------------------------------------------------
var
    PalProp:record
        mT, mW, mH, mW05:integer;
    end;
    ClkX, ClkY:integer;
    bMovePan, bDouble:boolean;
    SavePalRec:TSavePalRec;
    pan:array [1..100] of record
        x:integer;
        col:TColor;
    end;
    CountPan:integer;
    bDown:boolean;
    bIncDec:boolean;
    RedPos, GreenPos, BluePos:integer;
    RedCount, GreenCount, BlueCount:integer;
    ColArrR, ColArrG, ColArrB:array [0..1024] of byte;
    bMoveR, bMoveG, bMoveB:boolean;
    bmp:TBitMap;
//--------------------------------------------------------------------------------------------- 
 const NumbColor=19;
      ColorArray:array [0..NumbColor - 1] of TColor=($FFFFFF, $00FFFF, $FF00FF, $FFFF00, $0000FF, $FF0000, $00FF00, $C0FFFF, $FFC0FF, $FFFFC0, $C0C0FF, $FFC0C0, $C0FFC0, $C000FF, $00C0FF, $00FFC0, $C0FF00, $FFC000, $FF00C0);
//---------------------------------------------------------------------------------------------
function TForm2.CreateAndSortPanel(X:integer; bRepaint:boolean; cl:TColor):integer;
var i, j, tle, le:integer;
    col, tcol:TColor;
begin
    for i:=1 to CountPan-1 do // определяем после которого маркера будет создаваемый
        if (pan[i].x < X) and (X < pan[i+1].x) then break;

    if i = CountPan then Exit; // если после последнего то выходим

    Result:=i;

    if (pan[i+1].x - pan[i].x) < PalProp.mW+2 then Exit;  // если маркер некуда втиснуть между двумя ближайшими то выходим
    if ((pan[i].x + PalProp.mW+1) > X) or ((pan[i+1].x - PalProp.mW-1) < X) then Exit; // очень близко ставить маркер возле соседнего нельзя

    le:=pan[i+1].x;
    col:=pan[i+1].Col;
    pan[i+1].x:=X;
    pan[i+1].Col:=cl;

    for j:=i+2 to CountPan do begin
        tle:=pan[j].x;
        tcol:=pan[j].Col;
        pan[j].x:=le;
        pan[j].Col:=col;
        le:=tle;
        col:=tcol;
    end;

    CreatePanel(pb.Width);

    CurrentPan:=i+1;

    pan[CountPan].Col:=col;
    if bRepaint then begin
        RepaintPan(CurrentPan);
        RepaintPalitra(i, i+2);
    end;
end;
//---------------------------------------------------------------------------------------------
procedure TForm2.RepaintPan(Num: Integer);
var x1, x2, y1, y2:integer;
begin
    if Num = 1
        then x1:=0
        else x1:=pan[Num-1].x + PalProp.mW05+1;
    if Num = CountPan
        then x2:=pb.Width
        else x2:=pan[Num+1].x - PalProp.mW05-1;
    y1:=PalProp.mT + 1;
    y2:=PalProp.mT + PalProp.mH + 1;

    bmp.Canvas.Pen.Color:=clBtnFace;
    bmp.Canvas.Brush.Color:=clBtnFace;
    bmp.Canvas.Rectangle(x1, y1, x2, y2);

//    if Num = CurrentPan
//        then bmp.Canvas.Pen.Color:=clRed
//        else bmp.Canvas.Pen.Color:=clBlack;
    bmp.Canvas.Pen.Color:=clBlack;
    bmp.Canvas.Brush.Color:=pan[Num].Col;
    bmp.Canvas.Rectangle(pan[Num].x - PalProp.mW05, y1, pan[Num].x + PalProp.mW05, y2);

    x2:=x2 - x1;
    y2:=PalProp.mH+2;
    BitBlt(pb.Canvas.Handle, x1, y1, x2, y2, bmp.Canvas.Handle, x1, y1, SRCCOPY);
end;
//---------------------------------------------------------------------------------------------
procedure TForm2.RepaintAllPan;
var i:integer;
begin
    bmp.Canvas.Pen.Color:=clBtnFace;
    bmp.Canvas.Brush.Color:=clBtnFace;
    bmp.Canvas.Rectangle(0,
                         PalProp.mT + 1,
                         pb.Width,
                         PalProp.mT + PalProp.mW + 1);
    for i:=1 to CountPan do begin
//        if i = CurrentPan
//            then bmp.Canvas.Pen.Color:=clRed
//            else bmp.Canvas.Pen.Color:=clBlack;
        bmp.Canvas.Pen.Color:=clBlack;
        bmp.Canvas.Brush.Color:=pan[i].Col;
        bmp.Canvas.Rectangle(pan[i].x - PalProp.mW05,
                             PalProp.mT + 1,
                             pan[i].x + PalProp.mW05,
                             PalProp.mT + PalProp.mW + 1);
    end;
    BitBlt(pb.Canvas.Handle,
           0,PalProp.mT + 1,
           pb.Width, PalProp.mH,
           bmp.Canvas.Handle,
           0, PalProp.mT + 1, SRCCOPY);
end;
//----------------------------------------------------------------------------------------------------------------------------------------------------------
procedure TForm2.RepaintPalitra(Num1, Num2:integer); // перерисовка
var i, j, a, b:integer;
begin
    if Num1 < 1 then Num1:=1;  // проверка выхода за пределы (они есть в Panels_onDblClick)
    if Num2 > CountPan then Num2:=CountPan;

    b:=pan[Num1].x;
    for i:=Num1 to Num2-1 do begin
        a:=pan[i+1].x - pan[i].x;
        for j:=0 to a do begin
            bmp.Canvas.Pen.Color:=ColorChange(pan[i].Col, pan[i+1].Col, a, j);
            bmp.Canvas.MoveTo(b+j, 0);
            bmp.Canvas.LineTo(b+j, PalProp.mT);
        end;
        b:=b+a;
    end;
    BitBlt(pb.Canvas.Handle,
           pan[Num1].x, 0,
           pan[Num2].x - pan[Num1].x, PalProp.mT,
           bmp.Canvas.Handle,
           pan[Num1].x, 0, SRCCOPY);
    if not Form1.bFirstLoad then SaveChangeToMainForm;
end;
//---------------------------------------------------------------------------------------------
procedure TForm2.SaveChangeToMainForm;
var i:integer;
begin
    for i:=0 to 511 do
        Form1.pal[i]:=bmp.Canvas.Pixels[i, 1]; // заганяем новую палитру
    Form1.DrawFromArray(Form1.FractArr, Rect(0, 0, Form1.pb.Width - 1, Form1.pb.Height - 1), Form1.Bmp);
    Form1.pbPaint(self);
end;
//---------------------------------------------------------------------------------------------
procedure TForm2.RandomPalitra;
var i, j, k:integer;
    r:real;
begin
    if cb1.Checked
        then begin
            Randomize;
            CountPan:=2;
            pan[1].x:=0;
            pan[1].col:=RGB(Random(256), Random(256), Random(256));
            pan[2].x:=pb.Width;
            pan[2].col:=pan[1].col;

            k:=Random(10) + 3;
            r:=pb.Width / (k + 1);
            CreateAndSortPanel(9, false);
            for i:=1 to k do begin
                j:=Round(i*r);
                if Random(2) = 1 then CreateAndSortPanel(j - PalProp.mW - 1, false);
                CreateAndSortPanel(j, false, ColorArray[Random(NumbColor - 1)]);
                if Random(2) = 1 then CreateAndSortPanel(j + PalProp.mW + 1, false);
            end;
            CreateAndSortPanel(pb.Width - PalProp.mW - 1, false);
            RepaintAllPan;
            RepaintPalitra(1, CountPan);
    end
    else begin
        if Form1.smnPerelyv.Checked then Form1.smnPerelyvClick(Self);
        RedCount:=Random(9)+1;
        GreenCount:=Random(9)+1;
        BlueCount:=Random(9)+1;
        RedPos:=Random(511)+1;
        GreenPos:=Random(511)+1;
        BluePos:=Random(511)+1;
        bMoveR:=Random(2)=1;
        bMoveG:=Random(2)=1;
        bMoveB:=Random(2)=1;
        ChangeParam;
    end;
end;
//---------------------------------------------------------------------------------------------
function ColorChange(col1, col2: TColor; R, i: real): TColor;
var cr, cg, cb:real;
    cr1, cg1, cb1:byte;
    cr2, cg2, cb2:byte;
    dcr, dcg, dcb:byte;
begin
    cr1:=GetRvalue(col1);   cr2:=GetRvalue(col2);
    cg1:=GetGvalue(col1);   cg2:=GetGvalue(col2);
    cb1:=GetBvalue(col1);   cb2:=GetBvalue(col2);
    dcr:=abs(cr1 - cr2);
    dcg:=abs(cg1 - cg2);
    dcb:=abs(cb1 - cb2);
    if cr1 <> cr2
        then begin
            if cr1 < cr2 then cr:=cr1 + dcr*i/R;
            if cr1 > cr2 then cr:=cr1 - dcr*i/R;
        end
        else cr:=cr1;
    if cg1 <> cg2
        then begin
            if cg1 < cg2 then cg:=cg1 + dcg*i/R;
            if cg1 > cg2 then cg:=cg1 - dcg*i/R;
        end
        else cg:=cg1;
    if cb1 <> cb2
        then begin
            if cb1 < cb2 then cb:=cb1 + dcb*i/R;
            if cb1 > cb2 then cb:=cb1 - dcb*i/R;
        end
        else cb:=cb1;
    Result:=RGB(Round(cr), Round(cg), Round(cb));
end;
Выложил я только 1/10 часть кода, которая отвечает за формирование рендомной палитры, по которой потом отрисуется фарктал в красивых, пестрых красках. Вчера он мне понадобился. Я хотел сделать то же но на Java. Я хотел приделать эту же палитру к своему недавнему минипроектику "Рисуем фракталы на Java".

Что я хотел донести ребятам - так это те эмоции, которые я получал когда вчера портировал этот код на Java, а потом отлаживал его. На все про все 2 часа времени. Хотя это могло занять 10 минут, если бы код был поддерживаем. Я глядя в код, не мог сразу понять что он делает. Не мог вспомнить что я хранил в переменных с хитромудрным названием. Я знал лишь только, что он работает и работает так как надо. Так же я знал, что написать такой же с нуля у меня займет существенно больше времени, чем портирование существующего. И я взялся за рефакторинг.

Первым делом я написал некоторое подобие тестов и сделал механическое превращение (портирование) кода Pascal в Java. Работа не сложная, но требует внимания, ведь чем больше я ошибок тут сделаю, тем больше потом времени потрачу на отладку. 30 минут и код компилировался в Idea. Первая зеленая полоса! Я даже на радостях закоммитился, хотя понимал, что ничего оно не работает.

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

Еще пол часа внимательного рефакторинга, и постепенного разтуманивания прдназначения методов и переменных. Потом полировка и тюнинг под новые нужны. Тоже пол часа. Итого я получил вот это
public class RandomPalette implements Palette {

    class Marker {
        int x;
        int color;

        public Marker(int x, int color) {
            this.x = x;
            this.color = color;
        }
    }

    private static final int MW = 8; // ширина маркера
    private static final int[] colorArray = new int[]{
            0xFFFFFF, 0x00FFFF, 0xFF00FF, 0xFFFF00, 0x0000FF, 0xFF0000, 0x00FF00,
            0xC0FFFF, 0xFFC0FF, 0xFFFFC0, 0xC0C0FF, 0xFFC0C0, 0xC0FFC0, 0xC000FF,
            0x00C0FF, 0x00FFC0, 0xC0FF00, 0xFFC000, 0xFF00C0};

    private List<Marker> markers = new LinkedList<Marker>();
    private int[] palette;

    public RandomPalette(int size) {
        palette = new int[size];

        int color = getRandomColor();
        markers.add(new Marker(0, color));
        markers.add(new Marker(size, color));

        int count = random(size / (MW * 3)) + 3;
        double r = size / (count + 1);

        addBlackMarker(MW + 1);
        for (int i = 1; i <= count; i++) {
            int j = (int) (i * r);
            if (yesOrNo()) {
                addBlackMarker(j - MW - 1);
            }
            addMarker(j, getRandomColor());
            if (yesOrNo()) {
                addBlackMarker(j + MW + 1);
            }
        }
        addBlackMarker(size - MW - 1);

        calculatePalette();
    }

    private int getRandomColor() {
        return colorArray[random(colorArray.length)];
    }

    private boolean yesOrNo() {
        return random(2) == 1;
    }

    private void addBlackMarker(int x) {
        addMarker(x, 0);
    }

    private void calculatePalette() {
        int x = markers.get(0).x;
        for (int i = 0; i < markers.size() - 1; i++) {
            int length = markers.get(i + 1).x - markers.get(i).x;
            for (int dx = 0; dx < length; dx++) {
                palette[x + dx] = colorChange(markers.get(i).color, markers.get(i + 1).color, length, dx);
            }
            x = x + length;
        }
        palette[0] = 0;
    }

    private int colorChange(int from, int to, double len, double x) {
        double red = change(getR(from), getR(to), len, x);
        double green = change(getG(from), getG(to), len, x);
        double blue = change(getB(from), getB(to), len, x);

        return rgb((int) red, (int) green, (int) blue);
    }

    private double change(double from, double to, double len, double x) {
        if (from == to) {
            return from;
        }

        double delta = Math.abs(from - to) * x / len;

        if (from < to) {
            return from + delta;
        } else {
            return from - delta;
        }
    }

    private int getR(int col) {
        return (col & 0x0000FF);
    }

    private int getG(int col) {
        return (col & 0x00FF00) >>> 8;
    }

    private int getB(int col) {
        return (col & 0xFF0000) >>> 16;
    }

    private int rgb(int r, int g, int b) {
        return (r) | (g << 8) | (b << 16);
    }

    private void addMarker(int x, int color) {
        // определяем после которого маркера будет создаваемый
        int index;
        for (index = 0; index < markers.size(); index++) {
            if ((markers.get(index).x < x) && (x < markers.get(index + 1).x)) {
                break;
            }
        }

        // если после последнего то выходим
        if (index == markers.size()) {
            return;
        }

        // если маркер некуда втиснуть между двумя ближайшими то выходим
        if (markers.get(index + 1).x - markers.get(index).x < MW + 2) {
            return;
        }

        // очень близко ставить маркер возле соседнего нельзя
        if ((markers.get(index).x + MW + 1 > x) || (markers.get(index + 1).x - MW - 1 < x)) {
            return;
        }

        markers.add(index + 1, new Marker(x, color));
    }

    private int random(int n) {
        return new Random().nextInt(n);
    }

    @Override
    public int getColor(int r) {
        return palette[r];
    }

    @Override
    public int getSize() {
        return palette.length;
    }
}
И я более чем уверен, что глядя на этот код спустя некоторое время я буду считать его говнокодом. Если этого не случится – значит. Не даром, если заметил, я этот код назвал «это». «Это» только оно сейчас работает… Вообще считаю, стоит относиться к своему коду не как к произведению искусства, а как к продукту жизнедеятельности, тому что могло быть чуточку лучше, раз уж появилось на этот свет.

Что есть code review? Это всего лишь озвучивания той дельты, которая существует у двух специалистов в их опыте. Если мне больше нечего сказать напарнику по поводу его кода, это вовсе не значит что его код идеален. Я уже завтра могу прочитать новую статью и пережив ее понять, что код не такой уж и совершенный, как казалось вчера. Кроме того ревью может сделать более сеньорный специалист и рассказать о том, на какие грабли он наступал, на какие еще не наступали я с моим напарником. И то, что этому сеньорному специалисту в какой-то момент больше нечего будет сказать нам - значит лишь одно - мы написали такой код, который хотел бы написать он сам. А завтра все поменяется.

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

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

вторник, 28 апреля 2009 г.

Ты профи?

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

Ты убрал ускорение. Ты больше не прилагаешь усилие. Как там в физике: F=m*a? Чем меньше сила тем меньше ускорение. Нет силы - работает только инерция... Насколько тебе ее хватит твоей кинетической энергии?

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

Значит, момент, когда ты стал Профи очень легко определяется - ты перестал прикладывать какие-либо усилия, либо ты прикладываешь все те же усилия что и год назад. Ты наконец-то можешь позволить себе расслабиться. Поздравляю - ты Профи! Дальше только...

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

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

Мы работаем на работе чтобы получить деньги, которые позволят нам сделать что-то. Мы работаем на ненавистной работе. Именно она нас делает профи! Будь ты на своем месте в этом мире ты бы не остановился даже если бы тебе было бы 90 лет. Потому что это твое. Тебе интересно что дальше, дальше, дальше.... Еще.... Еще... Нет предела совершенствованию. А мы работаем... Ну и становимся профи. А там все по социальной программе. Аж до пенсии, где наверняка ты задашься вопросом "какого, блин, хера я жил эту жизнь?" Но уже тело не то. Ведь скорее всего ты считал себя всю жизнь Профи в плане здоровья...

Вот такие вот пироги... Тебе грустно?.. Значит я угадал.

Есть хорошая новость: Сегодня у тебя до сна осталось еще пару часов чтобы все исправить.

среда, 22 апреля 2009 г.

Повоюй и оставь в покое

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

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

Из этого всего могу сделать несколько выводов:

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

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

3. Развиваться самостоятельно в этом направлении и никого не ждать. Ждать и расстраиваться это не для тебя. Вперед и только вперед!

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

5. Всегда пользоваться этим инструментом и пользоваться им публично. Пускай все знают. Это наверное самое важное в инкубационном периоде. За тобой наблюдают, и, если кто-то видит что-то необычное - он задумывается.

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

7. Общаться с похожими на тебя людьми - теми кто делает подобное. И вместе расти вверх. Это поможет развиваться быстрее и не застаиваться.

8. Когда идея начнет набирать обороты, следить за тем, чтобы она могла жить без тебя. Учить теме. Учить обучаться самостоятельно. Учить навыкам учительства.

9. Порадоваться что все работает без тебя :)

10. Не переставать учиться. Всегда есть куда расти.

Все будет, только стоит всегда идти вперед.

понедельник, 13 апреля 2009 г.

Для того, чтоб чему-нибудь учиться - надо, сначала, это забыть

Спасибо моему Другу за то, что натолкнул меня на эту мысль.
"Пришел как-то к одному учителю (не важно чего) человек и говорит:
- Учитель. Позвольте мен стать Вашим учеником. Я всё свою жизнь занимаюсь тем же, что и Вы и достиг в этом больших успехов.
- Зачем же ты пришел ко мне, если ты и так всё знаешь?
- Я слышал, что Вы самый лучший и я чуствую, что мне ещё есть чему учиться.
- Ну хорошо.
Прошло пол года, и ученик начил замечать, что у него ничего не получается из того, что ему пытается донести учитель. пошол он к нему и спаршивает:
- Учитель... Я у Вас уже 6 месяцев, а результата никакого нет. Даже хуже: я начил забывать то, что знал до этого.
- Возьми чашку, ученик и налей в неё воды до краёв.
- Сделано учитель.
- А теперь налей в неё ещё воды.
- Но она же полная и вода выльется.
- А ты налей.
Ученик налил и вода, как и следовало ожидать, вылилась. Ученик с глупым видом посмотрел на учителя и спрашивает:
- Учитель. Что Вы мне пытаетесь сказать?
- Ничего. Только то, что как я могу тебя чему-то научить, если твоя "чаша" и так полна? Для того, чтоб чему-нибудь учиться - надо, сначала, опустошить её."

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

понедельник, 30 марта 2009 г.

Senior от Junior знаешь что отличает?

Вот на хабр отправил свой первый пост. Поглядим чего будет... Хочу получить "инвайт" может.
Опытом хочу поделиться. С чего-то начинать надобно....

Вообще есть два типа разработчиков Senior и все остальные. Разделение происходит не по заработной плате, не по опыту и количеству изученных фреймворков, а по тому в стоит ли у него в душе флаг isSenior true или там пока еще false. Спешу обрадовать флаг можно осознанно переключить. Есть пару качеств наличие которых определяют состояние флага.

МЫ:

Готовы обучаться всегда. Мир постоянно меняется и знания устаревают, а моцк стоит держать в тонусе всегда.

Ищем решение всех своих задач самостоятельно. Сделал себе сам имеешь +10 к опыту, сделал кому-то - +10 к опыту, попросил кого-то решить за тебя - +1 к опыту.

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

Больше делаем. Даже так - всегда что-то делаем. Делаем, а потом анализируем что получилось и как в следующий раз сделать лучше.

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

Не боимся задавать вопросы, а задаем их - ведь точно чего-то не знаешь.

Общаемся в кругу более продвинутых чем ты в какой-то области. Пример хорошая штука, говорят с кем поведешься от того и наберешься.

Занимаемся САМОизменением, а не пытаемся поменять мир. В мире много миллиардов людей, всех не поменяешь. А поменяв одного лишь себя будешь иметь эффект на всех всех. В общем больше смотрим в зеркало.

Знаем куда идем и зачем именно туда идем. Если делать что-то просто потому, что оно делается далеко не уедешь. Хотя есть одно исключение - можно делать что угодно если ты этого ХОЧЕШЬ, но ДЕЛАТЬ.

Получаем удовольствие от процесса и кайфуем от результатов, ведь мы приблизились к тому чему хотим и сделали это с улыбкой.

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

Учимся креативности. Да, этому тоже можно научиться, даже если ну вообще как слон на ухо наступил. научиться можно всему чему угодно, благо есть моцк. Креативность поможет решать вопросы не так как все, по своему, уникально.

Читаем habrahabr.ru и радуемся что он есть.

И еще, это относится не только к программированию - это вообще...

Желаю успехов.

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

четверг, 5 марта 2009 г.

Ценный фидбек всегда первый

Еще одна аналогия между программированием и жизнью.

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

В жизни самый яркий пример - ссора между любящими друг друга молодыми людьми (так же неопытными). Они еще не притерлись, не научились жить друг с другом и часто ссорятся. Говорят "Милый бранятся только тешутся" но часто это заканчивается разводом и поломанными судьбами.

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

Первый промах - игнорирование этой незаметной ошибки.

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

Промах третий - попытка что-то решить основываясь на последующих ошибках-следствиях.

Вскоре все успокаивается. Милые обнимаются - помирились, слава Богу. Но ими несознательно промахнулись в четвертый раз - они закончили с багажом ошибок-следствий, которые остаются с ними. Они никуда не деваются. Разговор просто замялся, но неверные опыт, основанный не на тех ошибках уже есть. Он вылезет в следующий подходящий момент.

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

Что делать не так? Все!

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

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

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

Найти и другие моменты, которые были сказаны сгоряча и при следующем удачном случае нейтрализовать их. Не должно быть никакого осадка. Каждое "я тебя ненавижу" должно быть аннулировано причем с доказательством. Сложно заставить себя подойти если кажется что ты прав? Понимаю, сам такой. Но прав и твой собеседник в той же мере. Как быть? Ждать что само утрясется? Не утрясется. Осадок работает против тебя.

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

Я наделал много таких ошибок. Неверных выводов, наверное, еще больше. Но я хочу извлечь из них что-то. Спасибо Ксюха, что терпишь меня ;) Мне надо немного времени чтобы все разобрать и снова собрать. Но я это делаю. Я тебя люблю!

понедельник, 23 февраля 2009 г.

Количество в качество

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

А значит просто делайте и не останавливайтесь. Делайте и делайте. Обдуманно или нет. Ведь обдумывание в любой момент можно подключить.

Просто начни что-то делать прямо сейчас. И не останавливайся пока не надоест. Или вообще никогда не останавливайся. Будет много ошибок, и это классно!, ведь на каждой ошибке ты чему-то учишься. "+1 к опыту", как я люблю говорить.

Делай и никого не слушай. А если уж и послушал - проверяй делом. И выкидывай, если не работает. Если работает - пользуйся.

Ну вроде все как.

Качество = f(количество, время)

вторник, 17 февраля 2009 г.

Как не застояться

Сегодня пошла очередная ретроспектива. Хорошо пошла. Речь шла о тех инструментах которые мы используем в разработке. Как мы вообще, на каком этапе развития? Зря задали этот вопрос....

Мы далеко в каменном веке. Мы используем либо старые инструменты, либо новые но не так как стоило бы. Мы самоучки. А в самообучении важно не останавливаться. А мы останавливаемся. Почему на каком-то этапе развитие останавливается?

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

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

Нежелание меняться. А зачем? Ведь прибыль идет, все комфортно. Зачем себя вгонять снова на начальный этап развития чтобы улучшить свой показать. Он и так хороший. А меняться влом. Вопрос закрыт. Только закрыт на время...

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

Во если бы на работе платили не за объем работы а за прирост который виден от зарплаты к зарплате...

Как быть? В теории просто, а вот на практике... Хотя и на практике все просто, если ты занимаешься тем что интересно тебе, тем для чего ты тут.

1) На каждое оправдание ставить себе задачу. Ведь тот кто хочет - ищет возможности, а тот кто нет - оправдания.

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

3) Возьми кого-то себе за ориентир. Очень невыгодно находиться в компании и брать за ориентир себе кого-то кто там достиг чего-то. Бери ориентир с мировым именем.

4) Поменяй коллектив если все так плохо. С кем поведешься от того и наберешься.

5) Меняйся. Не делай два дела одним и тем же инструментом. Ищи чего-то нового. Пробуй, ковыряй, копай... Когда надоест, берись за другое дело.

6) Ты прав в любом случае.

7) Поменяй формулировку. Не "я трачу время на.." а я "инвестируй время в...".

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

9) Самое важное! Получай удовольствие. Не относить к этому с важностью! "Я должен иначе я плохой" Нет ты лучший и лучший уже сейчас. Так что можешь ничего этого не делать :) Уже и так все сделано за тебя. Взбирайся на гору играючи. Нет? - спускайся вниз. Хочется постоять - постой. Только вот не зависай.

После этой ретроспективы я взял на себя новую роль и частично избавился от старой. Уверен будет очень интересно! Потому как ново и неизведанно.

Желаю успехов!

понедельник, 9 февраля 2009 г.

Думать->Делать->Думать

Как не наступать на одни и те же грабли? Очень просто - если меняться и подстраиваться.

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

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

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

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

Все для того, чтобы сделать эту работу: быстрее, эффективнее, проще, получив удовольствие...

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

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

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

Если логического ответа нет (говорит интуиция), то можно задать вопрос "а Почему я делаю именно так?" и спустя некоторое время прийдет логическое объяснение. Кстати почему классно кого-то обучать? Потому, что он смотрит за твоими действиями и часто задает как раз такие вопросы "почему?", "зачем?", "для чего?". Любой мастер не даст мне соврать, что он учится от ученика так же как и ученик от него.

Так вот анализ. Это те самые вопросы "почему?", "зачем?", "для чего?" только заданные не кем-то а лично тобой сразу после выполнения какого-то объема работы. Отвечая на них ты лучше понимаешь суть своей работы. А значит скоро ты сможешь сделать что-то качественно новое.

К примеру, пробежавшись по полю на котором разложены грабли на перегонки со своим другом ты за первых пару пробежек набьешь много шишек, но вместе с тем обретешь неосознанные навыки, которые сократят число шишек. Если после 5 забегов ты остановишься и подумаешь почему я начал получать меньше шишек и побежишь с этим вопросом 6й забег, то может число шишек и увеличится (ты был занят поиском ответа на вопрос) но на финише у тебя будут ответы. С этими ответами на руках ты можешь определить, что тебе стоит развить и в какую сторону. "Осведомлен - значит вооружен". Твои 7й, 8й и 9й забеги могут быть более травматическими нежели 5й, но 10й может уже быть такой же как и 5й, а 11й превосходить его по качеству. В то же время твой соперник так и остался на этапе развития 5го.

Это, что касается улучшения своих навыков. А бывает просто до невозможности. Ты просто от забега к забегу наступаешь на все грабли, которые тебе попадаются. Тогда простой вопрос "почему мне так больно?" может выбить тебя из этого состояния: либо ты поступишь как в прошлом абзаце, либо сделаешь совсем по другому. К примеру за первую ходку попереварачиваешь на своем пути все грабли а потом и вовсе думать про них не будешь. А твой соперник в тов время будет улучшать свою технику бега по граблям...

Просуммируем что мы имеем. Можно пойти двумя способами интуитивно и осознанно. Осознанный рано или поздно заканчивается привычкой. Осознанный в на начальном этапе тормознутый, но в последствии приносит более выдающиеся результаты. Чтобы начать осознание происходящего стоит задать вопрос "почему?". Этот вопрос можно задать в любой момент, но чем раньше, тем лучше. Идем дальше.

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

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

"Что шло так?" Ну вот процесс А, Г и Д. Ну и что поменялось? Оставим как есть? Хорошо, если нас устраивает константа в 23 шишкочасов.

"Что шло не так?" Тут теплее, но не совсем то. Снова критика. Этот вопрос заставляет смотреть на проделанную работу немного не с тем знаком. Это, что касается лично заданного вопроса самому себе. А вот в команде это вообще атас. "Петя что ты сделал за прошлый период не так?" Прям таки Петя признает это при всех... Особенно если Петя гуру в какой-то области а его спрашивают это при новичках.

Где-то я читал что-то вроде этого: "все что мы сделали, было нашим лучшим решением, если брать во внимание те ресурсы, знания и обстоятельства которыми располагали на тот момент". Вот с этого для начала стоит начинать ретроспективу. Это можно считать лозунгом тех, кто ответит на вопрос "ты хочешь что-то извлечь из своей проделанной работы?" положительно. То есть на ретроспективу собираются те, кто готов и заинтересован извлечь знания из проделанного дела, поделиться этими знаниями с другими заинтересованными проделать то самое же над собой. Это Раз.

Два. Вопрос стоит формулировать немного иначе: "что бы мы сделали иначе, если бы мы снова приступили к той же работе при тех же условиях". Есть у нас машина времени, мы отправляемся в прошлое и говорим себе, что-то что гарантированно поможет. Что мы себе говорим?..

Три. Появилось уже после осмысленного объяснения Раз и Два одному моему Другу. Итак Три. Что значит быть готовым (говорилось в Раз)? А значит это то, что от какой-то отметки Х, ты начинаешь работать в режиме Думать->Делать->Думать - ты вводишь анализ в свою работу и делаешь это так часто, как тебе это удобно. Большинство ты в состоянии понять сам, но есть нечто, что ты не в силах поменять. И вот тут на помощь приходит команда с ретроспективой раз в две недели. Ты приходишь подготовленный к ней - со списком того, что предстоит решить; ты знаешь что ты хочешь от свой команды; ты пришел, чтобы совместно решить то, что у тебя накопилось за этот период и помочь решить то, что накопилось у других. Это важно! Приходить на ретроспективу, чтобы только выговориться что наболело без никаких решений - это не ретроспектива, простите. Это просто митинг для снятия накала в команде - тоже полезный, но это не ретроспектива. Итак Три и сразу Четыре: до - подготовленный, после - с решением что делать.

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

Шесть. Помни, это в первую очередь нужно тебе, а не команде. Ищи что поменять в себе, а то, что поменять не можешь - проси у команды. Помогай тогда, когда спрашивают. Не распыляйся зря. Лучше эту энергию пустить в прививание новой привычки. Или как я, вот - статью напиши. Потом пригодится. Ретроспектива инструмент для твоего личностного роста. Занимайся им. А людей оставь в покое :).

Вот вроде все. Если что забыл, потом вспомню... Спасибо Друг мой Валерка, за обсуждения этого вопроса. Если бы не ты, этого поста не было бы, та и блога этого тоже :)

Кстати эта статья родилась на какой-то итерации. Быть может через неделю я буду обладать знаниями которые вынудят меня действовать иначе. Все это во имя Эффективности. Если кто-то когда-то увидит что я говорю что-то не то, что написано тут - попросите меня написать вторую версию :) Я напишу. Все что тут написано неправда. Это мой путь. Если ты нашел для себя что-то интересное тут - обязательно перепроверь это. "Хорош тот студент, который никогда до конца не верит своему профессору".

Успехов!

понедельник, 12 января 2009 г.

Ошибка - это дар

Не бойся делать ошибки - ошибка, это дар. С их помощью ты растешь.

Я люблю делать ошибки.

Могу дополнить прошлый пост "Рельность и Действительность" так:
Ошибка рождает опыт. Опыт дает чувство. Чувство генерят слова. Слова это только слова.


Позвольте мне делать ошибки. Если я не делаю ошибки, значит я не живу - я шаблон, я никто.

понедельник, 5 января 2009 г.

Это как кататься на лыжах...

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

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

Чаще всего тормозим.

среда, 8 октября 2008 г.

Письмо тому, кто поймет

Привет Тьерк,

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

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

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

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

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

После всего этого ты больше знаешь про меня. И мои мысли.
Какой период сейчас? Время собирать камни. Я очень горд за себя и своего напарника. Нас выбрали в самый ответственный момент. Мы делаем все, чем научились за то время пока... Уверен демо мы сделаем. Даль что решение о перераспределении команды пришло так поздно.

Какой будет период в будущем? Лидерство 5 уровня: нет критике, нет поучениям, нет спаму. Действие, которого невидно. Мысли и идеи, которые общие. Менеджмент, который учится сам. Проекты, приносящие удовольствие. Изменения, которые незаметные. Рост, без принуждения.
Сам собираюсь еще больше углубиться в психологию, т.к. "программирование на 85% это общение с коллегами". Остальные 15% само собой разумеется - расти еще есть куда. Если оценить мои знания по 10 бальной шкале, то я думаю что где-то недалеко возле нуля. Опыт. Только опыт и практика.

Группы. Что делать с ними? Думаю группы сами организуются и сами решат что им делать, главное дать такой шанс. Дать его. Шанс реализоваться и показать себя. И пускай сразу не ясно будет какую пользу это принесет. Уверен, что там где реализованные люди, занимающиеся своими "хочу" - там есть все. Сложно? Долго? Но мы ведь никуда не торопимся?

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

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

Что еще могу сказать? Большое спасибо тебе за то что ты пробиваешься к нашим сердцам и мыслям. Я тебя понимаю. Ответов на твои письма очень мало. Иногда вообще нет. Как сейчас помню карикатуру с "что-то надо делать - на счет раз, два, три". Но любое действие откладывается. Вода камень точит. И за большой период виден ощутимый результат. Правда мы его не замечаем, потому что каждый день изменения незаметны. А вот для окружающих виден прорыв. Так, что все идет хорошо.

Удачи тебе и еще больше терпения. И большое спасибо.

С уважением и пониманием, Саша.