2012-07-29

CodeFest Mini

За день до поездки собрались поиграть в Империал 2030. Изначально планировалось лечь не позднее часа, но прокопались и начали только в полночь. Долго разбирались с правилами и закончили игру в пятом часу. А выезд был запланирован на половину пятого.

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

2012-07-25

Монах наоборот

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

Его браться высмеивали этот процесс, поскольку монах писал вполовину меньше кода, чем его братья, еще и с большим опозданием. Братья звали его Луохоу — Монах наоборот.

Джава мастер Банзен, услышав об этом, заявил: я разберусь.

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

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

Мастер Банзен, подталкивая своим посохом молодежь к пропасти, ответил: Естественно, вы сможете решить проблему, достигнув дна.

The Codeless Code 

2012-07-24

QTception

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

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

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

К концу третьего дня, когда отчаяние достигло максимума, созерцая обфусцированный gwt-шный javascript, заметил отсутствие ";".

2012-07-23

Величайшее стремление

В понедельник новичок спросил Мастера Банзена: что есть величайшее стремление?

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

Во вторник другой послушник спросил: что есть величайшее стремление.

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

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

Банзен ответил: так и есть.

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

Разгневавшись, Банзен ответил: в понедельник меня попросили назвать максимальное положительное число; во вторник половину этого. Я ответил на одном дыхании. Но если бы меня попросили досчитать до этого числа, луна успела бы превратиться в пыль, едва я начал считать.
Пристыженный ученик поклонился и вышел.

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

Банзен ответил: бонсай на столе и дуб за окном одинаково нуждаются в воде.

 The Codeless Code

2012-07-21

Дело о пропавшей памяти

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

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

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

2012-07-20

Linux magic

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

2012-07-19

My SSD is faster then your HDD?

Решил устроить себе вчера день миграций: ноут на SSD, а десктоп с IDE на SATA. Для этого взял Vertex 4 и большую флешку, чтобы залить на неё установочный образ семерки.


Ноутопроблемы



Разобран
Надеюсь, оно будет работать

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


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

+1 наклейка
Диск был успешно вставлен, и тестовый запуск показал. что клавиатура всё еще работает. Собрал полностью и загрузился с liveusb, чтобы залить в SSD новую прошивку. При скачивании прошивальщика оказалось, что не работает тачпад: пришлось разобрать второй раз и пошевелить шлеф - благо, что достаточно было только снять клавиатуру. Загрузился в прошивальщике, тачпад заработал, но выяснилось что одна из опорных защелок в клавиатуре не была вставлена - третий раз раскрутить было уже делом техники.

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

Масдай

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

При попытке восстановления системы из образа на другом диске, оболочка показала много страшных слов среди которых было format, lost, warning. Тем не менее, я не испугался и получил всё тут же 80070015. Дальше были попытки залить образ с другого диска, развернуть образ через оснастку diskmgmt, просто залить файло и проставить загрузчик - ни одна не увенчалась успехом, а более радикальные эксперименты предпринимать без бекапа на терабайтник не хочется.

Итого

/dev/zero пишет на диск со скоростью 150 МБ/с, что в три раза меньше заявленного предела, а читает со скоростью 280 МБ/с что меньше идеала всего в два раза. Предполагаю что проблемы в SATA второй версии. Винда откладывается до появления бекапного диска.

2012-07-17

Хождение налево

В марте 2012 ездили мощным десантом на CodeFest, где на обеденном перерыве зазнакомились с двумя HR-щицами. Как оказалось, они активно хантили жабо-программистов. Первая оказалась из ЦФТ, вторая искала разработчиков для своего бывшего работодателя и особо не распространялась. Поговорили о проектах, работе, условиях и больной теме планирования. Что поразило, так это подозрительно низкая зарплата в ЦФТ - столько вполне мог затребовать выпускник какого-нибудь НГУ. Девушки записали контакты и обещали написать.

2012-07-13

Когнитивный диссонанс

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

После объявления пришел генеральный директор с целью донести идею до непонятливых: в захолустье туго с программистами, маленький стартап делать не интересно и хочется сделать что-то большое, доказав всем что мы круты, и пусть разработчики не думают, что денежная мотивация преследует цели "наебать или зажать жалкие +- 20% вашей зарплаты" (кто бы спорил), если наш продукт взлетит, то потребуется резко расширять штат (откуда, программистов же нет) и тогда, ваш хорошо налаженный процесс разработки в маленькой команде пойдет вразнос и нельзя будет выжить без проектного подхода. Поэтому лучше раньше, чем позже, не смотря на упорное сопротивление тимлида в принудительном порядке внедряем.

В общем говорил красиво и убедительно, а главное мотивирующе, но все испортила система мотивации.

По крайней мере у нас были 4 месяца и восемь спринтов, которые пролетели в потоке. Посмотрим, что будет дальше.

P.S.
Что характерно, проблемы были обозначены верно:

1. нужно планирование
2. нужна система мотивация
3. большие команды не могут само организоваться

но выводы, на мой внутренний взгляд, были сделаны неверные.