Иван Тарасов (_navi_) wrote,
Иван Тарасов
_navi_

Длинный день

Пятница была у меня длинным днём, не столько по продолжительности, сколько по насыщенности событиями. Четверг конечно был длиннее, в 7:15 мы выехали на работу и вернулись только в 20:30, но прошёл он как-то легче и незаметнее.  Пятницу мы провели в другом Сановском кампусе в Менло Парк (указатель A немного не точный, кампус прямо над ним), который Сан строил сам (в отличие от купленного и перестроенного в Санта Кларе). По сравнению с кампусом в Санта Кларе, во внутреннем дворе этого ощущается некоторая теснота.

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

А вечером у меня было собеседование с Грегом Боллеллой, "отцом" Real-Time Java. На последней конференции JavaOne он предоставил разработчикам большую развлекуху: он со своей группой построил трек для машинок, которые управляются программно (управление — напряжение на электродвигателе), и каждый желающий мог написать программу и посмотреть, как она ведёт себя на треке на JavaOne. Сложность управления состоит в следующем: на трассе расположены датчики, которые срабатывают в том случае, если машинка находится прямо над датчиком, но соединены эти датчики так, что есть информация только о том, находится ли машинка над каким-то датчиком, но нет информации над каким. Цель управления: провести машинку по треку за минимальное время. Но если скорость перед поворотом будет слишком большой, то машинка вылетит с трассы, поэтому надо разумно ускоряться и тормозить. Так как нет информации, над каким из датчиков находится машинка, надо постоянно отслеживать информацию о замыканиях датчиков: так как известно изначальное положение машинки (перед первым датчиком), можно в дальнейшем отслеживать положение, в том случае если мы не пропускаем датчики из-за "тормозов Java": время замыкания датчика довольно короткое, меньше 5 миллисекунд, и зависит от скорости. Так как в случае задержки в выполнении (опросе датчика) программа теряет информацию о точном местоположении и управление начинает базироваться на неправильной информации о положении машинки, машинка очень быстро вылетает с трека, тем самым это hard real-time задача.

Для решения подобного типа задач и была разработана Real-Time Specification for Java (RTSJ). В ней добавлены два новых типа потоков: RealtimeThread и NoHeapRealtimeThread. Первый может использовать heap, но для него используется специальный Garbage collector с предсказуемым временем исполнения, этот тип потоков подходит для soft real-time задач. Второй тип, как нетрудно догадаться из названия, не может использовать heap (доступна только immortal и scoped память), зато он очень хорошо подходит для hard real-time задач. В случае slot-car race, для опроса датчиков нужно было использовать NoHeapRealtimeThread, который при правильной настройке разрешения таймера (кажется на JavaOne использовалось разрешение 1ms) не пропустит замыкание датчика. На самом деле в построении управления конкретно для этой задачи есть ещё довольно много хитростей: например, имеет смысл замерять время замыкания датчика (сколько циклов замкнут), чтобы определить текущую скорость, и потом, вместо простого ожидания следующего сигнала датчика для определения позиции пробовать интерполировать текущее положение исходя из скорости, длины отрезка и его "кривизны"; так как на двигатель можно подавать и отрицательное напряжение, можно тогда начинать притормаживать перед поворотами заранее, а не непосредственно после датчика, а после поворота увеличивать скорость. Конечно, такое очень сложно сделать, если нет возможности экспериментировать непосредственно с треком.

Так вот, возвращаясь к собеседованию. В Сане действует программа по менторству инженеров более опытными инженерами. Проводится она раз в год для new hires (менее 2 лет в компании) и, кажется, раз в полгода для established staff. Чтобы в неё попасть, надо подготовить рекомендации менеджеров, и, по крайней мере одного директора, заполнить опросник, в котором ты отражаешь что ты хочешь от программы. Так как "количество мест" ограничено, надо получить хорошие рекомендации и очень хорошо сформулировать цели которые ты хочешь достичь в результате участия в этой программе. Тут мне повезло дважды: мой менеджер является директором отделения и вдобавок, так как я работаю напрямую с разработчиком в Техасе и много с ним общаюсь, он помог мне переформулировать мне некоторые мои корявые фразы на английском в опроснике. Ну и третий раз мне повезло, когда меня в эту программу приняли. Следующим шагом в этой программе является составление списка из 15 (!) менторов, которых бы ты хотел для работы с тобой, и причин по которым ты каждого из этих менторов выбрал. Работать будет, конечно, только один, а такой большой список нужен чтобы избежать коллизий с другими участниками и на случай, если ментор не захочет по каким-то причинам работать с тобой в течение целого года. Составление этого списка и формулирование причин оказалось действительно сложной задачей: надо произвести полноценный research, кто есть кто, среди предлагаемых нескольких сот менторов, выбрать 15 и сформулировать почему ты их выбрал. Можно, кстати было выбрать Гослинга или, даже, Уита Диффи (привет, _yashma_ :-) ).

Собеседование с Грегом (который был первым в моём списке) прошло удачно, так что в течение года начиная с сентября он будет у меня ментором. Что это будет из себя представлять я когда-нибудь напишу. Кроме slot-car трэка Грег показал мне ещё несколько демонстрационных агрегатов в Сановском Executive Briefing Center (это то место, куда водят внешних заказчиков, чтобы импресснуть их инновациями в Сане). Один из них — инвертированный маятник (классическая задача в теории управления, мы её кажется на втором курсе с Веремеем даже рассматривали): металлическая трубка-маятник, точка подвеса которой (снизу) находится на площадке которая может двигаться горизонтально в плоскости вращения трубки. Программа, написанная на Real-time Java стабилизирует маятник в верхнем (неустойчивом) положении при помощи управления движением площадки. Трубку можно щёлкнуть пальцем, выводя из верхнего положения, и площадка тут же метнётся в сторону движения маятника, чтобы стабилизировать его. Правда, так как скорость движения площадки и доступное для движения место ограничены, область устойчивости тоже ограничена. Параллельно с процессом управления, на той же виртуальной Java машине запущено проигрывание видеоролика, которое даже не тормозит. В приложении ещё есть специальная кнопка, при нажатии на которую программа начинает генерировать кучу мусора в heap'е и запускает после garbage collector. При этом видео начинает ощутимо тормозить, а вот процесс управления работает как ни бывало с тем же разрешением в 5ms. Вобщем, довольно доходчиво можно на таком примере объяснять, что такое real-time приложения. Есть ощущение, что давно уже пора на нашем факультете про всё это рассказывать в обязательной программе. А то как-то далеки мы от жизни, несмотря на то что математика у нас "прикладная" и процессы у нас "управления".

Tags: math, me, menlo park, mentor, real-time, sun, tech, travel, work
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment