07 февраля 2012, 11:51

Жизнь простого программиста

Автор: Привет! Меня зовут Юля, я живу в Большом Чикаго — это такое красивое название, которым с особым рвением пользуются жители прилегающих к Чикаго деревень.
Обычно дни программистов трудно показывать, так как для непосвященного глаза они проходят достаточно статично — сидит себе человек в бороде и свитере за компьютером, нажимает кнопочки, при этом выражая лицом весь спектр эмоций. Сейчас я занимаюсь интересной задачей, в решении которой задействованы картинки, и поэтому есть что показать и о чем рассказать на человечеcком наречии.


Для съемки я выбрала вторник — день, когда муж забирает и развозит детей, а я могу неспеша задержаться на работе подольше. К сожалению, 31 января, неожиданно оказался заполненным параллельными сюжетами, так что скучать вы — обещаю! — не будете.

1. В 8:00 я проснулась, ужаснулась, схватилась за телефон и позвонила в дилерскую. Дело в том, что накануне вечером я пробила покрышку и погнула диск колеса. Быстро уговорила их принять меня без записи, покомпостировала мозги мужу, отправила их с младшей дочерью в сад (детский сад, не подумайте ничего плохого), и прыгнула в душ. И только выскочив из душа вспомнила, что собиралась снимать свой день.

2. И вот она я, в полотенце и в ужасе от того, что показывают часы:



3. Раз уж вы все-таки зашли под кат, то расскажу вам еще немного о себе. Мне 38 лет, из которых 19 я живу в США. Моя семья — это муж и две дочери: Elizabeth (Лиза) двеннадцати лет, и Rachel (Буся) двадцати одного месяца. Работаю я на большую компанию, которая специализируется в розничной торговле.
К началу моего дня Лиза уже уехала в школу на автобусе. Ее разбудил и выпроводил папа пока мы с Бусей досыпали. У нас (позор-позор!) ребенок все еще ест по ночам, и потому я уже почти два года хожу невыспавшаяся. Но достаточно лирических отступлений, пора за дела. Я обещала не позднее девяти приехать в дилерскую.
Выбегаю из ванной и начинаю лихорадочно собираться. Философский вопрос «что надеть?» каждый день решается в пользу чистой пары джинсов. Моя лучшая подруга, однажды заглянув в мой шкаф, с удивлением заметила: «ой, у тебя оказывается есть нормальные вещи!» Подтверждаю — есть. Полный шкаф, а надеть все равно нечего.



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



5. На комоде поднос с пустыми чашками. Чашечки лет шесть назад разрисовала и преподнесла нам в подарок Лиза, у моей тогда тоже было блюдце. С тех пор мы пользуемся ими каждое утро, что по ним, к сожалению, уже заметно. Жаль, что заготовки такой формы перестали выпускать. Видимо, нам придется пить из них, пока не рассыплются. Обычно утренний кофе готовит муж, мы его пьем на кухне, не знаю даже, почему ему сегодня пришла в голову идея принести в спальню. Кстати, он в моем дне будет присутствовать лишь виртуально, почему — расскажу по ходу.



6. Раскладываю волосы в положение, в котором им предстоит высохнуть.



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



8. Беру книгу, которую надеюсь почитать в ожидании машины (сразу скажу — не удалось).



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



10. Выбегаю в гараж. Вот она, моя раненная лапочка.



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



12. Телефон подключен к машине через BlueTooth, у нас в некоторых районах ввели закон о телефонных переговорах за рулем, и могут запросто оштрафовать, если увидят кого-то с трубкой у уха. Набираю чувака, которому обещала перезвонить по дороге на работу. Разговариваю. Время:



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



14. Проезжаю озеро Арлингтон, мы иногда приезжаем сюда кататься на роликах. Вокруг озера проложена асфальтированная дорожка с двусторонней разметкой. В прохладные вечера здесь довольно оживленно — велосипедисты, роллеры, бегуны, и просто пешеходы. Полный круг — полторы мили, довольно удобно для тех, кто тренируется и расчитывает дистанцию. Зимой здесь малолюдно.



