Был недавно у меня разговор с
bratelnik-ом про джава-программистов. Как-то так сложилось, что на нескольких asp.net-ных проектах довелось побывать, которые начаты были гражданами из мира джавы. Может они не со зла, и не для науки, конечно, а так, позырить (с), но я не удержался и сделал ряд метких наблюдений.
Проекты обладали рядом характерных черт. Сейчас я вам расскажу как строят джаваисты.
Изначально закладывается такая архитектура, в которой много слоев и абстракций. В теории одна маленькая финтифлюшка может работать на отдельном кластере, который спрятан под горой в бронерованном бункере в Швейцарии, а другая загогулина может вертеться на чьем-то мобильном телефоне. Но что самое крутое, программисту который будет дергать за шнурок А на загогулине, который через 3 брокера и 5 проксей подключен к звонку Б на финтифлюшке, не надо ни о чем беспокоиться, потому что все прозрачно и абстрактно!
Желательно, чтобы все было в XML. Настройки всего, даже настройки того, как читаются другие настройки. Настройки желательно делать иерархическими, с переопределением всего и вся. Например, если у вас есть файл настроек с именем компьютера, то он должен гарузиться первым, потом надо обязательно проверить нет ли чего в реестре, а потом позвонить на специальный сервер конфигурации и ещё немножко настроек взять оттуда. Ни в коем случае при отладке нельзя давать понять откуда какой-то конкретный параметр приплыл!
Если какие-то настройки не в XML, то надо обязательно их туда загнать. Можно даже иногда в XML писать немножко кода, который потом будет компилироваться на ходу.
Нельзя никакие функции звать напрямую, обязательно нужны сервис брокеры. Когда в цепочке слишком много брокеров, можно для разнообразия поставить прокси.
Dependency Injection обязательно надо делать как можно запутанее, чтобы новички потом под собой мочили стулья от неожиданности, когда у них код, удаляющий базу, вдруг откуда-то чудесно вызвался.
Реализовывая свои фичи, желательно ломать поведение стандартных библиотечных, на замену которым это пишется. Например, вываливать эксцепшн на три экрана, когда пользователь нажал кнопку "назад" в браузере. А еще лучше перепутать сессии и дать этому пользователю данные другого собрата по несчастью.
Вот например взялся джаваист складывать два числа, скажем 2 + 2.
Надо несколько уровней абстракции. Один - на цифры. Вдруг сегодня арабские, а завтра римские надо будет или вообще клинопись?
Второй уровень - на тип операции. Это сегодня мы складываем, а вдруг завтра надо будет лексический парсинг Клингона делать, пусть будет, про запас.
Третий - на тип пространства. Это сейчас оно линейное, а завтра ну как надо будет мнимые числа складывать? Записываем.
Это все конечно должно через брокеры друг с другом разговаривать, быть потокобезопасным и масштабируемым, чтобы при желании эту операцию можно было запустить на распределенном кластере из маков, пи-си и приставок сони плейстешн.
Об ошибках тоже не надо забывать. Надо чтобы при ошибке приложение вылетало с малопонятным сообщением типа "ERR402A77: Could not parse node 'XlmSignal'", и чтобы ошибку было хрен отловить отладчиком, т.к. она возникла в сгенерированном автоматически коде (см выше XML).
Примерно вот так.
Боже, дай мне нормальную работу!
Проекты обладали рядом характерных черт. Сейчас я вам расскажу как строят джаваисты.
Изначально закладывается такая архитектура, в которой много слоев и абстракций. В теории одна маленькая финтифлюшка может работать на отдельном кластере, который спрятан под горой в бронерованном бункере в Швейцарии, а другая загогулина может вертеться на чьем-то мобильном телефоне. Но что самое крутое, программисту который будет дергать за шнурок А на загогулине, который через 3 брокера и 5 проксей подключен к звонку Б на финтифлюшке, не надо ни о чем беспокоиться, потому что все прозрачно и абстрактно!
Желательно, чтобы все было в XML. Настройки всего, даже настройки того, как читаются другие настройки. Настройки желательно делать иерархическими, с переопределением всего и вся. Например, если у вас есть файл настроек с именем компьютера, то он должен гарузиться первым, потом надо обязательно проверить нет ли чего в реестре, а потом позвонить на специальный сервер конфигурации и ещё немножко настроек взять оттуда. Ни в коем случае при отладке нельзя давать понять откуда какой-то конкретный параметр приплыл!
Если какие-то настройки не в XML, то надо обязательно их туда загнать. Можно даже иногда в XML писать немножко кода, который потом будет компилироваться на ходу.
Нельзя никакие функции звать напрямую, обязательно нужны сервис брокеры. Когда в цепочке слишком много брокеров, можно для разнообразия поставить прокси.
Dependency Injection обязательно надо делать как можно запутанее, чтобы новички потом под собой мочили стулья от неожиданности, когда у них код, удаляющий базу, вдруг откуда-то чудесно вызвался.
Реализовывая свои фичи, желательно ломать поведение стандартных библиотечных, на замену которым это пишется. Например, вываливать эксцепшн на три экрана, когда пользователь нажал кнопку "назад" в браузере. А еще лучше перепутать сессии и дать этому пользователю данные другого собрата по несчастью.
Вот например взялся джаваист складывать два числа, скажем 2 + 2.
Надо несколько уровней абстракции. Один - на цифры. Вдруг сегодня арабские, а завтра римские надо будет или вообще клинопись?
Второй уровень - на тип операции. Это сегодня мы складываем, а вдруг завтра надо будет лексический парсинг Клингона делать, пусть будет, про запас.
Третий - на тип пространства. Это сейчас оно линейное, а завтра ну как надо будет мнимые числа складывать? Записываем.
Это все конечно должно через брокеры друг с другом разговаривать, быть потокобезопасным и масштабируемым, чтобы при желании эту операцию можно было запустить на распределенном кластере из маков, пи-си и приставок сони плейстешн.
Об ошибках тоже не надо забывать. Надо чтобы при ошибке приложение вылетало с малопонятным сообщением типа "ERR402A77: Could not parse node 'XlmSignal'", и чтобы ошибку было хрен отловить отладчиком, т.к. она возникла в сгенерированном автоматически коде (см выше XML).
Примерно вот так.
Боже, дай мне нормальную работу!


Comments
я, как java-программер, поржал
Нам нужно что-нить такое же написать про доднедчиков, одни методы с большой буквы чего стоят. :-)
И мир этот - PHP.
Афоризм Тиграна, прижиышийся в Bytex - "Программисты, которые писали при жизни плохой код, потом в аду до конца своих дней программируют на PHP."
А то такое сферическое метапрограммирование в вакууме начинается, что бита на бите не останется!
:)
Когда в бакетбол?
Не, на самом деле, Артем, Ынтересно написал, мне понравилось читать ;-)
кстати про XML это у тебя какие-то отсталые джавоведы. нынче модно annotations.
http://java.sun.com/docs/books/tuto
В spring 2.5 по-моему вообще все можно сделать в annotations, хорошего туториала навскидку не нашел, но например вот:
http://www.springindepth.com/book/annot
Вот про JPA annotations
http://www.zabada.com/tutorials/hiberna
Спрашивал на стековерфлоу, никто ничего толком не посоветовал, может вы знаете?
http://stackoverflow.com/questions/1523
А чем так хороши аннотации по сравнению с XML?
1. annotations это код, а не текст. refactoring, code completion, etc.
2. Когда мне не нужно говорить, что я хочу конфигурировать, а только как я хочу конфигурировать, да еще и делаю это одним словом, а не тэгом в ХМЛ, мой metadata значительно меньше. Значительно.
3. Смотря на код, всегда знаешь его конфигурацию. Не нужно думать "тут написано одно, но это ничего не значит, потому что в ХМЛ может быть написано еще второе и третье"
Ну, это так, по верхам.
А что, в джавовом спринге уже нет XML?
Я когда-то работал с чуваком, который был весь из себя .Net архитектором. У него было "всё написано", но почему-то не работало, и меня попросили разобраться, в чём дело. После нескольких дней настроек и дебага и продирания через пять или шесть уровней абстракции (которые просто пересылали данные дальше, обычно не делая никакой полезной работы) наконец дошёл до ключевой строчки. Она вычитывала
из какого-то XML файла имя метода, который надо было вызвать, и вызывала через reflection. Визуальная студия заходить внутрь такого метода отказывалась, справедливо говоря, что ни хера не знает, что там у вас такое вызывается. Я пошёл к архитектору спрашивать, как он сам это дело дебагил, в ответ получил очень удивлённый взгляд, такое впечатление, что его словарь только что пополнился новым термином. В общем, я насовал записей в лог в stored процедуру, которая в результате вызывалась, и отловил-таки бага :)