Category: it

Category was added automatically. Read all entries about "it".

Упёрся в "потолок".

... на работе. Ну, в общем, Java - язык хоть и получше С++, но без лямбд изрядно дерьмоват. Система, под которую пишу на работе - хрень из серии "если бы я делал, я сделал бы лучше", хотя по размеру гигантская и "внушаить". Ходил от скуки на собеседования в Luxoft. Ну что сказать? HiberSpring, на котором всё там в основном пишут, на голову ниже той системы, под которую я пишу на работе - CMS поверх "хранилища данных", на самом деле недо-псевдо-ORM в основном + "Naked Model" (ну не только naked model, там можно и кастомный шаблон блока страницы сделать). Как представил, что буду "струячить" руками шаблон страницы с мыслью том, что на прошлой работе это делалось без программирования вообще (по крайней мере на уровне прототипа) "само собой" исходя просто из структуры данных - желания пытаться уходить в Luxoft поубавилось: "там тоже потолок и не факт что не ниже", если и уходить - то на Scala, иначе просто неинтересно. В общем, интересуюсь смежными областями. Понял, что "отличным программистом" мне уже не быть: не то, что бы квалификация не позволяет, а просто в этом качестве никто меня не воспринимает - начиная с того, что возраст не тот. Думаю, вот так в ИТ и становятся руководителями - от скуки и ощущения "потолка". Набрёл на интересное видео вот.


https://youtu.be/eX3EjTFYeI4?t=811

"Реально мы учимся только делая что-нибудь. Чтобы нам разрешили делать что-нибудь, должны думать, что мы с этим справимся. У компании, у людей новая квалификация, новое умение появляется, когда их по ошибке просят сделать что-нибудь, чего они ещё никогда в жизни не делали. Ну, в принципе, не надо так делать: это риски. Но иногда люди ошибаются, и мы научаемся делать что-то новое. Если мы хотим быстрее развиваться, нам нужно эти ошибки провоцировать, чтобы нам что-то доверили, но потом сильно напрягаться, если оказалось труднее, чем мы думали с самого начала."

https://youtu.be/eX3EjTFYeI4?t=1672

Интересный результат измерения: "Сеньор в одной технологии может стать, ну не очень перформящим, но сеньором в другой технологии за шесть месяцев легко. C продавцом - только понять или нет [подходит ли тебе эта работа и пригоден ли ты для неё] - два года минимум."

Деградация интерфейса в виндах.

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

Говорят, в Windows 8 грозятся убрать меню "Пуск", якобы им никто не пользуется. Интетесно, а если у меня вообще нет клавиатуры, как тогда запустить экранную? Я месяца два юзал ХР без клавы и диска С - ничо, в общем пригодно.

На линукс что ли загоняют? На OpenOffice уже загнали своим ribbon-интерфейсом начиная с 2007-го. "Open source, конечно, говно, но у нас теперь будет не лучше", так что ли?

Java: сериализация объектов с финальными полями.

При программировании на Java имеет ставить модификатор final везде, где можно. Особенные плюсы это дает при наличии финальных публичных полей: акцессор не нужен и в то же время никто не может изменить значение публичного поля. Особенно такой подход должен порадовать стороников и любителей "чистоты" (="purity").

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

Но!

Есть чудесные методы Object readResolve() throws ObjectStreamException и Object writeReplace() throws ObjectStreamException. С из помощью можно подменять объекты при сериализации и десериализации. Т.е. приписывашь к классу А метод writeReplace, который врзвращает объект специального класса Б, призванного исключительно хранить при (де)сериализации копии объектов класса А - никаких методов кроме readResolve, только два конструктора и поля тех же типов. Причем, как выясняется, не тербуется никакая совместимость ни по классу ни по интерфейсам. В методе readResolve у класса Б же - только вызов конструктора класса А. И ВСЕ.

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

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

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

О CMS.

Поработав с CMS пару месяцев, я понял, что все CMS - говно. Как и всё, что делается через AJAX и клиентский JavaScript, вообще. Особенно хорошо эта говнистость прявляется на медленном интернете: все ссылки на часто используемые разделы CMS приходится держать в закладках на http://del.icio.us/. Либо ждять по минуте реакции на треть кликов мышкой. Заодно проникся пользой от клиентов типа Semagic (ИМХО, к CMS-кам такие надо прилагать в обязательном порядке). А еще лучше утилиту коммандной сторки с отдельной GUI-оберткой, чтоб и в батники встраивать.