15. Еще пара снимков по дороге, не представляющих особой художественной ценности. Одноэтажная Америка, несмотря на то, что многие дома двух и трех этажные.



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



17. Приехали. Мне сюда.



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



19. Уезжаю. Время уже вот сколько. Самое левое значение — это забортная температура в градусах Фаренгейта. Хлипкая у нас зима, что тут скажешь, лыжи в основном скучают в гараже.



20. Поворот на шоссе.



21. Накануне механик, который ставил мне запаску предупредил, что я могу ездить не быстрее пятидесяти миль в час. Включаю аварийки и выезжаю на шоссе. «Ездить быстро легче, чем ездить медленно», — сказала мудрая гусыня Акка Кебнекайсе. Ну или как-то так. Сегодня я прониклась ее мудростью. Аварийки спасли меня от длинного хвоста раздраженных водителей, но не от позора обгоняющих тяжело груженных фур.



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



23. Концертный зал Сирс-центр. Кто там только не выступал!



24. И наконец мой выход. Он — платный.



25. Плачу такой фиговиной, которая называется IPass. На ee счет я периодически перевожу денежку. Справа проезд для таких как я, а слева — для тех, кто платит монетками. Проезд за монетки стоит почти в два раза дороже.



26. Списываю спеки с колес. Время — 10:35. Ужас-ужас, я снова не попадаю в спортзал. Обычно я хожу туда три раза в неделю в обеденный перерыв, хоть по мне и не особо видно. Фотка времени есть, но по-моему их пока хватит.



27. Сегодня решила зайти через главный вход.



28. Вот на этом мосту я вчера пробила покрышку. За рулем я далеко не новичок, мне просто не повезло.



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



30. Иду.



31. Наконец на рабочем месте. Мой кубик. Цветы мне подарила подружка около года назад. Я не особо одарена по цветочной части, растениями у нас дома заведует муж, но за этими я ухаживаю с особым старанием.



31. Задача, которой я сейчас занимаюсь, состоит в том, чтобы настроить одну старенькую программку под ожидаемую загрузку (load). Она написана довольно криво, в ней куча проблем начиная с утечки памяти, и до нескольких тысяч ненужных запросов к базе данных. Такие задачи решаются с помошью симуляции нагрузки и профилирования. В качестве симулятора нагрузки выступает написанная мною программка, которая делает вид, что 100 пользователей одновременно кинулись атаковать сервер. Обе программы написаны на JAVA, и поэтому расскажу немного о том, что происходит с памятью. Ребята, я честно пыталась найти соответствующие русские термины, но — увы! Их, похоже, нет. Так что не бейте меня, пожалуйста!
В JAVA управлением памятью занимается виртуальная машина JVM. Она ответственна за выделение, инициализацию, а также освобождение ячеек памяти. Последнее происходит при помощи операции, которая называется «сборка мусора» (garbage collection).
Когда программа стартует в JVM, для нее сразу отводится определенное количество ячеек памяти. Эти ячейки, грубо говоря, делятся на статические регистры (perm space), которые программа читает, но не пишет, и на активную память (heap space).
Heap, в свою очередь делится на три отдела — old, eden1 and eden2. Абсолютное большинство создаваемых объектов — короткоживущие, их программа пишет в один из eden, второй в этот момент не задействован. Eden периодически пересматривается сборщиком мусора (minor garbage collection), и все актуальные объекты переписываются в во второй eden, который по окончании сборки мусора становится актуальным. Представьте, например, переменную внутри функции. Для нее отводится сколько-то ячеек памяти, которые микросекунды спустя уже не нужны, потому что функиция закончила работу. Сборщик мусора их освобождает и возвращает в пользование программы. Если часть невостребованной памяти не возвращается, то minor garbage collections будут происходить все чаще и чаще, освобождая все меньше и меньше памяти, и в конце концов программе станет некуда писать, и она упадет с печальным звоном Out of Memory Error. Графически это будет выглядеть примерно так (это график теста который мы делали в выходные, еще до того, как я починила утечку).



На графике видно, что с каждой уборкой мусора, количество высвобождающейся активной памяти уменьшается (ось ординат отмечает память в мегабайтах, а ось абсцисс — время). На данном этапе мы хотели повалить нашу программу, чтобы в момент падения сгенерить точное состояние регистров памяти (heap dump) и найти утечку.
Естесственно, валили мы не действующую программу в production, а специально сконфигурированную под тестирование нагрузки копию в stress. Все, с теорией покончено.

32. Теперь давайте посмотрим на график утилизации памяти после починки. Как видите, все стабильно, кривая наверх не лезет, значит утечки нет.



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

33. Муж принял мою колесоэпопею очень близко к сердцу, требует спеки. Очевидно я уже окончательно зарапортовалась и перепечатала неверно.



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



Забавно, но в одном из кресел этого фойе, мне три с хвостиком года назад сделали официальное предложение. Все растения здесь — живые, а фонтаны — настоящие и ничуть не воняют. Красиво, черт возьми!

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



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



37. А вот — игрушки.



38. Цены бросовые, но и выбор не очень большой. Если ходить туда регулярно, то можно довольно выгодно отовариваться. Я здесь бываю крайне редко. Серьезный дядя делает мне замечание, что фотографирую. Я оправдываюсь тем, что все равно собираюсь это купить. Да, сегодня мне повезло. Лиза недавно попросила банные простыни, эти две лапочки мне обошлись в 10$.



39. Раз спортзал все равно накрылся, решаю подняться по лестнице. Я работаю на третьем этаже.



40. Время. До совещания есть 15 минут чтобы быстро слопать суп.



41. Наша грозная Проджект Менежерша жаждет отчетности.



42. Звоню на совещание, попутно поглядывая на графики. Там ничего нового. Мы готовы к новой ступени тестирования.



43. Однако, Прожект Менежерша не шутит по поводу отчетности и жаждет ее не по-детски. Ей нужны задокументированные результаты вчерашних анализов. Завариваю себе ромашковый чай и приступаю.



44. Последний memory dump сгенерился еще в выходные. Копирую с сервера к себе.



45. А наши все ушли на Большое Слушанье Речей. Я решила опоздать, так как дел по горло, а ключевые моменты мне и так расскажут. Самострел в зеркале пустынной дамской комнаты.



46. Между тем мне перезваниевают из автоцентра. Новости неутешительные, как видно из переписки с мужем.



47. Меня колесоэпопея уже начала порядком нервировать. Решаю временно прекратить нервничать, плюнуть на речи, и перенести мамин визит к врачу с завтрашнего дня на через неделю. Потом звоню русским умельцам, договариваюсь с ними о встрече на предмет починки моего многострадального колеса, и начинаю анализировать память.



48. Здесь показаны классы, которых в момент обвала обнаружилось больше всего и кто их не отпустил для чистки. Сборщим мусора собирает только бесхозные объекты. Если кто-то не отпустил указатель на объект — он считается небезхозным и чистке не подлежит.



49. А тут — сколько конкретно места занимают различные объекты.



50. Это уже четвертый и последний dump. И мой перекус на его фоне.



51. А между тем выяснилось, что мне все еще придется пользоваться чужим доступом к Wily, т.к. для получение своего надо заполнить вот эту форму. О, я не рассказала вам о Wily? Это профилятор, который работает по принципу интроскопии — неинвазивного наблюдения. Он подключен к работающей программке и собирает о ней различные данные — heap space, утилизация процессора, обращения к базе данных, и много других важных и нужных подробностей. Графики которые вы видели выше (из емели архитектора) сгенерированы интроскопом.



52. Заходит сотрудница. Просит погуглить одну интересную ошибку. Так как мне официально нечего делать, занимаюсь поисками чужих гениальных решений.



53. Муж между тем сообщает что он окончательно простудился, что его папа нездоров, и что он не может оставить Бусю на одну бабушку. Потом звонит моя лучшая подруга и сообщает, что ее дочка тоже заболела, и на гимнастику не пойдет. Обычно по вторникам муж забирает Бусю из садика, оставляет ее у своих родителей, а потом отвозит Лизу и дочку моей лучшей подруги на гимнастику. Сам во время их тренировки идет в спортзал. А я после работы забираю Бусю от свекров. Сегодня все не как обычно. Черт. Мне нужно еще раз перекусить!



54. Быстро спускаюсь в магазинчик. Улов.



55. Время возвращения. Я продолжаю мониторить тестирование, параллельно просматривая JBOSS форумы и отвечая на вопросы сотрудников. Мой почтовый ящик сегодня переполнен.



56. А вот и наш архитектор решил выполнить свое обещание и прислал мне запросы для дальнейшего тестирования. День перестает быть скучным.



57. Добавляю их в программку, тестирую.



58. Задаю уточняющие вопросы.



59. Мне пора домой. Лиза решила не идти на гимнастику, а вместо тренировки помочь бабушке с Бусей. Обычно она тренируется пять раз в неделю. Несмотря на поздний приезд, мне надо сегодня уйти вовремя.



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



61. Очень люблю цветочный отдел. Шарики напоминают о том, что скоро день всех влюбленных. Открытки на заднем плане тоже.



62. Мне, однако, не туда, а вовсе даже сюда.



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



64. Странная вывеска.



65. Мой улов — Кларитин для Буси (так и стоит неоткрытый, но муж на нем очень настаивал, а я ж не изверг — нервировать простудившегося человека) и молоко. По дороге еще подхватываю не попавшую в кадр курицу.



66. Пробегая к кассе самообслуживания щелкаю еще один кадр. Кассы самообслуживания — мое все.



67. Время выезда с парковки.



68. К моменту приезда к бабушке дети дежурят у окна одетые. На протяжении последнего часа Лиза мне звонила несколько раз. Фотоаппарат я к свекрам не брала, следующее фото отмечает время нашего приезда домой. Мы живем недалеко друг от друга.



69. Папа уже спрятался от нас в кабинете. Буся просит воды, Лизка наливает.



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



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



72. Пока мы ужинаем, я рассказываю дочкам про то, что снимаю свой день. Лиза немедленно хватает фотик, и снимает меня. Потом мы беседуем о том, что интересует их. Я не провожу с детьми весь день, поэтому стараюсь компенсировать количество качеством. Все время, пока я с ними, я именно с ними.



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



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



75. На кухне порядок (верьте мне на слово), я наливаю две крынки молока — одну на сейчас, а другую ставлю в холодильник, чтобы ночью не совершать лишних движений.



76. Время на плите. Размытое, но все же время.



77. Налево пойдешь, к Лизке придешь.



78. Прямо пойдешь — к Бусе попадешь. А наша (временно моя) спальня направо. Муж расположился в кабинете, к нему можно попасть только если пойдешь обратно. Я навещаю болящего, но из чистого гуманизма не фотографирую.



79. Включаю Бусин ночник с Лизиным прошлогодним рисунком.



80. Буся спит, а у Лизки есть еще 5 минут до отбоя.



81. Я подключаюсь к работе.



82. Лиза заходит сказать спокойной ночи и заодно фотографирует меня в пижаме.



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



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

Спасибо всем, кто провел со мной этот суматошный день. Пока писала пост, проект я успешно сдала, муж выздоровел, а колесо заменили русские умельцы.
Источник: odin-moy-den.livejournal.com

  • +12



Понравился пост "Жизнь простого программиста"? Поделитесь им со своими друзьями, отправив им ссылку: